我们正在实施无气交易,我们需要使用授权呼叫的eip3009传输。我们对USDC感兴趣。
我看到了一些不匹配的USDC代码在以太和多边形。要准确地使用域分隔符。所以,对以太而言,我看到的是:
function makeDomainSeparator(string memory name, string memory version)
internal
view
returns (bytes32)
{
uint256 chainId;
assembly {
chainId := chainid()
}
return
keccak256(
abi.encode(
// keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f,
keccak256(bytes(name)),
keccak256(bytes(version)),
chainId,
address(this)
)
);
}
对于多边形:
function makeDomainSeparator(string memory name, string memory version)
internal
view
returns (bytes32)
{
uint256 chainId;
assembly {
chainId := chainid()
}
return
keccak256(
abi.encode(
// keccak256("EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)")
0x36c25de3e541d5d970f66e4210d728721220fff5c077cc6cd008b3a0c62adab7,
keccak256(bytes(name)),
keccak256(bytes(version)),
address(this),
bytes32(chainId)
)
);
}
我使用这段代码来签署这个事务:
const data = {
types: {
TransferWithAuthorization: [
{ name: "from", type: "address" },
{ name: "to", type: "address" },
{ name: "value", type: "uint256" },
{ name: "validAfter", type: "uint256" },
{ name: "validBefore", type: "uint256" },
{ name: "nonce", type: "bytes32" },
],
}
domain: {
name: 'MockEIP3009Token',
version: '0.0.1',
chainId: 31337,
verifyingContract: '0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f'
},
primaryType: 'TransferWithAuthorization',
message: {
from: '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc',
to: '0xfd471836031dc5108809d173a067e8486b9047a3',
value: 434266,
validAfter: 0,
validBefore: 1672224083,
nonce: '0x16140b6e6c12c7538910d7d08e52620f146518af84281a68576bb679b2c1100a'
}
}
signer._signTypedData(data.domain, data.types, data.message);
对于ethereum代码,一切工作正常,但是对于多边形代码,我会收到无效的签名错误。
有人能解释一下为什么需要这样的差别吗?
合同:
谢谢!
发布于 2023-02-22 19:06:50
在事物的以太方面,包括TRANSFER_AUTHORIZATION_TYPEHASH在哪里,比如创建签名。
这里有一个结构,它包含有关用户交互的相关数据,但是在域-散列结构之前,它还包括带有授权类型哈希的传输,对吗?我从来没有把它看作是插入到ethers.js端的结构中的值。
这里有一个示例,the 3009.sol实现:https://github.com/ethereum/EIPs/issues/3010#:~:text=Implementation-,EIP3009,-.sol
但是在“与web3提供者一起使用”示例中,我没有看到包含了TRANSFER_AUTHORIZATION_TYPEHASH
bytes32?https://github.com/ethereum/EIPs/issues/3010#:~:text=eth_signTypedData%7B_V4%7D%20方法-,例如,-%3A
发布于 2023-06-01 05:12:42
多边形美元硬币(PoS)、USDC或任何桥接多边形令牌不兼容EIP-3009。
它们具有transferWithAuthorization
函数,但是您需要使用不同的EIP-712消息进行签名。更多细节请看这里。
EIP-3009:
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' }
]
多边形:
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'verifyingContract', type: 'address' },
{ name: 'salt', type: 'bytes32' }
]
https://ethereum.stackexchange.com/questions/141968
复制相似问题