Erc-20
可以發送合約擁有但不是 msg.sender 擁有的 ERC20 代幣
我有兩種方法:sendfromself() 和 getbalance()
唯一的區別是第一種方法檢查 msg.sender 方法參數中提供的 ERC20 地址中是否有任何硬幣,如果有,則將該餘額轉移到合約中。
第二種方法,檢查合約是否有任何 ERC20 代幣,如果有,將這些代幣轉移到指定地址。
奇怪的是,第二種方法有效,第一種方法 sendfromself() 無效。為免生疑問,我已經使用該合約的地址呼叫了 ERC20approv() 方法。
我究竟做錯了什麼?為什麼第一種方法沒有給我發送 msg.sender 的 ERC20 幣?
from vyper.interfaces import ERC20 event balancex: balancex: uint256 other: constant(address) = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db @payable @external def sendfromself(_coin: address) -> bool: amount: uint256 = ERC20(_coin).balanceOf(msg.sender) log balancex(amount) if amount > 0: ERC20(_coin).transferFrom(msg.sender, self, amount) return True @payable @external def getbalance(_coin: address) -> bool: amount: uint256 = ERC20(_coin).balanceOf(self) response: Bytes[32] = raw_call( _coin, concat( method_id("transfer(address,uint256)"), convert(other, bytes32), convert(amount, bytes32), ), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) return True
from vyper.interfaces import ERC20 event balancex: balancex: uint256 other: constant(address) = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2 @external def sendfromself(_coin: address) -> bool: amount: uint256 = ERC20(_coin).balanceOf(msg.sender) allowance: uint256 = ERC20(_coin).allowance(msg.sender,self) if (allowance == 0): return False if (allowance < amount): return False else: if (allowance >= amount): ERC20(_coin).transferFrom(msg.sender,self,amount) log balancex(amount) return True else: return False @external def getbalance(_coin: address) -> bool: amount: uint256 = ERC20(_coin).balanceOf(self) response: Bytes[32] = raw_call( _coin, concat( method_id("transfer(address,uint256)"), convert(other, bytes32), convert(amount, bytes32), ), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) return True
上面的程式碼現在似乎執行良好。必須檢查津貼
為了
transferFrom(from, to, amount)
工作,呼叫地址 (msg.sender
) 需要有足夠的由地址分配的令牌餘量from
,即使該from
地址是呼叫地址本身。這可能是違反直覺的,為什麼呼叫地址應該被批准使用自己的代幣餘額?但顯然這就是 ERC20 的實施方式。所以你應該繼續這一行:ERC20(_coin).approve(msg.sender, amount)