evm-booking

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit a4369724f4b3c3f10742699b1ccc6d9565389c73
parent 5a70844664db38cf120fccd004656a8987801c52
Author: lash <dev@holbrook.no>
Date:   Fri,  2 Jun 2023 17:04:31 +0100

Implement automatic expiry calculation for time based module

Diffstat:
Mpython/evm_booking/booking.py | 26+++++++++++++++++++++-----
Mpython/evm_booking/data/Booking.bin | 4++--
Mpython/evm_booking/data/Booking.json | 2+-
Mpython/evm_booking/data/Booking.metadata.json | 2+-
Mpython/evm_booking/time.py | 5++++-
Mpython/evm_booking/unittest/base.py | 5+++--
Mpython/tests/test_time.py | 13+++++++++++--
Msolidity/Booking.sol | 72+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
8 files changed, 110 insertions(+), 19 deletions(-)

diff --git a/python/evm_booking/booking.py b/python/evm_booking/booking.py @@ -37,19 +37,21 @@ class Booking(TxFactory): __abi = None __bytecode = None - def constructor(self, sender_address, token_address, cap, tx_format=TxFormat.JSONRPC, version=None): - code = self.cargs(token_address, cap, version=version) + def constructor(self, sender_address, token_address, cap, expiry, tx_format=TxFormat.JSONRPC, version=None): + code = self.cargs(token_address, cap, expiry, version=version) tx = self.template(sender_address, None, use_nonce=True) tx = self.set_code(tx, code) return self.finalize(tx, tx_format) @staticmethod - def cargs(token_address, cap, version=None): + def cargs(token_address, cap, expiry, version=None): + expiry_timestamp = int(expiry.timestamp()) code = Booking.bytecode(version=version) enc = ABIContractEncoder() enc.address(token_address) enc.uint256(cap) + enc.uint256(expiry_timestamp) args = enc.get() code += args logg.debug('constructor code: ' + args) @@ -61,7 +63,6 @@ class Booking(TxFactory): return 4000000 - @staticmethod def abi(): if Booking.__abi == None: @@ -118,7 +119,6 @@ class Booking(TxFactory): return tx - def raw(self, contract_address, count=0, offset=0, sender_address=ZERO_ADDRESS, id_generator=None, height=BlockSpec.LATEST): j = JSONRPCRequest(id_generator) o = j.template() @@ -155,6 +155,22 @@ class Booking(TxFactory): return o + def expires(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None, height=BlockSpec.LATEST): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('expires') + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + height = to_blockheight_param(height) + o['params'].append(height) + o = j.finalize(o) + return o + + @classmethod def parse_raw(self, v): v = strip_0x(v) diff --git a/python/evm_booking/data/Booking.bin b/python/evm_booking/data/Booking.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200322b3803806200322b83398181016040528101906200003791906200055a565b60008111801562000058575070010000000000000000000000000000000081105b6200009a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000919062000602565b60405180910390fd5b620000a462000493565b620000be826200028f640100000000026401000000009004565b9050600181600060028110620000d957620000d862000624565b5b6020020151620000ea919062000682565b67ffffffffffffffff811115620001065762000105620006bd565b5b6040519080825280601f01601f191660200182016040528015620001395781602001600182028036833780820191505090505b50600290816200014a919062000933565b5060018160006002811062000164576200016362000624565b5b602002015162000175919062000682565b67ffffffffffffffff811115620001915762000190620006bd565b5b6040519080825280601f01601f191660200182016040528015620001c45781602001600182028036833780820191505090505b5060039081620001d5919062000933565b508160048190555060045460058190555082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200024062000310640100000000026401000000009004565b600681905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000c2a565b6200029962000493565b6000620002a562000493565b600884620002b4919062000a53565b91508181600060028110620002ce57620002cd62000624565b5b602002018181525050600884620002e6919062000ac7565b81600160028110620002fd57620002fc62000624565b5b6020020181815250508092505050919050565b60008060606000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620003e2919062000b6d565b6000604051808303816000865af19150503d806000811462000421576040519150601f19603f3d011682016040523d82523d6000602084013e62000426565b606091505b5080935081945050508262000472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004699062000bd6565b60405180910390fd5b8180602001905181019062000488919062000bf8565b905080935050505090565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620004e782620004ba565b9050919050565b620004f981620004da565b81146200050557600080fd5b50565b6000815190506200051981620004ee565b92915050565b6000819050919050565b62000534816200051f565b81146200054057600080fd5b50565b600081519050620005548162000529565b92915050565b60008060408385031215620005745762000573620004b5565b5b6000620005848582860162000508565b9250506020620005978582860162000543565b9150509250929050565b600082825260208201905092915050565b7f4552525f4e4f4e53454e53450000000000000000000000000000000000000000600082015250565b6000620005ea600c83620005a1565b9150620005f782620005b2565b602082019050919050565b600060208201905081810360008301526200061d81620005db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200068f826200051f565b91506200069c836200051f565b9250828201905080821115620006b757620006b662000653565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073f57607f821691505b602082108103620007555762000754620006f7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000780565b620007ce868362000780565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008116200080b62000805846200051f565b620007e6565b6200051f565b9050919050565b6000819050919050565b6200082d83620007f0565b620008456200083c8262000818565b84845462000790565b825550505050565b600090565b6200085c6200084d565b6200086981848462000822565b505050565b5b8181101562000891576200088560008262000852565b6001810190506200086f565b5050565b601f821115620008e057620008aa816200075b565b620008b58462000770565b81016020851015620008c5578190505b620008dd620008d48562000770565b8301826200086e565b50505b505050565b60008160020a8304905092915050565b60006200090860001984600802620008e5565b1980831691505092915050565b6000620009238383620008f5565b9150826002028217905092915050565b6200093e82620006ec565b67ffffffffffffffff8111156200095a5762000959620006bd565b5b62000966825462000726565b6200097382828562000895565b600060209050601f831160018114620009ab576000841562000996578287015190505b620009a2858262000915565b86555062000a12565b601f198416620009bb866200075b565b60005b82811015620009e557848901518255600182019150602085019450602081019050620009be565b8683101562000a05578489015162000a01601f891682620008f5565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000a608262000a1a565b915062000a6d8362000a1a565b92508262000a805762000a7f62000a24565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161562000abc5762000abb62000653565b5b828205905092915050565b600062000ad4826200051f565b915062000ae1836200051f565b92508262000af45762000af362000a24565b5b828206905092915050565b600081905092915050565b60005b8381101562000b2a57808201518184015260208101905062000b0d565b60008484015250505050565b600062000b4382620006ec565b62000b4f818562000aff565b935062000b6181856020860162000b0a565b80840191505092915050565b600062000b7b828462000b36565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b600062000bbe600983620005a1565b915062000bcb8262000b86565b602082019050919050565b6000602082019050818103600083015262000bf18162000baf565b9050919050565b60006020828403121562000c115762000c10620004b5565b5b600062000c218482850162000543565b91505092915050565b6125f18062000c3a6000396000f3fe608060405234801561001057600080fd5b5060043610610133576000357c0100000000000000000000000000000000000000000000000000000000900480635cfc1a51116100bf578063aa67c9191161008e578063aa67c91914610316578063d0e30db014610346578063da2824a814610364578063de34d54414610394578063fc0c546a146103b057610133565b80635cfc1a511461028c5780637f03864b146102aa57806386fe212d146102c85780638da5cb5b146102f857610133565b80632c1758c1116101065780632c1758c1146101d45780632d1a72671461020457806331a5995d146102225780634eeea7ad146102405780635356dddc1461025c57610133565b806304bc34e21461013857806318160ddd1461016857806318cbbcfc146101865780632b29ba23146101a4575b600080fd5b610152600480360381019061014d91906118ed565b6103ce565b60405161015f91906119bd565b60405180910390f35b610170610646565b60405161017d91906119ee565b60405180910390f35b61018e61064c565b60405161019b91906119ee565b60405180910390f35b6101be60048036038101906101b99190611a67565b610651565b6040516101cb9190611aaf565b60405180910390f35b6101ee60048036038101906101e99190611aca565b6106fd565b6040516101fb9190611aaf565b60405180910390f35b61020c610730565b60405161021991906119ee565b60405180910390f35b61022a610736565b60405161023791906119ee565b60405180910390f35b61025a600480360381019061025591906118ed565b61073c565b005b61027660048036038101906102719190611a67565b610923565b6040516102839190611aaf565b60405180910390f35b610294610a97565b6040516102a191906119ee565b60405180910390f35b6102b2610a9d565b6040516102bf91906119ee565b60405180910390f35b6102e260048036038101906102dd9190611aca565b610aa3565b6040516102ef91906119ee565b60405180910390f35b610300610b95565b60405161030d9190611b06565b60405180910390f35b610330600480360381019061032b9190611a67565b610bb9565b60405161033d9190611b3a565b60405180910390f35b61034e610f17565b60405161035b9190611b3a565b60405180910390f35b61037e60048036038101906103799190611a67565b610f27565b60405161038b9190611aaf565b60405180910390f35b6103ae60048036038101906103a991906118ed565b611065565b005b6103b86110bd565b6040516103c59190611b06565b60405180910390f35b6060806103d9611890565b600080600087036103f65760086004546103f39190611bb3565b96505b60006008876104059190611be4565b14610445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043c90611c72565b60405180910390fd5b61044e866110e3565b92508260006002811061046457610463611c92565b5b602002015191506008876104789190611bb3565b90506001836001600281106104905761048f611c92565b5b602002015160ff1611156104ae576001816104ab9190611cc1565b90505b8067ffffffffffffffff8111156104c8576104c7611cf5565b5b6040519080825280601f01601f1916602001820160405280156104fa5781602001600182028036833780820191505090505b50935060005b8181101561063857600383826105169190611cc1565b815461052190611d53565b81106105305761052f611c92565b5b81546001161561054f5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002600284836105839190611cc1565b815461058e90611d53565b811061059d5761059c611c92565b5b8154600116156105bc5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002178582815181106105f6576105f5611c92565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061063090611d84565b915050610500565b508394505050505092915050565b60055481565b600181565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806106f6575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60006001821061070c57600080fd5b60008203610721576001600a5414905061072b565b81600a5483161490505b919050565b60065481565b600a5481565b6000606060008361074b611156565b6107559190611dcc565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163330836040516024016107a593929190611e6d565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161082f9190611ee0565b6000604051808303816000865af19150503d806000811461086c576040519150601f19603f3d011682016040523d82523d6000602084013e610871565b606091505b508093508194505050826108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190611f43565b60405180910390fd5b818060200190518101906108ce9190611f8f565b925082610910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090790612008565b60405180910390fd5b61091c85856000611206565b5050505050565b6000610932600160ff166106fd565b15610972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096990612074565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109f757508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906120e0565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60045481565b60075481565b6000600180610ab29190611cc1565b8210610af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aea9061214c565b60405180910390fd5b6000600a54831614610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b31906121b8565b60405180910390fd5b81600a600082825417925050819055506001600a541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e600a54604051610b8391906119ee565b60405180910390a2600a549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060006060600080610bce611156565b955085600754610bde9190611dcc565b9650600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548703610c36576000975050505050505050610f12565b600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487610c8191906121d8565b9450600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054871115610cd557889150309050610d0a565b3091508890507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85610d07919061221b565b94505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828287604051602401610d5893929190612293565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610de29190611ee0565b6000604051808303816000865af19150503d8060008114610e1f576040519150601f19603f3d011682016040523d82523d6000602084013e610e24565b606091505b50809450819550505083610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6490611f43565b60405180910390fd5b82806020019051810190610e819190611f8f565b935083610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90612008565b60405180910390fd5b86600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550849750505050505050505b919050565b6000610f2233610bb9565b905090565b6000610f36600160ff166106fd565b15610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d90612074565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906120e0565b60405180910390fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b61106e33610651565b6110ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a4906120e0565b60405180910390fd5b6110b982826001611206565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110eb611890565b60006110f5611890565b60088461110291906122ca565b9150818160006002811061111957611118611c92565b5b60200201818152505060088461112f9190611be4565b8160016002811061114357611142611c92565b5b6020020181815250508092505050919050565b60008060006111636115fa565b915060065482146111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090612380565b60405180910390fd5b6005548210156111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e5906123ec565b60405180910390fd5b600554826111fc9190611bb3565b9050809250505090565b60008211611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090612458565b60405180910390fd5b611251611890565b60008061125d866110e3565b92508260006002811061127357611272611c92565b5b602002015191508260016002811061128e5761128d611c92565b5b602002015160ff1660019060020a02905060005b858110156115f1576000600454116112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e6906124c4565b60405180910390fd5b6112f98383611774565b611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90612530565b60405180910390fd5b84156114785781600384815461134d90611d53565b811061135c5761135b611c92565b5b81546001161561137b5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f01000000000000000000000000000000000000000000000000000000000000000260038481546113f590611d53565b811061140457611403611c92565b5b8154600116156114235790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055506007600081548092919061146e90611d84565b9190505550611596565b81600284815461148790611d53565b811061149657611495611c92565b5b8154600116156114b55790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f010000000000000000000000000000000000000000000000000000000000000002600284815461152f90611d53565b811061153e5761153d611c92565b5b81546001161561155d5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b60808260ff16036115b85782806115ac90611d84565b935050600191506115c6565b60018260ff169060020a0291505b600460008154809291906115d990612550565b919050555080806115e990611d84565b9150506112a2565b50505050505050565b60008060606000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116ca9190611ee0565b6000604051808303816000865af19150503d8060008114611707576040519150601f19603f3d011682016040523d82523d6000602084013e61170c565b606091505b50809350819450505082611755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174c90611f43565b60405180910390fd5b81806020019051810190611769919061258e565b905080935050505090565b60008082600385815461178690611d53565b811061179557611794611c92565b5b8154600116156117b45790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004600286815461180b90611d53565b811061181a57611819611c92565b5b8154600116156118395790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004171660ff1614905092915050565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b6000819050919050565b6118ca816118b7565b81146118d557600080fd5b50565b6000813590506118e7816118c1565b92915050565b60008060408385031215611904576119036118b2565b5b6000611912858286016118d8565b9250506020611923858286016118d8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561196757808201518184015260208101905061194c565b60008484015250505050565b6000601f19601f8301169050919050565b600061198f8261192d565b6119998185611938565b93506119a9818560208601611949565b6119b281611973565b840191505092915050565b600060208201905081810360008301526119d78184611984565b905092915050565b6119e8816118b7565b82525050565b6000602082019050611a0360008301846119df565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3482611a09565b9050919050565b611a4481611a29565b8114611a4f57600080fd5b50565b600081359050611a6181611a3b565b92915050565b600060208284031215611a7d57611a7c6118b2565b5b6000611a8b84828501611a52565b91505092915050565b60008115159050919050565b611aa981611a94565b82525050565b6000602082019050611ac46000830184611aa0565b92915050565b600060208284031215611ae057611adf6118b2565b5b6000611aee848285016118d8565b91505092915050565b611b0081611a29565b82525050565b6000602082019050611b1b6000830184611af7565b92915050565b6000819050919050565b611b3481611b21565b82525050565b6000602082019050611b4f6000830184611b2b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611bbe826118b7565b9150611bc9836118b7565b925082611bd957611bd8611b55565b5b828204905092915050565b6000611bef826118b7565b9150611bfa836118b7565b925082611c0a57611c09611b55565b5b828206905092915050565b600082825260208201905092915050565b7f4552525f424f554e444152590000000000000000000000000000000000000000600082015250565b6000611c5c600c83611c15565b9150611c6782611c26565b602082019050919050565b60006020820190508181036000830152611c8b81611c4f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611ccc826118b7565b9150611cd7836118b7565b9250828201905080821115611cef57611cee611b84565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611d6b57607f821691505b602082108103611d7e57611d7d611d24565b5b50919050565b6000611d8f826118b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611dc157611dc0611b84565b5b600182019050919050565b6000611dd7826118b7565b9150611de2836118b7565b9250828202611df0816118b7565b91508282048414831517611e0757611e06611b84565b5b5092915050565b6000819050919050565b6000611e33611e2e611e2984611a09565b611e0e565b611a09565b9050919050565b6000611e4582611e18565b9050919050565b6000611e5782611e3a565b9050919050565b611e6781611e4c565b82525050565b6000606082019050611e826000830186611af7565b611e8f6020830185611e5e565b611e9c60408301846119df565b949350505050565b600081905092915050565b6000611eba8261192d565b611ec48185611ea4565b9350611ed4818560208601611949565b80840191505092915050565b6000611eec8284611eaf565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b6000611f2d600983611c15565b9150611f3882611ef7565b602082019050919050565b60006020820190508181036000830152611f5c81611f20565b9050919050565b611f6c81611a94565b8114611f7757600080fd5b50565b600081519050611f8981611f63565b92915050565b600060208284031215611fa557611fa46118b2565b5b6000611fb384828501611f7a565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000611ff2600c83611c15565b9150611ffd82611fbc565b602082019050919050565b6000602082019050818103600083015261202181611fe5565b9050919050565b7f4552525f5345414c454400000000000000000000000000000000000000000000600082015250565b600061205e600a83611c15565b915061206982612028565b602082019050919050565b6000602082019050818103600083015261208d81612051565b9050919050565b7f4552525f41585800000000000000000000000000000000000000000000000000600082015250565b60006120ca600783611c15565b91506120d582612094565b602082019050919050565b600060208201905081810360008301526120f9816120bd565b9050919050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000612136601183611c15565b915061214182612100565b602082019050919050565b6000602082019050818103600083015261216581612129565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006121a2601283611c15565b91506121ad8261216c565b602082019050919050565b600060208201905081810360008301526121d181612195565b9050919050565b60006121e382611b21565b91506121ee83611b21565b925082820390508181126000841216828213600085121516171561221557612214611b84565b5b92915050565b600061222682611b21565b915061223183611b21565b925082820261223f81611b21565b91507f8000000000000000000000000000000000000000000000000000000000000000841460008412161561227757612276611b84565b5b828205841483151761228c5761228b611b84565b5b5092915050565b60006060820190506122a86000830186611af7565b6122b56020830185611af7565b6122c260408301846119df565b949350505050565b60006122d582611b21565b91506122e083611b21565b9250826122f0576122ef611b55565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561232957612328611b84565b5b828205905092915050565b7f4552525f535550504c595f4348414e4745440000000000000000000000000000600082015250565b600061236a601283611c15565b915061237582612334565b602082019050919050565b600060208201905081810360008301526123998161235d565b9050919050565b7f4552525f535550504c595f554e444552464c4f57000000000000000000000000600082015250565b60006123d6601483611c15565b91506123e1826123a0565b602082019050919050565b60006020820190508181036000830152612405816123c9565b9050919050565b7f4552525f5a45524f434f554e5400000000000000000000000000000000000000600082015250565b6000612442600d83611c15565b915061244d8261240c565b602082019050919050565b6000602082019050818103600083015261247181612435565b9050919050565b7f4552525f43415041434954590000000000000000000000000000000000000000600082015250565b60006124ae600c83611c15565b91506124b982612478565b602082019050919050565b600060208201905081810360008301526124dd816124a1565b9050919050565b7f4552525f434f4c4c4953494f4e00000000000000000000000000000000000000600082015250565b600061251a600d83611c15565b9150612525826124e4565b602082019050919050565b600060208201905081810360008301526125498161250d565b9050919050565b600061255b826118b7565b91506000820361256e5761256d611b84565b5b600182039050919050565b600081519050612588816118c1565b92915050565b6000602082840312156125a4576125a36118b2565b5b60006125b284828501612579565b9150509291505056fea2646970667358221220bd405c0b2b5eff8590557aad6ec87669506ab6c13e5cb5c4adfcab2e79f6a0e964736f6c63430008130033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162003746380380620037468339818101604052810190620000379190620005a7565b60008211801562000058575070010000000000000000000000000000000082105b6200009a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000919062000664565b60405180910390fd5b428111620000df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d690620006d6565b60405180910390fd5b620000e9620004e0565b6200010383620002dc640100000000026401000000009004565b90506001816000600281106200011e576200011d620006f8565b5b60200201516200012f919062000756565b67ffffffffffffffff8111156200014b576200014a62000791565b5b6040519080825280601f01601f1916602001820160405280156200017e5781602001600182028036833780820191505090505b50600290816200018f919062000a07565b50600181600060028110620001a957620001a8620006f8565b5b6020020151620001ba919062000756565b67ffffffffffffffff811115620001d657620001d562000791565b5b6040519080825280601f01601f191660200182016040528015620002095781602001600182028036833780820191505090505b50600390816200021a919062000a07565b508260048190555060045460058190555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002856200035d640100000000026401000000009004565b600681905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a819055505050505062000cfe565b620002e6620004e0565b6000620002f2620004e0565b60088462000301919062000b27565b915081816000600281106200031b576200031a620006f8565b5b60200201818152505060088462000333919062000b9b565b816001600281106200034a5762000349620006f8565b5b6020020181815250508092505050919050565b60008060606000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516200042f919062000c41565b6000604051808303816000865af19150503d80600081146200046e576040519150601f19603f3d011682016040523d82523d6000602084013e62000473565b606091505b50809350819450505082620004bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004b69062000caa565b60405180910390fd5b81806020019051810190620004d5919062000ccc565b905080935050505090565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005348262000507565b9050919050565b620005468162000527565b81146200055257600080fd5b50565b60008151905062000566816200053b565b92915050565b6000819050919050565b62000581816200056c565b81146200058d57600080fd5b50565b600081519050620005a18162000576565b92915050565b600080600060608486031215620005c357620005c262000502565b5b6000620005d38682870162000555565b9350506020620005e68682870162000590565b9250506040620005f98682870162000590565b9150509250925092565b600082825260208201905092915050565b7f4552525f4e4f4e53454e53450000000000000000000000000000000000000000600082015250565b60006200064c600c8362000603565b9150620006598262000614565b602082019050919050565b600060208201905081810360008301526200067f816200063d565b9050919050565b7f4552525f50415354000000000000000000000000000000000000000000000000600082015250565b6000620006be60088362000603565b9150620006cb8262000686565b602082019050919050565b60006020820190508181036000830152620006f181620006af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000763826200056c565b915062000770836200056c565b92508282019050808211156200078b576200078a62000727565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200081357607f821691505b602082108103620008295762000828620007cb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000854565b620008a2868362000854565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008e5620008df620008d9846200056c565b620008ba565b6200056c565b9050919050565b6000819050919050565b6200090183620008c4565b620009196200091082620008ec565b84845462000864565b825550505050565b600090565b6200093062000921565b6200093d818484620008f6565b505050565b5b8181101562000965576200095960008262000926565b60018101905062000943565b5050565b601f821115620009b4576200097e816200082f565b620009898462000844565b8101602085101562000999578190505b620009b1620009a88562000844565b83018262000942565b50505b505050565b60008160020a8304905092915050565b6000620009dc60001984600802620009b9565b1980831691505092915050565b6000620009f78383620009c9565b9150826002028217905092915050565b62000a1282620007c0565b67ffffffffffffffff81111562000a2e5762000a2d62000791565b5b62000a3a8254620007fa565b62000a4782828562000969565b600060209050601f83116001811462000a7f576000841562000a6a578287015190505b62000a768582620009e9565b86555062000ae6565b601f19841662000a8f866200082f565b60005b8281101562000ab95784890151825560018201915060208501945060208101905062000a92565b8683101562000ad9578489015162000ad5601f891682620009c9565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000b348262000aee565b915062000b418362000aee565b92508262000b545762000b5362000af8565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161562000b905762000b8f62000727565b5b828205905092915050565b600062000ba8826200056c565b915062000bb5836200056c565b92508262000bc85762000bc762000af8565b5b828206905092915050565b600081905092915050565b60005b8381101562000bfe57808201518184015260208101905062000be1565b60008484015250505050565b600062000c1782620007c0565b62000c23818562000bd3565b935062000c3581856020860162000bde565b80840191505092915050565b600062000c4f828462000c0a565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b600062000c9260098362000603565b915062000c9f8262000c5a565b602082019050919050565b6000602082019050818103600083015262000cc58162000c83565b9050919050565b60006020828403121562000ce55762000ce462000502565b5b600062000cf58482850162000590565b91505092915050565b612a388062000d0e6000396000f3fe608060405234801561001057600080fd5b5060043610610154576000357c0100000000000000000000000000000000000000000000000000000000900480635cfc1a51116100d5578063aa67c91911610099578063aa67c91914610399578063b1cb0db3146103c9578063d0e30db0146103e7578063da2824a814610405578063de34d54414610435578063fc0c546a1461046557610154565b80635cfc1a51146102f15780635f408c041461030f5780637f03864b1461032d57806386fe212d1461034b5780638da5cb5b1461037b57610154565b80632c1758c11161011c5780632c1758c1146102255780632d1a72671461025557806331a5995d146102735780634eeea7ad146102915780635356dddc146102c157610154565b806301ffc9a71461015957806304bc34e21461018957806318160ddd146101b957806318cbbcfc146101d75780632b29ba23146101f5575b600080fd5b610173600480360381019061016e9190611c9a565b610483565b6040516101809190611ce2565b60405180910390f35b6101a3600480360381019061019e9190611d33565b6105d7565b6040516101b09190611e03565b60405180910390f35b6101c161084f565b6040516101ce9190611e34565b60405180910390f35b6101df610855565b6040516101ec9190611e34565b60405180910390f35b61020f600480360381019061020a9190611ead565b61085a565b60405161021c9190611ce2565b60405180910390f35b61023f600480360381019061023a9190611eda565b610906565b60405161024c9190611ce2565b60405180910390f35b61025d610939565b60405161026a9190611e34565b60405180910390f35b61027b61093f565b6040516102889190611e34565b60405180910390f35b6102ab60048036038101906102a69190611d33565b610945565b6040516102b89190611ce2565b60405180910390f35b6102db60048036038101906102d69190611ead565b610b5e565b6040516102e89190611ce2565b60405180910390f35b6102f9610cd2565b6040516103069190611e34565b60405180910390f35b610317610cd8565b6040516103249190611f23565b60405180910390f35b610335610d76565b6040516103429190611e34565b60405180910390f35b61036560048036038101906103609190611eda565b610d7c565b6040516103729190611e34565b60405180910390f35b610383610e6f565b6040516103909190611f4d565b60405180910390f35b6103b360048036038101906103ae9190611ead565b610e93565b6040516103c09190611f81565b60405180910390f35b6103d161121f565b6040516103de9190611e34565b60405180910390f35b6103ef611225565b6040516103fc9190611f81565b60405180910390f35b61041f600480360381019061041a9190611ead565b611235565b60405161042c9190611ce2565b60405180910390f35b61044f600480360381019061044a9190611d33565b611373565b60405161045c9190611ce2565b60405180910390f35b61046d611448565b60405161047a9190611f4d565b60405180910390f35b6000630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036104d757600190506105d2565b63abe1f1f57c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361052957600190506105d2565b63841a0e947c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361057b57600190506105d2565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105cd57600190506105d2565b600090505b919050565b6060806105e2611c1b565b600080600087036105ff5760086004546105fc9190611ffa565b96505b600060088761060e919061202b565b1461064e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610645906120b9565b60405180910390fd5b6106578661146e565b92508260006002811061066d5761066c6120d9565b5b602002015191506008876106819190611ffa565b9050600183600160028110610699576106986120d9565b5b602002015160ff1611156106b7576001816106b49190612108565b90505b8067ffffffffffffffff8111156106d1576106d061213c565b5b6040519080825280601f01601f1916602001820160405280156107035781602001600182028036833780820191505090505b50935060005b81811015610841576003838261071f9190612108565b815461072a9061219a565b8110610739576107386120d9565b5b8154600116156107585790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000026002848361078c9190612108565b81546107979061219a565b81106107a6576107a56120d9565b5b8154600116156107c55790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002178582815181106107ff576107fe6120d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080610839906121cb565b915050610709565b508394505050505092915050565b60055481565b600381565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806108ff575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60006003821061091557600080fd5b6000820361092a576003600c54149050610934565b81600c5483161490505b919050565b60065481565b600c5481565b60008060606000610954610cd8565b50600b60009054906101000a900460ff16156109765760009350505050610b58565b8461097f6114e1565b6109899190612213565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163330836040516024016109d9939291906122b4565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a639190612327565b6000604051808303816000865af19150503d8060008114610aa0576040519150601f19603f3d011682016040523d82523d6000602084013e610aa5565b606091505b50809350819450505082610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae59061238a565b60405180910390fd5b81806020019051810190610b0291906123d6565b925082610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b9061244f565b60405180910390fd5b610b5086866000611591565b600193505050505b92915050565b6000610b6d600160ff16610906565b15610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba4906124bb565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c3257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890612527565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60045481565b600080600a5403610cec5760009050610d73565b600b60009054906101000a900460ff1615610d0a5760019050610d73565b600a544210610d6e576001600b60006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051610d5d9190611e34565b60405180910390a160029050610d73565b600090505b90565b60075481565b600060016003610d8c9190612108565b8210610dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc490612593565b60405180910390fd5b6000600c54831614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906125ff565b60405180910390fd5b81600c600082825417925050819055506003600c541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e600c54604051610e5d9190611e34565b60405180910390a2600c549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060006060600080610ea8610cd8565b50600b60009054906101000a900460ff1615610ece57600097505050505050505061121a565b610ed66114e1565b955085600754610ee69190612213565b9650600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548703610f3e57600097505050505050505061121a565b600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487610f89919061261f565b9450600860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054871115610fdd57889150309050611012565b3091508890507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8561100f9190612662565b94505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16828287604051602401611060939291906126da565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516110ea9190612327565b6000604051808303816000865af19150503d8060008114611127576040519150601f19603f3d011682016040523d82523d6000602084013e61112c565b606091505b50809450819550505083611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c9061238a565b60405180910390fd5b8280602001905181019061118991906123d6565b9350836111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c29061244f565b60405180910390fd5b86600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550849750505050505050505b919050565b600a5481565b600061123033610e93565b905090565b6000611244600160ff16610906565b15611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906124bb565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130990612527565b60405180910390fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000611382600260ff16610906565b156113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b9906124bb565b60405180910390fd5b6113cb3361085a565b61140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190612527565b60405180910390fd5b611412610cd8565b50600b60009054906101000a900460ff16156114315760009050611442565b61143d83836001611591565b600190505b92915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611476611c1b565b6000611480611c1b565b60088461148d9190612711565b915081816000600281106114a4576114a36120d9565b5b6020020181815250506008846114ba919061202b565b816001600281106114ce576114cd6120d9565b5b6020020181815250508092505050919050565b60008060006114ee611985565b91506006548214611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906127c7565b60405180910390fd5b600554821015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090612833565b60405180910390fd5b600554826115879190611ffa565b9050809250505090565b600082116115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb9061289f565b60405180910390fd5b6115dc611c1b565b6000806115e88661146e565b9250826000600281106115fe576115fd6120d9565b5b6020020151915082600160028110611619576116186120d9565b5b602002015160ff1660019060020a02905060005b8581101561197c5760006004541161167a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116719061290b565b60405180910390fd5b6116848383611aff565b6116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90612977565b60405180910390fd5b8415611803578160038481546116d89061219a565b81106116e7576116e66120d9565b5b8154600116156117065790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f01000000000000000000000000000000000000000000000000000000000000000260038481546117809061219a565b811061178f5761178e6120d9565b5b8154600116156117ae5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f010000000000000000000000000000000000000000000000000000000000000084040217905550600760008154809291906117f9906121cb565b9190505550611921565b8160028481546118129061219a565b8110611821576118206120d9565b5b8154600116156118405790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f01000000000000000000000000000000000000000000000000000000000000000260028481546118ba9061219a565b81106118c9576118c86120d9565b5b8154600116156118e85790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b60808260ff1603611943578280611937906121cb565b93505060019150611951565b60018260ff169060020a0291505b6004600081548092919061196490612997565b91905055508080611974906121cb565b91505061162d565b50505050505050565b60008060606000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f18160ddd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611a559190612327565b6000604051808303816000865af19150503d8060008114611a92576040519150601f19603f3d011682016040523d82523d6000602084013e611a97565b606091505b50809350819450505082611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79061238a565b60405180910390fd5b81806020019051810190611af491906129d5565b905080935050505090565b600080826003858154611b119061219a565b8110611b2057611b1f6120d9565b5b815460011615611b3f5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090046002868154611b969061219a565b8110611ba557611ba46120d9565b5b815460011615611bc45790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004171660ff1614905092915050565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611c7781611c42565b8114611c8257600080fd5b50565b600081359050611c9481611c6e565b92915050565b600060208284031215611cb057611caf611c3d565b5b6000611cbe84828501611c85565b91505092915050565b60008115159050919050565b611cdc81611cc7565b82525050565b6000602082019050611cf76000830184611cd3565b92915050565b6000819050919050565b611d1081611cfd565b8114611d1b57600080fd5b50565b600081359050611d2d81611d07565b92915050565b60008060408385031215611d4a57611d49611c3d565b5b6000611d5885828601611d1e565b9250506020611d6985828601611d1e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611dad578082015181840152602081019050611d92565b60008484015250505050565b6000601f19601f8301169050919050565b6000611dd582611d73565b611ddf8185611d7e565b9350611def818560208601611d8f565b611df881611db9565b840191505092915050565b60006020820190508181036000830152611e1d8184611dca565b905092915050565b611e2e81611cfd565b82525050565b6000602082019050611e496000830184611e25565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e7a82611e4f565b9050919050565b611e8a81611e6f565b8114611e9557600080fd5b50565b600081359050611ea781611e81565b92915050565b600060208284031215611ec357611ec2611c3d565b5b6000611ed184828501611e98565b91505092915050565b600060208284031215611ef057611eef611c3d565b5b6000611efe84828501611d1e565b91505092915050565b600060ff82169050919050565b611f1d81611f07565b82525050565b6000602082019050611f386000830184611f14565b92915050565b611f4781611e6f565b82525050565b6000602082019050611f626000830184611f3e565b92915050565b6000819050919050565b611f7b81611f68565b82525050565b6000602082019050611f966000830184611f72565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061200582611cfd565b915061201083611cfd565b9250826120205761201f611f9c565b5b828204905092915050565b600061203682611cfd565b915061204183611cfd565b92508261205157612050611f9c565b5b828206905092915050565b600082825260208201905092915050565b7f4552525f424f554e444152590000000000000000000000000000000000000000600082015250565b60006120a3600c8361205c565b91506120ae8261206d565b602082019050919050565b600060208201905081810360008301526120d281612096565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061211382611cfd565b915061211e83611cfd565b925082820190508082111561213657612135611fcb565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806121b257607f821691505b6020821081036121c5576121c461216b565b5b50919050565b60006121d682611cfd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361220857612207611fcb565b5b600182019050919050565b600061221e82611cfd565b915061222983611cfd565b925082820261223781611cfd565b9150828204841483151761224e5761224d611fcb565b5b5092915050565b6000819050919050565b600061227a61227561227084611e4f565b612255565b611e4f565b9050919050565b600061228c8261225f565b9050919050565b600061229e82612281565b9050919050565b6122ae81612293565b82525050565b60006060820190506122c96000830186611f3e565b6122d660208301856122a5565b6122e36040830184611e25565b949350505050565b600081905092915050565b600061230182611d73565b61230b81856122eb565b935061231b818560208601611d8f565b80840191505092915050565b600061233382846122f6565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b600061237460098361205c565b915061237f8261233e565b602082019050919050565b600060208201905081810360008301526123a381612367565b9050919050565b6123b381611cc7565b81146123be57600080fd5b50565b6000815190506123d0816123aa565b92915050565b6000602082840312156123ec576123eb611c3d565b5b60006123fa848285016123c1565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000612439600c8361205c565b915061244482612403565b602082019050919050565b600060208201905081810360008301526124688161242c565b9050919050565b7f4552525f5345414c454400000000000000000000000000000000000000000000600082015250565b60006124a5600a8361205c565b91506124b08261246f565b602082019050919050565b600060208201905081810360008301526124d481612498565b9050919050565b7f4552525f41585800000000000000000000000000000000000000000000000000600082015250565b600061251160078361205c565b915061251c826124db565b602082019050919050565b6000602082019050818103600083015261254081612504565b9050919050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061257d60118361205c565b915061258882612547565b602082019050919050565b600060208201905081810360008301526125ac81612570565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006125e960128361205c565b91506125f4826125b3565b602082019050919050565b60006020820190508181036000830152612618816125dc565b9050919050565b600061262a82611f68565b915061263583611f68565b925082820390508181126000841216828213600085121516171561265c5761265b611fcb565b5b92915050565b600061266d82611f68565b915061267883611f68565b925082820261268681611f68565b91507f800000000000000000000000000000000000000000000000000000000000000084146000841216156126be576126bd611fcb565b5b82820584148315176126d3576126d2611fcb565b5b5092915050565b60006060820190506126ef6000830186611f3e565b6126fc6020830185611f3e565b6127096040830184611e25565b949350505050565b600061271c82611f68565b915061272783611f68565b92508261273757612736611f9c565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156127705761276f611fcb565b5b828205905092915050565b7f4552525f535550504c595f4348414e4745440000000000000000000000000000600082015250565b60006127b160128361205c565b91506127bc8261277b565b602082019050919050565b600060208201905081810360008301526127e0816127a4565b9050919050565b7f4552525f535550504c595f554e444552464c4f57000000000000000000000000600082015250565b600061281d60148361205c565b9150612828826127e7565b602082019050919050565b6000602082019050818103600083015261284c81612810565b9050919050565b7f4552525f5a45524f434f554e5400000000000000000000000000000000000000600082015250565b6000612889600d8361205c565b915061289482612853565b602082019050919050565b600060208201905081810360008301526128b88161287c565b9050919050565b7f4552525f43415041434954590000000000000000000000000000000000000000600082015250565b60006128f5600c8361205c565b9150612900826128bf565b602082019050919050565b60006020820190508181036000830152612924816128e8565b9050919050565b7f4552525f434f4c4c4953494f4e00000000000000000000000000000000000000600082015250565b6000612961600d8361205c565b915061296c8261292b565b602082019050919050565b6000602082019050818103600083015261299081612954565b9050919050565b60006129a282611cfd565b9150600082036129b5576129b4611fcb565b5b600182039050919050565b6000815190506129cf81611d07565b92915050565b6000602082840312156129eb576129ea611c3d565b5b60006129f9848285016129c0565b9150509291505056fea2646970667358221220da7fb883e1467cf1f3e38e8260da87f90c2a67006535bb5ba05d4389194d1daf64736f6c63430008130033 +\ No newline at end of file diff --git a/python/evm_booking/data/Booking.json b/python/evm_booking/data/Booking.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_resolution","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"consume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"depositFor","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"raw","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"removeWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"share","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] +[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_resolution","type":"uint256"},{"internalType":"uint256","name":"_expireTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"consume","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"depositFor","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"raw","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"removeWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"share","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}] diff --git a/python/evm_booking/data/Booking.metadata.json b/python/evm_booking/data/Booking.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_resolution","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"consume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"depositFor","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"raw","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"removeWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"share","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"Booking.sol":"ERC20Book"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"Booking.sol":{"keccak256":"0x95ed049d3f54ace51ec755975c56f73b0e7853e68e80624a75a31fd805cff244","license":"AGPL-3.0-or-later","urls":["bzz-raw://5fabc412a0abd58c5a7af1c83bf3b76142853e6f49bf5250a75fd2c04ca2d762","dweb:/ipfs/QmNx6mc3FrvvvTS1QKghU7Y9htVvL9FpqJkzdDTNWMoSpo"]}},"version":1} +{"compiler":{"version":"0.8.19+commit.7dd6d404"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_resolution","type":"uint256"},{"internalType":"uint256","name":"_expireTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"consume","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"depositFor","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_offset","type":"uint256"}],"name":"raw","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"removeWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"share","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"Booking.sol":"ERC20Book"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"Booking.sol":{"keccak256":"0xf99cfe71be0ba289f74023a43a1b948eaabb5c76107db6f72d1e31824825796b","license":"AGPL-3.0-or-later","urls":["bzz-raw://93aeb3b5fd54b5c7afd4452ee1096b40ad769150a2e954b2d4de94daab7c8614","dweb:/ipfs/QmcAtG9oAq7cBPwp6KjXheSGKA9NS7CyjfXZgHtPfjAyiq"]}},"version":1} diff --git a/python/evm_booking/time.py b/python/evm_booking/time.py @@ -24,14 +24,17 @@ class TimeBooking(Booking): if period_seconds % resolution_seconds > 0: raise ValueError("period must be evenly divided in resolution") self.start = None + self.end = None + duration = period_seconds * resolution_seconds if start_seconds != None: self.start = datetime.datetime.fromtimestamp(start_seconds) + self.end = self.start + datetime.timedelta(seconds=duration + 1) self.unit = resolution_seconds self.capacity_units = int(period_seconds / resolution_seconds) def constructor(self, sender_address, token_address, tx_format=TxFormat.JSONRPC, version=None): - return super(TimeBooking, self).constructor(sender_address, token_address, self.capacity_units, tx_format=tx_format, version=version) + return super(TimeBooking, self).constructor(sender_address, token_address, self.capacity_units, self.end, tx_format=tx_format, version=version) def share_date(self, contract_address, sender_address, start_date, count, ref_date=None, tx_format=TxFormat.JSONRPC, id_generator=None): diff --git a/python/evm_booking/unittest/base.py b/python/evm_booking/unittest/base.py @@ -1,6 +1,6 @@ # standard imports import logging -import time +import datetime # external imports from chainlib.eth.unittest.ethtester import EthTesterCase @@ -23,6 +23,7 @@ DEFAULT_RESOLUTION = 366*24 class TestBooking(TestGiftableToken): expire = 0 + booking_expire = datetime.datetime.utcnow() + datetime.timedelta(days=365) def setUp(self): super(TestBooking, self).setUp() @@ -35,7 +36,7 @@ class TestBooking(TestGiftableToken): def publish(self, resolution=DEFAULT_RESOLUTION): nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.rpc) c = Booking(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.constructor(self.accounts[0], self.token_address, resolution) + (tx_hash, o) = c.constructor(self.accounts[0], self.token_address, resolution, self.booking_expire) self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) diff --git a/python/tests/test_time.py b/python/tests/test_time.py @@ -25,8 +25,8 @@ class TestBookingTime(TestGiftableToken): super(TestBookingTime, self).setUp() self.token_address = self.address - d = datetime.datetime(year=1984, month=1, day=1) - d = int(d.timestamp()) + self.start = datetime.datetime(year=1984, month=1, day=1) + d = int(self.start.timestamp()) nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.rpc) c = TimeBooking(self.chain_spec, PERIOD_LEAPYEAR, PERIOD_HALFHOUR, start_seconds=d, signer=self.signer, nonce_oracle=nonce_oracle) (tx_hash, o) = c.constructor(self.accounts[0], self.token_address) @@ -39,6 +39,15 @@ class TestBookingTime(TestGiftableToken): self.caller = TimeBooking(self.chain_spec, PERIOD_LEAPYEAR, PERIOD_HALFHOUR, start_seconds=d) + def test_end(self): + c = TimeBooking(self.chain_spec, PERIOD_LEAPYEAR, PERIOD_HALFHOUR) + o = c.expires(self.booking_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + expect = self.start + datetime.timedelta(seconds=PERIOD_LEAPYEAR * PERIOD_HALFHOUR) + expect_seconds = expect.timestamp() + 1 + self.assertEqual(int(r, 16), expect_seconds) + + def test_uneven(self): d = datetime.datetime(year=1984, month=1, day=1) d = int(d.timestamp()) diff --git a/solidity/Booking.sol b/solidity/Booking.sol @@ -7,7 +7,6 @@ pragma solidity ^0.8.0; contract ERC20Book { - // Implements ERC173 address public owner; address public token; bytes slots; @@ -18,16 +17,25 @@ contract ERC20Book { uint256 public shareCount; mapping ( address => uint256 ) shares; mapping ( address => bool ) writers; + uint256 public expires; + bool expired; // Implements Seal event SealStateChange(bool indexed _final, uint256 _sealState); + // Implements Seal uint256 public sealState; uint8 constant WRITER_STATE = 1; - uint256 constant public maxSealState = 1; + uint8 constant SHARE_STATE = 2; + uint256 constant public maxSealState = 3; + + // Implements Expire + event Expired(uint256 _timestamp); - constructor (address _token, uint256 _resolution) { + constructor (address _token, uint256 _resolution, uint256 _expireTimestamp) { require(_resolution > 0 && _resolution < (1 << 128), "ERR_NONSENSE"); + require(_expireTimestamp > block.timestamp, "ERR_PAST"); + uint256[2] memory r; r = getPos(_resolution); @@ -38,8 +46,10 @@ contract ERC20Book { token = _token; originalTokenSupply = tokenSupply(); owner = msg.sender; + expires = _expireTimestamp; } + // Implements Seal function seal(uint256 _state) public returns(uint256) { require(_state < maxSealState + 1, 'ERR_INVALID_STATE'); require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); @@ -48,6 +58,7 @@ contract ERC20Book { return uint256(sealState); } + // Implements Seal function isSealed(uint256 _state) public view returns(bool) { require(_state < maxSealState); if (_state == 0) { @@ -86,6 +97,11 @@ contract ERC20Book { address l_sender; address l_receiver; + applyExpiry(); + if (expired) { + return 0; + } + l_unit = unitValue(); //return shareCount * l_unit; l_limit = shareCount * l_unit; @@ -139,11 +155,16 @@ contract ERC20Book { return l_supply; } - function consume(uint256 _offset, uint256 _count) public { + function consume(uint256 _offset, uint256 _count) public returns(bool) { bool r; bytes memory v; uint256 l_value; + applyExpiry(); + if (expired) { + return false; + } + l_value = unitValue() * _count; (r, v) = token.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', msg.sender, this, l_value)); require(r, "ERR_TOKEN"); @@ -151,11 +172,19 @@ contract ERC20Book { require(r, "ERR_TRANSFER"); reserve(_offset, _count, false); + return true; } - function share(uint256 _offset, uint256 _count) public { + function share(uint256 _offset, uint256 _count) public returns(bool) { + require(!isSealed(SHARE_STATE), "ERR_SEALED"); require(isWriter(msg.sender), "ERR_AXX"); + + applyExpiry(); + if (expired) { + return false; + } reserve(_offset, _count, true); + return true; } // improve by comparing word by word @@ -226,4 +255,37 @@ contract ERC20Book { } return r; } + + // Implements Expire + function applyExpiry() public returns(uint8) { + if (expires == 0) { + return 0; + } + if (expired) { + return 1; + } + if (block.timestamp >= expires) { + expired = true; + emit Expired(block.timestamp); + return 2; + } + return 0; + } + + // Implements EIP165 + function supportsInterface(bytes4 _sum) public pure returns (bool) { + if (_sum == 0x0d7491f8) { // Seal + return true; + } + if (_sum == 0xabe1f1f5) { // Writer + return true; + } + if (_sum == 0x841a0e94) { // Expire + return true; + } + if (_sum == 0x01ffc9a7) { // ERC165 + return true; + } + return false; + } }