11import { Signer } from 'ethers' ;
22import { ethers } from 'hardhat' ;
3- import { impersonateAccountWithFunds , stopImpersonateAccount } from '../shared /AccountManipulation' ;
4- import { increaseNextBlockTime , setNextBlockNumber } from '../shared /TimeManipulation' ;
3+ import { impersonateAccountWithFunds , stopImpersonateAccount } from './AccountManipulation' ;
4+ import { increaseNextBlockTime , setNextBlockNumber } from './TimeManipulation' ;
55import { POLYGON_AVERAGE_BLOCK_TIME } from './Constants' ;
66import { DeployedContracts } from './Forking' ;
7+ import { getABIFromPolygonscan } from './Polygonscan' ;
78
89export const createAndExecuteProposal = async ( {
910 governor,
@@ -23,15 +24,18 @@ export const createAndExecuteProposal = async ({
2324 const timeLockSigner = await impersonateAccountWithFunds ( timeLock . address ) ;
2425 let originalVotingDelay = await governor . votingDelay ( ) ;
2526 let originalVotingPeriod = await governor . votingPeriod ( ) ;
27+ console . log ( 'setting voting delay and duration to 2 blocks...' ) ;
2628 await governor . connect ( timeLockSigner ) . setVotingDelay ( `2` ) ;
2729 await governor . connect ( timeLockSigner ) . setVotingPeriod ( `2` ) ;
2830
2931 // 1. borrow some treasury tokens to user as we need signer with min. proposalThreshold tokens to propose
3032 const quorumAmount = await governor . quorumVotes ( ) ;
3133 // careful, this sends ETH to timelock which might break real-world simulation for proposals involving Timelock ETH
34+ console . log ( 'transferring tokens to user for proposal creation...' ) ;
3235 await arenaToken . connect ( timeLockSigner ) . transfer ( await user . getAddress ( ) , quorumAmount ) ;
3336 await arenaToken . connect ( user ) . delegate ( await user . getAddress ( ) ) ;
3437 const descriptionHash = ethers . utils . keccak256 ( [ ] ) ; // keccak(``)
38+ console . log ( 'creating proposal...' ) ;
3539 let tx = await governor . connect ( user ) [ 'propose(address[],uint256[],bytes[],string)' ] ( targets , values , calldatas , `` ) ;
3640 let { events} = await tx . wait ( ) ;
3741 // get first event (ProposalCreated), then get first arg of that event (proposalId)
@@ -42,6 +46,7 @@ export const createAndExecuteProposal = async ({
4246 // simulate elapsed time close to original voting delay
4347 await increaseNextBlockTime ( Math . floor ( POLYGON_AVERAGE_BLOCK_TIME * originalVotingDelay . toNumber ( ) ) ) ;
4448 await setNextBlockNumber ( voteStartBlock . toNumber ( ) + 1 ) ; // is a blocknumber which fits in Number
49+ console . log ( 'casting vote...' ) ;
4550 tx = await governor . connect ( user ) [ 'castVote' ] ( proposalId , `1` ) ;
4651
4752 // 3. return borrowed tokens
@@ -52,22 +57,48 @@ export const createAndExecuteProposal = async ({
5257 // simulate elapsed time close to original voting delay
5358 await increaseNextBlockTime ( Math . floor ( POLYGON_AVERAGE_BLOCK_TIME * originalVotingPeriod . toNumber ( ) ) ) ;
5459 await setNextBlockNumber ( voteEndBlock . toNumber ( ) + 1 ) ; // is a blocknumber which fits in Number
55- tx = await governor
56- . connect ( user )
57- [ 'queue(address[],uint256[],bytes[],bytes32)' ] ( targets , values , calldatas , descriptionHash ) ;
60+ console . log ( 'queueing proposal...' ) ;
61+ tx = await governor . connect ( user ) [ 'queue(uint256)' ] ( proposalId ) ;
5862 await tx . wait ( ) ;
5963
6064 // can revert Governor changes now
65+ console . log ( 'resetting voting delay and period...' ) ;
6166 await governor . connect ( timeLockSigner ) . setVotingDelay ( originalVotingDelay ) ;
6267 await governor . connect ( timeLockSigner ) . setVotingPeriod ( originalVotingPeriod ) ;
6368 await stopImpersonateAccount ( timeLock . address ) ;
6469
6570 // 5. advance time past timelock delay and then execute
6671 const timeLockMinDelaySeconds = await timeLock . getMinDelay ( ) ;
6772 await increaseNextBlockTime ( timeLockMinDelaySeconds . toNumber ( ) ) ;
68- await governor
69- . connect ( user )
70- [ 'execute(address[],uint256[],bytes[],bytes32)' ] ( targets , values , calldatas , descriptionHash ) ;
73+ console . log ( 'executing proposal...' ) ;
74+ tx = await governor . connect ( user ) [ 'execute(uint256)' ] ( proposalId ) ;
75+
76+ let result = await tx . wait ( 1 ) ;
77+
78+ for ( let i = 0 ; i < targets . length ; i ++ ) {
79+ let abi = await getABIFromPolygonscan ( targets [ i ] ) ;
80+ let iface = new ethers . utils . Interface ( abi ) ;
81+ let events = result . logs . map ( ( log ) => {
82+ try {
83+ return iface . parseLog ( log ) ;
84+ } catch ( e ) {
85+ // no matching event
86+ }
87+ } ) ;
88+ console . log ( `### TARGET ${ targets [ i ] } EVENTS ###` ) ;
89+ console . log ( events ) ;
90+ console . log ( `###################################` ) ;
91+ }
92+
93+ let timelockEvents = result . logs . map ( ( log ) => {
94+ try {
95+ return timeLock . interface . parseLog ( log ) ;
96+ } catch ( e ) {
97+ // no matching event
98+ }
99+ } ) ;
100+ console . log ( `### TIMELOCK EVENTS ###` ) ;
101+ console . log ( timelockEvents ) ;
71102
72103 return proposalId ;
73104} ;
0 commit comments