コード例 #1
0
        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
            });
        }
コード例 #2
0
 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.");
 }
コード例 #3
0
ファイル: CrossChainContract.cs プロジェクト: zhxymh/AElf
        /// <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
            });
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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
     });
 }
コード例 #6
0
 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
     });
 }
コード例 #7
0
        /// <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
            });
        }