Address Contract Verified
Address
0x2e57627ACf6c1812F99e274d0ac61B786c19E74f
Balance
0 ETH
Nonce
67
Code Size
21503 bytes
Creator
0xaCfE4511...c47C at tx 0x4545459b...b7b700
Indexed Transactions
0
Contract Bytecode
21503 bytes
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c8063ab033ea9116100de578063d0e30db011610097578063e522538111610071578063e5225381146107bf578063f1068454146107c9578063f2a1a8ed146107e7578063f39c38a0146108755761018d565b8063d0e30db0146107a1578063d826f88f146107ab578063e4fc6b6d146107b55761018d565b8063ab033ea91461054f578063b1a997ac14610593578063b1c6f0e9146105d7578063b9a09fd51461065b578063c19048b2146106df578063cad1b906146107295761018d565b80636f816a201161014b57806396c82e571161012557806396c82e57146104365780639d63848a146104545780639da882ac146104b3578063a7cac846146104f75761018d565b80636f816a20146102f057806382bfefc8146103be5780638d060519146104085761018d565b80622f8de4146101925780631f7b6d32146101ea578063238efcbc14610208578063471aedc2146102125780634eb1fbeb1461025c5780635aa6e675146102a6575b600080fd5b6101d4600480360360208110156101a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108bf565b6040518082815260200191505060405180910390f35b6101f26108d7565b6040518082815260200191505060405180910390f35b6102106108e4565b005b61021a610a0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610264610a23565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ae610a3b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103bc6004803603604081101561030657600080fd5b810190808035906020019064010000000081111561032357600080fd5b82018360208201111561033557600080fd5b8035906020019184602083028401116401000000008311171561035757600080fd5b90919293919293908035906020019064010000000081111561037857600080fd5b82018360208201111561038a57600080fd5b803590602001918460208302840111640100000000831117156103ac57600080fd5b9091929391929390505050610a60565b005b6103c6610b05565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104346004803603602081101561041e57600080fd5b8101908080359060200190929190505050610b29565b005b61043e610ce3565b6040518082815260200191505060405180910390f35b61045c610ce9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561049f578082015181840152602081019050610484565b505050509050019250505060405180910390f35b6104f5600480360360208110156104c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d77565b005b6105396004803603602081101561050d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061107d565b6040518082815260200191505060405180910390f35b6105916004803603602081101561056557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611095565b005b6105d5600480360360208110156105a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061119b565b005b610619600480360360208110156105ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61069d6004803603602081101561067157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611532565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106e7611565565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61078b6004803603604081101561073f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061157d565b6040518082815260200191505060405180910390f35b6107a96115a2565b005b6107b3611807565b005b6107bd611812565b005b6107c7611b27565b005b6107d1611c9f565b6040518082815260200191505060405180910390f35b610833600480360360408110156107fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ca5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61087d611cf0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60096020528060005260406000206000915090505481565b6000600480549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f616363657074476f7665726e616e63653a202170656e64696e67476f7600000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73bd17b1ce622d73bd438b9e658aca5996dc394b0d81565b73bbcf169ee191a1ba7371f30a1c344bfc498b29cf81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b818190508484905014610a7257600080fd5b610aff33858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611d16565b50505050565b7f00000000000000000000000045f7fa97bd0e0c212a844baea35876c7560f465b81565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600060025414610c63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f7069642068617320616c7265616479206265656e20736574000000000000000081525060200191505060405180910390fd5b60008111610cd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c69642070696400000000000000000000000000000000000000000081525060200191505060405180910390fd5b8060028190555050565b60035481565b60606004805480602002602001604051908101604052809291908181526020018280548015610d6d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d23575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e39576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260048152602001807f21676f760000000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f3a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f657869737473000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80604051610f4790612c16565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015610f99573d6000803e3d6000fd5b50600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f736574476f7665726e616e63653a2021676f760000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561125c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611212575b5050505050905060008151905060608167ffffffffffffffff8111801561128257600080fd5b506040519080825280602002602001820160405280156112b15781602001602082028036833780820191505090505b5090506000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600073bbcf169ee191a1ba7371f30a1c344bfc498b29cf73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561138b57600080fd5b505afa15801561139f573d6000803e3d6000fd5b505050506040513d60208110156113b557600080fd5b8101908080519060200190929190505050905060008090505b848110156114b5576000600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088848151811061142557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061148f84611481858461218290919063ffffffff16565b61222590919063ffffffff16565b85838151811061149b57fe5b6020026020010181815250505080806001019150506113ce565b506114c1868685611d16565b505050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73429881672b9ae42b8eba0e26cd9c73711b891ca581565b6007602052816000526040600020602052806000526040600020600091509150505481565b60006002541161161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f706964206e6f7420696e697469616c697a65640000000000000000000000000081525060200191505060405180910390fd5b60007f00000000000000000000000045f7fa97bd0e0c212a844baea35876c7560f465b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156116be57600080fd5b505afa1580156116d2573d6000803e3d6000fd5b505050506040513d60208110156116e857600080fd5b8101908080519060200190929190505050905061173b73bd17b1ce622d73bd438b9e658aca5996dc394b0d60008473ffffffffffffffffffffffffffffffffffffffff1661226f9092919063ffffffff16565b61177a73bd17b1ce622d73bd438b9e658aca5996dc394b0d828473ffffffffffffffffffffffffffffffffffffffff1661226f9092919063ffffffff16565b73bd17b1ce622d73bd438b9e658aca5996dc394b0d73ffffffffffffffffffffffffffffffffffffffff1663e2bbb158600254836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b1580156117eb57600080fd5b505af11580156117ff573d6000803e3d6000fd5b505050505050565b61181033612476565b565b61181a611b27565b600073429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118ad57600080fd5b505afa1580156118c1573d6000803e3d6000fd5b505050506040513d60208110156118d757600080fd5b810190808051906020019092919050505090506000811180156118fc57506000600354115b15611b245760008090505b600480549050811015611b225760006004828154811061192357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611a1c600354611a0e600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548861218290919063ffffffff16565b61222590919063ffffffff16565b90506000811115611b1257611a6782600073429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff1661226f9092919063ffffffff16565b611aa6828273429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff1661226f9092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff16633c6b16ab826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611af957600080fd5b505af1158015611b0d573d6000803e3d6000fd5b505050505b5050508080600101915050611907565b505b50565b600073bd17b1ce622d73bd438b9e658aca5996dc394b0d73ffffffffffffffffffffffffffffffffffffffff166393f1a40b600254306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d6040811015611bed57600080fd5b81019080805190602001909291908051906020019092919050505050905073bd17b1ce622d73bd438b9e658aca5996dc394b0d73ffffffffffffffffffffffffffffffffffffffff1663441a3e70600254836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b50505050611c9c6115a2565b50565b60025481565b60086020528160005260406000208181548110611cbe57fe5b906000526020600020016000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d1f83612476565b600082519050600073bbcf169ee191a1ba7371f30a1c344bfc498b29cf73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611db857600080fd5b505afa158015611dcc573d6000803e3d6000fd5b505050506040513d6020811015611de257600080fd5b810190808051906020019092919050505090506000809050600080905060008090505b84811015611e4257611e33868281518110611e1c57fe5b60200260200101518461272890919063ffffffff16565b92508080600101915050611e05565b5060008090505b84811015612134576000878281518110611e5f57fe5b602002602001015190506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611f0786611ef9898c8881518110611ee357fe5b602002602001015161218290919063ffffffff16565b61222590919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461212457611f50818661272890919063ffffffff16565b9450611f678160035461272890919063ffffffff16565b600381905550611fbf81600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461272890919063ffffffff16565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050508080600101915050611e49565b5080600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b600080831415612195576000905061221f565b60008284029050828482816121a657fe5b041461221a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f6d756c3a202a000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b600061226783836040518060400160405280600681526020017f6469763a202f00000000000000000000000000000000000000000000000000008152506127b0565b905092915050565b6000811480612369575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561232c57600080fd5b505afa158015612340573d6000803e3d6000fd5b505050506040513d602081101561235657600080fd5b8101908080519060200190929190505050145b6123be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806153946036913960400191505060405180910390fd5b6124718363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612876565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008180549050905060008090505b818110156126d75760008382815481106124de57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156126c8576125aa81600354612ac190919063ffffffff16565b60038190555061260281600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac190919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505080806001019150506124c8565b50600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006127239190612c23565b505050565b6000808284019050838110156127a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f6164643a202b000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8091505092915050565b6000808311829061285c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612821578082015181840152602081019050612806565b50505050905090810190601f16801561284e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161286857fe5b049050809150509392505050565b6128958273ffffffffffffffffffffffffffffffffffffffff16612b0b565b612907576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106129565780518252602082019150602081019050602083039250612933565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129b8576040519150601f19603f3d011682016040523d82523d6000602084013e6129bd565b606091505b509150915081612a35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115612abb57808060200190516020811015612a5457600080fd5b8101908080519060200190929190505050612aba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061536a602a913960400191505060405180910390fd5b5b50505050565b6000612b0383836040518060400160405280600681526020017f7375623a202d0000000000000000000000000000000000000000000000000000815250612b56565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015612b4d5750808214155b92505050919050565b6000838311158290612c03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bc8578082015181840152602081019050612bad565b50505050905090810190601f168015612bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b61270080612c6a83390190565b5080546000825590600052602060002090810190612c419190612c44565b50565b612c6691905b80821115612c62576000816000905550600101612c4a565b5090565b9056fe60c06040526000600155600060025534801561001a57600080fd5b506040516127003803806127008339818101604052602081101561003d57600080fd5b810190808051906020019092919050505060016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250503373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505060805160601c60a05160601c6125f96101076000398061096a5280610af6528061112952508061116052806115bb5280611b485280611f0552506125f96000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806380faa57d11610104578063c8f33c91116100a2578063de5f626811610071578063de5f626814610780578063df136d651461078a578063e9fad8ee146107a8578063ebe2b12b146107b2576101d9565b8063c8f33c91146106ce578063cd3daf9d146106ec578063d35e25441461070a578063d7da4bb014610762576101d9565b80638b876347116100de5780638b876347146105ba57806396c5517514610612578063b6b55f2514610656578063c19048b214610684576101d9565b806380faa57d1461054857806382bfefc814610566578063853828b6146105b0576101d9565b806336efd16f1161017c57806363fb415b1161014b57806363fb415b1461043057806370a08231146104885780637b0a47ee146104e05780637c91e4eb146104fe576101d9565b806336efd16f146103605780633c6b16ab146103ae5780633d18b912146103dc5780634eb1fbeb146103e6576101d9565b80631be05289116101b85780631be05289146102ac5780631c1f78eb146102ca5780632d2c5565146102e85780632e1a7d4d14610332576101d9565b80628cc262146101de5780630700037d1461023657806318160ddd1461028e575b600080fd5b610220600480360360208110156101f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107d0565b6040518082815260200191505060405180910390f35b6102786004803603602081101561024c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108ee565b6040518082815260200191505060405180910390f35b610296610906565b6040518082815260200191505060405180910390f35b6102b4610910565b6040518082815260200191505060405180910390f35b6102d2610917565b6040518082815260200191505060405180910390f35b6102f0610936565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61035e6004803603602081101561034857600080fd5b810190808035906020019092919050505061094e565b005b6103ac6004803603604081101561037657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061095a565b005b6103da600480360360208110156103c457600080fd5b8101908080359060200190929190505050610968565b005b6103e4610dd9565b005b6103ee6110a8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104726004803603602081101561044657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110c0565b6040518082815260200191505060405180910390f35b6104ca6004803603602081101561049e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d8565b6040518082815260200191505060405180910390f35b6104e8611121565b6040518082815260200191505060405180910390f35b610506611127565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61055061114b565b6040518082815260200191505060405180910390f35b61056e61115e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105b8611182565b005b6105fc600480360360208110156105d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111cc565b6040518082815260200191505060405180910390f35b6106546004803603602081101561062857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111e4565b005b6106826004803603602081101561066c57600080fd5b81019080803590602001909291905050506112b1565b005b61068c6112be565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106d66112d6565b6040518082815260200191505060405180910390f35b6106f46112dc565b6040518082815260200191505060405180910390f35b61074c6004803603602081101561072057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061136a565b6040518082815260200191505060405180910390f35b61076a6115b0565b6040518082815260200191505060405180910390f35b6107886115b6565b005b610792611699565b6040518082815260200191505060405180910390f35b6107b061169f565b005b6107ba6116f1565b6040518082815260200191505060405180910390f35b60006108e7600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108d9670de0b6b3a76400006108cb61087d600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461086f6112dc565b6116f790919063ffffffff16565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174190919063ffffffff16565b6117e490919063ffffffff16565b61182e90919063ffffffff16565b9050919050565b60066020528060005260406000206000915090505481565b6000600754905090565b62093a8081565b600061093162093a8060025461174190919063ffffffff16565b905090565b73066419eaef5de53cc5da0d8702b990c5bc7d1ab381565b610957816118b6565b50565b6109648282611c24565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612570602a913960400191505060405180910390fd5b6000610a166112dc565b600481905550610a2461114b565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610af157610a67816107d0565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600454600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610b527f0000000000000000000000000000000000000000000000000000000000000000308473429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff16611f95909392919063ffffffff16565b6001544210610b7c57610b7162093a80836117e490919063ffffffff16565b600281905550610bdf565b6000610b93426001546116f790919063ffffffff16565b90506000610bac6002548361174190919063ffffffff16565b9050610bd662093a80610bc8838761182e90919063ffffffff16565b6117e490919063ffffffff16565b60028190555050505b600073429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c7257600080fd5b505afa158015610c86573d6000803e3d6000fd5b505050506040513d6020811015610c9c57600080fd5b81019080805190602001909291905050509050610cc562093a80826117e490919063ffffffff16565b6002541115610d3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f50726f76696465642072657761726420746f6f2068696768000000000000000081525060200191505060405180910390fd5b42600381905550610d5962093a804261182e90919063ffffffff16565b6001819055507fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d836040518082815260200191505060405180910390a150600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610dd557610dd4816111e4565b5b5050565b60026000541415610e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260008190555033610e636112dc565b600481905550610e7161114b565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f3e57610eb4816107d0565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600454600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561105e576000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061100f338273429881672b9ae42b8eba0e26cd9c73711b891ca573ffffffffffffffffffffffffffffffffffffffff166120829092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486826040518082815260200191505060405180910390a25b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461109d5761109c816111e4565b5b506001600081905550565b73bbcf169ee191a1ba7371f30a1c344bfc498b29cf81565b600a6020528060005260406000206000915090505481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006111594260015461213a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111ca600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118b6565b565b60056020528060005260406000206000915090505481565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061123d816008546116f790919063ffffffff16565b60088190555061124c8261136a565b905080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112a78160085461182e90919063ffffffff16565b6008819055505050565b6112bb8133611c24565b50565b73429881672b9ae42b8eba0e26cd9c73711b891ca581565b60035481565b60008060075414156112f2576004549050611367565b611364611353600854611345670de0b6b3a764000061133760025461132960035461131b61114b565b6116f790919063ffffffff16565b61174190919063ffffffff16565b61174190919063ffffffff16565b6117e490919063ffffffff16565b60045461182e90919063ffffffff16565b90505b90565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006113d860646113ca60288561174190919063ffffffff16565b6117e490919063ffffffff16565b90506000611588606461157a603c61156c73bbcf169ee191a1ba7371f30a1c344bfc498b29cf73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561144357600080fd5b505afa158015611457573d6000803e3d6000fd5b505050506040513d602081101561146d57600080fd5b810190808051906020019092919050505061155e73bbcf169ee191a1ba7371f30a1c344bfc498b29cf73ffffffffffffffffffffffffffffffffffffffff166370a082318d6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b810190808051906020019092919050505060075461174190919063ffffffff16565b6117e490919063ffffffff16565b61174190919063ffffffff16565b6117e490919063ffffffff16565b90506115a66115a0828461182e90919063ffffffff16565b8461213a565b9350505050919050565b60085481565b6116977f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561165657600080fd5b505afa15801561166a573d6000803e3d6000fd5b505050506040513d602081101561168057600080fd5b810190808051906020019092919050505033611c24565b565b60045481565b6116e7600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118b6565b6116ef610dd9565b565b60015481565b600061173983836040518060400160405280600681526020017f7375623a202d0000000000000000000000000000000000000000000000000000815250612153565b905092915050565b60008083141561175457600090506117de565b600082840290508284828161176557fe5b04146117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f6d756c3a202a000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b809150505b92915050565b600061182683836040518060400160405280600681526020017f6469763a202f0000000000000000000000000000000000000000000000000000815250612213565b905092915050565b6000808284019050838110156118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260068152602001807f6164643a202b000000000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8091505092915050565b6002600054141561192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600081905550336119406112dc565b60048190555061194e61114b565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a1b57611991816107d0565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600454600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008211611a91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43616e6e6f74207769746864726177203000000000000000000000000000000081525060200191505060405180910390fd5b611aa6826007546116f790919063ffffffff16565b600781905550611afe82600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116f790919063ffffffff16565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b8c33837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166120829092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5836040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c1857611c17816111e4565b5b50600160008190555050565b60026000541415611c9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260008190555080611cae6112dc565b600481905550611cbc61114b565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611d8957611cff816107d0565b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600454600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60008311611dff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f43616e6e6f74207374616b65203000000000000000000000000000000000000081525060200191505060405180910390fd5b611e148360075461182e90919063ffffffff16565b600781905550611e6c83600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461182e90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d846040518082815260200191505060405180910390a2611f4a8230857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611f95909392919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f8857611f87816111e4565b5b5060016000819055505050565b61207c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122d9565b50505050565b6121358363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122d9565b505050565b6000818310612149578161214b565b825b905092915050565b6000838311158290612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121c55780820151818401526020810190506121aa565b50505050905090810190601f1680156121f25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182906122bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612284578082015181840152602081019050612269565b50505050905090810190601f1680156122b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816122cb57fe5b049050809150509392505050565b6122f88273ffffffffffffffffffffffffffffffffffffffff16612524565b61236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106123b95780518252602082019150602081019050602083039250612396565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461241b576040519150601f19603f3d011682016040523d82523d6000602084013e612420565b606091505b509150915081612498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b60008151111561251e578080602001905160208110156124b757600080fd5b810190808051906020019092919050505061251d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061259a602a913960400191505060405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156125665750808214155b9250505091905056fe43616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122048b1b0bae75d61a2f1ad82d823da216b61664185b66f318e405af7a35087aba564736f6c634300060700335361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122098d6c9c22936734e2890bf1bbb494999a2f2c4e544e40cdfc2ffb13460dddf9664736f6c63430006070033
Verified Source Code Full Match
Compiler: v0.6.7+commit.b8d736ae
EVM: istanbul
Optimization: No
gauge-proxy.sol 689 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.7; //^0.7.5;
library SafeMath {
function add(uint a, uint b) internal pure returns (uint) {
uint c = a + b;
require(c >= a, "add: +");
return c;
}
function add(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
uint c = a + b;
require(c >= a, errorMessage);
return c;
}
function sub(uint a, uint b) internal pure returns (uint) {
return sub(a, b, "sub: -");
}
function sub(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
require(b <= a, errorMessage);
uint c = a - b;
return c;
}
function mul(uint a, uint b) internal pure returns (uint) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint c = a * b;
require(c / a == b, "mul: *");
return c;
}
function mul(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
if (a == 0) {
return 0;
}
uint c = a * b;
require(c / a == b, errorMessage);
return c;
}
function div(uint a, uint b) internal pure returns (uint) {
return div(a, b, "div: /");
}
function div(uint a, uint b, string memory errorMessage) internal pure returns (uint) {
require(b > 0, errorMessage);
uint c = a / b;
return c;
}
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call{value:amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () public {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
contract Gauge is ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 public constant PICKLE = IERC20(0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5);
IERC20 public constant DILL = IERC20(0xbBCf169eE191A1Ba7371F30A1C344bFC498b29Cf);
address public constant TREASURY = address(0x066419EaEf5DE53cc5da0d8702b990c5bc7D1AB3);
IERC20 public immutable TOKEN;
address public immutable DISTRIBUTION;
uint256 public constant DURATION = 7 days;
uint256 public periodFinish = 0;
uint256 public rewardRate = 0;
uint256 public lastUpdateTime;
uint256 public rewardPerTokenStored;
modifier onlyDistribution() {
require(msg.sender == DISTRIBUTION, "Caller is not RewardsDistribution contract");
_;
}
mapping(address => uint256) public userRewardPerTokenPaid;
mapping(address => uint256) public rewards;
uint256 private _totalSupply;
uint public derivedSupply;
mapping(address => uint256) private _balances;
mapping(address => uint256) public derivedBalances;
mapping(address => uint) private _base;
constructor(address _token) public {
TOKEN = IERC20(_token);
DISTRIBUTION = msg.sender;
}
function totalSupply() external view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function lastTimeRewardApplicable() public view returns (uint256) {
return Math.min(block.timestamp, periodFinish);
}
function rewardPerToken() public view returns (uint256) {
if (_totalSupply == 0) {
return rewardPerTokenStored;
}
return
rewardPerTokenStored.add(
lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRate).mul(1e18).div(derivedSupply)
);
}
function derivedBalance(address account) public view returns (uint) {
uint _balance = _balances[account];
uint _derived = _balance.mul(40).div(100);
uint _adjusted = (_totalSupply.mul(DILL.balanceOf(account)).div(DILL.totalSupply())).mul(60).div(100);
return Math.min(_derived.add(_adjusted), _balance);
}
function kick(address account) public {
uint _derivedBalance = derivedBalances[account];
derivedSupply = derivedSupply.sub(_derivedBalance);
_derivedBalance = derivedBalance(account);
derivedBalances[account] = _derivedBalance;
derivedSupply = derivedSupply.add(_derivedBalance);
}
function earned(address account) public view returns (uint256) {
return derivedBalances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);
}
function getRewardForDuration() external view returns (uint256) {
return rewardRate.mul(DURATION);
}
function depositAll() external {
_deposit(TOKEN.balanceOf(msg.sender), msg.sender);
}
function deposit(uint256 amount) external {
_deposit(amount, msg.sender);
}
function depositFor(uint256 amount, address account) external {
_deposit(amount, account);
}
function _deposit(uint amount, address account) internal nonReentrant updateReward(account) {
require(amount > 0, "Cannot stake 0");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Staked(account, amount);
TOKEN.safeTransferFrom(account, address(this), amount);
}
function withdrawAll() external {
_withdraw(_balances[msg.sender]);
}
function withdraw(uint256 amount) external {
_withdraw(amount);
}
function _withdraw(uint amount) internal nonReentrant updateReward(msg.sender) {
require(amount > 0, "Cannot withdraw 0");
_totalSupply = _totalSupply.sub(amount);
_balances[msg.sender] = _balances[msg.sender].sub(amount);
TOKEN.safeTransfer(msg.sender, amount);
emit Withdrawn(msg.sender, amount);
}
function getReward() public nonReentrant updateReward(msg.sender) {
uint256 reward = rewards[msg.sender];
if (reward > 0) {
rewards[msg.sender] = 0;
PICKLE.safeTransfer(msg.sender, reward);
emit RewardPaid(msg.sender, reward);
}
}
function exit() external {
_withdraw(_balances[msg.sender]);
getReward();
}
function notifyRewardAmount(uint256 reward) external onlyDistribution updateReward(address(0)) {
PICKLE.safeTransferFrom(DISTRIBUTION, address(this), reward);
if (block.timestamp >= periodFinish) {
rewardRate = reward.div(DURATION);
} else {
uint256 remaining = periodFinish.sub(block.timestamp);
uint256 leftover = remaining.mul(rewardRate);
rewardRate = reward.add(leftover).div(DURATION);
}
// Ensure the provided reward amount is not more than the balance in the contract.
// This keeps the reward rate in the right range, preventing overflows due to
// very high values of rewardRate in the earned and rewardsPerToken functions;
// Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
uint balance = PICKLE.balanceOf(address(this));
require(rewardRate <= balance.div(DURATION), "Provided reward too high");
lastUpdateTime = block.timestamp;
periodFinish = block.timestamp.add(DURATION);
emit RewardAdded(reward);
}
modifier updateReward(address account) {
rewardPerTokenStored = rewardPerToken();
lastUpdateTime = lastTimeRewardApplicable();
if (account != address(0)) {
rewards[account] = earned(account);
userRewardPerTokenPaid[account] = rewardPerTokenStored;
}
_;
if (account != address(0)) {
kick(account);
}
}
event RewardAdded(uint256 reward);
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event RewardPaid(address indexed user, uint256 reward);
}
interface MasterChef {
function deposit(uint, uint) external;
function withdraw(uint, uint) external;
function userInfo(uint, address) external view returns (uint, uint);
}
contract ProtocolGovernance {
/// @notice governance address for the governance contract
address public governance;
address public pendingGovernance;
/**
* @notice Allows governance to change governance (for future upgradability)
* @param _governance new governance address to set
*/
function setGovernance(address _governance) external {
require(msg.sender == governance, "setGovernance: !gov");
pendingGovernance = _governance;
}
/**
* @notice Allows pendingGovernance to accept their role as governance (protection pattern)
*/
function acceptGovernance() external {
require(msg.sender == pendingGovernance, "acceptGovernance: !pendingGov");
governance = pendingGovernance;
}
}
contract MasterDill {
using SafeMath for uint;
/// @notice EIP-20 token name for this token
string public constant name = "Master DILL";
/// @notice EIP-20 token symbol for this token
string public constant symbol = "mDILL";
/// @notice EIP-20 token decimals for this token
uint8 public constant decimals = 18;
/// @notice Total number of tokens in circulation
uint public totalSupply = 1e18;
mapping (address => mapping (address => uint)) internal allowances;
mapping (address => uint) internal balances;
/// @notice The standard EIP-20 transfer event
event Transfer(address indexed from, address indexed to, uint amount);
/// @notice The standard EIP-20 approval event
event Approval(address indexed owner, address indexed spender, uint amount);
constructor() public {
balances[msg.sender] = 1e18;
emit Transfer(address(0x0), msg.sender, 1e18);
}
/**
* @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
* @param account The address of the account holding the funds
* @param spender The address of the account spending the funds
* @return The number of tokens approved
*/
function allowance(address account, address spender) external view returns (uint) {
return allowances[account][spender];
}
/**
* @notice Approve `spender` to transfer up to `amount` from `src`
* @dev This will overwrite the approval amount for `spender`
* and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
* @param spender The address of the account which may transfer tokens
* @param amount The number of tokens that are approved (2^256-1 means infinite)
* @return Whether or not the approval succeeded
*/
function approve(address spender, uint amount) external returns (bool) {
allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
/**
* @notice Get the number of tokens held by the `account`
* @param account The address of the account to get the balance of
* @return The number of tokens held
*/
function balanceOf(address account) external view returns (uint) {
return balances[account];
}
/**
* @notice Transfer `amount` tokens from `msg.sender` to `dst`
* @param dst The address of the destination account
* @param amount The number of tokens to transfer
* @return Whether or not the transfer succeeded
*/
function transfer(address dst, uint amount) external returns (bool) {
_transferTokens(msg.sender, dst, amount);
return true;
}
/**
* @notice Transfer `amount` tokens from `src` to `dst`
* @param src The address of the source account
* @param dst The address of the destination account
* @param amount The number of tokens to transfer
* @return Whether or not the transfer succeeded
*/
function transferFrom(address src, address dst, uint amount) external returns (bool) {
address spender = msg.sender;
uint spenderAllowance = allowances[src][spender];
if (spender != src && spenderAllowance != uint(-1)) {
uint newAllowance = spenderAllowance.sub(amount, "transferFrom: exceeds spender allowance");
allowances[src][spender] = newAllowance;
emit Approval(src, spender, newAllowance);
}
_transferTokens(src, dst, amount);
return true;
}
function _transferTokens(address src, address dst, uint amount) internal {
require(src != address(0), "_transferTokens: zero address");
require(dst != address(0), "_transferTokens: zero address");
balances[src] = balances[src].sub(amount, "_transferTokens: exceeds balance");
balances[dst] = balances[dst].add(amount, "_transferTokens: overflows");
emit Transfer(src, dst, amount);
}
}
contract GaugeProxy is ProtocolGovernance {
using SafeMath for uint256;
using SafeERC20 for IERC20;
MasterChef public constant MASTER = MasterChef(0xbD17B1ce622d73bD438b9E658acA5996dc394b0d);
IERC20 public constant DILL = IERC20(0xbBCf169eE191A1Ba7371F30A1C344bFC498b29Cf);
IERC20 public constant PICKLE = IERC20(0x429881672B9AE42b8EbA0E26cD9C73711b891Ca5);
IERC20 public immutable TOKEN;
uint public pid;
uint public totalWeight;
address[] internal _tokens;
mapping(address => address) public gauges; // token => gauge
mapping(address => uint) public weights; // token => weight
mapping(address => mapping(address => uint)) public votes; // msg.sender => votes
mapping(address => address[]) public tokenVote;// msg.sender => token
mapping(address => uint) public usedWeights; // msg.sender => total voting weight of user
function tokens() external view returns (address[] memory) {
return _tokens;
}
function getGauge(address _token) external view returns (address) {
return gauges[_token];
}
constructor() public {
TOKEN = IERC20(address(new MasterDill()));
governance = msg.sender;
}
// Reset votes to 0
function reset() external {
_reset(msg.sender);
}
// Reset votes to 0
function _reset(address _owner) internal {
address[] storage _tokenVote = tokenVote[_owner];
uint256 _tokenVoteCnt = _tokenVote.length;
for (uint i = 0; i < _tokenVoteCnt; i ++) {
address _token = _tokenVote[i];
uint _votes = votes[_owner][_token];
if (_votes > 0) {
totalWeight = totalWeight.sub(_votes);
weights[_token] = weights[_token].sub(_votes);
votes[_owner][_token] = 0;
}
}
delete tokenVote[_owner];
}
// Adjusts _owner's votes according to latest _owner's DILL balance
function poke(address _owner) public {
address[] memory _tokenVote = tokenVote[_owner];
uint256 _tokenCnt = _tokenVote.length;
uint256[] memory _weights = new uint[](_tokenCnt);
uint256 _prevUsedWeight = usedWeights[_owner];
uint256 _weight = DILL.balanceOf(_owner);
for (uint256 i = 0; i < _tokenCnt; i ++) {
uint256 _prevWeight = votes[_owner][_tokenVote[i]];
_weights[i] = _prevWeight.mul(_weight).div(_prevUsedWeight);
}
_vote(_owner, _tokenVote, _weights);
}
function _vote(address _owner, address[] memory _tokenVote, uint256[] memory _weights) internal {
// _weights[i] = percentage * 100
_reset(_owner);
uint256 _tokenCnt = _tokenVote.length;
uint256 _weight = DILL.balanceOf(_owner);
uint256 _totalVoteWeight = 0;
uint256 _usedWeight = 0;
for (uint256 i = 0; i < _tokenCnt; i ++) {
_totalVoteWeight = _totalVoteWeight.add(_weights[i]);
}
for (uint256 i = 0; i < _tokenCnt; i ++) {
address _token = _tokenVote[i];
address _gauge = gauges[_token];
uint256 _tokenWeight = _weights[i].mul(_weight).div(_totalVoteWeight);
if (_gauge != address(0x0)) {
_usedWeight = _usedWeight.add(_tokenWeight);
totalWeight = totalWeight.add(_tokenWeight);
weights[_token] = weights[_token].add(_tokenWeight);
tokenVote[_owner].push(_token);
votes[_owner][_token] = _tokenWeight;
}
}
usedWeights[_owner] = _usedWeight;
}
// Vote with DILL on a gauge
function vote(address[] calldata _tokenVote, uint256[] calldata _weights) external {
require(_tokenVote.length == _weights.length);
_vote(msg.sender, _tokenVote, _weights);
}
// Add new token gauge
function addGauge(address _token) external {
require(msg.sender == governance, "!gov");
require(gauges[_token] == address(0x0), "exists");
gauges[_token] = address(new Gauge(_token));
_tokens.push(_token);
}
// Sets MasterChef PID
function setPID(uint _pid) external {
require(msg.sender == governance, "!gov");
require(pid == 0, "pid has already been set");
require(_pid > 0, "invalid pid");
pid = _pid;
}
// Deposits mDILL into MasterChef
function deposit() public {
require(pid > 0, "pid not initialized");
IERC20 _token = TOKEN;
uint _balance = _token.balanceOf(address(this));
_token.safeApprove(address(MASTER), 0);
_token.safeApprove(address(MASTER), _balance);
MASTER.deposit(pid, _balance);
}
// Fetches Pickle
function collect() public {
(uint _locked,) = MASTER.userInfo(pid, address(this));
MASTER.withdraw(pid, _locked);
deposit();
}
function length() external view returns (uint) {
return _tokens.length;
}
function distribute() external {
collect();
uint _balance = PICKLE.balanceOf(address(this));
if (_balance > 0 && totalWeight > 0) {
for (uint i = 0; i < _tokens.length; i++) {
address _token = _tokens[i];
address _gauge = gauges[_token];
uint _reward = _balance.mul(weights[_token]).div(totalWeight);
if (_reward > 0) {
PICKLE.safeApprove(_gauge, 0);
PICKLE.safeApprove(_gauge, _reward);
Gauge(_gauge).notifyRewardAmount(_reward);
}
}
}
}
}
Read Contract
DILL 0x4eb1fbeb → address
MASTER 0x471aedc2 → address
PICKLE 0xc19048b2 → address
TOKEN 0x82bfefc8 → address
gauges 0xb9a09fd5 → address
getGauge 0xb1c6f0e9 → address
governance 0x5aa6e675 → address
length 0x1f7b6d32 → uint256
pendingGovernance 0xf39c38a0 → address
pid 0xf1068454 → uint256
tokenVote 0xf2a1a8ed → address
tokens 0x9d63848a → address[]
totalWeight 0x96c82e57 → uint256
usedWeights 0x002f8de4 → uint256
votes 0xcad1b906 → uint256
weights 0xa7cac846 → uint256
Write Contract 10 functions
These functions modify contract state and require a wallet transaction to execute.
acceptGovernance 0x238efcbc
No parameters
addGauge 0x9da882ac
address _token
collect 0xe5225381
No parameters
deposit 0xd0e30db0
No parameters
distribute 0xe4fc6b6d
No parameters
poke 0xb1a997ac
address _owner
reset 0xd826f88f
No parameters
setGovernance 0xab033ea9
address _governance
setPID 0x8d060519
uint256 _pid
vote 0x6f816a20
address[] _tokenVote
uint256[] _weights
Recent Transactions
No transactions found for this address