Solidity
如何創建一個只接受客戶令牌的 Payable 函式?
我有一個我似乎找不到答案的問題,希望社區可以提供幫助(這是我在這裡的第一篇文章,所以如果首先提出的問題是錯誤的,我深表歉意)。
我正在嘗試創建一個帶有 Payable 功能的契約,該功能只接受特定的代幣,而不是 ETH,作為付款。我擁有代幣合約和專門為接受該特定代幣付款而創建的合約。
這甚至可能嗎?我發現這是一個可能的解決方案:
contract Crowdsale { address owner; mapping(address => uint256) balances; function Crowdsale(){ owner = msg.sender; } function acceptOnlyMyToken(address _yourTokenAddress, uint256 amount){ address user = msg.sender; YourToken token = YourToken(_yourTokenAddress); //get the user's balance uint256 userBalance = token.balanceOf(user); //check user's balance if(userBalance >= amount){ token.transferFrom(user, owner, amount); } } }
使用上面的程式碼假設以下內容是否安全?
- 替換
YourToken token = YourToken(_yourTokenAddress);
為YourToken token = YourToken(address(0xABCD...));
“0xABCD”作為我在單獨契約中的代幣的地址應該可以工作。require(msg.value == 100
在功能下指定acceptOnlyMyToken(...)
將允許我設置所需的具體付款金額。另外,我沒有看到這個函式被稱為“payable”,這有關係嗎?原因是因為我想將變數作為函式的一部分傳遞,以將 XYZ 工作作為合約邏輯的一部分,為此我收到了特定數量的該令牌的付款。
有什麼想法嗎?
您不
payable
用於非協議類型的傳輸。ERC20 不是“協議”,因為它是在契約中定義的。無法檢測到盲目轉移到合約的 ERC20 代幣。充其量,合約可以檢查它的餘額,但它不知道是誰寄了錢,所以這不好。
uint myTokenBalance = IERC20(<tokenAddress>).balanceOf(address(this));
您正在尋找“approve and transferFrom”模式。它是這樣的:
- 使用者授權你的合約從使用者的代幣餘額中提取。
- 然後,使用者呼叫你的合約中的一個函式來嘗試提取代幣。
第 2 步如下所示:
function sendMe100() external { IERC20(<tokenAddress>).transferFrom(msg.sender, address(this), 100); // success }
上述假設使用者已通過首先呼叫
approve
ERC20 合約中的函式(步驟 1)授權轉移,但這通常是前端問題,與您的合約無關。希望能幫助到你。