commit b5421cdd4e51e4a19d71bca2ac85839af9bd78b3
parent 74ef57a6a73f2a619da2b04772097daa6b4ab941
Author: nolash <dev@holbrook.no>
Date: Sat, 5 Jun 2021 12:50:31 +0200
Remove remainder, particiant count from single mode
Diffstat:
6 files changed, 10 insertions(+), 70 deletions(-)
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin
@@ -1 +1 @@
-60e06040523480156200001157600080fd5b506040516200355138038062003551833981810160405281019062000037919062000496565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600590805190602001906200010a9291906200032f565b508560069080519060200190620001239291906200032f565b508460ff166007819055504260808181525050603c836200014591906200076c565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200076c565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360c0818152505060006200020a6000620f424060006001620002a3640100000000026401000000009004565b905060008190806001815401808255809150506001900390600052602060002001600090919091909150558160098190555082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a6200028f91906200062f565b600a819055505050505050505050620009b3565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033d906200084e565b90600052602060002090601f016020900481019282620003615760008555620003ad565b82601f106200037c57805160ff1916838001178555620003ad565b82800160010185558215620003ad579182015b82811115620003ac5782518255916020019190600101906200038f565b5b509050620003bc9190620003c0565b5090565b5b80821115620003db576000816000905550600101620003c1565b5090565b6000620003f6620003f0846200059e565b62000575565b9050828152602081018484840111156200040f57600080fd5b6200041c84828562000818565b509392505050565b600081519050620004358162000965565b92915050565b600082601f8301126200044d57600080fd5b81516200045f848260208601620003df565b91505092915050565b60008151905062000479816200097f565b92915050565b600081519050620004908162000999565b92915050565b600080600080600080600060e0888a031215620004b257600080fd5b600088015167ffffffffffffffff811115620004cd57600080fd5b620004db8a828b016200043b565b975050602088015167ffffffffffffffff811115620004f957600080fd5b620005078a828b016200043b565b96505060406200051a8a828b016200047f565b95505060606200052d8a828b0162000468565b9450506080620005408a828b0162000468565b93505060a0620005538a828b0162000424565b92505060c0620005668a828b0162000468565b91505092959891949750929550565b60006200058162000594565b90506200058f828262000884565b919050565b6000604051905090565b600067ffffffffffffffff821115620005bc57620005bb62000918565b5b620005c78262000947565b9050602081019050919050565b6000808291508390505b60018511156200062657808604811115620005fe57620005fd620008ba565b5b60018516156200060e5780820291505b80810290506200061e8562000958565b9450620005de565b94509492505050565b60006200063c8262000801565b9150620006498362000801565b9250620006787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000680565b905092915050565b60008262000692576001905062000765565b81620006a2576000905062000765565b8160018114620006bb5760028114620006c657620006fc565b600191505062000765565b60ff841115620006db57620006da620008ba565b5b8360020a915084821115620006f557620006f4620008ba565b5b5062000765565b5060208310610133831016604e8410600b8410161715620007365782820a90508381111562000730576200072f620008ba565b5b62000765565b620007458484846001620005d4565b925090508184048111156200075f576200075e620008ba565b5b81810290505b9392505050565b6000620007798262000801565b9150620007868362000801565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007c257620007c1620008ba565b5b828202905092915050565b6000620007da82620007e1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620008385780820151818401526020810190506200081b565b8381111562000848576000848401525b50505050565b600060028204905060018216806200086757607f821691505b602082108114156200087e576200087d620008e9565b5b50919050565b6200088f8262000947565b810181811067ffffffffffffffff82111715620008b157620008b062000918565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200097081620007cd565b81146200097c57600080fd5b50565b6200098a8162000801565b81146200099657600080fd5b50565b620009a4816200080b565b8114620009b057600080fd5b50565b60805160a05160c051612b3662000a1b60003960008181610b9001528181610de101528181611a2e01528181611fb60152611fee0152600081816110a8015281816119dc0152611ac90152600081816110d401528181611aea0152611b2f0152612b366000f3fe608060405234801561001057600080fd5b5060043610610244576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e1161014d578063983b2d56116100d5578063e3ab207a11610099578063e3ab207a1461073b578063e54d63f71461076b578063e80952951461079b578063eda4e6d6146107b9578063f2fde38b146107d757610244565b8063983b2d561461066f5780639da7d8ba1461069f578063a2119e2f146106cf578063a9059cbb146106ed578063b470aade1461071d57610244565b806379ba50971161011c57806379ba5097146105d95780638da5cb5b146105f75780638f1df6bc146106155780638f770ad01461063357806395d89b411461065157610244565b80636a2d094e1461052b5780636ffa8a051461055b57806370a082311461058b578063731f237c146105bb57610244565b806331333487116101d0578063449a52f81161019f578063449a52f81461044d57806347a505171461047d5780634abfbba2146104ad578063573cc507146104dd5780636787a9be146104fb57610244565b8063313334871461039f578063313ce567146103cf57806340452d91146103ed57806340fc89f51461041d57610244565b806318160ddd1161021757806318160ddd146102e55780631989c6a814610303578063229ba1971461032157806323b872dd1461033f5780633092afd51461036f57610244565b806301ffc9a71461024957806306fdde0314610279578063095ea7b31461029757806309f28f3c146102c7575b600080fd5b610263600480360381019061025e91906123de565b610807565b60405161027091906125ac565b60405180910390f35b6102816109b2565b60405161028e91906125e2565b60405180910390f35b6102b160048036038101906102ac9190612379565b610a40565b6040516102be91906125ac565b60405180910390f35b6102cf610b5a565b6040516102dc9190612664565b60405180910390f35b6102ed610b7c565b6040516102fa919061269a565b60405180910390f35b61030b610b82565b604051610318919061269a565b60405180910390f35b610329610b8e565b604051610336919061269a565b60405180910390f35b6103596004803603810190610354919061232a565b610bb2565b60405161036691906125ac565b60405180910390f35b61038960048036038101906103849190612301565b610cd2565b60405161039691906125ac565b60405180910390f35b6103b960048036038101906103b49190612459565b610dc5565b6040516103c6919061269a565b60405180910390f35b6103d7610e76565b6040516103e4919061269a565b60405180910390f35b61040760048036038101906104029190612430565b610e7c565b60405161041491906125c7565b60405180910390f35b610437600480360381019061043291906123b5565b610ea0565b604051610444919061269a565b60405180910390f35b61046760048036038101906104629190612379565b610ed1565b60405161047491906125ac565b60405180910390f35b61049760048036038101906104929190612301565b61105b565b6040516104a4919061269a565b60405180910390f35b6104c760048036038101906104c29190612430565b6110a4565b6040516104d4919061269a565b60405180910390f35b6104e5611104565b6040516104f2919061269a565b60405180910390f35b61051560048036038101906105109190612430565b61110a565b604051610522919061269a565b60405180910390f35b61054560048036038101906105409190612430565b611176565b604051610552919061269a565b60405180910390f35b610575600480360381019061057091906123b5565b611197565b604051610582919061269a565b60405180910390f35b6105a560048036038101906105a09190612301565b6111ca565b6040516105b2919061269a565b60405180910390f35b6105c36112ab565b6040516105d091906125ac565b60405180910390f35b6105e1611459565b6040516105ee91906125ac565b60405180910390f35b6105ff611600565b60405161060c9190612591565b60405180910390f35b61061d611626565b60405161062a91906125ac565b60405180910390f35b61063b6117a5565b604051610648919061269a565b60405180910390f35b6106596117ab565b60405161066691906125e2565b60405180910390f35b61068960048036038101906106849190612301565b611839565b60405161069691906125ac565b60405180910390f35b6106b960048036038101906106b491906123b5565b6118f6565b6040516106c6919061269a565b60405180910390f35b6106d7611922565b6040516106e49190612664565b60405180910390f35b61070760048036038101906107029190612379565b611944565b60405161071491906125ac565b60405180910390f35b6107256119da565b604051610732919061269a565b60405180910390f35b610755600480360381019061075091906123b5565b6119fe565b604051610762919061269a565b60405180910390f35b61078560048036038101906107809190612459565b611a12565b604051610792919061269a565b60405180910390f35b6107a3611ac3565b6040516107b09190612664565b60405180910390f35b6107c1611b2d565b6040516107ce919061269a565b60405180910390f35b6107f160048036038101906107ec9190612301565b611b51565b6040516107fe91906125ac565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561085c57600190506109ad565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108af57600190506109ad565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090257600190506109ad565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561095557600190506109ad565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109a857600190506109ad565b600090505b919050565b600580546109bf906128f9565b80601f01602080910402602001604051908101604052809291908181526020018280546109eb906128f9565b8015610a385780601f10610a0d57610100808354040283529160200191610a38565b820191906000526020600020905b815481529060010190602001808311610a1b57829003601f168201915b505050505081565b600080610a4b611626565b50610a558361110a565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ae391906126d1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b47919061269a565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610bbf611626565b50610bc98461110a565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c5457600080fd5b610c5f868684611bf3565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610cbe919061269a565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d5b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d6457600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610e0a9190612727565b905060005b84811015610e5157620f42408284610e279190612758565b610e319190612727565b83610e3c91906127e6565b92508080610e499061292b565b915050610e0f565b50620f42408583610e629190612758565b610e6c9190612727565b9250505092915050565b60075481565b60008181548110610e8c57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790612624565b60405180910390fd5b60095460085484610f7191906126d1565b1115610fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa990612604565b60405180910390fd5b610fba611626565b508290508260086000828254610fd091906126d1565b92505081905550610fe18482611c34565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161103f919061269a565b60405180910390a361104f611cf9565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826110d29190612758565b7f00000000000000000000000000000000000000000000000000000000000000006110fd91906126d1565b9050919050565b600a5481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461115b9190612758565b6111659190612758565b61116f9190612727565b9050919050565b6000603c824261118691906127e6565b6111909190612727565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806111d98561105b565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611202611ac3565b61120c91906127b2565b6fffffffffffffffffffffffffffffffff16905061125a600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610dc5565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061128b9190612758565b82846112979190612758565b6112a19190612727565b9350505050919050565b60008060008060006112bb611ac3565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846112e791906127b2565b92506000836fffffffffffffffffffffffffffffffff161415611311576000945050505050611456565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061136082846fffffffffffffffffffffffffffffffff16610dc5565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611445919061267f565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114b657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008061163d611de1565b9850600060010289141561165d57600099505050505050505050506117a2565b611666896119fe565b965060018761167591906126d1565b9050611680876110a4565b915061168a6112ab565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506116c782611176565b925060008311156116fc576d04ee2d6d415b85acef81000000006116eb8685611a12565b6116f59190612727565b9350611719565b6d04ee2d6d415b85acef8100000000856117169190612727565b93505b61172860008560085484611f11565b9750600088908060018154018082558091505060019003906000526020600020016000909190919091505561175c89611f9d565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161178c919061269a565b60405180910390a1600199505050505050505050505b90565b60095481565b600680546117b8906128f9565b80601f01602080910402602001604051908101604052809291908181526020018280546117e4906128f9565b80156118315780601f1061180657610100808354040283529160200191611831565b820191906000526020600020905b81548152906001019060200180831161181457829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461189557600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611951611626565b5061195b8461110a565b9150611968338684611bf3565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119c7919061269a565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611a579190612727565b905060005b84811015611a9e57620f42408284611a749190612758565b611a7e9190612727565b83611a8991906126d1565b92508080611a969061292b565b915050611a5c565b50620f42408583611aaf9190612758565b611ab99190612727565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611b1491906127e6565b611b1e9190612727565b611b2891906126d1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bad57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611c008584612190565b50611c0b8484611c34565b50611c14611ac3565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611c915760009350505050611cf3565b611c9a8661105b565b92508483611ca891906126d1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611d1091906127e6565b81548110611d47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611d9491906127e6565b81548110611dcb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611df991906127e6565b81548110611e30577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e9f57600080fd5b505afa158015611eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed79190612407565b6fffffffffffffffffffffffffffffffff169050611ef4826119fe565b8111611f0857600060010292505050611f0e565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611fae866118f6565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611fe09190612758565b611fea9190612727565b91507f0000000000000000000000000000000000000000000000000000000000000000620f42408361201c9190612758565b6120269190612727565b90508381101561213e57612039866119fe565b9250710fffffffff0000000000000000000000000019600102600060018561206191906127e6565b81548110612098577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856120ef91906127e6565b81548110612126577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b612183600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461217e9190612727565b611c34565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008514156121ed5760009350505050612292565b6121f68661105b565b92508483101561223b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223290612644565b60405180910390fd5b848361224791906127e6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000813590506122a781612a8d565b92915050565b6000813590506122bc81612aa4565b92915050565b6000813590506122d181612abb565b92915050565b6000815190506122e681612ad2565b92915050565b6000813590506122fb81612ae9565b92915050565b60006020828403121561231357600080fd5b600061232184828501612298565b91505092915050565b60008060006060848603121561233f57600080fd5b600061234d86828701612298565b935050602061235e86828701612298565b925050604061236f868287016122ec565b9150509250925092565b6000806040838503121561238c57600080fd5b600061239a85828601612298565b92505060206123ab858286016122ec565b9150509250929050565b6000602082840312156123c757600080fd5b60006123d5848285016122ad565b91505092915050565b6000602082840312156123f057600080fd5b60006123fe848285016122c2565b91505092915050565b60006020828403121561241957600080fd5b6000612427848285016122d7565b91505092915050565b60006020828403121561244257600080fd5b6000612450848285016122ec565b91505092915050565b6000806040838503121561246c57600080fd5b600061247a858286016122ec565b925050602061248b858286016122ec565b9150509250929050565b61249e8161281a565b82525050565b6124ad8161282c565b82525050565b6124bc81612838565b82525050565b60006124cd826126b5565b6124d781856126c0565b93506124e78185602086016128c6565b6124f081612a01565b840191505092915050565b60006125086007836126c0565b915061251382612a12565b602082019050919050565b600061252b600a836126c0565b915061253682612a3b565b602082019050919050565b600061254e600d836126c0565b915061255982612a64565b602082019050919050565b61256d8161286e565b82525050565b61257c816128b4565b82525050565b61258b816128aa565b82525050565b60006020820190506125a66000830184612495565b92915050565b60006020820190506125c160008301846124a4565b92915050565b60006020820190506125dc60008301846124b3565b92915050565b600060208201905081810360008301526125fc81846124c2565b905092915050565b6000602082019050818103600083015261261d816124fb565b9050919050565b6000602082019050818103600083015261263d8161251e565b9050919050565b6000602082019050818103600083015261265d81612541565b9050919050565b60006020820190506126796000830184612564565b92915050565b60006020820190506126946000830184612573565b92915050565b60006020820190506126af6000830184612582565b92915050565b600081519050919050565b600082825260208201905092915050565b60006126dc826128aa565b91506126e7836128aa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561271c5761271b612974565b5b828201905092915050565b6000612732826128aa565b915061273d836128aa565b92508261274d5761274c6129a3565b5b828204905092915050565b6000612763826128aa565b915061276e836128aa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127a7576127a6612974565b5b828202905092915050565b60006127bd8261286e565b91506127c88361286e565b9250828210156127db576127da612974565b5b828203905092915050565b60006127f1826128aa565b91506127fc836128aa565b92508282101561280f5761280e612974565b5b828203905092915050565b60006128258261288a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006128bf8261286e565b9050919050565b60005b838110156128e45780820151818401526020810190506128c9565b838111156128f3576000848401525b50505050565b6000600282049050600182168061291157607f821691505b60208210811415612925576129246129d2565b5b50919050565b6000612936826128aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561296957612968612974565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b612a968161281a565b8114612aa157600080fd5b50565b612aad81612838565b8114612ab857600080fd5b50565b612ac481612842565b8114612acf57600080fd5b50565b612adb8161286e565b8114612ae657600080fd5b50565b612af2816128aa565b8114612afd57600080fd5b5056fea2646970667358221220d25a10043d82eb8caae695dcd85d62d9bf8b4cad865c7331a04bfe7d1ff8af8764736f6c63430008040033
-\ No newline at end of file
+60e06040523480156200001157600080fd5b506040516200339438038062003394833981810160405281019062000037919062000470565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600590805190602001906200010a92919062000309565b5085600690805190602001906200012392919062000309565b508460ff166007819055504260808181525050603c8362000145919062000746565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b919062000746565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360c0818152505060006200020a6000620f424060006001620002a3640100000000026401000000009004565b905060008190806001815401808255809150506001900390600052602060002001600090919091909150558160098190555082600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a6200028f919062000609565b600a8190555050505050505050506200098d565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003179062000828565b90600052602060002090601f0160209004810192826200033b576000855562000387565b82601f106200035657805160ff191683800117855562000387565b8280016001018555821562000387579182015b828111156200038657825182559160200191906001019062000369565b5b5090506200039691906200039a565b5090565b5b80821115620003b55760008160009055506001016200039b565b5090565b6000620003d0620003ca8462000578565b6200054f565b905082815260208101848484011115620003e957600080fd5b620003f6848285620007f2565b509392505050565b6000815190506200040f816200093f565b92915050565b600082601f8301126200042757600080fd5b815162000439848260208601620003b9565b91505092915050565b600081519050620004538162000959565b92915050565b6000815190506200046a8162000973565b92915050565b600080600080600080600060e0888a0312156200048c57600080fd5b600088015167ffffffffffffffff811115620004a757600080fd5b620004b58a828b0162000415565b975050602088015167ffffffffffffffff811115620004d357600080fd5b620004e18a828b0162000415565b9650506040620004f48a828b0162000459565b9550506060620005078a828b0162000442565b94505060806200051a8a828b0162000442565b93505060a06200052d8a828b01620003fe565b92505060c0620005408a828b0162000442565b91505092959891949750929550565b60006200055b6200056e565b90506200056982826200085e565b919050565b6000604051905090565b600067ffffffffffffffff821115620005965762000595620008f2565b5b620005a18262000921565b9050602081019050919050565b6000808291508390505b60018511156200060057808604811115620005d857620005d762000894565b5b6001851615620005e85780820291505b8081029050620005f88562000932565b9450620005b8565b94509492505050565b60006200061682620007db565b91506200062383620007db565b9250620006527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200065a565b905092915050565b6000826200066c57600190506200073f565b816200067c57600090506200073f565b8160018114620006955760028114620006a057620006d6565b60019150506200073f565b60ff841115620006b557620006b462000894565b5b8360020a915084821115620006cf57620006ce62000894565b5b506200073f565b5060208310610133831016604e8410600b8410161715620007105782820a9050838111156200070a576200070962000894565b5b6200073f565b6200071f8484846001620005ae565b9250905081840481111562000739576200073862000894565b5b81810290505b9392505050565b60006200075382620007db565b91506200076083620007db565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200079c576200079b62000894565b5b828202905092915050565b6000620007b482620007bb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000812578082015181840152602081019050620007f5565b8381111562000822576000848401525b50505050565b600060028204905060018216806200084157607f821691505b60208210811415620008585762000857620008c3565b5b50919050565b620008698262000921565b810181811067ffffffffffffffff821117156200088b576200088a620008f2565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200094a81620007a7565b81146200095657600080fd5b50565b6200096481620007db565b81146200097057600080fd5b50565b6200097e81620007e5565b81146200098a57600080fd5b50565b60805160a05160c05161299f620009f560003960008181610b5501528181610da6015281816119bf01528181611f210152611f5901526000818161103c0152818161196d0152611a5a01526000818161106801528181611a7b0152611ac0015261299f6000f3fe608060405234801561001057600080fd5b5060043610610239576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a05116101425780639da7d8ba116100ca578063e3ab207a11610099578063e3ab207a14610700578063e54d63f714610730578063e809529514610760578063eda4e6d61461077e578063f2fde38b1461079c57610239565b80639da7d8ba14610664578063a2119e2f14610694578063a9059cbb146106b2578063b470aade146106e257610239565b80638da5cb5b116101115780638da5cb5b146105bc5780638f1df6bc146105da5780638f770ad0146105f857806395d89b4114610616578063983b2d561461063457610239565b80636ffa8a051461052057806370a0823114610550578063731f237c1461058057806379ba50971461059e57610239565b806331333487116101c557806347a505171161019457806347a50517146104425780634abfbba214610472578063573cc507146104a25780636787a9be146104c05780636a2d094e146104f057610239565b80633133348714610394578063313ce567146103c457806340452d91146103e2578063449a52f81461041257610239565b806318160ddd1161020c57806318160ddd146102da5780631989c6a8146102f8578063229ba1971461031657806323b872dd146103345780633092afd51461036457610239565b806301ffc9a71461023e57806306fdde031461026e578063095ea7b31461028c57806309f28f3c146102bc575b600080fd5b61025860048036038101906102539190612247565b6107cc565b6040516102659190612415565b60405180910390f35b610276610977565b604051610283919061244b565b60405180910390f35b6102a660048036038101906102a191906121e2565b610a05565b6040516102b39190612415565b60405180910390f35b6102c4610b1f565b6040516102d191906124cd565b60405180910390f35b6102e2610b41565b6040516102ef9190612503565b60405180910390f35b610300610b47565b60405161030d9190612503565b60405180910390f35b61031e610b53565b60405161032b9190612503565b60405180910390f35b61034e60048036038101906103499190612193565b610b77565b60405161035b9190612415565b60405180910390f35b61037e6004803603810190610379919061216a565b610c97565b60405161038b9190612415565b60405180910390f35b6103ae60048036038101906103a991906122c2565b610d8a565b6040516103bb9190612503565b60405180910390f35b6103cc610e3b565b6040516103d99190612503565b60405180910390f35b6103fc60048036038101906103f79190612299565b610e41565b6040516104099190612430565b60405180910390f35b61042c600480360381019061042791906121e2565b610e65565b6040516104399190612415565b60405180910390f35b61045c6004803603810190610457919061216a565b610fef565b6040516104699190612503565b60405180910390f35b61048c60048036038101906104879190612299565b611038565b6040516104999190612503565b60405180910390f35b6104aa611098565b6040516104b79190612503565b60405180910390f35b6104da60048036038101906104d59190612299565b61109e565b6040516104e79190612503565b60405180910390f35b61050a60048036038101906105059190612299565b61110a565b6040516105179190612503565b60405180910390f35b61053a6004803603810190610535919061221e565b61112b565b6040516105479190612503565b60405180910390f35b61056a6004803603810190610565919061216a565b61115e565b6040516105779190612503565b60405180910390f35b61058861123f565b6040516105959190612415565b60405180910390f35b6105a66113ed565b6040516105b39190612415565b60405180910390f35b6105c4611594565b6040516105d191906123fa565b60405180910390f35b6105e26115ba565b6040516105ef9190612415565b60405180910390f35b610600611736565b60405161060d9190612503565b60405180910390f35b61061e61173c565b60405161062b919061244b565b60405180910390f35b61064e6004803603810190610649919061216a565b6117ca565b60405161065b9190612415565b60405180910390f35b61067e6004803603810190610679919061221e565b611887565b60405161068b9190612503565b60405180910390f35b61069c6118b3565b6040516106a991906124cd565b60405180910390f35b6106cc60048036038101906106c791906121e2565b6118d5565b6040516106d99190612415565b60405180910390f35b6106ea61196b565b6040516106f79190612503565b60405180910390f35b61071a6004803603810190610715919061221e565b61198f565b6040516107279190612503565b60405180910390f35b61074a600480360381019061074591906122c2565b6119a3565b6040516107579190612503565b60405180910390f35b610768611a54565b60405161077591906124cd565b60405180910390f35b610786611abe565b6040516107939190612503565b60405180910390f35b6107b660048036038101906107b1919061216a565b611ae2565b6040516107c39190612415565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108215760019050610972565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108745760019050610972565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108c75760019050610972565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561091a5760019050610972565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561096d5760019050610972565b600090505b919050565b6005805461098490612762565b80601f01602080910402602001604051908101604052809291908181526020018280546109b090612762565b80156109fd5780601f106109d2576101008083540402835291602001916109fd565b820191906000526020600020905b8154815290600101906020018083116109e057829003601f168201915b505050505081565b600080610a106115ba565b50610a1a8361109e565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610aa8919061253a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b0c9190612503565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610b846115ba565b50610b8e8461109e565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c1957600080fd5b610c24868684611b84565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610c839190612503565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d2057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d2957600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610dcf9190612590565b905060005b84811015610e1657620f42408284610dec91906125c1565b610df69190612590565b83610e01919061264f565b92508080610e0e90612794565b915050610dd4565b50620f42408583610e2791906125c1565b610e319190612590565b9250505092915050565b60075481565b60008181548110610e5157600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ef4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eeb9061248d565b60405180910390fd5b60095460085484610f05919061253a565b1115610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d9061246d565b60405180910390fd5b610f4e6115ba565b508290508260086000828254610f64919061253a565b92505081905550610f758482611bc5565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610fd39190612503565b60405180910390a3610fe3611c8a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261106691906125c1565b7f0000000000000000000000000000000000000000000000000000000000000000611091919061253a565b9050919050565b600a5481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846110ef91906125c1565b6110f991906125c1565b6111039190612590565b9050919050565b6000603c824261111a919061264f565b6111249190612590565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061116d85610fef565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611196611a54565b6111a0919061261b565b6fffffffffffffffffffffffffffffffff1690506111ee600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610d8a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061121f91906125c1565b828461122b91906125c1565b6112359190612590565b9350505050919050565b600080600080600061124f611a54565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461127b919061261b565b92506000836fffffffffffffffffffffffffffffffff1614156112a55760009450505050506113ea565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506112f482846fffffffffffffffffffffffffffffffff16610d8a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516113d991906124e8565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144a57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060006115d0611d72565b975060006001028814156115ef57600098505050505050505050611733565b6115f88861198f565b9550600186611607919061253a565b905061161286611038565b915061161c61123f565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506116598261110a565b9250600083111561168e576d04ee2d6d415b85acef810000000061167d86856119a3565b6116879190612590565b93506116ab565b6d04ee2d6d415b85acef8100000000856116a89190612590565b93505b6116ba60008560085484611ea2565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556116ee88611f08565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161171e9190612503565b60405180910390a16001985050505050505050505b90565b60095481565b6006805461174990612762565b80601f016020809104026020016040519081016040528092919081815260200182805461177590612762565b80156117c25780601f10611797576101008083540402835291602001916117c2565b820191906000526020600020905b8154815290600101906020018083116117a557829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461182657600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060006118e26115ba565b506118ec8461109e565b91506118f9338684611b84565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119589190612503565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f00000000000000000000000000000000000000000000000000000000000000006119e89190612590565b905060005b84811015611a2f57620f42408284611a0591906125c1565b611a0f9190612590565b83611a1a919061253a565b92508080611a2790612794565b9150506119ed565b50620f42408583611a4091906125c1565b611a4a9190612590565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611aa5919061264f565b611aaf9190612590565b611ab9919061253a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611b918584611ff9565b50611b9c8484611bc5565b50611ba5611a54565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611c225760009350505050611c84565b611c2b86610fef565b92508483611c39919061253a565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611ca1919061264f565b81548110611cd8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611d25919061264f565b81548110611d5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611d8a919061264f565b81548110611dc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e3057600080fd5b505afa158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e689190612270565b6fffffffffffffffffffffffffffffffff169050611e858261198f565b8111611e9957600060010292505050611e9f565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611f1986611887565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611f4b91906125c1565b611f559190612590565b91507f0000000000000000000000000000000000000000000000000000000000000000620f424083611f8791906125c1565b611f919190612590565b905083811015611fa757611fa48661198f565b92505b611fec600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef810000000084611fe79190612590565b611bc5565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561205657600093505050506120fb565b61205f86610fef565b9250848310156120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b906124ad565b60405180910390fd5b84836120b0919061264f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600081359050612110816128f6565b92915050565b6000813590506121258161290d565b92915050565b60008135905061213a81612924565b92915050565b60008151905061214f8161293b565b92915050565b60008135905061216481612952565b92915050565b60006020828403121561217c57600080fd5b600061218a84828501612101565b91505092915050565b6000806000606084860312156121a857600080fd5b60006121b686828701612101565b93505060206121c786828701612101565b92505060406121d886828701612155565b9150509250925092565b600080604083850312156121f557600080fd5b600061220385828601612101565b925050602061221485828601612155565b9150509250929050565b60006020828403121561223057600080fd5b600061223e84828501612116565b91505092915050565b60006020828403121561225957600080fd5b60006122678482850161212b565b91505092915050565b60006020828403121561228257600080fd5b600061229084828501612140565b91505092915050565b6000602082840312156122ab57600080fd5b60006122b984828501612155565b91505092915050565b600080604083850312156122d557600080fd5b60006122e385828601612155565b92505060206122f485828601612155565b9150509250929050565b61230781612683565b82525050565b61231681612695565b82525050565b612325816126a1565b82525050565b60006123368261251e565b6123408185612529565b935061235081856020860161272f565b6123598161286a565b840191505092915050565b6000612371600783612529565b915061237c8261287b565b602082019050919050565b6000612394600a83612529565b915061239f826128a4565b602082019050919050565b60006123b7600d83612529565b91506123c2826128cd565b602082019050919050565b6123d6816126d7565b82525050565b6123e58161271d565b82525050565b6123f481612713565b82525050565b600060208201905061240f60008301846122fe565b92915050565b600060208201905061242a600083018461230d565b92915050565b6000602082019050612445600083018461231c565b92915050565b60006020820190508181036000830152612465818461232b565b905092915050565b6000602082019050818103600083015261248681612364565b9050919050565b600060208201905081810360008301526124a681612387565b9050919050565b600060208201905081810360008301526124c6816123aa565b9050919050565b60006020820190506124e260008301846123cd565b92915050565b60006020820190506124fd60008301846123dc565b92915050565b600060208201905061251860008301846123eb565b92915050565b600081519050919050565b600082825260208201905092915050565b600061254582612713565b915061255083612713565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612585576125846127dd565b5b828201905092915050565b600061259b82612713565b91506125a683612713565b9250826125b6576125b561280c565b5b828204905092915050565b60006125cc82612713565b91506125d783612713565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126105761260f6127dd565b5b828202905092915050565b6000612626826126d7565b9150612631836126d7565b925082821015612644576126436127dd565b5b828203905092915050565b600061265a82612713565b915061266583612713565b925082821015612678576126776127dd565b5b828203905092915050565b600061268e826126f3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612728826126d7565b9050919050565b60005b8381101561274d578082015181840152602081019050612732565b8381111561275c576000848401525b50505050565b6000600282049050600182168061277a57607f821691505b6020821081141561278e5761278d61283b565b5b50919050565b600061279f82612713565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156127d2576127d16127dd565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6128ff81612683565b811461290a57600080fd5b50565b612916816126a1565b811461292157600080fd5b50565b61292d816126ab565b811461293857600080fd5b50565b612944816126d7565b811461294f57600080fd5b50565b61295b81612713565b811461296657600080fd5b5056fea264697066735822122019f96e902334e758898b7e76d98eb448962ce048161c68e1d137a62e7762b08264736f6c63430008040033
+\ 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":[],"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"}]
+[{"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":"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 @@
-60e06040523480156200001157600080fd5b50604051620033a3380380620033a383398181016040528101906200003791906200048e565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000327565b5084600690805190602001906200012392919062000327565b508360ff166007819055504260808181525050603c826200014591906200074d565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200074d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a62000288919062000610565b6009819055505050505050505062000994565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b82805462000335906200082f565b90600052602060002090601f016020900481019282620003595760008555620003a5565b82601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6000620003ee620003e8846200057f565b62000556565b9050828152602081018484840111156200040757600080fd5b62000414848285620007f9565b509392505050565b6000815190506200042d8162000946565b92915050565b600082601f8301126200044557600080fd5b815162000457848260208601620003d7565b91505092915050565b600081519050620004718162000960565b92915050565b60008151905062000488816200097a565b92915050565b60008060008060008060c08789031215620004a857600080fd5b600087015167ffffffffffffffff811115620004c357600080fd5b620004d189828a0162000433565b965050602087015167ffffffffffffffff811115620004ef57600080fd5b620004fd89828a0162000433565b95505060406200051089828a0162000477565b94505060606200052389828a0162000460565b93505060806200053689828a0162000460565b92505060a06200054989828a016200041c565b9150509295509295509295565b60006200056262000575565b905062000570828262000865565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059d576200059c620008f9565b5b620005a88262000928565b9050602081019050919050565b6000808291508390505b60018511156200060757808604811115620005df57620005de6200089b565b5b6001851615620005ef5780820291505b8081029050620005ff8562000939565b9450620005bf565b94509492505050565b60006200061d82620007e2565b91506200062a83620007e2565b9250620006597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000661565b905092915050565b60008262000673576001905062000746565b8162000683576000905062000746565b81600181146200069c5760028114620006a757620006dd565b600191505062000746565b60ff841115620006bc57620006bb6200089b565b5b8360020a915084821115620006d657620006d56200089b565b5b5062000746565b5060208310610133831016604e8410600b8410161715620007175782820a9050838111156200071157620007106200089b565b5b62000746565b620007268484846001620005b5565b9250905081840481111562000740576200073f6200089b565b5b81810290505b9392505050565b60006200075a82620007e2565b91506200076783620007e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a357620007a26200089b565b5b828202905092915050565b6000620007bb82620007c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000819578082015181840152602081019050620007fc565b8381111562000829576000848401525b50505050565b600060028204905060018216806200084857607f821691505b602082108114156200085f576200085e620008ca565b5b50919050565b620008708262000928565b810181811067ffffffffffffffff82111715620008925762000891620008f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200095181620007ae565b81146200095d57600080fd5b50565b6200096b81620007e2565b81146200097757600080fd5b50565b6200098581620007ec565b81146200099157600080fd5b50565b60805160a05160c0516129a7620009fc60003960008181610b6701528181610db80152818161197701528181611eff0152611f37015260008181610ff7015281816119250152611a1201526000818161102301528181611a330152611a7801526129a76000f3fe608060405234801561001057600080fd5b5060043610610239576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101425780639da7d8ba116100ca578063e3ab207a11610099578063e3ab207a14610712578063e54d63f714610742578063e809529514610772578063eda4e6d614610790578063f2fde38b146107ae57610239565b80639da7d8ba14610676578063a2119e2f146106a6578063a9059cbb146106c4578063b470aade146106f457610239565b806379ba50971161011157806379ba5097146105ce5780638da5cb5b146105ec5780638f1df6bc1461060a57806395d89b4114610628578063983b2d561461064657610239565b80636a2d094e146105205780636ffa8a051461055057806370a0823114610580578063731f237c146105b057610239565b806331333487116101c5578063449a52f811610194578063449a52f81461044257806347a50517146104725780634abfbba2146104a2578063573cc507146104d25780636787a9be146104f057610239565b80633133348714610394578063313ce567146103c457806340452d91146103e257806340fc89f51461041257610239565b806318160ddd1161020c57806318160ddd146102da5780631989c6a8146102f8578063229ba1971461031657806323b872dd146103345780633092afd51461036457610239565b806301ffc9a71461023e57806306fdde031461026e578063095ea7b31461028c57806309f28f3c146102bc575b600080fd5b61025860048036038101906102539190612327565b6107de565b60405161026591906124af565b60405180910390f35b610276610989565b60405161028391906124e5565b60405180910390f35b6102a660048036038101906102a191906122c2565b610a17565b6040516102b391906124af565b60405180910390f35b6102c4610b31565b6040516102d19190612527565b60405180910390f35b6102e2610b53565b6040516102ef919061255d565b60405180910390f35b610300610b59565b60405161030d919061255d565b60405180910390f35b61031e610b65565b60405161032b919061255d565b60405180910390f35b61034e60048036038101906103499190612273565b610b89565b60405161035b91906124af565b60405180910390f35b61037e6004803603810190610379919061224a565b610ca9565b60405161038b91906124af565b60405180910390f35b6103ae60048036038101906103a991906123a2565b610d9c565b6040516103bb919061255d565b60405180910390f35b6103cc610e4d565b6040516103d9919061255d565b60405180910390f35b6103fc60048036038101906103f79190612379565b610e53565b60405161040991906124ca565b60405180910390f35b61042c600480360381019061042791906122fe565b610e77565b604051610439919061255d565b60405180910390f35b61045c600480360381019061045791906122c2565b610ea8565b60405161046991906124af565b60405180910390f35b61048c6004803603810190610487919061224a565b610faa565b604051610499919061255d565b60405180910390f35b6104bc60048036038101906104b79190612379565b610ff3565b6040516104c9919061255d565b60405180910390f35b6104da611053565b6040516104e7919061255d565b60405180910390f35b61050a60048036038101906105059190612379565b611059565b604051610517919061255d565b60405180910390f35b61053a60048036038101906105359190612379565b6110c5565b604051610547919061255d565b60405180910390f35b61056a600480360381019061056591906122fe565b6110e6565b604051610577919061255d565b60405180910390f35b61059a6004803603810190610595919061224a565b611119565b6040516105a7919061255d565b60405180910390f35b6105b86111fa565b6040516105c591906124af565b60405180910390f35b6105d66113a8565b6040516105e391906124af565b60405180910390f35b6105f461154f565b6040516106019190612494565b60405180910390f35b610612611575565b60405161061f91906124af565b60405180910390f35b6106306116f4565b60405161063d91906124e5565b60405180910390f35b610660600480360381019061065b919061224a565b611782565b60405161066d91906124af565b60405180910390f35b610690600480360381019061068b91906122fe565b61183f565b60405161069d919061255d565b60405180910390f35b6106ae61186b565b6040516106bb9190612527565b60405180910390f35b6106de60048036038101906106d991906122c2565b61188d565b6040516106eb91906124af565b60405180910390f35b6106fc611923565b604051610709919061255d565b60405180910390f35b61072c600480360381019061072791906122fe565b611947565b604051610739919061255d565b60405180910390f35b61075c600480360381019061075791906123a2565b61195b565b604051610769919061255d565b60405180910390f35b61077a611a0c565b6040516107879190612527565b60405180910390f35b610798611a76565b6040516107a5919061255d565b60405180910390f35b6107c860048036038101906107c3919061224a565b611a9a565b6040516107d591906124af565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108335760019050610984565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108865760019050610984565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108d95760019050610984565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561092c5760019050610984565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561097f5760019050610984565b600090505b919050565b60058054610996906127bc565b80601f01602080910402602001604051908101604052809291908181526020018280546109c2906127bc565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b505050505081565b600080610a22611575565b50610a2c83611059565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610aba9190612594565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610b1e919061255d565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610b96611575565b50610ba084611059565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610c2b57600080fd5b610c36868684611b3c565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610c95919061255d565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610d3257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d3b57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610de191906125ea565b905060005b84811015610e2857620f42408284610dfe919061261b565b610e0891906125ea565b83610e1391906126a9565b92508080610e20906127ee565b915050610de6565b50620f42408583610e39919061261b565b610e4391906125ea565b9250505092915050565b60075481565b60008181548110610e6357600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610f0157600080fd5b610f09611575565b508290508260086000828254610f1f9190612594565b92505081905550610f308482611b7d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f8e919061255d565b60405180910390a3610f9e611c42565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611021919061261b565b7f000000000000000000000000000000000000000000000000000000000000000061104c9190612594565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846110aa919061261b565b6110b4919061261b565b6110be91906125ea565b9050919050565b6000603c82426110d591906126a9565b6110df91906125ea565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061112885610faa565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611151611a0c565b61115b9190612675565b6fffffffffffffffffffffffffffffffff1690506111a9600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610d9c565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006111da919061261b565b82846111e6919061261b565b6111f091906125ea565b9350505050919050565b600080600080600061120a611a0c565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846112369190612675565b92506000836fffffffffffffffffffffffffffffffff1614156112605760009450505050506113a5565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506112af82846fffffffffffffffffffffffffffffffff16610d9c565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516113949190612542565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461140557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008061158c611d2a565b985060006001028914156115ac57600099505050505050505050506116f1565b6115b589611947565b96506001876115c49190612594565b90506115cf87610ff3565b91506115d96111fa565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611616826110c5565b9250600083111561164b576d04ee2d6d415b85acef810000000061163a868561195b565b61164491906125ea565b9350611668565b6d04ee2d6d415b85acef81000000008561166591906125ea565b93505b61167760008560085484611e5a565b975060008890806001815401808255809150506001900390600052602060002001600090919091909150556116ab89611ee6565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516116db919061255d565b60405180910390a1600199505050505050505050505b90565b60068054611701906127bc565b80601f016020809104026020016040519081016040528092919081815260200182805461172d906127bc565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600061189a611575565b506118a484611059565b91506118b1338684611b3c565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611910919061255d565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f00000000000000000000000000000000000000000000000000000000000000006119a091906125ea565b905060005b848110156119e757620f424082846119bd919061261b565b6119c791906125ea565b836119d29190612594565b925080806119df906127ee565b9150506119a5565b50620f424085836119f8919061261b565b611a0291906125ea565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611a5d91906126a9565b611a6791906125ea565b611a719190612594565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611af657600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611b4985846120d9565b50611b548484611b7d565b50611b5d611a0c565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611bda5760009350505050611c3c565b611be386610faa565b92508483611bf19190612594565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611c5991906126a9565b81548110611c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611cdd91906126a9565b81548110611d14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611d4291906126a9565b81548110611d79577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e209190612350565b6fffffffffffffffffffffffffffffffff169050611e3d82611947565b8111611e5157600060010292505050611e57565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611ef78661183f565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611f29919061261b565b611f3391906125ea565b91507f0000000000000000000000000000000000000000000000000000000000000000620f424083611f65919061261b565b611f6f91906125ea565b90508381101561208757611f8286611947565b9250710fffffffff00000000000000000000000000196001026000600185611faa91906126a9565b81548110611fe1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f800000000000000000000000000000000000000000000000000000000000000017600102600060018561203891906126a9565b8154811061206f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b6120cc600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846120c791906125ea565b611b7d565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085141561213657600093505050506121db565b61213f86610faa565b925084831015612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90612507565b60405180910390fd5b848361219091906126a9565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000813590506121f0816128fe565b92915050565b60008135905061220581612915565b92915050565b60008135905061221a8161292c565b92915050565b60008151905061222f81612943565b92915050565b6000813590506122448161295a565b92915050565b60006020828403121561225c57600080fd5b600061226a848285016121e1565b91505092915050565b60008060006060848603121561228857600080fd5b6000612296868287016121e1565b93505060206122a7868287016121e1565b92505060406122b886828701612235565b9150509250925092565b600080604083850312156122d557600080fd5b60006122e3858286016121e1565b92505060206122f485828601612235565b9150509250929050565b60006020828403121561231057600080fd5b600061231e848285016121f6565b91505092915050565b60006020828403121561233957600080fd5b60006123478482850161220b565b91505092915050565b60006020828403121561236257600080fd5b600061237084828501612220565b91505092915050565b60006020828403121561238b57600080fd5b600061239984828501612235565b91505092915050565b600080604083850312156123b557600080fd5b60006123c385828601612235565b92505060206123d485828601612235565b9150509250929050565b6123e7816126dd565b82525050565b6123f6816126ef565b82525050565b612405816126fb565b82525050565b600061241682612578565b6124208185612583565b9350612430818560208601612789565b612439816128c4565b840191505092915050565b6000612451600d83612583565b915061245c826128d5565b602082019050919050565b61247081612731565b82525050565b61247f81612777565b82525050565b61248e8161276d565b82525050565b60006020820190506124a960008301846123de565b92915050565b60006020820190506124c460008301846123ed565b92915050565b60006020820190506124df60008301846123fc565b92915050565b600060208201905081810360008301526124ff818461240b565b905092915050565b6000602082019050818103600083015261252081612444565b9050919050565b600060208201905061253c6000830184612467565b92915050565b60006020820190506125576000830184612476565b92915050565b60006020820190506125726000830184612485565b92915050565b600081519050919050565b600082825260208201905092915050565b600061259f8261276d565b91506125aa8361276d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125df576125de612837565b5b828201905092915050565b60006125f58261276d565b91506126008361276d565b9250826126105761260f612866565b5b828204905092915050565b60006126268261276d565b91506126318361276d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561266a57612669612837565b5b828202905092915050565b600061268082612731565b915061268b83612731565b92508282101561269e5761269d612837565b5b828203905092915050565b60006126b48261276d565b91506126bf8361276d565b9250828210156126d2576126d1612837565b5b828203905092915050565b60006126e88261274d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061278282612731565b9050919050565b60005b838110156127a757808201518184015260208101905061278c565b838111156127b6576000848401525b50505050565b600060028204905060018216806127d457607f821691505b602082108114156127e8576127e7612895565b5b50919050565b60006127f98261276d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561282c5761282b612837565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b612907816126dd565b811461291257600080fd5b50565b61291e816126fb565b811461292957600080fd5b50565b61293581612705565b811461294057600080fd5b50565b61294c81612731565b811461295757600080fd5b50565b6129638161276d565b811461296e57600080fd5b5056fea26469706673582212209d85aed45133f814c4c5f4596652712eb4c5981d29c608552b6527b3db75358464736f6c63430008040033
-\ No newline at end of file
+60e06040523480156200001157600080fd5b50604051620031e6380380620031e6833981810160405281019062000037919062000468565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000301565b5084600690805190602001906200012392919062000301565b508360ff166007819055504260808181525050603c8262000145919062000727565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b919062000727565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002889190620005ea565b600981905550505050505050506200096e565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200030f9062000809565b90600052602060002090601f0160209004810192826200033357600085556200037f565b82601f106200034e57805160ff19168380011785556200037f565b828001600101855582156200037f579182015b828111156200037e57825182559160200191906001019062000361565b5b5090506200038e919062000392565b5090565b5b80821115620003ad57600081600090555060010162000393565b5090565b6000620003c8620003c28462000559565b62000530565b905082815260208101848484011115620003e157600080fd5b620003ee848285620007d3565b509392505050565b600081519050620004078162000920565b92915050565b600082601f8301126200041f57600080fd5b815162000431848260208601620003b1565b91505092915050565b6000815190506200044b816200093a565b92915050565b600081519050620004628162000954565b92915050565b60008060008060008060c087890312156200048257600080fd5b600087015167ffffffffffffffff8111156200049d57600080fd5b620004ab89828a016200040d565b965050602087015167ffffffffffffffff811115620004c957600080fd5b620004d789828a016200040d565b9550506040620004ea89828a0162000451565b9450506060620004fd89828a016200043a565b93505060806200051089828a016200043a565b92505060a06200052389828a01620003f6565b9150509295509295509295565b60006200053c6200054f565b90506200054a82826200083f565b919050565b6000604051905090565b600067ffffffffffffffff821115620005775762000576620008d3565b5b620005828262000902565b9050602081019050919050565b6000808291508390505b6001851115620005e157808604811115620005b957620005b862000875565b5b6001851615620005c95780820291505b8081029050620005d98562000913565b945062000599565b94509492505050565b6000620005f782620007bc565b91506200060483620007bc565b9250620006337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200063b565b905092915050565b6000826200064d576001905062000720565b816200065d576000905062000720565b81600181146200067657600281146200068157620006b7565b600191505062000720565b60ff84111562000696576200069562000875565b5b8360020a915084821115620006b057620006af62000875565b5b5062000720565b5060208310610133831016604e8410600b8410161715620006f15782820a905083811115620006eb57620006ea62000875565b5b62000720565b6200070084848460016200058f565b925090508184048111156200071a576200071962000875565b5b81810290505b9392505050565b60006200073482620007bc565b91506200074183620007bc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200077d576200077c62000875565b5b828202905092915050565b600062000795826200079c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620007f3578082015181840152602081019050620007d6565b8381111562000803576000848401525b50505050565b600060028204905060018216806200082257607f821691505b60208210811415620008395762000838620008a4565b5b50919050565b6200084a8262000902565b810181811067ffffffffffffffff821117156200086c576200086b620008d3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200092b8162000788565b81146200093757600080fd5b50565b6200094581620007bc565b81146200095157600080fd5b50565b6200095f81620007c6565b81146200096b57600080fd5b50565b60805160a05160c051612810620009d660003960008181610b2c01528181610d7d0152818161190801528181611e6a0152611ea2015260008181610f8b015281816118b601526119a3015260008181610fb7015281816119c40152611a0901526128106000f3fe608060405234801561001057600080fd5b506004361061022e576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101425780639da7d8ba116100ca578063e3ab207a11610099578063e3ab207a146106d7578063e54d63f714610707578063e809529514610737578063eda4e6d614610755578063f2fde38b146107735761022e565b80639da7d8ba1461063b578063a2119e2f1461066b578063a9059cbb14610689578063b470aade146106b95761022e565b806379ba50971161011157806379ba5097146105935780638da5cb5b146105b15780638f1df6bc146105cf57806395d89b41146105ed578063983b2d561461060b5761022e565b80636a2d094e146104e55780636ffa8a051461051557806370a0823114610545578063731f237c146105755761022e565b80633092afd5116101c5578063449a52f811610194578063449a52f81461040757806347a50517146104375780634abfbba214610467578063573cc507146104975780636787a9be146104b55761022e565b80633092afd5146103595780633133348714610389578063313ce567146103b957806340452d91146103d75761022e565b806318160ddd1161020157806318160ddd146102cf5780631989c6a8146102ed578063229ba1971461030b57806323b872dd146103295761022e565b806301ffc9a71461023357806306fdde0314610263578063095ea7b31461028157806309f28f3c146102b1575b600080fd5b61024d60048036038101906102489190612190565b6107a3565b60405161025a9190612318565b60405180910390f35b61026b61094e565b604051610278919061234e565b60405180910390f35b61029b6004803603810190610296919061212b565b6109dc565b6040516102a89190612318565b60405180910390f35b6102b9610af6565b6040516102c69190612390565b60405180910390f35b6102d7610b18565b6040516102e491906123c6565b60405180910390f35b6102f5610b1e565b60405161030291906123c6565b60405180910390f35b610313610b2a565b60405161032091906123c6565b60405180910390f35b610343600480360381019061033e91906120dc565b610b4e565b6040516103509190612318565b60405180910390f35b610373600480360381019061036e91906120b3565b610c6e565b6040516103809190612318565b60405180910390f35b6103a3600480360381019061039e919061220b565b610d61565b6040516103b091906123c6565b60405180910390f35b6103c1610e12565b6040516103ce91906123c6565b60405180910390f35b6103f160048036038101906103ec91906121e2565b610e18565b6040516103fe9190612333565b60405180910390f35b610421600480360381019061041c919061212b565b610e3c565b60405161042e9190612318565b60405180910390f35b610451600480360381019061044c91906120b3565b610f3e565b60405161045e91906123c6565b60405180910390f35b610481600480360381019061047c91906121e2565b610f87565b60405161048e91906123c6565b60405180910390f35b61049f610fe7565b6040516104ac91906123c6565b60405180910390f35b6104cf60048036038101906104ca91906121e2565b610fed565b6040516104dc91906123c6565b60405180910390f35b6104ff60048036038101906104fa91906121e2565b611059565b60405161050c91906123c6565b60405180910390f35b61052f600480360381019061052a9190612167565b61107a565b60405161053c91906123c6565b60405180910390f35b61055f600480360381019061055a91906120b3565b6110ad565b60405161056c91906123c6565b60405180910390f35b61057d61118e565b60405161058a9190612318565b60405180910390f35b61059b61133c565b6040516105a89190612318565b60405180910390f35b6105b96114e3565b6040516105c691906122fd565b60405180910390f35b6105d7611509565b6040516105e49190612318565b60405180910390f35b6105f5611685565b604051610602919061234e565b60405180910390f35b610625600480360381019061062091906120b3565b611713565b6040516106329190612318565b60405180910390f35b61065560048036038101906106509190612167565b6117d0565b60405161066291906123c6565b60405180910390f35b6106736117fc565b6040516106809190612390565b60405180910390f35b6106a3600480360381019061069e919061212b565b61181e565b6040516106b09190612318565b60405180910390f35b6106c16118b4565b6040516106ce91906123c6565b60405180910390f35b6106f160048036038101906106ec9190612167565b6118d8565b6040516106fe91906123c6565b60405180910390f35b610721600480360381019061071c919061220b565b6118ec565b60405161072e91906123c6565b60405180910390f35b61073f61199d565b60405161074c9190612390565b60405180910390f35b61075d611a07565b60405161076a91906123c6565b60405180910390f35b61078d600480360381019061078891906120b3565b611a2b565b60405161079a9190612318565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156107f85760019050610949565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561084b5760019050610949565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561089e5760019050610949565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108f15760019050610949565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109445760019050610949565b600090505b919050565b6005805461095b90612625565b80601f016020809104026020016040519081016040528092919081815260200182805461098790612625565b80156109d45780601f106109a9576101008083540402835291602001916109d4565b820191906000526020600020905b8154815290600101906020018083116109b757829003601f168201915b505050505081565b6000806109e7611509565b506109f183610fed565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610a7f91906123fd565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ae391906123c6565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610b5b611509565b50610b6584610fed565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610bf057600080fd5b610bfb868684611acd565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610c5a91906123c6565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cf757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610d0057600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610da69190612453565b905060005b84811015610ded57620f42408284610dc39190612484565b610dcd9190612453565b83610dd89190612512565b92508080610de590612657565b915050610dab565b50620f42408583610dfe9190612484565b610e089190612453565b9250505092915050565b60075481565b60008181548110610e2857600080fd5b906000526020600020016000915090505481565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e9557600080fd5b610e9d611509565b508290508260086000828254610eb391906123fd565b92505081905550610ec48482611b0e565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f2291906123c6565b60405180910390a3610f32611bd3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610fb59190612484565b7f0000000000000000000000000000000000000000000000000000000000000000610fe091906123fd565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461103e9190612484565b6110489190612484565b6110529190612453565b9050919050565b6000603c82426110699190612512565b6110739190612453565b9050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806110bc85610f3e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff166110e561199d565b6110ef91906124de565b6fffffffffffffffffffffffffffffffff16905061113d600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610d61565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061116e9190612484565b828461117a9190612484565b6111849190612453565b9350505050919050565b600080600080600061119e61199d565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846111ca91906124de565b92506000836fffffffffffffffffffffffffffffffff1614156111f4576000945050505050611339565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061124382846fffffffffffffffffffffffffffffffff16610d61565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161132891906123ab565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600061151f611cbb565b9750600060010288141561153e57600098505050505050505050611682565b611547886118d8565b955060018661155691906123fd565b905061156186610f87565b915061156b61118e565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506115a882611059565b925060008311156115dd576d04ee2d6d415b85acef81000000006115cc86856118ec565b6115d69190612453565b93506115fa565b6d04ee2d6d415b85acef8100000000856115f79190612453565b93505b61160960008560085484611deb565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561163d88611e51565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161166d91906123c6565b60405180910390a16001985050505050505050505b90565b6006805461169290612625565b80601f01602080910402602001604051908101604052809291908181526020018280546116be90612625565b801561170b5780601f106116e05761010080835404028352916020019161170b565b820191906000526020600020905b8154815290600101906020018083116116ee57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176f57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b600080600061182b611509565b5061183584610fed565b9150611842338684611acd565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516118a191906123c6565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f00000000000000000000000000000000000000000000000000000000000000006119319190612453565b905060005b8481101561197857620f4240828461194e9190612484565b6119589190612453565b8361196391906123fd565b9250808061197090612657565b915050611936565b50620f424085836119899190612484565b6119939190612453565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426119ee9190612512565b6119f89190612453565b611a0291906123fd565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a8757600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611ada8584611f42565b50611ae58484611b0e565b50611aee61199d565b6fffffffffffffffffffffffffffffffff16905060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611b6b5760009350505050611bcd565b611b7486610f3e565b92508483611b8291906123fd565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611bea9190612512565b81548110611c21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a02811790508060010260006001600080549050611c6e9190612512565b81548110611ca5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611cd39190612512565b81548110611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611d7957600080fd5b505afa158015611d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db191906121b9565b6fffffffffffffffffffffffffffffffff169050611dce826118d8565b8111611de257600060010292505050611de8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611e62866117d0565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611e949190612484565b611e9e9190612453565b91507f0000000000000000000000000000000000000000000000000000000000000000620f424083611ed09190612484565b611eda9190612453565b905083811015611ef057611eed866118d8565b92505b611f35600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef810000000084611f309190612453565b611b0e565b5081945050505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611f9f5760009350505050612044565b611fa886610f3e565b925084831015611fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe490612370565b60405180910390fd5b8483611ff99190612512565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008135905061205981612767565b92915050565b60008135905061206e8161277e565b92915050565b60008135905061208381612795565b92915050565b600081519050612098816127ac565b92915050565b6000813590506120ad816127c3565b92915050565b6000602082840312156120c557600080fd5b60006120d38482850161204a565b91505092915050565b6000806000606084860312156120f157600080fd5b60006120ff8682870161204a565b93505060206121108682870161204a565b92505060406121218682870161209e565b9150509250925092565b6000806040838503121561213e57600080fd5b600061214c8582860161204a565b925050602061215d8582860161209e565b9150509250929050565b60006020828403121561217957600080fd5b60006121878482850161205f565b91505092915050565b6000602082840312156121a257600080fd5b60006121b084828501612074565b91505092915050565b6000602082840312156121cb57600080fd5b60006121d984828501612089565b91505092915050565b6000602082840312156121f457600080fd5b60006122028482850161209e565b91505092915050565b6000806040838503121561221e57600080fd5b600061222c8582860161209e565b925050602061223d8582860161209e565b9150509250929050565b61225081612546565b82525050565b61225f81612558565b82525050565b61226e81612564565b82525050565b600061227f826123e1565b61228981856123ec565b93506122998185602086016125f2565b6122a28161272d565b840191505092915050565b60006122ba600d836123ec565b91506122c58261273e565b602082019050919050565b6122d98161259a565b82525050565b6122e8816125e0565b82525050565b6122f7816125d6565b82525050565b60006020820190506123126000830184612247565b92915050565b600060208201905061232d6000830184612256565b92915050565b60006020820190506123486000830184612265565b92915050565b600060208201905081810360008301526123688184612274565b905092915050565b60006020820190508181036000830152612389816122ad565b9050919050565b60006020820190506123a560008301846122d0565b92915050565b60006020820190506123c060008301846122df565b92915050565b60006020820190506123db60008301846122ee565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612408826125d6565b9150612413836125d6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612448576124476126a0565b5b828201905092915050565b600061245e826125d6565b9150612469836125d6565b925082612479576124786126cf565b5b828204905092915050565b600061248f826125d6565b915061249a836125d6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156124d3576124d26126a0565b5b828202905092915050565b60006124e98261259a565b91506124f48361259a565b925082821015612507576125066126a0565b5b828203905092915050565b600061251d826125d6565b9150612528836125d6565b92508282101561253b5761253a6126a0565b5b828203905092915050565b6000612551826125b6565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006125eb8261259a565b9050919050565b60005b838110156126105780820151818401526020810190506125f5565b8381111561261f576000848401525b50505050565b6000600282049050600182168061263d57607f821691505b60208210811415612651576126506126fe565b5b50919050565b6000612662826125d6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612695576126946126a0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b61277081612546565b811461277b57600080fd5b50565b61278781612564565b811461279257600080fd5b50565b61279e8161256e565b81146127a957600080fd5b50565b6127b58161259a565b81146127c057600080fd5b50565b6127cc816125d6565b81146127d757600080fd5b5056fea264697066735822122003fb019d7811739c279d137bec1f0186f205087b4b8c8eb9b409d82a0bb92cef64736f6c63430008040033
+\ 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":[],"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"}]
+[{"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":"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/solidity/DemurrageTokenSingleCap.sol b/solidity/DemurrageTokenSingleCap.sol
@@ -6,17 +6,13 @@ contract DemurrageTokenSingleCap {
// Redistribution bit field, with associated shifts and masks
// (Uses sub-byte boundaries)
- bytes32[] public redistributions; // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
+ bytes32[] public redistributions; // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
uint8 constant shiftRedistributionPeriod = 0;
uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1
uint8 constant shiftRedistributionValue = 32;
uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32
- uint8 constant shiftRedistributionParticipants = 104;
- uint256 constant maskRedistributionParticipants = 0x00000000000000000000000000000fffffffff00000000000000000000000000; // ((1 << 36) - 1) << 104
uint8 constant shiftRedistributionDemurrage = 140;
uint256 constant maskRedistributionDemurrage = 0x000000000000000000000000fffff00000000000000000000000000000000000; // ((1 << 20) - 1) << 140
- uint8 constant shiftRedistributionIsFractional = 255;
- uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
// Account balances
mapping (address => uint256) account;
@@ -208,12 +204,11 @@ contract DemurrageTokenSingleCap {
}
// Deserializes the redistribution word
- // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
+ // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) private pure returns(bytes32) {
bytes32 redistribution;
redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage);
- redistribution |= bytes32((_participants << shiftRedistributionParticipants) & maskRedistributionParticipants);
redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue);
redistribution |= bytes32(_period & maskRedistributionPeriod);
return redistribution;
@@ -230,11 +225,6 @@ contract DemurrageTokenSingleCap {
}
// Serializes the number of participants part of the redistribution word
- function toRedistributionParticipants(bytes32 redistribution) public pure returns (uint256) {
- return (uint256(redistribution) & maskRedistributionParticipants) >> shiftRedistributionParticipants;
- }
-
- // Serializes the number of participants part of the redistribution word
function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) {
return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage;
}
@@ -244,23 +234,6 @@ contract DemurrageTokenSingleCap {
return redistributions.length;
}
- // Add number of participants for the current redistribution period by one
- function incrementRedistributionParticipants() private returns (bool) {
- bytes32 currentRedistribution;
- uint256 tmpRedistribution;
- uint256 participants;
-
- currentRedistribution = redistributions[redistributions.length-1];
- participants = toRedistributionParticipants(currentRedistribution) + 1;
- tmpRedistribution = uint256(currentRedistribution);
- tmpRedistribution &= (~maskRedistributionParticipants);
- tmpRedistribution |= ((participants << shiftRedistributionParticipants) & maskRedistributionParticipants);
-
- redistributions[redistributions.length-1] = bytes32(tmpRedistribution);
-
- return true;
- }
-
// Save the current total supply amount to the current redistribution period
function saveRedistributionSupply() private returns (bool) {
uint256 currentRedistribution;
@@ -305,8 +278,6 @@ contract DemurrageTokenSingleCap {
if (truncatedResult < redistributionSupply) {
redistributionPeriod = toRedistributionPeriod(_redistribution); // since we reuse period here, can possibly be optimized by passing period instead
- redistributions[redistributionPeriod-1] &= bytes32(~maskRedistributionParticipants); // just to be safe, zero out all participant count data, in this case there will be only one
- redistributions[redistributionPeriod-1] |= bytes32(maskRedistributionIsFractional | (1 << shiftRedistributionParticipants));
}
increaseBaseBalance(sinkAddress, unit / ppmDivider);
@@ -347,7 +318,6 @@ contract DemurrageTokenSingleCap {
bytes32 currentRedistribution;
bytes32 nextRedistribution;
uint256 currentPeriod;
- uint256 currentParticipants;
uint256 currentDemurrageAmount;
uint256 nextRedistributionDemurrage;
uint256 demurrageCounts;
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -6,17 +6,13 @@ contract DemurrageTokenSingleNocap {
// Redistribution bit field, with associated shifts and masks
// (Uses sub-byte boundaries)
- bytes32[] public redistributions; // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
+ bytes32[] public redistributions; // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
uint8 constant shiftRedistributionPeriod = 0;
uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1
uint8 constant shiftRedistributionValue = 32;
uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32
- uint8 constant shiftRedistributionParticipants = 104;
- uint256 constant maskRedistributionParticipants = 0x00000000000000000000000000000fffffffff00000000000000000000000000; // ((1 << 36) - 1) << 104
uint8 constant shiftRedistributionDemurrage = 140;
uint256 constant maskRedistributionDemurrage = 0x000000000000000000000000fffff00000000000000000000000000000000000; // ((1 << 20) - 1) << 140
- uint8 constant shiftRedistributionIsFractional = 255;
- uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255
// Account balances
mapping (address => uint256) account;
@@ -203,12 +199,11 @@ contract DemurrageTokenSingleNocap {
}
// Deserializes the redistribution word
- // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
+ // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period)
function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) private pure returns(bytes32) {
bytes32 redistribution;
redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage);
- redistribution |= bytes32((_participants << shiftRedistributionParticipants) & maskRedistributionParticipants);
redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue);
redistribution |= bytes32(_period & maskRedistributionPeriod);
return redistribution;
@@ -225,11 +220,6 @@ contract DemurrageTokenSingleNocap {
}
// Serializes the number of participants part of the redistribution word
- function toRedistributionParticipants(bytes32 redistribution) public pure returns (uint256) {
- return (uint256(redistribution) & maskRedistributionParticipants) >> shiftRedistributionParticipants;
- }
-
- // Serializes the number of participants part of the redistribution word
function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) {
return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage;
}
@@ -239,23 +229,6 @@ contract DemurrageTokenSingleNocap {
return redistributions.length;
}
- // Add number of participants for the current redistribution period by one
- function incrementRedistributionParticipants() private returns (bool) {
- bytes32 currentRedistribution;
- uint256 tmpRedistribution;
- uint256 participants;
-
- currentRedistribution = redistributions[redistributions.length-1];
- participants = toRedistributionParticipants(currentRedistribution) + 1;
- tmpRedistribution = uint256(currentRedistribution);
- tmpRedistribution &= (~maskRedistributionParticipants);
- tmpRedistribution |= ((participants << shiftRedistributionParticipants) & maskRedistributionParticipants);
-
- redistributions[redistributions.length-1] = bytes32(tmpRedistribution);
-
- return true;
- }
-
// Save the current total supply amount to the current redistribution period
function saveRedistributionSupply() private returns (bool) {
uint256 currentRedistribution;
@@ -300,8 +273,6 @@ contract DemurrageTokenSingleNocap {
if (truncatedResult < redistributionSupply) {
redistributionPeriod = toRedistributionPeriod(_redistribution); // since we reuse period here, can possibly be optimized by passing period instead
- redistributions[redistributionPeriod-1] &= bytes32(~maskRedistributionParticipants); // just to be safe, zero out all participant count data, in this case there will be only one
- redistributions[redistributionPeriod-1] |= bytes32(maskRedistributionIsFractional | (1 << shiftRedistributionParticipants));
}
increaseBaseBalance(sinkAddress, unit / ppmDivider);
@@ -342,7 +313,6 @@ contract DemurrageTokenSingleNocap {
bytes32 currentRedistribution;
bytes32 nextRedistribution;
uint256 currentPeriod;
- uint256 currentParticipants;
uint256 currentDemurrageAmount;
uint256 nextRedistributionDemurrage;
uint256 demurrageCounts;