public override Hash ProposeContractCodeCheck(ContractCodeCheckInput input) { RequireSenderAuthority(); AssertDeploymentProposerAuthority(Context.Origin); var proposedContractInputHash = Hash.FromRawBytes(input.ContractInput.ToByteArray()); var proposedInfo = State.ContractProposingInputMap[proposedContractInputHash]; Assert(proposedInfo != null && proposedInfo.Status == ContractProposingInputStatus.Approved, "Invalid contract proposing status."); proposedInfo.Status = ContractProposingInputStatus.PreCodeChecked; State.ContractProposingInputMap[proposedContractInputHash] = proposedInfo; RequireParliamentAuthAddressSet(); // Create proposal for deployment State.ParliamentAuthContract.CreateProposal.Send(new CreateProposalInput { ToAddress = Context.Self, ContractMethodName = input.IsContractDeployment ? nameof(BasicContractZeroContainer.BasicContractZeroBase.DeploySmartContract) : nameof(BasicContractZeroContainer.BasicContractZeroBase.UpdateSmartContract), Params = input.ContractInput, OrganizationAddress = State.GenesisOwner.Value, ExpiredTime = Context.CurrentBlockTime.AddMinutes(10) // Maybe, get the interval from configuration }); // Fire event to trigger BPs checking contract code Context.Fire(new CodeCheckRequired { Code = ExtractCodeFromContractCodeCheckInput(input), ProposedContractInputHash = proposedContractInputHash }); return(proposedContractInputHash); }
public override Hash ProposeContractCodeCheck(ContractCodeCheckInput input) { RequireSenderAuthority(State.ContractDeploymentController.Value.OwnerAddress); // AssertDeploymentProposerAuthority(Context.Origin); var proposedContractInputHash = Hash.FromRawBytes(input.ContractInput.ToByteArray()); var proposedInfo = State.ContractProposingInputMap[proposedContractInputHash]; Assert(proposedInfo != null && proposedInfo.Status == ContractProposingInputStatus.Approved, "Invalid contract proposing status."); proposedInfo.Status = ContractProposingInputStatus.PreCodeChecked; State.ContractProposingInputMap[proposedContractInputHash] = proposedInfo; RequireParliamentContractAddressSet(); var codeCheckController = State.CodeCheckController.Value; var proposalCreationInput = new CreateProposalBySystemContractInput { ProposalInput = new CreateProposalInput { ToAddress = Context.Self, ContractMethodName = input.IsContractDeployment ? nameof(BasicContractZeroContainer.BasicContractZeroBase.DeploySmartContract) : nameof(BasicContractZeroContainer.BasicContractZeroBase.UpdateSmartContract), Params = input.ContractInput, OrganizationAddress = codeCheckController.OwnerAddress, ExpiredTime = Context.CurrentBlockTime.AddSeconds(CodeCheckProposalExpirationTimePeriod) }, OriginProposer = proposedInfo.Proposer }; // Create proposal for deployment Context.SendInline(codeCheckController.ContractAddress, nameof(AuthorizationContractContainer.AuthorizationContractReferenceState .CreateProposalBySystemContract), proposalCreationInput); // Fire event to trigger BPs checking contract code Context.Fire(new CodeCheckRequired { Code = ExtractCodeFromContractCodeCheckInput(input), ProposedContractInputHash = proposedContractInputHash }); return(proposedContractInputHash); }
public override Hash ProposeContractCodeCheck(ContractCodeCheckInput input) { RequireSenderAuthority(State.ContractDeploymentController.Value.OwnerAddress); AssertCodeCheckProposingInput(input); var proposedContractInputHash = input.ProposedContractInputHash; var proposedInfo = State.ContractProposingInputMap[proposedContractInputHash]; Assert(proposedInfo != null && proposedInfo.Status == ContractProposingInputStatus.Approved, "Invalid contract proposing status."); proposedInfo.Status = ContractProposingInputStatus.CodeCheckProposed; State.ContractProposingInputMap[proposedContractInputHash] = proposedInfo; var codeCheckController = State.CodeCheckController.Value; var proposalCreationInput = new CreateProposalBySystemContractInput { ProposalInput = new CreateProposalInput { ToAddress = Context.Self, ContractMethodName = input.CodeCheckReleaseMethod, Params = input.ContractInput, OrganizationAddress = codeCheckController.OwnerAddress, ExpiredTime = Context.CurrentBlockTime.AddSeconds(CodeCheckProposalExpirationTimePeriod) }, OriginProposer = proposedInfo.Proposer }; proposedInfo.ExpiredTime = proposalCreationInput.ProposalInput.ExpiredTime; State.ContractProposingInputMap[proposedContractInputHash] = proposedInfo; Context.SendInline(codeCheckController.ContractAddress, nameof(AuthorizationContractContainer.AuthorizationContractReferenceState .CreateProposalBySystemContract), proposalCreationInput); // Fire event to trigger BPs checking contract code Context.Fire(new CodeCheckRequired { Code = ExtractCodeFromContractCodeCheckInput(input), ProposedContractInputHash = proposedContractInputHash, Category = input.Category, IsSystemContract = input.IsSystemContract }); return(proposedContractInputHash); }
private void AssertCodeCheckProposingInput(ContractCodeCheckInput input) { Assert( input.CodeCheckReleaseMethod == nameof(DeploySmartContract) || input.CodeCheckReleaseMethod == nameof(UpdateSmartContract), "Invalid input."); }
private ByteString ExtractCodeFromContractCodeCheckInput(ContractCodeCheckInput input) { return(input.CodeCheckReleaseMethod == nameof(DeploySmartContract) ? ContractDeploymentInput.Parser.ParseFrom(input.ContractInput).Code : ContractUpdateInput.Parser.ParseFrom(input.ContractInput).Code); }
private ByteString ExtractCodeFromContractCodeCheckInput(ContractCodeCheckInput input) { return(input.IsContractDeployment ? ContractDeploymentInput.Parser.ParseFrom(input.ContractInput).Code : ContractUpdateInput.Parser.ParseFrom(input.ContractInput).Code); }