前回の 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});
})
これでトークンが送信されました。