public override ChainInitializationData GetChainInitializationData(SInt32Value chainId) { var sideChainInfo = State.SideChainInfo[chainId.Value]; Assert(sideChainInfo != null, "Side chain not found."); var res = new ChainInitializationData { CreationHeightOnParentChain = sideChainInfo.CreationHeightOnParentChain, ChainId = chainId.Value, Creator = sideChainInfo.Proposer, CreationTimestamp = sideChainInfo.CreationTimestamp, ChainCreatorPrivilegePreserved = sideChainInfo.SideChainCreationRequest.IsPrivilegePreserved }; ByteString consensusInformation = State.SideChainInitialConsensusInfo[chainId.Value].Value; res.ExtraInformation.Add(consensusInformation); ByteString nativeTokenInformation = GetNativeTokenInfo().ToByteString(); res.ExtraInformation.Add(nativeTokenInformation); ByteString resourceTokenInformation = GetResourceTokenInfo().ToByteString(); res.ExtraInformation.Add(resourceTokenInformation); ByteString sideChainTokenInformation = GetTokenInfo(sideChainInfo.SideChainCreationRequest.SideChainTokenInfo.Symbol) .ToByteString(); res.ExtraInformation.Add(sideChainTokenInformation); return(res); }
public override Address GetSideChainCreator(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); return(info.Proposer); }
public override Address LockedAddress(SInt32Value input) { var info = State.SideChainInfos[input.Value]; Assert(info != null, "Not existed side chain."); Assert(info.SideChainStatus != (SideChainStatus)3, "Disposed side chain."); return(info.Proposer); }
public override Address LockedAddress(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); Assert(info.SideChainStatus != SideChainStatus.Terminated, "Disposed side chain."); return(info.Proposer); }
public override GetChainStatusOutput GetChainStatus(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); return(new GetChainStatusOutput { Status = info.SideChainStatus }); }
public override SInt64Value GetSideChainHeight(SInt32Value input) { var height = State.CurrentSideChainHeight[input.Value]; Assert(height != 0); return(new SInt64Value() { Value = height }); }
public override SInt32Value GetChainStatus(SInt32Value input) { var info = State.SideChainInfos[input.Value]; Assert(info != null, "Not existed side chain."); return(new SInt32Value() { Value = (int)info.SideChainStatus }); }
public override SInt64Value GetSideChainIndexingFeePrice(SInt32Value input) { var sideChainInfo = State.SideChainInfo[input.Value]; Assert(sideChainInfo != null, "Side chain not found."); return(new SInt64Value { Value = sideChainInfo.IndexingPrice }); }
public override SInt32Value GetChainStatus(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); return(new SInt32Value() { Value = (int)info.SideChainStatus }); }
public override SInt64Value GetSideChainBalance(SInt32Value input) { var chainId = input.Value; var sideChainInfo = State.SideChainInfo[chainId]; Assert(sideChainInfo != null, "Side chain not found."); return(new SInt64Value { Value = State.IndexingBalance[chainId] }); }
public override SInt64Value GetSideChainBalance(SInt32Value input) { var chainId = input.Value; var sideChainInfo = State.SideChainInfo[chainId]; Assert(sideChainInfo != null, "Side chain not found."); Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Unable to check balance."); return(new SInt64Value { Value = State.IndexingBalance[chainId] }); }
public override SInt64Value LockedToken(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); Assert(info.SideChainStatus != SideChainStatus.Terminated, "Disposed side chain."); return(new SInt64Value() { Value = info.SideChainCreationRequest.LockedTokenAmount }); }
public override SInt64Value GetSideChainHeight(SInt32Value input) { var info = State.SideChainInfo[input.Value]; Assert(info != null, "Side chain not found."); var height = State.CurrentSideChainHeight[input.Value]; return(new SInt64Value() { Value = height }); }
public override SInt64Value LockedBalance(SInt32Value input) { var chainId = input.Value; var sideChainInfo = State.SideChainInfos[chainId]; Assert(sideChainInfo != null, "Not existed side chain."); Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Unable to check balance."); return(new SInt64Value() { Value = State.IndexingBalance[chainId] }); }
public override Empty SetMaximumMinersCount(SInt32Value input) { if (State.ParliamentAuthContract.Value == null) { State.ParliamentAuthContract.Value = Context.GetContractAddressByName(SmartContractConstants.ParliamentAuthContractSystemName); } var genesisOwnerAddress = State.ParliamentAuthContract.GetGenesisOwnerAddress.Call(new Empty()); Assert(Context.Sender == genesisOwnerAddress, "No permission to set max miners count."); State.MaximumMinersCount.Value = input.Value; return(new Empty()); }
public override Empty WithdrawRequest(SInt32Value input) { var chainId = input.Value; // no need to check authority since invoked in transaction from normal address var sideChainInfo = State.SideChainInfos[chainId]; Assert(sideChainInfo != null && sideChainInfo.SideChainStatus == SideChainStatus.Review, "Side chain creation request not found."); Assert(Context.Sender.Equals(sideChainInfo.Proposer), "Authentication failed."); UnlockTokenAndResource(sideChainInfo); sideChainInfo.SideChainStatus = SideChainStatus.Terminated; State.SideChainInfos[chainId] = sideChainInfo; return(new Empty()); }
/// <summary> /// Request form normal address to dispose side chain /// </summary> /// <param name="input"></param> /// <returns></returns> public override Hash RequestChainDisposal(SInt32Value input) { // no need to check authority since invoked in transaction from normal address var request = State.SideChainInfos[input.Value]; Assert( request != null && (request.SideChainStatus == SideChainStatus.Active || request.SideChainStatus == SideChainStatus.InsufficientBalance), "Side chain not found"); Assert(Context.Sender.Equals(request.Proposer), "Not authorized to dispose."); // side chain disposal Hash proposalHash = Propose(RequestChainCreationWaitingPeriod, Context.Self, nameof(DisposeSideChain), input); return(proposalHash); }
public override ChainInitializationContext GetChainInitializationContext(SInt32Value chainId) { var sideChainInfo = State.SideChainInfos[chainId.Value]; Assert(sideChainInfo != null, "Side chain Not Found."); Assert(sideChainInfo.SideChainStatus > SideChainStatus.Review, "Incorrect side chain status."); var res = new ChainInitializationContext { ParentChainHeightOfCreation = sideChainInfo.ParentChainHeightOfCreation, ChainId = chainId.Value, Creator = sideChainInfo.Proposer, CreatedTime = sideChainInfo.CreatedTime }; ByteString consensusInformation = State.SideChainInitialConsensusInfo[chainId.Value].Value; res.ExtraInformation.Add(consensusInformation); return(res); }
public async Task Disposal_SideChain_NotAuthorized() { long lockedTokenAmount = 10; await InitializeCrossChainContractAsync(); await ApproveBalanceAsync(lockedTokenAmount); var chainId = await InitAndCreateSideChainAsync(); var disposalInput = new SInt32Value { Value = chainId }; var ecKeyPair = CryptoHelper.GenerateKeyPair(); var other = Tester.CreateNewContractTester(ecKeyPair); var organizationAddress = Address.Parser.ParseFrom((await Tester.ExecuteContractWithMiningAsync( ParliamentAddress, nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.GetGenesisOwnerAddress), new Empty())) .ReturnValue); var proposal = await other.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.CreateProposal), new CreateProposalInput { ContractMethodName = "DisposeSideChain", ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), Params = disposalInput.ToByteString(), ToAddress = CrossChainContractAddress, OrganizationAddress = organizationAddress }); var proposalId = Hash.Parser.ParseFrom(proposal.ReturnValue); await ApproveWithMinersAsync(proposalId); var transactionResult = await other.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.Release), proposalId); var status = transactionResult.Status; Assert.True(status == TransactionResultStatus.Failed); Assert.Contains("Not authorized to dispose.", transactionResult.Error); }
/// <summary> /// Dispose side chain. It is a proposal result from system address. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt64Value DisposeSideChain(SInt32Value input) { AssertSideChainLifetimeControllerAuthority(Context.Sender); var chainId = input.Value; var info = State.SideChainInfo[chainId]; Assert(info != null, "Side chain not found."); Assert(info.SideChainStatus != SideChainStatus.Terminated, "Incorrect chain status."); UnlockTokenAndResource(info); info.SideChainStatus = SideChainStatus.Terminated; State.SideChainInfo[chainId] = info; Context.Fire(new Disposed { ChainId = chainId }); return(new SInt64Value { Value = chainId }); }
/// <summary> /// Dispose side chain. It is a proposal result from system address. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt64Value DisposeSideChain(SInt32Value input) { CheckOwnerAuthority(); var chainId = input.Value; var info = State.SideChainInfo[chainId]; Assert(info != null, "Side chain not found."); Assert(Context.Origin.Equals(info.Proposer), "No permission."); Assert(info.SideChainStatus == SideChainStatus.Active, "Incorrect chain status."); UnlockTokenAndResource(info); info.SideChainStatus = SideChainStatus.Terminated; State.SideChainInfo[chainId] = info; Context.Fire(new Disposed { ChainId = chainId }); return(new SInt64Value { Value = chainId }); }
protected async Task <Hash> CreateProposal(int chainId, string methodName) { var createProposalInput = new SInt32Value { Value = chainId }; var organizationAddress = Address.Parser.ParseFrom((await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentAuthContract.GetDefaultOrganizationAddress), new Empty())).ReturnValue); var proposal = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentAuthContract.CreateProposal), new CreateProposalInput { ContractMethodName = methodName, ExpiredTime = DateTime.UtcNow.AddDays(1).ToTimestamp(), Params = createProposalInput.ToByteString(), ToAddress = CrossChainContractAddress, OrganizationAddress = organizationAddress }); var proposalId = Hash.Parser.ParseFrom(proposal.ReturnValue); return(proposalId); }
/// <summary> /// Create side chain. It is a proposal result from system address. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt32Value CreateSideChain(SInt32Value input) { var chainId = input.Value; // side chain creation should be triggered by organization address from parliament. CheckOwnerAuthority(); var sideChainInfo = State.SideChainInfos[chainId]; Assert( sideChainInfo != null && sideChainInfo.SideChainStatus == SideChainStatus.Review, "Side chain creation request not found."); sideChainInfo.SideChainStatus = SideChainStatus.Active; sideChainInfo.CreatedTime = Timestamp.FromDateTime(Context.CurrentBlockTime); State.SideChainInfos[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.PublicKeys.Select(p => Address.FromPublicKey(ByteArrayHelpers.FromHexString(p)).ToString()))); Context.LogDebug(() => $"RoundNumber {initialConsensusInfo.RoundNumber}"); // Event is not used for now. Context.Fire(new CreationRequested() { ChainId = chainId, Creator = Context.Sender }); return(new SInt32Value() { Value = chainId }); }
/// <summary> /// Dispose side chain. It is a proposal result from system address. /// </summary> /// <param name="input"></param> /// <returns></returns> public override SInt64Value DisposeSideChain(SInt32Value input) { CheckOwnerAuthority(); var chainId = input.Value; // side chain disposal should be triggered by multi sig txn from system address. //CheckAuthority(Context.Genesis); var info = State.SideChainInfos[chainId]; Assert(info != null, "Not existed side chain."); Assert(info.SideChainStatus == SideChainStatus.Active || info.SideChainStatus == SideChainStatus.InsufficientBalance, "Unable to dispose this side chain."); UnlockTokenAndResource(info); info.SideChainStatus = SideChainStatus.Terminated; State.SideChainInfos[chainId] = info; Context.Fire(new Disposed() { ChainId = chainId }); return(new SInt64Value { Value = chainId }); }
public async Task Disposal_SideChain_NotAuthorized() { long lockedTokenAmount = 10; await ApproveBalanceAsync(lockedTokenAmount); var chainId = await InitAndCreateSideChainAsync(); var disposalInput = new SInt32Value { Value = chainId }; var ecKeyPair = SampleECKeyPairs.KeyPairs[1]; var parliamentAuthContractStub2 = GetParliamentAuthContractTester(ecKeyPair); var organizationAddress = await ParliamentAuthContractStub.GetDefaultOrganizationAddress.CallAsync(new Empty()); var proposal = await parliamentAuthContractStub2.CreateProposal.SendAsync(new CreateProposalInput { ContractMethodName = "DisposeSideChain", ExpiredTime = TimestampHelper.GetUtcNow().AddDays(1), Params = disposalInput.ToByteString(), ToAddress = CrossChainContractAddress, OrganizationAddress = organizationAddress }); var proposalId = Hash.Parser.ParseFrom(proposal.TransactionResult.ReturnValue); await ApproveWithMinersAsync(proposalId); var res = await parliamentAuthContractStub2.Release.SendWithExceptionAsync(proposalId); var status = res.TransactionResult.Status; Assert.True(status == TransactionResultStatus.Failed); Assert.Contains("No permission.", res.TransactionResult.Error); }
private async Task SetMiningInterval(SInt32Value interval) { await _miningIntervalField.SetAsync(interval.Value); }
public override GetSideChainIndexingFeeControllerOutput GetSideChainIndexingFeeController(SInt32Value input) { var sideChainInfo = State.SideChainInfo[input.Value]; var proposer = sideChainInfo.Proposer; SetContractStateRequired(State.AssociationContract, SmartContractConstants.AssociationContractSystemName); var organizationCreationInput = GenerateOrganizationInputForIndexingFeePrice(proposer); var sideChainIndexingFeeControllerAddress = CalculateSideChainIndexingFeeControllerOrganizationAddress(organizationCreationInput); return(new GetSideChainIndexingFeeControllerOutput { AuthorityInfo = new AuthorityInfo { OwnerAddress = sideChainIndexingFeeControllerAddress, ContractAddress = State.AssociationContract.Value }, OrganizationCreationInputBytes = organizationCreationInput.ToByteString() }); }
public override CalculateFeeCoefficientsOfType GetCalculateFeeCoefficientOfContract(SInt32Value input) { return(State.CalculateCoefficientOfContract[(FeeTypeEnum)input.Value]); }