Erc-20

可以發送合約擁有但不是 msg.sender 擁有的 ERC20 代幣

  • October 10, 2021

我有兩種方法: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)

引用自:https://ethereum.stackexchange.com/questions/110908