Solidity
如何在合約函式中從 msg.sender 請求令牌
從你的智能合約的使用者那裡轉移乙太坊很簡單,你只需使用 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 。希望能幫助到你。