如何检查钱包是否已被授权可花费指定token
检查ERC20代币授权状态的实现方案
所有符合ERC20标准的代币合约都内置了allowance查询方法,你可以通过调用该方法确认当前钱包给目标消费合约的授权额度,再决定是否需要执行授权操作,避免重复授权。
实现逻辑
- 提前准备三个核心参数:
- 待交易的代币合约地址
- 你的钱包地址(代币持有人地址)
- 授权目标合约地址(比如Uniswap路由合约地址)
- 调用代币合约的
allowance(owner, spender)方法,返回值为当前已生效的授权额度,单位为代币的最小精度单位(如USDC为6位、ETH为18位,需和你本次交易的金额单位保持一致) - 额度校验规则:
- 若已授权额度 ≥ 本次交易需要花费的额度:直接跳过授权步骤,执行后续交易逻辑
- 若已授权额度 < 本次交易需要花费的额度:再执行
approve授权操作即可
代码示例(基于ethers v6)
const ERC20_ABI = [ // 授权额度查询方法 "function allowance(address owner, address spender) external view returns (uint256)", // 授权方法 "function approve(address spender, uint256 amount) external returns (bool)" ]; // 初始化代币合约实例 const tokenContract = new ethers.Contract(你的代币地址, ERC20_ABI, 钱包签名器实例); // 查询当前已授权额度 const approvedAmount = await tokenContract.allowance(你的钱包地址, 目标消费合约地址); // 将本次要交易的金额转换为代币最小精度单位 const needAmount = ethers.parseUnits(本次交易金额, 代币精度); if (approvedAmount < needAmount) { // 额度不足,执行授权 const approveTx = await tokenContract.approve(目标消费合约地址, needAmount); // 等待授权交易上链确认 await approveTx.wait(); } // 后续执行交易逻辑
注意:部分非标准ERC20代币(如USDT)存在授权调整限制,当已有授权额度不为0时无法直接修改为新额度,需要先调用approve将额度设置为0,再设置为你需要的目标额度。
内容的提问来源于stack exchange,提问作者BJonas88
相关产品推荐
相关产品推荐

