
先明确范围:授权针对代币合约
本文讨论ERC-20代币合约的通用授权机制,不代指TP钱包某个特定页面,也不代表所有链上的操作都相同。ERC-20规范提供approve设置额度、allowance查询剩余额度、transferFrom按授权支用代币等接口。授权关系对应特定代币合约、持有人和被授权地址,也就是spender。
误区一:点击授权就等于转出代币
approve通常是设置spender可支用的额度,本身不代表代币已经转出。因此,确认授权后余额没有立即减少,并不必然说明操作失败。之后spender可以在授权额度和持有人余额允许的范围内,通过transferFrom转移代币。

误区二:授权额度覆盖钱包里的所有资产
ERC-20的allowance是某个代币合约针对特定持有人和spender记录的额度,不是对钱包内所有代币的通用许可。核对授权时,应留意对应的代币、链、spender地址和额度,不能只凭应用名称判断授权范围。

误区三:最大额度只够当前这一次操作
有些授权会设置很大的额度。OpenZeppelin的ERC-20实现说明,最大uint256额度在语义上相当于无限授权,并且transferFrom使用时不会递减。不要把这种额度误认为只够完成一次操作,或认为用过一次就会自动失效;具体代币实现和钱包展示可能存在差异。
误区四:直接修改额度没有其他影响
直接把一个非零额度改成另一个非零额度,可能遇到交易先后顺序带来的风险:旧额度与新额度都有可能被支用。OpenZeppelin接口说明的一种缓解方式是先把额度降为0,再设置需要的额度。若要减少后续可支用范围,可在代币和钱包支持的情况下调低或清零对应额度;这不会撤销已经完成的转账。
常见问题:把代币直接转到合约地址可以代替授权吗?
不可以把两者当成同一操作。ERC-20标准没有要求接收合约必须提供代币接收通知或处理功能;若直接把代币转给无法处理ERC-20代币的合约,代币可能无法取回。合约存入代币时,常见做法是先授权,再由合约通过transferFrom支用,但仍应遵循具体合约的操作要求。