如何在Polymath ST 20生態體系裡搭建模組?
這篇文章,我將為您介紹如何在Polymath ST-20生態系統的中新增模組,供Polymath ST-20模組生產出證券化通證發行(STO)。
Polymath平臺上的證券化通證在構建時考慮了模組化,可擴充套件性和靈活性。
ST-20標準實現了讓開發人員將新型別的證券化通證功能構建為模組,這些模組可以由該通證的發行者動態附加到證券化通證。
模組可以代表任何型別的證券化通證功能,但是有一些關鍵型別的模組具有對證券化通證的特殊訪問許可權。
模組型別
目前我們定義了三種特殊的模組型別,如下所示,我們現在正在努力新增一個額外的Staking模組。
模組不必屬於這些類別之一,但如果它們所代表的功能對應於這些類別之一,則它們應實現與該類別相關聯的附加介面。
TransferManager
TransferManager模組用於確定通證間的傳輸是否有效。
它們由證券化通證的verifyTransfer函式使用,而verifyTransfer函式又由通證的transfer和transferFrom函式使用。
實現的相應介面是:
ITransferManager.sol" target="_blank" rel="nofollow,noindex"> ITransferManager.sol
(https://github.com/PolymathNetwork/polymath-core/blob/master/contracts/modules/TransferManager/ITransferManager.sol)
PermissionManager
PermissionManager模組用於管理模組和證券化通證之間的許可權。它們為發行者提供了一種靈活的方式,可以將某些型別的通證許可權委派給個人或模組。
實現的相應介面是:
(https://github.com/PolymathNetwork/polymath-core/blob/master/contracts/modules/PermissionManager/IPermissionManager.sol)
STO
STO(證券化通證產品)模組用於籌集資金,或者更常見的是薄荷和燃燒證券化通證。它們由底層通證的鑄幣和燒錄功能使用。
實現的相應介面是:
(https://github.com/PolymathNetwork/polymath-core/blob/master/contracts/modules/STO/ISTO.sol)
開發新模組
在本文中,我們將使用以下示例 - 我們想要建立一個STO模組(因為它將是鑄幣通證),允許發行人輕鬆初始化售前通證分配。
預售參與者的代幣只能在固定日期(通常於公開STO)之前建立。
以下程式碼片段可能會有縮減,以使其核心功能呈現更加清晰。
所有這些合同都在我們的公開GitHub資料庫中以完整的形式出現,包括該模組的測試用例。
商業邏輯
我們首先看一下模組合同,它將包含我們的業務邏輯(允許發行人記錄售前代幣分配的邏輯)。 允許發行人建立預售通證分配的基本邏輯看起來是這樣的:
介面和初始化
為了使其可存在Polymath生態系統裡,我們需要新增一些樣板程式碼並從模組介面繼承。
由於該模組需要薄荷標記,因此它是特殊模組型別STO。因此它必須從ISTO介面繼承,而ISTO介面繼承自IModule。
IModule介面定義了一些在所有模組中通用的功能,具體來說:
ISTO模組繼承自IModule,並定義了STO型別模組使用的一些附加功能:
即使預售分配不涉及任何資金轉移,為了透明起見,我們將記錄預售通證分配中涉及的ETH或POLY的數量。
那麼,讓我們將它們新增到我們的PreSale模組合同中!
模組初始化
正如我們將在下一節中看到的,所有模組都是通過工廠合同建立的。
工廠合同負責建立和配置其所有模組。
為了讓工廠配置其模組,IModule介面定義了`getInitFunction`,它返回用於設定模組所有初始狀態的函式的簽名 - 在這種情況下,只是可以建立預售分配的時間(即STO的開始)。
初始化函式可以是任意複雜的,但是這裡我們有一個簡單的`configure`函式,它只設置這個`endTime`值。
模組工廠
每個模組工廠都需要實現IModuleFactory介面。
這定義了一些控制模組成本的關鍵函式(發行者為了使用模組需要支付的POLY數量)以及為模組提供人類可讀的指令和描述。
IModuleFactory介面如下所示:
那麼 - 讓我們建立PreSaleSTOFactory合同,去實現這些功能:
註冊模組
一旦您建立了新模組,剩下的就是將其新增到Polymath生態系統中。
為此,您需要部署工廠合同(PreSaleSTOFactory),然後呼叫:
結論
上面的所有程式碼示例都可以在以下位置找到: