evm-booking

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

commit 1d7721421534dc655dc22710445976b5b509438b
parent bd15c0d6c982c2ed58201914c6633a3c70761959
Author: lash <dev@holbrook.no>
Date:   Tue, 30 May 2023 11:20:18 +0100

Add slots for shared deposits, deposit sync function

Diffstat:
Mpython/evm_booking/booking.py | 11+++++++----
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/unittest/base.py | 9++++++---
Msolidity/Booking.sol | 72+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
6 files changed, 80 insertions(+), 20 deletions(-)

diff --git a/python/evm_booking/booking.py b/python/evm_booking/booking.py @@ -37,17 +37,18 @@ class Booking(TxFactory): __abi = None __bytecode = None - def constructor(self, sender_address, cap, tx_format=TxFormat.JSONRPC, version=None): - code = self.cargs(cap, version=version) + def constructor(self, sender_address, token_address, cap, tx_format=TxFormat.JSONRPC, version=None): + code = self.cargs(token_address, cap, 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(cap, version=None): + def cargs(token_address, cap, version=None): code = Booking.bytecode(version=version) enc = ABIContractEncoder() + enc.address(token_address) enc.uint256(cap) args = enc.get() code += args @@ -79,13 +80,15 @@ class Booking(TxFactory): return Booking.__bytecode - def reserve(self, contract_address, sender_address, offset, count, tx_format=TxFormat.JSONRPC, id_generator=None): + def reserve(self, contract_address, sender_address, offset, count, share=False, tx_format=TxFormat.JSONRPC, id_generator=None): enc = ABIContractEncoder() enc.method('reserve') enc.typ(ABIContractType.UINT256) enc.typ(ABIContractType.UINT256) + enc.typ(ABIContractType.BOOLEAN) enc.uint256(offset) enc.uint256(count) + enc.uint256(share) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address, use_nonce=True) tx = self.set_code(tx, data) diff --git a/python/evm_booking/data/Booking.bin b/python/evm_booking/data/Booking.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b506040516200116a3803806200116a833981810160405281019062000037919062000259565b60008111801562000058575070010000000000000000000000000000000081105b6200009a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200009190620002ec565b60405180910390fd5b620000a4620001f7565b620000be826200015a640100000000026401000000009004565b9050600181600060028110620000d957620000d86200030e565b5b6020020151620000ea91906200036c565b67ffffffffffffffff811115620001065762000105620003a7565b5b6040519080825280601f01601f191660200182016040528015620001395781602001600182028036833780820191505090505b50600090816200014a91906200061d565b508160018190555050506200087e565b62000164620001f7565b600062000170620001f7565b600160086001866200018391906200070e565b6200018f919062000787565b6200019b9190620007fb565b91508181600060028110620001b557620001b46200030e565b5b602002018181525050600884620001cd919062000846565b81600160028110620001e457620001e36200030e565b5b6020020181815250508092505050919050565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b6000819050919050565b62000233816200021e565b81146200023f57600080fd5b50565b600081519050620002538162000228565b92915050565b60006020828403121562000272576200027162000219565b5b6000620002828482850162000242565b91505092915050565b600082825260208201905092915050565b7f4552525f4e4f4e53454e53450000000000000000000000000000000000000000600082015250565b6000620002d4600c836200028b565b9150620002e1826200029c565b602082019050919050565b600060208201905081810360008301526200030781620002c5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000379826200021e565b915062000386836200021e565b9250828201905080821115620003a157620003a06200033d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042957607f821691505b6020821081036200043f576200043e620003e1565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620004ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200046a565b620004b886836200046a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620004fb620004f5620004ef846200021e565b620004d0565b6200021e565b9050919050565b6000819050919050565b6200051783620004da565b6200052f620005268262000502565b8484546200047a565b825550505050565b600090565b6200054662000537565b620005538184846200050c565b505050565b5b818110156200057b576200056f6000826200053c565b60018101905062000559565b5050565b601f821115620005ca57620005948162000445565b6200059f846200045a565b81016020851015620005af578190505b620005c7620005be856200045a565b83018262000558565b50505b505050565b60008160020a8304905092915050565b6000620005f260001984600802620005cf565b1980831691505092915050565b60006200060d8383620005df565b9150826002028217905092915050565b6200062882620003d6565b67ffffffffffffffff811115620006445762000643620003a7565b5b62000650825462000410565b6200065d8282856200057f565b600060209050601f83116001811462000695576000841562000680578287015190505b6200068c8582620005ff565b865550620006fc565b601f198416620006a58662000445565b60005b82811015620006cf57848901518255600182019150602085019450602081019050620006a8565b86831015620006ef5784890151620006eb601f891682620005df565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b60006200071b8262000704565b9150620007288362000704565b92508282039050818112600084121682821360008512151617156200075257620007516200033d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620007948262000704565b9150620007a18362000704565b925082620007b457620007b362000758565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615620007f057620007ef6200033d565b5b828205905092915050565b6000620008088262000704565b9150620008158362000704565b92508282019050828112156000831216838212600084121516171562000840576200083f6200033d565b5b92915050565b600062000853826200021e565b915062000860836200021e565b92508262000873576200087262000758565b5b828206905092915050565b6108dc806200088e6000396000f3fe608060405234801561001057600080fd5b5060043610610048576000357c010000000000000000000000000000000000000000000000000000000090048063244282211461004d575b600080fd5b61006760048036038101906100629190610487565b610069565b005b600081116100ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100a390610524565b60405180910390fd5b6100b461042a565b6000806100c08561039f565b9250826000600281106100d6576100d5610544565b5b60200201519150826001600281106100f1576100f0610544565b5b602002015160ff1660019060020a02905060005b8481101561039757600060015411610152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610149906105bf565b60405180910390fd5b60008260008581546101639061060e565b811061017257610171610544565b5b8154600116156101915790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16111561021f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102169061068b565b60405180910390fd5b81600084815461022e9061060e565b811061023d5761023c610544565b5b81546001161561025c5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f01000000000000000000000000000000000000000000000000000000000000000260008481546102d69061060e565b81106102e5576102e4610544565b5b8154600116156103045790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555060808260ff160361035e578280610352906106da565b9350506001915061036c565b60018260ff169060020a0291505b6001600081548092919061037f90610722565b9190505550808061038f906106da565b915050610105565b505050505050565b6103a761042a565b60006103b161042a565b600160086001866103c29190610755565b6103cc91906107c7565b6103d69190610831565b915081816000600281106103ed576103ec610544565b5b6020020181815250506008846104039190610875565b8160016002811061041757610416610544565b5b6020020181815250508092505050919050565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b6000819050919050565b61046481610451565b811461046f57600080fd5b50565b6000813590506104818161045b565b92915050565b6000806040838503121561049e5761049d61044c565b5b60006104ac85828601610472565b92505060206104bd85828601610472565b9150509250929050565b600082825260208201905092915050565b7f4552525f5a45524f434f554e5400000000000000000000000000000000000000600082015250565b600061050e600d836104c7565b9150610519826104d8565b602082019050919050565b6000602082019050818103600083015261053d81610501565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f43415041434954590000000000000000000000000000000000000000600082015250565b60006105a9600c836104c7565b91506105b482610573565b602082019050919050565b600060208201905081810360008301526105d88161059c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061062657607f821691505b602082108103610639576106386105df565b5b50919050565b7f4552525f434f4c4c4953494f4e00000000000000000000000000000000000000600082015250565b6000610675600d836104c7565b91506106808261063f565b602082019050919050565b600060208201905081810360008301526106a481610668565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006106e582610451565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610717576107166106ab565b5b600182019050919050565b600061072d82610451565b9150600082036107405761073f6106ab565b5b600182039050919050565b6000819050919050565b60006107608261074b565b915061076b8361074b565b9250828203905081811260008412168282136000851215161715610792576107916106ab565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006107d28261074b565b91506107dd8361074b565b9250826107ed576107ec610798565b5b600160000383147f800000000000000000000000000000000000000000000000000000000000000083141615610826576108256106ab565b5b828205905092915050565b600061083c8261074b565b91506108478361074b565b92508282019050828112156000831216838212600084121516171561086f5761086e6106ab565b5b92915050565b600061088082610451565b915061088b83610451565b92508261089b5761089a610798565b5b82820690509291505056fea2646970667358221220359410e459b8be04e8579c7c62d12662b09c2f67446fdeecf9a6944ff0ea473764736f6c63430008130033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162001c1038038062001c10833981810160405281019062000037919062000393565b60008111801562000058575070010000000000000000000000000000000081105b6200009a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000091906200043b565b60405180910390fd5b620000a4620002cc565b620000be826200022f640100000000026401000000009004565b9050600181600060028110620000d957620000d86200045d565b5b6020020151620000ea9190620004bb565b67ffffffffffffffff811115620001065762000105620004f6565b5b6040519080825280601f01601f191660200182016040528015620001395781602001600182028036833780820191505090505b50600190816200014a91906200076c565b506001816000600281106200016457620001636200045d565b5b6020020151620001759190620004bb565b67ffffffffffffffff811115620001915762000190620004f6565b5b6040519080825280601f01601f191660200182016040528015620001c45781602001600182028036833780820191505090505b5060029081620001d591906200076c565b5081600381905550600354600481905550826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620009cd565b62000239620002cc565b600062000245620002cc565b600160086001866200025891906200085d565b620002649190620008d6565b6200027091906200094a565b915081816000600281106200028a57620002896200045d565b5b602002018181525050600884620002a2919062000995565b81600160028110620002b957620002b86200045d565b5b6020020181815250508092505050919050565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200032082620002f3565b9050919050565b620003328162000313565b81146200033e57600080fd5b50565b600081519050620003528162000327565b92915050565b6000819050919050565b6200036d8162000358565b81146200037957600080fd5b50565b6000815190506200038d8162000362565b92915050565b60008060408385031215620003ad57620003ac620002ee565b5b6000620003bd8582860162000341565b9250506020620003d0858286016200037c565b9150509250929050565b600082825260208201905092915050565b7f4552525f4e4f4e53454e53450000000000000000000000000000000000000000600082015250565b600062000423600c83620003da565b91506200043082620003eb565b602082019050919050565b60006020820190508181036000830152620004568162000414565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004c88262000358565b9150620004d58362000358565b9250828201905080821115620004f057620004ef6200048c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057857607f821691505b6020821081036200058e576200058d62000530565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620005fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005b9565b620006078683620005b9565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200064a620006446200063e8462000358565b6200061f565b62000358565b9050919050565b6000819050919050565b620006668362000629565b6200067e620006758262000651565b848454620005c9565b825550505050565b600090565b6200069562000686565b620006a28184846200065b565b505050565b5b81811015620006ca57620006be6000826200068b565b600181019050620006a8565b5050565b601f8211156200071957620006e38162000594565b620006ee84620005a9565b81016020851015620006fe578190505b620007166200070d85620005a9565b830182620006a7565b50505b505050565b60008160020a8304905092915050565b600062000741600019846008026200071e565b1980831691505092915050565b60006200075c83836200072e565b9150826002028217905092915050565b620007778262000525565b67ffffffffffffffff811115620007935762000792620004f6565b5b6200079f82546200055f565b620007ac828285620006ce565b600060209050601f831160018114620007e45760008415620007cf578287015190505b620007db85826200074e565b8655506200084b565b601f198416620007f48662000594565b60005b828110156200081e57848901518255600182019150602085019450602081019050620007f7565b868310156200083e57848901516200083a601f8916826200072e565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b60006200086a8262000853565b9150620008778362000853565b9250828203905081811260008412168282136000851215161715620008a157620008a06200048c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620008e38262000853565b9150620008f08362000853565b925082620009035762000902620008a7565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156200093f576200093e6200048c565b5b828205905092915050565b6000620009578262000853565b9150620009648362000853565b9250828201905082811215600083121683821260008412151617156200098f576200098e6200048c565b5b92915050565b6000620009a28262000358565b9150620009af8362000358565b925082620009c257620009c1620008a7565b5b828206905092915050565b61123380620009dd6000396000f3fe608060405234801561001057600080fd5b5060043610610074576000357c01000000000000000000000000000000000000000000000000000000009004806318160ddd146100795780635cfc1a51146100975780637f03864b146100b5578063a245d9b9146100d3578063f340fa01146100ef575b600080fd5b61008161011f565b60405161008e9190610a1a565b60405180910390f35b61009f610125565b6040516100ac9190610a1a565b60405180910390f35b6100bd61012b565b6040516100ca9190610a1a565b60405180910390f35b6100ed60048036038101906100e89190610a9e565b610131565b005b61010960048036038101906101049190610b4f565b610525565b6040516101169190610b95565b60405180910390f35b60045481565b60035481565b60055481565b60008211610174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161016b90610c0d565b60405180910390fd5b61017c6109df565b60008061018886610838565b92508260006002811061019e5761019d610c2d565b5b60200201519150826001600281106101b9576101b8610c2d565b5b602002015160ff1660019060020a02905060005b8581101561051c5760006003541161021a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021190610ca8565b60405180910390fd5b61022483836108c3565b610263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161025a90610d14565b60405180910390fd5b84156103a35781600284815461027890610d63565b811061028757610286610c2d565b5b8154600116156102a65790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f010000000000000000000000000000000000000000000000000000000000000002600284815461032090610d63565b811061032f5761032e610c2d565b5b81546001161561034e5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055506005600081548092919061039990610dc3565b91905055506104c1565b8160018481546103b290610d63565b81106103c1576103c0610c2d565b5b8154600116156103e05790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004177f010000000000000000000000000000000000000000000000000000000000000002600184815461045a90610d63565b811061046957610468610c2d565b5b8154600116156104885790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b60808260ff16036104e35782806104d790610dc3565b935050600191506104f1565b60018260ff169060020a0291505b6003600081548092919061050490610e0b565b9190505550808061051490610dc3565b9150506101cd565b50505050505050565b6000806000806000806060600454945060045485101561057a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057190610e80565b60405180910390fd5b600454856105889190610ecf565b9550856005546105989190610f00565b9350600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484036105ef5760009650505050505050610833565b600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461063a9190610f42565b9250600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548411156107e55760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168830856040516024016106cf93929190610ff3565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610759919061109b565b6000604051808303816000865af19150503d8060008114610796576040519150601f19603f3d011682016040523d82523d6000602084013e61079b565b606091505b508092508193505050816107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db906110fe565b60405180910390fd5b5b83600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508296505050505050505b919050565b6108406109df565b600061084a6109df565b6001600860018661085b9190610f42565b610865919061111e565b61086f9190611188565b9150818160006002811061088657610885610c2d565b5b60200201818152505060088461089c91906111cc565b816001600281106108b0576108af610c2d565b5b6020020181815250508092505050919050565b6000808260028581546108d590610d63565b81106108e4576108e3610c2d565b5b8154600116156109035790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004600186815461095a90610d63565b811061096957610968610c2d565b5b8154600116156109885790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004171660ff1614905092915050565b6040518060400160405280600290602082028036833780820191505090505090565b6000819050919050565b610a1481610a01565b82525050565b6000602082019050610a2f6000830184610a0b565b92915050565b600080fd5b610a4381610a01565b8114610a4e57600080fd5b50565b600081359050610a6081610a3a565b92915050565b60008115159050919050565b610a7b81610a66565b8114610a8657600080fd5b50565b600081359050610a9881610a72565b92915050565b600080600060608486031215610ab757610ab6610a35565b5b6000610ac586828701610a51565b9350506020610ad686828701610a51565b9250506040610ae786828701610a89565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b1c82610af1565b9050919050565b610b2c81610b11565b8114610b3757600080fd5b50565b600081359050610b4981610b23565b92915050565b600060208284031215610b6557610b64610a35565b5b6000610b7384828501610b3a565b91505092915050565b6000819050919050565b610b8f81610b7c565b82525050565b6000602082019050610baa6000830184610b86565b92915050565b600082825260208201905092915050565b7f4552525f5a45524f434f554e5400000000000000000000000000000000000000600082015250565b6000610bf7600d83610bb0565b9150610c0282610bc1565b602082019050919050565b60006020820190508181036000830152610c2681610bea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f43415041434954590000000000000000000000000000000000000000600082015250565b6000610c92600c83610bb0565b9150610c9d82610c5c565b602082019050919050565b60006020820190508181036000830152610cc181610c85565b9050919050565b7f4552525f434f4c4c4953494f4e00000000000000000000000000000000000000600082015250565b6000610cfe600d83610bb0565b9150610d0982610cc8565b602082019050919050565b60006020820190508181036000830152610d2d81610cf1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610d7b57607f821691505b602082108103610d8e57610d8d610d34565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610dce82610a01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610e0057610dff610d94565b5b600182019050919050565b6000610e1682610a01565b915060008203610e2957610e28610d94565b5b600182039050919050565b7f4552525f535550504c595f554e444552464c4f57000000000000000000000000600082015250565b6000610e6a601483610bb0565b9150610e7582610e34565b602082019050919050565b60006020820190508181036000830152610e9981610e5d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610eda82610a01565b9150610ee583610a01565b925082610ef557610ef4610ea0565b5b828204905092915050565b6000610f0b82610a01565b9150610f1683610a01565b9250828202610f2481610a01565b91508282048414831517610f3b57610f3a610d94565b5b5092915050565b6000610f4d82610b7c565b9150610f5883610b7c565b9250828203905081811260008412168282136000851215161715610f7f57610f7e610d94565b5b92915050565b610f8e81610b11565b82525050565b6000819050919050565b6000610fb9610fb4610faf84610af1565b610f94565b610af1565b9050919050565b6000610fcb82610f9e565b9050919050565b6000610fdd82610fc0565b9050919050565b610fed81610fd2565b82525050565b60006060820190506110086000830186610f85565b6110156020830185610fe4565b6110226040830184610a0b565b949350505050565b600081519050919050565b600081905092915050565b60005b8381101561105e578082015181840152602081019050611043565b60008484015250505050565b60006110758261102a565b61107f8185611035565b935061108f818560208601611040565b80840191505092915050565b60006110a7828461106a565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b60006110e8600983610bb0565b91506110f3826110b2565b602082019050919050565b60006020820190508181036000830152611117816110db565b9050919050565b600061112982610b7c565b915061113483610b7c565b92508261114457611143610ea0565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561117d5761117c610d94565b5b828205905092915050565b600061119382610b7c565b915061119e83610b7c565b9250828201905082811215600083121683821260008412151617156111c6576111c5610d94565b5b92915050565b60006111d782610a01565b91506111e283610a01565b9250826111f2576111f1610ea0565b5b82820690509291505056fea26469706673582212204c3235554c7ee7b14310bf4d04a8591ac9457c32261b979be65c0a6c7b5141d864736f6c63430008130033 +\ 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":"uint256","name":"_resolution","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_resolution","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"_share","type":"bool"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_resolution","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","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":"0xeb37d64a92c5cfc7acaab0b36a4781ebed832704d407668ba44e1c7331c0a74e","license":"AGPL-3.0-or-later","urls":["bzz-raw://fc29464854aed51c75df587492be66e1bc8e59169ff8af6dc3c4c4f68863fe1b","dweb:/ipfs/QmagaVgTZPZWD9KvKUwQCoFbfSQeqhxM52ApvRCVKxDfDu"]}},"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"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"capacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"}],"name":"deposit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"_share","type":"bool"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shareCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"0x439456bfa397c21c94aa8e81d2a8de3da2b214bef4e2f7fce4bd1a111bcd1772","license":"AGPL-3.0-or-later","urls":["bzz-raw://99160c677979c67558187fec67d804feba55b96dca88e5442dc4b1d762d83e0f","dweb:/ipfs/QmUttGDQshuz2wotNmq6CLzAHamugoUe8SdqEBQ3Z9opxF"]}},"version":1} diff --git a/python/evm_booking/unittest/base.py b/python/evm_booking/unittest/base.py @@ -18,7 +18,8 @@ from evm_booking import Booking logg = logging.getLogger(__name__) -class TestBooking(EthTesterCase): #TestGiftableToken): +#class TestBooking(EthTesterCase): #TestGiftableToken): +class TestBooking(TestGiftableToken): expire = 0 @@ -27,15 +28,17 @@ class TestBooking(EthTesterCase): #TestGiftableToken): self.alice = self.accounts[1] self.bob = self.accounts[2] + self.token_address = self.address def publish(self, resolution=366*24): 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], resolution) + (tx_hash, o) = c.constructor(self.accounts[0], self.token_address, resolution) self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) self.address = to_checksum_address(r['contract_address']) - logg.debug('published booker on address {} with hash {}'.format(self.address, tx_hash)) + self.booking_address = self.address + logg.debug('published booker on address {} with hash {}'.format(self.booking_address, tx_hash)) diff --git a/solidity/Booking.sol b/solidity/Booking.sol @@ -7,20 +7,67 @@ pragma solidity ^0.8.0; contract ERC20Book { + address token; bytes slots; - uint256 cap; + bytes sharedSlots; + uint256 public capacity; + uint256 public totalSupply; + uint256 public shareCount; + mapping ( address => uint256 ) shares; - constructor (uint256 _resolution) { + constructor (address _token, uint256 _resolution) { require(_resolution > 0 && _resolution < (1 << 128), "ERR_NONSENSE"); uint256[2] memory r; r = getPos(_resolution); slots = new bytes(r[0] + 1); - cap = _resolution; + sharedSlots = new bytes(r[0] + 1); + capacity = _resolution; + totalSupply = capacity; + token = _token; + } + + function deposit(address _spender) public returns (int256) { + uint256 l_unit; + uint256 l_supply; + uint256 l_limit; + int256 l_value; + bool r; + bytes memory v; + + l_supply = totalSupply; + require(l_supply >= totalSupply, "ERR_SUPPLY_UNDERFLOW"); + + l_unit = l_supply / totalSupply; + l_limit = shareCount * l_unit; + if (l_limit == shares[_spender]) { + return 0; + } + + l_value = int256(l_limit) - int256(shares[_spender]); + if (l_limit > shares[_spender]) { + (r, v) = token.call(abi.encodeWithSignature('transferFrom(address,address,uint256)', _spender, this, uint256(l_value))); + require(r, "ERR_TOKEN"); + } + + shares[_spender] = l_limit; + return l_value; + } + + function tokenSupply() internal returns (uint256) { + bool r; + bytes memory v; + uint256 l_supply; + + (r, v) = token.call(abi.encodeWithSignature('totalSupply()')); + require(r, "ERR_TOKEN"); + l_supply = abi.decode(v, (uint256)); + + return l_supply; } // improve by comparing word by word - function reserve(uint256 _offset, uint256 _count) public { + function reserve(uint256 _offset, uint256 _count, bool _share) public { require(_count > 0, "ERR_ZEROCOUNT"); uint256[2] memory c; uint256 cy; @@ -30,21 +77,28 @@ contract ERC20Book { cy = c[0]; ci = uint8(1 << (uint8(c[1]))); for (uint256 i = 0; i < _count; i++) { - require(cap > 0, "ERR_CAPACITY"); - if (uint8(slots[cy]) & ci > 0) { - revert("ERR_COLLISION"); + require(capacity > 0, "ERR_CAPACITY"); + require(slotAvailable(cy, ci), "ERR_COLLISION"); + if (_share) { + sharedSlots[cy] = bytes1(uint8(sharedSlots[cy]) | ci); + shareCount++; + } else { + slots[cy] = bytes1(uint8(slots[cy]) | ci); } - slots[cy] = bytes1(uint8(slots[cy]) | ci); if (ci == 128) { cy++; ci = 1; } else { ci <<= 1; } - cap--; + capacity--; } } + function slotAvailable(uint256 _byte, uint8 _bitVal) internal view returns (bool) { + return (uint8(slots[_byte]) | uint8(sharedSlots[_byte])) & _bitVal == 0; + } + function getPos(uint256 bit) internal pure returns (uint256[2] memory) { int256 c; uint256[2] memory r;