// SPDX-License-Identifier: MIT
pragmasolidity^0.8.17;interfaceIERC5247{eventProposalCreated(addressindexedproposer,uint256indexedproposalId,address[]targets,uint256[]values,uint256[]gasLimits,bytes[]calldatas,bytesextraParams);eventProposalExecuted(addressindexedexecutor,uint256indexedproposalId,bytesextraParams);functioncreateProposal(uint256proposalId,address[]calldatatargets,uint256[]calldatavalues,uint256[]calldatagasLimits,bytes[]calldatacalldatas,bytescalldataextraParams)externalreturns(uint256registeredProposalId);functionexecuteProposal(uint256proposalId,bytescalldataextraParams)external;}
registeredProposalId 在 createProposal 中返回,因此该标准可以支持实现以决定他们自己的提案 ID 格式。
测试用例
一个简单的测试用例如下:
it("Should work for a simple case",asyncfunction(){const{contract,erc721,owner}=awaitloadFixture(deployFixture);constcallData1=erc721.interface.encodeFunctionData("mint",[owner.address,1]);constcallData2=erc721.interface.encodeFunctionData("mint",[owner.address,2]);awaitcontract.connect(owner).createProposal(0,[erc721.address,erc721.address],[0,0],[0,0],[callData1,callData2],[]);expect(awaiterc721.balanceOf(owner.address)).to.equal(0);awaitcontract.connect(owner).executeProposal(0,[]);expect(awaiterc721.balanceOf(owner.address)).to.equal(2);});
functioncreateProposal(uint256proposalId,address[]calldatatargets,uint256[]calldatavalues,uint256[]calldatagasLimits,bytes[]calldatacalldatas,bytescalldataextraParams)externalreturns(uint256registeredProposalId){require(targets.length==values.length,"GeneralForwarder: targets and values length mismatch");require(targets.length==gasLimits.length,"GeneralForwarder: targets and gasLimits length mismatch");require(targets.length==calldatas.length,"GeneralForwarder: targets and calldatas length mismatch");registeredProposalId=proposalCount;proposalCount++;proposals[registeredProposalId]=Proposal({by:msg.sender,proposalId:proposalId,targets:targets,values:values,calldatas:calldatas,gasLimits:gasLimits});emitProposalCreated(msg.sender,proposalId,targets,values,gasLimits,calldatas,extraParams);returnregisteredProposalId;}functionexecuteProposal(uint256proposalId,bytescalldataextraParams)external{Proposalstorageproposal=proposals[proposalId];address[]memorytargets=proposal.targets;stringmemoryerrorMessage="Governor: call reverted without message";for(uint256i=0;i<targets.length;++i){(boolsuccess,bytesmemoryreturndata)=proposal.targets[i].call{value:proposal.values[i]}(proposal.calldatas[i]);Address.verifyCallResult(success,returndata,errorMessage);}emitProposalExecuted(msg.sender,proposalId,extraParams);}