From 5d01e2ae96484162a8ed0eaf886cd7c6f5898bcc Mon Sep 17 00:00:00 2001 From: Louis Holbrook Date: Sat, 4 Feb 2023 14:41:40 +0000 Subject: [PATCH] Add burn method + minor bug fixes --- CAVEAT | 5 + ROADMAP | 8 + VERSION | 1 + python/CHANGELOG | 6 + .../data/DemurrageTokenMultiCap.bin | 1 - .../data/DemurrageTokenMultiCap.json | 1 - .../data/DemurrageTokenMultiNocap.bin | 1 - .../data/DemurrageTokenMultiNocap.json | 1 - .../data/DemurrageTokenSingleCap.bin | 1 - .../data/DemurrageTokenSingleCap.json | 1 - .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/demurrage.py | 3 +- .../erc20_demurrage_token/runnable/apply.py | 76 +++-- .../erc20_demurrage_token/runnable/deploy.py | 116 +++---- python/erc20_demurrage_token/token.py | 61 ++++ python/erc20_demurrage_token/unittest/base.py | 16 +- python/requirements.txt | 4 +- python/run_tests.sh | 10 +- python/setup.cfg | 2 +- python/tests/test_basic.py | 53 ++- python/tests/test_burn.py | 320 ++++++++++++++++++ python/tests/test_demurrage.py | 133 ++++++++ python/tests/test_redistribution_single.py | 25 +- solidity/DemurrageTokenSingleNocap.sol | 102 ++++-- solidity/Makefile | 4 + 26 files changed, 806 insertions(+), 149 deletions(-) create mode 100644 CAVEAT create mode 100644 ROADMAP create mode 100644 VERSION delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenMultiCap.json delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.json delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin delete mode 100644 python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json create mode 100644 python/tests/test_burn.py create mode 100644 python/tests/test_demurrage.py diff --git a/CAVEAT b/CAVEAT new file mode 100644 index 0000000..db94b6e --- /dev/null +++ b/CAVEAT @@ -0,0 +1,5 @@ +The contract is intended for slow rates of decay (e.g. 2% per month). Very high levels of decay (2% per minute) will lead to overflows, and will need a more flexible implementation to support it. + +The contract is written with frequent usage in mind. If used for tokens with low usage freqency (e.g. several days idle), it is recommended to run a continuous process triggering the changePeriod() contract call, to reduce the amount of exponential calculation the application of demurrage will trigger. + +When changing the period, the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. diff --git a/ROADMAP b/ROADMAP new file mode 100644 index 0000000..75ad54d --- /dev/null +++ b/ROADMAP @@ -0,0 +1,8 @@ +- 0.1.3 + * Snapshot supply for crossed redistribution thresholds before minting new tokens. +- 0.1.4 + * Implement natural logarithm +- 0.1.5 + * Port changes from SingleNocap to SingleCap +- 0.2.0 + * Make decay resolutions configurable, to support high levels of decay. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..0ea3a94 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.2.0 diff --git a/python/CHANGELOG b/python/CHANGELOG index 8f54da5..6735e2f 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,9 @@ +- 0.2.0 + * Add token burn function + * Fix gas leak when calculating decay on period change + * Remove all but SingleNocap contract in make install + * Make approve explicitly set value + * Add increaseAllowance and decreaseAllowance methods - 0.1.1 * Settable demurrage steps for apply demurrage cli tool - 0.1.0 diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin deleted file mode 100644 index 66b6ceb..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin +++ /dev/null @@ -1 +0,0 @@ -610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c0d38038062003c0d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009d9565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60805160a05160c05160e0516131bb62000a5260003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131bb6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a3e565b60405180910390f35b6102e860048036038101906102e39190612af4565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b5f565b60405180910390f35b610324610c96565b6040516103319190612b89565b60405180910390f35b610342610c9c565b60405161034f9190612b89565b60405180910390f35b610372600480360381019061036d9190612ba4565b610ca8565b60405161037f9190612b89565b60405180910390f35b610390610d2d565b60405161039d9190612b89565b60405180910390f35b6103c060048036038101906103bb9190612be4565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c37565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612ba4565b610f6e565b60405161042d9190612b89565b60405180910390f35b61043e61101f565b60405161044b9190612b89565b60405180910390f35b61046e60048036038101906104699190612c37565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c64565b611224565b6040516104ab9190612caa565b60405180910390f35b6104ce60048036038101906104c99190612cf1565b611248565b6040516104db9190612b89565b60405180910390f35b6104fe60048036038101906104f99190612af4565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c37565b61139f565b60405161053b9190612b89565b60405180910390f35b61055e60048036038101906105599190612c64565b6113f7565b60405161056b9190612b89565b60405180910390f35b61058e60048036038101906105899190612c64565b611457565b60405161059b9190612b89565b60405180910390f35b6105ac611478565b6040516105b99190612b89565b60405180910390f35b6105ca61147e565b6040516105d79190612b89565b60405180910390f35b6105fa60048036038101906105f59190612c64565b611484565b6040516106079190612b89565b60405180910390f35b61062a60048036038101906106259190612c64565b6114f0565b6040516106379190612b89565b60405180910390f35b61065a60048036038101906106559190612c37565b611511565b6040516106679190612b89565b60405180910390f35b61068a60048036038101906106859190612cf1565b61157c565b6040516106979190612b89565b60405180910390f35b6106ba60048036038101906106b59190612c37565b6115af565b6040516106c79190612b89565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d2d565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b89565b60405180910390f35b61076e611b01565b60405161077b9190612a3e565b60405180910390f35b61079e60048036038101906107999190612c37565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612cf1565b611c4c565b6040516107db9190612b89565b60405180910390f35b6107fe60048036038101906107f99190612af4565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b89565b60405180910390f35b61083a611d3c565b6040516108479190612b89565b60405180910390f35b61086a60048036038101906108659190612cf1565b611d60565b6040516108779190612b89565b60405180910390f35b61089a60048036038101906108959190612ba4565b611d74565b6040516108a79190612b89565b60405180910390f35b6108b8611e25565b6040516108c59190612b5f565b60405180910390f35b6108d6611e8f565b6040516108e39190612b89565b60405180910390f35b61090660048036038101906109019190612c37565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d77565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dd7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b89565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e79565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612ec8565b91508482610d159190612ef9565b90508084610d239190612f53565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b89565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612ec8565b905060005b84811015610ffa57620f42408284610fd09190612ef9565b610fda9190612ec8565b83610fe59190612f53565b92508080610ff290612f87565b915050610fb8565b50620f4240858361100b9190612ef9565b6110159190612ec8565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f53565b8154811061109957611098612fcf565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612ec8565b86886111299190612ec8565b6111339190612ef9565b61113d9190612ec8565b9350620f4240818561114f9190612ef9565b6111599190612ec8565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b89565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dd7565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dd7565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b89565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ef9565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dd7565b9050919050565b6000603c82426114679190612f53565b6114719190612ec8565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ef9565b6114df9190612ef9565b6114e99190612ec8565b9050919050565b6000603c82426115009190612f53565b61150a9190612ec8565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ef9565b82846116449190612ef9565b61164e9190612ec8565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ef9565b60035461170e9190612dd7565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190613039565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dd7565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612ec8565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612ec8565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b89565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d77565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b89565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612ec8565b905060005b84811015611e0057620f42408284611dd69190612ef9565b611de09190612ec8565b83611deb9190612dd7565b92508080611df890612f87565b915050611dbe565b50620f42408583611e119190612ef9565b611e1b9190612ec8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f53565b611e809190612ec8565b611e8a9190612dd7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dd7565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906130a0565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f53565b8154811061217c5761217b612fcf565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f53565b815481106121da576121d9612fcf565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f53565b8154811061221957612218612fcf565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130ec565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ef9565b6123c49190612ec8565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ef9565b6124009190612ec8565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f53565b8154811061244c5761244b612fcf565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f53565b815481106124b4576124b3612fcf565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612ec8565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f53565b8154811061257757612576612fcf565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f53565b815481106125b1576125b0612fcf565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f53565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613165565b60405180910390fd5b84836126c19190612f53565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f53565b8154811061283e5761283d612fcf565b5b90600052602060002001549250600161285684611248565b6128609190612dd7565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f53565b815481106128cd576128cc612fcf565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b838111156129ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a10826129a5565b612a1a81856129b0565b9350612a2a8185602086016129c1565b612a33816129f4565b840191505092915050565b60006020820190508181036000830152612a588184612a05565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8b82612a60565b9050919050565b612a9b81612a80565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b6000819050919050565b612ad181612abe565b8114612adc57600080fd5b50565b600081359050612aee81612ac8565b92915050565b60008060408385031215612b0b57612b0a6128e5565b5b6000612b1985828601612aa9565b9250506020612b2a85828601612adf565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5981612b34565b82525050565b6000602082019050612b746000830184612b50565b92915050565b612b8381612abe565b82525050565b6000602082019050612b9e6000830184612b7a565b92915050565b60008060408385031215612bbb57612bba6128e5565b5b6000612bc985828601612adf565b9250506020612bda85828601612adf565b9150509250929050565b600080600060608486031215612bfd57612bfc6128e5565b5b6000612c0b86828701612aa9565b9350506020612c1c86828701612aa9565b9250506040612c2d86828701612adf565b9150509250925092565b600060208284031215612c4d57612c4c6128e5565b5b6000612c5b84828501612aa9565b91505092915050565b600060208284031215612c7a57612c796128e5565b5b6000612c8884828501612adf565b91505092915050565b6000819050919050565b612ca481612c91565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c91565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b600060208284031215612d0757612d066128e5565b5b6000612d1584828501612cdc565b91505092915050565b612d2781612a80565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8f57607f821691505b602082108103612da257612da1612d48565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de282612abe565b9150612ded83612abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2257612e21612da8565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e636011836129b0565b9150612e6e82612e2d565b602082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed382612abe565b9150612ede83612abe565b925082612eee57612eed612e99565b5b828204905092915050565b6000612f0482612abe565b9150612f0f83612abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f4857612f47612da8565b5b828202905092915050565b6000612f5e82612abe565b9150612f6983612abe565b925082821015612f7c57612f7b612da8565b5b828203905092915050565b6000612f9282612abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc457612fc3612da8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061302361301e61301984612b34565b612ffe565b612abe565b9050919050565b61303381613008565b82525050565b600060208201905061304e600083018461302a565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b600061308a600d836129b0565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b6130c981612b34565b81146130d457600080fd5b50565b6000815190506130e6816130c0565b92915050565b600060208284031215613102576131016128e5565b5b6000613110848285016130d7565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061314f600d836129b0565b915061315a82613119565b602082019050919050565b6000602082019050818103600083015261317e81613142565b905091905056fea2646970667358221220584c6761a6f53a48d12b32828df80bf173ed868c2802527ff2ebbdb3cc94fd7664736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.json b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.json deleted file mode 100644 index 7a7450f..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.json +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint256","name":"_taxLevelMinute","type":"uint256"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"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":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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"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":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"applyRedistributionOnAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint128","name":"","type":"uint128"}],"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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numParts","type":"uint256"},{"internalType":"uint256","name":"_sumWhole","type":"uint256"}],"name":"remainder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin deleted file mode 100644 index 229aa27..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin +++ /dev/null @@ -1 +0,0 @@ -610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c8438038062003c8483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009eb565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b602082108103620009e557620009e462000987565b5b50919050565b60805160a05160c05160e05161322062000a6460003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526132206000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a6f565b60405180910390f35b6102d260048036038101906102cd9190612b25565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b90565b60405180910390f35b61030e610c32565b60405161031b9190612bba565b60405180910390f35b61032c610c38565b6040516103399190612bba565b60405180910390f35b61035c60048036038101906103579190612bd5565b610c44565b6040516103699190612bba565b60405180910390f35b61037a610cc9565b6040516103879190612bba565b60405180910390f35b6103aa60048036038101906103a59190612c15565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c68565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bd5565b610f0a565b6040516104179190612bba565b60405180910390f35b610428610fbb565b6040516104359190612bba565b60405180910390f35b61045860048036038101906104539190612c68565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c95565b6111c0565b6040516104959190612cdb565b60405180910390f35b6104b860048036038101906104b39190612d22565b6111e4565b6040516104c59190612bba565b60405180910390f35b6104e860048036038101906104e39190612b25565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c68565b611317565b6040516105259190612bba565b60405180910390f35b61054860048036038101906105439190612c95565b61136f565b6040516105559190612bba565b60405180910390f35b6105666113cf565b6040516105739190612bba565b60405180910390f35b61059660048036038101906105919190612c95565b6113d5565b6040516105a39190612bba565b60405180910390f35b6105c660048036038101906105c19190612c95565b611441565b6040516105d39190612bba565b60405180910390f35b6105f660048036038101906105f19190612c68565b611462565b6040516106039190612bba565b60405180910390f35b61062660048036038101906106219190612d22565b6114cd565b6040516106339190612bba565b60405180910390f35b61065660048036038101906106519190612c68565b611500565b6040516106639190612bba565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d5e565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a6f565b60405180910390f35b61071c60048036038101906107179190612c68565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d22565b611c5b565b6040516107599190612bba565b60405180910390f35b61076a611c87565b6040516107779190612b90565b60405180910390f35b61079a60048036038101906107959190612b25565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bba565b60405180910390f35b6107d6611d6d565b6040516107e39190612bba565b60405180910390f35b61080660048036038101906108019190612d22565b611d91565b6040516108139190612bba565b60405180910390f35b61083660048036038101906108319190612bd5565b611da5565b6040516108439190612bba565b60405180910390f35b610854611e56565b6040516108619190612b90565b60405180910390f35b610872611ec0565b60405161087f9190612bba565b60405180910390f35b6108a2600480360381019061089d9190612c68565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612da8565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612e08565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bba565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612eaa565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ef9565b91508482610cb19190612f2a565b90508084610cbf9190612f84565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bba565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ef9565b905060005b84811015610f9657620f42408284610f6c9190612f2a565b610f769190612ef9565b83610f819190612f84565b92508080610f8e90612fb8565b915050610f54565b50620f42408583610fa79190612f2a565b610fb19190612ef9565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f84565b8154811061103557611034613000565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ef9565b86886110c59190612ef9565b6110cf9190612f2a565b6110d99190612ef9565b9350620f424081856110eb9190612f2a565b6110f59190612ef9565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bba565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612e08565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bba565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612f2a565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612e08565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612f2a565b6114309190612f2a565b61143a9190612ef9565b9050919050565b6000603c82426114519190612f84565b61145b9190612ef9565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b611542919061302f565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612f2a565b82846115cd9190612f2a565b6115d79190612ef9565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d919061302f565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061309e565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612e08565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ef9565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ef9565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bba565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612da8565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bba565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ef9565b905060005b84811015611e3157620f42408284611e079190612f2a565b611e119190612ef9565b83611e1c9190612e08565b92508080611e2990612fb8565b915050611def565b50620f42408583611e429190612f2a565b611e4c9190612ef9565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f84565b611eb19190612ef9565b611ebb9190612e08565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612e08565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890613105565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f84565b815481106121ad576121ac613000565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f84565b8154811061220b5761220a613000565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f84565b8154811061224a57612249613000565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190613151565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612f2a565b6123f59190612ef9565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612f2a565b6124319190612ef9565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f84565b8154811061247d5761247c613000565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f84565b815481106124e5576124e4613000565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ef9565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f84565b815481106125a8576125a7613000565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f84565b815481106125e2576125e1613000565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f84565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906131ca565b60405180910390fd5b84836126f29190612f84565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f84565b8154811061286f5761286e613000565b5b906000526020600020015492506001612887846111e4565b6128919190612e08565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f84565b815481106128fe576128fd613000565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b8114612ad757600080fd5b50565b600081359050612ae981612ac3565b92915050565b6000819050919050565b612b0281612aef565b8114612b0d57600080fd5b50565b600081359050612b1f81612af9565b92915050565b60008060408385031215612b3c57612b3b612916565b5b6000612b4a85828601612ada565b9250506020612b5b85828601612b10565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8a81612b65565b82525050565b6000602082019050612ba56000830184612b81565b92915050565b612bb481612aef565b82525050565b6000602082019050612bcf6000830184612bab565b92915050565b60008060408385031215612bec57612beb612916565b5b6000612bfa85828601612b10565b9250506020612c0b85828601612b10565b9150509250929050565b600080600060608486031215612c2e57612c2d612916565b5b6000612c3c86828701612ada565b9350506020612c4d86828701612ada565b9250506040612c5e86828701612b10565b9150509250925092565b600060208284031215612c7e57612c7d612916565b5b6000612c8c84828501612ada565b91505092915050565b600060208284031215612cab57612caa612916565b5b6000612cb984828501612b10565b91505092915050565b6000819050919050565b612cd581612cc2565b82525050565b6000602082019050612cf06000830184612ccc565b92915050565b612cff81612cc2565b8114612d0a57600080fd5b50565b600081359050612d1c81612cf6565b92915050565b600060208284031215612d3857612d37612916565b5b6000612d4684828501612d0d565b91505092915050565b612d5881612ab1565b82525050565b6000602082019050612d736000830184612d4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dc057607f821691505b602082108103612dd357612dd2612d79565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e1382612aef565b9150612e1e83612aef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5357612e52612dd9565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e946011836129e1565b9150612e9f82612e5e565b602082019050919050565b60006020820190508181036000830152612ec381612e87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f0482612aef565b9150612f0f83612aef565b925082612f1f57612f1e612eca565b5b828204905092915050565b6000612f3582612aef565b9150612f4083612aef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7957612f78612dd9565b5b828202905092915050565b6000612f8f82612aef565b9150612f9a83612aef565b925082821015612fad57612fac612dd9565b5b828203905092915050565b6000612fc382612aef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff557612ff4612dd9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061303a82612b65565b915061304583612b65565b92508282101561305857613057612dd9565b5b828203905092915050565b6000819050919050565b600061308861308361307e84612b65565b613063565b612aef565b9050919050565b6130988161306d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130ef600d836129e1565b91506130fa826130b9565b602082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b61312e81612b65565b811461313957600080fd5b50565b60008151905061314b81613125565b92915050565b60006020828403121561316757613166612916565b5b60006131758482850161313c565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131b4600d836129e1565b91506131bf8261317e565b602082019050919050565b600060208201905081810360008301526131e3816131a7565b905091905056fea2646970667358221220264f607b835653f036df7c03346e36a25ca6aaeba8bb51495b6669a847b0b5b164736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.json deleted file mode 100644 index 970e47c..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.json +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint256","name":"_taxLevelMinute","type":"uint256"},{"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":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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"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":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"applyRedistributionOnAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint128","name":"","type":"uint128"}],"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":"demurragePeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numParts","type":"uint256"},{"internalType":"uint256","name":"_sumWhole","type":"uint256"}],"name":"remainder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin deleted file mode 100644 index 06e6bd2..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin +++ /dev/null @@ -1 +0,0 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b506040516200364d3803806200364d83398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a33565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b60208210810362000a2d5762000a2c620009cf565b5b50919050565b60805160a05160c05160e051612ba162000aac60003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612ba16000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d09190612373565b60405180910390f35b6102f360048036038101906102ee9190612429565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e9190612494565b60405180910390f35b61032f610cb3565b60405161033c91906124be565b60405180910390f35b61034d610cb9565b60405161035a91906124be565b60405180910390f35b61036b610cc5565b60405161037891906124be565b60405180910390f35b61039b600480360381019061039691906124d9565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c6919061252c565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612559565b610efc565b60405161040891906124be565b60405180910390f35b610419610fb0565b60405161042691906124be565b60405180910390f35b61044960048036038101906104449190612599565b610fb6565b60405161045691906125df565b60405180910390f35b61047960048036038101906104749190612429565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a4919061252c565b61116c565b6040516104b691906124be565b60405180910390f35b6104d960048036038101906104d49190612599565b6111b5565b6040516104e691906124be565b60405180910390f35b61050960048036038101906105049190612599565b611215565b60405161051691906124be565b60405180910390f35b610527611236565b60405161053491906124be565b60405180910390f35b61054561123c565b60405161055291906124be565b60405180910390f35b61057560048036038101906105709190612559565b611242565b60405161058291906124be565b60405180910390f35b6105a560048036038101906105a09190612599565b6112c3565b6040516105b291906124be565b60405180910390f35b6105d560048036038101906105d09190612599565b611343565b6040516105e291906124be565b60405180910390f35b61060560048036038101906106009190612626565b611364565b60405161061291906124be565b60405180910390f35b6106356004803603810190610630919061252c565b61139e565b60405161064291906124be565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c9190612626565b61160e565b6040516106ae91906124be565b60405180910390f35b6106bf61163c565b6040516106cc9190612662565b60405180910390f35b6106ef60048036038101906106ea919061252c565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124be565b60405180910390f35b61073561184f565b6040516107429190612373565b60405180910390f35b6107656004803603810190610760919061252c565b6118dd565b60405161077291906122bf565b60405180910390f35b61079560048036038101906107909190612626565b61199a565b6040516107a291906124be565b60405180910390f35b6107c560048036038101906107c09190612429565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124be565b60405180910390f35b610801611a80565b60405161080e91906124be565b60405180910390f35b610831600480360381019061082c9190612599565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c9190612626565b611bdc565b60405161086e91906124be565b60405180910390f35b610891600480360381019061088c9190612559565b611bf0565b60405161089e91906124be565b60405180910390f35b6108af611ca4565b6040516108bc9190612494565b60405180910390f35b6108cd611d0e565b6040516108da91906124be565b60405180910390f35b6108fd60048036038101906108f8919061252c565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d6004803603810190610928919061267d565b611dd4565b60405161093a91906125df565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af690612713565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612713565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612773565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124be565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124be565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127f8565b905060005b84811015610f895764e8d4a510008284610f5f9190612829565b610f6991906127f8565b83610f749190612883565b92508080610f81906128b7565b915050610f45565b5064e8d4a510008583610f9c9190612829565b610fa691906127f8565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110609061294b565b60405180910390fd5b600a546009548461107a9190612773565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906129b7565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e19190612773565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124be565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e39190612829565b7f000000000000000000000000000000000000000000000000000000000000000061120e9190612773565b9050919050565b6000603c82426112259190612883565b61122f91906127f8565b9050919050565b600b5481565b60035481565b6000806402540be400836112569190612829565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612883565b8461128c9190612829565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127f8565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f491906129d7565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113329190612829565b61133c91906127f8565b9050919050565b6000603c82426113539190612883565b61135d91906127f8565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee91906129d7565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006114369190612829565b82846114429190612829565b61144c91906127f8565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b95506001866117559190612773565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124be565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c90612713565b80601f016020809104026020016040519081016040528092919081815260200182805461188890612713565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124be565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b639190612829565b600354611b709190612773565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a5c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127f8565b905060005b84811015611c7d5764e8d4a510008284611c539190612829565b611c5d91906127f8565b83611c689190612773565b92508080611c75906128b7565b915050611c39565b5064e8d4a510008583611c909190612829565b611c9a91906127f8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612883565b611cff91906127f8565b611d099190612773565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed99190612773565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612883565b81548110611f5957611f58612a77565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612883565b81548110611fb557611fb4612a77565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612883565b81548110611ff557611ff4612a77565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612ad2565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612b4b565b60405180910390fd5b84836121c99190612883565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b83811115612323576000848401525b50505050565b6000601f19601f8301169050919050565b6000612345826122da565b61234f81856122e5565b935061235f8185602086016122f6565b61236881612329565b840191505092915050565b6000602082019050818103600083015261238d818461233a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c082612395565b9050919050565b6123d0816123b5565b81146123db57600080fd5b50565b6000813590506123ed816123c7565b92915050565b6000819050919050565b612406816123f3565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b600080604083850312156124405761243f61221a565b5b600061244e858286016123de565b925050602061245f85828601612414565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248e81612469565b82525050565b60006020820190506124a96000830184612485565b92915050565b6124b8816123f3565b82525050565b60006020820190506124d360008301846124af565b92915050565b6000806000606084860312156124f2576124f161221a565b5b6000612500868287016123de565b9350506020612511868287016123de565b925050604061252286828701612414565b9150509250925092565b6000602082840312156125425761254161221a565b5b6000612550848285016123de565b91505092915050565b600080604083850312156125705761256f61221a565b5b600061257e85828601612414565b925050602061258f85828601612414565b9150509250929050565b6000602082840312156125af576125ae61221a565b5b60006125bd84828501612414565b91505092915050565b6000819050919050565b6125d9816125c6565b82525050565b60006020820190506125f460008301846125d0565b92915050565b612603816125c6565b811461260e57600080fd5b50565b600081359050612620816125fa565b92915050565b60006020828403121561263c5761263b61221a565b5b600061264a84828501612611565b91505092915050565b61265c816123b5565b82525050565b60006020820190506126776000830184612653565b92915050565b600080600080608085870312156126975761269661221a565b5b60006126a587828801612414565b94505060206126b687828801612414565b93505060406126c787828801612414565b92505060606126d887828801612414565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272b57607f821691505b60208210810361273e5761273d6126e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061277e826123f3565b9150612789836123f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127be576127bd612744565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612803826123f3565b915061280e836123f3565b92508261281e5761281d6127c9565b5b828204905092915050565b6000612834826123f3565b915061283f836123f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287857612877612744565b5b828202905092915050565b600061288e826123f3565b9150612899836123f3565b9250828210156128ac576128ab612744565b5b828203905092915050565b60006128c2826123f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128f4576128f3612744565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612935600a836122e5565b9150612940826128ff565b602082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129a16007836122e5565b91506129ac8261296b565b602082019050919050565b600060208201905081810360008301526129d081612994565b9050919050565b60006129e282612469565b91506129ed83612469565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a1657612a15612744565b5b828202905092915050565b6000819050919050565b6000612a46612a41612a3c84612469565b612a21565b6123f3565b9050919050565b612a5681612a2b565b82525050565b6000602082019050612a716000830184612a4d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aaf81612469565b8114612aba57600080fd5b50565b600081519050612acc81612aa6565b92915050565b600060208284031215612ae857612ae761221a565b5b6000612af684828501612abd565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b35600d836122e5565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b905091905056fea264697066735822122062c31e95bd6895f83a0143b8b2662ee1e29e96dcc6cdf00d59c085ca9228ddc264736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json deleted file mode 100644 index 9c46b36..0000000 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json +++ /dev/null @@ -1 +0,0 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"},{"internalType":"uint256","name":"_supplyCap","type":"uint256"}],"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":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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"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":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint128","name":"","type":"uint128"}],"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":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 2828c3b..355cffc 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034973803806200349783398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b696200092e60003960008181610cf001528181610f400152611c0801526000818161119001528181611a790152611ca70152600081816111bc01528181611cc80152611d0d01526000818161122901528181611261015281816112d90152611a550152612b696000f3fe608060405234801561001057600080fd5b5060043610610291576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b8063731f237c1461063857806374bedb951461065657806379ba50971461067457806384dde4af146106925780638d34855a146106b057610291565b806340452d911161020757806358b2833b116101cb57806358b2833b1461052a5780636721d4ef146105485780636787a9be146105785780636a2d094e146105a85780636ffa8a05146105d857806370a082311461060857610291565b806340452d911461043a578063449a52f81461046a57806347a505171461049a5780634abfbba2146104ca57806351b4541c146104fa57610291565b80631989c6a8116102595780631989c6a814610350578063229ba1971461036e57806323b872dd1461038c5780633092afd5146103bc57806331333487146103ec578063313ce5671461041c57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c1461031457806318160ddd14610332575b600080fd5b6102b060048036038101906102ab91906122ab565b61096c565b6040516102bd91906122f3565b60405180910390f35b6102ce610b12565b6040516102db91906123a7565b60405180910390f35b6102fe60048036038101906102f9919061245d565b610ba0565b60405161030b91906122f3565b60405180910390f35b61031c610cba565b60405161032991906124c8565b60405180910390f35b61033a610cdc565b60405161034791906124f2565b60405180910390f35b610358610ce2565b60405161036591906124f2565b60405180910390f35b610376610cee565b60405161038391906124f2565b60405180910390f35b6103a660048036038101906103a1919061250d565b610d12565b6040516103b391906122f3565b60405180910390f35b6103d660048036038101906103d19190612560565b610e32565b6040516103e391906122f3565b60405180910390f35b6104066004803603810190610401919061258d565b610f25565b60405161041391906124f2565b60405180910390f35b610424610fd9565b60405161043191906124f2565b60405180910390f35b610454600480360381019061044f91906125cd565b610fdf565b6040516104619190612613565b60405180910390f35b610484600480360381019061047f919061245d565b611003565b60405161049191906122f3565b60405180910390f35b6104b460048036038101906104af9190612560565b611143565b6040516104c191906124f2565b60405180910390f35b6104e460048036038101906104df91906125cd565b61118c565b6040516104f191906124f2565b60405180910390f35b610514600480360381019061050f91906125cd565b6111ec565b60405161052191906124f2565b60405180910390f35b61053261120d565b60405161053f91906124f2565b60405180910390f35b610562600480360381019061055d919061258d565b611213565b60405161056f91906124f2565b60405180910390f35b610592600480360381019061058d91906125cd565b611294565b60405161059f91906124f2565b60405180910390f35b6105c260048036038101906105bd91906125cd565b611314565b6040516105cf91906124f2565b60405180910390f35b6105f260048036038101906105ed919061265a565b611335565b6040516105ff91906124f2565b60405180910390f35b610622600480360381019061061d9190612560565b61136f565b60405161062f91906124f2565b60405180910390f35b610640611427565b60405161064d91906122f3565b60405180910390f35b61065e611438565b60405161066b91906124f2565b60405180910390f35b61067c61143e565b60405161068991906122f3565b60405180910390f35b61069a6115e5565b6040516106a79190612696565b60405180910390f35b6106ca60048036038101906106c5919061265a565b61160b565b6040516106d791906124f2565b60405180910390f35b6106e8611639565b6040516106f59190612696565b60405180910390f35b61071860048036038101906107139190612560565b61165f565b005b6107226116fd565b60405161072f91906122f3565b60405180910390f35b610740611846565b60405161074d91906123a7565b60405180910390f35b610770600480360381019061076b9190612560565b6118d4565b60405161077d91906122f3565b60405180910390f35b6107a0600480360381019061079b919061265a565b611991565b6040516107ad91906124f2565b60405180910390f35b6107d060048036038101906107cb919061245d565b6119bd565b6040516107dd91906122f3565b60405180910390f35b6107ee611a53565b6040516107fb91906124f2565b60405180910390f35b61080c611a77565b60405161081991906124f2565b60405180910390f35b61083c600480360381019061083791906125cd565b611a9b565b60405161084991906122f3565b60405180910390f35b61085a611bd3565b60405161086791906124f2565b60405180910390f35b61088a6004803603810190610885919061265a565b611bd9565b60405161089791906124f2565b60405180910390f35b6108ba60048036038101906108b5919061258d565b611bed565b6040516108c791906124f2565b60405180910390f35b6108d8611ca1565b6040516108e591906124c8565b60405180910390f35b6108f6611d0b565b60405161090391906124f2565b60405180910390f35b61092660048036038101906109219190612560565b611d2f565b60405161093391906122f3565b60405180910390f35b610956600480360381019061095191906126b1565b611dd1565b6040516109639190612613565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60068054610b1f90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612747565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116fd565b50610bb583611294565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4391906127a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124f2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d1f6116fd565b50610d2984611294565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610db457600080fd5b610dbf868684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e1e91906124f2565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ebb57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ec457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f69919061282c565b905060005b84811015610fb25764e8d4a510008284610f88919061285d565b610f92919061282c565b83610f9d91906128b7565b92508080610faa906128eb565b915050610f6e565b5064e8d4a510008583610fc5919061285d565b610fcf919061282c565b9250505092915050565b60085481565b60008181548110610fef57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061297f565b60405180910390fd5b61109a6116fd565b506110a483611294565b905082600960008282546110b891906127a7565b925050819055506110c98482611e63565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112791906124f2565b60405180910390a3611137611f27565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111ba919061285d565b7f00000000000000000000000000000000000000000000000000000000000000006111e591906127a7565b9050919050565b6000603c82426111fc91906128b7565b611206919061282c565b9050919050565b60035481565b6000806402540be40083611227919061285d565b7f000000000000000000000000000000000000000000000000000000000000000061125291906128b7565b8461125d919061285d565b90507f00000000000000000000000000000000000000000000000000000000000000008161128b919061282c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112c5919061299f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611303919061285d565b61130d919061282c565b9050919050565b6000603c824261132491906128b7565b61132e919061282c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061137e85611143565b925061138b6003546111ec565b90506113d76402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113bf919061299f565b6fffffffffffffffffffffffffffffffff1682610f25565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611407919061285d565b8284611413919061285d565b61141d919061282c565b9350505050919050565b60006114336000611a9b565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061161984611991565b915061162484611335565b90506116308282611213565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b957600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611713611427565b5061171c611fc9565b97506000600102880361173a57600098505050505050505050611843565b61174388611bd9565b955060018661175291906127a7565b905061175d8661118c565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179b82611314565b925060008311156117b7576117b08584611bed565b93506117bb565b8493505b6117ca60008560095484611dd1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117fe876120b5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161182e91906124f2565b60405180910390a16001985050505050505050505b90565b6007805461185390612747565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612747565b80156118cc5780601f106118a1576101008083540402835291602001916118cc565b820191906000526020600020905b8154815290600101906020018083116118af57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193057600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119ca6116fd565b506119d484611294565b91506119e1338684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4091906124f2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aab6003546111ec565b915060008203611ac057600092505050611bce565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0257508184105b15611b0b578391505b611b158183610f25565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b5a919061285d565b600354611b6791906127a7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bbf9190612a24565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c31919061282c565b905060005b84811015611c7a5764e8d4a510008284611c50919061285d565b611c5a919061282c565b83611c6591906127a7565b92508080611c72906128eb565b915050611c36565b5064e8d4a510008583611c8d919061285d565b611c97919061282c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf291906128b7565b611cfc919061282c565b611d0691906127a7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4b8584612147565b50611e568484611e63565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ebf5760009350505050611f21565b611ec886611143565b92508483611ed691906127a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f4591906128b7565b81548110611f5657611f55612a3f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa191906128b7565b81548110611fb257611fb1612a3f565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611fe357611fe2612a3f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190612a9a565b6fffffffffffffffffffffffffffffffff16905061209882611bd9565b81116120ac576000600102925050506120b2565b81925050505b90565b60008060006120c38461160b565b9150600b546120d183611294565b6120db91906128b7565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e63565b506001600a600082825461211d91906127a7565b9250508190555080600b600082825461213691906127a7565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121a35760009350505050612248565b6121ac86611143565b9250848310156121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890612b13565b60405180910390fd5b84836121fd91906128b7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61228881612253565b811461229357600080fd5b50565b6000813590506122a58161227f565b92915050565b6000602082840312156122c1576122c061224e565b5b60006122cf84828501612296565b91505092915050565b60008115159050919050565b6122ed816122d8565b82525050565b600060208201905061230860008301846122e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561234857808201518184015260208101905061232d565b83811115612357576000848401525b50505050565b6000601f19601f8301169050919050565b60006123798261230e565b6123838185612319565b935061239381856020860161232a565b61239c8161235d565b840191505092915050565b600060208201905081810360008301526123c1818461236e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f4826123c9565b9050919050565b612404816123e9565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000819050919050565b61243a81612427565b811461244557600080fd5b50565b60008135905061245781612431565b92915050565b600080604083850312156124745761247361224e565b5b600061248285828601612412565b925050602061249385828601612448565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124c28161249d565b82525050565b60006020820190506124dd60008301846124b9565b92915050565b6124ec81612427565b82525050565b600060208201905061250760008301846124e3565b92915050565b6000806000606084860312156125265761252561224e565b5b600061253486828701612412565b935050602061254586828701612412565b925050604061255686828701612448565b9150509250925092565b6000602082840312156125765761257561224e565b5b600061258484828501612412565b91505092915050565b600080604083850312156125a4576125a361224e565b5b60006125b285828601612448565b92505060206125c385828601612448565b9150509250929050565b6000602082840312156125e3576125e261224e565b5b60006125f184828501612448565b91505092915050565b6000819050919050565b61260d816125fa565b82525050565b60006020820190506126286000830184612604565b92915050565b612637816125fa565b811461264257600080fd5b50565b6000813590506126548161262e565b92915050565b6000602082840312156126705761266f61224e565b5b600061267e84828501612645565b91505092915050565b612690816123e9565b82525050565b60006020820190506126ab6000830184612687565b92915050565b600080600080608085870312156126cb576126ca61224e565b5b60006126d987828801612448565b94505060206126ea87828801612448565b93505060406126fb87828801612448565b925050606061270c87828801612448565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275f57607f821691505b60208210810361277257612771612718565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127b282612427565b91506127bd83612427565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127f2576127f1612778565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283782612427565b915061284283612427565b925082612852576128516127fd565b5b828204905092915050565b600061286882612427565b915061287383612427565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128ac576128ab612778565b5b828202905092915050565b60006128c282612427565b91506128cd83612427565b9250828210156128e0576128df612778565b5b828203905092915050565b60006128f682612427565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361292857612927612778565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612969600a83612319565b915061297482612933565b602082019050919050565b600060208201905081810360008301526129988161295c565b9050919050565b60006129aa8261249d565b91506129b58361249d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129de576129dd612778565b5b828202905092915050565b6000819050919050565b6000612a0e612a09612a048461249d565b6129e9565b612427565b9050919050565b612a1e816129f3565b82525050565b6000602082019050612a396000830184612a15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a778161249d565b8114612a8257600080fd5b50565b600081519050612a9481612a6e565b92915050565b600060208284031215612ab057612aaf61224e565b5b6000612abe84828501612a85565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612afd600d83612319565b9150612b0882612ac7565b602082019050919050565b60006020820190508181036000830152612b2c81612af0565b905091905056fea264697066735822122065b90287fa7f2775639ada07b04e464a1dddb8f8c5f37cf825ec850b55ac7deb64736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000349565b6080908152503480156200003657600080fd5b5060405162003df438038062003df483398181016040528101906200005c919062000648565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550856006908162000128919062000969565b5084600790816200013a919062000969565b508360ff166008819055504260038190555060035460a08181525050603c8262000165919062000349565b60c0818152505060646a52b7d2dcc80cd2e400000062000186919062000a50565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022a6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002a3640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000a96565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003568262000310565b9150620003638362000310565b9250828202620003738162000310565b915082820484148315176200038d576200038c6200031a565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003fd82620003b2565b810181811067ffffffffffffffff821117156200041f576200041e620003c3565b5b80604052505050565b60006200043462000394565b9050620004428282620003f2565b919050565b600067ffffffffffffffff821115620004655762000464620003c3565b5b6200047082620003b2565b9050602081019050919050565b60005b838110156200049d57808201518184015260208101905062000480565b60008484015250505050565b6000620004c0620004ba8462000447565b62000428565b905082815260208101848484011115620004df57620004de620003ad565b5b620004ec8482856200047d565b509392505050565b600082601f8301126200050c576200050b620003a8565b5b81516200051e848260208601620004a9565b91505092915050565b600060ff82169050919050565b6200053f8162000527565b81146200054b57600080fd5b50565b6000815190506200055f8162000534565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200058c8162000565565b81146200059857600080fd5b50565b600081519050620005ac8162000581565b92915050565b620005bd8162000310565b8114620005c957600080fd5b50565b600081519050620005dd81620005b2565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200061082620005e3565b9050919050565b620006228162000603565b81146200062e57600080fd5b50565b600081519050620006428162000617565b92915050565b60008060008060008060c087890312156200066857620006676200039e565b5b600087015167ffffffffffffffff811115620006895762000688620003a3565b5b6200069789828a01620004f4565b965050602087015167ffffffffffffffff811115620006bb57620006ba620003a3565b5b620006c989828a01620004f4565b9550506040620006dc89828a016200054e565b9450506060620006ef89828a016200059b565b93505060806200070289828a01620005cc565b92505060a06200071589828a0162000631565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200077557607f821691505b6020821081036200078b576200078a6200072d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007f87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007b6565b620008048683620007b6565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000847620008416200083b8462000310565b6200081c565b62000310565b9050919050565b6000819050919050565b620008638362000826565b6200087b62000872826200084e565b848454620007c6565b825550505050565b600090565b6200089262000883565b6200089f81848462000858565b505050565b5b81811015620008c757620008bb60008262000888565b600181019050620008a5565b5050565b601f8211156200091657620008e08162000791565b620008eb84620007a6565b81016020851015620008fb578190505b620009136200090a85620007a6565b830182620008a4565b50505b505050565b60008160020a8304905092915050565b60006200093e600019846008026200091b565b1980831691505092915050565b60006200095983836200092b565b9150826002028217905092915050565b620009748262000722565b67ffffffffffffffff81111562000990576200098f620003c3565b5b6200099c82546200075c565b620009a9828285620008cb565b600060209050601f831160018114620009e15760008415620009cc578287015190505b620009d885826200094b565b86555062000a48565b601f198416620009f18662000791565b60005b8281101562000a1b57848901518255600182019150602085019450602081019050620009f4565b8683101562000a3b578489015162000a37601f8916826200092b565b8355505b6001600288020188555050505b505050505050565b600062000a5d8262000565565b915062000a6a8362000565565b925082820262000a7a8162000565565b915080821462000a8f5762000a8e6200031a565b5b5092915050565b60805160a05160c05160e0516132de62000b1660003960008181610eb70152818161119a015261235c0152600081816116ae01528181611caa015281816121c301526123fb0152600081816116da0152818161241c01526124610152600081816117470152818161177f015281816117f7015261219f01526132de6000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a457c2d711610106578063d89135cd116100bf578063e809529511610099578063e8095295146109cf578063eda4e6d6146109ed578063f2fde38b14610a0b578063f83da35d14610a3b576102d8565b8063d89135cd14610951578063e3ab207a1461096f578063e54d63f71461099f576102d8565b8063a457c2d714610867578063a9059cbb14610897578063ab28cea0146108c7578063b470aade146108e5578063c0ab707714610903578063d340ef8a14610933576102d8565b80638da5cb5b116101585780638da5cb5b146107915780638f0b2d5d146107af5780638f1df6bc146107cb57806395d89b41146107e9578063983b2d56146108075780639da7d8ba14610837576102d8565b8063731f237c146106cb57806373f42561146106e957806374bedb951461070757806379ba50971461072557806384dde4af146107435780638d34855a14610761576102d8565b806340452d911161024357806358b2833b116101fc57806358b2833b146105bd5780636721d4ef146105db5780636787a9be1461060b5780636a2d094e1461063b5780636ffa8a051461066b57806370a082311461069b576102d8565b806340452d91146104b157806342966c68146104e1578063449a52f8146104fd57806347a505171461052d5780634abfbba21461055d57806351b4541c1461058d576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612a04565b610a6b565b6040516103049190612a4c565b60405180910390f35b610315610c11565b6040516103229190612af7565b60405180910390f35b61034560048036038101906103409190612bad565b610c9f565b6040516103529190612a4c565b60405180910390f35b610363610e70565b6040516103709190612c18565b60405180910390f35b610381610e92565b60405161038e9190612c42565b60405180910390f35b61039f610ea9565b6040516103ac9190612c42565b60405180910390f35b6103bd610eb5565b6040516103ca9190612c42565b60405180910390f35b6103ed60048036038101906103e89190612c5d565b610ed9565b6040516103fa9190612a4c565b60405180910390f35b61041d60048036038101906104189190612cb0565b61108c565b60405161042a9190612a4c565b60405180910390f35b61044d60048036038101906104489190612cdd565b61117f565b60405161045a9190612c42565b60405180910390f35b61046b611233565b6040516104789190612c42565b60405180910390f35b61049b60048036038101906104969190612bad565b611239565b6040516104a89190612a4c565b60405180910390f35b6104cb60048036038101906104c69190612d1d565b6113cf565b6040516104d89190612d63565b60405180910390f35b6104fb60048036038101906104f69190612d1d565b6113f3565b005b61051760048036038101906105129190612bad565b611521565b6040516105249190612a4c565b60405180910390f35b61054760048036038101906105429190612cb0565b611661565b6040516105549190612c42565b60405180910390f35b61057760048036038101906105729190612d1d565b6116aa565b6040516105849190612c42565b60405180910390f35b6105a760048036038101906105a29190612d1d565b61170a565b6040516105b49190612c42565b60405180910390f35b6105c561172b565b6040516105d29190612c42565b60405180910390f35b6105f560048036038101906105f09190612cdd565b611731565b6040516106029190612c42565b60405180910390f35b61062560048036038101906106209190612d1d565b6117b2565b6040516106329190612c42565b60405180910390f35b61065560048036038101906106509190612d1d565b611832565b6040516106629190612c42565b60405180910390f35b61068560048036038101906106809190612daa565b611853565b6040516106929190612c42565b60405180910390f35b6106b560048036038101906106b09190612cb0565b61188d565b6040516106c29190612c42565b60405180910390f35b6106d3611945565b6040516106e09190612a4c565b60405180910390f35b6106f1611956565b6040516106fe9190612c42565b60405180910390f35b61070f61195c565b60405161071c9190612c42565b60405180910390f35b61072d611962565b60405161073a9190612a4c565b60405180910390f35b61074b611b09565b6040516107589190612de6565b60405180910390f35b61077b60048036038101906107769190612daa565b611b2f565b6040516107889190612c42565b60405180910390f35b610799611b5d565b6040516107a69190612de6565b60405180910390f35b6107c960048036038101906107c49190612cb0565b611b83565b005b6107d3611c21565b6040516107e09190612a4c565b60405180910390f35b6107f1611d71565b6040516107fe9190612af7565b60405180910390f35b610821600480360381019061081c9190612cb0565b611dff565b60405161082e9190612a4c565b60405180910390f35b610851600480360381019061084c9190612daa565b611ebc565b60405161085e9190612c42565b60405180910390f35b610881600480360381019061087c9190612bad565b611ee8565b60405161088e9190612a4c565b60405180910390f35b6108b160048036038101906108ac9190612bad565b612107565b6040516108be9190612a4c565b60405180910390f35b6108cf61219d565b6040516108dc9190612c42565b60405180910390f35b6108ed6121c1565b6040516108fa9190612c42565b60405180910390f35b61091d60048036038101906109189190612d1d565b6121e5565b60405161092a9190612a4c565b60405180910390f35b61093b61231d565b6040516109489190612c42565b60405180910390f35b610959612323565b6040516109669190612c42565b60405180910390f35b61098960048036038101906109849190612daa565b61232d565b6040516109969190612c42565b60405180910390f35b6109b960048036038101906109b49190612cdd565b612341565b6040516109c69190612c42565b60405180910390f35b6109d76123f5565b6040516109e49190612c18565b60405180910390f35b6109f561245f565b604051610a029190612c42565b60405180910390f35b610a256004803603810190610a209190612cb0565b612483565b604051610a329190612a4c565b60405180910390f35b610a556004803603810190610a509190612e01565b612525565b604051610a629190612d63565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610abf5760019050610c0c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b115760019050610c0c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b635760019050610c0c565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb55760019050610c0c565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c075760019050610c0c565b600090505b919050565b60068054610c1e90612e97565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4a90612e97565b8015610c975780601f10610c6c57610100808354040283529160200191610c97565b820191906000526020600020905b815481529060010190602001808311610c7a57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6b5760008314610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190612f14565b60405180910390fd5b5b610d73611c21565b50610d7d836117b2565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5d9190612c42565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea49190612f63565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee6611c21565b50610ef0846117b2565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7b57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110079190612f63565b92505081905550611019868684612592565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110789190612c42565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111557503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61111e57600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c39190612fc6565b905060005b8481101561120c5764e8d4a5100082846111e29190612ff7565b6111ec9190612fc6565b836111f79190612f63565b9250808061120490613039565b9150506111c8565b5064e8d4a51000858361121f9190612ff7565b6112299190612fc6565b9250505092915050565b60085481565b600080611244611c21565b5061124e836117b2565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112dc9190613081565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113bc9190612c42565b60405180910390a3600191505092915050565b600081815481106113df57600080fd5b906000526020600020016000915090505481565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661144957600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561149557600080fd5b60006114a0826117b2565b90506114aa611945565b506114b533826125b7565b5081600c60008282546114c89190613081565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115159190612c42565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a790613101565b60405180910390fd5b6115b8611c21565b506115c2836117b2565b905082600960008282546115d69190613081565b925050819055506115e784826126be565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116459190612c42565b60405180910390a3611655612782565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826116d89190612ff7565b7f00000000000000000000000000000000000000000000000000000000000000006117039190613081565b9050919050565b6000603c824261171a9190612f63565b6117249190612fc6565b9050919050565b60035481565b6000806402540be400836117459190612ff7565b7f00000000000000000000000000000000000000000000000000000000000000006117709190612f63565b8461177b9190612ff7565b90507f0000000000000000000000000000000000000000000000000000000000000000816117a99190612fc6565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166117e39190613121565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118219190612ff7565b61182b9190612fc6565b9050919050565b6000603c82426118429190612f63565b61184c9190612fc6565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061189c85611661565b92506118a960035461170a565b90506118f56402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118dd9190613121565b6fffffffffffffffffffffffffffffffff168261117f565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119259190612ff7565b82846119319190612ff7565b61193b9190612fc6565b9350505050919050565b600061195160006121e5565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bf57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000611b3d84611ebc565b9150611b4884611853565b9050611b548282611731565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bdd57600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611c37611945565b50611c40612829565b975060006001028803611c5e57600098505050505050505050611d6e565b6000600a5481548110611c7457611c7361315e565b5b90600052602060002001549350611c8a8861232d565b9550600186611c999190613081565b9050611ca484611853565b9450603c7f0000000000000000000000000000000000000000000000000000000000000000611cd39190612fc6565b9150611cdf858361117f565b9250611cf5600084611cef610e92565b84612525565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611d2987612915565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611d599190612c42565b60405180910390a16001985050505050505050505b90565b60078054611d7e90612e97565b80601f0160208091040260200160405190810160405280929190818152602001828054611daa90612e97565b8015611df75780601f10611dcc57610100808354040283529160200191611df7565b820191906000526020600020905b815481529060010190602001808311611dda57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5b57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080611ef4836117b2565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611f7f57600080fd5b611f87611c21565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120149190612f63565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516120f49190612c42565b60405180910390a3600191505092915050565b6000806000612114611c21565b5061211e846117b2565b915061212b338684612592565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161218a9190612c42565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060006121f560035461170a565b91506000820361220a57600092505050612318565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008411801561224c57508184105b15612255578391505b61225f818361117f565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c826122a49190612ff7565b6003546122b19190613081565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161230991906131c8565b60405180910390a46001925050505b919050565b600a5481565b6000600c54905090565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006123859190612fc6565b905060005b848110156123ce5764e8d4a5100082846123a49190612ff7565b6123ae9190612fc6565b836123b99190613081565b925080806123c690613039565b91505061238a565b5064e8d4a5100085836123e19190612ff7565b6123eb9190612fc6565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426124469190612f63565b6124509190612fc6565b61245a9190613081565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124df57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008061259f85846125b7565b506125aa84846126be565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361261357600093505050506126b8565b61261c86611661565b925084831015612661576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126589061322f565b60405180910390fd5b848361266d9190612f63565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361271a576000935050505061277c565b61272386611661565b925084836127319190613081565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600061278f610e92565b9050600060016000805490506127a59190612f63565b815481106127b6576127b561315e565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a028217915081600102600060016000805490506128019190612f63565b815481106128125761281161315e565b5b906000526020600020018190555060019250505090565b600080600080600a54815481106128435761284261315e565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156128b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128db919061327b565b6fffffffffffffffffffffffffffffffff1690506128f88261232d565b811161290c57600060010292505050612912565b81925050505b90565b600080600061292384611b2f565b9150600b54612931836117b2565b61293b9190612f63565b9050612969600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826126be565b506001600a600082825461297d9190613081565b9250508190555080600b60008282546129969190613081565b925050819055508192505050919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129e1816129ac565b81146129ec57600080fd5b50565b6000813590506129fe816129d8565b92915050565b600060208284031215612a1a57612a196129a7565b5b6000612a28848285016129ef565b91505092915050565b60008115159050919050565b612a4681612a31565b82525050565b6000602082019050612a616000830184612a3d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aa1578082015181840152602081019050612a86565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ac982612a67565b612ad38185612a72565b9350612ae3818560208601612a83565b612aec81612aad565b840191505092915050565b60006020820190508181036000830152612b118184612abe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b4482612b19565b9050919050565b612b5481612b39565b8114612b5f57600080fd5b50565b600081359050612b7181612b4b565b92915050565b6000819050919050565b612b8a81612b77565b8114612b9557600080fd5b50565b600081359050612ba781612b81565b92915050565b60008060408385031215612bc457612bc36129a7565b5b6000612bd285828601612b62565b9250506020612be385828601612b98565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612c1281612bed565b82525050565b6000602082019050612c2d6000830184612c09565b92915050565b612c3c81612b77565b82525050565b6000602082019050612c576000830184612c33565b92915050565b600080600060608486031215612c7657612c756129a7565b5b6000612c8486828701612b62565b9350506020612c9586828701612b62565b9250506040612ca686828701612b98565b9150509250925092565b600060208284031215612cc657612cc56129a7565b5b6000612cd484828501612b62565b91505092915050565b60008060408385031215612cf457612cf36129a7565b5b6000612d0285828601612b98565b9250506020612d1385828601612b98565b9150509250929050565b600060208284031215612d3357612d326129a7565b5b6000612d4184828501612b98565b91505092915050565b6000819050919050565b612d5d81612d4a565b82525050565b6000602082019050612d786000830184612d54565b92915050565b612d8781612d4a565b8114612d9257600080fd5b50565b600081359050612da481612d7e565b92915050565b600060208284031215612dc057612dbf6129a7565b5b6000612dce84828501612d95565b91505092915050565b612de081612b39565b82525050565b6000602082019050612dfb6000830184612dd7565b92915050565b60008060008060808587031215612e1b57612e1a6129a7565b5b6000612e2987828801612b98565b9450506020612e3a87828801612b98565b9350506040612e4b87828801612b98565b9250506060612e5c87828801612b98565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612eaf57607f821691505b602082108103612ec257612ec1612e68565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000612efe600a83612a72565b9150612f0982612ec8565b602082019050919050565b60006020820190508181036000830152612f2d81612ef1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f6e82612b77565b9150612f7983612b77565b9250828203905081811115612f9157612f90612f34565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612fd182612b77565b9150612fdc83612b77565b925082612fec57612feb612f97565b5b828204905092915050565b600061300282612b77565b915061300d83612b77565b925082820261301b81612b77565b9150828204841483151761303257613031612f34565b5b5092915050565b600061304482612b77565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361307657613075612f34565b5b600182019050919050565b600061308c82612b77565b915061309783612b77565b92508282019050808211156130af576130ae612f34565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006130eb600a83612a72565b91506130f6826130b5565b602082019050919050565b6000602082019050818103600083015261311a816130de565b9050919050565b600061312c82612bed565b915061313783612bed565b925082820261314581612bed565b915080821461315757613156612f34565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b60006131b26131ad6131a884612bed565b61318d565b612b77565b9050919050565b6131c281613197565b82525050565b60006020820190506131dd60008301846131b9565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000613219600d83612a72565b9150613224826131e3565b602082019050919050565b600060208201905081810360008301526132488161320c565b9050919050565b61325881612bed565b811461326357600080fd5b50565b6000815190506132758161324f565b92915050565b600060208284031215613291576132906129a7565b5b600061329f84828501613266565b9150509291505056fea2646970667358221220d498bcac54c9f0e4b63eea066f2ad30aea293661380ef849a31efc9b436e3eb064736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index d4ed49d..654f397 100644 --- 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":"uint128","name":"_taxLevelMinute","type":"uint128"},{"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":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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"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":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint128","name":"","type":"uint128"}],"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":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"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":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"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":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint128","name":"","type":"uint128"}],"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":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","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":[],"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":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"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/erc20_demurrage_token/demurrage.py b/python/erc20_demurrage_token/demurrage.py index 7941ee2..50bad93 100644 --- a/python/erc20_demurrage_token/demurrage.py +++ b/python/erc20_demurrage_token/demurrage.py @@ -9,8 +9,7 @@ from chainlib.eth.constant import ZERO_ADDRESS # local imports from .token import DemurrageToken -logging.basicConfig(level=logging.DEBUG) -logg = logging.getLogger() +logg = logging.getLogger(__name__) class DemurrageCalculator: diff --git a/python/erc20_demurrage_token/runnable/apply.py b/python/erc20_demurrage_token/runnable/apply.py index 270c0f4..3fe9835 100644 --- a/python/erc20_demurrage_token/runnable/apply.py +++ b/python/erc20_demurrage_token/runnable/apply.py @@ -16,17 +16,7 @@ import math # external imports import confini -from funga.eth.signer import EIP155Signer -from funga.eth.keystore.dict import DictKeystore -from chainlib.chain import ChainSpec -from chainlib.eth.nonce import ( - RPCNonceOracle, - OverrideNonceOracle, - ) -from chainlib.eth.gas import ( - RPCGasOracle, - OverrideGasOracle, - ) +import chainlib.eth.cli from chainlib.eth.block import ( block_latest, block_by_number, @@ -35,8 +25,20 @@ from chainlib.eth.block import ( from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import receipt from chainlib.eth.constant import ZERO_ADDRESS -import chainlib.eth.cli from hexathon import to_int as hex_to_int +import chainlib.eth.cli +from chainlib.eth.settings import process_settings +from chainlib.settings import ChainSettings +from chainlib.eth.cli.arg import ( + Arg, + ArgFlag, + process_args, + ) +from chainlib.eth.cli.config import ( + Config, + process_config, + ) +from chainlib.eth.cli.log import process_log # local imports import erc20_demurrage_token @@ -45,32 +47,38 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, ) -logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() -script_dir = os.path.dirname(__file__) -data_dir = os.path.join(script_dir, '..', 'data') -config_dir = os.path.join(data_dir, 'config') +def process_config_local(config, arg, args, flags): + config.add(args.steps, '_STEPS', False) + return config -arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC -argparser = chainlib.eth.cli.ArgumentParser(arg_flags) + +arg_flags = ArgFlag() +arg = Arg(arg_flags) +flags = arg_flags.STD_WRITE | arg_flags.EXEC | arg_flags.WALLET + +argparser = chainlib.eth.cli.ArgumentParser() +argparser = process_args(argparser, arg, flags) argparser.add_argument('--steps', type=int, default=0, help='Max demurrage steps to apply per round') args = argparser.parse_args() -config = chainlib.eth.cli.Config.from_args(args, arg_flags, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) -config.add(args.steps, '_STEPS', False) + +logg = process_log(args, logg) + +config = Config() +config = process_config(config, arg, args, flags) +config = process_config_local(config, arg, args, flags) logg.debug('config loaded:\n{}'.format(config)) -wallet = chainlib.eth.cli.Wallet() -wallet.from_config(config) - -rpc = chainlib.eth.cli.Rpc(wallet=wallet) -conn = rpc.connect_by_config(config) - -chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) +settings = ChainSettings() +settings = process_settings(settings, config) +logg.debug('settings loaded:\n{}'.format(settings)) def main(): + chain_spec = settings.get('CHAIN_SPEC') + conn = settings.get('CONN') o = block_latest() r = conn.do(o) @@ -87,9 +95,9 @@ def main(): block_start_timestamp = block_start.timestamp block_start_datetime = datetime.datetime.fromtimestamp(block_start_timestamp) - gas_oracle = rpc.get_gas_oracle() + gas_oracle = settings.get('FEE_ORACLE') c = DemurrageToken(chain_spec, gas_oracle=gas_oracle) - o = c.demurrage_timestamp(config.get('_EXEC_ADDRESS')) + o = c.demurrage_timestamp(settings.get('EXEC')) r = conn.do(o) demurrage_timestamp = None @@ -120,17 +128,17 @@ def main(): last_tx_hash = None for i in range(rounds): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() + signer = settings.get('SIGNER') + signer_address = settings.get('SENDER_ADDRESS') - nonce_oracle = rpc.get_nonce_oracle() + nonce_oracle = settings.get('NONCE_ORACLE') c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address, limit=config.get('_STEPS')) - if config.get('_RPC_SEND'): + if settings.get('RPC_SEND'): print(tx_hash_hex) conn.do(o) - if config.get('_WAIT_ALL') or (i == rounds - 1 and config.get('_WAIT')): + if config.true('_WAIT_ALL') or (i == rounds - 1 and config.true('_WAIT')): r = conn.wait(tx_hash_hex) if r['status'] == 0: sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') diff --git a/python/erc20_demurrage_token/runnable/deploy.py b/python/erc20_demurrage_token/runnable/deploy.py index 71b8060..ae691a2 100644 --- a/python/erc20_demurrage_token/runnable/deploy.py +++ b/python/erc20_demurrage_token/runnable/deploy.py @@ -14,21 +14,22 @@ import logging # external imports import confini -from funga.eth.signer import EIP155Signer -from funga.eth.keystore.dict import DictKeystore -from chainlib.chain import ChainSpec -from chainlib.eth.nonce import ( - RPCNonceOracle, - OverrideNonceOracle, - ) -from chainlib.eth.gas import ( - RPCGasOracle, - OverrideGasOracle, - ) from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import receipt from chainlib.eth.constant import ZERO_ADDRESS import chainlib.eth.cli +from chainlib.eth.settings import process_settings +from chainlib.settings import ChainSettings +from chainlib.eth.cli.arg import ( + Arg, + ArgFlag, + process_args, + ) +from chainlib.eth.cli.config import ( + Config, + process_config, + ) +from chainlib.eth.cli.log import process_log # local imports import erc20_demurrage_token @@ -37,84 +38,75 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, ) -logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() -script_dir = os.path.dirname(__file__) -data_dir = os.path.join(script_dir, '..', 'data') -config_dir = os.path.join(data_dir, 'config') +def process_config_local(config, arg, args, flags): + config.add(args.token_name, 'TOKEN_NAME', False) + config.add(args.token_symbol, 'TOKEN_SYMBOL', False) + config.add(args.token_decimals, 'TOKEN_DECIMALS', False) + config.add(args.sink_address, 'TOKEN_SINK_ADDRESS', False) + config.add(args.redistribution_period, 'TOKEN_REDISTRIBUTION_PERIOD', False) + config.add(args.demurrage_level, 'TOKEN_DEMURRAGE_LEVEL', False) + config.add(0, 'TOKEN_SUPPLY_LIMIT', False) + return config -arg_flags = chainlib.eth.cli.argflag_std_write -argparser = chainlib.eth.cli.ArgumentParser(arg_flags) + +arg_flags = ArgFlag() +arg = Arg(arg_flags) +flags = arg_flags.STD_WRITE | arg_flags.EXEC | arg_flags.WALLET + +argparser = chainlib.eth.cli.ArgumentParser() +argparser = process_args(argparser, arg, flags) argparser.add_argument('--name', dest='token_name', type=str, help='Token name') argparser.add_argument('--symbol', dest='token_symbol', required=True, type=str, help='Token symbol') argparser.add_argument('--decimals', dest='token_decimals', type=int, help='Token decimals') argparser.add_argument('--sink-address', dest='sink_address', type=str, help='demurrage level,ppm per minute') -argparser.add_argument('--supply-limit', dest='supply_limit', type=int, help='token supply limit (0 = no limit)') -argparser.add_argument('--redistribution-period', type=int, help='redistribution period, minutes (0 = deactivate)') # default 10080 = week -argparser.add_argument('--multi', action='store_true', help='automatic redistribution') +#argparser.add_argument('--supply-limit', dest='supply_limit', type=int, help='token supply limit (0 = no limit)') +argparser.add_argument('--redistribution-period', dest='redistribution_period', type=int, help='redistribution period, minutes (0 = deactivate)') # default 10080 = week +#argparser.add_argument('--multi', action='store_true', help='automatic redistribution') argparser.add_argument('--demurrage-level', dest='demurrage_level', type=int, help='demurrage level, ppm per minute') args = argparser.parse_args() -arg_flags = chainlib.eth.cli.argflag_std_write +logg = process_log(args, logg) -extra_args = { - 'redistribution_period': 'TOKEN_REDISTRIBUTION_PERIOD', - 'demurrage_level': 'TOKEN_DEMURRAGE_LEVEL', - 'supply_limit': 'TOKEN_SUPPLY_LIMIT', - 'token_name': 'TOKEN_NAME', - 'token_symbol': 'TOKEN_SYMBOL', - 'token_decimals': 'TOKEN_DECIMALS', - 'sink_address': 'TOKEN_SINK_ADDRESS', - 'multi': None, - } -config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) - -if not bool(config.get('TOKEN_NAME')): - logg.info('token name not set, using symbol {} as name'.format(config.get('TOKEN_SYMBOL'))) - config.add(config.get('TOKEN_SYMBOL'), 'TOKEN_NAME', True) - -if config.get('TOKEN_SUPPLY_LIMIT') == None: - config.add(0, 'TOKEN_SUPPLY_LIMIT', True) - -if config.get('TOKEN_REDISTRIBUTION_PERIOD') == None: - config.add(10800, 'TOKEN_REDISTRIBUTION_PERIOD', True) +config = Config() +config = process_config(config, arg, args, flags) +config = process_config_local(config, arg, args, flags) logg.debug('config loaded:\n{}'.format(config)) -wallet = chainlib.eth.cli.Wallet() -wallet.from_config(config) +settings = ChainSettings() +settings = process_settings(settings, config) +logg.debug('settings loaded:\n{}'.format(settings)) -rpc = chainlib.eth.cli.Rpc(wallet=wallet) -conn = rpc.connect_by_config(config) - -chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) def main(): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() + chain_spec = settings.get('CHAIN_SPEC') + conn = settings.get('CONN') + signer = settings.get('SIGNER') + signer_address = settings.get('SENDER_ADDRESS') - gas_oracle = rpc.get_gas_oracle() - nonce_oracle = rpc.get_nonce_oracle() + gas_oracle = settings.get('FEE_ORACLE') + nonce_oracle = settings.get('NONCE_ORACLE') c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) - settings = DemurrageTokenSettings() - settings.name = config.get('TOKEN_NAME') - settings.symbol = config.get('TOKEN_SYMBOL') - settings.decimals = int(config.get('TOKEN_DECIMALS')) - settings.demurrage_level = int(config.get('TOKEN_DEMURRAGE_LEVEL')) - settings.period_minutes = int(config.get('TOKEN_REDISTRIBUTION_PERIOD')) - settings.sink_address = config.get('TOKEN_SINK_ADDRESS') + token_settings = DemurrageTokenSettings() + token_settings.name = config.get('TOKEN_NAME') + token_settings.symbol = config.get('TOKEN_SYMBOL') + token_settings.decimals = int(config.get('TOKEN_DECIMALS')) + token_settings.demurrage_level = int(config.get('TOKEN_DEMURRAGE_LEVEL')) + token_settings.period_minutes = int(config.get('TOKEN_REDISTRIBUTION_PERIOD')) + token_settings.sink_address = config.get('TOKEN_SINK_ADDRESS') (tx_hash_hex, o) = c.constructor( signer_address, - settings, + token_settings, redistribute=config.true('_MULTI'), cap=int(config.get('TOKEN_SUPPLY_LIMIT')), ) - if config.get('_RPC_SEND'): + if settings.get('RPC_SEND'): conn.do(o) - if config.get('_WAIT'): + if config.true('_WAIT'): r = conn.wait(tx_hash_hex) if r['status'] == 0: sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index e098451..a22448e 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -117,6 +117,34 @@ class DemurrageToken(ERC20): return DemurrageToken.__bytecode[name] + def increase_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('increaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def decrease_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('decreaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('addMinter') @@ -155,6 +183,33 @@ class DemurrageToken(ERC20): return tx + def burn(self, contract_address, sender_address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('burn') + enc.typ(ABIContractType.UINT256) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def total_burned(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('totalBurned') + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + + def to_base_amount(self, contract_address, value, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() @@ -526,6 +581,7 @@ class DemurrageToken(ERC20): def parse_supply_cap(self, v): return abi_decode_single(ABIContractType.UINT256, v) + @classmethod def parse_grow_by(self, v): return abi_decode_single(ABIContractType.UINT256, v) @@ -549,3 +605,8 @@ class DemurrageToken(ERC20): @classmethod def parse_resolution_factor(self, v): return abi_decode_single(ABIContractType.UINT256, v) + + + @classmethod + def parse_total_burned(self, v): + return abi_decode_single(ABIContractType.UINT256, v) diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index c7eda7c..1b9694b 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -20,7 +20,7 @@ from erc20_demurrage_token import ( DemurrageToken, ) -logg = logging.getLogger() +logg = logging.getLogger(__name__) #BLOCKTIME = 5 # seconds TAX_LEVEL = int(10000 * 2) # 2% @@ -95,13 +95,6 @@ class TestDemurrage(EthTesterCase): def setUp(self): super(TestDemurrage, self).setUp() -# token_deploy = TestTokenDeploy() -# self.settings = token_deploy.settings -# self.sink_address = token_deploy.sink_address -# self.start_block = token_deploy.start_block -# self.start_time = token_deploy.start_time -# self.default_supply = self.default_supply -# self.default_supply_cap = self.default_supply_cap period = PERIOD try: period = getattr(self, 'period') @@ -133,6 +126,13 @@ class TestDemurrage(EthTesterCase): logg.debug('asserted within lower {} <= {} <= {}'.format(lower_target, v, target)) + def assert_within_greater(self, v, target, tolerance_ppm): + higher_target = target + (target * (tolerance_ppm / 1000000)) + self.assertLessEqual(v, higher_target) + self.assertGreaterEqual(v, target) + logg.debug('asserted within lower {} <= {} <= {}'.format(target, v, higher_target)) + + def tearDown(self): pass diff --git a/python/requirements.txt b/python/requirements.txt index 59502b2..9cfb203 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,3 +1,3 @@ -chainlib-eth>=0.1.0,<0.2.0 -eth-erc20~=0.3.0 +chainlib-eth~=0.4.6 +eth-erc20~=0.5.1 funga-eth~=0.6.0 diff --git a/python/run_tests.sh b/python/run_tests.sh index 4f3e2de..9f4e5d3 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -6,15 +6,18 @@ set -e export PYTHONPATH=. #modes=(MultiNocap MultiCap SingleCap SingleNocap) -modes=(SingleCap SingleNocap) # other contracts need to be updted +#modes=(SingleCap SingleNocap) # other contracts need to be updted +modes=(SingleNocap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_growth.py ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_amounts.py ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_single.py + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_burn.py done -modes=(SingleCap) # other contracts need to be updted +#modes=(SingleCap) # other contracts need to be updted +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py done @@ -25,7 +28,8 @@ for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done -modes=(MultiCap SingleCap) +#modes=(MultiCap SingleCap) +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_cap.py done diff --git a/python/setup.cfg b/python/setup.cfg index dd9ec7d..820fb7b 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.1.1 +version = 0.2.0 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 44fc556..52221d6 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -276,7 +276,52 @@ class TestBasic(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - + + def test_approve(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 0) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.increase_allowance(self.address, self.accounts[0], self.accounts[1], 200) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.decrease_allowance(self.address, self.accounts[0], self.accounts[1], 800) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 42) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + def test_transfer_from(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) @@ -315,6 +360,12 @@ class TestBasic(TestDemurrageDefault): balance = c.parse_balance_of(r) self.assertEqual(balance, 500) + (tx_hash, o) = c.transfer_from(self.address, self.accounts[2], self.accounts[1], self.accounts[3], 1) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_burn.py b/python/tests/test_burn.py new file mode 100644 index 0000000..94b1d58 --- /dev/null +++ b/python/tests/test_burn.py @@ -0,0 +1,320 @@ +# standard imports +import os +import unittest +import json +import logging +import datetime + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest.base import TestDemurrage + +logging.basicConfig(level=logging.INFO) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + +TAX_LEVEL = 2 + +class TestBurn(TestDemurrage): + + def setUp(self): + super(TestBurn, self).setUp() + + + def deploy(self, tax_level=None): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') + if self.mode == None: + self.mode = 'MultiNocap' + logg.debug('executing test setup default mode {}'.format(self.mode)) + + if tax_level != None: + self.deployer.settings.demurrage_level = tax_level * (10 ** 32) + self.deployer.settings.sink_address = self.accounts[9] + self.deployer.sink_address = self.accounts[9] + super(TestBurn, self).deploy(c, self.mode) + + logg.info('deployed with mode {}'.format(self.mode)) + + + # Burn tokens and immediately check balances and supply + def test_burn_basic(self): + self.deploy() + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1000000) + r = self.rpc.do(o) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.burn(self.address, self.accounts[1], 600000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.accounts[1]) + r = self.rpc.do(o) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.burn(self.address, self.accounts[1], 600000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + self.assertEqual(new_supply, 400000) + + o = c.total_burned(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + burned = c.parse_total_burned(r) + self.assertEqual(burned, 600000) + + + # burn tokens and check sink balance and supply after first redistribution period + def test_burned_redistribution(self): + self.deploy() + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], 1000000000) + r = self.rpc.do(o) + + (tx_hash, o) = c.burn(self.address, self.accounts[0], 500000000) + r = self.rpc.do(o) + + (tx_hash, o) = c.transfer(self.address, self.accounts[0], self.sink_address, 500000000) + r = self.rpc.do(o) + + self.backend.time_travel(self.start_time + self.period_seconds) + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + bal = c.parse_balance(r) + self.assertEqual(bal, 416873881) # 9 periods demurrage + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + self.assertEqual(new_supply, 500000000) + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + bal = c.parse_balance(r) + self.assert_within_lower(bal, 500000000, 0.0025) + + self.backend.time_travel(self.start_time + (self.period_seconds * 2)) + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + self.assertEqual(new_supply, 500000000) + + # if we don't burn anything more it should be the same + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + bal = c.parse_balance(r) + self.assert_within_lower(bal, 500000000, 0.0025) + + + # burn tokens and check sink and taxed balance and supply after first redistribution period + def test_burned_other_redistribution(self): + self.deploy() + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], 1000000000) + r = self.rpc.do(o) + + (tx_hash, o) = c.burn(self.address, self.accounts[0], 500000000) + r = self.rpc.do(o) + + (tx_hash, o) = c.transfer(self.address, self.accounts[0], self.accounts[1], 500000000) + r = self.rpc.do(o) + + self.backend.time_travel(self.start_time + self.period_seconds) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bal = c.parse_balance(r) + self.assertEqual(bal, 416873881) # 9 periods demurrage + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + self.assertEqual(new_supply, 500000000) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bal = c.parse_balance(r) + self.assertEqual(bal, 408536403) # 9 periods demurrage + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + sink_bal = c.parse_balance(r) + self.assert_within_lower(sink_bal, 500000000 - 408536403, 0.09) # TODO is this ok variance, 1.0 is ppm? + + self.backend.time_travel(self.start_time + (self.period_seconds * 2)) + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + self.assertEqual(new_supply, 500000000) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + next_bal = c.parse_balance(r) + self.assertEqual(next_bal, 333803985) # 9 periods demurrage + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + prev_sink_bal = sink_bal + bal = prev_sink_bal + (bal - next_bal) + sink_bal = c.parse_balance(r) + self.assert_within_lower(sink_bal, bal, 0.09) # TODO is this ok variance, 1.0 is ppm? + + + # verify expected results of balance and supply after multiple redistribution periods + def test_burn_accumulate(self): + self.deploy(tax_level=2/1000) + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.sink_address) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.sink_address, self.default_supply) + r = self.rpc.do(o) + + balance_share = int(self.default_supply / 2) + nonce_oracle = RPCNonceOracle(self.sink_address, self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.sink_address, self.accounts[1], balance_share) + r = self.rpc.do(o) + + new_supply = None + burn_rate = 1000 + sink_bal = None + bob_bal = None + bob_refund = None + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bob_bal = c.parse_balance(r) + prev_bob_bal = bob_bal + + iterations = 100 + + for i in range(1, iterations + 1): + nonce_oracle = RPCNonceOracle(self.sink_address, self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + if bob_refund != None: + (tx_hash, o) = c.transfer(self.address, self.sink_address, self.accounts[1], bob_refund) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.burn(self.address, self.sink_address, burn_rate) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + + self.backend.time_travel(self.start_time + (self.period_seconds * i)) + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + self.rpc.do(o) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bob_bal = c.parse_balance(r) + bob_refund = prev_bob_bal - bob_bal + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + burner_bal = c.parse_balance(r) + + sum_supply = bob_bal + burner_bal + + o = c.total_burned(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + total_burned = c.parse_balance(r) + + o = c.to_base_amount(self.address, total_burned, sender_address=self.accounts[0]) + r = self.rpc.do(o) + total_burned_base = c.parse_balance(r) + + expected_supply = self.default_supply - (burn_rate * i) + logg.info('checking burn round {} balance burner {} bob {} supply {} expected {} summed {} burned {} base {}'.format(i, burner_bal, bob_bal, new_supply, expected_supply, sum_supply, total_burned, total_burned_base)) + self.assertEqual(new_supply, expected_supply) + + sum_supply = burner_bal + bob_bal + logg.debug('balances sink {} bob {} total {} supply real {} original {}'.format(sink_bal, bob_bal, sum_supply, new_supply, self.default_supply)) + + self.assert_within_lower(sum_supply, new_supply, 0.00001) + self.assert_within_greater(burner_bal, balance_share - total_burned, 0.1) + + bob_delta = self.default_supply * ((2 / 1000000) / 1000) + self.assert_within_lower(bob_bal, balance_share - bob_delta, 0.1) + + self.assertEqual(total_burned, iterations * burn_rate) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_demurrage.py b/python/tests/test_demurrage.py new file mode 100644 index 0000000..7ecb23d --- /dev/null +++ b/python/tests/test_demurrage.py @@ -0,0 +1,133 @@ +# standard imports +import datetime +import unittest +import logging +import os + +# external imports +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt + +# local imports +from erc20_demurrage_token import DemurrageToken +from erc20_demurrage_token.demurrage import DemurrageCalculator + +# test imports +from erc20_demurrage_token.unittest.base import TestDemurrage + +logging.basicConfig(level=logging.INFO) +logg = logging.getLogger() + + +class TestDemurragePeriods(TestDemurrage): + + def setUp(self): + super(TestDemurragePeriods, self).setUp() + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') + if self.mode == None: + self.mode = 'MultiNocap' + logg.debug('executing test setup default mode {}'.format(self.mode)) + + self.deployer.settings.demurrage_level = (2 / 1000) * (10 ** 32) + self.deployer.settings.sink_address = self.accounts[9] + self.deployer.sink_address = self.accounts[9] + self.deploy(c, self.mode) + + logg.info('deployed with mode {}'.format(self.mode)) + + + # verify that tax level calculation is in ppm as expected + def test_ppm(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], self.default_supply) + r = self.rpc.do(o) + + self.backend.time_travel(self.start_time + 60) + + (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[0]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bob_bal = c.parse_balance(r) + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + sink_bal = c.parse_balance(r) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + + balance_delta = self.default_supply * ((2 / 1000000) / 1000) + self.assertEqual(bob_bal, self.default_supply - balance_delta) + + + + # verify balances and supply after multiple demurrage periods + def test_over_time(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], self.default_supply) + r = self.rpc.do(o) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bob_bal = c.parse_balance(r) + prev_bob_bal = bob_bal + + nonce_oracle = RPCNonceOracle(self.sink_address, self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + iterations = 100 + + for i in range(1, iterations + 1): + self.backend.time_travel(self.start_time + (self.period_seconds * i)) + + (tx_hash, o) = c.transfer(self.address, self.sink_address, self.accounts[1], prev_bob_bal - bob_bal) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.apply_demurrage(self.address, self.sink_address) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + bob_bal = c.parse_balance(r) + + o = c.balance(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + sink_bal = c.parse_balance(r) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + new_supply = c.parse_total_supply(r) + + logg.info('round {} supply {} balance sink {} bob {}'.format(i, new_supply, sink_bal, bob_bal)) + + sum_supply = sink_bal + bob_bal + + bob_delta = self.default_supply * ((2 / 1000000) / 100) + + self.assert_within_lower(sum_supply, new_supply, 0.00001) + self.assert_within_greater(bob_bal, self.default_supply - bob_delta, 0.001) + self.assert_within_lower(sink_bal, bob_delta, 1000) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index a980d9b..b911cab 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -24,7 +24,7 @@ from erc20_demurrage_token import DemurrageToken # test imports from erc20_demurrage_token.unittest.base import TestDemurrageDefault -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) logg = logging.getLogger() testdir = os.path.dirname(__file__) @@ -88,18 +88,31 @@ class TestRedistribution(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) self.rpc.do(o) - self.backend.time_travel(self.start_time + (self.period_seconds * 10)) + self.backend.time_travel(self.start_time + (self.period_seconds * 100)) - for i in range(1, 11): - logg.debug('checking period {}'.format(i)) + balance_minter = None + balance_sink = None + real_supply = None + for i in range(1, 101): (tx_hash, o) = c.change_period(self.address, self.accounts[0]) self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) - i = 10 + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_sink = c.parse_balance(r) + + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_minter = c.parse_balance(r) + + real_supply = balance_sink + balance_minter + logg.info('period {} testing sink {} mint {} adds up to supply {} of original {} (delta {})'.format(i, balance_sink, balance_minter, real_supply, supply, supply - real_supply)) + + i = 100 o = c.redistributions(self.address, i, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) @@ -122,7 +135,7 @@ class TestRedistribution(TestDemurrageDefault): r = self.rpc.do(o) balance_minter = c.parse_balance(r) - logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, real_supply, demurrage_previous, demurrage)) self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index e4cc11c..95eb7da 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -1,7 +1,6 @@ -pragma solidity > 0.6.11; +pragma solidity >= 0.8.0; // SPDX-License-Identifier: GPL-3.0-or-later - contract DemurrageTokenSingleCap { // Redistribution bit field, with associated shifts and masks @@ -12,7 +11,7 @@ contract DemurrageTokenSingleCap { uint8 constant shiftRedistributionValue = 32; uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 uint8 constant shiftRedistributionDemurrage = 104; - uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140 + uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 36) - 1) << 140 // Account balances mapping (address => uint256) account; @@ -38,7 +37,8 @@ contract DemurrageTokenSingleCap { uint256 public decimals; // Implements ERC20 - uint256 public totalSupply; + //uint256 public totalSupply; + uint256 supply; // Last executed period uint256 public lastPeriod; @@ -46,6 +46,9 @@ contract DemurrageTokenSingleCap { // Last sink redistribution amount uint256 public totalSink; + // Value of burnt tokens (burnt tokens do not decay) + uint256 public burned; + // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less @@ -95,6 +98,9 @@ contract DemurrageTokenSingleCap { // Temporary event used in development, will be removed on prod event Debug(bytes32 _foo); + // Emitted when tokens are burned + event Burn(address indexed _burner, uint256 _value); + // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 @@ -206,7 +212,7 @@ contract DemurrageTokenSingleCap { changePeriod(); baseAmount = toBaseAmount(_amount); - totalSupply += _amount; + supply += _amount; increaseBaseBalance(_beneficiary, baseAmount); emit Mint(msg.sender, _beneficiary, _amount); saveRedistributionSupply(); @@ -249,7 +255,7 @@ contract DemurrageTokenSingleCap { uint256 currentRedistribution; uint256 grownSupply; - grownSupply = totalSupply; + grownSupply = totalSupply(); currentRedistribution = uint256(redistributions[redistributions.length-1]); currentRedistribution &= (~maskRedistributionValue); currentRedistribution |= (grownSupply << shiftRedistributionValue); @@ -263,7 +269,7 @@ contract DemurrageTokenSingleCap { return uint128((block.timestamp - periodStart) / periodDuration + 1); } - // Add an entered demurrage period to the redistribution array + // Retrieve next redistribution if the period threshold has been crossed function checkPeriod() private view returns (bytes32) { bytes32 lastRedistribution; uint256 currentPeriod; @@ -349,14 +355,15 @@ contract DemurrageTokenSingleCap { } // Recalculate the demurrage modifier for the new period + // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. function changePeriod() public returns (bool) { bytes32 currentRedistribution; bytes32 nextRedistribution; uint256 currentPeriod; - uint256 currentDemurrageAmount; + uint256 lastDemurrageAmount; + bytes32 lastRedistribution; uint256 nextRedistributionDemurrage; uint256 demurrageCounts; - uint256 periodTimestamp; uint256 nextPeriod; applyDemurrage(); @@ -365,20 +372,15 @@ contract DemurrageTokenSingleCap { return false; } + // calculate the decay from previous redistributino + lastRedistribution = redistributions[lastPeriod]; currentPeriod = toRedistributionPeriod(currentRedistribution); nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts); - } else { - nextRedistributionDemurrage = currentDemurrageAmount; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); + lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); + demurrageCounts = periodDuration / 60; + nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); + + nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); redistributions.push(nextRedistribution); applyDefaultRedistribution(nextRedistribution); @@ -423,14 +425,45 @@ contract DemurrageTokenSingleCap { 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; + 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; @@ -454,7 +487,9 @@ contract DemurrageTokenSingleCap { 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; } @@ -486,6 +521,29 @@ contract DemurrageTokenSingleCap { emit OwnershipTransferred(oldOwner, owner); } + // Explicitly and irretrievably burn tokens + // Only token minters can burn tokens + function burn(uint256 _value) public { + require(minter[msg.sender]); + require(_value <= account[msg.sender]); + uint256 _delta = toBaseAmount(_value); + + applyDemurrage(); + decreaseBaseBalance(msg.sender, _delta); + burned += _value; + emit Burn(msg.sender, _value); + } + + // Implements ERC20 + function totalSupply() public view returns (uint256) { + return supply - burned; + } + + // Return total number of burned tokens + function totalBurned() public view returns (uint256) { + return burned; + } + // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xc6bb4b70) { // ERC20 diff --git a/solidity/Makefile b/solidity/Makefile index b2f4bbc..15cf4e4 100644 --- a/solidity/Makefile +++ b/solidity/Makefile @@ -33,6 +33,10 @@ test: all python ../python/tests/test_pure.py install: all + #cp -v DemurrageToken*.{json,bin} ../python/erc20_demurrage_token/data/ + cp -v DemurrageTokenSingleNocap.{json,bin} ../python/erc20_demurrage_token/data/ + +install-broken: all cp -v DemurrageToken*.{json,bin} ../python/erc20_demurrage_token/data/ .PHONY: test install