Solidity

如何在合約函式中從 msg.sender 請求令牌

  • July 23, 2019

從你的智能合約的使用者那裡轉移乙太坊很簡單,你只需使用 msg.value 並且可以在你的合約功能中使用它。但是考慮以下合約,用代幣做同樣的事情有點棘手

pragma solidity ^0.4.24;
import "../node_modules/zeppelin-solidity/contracts/math/SafeMath.sol";
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/SafeERC20.sol";
contract TokenExchange{
 enum State {OPEN, FILLED, CLOSED, CANCELED}
 struct Order {
   uint id;
   State state;
   address buyer;
   address seller;
   uint antAmmount;
   uint daiAmmount;
 }
 ERC20 public token1;
 ERC20 public token2;
 mapping (uint => Order) public globalOrders;      
 uint private nextOrderId;
 constructor () public {
     token1 = ERC20(0x1111111111111111111111111111111111111111); 
     token2 = ERC20(0x2222222222222222222222222222222222222222); 
 }
 function createBuyOrder(uint _buyAmmount, uint _sellAmmount) external payable {
   uint deposit = _buyAmmount.div(2);    

   // How to transfer tokens from message sender to this contract

   Order memory newOrder = Order({
           id: 0, 
           state: State.OPEN, 
           buyer: msg.sender, 
           seller: 0x0000000000000000000000000000000000000000, 
           token1Ammount: _buyAmmount, 
           token2Ammount: _sellAmmount 
       });
   globalOrders[nextBuyOrderId] = newOrder;
   nextBuyOrderId++;
 }
}

如果我們正在處理 eth,我們可以簡單地要求 msg.sender 等於存款值。我們也不能在函式中使用 token.aprove() 和 transferFrom(),因為這將證明合約餘額而不是 msg.sender

所以我的問題是:我如何要求消息發送者將押金發送給合約,以及如何測試消息發送者是否發送了所需的金額?

approve()並且transferFrom()是一個兩步的過程。您期望/要求它在使用者/客戶端進行協調。

**步驟 1.**客戶批准從他們的賬戶中提取的契約。

**步驟 2.**客戶端向合約發送交易,合約transferFrom()嘗試訪問代幣。你的契約只關心這部分。看起來它適合您的評論所在的位置。

如果您正在實施令牌,您也可以考慮 ERC223。這樣的代幣合約期望接收者(如果它是合約)實現tokenFallback()在代幣轉移給它時將呼叫的 a 。

希望能幫助到你。

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