如何將現有的 ERC20 代幣導入我的合約?
我正在嘗試制定質押合約。我見過的所有指南都使用應付(ETH)或新創建的代幣。如何將現有代幣(可能是通過地址)導入我的合約?另外,批准令牌以便我可以使用 transferFrom() 函式的最簡單方法是什麼?
要導入現有代幣,您需要導入應該公開可用的代幣合約。你可以參考他們的文件或 GitHub 來找到該合約,直接導入它,然後開始使用它。例如,要在合約中使用 DAI 代幣,請參閱:https ://github.com/makerdao/developerguides/blob/master/dai/dai-token/dai-token.md#token-contract
這是
approve
來自 OpenZeppelin ERC20 合約的函式(連結):function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; }
OP 的問題可以用兩種方式來解釋,要麼是質押合約有一個代幣(本身就是一個 ERC20 合約),並且需要批准另一個代幣來花費質押池代幣的內容。這將涉及呼叫質押合約的
approve
函式,使用如下程式碼:stakingContract.approve(tokenAddress, <AMOUNT_TO_APPROVE>)
這個問題還可能意味著質押合約需要得到使用者的批准才能使用其他代幣。如果是這種情況,則可能存在誤解——這不會通過將另一個代幣合約“導入”到質押池的合約中來發生,而是發生在代幣的合約中。使用者需要呼叫代幣合約,並在那裡批准質押池。在 Ethers.js 虛擬碼中:
tokenContract.connect(user).approve(stakingPoolAddress, <AMOUNT_TO_APPROVE>);
根據您的程式碼庫,您可能需要直接從質押合約呼叫代幣合約。您將需要您希望呼叫的代幣合約的原始碼,或者它的介面,或者至少需要一個定義您需要與之互動的功能的介面(儘管後者可能不推薦)。(如果您更喜歡 Vyper 而不是 Solidity,這裡是 Vyper 介面的連結。)
為了準確分解使用介面與合約互動的工作原理,假設令牌的介面合約被呼叫
Foo
,並且 Foo 合約的文件在編譯時與您的質押池位於同一目錄中:pragma solidity ^0.8.2; import "./Foo.sol"; contract StakingPool { Foo private fooContract constructor(address fooAddress) { fooContract = Foo(fooAddress); } function approveStakingPoolOnFoo(uint256 amount) public returns(bool) { require(fooContract.approve(msg.sender, address(this), amount), "approveOnFoo:approval failed"); return true; } }
為了分解它,合約被導入,然後合約名稱(“
Foo
”)可以用作數據類型來創建一個變數,這個合約將把它視為您希望與之互動的合約的表示。在範例中,我們在建構子中告訴質押合約代幣合約的地址是什麼,並告訴它將該地址處的程式碼視為Foo
. (就是這樣fooContract = Foo(fooAddress);
。)然後我們可以使用它來呼叫 Foo 合約上的函式 - 給出的範例是 Approve,儘管它同樣適用於balanceOf
任何其他public
或external
函式。請注意,對另一個合約的呼叫通常不需要通過實際合約來完成,而是可以通過使用 web3 庫的 Web 界面來完成。很大程度上取決於您的具體情況。
希望這會有所幫助!