将 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);

我对 运行 的设置:

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});