Web3.js を使って ERC20 トークンを送信


  • この記事のサンプルで使用している Web3.js のバージョンは 0.20.6 です。

スマートコントラクトを扱うための ABI を用意

  • ABI は、スマートコントラクトがどのような関数や状態変数を持っているかといった情報をもったインタフェースです。
  • プログラムからスマートコントラクトを扱う際は、このABIの情報に基づいて関数を読んだり状態変数の値を読みます。
  • 通常、ABI にはあるスマートコントラクトが持っているすべての関数や状態変数の情報が記載されますが、ERC20 トークンを送信するには、transfer という関数を実行できればいいので、この記事では transfer のみを ABI に記載します。

transfer 関数の情報のみ持つ ABI

let minABI = [
    // transfer
    {
        "constant": false,
        "inputs": [
            {
                "name": "_to",
                "type": "address"
            },
            {
                "name": "_value",
                "type": "uint256"
            }
        ],
        "name": "transfer",
        "outputs": [
            {
                "name": "",
                "type": "bool"
            }
        ],
        "type": "function"
    }
];

サンプルコード

  • decimals が 18 の ERC20 トークンを 100 送る例です。
  • この例では、ERC20 トークンのアドレスは 0x2A65D41dbC6E8925bD9253abfAdaFab98eA53E34 です。
  • この例では、送り先アドレスは 0x8Df70546681657D6FFE227aB51662e5b6e831B7A です。
let tokenAddress = "0x2A65D41dbC6E8925bD9253abfAdaFab98eA53E34";
let toAddress = "0x8Df70546681657D6FFE227aB51662e5b6e831B7A";

// 数値は巨大な数値になっても扱えるように BigNumber に変換
let decimals = web3.toBigNumber(18);
let amount = web3.toBigNumber(100);

let minABI = [
  // transfer
  {
    "constant": false,
    "inputs": [
      {
        "name": "_to",
        "type": "address"
      },
      {
        "name": "_value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "name": "",
        "type": "bool"
      }
    ],
    "type": "function"
  }
];

//  ABI とコントラクト(ERC20トークン)のアドレスから、コントラクトのインスタンスを取得 
let contract = web3.eth.contract(minABI).at(tokenAddress);

// 送付する ERC20 トークンの量を計算
let value = amount.times(web3.toBigNumber(10).pow(decimals));

// 引数にウォレットのアドレスと送付する ERC20 のトークン量を渡して、transfer 関数を呼ぶ
contract.transfer(toAddress, value, (error, txHash) => {
  // トランザクションを実行するので、戻り値はトランザクションハッシュ   
  console.log(txHash);
});

実際におくったトランザクション

関連

デモ

Note