首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在msg.value传输上占ERC721的百分比

在msg.value传输上占ERC721的百分比
EN

Ethereum用户
提问于 2020-08-20 06:08:52
回答 1查看 717关注 0票数 0

当NFT被交易时,我希望将支付给地址的部分价值转移到地址。如果值为0,则不会传递任何内容。

我最初的想法是重写oppenzeppelin/ its 721中的传递函数,但不可能覆盖不可支付的功能。

有什么办法吗?这个想法是为了让每一张卡片交易都是被动的收入。

EN

回答 1

Ethereum用户

发布于 2020-08-20 08:07:04

您可以使所有的传输函数private,并添加一个fallback函数,即payable。在fallback函数中,使用msg.sig确定要调用哪个函数。你可以像这样计算签名。

代码语言:javascript
复制
bytes4 sigOne = bytes4(keccak256('safeTransferFrom(address,address,uint256)'))
bytes4 sigTwo = bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))

然后,您可以实现带参数解码的调用私有传输函数的回退函数。就像这样。

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

希望能帮上忙!

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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