我试图为事务发送许可证,但如果通过智能契约令牌函数调用,则会得到函数调用不匹配的返回。如果我通过encodeABI调用并添加相同的参数,就不会在事务中看到消息。我使用以下代码
def build_permit(owner, spender, value, deadline, web3):
data = {
"types": {
"EIP712Domain": [
{"name": "name", "type": "string"},
{"name": "version", "type": "string"},
{"name": "chainId", "type": "uint256"},
{"name": "verifyingContract", "type": "address"},
],
"Permit": [
{"name": "owner", "type": "address"},
{"name": "spender", "type": "address"},
{"name": "value", "type": "uint256"},
{"name": "nonce", "type": "uint256"},
{"name": "deadline", "type": "uint256"},
],
},
"domain": {
"name": "TestToken",
"version": "1",
"chainId": 4,
"verifyingContract": address_token,
},
"primaryType": "Permit",
"message": {
"owner": owner,
"spender": spender,
"value": value,
"nonce": web3.eth.getTransactionCount(my_account.address),
"deadline": deadline,
},
}
return encode_structured_data(data)
def test_permit():
signer = my_account
owner = my_account.address
holder = signer.address
address_token = SC.USDT("RINKEBY")
spender = SC.ROUTER('RINKEBY')
deadline = int(time.time()) + 3600
#print(deadline)
amount = web3.toWei(1, 'ether')
usdt = token_contract(address_token,web3n(RINKEBY))
permit = build_permit(owner, spender, amount, deadline,web3n(RINKEBY))
signed = signer.sign_message(permit)
tx = usdt.functions.permit(holder, spender, 1000000000000000000, int(time.time()) + 3600, signed.v, Web3.toBytes(signed.r), Web3.toBytes(signed.s)).call()response = {'error': {'code': 3, 'data': '0x08c379a000000000000000000000000000000000000000000000000000000000000000200000000000000...207369676e61747572650000', 'message': 'execution reverted: ERC20Permit: invalid signature'}, 'id': 1, 'jsonrpc': '2.0'}0x77c24f0Af71257C0ee26e0E0a108F940D1698d53
发布于 2022-04-12 12:22:46
你还没有和我分享你的聪明合同,所以我只能胡思乱想了。我也遇到了同样的问题,在我的代码中,返回的encode_structured_data的顺序与我在智能契约中定义的不一样。检查作为encode_structured_data返回的内容以及如何在智能契约中定义这些数据(如果有此数据,请检查该数据的结构以及_hash函数。如果你也有这个,不要在_hashTypedDataV4中留下任何间距。)
https://ethereum.stackexchange.com/questions/126030
复制相似问题