通过智能合约对接Balancer Vault加入池时遇BAL#401错误求助
BAL#401 - SENDER_NOT_ALLOWED 错误解决方法
你遇到的BAL#401 - SENDER_NOT_ALLOWED错误,核心原因是你的合约没有被用户授权为Balancer Vault的Relayer,这和ERC20代币授权是完全独立的两个权限要求。
当你的合约以用户地址作为sender调用Vault的joinPool时,Balancer的权限机制会校验:用户是否允许你的合约作为Relayer代其发起资金操作——仅给Vault和合约授权ERC20代币支出权限,无法满足这个校验要求。
解决步骤
- 用户需主动调用Balancer Vault的
setRelayerApproval接口,为你的合约授予Relayer权限:
这个操作必须由用户发起,完成后你的合约才能合法代表用户执行// 用户直接调用Vault的该函数 vault.setRelayerApproval( msg.sender, // owner:用户自己的地址 你的合约地址, // relayer:处理资金的合约地址 true // approved:设为true开启授权 );joinPool操作。 - 确认现有代码逻辑:你的
_addTokenLiquidityToBalancerPool函数中joinPool的参数传递是正确的(sender传用户地址、recipient传合约地址),补全Relayer授权步骤后即可解决错误。
权限区别说明
- ERC20的
approve是允许Vault转移用户的代币; - Vault的
setRelayerApproval是允许你的合约代表用户发起资金操作请求,两者都是必要条件,缺一不可。
内容的提问来源于stack exchange,提问作者Robin Roy
相关产品推荐
相关产品推荐

