erc20-demurrage-token

ERC20 token with redistributed continual demurrage
Log | Files | Refs | README

commit e74a9cb5946ee7708290f5ba9239e0c449881621
parent f785925eb5950076da2fd4821d1d1c1b96cfc156
Author: lash <dev@holbrook.no>
Date:   Thu,  9 Feb 2023 12:08:28 +0000

test basic passes

Diffstat:
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 4++--
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json | 2+-
Mpython/tests/test_basic.py | 2+-
Msolidity/DemurrageTokenSingleNocap.sol | 169+++++++++++++++++++++++++++++++++++++++----------------------------------------
4 files changed, 88 insertions(+), 89 deletions(-)

diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162004551380380620045518339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a60016200035064010000000002620018a1176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620018c7176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a05161379662000dbb60003960008181610f96015281816115620152611707015260008181610fc201528181611728015261176d01526137966000f3fe608060405234801561001057600080fd5b5060043610610270576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016357806395d89b41116100e0578063d4792037116100a4578063d479203714610799578063d89135cd146107c9578063e8095295146107e7578063eda4e6d614610805578063f2fde38b14610823578063f83da35d1461085357610270565b806395d89b41146106df578063983b2d56146106fd578063b470aade1461072d578063c0ab70771461074b578063d340ef8a1461077b57610270565b80638b8ff2d6116101275780638b8ff2d61461063b5780638da5cb5b1461066b5780638f0b2d5d146106895780638f1df6bc146106a557806394c8a69a146106af57610270565b8063731f237c146105a557806373f42561146105c357806374bedb95146105e157806379ba5097146105ff57806384dde4af1461061d57610270565b806340452d91116101f157806351b4541c116101b557806351b4541c146104c757806358b2833b146104f75780636787a9be146105155780636a2d094e1461054557806370a082311461057557610270565b806340452d91146103e957806342966c681461041b578063449a52f81461043757806347a50517146104675780634abfbba21461049757610270565b80631989c6a8116102385780631989c6a81461032f578063229ba1971461034d5780633092afd51461036b578063313334871461039b578063313ce567146103cb57610270565b806301ffc9a71461027557806306fdde03146102a557806309f28f3c146102c357806310a10f37146102e157806318160ddd14610311575b600080fd5b61028f600480360381019061028a9190612e4c565b610883565b60405161029c9190612e94565b60405180910390f35b6102ad610a29565b6040516102ba9190612f3f565b60405180910390f35b6102cb610ab7565b6040516102d89190612f7d565b60405180910390f35b6102fb60048036038101906102f69190613136565b610aca565b604051610308919061317c565b60405180910390f35b610319610ade565b604051610326919061317c565b60405180910390f35b610337610af5565b604051610344919061317c565b60405180910390f35b610355610b01565b6040516103629190612f7d565b60405180910390f35b610385600480360381019061038091906131f5565b610b14565b6040516103929190612e94565b60405180910390f35b6103b560048036038101906103b0919061324e565b610c07565b6040516103c2919061317c565b60405180910390f35b6103d3610c73565b6040516103e0919061317c565b60405180910390f35b61040360048036038101906103fe919061328e565b610c79565b604051610412939291906132e8565b60405180910390f35b6104356004803603810190610430919061328e565b610ce5565b005b610451600480360381019061044c919061331f565b610e0a565b60405161045e9190612e94565b60405180910390f35b610481600480360381019061047c91906131f5565b610f49565b60405161048e919061317c565b60405180910390f35b6104b160048036038101906104ac919061328e565b610f92565b6040516104be919061317c565b60405180910390f35b6104e160048036038101906104dc919061328e565b610ff2565b6040516104ee919061317c565b60405180910390f35b6104ff611013565b60405161050c919061317c565b60405180910390f35b61052f600480360381019061052a919061328e565b611019565b60405161053c919061317c565b60405180910390f35b61055f600480360381019061055a919061328e565b61105a565b60405161056c919061317c565b60405180910390f35b61058f600480360381019061058a91906131f5565b61107b565b60405161059c919061317c565b60405180910390f35b6105ad6110e2565b6040516105ba919061317c565b60405180910390f35b6105cb6110f3565b6040516105d8919061317c565b60405180910390f35b6105e96110f9565b6040516105f6919061317c565b60405180910390f35b6106076110ff565b6040516106149190612e94565b60405180910390f35b6106256112a6565b604051610632919061336e565b60405180910390f35b61065560048036038101906106509190613136565b6112cc565b604051610662919061317c565b60405180910390f35b6106736112e1565b604051610680919061336e565b60405180910390f35b6106a3600480360381019061069e91906131f5565b611307565b005b6106ad6113a5565b005b6106c960048036038101906106c49190613136565b6113b0565b6040516106d69190612e94565b60405180910390f35b6106e7611415565b6040516106f49190612f3f565b60405180910390f35b610717600480360381019061071291906131f5565b6114a3565b6040516107249190612e94565b60405180910390f35b610735611560565b604051610742919061317c565b60405180910390f35b6107656004803603810190610760919061328e565b611584565b604051610772919061317c565b60405180910390f35b6107836116d8565b604051610790919061317c565b60405180910390f35b6107b360048036038101906107ae9190613136565b6116de565b6040516107c0919061317c565b60405180910390f35b6107d16116f7565b6040516107de919061317c565b60405180910390f35b6107ef611701565b6040516107fc91906133b4565b60405180910390f35b61080d61176b565b60405161081a919061317c565b60405180910390f35b61083d600480360381019061083891906131f5565b61178f565b60405161084a9190612e94565b60405180910390f35b61086d600480360381019061086891906133cf565b611831565b60405161087a91906134a5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d75760019050610a24565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109295760019050610a24565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361097b5760019050610a24565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109cd5760019050610a24565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a1f5760019050610a24565b600090505b919050565b60068054610a36906134ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610a62906134ef565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b505050505081565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610af0919061354f565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ba657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600080610c16866118a1565b9250610c21856118a1565b9150610c3c600d60009054906101000a9004600f0b83611909565b9050610c4781611988565b9050610c538382611909565b9050610c5e81611a15565b67ffffffffffffffff16935050505092915050565b60085481565b60008181548110610c8957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d3b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d8757600080fd5b6000610d9282611019565b9050610d9e3382611a4a565b5081600c6000828254610db19190613583565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610dfe919061317c565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090613603565b60405180910390fd5b610ea16113a5565b610eaa83611019565b90508260096000828254610ebe9190613583565b92505081905550610ecf8482611b51565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f2d919061317c565b60405180910390a3610f3d611c15565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610fc09190613623565b7f0000000000000000000000000000000000000000000000000000000000000000610feb9190613583565b9050919050565b6000603c8242611002919061354f565b61100c9190613694565b9050919050565b60035481565b60008061103d600260009054906101000a9004600f0b611038856118a1565b611909565b905061104881611a15565b67ffffffffffffffff16915050919050565b6000603c824261106a919061354f565b6110749190613694565b9050919050565b60008060008061109261108d86610f49565b6118a1565b925061109f600354610ff2565b90506110ba83600260009054906101000a9004600f0b611909565b91506110d86110c883611a15565b67ffffffffffffffff1682610c07565b9350505050919050565b60006110ee6000611584565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461115c57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113ad6110e2565b50565b600080826000015163ffffffff1611156113cd5760009050611410565b6000826020015168ffffffffffffffffff1611156113ee5760009050611410565b6000826040015164ffffffffff16111561140b5760009050611410565b600190505b919050565b60078054611422906134ef565b80601f016020809104026020016040519081016040528092919081815260200182805461144e906134ef565b801561149b5780601f106114705761010080835404028352916020019161149b565b820191906000526020600020905b81548152906001019060200180831161147e57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ff57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611597600354610ff2565b9250600083036115ae5760009450505050506116d3565b600260009054906101000a9004600f0b90506000861180156115cf57508286105b156115d8578592505b6115e1836118a1565b91506115fc600d60009054906101000a9004600f0b83611909565b935061160784611988565b9350611622600260009054906101000a9004600f0b85611909565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361166a9190613623565b6003546116779190613583565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516116c39190612f7d565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611752919061354f565b61175c9190613694565b6117669190613583565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b611839612dac565b611841612dac565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156118b857600080fd5b6040829060020a029050919050565b60008082600f0b136118d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6118f484611dca565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561197557506f7fffffffffffffffffffffffffffffff600f0b8113155b61197e57600080fd5b8091505092915050565b60006840000000000000000082600f0b126119a257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156119d65760009050611a10565b611a0d6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050611f90565b90505b919050565b60008082600f0b1215611a2757600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611aa65760009350505050611b4b565b611aaf86610f49565b925084831015611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90613711565b60405180910390fd5b8483611b00919061354f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611bad5760009350505050611c0f565b611bb686610f49565b92508483611bc49190613583565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000611c1f612dac565b6000611c29610ade565b905060006001600080549050611c3f919061354f565b81548110611c5057611c4f613731565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050611d22919061354f565b81548110611d3357611d32613731565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b13611ddb57600080fd5b60008083600f0b9050680100000000000000008112611e16576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112611e44576020819060008212600003808260020a82851804189250505090506020820191505b620100008112611e70576010819060008212600003808260020a82851804189250505090506010820191505b6101008112611e9b576008819060008212600003808260020a82851804189250505090506008820191505b60108112611ec5576004819060008212600003808260020a82851804189250505090506004820191505b60048112611eef576002819060008212600003808260020a82851804189250505090506002820191505b60028112611efe576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315611f83578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050611f2b565b5081945050505050919050565b60006840000000000000000082600f0b12611faa57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215611fde5760009050612da7565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561202c57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156120655760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561209e5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156120d757608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156121105760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612149576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561218257608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156121bb576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156121f357608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b131561222b5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612263576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561229b5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156122d3576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561230b57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156123435760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561237b57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156123b25760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156123e9576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561242057608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612457576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561248e57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156124c55760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156124fc576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156125335760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612569576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561259f57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156125d55760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561260b57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156126415760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315612677576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156126ad57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156126e3576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561271857608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b131561274d5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315612782576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156127b75760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156127ec576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561282157608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156128565760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561288b57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156128bf5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156128f3576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561292757608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561295b576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561298f57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156129c35760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156129f7576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315612a2b5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315612a5e576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315612a9157608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315612ac45760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315612af757608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315612b2a5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315612b5d576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315612b9057608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315612bc3576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315612bf557608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315612c275760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315612c59576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315612c8b5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315612cbd576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315612cef57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315612d215760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315612d5357608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115612da257600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2981612df4565b8114612e3457600080fd5b50565b600081359050612e4681612e20565b92915050565b600060208284031215612e6257612e61612def565b5b6000612e7084828501612e37565b91505092915050565b60008115159050919050565b612e8e81612e79565b82525050565b6000602082019050612ea96000830184612e85565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee9578082015181840152602081019050612ece565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f1182612eaf565b612f1b8185612eba565b9350612f2b818560208601612ecb565b612f3481612ef5565b840191505092915050565b60006020820190508181036000830152612f598184612f06565b905092915050565b600081600f0b9050919050565b612f7781612f61565b82525050565b6000602082019050612f926000830184612f6e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fd582612ef5565b810181811067ffffffffffffffff82111715612ff457612ff3612f9d565b5b80604052505050565b6000613007612de5565b90506130138282612fcc565b919050565b600063ffffffff82169050919050565b61303181613018565b811461303c57600080fd5b50565b60008135905061304e81613028565b92915050565b600068ffffffffffffffffff82169050919050565b61307281613054565b811461307d57600080fd5b50565b60008135905061308f81613069565b92915050565b600064ffffffffff82169050919050565b6130af81613095565b81146130ba57600080fd5b50565b6000813590506130cc816130a6565b92915050565b6000606082840312156130e8576130e7612f98565b5b6130f26060612ffd565b905060006131028482850161303f565b600083015250602061311684828501613080565b602083015250604061312a848285016130bd565b60408301525092915050565b60006060828403121561314c5761314b612def565b5b600061315a848285016130d2565b91505092915050565b6000819050919050565b61317681613163565b82525050565b6000602082019050613191600083018461316d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131c282613197565b9050919050565b6131d2816131b7565b81146131dd57600080fd5b50565b6000813590506131ef816131c9565b92915050565b60006020828403121561320b5761320a612def565b5b6000613219848285016131e0565b91505092915050565b61322b81613163565b811461323657600080fd5b50565b60008135905061324881613222565b92915050565b6000806040838503121561326557613264612def565b5b600061327385828601613239565b925050602061328485828601613239565b9150509250929050565b6000602082840312156132a4576132a3612def565b5b60006132b284828501613239565b91505092915050565b6132c481613018565b82525050565b6132d381613054565b82525050565b6132e281613095565b82525050565b60006060820190506132fd60008301866132bb565b61330a60208301856132ca565b61331760408301846132d9565b949350505050565b6000806040838503121561333657613335612def565b5b6000613344858286016131e0565b925050602061335585828601613239565b9150509250929050565b613368816131b7565b82525050565b6000602082019050613383600083018461335f565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6133ae81613389565b82525050565b60006020820190506133c960008301846133a5565b92915050565b600080600080608085870312156133e9576133e8612def565b5b60006133f787828801613239565b945050602061340887828801613239565b935050604061341987828801613239565b925050606061342a87828801613239565b91505092959194509250565b61343f81613018565b82525050565b61344e81613054565b82525050565b61345d81613095565b82525050565b6060820160008201516134796000850182613436565b50602082015161348c6020850182613445565b50604082015161349f6040850182613454565b50505050565b60006060820190506134ba6000830184613463565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061350757607f821691505b60208210810361351a576135196134c0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061355a82613163565b915061356583613163565b925082820390508181111561357d5761357c613520565b5b92915050565b600061358e82613163565b915061359983613163565b92508282019050808211156135b1576135b0613520565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006135ed600a83612eba565b91506135f8826135b7565b602082019050919050565b6000602082019050818103600083015261361c816135e0565b9050919050565b600061362e82613163565b915061363983613163565b925082820261364781613163565b9150828204841483151761365e5761365d613520565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061369f82613163565b91506136aa83613163565b9250826136ba576136b9613665565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006136fb600d83612eba565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212208df54ffd702147c322212cd37b0275e383e20c53759279c0428de609c2666e1e64736f6c63430008110033 -\ No newline at end of file +60c06040523480156200001157600080fd5b5060405162004fb238038062004fb28339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a6001620003506401000000000262002192176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620021b8176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a0516141f762000dbb600039600081816115d401528181611e530152611ff801526000818161160001528181612019015261205e01526141f76000f3fe608060405234801561001057600080fd5b50600436106102a7576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c11610179578063983b2d56116100eb578063d4792037116100a4578063d4792037146108c0578063d89135cd146108f0578063e80952951461090e578063eda4e6d61461092c578063f2fde38b1461094a578063f83da35d1461097a576102a7565b8063983b2d56146107c4578063a457c2d7146107f4578063a9059cbb14610824578063b470aade14610854578063c0ab707714610872578063d340ef8a146108a2576102a7565b80638b8ff2d61161013d5780638b8ff2d6146107025780638da5cb5b146107325780638f0b2d5d146107505780638f1df6bc1461076c57806394c8a69a1461077657806395d89b41146107a6576102a7565b8063731f237c1461066c57806373f425611461068a57806374bedb95146106a857806379ba5097146106c657806384dde4af146106e4576102a7565b8063313ce5671161021d5780634abfbba2116101d65780634abfbba21461055e57806351b4541c1461058e57806358b2833b146105be5780636787a9be146105dc5780636a2d094e1461060c57806370a082311461063c576102a7565b8063313ce56714610462578063395093511461048057806340452d91146104b057806342966c68146104e2578063449a52f8146104fe57806347a505171461052e576102a7565b806318160ddd1161026f57806318160ddd146103785780631989c6a814610396578063229ba197146103b457806323b872dd146103d25780633092afd5146104025780633133348714610432576102a7565b806301ffc9a7146102ac57806306fdde03146102dc578063095ea7b3146102fa57806309f28f3c1461032a57806310a10f3714610348575b600080fd5b6102c660048036038101906102c191906137ee565b6109aa565b6040516102d39190613836565b60405180910390f35b6102e4610b50565b6040516102f191906138e1565b60405180910390f35b610314600480360381019061030f9190613997565b610bde565b6040516103219190613836565b60405180910390f35b610332610dae565b60405161033f91906139f3565b60405180910390f35b610362600480360381019061035d9190613bac565b610dc1565b60405161036f9190613be8565b60405180910390f35b610380610dd5565b60405161038d9190613be8565b60405180910390f35b61039e610dec565b6040516103ab9190613be8565b60405180910390f35b6103bc610df8565b6040516103c991906139f3565b60405180910390f35b6103ec60048036038101906103e79190613c03565b610e0b565b6040516103f99190613836565b60405180910390f35b61041c60048036038101906104179190613c56565b610fbd565b6040516104299190613836565b60405180910390f35b61044c60048036038101906104479190613c83565b6110b0565b6040516104599190613be8565b60405180910390f35b61046a61111c565b6040516104779190613be8565b60405180910390f35b61049a60048036038101906104959190613997565b611122565b6040516104a79190613836565b60405180910390f35b6104ca60048036038101906104c59190613cc3565b6112b7565b6040516104d993929190613d1d565b60405180910390f35b6104fc60048036038101906104f79190613cc3565b611323565b005b61051860048036038101906105139190613997565b611448565b6040516105259190613836565b60405180910390f35b61054860048036038101906105439190613c56565b611587565b6040516105559190613be8565b60405180910390f35b61057860048036038101906105739190613cc3565b6115d0565b6040516105859190613be8565b60405180910390f35b6105a860048036038101906105a39190613cc3565b611630565b6040516105b59190613be8565b60405180910390f35b6105c6611651565b6040516105d39190613be8565b60405180910390f35b6105f660048036038101906105f19190613cc3565b611657565b6040516106039190613be8565b60405180910390f35b61062660048036038101906106219190613cc3565b611698565b6040516106339190613be8565b60405180910390f35b61065660048036038101906106519190613c56565b6116b9565b6040516106639190613be8565b60405180910390f35b610674611720565b6040516106819190613be8565b60405180910390f35b610692611731565b60405161069f9190613be8565b60405180910390f35b6106b0611737565b6040516106bd9190613be8565b60405180910390f35b6106ce61173d565b6040516106db9190613836565b60405180910390f35b6106ec6118e4565b6040516106f99190613d63565b60405180910390f35b61071c60048036038101906107179190613bac565b61190a565b6040516107299190613be8565b60405180910390f35b61073a61191f565b6040516107479190613d63565b60405180910390f35b61076a60048036038101906107659190613c56565b611945565b005b6107746119e3565b005b610790600480360381019061078b9190613bac565b6119ee565b60405161079d9190613836565b60405180910390f35b6107ae611a53565b6040516107bb91906138e1565b60405180910390f35b6107de60048036038101906107d99190613c56565b611ae1565b6040516107eb9190613836565b60405180910390f35b61080e60048036038101906108099190613997565b611b9e565b60405161081b9190613836565b60405180910390f35b61083e60048036038101906108399190613997565b611dbc565b60405161084b9190613836565b60405180910390f35b61085c611e51565b6040516108699190613be8565b60405180910390f35b61088c60048036038101906108879190613cc3565b611e75565b6040516108999190613be8565b60405180910390f35b6108aa611fc9565b6040516108b79190613be8565b60405180910390f35b6108da60048036038101906108d59190613bac565b611fcf565b6040516108e79190613be8565b60405180910390f35b6108f8611fe8565b6040516109059190613be8565b60405180910390f35b610916611ff2565b6040516109239190613da9565b60405180910390f35b61093461205c565b6040516109419190613be8565b60405180910390f35b610964600480360381019061095f9190613c56565b612080565b6040516109719190613836565b60405180910390f35b610994600480360381019061098f9190613dc4565b612122565b6040516109a19190613e9a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109fe5760019050610b4b565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a505760019050610b4b565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610aa25760019050610b4b565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610af45760019050610b4b565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b465760019050610b4b565b600090505b919050565b60068054610b5d90613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ee4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610caa5760008314610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613f61565b60405180910390fd5b5b610cb26119e3565b610cbb83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d9b9190613be8565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610de79190613fb0565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000806000610e186119e3565b610e2184611657565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610eac57600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f389190613fb0565b92505081905550610f4a8686846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610fa99190613be8565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061104657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61104f57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806110bf86612192565b92506110ca85612192565b91506110e5600d60009054906101000a9004600f0b8361221f565b90506110f08161229e565b90506110fc838261221f565b90506111078161232b565b67ffffffffffffffff16935050505092915050565b60085481565b60008061112d6119e3565b61113683611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111c49190613fe4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516112a49190613be8565b60405180910390a3600191505092915050565b600081815481106112c757600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661137957600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156113c557600080fd5b60006113d082611657565b90506113dc3382612360565b5081600c60008282546113ef9190613fe4565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161143c9190613be8565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614064565b60405180910390fd5b6114df6119e3565b6114e883611657565b905082600960008282546114fc9190613fe4565b9250508190555061150d8482612467565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161156b9190613be8565b60405180910390a361157b61252b565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826115fe9190614084565b7f00000000000000000000000000000000000000000000000000000000000000006116299190613fe4565b9050919050565b6000603c82426116409190613fb0565b61164a91906140f5565b9050919050565b60035481565b60008061167b61166684612192565b600260009054906101000a9004600f0b6126e0565b90506116868161232b565b67ffffffffffffffff16915050919050565b6000603c82426116a89190613fb0565b6116b291906140f5565b9050919050565b6000806000806116d06116cb86611587565b612192565b92506116dd600354611630565b90506116f883600260009054906101000a9004600f0b61221f565b91506117166117068361232b565b67ffffffffffffffff16826110b0565b9350505050919050565b600061172c6000611e75565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461199f57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119eb611720565b50565b600080826000015163ffffffff161115611a0b5760009050611a4e565b6000826020015168ffffffffffffffffff161115611a2c5760009050611a4e565b6000826040015164ffffffffff161115611a495760009050611a4e565b600190505b919050565b60078054611a6090613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c90613ee4565b8015611ad95780601f10611aae57610100808354040283529160200191611ad9565b820191906000526020600020905b815481529060010190602001808311611abc57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3d57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611baa83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611c3557600080fd5b611c3d6119e3565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc99190613fb0565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611da99190613be8565b60405180910390a3600191505092915050565b6000806000611dc96119e3565b611dd284611657565b9150611ddf3386846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611e3e9190613be8565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611e88600354611630565b925060008303611e9f576000945050505050611fc4565b600260009054906101000a9004600f0b9050600086118015611ec057508286105b15611ec9578592505b611ed283612192565b9150611eed600d60009054906101000a9004600f0b8361221f565b9350611ef88461229e565b9350611f13600260009054906101000a9004600f0b8561221f565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83611f5b9190614084565b600354611f689190613fe4565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051611fb491906139f3565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426120439190613fb0565b61204d91906140f5565b6120579190613fe4565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120dc57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61212a61374e565b61213261374e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156121a957600080fd5b6040829060020a029050919050565b60008082600f0b136121c957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6121e58461276c565b600f0b02908060020a82049150509050919050565b6000806122078584612360565b506122128484612467565b5060019150509392505050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561228b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61229457600080fd5b8091505092915050565b60006840000000000000000082600f0b126122b857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156122ec5760009050612326565b6123236080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050612932565b90505b919050565b60008082600f0b121561233d57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036123bc5760009350505050612461565b6123c586611587565b92508483101561240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190614172565b60405180910390fd5b84836124169190613fb0565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036124c35760009350505050612525565b6124cc86611587565b925084836124da9190613fe4565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061253561374e565b600061253f610dd5565b9050600060016000805490506125559190613fb0565b8154811061256657612565614192565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506126389190613fb0565b8154811061264957612648614192565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b036126f157600080fd5b600082600f0b604085600f0b9060020a02816127105761270f6140c6565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561275957506f7fffffffffffffffffffffffffffffff600f0b8113155b61276257600080fd5b8091505092915050565b60008082600f0b1361277d57600080fd5b60008083600f0b90506801000000000000000081126127b8576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126127e6576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612812576010819060008212600003808260020a82851804189250505090506010820191505b610100811261283d576008819060008212600003808260020a82851804189250505090506008820191505b60108112612867576004819060008212600003808260020a82851804189250505090506004820191505b60048112612891576002819060008212600003808260020a82851804189250505090506002820191505b600281126128a0576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315612925578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506128cd565b5081945050505050919050565b60006840000000000000000082600f0b1261294c57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156129805760009050613749565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156129ce57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315612a075760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315612a405760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315612a7957608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315612ab25760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612aeb576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315612b2457608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315612b5d576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315612b9557608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315612bcd5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612c05576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315612c3d5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315612c75576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315612cad57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315612ce55760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315612d1d57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315612d545760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315612d8b576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315612dc257608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612df9576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315612e3057608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315612e675760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315612e9e576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315612ed55760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612f0b576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315612f4157608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315612f775760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315612fad57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315612fe35760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613019576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561304f57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613085576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156130ba57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156130ef5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613124576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156131595760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561318e576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156131c357608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156131f85760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561322d57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156132615760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613295576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156132c957608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156132fd576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561333157608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156133655760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613399576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156133cd5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613400576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561343357608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156134665760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561349957608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156134cc5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156134ff576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561353257608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613565576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561359757608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156135c95760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156135fb576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561362d5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561365f576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561369157608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156136c35760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156136f557608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561374457600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137cb81613796565b81146137d657600080fd5b50565b6000813590506137e8816137c2565b92915050565b60006020828403121561380457613803613791565b5b6000613812848285016137d9565b91505092915050565b60008115159050919050565b6138308161381b565b82525050565b600060208201905061384b6000830184613827565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561388b578082015181840152602081019050613870565b60008484015250505050565b6000601f19601f8301169050919050565b60006138b382613851565b6138bd818561385c565b93506138cd81856020860161386d565b6138d681613897565b840191505092915050565b600060208201905081810360008301526138fb81846138a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061392e82613903565b9050919050565b61393e81613923565b811461394957600080fd5b50565b60008135905061395b81613935565b92915050565b6000819050919050565b61397481613961565b811461397f57600080fd5b50565b6000813590506139918161396b565b92915050565b600080604083850312156139ae576139ad613791565b5b60006139bc8582860161394c565b92505060206139cd85828601613982565b9150509250929050565b600081600f0b9050919050565b6139ed816139d7565b82525050565b6000602082019050613a0860008301846139e4565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4b82613897565b810181811067ffffffffffffffff82111715613a6a57613a69613a13565b5b80604052505050565b6000613a7d613787565b9050613a898282613a42565b919050565b600063ffffffff82169050919050565b613aa781613a8e565b8114613ab257600080fd5b50565b600081359050613ac481613a9e565b92915050565b600068ffffffffffffffffff82169050919050565b613ae881613aca565b8114613af357600080fd5b50565b600081359050613b0581613adf565b92915050565b600064ffffffffff82169050919050565b613b2581613b0b565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060608284031215613b5e57613b5d613a0e565b5b613b686060613a73565b90506000613b7884828501613ab5565b6000830152506020613b8c84828501613af6565b6020830152506040613ba084828501613b33565b60408301525092915050565b600060608284031215613bc257613bc1613791565b5b6000613bd084828501613b48565b91505092915050565b613be281613961565b82525050565b6000602082019050613bfd6000830184613bd9565b92915050565b600080600060608486031215613c1c57613c1b613791565b5b6000613c2a8682870161394c565b9350506020613c3b8682870161394c565b9250506040613c4c86828701613982565b9150509250925092565b600060208284031215613c6c57613c6b613791565b5b6000613c7a8482850161394c565b91505092915050565b60008060408385031215613c9a57613c99613791565b5b6000613ca885828601613982565b9250506020613cb985828601613982565b9150509250929050565b600060208284031215613cd957613cd8613791565b5b6000613ce784828501613982565b91505092915050565b613cf981613a8e565b82525050565b613d0881613aca565b82525050565b613d1781613b0b565b82525050565b6000606082019050613d326000830186613cf0565b613d3f6020830185613cff565b613d4c6040830184613d0e565b949350505050565b613d5d81613923565b82525050565b6000602082019050613d786000830184613d54565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b613da381613d7e565b82525050565b6000602082019050613dbe6000830184613d9a565b92915050565b60008060008060808587031215613dde57613ddd613791565b5b6000613dec87828801613982565b9450506020613dfd87828801613982565b9350506040613e0e87828801613982565b9250506060613e1f87828801613982565b91505092959194509250565b613e3481613a8e565b82525050565b613e4381613aca565b82525050565b613e5281613b0b565b82525050565b606082016000820151613e6e6000850182613e2b565b506020820151613e816020850182613e3a565b506040820151613e946040850182613e49565b50505050565b6000606082019050613eaf6000830184613e58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613efc57607f821691505b602082108103613f0f57613f0e613eb5565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000613f4b600a8361385c565b9150613f5682613f15565b602082019050919050565b60006020820190508181036000830152613f7a81613f3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fbb82613961565b9150613fc683613961565b9250828203905081811115613fde57613fdd613f81565b5b92915050565b6000613fef82613961565b9150613ffa83613961565b925082820190508082111561401257614011613f81565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061404e600a8361385c565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b600061408f82613961565b915061409a83613961565b92508282026140a881613961565b915082820484148315176140bf576140be613f81565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410082613961565b915061410b83613961565b92508261411b5761411a6140c6565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061415c600d8361385c565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220f8be9800a1ef4a4f2ad33ef73ea179ef5a5d6b997ee73427bdf03aa8ae0861e364736f6c63430008110033 +\ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py @@ -219,7 +219,7 @@ class TestBasic(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) self.rpc.do(o) - self.backend.time_travel(self.start_time + 61) + self.backend.time_travel(self.start_time + (60 * 43200)) (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) o = c.to_base_amount(self.address, 1000, sender_address=self.accounts[0]) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol @@ -455,93 +455,92 @@ contract DemurrageTokenSingleCap { // Inflates the given amount according to the current demurrage modifier function toBaseAmount(uint256 _value) public view returns (uint256) { int128 r; - //return (_value * resolutionFactor) / (demurrageAmount * 10000000000); - r = ABDKMath64x64.mul(demurrageAmount, ABDKMath64x64.fromUInt(_value)); + r = ABDKMath64x64.div(ABDKMath64x64.fromUInt(_value), demurrageAmount); return ABDKMath64x64.toUInt(r); } -// -// // Implements ERC20, triggers tax and/or redistribution -// function approve(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// if (allowance[msg.sender][_spender] > 0) { -// require(_value == 0, 'ZERO_FIRST'); -// } -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// allowance[msg.sender][_spender] = baseValue; -// emit Approval(msg.sender, _spender, _value); -// return true; -// } -// -// // Reduce allowance by amount -// function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// baseValue = toBaseAmount(_value); -// require(allowance[msg.sender][_spender] >= baseValue); -// -// changePeriod(); -// -// allowance[msg.sender][_spender] -= baseValue; -// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); -// return true; -// } -// -// // Increase allowance by amount -// function increaseAllowance(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// -// allowance[msg.sender][_spender] += baseValue; -// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); -// return true; -// } -// -// // Implements ERC20, triggers tax and/or redistribution -// function transfer(address _to, uint256 _value) public returns (bool) { -// uint256 baseValue; -// bool result; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// result = transferBase(msg.sender, _to, baseValue); -// emit Transfer(msg.sender, _to, _value); -// return result; -// } -// -// // Implements ERC20, triggers tax and/or redistribution -// function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { -// uint256 baseValue; -// bool result; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// require(allowance[_from][msg.sender] >= baseValue); -// -// allowance[_from][msg.sender] -= baseValue; -// result = transferBase(_from, _to, baseValue); -// -// emit Transfer(_from, _to, _value); -// return result; -// } -// -// // ERC20 transfer backend for transfer, transferFrom -// function transferBase(address _from, address _to, uint256 _value) private returns (bool) { -// uint256 period; -// -// decreaseBaseBalance(_from, _value); -// increaseBaseBalance(_to, _value); -// -// return true; -// } + + // Implements ERC20, triggers tax and/or redistribution + function approve(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + if (allowance[msg.sender][_spender] > 0) { + require(_value == 0, 'ZERO_FIRST'); + } + + changePeriod(); + + baseValue = toBaseAmount(_value); + allowance[msg.sender][_spender] = baseValue; + emit Approval(msg.sender, _spender, _value); + return true; + } + + // Reduce allowance by amount + function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + baseValue = toBaseAmount(_value); + require(allowance[msg.sender][_spender] >= baseValue); + + changePeriod(); + + allowance[msg.sender][_spender] -= baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Increase allowance by amount + function increaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + changePeriod(); + + baseValue = toBaseAmount(_value); + + allowance[msg.sender][_spender] += baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Implements ERC20, triggers tax and/or redistribution + function transfer(address _to, uint256 _value) public returns (bool) { + uint256 baseValue; + bool result; + + changePeriod(); + + baseValue = toBaseAmount(_value); + result = transferBase(msg.sender, _to, baseValue); + emit Transfer(msg.sender, _to, _value); + return result; + } + + // Implements ERC20, triggers tax and/or redistribution + function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { + uint256 baseValue; + bool result; + + changePeriod(); + + baseValue = toBaseAmount(_value); + require(allowance[_from][msg.sender] >= baseValue); + + allowance[_from][msg.sender] -= baseValue; + result = transferBase(_from, _to, baseValue); + + emit Transfer(_from, _to, _value); + return result; + } + + // ERC20 transfer backend for transfer, transferFrom + function transferBase(address _from, address _to, uint256 _value) private returns (bool) { + uint256 period; + + decreaseBaseBalance(_from, _value); + increaseBaseBalance(_to, _value); + + return true; + } // Implements EIP173 function transferOwnership(address _newOwner) public returns (bool) {