0

最近、メインネットで ERC-20 トークンを公開しましたが、すべてうまく機能しています。今、コインを求める人にコインを配布するために、Faucet スマートコントラクトを作成しようとしています。これは、トークン コントラクトから直接新しいトークンを作成するフォーセットではなく、(ウォレットからフォーセットに送信することによって) トークンをプリロードできるフォーセットであることに注意してください。

さまざまなソースから蛇口のスマート コントラクトをまとめましたが、「撤回」機能を除いてすべて正常に動作します。次のエラーが表示されます。

truffle(development)> FaucetDeployed.withdraw()
Uncaught Error: Returned error: VM Exception while processing transaction: revert
    at evalmachine.<anonymous>:0:16
    at sigintHandlersWrap (vm.js:273:12)
    at Script.runInContext (vm.js:142:14)
    at runScript (C:\Users\Jonathan\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\core\lib\console.js:364:1)
    at Console.interpret (C:\Users\Jonathan\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\core\lib\console.js:379:1)
    at bound (domain.js:421:15)
    at REPLServer.runBound [as eval] (domain.js:432:12)
    at REPLServer.onLine (repl.js:909:10)
    at REPLServer.emit (events.js:400:28)
    at REPLServer.emit (domain.js:475:12)
    at REPLServer.Interface._onLine (readline.js:434:10)
    at REPLServer.Interface._normalWrite (readline.js:588:12)
    at Socket.ondata (readline.js:246:10)
    at Socket.emit (events.js:400:28) {
  data: {
    '0xf08ce8522dce0fb4c19ac791e5a7960055e1ad0e106761efa8f411c1cc9e23c9': { error: 'revert', program_counter: 677, return: '0x' },
    stack: 'c: VM Exception while processing transaction: revert\n' +
      '    at Function.c.fromResults (C:\\Users\\Jonathan\\AppData\\Roaming\\npm\\node_modules\\ganache-cli\\build\\ganache-core.node.cli.js:4:192416)\n' +
      '    at w.processBlock (C:\\Users\\Jonathan\\AppData\\Roaming\\npm\\node_modules\\ganache-cli\\build\\ganache-core.node.cli.js:42:50915)\n' +
      '    at runMicrotasks (<anonymous>)\n' +
      '    at processTicksAndRejections (internal/process/task_queues.js:95:5)',
    name: 'c'

これが私の Faucet スマート コントラクト コードです。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract Faucet {
    address payable owner;
    IERC20 private _token;
    uint256 public withdrawalAmount = 50 * (10 ** 18);

    event Withdrawal(address indexed to, uint amount);
    event Deposit(address indexed from, uint amount);

    constructor (IERC20 token) {
        _token = token;
        owner = payable(msg.sender);
    }

    // Accept any incoming amount
    receive() external payable {
        emit Deposit(msg.sender, msg.value);
    }

    // Give out ether to anyone who asks
    function withdraw() public {
        // Limit withdrawal amount to 1,000 tokens
        require(
            withdrawalAmount <= 1000 * (10 ** 18),
            "Request exceeds maximum withdrawal amount of 1000 ICHC"
          );

        require(
            _token.balanceOf(address(this)) >= withdrawalAmount,
            "Insufficient balance in faucet for withdrawal request"
        );

        require(
            msg.sender != address(0),
            "Request must not originate from a zero account"
        );

        // Send the amount to the address that requested it
        _token.transfer(msg.sender, withdrawalAmount);
    }

    // setter for withdrawl amount
    function setWithdrawalAmount(uint256 amount) public onlyOwner {
        // Limit max withdrawal amount to 10,000 tokens
        require(amount <= 10000 * (10 ** 18));
        withdrawalAmount = amount * (10 ** 18);
    }

    // Contract destructor
    function destroy() public onlyOwner {
        selfdestruct(owner);
    }

    // Access control modifier
    modifier onlyOwner {
        require(msg.sender == owner, "Only the contract owner can call this function");
        _;
    }
}

「トリュフの移行」を介して、ERC20 トークンと同様にローカルのガナッシュ ブロックチェーンに展開しています。次に、トリュフ コンソールで次のコマンドを使用してテストします。

設定:

Faucet.deployed().then(i=>{FaucetDeployed = i});
MyToken.deployed().then(s=>{ token = s });

Faucet にトークンをロードします。

token.transfer("0x55b9bCF39F78ef22E452d54957366cCBFffaF85E","300000000000000000000")

蛇口のバランスをチェック:

token.balanceOf("0x55b9bCF39F78ef22E452d54957366cCBFffaF85E").then((b)=> { balf = b })
balf.toString() // shows "300000000000000000000"

Faucet からの撤退の試み:

FaucetDeployed.withdraw()

これにより、この投稿の上部にあるエラーが発生します。すべてのrequireステートメントを削除しようとしましたが、同じ結果です。私は本当にばかげた何かを見落としていると確信しています。誰かが私が間違っていることを見つけることができますか? アドバイスをいただければ幸いです - ありがとう!

  • ジョナサン
4

0 に答える 0