Пример #1
0
        private void CreateInitialOrganizationForInitialControllerAddress()
        {
            SetContractStateRequired(State.ParliamentContract, SmartContractConstants.ParliamentContractSystemName);
            var proposalReleaseThreshold = new ProposalReleaseThreshold
            {
                MinimalApprovalThreshold   = DefaultMinimalApprovalThreshold,
                MinimalVoteThreshold       = DefaultMinimalVoteThresholdThreshold,
                MaximalAbstentionThreshold = DefaultMaximalAbstentionThreshold,
                MaximalRejectionThreshold  = DefaultMaximalRejectionThreshold
            };

            State.ParliamentContract.CreateOrganizationBySystemContract.Send(
                new Parliament.CreateOrganizationBySystemContractInput
            {
                OrganizationCreationInput = new Parliament.CreateOrganizationInput
                {
                    ProposalReleaseThreshold         = proposalReleaseThreshold,
                    ProposerAuthorityRequired        = false,
                    ParliamentMemberProposingAllowed = true
                },
                OrganizationAddressFeedbackMethod = nameof(SetInitialSideChainLifetimeControllerAddress)
            });

            State.ParliamentContract.CreateOrganizationBySystemContract.Send(
                new Parliament.CreateOrganizationBySystemContractInput
            {
                OrganizationCreationInput = new Parliament.CreateOrganizationInput
                {
                    ProposalReleaseThreshold         = proposalReleaseThreshold,
                    ProposerAuthorityRequired        = true,
                    ParliamentMemberProposingAllowed = true
                },
                OrganizationAddressFeedbackMethod = nameof(SetInitialIndexingControllerAddress)
            });
        }
Пример #2
0
        public override Empty ChangeOrganizationThreshold(ProposalReleaseThreshold input)
        {
            var organization = State.Organisations[Context.Sender];

            Assert(organization != null, "Organization not found.");
            organization.ProposalReleaseThreshold = input;
            Assert(Validate(organization), "Invalid organization.");
            State.Organisations[Context.Sender] = organization;
            return(new Empty());
        }
Пример #3
0
        public async Task Change_OrganizationThreshold_Test()
        {
            await InitializeParliamentContracts();

            var minimalApprovalThreshold   = 3000;
            var maximalAbstentionThreshold = 3000;
            var maximalRejectionThreshold  = 3000;
            var minimalVoteThreshold       = 3000;
            var organizationAddress        = await CreateOrganizationAsync(minimalApprovalThreshold,
                                                                           maximalAbstentionThreshold, maximalRejectionThreshold, minimalVoteThreshold);

            var proposalId = await CreateProposalAsync(DefaultSenderKeyPair, organizationAddress);

            await ApproveAsync(InitialMinersKeyPairs[0], proposalId);

            var proposal = await ParliamentContractStub.GetProposal.CallAsync(proposalId);

            proposal.ToBeReleased.ShouldBeTrue();

            {
                var proposalReleaseThresholdInput = new ProposalReleaseThreshold
                {
                    MinimalVoteThreshold = 6000
                };
                var createProposalInput = new CreateProposalInput
                {
                    ContractMethodName  = nameof(ParliamentContractStub.ChangeOrganizationThreshold),
                    ToAddress           = ParliamentContractAddress,
                    Params              = proposalReleaseThresholdInput.ToByteString(),
                    ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                    OrganizationAddress = organizationAddress
                };
                var changeProposal = await ParliamentContractStub.CreateProposal.SendAsync(createProposalInput);

                changeProposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
                var changeProposalId = changeProposal.Output;
                await ApproveAsync(InitialMinersKeyPairs[0], changeProposalId);

                var result = await ParliamentContractStub.Release.SendWithExceptionAsync(changeProposalId);

                result.TransactionResult.Error.ShouldContain("Invalid organization.");
            }
            {
                var proposalReleaseThresholdInput = new ProposalReleaseThreshold
                {
                    MinimalVoteThreshold     = 6000,
                    MinimalApprovalThreshold = minimalApprovalThreshold
                };
                var createProposalInput = new CreateProposalInput
                {
                    ContractMethodName  = nameof(ParliamentContractStub.ChangeOrganizationThreshold),
                    ToAddress           = ParliamentContractAddress,
                    Params              = proposalReleaseThresholdInput.ToByteString(),
                    ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                    OrganizationAddress = organizationAddress
                };
                var changeProposal = await ParliamentContractStub.CreateProposal.SendAsync(createProposalInput);

                changeProposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
                var changeProposalId = changeProposal.Output;
                await ApproveAsync(InitialMinersKeyPairs[0], changeProposalId);

                var result = await ParliamentContractStub.Release.SendAsync(changeProposalId);

                result.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }
        }
Пример #4
0
        public async Task Create_OrganizationFailed_Test()
        {
            await InitializeParliamentContracts();

            var minimalApprovalThreshold   = 6667;
            var maximalAbstentionThreshold = 2000;
            var maximalRejectionThreshold  = 3000;
            var minimalVoteThreshold       = 8000;
            var proposalReleaseThreshold   = new ProposalReleaseThreshold
            {
                MinimalApprovalThreshold   = minimalApprovalThreshold,
                MaximalAbstentionThreshold = maximalAbstentionThreshold,
                MaximalRejectionThreshold  = maximalRejectionThreshold,
                MinimalVoteThreshold       = minimalVoteThreshold
            };

            var createOrganizationInput = new CreateOrganizationInput
            {
                ProposalReleaseThreshold = proposalReleaseThreshold.Clone()
            };

            var minerParliamentContractStub = GetParliamentContractTester(InitialMinersKeyPairs[0]);

            {
                var transactionResult =
                    await ParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Error.ShouldContain("Unauthorized to create organization.");
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MinimalApprovalThreshold   = 10000;
                createOrganizationInput.ProposalReleaseThreshold.MinimalVoteThreshold       = 10000;
                createOrganizationInput.ProposalReleaseThreshold.MaximalAbstentionThreshold = 0;
                createOrganizationInput.ProposalReleaseThreshold.MaximalRejectionThreshold  = 0;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MinimalApprovalThreshold = 0;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MinimalApprovalThreshold = -1;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MaximalAbstentionThreshold = -1;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MaximalAbstentionThreshold = 3334;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MaximalRejectionThreshold = 3334;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }

            {
                createOrganizationInput.ProposalReleaseThreshold = proposalReleaseThreshold;
                createOrganizationInput.ProposalReleaseThreshold.MinimalApprovalThreshold = 10001;
                var transactionResult =
                    await minerParliamentContractStub.CreateOrganization.SendWithExceptionAsync(createOrganizationInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid organization.").ShouldBeTrue();
            }
        }