protected async Task NextTerm(ECKeyPair keyPair)
        {
            var miner = GetConsensusContractTester(keyPair);
            var round = await miner.GetCurrentRoundInformation.CallAsync(new Empty());

            var victories = await ElectionContractStub.GetVictories.CallAsync(new Empty());

            var miners = new MinerList
            {
                Pubkeys =
                {
                    victories.Value
                }
            };
            var firstRoundOfNextTerm =
                miners.GenerateFirstRoundOfNewTerm(EconomicContractsTestConstants.MiningInterval,
                                                   BlockTimeProvider.GetBlockTime(), round.RoundNumber, round.TermNumber);
            var executionResult = (await miner.NextTerm.SendAsync(firstRoundOfNextTerm)).TransactionResult;

            executionResult.Status.ShouldBe(TransactionResultStatus.Mined);
        }
        public async Task <Hash> Create_Proposal(Address organizationAddress)
        {
            _transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Tester,
                Memo   = "Transfer"
            };
            _createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = _transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2).ToTimestamp(),
                OrganizationAddress = organizationAddress
            };
            var proposal = await ParliamentAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

            proposal.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            return(proposal.Output);
        }
Esempio n. 3
0
        private async Task <Hash> CreateProposalAsync(ECKeyPair proposalKeyPair, Address organizationAddress)
        {
            var transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Reviewer1,
                Memo   = "Transfer"
            };

            AssociationAuthContractStub = GetAssociationAuthContractTester(proposalKeyPair);
            var createProposalInput = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2),
                OrganizationAddress = organizationAddress
            };
            var proposal = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

            return(proposal.Output);
        }
        public async Task Clear_ExpiredProposal_Test()
        {
            await InitializeParliamentContracts();

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

            var proposalId = await CreateProposalAsync(DefaultSenderKeyPair, organizationAddress);

            ParliamentContractStub = GetParliamentContractTester(InitialMinersKeyPairs[0]);
            BlockTimeProvider.SetBlockTime(BlockTimeProvider.GetBlockTime().AddDays(5));
            var error = await ParliamentContractStub.Approve.CallWithExceptionAsync(proposalId);

            error.Value.ShouldContain("Invalid proposal.");

            var clear = await ParliamentContractStub.ClearProposal.SendAsync(proposalId);

            clear.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
        }
Esempio n. 5
0
        public async Task <Hash> Create_Proposal()
        {
            _organizationAddress = await Create_Organization();

            _transferInput = new TransferInput()
            {
                Symbol = "ELF",
                Amount = 100,
                To     = Reviewer1,
                Memo   = "Transfer"
            };
            AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer2KeyPair);
            _createProposalInput        = new CreateProposalInput
            {
                ContractMethodName  = nameof(TokenContract.Transfer),
                ToAddress           = TokenContractAddress,
                Params              = _transferInput.ToByteString(),
                ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(2).ToTimestamp(),
                OrganizationAddress = _organizationAddress
            };
            var proposal = await AssociationAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

            return(proposal.Output);
        }
Esempio n. 6
0
        public async Task Create_ProposalFailed_Test()
        {
            var organizationAddress = await CreateOrganizationAsync();

            AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer2KeyPair);
            var blockTime           = BlockTimeProvider.GetBlockTime();
            var createProposalInput = new CreateProposalInput
            {
                ToAddress           = SampleAddress.AddressList[0],
                Params              = ByteString.CopyFromUtf8("Test"),
                ExpiredTime         = blockTime.AddDays(1),
                OrganizationAddress = organizationAddress
            };
            //"Invalid proposal."
            //ContractMethodName is null or white space
            {
                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ToAddress is null
            {
                createProposalInput.ContractMethodName = "Test";
                createProposalInput.ToAddress          = null;

                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ExpiredTime is null
            {
                createProposalInput.ExpiredTime = null;
                createProposalInput.ToAddress   = SampleAddress.AddressList[0];

                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //"Expired proposal."
            {
                createProposalInput.ExpiredTime = blockTime.AddMilliseconds(5);
                Thread.Sleep(10);

                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Expired proposal.").ShouldBeTrue();
            }
            //"No registered organization."
            {
                createProposalInput.ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(1);
                createProposalInput.OrganizationAddress = SampleAddress.AddressList[1];

                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("No registered organization.").ShouldBeTrue();
            }
            //"Unable to propose."
            //Sender is not reviewer
            {
                createProposalInput.OrganizationAddress = organizationAddress;
                AssociationAuthContractStub             = GetAssociationAuthContractTester(DefaultSenderKeyPair);

                var transactionResult =
                    await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Unable to propose.").ShouldBeTrue();
            }
            //Reviewer is not permission to propose
            {
                AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer1KeyPair);
                var transactionResult = await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Unable to propose.").ShouldBeTrue();
            }
            //"Proposal already exists."
            {
                AssociationAuthContractStub = GetAssociationAuthContractTester(Reviewer2KeyPair);
                var transactionResult1 =
                    await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult1.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

                var transactionResult2 =
                    await AssociationAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult2.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult2.TransactionResult.Error.Contains("Proposal already exists.").ShouldBeTrue();
            }
        }
        public async Task Create_ProposalFailed_Test()
        {
            var organizationAddress = await CreateOrganizationAsync();

            var blockTime           = BlockTimeProvider.GetBlockTime();
            var createProposalInput = new CreateProposalInput
            {
                ToAddress           = SampleAddress.AddressList[0],
                Params              = ByteString.CopyFromUtf8("Test"),
                ExpiredTime         = blockTime.AddDays(1),
                OrganizationAddress = organizationAddress
            };
            //"Invalid proposal."
            //ContractMethodName is null or white space
            {
                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ToAddress is null
            {
                createProposalInput.ContractMethodName = "Test";
                createProposalInput.ToAddress          = null;

                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ExpiredTime is null
            {
                createProposalInput.ExpiredTime = null;
                createProposalInput.ToAddress   = SampleAddress.AddressList[0];

                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //"Expired proposal."
            {
                createProposalInput.ExpiredTime = blockTime.AddMilliseconds(5);
                Thread.Sleep(10);

                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            }
            //"No registered organization."
            {
                createProposalInput.ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(1);
                createProposalInput.OrganizationAddress = SampleAddress.AddressList[1];

                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("No registered organization.").ShouldBeTrue();
            }
            //"Proposal with same input."
            {
                createProposalInput.OrganizationAddress = organizationAddress;
                var transactionResult1 = await ParliamentAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult1.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

                var transactionResult2 = await ParliamentAuthContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult2.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }
            //"Not authorized to propose."
            {
                var privilegeOrganizationAddress = await CreatePrivilegeOrganizationAsync();

                createProposalInput.OrganizationAddress = privilegeOrganizationAddress;
                var transactionResult = await ParliamentAuthContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Not authorized to propose.").ShouldBeTrue();
            }
        }
        public async Task Create_ProposalFailed()
        {
            _organizationAddress = await Create_Organization();

            var blockTime = BlockTimeProvider.GetBlockTime();

            _createProposalInput = new CreateProposalInput
            {
                ToAddress           = Address.FromString("Test"),
                Params              = ByteString.CopyFromUtf8("Test"),
                ExpiredTime         = blockTime.AddDays(1).ToTimestamp(),
                OrganizationAddress = _organizationAddress
            };
            {
                //"Invalid proposal."
                var transactionResult = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            {
                _createProposalInput.ContractMethodName = "Test";
                _createProposalInput.ToAddress          = null;

                var transactionResult = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            {
                _createProposalInput.ExpiredTime = null;
                _createProposalInput.ToAddress   = Address.FromString("Test");

                var transactionResult = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            {
                //"Expired proposal."
                _createProposalInput.ExpiredTime = blockTime.AddMilliseconds(5).ToTimestamp();
                Thread.Sleep(10);

                var transactionResult = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Expired proposal.").ShouldBeTrue();
            }
            {
                //"No registered organization."
                _createProposalInput.ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(1).ToTimestamp();
                _createProposalInput.OrganizationAddress = Address.FromString("NoRegisteredOrganizationAddress");

                var transactionResult = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("No registered organization.").ShouldBeTrue();
            }
            {
                //"Proposal already exists."
                _createProposalInput.OrganizationAddress = _organizationAddress;
                var transactionResult1 = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult1.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

                var transactionResult2 = await ReferendumAuthContractStub.CreateProposal.SendAsync(_createProposalInput);

                transactionResult2.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult2.TransactionResult.Error.Contains("Proposal already exists.").ShouldBeTrue();
            }
        }
        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);
            }
        }
Esempio n. 10
0
        public async Task Create_ProposalFailed_Test()
        {
            await InitializeParliamentContracts();

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

            var blockTime           = BlockTimeProvider.GetBlockTime();
            var createProposalInput = new CreateProposalInput
            {
                ToAddress           = SampleAddress.AddressList[0],
                Params              = ByteString.CopyFromUtf8("Test"),
                ExpiredTime         = blockTime.AddDays(1),
                OrganizationAddress = organizationAddress
            };
            //"Invalid proposal."
            //ContractMethodName is null or white space
            {
                var transactionResult =
                    await ParliamentContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ToAddress is null
            {
                createProposalInput.ContractMethodName = "Test";
                createProposalInput.ToAddress          = null;

                var transactionResult =
                    await ParliamentContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //ExpiredTime is null
            {
                createProposalInput.ExpiredTime = null;
                createProposalInput.ToAddress   = SampleAddress.AddressList[0];

                var transactionResult =
                    await ParliamentContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("Invalid proposal.").ShouldBeTrue();
            }
            //"Expired proposal."
            {
                createProposalInput.ExpiredTime = TimestampHelper.GetUtcNow().AddSeconds(-1);
                var transactionResult =
                    await ParliamentContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            }
            //"No registered organization."
            {
                createProposalInput.ExpiredTime         = BlockTimeProvider.GetBlockTime().AddDays(1);
                createProposalInput.OrganizationAddress = SampleAddress.AddressList[1];

                var transactionResult =
                    await ParliamentContractStub.CreateProposal.SendWithExceptionAsync(createProposalInput);

                transactionResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                transactionResult.TransactionResult.Error.Contains("No registered organization.").ShouldBeTrue();
            }
            //"Proposal with same input."
            {
                createProposalInput.OrganizationAddress = organizationAddress;
                var transactionResult1 = await ParliamentContractStub.CreateProposal.SendAsync(createProposalInput);

                transactionResult1.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

                var transactionResult2 = await ParliamentContractStub.CreateProposal.SendAsync(createProposalInput);

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