我们知道EOA帐户有私钥,所以EOA帐户可以允许其他EOA帐户使用他的令牌。但是合同能允许一个EOA账户吗?以下是我的问题:
这是我的代码逻辑:合同A在合同B中有10个ERC20令牌,如果合同A有EOA (),A是否允许一个EOA帐户使用他的ERC20令牌?
发布于 2023-01-12 09:45:07
希望能帮上忙!
发布于 2023-01-12 13:26:30
但是合同能允许一个EOA账户吗?
我假设您在这里所指的是来自ERC20Permit的许可证()函数,而不是来自普通ERC20标准的批准函数。在这种情况下,从理论上讲,你可能需要找到“合同私钥”(一种解析到合同地址的私钥,我的意思是,你实际上不能与它签署交易,至少不能在部署在该地址的合同的网络(S)上),并从该私钥构建许可证。
发布于 2023-01-12 13:40:13
首先,智能契约签名是由EIP-1271规范的(使用示例在这里可以找到:openzeppelin/ERC1271WalletMock.sol)。
但是,许可标准(EIP-2612)将签名组件定义如下:
r、s和v是来自owner的有效secp256k1签名。
最流行的用OpenZeppelin实现检查签名的方式如下:
ECDSA.recover(hash, v, r, s);如果他们使用SignatureChecker检查签名,这是可能的。
但是,智能契约钱包可以实现基于所有者签名的permit-like功能:
contract Vault is Ownable, EIP712 {
bytes32 public constant TOKEN_PERMIT_TYPEHASH = keccak256(
"TokenPermit("
"address token,"
"address spender,"
"uint256 value,"
"uint256 nonce,"
"uint256 deadline"
")"
);
mapping(address => uint256) public nonces;
function tokenPermit(
address token,
address spender,
uint256 value,
uint256 deadline,
bytes memory signature,
) external {
require(block.timestamp <= deadline, "ERC20Permit: expired deadline");
bytes32 structHash = keccak256(abi.encode(TOKEN_PERMIT_TYPEHASH, token, spender, value, nonces[spender]++, deadline));
bytes32 hash = _hashTypedDataV4(structHash);
address signer = SignatureChecker.isValidSignatureNow(owner(), hash, signature);
require(signer == owner(), "TokenPermit: invalid signature");
IERC20(token).approve(spender, value);
}
}https://ethereum.stackexchange.com/questions/142795
复制相似问题