shengbuchao

shengbuchao

web3 js coder

nodejsでERC20トークンの送金

前回の eth の送金に続いて、今回は ERC20 トークンの送金方法を見ていきましょう。

依存関係のインストールと web3 の初期化#

ここでは詳細には触れませんが、web3 の初期化方法がわからない場合は、以前の記事を参照してください。

コントラクトオブジェクトの初期化#

前回はstartメソッドを作成しました。今回はその中にstartContractメソッドを作成し、以下のコードをstartContractメソッド内に置き換えます。

const startContract = async () => {
    let currentAddress = '0xe208D2fB37df02061B78848B83F02b4AD33540e4'
    let toAddress = '0x3EcAa09DD6B8828607bba4B1d7055Ea1143f8B94'
  
  // 今回もテストネット上のuniトークンを選択します
    const uniContractAddress = '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984'    // uni erc20トークンのコントラクトアドレス

    const uniswapAbi = []	// uniのabi情報は自分で探すか、私のweb3学習ノートを参照してください
    
    const uniToken = new web3.eth.Contract(uniswapAbi, uniContractAddress)
    
}
startContract()

これでコントラクトオブジェクトContractが作成されました。

パラメータの初期化#

トランザクションに必要ないくつかのパラメータを準備します。

const privateKey = Buffer.from('あなたのウォレットの秘密鍵', 'hex')
// amountを設定する前に、トークンの精度を取得する必要があります。ここではdecimalsの値は18です。
const decimals = await uniToken.methods.decimals().call()

// amount = 1 * 10^decimals ここでは1つのuniトークンを送金します
const amount = web3.utils.toHex(1 * Math.pow(10, decimals))

const count = await web3.eth.getTransactionCount(currentAddress)

const txParams = {
  from: currentAddress,
  to: uniContractAddress,
  gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')),
  gasLimit: web3.utils.toHex(210000),
  value: web3.utils.toHex(0),
  data: uniToken.methods.transfer(toAddress, amount).encodeABI(),
  nonce: web3.utils.toHex(count)
}

const tx = new EthereumTx(txParams, {
  chain: 'goerli'
})

tx.sign(privateKey)

これで必要なパラメータが揃い、秘密鍵も署名されました。
上記の ethereumjs-tx の署名方法では、デフォルトで以下の設定があります:

  • mainnet
  • ropsten
  • rinkeby
  • kovan
  • goerli (v1.1.0 以降の最終設定)
    これらのチェーンの場合は直接署名できます。他のチェーンの場合は、ethereumjs-commonを require する必要があります。
const  Common = require('ethereumjs-common').default
const blockchain = Common.forCustomChain(
    'mainnet', {
        name: 'Fantom Opera',
        networkId: 250,
        chainId: 250
    },
    'petersburg'
)

const tx = new EthereumTx(txParams, {
    common: blockchain
})

tx.sign(privateKey)

トランザクションの送信#

web3.eth.sendSignedTransaction('0x' + tx.serialize().toString('hex'))
  .on('transactionHash', console.log)
  .catch(err => {
  	console.log({err});
  })

これでトークンが送信されました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。