最近、メインネットで 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ステートメントを削除しようとしましたが、同じ結果です。私は本当にばかげた何かを見落としていると確信しています。誰かが私が間違っていることを見つけることができますか? アドバイスをいただければ幸いです - ありがとう!
- ジョナサン