I have two smart contracts (A, B), which are extended from ERC721
. Is it possible to create a function in B
to call setApprovalForAll
on A
from a user Z
?
this is in contract B
: testApprove(A)
as user Z
function testApprove(address _contract) public payable {
bytes memory payload = abi.encodeWithSignature("setApprovalForAll(address,bool)", address(this), true);
(bool success,) = address(_contract).delegatecall(payload);
require(success);
bool result = ERC721(_contract).isApprovedForAll(msg.sender, address(this));
require(result, "Approve not set!");
}
success
is true,
and there was no error because it ran OK. But when I check if contract B
is approved, it's not!
Am I doing something wrong?
Thanks
If this was invoked with regular
.call
, it would give approval from your contract (caller of thesetApprovalForAll()
function) to your contract (first param).Since it's invoked with
.delegatecall
, the storage change is not performed on the target contract - but on your contract (the delegate caller). So all this snippet does, it sets a storage value of your contract in the same storage slot that the target would set the approval.As per EIP-721,
setApprovalForAll()
sets the approval frommsg.sender
. So the only way to receive the approval from the user is to have them send the transaction directly to the token contract - not through any other contract in between.