UNPKG

@cartesi/staking-pool

Version:
655 lines 66.5 kB
{ "contractName": "StakingPoolImpl", "sourceName": "contracts/StakingPoolImpl.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "_ctsi", "type": "address" }, { "internalType": "address", "name": "_staking", "type": "address" }, { "internalType": "address", "name": "_workerManager", "type": "address" }, { "internalType": "address", "name": "_ens", "type": "address" }, { "internalType": "uint256", "name": "_stakeLock", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "reward", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "commission", "type": "uint256" } ], "name": "BlockProduced", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "stakeTimestamp", "type": "uint256" } ], "name": "Deposit", "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": "address", "name": "account", "type": "address" } ], "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Stake", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "name", "type": "string" } ], "name": "StakingPoolRenamed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } ], "name": "Unstake", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Withdraw", "type": "event" }, { "inputs": [], "name": "amount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "amountToShares", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "amounts", "outputs": [ { "internalType": "uint256", "name": "stake", "type": "uint256" }, { "internalType": "uint256", "name": "unstake", "type": "uint256" }, { "internalType": "uint256", "name": "withdraw", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "workerAddress", "type": "address" } ], "name": "cancelHire", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "ctsi", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "ens", "outputs": [ { "internalType": "contract ENS", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract StakingPoolFactory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "fee", "outputs": [ { "internalType": "contract Fee", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getWithdrawBalance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address payable", "name": "workerAddress", "type": "address" } ], "name": "hire", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_fee", "type": "address" }, { "internalType": "address", "name": "_pos", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "lockTime", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pos", "outputs": [ { "internalType": "contract IPoS", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" } ], "name": "produceBlock", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "rebalance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "requiredLiquidity", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address payable", "name": "workerAddress", "type": "address" } ], "name": "retire", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "selfhire", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name", "type": "string" } ], "name": "setName", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "shares", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_shares", "type": "uint256" } ], "name": "sharesToAmount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "stake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_shares", "type": "uint256" } ], "name": "unstake", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "update", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "userBalance", "outputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "shares", "type": "uint256" }, { "internalType": "uint256", "name": "depositTimestamp", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x6101606040523480156200001257600080fd5b5060405162002e8538038062002e858339810160408190526200003591620002c1565b82858287878987600060019054906101000a900460ff16806200005b575060005460ff16155b620000c45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b600054610100900460ff16158015620000e7576000805461ffff19166101011790555b6001600160a01b038216620001385760405162461bcd60e51b8152602060048201526021602482015260008051602062002e658339815191526044820152607360f81b6064820152608401620000bb565b6001600160601b0319606083901b166080526200015462000209565b801562000167576000805461ff00191690555b50506001600160601b0319606091821b811660a05292811b831660c05290811b821660e0529290921b90911661010052610120526001600160a01b038116620001ec5760405162461bcd60e51b8152602060048201526021602482015260008051602062002e658339815191526044820152607360f81b6064820152608401620000bb565b60601b6001600160601b0319166101405250620003289350505050565b60335460ff1615620002515760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401620000bb565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002873390565b6040516001600160a01b03909116815260200160405180910390a1565b80516001600160a01b0381168114620002bc57600080fd5b919050565b600080600080600060a08688031215620002da57600080fd5b620002e586620002a4565b9450620002f560208701620002a4565b93506200030560408701620002a4565b92506200031560608701620002a4565b9150608086015190509295509295909350565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c610120516101405160601c612a446200042160003960008181610da201528181610e2d01528181610e910152818161124301528181611ab801528181611eb701528181611f3c0152612392015260008181610290015281816118910152611c5c01526000818161089501528181610f650152611b94015260008181610b7401528181610c5001528181610cea0152818161105d015281816110de0152818161115f0152612106015260008181610ad601526121360152600081816103cb015261165a0152600081816103060152611d2f0152612a446000f3fe6080604052600436106101f25760003560e01c80638456cb591161010d578063b6b55f25116100a0578063c56551b61161006f578063c56551b6146105a7578063d9d6bd86146105c7578063ddca3f43146105da578063e366b7bb146105fa578063f2fde38b1461061057600080fd5b8063b6b55f2514610527578063b811540e14610547578063c45a015514610567578063c47f00271461058757600080fd5b8063a5a6cd0b116100dc578063a5a6cd0b146104b1578063a694fc3a146104d1578063aa8c217c146104f1578063b64b3bed1461050757600080fd5b80638456cb59146104495780638da5cb5b1461045e5780639e6371ba1461047c578063a2e620451461049c57600080fd5b8063555d8ebb116101855780636ff46a6c116101545780636ff46a6c14610402578063710fe6f81461040a578063715018a61461041f5780637d7c2a1c1461043457600080fd5b8063555d8ebb146103755780635c975abb1461039557806364ffc3f4146103b95780636beaeeae146103ed57600080fd5b80632e1a7d4d116101c15780632e1a7d4d146102d45780633f15457f146102f45780633f4ba83a14610340578063485cc9551461035557600080fd5b80630103c92b146101fe57806303314efa1461025a5780630d6680871461027e5780632e17de78146102b257600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061023a610219366004612643565b609b6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b34801561026657600080fd5b5061027060975481565b604051908152602001610251565b34801561028a57600080fd5b506102707f000000000000000000000000000000000000000000000000000000000000000081565b3480156102be57600080fd5b506102d26102cd3660046127a2565b610630565b005b3480156102e057600080fd5b506102d26102ef3660046127a2565b6107d6565b34801561030057600080fd5b506103287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610251565b34801561034c57600080fd5b506102d261096f565b34801561036157600080fd5b506102d261037036600461267d565b6109a3565b34801561038157600080fd5b506102706103903660046127a2565b610a73565b3480156103a157600080fd5b5060335460ff165b6040519015158152602001610251565b3480156103c557600080fd5b506103287f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f957600080fd5b5061023a610ab0565b6102d2610d8d565b34801561041657600080fd5b50610270610f32565b34801561042b57600080fd5b506102d2610ff9565b34801561044057600080fd5b506102d261102d565b34801561045557600080fd5b506102d26111c8565b34801561046a57600080fd5b506065546001600160a01b0316610328565b34801561048857600080fd5b506102d2610497366004612643565b6111fa565b3480156104a857600080fd5b506102d26112a3565b3480156104bd57600080fd5b506103a96104cc3660046127a2565b611355565b3480156104dd57600080fd5b506102d26104ec3660046127a2565b6117c9565b3480156104fd57600080fd5b5061027060985481565b34801561051357600080fd5b506102d2610522366004612643565b611a6f565b34801561053357600080fd5b506102d26105423660046127a2565b611ae7565b34801561055357600080fd5b506102706105623660046127a2565b611c96565b34801561057357600080fd5b50609c54610328906001600160a01b031681565b34801561059357600080fd5b506102d26105a23660046126f1565b611ccd565b3480156105b357600080fd5b50609a54610328906001600160a01b031681565b6102d26105d5366004612643565b611e6e565b3480156105e657600080fd5b50609d54610328906001600160a01b031681565b34801561060657600080fd5b5061027060995481565b34801561061c57600080fd5b506102d261062b366004612643565b611f71565b336000908152609b60205260409020816106a75760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e67506f6f6c55736572496d706c3a20696e76616c696420616d6f60448201526c756e74206f662073686172657360981b60648201526084015b60405180910390fd5b818160010154101561070c5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e67506f6f6c55736572496d706c3a20696e73756666696369656e604482015267742073686172657360c01b606482015260840161069e565b8181600101600082825461072091906129b6565b909155506000905061073183610a73565b9050826097600082825461074591906129b6565b92505081905550806098600082825461075e91906129b6565b909155505081548190839060009061077790849061295d565b925050819055508060996000828254610790919061295d565b9091555050604080518281526020810185905233917ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb28091015b60405180910390a2505050565b336000908152609b6020526040902080546108475760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e67506f6f6c55736572496d706c3a206e6f2062616c616e63652060448201526a746f20776974686472617760a81b606482015260840161069e565b8181600001600082825461085b91906129b6565b92505081905550816099600082825461087491906129b6565b909155505060405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156108e157600080fd5b505af11580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091991906126b6565b6109355760405162461bcd60e51b815260040161069e90612810565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050565b6065546001600160a01b031633146109995760405162461bcd60e51b815260040161069e906128d6565b6109a1611f7a565b565b600054610100900460ff16806109bc575060005460ff16155b6109d85760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff161580156109fa576000805461ffff19166101011790555b610a0261200d565b610a0a612088565b610a3d8383609d80546001600160a01b039384166001600160a01b031991821617909155609a8054929093169116179055565b610a456120ef565b610a5c609c80546001600160a01b03191633179055565b8015610a6e576000805461ff00191690555b505050565b600060975460001415610a8f57610a8982612212565b92915050565b610a89609754610aaa6098548561224690919063ffffffff16565b90612280565b6040516370a0823160e01b81523060048201526000908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610b1857600080fd5b505afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5091906126d8565b9050609954811115610c1357604051631066f98960e21b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063419be6249060240160206040518083038186803b158015610bbe57600080fd5b505afa158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf691906126d8565b905080610c0d57609954610c0a90836129b6565b94505b50610d87565b806099541115610d8757600081609954610c2d91906129b6565b604051638e9f04b560e01b81523060048201529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e9f04b59060240160206040518083038186803b158015610c9257600080fd5b505afa158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cca91906126d8565b90508015610d80576040516367ba9b9160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906367ba9b919060240160206040518083038186803b158015610d3457600080fd5b505afa158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6c91906126d8565b905042811015610d7a578194505b50610d84565b8194505b50505b50909192565b604051636ceb5ec360e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d9d6bd869034906024016000604051808303818588803b158015610def57600080fd5b505af1158015610e03573d6000803e3d6000fd5b5050609a54604051632bef459560e01b81523060048201526001600160a01b0391821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169350632bef459592506044019050600060405180830381600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b789b7e6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610eea57600080fd5b505af1158015610efe573d6000803e3d6000fd5b50506040513392503480156108fc029250906000818181858888f19350505050158015610f2f573d6000803e3d6000fd5b50565b336000908152609b6020526040808220805491516370a0823160e01b815230600482015290919083906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610fa757600080fd5b505afa158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf91906126d8565b905081811015610fef5780610ff1565b815b935050505090565b6065546001600160a01b031633146110235760405162461bcd60e51b815260040161069e906128d6565b6109a160006122c3565b600080600061103a610ab0565b9194509250905082156110c25760405163534a7e1d60e11b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a694fc3a90602401600060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b505050505b8115611143576040516305c2fbcf60e31b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e17de7890602401600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b505050505b8015610a6e57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ab57600080fd5b505af11580156111bf573d6000803e3d6000fd5b50505050505050565b6065546001600160a01b031633146111f25760405162461bcd60e51b815260040161069e906128d6565b6109a1612315565b6065546001600160a01b031633146112245760405162461bcd60e51b815260040161069e906128d6565b604051634f31b8dd60e11b81526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639e6371ba906024015b600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b5050505050565b6065546001600160a01b031633146112cd5760405162461bcd60e51b815260040161069e906128d6565b609c5460408051632686e29d60e01b815290516000926001600160a01b031691632686e29d916004808301926020929190829003018186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a9190612660565b9050610f2f8161236d565b609a546040516385425f4f60e01b81526004810183905260009182916001600160a01b03909116906385425f4f9060240160206040518083038186803b15801561139e57600080fd5b505afa1580156113b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d69190612660565b90506000816001600160a01b0316638aec85426040518163ffffffff1660e01b815260040160206040518083038186803b15801561141357600080fd5b505afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b91906126d8565b609a5460405163a5a6cd0b60e01b8152600481018790529192506001600160a01b03169063a5a6cd0b90602401602060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca91906126b6565b61152f5760405162461bcd60e51b815260206004820152603060248201527f5374616b696e67506f6f6c50726f6475636572496d706c3a206661696c65642060448201526f746f2070726f6475636520626c6f636b60801b606482015260840161069e565b609d54604051632c7f22b560e21b815260048101869052602481018390526000916001600160a01b03169063b1fc8ad49060440160206040518083038186803b15801561157b57600080fd5b505afa15801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906126d8565b90508181111561162d576040805162461bcd60e51b81526020600482015260248101919091527f5374616b696e67506f6f6c50726f6475636572496d706c3a20636f6d6d69737360448201527f696f6e2069732067726561746572207468616e20626c6f636b20726577617264606482015260840161069e565b600061163982846129b6565b9050806098600082825461164d919061295d565b90915550508115611784577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116996065546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171991906126b6565b6117845760405162461bcd60e51b815260206004820152603660248201527f5374616b696e67506f6f6c50726f6475636572496d706c3a206661696c6564206044820152753a37903a3930b739b332b91031b7b6b6b4b9b9b4b7b760511b606482015260840161069e565b60408051848152602081018490527fbb9ac692e0e3001a628f86a894f03da4ced5df81886fec577036664ed70a59cb910160405180910390a150600195945050505050565b60335460ff16156117ec5760405162461bcd60e51b815260040161069e9061285e565b336000908152609b60205260409020816118185760405162461bcd60e51b815260040161069e9061290b565b805482111561188f5760405162461bcd60e51b815260206004820152603c60248201527f5374616b696e67506f6f6c55736572496d706c3a206e6f7420656e6f7567682060448201527f746f6b656e7320617661696c61626c6520666f72207374616b696e6700000000606482015260840161069e565b7f000000000000000000000000000000000000000000000000000000000000000081600201546118bf919061295d565b42101561193f5760405162461bcd60e51b815260206004820152604260248201527f5374616b696e67506f6f6c55736572496d706c3a206e6f7420656e6f7567682060448201527f74696d6520686173207061737365642073696e6365206c617374206465706f736064820152611a5d60f21b608482015260a40161069e565b600061194a83611c96565b9050600081116119ba5760405162461bcd60e51b815260206004820152603560248201527f5374616b696e67506f6f6c55736572496d706c3a207374616b65206e6f7420656044820152746e6f75676820746f20656d6974203120736861726560581b606482015260840161069e565b808260010160008282546119ce919061295d565b90915550508154839083906000906119e79084906129b6565b925050819055508260986000828254611a00919061295d565b925050819055508060976000828254611a19919061295d565b925050819055508260996000828254611a3291906129b6565b9091555050604080518481526020810183905233917f5af417134f72a9d41143ace85b0a26dce6f550f894f2cbc1eeee8810603d91b691016107c9565b6065546001600160a01b03163314611a995760405162461bcd60e51b815260040161069e906128d6565b60405163b64b3bed60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b64b3bed9060240161126e565b60335460ff1615611b0a5760405162461bcd60e51b815260040161069e9061285e565b60008111611b2a5760405162461bcd60e51b815260040161069e9061290b565b336000908152609b60205260408120805490918391839190611b4d90849061295d565b909155505042600282015560998054839190600090611b6d90849061295d565b90915550506040516323b872dd60e01b8152336004820152306024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906126b6565b611c345760405162461bcd60e51b815260040161069e90612810565b337f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1583611c817f00000000000000000000000000000000000000000000000000000000000000004261295d565b60408051928352602083019190915201610963565b600060985460001415611cac57610a8982612411565b610a89609854611cc76097548561242190919063ffffffff16565b90612449565b6065546001600160a01b03163314611cf75760405162461bcd60e51b815260040161069e906128d6565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302571be39060240160206040518083038186803b158015611d7957600080fd5b505afa158015611d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db19190612660565b60405163c47f002760e01b81529091506001600160a01b0382169063c47f002790611de09085906004016127bb565b602060405180830381600087803b158015611dfa57600080fd5b505af1158015611e0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3291906126d8565b507f6aaa0865532d48a9a0f63cc91df7ff2ab538c896665c864ae02d0a1e7f81cf6582604051611e6291906127bb565b60405180910390a15050565b6065546001600160a01b03163314611e985760405162461bcd60e51b815260040161069e906128d6565b604051636ceb5ec360e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063d9d6bd869034906024016000604051808303818588803b158015611efc57600080fd5b505af1158015611f10573d6000803e3d6000fd5b5050609a54604051632bef459560e01b81526001600160a01b03868116600483015291821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169350632bef45959250604401905061126e565b610f2f8161246c565b60335460ff16611fc35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161069e565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff1680612026575060005460ff16155b6120425760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff16158015612064576000805461ffff19166101011790555b61206c612504565b61207461256e565b8015610f2f576000805461ff001916905550565b600054610100900460ff16806120a1575060005460ff16155b6120bd5760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff161580156120df576000805461ffff19166101011790555b6120e7612504565b6120746125e3565b60405163095ea7b360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b390604401602060405180830381600087803b15801561217a57600080fd5b505af115801561218e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b291906126b6565b6109a15760405162461bcd60e51b815260206004820152602b60248201527f4661696c656420746f20617070726f7665204354534920666f72207374616b6960448201526a1b99c818dbdb9d1c9858dd60aa1b606482015260840161069e565b6000806122246002633b9aca00612975565b9050633b9aca00612235848361295d565b61223f9190612975565b9392505050565b60006b033b2e3c9fd0803ce800000061225f8385612997565b61227660026b033b2e3c9fd0803ce8000000612975565b612235919061295d565b60008061228e600284612975565b9050826122a76b033b2e3c9fd0803ce800000086612997565b6122b1908361295d565b6122bb9190612975565b949350505050565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335460ff16156123385760405162461bcd60e51b815260040161069e9061285e565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff03390565b604051632bef459560e01b81523060048201526001600160a01b0382811660248301527f00000000000000000000000000000000000000000000000000000000000000001690632bef459590604401600060405180830381600087803b1580156123d657600080fd5b505af11580156123ea573d6000803e3d6000fd5b5050609a80546001600160a01b0319166001600160a01b0394909416939093179092555050565b6000610a89633b9aca0083612997565b6000670de0b6b3a76400006124368385612997565b6122766002670de0b6b3a7640000612975565b600080612457600284612975565b9050826122a7670de0b6b3a764000086612997565b6065546001600160a01b031633146124965760405162461bcd60e51b815260040161069e906128d6565b6001600160a01b0381166124fb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069e565b610f2f816122c3565b600054610100900460ff168061251d575060005460ff16155b6125395760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff16158015612074576000805461ffff19166101011790558015610f2f576000805461ff001916905550565b600054610100900460ff1680612587575060005460ff16155b6125a35760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff161580156125c5576000805461ffff19166101011790555b6033805460ff191690558015610f2f576000805461ff001916905550565b600054610100900460ff16806125fc575060005460ff16155b6126185760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff1615801561263a576000805461ffff19166101011790555b612074336122c3565b60006020828403121561265557600080fd5b813561223f816129f9565b60006020828403121561267257600080fd5b815161223f816129f9565b6000806040838503121561269057600080fd5b823561269b816129f9565b915060208301356126ab816129f9565b809150509250929050565b6000602082840312156126c857600080fd5b8151801515811461223f57600080fd5b6000602082840312156126ea57600080fd5b5051919050565b60006020828403121561270357600080fd5b813567ffffffffffffffff8082111561271b57600080fd5b818401915084601f83011261272f57600080fd5b813581811115612741576127416129e3565b604051601f8201601f19908116603f01168101908382118183101715612769576127696129e3565b8160405282815287602084870101111561278257600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000602082840312156127b457600080fd5b5035919050565b600060208083528351808285015260005b818110156127e8578581018301518582016040015282016127cc565b818111156127fa576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f5374616b696e67506f6f6c55736572496d706c3a206661696c656420746f207460408201526d72616e7366657220746f6b656e7360901b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526032908201527f5374616b696e67506f6f6c55736572496d706c3a20616d6f756e74206d75737460408201527102062652067726561746572207468616e20360741b606082015260800190565b60008219821115612970576129706129cd565b500190565b60008261299257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129b1576129b16129cd565b500290565b6000828210156129c8576129c86129cd565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f2f57600080fdfea26469706673582212203c535d95c790ec68bcf07e0f09fa1de8d9ac93b9383ffe05946507faa4e6d27064736f6c63430008070033706172616d657465722063616e206e6f74206265207a65726f20616464726573", "deployedBytecode": "0x6080604052600436106101f25760003560e01c80638456cb591161010d578063b6b55f25116100a0578063c56551b61161006f578063c56551b6146105a7578063d9d6bd86146105c7578063ddca3f43146105da578063e366b7bb146105fa578063f2fde38b1461061057600080fd5b8063b6b55f2514610527578063b811540e14610547578063c45a015514610567578063c47f00271461058757600080fd5b8063a5a6cd0b116100dc578063a5a6cd0b146104b1578063a694fc3a146104d1578063aa8c217c146104f1578063b64b3bed1461050757600080fd5b80638456cb59146104495780638da5cb5b1461045e5780639e6371ba1461047c578063a2e620451461049c57600080fd5b8063555d8ebb116101855780636ff46a6c116101545780636ff46a6c14610402578063710fe6f81461040a578063715018a61461041f5780637d7c2a1c1461043457600080fd5b8063555d8ebb146103755780635c975abb1461039557806364ffc3f4146103b95780636beaeeae146103ed57600080fd5b80632e1a7d4d116101c15780632e1a7d4d146102d45780633f15457f146102f45780633f4ba83a14610340578063485cc9551461035557600080fd5b80630103c92b146101fe57806303314efa1461025a5780630d6680871461027e5780632e17de78146102b257600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061023a610219366004612643565b609b6020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060015b60405180910390f35b34801561026657600080fd5b5061027060975481565b604051908152602001610251565b34801561028a57600080fd5b506102707f000000000000000000000000000000000000000000000000000000000000000081565b3480156102be57600080fd5b506102d26102cd3660046127a2565b610630565b005b3480156102e057600080fd5b506102d26102ef3660046127a2565b6107d6565b34801561030057600080fd5b506103287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610251565b34801561034c57600080fd5b506102d261096f565b34801561036157600080fd5b506102d261037036600461267d565b6109a3565b34801561038157600080fd5b506102706103903660046127a2565b610a73565b3480156103a157600080fd5b5060335460ff165b6040519015158152602001610251565b3480156103c557600080fd5b506103287f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f957600080fd5b5061023a610ab0565b6102d2610d8d565b34801561041657600080fd5b50610270610f32565b34801561042b57600080fd5b506102d2610ff9565b34801561044057600080fd5b506102d261102d565b34801561045557600080fd5b506102d26111c8565b34801561046a57600080fd5b506065546001600160a01b0316610328565b34801561048857600080fd5b506102d2610497366004612643565b6111fa565b3480156104a857600080fd5b506102d26112a3565b3480156104bd57600080fd5b506103a96104cc3660046127a2565b611355565b3480156104dd57600080fd5b506102d26104ec3660046127a2565b6117c9565b3480156104fd57600080fd5b5061027060985481565b34801561051357600080fd5b506102d2610522366004612643565b611a6f565b34801561053357600080fd5b506102d26105423660046127a2565b611ae7565b34801561055357600080fd5b506102706105623660046127a2565b611c96565b34801561057357600080fd5b50609c54610328906001600160a01b031681565b34801561059357600080fd5b506102d26105a23660046126f1565b611ccd565b3480156105b357600080fd5b50609a54610328906001600160a01b031681565b6102d26105d5366004612643565b611e6e565b3480156105e657600080fd5b50609d54610328906001600160a01b031681565b34801561060657600080fd5b5061027060995481565b34801561061c57600080fd5b506102d261062b366004612643565b611f71565b336000908152609b60205260409020816106a75760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e67506f6f6c55736572496d706c3a20696e76616c696420616d6f60448201526c756e74206f662073686172657360981b60648201526084015b60405180910390fd5b818160010154101561070c5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e67506f6f6c55736572496d706c3a20696e73756666696369656e604482015267742073686172657360c01b606482015260840161069e565b8181600101600082825461072091906129b6565b909155506000905061073183610a73565b9050826097600082825461074591906129b6565b92505081905550806098600082825461075e91906129b6565b909155505081548190839060009061077790849061295d565b925050819055508060996000828254610790919061295d565b9091555050604080518281526020810185905233917ff960dbf9e5d0682f7a298ed974e33a28b4464914b7a2bfac12ae419a9afeb28091015b60405180910390a2505050565b336000908152609b6020526040902080546108475760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e67506f6f6c55736572496d706c3a206e6f2062616c616e63652060448201526a746f20776974686472617760a81b606482015260840161069e565b8181600001600082825461085b91906129b6565b92505081905550816099600082825461087491906129b6565b909155505060405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156108e157600080fd5b505af11580156108f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091991906126b6565b6109355760405162461bcd60e51b815260040161069e90612810565b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a25050565b6065546001600160a01b031633146109995760405162461bcd60e51b815260040161069e906128d6565b6109a1611f7a565b565b600054610100900460ff16806109bc575060005460ff16155b6109d85760405162461bcd60e51b815260040161069e90612888565b600054610100900460ff161580156109fa576000805461ffff19166101011790555b610a0261200d565b610a0a612088565b610a3d8383609d80546001600160a01b039384166001600160a01b031991821617909155609a8054929093169116179055565b610a456120ef565b610a5c609c80546001600160a01b03191633179055565b8015610a6e576000805461ff00191690555b505050565b600060975460001415610a8f57610a8982612212565b92915050565b610a89609754610aaa6098548561224690919063ffffffff16565b90612280565b6040516370a0823160e01b81523060048201526000908190819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610b1857600080fd5b505afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5091906126d8565b9050609954811115610c1357604051631066f98960e21b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063419be6249060240160206040518083038186803b158015610bbe57600080fd5b505afa158015610bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf691906126d8565b905080610c0d57609954610c0a90836129b6565b94505b50610d87565b806099541115610d8757600081609954610c2d91906129b6565b604051638e9f04b560e01b81523060048201529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e9f04b59060240160206040518083038186803b158015610c9257600080fd5b505afa158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cca91906126d8565b90508015610d80576040516367ba9b9160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906367ba9b919060240160206040518083038186803b158015610d3457600080fd5b505afa158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6c91906126d8565b905042811015610d7a578194505b50610d84565b8194505b50505b50909192565b604051636ceb5ec360e11b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d9d6bd869034906024016000604051808303818588803b158015610def57600080fd5b505af1158015610e03573d6000803e3d6000fd5b5050609a54604051632bef459560e01b81523060048201526001600160a01b0391821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169350632bef459592506044019050600060405180830381600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b789b7e6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610eea57600080fd5b505af1158015610efe573d6000803e3d6000fd5b50506040513392503480156108fc029250906000818181858888f19350505050158015610f2f573d6000803e3d6000fd5b50565b336000908152609b6020526040808220805491516370a0823160e01b815230600482015290919083906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b158015610fa757600080fd5b505afa158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf91906126d8565b905081811015610fef5780610ff1565b815b935050505090565b6065546001600160a01b031633146110235760405162461bcd60e51b815260040161069e906128d6565b6109a160006122c3565b600080600061103a610ab0565b9194509250905082156110c25760405163534a7e1d60e11b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a694fc3a90602401600060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b505050505b8115611143576040516305c2fbcf60e31b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e17de7890602401600060405180830381600087803b15801561112a57600080fd5b505af115801561113e573d6000803e3d6000fd5b505050505b8015610a6e57604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156111ab57600080fd5b505af11580156111bf573d6000803e3d6000fd5b50505050505050565b6065546001600160a01b031633146111f25760405162461bcd60e51b815260040161069e906128d6565b6109a1612315565b6065546001600160a01b031633146112245760405162461bcd60e51b815260040161069e906128d6565b604051634f31b8dd60e11b81526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639e6371ba906024015b600060405180830381600087803b15801561128857600080fd5b505af115801561129c573d6000803e3d6000fd5b5050505050565b6065546001600160a01b031633146112cd5760405162461bcd60e51b815260040161069e906128d6565b609c5460408051632686e29d60e01b815290516000926001600160a01b031691632686e29d916004808301926020929190829003018186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a9190612660565b9050610f2f8161236d565b609a546040516385425f4f60e01b81526004810183905260009182916001600160a01b03909116906385425f4f9060240160206040518083038186803b15801561139e57600080fd5b505afa1580156113b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d69190612660565b90506000816001600160a01b0316638aec85426040518163ffffffff1660e01b815260040160206040518083038186803b15801561141357600080fd5b505afa158015611427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144b91906126d8565b609a5460405163a5a6cd0b60e01b8152600481018790529192506001600160a01b03169063a5a6cd0b90602401602060405180830381600087803b15801561149257600080fd5b505af11580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca91906126b6565b61152f5760405162461bcd60e51b815260206004820152603060248201527f5374616b696e67506f6f6c50726f6475636572496d706c3a206661696c65642060448201526f746f2070726f6475636520626c6f636b60801b606482015260840161069e565b609d54604051632c7f22b560e21b815260048101869052602481018390526000916001600160a01b03169063b1fc8ad49060440160206040518083038186803b15801561157b57600080fd5b505afa15801561158f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b391906126d8565b90508181111561162d576040805162461bcd60e51b81526020600482015260248101919091527f5374616b696e67506f6f6c50726f6475636572496d706c3a20636f6d6d69737360448201527f696f6e2069732067726561746572207468616e20626c6f636b20726577617264606482015260840161069e565b600061163982846129b6565b9050806098600082825461164d919061295d565b90915550508115611784577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116996065546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b1580156116e157600080fd5b505af11580156116f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171991906126b6565b6117845760405162461bcd60e51b815260206004820152603660248201527f5374616b696e67506f6f6c50726f6475636572496d706c3a206661696c6564206044820152753a37903a3930b739b332b91031b7b6b6b4b9b9b4b7b760511b606482015260840161069e565b60408051848152602081018490527fbb9ac692e0e3001a628f86a894f03da4ced5df81886fec577036664ed70a59cb910160405180910390a150600195945050505050565b60335460ff16156117ec5760405162461bcd60e51b815260040161069e9061285e565b336000908152609b60205260409020816118185760405162461bcd60e51b815260040161069e9061290b565b805482111561188f5760405162461bcd60e51b815260206004820152603c60248201527f5374616b696e67506f6f6c55736572496d706c3a206e6f7420656e6f7567682060448201527f746f6b656e7320617661696c61626c6520666f72207374616b696e6700000000606482015260840161069e565b7f000000000000000000000000000000000000000000000000000000000000000081600201546118bf919061295d565b42101561193f5760405162461bcd60e51b8152602060048201526042602482015