Address Contract Verified
Address
0x97de57eC338AB5d51557DA3434828C5DbFaDA371
Balance
0 ETH
Nonce
1
Code Size
13766 bytes
Creator
0x4c27e9D2...9CCA at tx 0xf6f032c3...a9e784
Indexed Transactions
0
Contract Bytecode
13766 bytes
0x6080604052600436106102935760003560e01c80638a70a3c61161015a578063b85364e5116100c1578063dd62ed3e1161007a578063dd62ed3e146107f5578063e0115d0d14610815578063e914555e1461082b578063f3fef3a31461084b578063f5eb42dc1461086b578063fd55276a1461088b57600080fd5b8063b85364e514610740578063ba129df414610760578063baab9dab14610780578063c05ebc2c146107a0578063cfad57a2146107c0578063d5002f2e146107e057600080fd5b80639dc29fac116101135780639dc29fac146106765780639e48d6cc14610696578063a457c2d7146106b6578063a9059cbb146106d6578063ac0799dd146106f6578063b0df27fd1461072a57600080fd5b80638a70a3c6146105e05780638fcb4e5b1461060057806395d89b411461030357806396171e591461062057806399f009a2146106405780639b4d51f41461066057600080fd5b806340c10f19116101fe5780636cfa6a75116101b75780636cfa6a75146105215780636da6d8f11461054157806370a0823114610557578063733346e5146105775780637890444c1461058d57806378cf2cff146105c657600080fd5b806340c10f191461045e57806344ac84b01461047e578063458f58151461049e578063482ed2a2146104b45780634b3094f5146104e15780636bef22ee1461050157600080fd5b80631a7b9ef5116102505780631a7b9ef5146103b357806323b872dd146103d357806324bc1090146103f35780632d47194014610406578063313ce5671461041c578063395093511461043e57600080fd5b80630359d4cc1461029857806305ad8308146102ba57806306fdde0314610303578063095ea7b31461033657806312d43a511461036657806318160ddd1461039e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046131f6565b6108ab565b005b3480156102c657600080fd5b506102f06102d53660046131f6565b6001600160a01b03166000908152600d602052604090205490565b6040519081526020015b60405180910390f35b34801561030f57600080fd5b506040805180820182526004815263195554d160e21b602082015290516102fa9190613211565b34801561034257600080fd5b5061035661035136600461325f565b610936565b60405190151581526020016102fa565b34801561037257600080fd5b50600354610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156103aa57600080fd5b506102f061094d565b3480156103bf57600080fd5b506102b86103ce36600461325f565b61095d565b3480156103df57600080fd5b506103566103ee366004613289565b610c76565b6102b861040136600461325f565b610d1e565b34801561041257600080fd5b506102f060095481565b34801561042857600080fd5b5060125b60405160ff90911681526020016102fa565b34801561044a57600080fd5b5061035661045936600461325f565b610f34565b34801561046a57600080fd5b506102b861047936600461325f565b610f6a565b34801561048a57600080fd5b506102b86104993660046132c5565b6110c6565b3480156104aa57600080fd5b506102f0600a5481565b3480156104c057600080fd5b506102f06104cf3660046131f6565b600c6020526000908152604090205481565b3480156104ed57600080fd5b506102b86104fc3660046132e8565b61117e565b34801561050d57600080fd5b506102b861051c3660046132e8565b611248565b34801561052d57600080fd5b50601254610386906001600160a01b031681565b34801561054d57600080fd5b506102f060085481565b34801561056357600080fd5b506102f06105723660046131f6565b6115fe565b34801561058357600080fd5b506102f060065481565b34801561059957600080fd5b506103566105a83660046131f6565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105d257600080fd5b50600b5461042c9060ff1681565b3480156105ec57600080fd5b506102b86105fb3660046132e8565b611620565b34801561060c57600080fd5b506102f061061b36600461325f565b6116d8565b34801561062c57600080fd5b506102b861063b366004613289565b611786565b34801561064c57600080fd5b506102b861065b3660046131f6565b611ba2565b34801561066c57600080fd5b506102f060045481565b34801561068257600080fd5b506102b861069136600461325f565b611c19565b3480156106a257600080fd5b506102b86106b1366004613301565b611c7a565b3480156106c257600080fd5b506103566106d136600461325f565b611e47565b3480156106e257600080fd5b506103566106f136600461325f565b611ed4565b34801561070257600080fd5b506102f07f00000000000000000000000000000000000000000000000821ab0d441498000081565b34801561073657600080fd5b506102f0600f5481565b34801561074c57600080fd5b506102f061075b3660046132e8565b611ee1565b34801561076c57600080fd5b506102b861077b3660046132c5565b611f24565b34801561078c57600080fd5b506102f061079b3660046132e8565b611fe4565b3480156107ac57600080fd5b506102b86107bb366004613289565b612015565b3480156107cc57600080fd5b506102b86107db3660046131f6565b61249d565b3480156107ec57600080fd5b506000546102f0565b34801561080157600080fd5b506102f0610810366004613334565b612515565b34801561082157600080fd5b506102f060055481565b34801561083757600080fd5b506102b8610846366004613375565b612540565b34801561085757600080fd5b506102b861086636600461325f565b6125f1565b34801561087757600080fd5b506102f06108863660046131f6565b6127f5565b34801561089757600080fd5b50601154610386906001600160a01b031681565b6003546001600160a01b031633146108de5760405162461bcd60e51b81526004016108d590613392565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0383161790556040517f78816b31283624f96a34a58e5f9cb743d63d7a325d42d4be00858daa99cf96199061092b90839042906133c1565b60405180910390a150565b6000610943338484612813565b5060015b92915050565b600061095860065490565b905090565b6001600160a01b0382166000908152600e602052604090205460ff166109d15760405162461bcd60e51b8152602060048201526024808201527f70726f7669646572206973206e6f74206120526564656d7074696f6e50726f7660448201526334b232b960e11b60648201526084016108d5565b6001600160a01b0382166000908152600d6020526040902054811115610a4a5760405162461bcd60e51b815260206004820152602860248201527f65757364416d6f756e742063616e6e6f7420737572706173732070726f766964604482015267195c9cc81919589d60c21b60648201526084016108d5565b6000610a54612920565b6001600160a01b0384166000908152600d6020908152604080832054600c9092528220549293509091610a889084906133f0565b610a939060646133f0565b610a9d9190613407565b905068056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152603060248201527f70726f7669646572277320636f6c6c61746572616c20726174652073686f756c60448201526f64206d6f7265207468616e203130302560801b60648201526084016108d5565b610b1c33858561299a565b6000612710600a54612710610b319190613429565b84610b4487670de0b6b3a76400006133f0565b610b4e9190613407565b610b5891906133f0565b610b629190613407565b6001600160a01b0386166000908152600c6020526040812080549293508392909190610b8f908490613429565b925050819055508060046000828254610ba89190613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610bdf90339085906004016133c1565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c22919061343c565b506040805185815260208101839052428183015290516001600160a01b0387169133917f1a7ab636ab77b4d93c0afba804a009a127e77def45e623e572144ca8f8a03ac59181900360600190a35050505050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cf45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016108d5565b610cff858585612b26565b610d138533610d0e8487612bde565b612813565b506001949350505050565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000341015610ddb5760405162461bcd60e51b815260206004820152602660248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015265189022aa241760d11b60648201526084016108d5565b60105460035460405163a1903eab60e01b81526001600160a01b039182166004820152600092919091169063a1903eab90349060240160206040518083038185885af1158015610e2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e549190613459565b905060008111610e955760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108d5565b3460046000828254610ea79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054349290610ed4908490613472565b90915550508115610eea57610eea838484612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89333442604051610f2793929190613485565b60405180910390a2505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610943918590610d0e9086612d00565b6001600160a01b038216610fbb5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b60008111610ff75760405162461bcd60e51b815260206004820152600960248201526816915493d7d352539560ba1b60448201526064016108d5565b611002338383612bea565b600a61100c61094d565b336000908152600d60205260409020546110279060646133f0565b6110319190613407565b11801561104f57506a084595161401484a00000061104d61094d565b115b156110c25760405162461bcd60e51b815260206004820152603860248201527f4d696e7420416d6f756e742063616e6e6f74206265206d6f7265207468616e2060448201527f313025206f6620746f74616c2063697263756c6174696f6e000000000000000060648201526084016108d5565b5050565b6003546001600160a01b031633146110f05760405162461bcd60e51b81526004016108d590613392565b6101f48160ff1611156111455760405162461bcd60e51b815260206004820152601860248201527f4d617820526564656d7074696f6e20466565206973203525000000000000000060448201526064016108d5565b60ff8116600a8190556040519081527f4dbf9634a3aaf3bc15ab627faeaac7c6b0a4754ead77206f1c11277356f2878f9060200161092b565b6003546001600160a01b031633146111a85760405162461bcd60e51b81526004016108d590613392565b6808ac7230489e8000008110156112135760405162461bcd60e51b815260206004820152602960248201527f5361666520436f6c6c61746572616c526174652073686f756c64206d6f7265206044820152687468616e203136302560b81b60648201526084016108d5565b60098190556040518181527f0447b351edf3bf02a602777192e1d189ac70324a0ca5502acd0d0918601eeb2e9060200161092b565b6000611252612920565b61126483670de0b6b3a76400006133f0565b61126e9190613407565b600480546010546040516370a0823160e01b81523093810193909352929350916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613459565b6112ec9190613429565b81111580156112fb5750600081115b6113575760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204c53442065786365737320696e636f6d652063616e20626520657860448201526618da185b99d95960ca1b60648201526084016108d5565b6000611361612d0c565b600f5461136e9190613472565b905080831115611473576012546113909033906001600160a01b031683612b26565b601254604051633c6b16ab60e01b8152600481018390526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b5050505060006113ff828561075b9190613429565b905080600003611416576114138285613429565b90505b6114203382612d50565b506000600f55601254604080518481524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a250611540565b60125461148b9033906001600160a01b031685612b26565b601254604051633c6b16ab60e01b8152600481018590526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050505082816114f59190613429565b600f55601254604080518581524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a25b4260055560105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157690339086906004016133c1565b6020604051808303816000875af1158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b9919061343c565b506040805183815260208101859052428183015290517fefa202e78b2ad7b96336e662b73d2b83b60668758a857269bd4d0962828329d19181900360600190a1505050565b6001600160a01b03811660009081526001602052604081205461094790611fe4565b6003546001600160a01b0316331461164a5760405162461bcd60e51b81526004016108d590613392565b609681111561169b5760405162461bcd60e51b815260206004820152601d60248201527f426f72726f77204150592063616e6e6f742065786365656420312e352500000060448201526064016108d5565b6116a3612ebf565b60088190556040518181527f3c62c9955fa46bea884e885afde8e7f674d06a027511ecb871d191869b8ab4819060200161092b565b60006116e5338484612ee3565b6040518281526001600160a01b0384169033907f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb9060200160405180910390a3600061173083611fe4565b9050836001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161177791815260200190565b60405180910390a39392505050565b6000611790612920565b6001600160a01b0384166000908152600d6020908152604080832054600c90925282205492935090916117c49084906133f0565b6117cf9060646133f0565b6117d99190613407565b90507f00000000000000000000000000000000000000000000000821ab0d441498000081106118705760405162461bcd60e51b815260206004820152603860248201527f426f72726f7765727320636f6c6c61746572616c20726174652073686f756c6460448201527f2062656c6f7720626164436f6c6c61746572616c52617465000000000000000060648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020546118948460026133f0565b11156118f45760405162461bcd60e51b815260206004820152602960248201527f61206d6178206f662035302520636f6c6c61746572616c2063616e206265206c6044820152681a5c5d5a59185d195960ba1b60648201526084016108d5565b6000670de0b6b3a764000061190984866133f0565b6119139190613407565b9050806119208730612515565b101561193e5760405162461bcd60e51b81526004016108d5906134a6565b61194986868361299a565b6000600a61195886600b6133f0565b6119629190613407565b905080600460008282546119769190613429565b90915550506001600160a01b0386166000908152600c6020526040812080548392906119a3908490613429565b9091555060009050336001600160a01b03891603611a365760105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906119ed90339086906004016133c1565b6020604051808303816000875af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a30919061343c565b50611b4a565b600b54606e90611a499060ff16846133f0565b611a539190613407565b6010549091506001600160a01b031663a9059cbb89611a728486613429565b6040518363ffffffff1660e01b8152600401611a8f9291906133c1565b6020604051808303816000875af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad2919061343c565b5060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b0590339085906004016133c1565b6020604051808303816000875af1158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b48919061343c565b505b866001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad8933868686600042604051611b9097969594939291906134fb565b60405180910390a25050505050505050565b6003546001600160a01b03163314611bcc5760405162461bcd60e51b81526004016108d590613392565b601180546001600160a01b0319166001600160a01b0383161790556040517ffb30b10d69603a569e0dfcd8d074a070a51641dfbbe940536f216933cf6208889061092b90839042906133c1565b6001600160a01b038216611c6f5760405162461bcd60e51b815260206004820152601860248201527f4255524e5f544f5f5448455f5a45524f5f41444452455353000000000000000060448201526064016108d5565b6110c233838361299a565b6001600160a01b038316611cd05760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000821015611d395760405162461bcd60e51b815260206004820152602860248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015267189039ba22aa241760c11b60648201526084016108d5565b6010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db4919061343c565b508160046000828254611dc79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054849290611df4908490613472565b90915550508015611e0a57611e0a838483612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89338442604051610f2793929190613485565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611ebb5760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016108d5565b611eca3385610d0e8487612bde565b5060019392505050565b6000610943338484612b26565b600080611eed60065490565b905080600003611f005750600092915050565b611f1d81611f17611f1060005490565b8690613053565b9061305f565b9392505050565b6003546001600160a01b03163314611f4e5760405162461bcd60e51b81526004016108d590613392565b60058160ff161115611fa25760405162461bcd60e51b815260206004820152601760248201527f4d6178204b65657065722072657761726420697320352500000000000000000060448201526064016108d5565b600b805460ff191660ff83169081179091556040519081527f8e22963d45681714fade6b520d66ef5902422aac2bc9705573c0237d6a8f002a9060200161092b565b600080611ff060005490565b90506000546000036120055750600092915050565b611f1d81611f17611f1060065490565b600061201f612920565b90507f00000000000000000000000000000000000000000000000821ab0d441498000061204a61094d565b8260045461205891906133f0565b6120639060646133f0565b61206d9190613407565b106120ca5760405162461bcd60e51b815260206004820152602760248201527f6f766572616c6c436f6c6c61746572616c526174652073686f756c642062656c6044820152666f77203135302560c81b60648201526084016108d5565b6001600160a01b0383166000908152600d6020908152604080832054600c9092528220546120f99084906133f0565b6121049060646133f0565b61210e9190613407565b90506806c6b935b8bbd40000811061217b5760405162461bcd60e51b815260206004820152602a60248201527f626f72726f7765727320636f6c6c61746572616c526174652073686f756c642060448201526962656c6f77203132352560b01b60648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020548311156121f95760405162461bcd60e51b815260206004820152602d60248201527f746f74616c206f6620636f6c6c61746572616c2063616e206265206c6971756960448201526c19185d195908185d081b5bdcdd609a1b60648201526084016108d5565b6000670de0b6b3a764000061220e84866133f0565b6122189190613407565b905068056bc75e2d63100000821061224b578161223e8268056bc75e2d631000006133f0565b6122489190613407565b90505b806122568730612515565b10156122745760405162461bcd60e51b81526004016108d5906134a6565b61227f86868361299a565b83600460008282546122919190613429565b90915550506001600160a01b0385166000908152600c6020526040812080548692906122be908490613429565b9091555060009050336001600160a01b0388161480159061231e5750600b546122f29060ff16670de0b6b3a764000061353b565b61230f9067ffffffffffffffff1668056bc75e2d63100000613567565b68ffffffffffffffffff168310155b156123c957600b5483906123359060ff16876133f0565b61234790670de0b6b3a76400006133f0565b6123519190613407565b60105460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061238490339085906004016133c1565b6020604051808303816000875af11580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c7919061343c565b505b6010546001600160a01b031663a9059cbb886123e58489613429565b6040518363ffffffff1660e01b81526004016124029291906133c1565b6020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612445919061343c565b50856001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad883385898660014260405161248c97969594939291906134fb565b60405180910390a250505050505050565b6003546001600160a01b031633146124c75760405162461bcd60e51b81526004016108d590613392565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f85314cee79a1d748bc922aee2e7514c754944bae54b9c5467dfd99629410fa9a9060200161092b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60115460405163fce67e0d60e01b81523360048201526001600160a01b039091169063fce67e0d90602401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050336000818152600e6020908152604091829020805460ff19168715159081179091558251938452908301527f3d9a02fcbaf508c27fa7c97d8e5795c8619e39299b3e8b7779fbe1f8d5de7970935001905061092b565b6001600160a01b0382166126475760405162461bcd60e51b815260206004820152601c60248201527f57495448445241575f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b600081116126875760405162461bcd60e51b815260206004820152600d60248201526c5a45524f5f574954484452415760981b60448201526064016108d5565b336000908152600c60205260409020548111156126dd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016108d5565b80600460008282546126ef9190613429565b9091555050336000908152600c602052604081208054839290612713908490613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061274a90859085906004016133c1565b6020604051808303816000875af1158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061343c565b50336000908152600d6020526040902054156127ac576127ac3361306b565b816001600160a01b03167f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db03383426040516127e993929190613485565b60405180910390a25050565b6001600160a01b038116600090815260016020526040812054610947565b6001600160a01b0383166128695760405162461bcd60e51b815260206004820152601960248201527f415050524f56455f46524f4d5f5a45524f5f414444524553530000000000000060448201526064016108d5565b6001600160a01b0382166128bf5760405162461bcd60e51b815260206004820152601760248201527f415050524f56455f544f5f5a45524f5f4144445245535300000000000000000060448201526064016108d5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000734c517d4e2c851ca76d7ec94b805269df0f2201de6001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612976573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109589190613459565b6001600160a01b0382166000908152600d6020526040902054811115612a155760405162461bcd60e51b815260206004820152602a60248201527f5265706179696e6720416d6f756e742053757270617373657320426f72726f776044820152691a5b99c8105b5bdd5b9d60b21b60648201526084016108d5565b6000612a2082611ee1565b9050612a2c8482612d50565b5060115460405163fce67e0d60e01b81526001600160a01b0385811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612a7457600080fd5b505af1158015612a88573d6000803e3d6000fd5b505050506001600160a01b0383166000908152600d602052604081208054849290612ab4908490613429565b90915550612ac29050612ebf565b8160066000828254612ad49190613429565b92505081905550826001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858442604051612b1893929190613485565b60405180910390a250505050565b6000612b3182611ee1565b9050612b3e848483612ee3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051612bd091815260200190565b60405180910390a350505050565b6000611f1d8284613429565b6000612bf582611ee1565b905080600003612c025750805b60115460405163fce67e0d60e01b81526001600160a01b0386811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612c4957600080fd5b505af1158015612c5d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600d602052604081208054849290612c89908490613472565b90915550612c999050838261312b565b50612ca2612ebf565b8160066000828254612cb49190613472565b90915550612cc390508461306b565b826001600160a01b03167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee338442604051612b1893929190613485565b6000611f1d8284613472565b600061271060075460055442612d229190613429565b600854600654612d3291906133f0565b612d3c91906133f0565b612d469190613407565b6109589190613407565b60006001600160a01b038316612da85760405162461bcd60e51b815260206004820152601a60248201527f4255524e5f46524f4d5f5448455f5a45524f5f4144445245535300000000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480831115612e115760405162461bcd60e51b815260206004820152601b60248201527f4255524e5f414d4f554e545f455843454544535f42414c414e4345000000000060448201526064016108d5565b6000612e1c84611fe4565b9050612e3184612e2b60005490565b90612bde565b60008190559250612e428285612bde565b6001600160a01b038616600090815260016020526040812091909155612e6785611fe4565b60408051848152602081018390529081018790529091506001600160a01b038716907f8b2a1e1ad5e0578c3dd82494156e985dade827a87c573b5c1c7716a32162ad649060600160405180910390a250505092915050565b612ec7612d0c565b600f6000828254612ed89190613472565b909155505042600555565b6001600160a01b038316612f395760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016108d5565b6001600160a01b038216612f8f5760405162461bcd60e51b815260206004820152601c60248201527f5452414e534645525f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480821115612ff85760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016108d5565b6130028183612bde565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546130319083612d00565b6001600160a01b03909316600090815260016020526040902092909255505050565b6000611f1d82846133f0565b6000611f1d8284613407565b6009546001600160a01b0382166000908152600d602052604090205461308f612920565b6001600160a01b0384166000908152600c60205260409020546130b291906133f0565b6130bd9060646133f0565b6130c79190613407565b10156131285760405162461bcd60e51b815260206004820152602a60248201527f636f6c6c61746572616c526174652069732042656c6f772073616665436f6c6c60448201526961746572616c5261746560b01b60648201526084016108d5565b50565b60006001600160a01b03831661317e5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b6131918261318b60005490565b90612d00565b60008181556001600160a01b0385168152600160205260409020549091506131b99083612d00565b6001600160a01b039093166000908152600160205260409020929092555090565b80356001600160a01b03811681146131f157600080fd5b919050565b60006020828403121561320857600080fd5b611f1d826131da565b600060208083528351808285015260005b8181101561323e57858101830151858201604001528201613222565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561327257600080fd5b61327b836131da565b946020939093013593505050565b60008060006060848603121561329e57600080fd5b6132a7846131da565b92506132b5602085016131da565b9150604084013590509250925092565b6000602082840312156132d757600080fd5b813560ff81168114611f1d57600080fd5b6000602082840312156132fa57600080fd5b5035919050565b60008060006060848603121561331657600080fd5b61331f846131da565b95602085013595506040909401359392505050565b6000806040838503121561334757600080fd5b613350836131da565b915061335e602084016131da565b90509250929050565b801515811461312857600080fd5b60006020828403121561338757600080fd5b8135611f1d81613367565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610947576109476133da565b60008261342457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610947576109476133da565b60006020828403121561344e57600080fd5b8151611f1d81613367565b60006020828403121561346b57600080fd5b5051919050565b80820180821115610947576109476133da565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082526035908201527f70726f76696465722073686f756c6420617574686f72697a6520746f2070726f6040820152741d9a5919481b1a5c5d5a59185d1a5bdb88115554d1605a1b606082015260800190565b6001600160a01b039788168152959096166020860152604085019390935260608401919091526080830152151560a082015260c081019190915260e00190565b67ffffffffffffffff81811683821602808216919082811461355f5761355f6133da565b505092915050565b68ffffffffffffffffff818116838216019080821115613589576135896133da565b509291505056fea2646970667358221220bc65e4a4fb18b1f5f97dcfbbea162a8c2708052c7e17cc41775af03291d08e0f64736f6c63430008110033
Verified Source Code Full Match
Compiler: v0.8.17+commit.8df45f5f
EVM: london
Optimization: Yes (200 runs)
EUSD.sol 502 lines
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.17;
import "./SafeMath.sol";
import "./IERC20.sol";
/**
* @title Interest-bearing ERC20-like token for Lybra protocol.
*
* This contract is abstract. To make the contract deployable override the
* `_getTotalMintedEUSD` function. `Lybra.sol` contract inherits EUSD and defines
* the `_getTotalMintedEUSD` function.
*
* EUSD balances are dynamic and represent the holder's share in the total amount
* of Ether controlled by the protocol. Account shares aren't normalized, so the
* contract also stores the sum of all shares to calculate each account's token balance
* which equals to:
*
* shares[account] * _getTotalMintedEUSD() / _getTotalShares()
*
* For example, assume that we have:
*
* _getTotalMintedEUSD() -> 1000 EUSD
* sharesOf(user1) -> 100
* sharesOf(user2) -> 400
*
* Therefore:
*
* balanceOf(user1) -> 2 tokens which corresponds 200 EUSD
* balanceOf(user2) -> 8 tokens which corresponds 800 EUSD
*
* Since balances of all token holders change when the amount of total supplied EUSD
* changes, this token cannot fully implement ERC20 standard: it only emits `Transfer`
* events upon explicit transfer between holders. In contrast, when total amount of
* pooled Ether increases, no `Transfer` events are generated: doing so would require
* emitting an event for each token holder and thus running an unbounded loop.
*/
abstract contract EUSD is IERC20 {
using SafeMath for uint256;
uint256 private totalShares;
/**
* @dev EUSD balances are dynamic and are calculated based on the accounts' shares
* and the total supply by the protocol. Account shares aren't
* normalized, so the contract also stores the sum of all shares to calculate
* each account's token balance which equals to:
*
* shares[account] * _getTotalMintedEUSD() / _getTotalShares()
*/
mapping(address => uint256) private shares;
/**
* @dev Allowances are nominated in tokens, not token shares.
*/
mapping(address => mapping(address => uint256)) private allowances;
/**
* @notice An executed shares transfer from `sender` to `recipient`.
*
* @dev emitted in pair with an ERC20-defined `Transfer` event.
*/
event TransferShares(
address indexed from,
address indexed to,
uint256 sharesValue
);
/**
* @notice An executed `burnShares` request
*
* @dev Reports simultaneously burnt shares amount
* and corresponding EUSD amount.
* The EUSD amount is calculated twice: before and after the burning incurred rebase.
*
* @param account holder of the burnt shares
* @param preRebaseTokenAmount amount of EUSD the burnt shares corresponded to before the burn
* @param postRebaseTokenAmount amount of EUSD the burnt shares corresponded to after the burn
* @param sharesAmount amount of burnt shares
*/
event SharesBurnt(
address indexed account,
uint256 preRebaseTokenAmount,
uint256 postRebaseTokenAmount,
uint256 sharesAmount
);
/**
* @return the name of the token.
*/
function name() public pure returns (string memory) {
return "eUSD";
}
/**
* @return the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public pure returns (string memory) {
return "eUSD";
}
/**
* @return the number of decimals for getting user representation of a token amount.
*/
function decimals() public pure returns (uint8) {
return 18;
}
/**
* @return the amount of EUSD in existence.
*
* @dev Always equals to `_getTotalMintedEUSD()` since token amount
* is pegged to the total amount of EUSD controlled by the protocol.
*/
function totalSupply() public view returns (uint256) {
return _getTotalMintedEUSD();
}
/**
* @return the amount of tokens owned by the `_account`.
*
* @dev Balances are dynamic and equal the `_account`'s share in the amount of the
* total Ether controlled by the protocol. See `sharesOf`.
*/
function balanceOf(address _account) public view returns (uint256) {
return getMintedEUSDByShares(_sharesOf(_account));
}
/**
* @notice Moves `_amount` tokens from the caller's account to the `_recipient` account.
*
* @return a boolean value indicating whether the operation succeeded.
* Emits a `Transfer` event.
* Emits a `TransferShares` event.
*
* Requirements:
*
* - `_recipient` cannot be the zero address.
* - the caller must have a balance of at least `_amount`.
* - the contract must not be paused.
*
* @dev The `_amount` argument is the amount of tokens, not shares.
*/
function transfer(
address _recipient,
uint256 _amount
) public returns (bool) {
_transfer(msg.sender, _recipient, _amount);
return true;
}
/**
* @return the remaining number of tokens that `_spender` is allowed to spend
* on behalf of `_owner` through `transferFrom`. This is zero by default.
*
* @dev This value changes when `approve` or `transferFrom` is called.
*/
function allowance(
address _owner,
address _spender
) public view returns (uint256) {
return allowances[_owner][_spender];
}
/**
* @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens.
*
* @return a boolean value indicating whether the operation succeeded.
* Emits an `Approval` event.
*
* Requirements:
*
* - `_spender` cannot be the zero address.
* - the contract must not be paused.
*
* @dev The `_amount` argument is the amount of tokens, not shares.
*/
function approve(address _spender, uint256 _amount) public returns (bool) {
_approve(msg.sender, _spender, _amount);
return true;
}
/**
* @notice Moves `_amount` tokens from `_sender` to `_recipient` using the
* allowance mechanism. `_amount` is then deducted from the caller's
* allowance.
*
* @return a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
* Emits a `TransferShares` event.
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `_sender` and `_recipient` cannot be the zero addresses.
* - `_sender` must have a balance of at least `_amount`.
* - the caller must have allowance for `_sender`'s tokens of at least `_amount`.
* - the contract must not be paused.
*
* @dev The `_amount` argument is the amount of tokens, not shares.
*/
function transferFrom(
address _sender,
address _recipient,
uint256 _amount
) public returns (bool) {
uint256 currentAllowance = allowances[_sender][msg.sender];
require(
currentAllowance >= _amount,
"TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE"
);
_transfer(_sender, _recipient, _amount);
_approve(_sender, msg.sender, currentAllowance.sub(_amount));
return true;
}
/**
* @notice Atomically increases the allowance granted to `_spender` by the caller by `_addedValue`.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `_spender` cannot be the the zero address.
* - the contract must not be paused.
*/
function increaseAllowance(
address _spender,
uint256 _addedValue
) public returns (bool) {
_approve(
msg.sender,
_spender,
allowances[msg.sender][_spender].add(_addedValue)
);
return true;
}
/**
* @notice Atomically decreases the allowance granted to `_spender` by the caller by `_subtractedValue`.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `_spender` cannot be the zero address.
* - `_spender` must have allowance for the caller of at least `_subtractedValue`.
* - the contract must not be paused.
*/
function decreaseAllowance(
address _spender,
uint256 _subtractedValue
) public returns (bool) {
uint256 currentAllowance = allowances[msg.sender][_spender];
require(
currentAllowance >= _subtractedValue,
"DECREASED_ALLOWANCE_BELOW_ZERO"
);
_approve(msg.sender, _spender, currentAllowance.sub(_subtractedValue));
return true;
}
/**
* @return the total amount of shares in existence.
*
* @dev The sum of all accounts' shares can be an arbitrary number, therefore
* it is necessary to store it in order to calculate each account's relative share.
*/
function getTotalShares() public view returns (uint256) {
return _getTotalShares();
}
/**
* @return the amount of shares owned by `_account`.
*/
function sharesOf(address _account) public view returns (uint256) {
return _sharesOf(_account);
}
/**
* @return the amount of shares that corresponds to `_EUSDAmount` protocol-supplied EUSD.
*/
function getSharesByMintedEUSD(
uint256 _EUSDAmount
) public view returns (uint256) {
uint256 totalMintedEUSD = _getTotalMintedEUSD();
if (totalMintedEUSD == 0) {
return 0;
} else {
return _EUSDAmount.mul(_getTotalShares()).div(totalMintedEUSD);
}
}
/**
* @return the amount of EUSD that corresponds to `_sharesAmount` token shares.
*/
function getMintedEUSDByShares(
uint256 _sharesAmount
) public view returns (uint256) {
uint256 totalSharesAmount = _getTotalShares();
if (totalShares == 0) {
return 0;
} else {
return
_sharesAmount.mul(_getTotalMintedEUSD()).div(totalSharesAmount);
}
}
/**
* @notice Moves `_sharesAmount` token shares from the caller's account to the `_recipient` account.
*
* @return amount of transferred tokens.
* Emits a `TransferShares` event.
* Emits a `Transfer` event.
*
* Requirements:
*
* - `_recipient` cannot be the zero address.
* - the caller must have at least `_sharesAmount` shares.
* - the contract must not be paused.
*
* @dev The `_sharesAmount` argument is the amount of shares, not tokens.
*/
function transferShares(
address _recipient,
uint256 _sharesAmount
) public returns (uint256) {
_transferShares(msg.sender, _recipient, _sharesAmount);
emit TransferShares(msg.sender, _recipient, _sharesAmount);
uint256 tokensAmount = getMintedEUSDByShares(_sharesAmount);
emit Transfer(msg.sender, _recipient, tokensAmount);
return tokensAmount;
}
/**
* @return the total amount of EUSD.
* @dev This is used for calculating tokens from shares and vice versa.
* @dev This function is required to be implemented in a derived contract.
*/
function _getTotalMintedEUSD() internal view virtual returns (uint256);
/**
* @notice Moves `_amount` tokens from `_sender` to `_recipient`.
* Emits a `Transfer` event.
* Emits a `TransferShares` event.
*/
function _transfer(
address _sender,
address _recipient,
uint256 _amount
) internal {
uint256 _sharesToTransfer = getSharesByMintedEUSD(_amount);
_transferShares(_sender, _recipient, _sharesToTransfer);
emit Transfer(_sender, _recipient, _amount);
emit TransferShares(_sender, _recipient, _sharesToTransfer);
}
/**
* @notice Sets `_amount` as the allowance of `_spender` over the `_owner` s tokens.
*
* Emits an `Approval` event.
*
* Requirements:
*
* - `_owner` cannot be the zero address.
* - `_spender` cannot be the zero address.
* - the contract must not be paused.
*/
function _approve(
address _owner,
address _spender,
uint256 _amount
) internal {
require(_owner != address(0), "APPROVE_FROM_ZERO_ADDRESS");
require(_spender != address(0), "APPROVE_TO_ZERO_ADDRESS");
allowances[_owner][_spender] = _amount;
emit Approval(_owner, _spender, _amount);
}
/**
* @return the total amount of shares in existence.
*/
function _getTotalShares() internal view returns (uint256) {
return totalShares;
}
/**
* @return the amount of shares owned by `_account`.
*/
function _sharesOf(address _account) internal view returns (uint256) {
return shares[_account];
}
/**
* @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`.
*
* Requirements:
*
* - `_sender` cannot be the zero address.
* - `_recipient` cannot be the zero address.
* - `_sender` must hold at least `_sharesAmount` shares.
* - the contract must not be paused.
*/
function _transferShares(
address _sender,
address _recipient,
uint256 _sharesAmount
) internal {
require(_sender != address(0), "TRANSFER_FROM_THE_ZERO_ADDRESS");
require(_recipient != address(0), "TRANSFER_TO_THE_ZERO_ADDRESS");
uint256 currentSenderShares = shares[_sender];
require(
_sharesAmount <= currentSenderShares,
"TRANSFER_AMOUNT_EXCEEDS_BALANCE"
);
shares[_sender] = currentSenderShares.sub(_sharesAmount);
shares[_recipient] = shares[_recipient].add(_sharesAmount);
}
/**
* @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares.
* @dev This doesn't increase the token total supply.
*
* Requirements:
*
* - `_recipient` cannot be the zero address.
* - the contract must not be paused.
*/
function _mintShares(
address _recipient,
uint256 _sharesAmount
) internal returns (uint256 newTotalShares) {
require(_recipient != address(0), "MINT_TO_THE_ZERO_ADDRESS");
newTotalShares = _getTotalShares().add(_sharesAmount);
totalShares = newTotalShares;
shares[_recipient] = shares[_recipient].add(_sharesAmount);
// Notice: we're not emitting a Transfer event from the zero address here since shares mint
// works by taking the amount of tokens corresponding to the minted shares from all other
// token holders, proportionally to their share. The total supply of the token doesn't change
// as the result. This is equivalent to performing a send from each other token holder's
// address to `address`, but we cannot reflect this as it would require sending an unbounded
// number of events.
}
/**
* @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares.
* @dev This doesn't decrease the token total supply.
*
* Requirements:
*
* - `_account` cannot be the zero address.
* - `_account` must hold at least `_sharesAmount` shares.
* - the contract must not be paused.
*/
function _burnShares(
address _account,
uint256 _sharesAmount
) internal returns (uint256 newTotalShares) {
require(_account != address(0), "BURN_FROM_THE_ZERO_ADDRESS");
uint256 accountShares = shares[_account];
require(_sharesAmount <= accountShares, "BURN_AMOUNT_EXCEEDS_BALANCE");
uint256 preRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount);
newTotalShares = _getTotalShares().sub(_sharesAmount);
totalShares = newTotalShares;
shares[_account] = accountShares.sub(_sharesAmount);
uint256 postRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount);
emit SharesBurnt(
_account,
preRebaseTokenAmount,
postRebaseTokenAmount,
_sharesAmount
);
// Notice: we're not emitting a Transfer event to the zero address here since shares burn
// works by redistributing the amount of tokens corresponding to the burned shares between
// all other token holders. The total supply of the token doesn't change as the result.
// This is equivalent to performing a send from `address` to each other token holder address,
// but we cannot reflect this as it would require sending an unbounded number of events.
// We're emitting `SharesBurnt` event to provide an explicit rebase log record nonetheless.
}
}
Lybra.sol 610 lines
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.17;
import "./EUSD.sol";
import "./Governable.sol";
interface Ilido {
function submit(address _referral) external payable returns (uint256 StETH);
function withdraw(address _to) external returns (uint256 ETH);
function balanceOf(address _account) external view returns (uint256);
function transfer(address _recipient, uint256 _amount)
external
returns (bool);
function transferFrom(
address _sender,
address _recipient,
uint256 _amount
) external returns (bool);
}
interface LbrStakingPool {
function notifyRewardAmount(uint256 amount) external;
}
interface esLBRMinter {
function refreshReward(address user) external;
}
interface IPriceFeed {
function fetchPrice() external returns (uint256);
}
contract Lybra is EUSD, Governable {
uint256 public totalDepositedEther;
uint256 public lastReportTime;
uint256 public totalEUSDCirculation;
uint256 year = 86400 * 365;
uint256 public mintFeeApy = 150;
uint256 public safeCollateralRate = 160 * 1e18;
uint256 public immutable badCollateralRate = 150 * 1e18;
uint256 public redemptionFee = 50;
uint8 public keeperRate = 1;
mapping(address => uint256) public depositedEther;
mapping(address => uint256) borrowed;
mapping(address => bool) redemptionProvider;
uint256 public feeStored;
Ilido lido = Ilido(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84);
esLBRMinter public eslbrMinter;
LbrStakingPool public serviceFeePool;
event BorrowApyChanged(uint256 newApy);
event SafeCollateralRateChanged(uint256 newRatio);
event KeeperRateChanged(uint256 newSlippage);
event RedemptionFeeChanged(uint256 newSlippage);
event DepositEther(
address sponsor,
address indexed onBehalfOf,
uint256 amount,
uint256 timestamp
);
event WithdrawEther(
address sponsor,
address indexed onBehalfOf,
uint256 amount,
uint256 timestamp
);
event Mint(
address sponsor,
address indexed onBehalfOf,
uint256 amount,
uint256 timestamp
);
event Burn(
address sponsor,
address indexed onBehalfOf,
uint256 amount,
uint256 timestamp
);
event LiquidationRecord(
address provider,
address keeper,
address indexed onBehalfOf,
uint256 eusdamount,
uint256 LiquidateEtherAmount,
uint256 keeperReward,
bool superLiquidation,
uint256 timestamp
);
event LSDistribution(
uint256 stETHAdded,
uint256 payoutEUSD,
uint256 timestamp
);
event RedemptionProvider(address user, bool status);
event RigidRedemption(
address indexed caller,
address indexed provider,
uint256 eusdAmount,
uint256 etherAmount,
uint256 timestamp
);
event FeeDistribution(
address indexed feeAddress,
uint256 feeAmount,
uint256 timestamp
);
event ServiceFeePoolChanged(address pool, uint256 timestamp);
event ESLBRMinterChanged(address pool, uint256 timestamp);
constructor() {
gov = msg.sender;
}
function setBorrowApy(uint256 newApy) external onlyGov {
require(newApy <= 150, "Borrow APY cannot exceed 1.5%");
_saveReport();
mintFeeApy = newApy;
emit BorrowApyChanged(newApy);
}
/**
* @notice safeCollateralRate can be decided by DAO,starts at 160%
*/
function setSafeCollateralRate(uint256 newRatio) external onlyGov {
require(
newRatio >= 160 * 1e18,
"Safe CollateralRate should more than 160%"
);
safeCollateralRate = newRatio;
emit SafeCollateralRateChanged(newRatio);
}
/**
* @notice KeeperRate can be decided by DAO,1 means 1% of revenue
*/
function setKeeperRate(uint8 newRate) external onlyGov {
require(newRate <= 5, "Max Keeper reward is 5%");
keeperRate = newRate;
emit KeeperRateChanged(newRate);
}
/**
* @notice DAO sets RedemptionFee, 100 means 1%
*/
function setRedemptionFee(uint8 newFee) external onlyGov {
require(newFee <= 500, "Max Redemption Fee is 5%");
redemptionFee = newFee;
emit RedemptionFeeChanged(newFee);
}
function setLbrStakingPool(address addr) external onlyGov {
serviceFeePool = LbrStakingPool(addr);
emit ServiceFeePoolChanged(addr, block.timestamp);
}
function setESLBRMinter(address addr) external onlyGov {
eslbrMinter = esLBRMinter(addr);
emit ESLBRMinterChanged(addr, block.timestamp);
}
/**
* @notice User chooses to become a Redemption Provider
*/
function becomeRedemptionProvider(bool _bool) external {
eslbrMinter.refreshReward(msg.sender);
redemptionProvider[msg.sender] = _bool;
emit RedemptionProvider(msg.sender, _bool);
}
/**
* @notice Deposit ETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly
*
* Emits a `DepositEther` event.
*
* Requirements:
* - `onBehalfOf` cannot be the zero address.
* - `mintAmount` Send 0 if doesn't mint EUSD
* - msg.value Must be higher than 0.
*
* @dev Record the deposited ETH in the ratio of 1:1 and convert it into stETH.
*/
function depositEtherToMint(address onBehalfOf, uint256 mintAmount)
external
payable
{
require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS");
require(msg.value >= 1 ether, "Deposit should not be less than 1 ETH.");
//convert to steth
uint256 sharesAmount = lido.submit{value: msg.value}(gov);
require(sharesAmount > 0, "ZERO_DEPOSIT");
totalDepositedEther += msg.value;
depositedEther[onBehalfOf] += msg.value;
if (mintAmount > 0) {
_mintEUSD(onBehalfOf, onBehalfOf, mintAmount);
}
emit DepositEther(msg.sender, onBehalfOf, msg.value, block.timestamp);
}
/**
* @notice Deposit stETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly
* Emits a `DepositEther` event.
*
* Requirements:
* - `onBehalfOf` cannot be the zero address.
* - `stETHamount` Must be higher than 0.
* - `mintAmount` Send 0 if doesn't mint EUSD
* @dev Record the deposited stETH in the ratio of 1:1.
*/
function depositStETHToMint(
address onBehalfOf,
uint256 stETHamount,
uint256 mintAmount
) external {
require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS");
require(stETHamount >= 1 ether, "Deposit should not be less than 1 stETH.");
lido.transferFrom(msg.sender, address(this), stETHamount);
totalDepositedEther += stETHamount;
depositedEther[onBehalfOf] += stETHamount;
if (mintAmount > 0) {
_mintEUSD(onBehalfOf, onBehalfOf, mintAmount);
}
emit DepositEther(msg.sender, onBehalfOf, stETHamount, block.timestamp);
}
/**
* @notice Withdraw collateral assets to an address
* Emits a `WithdrawEther` event.
*
* Requirements:
* - `onBehalfOf` cannot be the zero address.
* - `amount` Must be higher than 0.
*
* @dev Withdraw stETH. Check user’s collateral rate after withdrawal, should be higher than `safeCollateralRate`
*/
function withdraw(address onBehalfOf, uint256 amount) external {
require(onBehalfOf != address(0), "WITHDRAW_TO_THE_ZERO_ADDRESS");
require(amount > 0, "ZERO_WITHDRAW");
require(depositedEther[msg.sender] >= amount, "Insufficient Balance");
totalDepositedEther -= amount;
depositedEther[msg.sender] -= amount;
lido.transfer(onBehalfOf, amount);
if (borrowed[msg.sender] > 0) {
_checkHealth(msg.sender);
}
emit WithdrawEther(msg.sender, onBehalfOf, amount, block.timestamp);
}
/**
* @notice The mint amount number of EUSD is minted to the address
* Emits a `Mint` event.
*
* Requirements:
* - `onBehalfOf` cannot be the zero address.
* - `amount` Must be higher than 0. Individual mint amount shouldn't surpass 10% when the circulation reaches 10_000_000
*/
function mint(address onBehalfOf, uint256 amount) public {
require(onBehalfOf != address(0), "MINT_TO_THE_ZERO_ADDRESS");
require(amount > 0, "ZERO_MINT");
_mintEUSD(msg.sender, onBehalfOf, amount);
if (
(borrowed[msg.sender] * 100) / totalSupply() > 10 &&
totalSupply() > 10_000_000 * 1e18
) revert("Mint Amount cannot be more than 10% of total circulation");
}
/**
* @notice Burn the amount of EUSD and payback the amount of minted EUSD
* Emits a `Burn` event.
* Requirements:
* - `onBehalfOf` cannot be the zero address.
* - `amount` Must be higher than 0.
* @dev Calling the internal`_repay`function.
*/
function burn(address onBehalfOf, uint256 amount) external {
require(onBehalfOf != address(0), "BURN_TO_THE_ZERO_ADDRESS");
_repay(msg.sender, onBehalfOf, amount);
}
/**
* @notice When overallCollateralRate is above 150%, Keeper liquidates borrowers whose collateral rate is below badCollateralRate, using EUSD provided by Liquidation Provider.
*
* Requirements:
* - onBehalfOf Collateral Rate should be below badCollateralRate
* - etherAmount should be less than 50% of collateral
* - provider should authorize Lybra to utilize EUSD
* @dev After liquidation, borrower's debt is reduced by etherAmount * etherPrice, collateral is reduced by the etherAmount corresponding to 110% of the value. Keeper gets keeperRate / 110 of Liquidation Reward and Liquidator gets the remaining stETH.
*/
function liquidation(
address provider,
address onBehalfOf,
uint256 etherAmount
) external {
uint256 etherPrice = _etherPrice();
uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] *
etherPrice *
100) / borrowed[onBehalfOf];
require(
onBehalfOfCollateralRate < badCollateralRate,
"Borrowers collateral rate should below badCollateralRate"
);
require(
etherAmount * 2 <= depositedEther[onBehalfOf],
"a max of 50% collateral can be liquidated"
);
uint256 eusdAmount = (etherAmount * etherPrice) / 1e18;
require(
allowance(provider, address(this)) >= eusdAmount,
"provider should authorize to provide liquidation EUSD"
);
_repay(provider, onBehalfOf, eusdAmount);
uint256 reducedEther = (etherAmount * 11) / 10;
totalDepositedEther -= reducedEther;
depositedEther[onBehalfOf] -= reducedEther;
uint256 reward2keeper;
if (provider == msg.sender) {
lido.transfer(msg.sender, reducedEther);
} else {
reward2keeper = (reducedEther * keeperRate) / 110;
lido.transfer(provider, reducedEther - reward2keeper);
lido.transfer(msg.sender, reward2keeper);
}
emit LiquidationRecord(
provider,
msg.sender,
onBehalfOf,
eusdAmount,
reducedEther,
reward2keeper,
false,
block.timestamp
);
}
/**
* @notice When overallCollateralRate is below badCollateralRate, borrowers with collateralRate below 125% could be fully liquidated.
* Emits a `LiquidationRecord` event.
*
* Requirements:
* - Current overallCollateralRate should be below badCollateralRate
* - `onBehalfOf`collateralRate should be below 125%
* @dev After Liquidation, borrower's debt is reduced by etherAmount * etherPrice, deposit is reduced by etherAmount * borrower's collateralRate. Keeper gets a liquidation reward of `keeperRate / borrower's collateralRate
*/
function superLiquidation(
address provider,
address onBehalfOf,
uint256 etherAmount
) external {
uint256 etherPrice = _etherPrice();
require(
(totalDepositedEther * etherPrice * 100) / totalSupply() <
badCollateralRate,
"overallCollateralRate should below 150%"
);
uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] *
etherPrice *
100) / borrowed[onBehalfOf];
require(
onBehalfOfCollateralRate < 125 * 1e18,
"borrowers collateralRate should below 125%"
);
require(
etherAmount <= depositedEther[onBehalfOf],
"total of collateral can be liquidated at most"
);
uint256 eusdAmount = (etherAmount * etherPrice) / 1e18;
if (onBehalfOfCollateralRate >= 1e20) {
eusdAmount = (eusdAmount * 1e20) / onBehalfOfCollateralRate;
}
require(
allowance(provider, address(this)) >= eusdAmount,
"provider should authorize to provide liquidation EUSD"
);
_repay(provider, onBehalfOf, eusdAmount);
totalDepositedEther -= etherAmount;
depositedEther[onBehalfOf] -= etherAmount;
uint256 reward2keeper;
if (
msg.sender != provider &&
onBehalfOfCollateralRate >= 1e20 + keeperRate * 1e18
) {
reward2keeper =
((etherAmount * keeperRate) * 1e18) /
onBehalfOfCollateralRate;
lido.transfer(msg.sender, reward2keeper);
}
lido.transfer(provider, etherAmount - reward2keeper);
emit LiquidationRecord(
provider,
msg.sender,
onBehalfOf,
eusdAmount,
etherAmount,
reward2keeper,
true,
block.timestamp
);
}
/**
* @notice When stETH balance increases through LSD or other reasons, the excess income is sold for EUSD, allocated to EUSD holders through rebase mechanism.
* Emits a `LSDistribution` event.
*
* *Requirements:
* - stETH balance in the contract cannot be less than totalDepositedEther after exchange.
* @dev Income is used to cover accumulated Service Fee first.
*/
function excessIncomeDistribution(uint256 payAmount) external {
uint256 payoutEther = (payAmount * 1e18) / _etherPrice();
require(
payoutEther <=
lido.balanceOf(address(this)) - totalDepositedEther &&
payoutEther > 0,
"Only LSD excess income can be exchanged"
);
uint256 income = feeStored + _newFee();
if (payAmount > income) {
_transfer(msg.sender, address(serviceFeePool), income);
serviceFeePool.notifyRewardAmount(income);
uint256 sharesAmount = getSharesByMintedEUSD(payAmount - income);
if (sharesAmount == 0) {
//EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1
sharesAmount = payAmount - income;
}
//Income is distributed to LBR staker.
_burnShares(msg.sender, sharesAmount);
feeStored = 0;
emit FeeDistribution(
address(serviceFeePool),
income,
block.timestamp
);
} else {
_transfer(msg.sender, address(serviceFeePool), payAmount);
serviceFeePool.notifyRewardAmount(payAmount);
feeStored = income - payAmount;
emit FeeDistribution(
address(serviceFeePool),
payAmount,
block.timestamp
);
}
lastReportTime = block.timestamp;
lido.transfer(msg.sender, payoutEther);
emit LSDistribution(payoutEther, payAmount, block.timestamp);
}
/**
* @notice Choose a Redemption Provider, Rigid Redeem `eusdAmount` of EUSD and get 1:1 value of stETH
* Emits a `RigidRedemption` event.
*
* *Requirements:
* - `provider` must be a Redemption Provider
* - `provider`debt must equal to or above`eusdAmount`
* @dev Service Fee for rigidRedemption `redemptionFee` is set to 0.5% by default, can be revised by DAO.
*/
function rigidRedemption(address provider, uint256 eusdAmount) external {
require(
redemptionProvider[provider],
"provider is not a RedemptionProvider"
);
require(
borrowed[provider] >= eusdAmount,
"eusdAmount cannot surpass providers debt"
);
uint256 etherPrice = _etherPrice();
uint256 providerCollateralRate = (depositedEther[provider] *
etherPrice *
100) / borrowed[provider];
require(
providerCollateralRate >= 100 * 1e18,
"provider's collateral rate should more than 100%"
);
_repay(msg.sender, provider, eusdAmount);
uint256 etherAmount = (((eusdAmount * 1e18) / etherPrice) *
(10000 - redemptionFee)) / 10000;
depositedEther[provider] -= etherAmount;
totalDepositedEther -= etherAmount;
lido.transfer(msg.sender, etherAmount);
emit RigidRedemption(
msg.sender,
provider,
eusdAmount,
etherAmount,
block.timestamp
);
}
/**
* @dev Refresh LBR reward before adding providers debt. Refresh Lybra generated service fee before adding totalEUSDCirculation. Check providers collateralRate cannot below `safeCollateralRate`after minting.
*/
function _mintEUSD(
address _provider,
address _onBehalfOf,
uint256 _amount
) internal {
uint256 sharesAmount = getSharesByMintedEUSD(_amount);
if (sharesAmount == 0) {
//EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1
sharesAmount = _amount;
}
eslbrMinter.refreshReward(_provider);
borrowed[_provider] += _amount;
_mintShares(_onBehalfOf, sharesAmount);
_saveReport();
totalEUSDCirculation += _amount;
_checkHealth(_provider);
emit Mint(msg.sender, _onBehalfOf, _amount, block.timestamp);
}
/**
* @notice Burn _provideramount EUSD to payback minted EUSD for _onBehalfOf.
*
* @dev Refresh LBR reward before reducing providers debt. Refresh Lybra generated service fee before reducing totalEUSDCirculation.
*/
function _repay(
address _provider,
address _onBehalfOf,
uint256 _amount
) internal {
require(
borrowed[_onBehalfOf] >= _amount,
"Repaying Amount Surpasses Borrowing Amount"
);
uint256 sharesAmount = getSharesByMintedEUSD(_amount);
_burnShares(_provider, sharesAmount);
eslbrMinter.refreshReward(_onBehalfOf);
borrowed[_onBehalfOf] -= _amount;
_saveReport();
totalEUSDCirculation -= _amount;
emit Burn(_provider, _onBehalfOf, _amount, block.timestamp);
}
function _saveReport() internal {
feeStored += _newFee();
lastReportTime = block.timestamp;
}
/**
* @dev Get USD value of current collateral asset and minted EUSD through price oracle / Collateral asset USD value must higher than safe Collateral Rate.
*/
function _checkHealth(address user) internal {
if (
((depositedEther[user] * _etherPrice() * 100) / borrowed[user]) <
safeCollateralRate
) revert("collateralRate is Below safeCollateralRate");
}
/**
* @dev Return USD value of current ETH through Liquity PriceFeed Contract.
* https://etherscan.io/address/0x4c517D4e2C851CA76d7eC94B805269Df0f2201De#code
*/
function _etherPrice() internal returns (uint256) {
return
IPriceFeed(0x4c517D4e2C851CA76d7eC94B805269Df0f2201De).fetchPrice();
}
function _newFee() internal view returns (uint256) {
return
(totalEUSDCirculation *
mintFeeApy *
(block.timestamp - lastReportTime)) /
year /
10000;
}
/**
* @dev total circulation of EUSD
*/
function _getTotalMintedEUSD() internal view override returns (uint256) {
return totalEUSDCirculation;
}
function getBorrowedOf(address user) external view returns (uint256) {
return borrowed[user];
}
function isRedemptionProvider(address user) external view returns (bool) {
return redemptionProvider[user];
}
}
IERC20.sol 78 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
SafeMath.sol 215 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
Governable.sol 18 lines
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.17;
contract Governable {
address public gov;
event GovernanceAuthorityTransfer(address newGov);
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
emit GovernanceAuthorityTransfer(_gov);
}
}
Read Contract
allowance 0xdd62ed3e → uint256
badCollateralRate 0xac0799dd → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
depositedEther 0x482ed2a2 → uint256
eslbrMinter 0xfd55276a → address
feeStored 0xb0df27fd → uint256
getBorrowedOf 0x05ad8308 → uint256
getMintedEUSDByShares 0xbaab9dab → uint256
getSharesByMintedEUSD 0xb85364e5 → uint256
getTotalShares 0xd5002f2e → uint256
gov 0x12d43a51 → address
isRedemptionProvider 0x7890444c → bool
keeperRate 0x78cf2cff → uint8
lastReportTime 0xe0115d0d → uint256
mintFeeApy 0x6da6d8f1 → uint256
name 0x06fdde03 → string
redemptionFee 0x458f5815 → uint256
safeCollateralRate 0x2d471940 → uint256
serviceFeePool 0x6cfa6a75 → address
sharesOf 0xf5eb42dc → uint256
symbol 0x95d89b41 → string
totalDepositedEther 0x9b4d51f4 → uint256
totalEUSDCirculation 0x733346e5 → uint256
totalSupply 0x18160ddd → uint256
Write Contract 23 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address _spender
uint256 _amount
returns: bool
becomeRedemptionProvider 0xe914555e
bool _bool
burn 0x9dc29fac
address onBehalfOf
uint256 amount
decreaseAllowance 0xa457c2d7
address _spender
uint256 _subtractedValue
returns: bool
depositEtherToMint 0x24bc1090
address onBehalfOf
uint256 mintAmount
depositStETHToMint 0x9e48d6cc
address onBehalfOf
uint256 stETHamount
uint256 mintAmount
excessIncomeDistribution 0x6bef22ee
uint256 payAmount
increaseAllowance 0x39509351
address _spender
uint256 _addedValue
returns: bool
liquidation 0x96171e59
address provider
address onBehalfOf
uint256 etherAmount
mint 0x40c10f19
address onBehalfOf
uint256 amount
rigidRedemption 0x1a7b9ef5
address provider
uint256 eusdAmount
setBorrowApy 0x8a70a3c6
uint256 newApy
setESLBRMinter 0x99f009a2
address addr
setGov 0xcfad57a2
address _gov
setKeeperRate 0xba129df4
uint8 newRate
setLbrStakingPool 0x0359d4cc
address addr
setRedemptionFee 0x44ac84b0
uint8 newFee
setSafeCollateralRate 0x4b3094f5
uint256 newRatio
superLiquidation 0xc05ebc2c
address provider
address onBehalfOf
uint256 etherAmount
transfer 0xa9059cbb
address _recipient
uint256 _amount
returns: bool
transferFrom 0x23b872dd
address _sender
address _recipient
uint256 _amount
returns: bool
transferShares 0x8fcb4e5b
address _recipient
uint256 _sharesAmount
returns: uint256
withdraw 0xf3fef3a3
address onBehalfOf
uint256 amount
Token Balances (1)
View Transfers →Recent Transactions
No transactions found for this address