UNPKG

@gooddollar/goodcontracts

Version:
359 lines 666 kB
{ "contractName": "FuseStakingV2", "abi": [ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "inputs": [], "name": "consensus", "outputs": [ { "internalType": "contract IConsensus", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "stakers", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "validators", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" }, { "inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "stake", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_value", "type": "uint256" } ], "name": "withdraw", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "stakeNextValidator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_v", "type": "address" } ], "name": "addValidator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "totalDelegated", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_validator", "type": "address" } ], "name": "removeValidator", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_v\",\"type\":\"address\"}],\"name\":\"addValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"consensus\",\"outputs\":[{\"internalType\":\"contract IConsensus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_validator\",\"type\":\"address\"}],\"name\":\"removeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeNextValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalDelegated\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"validators\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"initialize()\":{\"details\":\"initialize\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/upgradables/contracts/staking/FuseStakingV2.sol\":\"FuseStakingV2\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/upgradables/contracts/staking/FuseStakingV2.sol\":{\"keccak256\":\"0x4a0ed37ec43bbc29c228cb43e387124a36038cb09c590721f90a6b2cfe8678c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d9314d37f3605ac3c06883b598832feef8177a3d94582fcc335e17561849450e\",\"dweb:/ipfs/QmfAbiep4LQtvTJzbKVucTHUKUMEmzubbv3ifiyVXYBdiL\"]},\"@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol\":{\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://062688aac76e27ab50157a9d645700cf92e3c0d51d3d860be1d2e1a0c04a87d0\",\"dweb:/ipfs/QmfXxppWAiSTeH8YNn2EtMPDgzrLeJ5rjRq8knEbje88mX\"]},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xe422bf8bc61fe71acb27de4631400cdbb9b532df4de4f255eab093ac356f9745\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c2e5ed663c9df8fd44b624cfef92a703803cc72cf356c96e69a6e88c5ce082d\",\"dweb:/ipfs/QmdtPLYhopn3L14o6TCJkwH28o91do8JriAxpFYt67NWGB\"]},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"keccak256\":\"0xe9ecc18d06bcc5aa48c40a98333540248b6c1c18ecb6262329c06d3f0cbb45ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a81bcbe4f867a4eaf7ec375508a9901ea7517b9854c9a542c242050beda5127\",\"dweb:/ipfs/QmS499VRDhAgMg1pK96PiyRpP3gJZzzMcoNBbe8AV3JNw3\"]},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"keccak256\":\"0xae7044b7c89ed74327b0979ae6f317c65d87b8d17a42d0c62d698d77d5de5511\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d676c978d8ecee5c4510f045b747d94f3a1381e39feb870d2675d5b6d45a371b\",\"dweb:/ipfs/QmUAokuHWPVAf14QkhPtSdYFyNa8HVje9CBEzwCcxH3xkP\"]}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b506113b1806100206000396000f3fe6080604052600436106100e15760003560e01c806380d04de81161007f5780638ef3f761116100595780638ef3f761146102665780639168ae721461027b578063a3354161146102ae578063f2fde38b146102c3576100e8565b806380d04de8146102275780638129fc1c1461023c5780638da5cb5b14610251576100e8565b806340a141ff116100bb57806340a141ff146101795780634d238c8e146101ac57806370a08231146101df578063715018a614610212576100e8565b80632e1a7d4d146100ed57806335aa2e44146101295780633a4b66f11461016f576100e8565b366100e857005b600080fd5b3480156100f957600080fd5b506101176004803603602081101561011057600080fd5b50356102f6565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b50356105c3565b604080516001600160a01b039092168252519081900360200190f35b6101776105ea565b005b34801561018557600080fd5b506101776004803603602081101561019c57600080fd5b50356001600160a01b0316610667565b3480156101b857600080fd5b50610177600480360360208110156101cf57600080fd5b50356001600160a01b031661086d565b3480156101eb57600080fd5b506101176004803603602081101561020257600080fd5b50356001600160a01b0316610917565b34801561021e57600080fd5b50610177610932565b34801561023357600080fd5b506101176109d4565b34801561024857600080fd5b50610177610aaa565b34801561025d57600080fd5b50610153610bcb565b34801561027257600080fd5b50610153610bda565b34801561028757600080fd5b506101176004803603602081101561029e57600080fd5b50356001600160a01b0316610be9565b3480156102ba57600080fd5b50610177610bfb565b3480156102cf57600080fd5b50610177600480360360208110156102e657600080fd5b50356001600160a01b0316610e53565b60008082156103055782610316565b336000908152606560205260409020545b90508080158015906103375750336000908152606560205260409020548211155b610388576040805162461bcd60e51b815260206004820152601760248201527f696e76616c696420776974686472617720616d6f756e74000000000000000000604482015290519081900360640190fd5b60005b60665481101561054257606754606680546000926001600160a01b0316916321429e6091309190869081106103bc57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561041257600080fd5b505afa158015610426573d6000803e3d6000fd5b505050506040513d602081101561043c57600080fd5b505190508061044b575061053a565b8281116104fc57606754606680546001600160a01b039092169163f3fef3a391908590811061047657fe5b6000918252602082200154604080516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201869052516044808301939282900301818387803b1580156104ca57600080fd5b505af11580156104de573d6000803e3d6000fd5b505050506104f58184610f4c90919063ffffffff16565b925061052d565b6105276066838154811061050c57fe5b6000918252602090912001546001600160a01b031684610f97565b50600092505b826105385750610542565b505b60010161038b565b5061054b611063565b82111561055d5761055a611063565b91505b336000908152606560205260409020546105779083610f4c565b3360009081526065602052604090205581156105bc57604051339083156108fc029084906000818181858888f193505050501580156105ba573d6000803e3d6000fd5b505b5092915050565b606681815481106105d057fe5b6000918252602090912001546001600160a01b0316905081565b60003411610633576040805162461bcd60e51b815260206004820152601160248201527007374616b65206d757374206265203e203607c1b604482015290519081900360640190fd5b61063b610bfb565b336000908152606560205260409020546106559034611068565b33600090815260656020526040902055565b61066f6110c2565b6033546001600160a01b039081169116146106bf576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6067546040805163010a14f360e51b81523060048201526001600160a01b038481166024830152915160009392909216916321429e6091604480820192602092909190829003018186803b15801561071657600080fd5b505afa15801561072a573d6000803e3d6000fd5b505050506040513d602081101561074057600080fd5b505190508015610779576000610754611063565b90506107608383610f97565b508061076a611063565b141561077757505061086a565b505b60005b60665481101561086757826001600160a01b03166066828154811061079d57fe5b6000918252602090912001546001600160a01b0316141561085f576066546000190181101561082d576066805460001981019081106107d857fe5b600091825260209091200154606680546001600160a01b0390921691839081106107fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b606680548061083857fe5b600082815260209020810160001990810180546001600160a01b0319169055019055610867565b60010161077c565b50505b50565b6108756110c2565b6033546001600160a01b039081169116146108c5576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b606680546001810182556000919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526065602052604090205490565b61093a6110c2565b6033546001600160a01b0390811691161461098a576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b600080805b606654811015610aa357606754606680546000926001600160a01b0316916321429e609130919086908110610a0a57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610a6057600080fd5b505afa158015610a74573d6000803e3d6000fd5b505050506040513d6020811015610a8a57600080fd5b50519050610a988382611068565b9250506001016109d9565b5090505b90565b600054610100900460ff1680610ac35750610ac36110c6565b80610ad1575060005460ff16155b610b0c5760405162461bcd60e51b815260040180806020018281038252602e81526020018061132e602e913960400191505060405180910390fd5b600054610100900460ff16158015610b37576000805460ff1961ff0019909116610100171660011790555b610b3f6110cc565b606780546001600160a01b0319908116733014ca10b91cb3d0ad85fef7a3cb95bcac9c0f7917909155606680546001810182556000919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435401805490911673cb876a393f05a6677a8a029f1c6d7603b416c0a6179055801561086a576000805461ff001916905550565b6033546001600160a01b031690565b6067546001600160a01b031681565b60656020526000908152604090205481565b606654610c48576040805162461bcd60e51b81526020600482015260166024820152756e6f20617070726f7665642076616c696461746f727360501b604482015290519081900360640190fd5b606754606680546000926001600160a01b0316916321429e60913091908590610c6d57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610cc357600080fd5b505afa158015610cd7573d6000803e3d6000fd5b505050506040513d6020811015610ced57600080fd5b50519050600060015b606654811015610dc057606754606680546000926001600160a01b0316916321429e609130919086908110610d2757fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d6020811015610da757600080fd5b5051905083811015610db7578192505b50600101610cf6565b50606754606680543031926001600160a01b031691635c19a95c9184919086908110610de857fe5b6000918252602082200154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152516024808301939282900301818588803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b5050505050505050565b610e5b6110c2565b6033546001600160a01b03908116911614610eab576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6001600160a01b038116610ef05760405162461bcd60e51b81526004018080602001828103825260268152602001806113086026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111c5565b90505b92915050565b6067546040805163f3fef3a360e01b81526001600160a01b038581166004830152602482018590529151600093929092169163f3fef3a391604480820192869290919082900301818387803b158015610fef57600080fd5b505af1925050508015611000575060015b61105b5761100c611262565b806110175750611021565b6000915050610f91565b3d80801561104b576040519150601f19603f3d011682016040523d82523d6000602084013e611050565b606091505b506000915050610f91565b506001610f91565b303190565b600082820183811015610f8e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b303b1590565b600054610100900460ff16806110e557506110e56110c6565b806110f3575060005460ff16155b61112e5760405162461bcd60e51b815260040180806020018281038252602e81526020018061132e602e913960400191505060405180910390fd5b600054610100900460ff16158015611159576000805460ff1961ff0019909116610100171660011790555b60006111636110c2565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561086a576000805461ff001916905550565b600081848411156112545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611219578181015183820152602001611201565b50505050905090810190601f1680156112465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60e01c90565b600060443d101561127257610aa7565b600481823e6308c379a0611286825161125c565b1461129057610aa7565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156112c05750505050610aa7565b828401925082519150808211156112da5750505050610aa7565b503d830160208284010111156112f257505050610aa7565b601f01601f191681016020016040529150509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122044dc13ecd382d44e224c83f15a2664cbcd216f5353e90015ec0f3d508eae68a364736f6c634300060c0033", "deployedBytecode": "0x6080604052600436106100e15760003560e01c806380d04de81161007f5780638ef3f761116100595780638ef3f761146102665780639168ae721461027b578063a3354161146102ae578063f2fde38b146102c3576100e8565b806380d04de8146102275780638129fc1c1461023c5780638da5cb5b14610251576100e8565b806340a141ff116100bb57806340a141ff146101795780634d238c8e146101ac57806370a08231146101df578063715018a614610212576100e8565b80632e1a7d4d146100ed57806335aa2e44146101295780633a4b66f11461016f576100e8565b366100e857005b600080fd5b3480156100f957600080fd5b506101176004803603602081101561011057600080fd5b50356102f6565b60408051918252519081900360200190f35b34801561013557600080fd5b506101536004803603602081101561014c57600080fd5b50356105c3565b604080516001600160a01b039092168252519081900360200190f35b6101776105ea565b005b34801561018557600080fd5b506101776004803603602081101561019c57600080fd5b50356001600160a01b0316610667565b3480156101b857600080fd5b50610177600480360360208110156101cf57600080fd5b50356001600160a01b031661086d565b3480156101eb57600080fd5b506101176004803603602081101561020257600080fd5b50356001600160a01b0316610917565b34801561021e57600080fd5b50610177610932565b34801561023357600080fd5b506101176109d4565b34801561024857600080fd5b50610177610aaa565b34801561025d57600080fd5b50610153610bcb565b34801561027257600080fd5b50610153610bda565b34801561028757600080fd5b506101176004803603602081101561029e57600080fd5b50356001600160a01b0316610be9565b3480156102ba57600080fd5b50610177610bfb565b3480156102cf57600080fd5b50610177600480360360208110156102e657600080fd5b50356001600160a01b0316610e53565b60008082156103055782610316565b336000908152606560205260409020545b90508080158015906103375750336000908152606560205260409020548211155b610388576040805162461bcd60e51b815260206004820152601760248201527f696e76616c696420776974686472617720616d6f756e74000000000000000000604482015290519081900360640190fd5b60005b60665481101561054257606754606680546000926001600160a01b0316916321429e6091309190869081106103bc57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561041257600080fd5b505afa158015610426573d6000803e3d6000fd5b505050506040513d602081101561043c57600080fd5b505190508061044b575061053a565b8281116104fc57606754606680546001600160a01b039092169163f3fef3a391908590811061047657fe5b6000918252602082200154604080516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201869052516044808301939282900301818387803b1580156104ca57600080fd5b505af11580156104de573d6000803e3d6000fd5b505050506104f58184610f4c90919063ffffffff16565b925061052d565b6105276066838154811061050c57fe5b6000918252602090912001546001600160a01b031684610f97565b50600092505b826105385750610542565b505b60010161038b565b5061054b611063565b82111561055d5761055a611063565b91505b336000908152606560205260409020546105779083610f4c565b3360009081526065602052604090205581156105bc57604051339083156108fc029084906000818181858888f193505050501580156105ba573d6000803e3d6000fd5b505b5092915050565b606681815481106105d057fe5b6000918252602090912001546001600160a01b0316905081565b60003411610633576040805162461bcd60e51b815260206004820152601160248201527007374616b65206d757374206265203e203607c1b604482015290519081900360640190fd5b61063b610bfb565b336000908152606560205260409020546106559034611068565b33600090815260656020526040902055565b61066f6110c2565b6033546001600160a01b039081169116146106bf576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6067546040805163010a14f360e51b81523060048201526001600160a01b038481166024830152915160009392909216916321429e6091604480820192602092909190829003018186803b15801561071657600080fd5b505afa15801561072a573d6000803e3d6000fd5b505050506040513d602081101561074057600080fd5b505190508015610779576000610754611063565b90506107608383610f97565b508061076a611063565b141561077757505061086a565b505b60005b60665481101561086757826001600160a01b03166066828154811061079d57fe5b6000918252602090912001546001600160a01b0316141561085f576066546000190181101561082d576066805460001981019081106107d857fe5b600091825260209091200154606680546001600160a01b0390921691839081106107fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b606680548061083857fe5b600082815260209020810160001990810180546001600160a01b0319169055019055610867565b60010161077c565b50505b50565b6108756110c2565b6033546001600160a01b039081169116146108c5576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b606680546001810182556000919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526065602052604090205490565b61093a6110c2565b6033546001600160a01b0390811691161461098a576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b600080805b606654811015610aa357606754606680546000926001600160a01b0316916321429e609130919086908110610a0a57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610a6057600080fd5b505afa158015610a74573d6000803e3d6000fd5b505050506040513d6020811015610a8a57600080fd5b50519050610a988382611068565b9250506001016109d9565b5090505b90565b600054610100900460ff1680610ac35750610ac36110c6565b80610ad1575060005460ff16155b610b0c5760405162461bcd60e51b815260040180806020018281038252602e81526020018061132e602e913960400191505060405180910390fd5b600054610100900460ff16158015610b37576000805460ff1961ff0019909116610100171660011790555b610b3f6110cc565b606780546001600160a01b0319908116733014ca10b91cb3d0ad85fef7a3cb95bcac9c0f7917909155606680546001810182556000919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435401805490911673cb876a393f05a6677a8a029f1c6d7603b416c0a6179055801561086a576000805461ff001916905550565b6033546001600160a01b031690565b6067546001600160a01b031681565b60656020526000908152604090205481565b606654610c48576040805162461bcd60e51b81526020600482015260166024820152756e6f20617070726f7665642076616c696461746f727360501b604482015290519081900360640190fd5b606754606680546000926001600160a01b0316916321429e60913091908590610c6d57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610cc357600080fd5b505afa158015610cd7573d6000803e3d6000fd5b505050506040513d6020811015610ced57600080fd5b50519050600060015b606654811015610dc057606754606680546000926001600160a01b0316916321429e609130919086908110610d2757fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610d7d57600080fd5b505afa158015610d91573d6000803e3d6000fd5b505050506040513d6020811015610da757600080fd5b5051905083811015610db7578192505b50600101610cf6565b50606754606680543031926001600160a01b031691635c19a95c9184919086908110610de857fe5b6000918252602082200154604080516001600160e01b031960e087901b1681526001600160a01b039092166004830152516024808301939282900301818588803b158015610e3557600080fd5b505af1158015610e49573d6000803e3d6000fd5b5050505050505050565b610e5b6110c2565b6033546001600160a01b03908116911614610eab576040805162461bcd60e51b8152602060048201819052602482015260008051602061135c833981519152604482015290519081900360640190fd5b6001600160a01b038116610ef05760405162461bcd60e51b81526004018080602001828103825260268152602001806113086026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f8e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506111c5565b90505b92915050565b6067546040805163f3fef3a360e01b81526001600160a01b038581166004830152602482018590529151600093929092169163f3fef3a391604480820192869290919082900301818387803b158015610fef57600080fd5b505af1925050508015611000575060015b61105b5761100c611262565b806110175750611021565b6000915050610f91565b3d80801561104b576040519150601f19603f3d011682016040523d82523d6000602084013e611050565b606091505b506000915050610f91565b506001610f91565b303190565b600082820183811015610f8e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b303b1590565b600054610100900460ff16806110e557506110e56110c6565b806110f3575060005460ff16155b61112e5760405162461bcd60e51b815260040180806020018281038252602e81526020018061132e602e913960400191505060405180910390fd5b600054610100900460ff16158015611159576000805460ff1961ff0019909116610100171660011790555b60006111636110c2565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561086a576000805461ff001916905550565b600081848411156112545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611219578181015183820152602001611201565b50505050905090810190601f1680156112465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60e01c90565b600060443d101561127257610aa7565b600481823e6308c379a0611286825161125c565b1461129057610aa7565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156112c05750505050610aa7565b828401925082519150808211156112da5750505050610aa7565b503d830160208284010111156112f257505050610aa7565b601f01601f191681016020016040529150509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122044dc13ecd382d44e224c83f15a2664cbcd216f5353e90015ec0f3d508eae68a364736f6c634300060c0033", "immutableReferences": {}, "sourceMap": "1005:3808:9:-:0;;;;;;;;;;;;;;;;;;;", "deployedSourceMap": "1005:3808:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1750:905;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1750:905:9;;:::i;:::-;;;;;;;;;;;;;;;;1154:27;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1154:27:9;;:::i;:::-;;;;-1:-1:-1;;;;;1154:27:9;;;;;;;;;;;;;;1482:167;;;:::i;:::-;;3477:653;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3477:653:9;-1:-1:-1;;;;;3477:653:9;;:::i;3135:78::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3135:78:9;-1:-1:-1;;;;;3135:78:9;;:::i;1652:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1652:95:9;-1:-1:-1;;;;;1652:95:9;;:::i;1956:145:13:-;;;;;;;;;;;;;:::i;3216:258:9:-;;;;;;;;;;;;;:::i;1246:233::-;;;;;;;;;;;;;:::i;1333:77:13:-;;;;;;;;;;;;;:::i;1185:27:9:-;;;;;;;;;;;;;:::i;1109:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1109:42:9;-1:-1:-1;;;;;1109:42:9;;:::i;2658:474::-;;;;;;;;;;;;;:::i;2250:240:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2250:240:13;-1:-1:-1;;;;;2250:240:13;;:::i;1750:905:9:-;1800:7;;1834:11;;:42;;1870:6;1834:42;;;1856:10;1848:19;;;;:7;:19;;;;;;1834:42;1813:63;-1:-1:-1;1813:63:9;1926:14;;;;;:51;;-1:-1:-1;1966:10:9;1958:19;;;;:7;:19;;;;;;1944:33;;;1926:51;1914:97;;;;;-1:-1:-1;;;1914:97:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;2020:9;2015:382;2039:10;:17;2035:21;;2015:382;;;2086:9;;2127:10;:13;;2068:11;;-1:-1:-1;;;;;2086:9:9;;:25;;2120:4;;2127:10;2138:1;;2127:13;;;;;;;;;;;;;;;;;2086:55;;;-1:-1:-1;;;;;;2086:55:9;;;;;;;-1:-1:-1;;;;;2086:55:9;;;;;;;2127:13;;;;2086:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2086:55:9;;-1:-1:-1;2150:8:9;2146:22;;2160:8;;;2146:22;2184:9;2177:3;:16;2173:190;;2201:9;;2220:10;:13;;-1:-1:-1;;;;;2201:9:9;;;;:18;;2220:10;2231:1;;2220:13;;;;;;;;;;;;;;;2201:38;;;-1:-1:-1;;;;;;2201:38:9;;;;;;;-1:-1:-1;;;;;2220:13:9;;;2201:38;;;;;;;;;;;;;;;;2220:13;2201:38;;;;;2220:13;2201:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2257:18;2271:3;2257:9;:13;;:18;;;;:::i;:::-;2245:30;;2173:190;;;2293:45;2313:10;2324:1;2313:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2313:13:9;2328:9;2293:19;:45::i;:::-;;2356:1;2344:13;;2173:190;2371:14;2367:25;;2387:5;;;2367:25;2015:382;;2058:3;;2015:382;;;;2462:9;:7;:9::i;:::-;2449:10;:22;2445:60;;;2491:9;:7;:9::i;:::-;2478:22;;2445:60;2539:10;2531:19;;;;:7;:19;;;;;;:35;;2555:10;2531:23;:35::i;:::-;2517:10;2509:19;;;;:7;:19;;;;;:57;2574:14;;2570:60;;2590:40;;2598:10;;2590:40;;;;;2619:10;;2590:40;;;;2619:10;2598;2590:40;;;;;;;;;;;;;;;;;;;;;2570:60;-1:-1:-1;2641:10:9;1750:905;-1:-1:-1;;1750:905:9:o;1154:27::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1154:27:9;;-1:-1:-1;1154:27:9;:::o;1482:167::-;1538:1;1526:9;:13;1518:43;;;;;-1:-1:-1;;;1518:43:9;;;;;;;;;;;;-1:-1:-1;;;1518:43:9;;;;;;;;;;;;;;;1565:20;:18;:20::i;:::-;1619:10;1611:19;;;;:7;:19;;;;;;:34;;1635:9;1611:23;:34::i;:::-;1597:10;1589:19;;;;:7;:19;;;;;:56;1482:167::o;3477:653::-;1547:12:13;:10;:12::i;:::-;1537:6;;-1:-1:-1;;;;;1537:6:13;;;:22;;;1529:67;;;;;-1:-1:-1;;;1529:67:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1529:67:13;;;;;;;;;;;;;;;3563:9:9::1;::::0;:52:::1;::::0;;-1:-1:-1;;;3563:52:9;;3597:4:::1;3563:52;::::0;::::1;::::0;-1:-1:-1;;;;;3563:52:9;;::::1;::::0;;;;;;3543:17:::1;::::0;3563:9;;;::::1;::::0;:25:::1;::::0;:52;;;;;::::1;::::0;;;;;;;;;:9;:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3563:52:9;;-1:-1:-1;3623:13:9;;3619:282:::1;;3643:19;3665:9;:7;:9::i;:::-;3643:31;;3679:42;3699:10;3711:9;3679:19;:42::i;:::-;;3823:11;3810:9;:7;:9::i;:::-;:24;3806:91;;;3885:7;;;;3806:91;3619:282;;3912:9;3907:220;3931:10;:17:::0;3927:21;::::1;3907:220;;;3981:10;-1:-1:-1::0;;;;;3964:27:9::1;:10;3975:1;3964:13;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;3964:13:9::1;:27;3960:163;;;4007:10;:17:::0;-1:-1:-1;;4007:21:9;4003:25;::::1;3999:85;;;4051:10;4062:17:::0;;-1:-1:-1;;4062:21:9;;;4051:33;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;4035:10:::1;:13:::0;;-1:-1:-1;;;;;4051:33:9;;::::1;::::0;4046:1;;4035:13;::::1;;;;;;;;;;;;;:49;;;;;-1:-1:-1::0;;;;;4035:49:9::1;;;;;-1:-1:-1::0;;;;;4035:49:9::1;;;;;;3999:85;4090:10;:16;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;4090:16:9;;;;;-1:-1:-1;;;;;;4090:16:9::1;::::0;;;;;4112:5:::1;;3960:163;3950:3;;3907:220;;;;1606:1:13;;3477:653:9::0;:::o;3135:78::-;1547:12:13;:10;:12::i;:::-;1537:6;;-1:-1:-1;;;;;1537:6:13;;;:22;;;1529:67;;;;;-1:-1:-1;;;1529:67:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1529:67:13;;;;;;;;;;;;;;;3190:10:9::1;:19:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;3190:19:9;;;;;::::1;::::0;;-1:-1:-1;;;;;;3190:19:9::1;-1:-1:-1::0;;;;;3190:19:9;;;::::1;::::0;;;::::1;::::0;;3135:78::o;1652:95::-;-1:-1:-1;;;;;1728:15:9;1708:7;1728:15;;;:7;:15;;;;;;;1652:95::o;1956:145:13:-;1547:12;:10;:12::i;:::-;1537:6;;-1:-1:-1;;;;;1537:6:13;;;:22;;;1529:67;;;;;-1:-1:-1;;;1529:67:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1529:67:13;;;;;;;;;;;;;;;2046:6:::1;::::0;2025:40:::1;::::0;2062:1:::1;::::0;-1:-1:-1;;;;;2046:6:13::1;::::0;2025:40:::1;::::0;2062:1;;2025:40:::1;2075:6;:19:::0;;-1:-1:-1;;;;;;2075:19:13::1;::::0;;1956:145::o;3216:258:9:-;3263:7;;;3297:158;3321:10;:17;3317:21;;3297:158;;;3368:9;;3409:10;:13;;3350:11;;-1:-1:-1;;;;;3368:9:9;;:25;;3402:4;;3409:10;3420:1;;3409:13;;;;;;;;;;;;;;;;;3368:55;;;-1:-1:-1;;;;;;3368:55:9;;;;;;;-1:-1:-1;;;;;3368:55:9;;;;;;;3409:13;;;;3368:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3368:55:9;;-1:-1:-1;3436:14:9;:5;3368:55;3436:9;:14::i;:::-;3428:22;-1:-1:-1;;3340:3:9;;3297:158;;;-1:-1:-1;3465:5:9;-1:-1:-1;3216:258:9;;:::o;1246:233::-;1472:13:16;;;;;;;;:33;;;1489:16;:14;:16::i;:::-;1472:50;;;-1:-1:-1;1510:12:16;;;;1509:13;1472:50;1464:109;;;;-1:-1:-1;;;1464:109:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1584:19;1607:13;;;;;;1606:14;1630:98;;;;1664:13;:20;;-1:-1:-1;;;;1664:20:16;;;;;1698:19;1680:4;1698:19;;;1630:98;1291:26:9::1;:24;:26::i;:::-;1321:9;:82:::0;;-1:-1:-1;;;;;;1321:82:9;;::::1;1356:42;1321:82;::::0;;;1407:10:::1;:68:::0;;1321:82;1407:68;::::1;::::0;;1321:9:::1;1407:68:::0;;;;;::::1;::::0;;;;::::1;1431:42;1407:68;::::0;;1750:66:16;;;;1800:5;1784:21;;-1:-1:-1;;1784:21:16;;;1246:233:9;:::o;1333:77:13:-;1397:6;;-1:-1:-1;;;;;1397:6:13;1333:77;:::o;1185:27:9:-;;;-1:-1:-1;;;;;1185:27:9;;:::o;1109:42::-;;;;;;;;;;;;;:::o;2658:474::-;2707:10;:17;2699:56;;;;;-1:-1:-1;;;2699:56:9;;;;;;;;;;;;-1:-1:-1;;;2699:56:9;;;;;;;;;;;;;;;2774:9;;2815:10;:13;;2760:11;;-1:-1:-1;;;;;2774:9:9;;:25;;2808:4;;2815:10;2760:11;;2815:13;;;;;;;;;;;;;;;2774:55;;;-1:-1:-1;;;;;;2774:55:9;;;;;;;-1:-1:-1;;;;;2774:55:9;;;;;;;2815:13;;;;2774:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2774:55:9;;-1:-1:-1;2833:14:9;2872:1;2855:161;2879:10;:17;2875:21;;2855:161;;;2926:9;;2967:10;:13;;2908:11;;-1:-1:-1;;;;;2926:9:9;;:25;;2960:4;;2967:10;2978:1;;2967:13;;;;;;;;;;;;;;;;;2926:55;;;-1:-1:-1;;;;;;2926:55:9;;;;;;;-1:-1:-1;;;;;2926:55:9;;;;;;;2967:13;;;;2926:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2926:55:9;;-1:-1:-1;2990:9:9;;;2986:25;;;3010:1;3001:10;;2986:25;-1:-1:-1;2898:3:9;;2855:161;;;-1:-1:-1;3072:9:9;;3109:10;:18;;3053:4;3037:30;;-1:-1:-1;;;;;3072:9:9;;:18;;3037:30;;3109:10;3120:6;;3109:18;;;;;;;;;;;;;;;3072:56;;;-1:-1:-1;;;;;;3072:56:9;;;;;;;-1:-1:-1;;;;;3109:18:9;;;3072:56;;;;;;;;;;3109:18;3072:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2658:474;;;:::o;2250:240:13:-;1547:12;:10;:12::i;:::-;1537:6;;-1:-1:-1;;;;;1537:6:13;;;:22;;;1529:67;;;;;-1:-1:-1;;;1529:67:13;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1529:67:13;;;;;;;;;;;;;;;-1:-1:-1;;;;;2338:22:13;::::1;2330:73;;;;-1:-1:-1::0;;;2330:73:13::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2439:6;::::0;2418:38:::1;::::0;-1:-1:-1;;;;;2418:38:13;;::::1;::::0;2439:6:::1;::::0;2418:38:::1;::::0;2439:6:::1;::::0;2418:38:::1;2466:6;:17:::0;;-1:-1:-1;;;;;;2466:17:13::1;-1:-1:-1::0;;;;;2466:17:13;;;::::1;::::0;;;::::1;::::0;;2250:240::o;1340:134:15:-;1398:7;1424:43;1428:1;1431;1424:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1417:50;;1340:134;;;;;:::o;4133:547:9:-;4236:9;;:39;;;-1:-1:-1;;;4236:39:9;;-1:-1:-1;;;;;4236:39:9;;;;;;;;;;;;;;;4221:4;;4236:9;;;;;:18;;:39;;;;;4221:4;;4236:39;;;;;;;;4221:4;4236:9;:39;;;;;;;;;;;;;;;;;;;;;;;;;4232:445;;;;:::i;:::-;;;;;;;;4465:5;4458:12;;;;;4232:445;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4667:5;4660:12;;;;;4232:445;-1:-1:-1;4288:4:9;4281:11;;4683:96;4761:4;4745:30;4683:96;:::o;893:176:15:-;951:7;982:5;;;1005:6;;;;997:46;;;;;-1:-1:-1;;;997:46:15;;;;;;;;;;;;;;;;;;;;;;;;;;;828:104:12;915:10;828:104;:::o;1912:593:16:-;2348:4;2456:17;2491:7;1912:593;:::o;1065:192:13:-;1472:13:16;;;;;;;;:33;;;1489:16;:14;:16::i;:::-;1472:50;;;-1:-1:-1;1510:12:16;;;;1509:13;1472:50;1464:109;;;;-1:-1:-1;;;1464:109:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1584:19;1607:13;;;;;;1606:14;1630:98;;;;1664:13;:20;;-1:-1:-1;;;;1664:20:16;;;;;1698:19;1680:4;1698:19;;;1630:98;1132:17:13::1;1152:12;:10;:12::i;:::-;1174:6;:18:::0;;-1:-1:-1;;;;;;1174:18:13::1;-1:-1:-1::0;;;;;1174:18:13;::::1;::::0;;::::1;::::0;;;1207:43:::1;::::0;1174:18;;-1:-1:-1;1174:18:13;-1:-1:-1;;1207:43:13::1;::::0;-1:-1:-1;;1207:43:13::1;1738:1:16;1754:14:::0;1750:66;;;1800:5;1784:21;;-1:-1:-1;;1784:21:16;;;1065:192:13;:::o;1765:187:15:-;1851:7;1886:12;1878:6;;;;1870:29;;;;-1:-1:-1;;;1870:29:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1921:5:15;;;1765:187::o;110:106:-1:-;195:3;191:15;;163:53::o;224:739::-;;297:4;279:16;276:26;273:2;;;305:5;;273:2;339:1;-1:-1;;318:23;414:10;357:34;-1:-1;382:8;357:34;:::i;:::-;406:19;396:2;;429:5;;396:2;460;454:9;496:16;-1:-1;;492:24;339:1;454:9;468:49;543:4;537:11;624:16;576:18;624:16;617:4;609:6;605:17;602:39;576:18;568:6;565:30;556:91;553:2;;;655:5;;;;;;553:2;693:6;687:4;683:17;672:28;;725:3;719:10;705:24;;576:18;740:6;737:30;734:2;;;770:5;;;;;;734:2;;847:16;841:4;837:27;807:4;814:6;802:3;794:27;;829:36;826:2;;;868:5;;;;;826:2;89:7;73:14;-1:-1;;69:28;892:50;;807:4;892:50;460:2;881:62;900:3;-1:-1;;267:696;:::o", "source": "pragma solidity >=0.6;\nimport \"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\n\n// SPDX-License-Identifier: MIT\n\ninterface IConsensus {\n\t/**\n\t * @dev delegate to a validator\n\t * @param _validator the address of the validator msg.sender is delegating to\n\t */\n\tfunction delegate(address _validator) external payable;\n\n\t/**\n\t * @dev Function to be called when a delegator whishes to withdraw some of his staked funds for a validator\n\t * @param _validator the address of the validator msg.sender has delegating to\n\t * @param _amount the amount msg.sender wishes to withdraw from the contract\n\t */\n\tfunction withdraw(address _validator, uint256 _amount) external;\n\n\tfunction delegatedAmount(address _address, address _validator)\n\t\texternal\n\t\tview\n\t\treturns (uint256);\n\n\tfunction stakeAmount(address _address) external view returns (uint256);\n}\n\ncontract FuseStakingV2 is Initializable, OwnableUpgradeable {\n\tusing SafeMathUpgradeable for uint256;\n\n\tmapping(address => uint256) public stakers;\n\taddress[] public validators;\n\n\tIConsensus public consensus;\n\n\t/**\n\t * @dev initialize\n\t */\n\tfunction initialize() public initializer {\n\t\t__Ownable_init_unchained();\n\t\tconsensus = IConsensus(\n\t\t\taddress(0x3014ca10b91cb3D0AD85fEf7A3Cb95BCAc9c0f79)\n\t\t);\n\t\tvalidators.push(address(0xcb876A393F05a6677a8a029f1C6D7603B416C0A6));\n\t}\n\n\tfunction stake() public payable {\n\t\trequire(msg.value > 0, \"stake must be > 0\");\n\t\tstakeNextValidator();\n\t\tstakers[msg.sender] = stakers[msg.sender].add(msg.value);\n\t}\n\n\tfunction balanceOf(address _owner) public view returns (uint256) {\n\t\treturn stakers[_owner];\n\t}\n\n\tfunction withdraw(uint256 _value) public returns (uint256) {\n\t\tuint256 toWithdraw = _value == 0 ? stakers[msg.sender] : _value;\n\t\tuint256 toCollect = toWithdraw;\n\t\trequire(\n\t\t\ttoWithdraw > 0 && toWithdraw <= stakers[msg.sender],\n\t\t\t\"invalid withdraw amount\"\n\t\t);\n\t\tfor (uint256 i = 0; i < validators.length; i++) {\n\t\t\tuint256 cur =\n\t\t\t\tconsensus.delegatedAmount(address(this), validators[i]);\n\t\t\tif (cur == 0) continue;\n\t\t\tif (cur <= toCollect) {\n\t\t\t\tconsensus.withdraw(validators[i], cur);\n\t\t\t\ttoCollect = toCollect.sub(cur);\n\t\t\t} else {\n\t\t\t\tundelegateWithCatch(validators[i], toCollect);\n\t\t\t\ttoCollect = 0;\n\t\t\t}\n\t\t\tif (toCollect == 0) break;\n\t\t}\n\n\t\t// in case some funds where not withdrawn\n\t\tif (toWithdraw > balance()) {\n\t\t\ttoWithdraw = balance();\n\t\t}\n\n\t\tstakers[msg.sender] = stakers[msg.sender].sub(toWithdraw);\n\t\tif (toWithdraw > 0) payable(msg.sender).transfer(toWithdraw);\n\t\treturn toWithdraw;\n\t}\n\n\tfunction stakeNextValidator() public {\n\t\trequire(validators.length > 0, \"no approved validators\");\n\n\t\tuint256 min = consensus.delegatedAmount(address(this), validators[0]);\n\t\tuint256 minIdx = 0;\n\t\tfor (uint256 i = 1; i < validators.length; i++) {\n\t\t\tuint256 cur =\n\t\t\t\tconsensus.delegatedAmount(address(this), validators[i]);\n\t\t\tif (cur < min) minIdx = i;\n\t\t}\n\t\tuint256 balance = payable(address(this)).balance;\n\n\t\tconsensus.delegate{ value: balance }(validators[minIdx]);\n\t}\n\n\tfunction addValidator(address _v) public onlyOwner {\n\t\tvalidators.push(_v);\n\t}\n\n\tfunction totalDelegated() public view returns (uint256) {\n\t\tuint256 total = 0;\n\t\tfor (uint256 i = 0; i < validators.length; i++) {\n\t\t\tuint256 cur =\n\t\t\t\tconsensus.delegatedAmount(address(this), validators[i]);\n\t\t\ttotal = total.add(cur);\n\t\t}\n\t\treturn total;\n\t}\n\n\tfunction removeValidator(address _validator) public onlyOwner {\n\t\tuint256 delegated = consensus.delegatedAmount(address(this), _validator);\n\t\tif (delegated > 0) {\n\t\t\tuint256 prevBalance = balance();\n\t\t\tundelegateWithCatch(_validator, delegated);\n\n\t\t\t// wasnt withdrawn because validator needs to be taken of active validators\n\t\t\tif (balance() == prevBalance) {\n\t\t\t\t// pendingValidators.push(_validator);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (uint256 i = 0; i < validators.length; i++) {\n\t\t\tif (validators[i] == _validator) {\n\t\t\t\tif (i < validators.length - 1)\n\t\t\t\t\tvalidators[i] = validators[validators.length - 1];\n\t\t\t\tvalidators.pop();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction undelegateWithCatch(address _validator, uint256 _amount)\n\t\tinternal\n\t\treturns (bool)\n\t{\n\t\ttry consensus.withdraw(_validator, _amount) {\n\t\t\treturn true;\n\t\t} catch Error(\n\t\t\tstring memory /*reason*/\n\t\t) {\n\t\t\t// This is executed in case\n\t\t\t// revert was called inside getData\n\t\t\t// and a reason string was provided.\n\t\t\treturn false;\n\t\t} catch (\n\t\t\tbytes memory /*lowLevelData*/\n\t\t) {\n\t\t\t// This is executed in case revert() was used\n\t\t\t// or there was a failing assertion, division\n\t\t\t// by zero, etc. inside getData.\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction balance() internal view returns (uint256) {\n\t\treturn payable(address(this)).balance;\n\t}\n\n\treceive() external payable {}\n}\n", "sourcePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/upgradables/contracts/staking/FuseStakingV2.sol", "ast": { "absolutePath": "/Users/hadar/workspace/GoodDollar/GoodBootstrap/packages/contracts/upgradables/contracts/staking/FuseStakingV2.sol", "exportedSymbols": { "FuseStakingV2": [ 6125 ], "IConsensus": [ 5612 ] }, "id": 6126, "license": "MIT", "nodeType": "SourceUnit", "nodes": [ { "id": 5578, "literals": [ "solidity", ">=", "0.6" ], "nodeType": "PragmaDirective", "src": "0:22:9" }, { "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol", "file": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol", "id": 5579, "nodeType": "ImportDirective", "scope": 6126, "sourceUnit": 8212, "src": "23:69:9", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol", "id": 5580, "nodeType": "ImportDirective", "scope": 6126, "sourceUnit": 7874, "src": "93:75:9", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol", "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol", "id": 5581, "nodeType": "ImportDirective", "scope": 6126, "sourceUnit": 8141, "src": "169:74:9", "symbolAliases": [], "unitAlias": "" }, { "abstract": false, "baseContracts": [], "contractDependencies": [], "contractKind": "interface", "documentation": null, "fullyImplemented": false, "id": 5612, "linearizedBaseContracts": [ 5612 ], "name": "IConsensus", "nodeType": "ContractDefinition", "nodes": [ { "body": null, "documentation": { "id": 5582, "nodeType": "StructuredDocumentation", "src": "302:120:9", "text": " @dev delegate to a validator\n @param _validator the address of the validator msg.sender is delegating to" }, "functionSelector": "5c19a95c", "id": 5587, "implemented": false, "kind": "function", "modifiers": [], "name": "delegate", "nodeType": "FunctionDefinition", "overrides": null, "parameters": { "id": 5585, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 5584, "mutability": "mutable", "name": "_validator", "nodeType": "VariableDeclaration", "overrides": null, "scope": 5587, "src": "442:18:9", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 5583, "name": "address", "nodeType": "ElementaryTypeName", "src": "442:7:9", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "value": null, "visibility": "internal" } ], "src": "441:20:9" }, "returnParameters": { "id": 5586, "nodeType": "ParameterList", "parameters": [], "src": "478:0:9" }, "scope": 5612, "src": "424:55:9", "stateMutability": "payable", "virtual": false, "visibility": "external" }, { "body": null, "documentation": { "id": 5588, "nodeType": "StructuredDocumentation", "src": "482:275:9", "text": " @dev