commit 74ef57a6a73f2a619da2b04772097daa6b4ab941
parent f338510a1d1839061e873ef802401054aca62e78
Author: nolash <dev@holbrook.no>
Date: Sat, 5 Jun 2021 12:39:53 +0200
Remove complex account period tracker in single mode
Diffstat:
7 files changed, 21 insertions(+), 182 deletions(-)
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin
@@ -1 +1 @@
-60e06040523480156200001157600080fd5b5060405162003a6638038062003a66833981810160405281019062000037919062000496565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600590805190602001906200010a9291906200032f565b508560069080519060200190620001239291906200032f565b508460ff166007819055504260808181525050603c836200014591906200076c565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200076c565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360c0818152505060006200020a6000620f424060006001620002a3640100000000026401000000009004565b905060008190806001815401808255809150506001900390600052602060002001600090919091909150558160098190555082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a6200028f91906200062f565b600a819055505050505050505050620009b3565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033d906200084e565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000620003f6620003f0846200059e565b62000575565b9050828152602081018484840111156200040f57600080fd5b6200041c84828562000818565b509392505050565b600081519050620004358162000965565b92915050565b600082601f8301126200044d57600080fd5b81516200045f848260208601620003df565b91505092915050565b60008151905062000479816200097f565b92915050565b600081519050620004908162000999565b92915050565b600080600080600080600060e0888a031215620004b257600080fd5b600088015167ffffffffffffffff811115620004cd57600080fd5b620004db8a828b016200043b565b975050602088015167ffffffffffffffff811115620004f957600080fd5b620005078a828b016200043b565b96505060406200051a8a828b016200047f565b95505060606200052d8a828b0162000468565b9450506080620005408a828b0162000468565b93505060a0620005538a828b0162000424565b92505060c0620005668a828b0162000468565b91505092959891949750929550565b60006200058162000594565b90506200058f828262000884565b919050565b6000604051905090565b600067ffffffffffffffff821115620005bc57620005bb62000918565b5b620005c78262000947565b9050602081019050919050565b6000808291508390505b60018511156200062657808604811115620005fe57620005fd620008ba565b5b60018516156200060e5780820291505b80810290506200061e8562000958565b9450620005de565b94509492505050565b60006200063c8262000801565b9150620006498362000801565b9250620006787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000680565b905092915050565b60008262000692576001905062000765565b81620006a2576000905062000765565b8160018114620006bb5760028114620006c657620006fc565b600191505062000765565b60ff841115620006db57620006da620008ba565b5b8360020a915084821115620006f557620006f4620008ba565b5b5062000765565b5060208310610133831016604e8410600b8410161715620007365782820a90508381111562000730576200072f620008ba565b5b62000765565b620007458484846001620005d4565b925090508184048111156200075f576200075e620008ba565b5b81810290505b9392505050565b6000620007798262000801565b9150620007868362000801565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007c257620007c1620008ba565b5b828202905092915050565b6000620007da82620007e1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620008385780820151818401526020810190506200081b565b8381111562000848576000848401525b50505050565b600060028204905060018216806200086757607f821691505b602082108114156200087e576200087d620008e9565b5b50919050565b6200088f8262000947565b810181811067ffffffffffffffff82111715620008b157620008b062000918565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200097081620007cd565b81146200097c57600080fd5b50565b6200098a8162000801565b81146200099657600080fd5b50565b620009a4816200080b565b8114620009b057600080fd5b50565b60805160a05160c05161304b62000a1b60003960008181610cc701528181610f1801528181611c26015281816122a801526122e001526000818161123001528181611bd40152611cc101526000818161125c01528181611ce20152611d27015261304b6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610158578063983b2d56116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b8063983b2d56146107205780639da7d8ba14610750578063a2119e2f14610780578063a9059cbb1461079e578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c65780638f770ad0146106e457806395d89b411461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f91906128f3565b6108b8565b6040516102919190612ac1565b60405180910390f35b6102a2610a63565b6040516102af9190612af7565b60405180910390f35b6102d260048036038101906102cd919061288e565b610af1565b6040516102df9190612ac1565b60405180910390f35b6102f0610c0b565b6040516102fd9190612b79565b60405180910390f35b61030e610c2d565b60405161031b9190612baf565b60405180910390f35b61032c610c33565b6040516103399190612baf565b60405180910390f35b61035c6004803603810190610357919061296e565b610c3f565b6040516103699190612baf565b60405180910390f35b61037a610cc5565b6040516103879190612baf565b60405180910390f35b6103aa60048036038101906103a5919061283f565b610ce9565b6040516103b79190612ac1565b60405180910390f35b6103da60048036038101906103d59190612816565b610e09565b6040516103e79190612ac1565b60405180910390f35b61040a6004803603810190610405919061296e565b610efc565b6040516104179190612baf565b60405180910390f35b610428610fad565b6040516104359190612baf565b60405180910390f35b61045860048036038101906104539190612816565b610fb3565b6040516104659190612ac1565b60405180910390f35b61048860048036038101906104839190612945565b611061565b6040516104959190612adc565b60405180910390f35b6104b860048036038101906104b391906128ca565b611085565b6040516104c59190612baf565b60405180910390f35b6104e860048036038101906104e3919061288e565b6110b6565b6040516104f59190612ac1565b60405180910390f35b61051860048036038101906105139190612816565b6111d4565b6040516105259190612baf565b60405180910390f35b61054860048036038101906105439190612945565b61122c565b6040516105559190612baf565b60405180910390f35b61056661128c565b6040516105739190612baf565b60405180910390f35b61059660048036038101906105919190612945565b611292565b6040516105a39190612baf565b60405180910390f35b6105c660048036038101906105c19190612945565b6112fe565b6040516105d39190612baf565b60405180910390f35b6105f660048036038101906105f19190612816565b61131f565b6040516106039190612baf565b60405180910390f35b610626600480360381019061062191906128ca565b61138a565b6040516106339190612baf565b60405180910390f35b61065660048036038101906106519190612816565b6113bd565b6040516106639190612baf565b60405180910390f35b61067461149e565b6040516106819190612ac1565b60405180910390f35b61069261164c565b60405161069f9190612ac1565b60405180910390f35b6106b06117f3565b6040516106bd9190612aa6565b60405180910390f35b6106ce611819565b6040516106db9190612ac1565b60405180910390f35b6106ec61199d565b6040516106f99190612baf565b60405180910390f35b61070a6119a3565b6040516107179190612af7565b60405180910390f35b61073a60048036038101906107359190612816565b611a31565b6040516107479190612ac1565b60405180910390f35b61076a600480360381019061076591906128ca565b611aee565b6040516107779190612baf565b60405180910390f35b610788611b1a565b6040516107959190612b79565b60405180910390f35b6107b860048036038101906107b3919061288e565b611b3c565b6040516107c59190612ac1565b60405180910390f35b6107d6611bd2565b6040516107e39190612baf565b60405180910390f35b610806600480360381019061080191906128ca565b611bf6565b6040516108139190612baf565b60405180910390f35b6108366004803603810190610831919061296e565b611c0a565b6040516108439190612baf565b60405180910390f35b610854611cbb565b6040516108619190612b79565b60405180910390f35b610872611d25565b60405161087f9190612baf565b60405180910390f35b6108a2600480360381019061089d9190612816565b611d49565b6040516108af9190612ac1565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60058054610a7090612e0e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612e0e565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611819565b50610b0683611292565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b949190612be6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bf89190612baf565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e90612b19565b60405180910390fd5b838510610c9357600080fd5b8484610c9f9190612c3c565b91508482610cad9190612c6d565b90508084610cbb9190612cfb565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611819565b50610d0084611292565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611deb565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df59190612baf565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f419190612c3c565b905060005b84811015610f8857620f42408284610f5e9190612c6d565b610f689190612c3c565b83610f739190612cfb565b92508080610f8090612e40565b915050610f46565b50620f42408583610f999190612c6d565b610fa39190612c3c565b9250505092915050565b60075481565b600080610fbf8361131f565b90506000811480610fe95750610fd3611cbb565b6fffffffffffffffffffffffffffffffff168110155b15610ff857600091505061105c565b6cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555060019150505b919050565b6000818154811061107157600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661110f57600080fd5b600954600854846111209190612be6565b111561112b57600080fd5b611133611819565b5082905082600860008282546111499190612be6565b9250508190555061115a8482611e8f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516111b89190612baf565b60405180910390a36111c8611feb565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261125a9190612c6d565b7f00000000000000000000000000000000000000000000000000000000000000006112859190612be6565b9050919050565b600a5481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846112e39190612c6d565b6112ed9190612c6d565b6112f79190612c3c565b9050919050565b6000603c824261130e9190612cfb565b6113189190612c3c565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113cc856111d4565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff166113f5611cbb565b6113ff9190612cc7565b6fffffffffffffffffffffffffffffffff16905061144d600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061147e9190612c6d565b828461148a9190612c6d565b6114949190612c3c565b9350505050919050565b60008060008060006114ae611cbb565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846114da9190612cc7565b92506000836fffffffffffffffffffffffffffffffff161415611504576000945050505050611649565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061155382846fffffffffffffffffffffffffffffffff16610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516116389190612b94565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116a957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008060006118326120d3565b995060006001028a14156118535760009a505050505050505050505061199a565b61185c8a611bf6565b975060018861186b9190612be6565b90506118768861122c565b915061188061149e565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506118bd826112fe565b925060008311156118f2576d04ee2d6d415b85acef81000000006118e18685611c0a565b6118eb9190612c3c565b935061190f565b6d04ee2d6d415b85acef81000000008561190c9190612c3c565b93505b61191e60008560085484612203565b985060008990806001815401808255809150506001900390600052602060002001600090919091909150556119528a61228f565b95507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516119839190612baf565b60405180910390a160019a50505050505050505050505b90565b60095481565b600680546119b090612e0e565b80601f01602080910402602001604051908101604052809291908181526020018280546119dc90612e0e565b8015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8d57600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611b49611819565b50611b5384611292565b9150611b60338684611deb565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611bbf9190612baf565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611c4f9190612c3c565b905060005b84811015611c9657620f42408284611c6c9190612c6d565b611c769190612c3c565b83611c819190612be6565b92508080611c8e90612e40565b915050611c54565b50620f42408583611ca79190612c6d565b611cb19190612c3c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611d0c9190612cfb565b611d169190612c3c565b611d209190612be6565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da557600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611df88584612482565b50611e038484611e8f565b50611e0c611cbb565b6fffffffffffffffffffffffffffffffff169050600a548310158015611e3a575080611e378661131f565b14155b8015611e7257508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611e8357611e8185826125b3565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415611ef05760009350505050611fe5565b611ef9866111d4565b92508483611f079190612be6565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611611f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6e90612b59565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506120029190612cfb565b81548110612039577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506120869190612cfb565b815481106120bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b60008060008060016000805490506120eb9190612cfb565b81548110612122577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561219157600080fd5b505afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c9919061291c565b6fffffffffffffffffffffffffffffffff1690506121e682611bf6565b81116121fa57600060010292505050612200565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006122a086611aee565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856122d29190612c6d565b6122dc9190612c3c565b91507f0000000000000000000000000000000000000000000000000000000000000000620f42408361230e9190612c6d565b6123189190612c3c565b9050838110156124305761232b86611bf6565b9250710fffffffff000000000000000000000000001960010260006001856123539190612cfb565b8154811061238a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856123e19190612cfb565b81548110612418577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b612475600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846124709190612c3c565b611e8f565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156124e357600093505050506125ad565b6124ec866111d4565b925084831015612531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252890612b39565b60405180910390fd5b848361253d9190612cfb565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254179250508190555061268461268f565b506001905092915050565b600080600080600060016000805490506126a99190612cfb565b815481106126e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154925060016126f884611085565b6127029190612be6565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a021682179150816001026000600160008054905061275e9190612cfb565b81548110612795577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001935050505090565b6000813590506127bc81612fa2565b92915050565b6000813590506127d181612fb9565b92915050565b6000813590506127e681612fd0565b92915050565b6000815190506127fb81612fe7565b92915050565b60008135905061281081612ffe565b92915050565b60006020828403121561282857600080fd5b6000612836848285016127ad565b91505092915050565b60008060006060848603121561285457600080fd5b6000612862868287016127ad565b9350506020612873868287016127ad565b925050604061288486828701612801565b9150509250925092565b600080604083850312156128a157600080fd5b60006128af858286016127ad565b92505060206128c085828601612801565b9150509250929050565b6000602082840312156128dc57600080fd5b60006128ea848285016127c2565b91505092915050565b60006020828403121561290557600080fd5b6000612913848285016127d7565b91505092915050565b60006020828403121561292e57600080fd5b600061293c848285016127ec565b91505092915050565b60006020828403121561295757600080fd5b600061296584828501612801565b91505092915050565b6000806040838503121561298157600080fd5b600061298f85828601612801565b92505060206129a085828601612801565b9150509250929050565b6129b381612d2f565b82525050565b6129c281612d41565b82525050565b6129d181612d4d565b82525050565b60006129e282612bca565b6129ec8185612bd5565b93506129fc818560208601612ddb565b612a0581612f16565b840191505092915050565b6000612a1d601183612bd5565b9150612a2882612f27565b602082019050919050565b6000612a40600d83612bd5565b9150612a4b82612f50565b602082019050919050565b6000612a63600d83612bd5565b9150612a6e82612f79565b602082019050919050565b612a8281612d83565b82525050565b612a9181612dc9565b82525050565b612aa081612dbf565b82525050565b6000602082019050612abb60008301846129aa565b92915050565b6000602082019050612ad660008301846129b9565b92915050565b6000602082019050612af160008301846129c8565b92915050565b60006020820190508181036000830152612b1181846129d7565b905092915050565b60006020820190508181036000830152612b3281612a10565b9050919050565b60006020820190508181036000830152612b5281612a33565b9050919050565b60006020820190508181036000830152612b7281612a56565b9050919050565b6000602082019050612b8e6000830184612a79565b92915050565b6000602082019050612ba96000830184612a88565b92915050565b6000602082019050612bc46000830184612a97565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612bf182612dbf565b9150612bfc83612dbf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612c3157612c30612e89565b5b828201905092915050565b6000612c4782612dbf565b9150612c5283612dbf565b925082612c6257612c61612eb8565b5b828204905092915050565b6000612c7882612dbf565b9150612c8383612dbf565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612cbc57612cbb612e89565b5b828202905092915050565b6000612cd282612d83565b9150612cdd83612d83565b925082821015612cf057612cef612e89565b5b828203905092915050565b6000612d0682612dbf565b9150612d1183612dbf565b925082821015612d2457612d23612e89565b5b828203905092915050565b6000612d3a82612d9f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612dd482612d83565b9050919050565b60005b83811015612df9578082015181840152602081019050612dde565b83811115612e08576000848401525b50505050565b60006002820490506001821680612e2657607f821691505b60208210811415612e3a57612e39612ee7565b5b50919050565b6000612e4b82612dbf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e7e57612e7d612e89565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b612fab81612d2f565b8114612fb657600080fd5b50565b612fc281612d4d565b8114612fcd57600080fd5b50565b612fd981612d57565b8114612fe457600080fd5b50565b612ff081612d83565b8114612ffb57600080fd5b50565b61300781612dbf565b811461301257600080fd5b5056fea2646970667358221220a834e180272e82901d4d69c10917674445b4deab2e2e9f57ccf712ba2a8f33d364736f6c63430008040033
-\ No newline at end of file
+60e06040523480156200001157600080fd5b506040516200355138038062003551833981810160405281019062000037919062000496565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600590805190602001906200010a9291906200032f565b508560069080519060200190620001239291906200032f565b508460ff166007819055504260808181525050603c836200014591906200076c565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200076c565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360c0818152505060006200020a6000620f424060006001620002a3640100000000026401000000009004565b905060008190806001815401808255809150506001900390600052602060002001600090919091909150558160098190555082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a6200028f91906200062f565b600a819055505050505050505050620009b3565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033d906200084e565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000620003f6620003f0846200059e565b62000575565b9050828152602081018484840111156200040f57600080fd5b6200041c84828562000818565b509392505050565b600081519050620004358162000965565b92915050565b600082601f8301126200044d57600080fd5b81516200045f848260208601620003df565b91505092915050565b60008151905062000479816200097f565b92915050565b600081519050620004908162000999565b92915050565b600080600080600080600060e0888a031215620004b257600080fd5b600088015167ffffffffffffffff811115620004cd57600080fd5b620004db8a828b016200043b565b975050602088015167ffffffffffffffff811115620004f957600080fd5b620005078a828b016200043b565b96505060406200051a8a828b016200047f565b95505060606200052d8a828b0162000468565b9450506080620005408a828b0162000468565b93505060a0620005538a828b0162000424565b92505060c0620005668a828b0162000468565b91505092959891949750929550565b60006200058162000594565b90506200058f828262000884565b919050565b6000604051905090565b600067ffffffffffffffff821115620005bc57620005bb62000918565b5b620005c78262000947565b9050602081019050919050565b6000808291508390505b60018511156200062657808604811115620005fe57620005fd620008ba565b5b60018516156200060e5780820291505b80810290506200061e8562000958565b9450620005de565b94509492505050565b60006200063c8262000801565b9150620006498362000801565b9250620006787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000680565b905092915050565b60008262000692576001905062000765565b81620006a2576000905062000765565b8160018114620006bb5760028114620006c657620006fc565b600191505062000765565b60ff841115620006db57620006da620008ba565b5b8360020a915084821115620006f557620006f4620008ba565b5b5062000765565b5060208310610133831016604e8410600b8410161715620007365782820a90508381111562000730576200072f620008ba565b5b62000765565b620007458484846001620005d4565b925090508184048111156200075f576200075e620008ba565b5b81810290505b9392505050565b6000620007798262000801565b9150620007868362000801565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007c257620007c1620008ba565b5b828202905092915050565b6000620007da82620007e1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620008385780820151818401526020810190506200081b565b8381111562000848576000848401525b50505050565b600060028204905060018216806200086757607f821691505b602082108114156200087e576200087d620008e9565b5b50919050565b6200088f8262000947565b810181811067ffffffffffffffff82111715620008b157620008b062000918565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200097081620007cd565b81146200097c57600080fd5b50565b6200098a8162000801565b81146200099657600080fd5b50565b620009a4816200080b565b8114620009b057600080fd5b50565b60805160a05160c051612b3662000a1b60003960008181610b9001528181610de101528181611a2e01528181611fb60152611fee0152600081816110a8015281816119dc0152611ac90152600081816110d401528181611aea0152611b2f0152612b366000f3fe608060405234801561001057600080fd5b5060043610610244576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161014d578063983b2d56116100d5578063e3ab207a11610099578063e3ab207a1461073b578063e54d63f71461076b578063e80952951461079b578063eda4e6d6146107b9578063f2fde38b146107d757610244565b8063983b2d561461066f5780639da7d8ba1461069f578063a2119e2f146106cf578063a9059cbb146106ed578063b470aade1461071d57610244565b806379ba50971161011c57806379ba5097146105d95780638da5cb5b146105f75780638f1df6bc146106155780638f770ad01461063357806395d89b411461065157610244565b80636a2d094e1461052b5780636ffa8a051461055b57806370a082311461058b578063731f237c146105bb57610244565b806331333487116101d0578063449a52f81161019f578063449a52f81461044d57806347a505171461047d5780634abfbba2146104ad578063573cc507146104dd5780636787a9be146104fb57610244565b8063313334871461039f578063313ce567146103cf57806340452d91146103ed57806340fc89f51461041d57610244565b806318160ddd1161021757806318160ddd146102e55780631989c6a814610303578063229ba1971461032157806323b872dd1461033f5780633092afd51461036f57610244565b806301ffc9a71461024957806306fdde0314610279578063095ea7b31461029757806309f28f3c146102c7575b600080fd5b610263600480360381019061025e91906123de565b610807565b60405161027091906125ac565b60405180910390f35b6102816109b2565b60405161028e91906125e2565b60405180910390f35b6102b160048036038101906102ac9190612379565b610a40565b6040516102be91906125ac565b60405180910390f35b6102cf610b5a565b6040516102dc9190612664565b60405180910390f35b6102ed610b7c565b6040516102fa919061269a565b60405180910390f35b61030b610b82565b604051610318919061269a565b60405180910390f35b610329610b8e565b604051610336919061269a565b60405180910390f35b6103596004803603810190610354919061232a565b610bb2565b60405161036691906125ac565b60405180910390f35b61038960048036038101906103849190612301565b610cd2565b60405161039691906125ac565b60405180910390f35b6103b960048036038101906103b49190612459565b610dc5565b6040516103c6919061269a565b60405180910390f35b6103d7610e76565b6040516103e4919061269a565b60405180910390f35b61040760048036038101906104029190612430565b610e7c565b60405161041491906125c7565b60405180910390f35b610437600480360381019061043291906123b5565b610ea0565b604051610444919061269a565b60405180910390f35b61046760048036038101906104629190612379565b610ed1565b60405161047491906125ac565b60405180910390f35b61049760048036038101906104929190612301565b61105b565b6040516104a4919061269a565b60405180910390f35b6104c760048036038101906104c29190612430565b6110a4565b6040516104d4919061269a565b60405180910390f35b6104e5611104565b6040516104f2919061269a565b60405180910390f35b61051560048036038101906105109190612430565b61110a565b604051610522919061269a565b60405180910390f35b61054560048036038101906105409190612430565b611176565b604051610552919061269a565b60405180910390f35b610575600480360381019061057091906123b5565b611197565b604051610582919061269a565b60405180910390f35b6105a560048036038101906105a09190612301565b6111ca565b6040516105b2919061269a565b60405180910390f35b6105c36112ab565b6040516105d091906125ac565b60405180910390f35b6105e1611459565b6040516105ee91906125ac565b60405180910390f35b6105ff611600565b60405161060c9190612591565b60405180910390f35b61061d611626565b60405161062a91906125ac565b60405180910390f35b61063b6117a5565b604051610648919061269a565b60405180910390f35b6106596117ab565b60405161066691906125e2565b60405180910390f35b61068960048036038101906106849190612301565b611839565b60405161069691906125ac565b60405180910390f35b6106b960048036038101906106b491906123b5565b6118f6565b6040516106c6919061269a565b60405180910390f35b6106d7611922565b6040516106e49190612664565b60405180910390f35b61070760048036038101906107029190612379565b611944565b60405161071491906125ac565b60405180910390f35b6107256119da565b604051610732919061269a565b60405180910390f35b610755600480360381019061075091906123b5565b6119fe565b604051610762919061269a565b60405180910390f35b61078560048036038101906107809190612459565b611a12565b604051610792919061269a565b60405180910390f35b6107a3611ac3565b6040516107b09190612664565b60405180910390f35b6107c1611b2d565b6040516107ce919061269a565b60405180910390f35b6107f160048036038101906107ec9190612301565b611b51565b6040516107fe91906125ac565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561085c57600190506109ad565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108af57600190506109ad565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090257600190506109ad565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561095557600190506109ad565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109a857600190506109ad565b600090505b919050565b600580546109bf906128f9565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb906128f9565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050505081565b600080610a4b611626565b50610a558361110a565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ae391906126d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b47919061269a565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610bbf611626565b50610bc98461110a565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c5457600080fd5b610c5f868684611bf3565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610cbe919061269a565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d5b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d6457600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610e0a9190612727565b905060005b84811015610e5157620f42408284610e279190612758565b610e319190612727565b83610e3c91906127e6565b92508080610e499061292b565b915050610e0f565b50620f42408583610e629190612758565b610e6c9190612727565b9250505092915050565b60075481565b60008181548110610e8c57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790612624565b60405180910390fd5b60095460085484610f7191906126d1565b1115610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990612604565b60405180910390fd5b610fba611626565b508290508260086000828254610fd091906126d1565b92505081905550610fe18482611c34565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161103f919061269a565b60405180910390a361104f611cf9565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826110d29190612758565b7f00000000000000000000000000000000000000000000000000000000000000006110fd91906126d1565b9050919050565b600a5481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461115b9190612758565b6111659190612758565b61116f9190612727565b9050919050565b6000603c824261118691906127e6565b6111909190612727565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806111d98561105b565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611202611ac3565b61120c91906127b2565b6fffffffffffffffffffffffffffffffff16905061125a600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610dc5565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061128b9190612758565b82846112979190612758565b6112a19190612727565b9350505050919050565b60008060008060006112bb611ac3565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846112e791906127b2565b92506000836fffffffffffffffffffffffffffffffff161415611311576000945050505050611456565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061136082846fffffffffffffffffffffffffffffffff16610dc5565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611445919061267f565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114b657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008061163d611de1565b9850600060010289141561165d57600099505050505050505050506117a2565b611666896119fe565b965060018761167591906126d1565b9050611680876110a4565b915061168a6112ab565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506116c782611176565b925060008311156116fc576d04ee2d6d415b85acef81000000006116eb8685611a12565b6116f59190612727565b9350611719565b6d04ee2d6d415b85acef8100000000856117169190612727565b93505b61172860008560085484611f11565b9750600088908060018154018082558091505060019003906000526020600020016000909190919091505561175c89611f9d565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161178c919061269a565b60405180910390a1600199505050505050505050505b90565b60095481565b600680546117b8906128f9565b80601f01602080910402602001604051908101604052809291908181526020018280546117e4906128f9565b80156118315780601f1061180657610100808354040283529160200191611831565b820191906000526020600020905b81548152906001019060200180831161181457829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461189557600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611951611626565b5061195b8461110a565b9150611968338684611bf3565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119c7919061269a565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611a579190612727565b905060005b84811015611a9e57620f42408284611a749190612758565b611a7e9190612727565b83611a8991906126d1565b92508080611a969061292b565b915050611a5c565b50620f42408583611aaf9190612758565b611ab99190612727565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611b1491906127e6565b611b1e9190612727565b611b2891906126d1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bad57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611c008584612190565b50611c0b8484611c34565b50611c14611ac3565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611c915760009350505050611cf3565b611c9a8661105b565b92508483611ca891906126d1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611d1091906127e6565b81548110611d47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611d9491906127e6565b81548110611dcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611df991906127e6565b81548110611e30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e9f57600080fd5b505afa158015611eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed79190612407565b6fffffffffffffffffffffffffffffffff169050611ef4826119fe565b8111611f0857600060010292505050611f0e565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611fae866118f6565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611fe09190612758565b611fea9190612727565b91507f0000000000000000000000000000000000000000000000000000000000000000620f42408361201c9190612758565b6120269190612727565b90508381101561213e57612039866119fe565b9250710fffffffff0000000000000000000000000019600102600060018561206191906127e6565b81548110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856120ef91906127e6565b81548110612126577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b612183600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461217e9190612727565b611c34565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008514156121ed5760009350505050612292565b6121f68661105b565b92508483101561223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290612644565b60405180910390fd5b848361224791906127e6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000813590506122a781612a8d565b92915050565b6000813590506122bc81612aa4565b92915050565b6000813590506122d181612abb565b92915050565b6000815190506122e681612ad2565b92915050565b6000813590506122fb81612ae9565b92915050565b60006020828403121561231357600080fd5b600061232184828501612298565b91505092915050565b60008060006060848603121561233f57600080fd5b600061234d86828701612298565b935050602061235e86828701612298565b925050604061236f868287016122ec565b9150509250925092565b6000806040838503121561238c57600080fd5b600061239a85828601612298565b92505060206123ab858286016122ec565b9150509250929050565b6000602082840312156123c757600080fd5b60006123d5848285016122ad565b91505092915050565b6000602082840312156123f057600080fd5b60006123fe848285016122c2565b91505092915050565b60006020828403121561241957600080fd5b6000612427848285016122d7565b91505092915050565b60006020828403121561244257600080fd5b6000612450848285016122ec565b91505092915050565b6000806040838503121561246c57600080fd5b600061247a858286016122ec565b925050602061248b858286016122ec565b9150509250929050565b61249e8161281a565b82525050565b6124ad8161282c565b82525050565b6124bc81612838565b82525050565b60006124cd826126b5565b6124d781856126c0565b93506124e78185602086016128c6565b6124f081612a01565b840191505092915050565b60006125086007836126c0565b915061251382612a12565b602082019050919050565b600061252b600a836126c0565b915061253682612a3b565b602082019050919050565b600061254e600d836126c0565b915061255982612a64565b602082019050919050565b61256d8161286e565b82525050565b61257c816128b4565b82525050565b61258b816128aa565b82525050565b60006020820190506125a66000830184612495565b92915050565b60006020820190506125c160008301846124a4565b92915050565b60006020820190506125dc60008301846124b3565b92915050565b600060208201905081810360008301526125fc81846124c2565b905092915050565b6000602082019050818103600083015261261d816124fb565b9050919050565b6000602082019050818103600083015261263d8161251e565b9050919050565b6000602082019050818103600083015261265d81612541565b9050919050565b60006020820190506126796000830184612564565b92915050565b60006020820190506126946000830184612573565b92915050565b60006020820190506126af6000830184612582565b92915050565b600081519050919050565b600082825260208201905092915050565b60006126dc826128aa565b91506126e7836128aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561271c5761271b612974565b5b828201905092915050565b6000612732826128aa565b915061273d836128aa565b92508261274d5761274c6129a3565b5b828204905092915050565b6000612763826128aa565b915061276e836128aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127a7576127a6612974565b5b828202905092915050565b60006127bd8261286e565b91506127c88361286e565b9250828210156127db576127da612974565b5b828203905092915050565b60006127f1826128aa565b91506127fc836128aa565b92508282101561280f5761280e612974565b5b828203905092915050565b60006128258261288a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006128bf8261286e565b9050919050565b60005b838110156128e45780820151818401526020810190506128c9565b838111156128f3576000848401525b50505050565b6000600282049050600182168061291157607f821691505b60208210811415612925576129246129d2565b5b50919050565b6000612936826128aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561296957612968612974565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b612a968161281a565b8114612aa157600080fd5b50565b612aad81612838565b8114612ab857600080fd5b50565b612ac481612842565b8114612acf57600080fd5b50565b612adb8161286e565b8114612ae657600080fd5b50565b612af2816128aa565b8114612afd57600080fd5b5056fea2646970667358221220d25a10043d82eb8caae695dcd85d62d9bf8b4cad865c7331a04bfe7d1ff8af8764736f6c63430008040033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.json
@@ -1 +1 @@
-[{"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":"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":"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"}]
+[{"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":[],"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":"_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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin
@@ -1 +1 @@
-60e06040523480156200001157600080fd5b50604051620039fc380380620039fc83398181016040528101906200003791906200048e565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000327565b5084600690805190602001906200012392919062000327565b508360ff166007819055504260808181525050603c826200014591906200074d565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200074d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a62000288919062000610565b6009819055505050505050505062000994565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b82805462000335906200082f565b90600052602060002090601f016020900481019282620003595760008555620003a5565b82601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6000620003ee620003e8846200057f565b62000556565b9050828152602081018484840111156200040757600080fd5b62000414848285620007f9565b509392505050565b6000815190506200042d8162000946565b92915050565b600082601f8301126200044557600080fd5b815162000457848260208601620003d7565b91505092915050565b600081519050620004718162000960565b92915050565b60008151905062000488816200097a565b92915050565b60008060008060008060c08789031215620004a857600080fd5b600087015167ffffffffffffffff811115620004c357600080fd5b620004d189828a0162000433565b965050602087015167ffffffffffffffff811115620004ef57600080fd5b620004fd89828a0162000433565b95505060406200051089828a0162000477565b94505060606200052389828a0162000460565b93505060806200053689828a0162000460565b92505060a06200054989828a016200041c565b9150509295509295509295565b60006200056262000575565b905062000570828262000865565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059d576200059c620008f9565b5b620005a88262000928565b9050602081019050919050565b6000808291508390505b60018511156200060757808604811115620005df57620005de6200089b565b5b6001851615620005ef5780820291505b8081029050620005ff8562000939565b9450620005bf565b94509492505050565b60006200061d82620007e2565b91506200062a83620007e2565b9250620006597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000661565b905092915050565b60008262000673576001905062000746565b8162000683576000905062000746565b81600181146200069c5760028114620006a757620006dd565b600191505062000746565b60ff841115620006bc57620006bb6200089b565b5b8360020a915084821115620006d657620006d56200089b565b5b5062000746565b5060208310610133831016604e8410600b8410161715620007175782820a9050838111156200071157620007106200089b565b5b62000746565b620007268484846001620005b5565b9250905081840481111562000740576200073f6200089b565b5b81810290505b9392505050565b60006200075a82620007e2565b91506200076783620007e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a357620007a26200089b565b5b828202905092915050565b6000620007bb82620007c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000819578082015181840152602081019050620007fc565b8381111562000829576000848401525b50505050565b600060028204905060018216806200084857607f821691505b602082108114156200085f576200085e620008ca565b5b50919050565b620008708262000928565b810181811067ffffffffffffffff82111715620008925762000891620008f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200095181620007ae565b81146200095d57600080fd5b50565b6200096b81620007e2565b81146200097757600080fd5b50565b6200098581620007ec565b81146200099157600080fd5b50565b60805160a05160c051613000620009fc60003960008181610c9e01528181610eef01528181611bdb0152818161225d01526122950152600081816111eb01528181611b890152611c7601526000818161121701528181611c970152611cdc01526130006000f3fe608060405234801561001057600080fd5b506004361061025a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be11610158578063983b2d56116100d5578063e3ab207a11610099578063e3ab207a146107c3578063e54d63f7146107f3578063e809529514610823578063eda4e6d614610841578063f2fde38b1461085f5761025a565b8063983b2d56146106f75780639da7d8ba14610727578063a2119e2f14610757578063a9059cbb14610775578063b470aade146107a55761025a565b8063731f237c1161011c578063731f237c1461066157806379ba50971461067f5780638da5cb5b1461069d5780638f1df6bc146106bb57806395d89b41146106d95761025a565b80636787a9be146105715780636a2d094e146105a15780636d5055a6146105d15780636ffa8a051461060157806370a08231146106315761025a565b80633092afd5116101e657806340fc89f5116101aa57806340fc89f514610493578063449a52f8146104c357806347a50517146104f35780634abfbba214610523578063573cc507146105535761025a565b80633092afd5146103b557806331333487146103e5578063313ce5671461041557806335b16eb81461043357806340452d91146104635761025a565b806318160ddd1161022d57806318160ddd146102fb5780631989c6a814610319578063216ea5ec14610337578063229ba1971461036757806323b872dd146103855761025a565b806301ffc9a71461025f57806306fdde031461028f578063095ea7b3146102ad57806309f28f3c146102dd575b600080fd5b610279600480360381019061027491906128a8565b61088f565b6040516102869190612a76565b60405180910390f35b610297610a3a565b6040516102a49190612aac565b60405180910390f35b6102c760048036038101906102c29190612843565b610ac8565b6040516102d49190612a76565b60405180910390f35b6102e5610be2565b6040516102f29190612b2e565b60405180910390f35b610303610c04565b6040516103109190612b64565b60405180910390f35b610321610c0a565b60405161032e9190612b64565b60405180910390f35b610351600480360381019061034c9190612923565b610c16565b60405161035e9190612b64565b60405180910390f35b61036f610c9c565b60405161037c9190612b64565b60405180910390f35b61039f600480360381019061039a91906127f4565b610cc0565b6040516103ac9190612a76565b60405180910390f35b6103cf60048036038101906103ca91906127cb565b610de0565b6040516103dc9190612a76565b60405180910390f35b6103ff60048036038101906103fa9190612923565b610ed3565b60405161040c9190612b64565b60405180910390f35b61041d610f84565b60405161042a9190612b64565b60405180910390f35b61044d600480360381019061044891906127cb565b610f8a565b60405161045a9190612a76565b60405180910390f35b61047d600480360381019061047891906128fa565b611038565b60405161048a9190612a91565b60405180910390f35b6104ad60048036038101906104a8919061287f565b61105c565b6040516104ba9190612b64565b60405180910390f35b6104dd60048036038101906104d89190612843565b61108d565b6040516104ea9190612a76565b60405180910390f35b61050d600480360381019061050891906127cb565b61118f565b60405161051a9190612b64565b60405180910390f35b61053d600480360381019061053891906128fa565b6111e7565b60405161054a9190612b64565b60405180910390f35b61055b611247565b6040516105689190612b64565b60405180910390f35b61058b600480360381019061058691906128fa565b61124d565b6040516105989190612b64565b60405180910390f35b6105bb60048036038101906105b691906128fa565b6112b9565b6040516105c89190612b64565b60405180910390f35b6105eb60048036038101906105e691906127cb565b6112da565b6040516105f89190612b64565b60405180910390f35b61061b6004803603810190610616919061287f565b611345565b6040516106289190612b64565b60405180910390f35b61064b600480360381019061064691906127cb565b611378565b6040516106589190612b64565b60405180910390f35b610669611459565b6040516106769190612a76565b60405180910390f35b610687611607565b6040516106949190612a76565b60405180910390f35b6106a56117ae565b6040516106b29190612a5b565b60405180910390f35b6106c36117d4565b6040516106d09190612a76565b60405180910390f35b6106e1611958565b6040516106ee9190612aac565b60405180910390f35b610711600480360381019061070c91906127cb565b6119e6565b60405161071e9190612a76565b60405180910390f35b610741600480360381019061073c919061287f565b611aa3565b60405161074e9190612b64565b60405180910390f35b61075f611acf565b60405161076c9190612b2e565b60405180910390f35b61078f600480360381019061078a9190612843565b611af1565b60405161079c9190612a76565b60405180910390f35b6107ad611b87565b6040516107ba9190612b64565b60405180910390f35b6107dd60048036038101906107d8919061287f565b611bab565b6040516107ea9190612b64565b60405180910390f35b61080d60048036038101906108089190612923565b611bbf565b60405161081a9190612b64565b60405180910390f35b61082b611c70565b6040516108389190612b2e565b60405180910390f35b610849611cda565b6040516108569190612b64565b60405180910390f35b610879600480360381019061087491906127cb565b611cfe565b6040516108869190612a76565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108e45760019050610a35565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109375760019050610a35565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561098a5760019050610a35565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109dd5760019050610a35565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a305760019050610a35565b600090505b919050565b60058054610a4790612dc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390612dc3565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081565b600080610ad36117d4565b50610add8361124d565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b6b9190612b9b565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bcf9190612b64565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590612ace565b60405180910390fd5b838510610c6a57600080fd5b8484610c769190612bf1565b91508482610c849190612c22565b90508084610c929190612cb0565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ccd6117d4565b50610cd78461124d565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d6257600080fd5b610d6d868684611da0565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dcc9190612b64565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e6957503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e7257600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f189190612bf1565b905060005b84811015610f5f57620f42408284610f359190612c22565b610f3f9190612bf1565b83610f4a9190612cb0565b92508080610f5790612df5565b915050610f1d565b50620f42408583610f709190612c22565b610f7a9190612bf1565b9250505092915050565b60075481565b600080610f96836112da565b90506000811480610fc05750610faa611c70565b6fffffffffffffffffffffffffffffffff168110155b15610fcf576000915050611033565b6cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555060019150505b919050565b6000818154811061104857600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110e657600080fd5b6110ee6117d4565b5082905082600860008282546111049190612b9b565b925050819055506111158482611e44565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516111739190612b64565b60405180910390a3611183611fa0565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826112159190612c22565b7f00000000000000000000000000000000000000000000000000000000000000006112409190612b9b565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461129e9190612c22565b6112a89190612c22565b6112b29190612bf1565b9050919050565b6000603c82426112c99190612cb0565b6112d39190612bf1565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113878561118f565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff166113b0611c70565b6113ba9190612c7c565b6fffffffffffffffffffffffffffffffff169050611408600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610ed3565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006114399190612c22565b82846114459190612c22565b61144f9190612bf1565b9350505050919050565b6000806000806000611469611c70565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846114959190612c7c565b92506000836fffffffffffffffffffffffffffffffff1614156114bf576000945050505050611604565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061150e82846fffffffffffffffffffffffffffffffff16610ed3565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516115f39190612b49565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166457600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008060006117ed612088565b995060006001028a141561180e5760009a5050505050505050505050611955565b6118178a611bab565b97506001886118269190612b9b565b9050611831886111e7565b915061183b611459565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611878826112b9565b925060008311156118ad576d04ee2d6d415b85acef810000000061189c8685611bbf565b6118a69190612bf1565b93506118ca565b6d04ee2d6d415b85acef8100000000856118c79190612bf1565b93505b6118d9600085600854846121b8565b9850600089908060018154018082558091505060019003906000526020600020016000909190919091505561190d8a612244565b95507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161193e9190612b64565b60405180910390a160019a50505050505050505050505b90565b6006805461196590612dc3565b80601f016020809104026020016040519081016040528092919081815260200182805461199190612dc3565b80156119de5780601f106119b3576101008083540402835291602001916119de565b820191906000526020600020905b8154815290600101906020018083116119c157829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4257600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611afe6117d4565b50611b088461124d565b9150611b15338684611da0565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611b749190612b64565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611c049190612bf1565b905060005b84811015611c4b57620f42408284611c219190612c22565b611c2b9190612bf1565b83611c369190612b9b565b92508080611c4390612df5565b915050611c09565b50620f42408583611c5c9190612c22565b611c669190612bf1565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cc19190612cb0565b611ccb9190612bf1565b611cd59190612b9b565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d5a57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611dad8584612437565b50611db88484611e44565b50611dc1611c70565b6fffffffffffffffffffffffffffffffff1690506009548310158015611def575080611dec866112da565b14155b8015611e2757508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611e3857611e368582612568565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415611ea55760009350505050611f9a565b611eae8661118f565b92508483611ebc9190612b9b565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611611f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2390612b0e565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611fb79190612cb0565b81548110611fee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a0281179050806001026000600160008054905061203b9190612cb0565b81548110612072577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b60008060008060016000805490506120a09190612cb0565b815481106120d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561214657600080fd5b505afa15801561215a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217e91906128d1565b6fffffffffffffffffffffffffffffffff16905061219b82611bab565b81116121af576000600102925050506121b5565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061225586611aa3565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856122879190612c22565b6122919190612bf1565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836122c39190612c22565b6122cd9190612bf1565b9050838110156123e5576122e086611bab565b9250710fffffffff000000000000000000000000001960010260006001856123089190612cb0565b8154811061233f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856123969190612cb0565b815481106123cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b61242a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846124259190612bf1565b611e44565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156124985760009350505050612562565b6124a18661118f565b9250848310156124e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dd90612aee565b60405180910390fd5b84836124f29190612cb0565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612639612644565b506001905092915050565b6000806000806000600160008054905061265e9190612cb0565b81548110612695577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154925060016126ad8461105c565b6126b79190612b9b565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506127139190612cb0565b8154811061274a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001935050505090565b60008135905061277181612f57565b92915050565b60008135905061278681612f6e565b92915050565b60008135905061279b81612f85565b92915050565b6000815190506127b081612f9c565b92915050565b6000813590506127c581612fb3565b92915050565b6000602082840312156127dd57600080fd5b60006127eb84828501612762565b91505092915050565b60008060006060848603121561280957600080fd5b600061281786828701612762565b935050602061282886828701612762565b9250506040612839868287016127b6565b9150509250925092565b6000806040838503121561285657600080fd5b600061286485828601612762565b9250506020612875858286016127b6565b9150509250929050565b60006020828403121561289157600080fd5b600061289f84828501612777565b91505092915050565b6000602082840312156128ba57600080fd5b60006128c88482850161278c565b91505092915050565b6000602082840312156128e357600080fd5b60006128f1848285016127a1565b91505092915050565b60006020828403121561290c57600080fd5b600061291a848285016127b6565b91505092915050565b6000806040838503121561293657600080fd5b6000612944858286016127b6565b9250506020612955858286016127b6565b9150509250929050565b61296881612ce4565b82525050565b61297781612cf6565b82525050565b61298681612d02565b82525050565b600061299782612b7f565b6129a18185612b8a565b93506129b1818560208601612d90565b6129ba81612ecb565b840191505092915050565b60006129d2601183612b8a565b91506129dd82612edc565b602082019050919050565b60006129f5600d83612b8a565b9150612a0082612f05565b602082019050919050565b6000612a18600d83612b8a565b9150612a2382612f2e565b602082019050919050565b612a3781612d38565b82525050565b612a4681612d7e565b82525050565b612a5581612d74565b82525050565b6000602082019050612a70600083018461295f565b92915050565b6000602082019050612a8b600083018461296e565b92915050565b6000602082019050612aa6600083018461297d565b92915050565b60006020820190508181036000830152612ac6818461298c565b905092915050565b60006020820190508181036000830152612ae7816129c5565b9050919050565b60006020820190508181036000830152612b07816129e8565b9050919050565b60006020820190508181036000830152612b2781612a0b565b9050919050565b6000602082019050612b436000830184612a2e565b92915050565b6000602082019050612b5e6000830184612a3d565b92915050565b6000602082019050612b796000830184612a4c565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612ba682612d74565b9150612bb183612d74565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612be657612be5612e3e565b5b828201905092915050565b6000612bfc82612d74565b9150612c0783612d74565b925082612c1757612c16612e6d565b5b828204905092915050565b6000612c2d82612d74565b9150612c3883612d74565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c7157612c70612e3e565b5b828202905092915050565b6000612c8782612d38565b9150612c9283612d38565b925082821015612ca557612ca4612e3e565b5b828203905092915050565b6000612cbb82612d74565b9150612cc683612d74565b925082821015612cd957612cd8612e3e565b5b828203905092915050565b6000612cef82612d54565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612d8982612d38565b9050919050565b60005b83811015612dae578082015181840152602081019050612d93565b83811115612dbd576000848401525b50505050565b60006002820490506001821680612ddb57607f821691505b60208210811415612def57612dee612e9c565b5b50919050565b6000612e0082612d74565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612e3357612e32612e3e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b612f6081612ce4565b8114612f6b57600080fd5b50565b612f7781612d02565b8114612f8257600080fd5b50565b612f8e81612d0c565b8114612f9957600080fd5b50565b612fa581612d38565b8114612fb057600080fd5b50565b612fbc81612d74565b8114612fc757600080fd5b5056fea2646970667358221220c3b4a17d1d7e65ca7b2ba38249fb44fd72317bca4916116373f1016ec7f7f95f64736f6c63430008040033
-\ No newline at end of file
+60e06040523480156200001157600080fd5b50604051620033a3380380620033a383398181016040528101906200003791906200048e565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000327565b5084600690805190602001906200012392919062000327565b508360ff166007819055504260808181525050603c826200014591906200074d565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200074d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a62000288919062000610565b6009819055505050505050505062000994565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b82805462000335906200082f565b90600052602060002090601f016020900481019282620003595760008555620003a5565b82601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6000620003ee620003e8846200057f565b62000556565b9050828152602081018484840111156200040757600080fd5b62000414848285620007f9565b509392505050565b6000815190506200042d8162000946565b92915050565b600082601f8301126200044557600080fd5b815162000457848260208601620003d7565b91505092915050565b600081519050620004718162000960565b92915050565b60008151905062000488816200097a565b92915050565b60008060008060008060c08789031215620004a857600080fd5b600087015167ffffffffffffffff811115620004c357600080fd5b620004d189828a0162000433565b965050602087015167ffffffffffffffff811115620004ef57600080fd5b620004fd89828a0162000433565b95505060406200051089828a0162000477565b94505060606200052389828a0162000460565b93505060806200053689828a0162000460565b92505060a06200054989828a016200041c565b9150509295509295509295565b60006200056262000575565b905062000570828262000865565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059d576200059c620008f9565b5b620005a88262000928565b9050602081019050919050565b6000808291508390505b60018511156200060757808604811115620005df57620005de6200089b565b5b6001851615620005ef5780820291505b8081029050620005ff8562000939565b9450620005bf565b94509492505050565b60006200061d82620007e2565b91506200062a83620007e2565b9250620006597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000661565b905092915050565b60008262000673576001905062000746565b8162000683576000905062000746565b81600181146200069c5760028114620006a757620006dd565b600191505062000746565b60ff841115620006bc57620006bb6200089b565b5b8360020a915084821115620006d657620006d56200089b565b5b5062000746565b5060208310610133831016604e8410600b8410161715620007175782820a9050838111156200071157620007106200089b565b5b62000746565b620007268484846001620005b5565b9250905081840481111562000740576200073f6200089b565b5b81810290505b9392505050565b60006200075a82620007e2565b91506200076783620007e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a357620007a26200089b565b5b828202905092915050565b6000620007bb82620007c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000819578082015181840152602081019050620007fc565b8381111562000829576000848401525b50505050565b600060028204905060018216806200084857607f821691505b602082108114156200085f576200085e620008ca565b5b50919050565b620008708262000928565b810181811067ffffffffffffffff82111715620008925762000891620008f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200095181620007ae565b81146200095d57600080fd5b50565b6200096b81620007e2565b81146200097757600080fd5b50565b6200098581620007ec565b81146200099157600080fd5b50565b60805160a05160c0516129a7620009fc60003960008181610b6701528181610db80152818161197701528181611eff0152611f37015260008181610ff7015281816119250152611a1201526000818161102301528181611a330152611a7801526129a76000f3fe608060405234801561001057600080fd5b5060043610610239576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101425780639da7d8ba116100ca578063e3ab207a11610099578063e3ab207a14610712578063e54d63f714610742578063e809529514610772578063eda4e6d614610790578063f2fde38b146107ae57610239565b80639da7d8ba14610676578063a2119e2f146106a6578063a9059cbb146106c4578063b470aade146106f457610239565b806379ba50971161011157806379ba5097146105ce5780638da5cb5b146105ec5780638f1df6bc1461060a57806395d89b4114610628578063983b2d561461064657610239565b80636a2d094e146105205780636ffa8a051461055057806370a0823114610580578063731f237c146105b057610239565b806331333487116101c5578063449a52f811610194578063449a52f81461044257806347a50517146104725780634abfbba2146104a2578063573cc507146104d25780636787a9be146104f057610239565b80633133348714610394578063313ce567146103c457806340452d91146103e257806340fc89f51461041257610239565b806318160ddd1161020c57806318160ddd146102da5780631989c6a8146102f8578063229ba1971461031657806323b872dd146103345780633092afd51461036457610239565b806301ffc9a71461023e57806306fdde031461026e578063095ea7b31461028c57806309f28f3c146102bc575b600080fd5b61025860048036038101906102539190612327565b6107de565b60405161026591906124af565b60405180910390f35b610276610989565b60405161028391906124e5565b60405180910390f35b6102a660048036038101906102a191906122c2565b610a17565b6040516102b391906124af565b60405180910390f35b6102c4610b31565b6040516102d19190612527565b60405180910390f35b6102e2610b53565b6040516102ef919061255d565b60405180910390f35b610300610b59565b60405161030d919061255d565b60405180910390f35b61031e610b65565b60405161032b919061255d565b60405180910390f35b61034e60048036038101906103499190612273565b610b89565b60405161035b91906124af565b60405180910390f35b61037e6004803603810190610379919061224a565b610ca9565b60405161038b91906124af565b60405180910390f35b6103ae60048036038101906103a991906123a2565b610d9c565b6040516103bb919061255d565b60405180910390f35b6103cc610e4d565b6040516103d9919061255d565b60405180910390f35b6103fc60048036038101906103f79190612379565b610e53565b60405161040991906124ca565b60405180910390f35b61042c600480360381019061042791906122fe565b610e77565b604051610439919061255d565b60405180910390f35b61045c600480360381019061045791906122c2565b610ea8565b60405161046991906124af565b60405180910390f35b61048c6004803603810190610487919061224a565b610faa565b604051610499919061255d565b60405180910390f35b6104bc60048036038101906104b79190612379565b610ff3565b6040516104c9919061255d565b60405180910390f35b6104da611053565b6040516104e7919061255d565b60405180910390f35b61050a60048036038101906105059190612379565b611059565b604051610517919061255d565b60405180910390f35b61053a60048036038101906105359190612379565b6110c5565b604051610547919061255d565b60405180910390f35b61056a600480360381019061056591906122fe565b6110e6565b604051610577919061255d565b60405180910390f35b61059a6004803603810190610595919061224a565b611119565b6040516105a7919061255d565b60405180910390f35b6105b86111fa565b6040516105c591906124af565b60405180910390f35b6105d66113a8565b6040516105e391906124af565b60405180910390f35b6105f461154f565b6040516106019190612494565b60405180910390f35b610612611575565b60405161061f91906124af565b60405180910390f35b6106306116f4565b60405161063d91906124e5565b60405180910390f35b610660600480360381019061065b919061224a565b611782565b60405161066d91906124af565b60405180910390f35b610690600480360381019061068b91906122fe565b61183f565b60405161069d919061255d565b60405180910390f35b6106ae61186b565b6040516106bb9190612527565b60405180910390f35b6106de60048036038101906106d991906122c2565b61188d565b6040516106eb91906124af565b60405180910390f35b6106fc611923565b604051610709919061255d565b60405180910390f35b61072c600480360381019061072791906122fe565b611947565b604051610739919061255d565b60405180910390f35b61075c600480360381019061075791906123a2565b61195b565b604051610769919061255d565b60405180910390f35b61077a611a0c565b6040516107879190612527565b60405180910390f35b610798611a76565b6040516107a5919061255d565b60405180910390f35b6107c860048036038101906107c3919061224a565b611a9a565b6040516107d591906124af565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108335760019050610984565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108865760019050610984565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108d95760019050610984565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561092c5760019050610984565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561097f5760019050610984565b600090505b919050565b60058054610996906127bc565b80601f01602080910402602001604051908101604052809291908181526020018280546109c2906127bc565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505081565b600080610a22611575565b50610a2c83611059565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610aba9190612594565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b1e919061255d565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610b96611575565b50610ba084611059565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c2b57600080fd5b610c36868684611b3c565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610c95919061255d565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d3257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d3b57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610de191906125ea565b905060005b84811015610e2857620f42408284610dfe919061261b565b610e0891906125ea565b83610e1391906126a9565b92508080610e20906127ee565b915050610de6565b50620f42408583610e39919061261b565b610e4391906125ea565b9250505092915050565b60075481565b60008181548110610e6357600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f0157600080fd5b610f09611575565b508290508260086000828254610f1f9190612594565b92505081905550610f308482611b7d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f8e919061255d565b60405180910390a3610f9e611c42565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611021919061261b565b7f000000000000000000000000000000000000000000000000000000000000000061104c9190612594565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846110aa919061261b565b6110b4919061261b565b6110be91906125ea565b9050919050565b6000603c82426110d591906126a9565b6110df91906125ea565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061112885610faa565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611151611a0c565b61115b9190612675565b6fffffffffffffffffffffffffffffffff1690506111a9600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610d9c565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006111da919061261b565b82846111e6919061261b565b6111f091906125ea565b9350505050919050565b600080600080600061120a611a0c565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846112369190612675565b92506000836fffffffffffffffffffffffffffffffff1614156112605760009450505050506113a5565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506112af82846fffffffffffffffffffffffffffffffff16610d9c565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516113949190612542565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008061158c611d2a565b985060006001028914156115ac57600099505050505050505050506116f1565b6115b589611947565b96506001876115c49190612594565b90506115cf87610ff3565b91506115d96111fa565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611616826110c5565b9250600083111561164b576d04ee2d6d415b85acef810000000061163a868561195b565b61164491906125ea565b9350611668565b6d04ee2d6d415b85acef81000000008561166591906125ea565b93505b61167760008560085484611e5a565b975060008890806001815401808255809150506001900390600052602060002001600090919091909150556116ab89611ee6565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516116db919061255d565b60405180910390a1600199505050505050505050505b90565b60068054611701906127bc565b80601f016020809104026020016040519081016040528092919081815260200182805461172d906127bc565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600061189a611575565b506118a484611059565b91506118b1338684611b3c565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611910919061255d565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f00000000000000000000000000000000000000000000000000000000000000006119a091906125ea565b905060005b848110156119e757620f424082846119bd919061261b565b6119c791906125ea565b836119d29190612594565b925080806119df906127ee565b9150506119a5565b50620f424085836119f8919061261b565b611a0291906125ea565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611a5d91906126a9565b611a6791906125ea565b611a719190612594565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611af657600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611b4985846120d9565b50611b548484611b7d565b50611b5d611a0c565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611bda5760009350505050611c3c565b611be386610faa565b92508483611bf19190612594565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611c5991906126a9565b81548110611c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611cdd91906126a9565b81548110611d14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611d4291906126a9565b81548110611d79577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e209190612350565b6fffffffffffffffffffffffffffffffff169050611e3d82611947565b8111611e5157600060010292505050611e57565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611ef78661183f565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611f29919061261b565b611f3391906125ea565b91507f0000000000000000000000000000000000000000000000000000000000000000620f424083611f65919061261b565b611f6f91906125ea565b90508381101561208757611f8286611947565b9250710fffffffff00000000000000000000000000196001026000600185611faa91906126a9565b81548110611fe1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f800000000000000000000000000000000000000000000000000000000000000017600102600060018561203891906126a9565b8154811061206f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b6120cc600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846120c791906125ea565b611b7d565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561213657600093505050506121db565b61213f86610faa565b925084831015612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90612507565b60405180910390fd5b848361219091906126a9565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000813590506121f0816128fe565b92915050565b60008135905061220581612915565b92915050565b60008135905061221a8161292c565b92915050565b60008151905061222f81612943565b92915050565b6000813590506122448161295a565b92915050565b60006020828403121561225c57600080fd5b600061226a848285016121e1565b91505092915050565b60008060006060848603121561228857600080fd5b6000612296868287016121e1565b93505060206122a7868287016121e1565b92505060406122b886828701612235565b9150509250925092565b600080604083850312156122d557600080fd5b60006122e3858286016121e1565b92505060206122f485828601612235565b9150509250929050565b60006020828403121561231057600080fd5b600061231e848285016121f6565b91505092915050565b60006020828403121561233957600080fd5b60006123478482850161220b565b91505092915050565b60006020828403121561236257600080fd5b600061237084828501612220565b91505092915050565b60006020828403121561238b57600080fd5b600061239984828501612235565b91505092915050565b600080604083850312156123b557600080fd5b60006123c385828601612235565b92505060206123d485828601612235565b9150509250929050565b6123e7816126dd565b82525050565b6123f6816126ef565b82525050565b612405816126fb565b82525050565b600061241682612578565b6124208185612583565b9350612430818560208601612789565b612439816128c4565b840191505092915050565b6000612451600d83612583565b915061245c826128d5565b602082019050919050565b61247081612731565b82525050565b61247f81612777565b82525050565b61248e8161276d565b82525050565b60006020820190506124a960008301846123de565b92915050565b60006020820190506124c460008301846123ed565b92915050565b60006020820190506124df60008301846123fc565b92915050565b600060208201905081810360008301526124ff818461240b565b905092915050565b6000602082019050818103600083015261252081612444565b9050919050565b600060208201905061253c6000830184612467565b92915050565b60006020820190506125576000830184612476565b92915050565b60006020820190506125726000830184612485565b92915050565b600081519050919050565b600082825260208201905092915050565b600061259f8261276d565b91506125aa8361276d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125df576125de612837565b5b828201905092915050565b60006125f58261276d565b91506126008361276d565b9250826126105761260f612866565b5b828204905092915050565b60006126268261276d565b91506126318361276d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561266a57612669612837565b5b828202905092915050565b600061268082612731565b915061268b83612731565b92508282101561269e5761269d612837565b5b828203905092915050565b60006126b48261276d565b91506126bf8361276d565b9250828210156126d2576126d1612837565b5b828203905092915050565b60006126e88261274d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061278282612731565b9050919050565b60005b838110156127a757808201518184015260208101905061278c565b838111156127b6576000848401525b50505050565b600060028204905060018216806127d457607f821691505b602082108114156127e8576127e7612895565b5b50919050565b60006127f98261276d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561282c5761282b612837565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b612907816126dd565b811461291257600080fd5b50565b61291e816126fb565b811461292957600080fd5b50565b61293581612705565b811461294057600080fd5b50565b61294c81612731565b811461295757600080fd5b50565b6129638161276d565b811461296e57600080fd5b5056fea26469706673582212209d85aed45133f814c4c5f4596652712eb4c5981d29c608552b6527b3db75358464736f6c63430008040033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"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":[{"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"}]
+[{"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":[],"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":"_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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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/test.sh b/python/test.sh
@@ -6,7 +6,6 @@ export PYTHONPATH=.
modes=(MultiNocap MultiCap SingleCap SingleNocap)
for m in ${modes[@]}; do
- ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_pure.py
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py
done
@@ -23,6 +22,7 @@ done
modes=(MultiCap MultiNocap)
for m in ${modes[@]}; do
+ ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_pure.py
ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py
done
diff --git a/solidity/DemurrageTokenSingleCap.sol b/solidity/DemurrageTokenSingleCap.sol
@@ -18,13 +18,8 @@ contract DemurrageTokenSingleCap {
uint8 constant shiftRedistributionIsFractional = 255;
uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
- // Account bit field, with associated shifts and masks
- // Mirrors structure of redistributions for consistency
- mapping (address => bytes32) account; // uint152(unused) | uint32(period) | uint72(value)
- uint8 constant shiftAccountValue = 0;
- uint256 constant maskAccountValue = 0x0000000000000000000000000000000000000000000000ffffffffffffffffff; // (1 << 72) - 1
- uint8 constant shiftAccountPeriod = 72;
- uint256 constant maskAccountPeriod = 0x00000000000000000000000000000000000000ffffffff000000000000000000; // ((1 << 32) - 1) << 72
+ // Account balances
+ mapping (address => uint256) account;
// Cached demurrage amount, ppm with 38 digit resolution
uint128 public demurrageAmount;
@@ -157,7 +152,7 @@ contract DemurrageTokenSingleCap {
/// Balance unmodified by demurrage
function baseBalanceOf(address _account) public view returns (uint256) {
- return uint256(account[_account]) & maskAccountValue;
+ return account[_account];
}
/// Increases base balance for a single account
@@ -173,11 +168,7 @@ contract DemurrageTokenSingleCap {
}
oldBalance = baseBalanceOf(_account);
- newBalance = oldBalance + _delta;
- require(uint160(newBalance) > uint160(oldBalance), 'ERR_WOULDWRAP'); // revert if increase would result in a wrapped value
- workAccount &= (~maskAccountValue);
- workAccount |= (newBalance & maskAccountValue);
- account[_account] = bytes32(workAccount);
+ account[_account] = oldBalance + _delta;
return true;
}
@@ -195,10 +186,7 @@ contract DemurrageTokenSingleCap {
oldBalance = baseBalanceOf(_account);
require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard
- newBalance = oldBalance - _delta;
- workAccount &= (~maskAccountValue);
- workAccount |= (newBalance & maskAccountValue);
- account[_account] = bytes32(workAccount);
+ account[_account] = oldBalance - _delta;
return true;
}
@@ -207,8 +195,8 @@ contract DemurrageTokenSingleCap {
function mintTo(address _beneficiary, uint256 _amount) external returns (bool) {
uint256 baseAmount;
- require(minter[msg.sender]);
- require(_amount + totalSupply <= supplyCap);
+ require(minter[msg.sender], 'ERR_ACCESS');
+ require(_amount + totalSupply <= supplyCap, 'ERR_CAP');
changePeriod();
baseAmount = _amount;
@@ -303,36 +291,6 @@ contract DemurrageTokenSingleCap {
return lastRedistribution;
}
- // Deserialize the pemurrage period for the given account is participating in
- function accountPeriod(address _account) public view returns (uint256) {
- return (uint256(account[_account]) & maskAccountPeriod) >> shiftAccountPeriod;
- }
-
- // Save the given demurrage period as the currently participation period for the given address
- function registerAccountPeriod(address _account, uint256 _period) private returns (bool) {
- account[_account] &= bytes32(~maskAccountPeriod);
- account[_account] |= bytes32((_period << shiftAccountPeriod) & maskAccountPeriod);
- incrementRedistributionParticipants();
- return true;
- }
-
- // Determine whether the unit number is rounded down, rounded up or evenly divides.
- // Returns 0 if evenly distributed, or the remainder as a positive number
- // A _numParts value 0 will be interpreted as the value 1
- function remainder(uint256 _numParts, uint256 _sumWhole) public pure returns (uint256) {
- uint256 unit;
- uint256 truncatedResult;
-
- if (_numParts == 0) { // no division by zero please
- revert('ERR_NUMPARTS_ZERO');
- }
- require(_numParts < _sumWhole); // At least you are never LESS than the sum of your parts. Think about that.
-
- unit = _sumWhole / _numParts;
- truncatedResult = unit * _numParts;
- return _sumWhole - truncatedResult;
- }
-
// Returns the amount sent to the sink address
function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) {
uint256 redistributionSupply;
@@ -355,24 +313,6 @@ contract DemurrageTokenSingleCap {
return unit;
}
- // sets the remainder bit for the given period and books the remainder to the sink address balance
- // returns false if no change was made
- function applyRemainderOnPeriod(uint256 _remainder, uint256 _period) private returns (bool) {
- uint256 periodSupply;
-
- if (_remainder == 0) {
- return false;
- }
-
- // TODO: is this needed?
- redistributions[_period-1] |= bytes32(maskRedistributionIsFractional);
-
- periodSupply = toRedistributionSupply(redistributions[_period-1]);
- increaseBaseBalance(sinkAddress, periodSupply - _remainder);
- return true;
- }
-
-
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
function applyDemurrage() public returns (bool) {
uint128 epochPeriodCount;
@@ -408,7 +348,6 @@ contract DemurrageTokenSingleCap {
bytes32 nextRedistribution;
uint256 currentPeriod;
uint256 currentParticipants;
- uint256 currentRemainder;
uint256 currentDemurrageAmount;
uint256 nextRedistributionDemurrage;
uint256 demurrageCounts;
@@ -437,7 +376,7 @@ contract DemurrageTokenSingleCap {
nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod);
redistributions.push(nextRedistribution);
- currentRemainder = applyDefaultRedistribution(currentRedistribution);
+ applyDefaultRedistribution(currentRedistribution);
emit Period(nextPeriod);
return true;
}
@@ -471,22 +410,6 @@ contract DemurrageTokenSingleCap {
return (valueFactor * _value) / 1000000;
}
- // If the given account is participating in a period and that period has been crossed
- // THEN increase the base value of the account with its share of the value reduction of the period
- function applyRedistributionOnAccount(address _account) public returns (bool) {
- uint256 period;
-
- period = accountPeriod(_account);
- if (period == 0 || period >= actualPeriod()) {
- return false;
- }
-
- // zero out period for the account
- account[_account] &= bytes32(~maskAccountPeriod);
-
- return true;
- }
-
// Inflates the given amount according to the current demurrage modifier
function toBaseAmount(uint256 _value) public view returns (uint256) {
return (_value * ppmDivider * 1000000) / demurrageAmount;
@@ -517,7 +440,6 @@ contract DemurrageTokenSingleCap {
return result;
}
-
// Implements ERC20, triggers tax and/or redistribution
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
uint256 baseValue;
@@ -541,9 +463,6 @@ contract DemurrageTokenSingleCap {
increaseBaseBalance(_to, _value);
period = actualPeriod();
- if (_value >= minimumParticipantSpend && accountPeriod(_from) != period && _from != _to) {
- registerAccountPeriod(_from, period);
- }
return true;
}
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -18,13 +18,8 @@ contract DemurrageTokenSingleNocap {
uint8 constant shiftRedistributionIsFractional = 255;
uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
- // Account bit field, with associated shifts and masks
- // Mirrors structure of redistributions for consistency
- mapping (address => bytes32) account; // uint152(unused) | uint32(period) | uint72(value)
- uint8 constant shiftAccountValue = 0;
- uint256 constant maskAccountValue = 0x0000000000000000000000000000000000000000000000ffffffffffffffffff; // (1 << 72) - 1
- uint8 constant shiftAccountPeriod = 72;
- uint256 constant maskAccountPeriod = 0x00000000000000000000000000000000000000ffffffff000000000000000000; // ((1 << 32) - 1) << 72
+ // Account balances
+ mapping (address => uint256) account;
// Cached demurrage amount, ppm with 38 digit resolution
uint128 public demurrageAmount;
@@ -153,7 +148,7 @@ contract DemurrageTokenSingleNocap {
/// Balance unmodified by demurrage
function baseBalanceOf(address _account) public view returns (uint256) {
- return uint256(account[_account]) & maskAccountValue;
+ return account[_account];
}
/// Increases base balance for a single account
@@ -169,11 +164,7 @@ contract DemurrageTokenSingleNocap {
}
oldBalance = baseBalanceOf(_account);
- newBalance = oldBalance + _delta;
- require(uint160(newBalance) > uint160(oldBalance), 'ERR_WOULDWRAP'); // revert if increase would result in a wrapped value
- workAccount &= (~maskAccountValue);
- workAccount |= (newBalance & maskAccountValue);
- account[_account] = bytes32(workAccount);
+ account[_account] = oldBalance + _delta;
return true;
}
@@ -191,10 +182,7 @@ contract DemurrageTokenSingleNocap {
oldBalance = baseBalanceOf(_account);
require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard
- newBalance = oldBalance - _delta;
- workAccount &= (~maskAccountValue);
- workAccount |= (newBalance & maskAccountValue);
- account[_account] = bytes32(workAccount);
+ account[_account] = oldBalance - _delta;
return true;
}
@@ -298,36 +286,6 @@ contract DemurrageTokenSingleNocap {
return lastRedistribution;
}
- // Deserialize the pemurrage period for the given account is participating in
- function accountPeriod(address _account) public view returns (uint256) {
- return (uint256(account[_account]) & maskAccountPeriod) >> shiftAccountPeriod;
- }
-
- // Save the given demurrage period as the currently participation period for the given address
- function registerAccountPeriod(address _account, uint256 _period) private returns (bool) {
- account[_account] &= bytes32(~maskAccountPeriod);
- account[_account] |= bytes32((_period << shiftAccountPeriod) & maskAccountPeriod);
- incrementRedistributionParticipants();
- return true;
- }
-
- // Determine whether the unit number is rounded down, rounded up or evenly divides.
- // Returns 0 if evenly distributed, or the remainder as a positive number
- // A _numParts value 0 will be interpreted as the value 1
- function remainder(uint256 _numParts, uint256 _sumWhole) public pure returns (uint256) {
- uint256 unit;
- uint256 truncatedResult;
-
- if (_numParts == 0) { // no division by zero please
- revert('ERR_NUMPARTS_ZERO');
- }
- require(_numParts < _sumWhole); // At least you are never LESS than the sum of your parts. Think about that.
-
- unit = _sumWhole / _numParts;
- truncatedResult = unit * _numParts;
- return _sumWhole - truncatedResult;
- }
-
// Returns the amount sent to the sink address
function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) {
uint256 redistributionSupply;
@@ -350,24 +308,6 @@ contract DemurrageTokenSingleNocap {
return unit;
}
- // sets the remainder bit for the given period and books the remainder to the sink address balance
- // returns false if no change was made
- function applyRemainderOnPeriod(uint256 _remainder, uint256 _period) private returns (bool) {
- uint256 periodSupply;
-
- if (_remainder == 0) {
- return false;
- }
-
- // TODO: is this needed?
- redistributions[_period-1] |= bytes32(maskRedistributionIsFractional);
-
- periodSupply = toRedistributionSupply(redistributions[_period-1]);
- increaseBaseBalance(sinkAddress, periodSupply - _remainder);
- return true;
- }
-
-
// Calculate and cache the demurrage value corresponding to the (period of the) time of the method call
function applyDemurrage() public returns (bool) {
uint128 epochPeriodCount;
@@ -403,7 +343,6 @@ contract DemurrageTokenSingleNocap {
bytes32 nextRedistribution;
uint256 currentPeriod;
uint256 currentParticipants;
- uint256 currentRemainder;
uint256 currentDemurrageAmount;
uint256 nextRedistributionDemurrage;
uint256 demurrageCounts;
@@ -432,7 +371,7 @@ contract DemurrageTokenSingleNocap {
nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod);
redistributions.push(nextRedistribution);
- currentRemainder = applyDefaultRedistribution(currentRedistribution);
+ applyDefaultRedistribution(currentRedistribution);
emit Period(nextPeriod);
return true;
}
@@ -466,24 +405,8 @@ contract DemurrageTokenSingleNocap {
return (valueFactor * _value) / 1000000;
}
- // If the given account is participating in a period and that period has been crossed
- // THEN increase the base value of the account with its share of the value reduction of the period
- function applyRedistributionOnAccount(address _account) public returns (bool) {
- uint256 period;
-
- period = accountPeriod(_account);
- if (period == 0 || period >= actualPeriod()) {
- return false;
- }
- // zero out period for the account
- account[_account] &= bytes32(~maskAccountPeriod);
-
- return true;
- }
-
// Inflates the given amount according to the current demurrage modifier
function toBaseAmount(uint256 _value) public view returns (uint256) {
- //return (_value * ppmDivider * 1000000) / toDemurrageAmount(demurrageModifier);
return (_value * ppmDivider * 1000000) / demurrageAmount;
}
@@ -536,9 +459,6 @@ contract DemurrageTokenSingleNocap {
increaseBaseBalance(_to, _value);
period = actualPeriod();
- if (_value >= minimumParticipantSpend && accountPeriod(_from) != period && _from != _to) {
- registerAccountPeriod(_from, period);
- }
return true;
}