将 ERC20 从账户转移到合约时出错
Error when transfering ERC20 from account to contract
我在尝试将 IERC20 代币从账户转移到合约时遇到以下错误:
Error: Returned error: VM Exception while processing transaction: revert ds-math-sub-underflow -- Reason given: ds-math-sub-underflow.
(在 pair.transferFrom
行失败)。
但是,如果我尝试从一个账户转移到另一个账户,它会起作用,只有当我尝试从一个账户转移到合约时,它才会失败:
const PAIR = "0x397ff1542f962076d0bfe58ea045ffa2d347aca0";
const PAIR_WHALE = "0x7ac049b7d78bc930e463709ec5e77855a5dca4c4";
const pair = await IERC20.at(PAIR);
const myContract = await MyContract.deployed();
// const addr = accounts[0]; // Works!!!
const addr = myContract.address; // Fails with error above
let whaleBal = await pair.balanceOf(PAIR_WHALE);
await pair.approve(addr, whaleBal, { from: PAIR_WHALE });
await pair.transferFrom(PAIR_WHALE, addr, whaleBal);
我对 运行 的设置:
- 带有 infura + ganache 的主网分支
PAIR
是来自 sushiswap 的 USDC-WETH
对的地址
PAIR_WHALE
通过 ganache 解锁
- 上面的代码片段来自我 运行 和
truffle test
的测试文件
pair.approve(addr, whaleBal, { from: PAIR_WHALE });
在这一行,PAIR_WHALE
(交易发送方)批准合约地址(addr
的价值)花费他们的代币。
pair.transferFrom(PAIR_WHALE, addr, whaleBal)
但是在这条线上,accounts[0]
(默认交易发送方)正在尝试花费 PAIR_WHALE
的代币。但是 accounts[0]
不被批准这样做。
当您在注释行中将 accounts[0]
的值分配给 addr
时,PAIR_WHALE
有效地批准了 accounts[0]
花费他们的代币,这导致 transferFrom()
要传递的函数。
你不能代表合约地址发送交易,因为它的私钥是未知的。
但是如果你想将PAIR_WHALE
代币转移到合约地址,你可以简单地从PAIR_WHALE
地址调用transfer()
函数。
// transfers `whaleBal` of `pair` tokens
// from the `PAIR_WHALE` address
// to the `myContract.address` address
pair.transfer(myContract.address, whaleBal, {from: PAIR_WHALE});
我在尝试将 IERC20 代币从账户转移到合约时遇到以下错误:
Error: Returned error: VM Exception while processing transaction: revert ds-math-sub-underflow -- Reason given: ds-math-sub-underflow.
(在 pair.transferFrom
行失败)。
但是,如果我尝试从一个账户转移到另一个账户,它会起作用,只有当我尝试从一个账户转移到合约时,它才会失败:
const PAIR = "0x397ff1542f962076d0bfe58ea045ffa2d347aca0";
const PAIR_WHALE = "0x7ac049b7d78bc930e463709ec5e77855a5dca4c4";
const pair = await IERC20.at(PAIR);
const myContract = await MyContract.deployed();
// const addr = accounts[0]; // Works!!!
const addr = myContract.address; // Fails with error above
let whaleBal = await pair.balanceOf(PAIR_WHALE);
await pair.approve(addr, whaleBal, { from: PAIR_WHALE });
await pair.transferFrom(PAIR_WHALE, addr, whaleBal);
我对 运行 的设置:
- 带有 infura + ganache 的主网分支
PAIR
是来自 sushiswap 的 PAIR_WHALE
通过 ganache 解锁- 上面的代码片段来自我 运行 和
truffle test
的测试文件
USDC-WETH
对的地址
pair.approve(addr, whaleBal, { from: PAIR_WHALE });
在这一行,PAIR_WHALE
(交易发送方)批准合约地址(addr
的价值)花费他们的代币。
pair.transferFrom(PAIR_WHALE, addr, whaleBal)
但是在这条线上,accounts[0]
(默认交易发送方)正在尝试花费 PAIR_WHALE
的代币。但是 accounts[0]
不被批准这样做。
当您在注释行中将 accounts[0]
的值分配给 addr
时,PAIR_WHALE
有效地批准了 accounts[0]
花费他们的代币,这导致 transferFrom()
要传递的函数。
你不能代表合约地址发送交易,因为它的私钥是未知的。
但是如果你想将PAIR_WHALE
代币转移到合约地址,你可以简单地从PAIR_WHALE
地址调用transfer()
函数。
// transfers `whaleBal` of `pair` tokens
// from the `PAIR_WHALE` address
// to the `myContract.address` address
pair.transfer(myContract.address, whaleBal, {from: PAIR_WHALE});