繼上次的轉賬 eth 之後,我們這次來繼續看怎麼轉賬 ERC20 的代幣
安裝依賴和初始化 web3#
這裡就不對贅述了,不知道怎麼初始化 web3 的,可以看我之前的一篇文章。
初始化合約對象 Contract#
上次我們是新建了一個start
方法。這次我們就在裡面新建一個startContract
方法,下面的換成執行startContract
方法
const startContract = async () => {
let currentAddress = '0xe208D2fB37df02061B78848B83F02b4AD33540e4'
let toAddress = '0x3EcAa09DD6B8828607bba4B1d7055Ea1143f8B94'
// 代幣我們這次還是選擇goerli測試鏈上面的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 之前需要先獲取到token幣種的精度,這裡的decimals 值為18,就是18位
const decimals = await uniToken.methods.decimals().call()
// amount = 轉賬數量 * 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 的簽名方案,使用的是ethereumjs-common
,默認有:
mainnet
ropsten
rinkeby
kovan
goerli
(final configuration sincev1.1.0
)
這些鏈的話可以直接簽。其他鏈的話需要自己 requireethereumjs-common
。
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});
})
這樣我們就已經把代幣發送出去了。