我希望通过智能合约加入矿池。合约与 Balancer Vault 接口并加入池中,发送者将是用户,BPT 的接收者将是合约本身。但在运行以下函数后,我得到了
BAL#401 - SENDER_NOT_ALLOWED
。我已批准我的合同和金库作为我正在使用的 ERC20 的支出者,但它不起作用。以下函数是在 balancer-v2-monorepo
的接口目录的 README 中找到的稍作修改的版本
function _addTokenLiquidityToBalancerPool(bytes32 poolId, address sender, uint256[] memory amountsIn, uint256 tokenIndex, uint256 minBptAmountOut) external {
require(amountsIn[tokenIndex] > 0, "Amount must be greater than 0");
(IERC20[] memory tokens, , ) = vault.getPoolTokens(poolId);
// Use BalancerErrors to validate input
_require(amountsIn.length == tokens.length, Errors.INPUT_LENGTH_MISMATCH);//
// Encode the userData for a multi-token join
bytes memory userData = abi.encode(StablePoolUserData.JoinKind.EXACT_TOKENS_IN_FOR_BPT_OUT, amountsIn, minBptAmountOut);
IVault.JoinPoolRequest memory requests = IVault.JoinPoolRequest({
assets: _asIAsset(tokens),
maxAmountsIn: amountsIn,
userData: userData,
fromInternalBalance: false
});
totalDepositByUser[msg.sender] += amountsIn[tokenIndex];
// Call the Vault to join the pool
vault.joinPool(poolId, sender, address(this), requests);
}
有人可以帮忙吗?我确实在某处读到,Balancer 可能需要 Relayer 批准合约来处理用户资金(here)。根据功能,我也是这种情况吗? 我在Goerli网络上运行。
我已尝试批准 Balancer Vault 和我自己的合约成为 ERC20 的支出者,以便他们可以代表用户处理它。
使用 Vault.sol 的 swap() 函数时出现此错误。通过从我部署的合约而不是从我的钱包进行代币交易来解决这个问题。 类似的东西-
IERC20 token = IERC20(tokenAddress);
token.approve(address(VaultAddress),amount);