Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x04bC0Ab673d88aE9dbC9DA2380cB6B79C4BCa9aE
Balance 0 ETH
Nonce 1
Code Size 24536 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

24536 bytes
0x608060405234801561001057600080fd5b50600436106103995760003560e01c80638da5cb5b116101e9578063b69ef8a81161010f578063e849d659116100ad578063f69e20461161007c578063f69e204614610a30578063f7c1ec7714610a4e578063f82ce27d14610a6c578063fc0c546a14610a8a57610399565b8063e849d659146109be578063f2fde38b146109da578063f5a41dea146109f6578063f5ff191614610a1457610399565b8063cf8ca426116100e9578063cf8ca42614610934578063d54e324414610952578063d9d7858a14610970578063dd62ed3e1461098e57610399565b8063b69ef8a8146108de578063b6b55f25146108fc578063bbf316441461091857610399565b8063a03e4bc311610187578063a9059cbb11610156578063a9059cbb14610858578063a9de245b14610888578063b098fc80146108a4578063b30d0bb2146108c257610399565b8063a03e4bc3146107ce578063a160176d146107ec578063a457c2d71461080a578063a72879711461083a57610399565b80638f9225ca116101c35780638f9225ca1461076c57806395d89b411461078a57806399b71d5c146107a85780639ff011b9146107b257610399565b80638da5cb5b146107125780638e4ec6ef146107305780638f32d59b1461074e57610399565b806346357473116102ce57806370a082311161026c5780637d7c2a1c1161023b5780637d7c2a1c146106b25780638124955c146106bc578063812adb06146106d8578063819faf7b146106f457610399565b806370a082311461063c5780637137ef991461066c578063715018a61461068a57806377c7b8fc1461069457610399565b806358782c21116102a857806358782c21146105c857806361c1ec55146105e657806365aab7491461060457806367e4b7401461062057610399565b8063463574731461057257806356cc93781461058e57806357ded9c9146105aa57610399565b806318160ddd1161033b578063313ce56711610315578063313ce567146104ea578063395093511461050857806339c0a7e11461053857806341c57c8d1461055657610399565b806318160ddd1461048057806323b872dd1461049e5780632e1a7d4d146104ce57610399565b8063085d488311610377578063085d4883146103f6578063095ea7b3146104145780630eb2a2671461044457806316f0115b1461046257610399565b806306636c1c1461039e57806306a3fe59146103ba57806306fdde03146103d8575b600080fd5b6103b860048036036103b39190810190614ce5565b610aa8565b005b6103c2610afb565b6040516103cf91906157ba565b60405180910390f35b6103e0610b21565b6040516103ed9190615902565b60405180910390f35b6103fe610bc3565b60405161040b91906158e7565b60405180910390f35b61042e60048036036104299190810190614bc8565b610bd6565b60405161043b91906158cc565b60405180910390f35b61044c610bf4565b6040516104599190615c0d565b60405180910390f35b61046a610ca6565b6040516104779190615c0d565b60405180910390f35b610488610cac565b6040516104959190615c0d565b60405180910390f35b6104b860048036036104b39190810190614b79565b610cb6565b6040516104c591906158cc565b60405180910390f35b6104e860048036036104e39190810190614ce5565b610d8f565b005b6104f2611139565b6040516104ff9190615c28565b60405180910390f35b610522600480360361051d9190810190614bc8565b611150565b60405161052f91906158cc565b60405180910390f35b610540611203565b60405161054d9190615c0d565b60405180910390f35b610570600480360361056b9190810190614ce5565b6112f3565b005b61058c60048036036105879190810190614aeb565b611346565b005b6105a860048036036105a39190810190614ce5565b6113d1565b005b6105b2611424565b6040516105bf91906157ba565b60405180910390f35b6105d061144a565b6040516105dd91906157ba565b60405180910390f35b6105ee611470565b6040516105fb9190615c0d565b60405180910390f35b61061e60048036036106199190810190614ce5565b611522565b005b61063a60048036036106359190810190614ce5565b611575565b005b61065660048036036106519190810190614aeb565b6115c8565b6040516106639190615c0d565b60405180910390f35b610674611610565b6040516106819190615c0d565b60405180910390f35b610692611683565b005b61069c61178b565b6040516106a99190615c0d565b60405180910390f35b6106ba6117cd565b005b6106d660048036036106d19190810190614ce5565b611913565b005b6106f260048036036106ed9190810190614aeb565b611966565b005b6106fc6119f1565b60405161070991906157ba565b60405180910390f35b61071a611a17565b60405161072791906157ba565b60405180910390f35b610738611a41565b60405161074591906157ba565b60405180910390f35b610756611a67565b60405161076391906158cc565b60405180910390f35b610774611ac6565b6040516107819190615c0d565b60405180910390f35b610792611b9a565b60405161079f9190615902565b60405180910390f35b6107b0611c3c565b005b6107cc60048036036107c79190810190614ce5565b612004565b005b6107d6612055565b6040516107e391906157ba565b60405180910390f35b6107f461207b565b60405161080191906158e7565b60405180910390f35b610824600480360361081f9190810190614bc8565b6121e7565b60405161083191906158cc565b60405180910390f35b6108426122b4565b60405161084f9190615c0d565b60405180910390f35b610872600480360361086d9190810190614bc8565b6123a0565b60405161087f91906158cc565b60405180910390f35b6108a2600480360361089d9190810190614aeb565b6123be565b005b6108ac612449565b6040516108b99190615c0d565b60405180910390f35b6108dc60048036036108d79190810190614ce5565b61251d565b005b6108e6612570565b6040516108f39190615c0d565b60405180910390f35b61091660048036036109119190810190614ce5565b612622565b005b610932600480360361092d9190810190614aeb565b612786565b005b61093c612811565b6040516109499190615c0d565b60405180910390f35b61095a6128c3565b6040516109679190615c0d565b60405180910390f35b610978612997565b6040516109859190615c0d565b60405180910390f35b6109a860048036036109a39190810190614b3d565b61299d565b6040516109b59190615c0d565b60405180910390f35b6109d860048036036109d39190810190614ce5565b612a24565b005b6109f460048036036109ef9190810190614aeb565b612a77565b005b6109fe612aca565b604051610a0b9190615c0d565b60405180910390f35b610a2e6004803603610a299190810190614aeb565b612b95565b005b610a38612c20565b604051610a4591906157ba565b60405180910390f35b610a56612c46565b604051610a6391906157ba565b60405180910390f35b610a74612ced565b604051610a8191906157ba565b60405180910390f35b610a92612d94565b604051610a9f91906157ba565b60405180910390f35b610ab0611a67565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae690615a44565b60405180910390fd5b610af881612dba565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b601160149054906101000a900460ff1681565b6000610bea610be3612ff4565b8484612ffc565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c5191906157ba565b60206040518083038186803b158015610c6957600080fd5b505afa158015610c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ca19190810190614d0e565b905090565b60085481565b6000600254905090565b6000610cc38484846131c7565b610d8484610ccf612ff4565b610d7f85604051806060016040528060288152602001615f4960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610d35612ff4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612ffc565b600190509392505050565b60016006600082825401925050819055506000600654905060008211610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de190615a84565b60405180910390fd5b6000610df5336115c8565b905080831115610e3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3190615a64565b60405180910390fd5b610e42611610565b6008819055506000610e73600254610e65866008546134ac90919063ffffffff16565b61351c90919063ffffffff16565b9050610efd846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f548460025461356690919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610fb89190615c0d565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101d91906157ba565b60206040518083038186803b15801561103557600080fd5b505afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061106d9190810190614d0e565b9050818110156110935761109261108d828461356690919063ffffffff16565b6135b0565b5b6110e03383600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137269092919063ffffffff16565b6110e8611610565b6008819055505050506006548114611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90615b64565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b60006111f961115d612ff4565b846111f4856001600061116e612ff4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c590919063ffffffff16565b612ffc565b6001905092915050565b600061120d614842565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152506010546040518363ffffffff1660e01b8152600401611297929190615be4565b604080518083038186803b1580156112ae57600080fd5b505afa1580156112c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112e69190810190614cbc565b9050806020015191505090565b6112fb611a67565b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190615a44565b60405180910390fd5b6113438161381a565b50565b61134e611a67565b61138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490615a44565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113d9611a67565b611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90615a44565b60405180910390fd5b61142181613a54565b50565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114cd91906157ba565b60206040518083038186803b1580156114e557600080fd5b505afa1580156114f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061151d9190810190614d0e565b905090565b61152a611a67565b611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090615a44565b60405180910390fd5b61157281613ae4565b50565b61157d611a67565b6115bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b390615a44565b60405180910390fd5b6115c581613b80565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061167e61161d612570565b611670611628612811565b611662611633611203565b61165461163e612aca565b6116466122b4565b6137c590919063ffffffff16565b6137c590919063ffffffff16565b6137c590919063ffffffff16565b6137c590919063ffffffff16565b905090565b61168b611a67565b6116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190615a44565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080611796611610565b90506117c76002546117b9670de0b6b3a7640000846134ac90919063ffffffff16565b61351c90919063ffffffff16565b91505090565b60006117d761207b565b9050601160149054906101000a900460ff1660048111156117f457fe5b81600481111561180057fe5b1461180e5761180d613c26565b5b6000611818612570565b11156118ed576001600481111561182b57fe5b81600481111561183757fe5b14156118525761184d611848612570565b612dba565b6118ec565b60048081111561185e57fe5b81600481111561186a57fe5b14156118855761188061187b612570565b613ce1565b6118eb565b6002600481111561189257fe5b81600481111561189e57fe5b14156118b9576118b46118af612570565b613dd5565b6118ea565b600360048111156118c657fe5b8160048111156118d257fe5b14156118e9576118e86118e3612570565b613ae4565b5b5b5b5b5b80601160146101000a81548160ff0219169083600481111561190b57fe5b021790555050565b61191b611a67565b61195a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195190615a44565b60405180910390fd5b61196381613ce1565b50565b61196e611a67565b6119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a490615a44565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611aaa612ff4565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b4591906157ba565b60206040518083038186803b158015611b5d57600080fd5b505afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b959190810190614d0e565b905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611c325780601f10611c0757610100808354040283529160200191611c32565b820191906000526020600020905b815481529060010190602001808311611c1557829003601f168201915b5050505050905090565b611cac600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611d3b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611dab600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611e3a600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611e8f611e45612ced565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611f03611e9a612ced565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b611f73600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b612002600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ec79092919063ffffffff16565b565b61200c611a67565b61204b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204290615a44565b60405180910390fd5b8060108190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161210091906157ba565b60006040518083038186803b15801561211857600080fd5b505afa15801561212c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506121559190810190614c2d565b94509450945094505060008090508085111561216f578490505b8084111561217b578390505b80831115612187578290505b80821115612193578190505b6000809050858214156121a957600290506121db565b848214156121ba57600490506121da565b838214156121cb57600390506121d9565b828214156121d857600190505b5b5b5b80965050505050505090565b60006122aa6121f4612ff4565b846122a585604051806060016040528060258152602001615f71602591396001600061221e612ff4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612ffc565b6001905092915050565b6000806122bf611470565b9050600081111561239957612396670de0b6b3a7640000612388600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561234157600080fd5b505afa158015612355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506123799190810190614d0e565b846134ac90919063ffffffff16565b61351c90919063ffffffff16565b90505b8091505090565b60006123b46123ad612ff4565b84846131c7565b6001905092915050565b6123c6611a67565b612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc90615a44565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016124c891906157ba565b60206040518083038186803b1580156124e057600080fd5b505afa1580156124f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125189190810190614d0e565b905090565b612525611a67565b612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b90615a44565b60405180910390fd5b61256d8161403e565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125cd91906157ba565b60206040518083038186803b1580156125e557600080fd5b505afa1580156125f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061261d9190810190614d0e565b905090565b6001600660008282540192505081905550600060065490506000821161267d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267490615b04565b60405180910390fd5b612685611610565b6008819055506126da333084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166140e4909392919063ffffffff16565b6000809050600060085414156126f95782905082600881905550612725565b612722600854612714600254866134ac90919063ffffffff16565b61351c90919063ffffffff16565b90505b61272d611610565b60088190555061273d3382614186565b506006548114612782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277990615b64565b60405180910390fd5b5050565b61278e611a67565b6127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490615a44565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161286e91906157ba565b60206040518083038186803b15801561288657600080fd5b505afa15801561289a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128be9190810190614d0e565b905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161294291906157ba565b60206040518083038186803b15801561295a57600080fd5b505afa15801561296e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129929190810190614d0e565b905090565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612a2c611a67565b612a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6290615a44565b60405180910390fd5b612a7481613dd5565b50565b612a7f611a67565b612abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab590615a44565b60405180910390fd5b612ac78161430e565b50565b600080612ad5610bf4565b90506000811115612b8e57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401612b3b91906157ba565b60206040518083038186803b158015612b5357600080fd5b505afa158015612b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612b8b9190810190614d0e565b90505b8091505090565b612b9d611a67565b612bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd390615a44565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612cb057600080fd5b505afa158015612cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612ce89190810190614b14565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b158015612d5757600080fd5b505afa158015612d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612d8f9190810190614b14565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001604051908082528060200260200182016040528015612df757816020015b612de461485e565b815260200190600190039081612ddc5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110612e3357fe5b6020026020010181905250612e4661488e565b6040518060800160405280600115158152602001600080811115612e6657fe5b8152602001600080811115612e7757fe5b8152602001848152509050612e8a6148cc565b600081600001906001811115612e9c57fe5b90816001811115612ea957fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015612f4257816020015b612f2f614938565b815260200190600190039081612f275790505b5090508181600081518110612f5357fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401612fbb929190615895565b600060405180830381600087803b158015612fd557600080fd5b505af1158015612fe9573d6000803e3d6000fd5b505050505050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561306c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306390615ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d390615984565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516131ba9190615c0d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322e90615aa4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329e90615924565b60405180910390fd5b61331281604051806060016040528060268152602001615f23602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133a5816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c590919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134449190615c0d565b60405180910390a3505050565b6000838311158290613499576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134909190615902565b60405180910390fd5b5060008385039050809150509392505050565b6000808314156134bf5760009050613516565b60008284029050828482816134d057fe5b0414613511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350890615a04565b60405180910390fd5b809150505b92915050565b600061355e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061443e565b905092915050565b60006135a883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613451565b905092915050565b600260048111156135bd57fe5b601160149054906101000a900460ff1660048111156135d857fe5b14156135e8576135e78161403e565b5b600360048111156135f557fe5b601160149054906101000a900460ff16600481111561361057fe5b141561366a578061361f612811565b1015613660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365790615ac4565b60405180910390fd5b61366981613a54565b5b6001600481111561367757fe5b601160149054906101000a900460ff16600481111561369257fe5b14156136ec57806136a1611203565b10156136e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d990615ac4565b60405180910390fd5b6136eb8161381a565b5b6004808111156136f857fe5b601160149054906101000a900460ff16600481111561371357fe5b14156137235761372281613b80565b5b50565b6137c0838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b848460405160240161375e929190615835565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061449f565b505050565b600080828401905083811015613810576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613807906159c4565b60405180910390fd5b8091505092915050565b6060600160405190808252806020026020018201604052801561385757816020015b61384461485e565b81526020019060019003908161383c5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff16815260200160008152508160008151811061389357fe5b60200260200101819052506138a661488e565b60405180608001604052806000151581526020016000808111156138c657fe5b81526020016000808111156138d757fe5b81526020018481525090506138ea6148cc565b6001816000019060018111156138fc57fe5b9081600181111561390957fe5b815250506000816020018181525050818160400181905250601054816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050606060016040519080825280602002602001820160405280156139a257816020015b61398f614938565b8152602001906001900390816139875790505b50905081816000815181106139b357fe5b6020026020010181905250600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401613a1b929190615895565b600060405180830381600087803b158015613a3557600080fd5b505af1158015613a49573d6000803e3d6000fd5b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401613aaf9190615c0d565b600060405180830381600087803b158015613ac957600080fd5b505af1158015613add573d6000803e3d6000fd5b5050505050565b613aec612c46565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b8152600401613b4b9392919061585e565b600060405180830381600087803b158015613b6557600080fd5b505af1158015613b79573d6000803e3d6000fd5b5050505050565b6000613b8a610bf4565b90506000613b96612aca565b905082811015613bdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd290615ac4565b60405180910390fd5b6000613c156001613c0784613bf988886134ac90919063ffffffff16565b61351c90919063ffffffff16565b6137c590919063ffffffff16565b9050613c2081614611565b50505050565b6000613c30611470565b90506000811115613c5f57613c5e613c596001613c4b6122b4565b61356690919063ffffffff16565b61403e565b5b613c67611203565b90506000811115613c8357613c82613c7d6128c3565b61381a565b5b613c8b610bf4565b90506000811115613cba57613cb9613cb46001613ca6611ac6565b61356690919063ffffffff16565b613b80565b5b613cc2612811565b90506000811115613cde57613cdd613cd8612449565b613a54565b5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401613d40929190615835565b602060405180830381600087803b158015613d5a57600080fd5b505af1158015613d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613d929190810190614d0e565b11613dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dc990615b24565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b8152600401613e329190615c0d565b602060405180830381600087803b158015613e4c57600080fd5b505af1158015613e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613e849190810190614d0e565b14613ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ebb906159a4565b60405180910390fd5b50565b6000811480613f60575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401613f0e9291906157d5565b60206040518083038186803b158015613f2657600080fd5b505afa158015613f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613f5e9190810190614d0e565b145b613f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9690615b84565b60405180910390fd5b614039838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401613fd7929190615835565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061449f565b505050565b6000614048611470565b905060006140546122b4565b905082811015614099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161409090615ac4565b60405180910390fd5b60006140d360016140c5846140b788886134ac90919063ffffffff16565b61351c90919063ffffffff16565b6137c590919063ffffffff16565b90506140de81614705565b50505050565b614180848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b85858560405160240161411e939291906157fe565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061449f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141ed90615bc4565b60405180910390fd5b61420b816002546137c590919063ffffffff16565b600281905550614262816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c590919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516143029190615c0d565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561437e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161437590615964565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008083118290614485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161447c9190615902565b60405180910390fd5b50600083858161449157fe5b049050809150509392505050565b6144be8273ffffffffffffffffffffffffffffffffffffffff166147f7565b6144fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144f490615ba4565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff168360405161452691906157a3565b6000604051808303816000865af19150503d8060008114614563576040519150601f19603f3d011682016040523d82523d6000602084013e614568565b606091505b5091509150816145ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145a4906159e4565b60405180910390fd5b60008151111561460b57808060200190516145cb9190810190614c04565b61460a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161460190615b44565b60405180910390fd5b5b50505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b8152600401614670929190615835565b602060405180830381600087803b15801561468a57600080fd5b505af115801561469e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506146c29190810190614d0e565b11614702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016146f990615a24565b60405180910390fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b81526004016147629190615c0d565b602060405180830381600087803b15801561477c57600080fd5b505af1158015614790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506147b49190810190614d0e565b146147f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016147eb90615944565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156148395750808214155b92505050919050565b6040518060400160405280600015158152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b60405180608001604052806000151581526020016000808111156148ae57fe5b81526020016000808111156148bf57fe5b8152602001600081525090565b604051806101000160405280600060018111156148e557fe5b8152602001600081526020016148f96149a4565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561495157fe5b8152602001600081526020016149656149a4565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b60405180608001604052806000151581526020016000808111156149c457fe5b81526020016000808111156149d557fe5b8152602001600081525090565b6000813590506149f181615edd565b92915050565b600081519050614a0681615edd565b92915050565b600081519050614a1b81615ef4565b92915050565b600082601f830112614a3257600080fd5b8151614a45614a4082615c70565b615c43565b91508082526020830160208301858383011115614a6157600080fd5b614a6c838284615e65565b50505092915050565b600060408284031215614a8757600080fd5b614a916040615c43565b90506000614aa184828501614a0c565b6000830152506020614ab584828501614ad6565b60208301525092915050565b600081359050614ad081615f0b565b92915050565b600081519050614ae581615f0b565b92915050565b600060208284031215614afd57600080fd5b6000614b0b848285016149e2565b91505092915050565b600060208284031215614b2657600080fd5b6000614b34848285016149f7565b91505092915050565b60008060408385031215614b5057600080fd5b6000614b5e858286016149e2565b9250506020614b6f858286016149e2565b9150509250929050565b600080600060608486031215614b8e57600080fd5b6000614b9c868287016149e2565b9350506020614bad868287016149e2565b9250506040614bbe86828701614ac1565b9150509250925092565b60008060408385031215614bdb57600080fd5b6000614be9858286016149e2565b9250506020614bfa85828601614ac1565b9150509250929050565b600060208284031215614c1657600080fd5b6000614c2484828501614a0c565b91505092915050565b600080600080600060a08688031215614c4557600080fd5b600086015167ffffffffffffffff811115614c5f57600080fd5b614c6b88828901614a21565b9550506020614c7c88828901614ad6565b9450506040614c8d88828901614ad6565b9350506060614c9e88828901614ad6565b9250506080614caf88828901614ad6565b9150509295509295909350565b600060408284031215614cce57600080fd5b6000614cdc84828501614a75565b91505092915050565b600060208284031215614cf757600080fd5b6000614d0584828501614ac1565b91505092915050565b600060208284031215614d2057600080fd5b6000614d2e84828501614ad6565b91505092915050565b6000614d438383615610565b905092915050565b6000614d578383615718565b60408301905092915050565b614d6c81615d5c565b82525050565b614d7b81615d5c565b82525050565b6000614d8c82615cbc565b614d968185615d0d565b935083602082028501614da885615c9c565b8060005b85811015614de45784840389528151614dc58582614d37565b9450614dd083615cf3565b925060208a01995050600181019050614dac565b50829750879550505050505092915050565b6000614e0182615cc7565b614e0b8185615d1e565b9350614e1683615cac565b8060005b83811015614e47578151614e2e8882614d4b565b9750614e3983615d00565b925050600181019050614e1a565b5085935050505092915050565b614e5d81615d6e565b82525050565b614e6c81615d6e565b82525050565b6000614e7d82615cdd565b614e878185615d40565b9350614e97818560208601615e65565b80840191505092915050565b6000614eae82615cd2565b614eb88185615d2f565b9350614ec8818560208601615e65565b614ed181615e98565b840191505092915050565b614ee581615e0b565b82525050565b614ef481615e1d565b82525050565b614f0381615e2f565b82525050565b614f1281615e41565b82525050565b614f2181615e53565b82525050565b6000614f3282615ce8565b614f3c8185615d4b565b9350614f4c818560208601615e65565b614f5581615e98565b840191505092915050565b6000614f6d602383615d4b565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fd3601983615d4b565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000615013602683615d4b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615079602283615d4b565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150df601783615d4b565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b600061511f601b83615d4b565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061515f602083615d4b565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600061519f602183615d4b565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615205601883615d4b565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000615245602083615d4b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000615285601483615d4b565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b60006152c5601f83615d4b565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b6000615305602583615d4b565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061536b601283615d4b565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b60006153ab602483615d4b565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615411601e83615d4b565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b6000615451601683615d4b565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615491602a83615d4b565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006154f7601f83615d4b565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000615537603683615d4b565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600061559d601f83615d4b565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b60006155dd601f83615d4b565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6000610160830160008301516156296000860182614edc565b50602083015161563c6020860182615776565b50604083015161564f60408601826156c3565b50606083015161566260c0860182615776565b50608083015161567560e0860182615776565b5060a0830151615689610100860182614d63565b5060c083015161569d610120860182615776565b5060e08301518482036101408601526156b68282614ea3565b9150508091505092915050565b6080820160008201516156d96000850182614e54565b5060208201516156ec6020850182614eeb565b5060408201516156ff6040850182614efa565b5060608201516157126060850182615776565b50505050565b60408201600082015161572e6000850182614d63565b5060208201516157416020850182615776565b50505050565b60408201600082015161575d6000850182614d63565b5060208201516157706020850182615776565b50505050565b61577f81615df4565b82525050565b61578e81615df4565b82525050565b61579d81615dfe565b82525050565b60006157af8284614e72565b915081905092915050565b60006020820190506157cf6000830184614d72565b92915050565b60006040820190506157ea6000830185614d72565b6157f76020830184614d72565b9392505050565b60006060820190506158136000830186614d72565b6158206020830185614d72565b61582d6040830184615785565b949350505050565b600060408201905061584a6000830185614d72565b6158576020830184615785565b9392505050565b60006060820190506158736000830186614d72565b6158806020830185615785565b61588d6040830184614f18565b949350505050565b600060408201905081810360008301526158af8185614df6565b905081810360208301526158c38184614d81565b90509392505050565b60006020820190506158e16000830184614e63565b92915050565b60006020820190506158fc6000830184614f09565b92915050565b6000602082019050818103600083015261591c8184614f27565b905092915050565b6000602082019050818103600083015261593d81614f60565b9050919050565b6000602082019050818103600083015261595d81614fc6565b9050919050565b6000602082019050818103600083015261597d81615006565b9050919050565b6000602082019050818103600083015261599d8161506c565b9050919050565b600060208201905081810360008301526159bd816150d2565b9050919050565b600060208201905081810360008301526159dd81615112565b9050919050565b600060208201905081810360008301526159fd81615152565b9050919050565b60006020820190508181036000830152615a1d81615192565b9050919050565b60006020820190508181036000830152615a3d816151f8565b9050919050565b60006020820190508181036000830152615a5d81615238565b9050919050565b60006020820190508181036000830152615a7d81615278565b9050919050565b60006020820190508181036000830152615a9d816152b8565b9050919050565b60006020820190508181036000830152615abd816152f8565b9050919050565b60006020820190508181036000830152615add8161535e565b9050919050565b60006020820190508181036000830152615afd8161539e565b9050919050565b60006020820190508181036000830152615b1d81615404565b9050919050565b60006020820190508181036000830152615b3d81615444565b9050919050565b60006020820190508181036000830152615b5d81615484565b9050919050565b60006020820190508181036000830152615b7d816154ea565b9050919050565b60006020820190508181036000830152615b9d8161552a565b9050919050565b60006020820190508181036000830152615bbd81615590565b9050919050565b60006020820190508181036000830152615bdd816155d0565b9050919050565b6000606082019050615bf96000830185615747565b615c066040830184615785565b9392505050565b6000602082019050615c226000830184615785565b92915050565b6000602082019050615c3d6000830184615794565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615c6657600080fd5b8060405250919050565b600067ffffffffffffffff821115615c8757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615d6782615dd4565b9050919050565b60008115159050919050565b6000819050615d8882615ea9565b919050565b6000819050615d9b82615eb6565b919050565b6000819050615dae82615ec3565b919050565b6000819050615dc182615ed0565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615e1682615d7a565b9050919050565b6000615e2882615d8d565b9050919050565b6000615e3a82615da0565b9050919050565b6000615e4c82615db3565b9050919050565b6000615e5e82615dc6565b9050919050565b60005b83811015615e83578082015181840152602081019050615e68565b83811115615e92576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615eb357fe5b50565b60018110615ec057fe5b50565b60018110615ecd57fe5b50565b60058110615eda57fe5b50565b615ee681615d5c565b8114615ef157600080fd5b50565b615efd81615d6e565b8114615f0857600080fd5b50565b615f1481615df4565b8114615f1f57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a72315820b6508198f9eabcbf8d9af0d4e89afd58a5c6c78518dc84e4817ddea41fc964f06c6578706572696d656e74616cf564736f6c634300050c0040

Verified Source Code Partial Match

Compiler: v0.5.12+commit.7709ece9 EVM: petersburg Optimization: No
yBUSD.sol 726 lines
pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    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;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
}

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

contract yBUSD is ERC20, ERC20Detailed, ReentrancyGuard, Structs, Ownable {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  uint256 public pool;
  address public token;
  address public compound;
  address public fulcrum;
  address public aave;
  address public aavePool;
  address public aaveToken;
  address public dydx;
  uint256 public dToken;
  address public apr;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("iearn BUSD", "yBUSD", 18) {
    token = address(0x4Fabb145d64652a948d72533023f6E7A623C7C53);
    apr = address(0xdD6d648C991f7d47454354f4Ef326b04025a48A8);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    aavePool = address(0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3);
    fulcrum = address(0xF013406A0B1d544238083DF0B93ad0d2cBE0f65f);
    aaveToken = address(0x71fc860F7D3A592A4a98740e39dB31d25db65ae8);
    compound = address(0x39AA39c021dfbaE8faC545936693aC917d5E7563);
    dToken = 3;
    approveToken();
  }

  function set_new_APR(address _new_APR) public onlyOwner {
      apr = _new_APR;
  }
  function set_new_FULCRUM(address _new_FULCRUM) public onlyOwner {
      fulcrum = _new_FULCRUM;
  }
  function set_new_COMPOUND(address _new_COMPOUND) public onlyOwner {
      compound = _new_COMPOUND;
  }
  function set_new_DTOKEN(uint256 _new_DTOKEN) public onlyOwner {
      dToken = _new_DTOKEN;
  }
  function set_new_AAVE(address _new_AAVE) public onlyOwner {
      aave = _new_AAVE;
  }
  function set_new_ATOKEN(address _new_ATOKEN) public onlyOwner {
      aaveToken = _new_ATOKEN;
  }

  // Quick swap low gas method for pool swaps
  function deposit(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  // No rebalance implementation for lower fees and faster swaps
  function withdraw(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        _withdrawSome(r.sub(b));
      }

      IERC20(token).safeTransfer(msg.sender, r);
      pool = calcPoolValueInToken();
  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,uint256 iapr,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    if (iapr > max) {
      max = iapr;
    }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    } else if (max == iapr) {
      newProvider = Lender.FULCRUM;
    } else if (max == aapr) {
      newProvider = Lender.AAVE;
    } else if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    return newProvider;
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).safeApprove(compound, uint(0));
      IERC20(token).safeApprove(compound, uint(-1));
      IERC20(token).safeApprove(dydx, uint(0));
      IERC20(token).safeApprove(dydx, uint(-1));
      IERC20(token).safeApprove(getAaveCore(), uint(0));
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(0));
      IERC20(token).safeApprove(fulcrum, uint(-1));
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }
  function balanceDydxAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(dydx);
  }
  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function balanceFulcrumAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(fulcrum);
  }
  function balanceFulcrumInToken() public view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function balanceFulcrum() public view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function balanceAaveAvailable() public view returns (uint256) {
      return IERC20(token).balanceOf(aavePool);
  }
  function balanceAave() public view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      _withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        _supplyDydx(balance());
      } else if (newProvider == Lender.FULCRUM) {
        _supplyFulcrum(balance());
      } else if (newProvider == Lender.COMPOUND) {
        _supplyCompound(balance());
      } else if (newProvider == Lender.AAVE) {
        _supplyAave(balance());
      }
    }

    provider = newProvider;
  }

  function _withdrawAll() internal {
    uint256 amount = balanceCompound();
    if (amount > 0) {
      _withdrawSomeCompound(balanceCompoundInToken().sub(1));
    }
    amount = balanceDydx();
    if (amount > 0) {
      _withdrawDydx(balanceDydxAvailable());
    }
    amount = balanceFulcrum();
    if (amount > 0) {
      _withdrawSomeFulcrum(balanceFulcrumAvailable().sub(1));
    }
    amount = balanceAave();
    if (amount > 0) {
      _withdrawAave(balanceAaveAvailable());
    }
  }

  function _withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawCompound(amount);
  }

  function _withdrawSomeFulcrum(uint256 _amount) internal {
    uint256 b = balanceFulcrum();
    uint256 bT = balanceFulcrumInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawFulcrum(amount);
  }

  function _withdrawSome(uint256 _amount) internal {
    if (provider == Lender.COMPOUND) {
      _withdrawSomeCompound(_amount);
    }
    if (provider == Lender.AAVE) {
      require(balanceAave() >= _amount, "insufficient funds");
      _withdrawAave(_amount);
    }
    if (provider == Lender.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      _withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      _withdrawSomeFulcrum(_amount);
    }
  }

  function _supplyDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function _supplyAave(uint amount) internal {
      Aave(getAave()).deposit(token, amount, 0);
  }
  function _supplyFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function _supplyCompound(uint amount) internal {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function _withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function _withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function _withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  function _withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function calcPoolValueInToken() public view returns (uint) {
    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }

  function withdrawSomeCompound(uint256 _amount) public onlyOwner {
    _withdrawSomeCompound(_amount);
  }
  function withdrawSomeFulcrum(uint256 _amount) public onlyOwner {
    _withdrawSomeFulcrum(_amount);
  }
  function withdrawAave(uint amount) public onlyOwner {
      _withdrawAave(amount);
  }
  function withdrawDydx(uint256 amount) public onlyOwner {
      _withdrawDydx(amount);
  }

  function supplyDydx(uint256 amount) public onlyOwner {
      _supplyDydx(amount);
  }
  function supplyAave(uint amount) public onlyOwner {
    _supplyAave(amount);
  }
  function supplyFulcrum(uint amount) public onlyOwner {
      _supplyFulcrum(amount);
  }
  function supplyCompound(uint amount) public onlyOwner {
      _supplyCompound(amount);
  }
}

Read Contract

aave 0x819faf7b → address
aavePool 0xa03e4bc3 → address
aaveToken 0x06a3fe59 → address
allowance 0xdd62ed3e → uint256
apr 0x57ded9c9 → address
balance 0xb69ef8a8 → uint256
balanceAave 0xcf8ca426 → uint256
balanceAaveAvailable 0xb098fc80 → uint256
balanceCompound 0x61c1ec55 → uint256
balanceCompoundInToken 0xa7287971 → uint256
balanceDydx 0x39c0a7e1 → uint256
balanceDydxAvailable 0xd54e3244 → uint256
balanceFulcrum 0x0eb2a267 → uint256
balanceFulcrumAvailable 0x8f9225ca → uint256
balanceFulcrumInToken 0xf5a41dea → uint256
balanceOf 0x70a08231 → uint256
calcPoolValueInToken 0x7137ef99 → uint256
compound 0xf69e2046 → address
dToken 0xd9d7858a → uint256
decimals 0x313ce567 → uint8
dydx 0x8e4ec6ef → address
fulcrum 0x58782c21 → address
getAave 0xf7c1ec77 → address
getAaveCore 0xf82ce27d → address
getPricePerFullShare 0x77c7b8fc → uint256
isOwner 0x8f32d59b → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
pool 0x16f0115b → uint256
provider 0x085d4883 → uint8
recommend 0xa160176d → uint8
symbol 0x95d89b41 → string
token 0xfc0c546a → address
totalSupply 0x18160ddd → uint256

Write Contract 25 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
approveToken 0x99b71d5c
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
deposit 0xb6b55f25
uint256 _amount
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
rebalance 0x7d7c2a1c
No parameters
renounceOwnership 0x715018a6
No parameters
set_new_AAVE 0x812adb06
address _new_AAVE
set_new_APR 0x46357473
address _new_APR
set_new_ATOKEN 0xa9de245b
address _new_ATOKEN
set_new_COMPOUND 0xf5ff1916
address _new_COMPOUND
set_new_DTOKEN 0x9ff011b9
uint256 _new_DTOKEN
set_new_FULCRUM 0xbbf31644
address _new_FULCRUM
supplyAave 0x65aab749
uint256 amount
supplyCompound 0xe849d659
uint256 amount
supplyDydx 0x06636c1c
uint256 amount
supplyFulcrum 0x8124955c
uint256 amount
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
withdraw 0x2e1a7d4d
uint256 _shares
withdrawAave 0x56cc9378
uint256 amount
withdrawDydx 0x41c57c8d
uint256 amount
withdrawSomeCompound 0xb30d0bb2
uint256 _amount
withdrawSomeFulcrum 0x67e4b740
uint256 _amount

Recent Transactions

No transactions found for this address