diff --git a/client/src/App.jsx b/client/src/App.jsx index 3690617..370c73f 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -58,7 +58,7 @@ function App() { // In this effect, we initialize everything and add contract event listeners. useEffect(() => { - if (!provider || !chainId || !account || balance === undefined) return; + if (!provider || !chainId || !account || balance === undefined) return () => {}; const DAOAddress = getContractAddressByChainId(chainId, 'DAO'); const Work1Address = getContractAddressByChainId(chainId, 'Work1'); const OnboardingAddress = getContractAddressByChainId(chainId, 'Onboarding'); @@ -145,8 +145,6 @@ function App() { /* --------------------------- BEGIN EVENT HANDLERS ------------------------------- */ /* -------------------------------------------------------------------------------- */ - // TODO: Unsubscribe from events when effect is to be rerun - DAOContract.events.PostAdded({ fromBlock: 'latest' }).on('data', (event) => { console.log('event: post added'); fetchPost(event.returnValues.postIndex); @@ -170,6 +168,14 @@ function App() { OnboardingContract.events.AvailabilityStaked({ fromBlock: 'latest' }).on('data', () => { fetchReputation(); }); + + return () => { + DAOContract.events.PostAdded().off(); + DAOContract.events.ValidationPoolInitiated().off(); + DAOContract.events.ValidationPoolResolved().off(); + Work1Contract.events.AvailabilityStaked().off(); + OnboardingContract.events.AvailabilityStaked().off(); + }; }, [provider, account, chainId, balance, dispatchValidationPool, dispatchPost]); /* -------------------------------------------------------------------------------- */ diff --git a/client/src/assets/Proposals.json b/client/src/assets/Proposals.json index aa82020..3c34f4e 100644 --- a/client/src/assets/Proposals.json +++ b/client/src/assets/Proposals.json @@ -181,6 +181,11 @@ "name": "fee", "type": "uint256" }, + { + "internalType": "uint256", + "name": "remainingFee", + "type": "uint256" + }, { "internalType": "uint256", "name": "postIndex", @@ -240,8 +245,8 @@ "type": "function" } ], - "bytecode": "0x60a06040526040518060600160405280600060ff168152602001600160ff168152602001606460ff1681525060029060036200003d929190620001ef565b5060405180606001604052806000151515158152602001600015151515815260200160011515151581525060059060036200007a92919062000239565b5060405180606001604052806040518060400160405280600160ff168152602001600a60ff1681525081526020016040518060400160405280600160ff168152602001600260ff1681525081526020016040518060400160405280600160ff168152602001600360ff168152508152506006906003620000fc929190620002d9565b5060405180606001604052806040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff16815250815250600c9060036200017e929190620002d9565b503480156200018c57600080fd5b506040516200229f3803806200229f8339818101604052810190620001b291906200044e565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000480565b826003810192821562000226579160200282015b8281111562000225578251829060ff1690559160200191906001019062000203565b5b50905062000235919062000331565b5090565b826003601f01602090048101928215620002c65791602002820160005b838211156200029557835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030262000256565b8015620002c45782816101000a81549060ff021916905560010160208160000104928301926001030262000295565b505b509050620002d5919062000331565b5090565b82600360020281019282156200031e579160200282015b828111156200031d578251829060026200030c92919062000350565b5091602001919060020190620002f0565b5b5090506200032d91906200039a565b5090565b5b808211156200034c57600081600090555060010162000332565b5090565b826002810192821562000387579160200282015b8281111562000386578251829060ff1690559160200191906001019062000364565b5b50905062000396919062000331565b5090565b5b80821115620003be5760008181620003b49190620003c2565b506002016200039b565b5090565b506000815560010160009055565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200040282620003d5565b9050919050565b60006200041682620003f5565b9050919050565b620004288162000409565b81146200043457600080fd5b50565b60008151905062000448816200041d565b92915050565b600060208284031215620004675762000466620003d0565b5b6000620004778482850162000437565b91505092915050565b608051611de0620004bf600039600081816101f401528181610440015281816105f3015281816107c801528181610d480152610f320152611de06000f3fe6080604052600436106100555760003560e01c8063013cf08b1461005a5780635d4d20471461009c578063a3bb24cc146100cc578063b4e6a1d5146100f5578063da35c6641461011e578063ea923e6314610149575b600080fd5b34801561006657600080fd5b50610081600480360381019061007c9190611135565b610186565b60405161009396959493929190611229565b60405180910390f35b6100b660048036038101906100b191906112ef565b6101ef565b6040516100c39190611377565b60405180910390f35b3480156100d857600080fd5b506100f360048036038101906100ee9190611392565b61043d565b005b34801561010157600080fd5b5061011c60048036038101906101179190611460565b6105f1565b005b34801561012a57600080fd5b50610133610caf565b6040516101409190611377565b60405180910390f35b34801561015557600080fd5b50610170600480360381019061016b9190611135565b610cb5565b60405161017d9190611509565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900460ff16908060060154905086565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692403389896040518463ffffffff1660e01b815260040161024f93929190611582565b6020604051808303816000875af115801561026e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029291906115c9565b9050600160008154809291906102a790611625565b9190505591506000806000848152602001908152602001600020905081816002018190555042816003018190555085816007016000600381106102ed576102ec61166d565b5b600602016000018190555084816007016001600381106103105761030f61166d565b5b600602016000018190555083816007016002600381106103335761033261166d565b5b60060201600001819055503481600101819055506003816001015461035891906116cb565b8160070160006003811061036f5761036e61166d565b5b60060201600101819055506003816001015461038b91906116cb565b816007016001600381106103a2576103a161166d565b5b60060201600101819055506003600282600101546103c091906116fc565b6103ca91906116cb565b81600101546103d9919061173e565b816007016002600381106103f0576103ef61166d565b5b60060201600101819055507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e8360405161042a9190611377565b60405180910390a1505095945050505050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016104979190611772565b602060405180830381865afa1580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d891906115c9565b1015610519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610510906117ff565b60405180910390fd5b600080600084815260200190815260200160002090508060050160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816006016000828254610584919061173e565b92505081905550818160050160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818160060160008282546105e5919061181f565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461067f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610676906118c5565b60405180910390fd5b60008083838101906106919190611392565b91509150600080600084815260200190815260200160002090508761071c5760048160040160006101000a81548160ff021916908360058111156106d8576106d76111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb8360405161070c9190611931565b60405180910390a1505050610ca7565b60008160070183600381106107345761073361166d565b5b60060201905060008160020160018360020180549050610754919061173e565b815481106107655761076461166d565b5b906000526020600020906003020190508881600101819055508781600201819055506001600581111561079b5761079a6111b2565b5b8360040160009054906101000a900460ff1660058111156107bf576107be6111b2565b5b036109735760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085591906115c9565b898b610861919061181f565b600261086d91906116fc565b101590508b801561087b5750805b156108b25760028460040160006101000a81548160ff021916908360058111156108a8576108a76111b2565b5b021790555061096d565b6003836003016000600381106108cb576108ca61166d565b5b01541061093b5760048460040160006101000a81548160ff021916908360058111156108fa576108f96111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb8660405161092e91906119ab565b60405180910390a161096c565b6001836003016000600381106109545761095361166d565b5b016000828254610964919061181f565b925050819055505b5b50610bbc565b60026005811115610987576109866111b2565b5b8360040160009054906101000a900460ff1660058111156109ab576109aa6111b2565b5b03610aa8578a156109e85760038360040160006101000a81548160ff021916908360058111156109de576109dd6111b2565b5b0217905550610aa3565b600382600301600160038110610a0157610a0061166d565b5b015410610a715760048360040160006101000a81548160ff02191690836005811115610a3057610a2f6111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610a6491906119ab565b60405180910390a1610aa2565b600182600301600160038110610a8a57610a8961166d565b5b016000828254610a9a919061181f565b925050819055505b5b610bbb565b60036005811115610abc57610abb6111b2565b5b8360040160009054906101000a900460ff166005811115610ae057610adf6111b2565b5b03610bba578a15610b545760058360040160006101000a81548160ff02191690836005811115610b1357610b126111b2565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b85604051610b479190611377565b60405180910390a1610bb9565b60048360040160006101000a81548160ff02191690836005811115610b7c57610b7b6111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610bb09190611a25565b60405180910390a15b5b5b5b60016005811115610bd057610bcf6111b2565b5b8360040160009054906101000a900460ff166005811115610bf457610bf36111b2565b5b03610c0957610c04856000610ed0565b610ca1565b60026005811115610c1d57610c1c6111b2565b5b8360040160009054906101000a900460ff166005811115610c4157610c406111b2565b5b03610c5657610c51856001610ed0565b610ca0565b60036005811115610c6a57610c696111b2565b5b8360040160009054906101000a900460ff166005811115610c8e57610c8d6111b2565b5b03610c9f57610c9e856002610ed0565b5b5b5b50505050505b505050505050565b60015481565b600080600080848152602001908152602001600020905060006005811115610ce057610cdf6111b2565b5b8160040160009054906101000a900460ff166005811115610d0457610d036111b2565b5b14610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90611ac5565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd591906115c9565b8260060154600a610de691906116fc565b1015905060006301e133808360030154610e00919061181f565b4211905081610e8b578015610e7f5760048360040160006101000a81548160ff02191690836005811115610e3757610e366111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610e6b9190611b57565b60405180910390a160009350505050610ecb565b60009350505050610ecb565b60018360040160006101000a81548160ff02191690836005811115610eb357610eb26111b2565b5b0217905550610ec3856000610ed0565b600193505050505b919050565b600060028260038110610ee657610ee561166d565b5b01549050600060058360038110610f0057610eff61166d565b5b602091828204019190069054906101000a900460ff1690506000806000868152602001908152602001600020905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637fcf6759836007018760038110610f8257610f8161166d565b5b60060201600101548460020154856007018960038110610fa557610fa461166d565b5b600602016000015460068a60038110610fc157610fc061166d565b5b60020201600c8b60038110610fd957610fd861166d565b5b600202018a8a60018f8f604051602001610ff4929190611b85565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401611026989796959493929190611d23565b60206040518083038185885af1158015611044573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061106991906115c9565b905060008260070186600381106110835761108261166d565b5b6006020160020160018160018154018082558091505003906000526020600020906003020190508181600001819055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c67347987836040516110e4929190611b85565b60405180910390a150505050505050565b600080fd5b600080fd5b6000819050919050565b611112816110ff565b811461111d57600080fd5b50565b60008135905061112f81611109565b92915050565b60006020828403121561114b5761114a6110f5565b5b600061115984828501611120565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061118d82611162565b9050919050565b61119d81611182565b82525050565b6111ac816110ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600681106111f2576111f16111b2565b5b50565b6000819050611203826111e1565b919050565b6000611213826111f5565b9050919050565b61122381611208565b82525050565b600060c08201905061123e6000830189611194565b61124b60208301886111a3565b61125860408301876111a3565b61126560608301866111a3565b611272608083018561121a565b61127f60a08301846111a3565b979650505050505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126112af576112ae61128a565b5b8235905067ffffffffffffffff8111156112cc576112cb61128f565b5b6020830191508360018202830111156112e8576112e7611294565b5b9250929050565b60008060008060006080868803121561130b5761130a6110f5565b5b600086013567ffffffffffffffff811115611329576113286110fa565b5b61133588828901611299565b9550955050602061134888828901611120565b935050604061135988828901611120565b925050606061136a88828901611120565b9150509295509295909350565b600060208201905061138c60008301846111a3565b92915050565b600080604083850312156113a9576113a86110f5565b5b60006113b785828601611120565b92505060206113c885828601611120565b9150509250929050565b60008115159050919050565b6113e7816113d2565b81146113f257600080fd5b50565b600081359050611404816113de565b92915050565b60008083601f8401126114205761141f61128a565b5b8235905067ffffffffffffffff81111561143d5761143c61128f565b5b60208301915083600182028301111561145957611458611294565b5b9250929050565b60008060008060008060a0878903121561147d5761147c6110f5565b5b600061148b89828a016113f5565b965050602061149c89828a016113f5565b95505060406114ad89828a01611120565b94505060606114be89828a01611120565b935050608087013567ffffffffffffffff8111156114df576114de6110fa565b5b6114eb89828a0161140a565b92509250509295509295509295565b611503816113d2565b82525050565b600060208201905061151e60008301846114fa565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006115618385611524565b935061156e838584611535565b61157783611544565b840190509392505050565b60006040820190506115976000830186611194565b81810360208301526115aa818486611555565b9050949350505050565b6000815190506115c381611109565b92915050565b6000602082840312156115df576115de6110f5565b5b60006115ed848285016115b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611630826110ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611662576116616115f6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116d6826110ff565b91506116e1836110ff565b9250826116f1576116f061169c565b5b828204905092915050565b6000611707826110ff565b9150611712836110ff565b9250828202611720816110ff565b91508282048414831517611737576117366115f6565b5b5092915050565b6000611749826110ff565b9150611754836110ff565b925082820390508181111561176c5761176b6115f6565b5b92915050565b60006020820190506117876000830184611194565b92915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006117e9602383611524565b91506117f48261178d565b604082019050919050565b60006020820190508181036000830152611818816117dc565b9050919050565b600061182a826110ff565b9150611835836110ff565b925082820190508082111561184d5761184c6115f6565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b60006118af603183611524565b91506118ba82611853565b604082019050919050565b600060208201905081810360008301526118de816118a2565b9050919050565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b600061191b600e83611524565b9150611926826118e5565b602082019050919050565b600060408201905061194660008301846111a3565b81810360208301526119578161190e565b905092915050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000611995601483611524565b91506119a08261195f565b602082019050919050565b60006040820190506119c060008301846111a3565b81810360208301526119d181611988565b905092915050565b7f42696e64696e6720706f6f6c207761732072656a656374656400000000000000600082015250565b6000611a0f601983611524565b9150611a1a826119d9565b602082019050919050565b6000604082019050611a3a60008301846111a3565b8181036020830152611a4b81611a02565b905092915050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b6000611aaf602b83611524565b9150611aba82611a53565b604082019050919050565b60006020820190508181036000830152611ade81611aa2565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b6000611b41602d83611524565b9150611b4c82611ae5565b604082019050919050565b6000604082019050611b6c60008301846111a3565b8181036020830152611b7d81611b34565b905092915050565b6000604082019050611b9a60008301856111a3565b611ba760208301846111a3565b9392505050565b600060029050919050565b600081905092915050565b6000819050919050565b611bd7816110ff565b82525050565b6000611be98383611bce565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b6000611c1f611c1a83611bf5565b611c02565b9050919050565b6000611c328254611c0c565b9050919050565b6000600182019050919050565b611c4f81611bae565b611c598184611bb9565b9250611c6482611bc4565b8060005b83811015611c9c57611c7982611c26565b611c838782611bdd565b9650611c8e83611c39565b925050600181019050611c68565b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cde578082015181840152602081019050611cc3565b60008484015250505050565b6000611cf582611ca4565b611cff8185611caf565b9350611d0f818560208601611cc0565b611d1881611544565b840191505092915050565b600061014082019050611d39600083018b6111a3565b611d46602083018a6111a3565b611d536040830189611c46565b611d606080830188611c46565b611d6d60c08301876111a3565b611d7a60e08301866114fa565b611d886101008301856114fa565b818103610120830152611d9b8184611cea565b9050999850505050505050505056fea26469706673582212209e3a506480134af492b50add2e441fdea8ba815914ff1b258de0836754dbcc9f64736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106100555760003560e01c8063013cf08b1461005a5780635d4d20471461009c578063a3bb24cc146100cc578063b4e6a1d5146100f5578063da35c6641461011e578063ea923e6314610149575b600080fd5b34801561006657600080fd5b50610081600480360381019061007c9190611135565b610186565b60405161009396959493929190611229565b60405180910390f35b6100b660048036038101906100b191906112ef565b6101ef565b6040516100c39190611377565b60405180910390f35b3480156100d857600080fd5b506100f360048036038101906100ee9190611392565b61043d565b005b34801561010157600080fd5b5061011c60048036038101906101179190611460565b6105f1565b005b34801561012a57600080fd5b50610133610caf565b6040516101409190611377565b60405180910390f35b34801561015557600080fd5b50610170600480360381019061016b9190611135565b610cb5565b60405161017d9190611509565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900460ff16908060060154905086565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692403389896040518463ffffffff1660e01b815260040161024f93929190611582565b6020604051808303816000875af115801561026e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029291906115c9565b9050600160008154809291906102a790611625565b9190505591506000806000848152602001908152602001600020905081816002018190555042816003018190555085816007016000600381106102ed576102ec61166d565b5b600602016000018190555084816007016001600381106103105761030f61166d565b5b600602016000018190555083816007016002600381106103335761033261166d565b5b60060201600001819055503481600101819055506003816001015461035891906116cb565b8160070160006003811061036f5761036e61166d565b5b60060201600101819055506003816001015461038b91906116cb565b816007016001600381106103a2576103a161166d565b5b60060201600101819055506003600282600101546103c091906116fc565b6103ca91906116cb565b81600101546103d9919061173e565b816007016002600381106103f0576103ef61166d565b5b60060201600101819055507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e8360405161042a9190611377565b60405180910390a1505095945050505050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016104979190611772565b602060405180830381865afa1580156104b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d891906115c9565b1015610519576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610510906117ff565b60405180910390fd5b600080600084815260200190815260200160002090508060050160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054816006016000828254610584919061173e565b92505081905550818160050160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818160060160008282546105e5919061181f565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461067f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610676906118c5565b60405180910390fd5b60008083838101906106919190611392565b91509150600080600084815260200190815260200160002090508761071c5760048160040160006101000a81548160ff021916908360058111156106d8576106d76111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb8360405161070c9190611931565b60405180910390a1505050610ca7565b60008160070183600381106107345761073361166d565b5b60060201905060008160020160018360020180549050610754919061173e565b815481106107655761076461166d565b5b906000526020600020906003020190508881600101819055508781600201819055506001600581111561079b5761079a6111b2565b5b8360040160009054906101000a900460ff1660058111156107bf576107be6111b2565b5b036109735760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085591906115c9565b898b610861919061181f565b600261086d91906116fc565b101590508b801561087b5750805b156108b25760028460040160006101000a81548160ff021916908360058111156108a8576108a76111b2565b5b021790555061096d565b6003836003016000600381106108cb576108ca61166d565b5b01541061093b5760048460040160006101000a81548160ff021916908360058111156108fa576108f96111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb8660405161092e91906119ab565b60405180910390a161096c565b6001836003016000600381106109545761095361166d565b5b016000828254610964919061181f565b925050819055505b5b50610bbc565b60026005811115610987576109866111b2565b5b8360040160009054906101000a900460ff1660058111156109ab576109aa6111b2565b5b03610aa8578a156109e85760038360040160006101000a81548160ff021916908360058111156109de576109dd6111b2565b5b0217905550610aa3565b600382600301600160038110610a0157610a0061166d565b5b015410610a715760048360040160006101000a81548160ff02191690836005811115610a3057610a2f6111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610a6491906119ab565b60405180910390a1610aa2565b600182600301600160038110610a8a57610a8961166d565b5b016000828254610a9a919061181f565b925050819055505b5b610bbb565b60036005811115610abc57610abb6111b2565b5b8360040160009054906101000a900460ff166005811115610ae057610adf6111b2565b5b03610bba578a15610b545760058360040160006101000a81548160ff02191690836005811115610b1357610b126111b2565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b85604051610b479190611377565b60405180910390a1610bb9565b60048360040160006101000a81548160ff02191690836005811115610b7c57610b7b6111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610bb09190611a25565b60405180910390a15b5b5b5b60016005811115610bd057610bcf6111b2565b5b8360040160009054906101000a900460ff166005811115610bf457610bf36111b2565b5b03610c0957610c04856000610ed0565b610ca1565b60026005811115610c1d57610c1c6111b2565b5b8360040160009054906101000a900460ff166005811115610c4157610c406111b2565b5b03610c5657610c51856001610ed0565b610ca0565b60036005811115610c6a57610c696111b2565b5b8360040160009054906101000a900460ff166005811115610c8e57610c8d6111b2565b5b03610c9f57610c9e856002610ed0565b5b5b5b50505050505b505050505050565b60015481565b600080600080848152602001908152602001600020905060006005811115610ce057610cdf6111b2565b5b8160040160009054906101000a900460ff166005811115610d0457610d036111b2565b5b14610d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3b90611ac5565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd591906115c9565b8260060154600a610de691906116fc565b1015905060006301e133808360030154610e00919061181f565b4211905081610e8b578015610e7f5760048360040160006101000a81548160ff02191690836005811115610e3757610e366111b2565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610e6b9190611b57565b60405180910390a160009350505050610ecb565b60009350505050610ecb565b60018360040160006101000a81548160ff02191690836005811115610eb357610eb26111b2565b5b0217905550610ec3856000610ed0565b600193505050505b919050565b600060028260038110610ee657610ee561166d565b5b01549050600060058360038110610f0057610eff61166d565b5b602091828204019190069054906101000a900460ff1690506000806000868152602001908152602001600020905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637fcf6759836007018760038110610f8257610f8161166d565b5b60060201600101548460020154856007018960038110610fa557610fa461166d565b5b600602016000015460068a60038110610fc157610fc061166d565b5b60020201600c8b60038110610fd957610fd861166d565b5b600202018a8a60018f8f604051602001610ff4929190611b85565b6040516020818303038152906040526040518a63ffffffff1660e01b8152600401611026989796959493929190611d23565b60206040518083038185885af1158015611044573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061106991906115c9565b905060008260070186600381106110835761108261166d565b5b6006020160020160018160018154018082558091505003906000526020600020906003020190508181600001819055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c67347987836040516110e4929190611b85565b60405180910390a150505050505050565b600080fd5b600080fd5b6000819050919050565b611112816110ff565b811461111d57600080fd5b50565b60008135905061112f81611109565b92915050565b60006020828403121561114b5761114a6110f5565b5b600061115984828501611120565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061118d82611162565b9050919050565b61119d81611182565b82525050565b6111ac816110ff565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600681106111f2576111f16111b2565b5b50565b6000819050611203826111e1565b919050565b6000611213826111f5565b9050919050565b61122381611208565b82525050565b600060c08201905061123e6000830189611194565b61124b60208301886111a3565b61125860408301876111a3565b61126560608301866111a3565b611272608083018561121a565b61127f60a08301846111a3565b979650505050505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126112af576112ae61128a565b5b8235905067ffffffffffffffff8111156112cc576112cb61128f565b5b6020830191508360018202830111156112e8576112e7611294565b5b9250929050565b60008060008060006080868803121561130b5761130a6110f5565b5b600086013567ffffffffffffffff811115611329576113286110fa565b5b61133588828901611299565b9550955050602061134888828901611120565b935050604061135988828901611120565b925050606061136a88828901611120565b9150509295509295909350565b600060208201905061138c60008301846111a3565b92915050565b600080604083850312156113a9576113a86110f5565b5b60006113b785828601611120565b92505060206113c885828601611120565b9150509250929050565b60008115159050919050565b6113e7816113d2565b81146113f257600080fd5b50565b600081359050611404816113de565b92915050565b60008083601f8401126114205761141f61128a565b5b8235905067ffffffffffffffff81111561143d5761143c61128f565b5b60208301915083600182028301111561145957611458611294565b5b9250929050565b60008060008060008060a0878903121561147d5761147c6110f5565b5b600061148b89828a016113f5565b965050602061149c89828a016113f5565b95505060406114ad89828a01611120565b94505060606114be89828a01611120565b935050608087013567ffffffffffffffff8111156114df576114de6110fa565b5b6114eb89828a0161140a565b92509250509295509295509295565b611503816113d2565b82525050565b600060208201905061151e60008301846114fa565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006115618385611524565b935061156e838584611535565b61157783611544565b840190509392505050565b60006040820190506115976000830186611194565b81810360208301526115aa818486611555565b9050949350505050565b6000815190506115c381611109565b92915050565b6000602082840312156115df576115de6110f5565b5b60006115ed848285016115b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611630826110ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611662576116616115f6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116d6826110ff565b91506116e1836110ff565b9250826116f1576116f061169c565b5b828204905092915050565b6000611707826110ff565b9150611712836110ff565b9250828202611720816110ff565b91508282048414831517611737576117366115f6565b5b5092915050565b6000611749826110ff565b9150611754836110ff565b925082820390508181111561176c5761176b6115f6565b5b92915050565b60006020820190506117876000830184611194565b92915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006117e9602383611524565b91506117f48261178d565b604082019050919050565b60006020820190508181036000830152611818816117dc565b9050919050565b600061182a826110ff565b9150611835836110ff565b925082820190508082111561184d5761184c6115f6565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b60006118af603183611524565b91506118ba82611853565b604082019050919050565b600060208201905081810360008301526118de816118a2565b9050919050565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b600061191b600e83611524565b9150611926826118e5565b602082019050919050565b600060408201905061194660008301846111a3565b81810360208301526119578161190e565b905092915050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000611995601483611524565b91506119a08261195f565b602082019050919050565b60006040820190506119c060008301846111a3565b81810360208301526119d181611988565b905092915050565b7f42696e64696e6720706f6f6c207761732072656a656374656400000000000000600082015250565b6000611a0f601983611524565b9150611a1a826119d9565b602082019050919050565b6000604082019050611a3a60008301846111a3565b8181036020830152611a4b81611a02565b905092915050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b6000611aaf602b83611524565b9150611aba82611a53565b604082019050919050565b60006020820190508181036000830152611ade81611aa2565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b6000611b41602d83611524565b9150611b4c82611ae5565b604082019050919050565b6000604082019050611b6c60008301846111a3565b8181036020830152611b7d81611b34565b905092915050565b6000604082019050611b9a60008301856111a3565b611ba760208301846111a3565b9392505050565b600060029050919050565b600081905092915050565b6000819050919050565b611bd7816110ff565b82525050565b6000611be98383611bce565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b6000611c1f611c1a83611bf5565b611c02565b9050919050565b6000611c328254611c0c565b9050919050565b6000600182019050919050565b611c4f81611bae565b611c598184611bb9565b9250611c6482611bc4565b8060005b83811015611c9c57611c7982611c26565b611c838782611bdd565b9650611c8e83611c39565b925050600181019050611c68565b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cde578082015181840152602081019050611cc3565b60008484015250505050565b6000611cf582611ca4565b611cff8185611caf565b9350611d0f818560208601611cc0565b611d1881611544565b840191505092915050565b600061014082019050611d39600083018b6111a3565b611d46602083018a6111a3565b611d536040830189611c46565b611d606080830188611c46565b611d6d60c08301876111a3565b611d7a60e08301866114fa565b611d886101008301856114fa565b818103610120830152611d9b8184611cea565b9050999850505050505050505056fea26469706673582212209e3a506480134af492b50add2e441fdea8ba815914ff1b258de0836754dbcc9f64736f6c63430008180033", + "bytecode": "0x60a06040526040518060600160405280600060ff168152602001600160ff168152602001606460ff1681525060029060036200003d929190620001ef565b5060405180606001604052806000151515158152602001600015151515815260200160011515151581525060059060036200007a92919062000239565b5060405180606001604052806040518060400160405280600160ff168152602001600a60ff1681525081526020016040518060400160405280600160ff168152602001600a60ff1681525081526020016040518060400160405280600160ff168152602001600a60ff168152508152506006906003620000fc929190620002d9565b5060405180606001604052806040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff1681525081526020016040518060400160405280600260ff168152602001600360ff16815250815250600c9060036200017e929190620002d9565b503480156200018c57600080fd5b5060405162002474380380620024748339818101604052810190620001b291906200044e565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000480565b826003810192821562000226579160200282015b8281111562000225578251829060ff1690559160200191906001019062000203565b5b50905062000235919062000331565b5090565b826003601f01602090048101928215620002c65791602002820160005b838211156200029557835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030262000256565b8015620002c45782816101000a81549060ff021916905560010160208160000104928301926001030262000295565b505b509050620002d5919062000331565b5090565b82600360020281019282156200031e579160200282015b828111156200031d578251829060026200030c92919062000350565b5091602001919060020190620002f0565b5b5090506200032d91906200039a565b5090565b5b808211156200034c57600081600090555060010162000332565b5090565b826002810192821562000387579160200282015b8281111562000386578251829060ff1690559160200191906001019062000364565b5b50905062000396919062000331565b5090565b5b80821115620003be5760008181620003b49190620003c2565b506002016200039b565b5090565b506000815560010160009055565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200040282620003d5565b9050919050565b60006200041682620003f5565b9050919050565b620004288162000409565b81146200043457600080fd5b50565b60008151905062000448816200041d565b92915050565b600060208284031215620004675762000466620003d0565b5b6000620004778482850162000437565b91505092915050565b608051611fb5620004bf600039600081816101fb015281816103a0015281816105530152818161070b01528181610db50152610f830152611fb56000f3fe6080604052600436106100555760003560e01c8063013cf08b1461005a5780635d4d20471461009d578063a3bb24cc146100cd578063b4e6a1d5146100f6578063da35c6641461011f578063ea923e631461014a575b600080fd5b34801561006657600080fd5b50610081600480360381019061007c91906111a8565b610187565b604051610094979695949392919061129c565b60405180910390f35b6100b760048036038101906100b29190611370565b6101f6565b6040516100c491906113f8565b60405180910390f35b3480156100d957600080fd5b506100f460048036038101906100ef9190611413565b61039d565b005b34801561010257600080fd5b5061011d600480360381019061011891906114e1565b610551565b005b34801561012b57600080fd5b50610134610d1c565b60405161014191906113f8565b60405180910390f35b34801561015657600080fd5b50610171600480360381019061016c91906111a8565b610d22565b60405161017e919061158a565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060070154905087565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692403389896040518463ffffffff1660e01b815260040161025693929190611603565b6020604051808303816000875af1158015610275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610299919061164a565b9050600160008154809291906102ae906116a6565b9190505591506000806000848152602001908152602001600020905081816003018190555042816004018190555085816008016000600381106102f4576102f36116ee565b5b60030201600001819055508481600801600160038110610317576103166116ee565b5b6003020160000181905550838160080160026003811061033a576103396116ee565b5b6003020160000181905550348160010181905550806001015481600201819055507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e8360405161038a91906113f8565b60405180910390a1505095945050505050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016103f7919061171d565b602060405180830381865afa158015610414573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610438919061164a565b1015610479576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610470906117aa565b60405180910390fd5b600080600084815260200190815260200160002090508060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160070160008282546104e491906117ca565b92505081905550818160060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508181600701600082825461054591906117fe565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906118a4565b60405180910390fd5b600080600084848101906105f391906118c4565b925092509250600080600085815260200190815260200160002090508861069c5760048160050160006101000a81548160ff0219169083600581111561063c5761063b611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb846040516106709190611963565b60405180910390a18181600201600082825461068c91906117fe565b9250508190555050505050610d14565b60008160080184600381106106b4576106b36116ee565b5b600302019050600081600101600183600101805490506106d491906117ca565b815481106106e5576106e46116ee565b5b9060005260206000209060030201905089816001018190555088816002018190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610774573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610798919061164a565b8a8c6107a491906117fe565b60026107b09190611991565b10159050600160058111156107c8576107c7611225565b5b8460050160009054906101000a900460ff1660058111156107ec576107eb611225565b5b0361090d5760008614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90611a1f565b60405180910390fd5b8c801561083e5750805b156108755760028460050160006101000a81548160ff0219169083600581111561086b5761086a611225565b5b0217905550610908565b60028360020154106108ea5760048460050160006101000a81548160ff021916908360058111156108a9576108a8611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516108dd9190611a8b565b60405180910390a1610907565b60018360020160008282546108ff91906117fe565b925050819055505b5b610bf4565b6002600581111561092157610920611225565b5b8460050160009054906101000a900460ff16600581111561094557610944611225565b5b03610a66576001861461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490611b05565b60405180910390fd5b8c80156109975750805b156109ce5760038460050160006101000a81548160ff021916908360058111156109c4576109c3611225565b5b0217905550610a61565b6002836002015410610a435760048460050160006101000a81548160ff02191690836005811115610a0257610a01611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610a369190611a8b565b60405180910390a1610a60565b6001836002016000828254610a5891906117fe565b925050819055505b5b610bf3565b60036005811115610a7a57610a79611225565b5b8460050160009054906101000a900460ff166005811115610a9e57610a9d611225565b5b03610bf25760028614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90611b71565b60405180910390fd5b8c8015610af05750805b15610b5e5760058460050160006101000a81548160ff02191690836005811115610b1d57610b1c611225565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b87604051610b5191906113f8565b60405180910390a1610bf1565b6002836002015410610bd35760048460050160006101000a81548160ff02191690836005811115610b9257610b91611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610bc69190611a8b565b60405180910390a1610bf0565b6001836002016000828254610be891906117fe565b925050819055505b5b5b5b5b60016005811115610c0857610c07611225565b5b8460050160009054906101000a900460ff166005811115610c2c57610c2b611225565b5b03610c5257610c4d876000600a8760010154610c489190611bc0565b610f4e565b610d0c565b60026005811115610c6657610c65611225565b5b8460050160009054906101000a900460ff166005811115610c8a57610c89611225565b5b03610cb057610cab876001600a8760010154610ca69190611bc0565b610f4e565b610d0b565b60036005811115610cc457610cc3611225565b5b8460050160009054906101000a900460ff166005811115610ce857610ce7611225565b5b03610d0a57610d09876002600a8760010154610d049190611bc0565b610f4e565b5b5b5b505050505050505b505050505050565b60015481565b600080600080848152602001908152602001600020905060006005811115610d4d57610d4c611225565b5b8160050160009054906101000a900460ff166005811115610d7157610d70611225565b5b14610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890611c63565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e42919061164a565b8260070154600a610e539190611991565b1015905060006301e133808360040154610e6d91906117fe565b4211905081610ef8578015610eec5760048360050160006101000a81548160ff02191690836005811115610ea457610ea3611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610ed89190611cf5565b60405180910390a160009350505050610f49565b60009350505050610f49565b60018360050160006101000a81548160ff02191690836005811115610f2057610f1f611225565b5b0217905550610f41856000600a8660010154610f3c9190611bc0565b610f4e565b600193505050505b919050565b6000806000858152602001908152602001600020905081816002016000828254610f7891906117ca565b9250508190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637fcf6759848460030154856008018860038110610fd957610fd86116ee565b5b600302016000015460068960038110610ff557610ff46116ee565b5b60020201600c8a6003811061100d5761100c6116ee565b5b6002020160028b60038110611025576110246116ee565b5b015460058c6003811061103b5761103a6116ee565b5b602091828204019190069054906101000a900460ff1660018e8e8e60405160200161106893929190611d23565b6040516020818303038152906040526040518a63ffffffff1660e01b815260040161109a989796959493929190611ecf565b60206040518083038185885af11580156110b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110dd919061164a565b905060008260080185600381106110f7576110f66116ee565b5b6003020160010160018160018154018082558091505003906000526020600020906003020190508181600001819055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c6734798683604051611158929190611f56565b60405180910390a1505050505050565b600080fd5b600080fd5b6000819050919050565b61118581611172565b811461119057600080fd5b50565b6000813590506111a28161117c565b92915050565b6000602082840312156111be576111bd611168565b5b60006111cc84828501611193565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611200826111d5565b9050919050565b611210816111f5565b82525050565b61121f81611172565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061126557611264611225565b5b50565b600081905061127682611254565b919050565b600061128682611268565b9050919050565b6112968161127b565b82525050565b600060e0820190506112b1600083018a611207565b6112be6020830189611216565b6112cb6040830188611216565b6112d86060830187611216565b6112e56080830186611216565b6112f260a083018561128d565b6112ff60c0830184611216565b98975050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126113305761132f61130b565b5b8235905067ffffffffffffffff81111561134d5761134c611310565b5b60208301915083600182028301111561136957611368611315565b5b9250929050565b60008060008060006080868803121561138c5761138b611168565b5b600086013567ffffffffffffffff8111156113aa576113a961116d565b5b6113b68882890161131a565b955095505060206113c988828901611193565b93505060406113da88828901611193565b92505060606113eb88828901611193565b9150509295509295909350565b600060208201905061140d6000830184611216565b92915050565b6000806040838503121561142a57611429611168565b5b600061143885828601611193565b925050602061144985828601611193565b9150509250929050565b60008115159050919050565b61146881611453565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b60008083601f8401126114a1576114a061130b565b5b8235905067ffffffffffffffff8111156114be576114bd611310565b5b6020830191508360018202830111156114da576114d9611315565b5b9250929050565b60008060008060008060a087890312156114fe576114fd611168565b5b600061150c89828a01611476565b965050602061151d89828a01611476565b955050604061152e89828a01611193565b945050606061153f89828a01611193565b935050608087013567ffffffffffffffff8111156115605761155f61116d565b5b61156c89828a0161148b565b92509250509295509295509295565b61158481611453565b82525050565b600060208201905061159f600083018461157b565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006115e283856115a5565b93506115ef8385846115b6565b6115f8836115c5565b840190509392505050565b60006040820190506116186000830186611207565b818103602083015261162b8184866115d6565b9050949350505050565b6000815190506116448161117c565b92915050565b6000602082840312156116605761165f611168565b5b600061166e84828501611635565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b182611172565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e3576116e2611677565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020820190506117326000830184611207565b92915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006117946023836115a5565b915061179f82611738565b604082019050919050565b600060208201905081810360008301526117c381611787565b9050919050565b60006117d582611172565b91506117e083611172565b92508282039050818111156117f8576117f7611677565b5b92915050565b600061180982611172565b915061181483611172565b925082820190508082111561182c5761182b611677565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061188e6031836115a5565b915061189982611832565b604082019050919050565b600060208201905081810360008301526118bd81611881565b9050919050565b6000806000606084860312156118dd576118dc611168565b5b60006118eb86828701611193565b93505060206118fc86828701611193565b925050604061190d86828701611193565b9150509250925092565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b600061194d600e836115a5565b915061195882611917565b602082019050919050565b60006040820190506119786000830184611216565b818103602083015261198981611940565b905092915050565b600061199c82611172565b91506119a783611172565b92508282026119b581611172565b915082820484148315176119cc576119cb611677565b5b5092915050565b7f5374616765203020696e646578206d69736d6174636800000000000000000000600082015250565b6000611a096016836115a5565b9150611a14826119d3565b602082019050919050565b60006020820190508181036000830152611a38816119fc565b9050919050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000611a756014836115a5565b9150611a8082611a3f565b602082019050919050565b6000604082019050611aa06000830184611216565b8181036020830152611ab181611a68565b905092915050565b7f5374616765203120696e646578206d69736d6174636800000000000000000000600082015250565b6000611aef6016836115a5565b9150611afa82611ab9565b602082019050919050565b60006020820190508181036000830152611b1e81611ae2565b9050919050565b7f5374616765203220696e646578206d69736d6174636800000000000000000000600082015250565b6000611b5b6016836115a5565b9150611b6682611b25565b602082019050919050565b60006020820190508181036000830152611b8a81611b4e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611bcb82611172565b9150611bd683611172565b925082611be657611be5611b91565b5b828204905092915050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b6000611c4d602b836115a5565b9150611c5882611bf1565b604082019050919050565b60006020820190508181036000830152611c7c81611c40565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b6000611cdf602d836115a5565b9150611cea82611c83565b604082019050919050565b6000604082019050611d0a6000830184611216565b8181036020830152611d1b81611cd2565b905092915050565b6000606082019050611d386000830186611216565b611d456020830185611216565b611d526040830184611216565b949350505050565b600060029050919050565b600081905092915050565b6000819050919050565b611d8381611172565b82525050565b6000611d958383611d7a565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b6000611dcb611dc683611da1565b611dae565b9050919050565b6000611dde8254611db8565b9050919050565b6000600182019050919050565b611dfb81611d5a565b611e058184611d65565b9250611e1082611d70565b8060005b83811015611e4857611e2582611dd2565b611e2f8782611d89565b9650611e3a83611de5565b925050600181019050611e14565b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e8a578082015181840152602081019050611e6f565b60008484015250505050565b6000611ea182611e50565b611eab8185611e5b565b9350611ebb818560208601611e6c565b611ec4816115c5565b840191505092915050565b600061014082019050611ee5600083018b611216565b611ef2602083018a611216565b611eff6040830189611df2565b611f0c6080830188611df2565b611f1960c0830187611216565b611f2660e083018661157b565b611f3461010083018561157b565b818103610120830152611f478184611e96565b90509998505050505050505050565b6000604082019050611f6b6000830185611216565b611f786020830184611216565b939250505056fea26469706673582212204637e347131d9089dc4337e619fb499a3849918f37903c2d95690294ee5f9f6c64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106100555760003560e01c8063013cf08b1461005a5780635d4d20471461009d578063a3bb24cc146100cd578063b4e6a1d5146100f6578063da35c6641461011f578063ea923e631461014a575b600080fd5b34801561006657600080fd5b50610081600480360381019061007c91906111a8565b610187565b604051610094979695949392919061129c565b60405180910390f35b6100b760048036038101906100b29190611370565b6101f6565b6040516100c491906113f8565b60405180910390f35b3480156100d957600080fd5b506100f460048036038101906100ef9190611413565b61039d565b005b34801561010257600080fd5b5061011d600480360381019061011891906114e1565b610551565b005b34801561012b57600080fd5b50610134610d1c565b60405161014191906113f8565b60405180910390f35b34801561015657600080fd5b50610171600480360381019061016c91906111a8565b610d22565b60405161017e919061158a565b60405180910390f35b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060070154905087565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ff8692403389896040518463ffffffff1660e01b815260040161025693929190611603565b6020604051808303816000875af1158015610275573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610299919061164a565b9050600160008154809291906102ae906116a6565b9190505591506000806000848152602001908152602001600020905081816003018190555042816004018190555085816008016000600381106102f4576102f36116ee565b5b60030201600001819055508481600801600160038110610317576103166116ee565b5b6003020160000181905550838160080160026003811061033a576103396116ee565b5b6003020160000181905550348160010181905550806001015481600201819055507f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e8360405161038a91906113f8565b60405180910390a1505095945050505050565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016103f7919061171d565b602060405180830381865afa158015610414573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610438919061164a565b1015610479576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610470906117aa565b60405180910390fd5b600080600084815260200190815260200160002090508060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548160070160008282546104e491906117ca565b92505081905550818160060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508181600701600082825461054591906117fe565b92505081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906118a4565b60405180910390fd5b600080600084848101906105f391906118c4565b925092509250600080600085815260200190815260200160002090508861069c5760048160050160006101000a81548160ff0219169083600581111561063c5761063b611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb846040516106709190611963565b60405180910390a18181600201600082825461068c91906117fe565b9250508190555050505050610d14565b60008160080184600381106106b4576106b36116ee565b5b600302019050600081600101600183600101805490506106d491906117ca565b815481106106e5576106e46116ee565b5b9060005260206000209060030201905089816001018190555088816002018190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610774573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610798919061164a565b8a8c6107a491906117fe565b60026107b09190611991565b10159050600160058111156107c8576107c7611225565b5b8460050160009054906101000a900460ff1660058111156107ec576107eb611225565b5b0361090d5760008614610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082b90611a1f565b60405180910390fd5b8c801561083e5750805b156108755760028460050160006101000a81548160ff0219169083600581111561086b5761086a611225565b5b0217905550610908565b60028360020154106108ea5760048460050160006101000a81548160ff021916908360058111156108a9576108a8611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb876040516108dd9190611a8b565b60405180910390a1610907565b60018360020160008282546108ff91906117fe565b925050819055505b5b610bf4565b6002600581111561092157610920611225565b5b8460050160009054906101000a900460ff16600581111561094557610944611225565b5b03610a66576001861461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490611b05565b60405180910390fd5b8c80156109975750805b156109ce5760038460050160006101000a81548160ff021916908360058111156109c4576109c3611225565b5b0217905550610a61565b6002836002015410610a435760048460050160006101000a81548160ff02191690836005811115610a0257610a01611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610a369190611a8b565b60405180910390a1610a60565b6001836002016000828254610a5891906117fe565b925050819055505b5b610bf3565b60036005811115610a7a57610a79611225565b5b8460050160009054906101000a900460ff166005811115610a9e57610a9d611225565b5b03610bf25760028614610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90611b71565b60405180910390fd5b8c8015610af05750805b15610b5e5760058460050160006101000a81548160ff02191690836005811115610b1d57610b1c611225565b5b02179055507fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b87604051610b5191906113f8565b60405180910390a1610bf1565b6002836002015410610bd35760048460050160006101000a81548160ff02191690836005811115610b9257610b91611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb87604051610bc69190611a8b565b60405180910390a1610bf0565b6001836002016000828254610be891906117fe565b925050819055505b5b5b5b5b60016005811115610c0857610c07611225565b5b8460050160009054906101000a900460ff166005811115610c2c57610c2b611225565b5b03610c5257610c4d876000600a8760010154610c489190611bc0565b610f4e565b610d0c565b60026005811115610c6657610c65611225565b5b8460050160009054906101000a900460ff166005811115610c8a57610c89611225565b5b03610cb057610cab876001600a8760010154610ca69190611bc0565b610f4e565b610d0b565b60036005811115610cc457610cc3611225565b5b8460050160009054906101000a900460ff166005811115610ce857610ce7611225565b5b03610d0a57610d09876002600a8760010154610d049190611bc0565b610f4e565b5b5b5b505050505050505b505050505050565b60015481565b600080600080848152602001908152602001600020905060006005811115610d4d57610d4c611225565b5b8160050160009054906101000a900460ff166005811115610d7157610d70611225565b5b14610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890611c63565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e42919061164a565b8260070154600a610e539190611991565b1015905060006301e133808360040154610e6d91906117fe565b4211905081610ef8578015610eec5760048360050160006101000a81548160ff02191690836005811115610ea457610ea3611225565b5b02179055507f2a15f4605f8e68cbaccd2234253a8189163d500a6f60c1751405443ca1562beb85604051610ed89190611cf5565b60405180910390a160009350505050610f49565b60009350505050610f49565b60018360050160006101000a81548160ff02191690836005811115610f2057610f1f611225565b5b0217905550610f41856000600a8660010154610f3c9190611bc0565b610f4e565b600193505050505b919050565b6000806000858152602001908152602001600020905081816002016000828254610f7891906117ca565b9250508190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637fcf6759848460030154856008018860038110610fd957610fd86116ee565b5b600302016000015460068960038110610ff557610ff46116ee565b5b60020201600c8a6003811061100d5761100c6116ee565b5b6002020160028b60038110611025576110246116ee565b5b015460058c6003811061103b5761103a6116ee565b5b602091828204019190069054906101000a900460ff1660018e8e8e60405160200161106893929190611d23565b6040516020818303038152906040526040518a63ffffffff1660e01b815260040161109a989796959493929190611ecf565b60206040518083038185885af11580156110b8573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110dd919061164a565b905060008260080185600381106110f7576110f66116ee565b5b6003020160010160018160018154018082558091505003906000526020600020906003020190508181600001819055507f4c14e16a98683e5b8bd70d51192048d0499fb3999b27ff1e9dce7e4a2c6734798683604051611158929190611f56565b60405180910390a1505050505050565b600080fd5b600080fd5b6000819050919050565b61118581611172565b811461119057600080fd5b50565b6000813590506111a28161117c565b92915050565b6000602082840312156111be576111bd611168565b5b60006111cc84828501611193565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611200826111d5565b9050919050565b611210816111f5565b82525050565b61121f81611172565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061126557611264611225565b5b50565b600081905061127682611254565b919050565b600061128682611268565b9050919050565b6112968161127b565b82525050565b600060e0820190506112b1600083018a611207565b6112be6020830189611216565b6112cb6040830188611216565b6112d86060830187611216565b6112e56080830186611216565b6112f260a083018561128d565b6112ff60c0830184611216565b98975050505050505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126113305761132f61130b565b5b8235905067ffffffffffffffff81111561134d5761134c611310565b5b60208301915083600182028301111561136957611368611315565b5b9250929050565b60008060008060006080868803121561138c5761138b611168565b5b600086013567ffffffffffffffff8111156113aa576113a961116d565b5b6113b68882890161131a565b955095505060206113c988828901611193565b93505060406113da88828901611193565b92505060606113eb88828901611193565b9150509295509295909350565b600060208201905061140d6000830184611216565b92915050565b6000806040838503121561142a57611429611168565b5b600061143885828601611193565b925050602061144985828601611193565b9150509250929050565b60008115159050919050565b61146881611453565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b60008083601f8401126114a1576114a061130b565b5b8235905067ffffffffffffffff8111156114be576114bd611310565b5b6020830191508360018202830111156114da576114d9611315565b5b9250929050565b60008060008060008060a087890312156114fe576114fd611168565b5b600061150c89828a01611476565b965050602061151d89828a01611476565b955050604061152e89828a01611193565b945050606061153f89828a01611193565b935050608087013567ffffffffffffffff8111156115605761155f61116d565b5b61156c89828a0161148b565b92509250509295509295509295565b61158481611453565b82525050565b600060208201905061159f600083018461157b565b92915050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006115e283856115a5565b93506115ef8385846115b6565b6115f8836115c5565b840190509392505050565b60006040820190506116186000830186611207565b818103602083015261162b8184866115d6565b9050949350505050565b6000815190506116448161117c565b92915050565b6000602082840312156116605761165f611168565b5b600061166e84828501611635565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b182611172565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e3576116e2611677565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020820190506117326000830184611207565b92915050565b7f53656e6465722068617320696e73756666696369656e74205245502062616c6160008201527f6e63650000000000000000000000000000000000000000000000000000000000602082015250565b60006117946023836115a5565b915061179f82611738565b604082019050919050565b600060208201905081810360008301526117c381611787565b9050919050565b60006117d582611172565b91506117e083611172565b92508282039050818111156117f8576117f7611677565b5b92915050565b600061180982611172565b915061181483611172565b925082820190508082111561182c5761182b611677565b5b92915050565b7f6f6e56616c6964617465206d6179206f6e6c792062652063616c6c656420627960008201527f207468652044414f20636f6e7472616374000000000000000000000000000000602082015250565b600061188e6031836115a5565b915061189982611832565b604082019050919050565b600060208201905081810360008301526118bd81611881565b9050919050565b6000806000606084860312156118dd576118dc611168565b5b60006118eb86828701611193565b93505060206118fc86828701611193565b925050604061190d86828701611193565b9150509250925092565b7f51756f72756d206e6f74206d6574000000000000000000000000000000000000600082015250565b600061194d600e836115a5565b915061195882611917565b602082019050919050565b60006040820190506119786000830184611216565b818103602083015261198981611940565b905092915050565b600061199c82611172565b91506119a783611172565b92508282026119b581611172565b915082820484148315176119cc576119cb611677565b5b5092915050565b7f5374616765203020696e646578206d69736d6174636800000000000000000000600082015250565b6000611a096016836115a5565b9150611a14826119d3565b602082019050919050565b60006020820190508181036000830152611a38816119fc565b9050919050565b7f526574727920636f756e74206578636565646564000000000000000000000000600082015250565b6000611a756014836115a5565b9150611a8082611a3f565b602082019050919050565b6000604082019050611aa06000830184611216565b8181036020830152611ab181611a68565b905092915050565b7f5374616765203120696e646578206d69736d6174636800000000000000000000600082015250565b6000611aef6016836115a5565b9150611afa82611ab9565b602082019050919050565b60006020820190508181036000830152611b1e81611ae2565b9050919050565b7f5374616765203220696e646578206d69736d6174636800000000000000000000600082015250565b6000611b5b6016836115a5565b9150611b6682611b25565b602082019050919050565b60006020820190508181036000830152611b8a81611b4e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611bcb82611172565b9150611bd683611172565b925082611be657611be5611b91565b5b828204905092915050565b7f4174746573746174696f6e206f6e6c79207065727461696e7320746f2050726f60008201527f706f73616c207374616765000000000000000000000000000000000000000000602082015250565b6000611c4d602b836115a5565b9150611c5882611bf1565b604082019050919050565b60006020820190508181036000830152611c7c81611c40565b9050919050565b7f4578706972656420776974686f7574206d656574696e6720617474657374617460008201527f696f6e207468726573686f6c6400000000000000000000000000000000000000602082015250565b6000611cdf602d836115a5565b9150611cea82611c83565b604082019050919050565b6000604082019050611d0a6000830184611216565b8181036020830152611d1b81611cd2565b905092915050565b6000606082019050611d386000830186611216565b611d456020830185611216565b611d526040830184611216565b949350505050565b600060029050919050565b600081905092915050565b6000819050919050565b611d8381611172565b82525050565b6000611d958383611d7a565b60208301905092915050565b60008160001c9050919050565b6000819050919050565b6000611dcb611dc683611da1565b611dae565b9050919050565b6000611dde8254611db8565b9050919050565b6000600182019050919050565b611dfb81611d5a565b611e058184611d65565b9250611e1082611d70565b8060005b83811015611e4857611e2582611dd2565b611e2f8782611d89565b9650611e3a83611de5565b925050600181019050611e14565b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e8a578082015181840152602081019050611e6f565b60008484015250505050565b6000611ea182611e50565b611eab8185611e5b565b9350611ebb818560208601611e6c565b611ec4816115c5565b840191505092915050565b600061014082019050611ee5600083018b611216565b611ef2602083018a611216565b611eff6040830189611df2565b611f0c6080830188611df2565b611f1960c0830187611216565b611f2660e083018661157b565b611f3461010083018561157b565b818103610120830152611f478184611e96565b90509998505050505050505050565b6000604082019050611f6b6000830185611216565b611f786020830184611216565b939250505056fea26469706673582212204637e347131d9089dc4337e619fb499a3849918f37903c2d95690294ee5f9f6c64736f6c63430008180033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/client/src/components/Proposals.jsx b/client/src/components/Proposals.jsx index ad718cd..e63f831 100644 --- a/client/src/components/Proposals.jsx +++ b/client/src/components/Proposals.jsx @@ -75,6 +75,13 @@ function Proposals() { }); }, [proposalsContract, account, reputation]); + const handleEvaluateAttestation = useCallback(async (proposalIndex) => { + await proposalsContract.current.methods.evaluateAttestation(proposalIndex).send({ + from: account, + gas: 1000000, + }); + }, [proposalsContract, account]); + return ( <> @@ -102,7 +109,13 @@ function Proposals() { {request.attestationTotal.toString()} {request.stage === 0n && ( - + <> + + {' '} + + )} diff --git a/client/src/contract-addresses.json b/client/src/contract-addresses.json index 8036deb..04f0bf0 100644 --- a/client/src/contract-addresses.json +++ b/client/src/contract-addresses.json @@ -3,7 +3,7 @@ "DAO": "0x65B0922fe7F0c4012aa38704071f26aeF6F22650", "Work1": "0x95673D8710A8eD59f8551e9B12509D6812e0623e", "Onboarding": "0xc6b3b8A641c52F7bC13a9D444e1f0759CA3b87b4", - "Proposals": "0x71cb20D63576a0Fa4F620a2E96C73F82848B09e1" + "Proposals": "0x98550F017a8d7B9d759D59c1cA7B8D7B922e1dAf" }, "sepolia": { "DAO": "0x8Cb4ab513A863ac29e855c85064ea53dec7dA24C", diff --git a/ethereum/contract-addresses.json b/ethereum/contract-addresses.json index 8036deb..04f0bf0 100644 --- a/ethereum/contract-addresses.json +++ b/ethereum/contract-addresses.json @@ -3,7 +3,7 @@ "DAO": "0x65B0922fe7F0c4012aa38704071f26aeF6F22650", "Work1": "0x95673D8710A8eD59f8551e9B12509D6812e0623e", "Onboarding": "0xc6b3b8A641c52F7bC13a9D444e1f0759CA3b87b4", - "Proposals": "0x71cb20D63576a0Fa4F620a2E96C73F82848B09e1" + "Proposals": "0x98550F017a8d7B9d759D59c1cA7B8D7B922e1dAf" }, "sepolia": { "DAO": "0x8Cb4ab513A863ac29e855c85064ea53dec7dA24C", diff --git a/ethereum/contracts/DAO.sol b/ethereum/contracts/DAO.sol index 4dd7126..4d89864 100644 --- a/ethereum/contracts/DAO.sol +++ b/ethereum/contracts/DAO.sol @@ -189,6 +189,7 @@ contract DAO is ERC20("Reputation", "REP") { 1_000_000_000 * (stakedFor + stakedAgainst) <= totalSupply() * pool.params.quorumPPB ) { + // TODO: refund fee // TODO: refund stakes // Callback if requested if (pool.callbackOnValidate) { @@ -206,15 +207,7 @@ contract DAO is ERC20("Reputation", "REP") { // A tie is resolved in favor of the validation pool. // This is especially important so that the DAO's first pool can pass, // when no reputation has yet been minted. - // jconsole.log( - // "staked for %d against %d, win ratio %d / %d", - console.log("stakedFor", stakedFor); - console.log("stakedAgainst", stakedAgainst); - console.log( - "winRatio", - pool.params.winRatio[0], - pool.params.winRatio[1] - ); + votePasses = stakedFor * pool.params.winRatio[1] >= (stakedFor + stakedAgainst) * pool.params.winRatio[0]; diff --git a/ethereum/contracts/Proposals.sol b/ethereum/contracts/Proposals.sol index 0a8f5cd..b33e4e5 100644 --- a/ethereum/contracts/Proposals.sol +++ b/ethereum/contracts/Proposals.sol @@ -24,15 +24,15 @@ contract Proposals is DAOContract, IOnValidate { struct Referendum { uint duration; - uint fee; // Each referendum may retry up to 3x Pool[] pools; - uint[3] retryCount; + uint retryCount; } struct Proposal { address sender; uint fee; + uint remainingFee; uint postIndex; uint startTime; Stage stage; @@ -66,9 +66,7 @@ contract Proposals is DAOContract, IOnValidate { proposal.referenda[1].duration = referendum1Duration; proposal.referenda[2].duration = referendum100Duration; proposal.fee = msg.value; - proposal.referenda[0].fee = proposal.fee / 3; - proposal.referenda[1].fee = proposal.fee / 3; - proposal.referenda[2].fee = proposal.fee - (proposal.fee * 2) / 3; + proposal.remainingFee = proposal.fee; emit NewProposal(proposalIndex); } @@ -93,7 +91,7 @@ contract Proposals is DAOContract, IOnValidate { // Whether to redistribute the binding portion of losing stakes in each referendum bool[3] referendaRedistributeLosingStakes = [false, false, true]; // For each referendum, a numerator-denominator pair representing its quorum - uint[2][3] referendaQuora = [[1, 10], [1, 2], [1, 3]]; + uint[2][3] referendaQuora = [[1, 10], [1, 10], [1, 10]]; // Win ratios uint[2][3] referendaWinRatio = [[2, 3], [2, 3], [2, 3]]; @@ -101,24 +99,20 @@ contract Proposals is DAOContract, IOnValidate { /// and to emit an event function initiateValidationPool( uint proposalIndex, - uint referendumIndex + uint referendumIndex, + uint fee ) internal { - uint bindingPercent = referendaBindingPercent[referendumIndex]; - bool redistributeLosingStakes = referendaRedistributeLosingStakes[ - referendumIndex - ]; Proposal storage proposal = proposals[proposalIndex]; - uint poolIndex = dao.initiateValidationPool{ - value: proposal.referenda[referendumIndex].fee - }( + proposal.remainingFee -= fee; + uint poolIndex = dao.initiateValidationPool{value: fee}( proposal.postIndex, proposal.referenda[referendumIndex].duration, referendaQuora[referendumIndex], referendaWinRatio[referendumIndex], - bindingPercent, - redistributeLosingStakes, + referendaBindingPercent[referendumIndex], + referendaRedistributeLosingStakes[referendumIndex], true, - abi.encode(proposalIndex, referendumIndex) + abi.encode(proposalIndex, referendumIndex, fee) ); Pool storage pool = proposal.referenda[referendumIndex].pools.push(); pool.poolIndex = poolIndex; @@ -137,14 +131,16 @@ contract Proposals is DAOContract, IOnValidate { msg.sender == address(dao), "onValidate may only be called by the DAO contract" ); - (uint proposalIndex, uint referendumIndex) = abi.decode( + (uint proposalIndex, uint referendumIndex, uint fee) = abi.decode( callbackData, - (uint, uint) + (uint, uint, uint) ); Proposal storage proposal = proposals[proposalIndex]; if (!quorumMet) { proposal.stage = Stage.Failed; emit ProposalFailed(proposalIndex, "Quorum not met"); + proposal.remainingFee += fee; + // TODO: Refund remaining fee return; } Referendum storage referendum = proposal.referenda[referendumIndex]; @@ -159,45 +155,50 @@ contract Proposals is DAOContract, IOnValidate { // Handle Referendum 0% if (proposal.stage == Stage.Referendum0) { + require(referendumIndex == 0, "Stage 0 index mismatch"); // If vote passes (2/3 majority) and has >= 50% participation if (votePasses && participationAboveThreshold) { proposal.stage = Stage.Referendum1; - } else if (referendum.retryCount[0] >= 3) { + } else if (referendum.retryCount >= 2) { proposal.stage = Stage.Failed; emit ProposalFailed(proposalIndex, "Retry count exceeded"); } else { - referendum.retryCount[0] += 1; + referendum.retryCount += 1; } // Handle Referendum 1% } else if (proposal.stage == Stage.Referendum1) { + require(referendumIndex == 1, "Stage 1 index mismatch"); if (votePasses && participationAboveThreshold) { proposal.stage = Stage.Referendum100; - } else if (referendum.retryCount[1] >= 3) { + } else if (referendum.retryCount >= 2) { proposal.stage = Stage.Failed; emit ProposalFailed(proposalIndex, "Retry count exceeded"); } else { - referendum.retryCount[1] += 1; + referendum.retryCount += 1; } // Handle Referendum 100% } else if (proposal.stage == Stage.Referendum100) { + require(referendumIndex == 2, "Stage 2 index mismatch"); // Note that no retries are attempted for referendum 100% - if (votePasses) { + if (votePasses && participationAboveThreshold) { // TODO: The proposal has passed all referenda and should become "law" // This is an opportunity for some actions to occur // We should at least emit an event proposal.stage = Stage.Accepted; emit ProposalAccepted(proposalIndex); - } else { + } else if (referendum.retryCount >= 2) { proposal.stage = Stage.Failed; - emit ProposalFailed(proposalIndex, "Binding pool was rejected"); + emit ProposalFailed(proposalIndex, "Retry count exceeded"); + } else { + referendum.retryCount += 1; } } if (proposal.stage == Stage.Referendum0) { - initiateValidationPool(proposalIndex, 0); + initiateValidationPool(proposalIndex, 0, proposal.fee / 10); } else if (proposal.stage == Stage.Referendum1) { - initiateValidationPool(proposalIndex, 1); + initiateValidationPool(proposalIndex, 1, proposal.fee / 10); } else if (proposal.stage == Stage.Referendum100) { - initiateValidationPool(proposalIndex, 2); + initiateValidationPool(proposalIndex, 2, proposal.fee / 10); } } @@ -231,7 +232,7 @@ contract Proposals is DAOContract, IOnValidate { // It can only happen once because the stage advances, and we required it above. proposal.stage = Stage.Referendum0; // Initiate validation pool - initiateValidationPool(proposalIndex, 0); + initiateValidationPool(proposalIndex, 0, proposal.fee / 10); return true; } } diff --git a/ethereum/scripts/verify.js b/ethereum/scripts/verify.js index dd37822..a2da231 100644 --- a/ethereum/scripts/verify.js +++ b/ethereum/scripts/verify.js @@ -14,7 +14,6 @@ async function main() { await run('verify:verify', { address: contractAddresses[network].DAO, }); - console.log('Verified DAO contract'); await run('verify:verify', { address: contractAddresses[network].Work1, @@ -23,7 +22,6 @@ async function main() { work1Price, ], }); - console.log('Verified Work1 contract'); await run('verify:verify', { address: contractAddresses[network].Onboarding, @@ -32,7 +30,13 @@ async function main() { onboardingPrice, ], }); - console.log('Verified Onboarding contract'); + + await run('verify:verify', { + address: contractAddresses[network].Proposals, + constructorArguments: [ + contractAddresses[network].DAO, + ], + }); } } // We recommend this pattern to be able to use async/await everywhere diff --git a/ethereum/test/Proposals.js b/ethereum/test/Proposals.js index 1aea448..cecd927 100644 --- a/ethereum/test/Proposals.js +++ b/ethereum/test/Proposals.js @@ -28,7 +28,7 @@ describe('Proposal', () => { true, false, callbackData, - { value: 100 }, + { value: 1000 }, ); await dao.initiateValidationPool( 1, @@ -39,7 +39,7 @@ describe('Proposal', () => { true, false, callbackData, - { value: 100 }, + { value: 1000 }, ); await time.increase(61); await dao.evaluateOutcome(0); @@ -51,12 +51,15 @@ describe('Proposal', () => { } it('Should deploy', async () => { - const { dao, proposals, account1 } = await loadFixture(deploy); + const { + dao, proposals, account1, account2, + } = await loadFixture(deploy); expect(dao).to.exist; expect(proposals).to.exist; expect(await dao.memberCount()).to.equal(2); - expect(await dao.balanceOf(account1)).to.equal(100); - expect(await dao.totalSupply()).to.equal(200); + expect(await dao.balanceOf(account1)).to.equal(1000); + expect(await dao.balanceOf(account2)).to.equal(1000); + expect(await dao.totalSupply()).to.equal(2000); expect(await proposals.proposalCount()).to.equal(0); }); @@ -66,7 +69,6 @@ describe('Proposal', () => { let account1; let account2; let proposal; - let postIndex; beforeEach(async () => { ({ @@ -76,14 +78,10 @@ describe('Proposal', () => { account2, } = await loadFixture(deploy)); - await dao.addPost(account1, 'proposal-content-id'); - postIndex = await dao.postCount() - BigInt(1); - const post = await dao.posts(postIndex); - expect(await post.contentId).to.equal('proposal-content-id'); - await proposals.propose(postIndex, 20, 20, 20, { value: 100 }); + await proposals.propose('proposal-content-id', 20, 20, 20, { value: 100 }); expect(await proposals.proposalCount()).to.equal(1); proposal = await proposals.proposals(0); - expect(proposal.postIndex).to.equal(postIndex); + expect(proposal.postIndex).to.equal(2); expect(proposal.stage).to.equal(0); }); @@ -92,24 +90,24 @@ describe('Proposal', () => { }); it('Can attest for a proposal', async () => { - await proposals.connect(account1).attest(0, 50); + await proposals.connect(account1).attest(0, 200); // Nonbinding, non-encumbering - expect(await dao.balanceOf(account1)).to.equal(100); + expect(await dao.balanceOf(account1)).to.equal(1000); }); describe('Evaluate attestation', () => { it('when threshold is met, advance to referendum 0% binding', async () => { console.log('total REP', await dao.totalSupply()); - await proposals.attest(0, 20); - await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(postIndex); + await proposals.attest(0, 200); + await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); proposal = await proposals.proposals(0); expect(proposal.stage).to.equal(1); }); it('threshold may be met by accumulation of attestations', async () => { - await proposals.connect(account1).attest(0, 10); - await proposals.connect(account2).attest(0, 20); - await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(postIndex); + await proposals.connect(account1).attest(0, 100); + await proposals.connect(account2).attest(0, 100); + await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); proposal = await proposals.proposals(0); expect(proposal.stage).to.equal(1); }); @@ -123,18 +121,236 @@ describe('Proposal', () => { await time.increase(365 * 86400 + 1); // 1 year + 1 second await proposals.evaluateAttestation(0); proposal = await proposals.proposals(0); - expect(proposal.stage).to.equal(4); // Stage.Closed + expect(proposal.stage).to.equal(4); // Stage.Failed }); }); describe('Referendum 0% binding', () => { beforeEach(async () => { - await proposals.attest(0, 20); - await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(postIndex); + await proposals.attest(0, 200); + await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(1); }); - it('', async () => { + it('proposal dies if it fails to meet quorum', async () => { + await time.increase(21); + await expect(dao.evaluateOutcome(2)).to.emit(dao, 'ValidationPoolResolved').withArgs(2, false, false); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); // Stage.Failed + }); + it('referendum retries if it fails to meet participation rate', async () => { + await dao.stake(2, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(1); + }); + + it('referendum retries if it fails to meet win ratio', async () => { + await dao.stake(2, 1000, false); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, false, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(1); + }); + + it('proposal fails if a referendum fails to meet participation rate 3 times', async () => { + await dao.stake(2, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(1); + + await dao.stake(3, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(1); + + await dao.stake(4, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, true, true); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); + }); + + it('advances to next referendum if it meets participation rate and win ratio', async () => { + await dao.stake(2, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + }); + }); + + describe('Referendum 1% binding', () => { + beforeEach(async () => { + await proposals.attest(0, 200); + await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.stake(2, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + console.log('evaluated pool 2'); + }); + + it('proposal dies if it fails to meet quorum', async () => { + await time.increase(21); + await expect(dao.evaluateOutcome(3)).to.emit(dao, 'ValidationPoolResolved').withArgs(3, false, false); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); // Stage.Failed + }); + + it('referendum retries if it fails to meet participation rate', async () => { + await dao.stake(3, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + }); + + it('referendum retries if it fails to meet win ratio', async () => { + await dao.stake(3, 1000, false); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, false, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + }); + + it('proposal fails if a referendum fails to meet participation rate 3 times', async () => { + await dao.stake(3, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + + await dao.stake(4, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(5); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(2); + + await dao.stake(5, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(5)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(5, true, true); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); + }); + + it('advances to next referendum if it meets participation rate and win ratio', async () => { + await dao.stake(3, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + }); + }); + + describe('Referendum 10% binding', () => { + beforeEach(async () => { + await proposals.attest(0, 200); + await expect(proposals.evaluateAttestation(0)).to.emit(dao, 'ValidationPoolInitiated').withArgs(2); + await dao.stake(2, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(2)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(2, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(3); + await dao.stake(3, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(3)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(3, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(4); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + }); + + it('proposal dies if it fails to meet quorum', async () => { + await time.increase(21); + await expect(dao.evaluateOutcome(4)).to.emit(dao, 'ValidationPoolResolved').withArgs(4, false, false); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); // Stage.Failed + }); + + it('referendum retries if it fails to meet participation rate', async () => { + await dao.stake(4, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(5); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + }); + + it('referendum retries if it fails to meet win ratio', async () => { + await dao.stake(4, 1000, false); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, false, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(5); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + }); + + it('proposal fails if a referendum fails to meet participation rate 3 times', async () => { + await dao.stake(4, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(5); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + + await dao.stake(5, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(5)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(5, true, true) + .to.emit(dao, 'ValidationPoolInitiated').withArgs(6); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(3); + + await dao.stake(6, 200, true); + await time.increase(21); + await expect(dao.evaluateOutcome(6)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(6, true, true); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(4); + }); + + it('advances to accepted stage if it meets participation rate and win ratio', async () => { + await dao.connect(account1).stake(4, 1000, true); + await dao.connect(account2).stake(4, 1000, true); + await time.increase(21); + await expect(dao.evaluateOutcome(4)) + .to.emit(dao, 'ValidationPoolResolved').withArgs(4, true, true); + proposal = await proposals.proposals(0); + expect(proposal.stage).to.equal(5); }); }); });