Truffle
代幣合約必須將所有代幣轉移到眾籌合約才能出售嗎?
我注意到在 Openzeppelin 中眾籌合約的標準測試中,他們將代幣從代幣合約轉移到眾籌合約:
context('once deployed', async function () { beforeEach(async function () { this.tokensale = await TokenSale.new(rate, wallet, this.token.address); await this.token.transfer(this.tokensale.address, tokenSupply); });
然而,其他範例不這樣做。所以我想知道為什麼這是必要的,如果內部
CrowdSale
合約使用代幣合約來發送代幣:function _deliverTokens( address beneficiary, uint256 tokenAmount ) internal { _token.safeTransfer(beneficiary, tokenAmount); }
上面的函式
_token
中就是Token合約的IERC20介面。有人可以比這個頁面更好地解釋一下嗎?
不需要在創建時將所有代幣發送到眾籌合約。你可以做任何最適合你的商業模式的事情。
例如,一個常見的場景是在銷售中出售 25% 的代幣並保留剩餘的代幣。在這種情況下,您將在眾籌合約中創建 25% 的代幣,在您自己的錢包中創建 75% 的代幣。
上面的合約按預期傳遞了代幣。
_token.safeTransfer(beneficiary, tokenAmount);
就是說這個合約會將代幣從這個合約轉移給受益人。該聲明的關鍵是代幣存在於眾籌合約中,否則safeTransfer()
將拋出。正如您所提到的,_token
是契約的 IERC20 介面。您引用的測試是一個
beforeEach
函式,它在每次測試之前重置契約。這只是一種用代幣填充合約以進行測試的便捷方式。為該程式碼編寫的測試特定於令牌分發,因此發送所有令牌是可行的。