Solidity 代码块的问题(特别是 ROT 特定的代币销毁代码)

时间:2021-03-08 23:20:58

标签: ethereum solidity metamask remix erc20

一直在努力学习基础知识并尝试实现 RottenSwap 的令牌销毁部分(SushiSwap 的分支,更改了约 10 行代码)。基本上,当您发送交易时,它会将一个硬币 (ROT) 的 % 烧成另一个 (MAGGOT)。它让我可以在测试网和铸造代币上进行部署,但是在它们放入钱包后我无法发送它们,我收到如下错误:

<块引用>

"错误:[ethjs-query] 格式化 RPC 输出时 '{"value":{"code":-32603,"data":{"code":-32000,"message":"intrinsic gas too低"}}}'",

我用 2000 gwei 和极高的 gas 限制尝试了它,但它仍然抛出错误,所以问题不是 gas。如果我删除 Rotten 特定的代码,那么它就可以工作(但显然没有令牌销毁功能。)

我决定用实际的 Rotten 代码尝试同样的事情,只是复制/粘贴 Maggot 和 Rotten 合约(见下文),部署在测试网上,同样的事情:可以铸造代币,但尝试交易硬币会引发错误,除非我删除了 Rotten 特定的代码(也在下面)。我还去了 GitHub 并尝试了那里的文件,结果相同 - 只有在我删除该特定代码块时才有效。

任何人都知道可能导致这种情况的原因是什么?我正在使用 Remix 和 MetaMask,但问题似乎出在上面的代码块上,因为一旦删除,一切都会正常运行。

在部署 Maggot 时,我将“地址 _res”设置为我用来部署它的钱包 - 不确定这是否正确,但我只想把它放在那里。

在部署 Rotten 时,我将 'uint8' 设置为 40,据我所知,这将令牌消耗设置为 2.5% (100/unit8)。同时将“address _maggot”设置为我的测试网 Maggot 合约地址。

有人有什么想法吗?这不是最重要的问题,因为我只是在胡闹,但有点难住为什么复制一份已经有效的合同是行不通的。

烂合同:https://etherscan.io/address/0xd04785c4d8195e4a54d9dec3a9043872875ae9e2#code
蛆合约:https://etherscan.io/address/0x163c754ef4d9c03fc7fa9cf6dd43bfc760e6ce89#code

腐烂的特定代码:

    // rotten sushi is an exact copy of sushi except for the
    // following code, which implements a "rot" every transfer
    // https://etherscan.io/token/0x6b3595068778dd592e39a122f4f5a5cf09c90fe2
    // the rot burns 1% of the transfer amount, and gives the
    // recipient the equivalent MAGGOT token
    using SafeMath for uint256;
    // the maggot token that gets generated when transfers occur
    MaggotToken public maggot;
    // the amount of burn to maggot during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%
    uint8 public maggotDivisor;
    constructor(MaggotToken _maggot, uint8 _maggotDivisor) public {
        require(_maggotDivisor > 0, "Rotten: maggotDivisor must be bigger than 0");
        maggot = _maggot;
        maggotDivisor = _maggotDivisor;
    }
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        // maggot amount is 1%
        uint256 maggotAmount = amount.div(maggotDivisor);
        // recipient receives 1% maggot tokens
        maggot.mint(recipient, maggotAmount);
        // sender loses the 1% of the ROT
        _burn(msg.sender, maggotAmount);
        // sender transfers 99% of the ROT
        return super.transfer(recipient, amount.sub(maggotAmount));
    }
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        // maggot amount is 1%
        uint256 maggotAmount = amount.div(maggotDivisor);
        // recipient receives 1% maggot tokens
        maggot.mint(recipient, maggotAmount);
        // sender loses the 1% of the ROT
        _burn(sender, maggotAmount);
        // sender transfers 99% of the ROT
        return super.transferFrom(sender, recipient, amount.sub(maggotAmount));
    }
    // END OF ROTTEN SUSHI SPECIFIC CODE 
  
  

0 个答案:

没有答案