erc20-demurrage-token

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

commit 1de39b90cfc88f38ad7cc95108614400e5aed8ad
parent e2ecc6d38288902b21c28f036621a14b1ce54b6b
Author: Louis Holbrook <accounts-gitlab@holbrook.no>
Date:   Thu,  6 May 2021 08:35:58 +0000

Lash/clean and doc

Diffstat:
A.gitignore | 8++++++++
Mpython/requirements.txt | 5+++--
Apython/sarafu_token/__init__.py | 1+
Mpython/sarafu_token/data/RedistributedDemurrageToken.bin | 4++--
Mpython/sarafu_token/data/RedistributedDemurrageToken.json | 2+-
Apython/sarafu_token/data/__init__.py | 3+++
Apython/sarafu_token/runnable/deploy.py | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apython/sarafu_token/token.py | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpython/setup.cfg | 12++++++------
Mpython/setup.py | 21+++++++++++++++++++++
Apython/test_requirements.txt | 3+++
Msolidity/RedistributedDemurrageToken.sol | 48+++++++++++++++++++++++++++++++++++++++++++++---
12 files changed, 315 insertions(+), 14 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,8 @@ +build/ +dist/ +*.egg-info +__pycache__ +*.pyc +gmon.out +solidity/*.json +solidity/*.bin diff --git a/python/requirements.txt b/python/requirements.txt @@ -1,2 +1,3 @@ -chainlib~=0.0.1a7 -crypto-dev-signer~=0.4.13rc2 +chainlib~=0.0.3a1 +eth-erc20~=0.0.9a1 +crypto-dev-signer~=0.4.14b3 diff --git a/python/sarafu_token/__init__.py b/python/sarafu_token/__init__.py @@ -0,0 +1 @@ +from .token import RedistributedDemurrageToken diff --git a/python/sarafu_token/data/RedistributedDemurrageToken.bin b/python/sarafu_token/data/RedistributedDemurrageToken.bin @@ -1 +1 @@ -60e06040523480156200001157600080fd5b506040516200378b3803806200378b83398181016040528101906200003791906200048e565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160096000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600490805190602001906200010a92919062000327565b5084600590805190602001906200012392919062000327565b508360ff166006819055504260808181525050603c8262000145919062000755565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b919062000755565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a62000288919062000618565b6008819055505050505050505062000955565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b828054620003359062000837565b90600052602060002090601f016020900481019282620003595760008555620003a5565b82601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6000620003ee620003e8846200058a565b62000556565b9050828152602081018484840111156200040757600080fd5b6200041484828562000801565b509392505050565b6000815190506200042d8162000907565b92915050565b600082601f8301126200044557600080fd5b815162000457848260208601620003d7565b91505092915050565b600081519050620004718162000921565b92915050565b60008151905062000488816200093b565b92915050565b60008060008060008060c08789031215620004a857600080fd5b600087015167ffffffffffffffff811115620004c357600080fd5b620004d189828a0162000433565b965050602087015167ffffffffffffffff811115620004ef57600080fd5b620004fd89828a0162000433565b95505060406200051089828a0162000477565b94505060606200052389828a0162000460565b93505060806200053689828a0162000460565b92505060a06200054989828a016200041c565b9150509295509295509295565b6000604051905081810181811067ffffffffffffffff8211171562000580576200057f620008cb565b5b8060405250919050565b600067ffffffffffffffff821115620005a857620005a7620008cb565b5b601f19601f8301169050602081019050919050565b6000808291508390505b60018511156200060f57808604811115620005e757620005e66200086d565b5b6001851615620005f75780820291505b80810290506200060785620008fa565b9450620005c7565b94509492505050565b60006200062582620007ea565b91506200063283620007ea565b9250620006617fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000669565b905092915050565b6000826200067b57600190506200074e565b816200068b57600090506200074e565b8160018114620006a45760028114620006af57620006e5565b60019150506200074e565b60ff841115620006c457620006c36200086d565b5b8360020a915084821115620006de57620006dd6200086d565b5b506200074e565b5060208310610133831016604e8410600b84101617156200071f5782820a9050838111156200071957620007186200086d565b5b6200074e565b6200072e8484846001620005bd565b925090508184048111156200074857620007476200086d565b5b81810290505b9392505050565b60006200076282620007ea565b91506200076f83620007ea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007ab57620007aa6200086d565b5b828202905092915050565b6000620007c382620007ca565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156200082157808201518184015260208101905062000804565b8381111562000831576000848401525b50505050565b600060028204905060018216806200085057607f821691505b602082108114156200086757620008666200089c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000600282049050919050565b6200091281620007b6565b81146200091e57600080fd5b50565b6200092c81620007ea565b81146200093857600080fd5b50565b6200094681620007f4565b81146200095257600080fd5b50565b60805160a05160c051612dc7620009c460003960008181610a5e01528181610cb901528181610e4a015281816119b301528181611f930152611fcb01526000818161112d015281816119610152611a4e01526000818161115901528181611a6f0152611ab40152612dc76000f3fe608060405234801561001057600080fd5b5060043610610239576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be11610142578063983b2d56116100ca578063b470aade11610099578063b470aade14610736578063e3ab207a14610754578063e54d63f714610784578063e8095295146107b4578063eda4e6d6146107d257610239565b8063983b2d56146106885780639da7d8ba146106b8578063a2119e2f146106e8578063a9059cbb1461070657610239565b806370a082311161011157806370a08231146105e0578063731f237c146106105780638da5cb5b1461062e5780638f1df6bc1461064c57806395d89b411461066a57610239565b80636787a9be146105205780636a2d094e146105505780636d5055a6146105805780636ffa8a05146105b057610239565b806331333487116101c557806340fc89f51161019457806340fc89f514610442578063449a52f81461047257806347a50517146104a25780634abfbba2146104d2578063573cc5071461050257610239565b80633133348714610394578063313ce567146103c457806335b16eb8146103e257806340452d911461041257610239565b80631989c6a81161020c5780631989c6a8146102c8578063216ea5ec146102e6578063229ba1971461031657806323b872dd146103345780633092afd51461036457610239565b806306fdde031461023e578063095ea7b31461025c57806309f28f3c1461028c57806318160ddd146102aa575b600080fd5b6102466107f0565b6040516102539190612931565b60405180910390f35b6102766004803603810190610271919061269a565b61087e565b60405161028391906128fb565b60405180910390f35b6102946109a2565b6040516102a191906129b3565b60405180910390f35b6102b26109c4565b6040516102bf91906129e9565b60405180910390f35b6102d06109ca565b6040516102dd91906129e9565b60405180910390f35b61030060048036038101906102fb9190612751565b6109d6565b60405161030d91906129e9565b60405180910390f35b61031e610a5c565b60405161032b91906129e9565b60405180910390f35b61034e6004803603810190610349919061264b565b610a80565b60405161035b91906128fb565b60405180910390f35b61037e60048036038101906103799190612622565b610baa565b60405161038b91906128fb565b60405180910390f35b6103ae60048036038101906103a99190612751565b610c9d565b6040516103bb91906129e9565b60405180910390f35b6103cc610d4e565b6040516103d991906129e9565b60405180910390f35b6103fc60048036038101906103f79190612622565b610d54565b60405161040991906128fb565b60405180910390f35b61042c60048036038101906104279190612728565b610f7a565b6040516104399190612916565b60405180910390f35b61045c600480360381019061045791906126d6565b610f9e565b60405161046991906129e9565b60405180910390f35b61048c6004803603810190610487919061269a565b610fcf565b60405161049991906128fb565b60405180910390f35b6104bc60048036038101906104b79190612622565b6110d1565b6040516104c991906129e9565b60405180910390f35b6104ec60048036038101906104e79190612728565b611129565b6040516104f991906129e9565b60405180910390f35b61050a611189565b60405161051791906129e9565b60405180910390f35b61053a60048036038101906105359190612728565b61118f565b60405161054791906129e9565b60405180910390f35b61056a60048036038101906105659190612728565b6111fb565b60405161057791906129e9565b60405180910390f35b61059a60048036038101906105959190612622565b61121c565b6040516105a791906129e9565b60405180910390f35b6105ca60048036038101906105c591906126d6565b611287565b6040516105d791906129e9565b60405180910390f35b6105fa60048036038101906105f59190612622565b6112ba565b60405161060791906129e9565b60405180910390f35b61061861139b565b60405161062591906128fb565b60405180910390f35b610636611549565b60405161064391906128e0565b60405180910390f35b61065461156f565b60405161066191906128fb565b60405180910390f35b610672611726565b60405161067f9190612931565b60405180910390f35b6106a2600480360381019061069d9190612622565b6117b4565b6040516106af91906128fb565b60405180910390f35b6106d260048036038101906106cd91906126d6565b611871565b6040516106df91906129e9565b60405180910390f35b6106f061189d565b6040516106fd91906129b3565b60405180910390f35b610720600480360381019061071b919061269a565b6118bf565b60405161072d91906128fb565b60405180910390f35b61073e61195f565b60405161074b91906129e9565b60405180910390f35b61076e600480360381019061076991906126d6565b611983565b60405161077b91906129e9565b60405180910390f35b61079e60048036038101906107999190612751565b611997565b6040516107ab91906129e9565b60405180910390f35b6107bc611a48565b6040516107c991906129b3565b60405180910390f35b6107da611ab2565b6040516107e791906129e9565b60405180910390f35b600480546107fd90612c1c565b80601f016020809104026020016040519081016040528092919081815260200182805461082990612c1c565b80156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505050505081565b60008061088961156f565b5061089333610d54565b5061089d8361118f565b905080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461092b9190612a20565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161098f91906129e9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60075481565b60008080549050905090565b600080600080851415610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1590612953565b60405180910390fd5b838510610a2a57600080fd5b8484610a369190612a76565b91508482610a449190612aa7565b90508084610a529190612b35565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610a8d61156f565b50610a9733610d54565b50610aa18461118f565b915081600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b2c57600080fd5b610b37868684611ad6565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610b9691906129e9565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c3357503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610c3c57600080fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610ce29190612a76565b905060005b84811015610d2957620f42408284610cff9190612aa7565b610d099190612a76565b83610d149190612b35565b92508080610d2190612c4e565b915050610ce7565b50620f42408583610d3a9190612aa7565b610d449190612a76565b9250505092915050565b60065481565b600080600080600080600080610d698961121c565b91506000821480610d935750610d7d611a48565b6fffffffffffffffffffffffffffffffff168210155b15610da8576000975050505050505050610f75565b6000600183610db79190612b35565b81548110610dee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549650610e0487610f9e565b94506000851415610e1f576000975050505050505050610f75565b610e2887611871565b9550610e3387611287565b90506d04ee2d6d415b85acef8100000000620f42407f0000000000000000000000000000000000000000000000000000000000000000610e739190612a76565b8688610e7f9190612a76565b610e899190612aa7565b610e939190612a76565b9350620f42408185610ea59190612aa7565b610eaf9190612a76565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541692505081905550610f198984611b7a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d385604051610f6191906129e9565b60405180910390a360019750505050505050505b919050565b60008181548110610f8a57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661102857600080fd5b61103061156f565b5082905082600760008282546110469190612a20565b925050819055506110578482611b7a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110b591906129e9565b60405180910390a36110c5611cd6565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111579190612aa7565b7f00000000000000000000000000000000000000000000000000000000000000006111829190612a20565b9050919050565b60085481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846111e09190612aa7565b6111ea9190612aa7565b6111f49190612a76565b9050919050565b6000603c824261120b9190612b35565b6112159190612a76565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806112c9856110d1565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff166112f2611a48565b6112fc9190612b01565b6fffffffffffffffffffffffffffffffff16905061134a600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610c9d565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061137b9190612aa7565b82846113879190612aa7565b6113919190612a76565b9350505050919050565b60008060008060006113ab611a48565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846113d79190612b01565b92506000836fffffffffffffffffffffffffffffffff161415611401576000945050505050611546565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061145082846fffffffffffffffffffffffffffffffff16610c9d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161153591906129ce565b60405180910390a460019450505050505b90565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611588611dbe565b995060006001028a14156115a95760009a5050505050505050505050611723565b6115b28a611983565b97506001886115c19190612a20565b90506115cc88611129565b91506115d661139b565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611613826111fb565b92506000831115611648576d04ee2d6d415b85acef81000000006116378685611997565b6116419190612a76565b9350611665565b6d04ee2d6d415b85acef8100000000856116629190612a76565b93505b61167460008560075484611eee565b985060008990806001815401808255809150506001900390600052602060002001600090919091909150556116a88a610f9e565b965060008714156116c3576116bc8a611f7a565b95506116dd565b6116cf876007546109d6565b95506116db868961216d565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161170c91906129e9565b60405180910390a160019a50505050505050505050505b90565b6005805461173390612c1c565b80601f016020809104026020016040519081016040528092919081815260200182805461175f90612c1c565b80156117ac5780601f10611781576101008083540402835291602001916117ac565b820191906000526020600020905b81548152906001019060200180831161178f57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461181057600080fd5b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060006118cc61156f565b506118d633610d54565b506118e08461118f565b91506118ed338684611ad6565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161194c91906129e9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f00000000000000000000000000000000000000000000000000000000000000006119dc9190612a76565b905060005b84811015611a2357620f424082846119f99190612aa7565b611a039190612a76565b83611a0e9190612a20565b92508080611a1b90612c4e565b9150506119e1565b50620f42408583611a349190612aa7565b611a3e9190612a76565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611a999190612b35565b611aa39190612a76565b611aad9190612a20565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080611ae385846122a3565b50611aee8484611b7a565b50611af7611a48565b6fffffffffffffffffffffffffffffffff1690506008548310158015611b25575080611b228661121c565b14155b8015611b5d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611b6e57611b6c85826123d4565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415611bdb5760009350505050611cd0565b611be4866110d1565b92508483611bf29190612a20565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990612993565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60008060006001600080549050611ced9190612b35565b81548110611d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166007549060020a02811790508060010260006001600080549050611d719190612b35565b81548110611da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b6000806000806001600080549050611dd69190612b35565b81548110611e0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611e7c57600080fd5b505afa158015611e90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb491906126ff565b6fffffffffffffffffffffffffffffffff169050611ed182611983565b8111611ee557600060010292505050611eeb565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000806000806000611f8b86611871565b9350620f42407f000000000000000000000000000000000000000000000000000000000000000085611fbd9190612aa7565b611fc79190612a76565b91507f0000000000000000000000000000000000000000000000000000000000000000620f424083611ff99190612aa7565b6120039190612a76565b90508381101561211b5761201686611983565b9250710fffffffff0000000000000000000000000019600102600060018561203e9190612b35565b81548110612075577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856120cc9190612b35565b81548110612103577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b612160600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461215b9190612a76565b611b7a565b5081945050505050919050565b600080600084141561218357600091505061229d565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856121b69190612b35565b815481106121ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016000828254179250508190555061225d60006001856122169190612b35565b8154811061224d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154611871565b9050612296600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836122919190612b35565b611b7a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085141561230457600093505050506123ce565b61230d866110d1565b925084831015612352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234990612973565b60405180910390fd5b848361235e9190612b35565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825417925050819055506124a56124b0565b506001905092915050565b600080600080600060016000805490506124ca9190612b35565b81548110612501577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549250600161251984610f9e565b6125239190612a20565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a021682179150816001026000600160008054905061257f9190612b35565b815481106125b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001935050505090565b6000813590506125dd81612d35565b92915050565b6000813590506125f281612d4c565b92915050565b60008151905061260781612d63565b92915050565b60008135905061261c81612d7a565b92915050565b60006020828403121561263457600080fd5b6000612642848285016125ce565b91505092915050565b60008060006060848603121561266057600080fd5b600061266e868287016125ce565b935050602061267f868287016125ce565b92505060406126908682870161260d565b9150509250925092565b600080604083850312156126ad57600080fd5b60006126bb858286016125ce565b92505060206126cc8582860161260d565b9150509250929050565b6000602082840312156126e857600080fd5b60006126f6848285016125e3565b91505092915050565b60006020828403121561271157600080fd5b600061271f848285016125f8565b91505092915050565b60006020828403121561273a57600080fd5b60006127488482850161260d565b91505092915050565b6000806040838503121561276457600080fd5b60006127728582860161260d565b92505060206127838582860161260d565b9150509250929050565b61279681612b69565b82525050565b6127a581612b7b565b82525050565b6127b481612b87565b82525050565b60006127c582612a04565b6127cf8185612a0f565b93506127df818560208601612be9565b6127e881612d24565b840191505092915050565b6000612800601183612a0f565b91507f4552525f4e554d50415254535f5a45524f0000000000000000000000000000006000830152602082019050919050565b6000612840600d83612a0f565b91507f4552525f4f5645525350454e44000000000000000000000000000000000000006000830152602082019050919050565b6000612880600d83612a0f565b91507f4552525f574f554c4457524150000000000000000000000000000000000000006000830152602082019050919050565b6128bc81612b91565b82525050565b6128cb81612bd7565b82525050565b6128da81612bcd565b82525050565b60006020820190506128f5600083018461278d565b92915050565b6000602082019050612910600083018461279c565b92915050565b600060208201905061292b60008301846127ab565b92915050565b6000602082019050818103600083015261294b81846127ba565b905092915050565b6000602082019050818103600083015261296c816127f3565b9050919050565b6000602082019050818103600083015261298c81612833565b9050919050565b600060208201905081810360008301526129ac81612873565b9050919050565b60006020820190506129c860008301846128b3565b92915050565b60006020820190506129e360008301846128c2565b92915050565b60006020820190506129fe60008301846128d1565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612a2b82612bcd565b9150612a3683612bcd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a6b57612a6a612c97565b5b828201905092915050565b6000612a8182612bcd565b9150612a8c83612bcd565b925082612a9c57612a9b612cc6565b5b828204905092915050565b6000612ab282612bcd565b9150612abd83612bcd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612af657612af5612c97565b5b828202905092915050565b6000612b0c82612b91565b9150612b1783612b91565b925082821015612b2a57612b29612c97565b5b828203905092915050565b6000612b4082612bcd565b9150612b4b83612bcd565b925082821015612b5e57612b5d612c97565b5b828203905092915050565b6000612b7482612bad565b9050919050565b60008115159050919050565b6000819050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612be282612b91565b9050919050565b60005b83811015612c07578082015181840152602081019050612bec565b83811115612c16576000848401525b50505050565b60006002820490506001821680612c3457607f821691505b60208210811415612c4857612c47612cf5565b5b50919050565b6000612c5982612bcd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c8c57612c8b612c97565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b612d3e81612b69565b8114612d4957600080fd5b50565b612d5581612b87565b8114612d6057600080fd5b50565b612d6c81612b91565b8114612d7757600080fd5b50565b612d8381612bcd565b8114612d8e57600080fd5b5056fea2646970667358221220b4c34b9cd5c1cacc7f5e09ec217e773c17e22b48789448982411cb74ec27c10864736f6c63430008000033 -\ No newline at end of file +60e06040523480156200001157600080fd5b5060405162003d0238038062003d0283398181016040528101906200003791906200048e565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590805190602001906200010a92919062000327565b5084600690805190602001906200012392919062000327565b508360ff166007819055504260808181525050603c826200014591906200074d565b60a08181525050620f42406d04ee2d6d415b85acef81000000006200016b91906200074d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260c0818152505060006200020a6000620f4240600060016200029b640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a62000288919062000610565b6009819055505050505050505062000994565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b82805462000335906200082f565b90600052602060002090601f016020900481019282620003595760008555620003a5565b82601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6000620003ee620003e8846200057f565b62000556565b9050828152602081018484840111156200040757600080fd5b62000414848285620007f9565b509392505050565b6000815190506200042d8162000946565b92915050565b600082601f8301126200044557600080fd5b815162000457848260208601620003d7565b91505092915050565b600081519050620004718162000960565b92915050565b60008151905062000488816200097a565b92915050565b60008060008060008060c08789031215620004a857600080fd5b600087015167ffffffffffffffff811115620004c357600080fd5b620004d189828a0162000433565b965050602087015167ffffffffffffffff811115620004ef57600080fd5b620004fd89828a0162000433565b95505060406200051089828a0162000477565b94505060606200052389828a0162000460565b93505060806200053689828a0162000460565b92505060a06200054989828a016200041c565b9150509295509295509295565b60006200056262000575565b905062000570828262000865565b919050565b6000604051905090565b600067ffffffffffffffff8211156200059d576200059c620008f9565b5b620005a88262000928565b9050602081019050919050565b6000808291508390505b60018511156200060757808604811115620005df57620005de6200089b565b5b6001851615620005ef5780820291505b8081029050620005ff8562000939565b9450620005bf565b94509492505050565b60006200061d82620007e2565b91506200062a83620007e2565b9250620006597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000661565b905092915050565b60008262000673576001905062000746565b8162000683576000905062000746565b81600181146200069c5760028114620006a757620006dd565b600191505062000746565b60ff841115620006bc57620006bb6200089b565b5b8360020a915084821115620006d657620006d56200089b565b5b5062000746565b5060208310610133831016604e8410600b8410161715620007175782820a9050838111156200071157620007106200089b565b5b62000746565b620007268484846001620005b5565b9250905081840481111562000740576200073f6200089b565b5b81810290505b9392505050565b60006200075a82620007e2565b91506200076783620007e2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a357620007a26200089b565b5b828202905092915050565b6000620007bb82620007c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000819578082015181840152602081019050620007fc565b8381111562000829576000848401525b50505050565b600060028204905060018216806200084857607f821691505b602082108114156200085f576200085e620008ca565b5b50919050565b620008708262000928565b810181811067ffffffffffffffff82111715620008925762000891620008f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6000600282049050919050565b6200095181620007ae565b81146200095d57600080fd5b50565b6200096b81620007e2565b81146200097757600080fd5b50565b6200098581620007ec565b81146200099157600080fd5b50565b60805160a05160c0516132ff62000a0360003960008181610ca801528181610f030152818161109401528181611da401528181612426015261245e01526000818161137701528181611d520152611e3f0152600081816113a301528181611e600152611ea501526132ff6000f3fe608060405234801561001057600080fd5b506004361061025a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be11610158578063983b2d56116100d5578063e3ab207a11610099578063e3ab207a146107c3578063e54d63f7146107f3578063e809529514610823578063eda4e6d614610841578063f2fde38b1461085f5761025a565b8063983b2d56146106f75780639da7d8ba14610727578063a2119e2f14610757578063a9059cbb14610775578063b470aade146107a55761025a565b8063731f237c1161011c578063731f237c1461066157806379ba50971461067f5780638da5cb5b1461069d5780638f1df6bc146106bb57806395d89b41146106d95761025a565b80636787a9be146105715780636a2d094e146105a15780636d5055a6146105d15780636ffa8a051461060157806370a08231146106315761025a565b80633092afd5116101e657806340fc89f5116101aa57806340fc89f514610493578063449a52f8146104c357806347a50517146104f35780634abfbba214610523578063573cc507146105535761025a565b80633092afd5146103b557806331333487146103e5578063313ce5671461041557806335b16eb81461043357806340452d91146104635761025a565b806318160ddd1161022d57806318160ddd146102fb5780631989c6a814610319578063216ea5ec14610337578063229ba1971461036757806323b872dd146103855761025a565b806301ffc9a71461025f57806306fdde031461028f578063095ea7b3146102ad57806309f28f3c146102dd575b600080fd5b61027960048036038101906102749190612ba7565b61088f565b6040516102869190612d75565b60405180910390f35b610297610a3a565b6040516102a49190612dab565b60405180910390f35b6102c760048036038101906102c29190612b42565b610ac8565b6040516102d49190612d75565b60405180910390f35b6102e5610bec565b6040516102f29190612e2d565b60405180910390f35b610303610c0e565b6040516103109190612e63565b60405180910390f35b610321610c14565b60405161032e9190612e63565b60405180910390f35b610351600480360381019061034c9190612c22565b610c20565b60405161035e9190612e63565b60405180910390f35b61036f610ca6565b60405161037c9190612e63565b60405180910390f35b61039f600480360381019061039a9190612af3565b610cca565b6040516103ac9190612d75565b60405180910390f35b6103cf60048036038101906103ca9190612aca565b610df4565b6040516103dc9190612d75565b60405180910390f35b6103ff60048036038101906103fa9190612c22565b610ee7565b60405161040c9190612e63565b60405180910390f35b61041d610f98565b60405161042a9190612e63565b60405180910390f35b61044d60048036038101906104489190612aca565b610f9e565b60405161045a9190612d75565b60405180910390f35b61047d60048036038101906104789190612bf9565b6111c4565b60405161048a9190612d90565b60405180910390f35b6104ad60048036038101906104a89190612b7e565b6111e8565b6040516104ba9190612e63565b60405180910390f35b6104dd60048036038101906104d89190612b42565b611219565b6040516104ea9190612d75565b60405180910390f35b61050d60048036038101906105089190612aca565b61131b565b60405161051a9190612e63565b60405180910390f35b61053d60048036038101906105389190612bf9565b611373565b60405161054a9190612e63565b60405180910390f35b61055b6113d3565b6040516105689190612e63565b60405180910390f35b61058b60048036038101906105869190612bf9565b6113d9565b6040516105989190612e63565b60405180910390f35b6105bb60048036038101906105b69190612bf9565b611445565b6040516105c89190612e63565b60405180910390f35b6105eb60048036038101906105e69190612aca565b611466565b6040516105f89190612e63565b60405180910390f35b61061b60048036038101906106169190612b7e565b6114d1565b6040516106289190612e63565b60405180910390f35b61064b60048036038101906106469190612aca565b611504565b6040516106589190612e63565b60405180910390f35b6106696115e5565b6040516106769190612d75565b60405180910390f35b610687611793565b6040516106949190612d75565b60405180910390f35b6106a561193a565b6040516106b29190612d5a565b60405180910390f35b6106c3611960565b6040516106d09190612d75565b60405180910390f35b6106e1611b17565b6040516106ee9190612dab565b60405180910390f35b610711600480360381019061070c9190612aca565b611ba5565b60405161071e9190612d75565b60405180910390f35b610741600480360381019061073c9190612b7e565b611c62565b60405161074e9190612e63565b60405180910390f35b61075f611c8e565b60405161076c9190612e2d565b60405180910390f35b61078f600480360381019061078a9190612b42565b611cb0565b60405161079c9190612d75565b60405180910390f35b6107ad611d50565b6040516107ba9190612e63565b60405180910390f35b6107dd60048036038101906107d89190612b7e565b611d74565b6040516107ea9190612e63565b60405180910390f35b61080d60048036038101906108089190612c22565b611d88565b60405161081a9190612e63565b60405180910390f35b61082b611e39565b6040516108389190612e2d565b60405180910390f35b610849611ea3565b6040516108569190612e63565b60405180910390f35b61087960048036038101906108749190612aca565b611ec7565b6040516108869190612d75565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156108e45760019050610a35565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109375760019050610a35565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561098a5760019050610a35565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109dd5760019050610a35565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a305760019050610a35565b600090505b919050565b60058054610a47906130c2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a73906130c2565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081565b600080610ad3611960565b50610add33610f9e565b50610ae7836113d9565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b759190612e9a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bd99190612e63565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5f90612dcd565b60405180910390fd5b838510610c7457600080fd5b8484610c809190612ef0565b91508482610c8e9190612f21565b90508084610c9c9190612faf565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cd7611960565b50610ce133610f9e565b50610ceb846113d9565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d7657600080fd5b610d81868684611f69565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610de09190612e63565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e7d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e8657600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f2c9190612ef0565b905060005b84811015610f7357620f42408284610f499190612f21565b610f539190612ef0565b83610f5e9190612faf565b92508080610f6b906130f4565b915050610f31565b50620f42408583610f849190612f21565b610f8e9190612ef0565b9250505092915050565b60075481565b600080600080600080600080610fb389611466565b91506000821480610fdd5750610fc7611e39565b6fffffffffffffffffffffffffffffffff168210155b15610ff25760009750505050505050506111bf565b60006001836110019190612faf565b81548110611038577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154965061104e876111e8565b945060008514156110695760009750505050505050506111bf565b61107287611c62565b955061107d876114d1565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110bd9190612ef0565b86886110c99190612ef0565b6110d39190612f21565b6110dd9190612ef0565b9350620f424081856110ef9190612f21565b6110f99190612ef0565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541692505081905550611163898461200d565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111ab9190612e63565b60405180910390a360019750505050505050505b919050565b600081815481106111d457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661127257600080fd5b61127a611960565b5082905082600860008282546112909190612e9a565b925050819055506112a1848261200d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112ff9190612e63565b60405180910390a361130f612169565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826113a19190612f21565b7f00000000000000000000000000000000000000000000000000000000000000006113cc9190612e9a565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461142a9190612f21565b6114349190612f21565b61143e9190612ef0565b9050919050565b6000603c82426114559190612faf565b61145f9190612ef0565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115138561131b565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff1661153c611e39565b6115469190612f7b565b6fffffffffffffffffffffffffffffffff169050611594600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610ee7565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c59190612f21565b82846115d19190612f21565b6115db9190612ef0565b9350505050919050565b60008060008060006115f5611e39565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff16846116219190612f7b565b92506000836fffffffffffffffffffffffffffffffff16141561164b576000945050505050611790565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169a82846fffffffffffffffffffffffffffffffff16610ee7565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177f9190612e48565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117f057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611979612251565b995060006001028a141561199a5760009a5050505050505050505050611b14565b6119a38a611d74565b97506001886119b29190612e9a565b90506119bd88611373565b91506119c76115e5565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611a0482611445565b92506000831115611a39576d04ee2d6d415b85acef8100000000611a288685611d88565b611a329190612ef0565b9350611a56565b6d04ee2d6d415b85acef810000000085611a539190612ef0565b93505b611a6560008560085484612381565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a998a6111e8565b96506000871415611ab457611aad8a61240d565b9550611ace565b611ac087600854610c20565b9550611acc8689612600565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611afd9190612e63565b60405180910390a160019a50505050505050505050505b90565b60068054611b24906130c2565b80601f0160208091040260200160405190810160405280929190818152602001828054611b50906130c2565b8015611b9d5780601f10611b7257610100808354040283529160200191611b9d565b820191906000526020600020905b815481529060010190602001808311611b8057829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0157600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cbd611960565b50611cc733610f9e565b50611cd1846113d9565b9150611cde338684611f69565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d3d9190612e63565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dcd9190612ef0565b905060005b84811015611e1457620f42408284611dea9190612f21565b611df49190612ef0565b83611dff9190612e9a565b92508080611e0c906130f4565b915050611dd2565b50620f42408583611e259190612f21565b611e2f9190612ef0565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e8a9190612faf565b611e949190612ef0565b611e9e9190612e9a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f2357600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f768584612736565b50611f81848461200d565b50611f8a611e39565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fb8575080611fb586611466565b14155b8015611ff057508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561200157611fff8582612867565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085141561206e5760009350505050612163565b6120778661131b565b925084836120859190612e9a565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90612e0d565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121809190612faf565b815481106121b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506122049190612faf565b8154811061223b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600191505090565b60008060008060016000805490506122699190612faf565b815481106122a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190612bd0565b6fffffffffffffffffffffffffffffffff16905061236482611d74565b81116123785760006001029250505061237e565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061241e86611c62565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856124509190612f21565b61245a9190612ef0565b91507f0000000000000000000000000000000000000000000000000000000000000000620f42408361248c9190612f21565b6124969190612ef0565b9050838110156125ae576124a986611d74565b9250710fffffffff000000000000000000000000001960010260006001856124d19190612faf565b81548110612508577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f800000000000000000000000000000000000000000000000000000000000000017600102600060018561255f9190612faf565b81548110612596577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055505b6125f3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125ee9190612ef0565b61200d565b5081945050505050919050565b6000806000841415612616576000915050612730565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856126499190612faf565b81548110612680577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001600082825417925050819055506126f060006001856126a99190612faf565b815481106126e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154611c62565b9050612729600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836127249190612faf565b61200d565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156127975760009350505050612861565b6127a08661131b565b9250848310156127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90612ded565b60405180910390fd5b84836127f19190612faf565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612938612943565b506001905092915050565b6000806000806000600160008054905061295d9190612faf565b81548110612994577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154925060016129ac846111e8565b6129b69190612e9a565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a0216821791508160010260006001600080549050612a129190612faf565b81548110612a49577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001935050505090565b600081359050612a7081613256565b92915050565b600081359050612a858161326d565b92915050565b600081359050612a9a81613284565b92915050565b600081519050612aaf8161329b565b92915050565b600081359050612ac4816132b2565b92915050565b600060208284031215612adc57600080fd5b6000612aea84828501612a61565b91505092915050565b600080600060608486031215612b0857600080fd5b6000612b1686828701612a61565b9350506020612b2786828701612a61565b9250506040612b3886828701612ab5565b9150509250925092565b60008060408385031215612b5557600080fd5b6000612b6385828601612a61565b9250506020612b7485828601612ab5565b9150509250929050565b600060208284031215612b9057600080fd5b6000612b9e84828501612a76565b91505092915050565b600060208284031215612bb957600080fd5b6000612bc784828501612a8b565b91505092915050565b600060208284031215612be257600080fd5b6000612bf084828501612aa0565b91505092915050565b600060208284031215612c0b57600080fd5b6000612c1984828501612ab5565b91505092915050565b60008060408385031215612c3557600080fd5b6000612c4385828601612ab5565b9250506020612c5485828601612ab5565b9150509250929050565b612c6781612fe3565b82525050565b612c7681612ff5565b82525050565b612c8581613001565b82525050565b6000612c9682612e7e565b612ca08185612e89565b9350612cb081856020860161308f565b612cb9816131ca565b840191505092915050565b6000612cd1601183612e89565b9150612cdc826131db565b602082019050919050565b6000612cf4600d83612e89565b9150612cff82613204565b602082019050919050565b6000612d17600d83612e89565b9150612d228261322d565b602082019050919050565b612d3681613037565b82525050565b612d458161307d565b82525050565b612d5481613073565b82525050565b6000602082019050612d6f6000830184612c5e565b92915050565b6000602082019050612d8a6000830184612c6d565b92915050565b6000602082019050612da56000830184612c7c565b92915050565b60006020820190508181036000830152612dc58184612c8b565b905092915050565b60006020820190508181036000830152612de681612cc4565b9050919050565b60006020820190508181036000830152612e0681612ce7565b9050919050565b60006020820190508181036000830152612e2681612d0a565b9050919050565b6000602082019050612e426000830184612d2d565b92915050565b6000602082019050612e5d6000830184612d3c565b92915050565b6000602082019050612e786000830184612d4b565b92915050565b600081519050919050565b600082825260208201905092915050565b6000612ea582613073565b9150612eb083613073565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ee557612ee461313d565b5b828201905092915050565b6000612efb82613073565b9150612f0683613073565b925082612f1657612f1561316c565b5b828204905092915050565b6000612f2c82613073565b9150612f3783613073565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7057612f6f61313d565b5b828202905092915050565b6000612f8682613037565b9150612f9183613037565b925082821015612fa457612fa361313d565b5b828203905092915050565b6000612fba82613073565b9150612fc583613073565b925082821015612fd857612fd761313d565b5b828203905092915050565b6000612fee82613053565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061308882613037565b9050919050565b60005b838110156130ad578082015181840152602081019050613092565b838111156130bc576000848401525b50505050565b600060028204905060018216806130da57607f821691505b602082108114156130ee576130ed61319b565b5b50919050565b60006130ff82613073565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131325761313161313d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b61325f81612fe3565b811461326a57600080fd5b50565b61327681613001565b811461328157600080fd5b50565b61328d8161300b565b811461329857600080fd5b50565b6132a481613037565b81146132af57600080fd5b50565b6132bb81613073565b81146132c657600080fd5b5056fea2646970667358221220879798a75c029f2a28b60631c811b9abb056ffb11a13cc36e1f321111ab2405a64736f6c63430008030033 +\ No newline at end of file diff --git a/python/sarafu_token/data/RedistributedDemurrageToken.json b/python/sarafu_token/data/RedistributedDemurrageToken.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":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":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"applyRedistributionOnAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurragePeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numParts","type":"uint256"},{"internalType":"uint256","name":"_sumWhole","type":"uint256"}],"name":"remainder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint256","name":"_taxLevelMinute","type":"uint256"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"accountPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"applyRedistributionOnAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurragePeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numParts","type":"uint256"},{"internalType":"uint256","name":"_sumWhole","type":"uint256"}],"name":"remainder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionParticipants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/sarafu_token/data/__init__.py b/python/sarafu_token/data/__init__.py @@ -0,0 +1,3 @@ +import os + +data_dir = os.path.realpath(os.path.dirname(__file__)) diff --git a/python/sarafu_token/runnable/deploy.py b/python/sarafu_token/runnable/deploy.py @@ -0,0 +1,135 @@ +"""Deploy sarafu token + +.. moduleauthor:: Louis Holbrook <dev@holbrook.no> +.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 + +""" + +# standard imports +import sys +import os +import json +import argparse +import logging + +# third-party imports +from crypto_dev_signer.eth.signer import ReferenceSigner as EIP155Signer +from crypto_dev_signer.keystore.dict import DictKeystore +from chainlib.chain import ChainSpec +from chainlib.eth.nonce import ( + RPCNonceOracle, + OverrideNonceOracle, + ) +from chainlib.eth.gas import ( + RPCGasOracle, + OverrideGasOracle, + ) +from chainlib.eth.connection import EthHTTPConnection +from chainlib.eth.tx import receipt +from chainlib.eth.constant import ZERO_ADDRESS + +# local imports +from sarafu_token import RedistributedDemurrageToken + +logging.basicConfig(level=logging.WARNING) +logg = logging.getLogger() + +script_dir = os.path.dirname(__file__) +data_dir = os.path.join(script_dir, '..', 'data') + +argparser = argparse.ArgumentParser() +argparser.add_argument('-p', '--provider', dest='p', default='http://localhost:8545', type=str, help='Web3 provider url (http only)') +argparser.add_argument('-w', action='store_true', help='Wait for the last transaction to be confirmed') +argparser.add_argument('-ww', action='store_true', help='Wait for every transaction to be confirmed') +argparser.add_argument('-i', '--chain-spec', dest='i', type=str, default='evm:ethereum:1', help='Chain specification string') +argparser.add_argument('-y', '--key-file', dest='y', type=str, help='Ethereum keystore file to use for signing') +argparser.add_argument('-v', action='store_true', help='Be verbose') +argparser.add_argument('-vv', action='store_true', help='Be more verbose') +argparser.add_argument('-d', action='store_true', help='Dump RPC calls to terminal and do not send') +argparser.add_argument('--name', type=str, help='Token name') +argparser.add_argument('--decimals', default=6, type=int, help='Token decimals') +argparser.add_argument('--gas-price', type=int, dest='gas_price', help='Override gas price') +argparser.add_argument('--nonce', type=int, help='Override transaction nonce') +argparser.add_argument('--sink-address', default=ZERO_ADDRESS, type=str, help='demurrage level,ppm per minute') +argparser.add_argument('--redistribution-period', default=10080, type=int, help='redistribution period, minutes') # default 10080 = week +argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration') +argparser.add_argument('symbol', default='SRF', type=str, help='Token symbol') +argparser.add_argument('demurrage_level', type=int, help='demurrage level, ppm per minute') +args = argparser.parse_args() + +if args.vv: + logg.setLevel(logging.DEBUG) +elif args.v: + logg.setLevel(logging.INFO) + +block_last = args.w +block_all = args.ww + +passphrase_env = 'ETH_PASSPHRASE' +if args.env_prefix != None: + passphrase_env = args.env_prefix + '_' + passphrase_env +passphrase = os.environ.get(passphrase_env) +if passphrase == None: + logg.warning('no passphrase given') + passphrase='' + +signer_address = None +keystore = DictKeystore() +if args.y != None: + logg.debug('loading keystore file {}'.format(args.y)) + signer_address = keystore.import_keystore_file(args.y, password=passphrase) + logg.debug('now have key for signer address {}'.format(signer_address)) +signer = EIP155Signer(keystore) + +chain_spec = ChainSpec.from_chain_str(args.i) + +rpc = EthHTTPConnection(args.p) +nonce_oracle = None +if args.nonce != None: + nonce_oracle = OverrideNonceOracle(signer_address, args.nonce) +else: + nonce_oracle = RPCNonceOracle(signer_address, rpc) + +gas_oracle = None +if args.gas_price !=None: + gas_oracle = OverrideGasOracle(price=args.gas_price, conn=rpc, code_callback=RedistributedDemurrageToken.gas) +else: + gas_oracle = RPCGasOracle(rpc, code_callback=RedistributedDemurrageToken.gas) + +dummy = args.d + +token_name = args.name +if token_name == None: + token_name = args.symbol + +def main(): + c = RedistributedDemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) + (tx_hash_hex, o) = c.constructor( + signer_address, + token_name, + args.symbol, + args.decimals, + args.demurrage_level, + args.redistribution_period, + args.sink_address, + ) + if dummy: + print(tx_hash_hex) + print(o) + else: + rpc.do(o) + if block_last: + r = rpc.wait(tx_hash_hex) + if r['status'] == 0: + sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') + sys.exit(1) + # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase) + address = r['contractAddress'] + + print(address) + else: + print(tx_hash_hex) + + +if __name__ == '__main__': + main() diff --git a/python/sarafu_token/token.py b/python/sarafu_token/token.py @@ -0,0 +1,87 @@ +# standard imports +import os +import logging + +# external imports +from chainlib.eth.tx import ( + TxFactory, + TxFormat, + ) +from chainlib.hash import keccak256_string_to_hex +from chainlib.eth.contract import ( + ABIContractEncoder, + ABIContractType, + ) + +# local imports +from sarafu_token.data import data_dir + +logg = logging.getLogger(__name__) + + +class RedistributedDemurrageToken(TxFactory): + + __abi = None + __bytecode = None + + def constructor(self, sender_address, name, symbol, decimals, demurrage_level, period_minutes, sink_address, tx_format=TxFormat.JSONRPC): + code = RedistributedDemurrageToken.bytecode() + enc = ABIContractEncoder() + enc.string(name) + enc.string(symbol) + enc.uint256(decimals) + enc.uint256(demurrage_level) + enc.uint256(period_minutes) + enc.address(sink_address) + code += enc.get() + tx = self.template(sender_address, None, use_nonce=True) + tx = self.set_code(tx, code) + return self.finalize(tx, tx_format) + + + @staticmethod + def gas(code=None): + return 3500000 + + @staticmethod + def abi(): + if RedistributedDemurrageToken.__abi == None: + f = open(os.path.join(data_dir, 'RedistributedDemurrageToken.json'), 'r') + RedistributedDemurrageToken.__abi = json.load(f) + f.close() + return RedistributedDemurrageToken.__abi + + + @staticmethod + def bytecode(): + if RedistributedDemurrageToken.__bytecode == None: + f = open(os.path.join(data_dir, 'RedistributedDemurrageToken.bin'), 'r') + RedistributedDemurrageToken.__bytecode = f.read() + f.close() + return RedistributedDemurrageToken.__bytecode + + + def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('addMinter') + enc.typ(ABIContractType.ADDRESS) + enc.address(address) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def mint_to(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('mintTo') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx diff --git a/python/setup.cfg b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = sarafu-token -version = 0.0.1a2 +version = 0.0.1a8 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no @@ -25,11 +25,11 @@ include_package_data = True python_requires = >= 3.6 packages = sarafu_token - sarafu_token.runnable.legacy + sarafu_token.runnable install_requires = - chainlib~=0.0.1a7 - crypto-dev-signer~=0.4.13rc2 - web3==5.12.2 + chainlib~=0.0.3a1 + crypto-dev-signer~=0.4.14b3 + [options.package_data] * = @@ -38,4 +38,4 @@ install_requires = [options.entry_points] console_scripts = - sarafu-token-deploy = sarafu_faucet.runnable.legacy.deploy:main + sarafu-token-deploy = sarafu_token.runnable.deploy:main diff --git a/python/setup.py b/python/setup.py @@ -1,5 +1,24 @@ from setuptools import setup +requirements = [] +f = open('requirements.txt', 'r') +while True: + l = f.readline() + if l == '': + break + requirements.append(l.rstrip()) +f.close() + +test_requirements = [] +f = open('test_requirements.txt', 'r') +while True: + l = f.readline() + if l == '': + break + test_requirements.append(l.rstrip()) +f.close() + + setup( package_data={ '': [ @@ -7,4 +26,6 @@ setup( ], }, include_package_data=True, + install_requires=requirements, + tests_require=test_requirements, ) diff --git a/python/test_requirements.txt b/python/test_requirements.txt @@ -0,0 +1,3 @@ +web3==5.12.2 +eth_tester==0.5.0b3 +py-evm==0.3.0a20 diff --git a/solidity/RedistributedDemurrageToken.sol b/solidity/RedistributedDemurrageToken.sol @@ -35,6 +35,8 @@ contract RedistributedDemurrageToken { // Implements EIP172 address public owner; + address newOwner; + // Implements ERC20 string public name; @@ -93,6 +95,9 @@ contract RedistributedDemurrageToken { // Temporary event used in development, will be removed on prod event Debug(bytes32 _foo); + // EIP173 + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 + constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public { // ACL setup owner = msg.sender; @@ -509,7 +514,7 @@ contract RedistributedDemurrageToken { return (_value * ppmDivider * 1000000) / demurrageAmount; } - // ERC20, triggers tax and/or redistribution + // Implements ERC20, triggers tax and/or redistribution function approve(address _spender, uint256 _value) public returns (bool) { uint256 baseValue; @@ -522,7 +527,7 @@ contract RedistributedDemurrageToken { return true; } - // ERC20, triggers tax and/or redistribution + // Implements ERC20, triggers tax and/or redistribution function transfer(address _to, uint256 _value) public returns (bool) { uint256 baseValue; bool result; @@ -537,7 +542,7 @@ contract RedistributedDemurrageToken { } - // ERC20, triggers tax and/or redistribution + // Implements ERC20, triggers tax and/or redistribution function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { uint256 baseValue; bool result; @@ -566,4 +571,41 @@ contract RedistributedDemurrageToken { } return true; } + + // Implements EIP173 + function transferOwnership(address _newOwner) public returns (bool) { + require(msg.sender == owner); + newOwner = _newOwner; + } + + // Implements OwnedAccepter + function acceptOwnership() public returns (bool) { + address oldOwner; + + require(msg.sender == newOwner); + oldOwner = owner; + owner = newOwner; + newOwner = address(0); + emit OwnershipTransferred(oldOwner, owner); + } + + // Implements EIP165 + function supportsInterface(bytes4 _sum) public pure returns (bool) { + if (_sum == 0xc6bb4b70) { // ERC20 + return true; + } + if (_sum == 0x449a52f8) { // Minter + return true; + } + if (_sum == 0x01ffc9a7) { // EIP165 + return true; + } + if (_sum == 0x9493f8b2) { // EIP173 + return true; + } + if (_sum == 0x37a47be4) { // OwnedAccepter + return true; + } + return false; + } }