Web3js 传输令牌
Web3js transfer token
我正在尝试将代币转移到其他地址。在我调用我的传递函数之前,我调用 estimateGas()
来估计所需的气体。
代码如下:
var count = await web3Config.web3.eth.getTransactionCount(process.env.OWNER_ADDRESS);
var data = web3Config.contractInstance.methods.transfer(req.body.address, req.body.amount*Math.pow(10,18)).encodeABI();
var estimatedGasPrice = await web3Config.web3.eth.estimateGas({
from : process.env.OWNER_ADDRESS,
to: process.env.CONTRACT_ADDRESS,
data : data
});
logs.error(estimatedGasPrice)
var rawTx = {
from : process.env.OWNER_ADDRESS,
to: process.env.CONTRACT_ADDRESS,
data : data,
nonce: "0x" + count.toString(16),
gasPrice: web3Config.gasPrice,
value: '0x0',
gasLimit: estimatedGasPrice,
chainId: 3
}
var tx = new Tx(rawTx);
tx.sign(web3Config.ownerPrivKey);
var serializedTx = tx.serialize();
var receipt = await web3Config.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
res.send(receipt)
logs.log(receipt)
我的合同小数点是18.
如果我要转1 token
所以需要转成1000000000000000000
因为有小数点
问题出在这一行 req.body.amount*Math.pow(10,18)
。当我尝试转移超过 100000 的代币时,它给出了下面提到的异常:
Error: [number-to-bn] while converting number 1e+22 to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported. Given value: "1e+22"
warning.js:18
at toBN (/home/akshay/WS/ethereum/node_modules/web3-utils/src/utils.js:64:15)
at Object.toTwosComplement (/home/akshay/WS/ethereum/node_modules/web3-utils/src/utils.js:77:18)
at SolidityTypeUInt.formatInputInt [as _inputFormatter] (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/formatters.js:44:36)
at SolidityTypeUInt.SolidityType.encode (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/type.js:188:17)
at /home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/index.js:255:29
at Array.map (<anonymous>)
at ABICoder.encodeParameters (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/index.js:254:34)
at /home/akshay/WS/ethereum/node_modules/web3-eth-contract/src/index.js:420:24
at Array.map (<anonymous>)
at Object._encodeMethodABI (/home/akshay/WS/ethereum/node_modules/web3-eth-contract/src/index.js:419:12)
at main (/home/akshay/WS/ethereum/routes/blockchain.js:55:116)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
超出数量范围
任何 help/suggestion 将不胜感激。
如果您在控制台中键入值,您会看到该值太大以至于 javascript 转换该值。
> 1*Math.pow(10,18)
1000000000000000000
> 100000000000000*Math.pow(10,18)
1e+32
我认为你可以使用 web3 bn 对象来计算令牌。
或者你可以使用 web3 toWei 做同样的事情。
如果你的token decimal是18(比如ethereum to wei),那么你可以简单地使用toWei(1, 'ether')
来获取token数量。
我正在尝试将代币转移到其他地址。在我调用我的传递函数之前,我调用 estimateGas()
来估计所需的气体。
代码如下:
var count = await web3Config.web3.eth.getTransactionCount(process.env.OWNER_ADDRESS);
var data = web3Config.contractInstance.methods.transfer(req.body.address, req.body.amount*Math.pow(10,18)).encodeABI();
var estimatedGasPrice = await web3Config.web3.eth.estimateGas({
from : process.env.OWNER_ADDRESS,
to: process.env.CONTRACT_ADDRESS,
data : data
});
logs.error(estimatedGasPrice)
var rawTx = {
from : process.env.OWNER_ADDRESS,
to: process.env.CONTRACT_ADDRESS,
data : data,
nonce: "0x" + count.toString(16),
gasPrice: web3Config.gasPrice,
value: '0x0',
gasLimit: estimatedGasPrice,
chainId: 3
}
var tx = new Tx(rawTx);
tx.sign(web3Config.ownerPrivKey);
var serializedTx = tx.serialize();
var receipt = await web3Config.web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'));
res.send(receipt)
logs.log(receipt)
我的合同小数点是18.
如果我要转1 token
所以需要转成1000000000000000000
因为有小数点
问题出在这一行 req.body.amount*Math.pow(10,18)
。当我尝试转移超过 100000 的代币时,它给出了下面提到的异常:
Error: [number-to-bn] while converting number 1e+22 to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported. Given value: "1e+22"
warning.js:18
at toBN (/home/akshay/WS/ethereum/node_modules/web3-utils/src/utils.js:64:15)
at Object.toTwosComplement (/home/akshay/WS/ethereum/node_modules/web3-utils/src/utils.js:77:18)
at SolidityTypeUInt.formatInputInt [as _inputFormatter] (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/formatters.js:44:36)
at SolidityTypeUInt.SolidityType.encode (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/type.js:188:17)
at /home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/index.js:255:29
at Array.map (<anonymous>)
at ABICoder.encodeParameters (/home/akshay/WS/ethereum/node_modules/web3-eth-abi/src/index.js:254:34)
at /home/akshay/WS/ethereum/node_modules/web3-eth-contract/src/index.js:420:24
at Array.map (<anonymous>)
at Object._encodeMethodABI (/home/akshay/WS/ethereum/node_modules/web3-eth-contract/src/index.js:419:12)
at main (/home/akshay/WS/ethereum/routes/blockchain.js:55:116)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
超出数量范围
任何 help/suggestion 将不胜感激。
如果您在控制台中键入值,您会看到该值太大以至于 javascript 转换该值。
> 1*Math.pow(10,18)
1000000000000000000
> 100000000000000*Math.pow(10,18)
1e+32
我认为你可以使用 web3 bn 对象来计算令牌。
或者你可以使用 web3 toWei 做同样的事情。
如果你的token decimal是18(比如ethereum to wei),那么你可以简单地使用toWei(1, 'ether')
来获取token数量。