TokenConverter合约

circle-info

TokenConverter合约实现了Bancor协议,用户可以使用该合约完成代币的买卖。需要了解一下Bancor协议arrow-up-right的术语。

名词解释

英文
解释
详情

Smart Token

智能代币

能够在TokenConverter合约中进行交易的MultiToken合约中创建的代币。

Connector

连接器

连接器连接两个代币,一个智能代币(比如资源币CPU),一个连接器代币(比如ELF)。

Connected Token

连接器代币

通过把智能代币发送到TokenConverter合约中,购买者可以使用任何连接器代币来购买智能代币,之后将发行对应数量的新的智能代币,这些新的代币将自动转账至买方。换句话说,任何人都可以通过将连接器代币存入智能合约来购买智能代币。在这种情况下,一旦新的代币被发行,智能代币的连接器余额和智能代币的供应量都增加了。类似地,卖方可以向其智能合约发送任何数量的智能代币,然后将这些智能代币从流通中移除,并从连接器余额中提取相应数量的连接器代币,并将它们发送给卖方。在这种情况下,连接器余额和智能代币的供应量都减少了。为了知道买方需要代币以及卖方需要提取多少代币,智能代币不断根据供给和需求重新计算它相对于它的每个连接器代币的价格。

Connector WeightCW

连接器权重

CW表示智能代币的总价值(其供应量 × 单价)和对应连接器的余额价值之间的固定比率。智能代币的创建者为每个连接器指定所需的比率。由于连接器的余额和智能代币的市值都会随代币的买卖而波动,因此会通过Bancor公式保持该比率不变。因为每次购买或出售智能代币都会触发连接器代币和智能代币数量的增加或减少,因此智能代币相对于其连接器代币的价格将不断地重新计算以保持恒定的CW,即代币发行者指定的比率。这个比率决定了一个智能代币的价格需要调整多少,才能在每笔交易中保持稳定,换句话说,这一数值表示了价格的敏感性。连接器余额和智能代币数量之间的比率越高价格敏感度就越低,意味着每一次买卖都会对智能代币的价格走势产生相对柔和的影响。连接器余额和智能代币之间的比率越低价格敏感性就越高,这意味着每一次买卖都会对智能代币的价格走势产生相对强烈的影响。可以说,更高的连接器权重会导致智能代币与其连接器代币之间的相对价格比较稳定,而较低的权重会导致智能代币与其连接器代币之间的相对价格的波动性更强。

初始化 - Initialize

TokenConverter合约的初始化发生于Economic合约的InitialEconomicSystem方法调用。

private void InitializeTokenConverterContract()
{
    State.TokenConverterContract.Value =
        Context.GetContractAddressByName(SmartContractConstants.TokenConverterContractSystemName);
    var connectors = new List<Connector>
    {
        new()
        {
            Symbol = Context.Variables.NativeSymbol,
            IsPurchaseEnabled = true,
            IsVirtualBalanceEnabled = true,
            Weight = "0.5",
            VirtualBalance = EconomicContractConstants.NativeTokenConnectorInitialVirtualBalance
        
}
    };
    foreach (var resourceTokenSymbol in Context.Variables
                 .GetStringArray(EconomicContractConstants.PayTxFeeSymbolListName)
                 .Union(Context.Variables.GetStringArray(EconomicContractConstants.PayRentalSymbolListName)))
    {
        var resourceTokenConnector = new Connector
        {
            Symbol = resourceTokenSymbol,
            IsPurchaseEnabled = true,
            IsVirtualBalanceEnabled = true,
            Weight = "0.005",
            VirtualBalance = EconomicContractConstants.ResourceTokenInitialVirtualBalance,
            RelatedSymbol = EconomicContractConstants.NativeTokenPrefix.Append(resourceTokenSymbol),
            IsDepositAccount = false
        };
        var nativeTokenConnector = new Connector
        {
            Symbol = EconomicContractConstants.NativeTokenPrefix.Append(resourceTokenSymbol),
            IsPurchaseEnabled = true,
            IsVirtualBalanceEnabled = true,
            Weight = "0.005",
            VirtualBalance = EconomicContractConstants.NativeTokenToResourceBalance,
            RelatedSymbol = resourceTokenSymbol,
            IsDepositAccount = true
        };
        connectors.Add(resourceTokenConnector);
        connectors.Add(nativeTokenConnector);
    }

    State.TokenConverterContract.Initialize.Send(new InitializeInput
    {
        FeeRate = EconomicContractConstants.TokenConverterFeeRate,
        Connectors = { connectors },
        BaseTokenSymbol = Context.Variables.NativeSymbol
    });
}

这里一共构造了17个连接器,ELF的权重为0.5,其余权重都为0.005(都是互相关联的资源币和nt资源币)。然后通过TokenConverter合约的Initialize方法完成Connector的写入。基础代币(Base Token)被设置为ELF。其他智能代币都将ELF作为连接器代币。

购买智能代币 - Buy

只能使用基础代币ELF来购买智能代币(如资源币等)。

比如使用ELF购买资源币WRITE,会涉及两个连接器:WRITE和ntWRITE。前者为toConnector,后者为fromConnector。套用Bancor的公式计算出amountToPay后,收取指定比率的手续费(现在是千分之五,定义在EconomicContractConstants.TokenConverterFeeRate)。

手续费的一半打入Treasury分红方案,另一半销毁(HandleFee方法)。在把WRITE代币转给Sender之前,会更新State.DepositBalance,这个state记录的是当前WRITE代币售出的ELF数量,key是ntWRITE,在计算amountToPay的时候需要用到。

售出智能代币 - Sell

即使用智能代币兑换ELF。比如使用资源币WRITE兑换ELF,fromConnector为WRITE,toConnector为ntWRITE。

套用Bancor的公式计算出amountToReceive后,处理手续费(与Buy的逻辑一致)。

在ELF代币被转给Sender之前,更新State.DepositBalance,key是ntWRITE。

添加新的智能代币 - AddPairConnector & EnableConnector

系统的八种资源币是在Initialize中添加进去的。

AddPairConnector用于添加其他的智能代币。过程和Initialize中的基本一致,添加两个连接器,比如新的智能代币叫ABC,那么两个连接器分别叫ABC和ntABC。

使用AddPairConnector添加完成两个连接器后,需要使用EnableConnector为智能代币抵押ELF,用户才能够使用TokenConverter合约对这个新的智能代币进行买卖。

修改智能代币连接器 - UpdateConnector

可以修改连接器权重和VirtualBalance。

Last updated