使用Uniswap的Permit2合同作为基础,如何使用EIP712在可靠的情况下散列一批事务?
这是对单个事务进行散列的方法,并且没有问题:
return keccak256(abi.encodePacked(
"\x19\x01",
permit2.DOMAIN_SEPARATOR(),
keccak256(abi.encode(
PERMIT_TRANSFER_FROM_TYPEHASH,
keccak256(abi.encode(
TOKEN_PERMISSIONS_TYPEHASH,
permit.permitted.token,
permit.permitted.amount
)),
spender,
permit.nonce,
permit.deadline
))
));...where permit是以下PermitTransferFrom结构:
struct PermitTransferFrom {
TokenPermissions permitted;
uint256 nonce;
uint256 deadline;
}struct TokenPermissions {
IERC20 token;
uint256 amount;
}下面的PermitBatchTransferFrom结构将如何使用该函数:
struct PermitBatchTransferFrom {
TokenPermissions[] permitted;
uint256 nonce;
uint256 deadline;
}我认为,应该在函数中使用以下值,就像在单个tx函数中使用PERMIT_TRANSFER_FROM_TYPEHASH和TOKEN_PERMISSIONS_TYPEHASH一样。
bytes32 public constant _PERMIT_BATCH_TRANSFER_FROM_TYPEHASH = keccak256(
"PermitBatchTransferFrom(TokenPermissions[] permitted,address spender,uint256 nonce,uint256 deadline)TokenPermissions(address token,uint256 amount)"
);
bytes32 public constant _PERMIT_TRANSFER_FROM_TYPEHASH = keccak256(
"PermitTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline)TokenPermissions(address token,uint256 amount)"
);您可以浏览以下Uniswap文章以获得更多的上下文:https://docs.uniswap.org/contracts/permit2/reference/signature-transfer#batched-permittransferfrom
发布于 2023-04-09 19:17:45
function getPermitBatchTransferSignature(
ISignatureTransfer.PermitBatchTransferFrom memory permit,
uint256 privateKey,
bytes32 domainSeparator
) internal returns (bytes memory sig) {
bytes32[] memory tokenPermissions = new bytes32[](permit.permitted.length);
for (uint256 i = 0; i < permit.permitted.length; ++i) {
tokenPermissions[i] = keccak256(abi.encode(_TOKEN_PERMISSIONS_TYPEHASH, permit.permitted[i]));
}
bytes32 msgHash = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
keccak256(
abi.encode(
_PERMIT_BATCH_TRANSFER_FROM_TYPEHASH,
keccak256(abi.encodePacked(tokenPermissions)),
address(this),
permit.nonce,
permit.deadline
)
)
)
);
(uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, msgHash);
return bytes.concat(r, s, bytes1(v));
}https://ethereum.stackexchange.com/questions/148618
复制相似问题