Address Contract Partially Verified
Address
0xA7b2081fdAd2595A67D478eeDAcB71951fd8038e
Balance
0 ETH
Nonce
1
Code Size
18643 bytes
Creator
0xcD130630...183e at tx 0xc0be5a66...be777b
Indexed Transactions
0
Contract Bytecode
18643 bytes
0x608060405234801561000f575f80fd5b5060043610610416575f3560e01c80638a623d8611610221578063bcfd8dbf1161012a578063d65d1604116100b4578063f06fc10311610084578063f06fc1031461091b578063f2fde38b1461092e578063f648141614610941578063f77a3fb914610954578063fa2c24d214610967575f80fd5b8063d65d1604146108c3578063e177246e146108d6578063ef40a670146108e9578063f063b503146108fc575f80fd5b8063cc2153d1116100fa578063cc2153d11461085e578063cd636b1f14610871578063d00d13ef14610884578063d1f794b8146108a8578063d55bfdcd146108b0575f80fd5b8063bcfd8dbf1461081d578063be9a655514610830578063bedb86fb14610838578063c28b354c1461084b575f80fd5b8063a66f42c0116101ab578063adc9772e1161017b578063adc9772e146107df578063b2bdfa7b146107f2578063b445eb7014610805578063b8f7a6651461080d578063b95c574614610815575f80fd5b8063a66f42c01461079e578063a694fc3a146107a6578063aa240d6f146107b9578063ac1e5025146107cc575f80fd5b806395d89b41116101f157806395d89b411461073e57806398807d84146107465780639ea725d9146107655780639feb8f5014610778578063a4d501141461078b575f80fd5b80638a623d86146107155780638bc7e8c41461071d5780638da5cb5b1461072557806393e6cda614610736575f80fd5b80634f25a95c1161032357806370a08231116102ad578063791936101161027d578063791936101461064b57806379ee54f71461068a5780637a4b2830146106cc5780637c8c7775146106fa57806385523a1b1461070d575f80fd5b806370a0823114610611578063715018a61461062457806371b5ef461461062c57806372c0c21114610643575f80fd5b80635c975abb116102f35780635c975abb146105ce57806367a52793146105db5780636a42b8f8146105e35780636b1af75e146105eb5780636f1e8533146105fe575f80fd5b80634f25a95c14610582578063522b9e52146105955780635646696e146105a857806359508b84146105bb575f80fd5b80632e1a7d4d116103a4578063384002a211610374578063384002a21461052e5780633b066d34146105415780633b857a2814610554578063490ae210146105675780634db841431461057a575f80fd5b80632e1a7d4d146104e357806330c1f39d146104f6578063313ce567146104fe57806336662c3c1461051b575f80fd5b806318160ddd116103ea57806318160ddd1461048c5780631f6866be146104a257806329f4ce8d146104aa5780632bcf161c146104bd5780632d162159146104d0575f80fd5b8062be3bd31461041a57806306fdde031461043757806309fa3efc1461044c5780631336ffeb14610477575b5f80fd5b61042261097a565b60405190151581526020015b60405180910390f35b61043f6109e8565b60405161042e919061419b565b60035461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161042e565b61048a6104853660046141c4565b610a78565b005b610494610da2565b60405190815260200161042e565b61048a610e0d565b61045f6104b8366004614202565b610e27565b6104946104cb366004614219565b610e98565b61048a6104de366004614219565b610f05565b6104946104f1366004614202565b610f65565b610422611194565b600654610100900460ff1660405160ff909116815260200161042e565b610494610529366004614219565b6111db565b60015461045f906001600160a01b031681565b61049461054f366004614219565b6112ec565b61048a610562366004614202565b61131e565b61048a610575366004614202565b61143e565b610422611532565b610494610590366004614234565b611579565b6104226105a3366004614219565b61161b565b61048a6105b6366004614278565b611688565b61048a6105c9366004614278565b61177d565b6006546104229060ff1681565b610494611872565b6104946118b9565b61048a6105f93660046141c4565b611900565b61042261060c366004614219565b611953565b61049461061f366004614219565b611985565b61048a6119b7565b610634611ac3565b60405161042e9392919061432e565b61048a611d0a565b61065e610659366004614219565b611d8c565b60408051958652602086019490945292840191909152151560608301521515608082015260a00161042e565b61069d610698366004614219565b611e13565b6040805196151587529415156020870152938501929092526060840152608083015260a082015260c00161042e565b6106df6106da366004614370565b611e9f565b6040805193845260208401929092529082015260600161042e565b61048a61070836600461439a565b611f21565b61045f61201c565b61048a612091565b61049461216b565b6002546001600160a01b031661045f565b61045f6121b2565b61043f6121f6565b610494610754366004614219565b60076020525f908152604090205481565b61048a6107733660046143d9565b612205565b61048a610786366004614370565b612357565b61048a610799366004614278565b612428565b61049461251d565b6104946107b4366004614202565b612564565b6104946107c7366004614219565b612709565b61048a6107da366004614202565b61273b565b6104946107ed366004614370565b61282f565b60025461045f906001600160a01b031681565b61048a6129f0565b610422612bd1565b610494612c18565b61049461082b366004614219565b612c5f565b61048a612c91565b61048a610846366004614278565b612d19565b61048a610859366004614202565b612e9a565b61049461086c366004614219565b612ecc565b6106df61087f366004614234565b612f0f565b610897610892366004614219565b612f4f565b60405161042e959493929190614405565b6104226132d1565b61048a6108be366004614370565b613318565b61048a6108d1366004614278565b613479565b61048a6108e4366004614202565b61356e565b6104946108f7366004614219565b613662565b61049461090a366004614219565b60086020525f908152604090205481565b61048a6109293660046144c0565b613738565b61048a61093c366004614219565b613820565b61089761094f3660046144c0565b6139aa565b61048a610962366004614370565b613d38565b610494610975366004614219565b613ea0565b6003546040805162be3bd360e01b815290515f926001600160a01b03169162be3bd39160048083019260209291908290030181865afa1580156109bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e391906144f2565b905090565b6060600480546109f79061450d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a239061450d565b8015610a6e5780601f10610a4557610100808354040283529160200191610a6e565b820191905f5260205f20905b815481529060010190602001808311610a5157829003601f168201915b5050505050905090565b610a8061201c565b6001600160a01b0316639a78458a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610abb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adf9190614545565b6001600160a01b0316306001600160a01b031614610b4d57610aff6121b2565b6001600160a01b031663b0bae7716040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610b36575f80fd5b505af1158015610b48573d5f803e3d5ffd5b505050505b6002546001600160a01b031615610b91576002546001600160a01b03163314610b915760405162461bcd60e51b8152600401610b8890614560565b60405180910390fd5b6002546001600160a01b0316610c1957610ba961201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015610bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1191906144f2565b610c19575f80fd5b6001546001600160a01b0390811690831603610c775760405162461bcd60e51b815260206004820152601760248201527f43616e27742072656d6f7665204d61696e20546f6b656e0000000000000000006044820152606401610b88565b610c7f6121b2565b6040516309ab9c0760e31b81526001600160a01b0384811660048301529190911690634d5ce03890602401602060405180830381865afa158015610cc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce991906144f2565b15610d2e5760405162461bcd60e51b815260206004820152601560248201527443616e6e6f742072656d6f7665207265776172647360581b6044820152606401610b88565b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb90610d5c908690859060040161457f565b6020604051808303815f875af1158015610d78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c91906144f2565b50505050565b600354604080516318160ddd60e01b815290515f926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e39190614598565b610e1633613662565b335f90815260086020526040902055565b6003546040516329f4ce8d60e01b8152600481018390525f916001600160a01b0316906329f4ce8d90602401602060405180830381865afa158015610e6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e929190614545565b92915050565b600354604051630af3c58760e21b81526001600160a01b0383811660048301525f921690632bcf161c906024015b602060405180830381865afa158015610ee1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e929190614598565b6003546001600160a01b031615610f435760405162461bcd60e51b8152602060048201526002602482015261060f60f31b6044820152606401610b88565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60025f5403610f875760405162461bcd60e51b8152600401610b88906145af565b60025f5560065460ff1615610fae5760405162461bcd60e51b8152600401610b88906145e6565b610fb661201c565b6001600160a01b0316639a78458a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110159190614545565b6001600160a01b0316306001600160a01b031614611083576110356121b2565b6001600160a01b031663b0bae7716040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561106c575f80fd5b505af115801561107e573d5f803e3d5ffd5b505050505b61108b612bd1565b6110a75760405162461bcd60e51b8152600401610b8890614606565b60035460405163f3fef3a360e01b81526001600160a01b039091169063f3fef3a3906110d9903390869060040161457f565b6020604051808303815f875af11580156110f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111199190614598565b90507f4f14ea4e43cc569e4fb4d8fa171366f2f6925bfade37c5cc93334e373a4c9847338360405161114c92919061457f565b60405180910390a1604051818152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a360015f55919050565b600354604080516330c1f39d60e01b815290515f926001600160a01b0316916330c1f39d9160048083019260209291908290030181865afa1580156109bf573d5f803e3d5ffd5b5f60025f54036111fd5760405162461bcd60e51b8152600401610b88906145af565b60025f5560065460ff16156112245760405162461bcd60e51b8152600401610b88906145e6565b60035460405163a006c32960e01b81523360048201526001600160a01b0384811660248301529091169063a006c329906044016020604051808303815f875af1158015611273573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112979190614598565b604080513381526001600160a01b03851660208201529081018290529091507fc3643628e7aacc422cc2da58691273d6e9fc5b7d306dc4886edd1b5e4892788b9060600160405180910390a160015f55919050565b600354604051630ec19b4d60e21b81526001600160a01b0383811660048301525f921690633b066d3490602401610ec6565b6002546001600160a01b031615611359576002546001600160a01b031633146113595760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166113e15761137161201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906144f2565b6113e1575f80fd5b600354604051630770af4560e31b8152600481018390526001600160a01b0390911690633b857a28906024015b5f604051808303815f87803b158015611425575f80fd5b505af1158015611437573d5f803e3d5ffd5b5050505050565b6002546001600160a01b031615611479576002546001600160a01b031633146114795760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166115015761149161201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156114d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f991906144f2565b611501575f80fd5b600354604051630490ae2160e41b8152600481018390526001600160a01b039091169063490ae2109060240161140e565b60035460408051634db8414360e01b815290515f926001600160a01b031691634db841439160048083019260209291908290030181865afa1580156109bf573d5f803e3d5ffd5b5f6001600160a01b0383166115a05760405162461bcd60e51b8152600401610b8890614628565b6003546040516313c96a5760e21b81526001600160a01b038581166004830152848116602483015290911690634f25a95c90604401602060405180830381865afa1580156115f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116149190614598565b9392505050565b600354604051632915cf2960e11b81526001600160a01b0383811660048301525f92169063522b9e52906024015b602060405180830381865afa158015611664573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9291906144f2565b6002546001600160a01b0316156116c3576002546001600160a01b031633146116c35760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b031661174b576116db61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061174391906144f2565b61174b575f80fd5b600354604051632b2334b760e11b815282151560048201526001600160a01b0390911690635646696e9060240161140e565b6002546001600160a01b0316156117b8576002546001600160a01b031633146117b85760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b0316611840576117d061201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015611814573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183891906144f2565b611840575f80fd5b60035460405163165422e160e21b815282151560048201526001600160a01b03909116906359508b849060240161140e565b600354604080516367a5279360e01b815290515f926001600160a01b0316916367a527939160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b60035460408051630d48571f60e31b815290515f926001600160a01b031691636a42b8f89160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b6003546001600160a01b031633146119435760405162461bcd60e51b8152602060048201526006602482015265139bdd0814d360d21b6044820152606401610b88565b61194e838383613ed2565b505050565b600354604051630ef037b960e41b81526001600160a01b0383811660048301525f92169063ef037b9090602401611649565b6003546040516370a0823160e01b81526001600160a01b0383811660048301525f9216906370a0823190602401610ec6565b6002546001600160a01b0316156119f2576002546001600160a01b031633146119f25760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b0316611a7a57611a0a61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015611a4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7291906144f2565b611a7a575f80fd5b6002546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b60608060605f611ad1612c18565b90505f816001600160401b03811115611aec57611aec61466a565b604051908082528060200260200182016040528015611b15578160200160208202803683370190505b509450816001600160401b03811115611b3057611b3061466a565b604051908082528060200260200182016040528015611b6357816020015b6060815260200190600190039081611b4e5790505b509350816001600160401b03811115611b7e57611b7e61466a565b604051908082528060200260200182016040528015611bb157816020015b6060815260200190600190039081611b9c5790505b5092505f5b82811015611d0257611bc781610e27565b915081868281518110611bdc57611bdc61467e565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015611c37573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c5e9190810190614692565b858281518110611c7057611c7061467e565b6020026020010181905250816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015611cb6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cdd9190810190614692565b848281518110611cef57611cef61467e565b6020908102919091010152600101611bb6565b505050909192565b60025f5403611d2b5760405162461bcd60e51b8152600401610b88906145af565b60025f908155600354604080516372c0c21160e01b815290516001600160a01b03909216926372c0c2119260048084019382900301818387803b158015611d70575f80fd5b505af1158015611d82573d5f803e3d5ffd5b505060015f555050565b6003546040516348b4573960e11b81526001600160a01b0383811660048301525f928392839283928392911690639168ae729060240160a060405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e01919061472e565b939a9299509097509550909350915050565b600354604051630700037d60e01b81526001600160a01b0383811660048301525f928392839283928392839290911690630700037d9060240160c060405180830381865afa158015611e67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8b9190614781565b949c939b5091995097509550909350915050565b600354604051637c5a991160e11b81525f91829182916001600160a01b03169063f8b5322290611ed5908890889060040161457f565b606060405180830381865afa158015611ef0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1491906147db565b9250925092509250925092565b60025f5403611f425760405162461bcd60e51b8152600401610b88906145af565b60025f5560065460ff1615611f695760405162461bcd60e51b8152600401610b88906145e6565b6003546001600160a01b03163314611fa85760405162461bcd60e51b815260206004820152600260248201526114d360f21b6044820152606401610b88565b80611fd5576001600160a01b0383165f90815260076020526040902054611fd090839061481a565b611ff8565b6001600160a01b0383165f90815260076020526040902054611ff890839061482d565b6001600160a01b039093165f90815260076020526040812093909355505060019055565b5f73cced1a96321b2b2a06e8f3f4b0b883ddd059968c6001600160a01b03166385523a1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561206d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e39190614545565b60025f54036120b25760405162461bcd60e51b8152600401610b88906145af565b60025f5560065460ff16156120d95760405162461bcd60e51b8152600401610b88906145e6565b60035460405163dfed3be360e01b81523360048201526001600160a01b039091169063dfed3be3906024015f604051808303815f87803b15801561211b575f80fd5b505af115801561212d573d5f803e3d5ffd5b50506040513381527fcbc8531f30b5587d02c74c69691859d7466bc514ed6c53473f5c9a852a1149609250602001905060405180910390a160015f55565b60035460408051631d283f4f60e31b815290515f926001600160a01b03169163e941fa789160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b5f6121bb61201c565b6001600160a01b03166393e6cda66040518163ffffffff1660e01b8152600401602060405180830381865afa15801561206d573d5f803e3d5ffd5b6060600580546109f79061450d565b60025f54036122265760405162461bcd60e51b8152600401610b88906145af565b60025f819055546001600160a01b031615612265576002546001600160a01b031633146122655760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166122ed5761227d61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156122c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e591906144f2565b6122ed575f80fd5b600354604051639ea725d960e01b81526001600160a01b038481166004830152831515602483015290911690639ea725d9906044015f604051808303815f87803b158015612339575f80fd5b505af115801561234b573d5f803e3d5ffd5b505060015f5550505050565b60025f54036123785760405162461bcd60e51b8152600401610b88906145af565b60025f5561238882333084613f28565b6003546040516309feb8f560e41b81526001600160a01b0390911690639feb8f50906123ba908590859060040161457f565b5f604051808303815f87803b1580156123d1575f80fd5b505af11580156123e3573d5f803e3d5ffd5b505050507fb894c34e05f879592877ccb0d16cfff612ee7dfa607b93cb7c2c7e7b78d6763f828260405161241892919061457f565b60405180910390a1505060015f55565b6002546001600160a01b031615612463576002546001600160a01b031633146124635760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166124eb5761247b61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156124bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e391906144f2565b6124eb575f80fd5b600354604051632935404560e21b815282151560048201526001600160a01b039091169063a4d501149060240161140e565b60035460408051630299bd0b60e61b815290515f926001600160a01b03169163a66f42c09160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b5f60025f54036125865760405162461bcd60e51b8152600401610b88906145af565b60025f55612592612bd1565b6125ae5760405162461bcd60e51b8152600401610b8890614606565b6001546003546125cd916001600160a01b039081169133911685613f28565b6003546040516356e4bb9760e11b81525f9182916001600160a01b039091169063adc9772e90612603903390889060040161457f565b60408051808303815f875af115801561261e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126429190614840565b335f9081526007602052604081208054939550919350839261266590849061482d565b9091555050335f908152600860205260408120805483929061268890849061482d565b90915550506040517f4031c63bb53dc5dfada7ef8d75bef8c44d0283658c1585fc74107ed5b75e97c8906126bf903390879061457f565b60405180910390a1604051828152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060015f5592915050565b60035460405163aa240d6f60e01b81526001600160a01b0383811660048301525f92169063aa240d6f90602401610ec6565b6002546001600160a01b031615612776576002546001600160a01b031633146127765760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166127fe5761278e61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156127d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f691906144f2565b6127fe575f80fd5b60035460405163ac1e502560e01b8152600481018390526001600160a01b039091169063ac1e50259060240161140e565b5f60025f54036128515760405162461bcd60e51b8152600401610b88906145af565b60025f5561285d612bd1565b6128795760405162461bcd60e51b8152600401610b8890614606565b600154600354612898916001600160a01b039081169133911685613f28565b6003546040516356e4bb9760e11b81525f9182916001600160a01b039091169063adc9772e906128ce908890889060040161457f565b60408051808303815f875af11580156128e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290d9190614840565b6001600160a01b0387165f9081526007602052604081208054939550919350839261293990849061482d565b90915550506001600160a01b0385165f908152600860205260408120805483929061296590849061482d565b90915550506040517f4031c63bb53dc5dfada7ef8d75bef8c44d0283658c1585fc74107ed5b75e97c89061299c908790879061457f565b60405180910390a160405182815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35060015f559392505050565b6002546001600160a01b031615612a2b576002546001600160a01b03163314612a2b5760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b0316612ab357612a4361201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015612a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aab91906144f2565b612ab3575f80fd5b612abb6121b2565b60015460405163f968d96f60e01b81526001600160a01b03918216600482015291169063f968d96f90602401602060405180830381865afa158015612b02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2691906144f2565b612b5e5760405162461bcd60e51b81526020600482015260096024820152684e6f7420726561647960b81b6044820152606401610b88565b612b666121b2565b600154604051637b42db0f60e01b81526001600160a01b039182166004820152911690637b42db0f90602401602060405180830381865afa158015612bad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190614545565b6003546040805163255ea96360e21b815290515f926001600160a01b03169163957aa58c9160048083019260209291908290030181865afa1580156109bf573d5f803e3d5ffd5b60035460408051635cae2ba360e11b815290515f926001600160a01b03169163b95c57469160048083019260209291908290030181865afa158015610de9573d5f803e3d5ffd5b60035460405163bcfd8dbf60e01b81526001600160a01b0383811660048301525f92169063bcfd8dbf90602401610ec6565b6002546001600160a01b03163314612cbb5760405162461bcd60e51b8152600401610b8890614560565b60035f9054906101000a90046001600160a01b03166001600160a01b031663be9a65556040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612d07575f80fd5b505af1158015610d9c573d5f803e3d5ffd5b6002546001600160a01b031615612d54576002546001600160a01b03163314612d545760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b0316612ddc57612d6c61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015612db0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dd491906144f2565b612ddc575f80fd5b612de46121b2565b60015460405163f968d96f60e01b81526001600160a01b03918216600482015291169063f968d96f90602401602060405180830381865afa158015612e2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e4f91906144f2565b612e875760405162461bcd60e51b81526020600482015260096024820152684e6f7420726561647960b81b6044820152606401610b88565b6006805460ff1916911515919091179055565b60035460405163e72e326b60e01b81526001600160a01b039091169063e72e326b9061140e903390859060040161457f565b6001600160a01b0381165f9081526008602052604081205481612eee84613662565b9050818111612efd575f612f07565b612f07828261481a565b949350505050565b6003546040516354c01ab560e11b81526001600160a01b03848116600483015283811660248301525f92839283929091169063a980356a90604401611ed5565b60608060608060605f612f60612c18565b90505f816001600160401b03811115612f7b57612f7b61466a565b604051908082528060200260200182016040528015612fa4578160200160208202803683370190505b509550816001600160401b03811115612fbf57612fbf61466a565b604051908082528060200260200182016040528015612fe8578160200160208202803683370190505b509650816001600160401b038111156130035761300361466a565b60405190808252806020026020018201604052801561303657816020015b60608152602001906001900390816130215790505b509450816001600160401b038111156130515761305161466a565b60405190808252806020026020018201604052801561308457816020015b606081526020019060019003908161306f5790505b509350816001600160401b0381111561309f5761309f61466a565b6040519080825280602002602001820160405280156130c8578160200160208202803683370190505b5092505f5b828110156132c5576130de81610e27565b9150818782815181106130f3576130f361467e565b60200260200101906001600160a01b031690816001600160a01b03168152505061311d8983611579565b88828151811061312f5761312f61467e565b602002602001018181525050816001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015613176573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261319d9190810190614692565b8682815181106131af576131af61467e565b6020026020010181905250816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156131f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261321c9190810190614692565b85828151811061322e5761322e61467e565b6020026020010181905250816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613275573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132999190614862565b8482815181106132ab576132ab61467e565b60ff909216602092830291909101909101526001016130cd565b50505091939590929450565b60035460408051631a3ef29760e31b815290515f926001600160a01b03169163d1f794b89160048083019260209291908290030181865afa1580156109bf573d5f803e3d5ffd5b6002546001600160a01b031615613353576002546001600160a01b031633146133535760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166133db5761336b61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156133af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d391906144f2565b6133db575f80fd5b6298968081116134165760405162461bcd60e51b8152600401610b88906020808252600490820152632031653760e01b604082015260600190565b60035460405163d55bfdcd60e01b81526001600160a01b039091169063d55bfdcd90613448908590859060040161457f565b5f604051808303815f87803b15801561345f575f80fd5b505af1158015613471573d5f803e3d5ffd5b505050505050565b6002546001600160a01b0316156134b4576002546001600160a01b031633146134b45760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b031661353c576134cc61201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015613510573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061353491906144f2565b61353c575f80fd5b600354604051633597458160e21b815282151560048201526001600160a01b039091169063d65d16049060240161140e565b6002546001600160a01b0316156135a9576002546001600160a01b031633146135a95760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b0316613631576135c161201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa158015613605573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362991906144f2565b613631575f80fd5b6003546040516370bb923760e11b8152600481018390526001600160a01b039091169063e177246e9060240161140e565b5f6001600160a01b0382166136895760405162461bcd60e51b8152600401610b8890614628565b600354604051630ef40a6760e41b81526001600160a01b0384811660048301525f92169063ef40a67090602401602060405180830381865afa1580156136d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136f59190614598565b6001600160a01b0384165f90815260076020526040902054909150811061371c5780611614565b50506001600160a01b03165f9081526007602052604090205490565b6003546001600160a01b0316331461377b5760405162461bcd60e51b8152602060048201526006602482015265139bdd0814d360d21b6044820152606401610b88565b600154613792906001600160a01b03168484613ed2565b6001600160a01b0383165f908152600760209081526040808320546008909252909120548183116137cc576137c7838361481a565b6137ce565b5f5b6001600160a01b0386165f908152600760205260409020558083116137fc576137f7838261481a565b6137fe565b5f5b6001600160a01b039095165f9081526008602052604090209490945550505050565b6002546001600160a01b03161561385b576002546001600160a01b0316331461385b5760405162461bcd60e51b8152600401610b8890614560565b6002546001600160a01b03166138e35761387361201c565b604051630935e01b60e21b81523360048201526001600160a01b0391909116906324d7806c90602401602060405180830381865afa1580156138b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138db91906144f2565b6138e3575f80fd5b6001600160a01b0381166139285760405162461bcd60e51b815260206004820152600c60248201526b7573652072656e6f756e636560a01b6044820152606401610b88565b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600280546001600160a01b0319166001600160a01b0383811691821790925560035460405163f2fde38b60e01b815260048101929092529091169063f2fde38b9060240161140e565b606080808080855f6139bd60018a61481a565b9850816001600160401b038111156139d7576139d761466a565b604051908082528060200260200182016040528015613a00578160200160208202803683370190505b509550816001600160401b03811115613a1b57613a1b61466a565b604051908082528060200260200182016040528015613a44578160200160208202803683370190505b509650816001600160401b03811115613a5f57613a5f61466a565b604051908082528060200260200182016040528015613a9257816020015b6060815260200190600190039081613a7d5790505b509450816001600160401b03811115613aad57613aad61466a565b604051908082528060200260200182016040528015613ae057816020015b6060815260200190600190039081613acb5790505b509350816001600160401b03811115613afb57613afb61466a565b604051908082528060200260200182016040528015613b24578160200160208202803683370190505b509250885b613b338a8461482d565b811015613d2a57613b4381610e27565b915081878281518110613b5857613b5861467e565b60200260200101906001600160a01b031690816001600160a01b031681525050613b828b83611579565b888281518110613b9457613b9461467e565b602002602001018181525050816001600160a01b03166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015613bdb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613c029190810190614692565b868281518110613c1457613c1461467e565b6020026020010181905250816001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015613c5a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613c819190810190614692565b858281518110613c9357613c9361467e565b6020026020010181905250816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cfe9190614862565b848281518110613d1057613d1061467e565b60ff90921660209283029190910190910152600101613b29565b505050939792965093509350565b613d406121b2565b6001600160a01b0316336001600160a01b031614613d97576002546001600160a01b03163314613d975760405162461bcd60e51b81526020600482015260026024820152614f4f60f01b6044820152606401610b88565b613d9f6121b2565b6040516309ab9c0760e31b81526001600160a01b0384811660048301529190911690634d5ce03890602401602060405180830381865afa158015613de5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e0991906144f2565b613e6e57613e156121b2565b6040516371dcdcaf60e01b81526001600160a01b03848116600483015291909116906371dcdcaf906024015f604051808303815f87803b158015613e57575f80fd5b505af1158015613e69573d5f803e3d5ffd5b505050505b60035460405163f77a3fb960e01b81526001600160a01b039091169063f77a3fb990613448908590859060040161457f565b600354604051637d16126960e11b81526001600160a01b0383811660048301525f92169063fa2c24d290602401610ec6565b61194e8363a9059cbb60e01b8484604051602401613ef192919061457f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f60565b6040516001600160a01b0380851660248301528316604482015260648101829052610d9c9085906323b872dd60e01b90608401613ef1565b5f613fb4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166140319092919063ffffffff16565b80519091501561194e5780806020019051810190613fd291906144f2565b61194e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b88565b6060612f0784845f85855f80866001600160a01b031685876040516140569190614882565b5f6040518083038185875af1925050503d805f8114614090576040519150601f19603f3d011682016040523d82523d5f602084013e614095565b606091505b50915091506140a6878383876140b1565b979650505050505050565b6060831561411f5782515f03614118576001600160a01b0385163b6141185760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b88565b5081612f07565b612f0783838151156141345781518083602001fd5b8060405162461bcd60e51b8152600401610b88919061419b565b5f5b83811015614168578181015183820152602001614150565b50505f910152565b5f815180845261418781602086016020860161414e565b601f01601f19169290920160200192915050565b602081525f6116146020830184614170565b6001600160a01b03811681146141c1575f80fd5b50565b5f805f606084860312156141d6575f80fd5b83356141e1816141ad565b925060208401356141f1816141ad565b929592945050506040919091013590565b5f60208284031215614212575f80fd5b5035919050565b5f60208284031215614229575f80fd5b8135611614816141ad565b5f8060408385031215614245575f80fd5b8235614250816141ad565b91506020830135614260816141ad565b809150509250929050565b80151581146141c1575f80fd5b5f60208284031215614288575f80fd5b81356116148161426b565b5f815180845260208085019450602084015f5b838110156142cb5781516001600160a01b0316875295820195908201906001016142a6565b509495945050505050565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561432157601f1986840301895261430f838351614170565b988401989250908301906001016142f3565b5090979650505050505050565b606081525f6143406060830186614293565b828103602084015261435281866142d6565b9050828103604084015261436681856142d6565b9695505050505050565b5f8060408385031215614381575f80fd5b823561438c816141ad565b946020939093013593505050565b5f805f606084860312156143ac575f80fd5b83356143b7816141ad565b92506020840135915060408401356143ce8161426b565b809150509250925092565b5f80604083850312156143ea575f80fd5b82356143f5816141ad565b915060208301356142608161426b565b60a080825286519082018190525f9060209060c0840190828a01845b8281101561443d57815184529284019290840190600101614421565b505050838103828501526144518189614293565b9050838103604085015261446581886142d6565b9050838103606085015261447981876142d6565b848103608086015285518082528387019250908301905f5b818110156144b057835160ff1683529284019291840191600101614491565b50909a9950505050505050505050565b5f805f606084860312156144d2575f80fd5b83356144dd816141ad565b95602085013595506040909401359392505050565b5f60208284031215614502575f80fd5b81516116148161426b565b600181811c9082168061452157607f821691505b60208210810361453f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614555575f80fd5b8151611614816141ad565b60208082526005908201526437bbb732b960d91b604082015260600190565b6001600160a01b03929092168252602082015260400190565b5f602082840312156145a8575f80fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6020808252600890820152676e6f74206c69766560c01b604082015260600190565b60208082526022908201527f45524332303a2073656e64696e6720746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156146a2575f80fd5b81516001600160401b03808211156146b8575f80fd5b818401915084601f8301126146cb575f80fd5b8151818111156146dd576146dd61466a565b604051601f8201601f19908116603f011681019083821181831017156147055761470561466a565b8160405282815287602084870101111561471d575f80fd5b6140a683602083016020880161414e565b5f805f805f60a08688031215614742575f80fd5b85519450602086015193506040860151925060608601516147628161426b565b60808701519092506147738161426b565b809150509295509295909350565b5f805f805f8060c08789031215614796575f80fd5b86516147a18161426b565b60208801519096506147b28161426b565b6040880151606089015160808a015160a0909a0151989b929a5090989097909650945092505050565b5f805f606084860312156147ed575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610e9257610e92614806565b80820180821115610e9257610e92614806565b5f8060408385031215614851575f80fd5b505080516020909101519092909150565b5f60208284031215614872575f80fd5b815160ff81168114611614575f80fd5b5f825161489381846020870161414e565b919091019291505056fea2646970667358221220ea23e88dcead24c6956f1cfd82af22a7bc9bf7ed7c69d7c9229d3abe6bfa8e7864736f6c63430008180033
Verified Source Code Partial Match
Compiler: v0.8.24+commit.e11b9ed9
EVM: shanghai
Optimization: Yes (200 runs)
stakeInterface.sol 729 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
/// Standard IERC20 interface
interface IERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function name() external view returns(string memory);
function symbol() external view returns(string memory);
function balanceOf(address user) 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);
}
interface sdep{
function sdOwner() external view returns(address);
function BackingLogicAddress() external view returns(address);
function backingAsset() external view returns(address);
}
interface stakeDeployer{
function isReward(address addy) external view returns(bool);
function setIsReward(address addy) external;
function readyMigrate(address addy) external view returns(bool);
function migrateAddress(address addy) external view returns(address);
function distributeBulk() external;
}
interface Reader {
function isAdmin(address addy) external view returns (bool);
function isSetter(address addy) external view returns (bool);
function setIsSD(address addy) external;
function protocolAddy() external view returns (address);
function feeConverter() external view returns (address);
function sdDepAddy() external view returns (address);
function getProtocolFee() external view returns (uint256);
function breaker() external view returns (bool); //circuit breaked in case of an exploit to handle
function dataAddress() external view returns (address);
function isWhitelistContract(address addy) external view returns (bool);
function setWhitelistContract(address addy, bool _bool) external;
function stakeDeployerAddress() external view returns(address);
function FEGstake() external view returns(address);
}
interface StakeLogics{
function start() external;
function balanceOf(address user) external view returns (uint256);
function totalSupply() external view returns (uint256);
function amountStaked(address user) external view returns (uint256 StakedSD);
function isStakeholder(address user) external view returns (bool);
function stake(address user, uint256 amt) external returns (uint256 poolAmountOut, uint256 afterFee);
function withdraw(address user, uint256 amt) external returns (uint256);
function setWithdrawalFee(uint256 amt) external;
function withdrawFee() external view returns(uint256);
function setDepositFee(uint256 amt) external;
function depositFee() external view returns(uint256);
function addReward(address reward, uint256 amt) external;
function getTotalRewards(address reward) external view returns(uint256);
function getRewardRound(address reward) external view returns(uint256);
function claimRewardTokenEarned(address user, address reward) external returns (uint256 owing);
function claimAllReward(address user) external;
function pendingRewardTokenEarned(address user, address reward) external view returns (uint256 _pendingReward);
function syncRewards() external;
function userRewardCheck(address user) external view returns(bool owed);
function setRewardToken(address reward, uint256 _syncLevel) external;
function setSyncLevel(address reward, uint256 amt) external;
function getSyncLevel(address reward) external view returns(uint256);
function setDelay(uint256 amt) external;
function delay() external view returns(uint256);
function setMatureDelay(bool _bool) external;
function matureDelay() external view returns(bool);
function setBoost(uint256 amt) external;
function boost() external view returns(uint256);
function setBoostBacking(bool _bool) external;
function boostBacking() external view returns(bool);
function setBurnWDFee(bool _bool) external;
function burnWDFee() external view returns(bool);
function setSacrificeEnabled(bool _bool) external;
function sacrificeEnabled() external view returns(bool);
function setSacrificeLevel(address user, uint256 amt) external;
function parent() external view returns(address);
function stakers(address user) external view returns(uint256, uint256, uint256, bool, bool);
function rewards(address user) external view returns(bool, bool, uint256, uint256, uint256, uint256);
function userRewards(address reward, address user) external view returns(uint256, uint256, uint256);
function rewardRounds(address reward, uint256 round) external view returns(uint256, uint256, uint256);
function rewardAddresses(uint256 amount) external view returns(address);
function isRewardToken(address reward) external view returns(bool);
function rewardLength() external view returns(uint256);
function getAllPendingRewardTokenEarned(address user) external view returns (uint256[] memory, address[] memory);
function live() external view returns(bool);
function getStakeTime(address user) external view returns(uint256);
function transferOwnership(address newowner) external;
function sacrificed(address user) external view returns(uint256);
function setOffRewardToken(address reward, bool _bool) external;
}
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
/// Transfer Helper to ensure the correct transfer of the tokens or ETH
library SafeTransfer {
using Address for address;
/** Safe Transfer asset from one wallet with approval of the wallet
* @param erc20: the contract address of the erc20 token
* @param from: the wallet to take from
* @param amount: the amount to take from the wallet
**/
function _pullUnderlying(IERC20 erc20, address from, uint amount) internal
{
safeTransferFrom(erc20,from,address(this),amount);
}
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));
}
/** Safe Transfer asset to one wallet from within the contract
* @param erc20: the contract address of the erc20 token
* @param to: the wallet to send to
* @param amount: the amount to send from the contract
**/
function _pushUnderlying(IERC20 erc20, address to, uint amount) internal
{
safeTransfer(erc20,to,amount);
}
/** Safe Transfer ETH to one wallet from within the contract
* @param to: the wallet to send to
* @param value: the amount to send from the contract
**/
function safeTransferETH(address to, uint256 value) internal {
(bool success,) = to.call{value : value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
interface Dataport {
function DATA_READ() external view returns(address);
}
contract stakeInterface is ReentrancyGuard{
address public SD;
address public _owner;
address public stakeLogic;
string private _name;
string private _symbol;
bool public paused;
uint8 private _decimals = 18;
mapping(address => uint256) public staked;
mapping(address => uint256) public accu;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address user, address token, string memory tname, string memory tsymbol) {
SD = token;
_name = tname;
_symbol = tsymbol;
_owner = user;
}
event STAKED(address staker, uint256 tokens);
event ADDREWARD(address reward, uint256 amount);
event WITHDRAW(address staker, uint256 tokens);
event PAYOUT(uint256 round, uint256 tokens, address sender);
event CLAIMEDREWARD(address staker, address reward, uint256 amount);
event CLAIMEDSDEARNED(address staker, uint256 reward);
event CLAIMALLREWARD(address staker);
event Transfer(address indexed from, address indexed to, uint256 value);
modifier live() {
require(!paused, "Paused");
_;
}
modifier dist() {
if(address(this) != Reader(DATA_READ()).FEGstake()){
stakeDeployer(stakeDeployerAddress()).distributeBulk();
}
_;
}
function stakeDeployerAddress() public view returns(address) {
return Reader(DATA_READ()).stakeDeployerAddress();
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner {
if(_owner != address(0)) {
require(msg.sender == _owner, "owner");
}
if(_owner == address(0)) {
require(Reader(DATA_READ()).isAdmin(msg.sender));
}
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "use renounce");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
StakeLogics(stakeLogic).transferOwnership(newOwner);
}
function DATA_READ() public view returns(address) {
return Dataport(0xcCeD1a96321B2B2a06E8F3F4B0B883dDD059968c).DATA_READ();
}
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;
}
function isLive() public view returns(bool) {
return StakeLogics(stakeLogic).live();
}
function setPause(bool _bool) external onlyOwner {
require(stakeDeployer(stakeDeployerAddress()).readyMigrate(SD), "Not ready");
paused = _bool;
}
function setLogics(address addy) external {
require(stakeLogic == address(0), "0x");
stakeLogic = addy;
}
function userRewardCheck(address user) public view returns(bool) {
return StakeLogics(stakeLogic).userRewardCheck(user);
}
function getStakeTime(address user) public view returns(uint256) {
return StakeLogics(stakeLogic).getStakeTime(user);
}
function getTotalRewards(address reward) external view returns(uint256) {
return StakeLogics(stakeLogic).getTotalRewards(reward);
}
function sendTokens(address user, uint256 amt, uint256 amt0) external {
require(msg.sender == stakeLogic, "Not SL");
SafeTransfer.safeTransfer(IERC20(SD), user, amt);
uint256 ts = staked[user];
uint256 us = accu[user];
staked[user] = amt0 > ts ? 0 : ts - amt0;
accu[user] = amt0 > us ? 0 : us - amt0;
}
function sendReward(address reward, address user, uint256 amt) external {
require(msg.sender == stakeLogic, "Not SL");
SafeTransfer.safeTransfer(IERC20(reward), user, amt);
}
function setStakeLogic() external onlyOwner {
require(stakeDeployer(stakeDeployerAddress()).readyMigrate(SD), "Not ready");
stakeLogic = stakeDeployer(stakeDeployerAddress()).migrateAddress(SD);
}
function setWithdrawalFee(uint256 amt) external onlyOwner {
StakeLogics(stakeLogic).setWithdrawalFee(amt);
}
function withdrawalFee() external view returns(uint256) {
return StakeLogics(stakeLogic).withdrawFee();
}
function setDepositFee(uint256 amt) external onlyOwner {
StakeLogics(stakeLogic).setDepositFee(amt);
}
function depositFee() external view returns(uint256) {
return StakeLogics(stakeLogic).depositFee();
}
function balanceOf(address user) external view returns(uint256) {
return StakeLogics(stakeLogic).balanceOf(user);
}
function totalSupply() public view returns (uint256) {
return StakeLogics(stakeLogic).totalSupply();
}
function isStaker(address user) public view returns(bool) {
return StakeLogics(stakeLogic).isStakeholder(user);
}
function start() external {
require(msg.sender == _owner, "owner");
StakeLogics(stakeLogic).start();
}
function sacrificed(address user) external view returns(uint256) {
return StakeLogics(stakeLogic).sacrificed(user);
}
function stake(uint256 amount) public nonReentrant returns(uint256) {
require(isLive(), "not live");
SafeTransfer.safeTransferFrom(IERC20(SD), msg.sender, stakeLogic, amount);
(uint256 poolAmountOut, uint256 afterFee) = StakeLogics(stakeLogic).stake(msg.sender, amount);
staked[msg.sender] += afterFee;
accu[msg.sender] += afterFee;
emit STAKED(msg.sender, amount);
emit Transfer(msg.sender, address(this), poolAmountOut);
return poolAmountOut;
}
function stake(address user, uint256 amount) public nonReentrant returns(uint256) {
require(isLive(), "not live");
SafeTransfer.safeTransferFrom(IERC20(SD), msg.sender, stakeLogic, amount);
(uint256 poolAmountOut, uint256 afterFee) = StakeLogics(stakeLogic).stake(user, amount);
staked[user] += afterFee;
accu[user] += afterFee;
emit STAKED(user, amount);
emit Transfer(user, address(this), poolAmountOut);
return poolAmountOut;
}
// ------------------------------------------------------------------------
// Owners can send the funds to be distributed to stakers using this function
// @param tokens number of tokens to distribute
// ------------------------------------------------------------------------
function addReward(address reward, uint256 amt) public nonReentrant {
SafeTransfer.safeTransferFrom(IERC20(reward), msg.sender, address(this), amt);
StakeLogics(stakeLogic).addReward(reward, amt);
emit ADDREWARD(reward, amt);
}
function setOffRewardToken(address reward, bool _bool) external nonReentrant onlyOwner {
StakeLogics(stakeLogic).setOffRewardToken(reward, _bool);
}
function claimRewardTokenEarned(address reward) public nonReentrant live returns(uint256 owing) {
owing = StakeLogics(stakeLogic).claimRewardTokenEarned(msg.sender, reward);
emit CLAIMEDREWARD(msg.sender, reward, owing);
return owing;
}
function claimAllReward() public nonReentrant live {
StakeLogics(stakeLogic).claimAllReward(msg.sender);
emit CLAIMALLREWARD(msg.sender);
}
// ------------------------------------------------------------------------
// Get the pending rewards of the staker
// @param _staker the address of the staker
// ------------------------------------------------------------------------
function pendingRewardTokenEarned(address staker, address reward) public view returns(uint256 _pendingReward) {
require(staker != address(0), "ERC20: sending to the zero address");
return StakeLogics(stakeLogic).pendingRewardTokenEarned(staker, reward);
}
// ------------------------------------------------------------------------
// Get the SST balance of the token holder
// @param user the address of the token holder includes earned SD tokens from staking
// ------------------------------------------------------------------------
function amountStaked(address user) public view returns(uint256 StakedSD) {
require(user != address(0), "ERC20: sending to the zero address");
uint256 a = StakeLogics(stakeLogic).amountStaked(user);
StakedSD = a < staked[user] ? staked[user] : a;
}
// ------------------------------------------------------------------------
// Stakers can un stake the staked tokens using this function
// @param tokens the number of tokens to withdraw
// ------------------------------------------------------------------------
function withdraw(uint256 amount) public nonReentrant live dist returns (uint256 tokenAmountOut) {
require(isLive(), "not live");
tokenAmountOut = StakeLogics(stakeLogic).withdraw(msg.sender, amount);
emit WITHDRAW(msg.sender, amount);
emit Transfer(address(this), msg.sender, tokenAmountOut);
return tokenAmountOut;
}
function stk(address user, uint256 amount, bool _bool) public nonReentrant live {
require(msg.sender == stakeLogic, "SL");
staked[user] = _bool ? staked[user] + amount : staked[user] - amount;
}
function accumulated(address user) external view returns(uint256) {
uint256 a = accu[user];
uint256 c = amountStaked(user);
return c > a ? c - a : 0;
}
function resetAccumulated() external {
accu[msg.sender] = amountStaked(msg.sender);
}
function emergencySaveLostTokens(address to, address _token, uint256 _amt) public dist onlyOwner {
require(_token != SD, "Can't remove Main Token");
require(!stakeDeployer(stakeDeployerAddress()).isReward(_token), "Cannot remove rewards");
IERC20(_token).transfer(to, _amt);
}
function setRewardToken(address reward, uint256 _syncLevel) external{ // Incase wraps ever update
if(msg.sender != stakeDeployerAddress()){
require(msg.sender == owner(), "OO");
}
if(!stakeDeployer(stakeDeployerAddress()).isReward(reward)){
stakeDeployer(stakeDeployerAddress()).setIsReward(reward);
}
StakeLogics(stakeLogic).setRewardToken(reward, _syncLevel);
}
function syncRewards() public nonReentrant {
StakeLogics(stakeLogic).syncRewards();
}
function setSacrificeLevel(uint256 amt) external {
StakeLogics(stakeLogic).setSacrificeLevel(msg.sender, amt);
}
function setSacrificeEnabled(bool _bool) external onlyOwner {
StakeLogics(stakeLogic).setSacrificeEnabled(_bool);
}
function setBurnWDFee(bool _bool) external onlyOwner {
StakeLogics(stakeLogic).setBurnWDFee(_bool);
}
function setBoostBacking(bool _bool) external onlyOwner {
StakeLogics(stakeLogic).setBoostBacking(_bool);
}
function setBoost(uint256 amt) external onlyOwner {
StakeLogics(stakeLogic).setBoost(amt);
}
function setSyncLevel(address reward, uint256 amt) external onlyOwner {
require(amt > 1e7, " 1e7");
StakeLogics(stakeLogic).setSyncLevel(reward, amt);
}
function getSyncLevel(address reward) external view returns(uint256) {
return StakeLogics(stakeLogic).getSyncLevel(reward);
}
function delay() external view returns(uint256) {
return StakeLogics(stakeLogic).delay();
}
function getRewardRound(address reward) external view returns(uint256) {
return StakeLogics(stakeLogic).getRewardRound(reward);
}
function boost() external view returns(uint256) {
return StakeLogics(stakeLogic).boost();
}
function boostBacking() external view returns(bool) {
return StakeLogics(stakeLogic).boostBacking();
}
function burnWDFee() external view returns(bool) {
return StakeLogics(stakeLogic).burnWDFee();
}
function sacrificeEnabled() external view returns(bool) {
return StakeLogics(stakeLogic).sacrificeEnabled();
}
function matureDelay() external view returns(bool) {
return StakeLogics(stakeLogic).matureDelay();
}
function setMatureDelay(bool _bool) external onlyOwner {
StakeLogics(stakeLogic).setMatureDelay(_bool);
}
function setDelay(uint256 amt) external onlyOwner {
StakeLogics(stakeLogic).setDelay(amt);
}
function getStakers(address user) external view returns(uint256 stakeTime, uint256 sacrificeLevel, uint256 withdrawFee, bool initialized, bool preDelay) {
return StakeLogics(stakeLogic).stakers(user);
}
function getRewards(address reward) external view returns(bool islive, bool isOn, uint256 round, uint256 totalDividends, uint256 totalRewards, uint256 _syncLevel) {
return StakeLogics(stakeLogic).rewards(reward);
}
function getUserRewards(address reward, address user) external view returns(uint256 entryRound, uint256 lastEarned, uint256 totalEarned) {
return StakeLogics(stakeLogic).userRewards(reward, user);
}
function getRewardRounds(address reward, uint256 round) external view returns(uint256 entryRound, uint256 lastEarned, uint256 totalEarned) {
return StakeLogics(stakeLogic).rewardRounds(reward, round);
}
function rewardAddresses(uint256 reward) public view returns(address) {
return StakeLogics(stakeLogic).rewardAddresses(reward);
}
function rewardLength() public view returns(uint256) {
return StakeLogics(stakeLogic).rewardLength();
}
function getAllPendingRewardTokenEarned(address user) public view returns (uint256[] memory amounts, address[] memory reward, string[] memory name_, string[] memory symbol_, uint8[] memory decimals_) {
uint256 rl = rewardLength();
address rw;
reward = new address[](rl);
amounts = new uint256[](rl);
name_ = new string[](rl);
symbol_ = new string[](rl);
decimals_ = new uint8[](rl);
for (uint256 j = 0; j < rl; j++) {
rw = rewardAddresses(j);
reward[j] = rw;
amounts[j] = pendingRewardTokenEarned(user, rw);
name_[j] = IERC20(rw).name();
symbol_[j] = IERC20(rw).symbol();
decimals_[j] = IERC20(rw).decimals();
}
}
function getPaginatedPendingRewardTokenEarned(address user, uint256 starting, uint256 amount) public view returns (uint256[] memory amounts, address[] memory reward, string[] memory name_, string[] memory symbol_, uint8[] memory decimals_) {
uint256 rl = amount;
address rw;
starting -= 1;
reward = new address[](rl);
amounts = new uint256[](rl);
name_ = new string[](rl);
symbol_ = new string[](rl);
decimals_ = new uint8[](rl);
for (uint256 j = starting; j < rl + starting; j++) {
rw = rewardAddresses(j);
reward[j] = rw;
amounts[j] = pendingRewardTokenEarned(user, rw);
name_[j] = IERC20(rw).name();
symbol_[j] = IERC20(rw).symbol();
decimals_[j] = IERC20(rw).decimals();
}
}
function getRewardList() external view returns(address[] memory reward, string[] memory name_, string[] memory symbol_) {
uint256 rl = rewardLength();
address rw;
reward = new address[](rl);
name_ = new string[](rl);
symbol_ = new string[](rl);
for (uint256 j = 0; j < rl; j++) {
rw = rewardAddresses(j);
reward[j] = rw;
name_[j] = IERC20(rw).name();
symbol_[j] = IERC20(rw).symbol();
}
}
}
Read Contract
DATA_READ 0x85523a1b → address
SD 0x384002a2 → address
_owner 0xb2bdfa7b → address
accu 0xf063b503 → uint256
accumulated 0xcc2153d1 → uint256
amountStaked 0xef40a670 → uint256
balanceOf 0x70a08231 → uint256
boost 0xa66f42c0 → uint256
boostBacking 0x4db84143 → bool
burnWDFee 0x30c1f39d → bool
decimals 0x313ce567 → uint8
delay 0x6a42b8f8 → uint256
depositFee 0x67a52793 → uint256
getAllPendingRewardTokenEarned 0xd00d13ef → uint256[], address[], string[], string[], uint8[]
getPaginatedPendingRewardTokenEarned 0xf6481416 → uint256[], address[], string[], string[], uint8[]
getRewardList 0x71b5ef46 → address[], string[], string[]
getRewardRound 0xfa2c24d2 → uint256
getRewardRounds 0x7a4b2830 → uint256, uint256, uint256
getRewards 0x79ee54f7 → bool, bool, uint256, uint256, uint256, uint256
getStakeTime 0xbcfd8dbf → uint256
getStakers 0x79193610 → uint256, uint256, uint256, bool, bool
getSyncLevel 0xaa240d6f → uint256
getTotalRewards 0x2bcf161c → uint256
getUserRewards 0xcd636b1f → uint256, uint256, uint256
isLive 0xb8f7a665 → bool
isStaker 0x6f1e8533 → bool
matureDelay 0xd1f794b8 → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
paused 0x5c975abb → bool
pendingRewardTokenEarned 0x4f25a95c → uint256
rewardAddresses 0x29f4ce8d → address
rewardLength 0xb95c5746 → uint256
sacrificeEnabled 0x00be3bd3 → bool
sacrificed 0x3b066d34 → uint256
stakeDeployerAddress 0x93e6cda6 → address
stakeLogic 0x09fa3efc → address
staked 0x98807d84 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
userRewardCheck 0x522b9e52 → bool
withdrawalFee 0x8bc7e8c4 → uint256
Write Contract 30 functions
These functions modify contract state and require a wallet transaction to execute.
addReward 0x9feb8f50
address reward
uint256 amt
claimAllReward 0x8a623d86
No parameters
claimRewardTokenEarned 0x36662c3c
address reward
returns: uint256
emergencySaveLostTokens 0x1336ffeb
address to
address _token
uint256 _amt
renounceOwnership 0x715018a6
No parameters
resetAccumulated 0x1f6866be
No parameters
sendReward 0x6b1af75e
address reward
address user
uint256 amt
sendTokens 0xf06fc103
address user
uint256 amt
uint256 amt0
setBoost 0x3b857a28
uint256 amt
setBoostBacking 0x5646696e
bool _bool
setBurnWDFee 0x59508b84
bool _bool
setDelay 0xe177246e
uint256 amt
setDepositFee 0x490ae210
uint256 amt
setLogics 0x2d162159
address addy
setMatureDelay 0xd65d1604
bool _bool
setOffRewardToken 0x9ea725d9
address reward
bool _bool
setPause 0xbedb86fb
bool _bool
setRewardToken 0xf77a3fb9
address reward
uint256 _syncLevel
setSacrificeEnabled 0xa4d50114
bool _bool
setSacrificeLevel 0xc28b354c
uint256 amt
setStakeLogic 0xb445eb70
No parameters
setSyncLevel 0xd55bfdcd
address reward
uint256 amt
setWithdrawalFee 0xac1e5025
uint256 amt
stake 0xa694fc3a
uint256 amount
returns: uint256
stake 0xadc9772e
address user
uint256 amount
returns: uint256
start 0xbe9a6555
No parameters
stk 0x7c8c7775
address user
uint256 amount
bool _bool
syncRewards 0x72c0c211
No parameters
transferOwnership 0xf2fde38b
address newOwner
withdraw 0x2e1a7d4d
uint256 amount
returns: uint256
Recent Transactions
No transactions found for this address