private void CreateSideChainToken(SideChainCreationRequest sideChainCreationRequest, int chainId, Address creator) { if (!sideChainCreationRequest.IsPrivilegePreserved) { return; } // new token needed only for exclusive side chain var sideChainTokenInfo = new SideChainTokenInfo { TokenName = sideChainCreationRequest.SideChainTokenName, Symbol = sideChainCreationRequest.SideChainTokenSymbol, TotalSupply = sideChainCreationRequest.SideChainTokenTotalSupply, Decimals = sideChainCreationRequest.SideChainTokenDecimals, IsBurnable = sideChainCreationRequest.IsSideChainTokenBurnable, IsProfitable = sideChainCreationRequest.IsSideChainTokenProfitable }; SetContractStateRequired(State.TokenContract, SmartContractConstants.TokenContractSystemName); State.TokenContract.Create.Send(new CreateInput { TokenName = sideChainTokenInfo.TokenName, Decimals = sideChainTokenInfo.Decimals, IsBurnable = sideChainTokenInfo.IsBurnable, Issuer = creator, IssueChainId = chainId, Symbol = sideChainTokenInfo.Symbol, TotalSupply = sideChainTokenInfo.TotalSupply, IsProfitable = sideChainTokenInfo.IsProfitable }); }
private void AssertSideChainTokenInfo(SideChainTokenInfo sideChainTokenInfo) { Assert( !string.IsNullOrEmpty(sideChainTokenInfo.Symbol) && !string.IsNullOrEmpty(sideChainTokenInfo.TokenName), "Invalid side chain token name,"); Assert(sideChainTokenInfo.TotalSupply > 0, "Invalid side chain token supply."); }
/// <summary> /// Create side chain. It is a proposal result from system address. /// </summary> /// <param name="sideChainCreationRequest"></param> /// <returns></returns> public override SInt32Value CreateSideChain(SideChainCreationRequest sideChainCreationRequest) { // side chain creation should be triggered by organization address from parliament. CheckOwnerAuthority(); Assert(sideChainCreationRequest.LockedTokenAmount > 0 && sideChainCreationRequest.LockedTokenAmount > sideChainCreationRequest.IndexingPrice, "Invalid chain creation request."); var sideChainTokenInfo = new SideChainTokenInfo { TokenName = sideChainCreationRequest.SideChainTokenName, Symbol = sideChainCreationRequest.SideChainTokenSymbol, TotalSupply = sideChainCreationRequest.SideChainTokenTotalSupply, Decimals = sideChainCreationRequest.SideChainTokenDecimals, IsBurnable = sideChainCreationRequest.IsSideChainTokenBurnable }; AssertSideChainTokenInfo(sideChainTokenInfo); State.SideChainSerialNumber.Value = State.SideChainSerialNumber.Value.Add(1); var serialNumber = State.SideChainSerialNumber.Value; int chainId = GetChainId(serialNumber); // lock token and resource CreateSideChainToken(sideChainCreationRequest, sideChainTokenInfo, chainId); var sideChainInfo = new SideChainInfo { Proposer = Context.Origin, SideChainId = chainId, SideChainStatus = SideChainStatus.Active, SideChainCreationRequest = sideChainCreationRequest, CreationTimestamp = Context.CurrentBlockTime, CreationHeightOnParentChain = Context.CurrentHeight }; State.SideChainInfo[chainId] = sideChainInfo; State.CurrentSideChainHeight[chainId] = 0; var initialConsensusInfo = GetCurrentMiners(); State.SideChainInitialConsensusInfo[chainId] = new BytesValue { Value = initialConsensusInfo.ToByteString() }; Context.LogDebug(() => $"Initial miner list for side chain {chainId} :" + string.Join(",", initialConsensusInfo.MinerList.Pubkeys)); Context.LogDebug(() => $"RoundNumber {initialConsensusInfo.RoundNumber}"); Context.Fire(new CreationRequested() { ChainId = chainId, Creator = Context.Origin }); return(new SInt32Value() { Value = chainId }); }
private void CreateSideChainToken(SideChainCreationRequest sideChainCreationRequest, SideChainTokenInfo sideChainTokenInfo, int chainId) { TransferFrom(new TransferFromInput { From = Context.Origin, To = Context.Self, Amount = sideChainCreationRequest.LockedTokenAmount, Symbol = Context.Variables.NativeSymbol }); State.IndexingBalance[chainId] = sideChainCreationRequest.LockedTokenAmount; CreateSideChainToken(sideChainTokenInfo, chainId); }
private void CreateSideChainToken(SideChainTokenInfo sideChainTokenInfo, int chainId, Address creator) { SetContractStateRequired(State.TokenContract, SmartContractConstants.TokenContractSystemName); State.TokenContract.Create.Send(new CreateInput { TokenName = sideChainTokenInfo.TokenName, Decimals = sideChainTokenInfo.Decimals, IsBurnable = sideChainTokenInfo.IsBurnable, Issuer = creator, IssueChainId = chainId, Symbol = sideChainTokenInfo.Symbol, TotalSupply = sideChainTokenInfo.TotalSupply, IsProfitable = sideChainTokenInfo.IsProfitable }); }
private void CreateSideChainToken(SideChainTokenInfo sideChainTokenInfo, int chainId) { ValidateContractState(State.TokenContract, SmartContractConstants.TokenContractSystemName); State.TokenContract.Create.Send(new CreateInput { TokenName = sideChainTokenInfo.TokenName, Decimals = sideChainTokenInfo.Decimals, IsBurnable = sideChainTokenInfo.IsBurnable, Issuer = Context.Origin, IssueChainId = chainId, IsTransferDisabled = false, Symbol = sideChainTokenInfo.Symbol, TotalSupply = sideChainTokenInfo.TotalSupply }); }
/// <summary> /// Create side chain. It is a proposal result from system address. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt32Value CreateSideChain(CreateSideChainInput input) { // side chain creation should be triggered by organization address. AssertSideChainLifetimeControllerAuthority(Context.Sender); var proposedSideChainCreationRequest = State.ProposedSideChainCreationRequest[input.Proposer]; State.ProposedSideChainCreationRequest.Remove(input.Proposer); var sideChainCreationRequest = input.SideChainCreationRequest; Assert( proposedSideChainCreationRequest != null && proposedSideChainCreationRequest.Equals(sideChainCreationRequest), "Side chain creation failed without proposed data."); AssertValidSideChainCreationRequest(sideChainCreationRequest, input.Proposer); State.SideChainSerialNumber.Value = State.SideChainSerialNumber.Value.Add(1); var serialNumber = State.SideChainSerialNumber.Value; var chainId = GetChainId(serialNumber); State.AcceptedSideChainCreationRequest[chainId] = sideChainCreationRequest; // lock token ChargeSideChainIndexingFee(input.Proposer, sideChainCreationRequest.LockedTokenAmount, chainId); var sideChainTokenInfo = new SideChainTokenInfo { TokenName = sideChainCreationRequest.SideChainTokenName, Symbol = sideChainCreationRequest.SideChainTokenSymbol, TotalSupply = sideChainCreationRequest.SideChainTokenTotalSupply, Decimals = sideChainCreationRequest.SideChainTokenDecimals, IsBurnable = sideChainCreationRequest.IsSideChainTokenBurnable, IsProfitable = sideChainCreationRequest.IsSideChainTokenProfitable }; CreateSideChainToken(sideChainTokenInfo, chainId, input.Proposer); var sideChainInfo = new SideChainInfo { Proposer = input.Proposer, SideChainId = chainId, SideChainStatus = SideChainStatus.Active, IndexingPrice = sideChainCreationRequest.IndexingPrice, IsPrivilegePreserved = sideChainCreationRequest.IsPrivilegePreserved, CreationTimestamp = Context.CurrentBlockTime, CreationHeightOnParentChain = Context.CurrentHeight }; State.SideChainInfo[chainId] = sideChainInfo; State.CurrentSideChainHeight[chainId] = 0; var initialConsensusInfo = GetCurrentMiners(); State.SideChainInitialConsensusInfo[chainId] = new BytesValue { Value = initialConsensusInfo.ToByteString() }; Context.LogDebug(() => $"Initial miner list for side chain {chainId} :" + string.Join(",", initialConsensusInfo.MinerList.Pubkeys)); Context.LogDebug(() => $"RoundNumber {initialConsensusInfo.RoundNumber}"); var initialResourceAmount = input.SideChainCreationRequest?.InitialResourceAmount; if (initialResourceAmount != null) { InitialResourceUsage(chainId, initialResourceAmount); } CreateOrganizationForIndexingFeePriceAdjustment(input.Proposer); Context.Fire(new SideChainCreatedEvent { ChainId = chainId, Creator = input.Proposer }); return(new SInt32Value() { Value = chainId }); }