public override DepositInfo GetNeededDeposit(ToBeConnectedTokenInfo input) { Assert(IsValidSymbol(input.TokenSymbol), "Invalid symbol."); var toConnector = State.Connectors[input.TokenSymbol]; Assert(toConnector != null, "[GetNeededDeposit]Can't find to connector."); Assert(!string.IsNullOrEmpty(toConnector.RelatedSymbol), "can't find related symbol'"); var fromConnector = State.Connectors[toConnector.RelatedSymbol]; Assert(fromConnector != null, "[GetNeededDeposit]Can't find from connector."); var tokenInfo = State.TokenContract.GetTokenInfo.Call( new GetTokenInfoInput { Symbol = input.TokenSymbol, }); var balance = State.TokenContract.GetBalance.Call( new GetBalanceInput { Owner = Context.Self, Symbol = input.TokenSymbol }).Balance; var amountOutOfTokenConvert = tokenInfo.TotalSupply - balance - input.AmountToTokenConvert; long needDeposit = 0; if (amountOutOfTokenConvert > 0) { var fb = fromConnector.VirtualBalance; var tb = toConnector.IsVirtualBalanceEnabled ? toConnector.VirtualBalance.Add(tokenInfo.TotalSupply) : tokenInfo.TotalSupply; needDeposit = BancorHelper.GetAmountToPayFromReturn(fb, GetWeight(fromConnector), tb, GetWeight(toConnector), amountOutOfTokenConvert); } return(new DepositInfo { NeedAmount = needDeposit, AmountOutOfTokenConvert = amountOutOfTokenConvert }); }
public override Empty EnableConnector(ToBeConnectedTokenInfo input) { Assert(IsValidSymbol(input.TokenSymbol), "Invalid symbol."); var fromConnector = State.Connectors[input.TokenSymbol]; Assert(fromConnector != null, "[EnableConnector]Can't find from connector."); Assert(!string.IsNullOrEmpty(fromConnector.RelatedSymbol), "can't find related symbol'"); var toConnector = State.Connectors[fromConnector.RelatedSymbol]; Assert(toConnector != null, "[EnableConnector]Can't find to connector."); var needDeposit = GetNeededDeposit(input); if (needDeposit.NeedAmount > 0) { State.TokenContract.TransferFrom.Send( new TransferFromInput { Symbol = State.BaseTokenSymbol.Value, From = Context.Sender, To = Context.Self, Amount = needDeposit.NeedAmount, }); } if (input.AmountToTokenConvert > 0) { State.TokenContract.TransferFrom.Send( new TransferFromInput { Symbol = input.TokenSymbol, From = Context.Sender, To = Context.Self, Amount = input.AmountToTokenConvert }); } State.DepositBalance[toConnector.Symbol] = needDeposit.NeedAmount; toConnector.IsPurchaseEnabled = true; fromConnector.IsPurchaseEnabled = true; return(new Empty()); }
private async Task InitialBuildConnector(string symbol) { var token = (await TokenContractStub.GetTokenInfo.CallAsync(new GetTokenInfoInput { Symbol = symbol, })); var tokenInfo = new ToBeConnectedTokenInfo { TokenSymbol = symbol, AmountToTokenConvert = 0 }; var issueRet = (await TransactionFeeChargingContractStub.IssueToTokenConvert.SendAsync( new IssueAmount { Symbol = symbol, Amount = token.TotalSupply - token.Supply })).TransactionResult; issueRet.Status.ShouldBe(TransactionResultStatus.Mined); var buildConnector = (await TokenConverterContractStub.EnableConnector.SendAsync(tokenInfo)).TransactionResult; buildConnector.Status.ShouldBe(TransactionResultStatus.Mined); }