首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EIP712的哈希批处理事务

使用EIP712的哈希批处理事务
EN

Ethereum用户
提问于 2023-04-06 21:50:05
回答 1查看 55关注 0票数 0

使用Uniswap的Permit2合同作为基础,如何使用EIP712在可靠的情况下散列一批事务?

这是对单个事务进行散列的方法,并且没有问题:

代码语言:javascript
复制
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结构:

代码语言:javascript
复制
struct PermitTransferFrom {
   TokenPermissions permitted;
   uint256 nonce;
   uint256 deadline;
}
代码语言:javascript
复制
struct TokenPermissions {
   IERC20 token;
   uint256 amount;
}

下面的PermitBatchTransferFrom结构将如何使用该函数:

代码语言:javascript
复制
struct PermitBatchTransferFrom {
    TokenPermissions[] permitted;
    uint256 nonce;
    uint256 deadline;
}

我认为,应该在函数中使用以下值,就像在单个tx函数中使用PERMIT_TRANSFER_FROM_TYPEHASHTOKEN_PERMISSIONS_TYPEHASH一样。

代码语言:javascript
复制
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

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-04-09 19:17:45

解决方案:

代码语言:javascript
复制
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));
    }
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/148618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档