evm-tokenvote

Voting machine using ERC20 tokens as votes.
Log | Files | Refs | README

commit cf01cc4568e2ec89996858a4128e697c6d8d0d2a
parent 96f44662a59f0e50efb792fd8f2040cfa49bbe2a
Author: lash <dev@holbrook.no>
Date:   Mon, 24 Jul 2023 08:39:17 +0100

Implement internal state change proposal, block wait limit

Diffstat:
Apython/CHANGELOG | 9+++++++++
Mpython/evm_tokenvote/data/Voter.bin | 4++--
Mpython/evm_tokenvote/data/Voter.json | 2+-
Mpython/evm_tokenvote/data/Voter.metadata.json | 2+-
Mpython/evm_tokenvote/voter.py | 33+++++++++++++++++++++++++++++++++
Mpython/setup.cfg | 2+-
Apython/tests/test_internal.py | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msolidity/Voter.sol | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
8 files changed, 162 insertions(+), 21 deletions(-)

diff --git a/python/CHANGELOG b/python/CHANGELOG @@ -0,0 +1,9 @@ +- 0.0.3 + * Introduce block wait limit + * Add internal state change proposal mode + * Implement change of block wait limit through (internal) proposal +- 0.0.2 + * Separate option addition from proposal creation +- 0.0.1 + * Create proposals, with our without options + * Vote with ERC20 tokens diff --git a/python/evm_tokenvote/data/Voter.bin b/python/evm_tokenvote/data/Voter.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200379638038062003796833981810160405281019062000037919062000486565b620000416200027f565b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600181908060018154018082558091505060019003906000526020600020906008020160009091909190915060008201518160000155602082015181600101908051906020019062000157929190620002fd565b506040820151816002019080519060200190620001769291906200034f565b50606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548162ffffff021916908362ffffff1602179055506101008201518160070160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101208201518160070160176101000a81548160ff021916908360ff1602179055506101408201518160070160186101000a81548160ff021916908360ff1602179055505050600160048190555083600560006101000a81548160ff0219169083151502179055505050505050620004f8565b60405180610160016040528060008019168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600060ff1681525090565b8280548282559060005260206000209081019282156200033c579160200282015b828111156200033b5782518255916020019190600101906200031e565b5b5090506200034b9190620003a1565b5090565b8280548282559060005260206000209081019282156200038e579160200282015b828111156200038d57825182559160200191906001019062000370565b5b5090506200039d9190620003c0565b5090565b5b80821115620003bc576000816000905550600101620003a2565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200041182620003e4565b9050919050565b620004238162000404565b81146200042f57600080fd5b50565b600081519050620004438162000418565b92915050565b60008115159050919050565b620004608162000449565b81146200046c57600080fd5b50565b600081519050620004808162000455565b92915050565b60008060008060808587031215620004a357620004a2620003df565b5b6000620004b38782880162000432565b9450506020620004c6878288016200046f565b9350506040620004d98782880162000432565b9250506060620004ec8782880162000432565b91505092959194509250565b61328e80620005086000396000f3fe608060405234801561001057600080fd5b506004361061011d576000357c010000000000000000000000000000000000000000000000000000000090048063826d9873116100b4578063ba32941411610083578063ba32941414610318578063c7f758a814610348578063e99a943e14610378578063fc0c546a146103a85761011d565b8063826d98731461026c578063843851911461029c57806386d39cbc146102cc5780638bb52213146102e85761011d565b806341ec6870116100f057806341ec6870146101d05780634bb278f3146101ee578063509bd3371461020c57806370a082311461023c5761011d565b80630121b93f146101225780631ce30927146101525780632e1a7d4d146101825780633ccfd60b146101b2575b600080fd5b61013c60048036038101906101379190612298565b6103c6565b60405161014991906122e0565b60405180910390f35b61016c600480360381019061016791906122fb565b610442565b6040516101799190612354565b60405180910390f35b61019c60048036038101906101979190612298565b61049e565b6040516101a9919061237e565b60405180910390f35b6101ba610530565b6040516101c7919061237e565b60405180910390f35b6101d861088d565b6040516101e59190612686565b60405180910390f35b6101f6610abf565b60405161020391906122e0565b60405180910390f35b610226600480360381019061022191906122fb565b610ccb565b60405161023391906122e0565b60405180910390f35b610256600480360381019061025191906126d4565b610def565b604051610263919061237e565b60405180910390f35b61028660048036038101906102819190612298565b610e07565b60405161029391906122e0565b60405180910390f35b6102b660048036038101906102b19190612298565b610ea3565b6040516102c3919061237e565b60405180910390f35b6102e660048036038101906102e1919061272d565b610ee5565b005b61030260048036038101906102fd9190612799565b610f72565b60405161030f91906122e0565b60405180910390f35b610332600480360381019061032d91906122fb565b611247565b60405161033f919061237e565b60405180910390f35b610362600480360381019061035d9190612298565b611303565b60405161036f9190612686565b60405180910390f35b610392600480360381019061038d9190612805565b6114e0565b60405161039f919061237e565b60405180910390f35b6103b0611771565b6040516103bd9190612867565b60405180910390f35b6000806103f533600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611795565b60016004548154811061040b5761040a612882565b5b90600052602060002090600802019050600281600101805490501061042f57600080fd5b61043a600084610ccb565b915050919050565b6000806001808561045391906128e0565b8154811061046457610463612882565b5b9060005260206000209060080201905080600101838154811061048a57610489612882565b5b906000526020600020015491505092915050565b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214610521576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051890612971565b60405180910390fd5b610529610530565b9050919050565b600080600060606000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600454600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403610644576001600454815481106105d9576105d8612882565b5b90600052602060002090600802019350600060028560070160179054906101000a900460ff161660ff1611610643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063a906129dd565b60405180910390fd5b5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1633826040516024016107189291906129fd565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516107a29190612a97565b6000604051808303816000865af19150503d80600081146107df576040519150601f19603f3d011682016040523d82523d6000602084013e6107e4565b606091505b5080935081945050508261082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082490612afa565b60405180910390fd5b818060200190518101906108419190612b46565b925082610883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087a90612bbf565b60405180910390fd5b8094505050505090565b61089561210b565b60006001600454815481106108ad576108ac612882565b5b90600052602060002090600802019050600060018260070160179054906101000a900460ff161660ff1611610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612c2b565b60405180910390fd5b8060405180610160016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561097d57602002820191906000526020600020905b815481526020019060010190808311610969575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156109d557602002820191906000526020600020905b8154815260200190600101908083116109c1575b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016007820160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016007820160179054906101000a900460ff1660ff1660ff1681526020016007820160189054906101000a900460ff1660ff1660ff168152505091505090565b6000806000600160045481548110610ada57610ad9612882565b5b90600052602060002090600802019150600060028360070160179054906101000a900460ff161660ff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90612c97565b60405180910390fd5b6000610b4f8361196e565b03610b5f57600092505050610cc8565b8160060154431115610bc657600060808360070160179054906101000a900460ff161660ff1614610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc906129dd565b60405180910390fd5b5b610bd4828360050154611c1f565b610c0d5760088260070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff160217905550600190505b60028260070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff160217905550801515600060808460070160179054906101000a900460ff161660ff161115156001600454610c6c9190612cb7565b7f2d899e808be4b1d81a259d3f56d6d5c829a7cc913a35373a29f6363ebbb2c6c38560050154604051610c9f919061237e565b60405180910390a4600160046000828254610cba91906128e0565b925050819055508015925050505b90565b600080610cfa33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611795565b600160045481548110610d1057610d0f612882565b5b90600052602060002090600802019050610d2981611c67565b610d37576000915050610de9565b600081600101805490501115610d915780600101805490508410610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790612d37565b60405180910390fd5b5b610d9b8184611df7565b600081600101805490501115610de35782816002018581548110610dc257610dc1612882565b5b906000526020600020016000828254610ddb91906128e0565b925050819055505b60019150505b92915050565b60066020528060005260406000206000915090505481565b600080610e3633600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611795565b600160045481548110610e4c57610e4b612882565b5b90600052602060002090600802019050610e6581611c67565b610e73576000915050610e9e565b82816003016000828254610e8791906128e0565b92505081905550610e988184611df7565b60019150505b919050565b60008060018084610eb491906128e0565b81548110610ec557610ec4612882565b5b906000526020600020906008020190508060010180549050915050919050565b600060018084610ef591906128e0565b81548110610f0657610f05612882565b5b90600052602060002090600802019050806001018290806001815401808255809150506001900390600052602060002001600090919091909150558060020160009080600181540180825580915050600190039060005260206000200160009091909190915055505050565b6000806000806000806000806001808b610f8c91906128e0565b81548110610f9d57610f9c612882565b5b90600052602060002090600802019650600060408860070160179054906101000a900460ff161660ff1603611014574387600601541115611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a906129dd565b60405180910390fd5b5b600060048860070160179054906101000a900460ff161660ff161115611044576000975050505050505050611241565b60008760010180549050036110935760048760070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff1602179055506001975050505050505050611241565b8660070160189054906101000a900460ff169150866001018054905089836110bb9190612d57565b60ff1611156110da578187600101805490506110d79190612d8c565b98505b81896110e69190612d57565b98508660070160179054906101000a900460ff1690508195505b8860ff168660ff16101561118f57866002018660ff168154811061112757611126612882565b5b9060005260206000200154925060008311801561114357508383145b156111535760108117905061116d565b8383111561116c578293508560ff169450601019811690505b5b60018261117a9190612d57565b9150858061118790612dc1565b965050611100565b818760070160186101000a81548160ff021916908360ff160217905550808760070160176101000a81548160ff021916908360ff16021790555086600101805490508760070160189054906101000a900460ff1660ff161061121c5760048760070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff1602179055505b600060048860070160179054906101000a900460ff161660ff16119750505050505050505b92915050565b6000806001808561125891906128e0565b8154811061126957611268612882565b5b9060005260206000209060080201905060008160010180549050036112d857600083146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612e36565b60405180910390fd5b80600501549150506112fd565b8060020183815481106112ee576112ed612882565b5b90600052602060002001549150505b92915050565b61130b61210b565b6001808361131991906128e0565b8154811061132a57611329612882565b5b906000526020600020906008020160405180610160016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561139d57602002820191906000526020600020905b815481526020019060010190808311611389575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156113f557602002820191906000526020600020905b8154815260200190600101908083116113e1575b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016007820160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016007820160179054906101000a900460ff1660ff1660ff1681526020016007820160189054906101000a900460ff1660ff1660ff16815250509050919050565b60006114ea61210b565b60008061151933600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611795565b3383610100019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086836000018181525050848360e0019062ffffff16908162ffffff1681525050854361157e91906128e0565b9050808360c00181815250506001805490509150600183610120019060ff16908160ff168152505060018390806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010190805190602001906115f8929190612189565b5060408201518160020190805190602001906116159291906121d6565b50606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548162ffffff021916908362ffffff1602179055506101008201518160070160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101208201518160070160176101000a81548160ff021916908360ff1602179055506101408201518160070160186101000a81548160ff021916908360ff160217905550505061171b6001838154811061170857611707612882565b5b906000526020600020906008020161196e565b8360800181815250506001826117319190612cb7565b8562ffffff16827f5a41400aa51d78e9e5ca645b0d045817eaa7d90e4344d773fdbe24ffb183d3ce60405160405180910390a48193505050509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117d457505061196a565b8273ffffffffffffffffffffffffffffffffffffffff16846040516024016117fc9190612867565b6040516020818303038152906040527f3ef25013000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516118869190612a97565b6000604051808303816000865af19150503d80600081146118c3576040519150601f19603f3d011682016040523d82523d6000602084013e6118c8565b606091505b50809250819350505081611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190890612ea2565b60405180910390fd5b808060200190518101906119259190612b46565b915081611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612f0e565b60405180910390fd5b50505b5050565b600080606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611a3d9190612a97565b6000604051808303816000865af19150503d8060008114611a7a576040519150601f19603f3d011682016040523d82523d6000602084013e611a7f565b606091505b50809350819450505082611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90612afa565b60405180910390fd5b81806020019051810190611adc9190612f43565b905060008111611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1890612fbc565b60405180910390fd5b6000856004015403611b3b57808560040181905550611c13565b84600401548114611c125760208560070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff16021790555060028560070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff160217905550600560009054906101000a900460ff1615611c1157600160046000828254611bce91906128e0565b9250508190555060808560070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff16021790555060009350505050611c1a565b5b5b8093505050505b919050565b600080620f424083611c319190612fdc565b90508360070160009054906101000a900462ffffff1662ffffff16846004015482611c5c919061304d565b101591505092915050565b60008060018360070160179054906101000a900460ff161660ff1611611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb9906130ca565b60405180910390fd5b6000611ccd8361196e565b03611cdb5760009050611df2565b43826006015411611d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1890613136565b60405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611ded57600454600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de3906131a2565b60405180910390fd5b5b600190505b919050565b6000606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16333085604051602401611e4793929190613221565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611ed19190612a97565b6000604051808303816000865af19150503d8060008114611f0e576040519150601f19603f3d011682016040523d82523d6000602084013e611f13565b606091505b50809250819350505081611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390612afa565b60405180910390fd5b80806020019051810190611f709190612b46565b915081611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa990612bbf565b60405180910390fd5b600454600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204791906128e0565b925050819055508284600501600082825461206291906128e0565b92505081905550612077848560050154611c1f565b156121055761208a848560030154611c1f565b156120c35760406080178460070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff1602179055505b6002846001018054905010156121045760408460070160178282829054906101000a900460ff161792506101000a81548160ff021916908360ff1602179055505b5b50505050565b60405180610160016040528060008019168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600060ff1681525090565b8280548282559060005260206000209081019282156121c5579160200282015b828111156121c45782518255916020019190600101906121a9565b5b5090506121d29190612223565b5090565b828054828255906000526020600020908101928215612212579160200282015b828111156122115782518255916020019190600101906121f6565b5b50905061221f9190612240565b5090565b5b8082111561223c576000816000905550600101612224565b5090565b5b80821115612259576000816000905550600101612241565b5090565b600080fd5b6000819050919050565b61227581612262565b811461228057600080fd5b50565b6000813590506122928161226c565b92915050565b6000602082840312156122ae576122ad61225d565b5b60006122bc84828501612283565b91505092915050565b60008115159050919050565b6122da816122c5565b82525050565b60006020820190506122f560008301846122d1565b92915050565b600080604083850312156123125761231161225d565b5b600061232085828601612283565b925050602061233185828601612283565b9150509250929050565b6000819050919050565b61234e8161233b565b82525050565b60006020820190506123696000830184612345565b92915050565b61237881612262565b82525050565b6000602082019050612393600083018461236f565b92915050565b6123a28161233b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006123e08383612399565b60208301905092915050565b6000602082019050919050565b6000612404826123a8565b61240e81856123b3565b9350612419836123c4565b8060005b8381101561244a57815161243188826123d4565b975061243c836123ec565b92505060018101905061241d565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61248c81612262565b82525050565b600061249e8383612483565b60208301905092915050565b6000602082019050919050565b60006124c282612457565b6124cc8185612462565b93506124d783612473565b8060005b838110156125085781516124ef8882612492565b97506124fa836124aa565b9250506001810190506124db565b5085935050505092915050565b600062ffffff82169050919050565b61252d81612515565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061255e82612533565b9050919050565b61256e81612553565b82525050565b600060ff82169050919050565b61258a81612574565b82525050565b6000610160830160008301516125a96000860182612399565b50602083015184820360208601526125c182826123f9565b915050604083015184820360408601526125db82826124b7565b91505060608301516125f06060860182612483565b5060808301516126036080860182612483565b5060a083015161261660a0860182612483565b5060c083015161262960c0860182612483565b5060e083015161263c60e0860182612524565b50610100830151612651610100860182612565565b50610120830151612666610120860182612581565b5061014083015161267b610140860182612581565b508091505092915050565b600060208201905081810360008301526126a08184612590565b905092915050565b6126b181612553565b81146126bc57600080fd5b50565b6000813590506126ce816126a8565b92915050565b6000602082840312156126ea576126e961225d565b5b60006126f8848285016126bf565b91505092915050565b61270a8161233b565b811461271557600080fd5b50565b60008135905061272781612701565b92915050565b600080604083850312156127445761274361225d565b5b600061275285828601612283565b925050602061276385828601612718565b9150509250929050565b61277681612574565b811461278157600080fd5b50565b6000813590506127938161276d565b92915050565b600080604083850312156127b0576127af61225d565b5b60006127be85828601612283565b92505060206127cf85828601612784565b9150509250929050565b6127e281612515565b81146127ed57600080fd5b50565b6000813590506127ff816127d9565b92915050565b60008060006060848603121561281e5761281d61225d565b5b600061282c86828701612718565b935050602061283d86828701612283565b925050604061284e868287016127f0565b9150509250925092565b61286181612553565b82525050565b600060208201905061287c6000830184612858565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006128eb82612262565b91506128f683612262565b925082820190508082111561290e5761290d6128b1565b5b92915050565b600082825260208201905092915050565b7f4552525f4d5553545f57495448445241575f414c4c0000000000000000000000600082015250565b600061295b601583612914565b915061296682612925565b602082019050919050565b6000602082019050818103600083015261298a8161294e565b9050919050565b7f4552525f5052454d415455524500000000000000000000000000000000000000600082015250565b60006129c7600d83612914565b91506129d282612991565b602082019050919050565b600060208201905081810360008301526129f6816129ba565b9050919050565b6000604082019050612a126000830185612858565b612a1f602083018461236f565b9392505050565b600081519050919050565b600081905092915050565b60005b83811015612a5a578082015181840152602081019050612a3f565b60008484015250505050565b6000612a7182612a26565b612a7b8185612a31565b9350612a8b818560208601612a3c565b80840191505092915050565b6000612aa38284612a66565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b6000612ae4600983612914565b9150612aef82612aae565b602082019050919050565b60006020820190508181036000830152612b1381612ad7565b9050919050565b612b23816122c5565b8114612b2e57600080fd5b50565b600081519050612b4081612b1a565b92915050565b600060208284031215612b5c57612b5b61225d565b5b6000612b6a84828501612b31565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000612ba9600c83612914565b9150612bb482612b73565b602082019050919050565b60006020820190508181036000830152612bd881612b9c565b9050919050565b7f4552525f4e4f5f43555252454e545f50524f504f53414c000000000000000000600082015250565b6000612c15601783612914565b9150612c2082612bdf565b602082019050919050565b60006020820190508181036000830152612c4481612c08565b9050919050565b7f4552525f414c52454144595f53544154455f46494e414c000000000000000000600082015250565b6000612c81601783612914565b9150612c8c82612c4b565b602082019050919050565b60006020820190508181036000830152612cb081612c74565b9050919050565b6000612cc282612262565b9150612ccd83612262565b9250828203905081811115612ce557612ce46128b1565b5b92915050565b7f4552525f4f5054494f4e5f494e56414c49440000000000000000000000000000600082015250565b6000612d21601283612914565b9150612d2c82612ceb565b602082019050919050565b60006020820190508181036000830152612d5081612d14565b9050919050565b6000612d6282612574565b9150612d6d83612574565b9250828201905060ff811115612d8657612d856128b1565b5b92915050565b6000612d9782612574565b9150612da283612574565b9250828203905060ff811115612dbb57612dba6128b1565b5b92915050565b6000612dcc82612574565b915060ff8203612ddf57612dde6128b1565b5b600182019050919050565b7f4552525f4e4f5f4f5054494f4e53000000000000000000000000000000000000600082015250565b6000612e20600e83612914565b9150612e2b82612dea565b602082019050919050565b60006020820190508181036000830152612e4f81612e13565b9050919050565b7f4552525f52454749535452590000000000000000000000000000000000000000600082015250565b6000612e8c600c83612914565b9150612e9782612e56565b602082019050919050565b60006020820190508181036000830152612ebb81612e7f565b9050919050565b7f4552525f554e415554485f4143434f554e540000000000000000000000000000600082015250565b6000612ef8601283612914565b9150612f0382612ec2565b602082019050919050565b60006020820190508181036000830152612f2781612eeb565b9050919050565b600081519050612f3d8161226c565b92915050565b600060208284031215612f5957612f5861225d565b5b6000612f6784828501612f2e565b91505092915050565b7f4552525f5a45524f5f535550504c590000000000000000000000000000000000600082015250565b6000612fa6600f83612914565b9150612fb182612f70565b602082019050919050565b60006020820190508181036000830152612fd581612f99565b9050919050565b6000612fe782612262565b9150612ff283612262565b925082820261300081612262565b91508282048414831517613017576130166128b1565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061305882612262565b915061306383612262565b9250826130735761307261301e565b5b828204905092915050565b7f4552525f50524f504f53414c5f494e4143544956450000000000000000000000600082015250565b60006130b4601583612914565b91506130bf8261307e565b602082019050919050565b600060208201905081810360008301526130e3816130a7565b9050919050565b7f4552525f444541444c494e450000000000000000000000000000000000000000600082015250565b6000613120600c83612914565b915061312b826130ea565b602082019050919050565b6000602082019050818103600083015261314f81613113565b9050919050565b7f4552525f57495448445241575f46495253540000000000000000000000000000600082015250565b600061318c601283612914565b915061319782613156565b602082019050919050565b600060208201905081810360008301526131bb8161317f565b9050919050565b6000819050919050565b60006131e76131e26131dd84612533565b6131c2565b612533565b9050919050565b60006131f9826131cc565b9050919050565b600061320b826131ee565b9050919050565b61321b81613200565b82525050565b60006060820190506132366000830186612858565b6132436020830185613212565b613250604083018461236f565b94935050505056fea2646970667358221220e2f7f0ebc8e9775df8b3c4cfe737c1850126f915eeca18688bf9da6e7b63465e64736f6c63430008130033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162003bdd38038062003bdd8339818101604052810190620000379190620004b3565b62000041620002a2565b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001819080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001019080519060200190620001579291906200032a565b506040820151816002019080519060200190620001769291906200037c565b50606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548162ffffff021916908362ffffff1602179055506101008201518160070160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101208201518160070160176101000a81548161ffff021916908361ffff1602179055506101408201518160070160196101000a81548160ff021916908360ff16021790555061016082015181600701601a6101000a81548160ff0219169083151502179055505050600160048190555083600560006101000a81548160ff021916908315150217905550505050505062000525565b60405180610180016040528060008019168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff168152602001600060ff1681526020016000151581525090565b82805482825590600052602060002090810192821562000369579160200282015b82811115620003685782518255916020019190600101906200034b565b5b509050620003789190620003ce565b5090565b828054828255906000526020600020908101928215620003bb579160200282015b82811115620003ba5782518255916020019190600101906200039d565b5b509050620003ca9190620003ed565b5090565b5b80821115620003e9576000816000905550600101620003cf565b5090565b5b8082111562000408576000816000905550600101620003ee565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200043e8262000411565b9050919050565b620004508162000431565b81146200045c57600080fd5b50565b600081519050620004708162000445565b92915050565b60008115159050919050565b6200048d8162000476565b81146200049957600080fd5b50565b600081519050620004ad8162000482565b92915050565b60008060008060808587031215620004d057620004cf6200040c565b5b6000620004e0878288016200045f565b9450506020620004f3878288016200049c565b935050604062000506878288016200045f565b925050606062000519878288016200045f565b91505092959194509250565b6136a880620005356000396000f3fe608060405234801561001057600080fd5b5060043610610133576000357c010000000000000000000000000000000000000000000000000000000090048063826d9873116100bf578063ad35e2831161008e578063ad35e2831461035e578063ba3294141461037c578063c7f758a8146103ac578063e99a943e146103dc578063fc0c546a1461040c57610133565b8063826d9873146102b257806384385191146102e257806386d39cbc146103125780638bb522131461032e57610133565b80633ccfd60b116101065780633ccfd60b146101f857806341ec6870146102165780634bb278f314610234578063509bd3371461025257806370a082311461028257610133565b80630121b93f146101385780631ce309271461016857806328e7a520146101985780632e1a7d4d146101c8575b600080fd5b610152600480360381019061014d9190612532565b61042a565b60405161015f919061257a565b60405180910390f35b610182600480360381019061017d9190612595565b6104a6565b60405161018f91906125ee565b60405180910390f35b6101b260048036038101906101ad9190612670565b610502565b6040516101bf91906126e6565b60405180910390f35b6101e260048036038101906101dd9190612532565b61059c565b6040516101ef91906126e6565b60405180910390f35b61020061062e565b60405161020d91906126e6565b60405180910390f35b61021e61098d565b60405161022b9190612a20565b60405180910390f35b61023c610bdf565b604051610249919061257a565b60405180910390f35b61026c60048036038101906102679190612595565b610e3e565b604051610279919061257a565b60405180910390f35b61029c60048036038101906102979190612a6e565b610f62565b6040516102a991906126e6565b60405180910390f35b6102cc60048036038101906102c79190612532565b610f7a565b6040516102d9919061257a565b60405180910390f35b6102fc60048036038101906102f79190612532565b611016565b60405161030991906126e6565b60405180910390f35b61032c60048036038101906103279190612a9b565b611058565b005b61034860048036038101906103439190612b07565b6110e5565b604051610355919061257a565b60405180910390f35b6103666113c9565b60405161037391906126e6565b60405180910390f35b61039660048036038101906103919190612595565b6113cf565b6040516103a391906126e6565b60405180910390f35b6103c660048036038101906103c19190612532565b61148b565b6040516103d39190612a20565b60405180910390f35b6103f660048036038101906103f19190612b47565b611686565b60405161040391906126e6565b60405180910390f35b61041461169e565b6040516104219190612ba9565b60405180910390f35b60008061045933600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166116c2565b60016004548154811061046f5761046e612bc4565b5b90600052602060002090600802019050600281600101805490501061049357600080fd5b61049e600084610e3e565b915050919050565b600080600180856104b79190612c22565b815481106104c8576104c7612bc4565b5b906000526020600020906008020190508060010183815481106104ee576104ed612bc4565b5b906000526020600020015491505092915050565b60008060007f67ca084db32598c571e2ad2dc8b95679c3fa14c63213935dfd8f0a158ff65c57600102870361053657600191505b81610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056d90612cb3565b60405180910390fd5b610583878686600161189b565b905061058f8187611058565b8092505050949350505050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821461061f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061690612d1f565b60405180910390fd5b61062761062e565b9050919050565b600080600060606000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600454600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403610744576001600454815481106106d7576106d6612bc4565b5b90600052602060002090600802019350600060028560070160179054906101000a900461ffff161661ffff1611610743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073a90612d8b565b60405180910390fd5b5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163382604051602401610818929190612dab565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516108a29190612e45565b6000604051808303816000865af19150503d80600081146108df576040519150601f19603f3d011682016040523d82523d6000602084013e6108e4565b606091505b5080935081945050508261092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092490612ea8565b60405180910390fd5b818060200190518101906109419190612ef4565b925082610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097a90612f6d565b60405180910390fd5b8094505050505090565b61099561239b565b60006001600454815481106109ad576109ac612bc4565b5b90600052602060002090600802019050600060018260070160179054906101000a900461ffff161661ffff1611610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090612fd9565b60405180910390fd5b80604051806101800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a7f57602002820191906000526020600020905b815481526020019060010190808311610a6b575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015610ad757602002820191906000526020600020905b815481526020019060010190808311610ac3575b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016007820160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016007820160179054906101000a900461ffff1661ffff1661ffff1681526020016007820160199054906101000a900460ff1660ff1660ff16815260200160078201601a9054906101000a900460ff16151515158152505091505090565b6000806000600160045481548110610bfa57610bf9612bc4565b5b90600052602060002090600802019150600060028360070160179054906101000a900461ffff161661ffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d90613045565b60405180910390fd5b6000610c7183611bb3565b03610c8157600092505050610e3b565b8160060154431115610cea57600060808360070160179054906101000a900461ffff161661ffff1614610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce090612d8b565b60405180910390fd5b5b610cf8828360050154611e6d565b610d345760088260070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff160217905550600190505b60028260070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff16021790555081600701601a9054906101000a900460ff1615610dae57610dad826000015483600101600081548110610d9d57610d9c612bc4565b5b9060005260206000200154611eb5565b5b801515600060808460070160179054906101000a900461ffff161661ffff161115156001600454610ddf9190613065565b7f2d899e808be4b1d81a259d3f56d6d5c829a7cc913a35373a29f6363ebbb2c6c38560050154604051610e1291906126e6565b60405180910390a4600160046000828254610e2d9190612c22565b925050819055508015925050505b90565b600080610e6d33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166116c2565b600160045481548110610e8357610e82612bc4565b5b90600052602060002090600802019050610e9c81611eef565b610eaa576000915050610f5c565b600081600101805490501115610f045780600101805490508410610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa906130e5565b60405180910390fd5b5b610f0e8184612081565b600081600101805490501115610f565782816002018581548110610f3557610f34612bc4565b5b906000526020600020016000828254610f4e9190612c22565b925050819055505b60019150505b92915050565b60086020528060005260406000206000915090505481565b600080610fa933600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166116c2565b600160045481548110610fbf57610fbe612bc4565b5b90600052602060002090600802019050610fd881611eef565b610fe6576000915050611011565b82816003016000828254610ffa9190612c22565b9250508190555061100b8184612081565b60019150505b919050565b600080600180846110279190612c22565b8154811061103857611037612bc4565b5b906000526020600020906008020190508060010180549050915050919050565b6000600180846110689190612c22565b8154811061107957611078612bc4565b5b90600052602060002090600802019050806001018290806001815401808255809150506001900390600052602060002001600090919091909150558060020160009080600181540180825580915050600190039060005260206000200160009091909190915055505050565b6000806000806000806000806001808b6110ff9190612c22565b815481106111105761110f612bc4565b5b90600052602060002090600802019650600060408860070160179054906101000a900461ffff161661ffff1603611189574387600601541115611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90612d8b565b60405180910390fd5b5b600060048860070160179054906101000a900461ffff161661ffff1611156111bb5760009750505050505050506113c3565b600087600101805490500361120d5760048760070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff16021790555060019750505050505050506113c3565b8660070160199054906101000a900460ff169150866001018054905089836112359190613105565b60ff16111561125457818760010180549050611251919061313a565b98505b81896112609190613105565b98508660070160179054906101000a900461ffff1690508195505b8860ff168660ff16101561130a57866002018660ff16815481106112a2576112a1612bc4565b5b906000526020600020015492506000831180156112be57508383145b156112ce576010811790506112e8565b838311156112e7578293508560ff169450601019811690505b5b6001826112f59190613105565b915085806113029061316f565b96505061127b565b818760070160196101000a81548160ff021916908360ff160217905550808760070160176101000a81548161ffff021916908361ffff16021790555086600101805490508760070160199054906101000a900460ff1660ff161061139c5760048760070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff1602179055505b600060048860070160179054906101000a900461ffff161661ffff16119750505050505050505b92915050565b60065481565b600080600180856113e09190612c22565b815481106113f1576113f0612bc4565b5b9060005260206000209060080201905060008160010180549050036114605760008314611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906131e4565b60405180910390fd5b8060050154915050611485565b80600201838154811061147657611475612bc4565b5b90600052602060002001549150505b92915050565b61149361239b565b600180836114a19190612c22565b815481106114b2576114b1612bc4565b5b906000526020600020906008020160405180610180016040529081600082015481526020016001820180548060200260200160405190810160405280929190818152602001828054801561152557602002820191906000526020600020905b815481526020019060010190808311611511575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561157d57602002820191906000526020600020905b815481526020019060010190808311611569575b50505050508152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016007820160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016007820160179054906101000a900461ffff1661ffff1661ffff1681526020016007820160199054906101000a900460ff1660ff1660ff16815260200160078201601a9054906101000a900460ff1615151515815250509050919050565b6000611695848484600061189b565b90509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611701575050611897565b8273ffffffffffffffffffffffffffffffffffffffff16846040516024016117299190612ba9565b6040516020818303038152906040527f3ef25013000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516117b39190612e45565b6000604051808303816000865af19150503d80600081146117f0576040519150601f19603f3d011682016040523d82523d6000602084013e6117f5565b606091505b5080925081935050508161183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590613250565b60405180910390fd5b808060200190518101906118529190612ef4565b915081611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b906132bc565b60405180910390fd5b50505b5050565b60006118a561239b565b600080600060065411156118f9576006548711156118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ef90613328565b60405180910390fd5b5b61192533600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166116c2565b600180805490506119369190613065565b91503383610100019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505087836000018181525050858360e0019062ffffff16908162ffffff1681525050864361199d9190612c22565b9050808360c0018181525050600183610120019061ffff16908161ffff168152505084836101600190151590811515815250506001839080600181540180825580915050600190039060005260206000209060080201600090919091909150600082015181600001556020820151816001019080519060200190611a22929190612423565b506040820151816002019080519060200190611a3f929190612470565b50606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548162ffffff021916908362ffffff1602179055506101008201518160070160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101208201518160070160176101000a81548161ffff021916908361ffff1602179055506101408201518160070160196101000a81548160ff021916908360ff16021790555061016082015181600701601a6101000a81548160ff0219169083151502179055505050611b6860018381548110611b5557611b54612bc4565b5b9060005260206000209060080201611bb3565b836080018181525050818662ffffff16827f5a41400aa51d78e9e5ca645b0d045817eaa7d90e4344d773fdbe24ffb183d3ce60405160405180910390a4819350505050949350505050565b600080606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611c829190612e45565b6000604051808303816000865af19150503d8060008114611cbf576040519150601f19603f3d011682016040523d82523d6000602084013e611cc4565b606091505b50809350819450505082611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490612ea8565b60405180910390fd5b81806020019051810190611d21919061335d565b905060008111611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d906133d6565b60405180910390fd5b6000856004015403611d8057808560040181905550611e61565b84600401548114611e605760208560070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff16021790555060028560070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff160217905550600560009054906101000a900460ff1615611e5f57600160046000828254611e199190612c22565b9250508190555060808560070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff16021790555060009350505050611e68565b5b5b8093505050505b919050565b600080620f424083611e7f91906133f6565b90508360070160009054906101000a900462ffffff1662ffffff16846004015482611eaa9190613467565b101591505092915050565b7f67ca084db32598c571e2ad2dc8b95679c3fa14c63213935dfd8f0a158ff65c576001028203611eeb5780600190046006819055505b5050565b60008060018360070160179054906101000a900461ffff161661ffff1611611f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f43906134e4565b60405180910390fd5b6000611f5783611bb3565b03611f65576000905061207c565b43826006015411611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa290613550565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561207757600454600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d906135bc565b60405180910390fd5b5b600190505b919050565b6000606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163330856040516024016120d19392919061363b565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161215b9190612e45565b6000604051808303816000865af19150503d8060008114612198576040519150601f19603f3d011682016040523d82523d6000602084013e61219d565b606091505b508092508193505050816121e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dd90612ea8565b60405180910390fd5b808060200190518101906121fa9190612ef4565b91508161223c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223390612f6d565b60405180910390fd5b600454600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d19190612c22565b92505081905550828460050160008282546122ec9190612c22565b92505081905550612301848560050154611e6d565b1561239557612314848560030154611e6d565b156123505760406080178460070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff1602179055505b6002846001018054905010156123945760408460070160178282829054906101000a900461ffff161792506101000a81548161ffff021916908361ffff1602179055505b5b50505050565b60405180610180016040528060008019168152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600062ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff168152602001600060ff1681526020016000151581525090565b82805482825590600052602060002090810192821561245f579160200282015b8281111561245e578251825591602001919060010190612443565b5b50905061246c91906124bd565b5090565b8280548282559060005260206000209081019282156124ac579160200282015b828111156124ab578251825591602001919060010190612490565b5b5090506124b991906124da565b5090565b5b808211156124d65760008160009055506001016124be565b5090565b5b808211156124f35760008160009055506001016124db565b5090565b600080fd5b6000819050919050565b61250f816124fc565b811461251a57600080fd5b50565b60008135905061252c81612506565b92915050565b600060208284031215612548576125476124f7565b5b60006125568482850161251d565b91505092915050565b60008115159050919050565b6125748161255f565b82525050565b600060208201905061258f600083018461256b565b92915050565b600080604083850312156125ac576125ab6124f7565b5b60006125ba8582860161251d565b92505060206125cb8582860161251d565b9150509250929050565b6000819050919050565b6125e8816125d5565b82525050565b600060208201905061260360008301846125df565b92915050565b612612816125d5565b811461261d57600080fd5b50565b60008135905061262f81612609565b92915050565b600062ffffff82169050919050565b61264d81612635565b811461265857600080fd5b50565b60008135905061266a81612644565b92915050565b6000806000806080858703121561268a576126896124f7565b5b600061269887828801612620565b94505060206126a987828801612620565b93505060406126ba8782880161251d565b92505060606126cb8782880161265b565b91505092959194509250565b6126e0816124fc565b82525050565b60006020820190506126fb60008301846126d7565b92915050565b61270a816125d5565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60006127488383612701565b60208301905092915050565b6000602082019050919050565b600061276c82612710565b612776818561271b565b93506127818361272c565b8060005b838110156127b2578151612799888261273c565b97506127a483612754565b925050600181019050612785565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127f4816124fc565b82525050565b600061280683836127eb565b60208301905092915050565b6000602082019050919050565b600061282a826127bf565b61283481856127ca565b935061283f836127db565b8060005b8381101561287057815161285788826127fa565b975061286283612812565b925050600181019050612843565b5085935050505092915050565b61288681612635565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128b78261288c565b9050919050565b6128c7816128ac565b82525050565b600061ffff82169050919050565b6128e4816128cd565b82525050565b600060ff82169050919050565b612900816128ea565b82525050565b61290f8161255f565b82525050565b60006101808301600083015161292e6000860182612701565b50602083015184820360208601526129468282612761565b91505060408301518482036040860152612960828261281f565b915050606083015161297560608601826127eb565b50608083015161298860808601826127eb565b5060a083015161299b60a08601826127eb565b5060c08301516129ae60c08601826127eb565b5060e08301516129c160e086018261287d565b506101008301516129d66101008601826128be565b506101208301516129eb6101208601826128db565b50610140830151612a006101408601826128f7565b50610160830151612a15610160860182612906565b508091505092915050565b60006020820190508181036000830152612a3a8184612915565b905092915050565b612a4b816128ac565b8114612a5657600080fd5b50565b600081359050612a6881612a42565b92915050565b600060208284031215612a8457612a836124f7565b5b6000612a9284828501612a59565b91505092915050565b60008060408385031215612ab257612ab16124f7565b5b6000612ac08582860161251d565b9250506020612ad185828601612620565b9150509250929050565b612ae4816128ea565b8114612aef57600080fd5b50565b600081359050612b0181612adb565b92915050565b60008060408385031215612b1e57612b1d6124f7565b5b6000612b2c8582860161251d565b9250506020612b3d85828601612af2565b9150509250929050565b600080600060608486031215612b6057612b5f6124f7565b5b6000612b6e86828701612620565b9350506020612b7f8682870161251d565b9250506040612b908682870161265b565b9150509250925092565b612ba3816128ac565b82525050565b6000602082019050612bbe6000830184612b9a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c2d826124fc565b9150612c38836124fc565b9250828201905080821115612c5057612c4f612bf3565b5b92915050565b600082825260208201905092915050565b7f4552525f494e56414c49445f494e5445524e414c000000000000000000000000600082015250565b6000612c9d601483612c56565b9150612ca882612c67565b602082019050919050565b60006020820190508181036000830152612ccc81612c90565b9050919050565b7f4552525f4d5553545f57495448445241575f414c4c0000000000000000000000600082015250565b6000612d09601583612c56565b9150612d1482612cd3565b602082019050919050565b60006020820190508181036000830152612d3881612cfc565b9050919050565b7f4552525f5052454d415455524500000000000000000000000000000000000000600082015250565b6000612d75600d83612c56565b9150612d8082612d3f565b602082019050919050565b60006020820190508181036000830152612da481612d68565b9050919050565b6000604082019050612dc06000830185612b9a565b612dcd60208301846126d7565b9392505050565b600081519050919050565b600081905092915050565b60005b83811015612e08578082015181840152602081019050612ded565b60008484015250505050565b6000612e1f82612dd4565b612e298185612ddf565b9350612e39818560208601612dea565b80840191505092915050565b6000612e518284612e14565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b6000612e92600983612c56565b9150612e9d82612e5c565b602082019050919050565b60006020820190508181036000830152612ec181612e85565b9050919050565b612ed18161255f565b8114612edc57600080fd5b50565b600081519050612eee81612ec8565b92915050565b600060208284031215612f0a57612f096124f7565b5b6000612f1884828501612edf565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000612f57600c83612c56565b9150612f6282612f21565b602082019050919050565b60006020820190508181036000830152612f8681612f4a565b9050919050565b7f4552525f4e4f5f43555252454e545f50524f504f53414c000000000000000000600082015250565b6000612fc3601783612c56565b9150612fce82612f8d565b602082019050919050565b60006020820190508181036000830152612ff281612fb6565b9050919050565b7f4552525f414c52454144595f53544154455f46494e414c000000000000000000600082015250565b600061302f601783612c56565b915061303a82612ff9565b602082019050919050565b6000602082019050818103600083015261305e81613022565b9050919050565b6000613070826124fc565b915061307b836124fc565b925082820390508181111561309357613092612bf3565b5b92915050565b7f4552525f4f5054494f4e5f494e56414c49440000000000000000000000000000600082015250565b60006130cf601283612c56565b91506130da82613099565b602082019050919050565b600060208201905081810360008301526130fe816130c2565b9050919050565b6000613110826128ea565b915061311b836128ea565b9250828201905060ff81111561313457613133612bf3565b5b92915050565b6000613145826128ea565b9150613150836128ea565b9250828203905060ff81111561316957613168612bf3565b5b92915050565b600061317a826128ea565b915060ff820361318d5761318c612bf3565b5b600182019050919050565b7f4552525f4e4f5f4f5054494f4e53000000000000000000000000000000000000600082015250565b60006131ce600e83612c56565b91506131d982613198565b602082019050919050565b600060208201905081810360008301526131fd816131c1565b9050919050565b7f4552525f52454749535452590000000000000000000000000000000000000000600082015250565b600061323a600c83612c56565b915061324582613204565b602082019050919050565b600060208201905081810360008301526132698161322d565b9050919050565b7f4552525f554e415554485f4143434f554e540000000000000000000000000000600082015250565b60006132a6601283612c56565b91506132b182613270565b602082019050919050565b600060208201905081810360008301526132d581613299565b9050919050565b7f4552525f57414954000000000000000000000000000000000000000000000000600082015250565b6000613312600883612c56565b915061331d826132dc565b602082019050919050565b6000602082019050818103600083015261334181613305565b9050919050565b60008151905061335781612506565b92915050565b600060208284031215613373576133726124f7565b5b600061338184828501613348565b91505092915050565b7f4552525f5a45524f5f535550504c590000000000000000000000000000000000600082015250565b60006133c0600f83612c56565b91506133cb8261338a565b602082019050919050565b600060208201905081810360008301526133ef816133b3565b9050919050565b6000613401826124fc565b915061340c836124fc565b925082820261341a816124fc565b9150828204841483151761343157613430612bf3565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613472826124fc565b915061347d836124fc565b92508261348d5761348c613438565b5b828204905092915050565b7f4552525f50524f504f53414c5f494e4143544956450000000000000000000000600082015250565b60006134ce601583612c56565b91506134d982613498565b602082019050919050565b600060208201905081810360008301526134fd816134c1565b9050919050565b7f4552525f444541444c494e450000000000000000000000000000000000000000600082015250565b600061353a600c83612c56565b915061354582613504565b602082019050919050565b600060208201905081810360008301526135698161352d565b9050919050565b7f4552525f57495448445241575f46495253540000000000000000000000000000600082015250565b60006135a6601283612c56565b91506135b182613570565b602082019050919050565b600060208201905081810360008301526135d581613599565b9050919050565b6000819050919050565b60006136016135fc6135f78461288c565b6135dc565b61288c565b9050919050565b6000613613826135e6565b9050919050565b600061362582613608565b9050919050565b6136358161361a565b82525050565b60006060820190506136506000830186612b9a565b61365d602083018561362c565b61366a60408301846126d7565b94935050505056fea2646970667358221220d5fa25e50c5241435b72b74c0a406160968750ce1807222162b33247ab8c3daf64736f6c63430008130033 +\ No newline at end of file diff --git a/python/evm_tokenvote/data/Voter.json b/python/evm_tokenvote/data/Voter.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_protectSupply","type":"bool"},{"internalType":"address","name":"_voterRegistry","type":"address"},{"internalType":"address","name":"_proposerRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_blockDeadline","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteTargetPpm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"indexed":true,"internalType":"bool","name":"_cancelled","type":"bool"},{"indexed":true,"internalType":"bool","name":"_insufficient","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_totalVote","type":"uint256"}],"name":"ProposalCompleted","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"bytes32","name":"_optionDescription","type":"bytes32"}],"name":"addOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"uint8","name":"scanCursor","type":"uint8"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"getOption","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"uint8","name":"scanCursor","type":"uint8"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"optionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIndex","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"scan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteOption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_protectSupply","type":"bool"},{"internalType":"address","name":"_voterRegistry","type":"address"},{"internalType":"address","name":"_proposerRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_blockDeadline","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteTargetPpm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"indexed":true,"internalType":"bool","name":"_cancelled","type":"bool"},{"indexed":true,"internalType":"bool","name":"_insufficient","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_totalVote","type":"uint256"}],"name":"ProposalCompleted","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"bytes32","name":"_optionDescription","type":"bytes32"}],"name":"addOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockWaitLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint16","name":"state","type":"uint16"},{"internalType":"uint8","name":"scanCursor","type":"uint8"},{"internalType":"bool","name":"internals","type":"bool"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"getOption","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint16","name":"state","type":"uint16"},{"internalType":"uint8","name":"scanCursor","type":"uint8"},{"internalType":"bool","name":"internals","type":"bool"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"optionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"bytes32","name":"_option","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"proposeInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIndex","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"scan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteOption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/evm_tokenvote/data/Voter.metadata.json b/python/evm_tokenvote/data/Voter.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_protectSupply","type":"bool"},{"internalType":"address","name":"_voterRegistry","type":"address"},{"internalType":"address","name":"_proposerRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_blockDeadline","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteTargetPpm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"indexed":true,"internalType":"bool","name":"_cancelled","type":"bool"},{"indexed":true,"internalType":"bool","name":"_insufficient","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_totalVote","type":"uint256"}],"name":"ProposalCompleted","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"bytes32","name":"_optionDescription","type":"bytes32"}],"name":"addOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"uint8","name":"scanCursor","type":"uint8"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"getOption","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"uint8","name":"scanCursor","type":"uint8"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"optionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIndex","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"scan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteOption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"Voter.sol":"ERC20Vote"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"Voter.sol":{"keccak256":"0x2d5e8f6eee6bc6494bab98acebc286031945ac3e3ede3bf2bfcd2ac046c863a3","license":"AGPL-3.0-or-later","urls":["bzz-raw://9faf11bc4b75e068ce9b41db27133a75d1204943fb030c75aa38d7099ad3ff39","dweb:/ipfs/QmYF3fZpCWvjkRFKWijJtK9tN8GrXgXw77J9UQy9pD4PUF"]}},"version":1} +{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_protectSupply","type":"bool"},{"internalType":"address","name":"_voterRegistry","type":"address"},{"internalType":"address","name":"_proposerRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_blockDeadline","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteTargetPpm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"indexed":true,"internalType":"bool","name":"_cancelled","type":"bool"},{"indexed":true,"internalType":"bool","name":"_insufficient","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_totalVote","type":"uint256"}],"name":"ProposalCompleted","type":"event"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"bytes32","name":"_optionDescription","type":"bytes32"}],"name":"addOption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockWaitLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint16","name":"state","type":"uint16"},{"internalType":"uint8","name":"scanCursor","type":"uint8"},{"internalType":"bool","name":"internals","type":"bool"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"getOption","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"getProposal","outputs":[{"components":[{"internalType":"bytes32","name":"description","type":"bytes32"},{"internalType":"bytes32[]","name":"options","type":"bytes32[]"},{"internalType":"uint256[]","name":"optionVotes","type":"uint256[]"},{"internalType":"uint256","name":"cancelVotes","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"blockDeadline","type":"uint256"},{"internalType":"uint24","name":"targetVotePpm","type":"uint24"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint16","name":"state","type":"uint16"},{"internalType":"uint8","name":"scanCursor","type":"uint8"},{"internalType":"bool","name":"internals","type":"bool"}],"internalType":"struct ERC20Vote.Proposal","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"}],"name":"optionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_description","type":"bytes32"},{"internalType":"bytes32","name":"_option","type":"bytes32"},{"internalType":"uint256","name":"_blockWait","type":"uint256"},{"internalType":"uint24","name":"_targetVotePpm","type":"uint24"}],"name":"proposeInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIndex","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"}],"name":"scan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"vote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteCancel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proposalIdx","type":"uint256"},{"internalType":"uint256","name":"_optionIdx","type":"uint256"}],"name":"voteCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_optionIndex","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"voteOption","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"Voter.sol":"ERC20Vote"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"Voter.sol":{"keccak256":"0x1973b7b1f4fd3cdf667c2f6362e4b5cb1a5f38346e66728382bcff752f54a354","license":"AGPL-3.0-or-later","urls":["bzz-raw://88c9dbc2a0e8405ecc2e753b2f4c1c8faeacd1dfe3339e3a2df7e03500e46f54","dweb:/ipfs/QmZHpYkics6CUCgFso1YEBbmVq1cM6n53ft95Y2Kfka74z"]}},"version":1} diff --git a/python/evm_tokenvote/voter.py b/python/evm_tokenvote/voter.py @@ -130,6 +130,25 @@ class Voter(TxFactory): tx = self.finalize(tx, tx_format, id_generator=id_generator) return tx + + def propose_blockwait(self, contract_address, sender_address, blockwait, block_deadline, target_vote_ppm=500000, tx_format=TxFormat.JSONRPC, id_generator=None): + enc = ABIContractEncoder() + enc.method('proposeInternal') + enc.typ(ABIContractType.BYTES32) + enc.typ(ABIContractType.BYTES32) + enc.typ(ABIContractType.UINT256) + enc.typ_literal('uint24') + enc.bytes32('67ca084db32598c571e2ad2dc8b95679c3fa14c63213935dfd8f0a158ff65c57') + blockwait_bytes = blockwait.to_bytes(length=32, byteorder='big') + enc.bytes32(blockwait_bytes) + enc.uint256(block_deadline) + enc.uintn(target_vote_ppm, 24) + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format, id_generator=id_generator) + return tx + def add_option(self, contract_address, sender_address, proposal_idx, description, tx_format=TxFormat.JSONRPC, id_generator=None): enc = ABIContractEncoder() @@ -309,6 +328,20 @@ class Voter(TxFactory): return o + def block_wait_limit(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('blockWaitLimit') + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + def current_proposal(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) diff --git a/python/setup.cfg b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = evm_tokenvote -version = 0.0.2 +version = 0.0.3 description = Voting machine using ERC20 tokens as votes. author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_internal.py b/python/tests/test_internal.py @@ -0,0 +1,59 @@ +# standard imports +import unittest +import logging +import os +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import block_latest +from hexathon import same as same_hex +from eth_erc20 import ERC20 +from giftable_erc20_token import GiftableToken + +# local imports +from evm_tokenvote.unittest import TestEvmVote +from evm_tokenvote.unittest.base import hash_of_foo +from evm_tokenvote import Voter +from evm_tokenvote import ProposalState + + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +class TestVoteBase(TestEvmVote): + + def test_propose_internal_blockwait(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn) + c = Voter(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.propose_blockwait(self.voter_address, self.accounts[0], 123, 100) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.block_wait_limit(self.voter_address, sender_address=self.ivan) + r = self.rpc.do(o) + self.assertEqual(int(r, 16), 0) + + c = ERC20(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.voter_address, self.initial_supply) + self.rpc.do(o) + + c = Voter(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.vote(self.voter_address, self.accounts[0], self.initial_supply) + self.rpc.do(o) + + (tx_hash, o) = c.scan(self.voter_address, self.accounts[0], 0, 0) + self.rpc.do(o) + + (tx_hash, o) = c.finalize_vote(self.voter_address, self.accounts[0]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.block_wait_limit(self.voter_address, sender_address=self.ivan) + r = self.rpc.do(o) + self.assertEqual(int(r, 16), 123) + +if __name__ == '__main__': + unittest.main() diff --git a/solidity/Voter.sol b/solidity/Voter.sol @@ -6,14 +6,17 @@ pragma solidity ^0.8.0; // Description: Voting contract using ERC20 tokens as shares contract ERC20Vote { - uint8 constant STATE_INIT = 1; // proposal has been initiated. - uint8 constant STATE_FINAL = 2; // proposal has been finalized. - uint8 constant STATE_SCANNED = 4; // proposal votes have been scanned (this can be done after finalization). - uint8 constant STATE_INSUFFICIENT = 8; // proposal did not attract minimum participation before deadline. - uint8 constant STATE_TIED = 16; // two or more proposal options have the same amount of votes. - uint8 constant STATE_SUPPLYCHANGE = 32; // supply changed while voting was underway. - uint8 constant STATE_IMMEDIATE = 64; // minimum participation was attained before deadline. - uint8 constant STATE_CANCELLED = 128; // vote to cancel the proposal has the majority. + uint16 constant STATE_INIT = 1; // proposal has been initiated. + uint16 constant STATE_FINAL = 2; // proposal has been finalized. + uint16 constant STATE_SCANNED = 4; // proposal votes have been scanned (this can be done after finalization). + uint16 constant STATE_INSUFFICIENT = 8; // proposal did not attract minimum participation before deadline. + uint16 constant STATE_TIED = 16; // two or more proposal options have the same amount of votes. + uint16 constant STATE_SUPPLYCHANGE = 32; // supply changed while voting was underway. + uint16 constant STATE_IMMEDIATE = 64; // minimum participation was attained before deadline. + uint16 constant STATE_CANCELLED = 128; // vote to cancel the proposal has the majority. + uint16 constant STATE_DUE = 256; // votes are ready to be tallied. + + bytes32 constant INTERNALS_BLOCK_WAIT_LIMIT = 0x67ca084db32598c571e2ad2dc8b95679c3fa14c63213935dfd8f0a158ff65c57; address public token; @@ -27,8 +30,9 @@ contract ERC20Vote { uint256 blockDeadline; uint24 targetVotePpm; address proposer; - uint8 state; + uint16 state; uint8 scanCursor; + bool internals; // vote to govern internal mechanics of the contract. May not contain options. } // sequential index of all added proposals. @@ -47,6 +51,12 @@ contract ERC20Vote { // The proposal will be marked accordingly to disambiguate the cancellation from a cancel vote. bool protectSupply; + // the maximum amount of block waits for a vote + uint256 public blockWaitLimit; + + // the deadline of the last added proposal + uint256 lastBlockDeadline; + // value of tokens held in escrow per account. mapping ( address => uint256 ) public balanceOf; @@ -73,24 +83,46 @@ contract ERC20Vote { // create new proposal function propose(bytes32 _description, uint256 _blockWait, uint24 _targetVotePpm) public returns (uint256) { + return proposeCore(_description, _blockWait, _targetVotePpm, false); + } + + // create new proposal to change internal settings in contract + function proposeInternal(bytes32 _description, bytes32 _option, uint256 _blockWait, uint24 _targetVotePpm) public returns (uint256) { + bool l_descriptionValid; + uint256 l_proposalIndex; + + if (_description == INTERNALS_BLOCK_WAIT_LIMIT) { + l_descriptionValid = true; + } + require(l_descriptionValid, "ERR_INVALID_INTERNAL"); + l_proposalIndex = proposeCore(_description, _blockWait, _targetVotePpm, true); + addOption(l_proposalIndex, _option); + return l_proposalIndex; + } + + // common code for proposal creation + function proposeCore(bytes32 _description, uint256 _blockWait, uint24 _targetVotePpm, bool _internals) private returns (uint256) { Proposal memory l_proposal; uint256 l_proposalIndex; uint256 l_blockDeadline; + if (blockWaitLimit > 0) { + require(_blockWait <= blockWaitLimit, "ERR_WAIT"); + } mustAccount(msg.sender, proposerRegistry); - //require(_options.length < 256, "ERR_TOO_MANY_OPTIONS"); + l_proposalIndex = proposals.length - 1; l_proposal.proposer = msg.sender; l_proposal.description = _description; l_proposal.targetVotePpm = _targetVotePpm; l_blockDeadline = block.number + _blockWait; l_proposal.blockDeadline = l_blockDeadline; - l_proposalIndex = proposals.length; l_proposal.state = STATE_INIT; + l_proposal.internals = _internals; proposals.push(l_proposal); l_proposal.supply = checkSupply(proposals[l_proposalIndex]); - emit ProposalAdded(l_blockDeadline, _targetVotePpm, l_proposalIndex - 1); + emit ProposalAdded(l_blockDeadline, _targetVotePpm, l_proposalIndex); return l_proposalIndex; } @@ -99,7 +131,6 @@ contract ERC20Vote { Proposal storage l_proposal; l_proposal = proposals[_proposalIdx + 1]; - l_proposal.options.push(_optionDescription); l_proposal.optionVotes.push(0); } @@ -261,7 +292,7 @@ contract ERC20Vote { uint256 hi; uint256 score; uint8 c; - uint8 state; + uint16 state; proposal = proposals[_proposalIndex + 1]; if (proposal.state & STATE_IMMEDIATE == 0) { @@ -321,13 +352,23 @@ contract ERC20Vote { r = true; } proposal.state |= STATE_FINAL; - + + if (proposal.internals) { + finalizeInternal(proposal.description, proposal.options[0]); + } emit ProposalCompleted(currentProposal - 1, proposal.state & STATE_CANCELLED > 0, r, proposal.total); currentProposal += 1; return !r; } + // execute state changes for internals proposals + function finalizeInternal(bytes32 _description, bytes32 _optionDescription) private { + if (_description == INTERNALS_BLOCK_WAIT_LIMIT) { + blockWaitLimit = uint256(_optionDescription); + } + } + // check if target vote count has been met function haveQuotaFor(Proposal storage proposal, uint256 _value) private view returns (bool) { uint256 l_total_m; @@ -382,7 +423,6 @@ contract ERC20Vote { require(proposal.state & STATE_FINAL > 0, "ERR_PREMATURE"); } - balanceOf[msg.sender] = 0; proposalIdxLock[msg.sender] = 0; (r, v) = token.call(abi.encodeWithSignature('transfer(address,uint256)', msg.sender, l_value));