Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x1e64E373c143810524BDb1Ac8Dce35977d12e55d
Balance 0 ETH
Nonce 1
Code Size 24290 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

24290 bytes
0x608060405234801561001057600080fd5b50600436106104c25760003560e01c80637f472e5411610286578063cdc82e801161016b578063e1ba95d2116100e3578063f2caeb1e11610097578063facefb641161007c578063facefb6414610af4578063fbfa77cf14610b07578063fff6cae914610b2757600080fd5b8063f2caeb1e14610ace578063f77e34d114610ae157600080fd5b8063ebe2b12b116100c8578063ebe2b12b14610ab3578063f288baf614610abc578063f2a8d34914610ac557600080fd5b8063e1ba95d214610a98578063e7f3058214610aa057600080fd5b8063d5e1a9c61161013a578063d9f96e8d1161011f578063d9f96e8d14610a48578063de1a655114610a7d578063e01f62bf14610a9057600080fd5b8063d5e1a9c614610a22578063d7400d5614610a3557600080fd5b8063cdc82e80146109ea578063d2010fb4146109f3578063d2fbdc0d146109fc578063d42fc9b414610a0f57600080fd5b8063aa1d4fce116101fe578063bdb123e3116101cd578063c3543826116101b2578063c354382614610998578063c8f33c91146109ab578063ca6df29d146109b457600080fd5b8063bdb123e31461097d578063c00007b01461098557600080fd5b8063aa1d4fce14610945578063af48e59a1461094e578063b85efd0614610961578063b94c4dcb1461097457600080fd5b80638da5cb5b116102555780639637927f1161023a5780639637927f14610912578063a0f234761461091f578063a321ff971461093257600080fd5b80638da5cb5b146108df57806391cf600a146108ff57600080fd5b80637f472e54146108765780638980f11f1461088957806389b5f00b1461089c5780638bad86a7146108b157600080fd5b806341a16f3f116103ac5780636e27cef911610324578063774d4ae7116102f35780637970833e116102d85780637970833e1461081357806379ba50971461084e5780637d6ef08e1461085657600080fd5b8063774d4ae7146107ed5780637910d17b1461080057600080fd5b80636e27cef9146107a957806370641a36146107b257806372f702f3146107ba578063741d3c18146107da57600080fd5b806354fd4d501161037b57806364f2c0601161036057806364f2c0601461076157806369339245146107695780636c430dbb1461078957600080fd5b806354fd4d50146107515780635bfd92581461075957600080fd5b806341a16f3f146106d357806341edbdf0146107095780634fd2b5361461071e57806353a47bb71461073157600080fd5b80631face8561161043f5780632c0c2a0a1161040e57806336f89af2116103f357806336f89af214610680578063386a9525146106b6578063387edc86146106c057600080fd5b80632c0c2a0a1461065a5780632df079f11461066d57600080fd5b80631face856146105ce578063231b68dc146105e15780632352aac11461060457806328408bab1461062457600080fd5b806312edb24c1161049657806317b18c891161047b57806317b18c89146105935780631c1f78eb146105a65780631e090f01146105ae57600080fd5b806312edb24c146105695780631627540c1461057e57600080fd5b80628cc262146104c75780630238b936146104f057806307546172146105115780630d7bac4f14610556575b600080fd5b6104da6104d53660046156db565b610b2f565b6040516104e791906156f8565b60405180910390f35b6105036104fe36600461574a565b610ca4565b6040519081526020016104e7565b6004546105319073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104e7565b61050361056436600461578c565b610da5565b610571610dd1565b6040516104e791906157a5565b61059161058c3660046156db565b610e40565b005b6105036105a13660046157f3565b610f60565b6104da610fea565b6105c16105bc3660046156db565b611081565b6040516104e79190615815565b6105036105dc3660046156db565b611135565b6105f46105ef366004615883565b61117b565b60405190151581526020016104e7565b6029546105319073ffffffffffffffffffffffffffffffffffffffff1681565b6105316106323660046156db565b60236020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6105036106683660046156db565b611261565b61059161067b3660046158bc565b61154d565b61050361068e3660046156db565b73ffffffffffffffffffffffffffffffffffffffff1660009081526021602052604090205490565b61050362093a8081565b6105916106ce3660046156db565b6116c6565b6105316106e13660046156db565b60116020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610711611825565b6040516104e7919061593c565b61050361072c3660046156db565b6118b3565b6001546105319073ffffffffffffffffffffffffffffffffffffffff1681565b6107116118d4565b6105036118e1565b601f54610503565b6105036107773660046156db565b60176020526000908152604090205481565b6105036107973660046156db565b601b6020526000908152604090205481565b610503600a5481565b6104da611b1c565b6003546105319073ffffffffffffffffffffffffffffffffffffffff1681565b6105916107e83660046156db565b611c71565b6105036107fb36600461598d565b611dd4565b6104da61080e3660046159b9565b611fe0565b61082661082136600461598d565b61205c565b604080519586526020860194909452928401919091526060830152608082015260a0016104e7565b6105916120aa565b6105036108643660046156db565b60226020526000908152604090205481565b6105036108843660046156db565b6121f5565b61059161089736600461598d565b61220c565b6024546105f490640100000000900460ff1681565b6108c46108bf3660046156db565b61239d565b604080519384526020840192909252908201526060016104e7565b6000546105319073ffffffffffffffffffffffffffffffffffffffff1681565b61059161090d3660046156db565b6125c9565b6024546105f49060ff1681565b61050361092d3660046156db565b6126bc565b6105916109403660046156db565b612786565b610503600b5481565b61059161095c366004615883565b6128af565b61059161096f3660046157f3565b6129a1565b61050360095481565b610503612c38565b6104da6109933660046156db565b612d7d565b6105316109a63660046156db565b612e05565b61050360075481565b6105036109c23660046156db565b73ffffffffffffffffffffffffffffffffffffffff1660009081526027602052604090205490565b61050360085481565b61050360055481565b610591610a0a3660046157f3565b612e68565b610503610a1d3660046156db565b6132b5565b610591610a303660046159e7565b6132f0565b610591610a433660046156db565b6134df565b610503610a563660046156db565b73ffffffffffffffffffffffffffffffffffffffff16600090815260208052604090205490565b610591610a8b366004615883565b6136fa565b601e54610503565b6105916137e1565b610591610aae3660046156db565b6138b2565b61050360065481565b610503600c5481565b610503600d5481565b610503610adc36600461578c565b613a13565b610591610aef366004615a2f565b613b2a565b610591610b02366004615aca565b613cf6565b602a546105319073ffffffffffffffffffffffffffffffffffffffff1681565b610591613ea5565b60606000610b3b611b1c565b60125490915067ffffffffffffffff811115610b5957610b59615a4c565b604051908082528060200260200182016040528015610b82578160200160208202803683370190505b5073ffffffffffffffffffffffffffffffffffffffff841660009081526021602052604090205490925015610c9e5760005b601254811015610c9c5773ffffffffffffffffffffffffffffffffffffffff84166000818152601a60209081526040808320858452825280832054938352601982528083208584529091529020548351670de0b6b3a76400009190859085908110610c2157610c21615b48565b6020026020010151610c339190615ba6565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260216020526040902054610c639190615bb9565b610c6d9190615bd0565b610c779190615c0b565b838281518110610c8957610c89615b48565b6020908102919091010152600101610bb4565b505b50919050565b60006002805403610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055602454610100900460ff1615610d8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f5769746864726177616c732070617573656400000000000000000000000000006044820152606401610d0d565b610d9833848685613f4a565b6001600255949350505050565b600854600954600091610dcb91610dbc8286615bb9565b610dc69190615bd0565b614104565b92915050565b60606012805480602002602001604051908101604052809291908181526020018280548015610e3657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e0b575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e00000000000000000000000000000000006064820152608401610d0d565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60006002805403610fcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b60028055610fde338085854261411c565b60016002559392505050565b60155460609067ffffffffffffffff81111561100857611008615a4c565b604051908082528060200260200182016040528015611031578160200160208202803683370190505b50905060005b60155481101561107d5762093a8061104e82613a13565b6110589190615bb9565b82828151811061106a5761106a615b48565b6020908102919091010152600101611037565b5090565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602760209081526040808320805482518185028101850190935280835260609492939192909184015b8282101561112a57838290600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050815260200190600101906110c6565b505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260226020526040812054600554670de0b6b3a76400009161117191615bb9565b610dcb9190615bd0565b73ffffffffffffffffffffffffffffffffffffffff811660009081526016602052604081205460ff166111b057506000610dcb565b73ffffffffffffffffffffffffffffffffffffffff831615806111e7575073ffffffffffffffffffffffffffffffffffffffff8216155b156111f457506000610dcb565b60005473ffffffffffffffffffffffffffffffffffffffff9081169084160361121f57506001610dcb565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526011602052604090205481851691160361125857506001610dcb565b50600092915050565b6000808061126e84612e05565b905073ffffffffffffffffffffffffffffffffffffffff811615611333576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015273c8418af6358ffdda74e09ca9cc3fe03ca6adc5b0906370a0823190602401602060405180830381865afa15801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e9190615c1e565b6113d5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273c8418af6358ffdda74e09ca9cc3fe03ca6adc5b0906370a0823190602401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d59190615c1e565b91506000670de0b6b3a764000073c8418af6358ffdda74e09ca9cc3fe03ca6adc5b073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190615c1e565b61146f9190615bb9565b600b54600c5461147f9086615bb9565b6114899190615bb9565b6114939190615bd0565b905060008073ffffffffffffffffffffffffffffffffffffffff8416156114c2576114bd846121f5565b6114cb565b6114cb876118b3565b9050801561151d576000816114e8670de0b6b3a764000088615bb9565b6114f29190615bd0565b9050670de0b6b3a7640000600c548261150b9190615bb9565b6115159190615bd0565b925050611522565b600091505b508082116115305780611532565b815b9450600c5485111561154457600c5494505b50505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806115865750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b6115ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b602480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff00ff166301000000861515027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010085151502177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100008415150217905580801561168b5750602454640100000000900460ff16155b156116c057602480547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff166401000000001790555b50505050565b6002805403611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b60028055602454640100000000900460ff16156117aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b60245462010000900460ff161561181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610d0d565b506001600255565b602b805461183290615c37565b80601f016020809104026020016040519081016040528092919081815260200182805461185e90615c37565b80156118ab5780601f10611880576101008083540402835291602001916118ab565b820191906000526020600020905b81548152906001019060200180831161188e57829003601f168201915b505050505081565b6000670de0b6b3a7640000600d546118ca846132b5565b6111719190615bb9565b6025805461183290615c37565b600080602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119759190615c1e565b602a546040517ff94d46680000000000000000000000000000000000000000000000000000000081526004810183905291925060009173ffffffffffffffffffffffffffffffffffffffff9091169063f94d466890602401600060405180830381865afa1580156119ea573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611a309190810190615d17565b50915050600081600181518110611a4957611a49615b48565b602002602001015190506000611a5d612c38565b611a679083615bb9565b611a76906402540be400615bb9565b9050602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663876f303b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b099190615c1e565b611b139082615bd0565b94505050505090565b6060601e5460001480611b2f5750601f54155b15611b89576018805480602002602001604051908101604052809291908181526020018280548015610e3657602002820191906000526020600020905b815481526020019060010190808311611b6c575050505050905090565b60125467ffffffffffffffff811115611ba457611ba4615a4c565b604051908082528060200260200182016040528015611bcd578160200160208202803683370190505b50905060005b60185481101561107d57601f54611be982613a13565b600754611bf46144d9565b611bfe9190615ba6565b611c089190615bb9565b611c1a90670de0b6b3a7640000615bb9565b611c249190615bd0565b60188281548110611c3757611c37615b48565b9060005260206000200154611c4c9190615c0b565b828281518110611c5e57611c5e615b48565b6020908102919091010152600101611bd3565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611caa5750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b611d10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff8116611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5a65726f206164647265737320646574656374656400000000000000000000006044820152606401610d0d565b602880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602760205260408120805482919084908110611e0e57611e0e615b48565b600091825260208083206040805160a081018252600590940290910180548452600181015484840181905260028201548584015260038201546060860152600490910154608085015273ffffffffffffffffffffffffffffffffffffffff89168552601b9092528320549193501115611e8c57506020810151611eb4565b5073ffffffffffffffffffffffffffffffffffffffff84166000908152601b60205260409020545b42826060015111611f7457606082015173ffffffffffffffffffffffffffffffffffffffff86166000908152601b60205260409020541015611f6b576000818360600151611f029190615ba6565b90506000836060015142611f169190615ba6565b90506000611f28610564600285615bd0565b90506000611f368382615bb9565b611f408584615bb9565b611f4a9190615c0b565b9050611f568385615c0b565b611f609082615bd0565b965050505050611fc4565b60009250611fc4565b600080828460600151611f879190615ba6565b90506000428560600151611f9b9190615ba6565b90506002611fa98284615c0b565b611fb39190615bd0565b92505050611fc081610da5565b9350505b8160800151831115611fd857816080015192505b505092915050565b6060600280540361204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b60028055610fde3384846144ec565b6027602052816000526040600020818154811061207857600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60015473ffffffffffffffffffffffffffffffffffffffff163314612151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610d0d565b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b6000670de0b6b3a7640000600d546118ca84611135565b600054829073ffffffffffffffffffffffffffffffffffffffff163314806122395750612239338261117b565b61229f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f7220746b6e206d67720000000000000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff831660009081526016602052604090205460ff168080156122fb575073ffffffffffffffffffffffffffffffffffffffff8481166000908152601160205260409020541633145b80612326575080158015612326575060005473ffffffffffffffffffffffffffffffffffffffff1633145b15612336576116c0843385614825565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f2076616c696420746f6b656e7320746f207265636f7665720000000000006044820152606401610d0d565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526021602052604081205490806123ce84611261565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260208052604081205491935090158015612427575073ffffffffffffffffffffffffffffffffffffffff8516600090815260216020526040902054155b80612457575073ffffffffffffffffffffffffffffffffffffffff85166000908152600e60205260409020548310155b156124635750816124a3565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600e60205260409020546002906124969085615c0b565b6124a09190615bd0565b90505b6000915060005b73ffffffffffffffffffffffffffffffffffffffff86166000908152602760205260409020548110156125c05773ffffffffffffffffffffffffffffffffffffffff8616600090815260276020526040812080548390811061250e5761250e615b48565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050905060006125678884611dd4565b60408301519091506000670de0b6b3a76400006125848785615c0b565b61258e9084615bb9565b6125989190615bd0565b6125a29083615c0b565b90506125ae8188615c0b565b965050600190930192506124aa915050565b50509193909250565b60005473ffffffffffffffffffffffffffffffffffffffff163314806126025750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b612668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6000600554600d546126ce9190615bb9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152670de0b6b3a764000090819073c8418af6358ffdda74e09ca9cc3fe03ca6adc5b0906370a0823190602401602060405180830381865afa158015612758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277c9190615c1e565b6118ca9190615bb9565b60005473ffffffffffffffffffffffffffffffffffffffff163314806127bf5750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b600480546040517fdd289d6000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481169382019390935291169063dd289d6090602401600060405180830381600087803b15801561289457600080fd5b505af11580156128a8573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806128e85750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b61294e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b6004805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155602a8054929093169116179055565b6002805403612a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b600280556024546301000000900460ff1615612a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5374616b696e67207061757365640000000000000000000000000000000000006044820152606401610d0d565b602454640100000000900460ff1615612af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b612b05333360016144ec565b50600080612b13338561498e565b915091506000838360400151612b299190615c0b565b9050600354612b509073ffffffffffffffffffffffffffffffffffffffff16333087614b5c565b6040805160a081018252868152602085810151818301528183018490526060808701519083015260808087015190830152336000908152602790915291909120805484908110612ba257612ba2615b48565b90600052602060002090600502016000820151816000015560208201518160010155604082015181600201556060820151816003015560808201518160040155905050612bf133856001614cfa565b604080518681526020810186905233917f2640b32e7e5d0fa2a21ea06b22fbd75fda0fda384a895a5fdeef43646de47a0c910160405180910390a250506001600255505050565b6000806000806000602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd19190615dff565b94509450509350935060008312158015612cea57508115155b8015612d0e57508369ffffffffffffffffffff168169ffffffffffffffffffff1610155b612d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420636861696e6c696e6b2070726963650000000000000000006044820152606401610d0d565b50909392505050565b60606002805403612dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b60028055612dfa338360016144ec565b600160025592915050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081205460ff1615612e37575090565b5073ffffffffffffffffffffffffffffffffffffffff9081166000908152602360205260409020541690565b919050565b6002805403612ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d0d565b600280556024546301000000900460ff1615612f4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5374616b696e67207061757365640000000000000000000000000000000000006044820152606401610d0d565b602454640100000000900460ff1615612fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b612fcc333360016144ec565b50600080612fda338561498e565b91509150428311613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d75737420626520696e207468652066757475726500000000000000000000006044820152606401610d0d565b60004283606001511161305b57600061306b565b42836060015161306b9190615ba6565b905060006130794286615ba6565b90508181116130e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f742073686f7274656e206c6f636b2074696d6500000000000000006044820152606401610d0d565b600a54811015613150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610d0d565b6009548111156131bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610d0d565b6040518060a00160405280878152602001428152602001856040015181526020018681526020016131ec83610da5565b905233600090815260276020526040902080548590811061320f5761320f615b48565b9060005260206000209060050201600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505061325f3360006001614e69565b6040805187815260208101839052428183015260608101879052905133917fc2cf1aae6decacbc52f96b4e4fec96d4ebab5236e4ed987165537bc463014a43919081900360800190a25050600160025550505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602080526040812054600554670de0b6b3a76400009161117191615bb9565b600054849073ffffffffffffffffffffffffffffffffffffffff1633148061331d575061331d338261117b565b613383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f7220746b6e206d67720000000000000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff85166000908152601760205260409020546015805486929081106133be576133be615b48565b9060005260206000200181905550826013601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061341f5761341f615b48565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905591871681526017909152604090205460148054849290811061349057613490615b48565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604090205460ff1661356e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f7879000000000000000000000000000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260106020908152604080832033845290915290205460ff16613608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f50726f787920686173206e6f7420616c6c6f77656420796f75207965740000006044820152606401610d0d565b3360009081526023602052604090205473ffffffffffffffffffffffffffffffffffffffff16801561367c57336000908152602080805260408083205473ffffffffffffffffffffffffffffffffffffffff8516845260229092528220805491929091613676908490615ba6565b90915550505b33600090815260236020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915582805281842054908452602290925282208054919290916136f1908490615c0b565b90915550505050565b600054829073ffffffffffffffffffffffffffffffffffffffff163314806137275750613727338261117b565b61378d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f74206f776e6572206f7220746b6e206d67720000000000000000000000006044820152606401610d0d565b5073ffffffffffffffffffffffffffffffffffffffff918216600090815260116020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061381a5750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b613880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b602480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b336000908152600f602052604090205460ff1661392b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f7879000000000000000000000000000000000000006044820152606401610d0d565b33600081815260106020908152604080832073ffffffffffffffffffffffffffffffffffffffff8681168552908352818420805460ff8116157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009091161790556023909252909120541603613a105773ffffffffffffffffffffffffffffffffffffffff8116600090815260236020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558180528083205433845260229092528220805491929091613a0a908490615ba6565b90915550505b50565b60008060138381548110613a2957613a29615b48565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015613b0457670de0b6b3a7640000601c8481548110613a6f57613a6f615b48565b90600052602060002001548273ffffffffffffffffffffffffffffffffffffffff16630a3be7576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae99190615c1e565b613af39190615bb9565b613afd9190615bd0565b9150610c9e565b60158381548110613b1757613b17615b48565b9060005260206000200154915050919050565b60005b601354811015613cf257600060138281548110613b4c57613b4c615b48565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508015613ce9578280613b9e5750601d8281548110613b9057613b90615b48565b906000526020600020015442115b15613ce9576040517f6472eee100000000000000000000000000000000000000000000000000000000815230600482015242602482015273ffffffffffffffffffffffffffffffffffffffff821690636472eee1906044016020604051808303816000875af1158015613c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c399190615c1e565b601c8381548110613c4c57613c4c615b48565b90600052602060002001819055508073ffffffffffffffffffffffffffffffffffffffff1663513872bd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ca5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc99190615c1e565b601d8381548110613cdc57613cdc615b48565b6000918252602090912001555b50600101613b2d565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480613d2f5750738412ebf45bac1b340bbe8f318b928c466c4e39ca33145b613d95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610d0d565b8051670de0b6b3a76400001115613e08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d757374206265203e3d204d554c2050524543000000000000000000000000006044820152606401610d0d565b608081015160011115613e77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4d757374206265203e3d203100000000000000000000000000000000000000006044820152606401610d0d565b80516008556020810151600c556040810151600d556060810151600b55608081015160095560a00151600a55565b602454640100000000900460ff1615613f1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b613f246000613b2a565b613f2c6118e1565b6005556006544210613f4257613f40614fe8565b565b613f40615564565b602454600090640100000000900460ff16613f6d57613f6b858560016144ec565b505b600080613f7a878661498e565b91509150816060015142101580613f98575060245460ff1615156001145b613ffe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616b65206973207374696c6c206c6f636b656421000000000000000000006044820152606401610d0d565b604082015180156140f95760035461402d9073ffffffffffffffffffffffffffffffffffffffff168883614825565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260276020526040902080548390811061406457614064615b48565b60009182526020822060059091020181815560018101829055600281018290556003810182905560040181905561409e9089908390614cfa565b604080518281526020810188905273ffffffffffffffffffffffffffffffffffffffff898116828401529151918a16917f1d9308f6b22a2754a1c622bb30889e8f8f956c83e524d039e9d65d5f052eb9089181900360600190a25b979650505050505050565b60008183106141135781614115565b825b9392505050565b600085600161412d82826000614e69565b602454640100000000900460ff16156141a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b6024546301000000900460ff1615614216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5374616b696e67207061757365640000000000000000000000000000000000006044820152606401610d0d565b600a54851015614282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d696e696d756d207374616b652074696d65206e6f74206d65740000000000006044820152606401610d0d565b6009548511156142ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f547279696e6720746f206c6f636b20666f7220746f6f206c6f6e6700000000006044820152606401610d0d565b6003546143139073ffffffffffffffffffffffffffffffffffffffff16883089614b5c565b600061431e86610da5565b73ffffffffffffffffffffffffffffffffffffffff8a166000908152602080805260408083205490517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608f901b169281019290925260348201899052605482018b9052607482015291925090609401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012073ffffffffffffffffffffffffffffffffffffffff8e1660009081526027835283902060a0850184528185529184018a90529183018b9052909250906060810161440f8a8a615c0b565b8152602090810185905282546001818101855560009485529382902083516005909202019081559082015181840155604082015160028201556060820151600382015560809091015160049091015561446b908b908a90614cfa565b604080518981526020810189905290810182905273ffffffffffffffffffffffffffffffffffffffff8a811660608301528b16907ff400e72e69ef4402819dfc57eeddc66f5eb69bf405e0e8098b1946ec1ac14a229060800160405180910390a29998505050505050505050565b60006144e742600654614104565b905090565b60608360016144fd82826000614e69565b602454640100000000900460ff1615614572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4f6e6c79207769746864726177616c7320616c6c6f77656400000000000000006044820152606401610d0d565b60245462010000900460ff16156145e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5265776172647320636f6c6c656374696f6e20706175736564000000000000006044820152606401610d0d565b73ffffffffffffffffffffffffffffffffffffffff86166000908152601b6020526040902042905560125467ffffffffffffffff81111561462857614628615a4c565b604051908082528060200260200182016040528015614651578160200160208202803683370190505b50925060005b60125481101561481b5773ffffffffffffffffffffffffffffffffffffffff87166000908152601a6020908152604080832084845290915290205484518590839081106146a6576146a6615b48565b60209081029190910181019190915273ffffffffffffffffffffffffffffffffffffffff88166000908152601a8252604080822084835290925290812081905584518590839081106146fa576146fa615b48565b60200260200101511115614813576147696012828154811061471e5761471e615b48565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168786848151811061475c5761475c615b48565b6020026020010151614825565b8673ffffffffffffffffffffffffffffffffffffffff167f1d2f2ca53af5d2f333bd32fdd45f9c52ad8ebe31414f7792912077fcb3876dff8583815181106147b3576147b3615b48565b6020026020010151601284815481106147ce576147ce615b48565b600091825260209182902001546040805193845273ffffffffffffffffffffffffffffffffffffffff918216928401929092528a169082015260600160405180910390a25b600101614657565b5050509392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916148bc9190615e4f565b6000604051808303816000865af19150503d80600081146148f9576040519150601f19603f3d011682016040523d82523d6000602084013e6148fe565b606091505b50915091508180156149285750805115806149285750808060200190518101906149289190615e6b565b6128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610d0d565b6149c36040518060a0016040528060008019168152602001600081526020016000815260200160008152602001600081525090565b60008215614ae05760005b73ffffffffffffffffffffffffffffffffffffffff8516600090815260276020526040902054811015614ade5773ffffffffffffffffffffffffffffffffffffffff85166000908152602760205260409020805482908110614a3257614a32615b48565b9060005260206000209060050201600001548403614ad65773ffffffffffffffffffffffffffffffffffffffff85166000908152602760205260409020805482908110614a8157614a81615b48565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509250809150614ade565b6001016149ce565b505b8215801590614aef5750815183145b614b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5374616b65206e6f7420666f756e6400000000000000000000000000000000006044820152606401610d0d565b9250929050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614bfb9190615e4f565b6000604051808303816000865af19150503d8060008114614c38576040519150601f19603f3d011682016040523d82523d6000602084013e614c3d565b606091505b5091509150818015614c67575080511580614c67575080806020019051810190614c679190615e6b565b614cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c4544000000000000000000000000000000000000000000000000000000006064820152608401610d0d565b505050505050565b6000614d0584612e05565b90508115614db95782601e6000828254614d1f9190615c0b565b909155505073ffffffffffffffffffffffffffffffffffffffff8416600090815260208052604081208054859290614d58908490615c0b565b909155505073ffffffffffffffffffffffffffffffffffffffff811615614db45773ffffffffffffffffffffffffffffffffffffffff811660009081526022602052604081208054859290614dae908490615c0b565b90915550505b614e60565b82601e6000828254614dcb9190615ba6565b909155505073ffffffffffffffffffffffffffffffffffffffff8416600090815260208052604081208054859290614e04908490615ba6565b909155505073ffffffffffffffffffffffffffffffffffffffff811615614e605773ffffffffffffffffffffffffffffffffffffffff811660009081526022602052604081208054859290614e5a908490615ba6565b90915550505b6116c084600060015b602454640100000000900460ff16614e89578115614e8957614e89613ea5565b8015614ebf57614e9883611261565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600e60205260409020555b73ffffffffffffffffffffffffffffffffffffffff831615612398576000806000614ee98661239d565b6024549295509093509150640100000000900460ff16614f0c57614f0c866155cd565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600e60205260409020829055828110614f90576000614f478483615ba6565b905080601f54614f579190615c0b565b601f55614f648185615c0b565b73ffffffffffffffffffffffffffffffffffffffff881660009081526021602052604090205550614cf2565b6000614f9c8285615ba6565b905080601f54614fac9190615ba6565b601f55614fb98185615ba6565b73ffffffffffffffffffffffffffffffffffffffff881660009081526021602052604090205550505050505050565b614ff0615564565b60005b6014548110156150d75760006014828154811061501257615012615b48565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905080156150ce576040517f092193ab00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82169063092193ab9060240160408051808303816000875af11580156150a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150cb9190615e88565b50505b50600101614ff3565b50600062093a80600654426150ec9190615ba6565b6150f69190615bd0565b905060005b6012548110156152cf576012818154811061511857615118615b48565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa15801561518f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151b39190615c1e565b6151be836001615c0b565b62093a806151cb84613a13565b6151d59190615bb9565b6151df9190615bb9565b1115601282815481106151f4576151f4615b48565b60009182526020918290200154604080517f4e6f7420656e6f7567682072657761726420746f6b656e7320617661696c6162938101939093527f6c653a20000000000000000000000000000000000000000000000000000000009083015260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166044820152605801604051602081830303815290604052906152c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d919061593c565b506001016150fb565b5062093a806152df826001615c0b565b6152e99190615bb9565b6006546152f69190615c0b565b60065560158054600190811061530e5761530e615b48565b9060005260206000200154600014615560576000601260018154811061533657615336615b48565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156153ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153d19190615c1e565b600480546003546040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216938101939093529293509190911690636a627842906024016020604051808303816000875af115801561544d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154719190615c1e565b506000601260018154811061548857615488615b48565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa1580156154ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155239190615c1e565b905062093a806155338383615ba6565b61553d9190615bd0565b601560018154811061555157615551615b48565b60009182526020909120015550505b613a105b600061556e611b1c565b905060005b6018548110156155be5781818151811061558f5761558f615b48565b6020026020010151601882815481106155aa576155aa615b48565b600091825260209091200155600101615573565b506155c76144d9565b60075550565b73ffffffffffffffffffffffffffffffffffffffff811615613a105760006155f482610b2f565b905060005b81518110156156585781818151811061561457615614615b48565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff85166000908152601a8352604080822085835290935291909120556001016155f9565b5060005b8151811015612398576018818154811061567857615678615b48565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff8616835260198252604080842085855290925291205560010161565c565b73ffffffffffffffffffffffffffffffffffffffff81168114613a1057600080fd5b6000602082840312156156ed57600080fd5b8135614115816156b9565b6020808252825182820181905260009190848201906040850190845b8181101561573057835183529284019291840191600101615714565b50909695505050505050565b8015158114613a1057600080fd5b60008060006060848603121561575f57600080fd5b833592506020840135615771816156b9565b915060408401356157818161573c565b809150509250925092565b60006020828403121561579e57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561573057835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016157c1565b6000806040838503121561580657600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b828110156158765781518051855286810151878601528581015186860152606080820151908601526080908101519085015260a09093019290850190600101615832565b5091979650505050505050565b6000806040838503121561589657600080fd5b82356158a1816156b9565b915060208301356158b1816156b9565b809150509250929050565b600080600080608085870312156158d257600080fd5b84356158dd8161573c565b935060208501356158ed8161573c565b925060408501356158fd8161573c565b9150606085013561590d8161573c565b939692955090935050565b60005b8381101561593357818101518382015260200161591b565b50506000910152565b602081526000825180602084015261595b816040850160208701615918565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600080604083850312156159a057600080fd5b82356159ab816156b9565b946020939093013593505050565b600080604083850312156159cc57600080fd5b82356159d7816156b9565b915060208301356158b18161573c565b600080600080608085870312156159fd57600080fd5b8435615a08816156b9565b9350602085013592506040850135615a1f816156b9565b9150606085013561590d816156b9565b600060208284031215615a4157600080fd5b81356141158161573c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715615ac257615ac2615a4c565b604052919050565b600060c08284031215615adc57600080fd5b82601f830112615aeb57600080fd5b60405160c0810181811067ffffffffffffffff82111715615b0e57615b0e615a4c565b6040528060c0840185811115615b2357600080fd5b845b81811015615b3d578035835260209283019201615b25565b509195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610dcb57610dcb615b77565b8082028115828204841417610dcb57610dcb615b77565b600082615c06577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610dcb57610dcb615b77565b600060208284031215615c3057600080fd5b5051919050565b600181811c90821680615c4b57607f821691505b602082108103610c9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600067ffffffffffffffff821115615c9e57615c9e615a4c565b5060051b60200190565b600082601f830112615cb957600080fd5b81516020615cce615cc983615c84565b615a7b565b8083825260208201915060208460051b870101935086841115615cf057600080fd5b602086015b84811015615d0c5780518352918301918301615cf5565b509695505050505050565b600080600060608486031215615d2c57600080fd5b835167ffffffffffffffff80821115615d4457600080fd5b818601915086601f830112615d5857600080fd5b81516020615d68615cc983615c84565b82815260059290921b8401810191818101908a841115615d8757600080fd5b948201945b83861015615dae578551615d9f816156b9565b82529482019490820190615d8c565b91890151919750909350505080821115615dc757600080fd5b50615dd486828701615ca8565b925050604084015190509250925092565b805169ffffffffffffffffffff81168114612e6357600080fd5b600080600080600060a08688031215615e1757600080fd5b615e2086615de5565b9450602086015193506040860151925060608601519150615e4360808701615de5565b90509295509295909350565b60008251615e61818460208701615918565b9190910192915050565b600060208284031215615e7d57600080fd5b81516141158161573c565b60008060408385031215615e9b57600080fd5b50508051602090910151909290915056fea2646970667358221220bb1d83ee5ac25b848f5792c22f73093728abddb826df6c4a5c2a0b3c0b46f7d864736f6c63430008170033

Verified Source Code Partial Match

Compiler: v0.8.23+commit.f704f362 EVM: paris Optimization: Yes (100000 runs)
FraxUnifiedFarm_ERC20_Other.sol 2564 lines
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;

// Sources flattened with hardhat v2.19.4 https://hardhat.org


// File contracts/Common/Context.sol

// Original license: SPDX_License_Identifier: MIT

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File contracts/Math/SafeMath.sol

// Original license: SPDX_License_Identifier: MIT

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // 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;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


// File contracts/ERC20/IERC20.sol

// Original license: SPDX_License_Identifier: MIT


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/Curve/IFraxGaugeController.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

// https://github.com/swervefi/swerve/edit/master/packages/swerve-contracts/interfaces/IGaugeController.sol

interface IFraxGaugeController {
    struct Point {
        uint256 bias;
        uint256 slope;
    }

    struct VotedSlope {
        uint256 slope;
        uint256 power;
        uint256 end;
    }

    // Public variables
    function admin() external view returns (address);
    function future_admin() external view returns (address);
    function token() external view returns (address);
    function voting_escrow() external view returns (address);
    function n_gauge_types() external view returns (int128);
    function n_gauges() external view returns (int128);
    function gauge_type_names(int128) external view returns (string memory);
    function gauges(uint256) external view returns (address);
    function vote_user_slopes(address, address)
        external
        view
        returns (VotedSlope memory);
    function vote_user_power(address) external view returns (uint256);
    function last_user_vote(address, address) external view returns (uint256);
    function points_weight(address, uint256)
        external
        view
        returns (Point memory);
    function time_weight(address) external view returns (uint256);
    function points_sum(int128, uint256) external view returns (Point memory);
    function time_sum(uint256) external view returns (uint256);
    function points_total(uint256) external view returns (uint256);
    function time_total() external view returns (uint256);
    function points_type_weight(int128, uint256)
        external
        view
        returns (uint256);
    function time_type_weight(uint256) external view returns (uint256);

    // Getter functions
    function gauge_types(address) external view returns (int128);
    function gauge_relative_weight(address) external view returns (uint256);
    function gauge_relative_weight(address, uint256) external view returns (uint256);
    function get_gauge_weight(address) external view returns (uint256);
    function get_type_weight(int128) external view returns (uint256);
    function get_total_weight() external view returns (uint256);
    function get_weights_sum_per_type(int128) external view returns (uint256);

    // External functions
    function commit_transfer_ownership(address) external;
    function apply_transfer_ownership() external;
    function add_gauge(
        address,
        int128,
        uint256
    ) external;
    function checkpoint() external;
    function checkpoint_gauge(address) external;
    function global_emission_rate() external view returns (uint256);
    function gauge_relative_weight_write(address)
        external
        returns (uint256);
    function gauge_relative_weight_write(address, uint256)
        external
        returns (uint256);
    function add_type(string memory, uint256) external;
    function change_type_weight(int128, uint256) external;
    function change_gauge_weight(address, uint256) external;
    function change_global_emission_rate(uint256) external;
    function vote_for_gauge_weights(address, uint256) external;
}


// File contracts/Curve/IFraxGaugeFXSRewardsDistributor.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

interface IFraxGaugeFXSRewardsDistributor {
  function acceptOwnership() external;
  function curator_address() external view returns(address);
  function currentReward(address gauge_address) external view returns(uint256 reward_amount);
  function distributeReward(address gauge_address) external returns(uint256 weeks_elapsed, uint256 reward_tally);
  function distributionsOn() external view returns(bool);
  function gauge_whitelist(address) external view returns(bool);
  function is_middleman(address) external view returns(bool);
  function last_time_gauge_paid(address) external view returns(uint256);
  function nominateNewOwner(address _owner) external;
  function nominatedOwner() external view returns(address);
  function owner() external view returns(address);
  function recoverERC20(address tokenAddress, uint256 tokenAmount) external;
  function setCurator(address _new_curator_address) external;
  function setGaugeController(address _gauge_controller_address) external;
  function setGaugeState(address _gauge_address, bool _is_middleman, bool _is_active) external;
  function setTimelock(address _new_timelock) external;
  function timelock_address() external view returns(address);
  function toggleDistributions() external;
}


// File contracts/Curve/IveFXS.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

interface IveFXS {

    struct LockedBalance {
        int128 amount;
        uint256 end;
    }

    function commit_transfer_ownership(address addr) external;
    function apply_transfer_ownership() external;
    function commit_smart_wallet_checker(address addr) external;
    function apply_smart_wallet_checker() external;
    function toggleEmergencyUnlock() external;
    function recoverERC20(address token_addr, uint256 amount) external;
    function get_last_user_slope(address addr) external view returns (int128);
    function user_point_history__ts(address _addr, uint256 _idx) external view returns (uint256);
    function locked__end(address _addr) external view returns (uint256);
    function checkpoint() external;
    function deposit_for(address _addr, uint256 _value) external;
    function create_lock(uint256 _value, uint256 _unlock_time) external;
    function increase_amount(uint256 _value) external;
    function increase_unlock_time(uint256 _unlock_time) external;
    function withdraw() external;
    function balanceOf(address addr) external view returns (uint256);
    function balanceOf(address addr, uint256 _t) external view returns (uint256);
    function balanceOfAt(address addr, uint256 _block) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function totalSupply(uint256 t) external view returns (uint256);
    function totalSupplyAt(uint256 _block) external view returns (uint256);
    function totalFXSSupply() external view returns (uint256);
    function totalFXSSupplyAt(uint256 _block) external view returns (uint256);
    function changeController(address _newController) external;
    function token() external view returns (address);
    function supply() external view returns (uint256);
    function locked(address addr) external view returns (LockedBalance memory);
    function epoch() external view returns (uint256);
    function point_history(uint256 arg0) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fxs_amt);
    function user_point_history(address arg0, uint256 arg1) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fxs_amt);
    function user_point_epoch(address arg0) external view returns (uint256);
    function slope_changes(uint256 arg0) external view returns (int128);
    function controller() external view returns (address);
    function transfersEnabled() external view returns (bool);
    function emergencyUnlockActive() external view returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function version() external view returns (string memory);
    function decimals() external view returns (uint256);
    function future_smart_wallet_checker() external view returns (address);
    function smart_wallet_checker() external view returns (address);
    function admin() external view returns (address);
    function future_admin() external view returns (address);
}


// File contracts/Math/Math.sol

// Original license: SPDX_License_Identifier: MIT

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
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);
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}


// File contracts/Misc_AMOs/balancer/IAuraGauge.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

interface IAuraGauge {
    
    struct Reward {
        address token;
        address distributor;
        uint256 period_finish;
        uint256 rate;
        uint256 last_update;
        uint256 integral;
    }

    function deposit ( uint256 _value ) external;
    function deposit ( uint256 _value, address _addr ) external;
    function deposit ( uint256 _value, address _addr, bool _claim_rewards ) external;
    function withdraw ( uint256 _value ) external;
    function withdraw ( uint256 _value, bool _claim_rewards ) external;
    function claim_rewards (  ) external;
    function claim_rewards ( address _addr ) external;
    function claim_rewards ( address _addr, address _receiver ) external;
    function transferFrom ( address _from, address _to, uint256 _value ) external returns ( bool );
    function transfer ( address _to, uint256 _value ) external returns ( bool );
    function approve ( address _spender, uint256 _value ) external returns ( bool );
    function permit ( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external returns ( bool );
    function increaseAllowance ( address _spender, uint256 _added_value ) external returns ( bool );
    function decreaseAllowance ( address _spender, uint256 _subtracted_value ) external returns ( bool );
    function user_checkpoint ( address addr ) external returns ( bool );
    function set_rewards_receiver ( address _receiver ) external;
    function kick ( address addr ) external;
    function deposit_reward_token ( address _reward_token, uint256 _amount ) external;
    function add_reward ( address _reward_token, address _distributor ) external;
    function set_reward_distributor ( address _reward_token, address _distributor ) external;
    function killGauge (  ) external;
    function unkillGauge (  ) external;
    function claimed_reward ( address _addr, address _token ) external view returns ( uint256 );
    function claimable_reward ( address _user, address _reward_token ) external view returns ( uint256 );
    function claimable_tokens ( address addr ) external returns ( uint256 );
    function integrate_checkpoint (  ) external view returns ( uint256 );
    function future_epoch_time (  ) external view returns ( uint256 );
    function inflation_rate (  ) external view returns ( uint256 );
    function decimals (  ) external view returns ( uint256 );
    function version (  ) external view returns ( string memory );
    function allowance ( address owner, address spender ) external view returns ( uint256 );
    function initialize ( address _lp_token, uint256 relative_weight_cap ) external;
    function setRelativeWeightCap ( uint256 relative_weight_cap ) external;
    function getRelativeWeightCap (  ) external view returns ( uint256 );
    function getCappedRelativeWeight ( uint256 time ) external view returns ( uint256 );
    function getMaxRelativeWeightCap (  ) external pure returns ( uint256 );
    function balanceOf ( address arg0 ) external view returns ( uint256 );
    function totalSupply (  ) external view returns ( uint256 );
    function name (  ) external view returns ( string memory );
    function symbol (  ) external view returns ( string memory );
    function DOMAIN_SEPARATOR (  ) external view returns ( bytes32 );
    function nonces ( address arg0 ) external view returns ( uint256 );
    function lp_token (  ) external view returns ( address );
    function is_killed (  ) external view returns ( bool );
    function reward_count (  ) external view returns ( uint256 );
    function reward_data ( address arg0 ) external view returns ( Reward memory );
    function rewards_receiver ( address arg0 ) external view returns ( address );
    function reward_integral_for ( address arg0, address arg1 ) external view returns ( uint256 );
    function working_balances ( address arg0 ) external view returns ( uint256 );
    function working_supply (  ) external view returns ( uint256 );
    function integrate_inv_supply_of ( address arg0 ) external view returns ( uint256 );
    function integrate_checkpoint_of ( address arg0 ) external view returns ( uint256 );
    function integrate_fraction ( address arg0 ) external view returns ( uint256 );
    function period (  ) external view returns ( int128 );
    function reward_tokens ( uint256 arg0 ) external view returns ( address );
    function period_timestamp ( uint256 arg0 ) external view returns ( uint256 );
    function integrate_inv_supply ( uint256 arg0 ) external view returns ( uint256 );
}


// File contracts/Misc_AMOs/balancer/IBalancerMinter.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later


interface IBalancerMinter {
  function allowed_to_mint_for ( address minter, address user ) external view returns ( bool );
  function getBalancerToken (  ) external view returns ( address );
  function getBalancerTokenAdmin (  ) external view returns ( address );
  function getDomainSeparator (  ) external view returns ( bytes32 );
  function getGaugeController (  ) external view returns ( address );
  function getMinterApproval ( address minter, address user ) external view returns ( bool );
  function getNextNonce ( address user ) external view returns ( uint256 );
  function mint ( address gauge ) external returns ( uint256 );
  function mintFor ( address gauge, address user ) external returns ( uint256 );
  function mintMany ( address[] memory gauges ) external returns ( uint256 );
  function mintManyFor ( address[] memory gauges, address user ) external returns ( uint256 );
  function mint_for ( address gauge, address user ) external;
  function mint_many ( address[8] memory gauges ) external;
  function minted ( address user, address gauge ) external view returns ( uint256 );
  function setMinterApproval ( address minter, bool approval ) external;
  function setMinterApprovalWithSignature ( address minter, bool approval, address user, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external;
  function toggle_approve_mint ( address minter ) external;
}


// File contracts/Staking/Owned.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

// https://docs.synthetix.io/contracts/Owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor (address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        require(msg.sender == owner, "Only the contract owner may perform this action");
        _;
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}


// File contracts/Uniswap/TransferHelper.sol

// Original license: SPDX_License_Identifier: MIT

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}


// File contracts/Utils/ReentrancyGuard.sol

// Original license: SPDX_License_Identifier: MIT

/**
 * @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 () internal {
        _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;
    }
}


// File contracts/Staking/FraxUnifiedFarmTemplate.sol

// Original license: SPDX_License_Identifier: GPL-2.0-or-later

// ====================================================================
// |     ______                   _______                             |
// |    / _____________ __  __   / ____(_____  ____ _____  ________   |
// |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
// |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
// | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
// |                                                                  |
// ====================================================================
// ====================== FraxUnifiedFarmTemplate =====================
// ====================================================================
// Farming contract that accounts for veFXS
// Overrideable for UniV3, ERC20s, etc
// New for V2
//      - Multiple reward tokens possible
//      - Can add to existing locked stakes
//      - Contract is aware of proxied veFXS
//      - veFXS multiplier formula changed
// Apes together strong

// Frax Finance: https://github.com/FraxFinance

// Primary Author(s)
// Travis Moore: https://github.com/FortisFortuna

// Reviewer(s) / Contributor(s)
// Jason Huan: https://github.com/jasonhuan
// Sam Kazemian: https://github.com/samkazemian
// Dennis: github.com/denett

// Originally inspired by Synthetix.io, but heavily modified by the Frax team
// (Locked, veFXS, and UniV3 portions are new)
// https://raw.githubusercontent.com/Synthetixio/synthetix/develop/contracts/StakingRewards.sol








// Extra rewards
// Balancer
// ====================


// BUNNI
// ====================
// import "../Misc_AMOs/bunni/IBunniGauge.sol";
// import "../Misc_AMOs/bunni/IBunniLens.sol";
// import "../Misc_AMOs/bunni/IBunniMinter.sol";

// CONVEX
// ====================
// import "../Misc_AMOs/convex/IConvexBaseRewardPool.sol";

contract FraxUnifiedFarmTemplate is Owned, ReentrancyGuard {


    // -------------------- VARIES --------------------

    // Balancer
    IAuraGauge public stakingToken;
    IBalancerMinter public minter = IBalancerMinter(0x239e55F427D44C3cc793f49bFB507ebe76638a2b);

    // Bunni
    // IBunniGauge public stakingToken;
    // IBunniLens public lens = IBunniLens(0xb73F303472C4fD4FF3B9f59ce0F9b13E47fbfD19);
    // IBunniMinter public minter = IBunniMinter(0xF087521Ffca0Fa8A43F5C445773aB37C5f574DA0);

    /* ========== STATE VARIABLES ========== */

    // Instances
    IveFXS private constant veFXS = IveFXS(0xc8418aF6358FFddA74e09Ca9CC3Fe03Ca6aDC5b0);
    
    // Frax related
    address internal constant frax_address = 0x853d955aCEf822Db058eb8505911ED77F175b99e;
    /// @notice fraxPerLPToken is a public view function, although doesn't show the stored value
    uint256 public fraxPerLPStored;

    // Constant for various precisions
    uint256 internal constant MULTIPLIER_PRECISION = 1e18;

    // Time tracking
    /// @notice Ending timestamp for the current period
    uint256 public periodFinish;
    /// @notice Timestamp of the last update - when this period started
    uint256 public lastUpdateTime;

    // Lock time and multiplier settings
    uint256 public lock_max_multiplier = uint256(2e18); // E18. 1x = e18
    uint256 public lock_time_for_max_multiplier = 1 * 1095 * 86400; // 3 years
    // uint256 public lock_time_for_max_multiplier = 2 * 86400; // 2 days
    uint256 public lock_time_min = 0; // 0 sec

    // veFXS related
    uint256 public vefxs_boost_scale_factor = uint256(4e18); // E18. 4x = 4e18; 100 / scale_factor = % vefxs supply needed for max boost
    uint256 public vefxs_max_multiplier = uint256(2e18); // E18. 1x = 1e18
    uint256 public vefxs_per_frax_for_max_boost = uint256(4e18); // E18. 2e18 means 2 veFXS must be held by the staker per 1 FRAX
    mapping(address => uint256) internal _vefxsMultiplierStored;
    mapping(address => bool) internal valid_vefxs_proxies;
    mapping(address => mapping(address => bool)) internal proxy_allowed_stakers;

    // Reward addresses, gauge addresses, reward rates, and reward managers
    /// @notice token addr -> manager addr
    mapping(address => address) public rewardManagers; 
    address[] internal rewardTokens;
    address[] internal gaugeControllers;
    address[] internal rewardDistributors;
    uint256[] internal rewardRatesManual;
    mapping(address => bool) internal isRewardToken;
    /// @notice token addr -> token index
    mapping(address => uint256) public rewardTokenAddrToIdx;
    
    // Reward period
    uint256 public constant rewardsDuration = 604800; // 7 * 86400  (7 days)

    // Reward tracking
    uint256[] private rewardsPerTokenStored;
    mapping(address => mapping(uint256 => uint256)) private userRewardsPerTokenPaid; // staker addr -> token id -> paid amount
    mapping(address => mapping(uint256 => uint256)) private rewards; // staker addr -> token id -> reward amount
    mapping(address => uint256) public lastRewardClaimTime; // staker addr -> timestamp
    
    // Gauge tracking
    uint256[] private last_gauge_relative_weights;
    uint256[] private last_gauge_time_totals;

    // Balance tracking
    uint256 internal _total_liquidity_locked;
    uint256 internal _total_combined_weight;
    mapping(address => uint256) internal _locked_liquidity;
    mapping(address => uint256) internal _combined_weights;
    /// @notice Keeps track of LP balances proxy-wide. Needed to make sure the proxy boost is kept in line
    mapping(address => uint256) public proxy_lp_balances; 


    /// @notice Stakers set which proxy(s) they want to use
    /// @dev Keep public so users can see on the frontend if they have a proxy
    mapping(address => address) public staker_designated_proxies;

    // Admin booleans for emergencies and overrides
    bool public stakesUnlocked; // Release locked stakes in case of emergency
    bool internal withdrawalsPaused; // For emergencies
    bool internal rewardsCollectionPaused; // For emergencies
    bool internal stakingPaused; // For emergencies

    // For emergencies if a token is overemitted or something else. Only callable once.
    // Bypasses certain logic, which will cause reward calculations to be off
    // But the goal is for the users to recover LP, and they couldn't claim the erroneous rewards anyways.
    // Reward reimbursement claims would be handled with pre-issue earned() snapshots and a claim contract, or similar.
    bool public withdrawalOnlyShutdown; 

    // Version
    string public version = "1.0.6";

    /* ========== STRUCTS ========== */
    // In children...


    /* ========== MODIFIERS ========== */

    modifier onlyByOwnGov() {
        require(msg.sender == owner || msg.sender == 0x8412ebf45bAC1B340BbE8F318b928C466c4E39CA, "Not owner or timelock");
        _;
    }

    modifier onlyTknMgrs(address reward_token_address) {
        require(msg.sender == owner || isTokenManagerFor(msg.sender, reward_token_address), "Not owner or tkn mgr");
        _;
    }

    modifier updateRewardAndBalanceMdf(address account, bool sync_too) {
        _updateRewardAndBalance(account, sync_too, false);
        _;
    }

    /* ========== CONSTRUCTOR ========== */

    constructor (
        address _owner,
        address[] memory _rewardTokens,
        address[] memory _rewardManagers,
        uint256[] memory _rewardRatesManual,
        address[] memory _gaugeControllers,
        address[] memory _rewardDistributors
    ) Owned(_owner) {

        // Address arrays
        rewardTokens = _rewardTokens;
        gaugeControllers = _gaugeControllers;
        rewardDistributors = _rewardDistributors;
        rewardRatesManual = _rewardRatesManual;

        for (uint256 i = 0; i < _rewardTokens.length; i++){ 
            // For fast token address -> token ID lookups later
            rewardTokenAddrToIdx[_rewardTokens[i]] = i;

            // Add to the mapping
            isRewardToken[_rewardTokens[i]] = true;

            // Initialize the stored rewards
            rewardsPerTokenStored.push(0);

            // Initialize the reward managers
            rewardManagers[_rewardTokens[i]] = _rewardManagers[i];

            // Push in empty relative weights to initialize the array
            last_gauge_relative_weights.push(0);

            // Push in empty time totals to initialize the array
            last_gauge_time_totals.push(0);
        }

        // Other booleans
        stakesUnlocked = false;

        // Initialization
        lastUpdateTime = block.timestamp;

        // Sync the first period finish here with the gauge's 
        // periodFinish = IFraxGaugeController(gaugeControllers[0]).time_total();
        periodFinish = IFraxGaugeController(0x3669C421b77340B2979d1A00a792CC2ee0FcE737).time_total();
        
    }

    /* ============= VIEWS ============= */

    // ------ REWARD RELATED ------

    /// @notice Checks if the caller is a manager for the reward token
    /// @param caller_addr The address of the caller
    /// @param reward_token_addr The address of the reward token
    /// @return bool True if the caller is a manager for the reward token
    function isTokenManagerFor(address caller_addr, address reward_token_addr) public view returns (bool){
        if (!isRewardToken[reward_token_addr]) return false;
        else if (caller_addr == address(0) || reward_token_addr == address(0)) return false;
        else if (caller_addr == owner) return true; // Contract owner
        else if (rewardManagers[reward_token_addr] == caller_addr) return true; // Reward manager
        return false; 
    }

    /// @notice Gets all the reward tokens this contract handles
    /// @return rewardTokens_ The reward tokens array
    function getAllRewardTokens() external view returns (address[] memory) {
        return rewardTokens;
    }

    // Last time the reward was applicable
    function lastTimeRewardApplicable() internal view returns (uint256) {
        return Math.min(block.timestamp, periodFinish);
    }

    /// @notice The amount of reward tokens being paid out per second this period
    /// @param token_idx The index of the reward token
    /// @return rwd_rate The reward rate
    function rewardRates(uint256 token_idx) public view returns (uint256 rwd_rate) {
        address gauge_controller_address = gaugeControllers[token_idx];
        if (gauge_controller_address != address(0)) {
            rwd_rate = (IFraxGaugeController(gauge_controller_address).global_emission_rate() * last_gauge_relative_weights[token_idx]) / 1e18;
        }
        else {
            rwd_rate = rewardRatesManual[token_idx];
        }
    }

    // Amount of reward tokens per LP token / liquidity unit
    function rewardsPerToken() public view returns (uint256[] memory newRewardsPerTokenStored) {
        if (_total_liquidity_locked == 0 || _total_combined_weight == 0) {
            return rewardsPerTokenStored;
        }
        else {
            newRewardsPerTokenStored = new uint256[](rewardTokens.length);
            for (uint256 i = 0; i < rewardsPerTokenStored.length; i++){ 
                newRewardsPerTokenStored[i] = rewardsPerTokenStored[i] + (
                    ((lastTimeRewardApplicable() - lastUpdateTime) * rewardRates(i) * 1e18) / _total_combined_weight
                );
            }
            return newRewardsPerTokenStored;
        }
    }

    /// @notice The amount of reward tokens an account has earned / accrued
    /// @dev In the edge-case of one of the account's stake expiring since the last claim, this will
    /// @param account The account to check
    /// @return new_earned Array of reward token amounts earned by the account
    function earned(address account) public view returns (uint256[] memory new_earned) {
        uint256[] memory reward_arr = rewardsPerToken();
        new_earned = new uint256[](rewardTokens.length);

        if (_combined_weights[account] > 0){
            for (uint256 i = 0; i < rewardTokens.length; i++){ 
                new_earned[i] = ((_combined_weights[account] * (reward_arr[i] - userRewardsPerTokenPaid[account][i])) / 1e18)
                                + rewards[account][i];
            }
        }
    }

    /// @notice The total reward tokens emitted in the given period
    /// @return rewards_per_duration_arr Array of reward token amounts emitted in the current period
    function getRewardForDuration() external view returns (uint256[] memory rewards_per_duration_arr) {
        rewards_per_duration_arr = new uint256[](rewardRatesManual.length);

        for (uint256 i = 0; i < rewardRatesManual.length; i++){ 
            rewards_per_duration_arr[i] = rewardRates(i) * rewardsDuration;
        }
    }


    // ------ LIQUIDITY AND WEIGHTS ------

    /// @notice The farm's total locked liquidity / LP tokens
    /// @return The total locked liquidity
    function totalLiquidityLocked() external view returns (uint256) {
        return _total_liquidity_locked;
    }

    /// @notice A user's locked liquidity / LP tokens
    /// @param account The address of the account
    /// @return The locked liquidity
    function lockedLiquidityOf(address account) external view returns (uint256) {
        return _locked_liquidity[account];
    }

    /// @notice The farm's total combined weight of all users
    /// @return The total combined weight
    function totalCombinedWeight() external view returns (uint256) {
        return _total_combined_weight;
    }

    /// @notice Total 'balance' used for calculating the percent of the pool the account owns
    /// @notice Takes into account the locked stake time multiplier and veFXS multiplier
    /// @param account The address of the account
    /// @return The combined weight
    function combinedWeightOf(address account) external view returns (uint256) {
        return _combined_weights[account];
    }

    /// @notice Calculates the combined weight for an account
    /// @notice Must be overriden by the child contract
    /// @dev account The address of the account
    function calcCurCombinedWeight(address account) public virtual view 
        returns (
            uint256 old_combined_weight,
            uint256 new_vefxs_multiplier,
            uint256 new_combined_weight
        )
    {
        revert("Need cCCW logic");
    }

    // ------ LOCK RELATED ------

    /// @notice Reads the lock boost multiplier for a given duration
    /// @param secs The duration of the lock in seconds
    /// @return The multiplier amount
    function lockMultiplier(uint256 secs) public view returns (uint256) {
        return Math.min(
            lock_max_multiplier,
            (secs * lock_max_multiplier) / lock_time_for_max_multiplier
        ) ;
    }

    // ------ FRAX RELATED ------

    /// @notice The amount of FRAX denominated value being boosted that an address has staked
    /// @param account The address to check
    /// @return The amount of FRAX value boosted
    function userStakedFrax(address account) public view returns (uint256) {
        return (fraxPerLPStored * _locked_liquidity[account]) / MULTIPLIER_PRECISION;
    }

    /// @notice The amount of FRAX denominated value being boosted that a proxy address has staked
    /// @param proxy_address The address to check
    /// @return The amount of FRAX value boosted
    function proxyStakedFrax(address proxy_address) public view returns (uint256) {
        return (fraxPerLPStored * proxy_lp_balances[proxy_address]) / MULTIPLIER_PRECISION;
    }

    /// @notice The maximum LP that can get max veFXS boosted for a given address at its current veFXS balance
    /// @param account The address to check
    /// @return The maximum LP that can get max veFXS boosted for a given address at its current veFXS balance
    function maxLPForMaxBoost(address account) external view returns (uint256) {
        return (veFXS.balanceOf(account) * MULTIPLIER_PRECISION * MULTIPLIER_PRECISION) / (vefxs_per_frax_for_max_boost * fraxPerLPStored);
    }

    /// @notice Must be overriden to return the current FRAX per LP token
    /// @return The current number of FRAX per LP token
    function fraxPerLPToken() public virtual view returns (uint256) {
        revert("Need fPLPT logic");
    }

    // ------ veFXS RELATED ------

    /// @notice The minimum veFXS required to get max boost for a given address
    /// @param account The address to check
    /// @return The minimum veFXS required to get max boost
    function minVeFXSForMaxBoost(address account) public view returns (uint256) {
        return (userStakedFrax(account) * vefxs_per_frax_for_max_boost) / MULTIPLIER_PRECISION;
    }

    /// @notice The minimum veFXS required to get max boost for a given proxy
    /// @param proxy_address The proxy address
    /// @return The minimum veFXS required to get max boost
    function minVeFXSForMaxBoostProxy(address proxy_address) public view returns (uint256) {
        return (proxyStakedFrax(proxy_address) * vefxs_per_frax_for_max_boost) / MULTIPLIER_PRECISION;
    }

    /// @notice Looks up a staker's proxy
    /// @param addr The address to check
    /// @return the_proxy The proxy address, or address(0)
    function getProxyFor(address addr) public view returns (address){
        if (valid_vefxs_proxies[addr]) {
            // If addr itself is a proxy, return that.
            // If it farms itself directly, it should use the shared LP tally in proxyStakedFrax
            return addr;
        }
        else {
            // Otherwise, return the proxy, or address(0)
            return staker_designated_proxies[addr];
        }
    }

    /// @notice The multiplier for a given account, based on veFXS
    /// @param account The account to check
    /// @return vefxs_multiplier The multiplier boost for the account
    function veFXSMultiplier(address account) public view returns (uint256 vefxs_multiplier) {
        // Use either the user's or their proxy's veFXS balance
        uint256 vefxs_bal_to_use = 0;
        address the_proxy = getProxyFor(account);
        vefxs_bal_to_use = (the_proxy == address(0)) ? veFXS.balanceOf(account) : veFXS.balanceOf(the_proxy);

        // First option based on fraction of total veFXS supply, with an added scale factor
        uint256 mult_optn_1 = (vefxs_bal_to_use * vefxs_max_multiplier * vefxs_boost_scale_factor) 
                            / (veFXS.totalSupply() * MULTIPLIER_PRECISION);
        
        // Second based on old method, where the amount of FRAX staked comes into play
        uint256 mult_optn_2;
        {
            uint256 veFXS_needed_for_max_boost;

            // Need to use proxy-wide FRAX balance if applicable, to prevent exploiting
            veFXS_needed_for_max_boost = (the_proxy == address(0)) ? minVeFXSForMaxBoost(account) : minVeFXSForMaxBoostProxy(the_proxy);

            if (veFXS_needed_for_max_boost > 0){ 
                uint256 user_vefxs_fraction = (vefxs_bal_to_use * MULTIPLIER_PRECISION) / veFXS_needed_for_max_boost;
                
                mult...

// [truncated — 110869 bytes total]

Read Contract

calcCurCombinedWeight 0x8bad86a7 → uint256, uint256, uint256
calcCurrLockMultiplier 0x774d4ae7 → uint256
combinedWeightOf 0x36f89af2 → uint256
earned 0x008cc262 → uint256[]
farm_type 0x41edbdf0 → string
fraxPerLPStored 0xd2010fb4 → uint256
fraxPerLPToken 0x5bfd9258 → uint256
getAllRewardTokens 0x12edb24c → address[]
getLatestETHPriceE8 0xbdb123e3 → int256
getProxyFor 0xc3543826 → address
getRewardForDuration 0x1c1f78eb → uint256[]
isTokenManagerFor 0x231b68dc → bool
lastRewardClaimTime 0x6c430dbb → uint256
lastUpdateTime 0xc8f33c91 → uint256
lockMultiplier 0x0d7bac4f → uint256
lock_max_multiplier 0xcdc82e80 → uint256
lock_time_for_max_multiplier 0xb94c4dcb → uint256
lock_time_min 0x6e27cef9 → uint256
lockedLiquidityOf 0xd9f96e8d → uint256
lockedStakes 0x7970833e → bytes32, uint256, uint256, uint256, uint256
lockedStakesOf 0x1e090f01 → tuple[]
lockedStakesOfLength 0xca6df29d → uint256
lp_tkn 0x2352aac1 → address
maxLPForMaxBoost 0xa0f23476 → uint256
minVeFXSForMaxBoost 0x4fd2b536 → uint256
minVeFXSForMaxBoostProxy 0x7f472e54 → uint256
minter 0x07546172 → address
nominatedOwner 0x53a47bb7 → address
owner 0x8da5cb5b → address
periodFinish 0xebe2b12b → uint256
proxyStakedFrax 0x1face856 → uint256
proxy_lp_balances 0x7d6ef08e → uint256
rewardManagers 0x41a16f3f → address
rewardRates 0xf2caeb1e → uint256
rewardTokenAddrToIdx 0x69339245 → uint256
rewardsDuration 0x386a9525 → uint256
rewardsPerToken 0x70641a36 → uint256[]
staker_designated_proxies 0x28408bab → address
stakesUnlocked 0x9637927f → bool
stakingToken 0x72f702f3 → address
totalCombinedWeight 0x64f2c060 → uint256
totalLiquidityLocked 0xe01f62bf → uint256
userStakedFrax 0xd42fc9b4 → uint256
vault 0xfbfa77cf → address
veFXSMultiplier 0x2c0c2a0a → uint256
vefxs_boost_scale_factor 0xaa1d4fce → uint256
vefxs_max_multiplier 0xf288baf6 → uint256
vefxs_per_frax_for_max_boost 0xf2a8d349 → uint256
version 0x54fd4d50 → string
withdrawalOnlyShutdown 0x89b5f00b → bool

Write Contract 23 functions

These functions modify contract state and require a wallet transaction to execute.

acceptOwnership 0x79ba5097
No parameters
changeTokenManager 0xde1a6551
address reward_token_address
address new_manager_address
getReward 0xc00007b0
address destination_address
returns: uint256[]
getReward2 0x7910d17b
address destination_address
bool claim_extra_too
returns: uint256[]
getRewardExtraLogic 0x387edc86
address destination_address
lockAdditional 0xb85efd06
bytes32 kek_id
uint256 addl_liq
lockLonger 0xd2fbdc0d
bytes32 kek_id
uint256 new_ending_ts
nominateNewOwner 0x1627540c
address _owner
proxyToggleStaker 0xe7f30582
address staker_address
recoverERC20 0x8980f11f
address tokenAddress
uint256 tokenAmount
setBalancerAddrs 0xaf48e59a
address _minter
address _vault
setETHUSDOracle 0x741d3c18
address _eth_usd_oracle_address
setMiscVariables 0xfacefb64
uint256[6] _misc_vars
setPauses 0x2df079f1
bool _stakingPaused
bool _withdrawalsPaused
bool _rewardsCollectionPaused
bool _withdrawalOnlyShutdown
setRewardVars 0xd5e1a9c6
address reward_token_address
uint256 _new_rate
address _gauge_controller_address
address _rewards_distributor_address
stakeLocked 0x17b18c89
uint256 liquidity
uint256 secs
returns: bytes32
stakerSetVeFXSProxy 0xd7400d56
address proxy_address
sync 0xfff6cae9
No parameters
sync_gauge_weights 0xf77e34d1
bool force_update
toggleBalancer3rdPartyBalClaimer 0xa321ff97
address _claimer
toggleValidVeFXSProxy 0x91cf600a
address _proxy_addr
unlockStakes 0xe1ba95d2
No parameters
withdrawLocked 0x0238b936
bytes32 kek_id
address destination_address
bool claim_rewards_deprecated
returns: uint256

Recent Transactions

No transactions found for this address