Skip to content

Commit

Permalink
Merge branch 'master' into feat/warnings-filter
Browse files Browse the repository at this point in the history
  • Loading branch information
charles-cooper authored Feb 19, 2025
2 parents 1163a3e + 9e396fb commit e256c72
Show file tree
Hide file tree
Showing 31 changed files with 636 additions and 198 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-20.04, macos-latest]
os: [ubuntu-latest, macos-latest]

steps:
- uses: actions/checkout@v4
Expand Down
41 changes: 40 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,45 @@ jobs:
- name: Run docs
run: sphinx-build -E -b html docs dist/docs -n -q --color

# Symbolic tests
symbolic-tests:
runs-on: "ubuntu-latest"
name: symbolic-tests

steps:
- uses: actions/checkout@v4

- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: "pip"

- name: Install dependencies
run: pip install .[test]

- name: Install hevm
run: |
# hevm dependency
sudo apt-get install z3
wget --no-verbose -O hevm https://github.com/ethereum/hevm/releases/download/release/0.54.2/hevm-x86_64-linux
chmod +x hevm
mkdir -p "$HOME/.local/bin/"
mv hevm "$HOME/.local/bin/"
echo "$HOME/.local/bin/" >> $GITHUB_PATH
hevm version
- name: Run tests
run: >
pytest
-m "hevm"
--hevm
--cov-config=setup.cfg
--cov=vyper
tests/
# "Regular"/core tests.
tests:
runs-on: ${{ matrix.os || 'ubuntu' }}-latest
Expand Down Expand Up @@ -166,7 +205,7 @@ jobs:
# summary result from test matrix.
# see https://github.community/t/status-check-for-a-matrix-jobs/127354/7
runs-on: ubuntu-latest
needs: [tests]
needs: [tests, symbolic-tests]
steps:
- name: Check tests tests all succeeded
if: ${{ needs.tests.result != 'success' }}
Expand Down
2 changes: 1 addition & 1 deletion FUNDING.yml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
custom: https://etherscan.io/address/0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775
custom: ["https://etherscan.io/address/0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", "https://giveth.io/project/vyper"]
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ make dev-init
./quicktest.sh -m "not fuzzing"
```

## Testing (with hevm)

Install hevm by downloading it from the releases page (https://github.com/ethereum/hevm/releases/latest) and making sure it is in your PATH. hevm tests can be enabled with `--hevm` flag, and hevm tests can be selected with the `-m hevm` marker. For instance, `./quicktest.sh -m "hevm" --hevm`.

## Developing (working on the compiler)

A useful script to have in your PATH is something like the following:
Expand All @@ -67,7 +71,9 @@ To run a python performance profile (to find compiler perf hotspots):
PYTHONPATH=. python -m cProfile -s tottime vyper/cli/vyper_compile.py "$@"
```

To get a call graph from a python profile, https://stackoverflow.com/a/23164271/ is helpful.
To get a call graph from a python profile, pip install `gprof2dot` and `xdot`, and run it like `gprof2dot -f pstats stats | xdot -`. (See https://stackoverflow.com/a/23164271/).

The utility timer functions `timeit`, `profileit` and `cumtimeit` are available in `vyper/utils.py`.


# Contributing
Expand Down
2 changes: 1 addition & 1 deletion examples/auctions/blind_auction.vy
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def auctionEnd():
assert not self.ended

# Log auction ending and set flag
log AuctionEnded(self.highestBidder, self.highestBid)
log AuctionEnded(highestBidder=self.highestBidder, highestBid=self.highestBid)
self.ended = True

# Transfer funds to beneficiary
Expand Down
9 changes: 5 additions & 4 deletions examples/stock/company.vy
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def buyStock():
self.holdings[msg.sender] += buy_order

# Log the buy event.
log Buy(msg.sender, buy_order)
log Buy(buyer=msg.sender, buy_order=buy_order)

# Public function to allow external access to _getHolding
@view
Expand Down Expand Up @@ -94,7 +94,7 @@ def sellStock(sell_order: uint256):
send(msg.sender, sell_order * self.price)

# Log the sell event.
log Sell(msg.sender, sell_order)
log Sell(seller=msg.sender, sell_order=sell_order)

# Transfer stock from one stockholder to another. (Assume that the
# receiver is given some compensation, but this is not enforced.)
Expand All @@ -109,7 +109,7 @@ def transferStock(receiver: address, transfer_order: uint256):
self.holdings[receiver] += transfer_order

# Log the transfer event.
log Transfer(msg.sender, receiver, transfer_order)
log Transfer(sender=msg.sender, receiver=receiver, value=transfer_order)

# Allow the company to pay someone for services rendered.
@external
Expand All @@ -123,7 +123,8 @@ def payBill(vendor: address, amount: uint256):
send(vendor, amount)

# Log the payment event.
log Pay(vendor, amount)
log Pay(vendor=vendor, amount=amount)


# Public function to allow external access to _debt
@view
Expand Down
2 changes: 1 addition & 1 deletion examples/storage/advanced_storage.vy
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def set(_x: int128):
assert _x >= 0, "No negative values"
assert self.storedData < 100, "Storage is locked when 100 or more is stored"
self.storedData = _x
log DataChange(msg.sender, _x)
log DataChange(setter=msg.sender, value=_x)

@external
def reset():
Expand Down
28 changes: 14 additions & 14 deletions examples/tokens/ERC1155ownable.vy
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ event unPaused:

event OwnershipTransferred:
# Emits smart contract ownership transfer from current to new owner
previouwOwner: address
previousOwner: address
newOwner: address

event TransferSingle:
Expand Down Expand Up @@ -150,7 +150,7 @@ def pause():
assert self.owner == msg.sender, "Ownable: caller is not the owner"
assert not self.paused, "the contract is already paused"
self.paused = True
log Paused(msg.sender)
log Paused(account=msg.sender)

@external
def unpause():
Expand All @@ -162,7 +162,7 @@ def unpause():
assert self.owner == msg.sender, "Ownable: caller is not the owner"
assert self.paused, "the contract is not paused"
self.paused = False
log unPaused(msg.sender)
log unPaused(account=msg.sender)

## ownership ##
@external
Expand All @@ -179,7 +179,7 @@ def transferOwnership(newOwner: address):
assert newOwner != empty(address), "Transfer to the zero address not allowed. Use renounceOwnership() instead."
oldOwner: address = self.owner
self.owner = newOwner
log OwnershipTransferred(oldOwner, newOwner)
log OwnershipTransferred(previousOwner=oldOwner, newOwner=newOwner)

@external
def renounceOwnership():
Expand All @@ -191,7 +191,7 @@ def renounceOwnership():
assert self.owner == msg.sender, "Ownable: caller is not the owner"
oldOwner: address = self.owner
self.owner = empty(address)
log OwnershipTransferred(oldOwner, empty(address))
log OwnershipTransferred(previousOwner=oldOwner, newOwner=empty(address))

@external
@view
Expand Down Expand Up @@ -226,7 +226,7 @@ def mint(receiver: address, id: uint256, amount:uint256):
assert receiver != empty(address), "Can not mint to ZERO ADDRESS"
operator: address = msg.sender
self.balanceOf[receiver][id] += amount
log TransferSingle(operator, empty(address), receiver, id, amount)
log TransferSingle(operator=operator, fromAddress=empty(address), to=receiver, id=id, value=amount)


@external
Expand All @@ -249,7 +249,7 @@ def mintBatch(receiver: address, ids: DynArray[uint256, BATCH_SIZE], amounts: Dy
break
self.balanceOf[receiver][ids[i]] += amounts[i]

log TransferBatch(operator, empty(address), receiver, ids, amounts)
log TransferBatch(operator=operator, fromAddress=empty(address), to=receiver, ids=ids, values=amounts)

## burn ##
@external
Expand All @@ -263,7 +263,7 @@ def burn(id: uint256, amount: uint256):
assert not self.paused, "The contract has been paused"
assert self.balanceOf[msg.sender][id] > 0 , "caller does not own this ID"
self.balanceOf[msg.sender][id] -= amount
log TransferSingle(msg.sender, msg.sender, empty(address), id, amount)
log TransferSingle(operator=msg.sender, fromAddress=msg.sender, to=empty(address), id=id, value=amount)

@external
def burnBatch(ids: DynArray[uint256, BATCH_SIZE], amounts: DynArray[uint256, BATCH_SIZE]):
Expand All @@ -283,7 +283,7 @@ def burnBatch(ids: DynArray[uint256, BATCH_SIZE], amounts: DynArray[uint256, BAT
break
self.balanceOf[msg.sender][ids[i]] -= amounts[i]

log TransferBatch(msg.sender, msg.sender, empty(address), ids, amounts)
log TransferBatch(operator=msg.sender, fromAddress=msg.sender, to=empty(address), ids=ids, values=amounts)

## approval ##
@external
Expand All @@ -298,7 +298,7 @@ def setApprovalForAll(owner: address, operator: address, approved: bool):
assert not self.paused, "The contract has been paused"
assert owner != operator, "ERC1155: setting approval status for self"
self.isApprovedForAll[owner][operator] = approved
log ApprovalForAll(owner, operator, approved)
log ApprovalForAll(account=owner, operator=operator, approved=approved)

@external
def safeTransferFrom(sender: address, receiver: address, id: uint256, amount: uint256, bytes: bytes32):
Expand All @@ -317,7 +317,7 @@ def safeTransferFrom(sender: address, receiver: address, id: uint256, amount: ui
operator: address = msg.sender
self.balanceOf[sender][id] -= amount
self.balanceOf[receiver][id] += amount
log TransferSingle(operator, sender, receiver, id, amount)
log TransferSingle(operator=operator, fromAddress=sender, to=receiver, id=id, value=amount)

@external
def safeBatchTransferFrom(sender: address, receiver: address, ids: DynArray[uint256, BATCH_SIZE], amounts: DynArray[uint256, BATCH_SIZE], _bytes: bytes32):
Expand All @@ -342,7 +342,7 @@ def safeBatchTransferFrom(sender: address, receiver: address, ids: DynArray[uint
self.balanceOf[sender][id] -= amount
self.balanceOf[receiver][id] += amount

log TransferBatch(operator, sender, receiver, ids, amounts)
log TransferBatch(operator=operator, fromAddress=sender, to=receiver, ids=ids, values=amounts)

# URI #
@external
Expand All @@ -355,7 +355,7 @@ def setURI(uri: String[MAX_URI_LENGTH]):
assert self.baseuri != uri, "new and current URI are identical"
assert msg.sender == self.owner, "Only the contract owner can update the URI"
self.baseuri = uri
log URI(uri, 0)
log URI(value=uri, id=0)

@external
def toggleDynUri(status: bool):
Expand Down Expand Up @@ -391,7 +391,7 @@ def setContractURI(contractUri: String[MAX_URI_LENGTH]):
assert self.contractURI != contractUri, "new and current URI are identical"
assert msg.sender == self.owner, "Only the contract owner can update the URI"
self.contractURI = contractUri
log URI(contractUri, 0)
log URI(value=contractUri, id=0)

@view
@external
Expand Down
13 changes: 6 additions & 7 deletions examples/tokens/ERC20.vy
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _supply:
self.balanceOf[msg.sender] = init_supply
self.totalSupply = init_supply
self.minter = msg.sender
log IERC20.Transfer(empty(address), msg.sender, init_supply)

log IERC20.Transfer(sender=empty(address), receiver=msg.sender, value=init_supply)


@external
Expand All @@ -54,7 +53,7 @@ def transfer(_to : address, _value : uint256) -> bool:
# so the following subtraction would revert on insufficient balance
self.balanceOf[msg.sender] -= _value
self.balanceOf[_to] += _value
log IERC20.Transfer(msg.sender, _to, _value)
log IERC20.Transfer(sender=msg.sender, receiver=_to, value=_value)
return True


Expand All @@ -73,7 +72,7 @@ def transferFrom(_from : address, _to : address, _value : uint256) -> bool:
# NOTE: vyper does not allow underflows
# so the following subtraction would revert on insufficient allowance
self.allowance[_from][msg.sender] -= _value
log IERC20.Transfer(_from, _to, _value)
log IERC20.Transfer(sender=_from, receiver=_to, value=_value)
return True


Expand All @@ -89,7 +88,7 @@ def approve(_spender : address, _value : uint256) -> bool:
@param _value The amount of tokens to be spent.
"""
self.allowance[msg.sender][_spender] = _value
log IERC20.Approval(msg.sender, _spender, _value)
log IERC20.Approval(owner=msg.sender, spender=_spender, value=_value)
return True


Expand All @@ -106,7 +105,7 @@ def mint(_to: address, _value: uint256):
assert _to != empty(address)
self.totalSupply += _value
self.balanceOf[_to] += _value
log IERC20.Transfer(empty(address), _to, _value)
log IERC20.Transfer(sender=empty(address), receiver=_to, value=_value)


@internal
Expand All @@ -120,7 +119,7 @@ def _burn(_to: address, _value: uint256):
assert _to != empty(address)
self.totalSupply -= _value
self.balanceOf[_to] -= _value
log IERC20.Transfer(_to, empty(address), _value)
log IERC20.Transfer(sender=_to, receiver=empty(address), value=_value)


@external
Expand Down
14 changes: 7 additions & 7 deletions examples/tokens/ERC4626.vy
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ def decimals() -> uint8:
def transfer(receiver: address, amount: uint256) -> bool:
self.balanceOf[msg.sender] -= amount
self.balanceOf[receiver] += amount
log IERC20.Transfer(msg.sender, receiver, amount)
log IERC20.Transfer(sender=msg.sender, receiver=receiver, value=amount)
return True


@external
def approve(spender: address, amount: uint256) -> bool:
self.allowance[msg.sender][spender] = amount
log IERC20.Approval(msg.sender, spender, amount)
log IERC20.Approval(owner=msg.sender, spender=spender, value=amount)
return True


Expand All @@ -72,7 +72,7 @@ def transferFrom(sender: address, receiver: address, amount: uint256) -> bool:
self.allowance[sender][msg.sender] -= amount
self.balanceOf[sender] -= amount
self.balanceOf[receiver] += amount
log IERC20.Transfer(sender, receiver, amount)
log IERC20.Transfer(sender=sender, receiver=receiver, value=amount)
return True


Expand Down Expand Up @@ -137,7 +137,7 @@ def deposit(assets: uint256, receiver: address=msg.sender) -> uint256:

self.totalSupply += shares
self.balanceOf[receiver] += shares
log IERC4626.Deposit(msg.sender, receiver, assets, shares)
log IERC4626.Deposit(sender=msg.sender, owner=receiver, assets=assets, shares=shares)
return shares


Expand Down Expand Up @@ -170,7 +170,7 @@ def mint(shares: uint256, receiver: address=msg.sender) -> uint256:

self.totalSupply += shares
self.balanceOf[receiver] += shares
log IERC4626.Deposit(msg.sender, receiver, assets, shares)
log IERC4626.Deposit(sender=msg.sender, owner=receiver, assets=assets, shares=shares)
return assets


Expand Down Expand Up @@ -207,7 +207,7 @@ def withdraw(assets: uint256, receiver: address=msg.sender, owner: address=msg.s
self.balanceOf[owner] -= shares

extcall self.asset.transfer(receiver, assets)
log IERC4626.Withdraw(msg.sender, receiver, owner, assets, shares)
log IERC4626.Withdraw(sender=msg.sender, receiver=receiver, owner=owner, assets=assets, shares=shares)
return shares


Expand All @@ -233,7 +233,7 @@ def redeem(shares: uint256, receiver: address=msg.sender, owner: address=msg.sen
self.balanceOf[owner] -= shares

extcall self.asset.transfer(receiver, assets)
log IERC4626.Withdraw(msg.sender, receiver, owner, assets, shares)
log IERC4626.Withdraw(sender=msg.sender, receiver=receiver, owner=owner, assets=assets, shares=shares)
return assets


Expand Down
Loading

0 comments on commit e256c72

Please sign in to comment.