public override Empty Initialize(InitializeInput input) { Assert(!State.Initialized.Value, "Already initialized."); State.Initialized.Value = true; var proposerWhiteList = new ProposerWhiteList(); if (input.PrivilegedProposer != null) { proposerWhiteList.Proposers.Add(input.PrivilegedProposer); } State.ProposerWhiteList.Value = proposerWhiteList; var organizationInput = new CreateOrganizationInput { ProposalReleaseThreshold = new ProposalReleaseThreshold { MinimalApprovalThreshold = DefaultOrganizationMinimalApprovalThreshold, MinimalVoteThreshold = DefaultOrganizationMinimalVoteThresholdThreshold, MaximalAbstentionThreshold = DefaultOrganizationMaximalAbstentionThreshold, MaximalRejectionThreshold = DefaultOrganizationMaximalRejectionThreshold }, ProposerAuthorityRequired = input.ProposerAuthorityRequired, ParliamentMemberProposingAllowed = true }; var defaultOrganizationAddress = CreateNewOrganization(organizationInput); State.DefaultOrganizationAddress.Value = defaultOrganizationAddress; return(new Empty()); }
public override Empty Initialize(InitializeInput input) { Assert(!State.Initialized.Value, "Already initialized."); State.Initialized.Value = true; var organizationInput = new CreateOrganizationInput { ReleaseThreshold = input.GenesisOwnerReleaseThreshold }; var proposerWhiteList = new ProposerWhiteList(); if (input.PrivilegedProposer != null) { proposerWhiteList.Proposers.Add(input.PrivilegedProposer); } State.ProposerWhiteList.Value = proposerWhiteList; var defaultOrganizationAddress = CreateOrganization(organizationInput); State.GenesisContract.Value = Context.GetZeroSmartContractAddress(); State.DefaultOrganizationAddress.Value = defaultOrganizationAddress; State.GenesisContract.ChangeGenesisOwner.Send(defaultOrganizationAddress); State.ProposerAuthorityRequired.Value = input.ProposerAuthorityRequired; return(new Empty()); }
public override ProposerWhiteList GetProposerWhiteList(Empty input) { var res = new ProposerWhiteList(); var whitelist = State.ProposerWhiteList.Value; res.Proposers.AddRange(whitelist.Proposers); return(res); }
public override Empty ChangeOrganizationProposerWhiteList(ProposerWhiteList input) { var organization = State.Organisations[Context.Sender]; Assert(organization != null, "Organization not found."); organization.ProposerWhiteList = input; Assert(Validate(organization), "Invalid organization."); State.Organisations[Context.Sender] = organization; return(new Empty()); }
public async Task Change_OrganizationProposalWhiteList_Test() { var organizationAddress = await GetDefaultOrganizationAddressAsync(); var result = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.GetProposerWhiteListContext), new Empty()); var proposers = GetProposerWhiteListContextOutput.Parser.ParseFrom(result.ReturnValue).Proposers; proposers.Count.ShouldBe(1); proposers.Contains(Tester.GetCallOwnerAddress()).ShouldBeTrue(); var ecKeyPair = CryptoHelper.GenerateKeyPair(); var proposerWhiteList = new ProposerWhiteList { Proposers = { Tester.GetAddress(ecKeyPair) } }; var proposalInput = CreateParliamentProposalInput(proposerWhiteList, organizationAddress); var createResult = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.CreateProposal), proposalInput); createResult.Status.ShouldBe(TransactionResultStatus.Mined); var proposalId = Hash.Parser.ParseFrom(createResult.ReturnValue); var miner = Tester.CreateNewContractTester(Tester.InitialMinerList[0]); (await miner.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.Approve), proposalId)).Status .ShouldBe(TransactionResultStatus.Mined); miner = Tester.CreateNewContractTester(Tester.InitialMinerList[1]); (await miner.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.Approve), proposalId)).Status .ShouldBe(TransactionResultStatus.Mined); miner = Tester.CreateNewContractTester(Tester.InitialMinerList[2]); (await miner.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.Approve), proposalId)).Status .ShouldBe(TransactionResultStatus.Mined); var releaseResult = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.Release), proposalId); releaseResult.Status.ShouldBe(TransactionResultStatus.Mined); result = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress, nameof(ParliamentContractContainer.ParliamentContractStub.GetProposerWhiteListContext), new Empty()); proposers = GetProposerWhiteListContextOutput.Parser.ParseFrom(result.ReturnValue).Proposers; proposers.Count.ShouldBe(1); proposers.Contains(Tester.GetAddress(ecKeyPair)).ShouldBeTrue(); proposers.Contains(Tester.GetCallOwnerAddress()).ShouldBeFalse(); }
public override Empty ChangeOrganizationProposerWhiteList(ProposerWhiteList input) { var defaultOrganizationAddress = State.DefaultOrganizationAddress.Value; Assert(defaultOrganizationAddress == Context.Sender, "No permission."); var organization = State.Organisations[defaultOrganizationAddress]; Assert( input.Proposers.Count > 0 || !organization.ProposerAuthorityRequired || organization.ParliamentMemberProposingAllowed, "White list can't be empty."); State.ProposerWhiteList.Value = input; Context.Fire(new OrganizationWhiteListChanged { OrganizationAddress = Context.Sender, ProposerWhiteList = input }); return(new Empty()); }
public static int Count(this ProposerWhiteList proposerWhiteList) { return(proposerWhiteList.Proposers.Count); }
public static bool Contains(this ProposerWhiteList proposerWhiteList, Address address) { return(proposerWhiteList.Proposers.Contains(address)); }
public static bool Empty(this ProposerWhiteList proposerWhiteList) { return(proposerWhiteList.Count() == 0); }
public static bool AnyDuplicate(this ProposerWhiteList proposerWhiteList) { return(proposerWhiteList.Proposers.GroupBy(p => p).Any(g => g.Count() > 1)); }
public override Empty ChangeOrganizationProposerWhiteList(ProposerWhiteList input) { Assert(State.DefaultOrganizationAddress.Value == Context.Sender, "No permission."); State.ProposerWhiteList.Value = input; return(new Empty()); }