Example #1
0
        public override Hash ProposeNewContract(ContractDeploymentInput input)
        {
            AssertDeploymentProposerAuthority(Context.Sender);
            var proposedContractInputHash = CalculateHashFromInput(input);

            Assert(State.ContractProposingInputMap[proposedContractInputHash] == null, "Already proposed.");
            State.ContractProposingInputMap[proposedContractInputHash] = new ContractProposingInput
            {
                Proposer = Context.Sender,
                Status   = ContractProposingInputStatus.Proposed
            };

            RequireParliamentAuthAddressSet();

            // Create proposal for deployment
            State.ParliamentAuthContract.CreateProposal.Send(new CreateProposalInput
            {
                ToAddress          = Context.Self,
                ContractMethodName = nameof(BasicContractZeroContainer.BasicContractZeroBase.ProposeContractCodeCheck),
                Params             = new ContractCodeCheckInput
                {
                    ContractInput        = input.ToByteString(),
                    IsContractDeployment = true
                }.ToByteString(),
                OrganizationAddress = State.GenesisOwner.Value,
                ExpiredTime         = Context.CurrentBlockTime.AddHours(24) // Maybe, get the interval from configuration
            });

            Context.Fire(new ContractProposed
            {
                ProposedContractInputHash = proposedContractInputHash
            });

            return(proposedContractInputHash);
        }
Example #2
0
        public override Address DeploySmartContract(ContractDeploymentInput input)
        {
            RequireAuthority();

            var address = PrivateDeploySystemSmartContract(null, input.Category, input.Code.ToByteArray());
            return address;
        }
Example #3
0
        public async Task Deploy_MultiTimes()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };

            {
                var address = await DeployAsync(Tester, ParliamentAddress, contractDeploymentInput);

                address.ShouldNotBeNull();
            }

            {
                var address = await DeployAsync(Tester, ParliamentAddress, contractDeploymentInput);

                address.ShouldNotBeNull();
            }

            {
                var minerTester = Tester.CreateNewContractTester(AnotherMinerKeyPair);
                var address     = await DeployAsync(minerTester, ParliamentAddress, contractDeploymentInput);

                address.ShouldNotBeNull();
            }
            {
                var otherTester       = Tester.CreateNewContractTester(AnotherUserKeyPair);
                var proposingTxResult = await otherTester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                         nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

                proposingTxResult.Status.ShouldBe(TransactionResultStatus.Failed);
                proposingTxResult.Error.Contains("Proposer authority validation failed.").ShouldBeTrue();
            }
        }
        public async Task DeploySmartContracts_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("MultiToken")).Value)
            };
            string methodName = "DeploySmartContract";
            //create proposal to deploy
            var proposalId = await CreateProposalAsync(methodName, contractDeploymentInput);

            //approve
            var txResult = await ApproveWithMinersAsync(proposalId);

            txResult.Status.ShouldBe(TransactionResultStatus.Mined);
            //release
            var txResult2 = await ReleaseProposalAsync(proposalId);

            txResult2.Status.ShouldBe(TransactionResultStatus.Mined);

            var creator = ContractDeployed.Parser.ParseFrom(txResult2.Logs[0].Indexed[0]).Creator;

            creator.ShouldBe(Tester.GetCallOwnerAddress());
            var deployAddress = ContractDeployed.Parser.ParseFrom(txResult2.Logs[0].NonIndexed).Address;

            deployAddress.ShouldNotBeNull();
        }
Example #5
0
 public override Address DeploySmartContract(ContractDeploymentInput input)
 {
     return(DeploySystemSmartContract(new SystemContractDeploymentInput()
     {
         Category = input.Category,
         Code = input.Code,
         TransactionMethodCallList = new SystemContractDeploymentInput.Types.SystemTransactionMethodCallList()
     }));
 }
Example #6
0
        public async Task UpdateSmartContractWithCodeCheck_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };

            var newAddress = await DeployAsync(Tester, ParliamentAddress, contractDeploymentInput);

            var code = Codes.Single(kv => kv.Key.Contains("ReferendumAuth")).Value;
            var contractUpdateInput = new ContractUpdateInput
            {
                Address = newAddress,
                Code    = ByteString.CopyFrom(code)
            };

            var proposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeUpdateContract), contractUpdateInput);

            proposingTxResult.Status.ShouldBe(TransactionResultStatus.Mined);

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                             .ProposalId;

            proposalId.ShouldNotBeNull();
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            var releaseApprovedContractTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                              nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            releaseApprovedContractTxResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            codeCheckProposalId.ShouldNotBeNull();

            // Wait for contract code check event handler to finish its job
            // Mine a block, should include approval transaction
            var block = await Tester.MineEmptyBlockAsync();

            var txs = await Tester.GetTransactionsAsync(block.TransactionIds);

            txs.First(tx => tx.To == ParliamentAddress).MethodName
            .ShouldBe(nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.ApproveMultiProposals));
        }
Example #7
0
        internal async Task <Address> DeployAsync(ContractTester <BasicContractZeroTestAElfModule> tester,
                                                  Address parliamentContract, ContractDeploymentInput contractDeploymentInput)
        {
            var proposingTxResult = await tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

            var proposalCreatedEvent =
                proposingTxResult.Logs.FirstOrDefault(l => l.Name.Contains(nameof(ProposalCreated)));

            if (proposalCreatedEvent == null)
            {
                return(null);
            }

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposalCreatedEvent.NonIndexed)
                             .ProposalId;
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            // release contract code and trigger code check proposal
            var releaseApprovedContractTxResult = await tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                              nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, codeCheckProposalId);

            // release code check proposal and deployment completes
            var deploymentResult = await tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                               nameof(BasicContractZeroContainer.BasicContractZeroStub.ReleaseCodeCheckedContract),
                                                                               new ReleaseContractInput
                                                                               { ProposedContractInputHash = proposedContractInputHash, ProposalId = codeCheckProposalId });

            var deploymentEvent = deploymentResult.Logs.FirstOrDefault(l => l.Name.Contains(nameof(ContractDeployed)));

            var address = deploymentEvent != null
                ? ContractDeployed.Parser.ParseFrom(deploymentEvent.NonIndexed).Address
                : null;

            return(address);
        }
Example #8
0
        public override Address DeploySmartContract(ContractDeploymentInput input)
        {
            RequireSenderAuthority();
            AssertDeploymentProposerAuthority(Context.Origin);

            var inputHash = CalculateHashFromInput(input);

            TryClearContractProposingInput(inputHash, out var contractProposingInput);

            var address =
                PrivateDeploySystemSmartContract(null, input.Category, input.Code.ToByteArray(), false,
                                                 DecideNormalContractAuthor(contractProposingInput?.Proposer ?? Context.Sender));

            return(address);
        }
Example #9
0
        public override Address DeploySmartContract(ContractDeploymentInput input)
        {
            RequireSenderAuthority(State.CodeCheckController.Value?.OwnerAddress);
            // AssertDeploymentProposerAuthority(Context.Origin);

            var inputHash = CalculateHashFromInput(input);

            TryClearContractProposingData(inputHash, out var contractProposingInput);

            var address =
                DeploySmartContract(null, input.Category, input.Code.ToByteArray(), false,
                                    DecideNonSystemContractAuthor(contractProposingInput?.Proposer, Context.Sender));

            return(address);
        }
Example #10
0
        public async Task DeploySmartContracts_WithWrongProposer_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };
            var otherTester = Tester.CreateNewContractTester(AnotherUserKeyPair);
            var proposalId  = await CreateProposalAsync(otherTester, ParliamentAddress,
                                                        nameof(BasicContractZeroContainer.BasicContractZeroStub.ProposeNewContract), contractDeploymentInput);

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            var releaseResult = await ReleaseProposalAsync(otherTester, ParliamentAddress, proposalId);

            releaseResult.Status.ShouldBe(TransactionResultStatus.Failed);
            releaseResult.Error.Contains("Proposer authority validation failed.").ShouldBeTrue();
        }
Example #11
0
        public override Hash ProposeNewContract(ContractDeploymentInput input)
        {
            // AssertDeploymentProposerAuthority(Context.Sender);
            var proposedContractInputHash = CalculateHashFromInput(input);

            Assert(State.ContractProposingInputMap[proposedContractInputHash] == null, "Already proposed.");
            State.ContractProposingInputMap[proposedContractInputHash] = new ContractProposingInput
            {
                Proposer = Context.Sender,
                Status   = ContractProposingInputStatus.Proposed
            };

            RequireParliamentContractAddressSet();

            // Create proposal for deployment
            var proposalCreationInput = new CreateProposalBySystemContractInput
            {
                ProposalInput = new CreateProposalInput
                {
                    ToAddress          = Context.Self,
                    ContractMethodName =
                        nameof(BasicContractZeroContainer.BasicContractZeroBase.ProposeContractCodeCheck),
                    Params = new ContractCodeCheckInput
                    {
                        ContractInput        = input.ToByteString(),
                        IsContractDeployment = true
                    }.ToByteString(),
                    OrganizationAddress = State.ContractDeploymentController.Value.OwnerAddress,
                    ExpiredTime         = Context.CurrentBlockTime.AddSeconds(ContractProposalExpirationTimePeriod)
                },
                OriginProposer = Context.Sender
            };

            Context.SendInline(State.ContractDeploymentController.Value.ContractAddress,
                               nameof(AuthorizationContractContainer.AuthorizationContractReferenceState
                                      .CreateProposalBySystemContract), proposalCreationInput.ToByteString());

            Context.Fire(new ContractProposed
            {
                ProposedContractInputHash = proposedContractInputHash
            });

            return(proposedContractInputHash);
        }
Example #12
0
        private async Task <Address> Deploy_SmartContracts_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput()
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("MultiToken")).Value)
            };
            var result = await DefaultTester.DeploySmartContract.SendAsync(contractDeploymentInput);

            result.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            result.Output.ShouldNotBeNull();

            {
                var tx = await DefaultTester.DeploySmartContract.SendWithExceptionAsync(contractDeploymentInput);

                tx.TransactionResult.Error.ShouldContain("contract code has already been deployed before");
            }
            return(result.Output);
        }
Example #13
0
        public override Hash ProposeNewContract(ContractDeploymentInput input)
        {
            // AssertDeploymentProposerAuthority(Context.Sender);
            var proposedContractInputHash = CalculateHashFromInput(input);

            RegisterContractProposingData(proposedContractInputHash);

            // Create proposal for deployment
            var proposalCreationInput = new CreateProposalBySystemContractInput
            {
                ProposalInput = new CreateProposalInput
                {
                    ToAddress          = Context.Self,
                    ContractMethodName =
                        nameof(BasicContractZeroImplContainer.BasicContractZeroImplBase.ProposeContractCodeCheck),
                    Params = new ContractCodeCheckInput
                    {
                        ContractInput             = input.ToByteString(),
                        CodeCheckReleaseMethod    = nameof(DeploySmartContract),
                        ProposedContractInputHash = proposedContractInputHash,
                        Category         = input.Category,
                        IsSystemContract = false
                    }.ToByteString(),
                    OrganizationAddress = State.ContractDeploymentController.Value.OwnerAddress,
                    ExpiredTime         = Context.CurrentBlockTime.AddSeconds(ContractProposalExpirationTimePeriod)
                },
                OriginProposer = Context.Sender
            };

            Context.SendInline(State.ContractDeploymentController.Value.ContractAddress,
                               nameof(AuthorizationContractContainer.AuthorizationContractReferenceState
                                      .CreateProposalBySystemContract), proposalCreationInput.ToByteString());

            Context.Fire(new ContractProposed
            {
                ProposedContractInputHash = proposedContractInputHash
            });

            return(proposedContractInputHash);
        }
Example #14
0
        public async Task DeploySmartContractWithCodeCheck_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory,
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("MultiToken")).Value)
            };
            // propose contract code
            var proposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                             .ProposalId;
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            // release contract code and trigger code check proposal
            await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                        nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            // Wait for contract code check event handler to finish its job
            // Mine a block, should include approval transaction
            var block = await Tester.MineEmptyBlockAsync();

            var txs = await Tester.GetTransactionsAsync(block.TransactionIds);

            txs.First(tx => tx.To == ParliamentAddress).MethodName
            .ShouldBe(nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.ApproveMultiProposals));
        }
Example #15
0
        public async Task UpdateSmartContract_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };

            var newAddress = await DeployAsync(Tester, ParliamentAddress, contractDeploymentInput);

            var code = Codes.Single(kv => kv.Key.Contains("Treasury")).Value;
            var contractUpdateInput = new ContractUpdateInput
            {
                Address = newAddress,
                Code    = ByteString.CopyFrom(code)
            };

            var proposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeUpdateContract), contractUpdateInput);

            proposingTxResult.Status.ShouldBe(TransactionResultStatus.Mined);

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                             .ProposalId;

            proposalId.ShouldNotBeNull();
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            var releaseApprovedContractTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                              nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            releaseApprovedContractTxResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            codeCheckProposalId.ShouldNotBeNull();

            await ApproveWithMinersAsync(Tester, ParliamentAddress, codeCheckProposalId);

            var updateResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                           nameof(BasicContractZeroContainer.BasicContractZeroStub.ReleaseCodeCheckedContract),
                                                                           new ReleaseContractInput
                                                                           { ProposedContractInputHash = proposedContractInputHash, ProposalId = codeCheckProposalId });

            updateResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var contractAddress = CodeUpdated.Parser
                                  .ParseFrom(updateResult.Logs.First(l => l.Name.Contains(nameof(CodeUpdated))).Indexed[0]).Address;

            contractAddress.ShouldBe(newAddress);
            var codeHash = Hash.FromRawBytes(code);
            var newHash  = CodeUpdated.Parser
                           .ParseFrom(updateResult.Logs.First(l => l.Name.Contains(nameof(CodeUpdated))).NonIndexed).NewCodeHash;

            newHash.ShouldBe(codeHash);
        }
Example #16
0
        public async Task ChangeContractZeroOwner_Test()
        {
            var createOrganizationResult = await Tester.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                                       nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.CreateOrganization),
                                                                                       new CreateOrganizationInput
            {
                ReleaseThreshold = 1000
            });

            var organizationAddress = Address.Parser.ParseFrom(createOrganizationResult.ReturnValue);

            var methodName = "ChangeGenesisOwner";
            var proposalId = await CreateProposalAsync(Tester, ParliamentAddress, methodName, organizationAddress);

            var txResult1 = await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            txResult1.Status.ShouldBe(TransactionResultStatus.Mined);
            var txResult2 = await ReleaseProposalAsync(Tester, ParliamentAddress, proposalId);

            txResult2.Status.ShouldBe(TransactionResultStatus.Mined);

            // test deployment with only one miner
            var contractDeploymentInput = new ContractDeploymentInput()
            {
                Category = KernelConstants.DefaultRunnerCategory,
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };
            // propose contract code
            var proposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

            var contractProposalId = ProposalCreated.Parser
                                     .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                                     .ProposalId;
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithKeyPairAsync(Tester, ParliamentAddress, contractProposalId,
                                          Tester.InitialMinerList.First());

            // release contract code and trigger code check proposal
            var releaseApprovedContractTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                              nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = contractProposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            await ApproveWithKeyPairAsync(Tester, ParliamentAddress, codeCheckProposalId,
                                          Tester.InitialMinerList.First());

            // release code check proposal and deployment completes
            var deploymentResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                               nameof(BasicContractZeroContainer.BasicContractZeroStub.ReleaseCodeCheckedContract),
                                                                               new ReleaseContractInput
                                                                               { ProposedContractInputHash = proposedContractInputHash, ProposalId = codeCheckProposalId });

            var creator = ContractDeployed.Parser
                          .ParseFrom(deploymentResult.Logs.First(l => l.Name.Contains(nameof(ContractDeployed))).Indexed[0])
                          .Author;

            creator.ShouldBe(BasicContractZeroAddress);
            var deployAddress = ContractDeployed.Parser.ParseFrom(deploymentResult.Logs.First(l => l.Name.Contains(nameof(ContractDeployed))).NonIndexed).Address;

            deployAddress.ShouldNotBeNull();

            var author = Address.Parser.ParseFrom(await Tester.CallContractMethodAsync(BasicContractZeroAddress,
                                                                                       nameof(BasicContractZeroContainer.BasicContractZeroStub.GetContractAuthor), deployAddress));

            author.ShouldBe(BasicContractZeroAddress);
        }
Example #17
0
        public async Task DeploySmartContracts_RepeatedProposals_Test()
        {
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };
            // propose contract code
            var proposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

            {
                // propose contract code
                var repeatedProposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                            nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

                repeatedProposingTxResult.Status.ShouldBe(TransactionResultStatus.Failed);
                repeatedProposingTxResult.Error.Contains("Already proposed.").ShouldBeTrue();
            }

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                             .ProposalId;
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, proposalId);

            // release contract code and trigger code check proposal
            var releaseApprovedContractTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                              nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            await ApproveWithMinersAsync(Tester, ParliamentAddress, codeCheckProposalId);

            {
                // propose contract code
                var repeatedProposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                            nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

                repeatedProposingTxResult.Status.ShouldBe(TransactionResultStatus.Failed);
                repeatedProposingTxResult.Error.Contains("Already proposed.").ShouldBeTrue();
            }


            // release code check proposal and deployment completes
            var deploymentResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                               nameof(BasicContractZeroContainer.BasicContractZeroStub.ReleaseCodeCheckedContract),
                                                                               new ReleaseContractInput
                                                                               { ProposedContractInputHash = proposedContractInputHash, ProposalId = codeCheckProposalId });

            deploymentResult.Status.ShouldBe(TransactionResultStatus.Mined);
            {
                // propose contract code
                var repeatedProposingTxResult = await Tester.ExecuteContractWithMiningAsync(BasicContractZeroAddress,
                                                                                            nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

                repeatedProposingTxResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }
        }
Example #18
0
        public async Task DeploySmartContracts_CreatorDeploy_Test()
        {
            StartSideChain();
            var contractDeploymentInput = new ContractDeploymentInput
            {
                Category = KernelConstants.DefaultRunnerCategory, // test the default runner
                Code     = ByteString.CopyFrom(Codes.Single(kv => kv.Key.Contains("TokenConverter")).Value)
            };

            // propose contract code
            var proposingTxResult = await SideChainTester.ExecuteContractWithMiningAsync(SideBasicContractZeroAddress,
                                                                                         nameof(BasicContractZero.ProposeNewContract), contractDeploymentInput);

            proposingTxResult.Status.ShouldBe(TransactionResultStatus.Mined);

            var proposalId = ProposalCreated.Parser
                             .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated))).NonIndexed)
                             .ProposalId;

            proposalId.ShouldNotBeNull();
            var proposedContractInputHash = ContractProposed.Parser
                                            .ParseFrom(proposingTxResult.Logs.First(l => l.Name.Contains(nameof(ContractProposed))).NonIndexed)
                                            .ProposedContractInputHash;

            await ApproveWithMinersAsync(SideChainTester, SideParliamentAddress, proposalId);

            // release contract code and trigger code check proposal
            var releaseApprovedContractTxResult = await SideChainTester.ExecuteContractWithMiningAsync(SideBasicContractZeroAddress,
                                                                                                       nameof(BasicContractZero.ReleaseApprovedContract), new ReleaseContractInput
            {
                ProposalId = proposalId,
                ProposedContractInputHash = proposedContractInputHash
            });

            releaseApprovedContractTxResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var codeCheckProposalId = ProposalCreated.Parser
                                      .ParseFrom(releaseApprovedContractTxResult.Logs.First(l => l.Name.Contains(nameof(ProposalCreated)))
                                                 .NonIndexed).ProposalId;

            codeCheckProposalId.ShouldNotBeNull();

            await ApproveWithMinersAsync(SideChainTester, SideParliamentAddress, codeCheckProposalId);

            // release code check proposal and deployment completes
            var deploymentResult = await SideChainTester.ExecuteContractWithMiningAsync(SideBasicContractZeroAddress,
                                                                                        nameof(BasicContractZeroContainer.BasicContractZeroStub.ReleaseCodeCheckedContract),
                                                                                        new ReleaseContractInput
                                                                                        { ProposedContractInputHash = proposedContractInputHash, ProposalId = codeCheckProposalId });

            deploymentResult.Status.ShouldBe(TransactionResultStatus.Mined);

            var creator = ContractDeployed.Parser.ParseFrom(deploymentResult.Logs[1].Indexed[0]).Author;

            creator.ShouldBe(SideChainTester.GetCallOwnerAddress());
            var deployAddress = ContractDeployed.Parser.ParseFrom(deploymentResult.Logs[1].NonIndexed).Address;

            deployAddress.ShouldNotBeNull();

            var author = Address.Parser.ParseFrom(await SideChainTester.CallContractMethodAsync(SideBasicContractZeroAddress,
                                                                                                nameof(BasicContractZeroContainer.BasicContractZeroStub.GetContractAuthor), deployAddress));

            author.ShouldBe(SideChainTester.GetCallOwnerAddress());
        }