当NFT被交易时,我希望将支付给地址的部分价值转移到地址。如果值为0,则不会传递任何内容。
我最初的想法是重写oppenzeppelin/ its 721中的传递函数,但不可能覆盖不可支付的功能。
有什么办法吗?这个想法是为了让每一张卡片交易都是被动的收入。
发布于 2020-08-20 08:07:04
您可以使所有的传输函数private,并添加一个fallback函数,即payable。在fallback函数中,使用msg.sig确定要调用哪个函数。你可以像这样计算签名。
bytes4 sigOne = bytes4(keccak256('safeTransferFrom(address,address,uint256)'))
bytes4 sigTwo = bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))然后,您可以实现带参数解码的调用私有传输函数的回退函数。就像这样。
pragma solidity 0.6.6;
contract Test {
bytes4 sigOne = bytes4(keccak256('safeTransferFrom(address,address,uint256)'));
bytes4 sigTwo = bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'));
fallback () external payable {
require(msg.value > 0);
// transfer amount to the address
bytes memory payload = abi.encodePacked(bytes28(0), msg.data);
bytes4 sig = msg.sig;
if (sig == sigOne) {
(
bytes32 _,
address from,
address to,
uint256 value,
) = abi.decode(payload, (bytes32, address, address, uint256));
safeTransferFrom(from, to, value);
} else if (sig == sigTwo) {
(
bytes32 _,
address from,
address to,
uint256 value,
bytes memory data,
) = abi.decode(payload, (bytes32, address, address, uint256, bytes));
safeTransferFrom(from, to, value, data);
} else {
revert("signature did not match");
}
}
}希望能帮上忙!
https://ethereum.stackexchange.com/questions/86792
复制相似问题