UNPKG

moonwalkerswap-stakingrewards

Version:
226 lines 1.84 MB
{ "contractName": "StakingRewardsFactory", "abi": [ { "inputs": [ { "internalType": "address", "name": "_rewardsToken", "type": "address" }, { "internalType": "uint256", "name": "_stakingRewardsGenesis", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "constant": true, "inputs": [], "name": "isOwner", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "renounceOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "rewardsToken", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "stakingRewardsGenesis", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "stakingRewardsInfoByStakingToken", "outputs": [ { "internalType": "address", "name": "stakingRewards", "type": "address" }, { "internalType": "uint256", "name": "rewardAmount", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "stakingTokens", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "stakingToken", "type": "address" }, { "internalType": "uint256", "name": "rewardAmount", "type": "uint256" }, { "internalType": "uint256", "name": "rewardsDuration", "type": "uint256" } ], "name": "deploy", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [], "name": "notifyRewardAmounts", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "stakingToken", "type": "address" } ], "name": "notifyRewardAmount", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rewardsToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stakingRewardsGenesis\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakingToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"rewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardsDuration\",\"type\":\"uint256\"}],\"name\":\"deploy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakingToken\",\"type\":\"address\"}],\"name\":\"notifyRewardAmount\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"notifyRewardAmounts\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"rewardsToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stakingRewardsGenesis\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakingRewardsInfoByStakingToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"stakingRewards\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"rewardAmount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakingTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"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.\"}}},\"userdoc\":{\"methods\":{\"deploy(address,uint256,uint256)\":{\"notice\":\"// permissioned functions\"},\"notifyRewardAmounts()\":{\"notice\":\"// permissionless functions\"}}}},\"settings\":{\"compilationTarget\":{\"/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol\":\"StakingRewardsFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/warrenmason/Documents/UniswapV3Contracts/Core/LiveContracts/StakingRewardsFactory/contracts/StakingRewardsFactory.sol\":{\"keccak256\":\"0xec9eab1f88b2d57691ecd0831d0ff7af15d6cb2000118d17d5de23f1654c1e3f\",\"urls\":[\"bzz-raw://4e62279c410e6446bb21630752f4608d48b048a93e3e0c854745869dd233908e\",\"dweb:/ipfs/Qmbx3MXnsNrb5iexnuZt1oFd9b5WPphKLyX9KTZQWcoLhM\"]}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b50604051611d41380380611d418339818101604052604081101561003357600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b039390931692909217909155600255611c89806100b86000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80638f32d59b116100715780638f32d59b14610168578063a0928c1114610184578063ae741d8d1461019e578063cfda5478146101a6578063d1af0c7d146101d8578063f2fde38b146101e0576100a9565b8063344e5e34146100ae5780636cf8caf8146100e7578063715018a61461013057806381e162981461013a5780638da5cb5b14610160575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610206565b604080516001600160a01b039092168252519081900360200190f35b61010d600480360360208110156100fd57600080fd5b50356001600160a01b031661022d565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610138610252565b005b6101386004803603602081101561015057600080fd5b50356001600160a01b03166102f5565b6100cb6104d0565b6101706104df565b604080519115158252519081900360200190f35b61018c6104f0565b60408051918252519081900360200190f35b6101386104f6565b610138600480360360608110156101bc57600080fd5b506001600160a01b038135169060208101359060400135610576565b6100cb6106f5565b610138600480360360208110156101f657600080fd5b50356001600160a01b0316610704565b6003818154811061021357fe5b6000918252602090912001546001600160a01b0316905081565b600460205260009081526040902080546001909101546001600160a01b039091169082565b61025a6104df565b6102ab576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002544210156103365760405162461bcd60e51b8152600401808060200182810382526034815260200180611bea6034913960400191505060405180910390fd5b6001600160a01b038082166000908152600460205260409020805490911661038f5760405162461bcd60e51b8152600401808060200182810382526037815260200180611c1e6037913960400191505060405180910390fd5b6001810154156104cc5760018082018054600091829055915483546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156103ff57600080fd5b505af1158015610413573d6000803e3d6000fd5b505050506040513d602081101561042957600080fd5b50516104665760405162461bcd60e51b815260040180806020018281038252603a815260200180611bb0603a913960400191505060405180910390fd5b815460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b1580156104b257600080fd5b505af11580156104c6573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60025481565b6003546105345760405162461bcd60e51b8152600401808060200182810382526045815260200180611b6b6045913960600191505060405180910390fd5b60005b6003548110156105735761056b6003828154811061055157fe5b6000918252602090912001546001600160a01b03166102f5565b600101610537565b50565b61057e6104df565b6105cf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0380841660009081526004602052604090208054909116156106295760405162461bcd60e51b815260040180806020018281038252602f815260200180611b3c602f913960400191505060405180910390fd5b60015460405130916001600160a01b0316908690859061064890610801565b6001600160a01b039485168152928416602084015292166040808301919091526060820192909252905190819003608001906000f08015801561068f573d6000803e3d6000fd5b5081546001600160a01b03199081166001600160a01b039283161783556001928301949094556003805492830181556000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9091018054909316931692909217905550565b6001546001600160a01b031681565b61070c6104df565b61075d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610573816001600160a01b0381166107a65760405162461bcd60e51b8152600401808060200182810382526026815260200180611b166026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6113078061080f8339019056fe60806040526000600455600060055534801561001a57600080fd5b506040516113073803806113078339818101604052608081101561003d57600080fd5b5080516020820151604083015160609093015160018055600280546001600160a01b039384166001600160a01b0319918216179091556003805495841695821695909517909455600080549290931691909316179055600655611262806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80637b0a47ee116100b8578063cd3daf9d1161007c578063cd3daf9d146102ad578063d1af0c7d146102b5578063df136d65146102bd578063e9fad8ee146102c5578063ebe2b12b146102cd578063ecd9ba82146102d557610141565b80637b0a47ee1461025257806380faa57d1461025a5780638b87634714610262578063a694fc3a14610288578063c8f33c91146102a557610141565b8063386a95251161010a578063386a9525146101d35780633c6b16ab146101db5780633d18b912146101f85780633fc6df6e1461020057806370a082311461022457806372f702f31461024a57610141565b80628cc262146101465780630700037d1461017e57806318160ddd146101a45780631c1f78eb146101ac5780632e1a7d4d146101b4575b600080fd5b61016c6004803603602081101561015c57600080fd5b50356001600160a01b031661030d565b60408051918252519081900360200190f35b61016c6004803603602081101561019457600080fd5b50356001600160a01b03166103a3565b61016c6103b5565b61016c6103bc565b6101d1600480360360208110156101ca57600080fd5b50356103da565b005b61016c610569565b6101d1600480360360208110156101f157600080fd5b503561056f565b6101d16107c0565b6102086108e4565b604080516001600160a01b039092168252519081900360200190f35b61016c6004803603602081101561023a57600080fd5b50356001600160a01b03166108f3565b61020861090e565b61016c61091d565b61016c610923565b61016c6004803603602081101561027857600080fd5b50356001600160a01b0316610931565b6101d16004803603602081101561029e57600080fd5b5035610943565b61016c610acc565b61016c610ad2565b610208610b2c565b61016c610b3b565b6101d1610b41565b61016c610b64565b6101d1600480360360a08110156102eb57600080fd5b5080359060208101359060ff6040820135169060608101359060800135610b6a565b6001600160a01b0381166000908152600a6020908152604080832054600990925282205461039d919061039190670de0b6b3a7640000906103859061036090610354610ad2565b9063ffffffff610d8c16565b6001600160a01b0388166000908152600c60205260409020549063ffffffff610de916565b9063ffffffff610e4916565b9063ffffffff610eb316565b92915050565b600a6020526000908152604090205481565b600b545b90565b60006103d5600654600554610de990919063ffffffff16565b905090565b60018054810190819055336103ed610ad2565b6008556103f8610923565b6007556001600160a01b0381161561043f576104138161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008311610488576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600b5461049b908463ffffffff610d8c16565b600b55336000908152600c60205260409020546104be908463ffffffff610d8c16565b336000818152600c60205260409020919091556003546104ea916001600160a01b039091169085610f0d565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2506001548114610565576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b5050565b60065481565b6000546001600160a01b031633146105b85760405162461bcd60e51b815260040180806020018281038252602a8152602001806111da602a913960400191505060405180910390fd5b60006105c2610ad2565b6008556105cd610923565b6007556001600160a01b03811615610614576105e88161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60045442106106395760065461063190839063ffffffff610e4916565b600555610688565b60045460009061064f904263ffffffff610d8c16565b9050600061066860055483610de990919063ffffffff16565b60065490915061068290610385868463ffffffff610eb316565b60055550505b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d60208110156106fd57600080fd5b505160065490915061071690829063ffffffff610e4916565b600554111561076c576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b426007819055600654610785919063ffffffff610eb316565b6004556040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60018054810190819055336107d3610ad2565b6008556107de610923565b6007556001600160a01b03811615610825576107f98161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b336000908152600a6020526040902054801561089b57336000818152600a6020526040812055600254610864916001600160a01b039091169083610f0d565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505060015481146108e1576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b50565b6000546001600160a01b031681565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b60055481565b60006103d542600454610f64565b60096020526000908152604090205481565b6001805481019081905533610956610ad2565b600855610961610923565b6007556001600160a01b038116156109a85761097c8161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b600083116109ee576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b54610a01908463ffffffff610eb316565b600b55336000908152600c6020526040902054610a24908463ffffffff610eb316565b336000818152600c6020526040902091909155600354610a51916001600160a01b03909116903086610f7a565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610565576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b60075481565b6000600b5460001415610ae857506008546103b9565b6103d5610b1d600b54610385670de0b6b3a7640000610b11600554610b11600754610354610923565b9063ffffffff610de916565b6008549063ffffffff610eb316565b6002546001600160a01b031681565b60085481565b336000908152600c6020526040902054610b5a906103da565b610b626107c0565b565b60045481565b6001805481019081905533610b7d610ad2565b600855610b88610923565b6007556001600160a01b03811615610bcf57610ba38161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008711610c15576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b54610c28908863ffffffff610eb316565b600b55336000908152600c6020526040902054610c4b908863ffffffff610eb316565b336000818152600c602052604080822093909355600354835163d505accf60e01b81526004810193909352306024840152604483018b9052606483018a905260ff8916608484015260a4830188905260c4830187905292516001600160a01b039093169263d505accf9260e480820193929182900301818387803b158015610cd257600080fd5b505af1158015610ce6573d6000803e3d6000fd5b5050600354610d0992506001600160a01b0316905033308a63ffffffff610f7a16565b60408051888152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610d84576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b505050505050565b600082821115610de3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082610df85750600061039d565b82820282848281610e0557fe5b0414610e425760405162461bcd60e51b81526004018080602001828103825260218152602001806111b96021913960400191505060405180910390fd5b9392505050565b6000808211610e9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481610eaa57fe5b04949350505050565b600082820183811015610e42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f5f908490610fda565b505050565b6000818310610f735781610e42565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610fd4908590610fda565b50505050565b610fec826001600160a01b0316611192565b61103d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061107b5780518252601f19909201916020918201910161105c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146110dd576040519150601f19603f3d011682016040523d82523d6000602084013e6110e2565b606091505b509150915081611139576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610fd45780806020019051602081101561115557600080fd5b5051610fd45760405162461bcd60e51b815260040180806020018281038252602a815260200180611204602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582035fef3b733031f848d73e264e1cea263beecd38ce6a97acb22e06731a89c5eb964736f6c634300051000324f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e6752657761726473466163746f72793a3a6465706c6f793a20616c7265616479206465706c6f7965645374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e74733a2063616c6c6564206265666f726520616e79206465706c6f79735374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a207472616e73666572206661696c65645374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f742072656164795374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74206465706c6f796564a265627a7a72315820c548511923dfb3c25bcd2ebbe4ca028265d734058295353a9cbc749dc9bb068664736f6c63430005100032", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80638f32d59b116100715780638f32d59b14610168578063a0928c1114610184578063ae741d8d1461019e578063cfda5478146101a6578063d1af0c7d146101d8578063f2fde38b146101e0576100a9565b8063344e5e34146100ae5780636cf8caf8146100e7578063715018a61461013057806381e162981461013a5780638da5cb5b14610160575b600080fd5b6100cb600480360360208110156100c457600080fd5b5035610206565b604080516001600160a01b039092168252519081900360200190f35b61010d600480360360208110156100fd57600080fd5b50356001600160a01b031661022d565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610138610252565b005b6101386004803603602081101561015057600080fd5b50356001600160a01b03166102f5565b6100cb6104d0565b6101706104df565b604080519115158252519081900360200190f35b61018c6104f0565b60408051918252519081900360200190f35b6101386104f6565b610138600480360360608110156101bc57600080fd5b506001600160a01b038135169060208101359060400135610576565b6100cb6106f5565b610138600480360360208110156101f657600080fd5b50356001600160a01b0316610704565b6003818154811061021357fe5b6000918252602090912001546001600160a01b0316905081565b600460205260009081526040902080546001909101546001600160a01b039091169082565b61025a6104df565b6102ab576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002544210156103365760405162461bcd60e51b8152600401808060200182810382526034815260200180611bea6034913960400191505060405180910390fd5b6001600160a01b038082166000908152600460205260409020805490911661038f5760405162461bcd60e51b8152600401808060200182810382526037815260200180611c1e6037913960400191505060405180910390fd5b6001810154156104cc5760018082018054600091829055915483546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169263a9059cbb92604480820193602093909283900390910190829087803b1580156103ff57600080fd5b505af1158015610413573d6000803e3d6000fd5b505050506040513d602081101561042957600080fd5b50516104665760405162461bcd60e51b815260040180806020018281038252603a815260200180611bb0603a913960400191505060405180910390fd5b815460408051633c6b16ab60e01b81526004810184905290516001600160a01b0390921691633c6b16ab9160248082019260009290919082900301818387803b1580156104b257600080fd5b505af11580156104c6573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60025481565b6003546105345760405162461bcd60e51b8152600401808060200182810382526045815260200180611b6b6045913960600191505060405180910390fd5b60005b6003548110156105735761056b6003828154811061055157fe5b6000918252602090912001546001600160a01b03166102f5565b600101610537565b50565b61057e6104df565b6105cf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0380841660009081526004602052604090208054909116156106295760405162461bcd60e51b815260040180806020018281038252602f815260200180611b3c602f913960400191505060405180910390fd5b60015460405130916001600160a01b0316908690859061064890610801565b6001600160a01b039485168152928416602084015292166040808301919091526060820192909252905190819003608001906000f08015801561068f573d6000803e3d6000fd5b5081546001600160a01b03199081166001600160a01b039283161783556001928301949094556003805492830181556000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9091018054909316931692909217905550565b6001546001600160a01b031681565b61070c6104df565b61075d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610573816001600160a01b0381166107a65760405162461bcd60e51b8152600401808060200182810382526026815260200180611b166026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6113078061080f8339019056fe60806040526000600455600060055534801561001a57600080fd5b506040516113073803806113078339818101604052608081101561003d57600080fd5b5080516020820151604083015160609093015160018055600280546001600160a01b039384166001600160a01b0319918216179091556003805495841695821695909517909455600080549290931691909316179055600655611262806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80637b0a47ee116100b8578063cd3daf9d1161007c578063cd3daf9d146102ad578063d1af0c7d146102b5578063df136d65146102bd578063e9fad8ee146102c5578063ebe2b12b146102cd578063ecd9ba82146102d557610141565b80637b0a47ee1461025257806380faa57d1461025a5780638b87634714610262578063a694fc3a14610288578063c8f33c91146102a557610141565b8063386a95251161010a578063386a9525146101d35780633c6b16ab146101db5780633d18b912146101f85780633fc6df6e1461020057806370a082311461022457806372f702f31461024a57610141565b80628cc262146101465780630700037d1461017e57806318160ddd146101a45780631c1f78eb146101ac5780632e1a7d4d146101b4575b600080fd5b61016c6004803603602081101561015c57600080fd5b50356001600160a01b031661030d565b60408051918252519081900360200190f35b61016c6004803603602081101561019457600080fd5b50356001600160a01b03166103a3565b61016c6103b5565b61016c6103bc565b6101d1600480360360208110156101ca57600080fd5b50356103da565b005b61016c610569565b6101d1600480360360208110156101f157600080fd5b503561056f565b6101d16107c0565b6102086108e4565b604080516001600160a01b039092168252519081900360200190f35b61016c6004803603602081101561023a57600080fd5b50356001600160a01b03166108f3565b61020861090e565b61016c61091d565b61016c610923565b61016c6004803603602081101561027857600080fd5b50356001600160a01b0316610931565b6101d16004803603602081101561029e57600080fd5b5035610943565b61016c610acc565b61016c610ad2565b610208610b2c565b61016c610b3b565b6101d1610b41565b61016c610b64565b6101d1600480360360a08110156102eb57600080fd5b5080359060208101359060ff6040820135169060608101359060800135610b6a565b6001600160a01b0381166000908152600a6020908152604080832054600990925282205461039d919061039190670de0b6b3a7640000906103859061036090610354610ad2565b9063ffffffff610d8c16565b6001600160a01b0388166000908152600c60205260409020549063ffffffff610de916565b9063ffffffff610e4916565b9063ffffffff610eb316565b92915050565b600a6020526000908152604090205481565b600b545b90565b60006103d5600654600554610de990919063ffffffff16565b905090565b60018054810190819055336103ed610ad2565b6008556103f8610923565b6007556001600160a01b0381161561043f576104138161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008311610488576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b600b5461049b908463ffffffff610d8c16565b600b55336000908152600c60205260409020546104be908463ffffffff610d8c16565b336000818152600c60205260409020919091556003546104ea916001600160a01b039091169085610f0d565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2506001548114610565576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b5050565b60065481565b6000546001600160a01b031633146105b85760405162461bcd60e51b815260040180806020018281038252602a8152602001806111da602a913960400191505060405180910390fd5b60006105c2610ad2565b6008556105cd610923565b6007556001600160a01b03811615610614576105e88161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60045442106106395760065461063190839063ffffffff610e4916565b600555610688565b60045460009061064f904263ffffffff610d8c16565b9050600061066860055483610de990919063ffffffff16565b60065490915061068290610385868463ffffffff610eb316565b60055550505b600254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d60208110156106fd57600080fd5b505160065490915061071690829063ffffffff610e4916565b600554111561076c576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b426007819055600654610785919063ffffffff610eb316565b6004556040805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60018054810190819055336107d3610ad2565b6008556107de610923565b6007556001600160a01b03811615610825576107f98161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b336000908152600a6020526040902054801561089b57336000818152600a6020526040812055600254610864916001600160a01b039091169083610f0d565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505060015481146108e1576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b50565b6000546001600160a01b031681565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b60055481565b60006103d542600454610f64565b60096020526000908152604090205481565b6001805481019081905533610956610ad2565b600855610961610923565b6007556001600160a01b038116156109a85761097c8161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b600083116109ee576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b54610a01908463ffffffff610eb316565b600b55336000908152600c6020526040902054610a24908463ffffffff610eb316565b336000818152600c6020526040902091909155600354610a51916001600160a01b03909116903086610f7a565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610565576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b60075481565b6000600b5460001415610ae857506008546103b9565b6103d5610b1d600b54610385670de0b6b3a7640000610b11600554610b11600754610354610923565b9063ffffffff610de916565b6008549063ffffffff610eb316565b6002546001600160a01b031681565b60085481565b336000908152600c6020526040902054610b5a906103da565b610b626107c0565b565b60045481565b6001805481019081905533610b7d610ad2565b600855610b88610923565b6007556001600160a01b03811615610bcf57610ba38161030d565b6001600160a01b0382166000908152600a60209081526040808320939093556008546009909152919020555b60008711610c15576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b600b54610c28908863ffffffff610eb316565b600b55336000908152600c6020526040902054610c4b908863ffffffff610eb316565b336000818152600c602052604080822093909355600354835163d505accf60e01b81526004810193909352306024840152604483018b9052606483018a905260ff8916608484015260a4830188905260c4830187905292516001600160a01b039093169263d505accf9260e480820193929182900301818387803b158015610cd257600080fd5b505af1158015610ce6573d6000803e3d6000fd5b5050600354610d0992506001600160a01b0316905033308a63ffffffff610f7a16565b60408051888152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506001548114610d84576040805162461bcd60e51b815260206004820152601f6024820152600080516020611199833981519152604482015290519081900360640190fd5b505050505050565b600082821115610de3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082610df85750600061039d565b82820282848281610e0557fe5b0414610e425760405162461bcd60e51b81526004018080602001828103825260218152602001806111b96021913960400191505060405180910390fd5b9392505050565b6000808211610e9f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481610eaa57fe5b04949350505050565b600082820183811015610e42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f5f908490610fda565b505050565b6000818310610f735781610e42565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610fd4908590610fda565b50505050565b610fec826001600160a01b0316611192565b61103d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061107b5780518252601f19909201916020918201910161105c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146110dd576040519150601f19603f3d011682016040523d82523d6000602084013e6110e2565b606091505b509150915081611139576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610fd45780806020019051602081101561115557600080fd5b5051610fd45760405162461bcd60e51b815260040180806020018281038252602a815260200180611204602a913960400191505060405180910390fd5b3b15159056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a7231582035fef3b733031f848d73e264e1cea263beecd38ce6a97acb22e06731a89c5eb964736f6c634300051000324f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e6752657761726473466163746f72793a3a6465706c6f793a20616c7265616479206465706c6f7965645374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e74733a2063616c6c6564206265666f726520616e79206465706c6f79735374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a207472616e73666572206661696c65645374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f742072656164795374616b696e6752657761726473466163746f72793a3a6e6f74696679526577617264416d6f756e743a206e6f74206465706c6f796564a265627a7a72315820c548511923dfb3c25bcd2ebbe4ca028265d734058295353a9cbc749dc9bb068664736f6c63430005100032", "sourceMap": "23499:2830:0:-;;;24027:205;8:9:-1;5:2;;;30:1;27;20:12;5:2;24027:205:0;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24027:205:0;;;;;;;3399:6;:19;;-1:-1:-1;;;;;;3399:19:0;3408:10;3399:19;;;;24027:205;3433:40;-1:-1:-1;;;;;3466:6:0;;;;;3399;3433:40;;3399:6;;3433:40;24141:12;:28;;-1:-1:-1;;;;;;24141:28:0;-1:-1:-1;;;;;24141:28:0;;;;;;;;;;;24179:21;:46;23499:2830;;;-1:-1:-1;23499:2830:0;;", "deployedSourceMap": "23499:2830:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23499:2830:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:30;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23713:30:0;;:::i;:::-;;;;-1:-1:-1;;;;;23713:30:0;;;;;;;;;;;;;;23942:78;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23942:78:0;-1:-1:-1;;;;;23942:78:0;;:::i;:::-;;;;-1:-1:-1;;;;;23942:78:0;;;;;;;;;;;;;;;;;;;;;4341:137;;;:::i;:::-;;25534:793;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25534:793:0;-1:-1:-1;;;;;25534:793:0;;:::i;3556:77::-;;;:::i;3907:90::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23598:33;;;:::i;:::-;;;;;;;;;;;;;;;;25085:279;;;:::i;24459:529::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24459:529:0;;;;;;;;;;;;;:::i;23565:27::-;;;:::i;4627:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4627:107:0;-1:-1:-1;;;;;4627:107:0;;:::i;23713:30::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23713:30:0;;-1:-1:-1;23713:30:0;:::o;23942:78::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23942:78:0;;;;;:::o;4341:137::-;3760:9;:7;:9::i;:::-;3752:54;;;;;-1:-1:-1;;;3752:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4439:1;4423:6;;4402:40;;-1:-1:-1;;;;;4423:6:0;;;;4402:40;;4439:1;;4402:40;4469:1;4452:19;;-1:-1:-1;;;;;;4452:19:0;;;4341:137::o;25534:793::-;25628:21;;25609:15;:40;;25601:105;;;;-1:-1:-1;;;25601:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25751:46:0;;;25717:31;25751:46;;;:32;:46;;;;;25815:19;;25751:46;;25815:19;25807:101;;;;-1:-1:-1;;;25807:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25923:17;;;;:21;25919:402;;25980:17;;;;;;25960;26011:21;;;;26079:12;;26102:19;;26072:64;;;-1:-1:-1;;;26072:64:0;;-1:-1:-1;;;;;26102:19:0;;;26072:64;;;;;;;;;;;;26079:12;;;;;26072:29;;:64;;;;;;;;;;;;;;;;;;26079:12;26072:64;;;5:2:-1;;;;30:1;27;20:12;5:2;26072:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26072:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26072:64:0;26047:181;;;;-1:-1:-1;;;26047:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26257:19;;26242:68;;;-1:-1:-1;;;26242:68:0;;;;;;;;;;-1:-1:-1;;;;;26257:19:0;;;;26242:54;;:68;;;;;26257:19;;26242:68;;;;;;;;26257:19;;26242:68;;;5:2:-1;;;;30:1;27;20:12;5:2;26242:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26242:68:0;;;;25919:402;;25534:793;;:::o;3556:77::-;3594:7;3620:6;-1:-1:-1;;;;;3620:6:0;3556:77;:::o;3907:90::-;3947:4;3984:6;-1:-1:-1;;;;;3984:6:0;3970:10;:20;;3907:90::o;23598:33::-;;;;:::o;25085:279::-;25141:13;:20;25133:106;;;;-1:-1:-1;;;25133:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25254:6;25249:109;25270:13;:20;25266:24;;25249:109;;;25311:36;25330:13;25344:1;25330:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25330:16:0;25311:18;:36::i;:::-;25292:3;;25249:109;;;;25085:279::o;24459:529::-;3760:9;:7;:9::i;:::-;3752:54;;;;;-1:-1:-1;;;3752:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24602:46:0;;;24568:31;24602:46;;;:32;:46;;;;;24666:19;;24602:46;;24666:19;:33;24658:93;;;;-1:-1:-1;;;24658:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24852:12;;24792:104;;24845:4;;-1:-1:-1;;;;;24852:12:0;;24866;;24880:15;;24792:104;;;:::i;:::-;-1:-1:-1;;;;;24792:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24792:104:0;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;24762:135:0;;-1:-1:-1;;;;;;24762:135:0;;;-1:-1:-1;;;;;24762:135:0;;;;;;-1:-1:-1;24907:17:0;;;:32;;;;24949:13;27:10:-1;;23:18;;;45:23;;-1:-1;24949:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;24459:529:0:o;23565:27::-;;;-1:-1:-1;;;;;23565:27:0;;:::o;4627:107::-;3760:9;:7;:9::i;:::-;3752:54;;;;;-1:-1:-1;;;3752:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4699:28;4718:8;-1:-1:-1;;;;;4908:22:0;;4900:73;;;;-1:-1:-1;;;4900:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5009:6;;;4988:38;;-1:-1:-1;;;;;4988:38:0;;;;5009:6;;;4988:38;;;5036:6;:17;;-1:-1:-1;;;;;;5036:17:0;-1:-1:-1;;;;;5036:17:0;;;;;;;;;;4835:225::o;23499:2830::-;;;;;;;;:::o", "source": "//SPDX-License-Identifier: MIT\npragma solidity >=0.5.16;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP. Does not include\n * the optional functions; to access them see `ERC20Detailed`.\n */\ninterface IERC20 {\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `recipient`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a `Transfer` event.\n */\n function transfer(address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through `transferFrom`. This is\n * zero by default.\n *\n * This value changes when `approve` or `transferFrom` are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * > Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an `Approval` event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a `Transfer` event.\n */\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to `approve`. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be aplied to your functions to restrict their use to\n * the owner.\n */\ncontract Ownable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal{\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), _owner);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(isOwner(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Returns true if the caller is the current owner.\n */\n function isOwner() public view returns (bool) {\n return msg.sender == _owner;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * > Note: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public onlyOwner {\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n */\n function _transferOwnership(address newOwner) internal {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <=