Skip to content

Commit bb45f50

Browse files
feat[ux]: improve hint for events kwarg upgrade (vyperlang#4275)
follow-on commit to ebe3c0c. the hint in ebe3c0c is not specific to the user's source code, and it's a bit laborious for the user to match the call-site to the event def. this commit auto-generates the new call expression for the user to use. additionally, it migrates the example contracts in the `examples/` directory so that they stop emitting warnings. --------- Co-authored-by: cyberthirst <cyberthirst.eth@gmail.com>
1 parent c75a2da commit bb45f50

File tree

9 files changed

+91
-43
lines changed

9 files changed

+91
-43
lines changed

examples/auctions/blind_auction.vy

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def auctionEnd():
172172
assert not self.ended
173173

174174
# Log auction ending and set flag
175-
log AuctionEnded(self.highestBidder, self.highestBid)
175+
log AuctionEnded(highestBidder=self.highestBidder, highestBid=self.highestBid)
176176
self.ended = True
177177

178178
# Transfer funds to beneficiary

examples/stock/company.vy

+5-4
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def buyStock():
6363
self.holdings[msg.sender] += buy_order
6464

6565
# Log the buy event.
66-
log Buy(msg.sender, buy_order)
66+
log Buy(buyer=msg.sender, buy_order=buy_order)
6767

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

9696
# Log the sell event.
97-
log Sell(msg.sender, sell_order)
97+
log Sell(seller=msg.sender, sell_order=sell_order)
9898

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

111111
# Log the transfer event.
112-
log Transfer(msg.sender, receiver, transfer_order)
112+
log Transfer(sender=msg.sender, receiver=receiver, value=transfer_order)
113113

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

125125
# Log the payment event.
126-
log Pay(vendor, amount)
126+
log Pay(vendor=vendor, amount=amount)
127+
127128

128129
# Public function to allow external access to _debt
129130
@view

examples/storage/advanced_storage.vy

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def set(_x: int128):
1515
assert _x >= 0, "No negative values"
1616
assert self.storedData < 100, "Storage is locked when 100 or more is stored"
1717
self.storedData = _x
18-
log DataChange(msg.sender, _x)
18+
log DataChange(setter=msg.sender, value=_x)
1919

2020
@external
2121
def reset():

examples/tokens/ERC1155ownable.vy

+14-14
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ event unPaused:
6969

7070
event OwnershipTransferred:
7171
# Emits smart contract ownership transfer from current to new owner
72-
previouwOwner: address
72+
previousOwner: address
7373
newOwner: address
7474

7575
event TransferSingle:
@@ -150,7 +150,7 @@ def pause():
150150
assert self.owner == msg.sender, "Ownable: caller is not the owner"
151151
assert not self.paused, "the contract is already paused"
152152
self.paused = True
153-
log Paused(msg.sender)
153+
log Paused(account=msg.sender)
154154

155155
@external
156156
def unpause():
@@ -162,7 +162,7 @@ def unpause():
162162
assert self.owner == msg.sender, "Ownable: caller is not the owner"
163163
assert self.paused, "the contract is not paused"
164164
self.paused = False
165-
log unPaused(msg.sender)
165+
log unPaused(account=msg.sender)
166166

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

184184
@external
185185
def renounceOwnership():
@@ -191,7 +191,7 @@ def renounceOwnership():
191191
assert self.owner == msg.sender, "Ownable: caller is not the owner"
192192
oldOwner: address = self.owner
193193
self.owner = empty(address)
194-
log OwnershipTransferred(oldOwner, empty(address))
194+
log OwnershipTransferred(previousOwner=oldOwner, newOwner=empty(address))
195195

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

231231

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

252-
log TransferBatch(operator, empty(address), receiver, ids, amounts)
252+
log TransferBatch(operator=operator, fromAddress=empty(address), to=receiver, ids=ids, values=amounts)
253253

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

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

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

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

303303
@external
304304
def safeTransferFrom(sender: address, receiver: address, id: uint256, amount: uint256, bytes: bytes32):
@@ -317,7 +317,7 @@ def safeTransferFrom(sender: address, receiver: address, id: uint256, amount: ui
317317
operator: address = msg.sender
318318
self.balanceOf[sender][id] -= amount
319319
self.balanceOf[receiver][id] += amount
320-
log TransferSingle(operator, sender, receiver, id, amount)
320+
log TransferSingle(operator=operator, fromAddress=sender, to=receiver, id=id, value=amount)
321321

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

345-
log TransferBatch(operator, sender, receiver, ids, amounts)
345+
log TransferBatch(operator=operator, fromAddress=sender, to=receiver, ids=ids, values=amounts)
346346

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

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

396396
@view
397397
@external

examples/tokens/ERC20.vy

+6-7
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ def __init__(_name: String[32], _symbol: String[32], _decimals: uint8, _supply:
3939
self.balanceOf[msg.sender] = init_supply
4040
self.totalSupply = init_supply
4141
self.minter = msg.sender
42-
log IERC20.Transfer(empty(address), msg.sender, init_supply)
43-
42+
log IERC20.Transfer(sender=empty(address), receiver=msg.sender, value=init_supply)
4443

4544

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

6059

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

7978

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

9594

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

111110

112111
@internal
@@ -120,7 +119,7 @@ def _burn(_to: address, _value: uint256):
120119
assert _to != empty(address)
121120
self.totalSupply -= _value
122121
self.balanceOf[_to] -= _value
123-
log IERC20.Transfer(_to, empty(address), _value)
122+
log IERC20.Transfer(sender=_to, receiver=empty(address), value=_value)
124123

125124

126125
@external

examples/tokens/ERC4626.vy

+7-7
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ def decimals() -> uint8:
5656
def transfer(receiver: address, amount: uint256) -> bool:
5757
self.balanceOf[msg.sender] -= amount
5858
self.balanceOf[receiver] += amount
59-
log IERC20.Transfer(msg.sender, receiver, amount)
59+
log IERC20.Transfer(sender=msg.sender, receiver=receiver, value=amount)
6060
return True
6161

6262

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

6969

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

7878

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

138138
self.totalSupply += shares
139139
self.balanceOf[receiver] += shares
140-
log IERC4626.Deposit(msg.sender, receiver, assets, shares)
140+
log IERC4626.Deposit(sender=msg.sender, owner=receiver, assets=assets, shares=shares)
141141
return shares
142142

143143

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

171171
self.totalSupply += shares
172172
self.balanceOf[receiver] += shares
173-
log IERC4626.Deposit(msg.sender, receiver, assets, shares)
173+
log IERC4626.Deposit(sender=msg.sender, owner=receiver, assets=assets, shares=shares)
174174
return assets
175175

176176

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

209209
extcall self.asset.transfer(receiver, assets)
210-
log IERC4626.Withdraw(msg.sender, receiver, owner, assets, shares)
210+
log IERC4626.Withdraw(sender=msg.sender, receiver=receiver, owner=owner, assets=assets, shares=shares)
211211
return shares
212212

213213

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

235235
extcall self.asset.transfer(receiver, assets)
236-
log IERC4626.Withdraw(msg.sender, receiver, owner, assets, shares)
236+
log IERC4626.Withdraw(sender=msg.sender, receiver=receiver, owner=owner, assets=assets, shares=shares)
237237
return assets
238238

239239

examples/tokens/ERC721.vy

+5-5
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: addr
201201
# Add NFT
202202
self._addTokenTo(_to, _tokenId)
203203
# Log the transfer
204-
log IERC721.Transfer(_from, _to, _tokenId)
204+
log IERC721.Transfer(sender=_from, receiver=_to, token_id=_tokenId)
205205

206206

207207
### TRANSFER FUNCTIONS ###
@@ -275,7 +275,7 @@ def approve(_approved: address, _tokenId: uint256):
275275
assert (senderIsOwner or senderIsApprovedForAll)
276276
# Set the approval
277277
self.idToApprovals[_tokenId] = _approved
278-
log IERC721.Approval(owner, _approved, _tokenId)
278+
log IERC721.Approval(owner=owner, approved=_approved, token_id=_tokenId)
279279

280280

281281
@external
@@ -291,7 +291,7 @@ def setApprovalForAll(_operator: address, _approved: bool):
291291
# Throws if `_operator` is the `msg.sender`
292292
assert _operator != msg.sender
293293
self.ownerToOperators[msg.sender][_operator] = _approved
294-
log IERC721.ApprovalForAll(msg.sender, _operator, _approved)
294+
log IERC721.ApprovalForAll(owner=msg.sender, operator=_operator, approved=_approved)
295295

296296

297297
### MINT & BURN FUNCTIONS ###
@@ -313,7 +313,7 @@ def mint(_to: address, _tokenId: uint256) -> bool:
313313
assert _to != empty(address)
314314
# Add NFT. Throws if `_tokenId` is owned by someone
315315
self._addTokenTo(_to, _tokenId)
316-
log IERC721.Transfer(empty(address), _to, _tokenId)
316+
log IERC721.Transfer(sender=empty(address), receiver=_to, token_id=_tokenId)
317317
return True
318318

319319

@@ -333,7 +333,7 @@ def burn(_tokenId: uint256):
333333
assert owner != empty(address)
334334
self._clearApproval(owner, _tokenId)
335335
self._removeTokenFrom(owner, _tokenId)
336-
log IERC721.Transfer(owner, empty(address), _tokenId)
336+
log IERC721.Transfer(sender=owner, receiver=empty(address), token_id=_tokenId)
337337

338338

339339
@view
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import warnings
2+
3+
from vyper.compiler import compile_code
4+
5+
6+
def test_event_kwarg_hint():
7+
code = """
8+
from ethereum.ercs import IERC20
9+
10+
def foo():
11+
log IERC20.Transfer(msg.sender, msg.sender, 123)
12+
"""
13+
14+
with warnings.catch_warnings(record=True) as w:
15+
assert compile_code(code) is not None
16+
17+
expected = "Instantiating events with positional arguments is deprecated "
18+
expected += "as of v0.4.1 and will be disallowed in a future release. "
19+
expected += "Use kwargs instead e.g.:\n"
20+
expected += "```\nlog IERC20.Transfer(sender=msg.sender, receiver=msg.sender, value=123)\n```"
21+
22+
assert len(w) == 1, [s.message for s in w]
23+
assert str(w[0].message).startswith(expected)
24+
25+
26+
def test_event_hint_single_char_argument():
27+
code = """
28+
from ethereum.ercs import IERC20
29+
30+
def foo():
31+
log IERC20.Transfer(msg.sender, msg.sender, 1)
32+
"""
33+
34+
with warnings.catch_warnings(record=True) as w:
35+
assert compile_code(code) is not None
36+
37+
expected = "Instantiating events with positional arguments is deprecated "
38+
expected += "as of v0.4.1 and will be disallowed in a future release. "
39+
expected += "Use kwargs instead e.g.:\n"
40+
expected += "```\nlog IERC20.Transfer(sender=msg.sender, receiver=msg.sender, value=1)\n```"
41+
42+
assert len(w) == 1, [s.message for s in w]
43+
assert str(w[0].message).startswith(expected)

0 commit comments

Comments
 (0)