下面是一个基本示例,其中我在myContract上调用一个方法并使用Paymaster:
await myContract.myMethod(
myArgs,
{
customData: {
paymasterParams: paymasterParams,
gasPerPubdata: utils.DEFAULT_GAS_PER_PUBDATA_LIMIT,
}
}
);为了确保Paymaster只能用于myContract,并且只用于调用myMethod,我需要从paymaster智能契约代码中获取调用契约和方法。获取合同是直接的,它可以从transaction.to对象获得。
看来,transaction.data保存已编码的方法调用。因此,为了访问我尝试过的数据:
if (paymasterInputSelector == IPaymasterFlow.general.selector) {
address userAddress = address(uint160(_transaction.from));
address callerAddress = address(uint160(_transaction.to));
require(userAddress == allowedUser, "Must be an Approved User");
require(callerAddress == tokenAddr, "Invalid token address");
bytes4 funcSlct = bytes4(keccak256(bytes(_transaction.data))); //Trying to extract function selector from data
if (funcSlct == bytes4(keccak256(bytes("0x1234abcd")))) {
// compare function selector from data to the expected value.
// do something
// But this always fails!
} else {
//don't do anything, revert!
// it always reverts here.
}
// rest of the paymaster code
}问题是,这个条件从来没有得到满足,而且总是会恢复。
我不确定这是否与paymaster中的事务对象有关,或者我如何解码和比较函数签名/选择器是否有问题。注意,当它恢复时,它会将事务对象打印到屏幕上,而data将与匹配的函数选择器一起出现。
发布于 2023-04-07 22:54:40
您正在从事务数据中提取函数选择器,但是它包含函数选择器,后面是ABI编码的参数,只需用要匹配的正确方法签名替换myMethod()。
if (paymasterInputSelector == IPaymasterFlow.general.selector) {
address userAddress = address(uint160(_transaction.from));
address callerAddress = address(uint160(_transaction.to));
require(userAddress == allowedUser, "Must be an Approved User");
require(callerAddress == tokenAddr, "Invalid token address");
bytes4 funcSlct = bytes4(_transaction.data[0] | (_transaction.data[1] << 8) | (_transaction.data[2] << 16) | (_transaction.data[3] << 24));
bytes4 expectedFuncSlct = bytes4(keccak256("myMethod()"));
if (funcSlct == expectedFuncSlct) {
// Do something
} else {
// Revert
}
// Rest of the paymaster code
}https://ethereum.stackexchange.com/questions/148670
复制相似问题