我正在尝试使用带有Web3.js的transferFrom()函数将自定义ERC20令牌发送到所有者电子钱包地址
但是所有交易都失败了。在Remix IDE上出现同样的问题。
stackOverflow上的一些答案表示在approve()
函数之前需要先调用transferFrom()
。所以,我试过Remix frist但是我遇到了同样的问题。然后尝试使用如下的Web3.js。
const myContract = new web3.eth.Contract(abi);
const amount = sendAmount;
let address = myAddress;
myContract.options.address = contractAddress;
myContract.options.from = TokenOwner;
let options = myContract.options;
let data1 = myContract.methods.approve(address, amount).encodeABI();
let data2 = myContract.methods.transferFrom(address, TokenOwner, amount).encodeABI();
const ethAccount = fromPrivateKey(toBuffer("0x..."));
const fromPrivateKeyBuffer = ethAccount.getPrivateKey();
web3.eth.getTransactionCount(TokenOwner, (err, count) => {
if (err) return;
const txData = {
chainId: 0x03,
gasPrice: web3.utils.toHex(42000000000),
gasLimit: web3.utils.toHex(90000),
to: contractAddress,
from: TokenOwner,
value: 0x0,
nonce: web3.utils.toHex(count),
data: data1
};
const tx = new ethTx(txData);
tx.sign(fromPrivateKeyBuffer);
const serializedTx = tx.serialize().toString("hex");
if (!serializedTx) {
return;
} else {
web3.eth.sendSignedTransaction(`0x${serializedTx}`, (err, MuiTXHash) => {
console.log("err : ", err, "Data1-MuiTXHash : ", MuiTXHash);
// START DATA2
web3.eth.getTransactionCount(TokenOwner, (err, count) => {
if (err) return;
const txData2 = {
chainId: 0x03,
gasPrice: web3.utils.toHex(42000000000),
gasLimit: web3.utils.toHex(90000),
to: contarctAddress,
from: TokenOwner,
value: 0x0,
nonce: web3.utils.toHex(count + 1),
data: data2
};
const tx2 = new ethTx(txData2);
tx2.sign(fromPrivateKeyBuffer);
const serializedTx2 = tx2.serialize().toString("hex");
if (!serializedTx2) {
return;
} else {
web3.eth.sendSignedTransaction(`0x${serializedTx2}`, (err, MuiTXHash2) => {
console.log("err : ", err, "Data2-MuiTXHash : ", MuiTXHash2);
});
}
});
// END DATA2
});
}
});
};
我收到了两个Transaction Hash返回数据,并且TransferFrom()事务再次失败。 问题是什么? 我怎样才能成功?我必须将自定义ERC20令牌从特定地址撤回到所有者。所以我必须使用transferFrom()事务。 请让我知道怎么做。感谢。
答案 0 :(得分:0)
我想Remix上的编译有一些错误所以我创建了新的可靠性文件,并在其上部署了相同的代码。新的智能合约运作良好,没有发生任何错误。错误与我的代码无关。如果某人有这样的问题,那么创建一个新的合同地址,我不建议在Remix上使用“At Address”。这根本不适用。
答案 1 :(得分:0)
在Solidity上,我尝试了appove()+ transferFrom()和allowance()正常工作,但在web3上却无法正常工作
答案 2 :(得分:0)
我猜想transferFrom函数应该由支出者调用(即TokenOwner批准支出的地址)。因此,
const txData2 = {
chainId: 0x03,
gasPrice: web3.utils.toHex(42000000000),
gasLimit: web3.utils.toHex(90000),
to: contarctAddress,
from: address, // spender's address
value: 0x0,
nonce: web3.utils.toHex(count + 1),
data: data2
};
并且不要忘记在 getTransactionCount 中使用 spender的privateKey 在签名txn 和 spender的地址 在这里阅读:Ethereum Wiki 希望能帮助到你。 :)