Address Contract Verified
Address
0xFeD347E7Ecb227eaaffae7b428C0447981283156
Balance
0 ETH
Nonce
1
Code Size
15859 bytes
Creator
0x3210CF08...451F at tx 0xc89090bf...7051e4
Indexed Transactions
0 (1 on-chain, 0.6% indexed)
Contract Bytecode
15859 bytes
0x6080604052600436106103dd5760003560e01c806380c48d13116101ff578063ba0cf0ab11610119578063d547741f116100a6578063d547741f14610c8e578063e69a5f4714610cae578063ee40738814610cce578063ee9e68bb14610cee578063ef12167014610d0e578063efe6b38114610d2e578063f3782f2114610d50578063f6b650b114610d70578063f89c081e14610d90578063ff8b11c914610db057600080fd5b8063ba0cf0ab14610b4c578063bb452ef814610b6c578063bba53d0514610b8e578063bc16629214610bae578063c0c53b8b14610bce578063c8a2cfc014610bee578063c8df617914610c0e578063cd7b1e8c14610c2e578063d3a9316014610c4e578063d4f417a214610c6e57600080fd5b80639cc487d7116101975780639cc487d714610a175780639d207b1c14610a37578063a098baba14610a57578063a217fddf14610a77578063a34bfcd114610a8c578063a6cd751c14610aac578063b0b50c2314610acc578063b29aaf7514610aec578063b3c2d50b14610b0c578063b423ac9d14610b2c57600080fd5b806380c48d13146108f757806381100ddc146109175780638435ab74146109375780638866d13014610957578063895752dd1461097757806390b8e0aa1461099757806391d14854146109b7578063935dcfc7146109d75780639c871b31146109f757600080fd5b8063380d9219116102fb5780634f1ef286116102885780634f1ef286146107bb57806352d1902d146107ce57806354fd4d50146107e35780635ba1a507146108175780635bbfdfa0146108375780635bcf235d146108575780635be4918a146108775780635ed17df6146108975780635fdd1487146108b7578063703d84ab146108d757600080fd5b8063380d92191461067b578063381b414c1461069b578063383a8ab1146106bb5780633a094f36146106db5780633b8d409b146106fb5780633f2194cf1461071b5780634203247e1461073b578063481a750a1461075b5780634960a11c1461077b5780634b7025f71461079b57600080fd5b8063201a662511610379578063201a662514610519578063248a9ca31461054957806327df3d3e14610579578063299cf9621461059b5780632b6cea31146105bb5780632ba20e16146105db5780632f2ff15d146105fb5780632f5d386f1461061b57806336568abe1461063b5780633659cfe61461065b57600080fd5b80630190d5cf146103e257806301ffc9a71461040457806303655a0c1461043957806303e852b114610459578063046b6ef31461047957806307fec0e3146104995780630954cf03146104b95780630a1d9912146104d9578063158b36f6146104f9575b600080fd5b3480156103ee57600080fd5b506104026103fd366004612efb565b610dd0565b005b34801561041057600080fd5b5061042461041f366004612f30565b610e29565b60405190151581526020015b60405180910390f35b34801561044557600080fd5b50610402610454366004612f5a565b610e60565b34801561046557600080fd5b50610402610474366004612f7c565b610eb7565b34801561048557600080fd5b50610402610494366004612ff0565b610f02565b3480156104a557600080fd5b506104026104b4366004612f5a565b610f6d565b3480156104c557600080fd5b506104026104d4366004613087565b610fbb565b3480156104e557600080fd5b506104026104f43660046130a0565b61100b565b34801561050557600080fd5b506104026105143660046130fc565b6110cd565b34801561052557600080fd5b5061053b600080516020613cf783398151915281565b604051908152602001610430565b34801561055557600080fd5b5061053b610564366004613087565b600090815260c9602052604090206001015490565b34801561058557600080fd5b5061053b600080516020613d3783398151915281565b3480156105a757600080fd5b506104026105b6366004613142565b61112c565b3480156105c757600080fd5b506104026105d636600461318f565b6111a2565b3480156105e757600080fd5b506104026105f6366004612f7c565b611236565b34801561060757600080fd5b506104026106163660046131f2565b611281565b34801561062757600080fd5b50610402610636366004612f5a565b6112ab565b34801561064757600080fd5b506104026106563660046131f2565b6112f9565b34801561066757600080fd5b5061040261067636600461321e565b61137c565b34801561068757600080fd5b50610402610696366004612efb565b611444565b3480156106a757600080fd5b506104026106b6366004613087565b61148f565b3480156106c757600080fd5b506104026106d6366004613239565b6114d7565b3480156106e757600080fd5b506104026106f6366004613087565b611539565b34801561070757600080fd5b506104026107163660046132a9565b611581565b34801561072757600080fd5b506104026107363660046131f2565b6115ce565b34801561074757600080fd5b506104026107563660046130fc565b611617565b34801561076757600080fd5b50610402610776366004613087565b611666565b34801561078757600080fd5b50610402610796366004612f5a565b6116ae565b3480156107a757600080fd5b506104026107b6366004612f5a565b6116fc565b6104026107c9366004613303565b61174a565b3480156107da57600080fd5b5061053b6117ff565b3480156107ef57600080fd5b5060408051808201825260058152640302e392e360dc1b6020820152905161043091906133e8565b34801561082357600080fd5b50610402610832366004612f5a565b6118ad565b34801561084357600080fd5b50610402610852366004613087565b6118fb565b34801561086357600080fd5b50610402610872366004612f5a565b611943565b34801561088357600080fd5b50610402610892366004612efb565b611991565b3480156108a357600080fd5b506104026108b2366004612f7c565b6119dc565b3480156108c357600080fd5b506104026108d2366004612f5a565b611a27565b3480156108e357600080fd5b506104026108f2366004612f5a565b611a75565b34801561090357600080fd5b50610402610912366004613087565b611ac3565b34801561092357600080fd5b50610402610932366004612f5a565b611b0b565b34801561094357600080fd5b50610402610952366004612f5a565b611b59565b34801561096357600080fd5b5061040261097236600461341b565b611ba7565b34801561098357600080fd5b50610402610992366004613087565b611c32565b3480156109a357600080fd5b506104026109b2366004612f5a565b611c7a565b3480156109c357600080fd5b506104246109d23660046131f2565b611cc8565b3480156109e357600080fd5b506104026109f2366004612f5a565b611cf3565b348015610a0357600080fd5b50610402610a123660046131f2565b611d41565b348015610a2357600080fd5b50610402610a32366004613485565b611d8a565b348015610a4357600080fd5b50610402610a52366004612efb565b611e13565b348015610a6357600080fd5b50610402610a72366004613500565b611e5e565b348015610a8357600080fd5b5061053b600081565b348015610a9857600080fd5b50610402610aa7366004612f5a565b611eb9565b348015610ab857600080fd5b50610402610ac7366004613577565b611f07565b348015610ad857600080fd5b50610402610ae7366004613657565b611f75565b348015610af857600080fd5b50610402610b07366004613087565b611fed565b348015610b1857600080fd5b50610402610b273660046136af565b612035565b348015610b3857600080fd5b50610402610b47366004612f5a565b61208d565b348015610b5857600080fd5b50610402610b67366004612f7c565b6120db565b348015610b7857600080fd5b5061053b600080516020613d1783398151915281565b348015610b9a57600080fd5b50610402610ba9366004612efb565b612126565b348015610bba57600080fd5b50610402610bc9366004613087565b612171565b348015610bda57600080fd5b50610402610be93660046136d9565b6121b9565b348015610bfa57600080fd5b50610402610c09366004613705565b612320565b348015610c1a57600080fd5b50610402610c29366004613087565b6123a0565b348015610c3a57600080fd5b50610402610c493660046130fc565b6123e8565b348015610c5a57600080fd5b50610402610c69366004612efb565b612437565b348015610c7a57600080fd5b50610402610c8936600461376f565b612482565b348015610c9a57600080fd5b50610402610ca93660046131f2565b6124e7565b348015610cba57600080fd5b50610402610cc93660046131f2565b61250c565b348015610cda57600080fd5b50610402610ce936600461321e565b612555565b348015610cfa57600080fd5b50610402610d093660046132a9565b612585565b348015610d1a57600080fd5b50610402610d293660046137aa565b6125d2565b348015610d3a57600080fd5b5061053b600080516020613d7783398151915281565b348015610d5c57600080fd5b50610402610d6b3660046137ed565b61263d565b348015610d7c57600080fd5b50610402610d8b3660046131f2565b61269f565b348015610d9c57600080fd5b50610402610dab3660046131f2565b6126e8565b348015610dbc57600080fd5b50610402610dcb3660046130fc565b612731565b600080516020613d77833981519152610de881612780565b7f18356b4e84c1a7757d8a4d3eb4b02291287fc5dea2643c2dbd10a83b6640138d848484604051610e1b93929190613812565b60405180910390a150505050565b60006001600160e01b03198216637965db0b60e01b1480610e5a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020613d77833981519152610e7881612780565b60408051848152602081018490527f4cb372669f2973ed367a6eabc152fa74bb70238701ea34d2b4aeda8e3069f5bf91015b60405180910390a1505050565b600080516020613d77833981519152610ecf81612780565b7f550c99f14e2d6b02b095f180d3d23f4c2af030ba6ba708ca4f0902e774a11ce6848484604051610e1b93929190613831565b600080516020613d77833981519152610f1a81612780565b7f8250bccfd13694f23eab8824603cff469b09742a4bbf78c322d2ce53adac39568a8a8a8a8a8a8a8a8a604051610f5999989796959493929190613870565b60405180910390a150505050505050505050565b600080516020613d77833981519152610f8581612780565b60408051848152602081018490527fb9380957f9b8c08e51071c89308a6037c2c026d44d132fd21ffc6d33ccf937ad9101610eaa565b600080516020613d77833981519152610fd381612780565b6040518281527f42bdbb8a5a892e5e9ce48f4e8d72e84ac4e66d9d9c398a2b42b441eeba8f6c53906020015b60405180910390a15050565b600080516020613d7783398151915261102381612780565b7f883435c56acd8a7f195790129e33085f436925ef33028c425097430c41c9a763848435611057604087016020880161321e565b6040870135608088013561107160e08a0160c08b0161321e565b61107e60e08b018b6138cb565b61108b60a08d018d6138cb565b8d61010001602081019061109f9190613914565b8e6101200160208101906110b3919061321e565b8e604051610e1b9d9c9b9a999897969594939291906139a8565b600080516020613d778339815191526110e581612780565b7ffb2632db0db153ba9642ae80923335783475d580e6b190459c74d027a67c2683868686868660405161111c959493929190613a2c565b60405180910390a1505050505050565b600080516020613d7783398151915261114481612780565b604080518681526001600160a01b0380871660208301528086169282019290925290831660608201527ff0b4613c883862708448c163df972e9b692d08d3601fc3f3c560cbbdbf8909cd906080015b60405180910390a15050505050565b600080516020613d778339815191526111ba81612780565b604080518a8152602081018a90526001600160a01b03891691810191909152606081018790526080810186905260a0810185905260c0810184905260e081018390527f8ddb74faeea51390b27e370bb28d4bebe2f4cda8c2f37a9845c7075a6f0d069d90610100015b60405180910390a1505050505050505050565b600080516020613d7783398151915261124e81612780565b7f21cb9269778ea9b9ccd375a1cdcd3e7c3ade6cbffb4747e282098145a030812f848484604051610e1b93929190613831565b600082815260c9602052604090206001015461129c81612780565b6112a6838361278a565b505050565b600080516020613d778339815191526112c381612780565b60408051848152602081018490527f38162ca5c14060f2fd4515bbfa2bc37f177e9bf99f3f27e01300242defb85e199101610eaa565b6001600160a01b038116331461136e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6113788282612810565b5050565b6001600160a01b037f000000000000000000000000fed347e7ecb227eaaffae7b428c04479812831561630036113c45760405162461bcd60e51b815260040161136590613a58565b7f000000000000000000000000fed347e7ecb227eaaffae7b428c04479812831566001600160a01b03166113f6612877565b6001600160a01b03161461141c5760405162461bcd60e51b815260040161136590613aa4565b61142581612893565b60408051600080825260208201909252611441918391906128ab565b50565b600080516020613d7783398151915261145c81612780565b7fdbb9c48771d5b1b07fe22034bfce432480b5498d451749ec45c7bff00b912a90848484604051610e1b93929190613812565b600080516020613d778339815191526114a781612780565b6040518281527f923868d7d67f7de679976c289ba367c773803b9d055907f61804f053c316b54e90602001610fff565b600080516020613d778339815191526114ef81612780565b7f2dfe486d519f5a272aaf38a6e198982c62c067b0aaf16ef00995eb0c9608ed8487878787878760405161152896959493929190613af0565b60405180910390a150505050505050565b600080516020613d7783398151915261155181612780565b6040518281527f4fa944cad6a7c488a0451c093ab988043012d5d8f1a7319652b5e726a946682e90602001610fff565b600080516020613d7783398151915261159981612780565b7f15197825651b2af3101ed0faa9b517b01be26768ea57de5d2a33178674353b33858585856040516111939493929190613b30565b600080516020613d778339815191526115e681612780565b7f9133b24d5dd7d39c3dbf216edd3325fdad90de393009cb40695019a1169867b28383604051610eaa929190613b55565b600080516020613d7783398151915261162f81612780565b7f669ba1268a0b43cb1577502790d554a58aea74a069eb86abc2d7a2ea5a025301868686868660405161111c959493929190613a2c565b600080516020613d7783398151915261167e81612780565b6040518281527f5b5fca86b3aee96d14a273715d01b8759e3bc66349f5162e8c8b290a1c9e560690602001610fff565b600080516020613d778339815191526116c681612780565b60408051848152602081018490527fd7fecb56a08ad38ae5050da0d957b9fad736a03eb2fc16f605f832eaed23bc359101610eaa565b600080516020613d7783398151915261171481612780565b60408051848152602081018490527f79e34f33671ed8d059f04598f89966a956fdc152fc587848dc23e16787cfb6c59101610eaa565b6001600160a01b037f000000000000000000000000fed347e7ecb227eaaffae7b428c04479812831561630036117925760405162461bcd60e51b815260040161136590613a58565b7f000000000000000000000000fed347e7ecb227eaaffae7b428c04479812831566001600160a01b03166117c4612877565b6001600160a01b0316146117ea5760405162461bcd60e51b815260040161136590613aa4565b6117f382612893565b611378828260016128ab565b6000306001600160a01b037f000000000000000000000000fed347e7ecb227eaaffae7b428c0447981283156161461189a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401611365565b50600080516020613d5783398151915290565b600080516020613d778339815191526118c581612780565b60408051848152602081018490527f573a70eeec6e07fd422e155c2b92f7012a06ee46176b108c31c6826b44d571cd9101610eaa565b600080516020613d7783398151915261191381612780565b6040518281527fb749ced905d6fe87d115e2c48c3efbcb13d77fc3654441d4a81de4f8ceee275b90602001610fff565b600080516020613d7783398151915261195b81612780565b60408051848152602081018490527fa53133b07bde3a47cff8a1004bc1acc5b3884f6a1e45c4ccdeb8b92a854184ce9101610eaa565b600080516020613d778339815191526119a981612780565b7fbe428a2d4f6cb996fe8767325ef30410284d3a3a09a000865e83e4eece645dd3848484604051610e1b93929190613812565b600080516020613d778339815191526119f481612780565b7fb3ebd87d3fef97d92fc82e0b1996ba45402216ffa8ea85137ec66a4609c4b263848484604051610e1b93929190613831565b600080516020613d77833981519152611a3f81612780565b60408051848152602081018490527f715523b92a5abc36945ae38ab2cca4d265a7ce1aa7c9a0fd9747f42bdf255ace9101610eaa565b600080516020613d77833981519152611a8d81612780565b60408051848152602081018490527fe2bc8291b28ccad777530d8ac7440bc8f29735ce807af17b821da0b94f26711a9101610eaa565b600080516020613d77833981519152611adb81612780565b6040518281527f218ce7e5b70471b08b6d774245b7a4a9c288c83ff6ab02c8509342f7dc06176990602001610fff565b600080516020613d77833981519152611b2381612780565b60408051848152602081018490527f1d904d6f9ecc7452486ebb6d1f63189675e54680bba46562d0da74b43f8df2559101610eaa565b600080516020613d77833981519152611b7181612780565b60408051848152602081018490527ff5c431abbfeb6cd8af5d67ad8864ba52b285633aaebfb34cd7422c528a83c7ae9101610eaa565b600080516020613d77833981519152611bbf81612780565b60408051898152602081018990526001600160a01b03881691810191909152606081018690526080810185905260a0810184905260c081018390527f7af3beb7a58ba96a83c822c247144dfdddca4af697243bbc2f9245d733eb82cb9060e0015b60405180910390a15050505050505050565b600080516020613d17833981519152611c4a81612780565b6040518281527f5eb87a0197fe36cc187c06ce9cf9cebe521d3a9da4915b8bfae50a6cd37c2e8090602001610fff565b600080516020613d77833981519152611c9281612780565b60408051848152602081018490527f72537d0556d5c431a7afa30288434308cbe9d709fdef10fb9712c48687f3d1719101610eaa565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020613d77833981519152611d0b81612780565b60408051848152602081018490527faec44ae25a1c32d3f76be6d66556a2635bd60bd7aea309a9b13b4d61be2212c49101610eaa565b600080516020613d77833981519152611d5981612780565b7fe177334a742058973ac6246b6b9e750df4aa9b547f0a2f447a0ececbf056daed8383604051610eaa929190613b55565b600080516020613d77833981519152611da281612780565b604080518a81526001600160a01b03808b166020830152808a169282019290925260608101889052908616608082015260a0810185905260c0810184905282151560e08201527f530fe3fc76341ab8477a985534c803f688f0590f9c91115a2fea617bd40aa0c39061010001611223565b600080516020613d77833981519152611e2b81612780565b7fcfd5fa13e90365bcc17eb90ef47600b4a6ed04057d87c034599a321fc5f0b1e2848484604051610e1b93929190613812565b600080516020613d77833981519152611e7681612780565b604080518581528415156020820152831515918101919091527f54ff901f77ead22848ed8d5dae609e337cb267a5b774d34a3f7daf180596745090606001610e1b565b600080516020613d77833981519152611ed181612780565b60408051848152602081018490527fd111098c0fa8745cbcae57a08c03062a31f81591ed19f70aed2e701938a331a99101610eaa565b600080516020613d77833981519152611f1f81612780565b7ffb09eb2d7a3a6d2704aa859f50b573cfcb6363d9cc9791d20b0d22c8d52008ba8b8b8b8b8b8b8b8b8b8b604051611f609a99989796959493929190613b6c565b60405180910390a15050505050505050505050565b600080516020613d77833981519152611f8d81612780565b60408051888152602081018890526001600160a01b038088169282019290925290851660608201526080810184905260a081018390527f78a6e161147110b6357c57aea6938b64a6a1dcd83962b23d9d4d9190770a05009060c001611528565b600080516020613d7783398151915261200581612780565b6040518281527f8a6af0ae5a1f9334c9c6123d9a37c773bdd95e2ab697e72683ea7ef479b21a1a90602001610fff565b600080516020613d7783398151915261204d81612780565b604080516001600160a01b038086168252841660208201527f334dca0f6cb5389b53efbc3f727055ae657a90e47cc8a46d3ecf089f89f9ebc99101610eaa565b600080516020613d778339815191526120a581612780565b60408051848152602081018490527f58617285cbcb0f5960c448dee13f229bf44cadba510e9349eadf49e78c18c39c9101610eaa565b600080516020613d778339815191526120f381612780565b7f80e5486d5e04b2703fbae1576de3bd1c3a8f77e6a53d7704be8d2210a6a4e819848484604051610e1b93929190613831565b600080516020613d7783398151915261213e81612780565b7f6ef7767f01e84b1180248c767524f6dfcc371911fa17fe326fc7f1f45adf91d7848484604051610e1b93929190613812565b600080516020613d1783398151915261218981612780565b6040518281527f1fe837719388bf91face89c0a8097c85fa082c7dc7fd763dd8cb6b574d2250d290602001610fff565b600054610100900460ff16158080156121d95750600054600160ff909116105b806121fa57506121e830612a16565b1580156121fa575060005460ff166001145b61225d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611365565b6000805460ff191660011790558015612280576000805461ff0019166101001790555b612288612a25565b612290612a25565b6122a8600080516020613cf78339815191528561278a565b6122c0600080516020613d378339815191528361278a565b6122d8600080516020613d178339815191528461278a565b801561231a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610e1b565b50505050565b600080516020613d7783398151915261233881612780565b60408051898152602081018990526001600160a01b0380891692820192909252606081018790526080810186905281851660a082015290831660c08201527f7ee1b10d692c6b73b6e299d557c9cb99871deec54d5a70280dfcde7bfd32ee339060e001611c20565b600080516020613d778339815191526123b881612780565b6040518281527f88013a9d1ee74e877ed421a1ed46fca7675405cac3f7fccb5f7ef46d584ca98190602001610fff565b600080516020613d7783398151915261240081612780565b7f5ce65f15ed0be04bce1b60eb829732ce05c7ea17b518aab91557947a78530573868686868660405161111c959493929190613a2c565b600080516020613d7783398151915261244f81612780565b7f1bd5a752d6a363fa20d52aede3a7129e4420130ef48e76649b7273eb395c8d29848484604051610e1b93929190613812565b600080516020613d7783398151915261249a81612780565b604080518681526001600160a01b0386166020820152908101849052606081018390527f252cbbf61f2b29d1bc56ced4c99f9bcf90d810413b98accdfad72919f293529590608001611193565b600082815260c9602052604090206001015461250281612780565b6112a68383612810565b600080516020613d7783398151915261252481612780565b7f24c79e47c308328c2edbd271bc595b5b6701b07c9c379de2bfb37e6fcd38ec4f8383604051610eaa929190613b55565b600080516020613d3783398151915261256d81612780565b611378600080516020613d778339815191528361278a565b600080516020613d7783398151915261259d81612780565b7f9da0324d151318fcc6c77acdcf1d7c2eb0940d0d9396aa9b8e39659bbeb6a9e3858585856040516111939493929190613b30565b600080516020613d778339815191526125ea81612780565b6040805188815260208101889052908101869052606081018590526080810184905260a081018390527ff8c0469ff6dafa46c8af119c7b4c548eee7e79d8227654225619faf3b27aedac9060c001611528565b600080516020613d7783398151915261265581612780565b604080518581526001600160a01b0380861660208301528416918101919091527fdecc7e057c5d85fc83c3b999807c8fa056685e1735fc067b08fa8c0919b1920f90606001610e1b565b600080516020613d778339815191526126b781612780565b7f451f6adec965618047f05ef3b89e7abd6475813f5639d1688a4c495c495ed9ad8383604051610eaa929190613b55565b600080516020613d7783398151915261270081612780565b7f6ec6fb7b867fd9cb9916625cfeb8e66768a8b50a824d3b601a0ddfc04836abb28383604051610eaa929190613b55565b600080516020613d7783398151915261274981612780565b7f21d26d59bcce3d9a4ab2914b73dbef7755fbff3d793d77ed1e7fba2e86bccbbe868686868660405161111c959493929190613a2c565b6114418133612a92565b6127948282611cc8565b61137857600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127cc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61281a8282611cc8565b1561137857600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080516020613d57833981519152546001600160a01b031690565b600080516020613cf783398151915261137881612780565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156128de576112a683612aeb565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612938575060408051601f3d908101601f1916820190925261293591810190613be5565b60015b61299b5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401611365565b600080516020613d578339815191528114612a0a5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401611365565b506112a6838383612b85565b6001600160a01b03163b151590565b600054610100900460ff16612a905760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611365565b565b612a9c8282611cc8565b61137857612aa981612baa565b612ab4836020612bbc565b604051602001612ac5929190613bfe565b60408051601f198184030181529082905262461bcd60e51b8252611365916004016133e8565b612af481612a16565b612b565760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401611365565b600080516020613d5783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612b8e83612d5e565b600082511180612b9b5750805b156112a65761231a8383612d9e565b6060610e5a6001600160a01b03831660145b60606000612bcb836002613c83565b612bd6906002613c9a565b6001600160401b03811115612bed57612bed6132ed565b6040519080825280601f01601f191660200182016040528015612c17576020820181803683370190505b509050600360fc1b81600081518110612c3257612c32613cad565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612c6157612c61613cad565b60200101906001600160f81b031916908160001a9053506000612c85846002613c83565b612c90906001613c9a565b90505b6001811115612d08576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612cc457612cc4613cad565b1a60f81b828281518110612cda57612cda613cad565b60200101906001600160f81b031916908160001a90535060049490941c93612d0181613cc3565b9050612c93565b508315612d575760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401611365565b9392505050565b612d6781612aeb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d578383604051806060016040528060278152602001613d97602791396060600080856001600160a01b031685604051612ddb9190613cda565b600060405180830381855af49150503d8060008114612e16576040519150601f19603f3d011682016040523d82523d6000602084013e612e1b565b606091505b5091509150612e2c86838387612e36565b9695505050505050565b60608315612ea3578251600003612e9c57612e5085612a16565b612e9c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611365565b5081612ead565b612ead8383612eb5565b949350505050565b815115612ec55781518083602001fd5b8060405162461bcd60e51b815260040161136591906133e8565b80356001600160a01b0381168114612ef657600080fd5b919050565b600080600060608486031215612f1057600080fd5b83359250612f2060208501612edf565b9150604084013590509250925092565b600060208284031215612f4257600080fd5b81356001600160e01b031981168114612d5757600080fd5b60008060408385031215612f6d57600080fd5b50508035926020909101359150565b600080600060608486031215612f9157600080fd5b505081359360208301359350604090920135919050565b60008083601f840112612fba57600080fd5b5081356001600160401b03811115612fd157600080fd5b602083019150836020828501011115612fe957600080fd5b9250929050565b60008060008060008060008060006101008a8c03121561300f57600080fd5b8935985061301f60208b01612edf565b975061302d60408b01612edf565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a01356001600160401b0381111561306457600080fd5b6130708c828d01612fa8565b915080935050809150509295985092959850929598565b60006020828403121561309957600080fd5b5035919050565b6000806000606084860312156130b557600080fd5b8335925060208401356001600160401b038111156130d257600080fd5b840161016081870312156130e557600080fd5b91506130f360408501612edf565b90509250925092565b600080600080600060a0868803121561311457600080fd5b8535945061312460208701612edf565b94979496505050506040830135926060810135926080909101359150565b6000806000806080858703121561315857600080fd5b8435935061316860208601612edf565b925061317660408601612edf565b915061318460608601612edf565b905092959194509250565b600080600080600080600080610100898b0312156131ac57600080fd5b88359750602089013596506131c360408a01612edf565b979a96995096976060810135975060808101359660a0820135965060c0820135955060e0909101359350915050565b6000806040838503121561320557600080fd5b8235915061321560208401612edf565b90509250929050565b60006020828403121561323057600080fd5b612d5782612edf565b60008060008060008060a0878903121561325257600080fd5b863595506020870135945061326960408801612edf565b93506060870135925060808701356001600160401b0381111561328b57600080fd5b61329789828a01612fa8565b979a9699509497509295939492505050565b600080600080608085870312156132bf57600080fd5b843593506132cf60208601612edf565b92506132dd60408601612edf565b9396929550929360600135925050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561331657600080fd5b61331f83612edf565b915060208301356001600160401b038082111561333b57600080fd5b818501915085601f83011261334f57600080fd5b813581811115613361576133616132ed565b604051601f8201601f19908116603f01168101908382118183101715613389576133896132ed565b816040528281528860208487010111156133a257600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156133df5781810151838201526020016133c7565b50506000910152565b60208152600082518060208401526134078160408501602087016133c4565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a03121561343657600080fd5b873596506020880135955061344d60408901612edf565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b80358015158114612ef657600080fd5b600080600080600080600080610100898b0312156134a257600080fd5b883597506134b260208a01612edf565b96506134c060408a01612edf565b9550606089013594506134d560808a01612edf565b935060a0890135925060c089013591506134f160e08a01613475565b90509295985092959890939650565b60008060006060848603121561351557600080fd5b8335925061352560208501613475565b91506130f360408501613475565b60008083601f84011261354557600080fd5b5081356001600160401b0381111561355c57600080fd5b6020830191508360208260051b8501011115612fe957600080fd5b60008060008060008060008060008060c08b8d03121561359657600080fd5b8a3599506135a660208c01612edf565b985060408b01356001600160401b03808211156135c257600080fd5b6135ce8e838f01613533565b909a50985060608d01359150808211156135e757600080fd5b6135f38e838f01613533565b909850965060808d013591508082111561360c57600080fd5b6136188e838f01613533565b909650945060a08d013591508082111561363157600080fd5b5061363e8d828e01613533565b915080935050809150509295989b9194979a5092959850565b60008060008060008060c0878903121561367057600080fd5b863595506020870135945061368760408801612edf565b935061369560608801612edf565b92506080870135915060a087013590509295509295509295565b600080604083850312156136c257600080fd5b6136cb83612edf565b915061321560208401612edf565b6000806000606084860312156136ee57600080fd5b6136f784612edf565b92506130e560208501612edf565b600080600080600080600060e0888a03121561372057600080fd5b873596506020880135955061373760408901612edf565b9450606088013593506080880135925061375360a08901612edf565b915061376160c08901612edf565b905092959891949750929550565b6000806000806080858703121561378557600080fd5b8435935061379560208601612edf565b93969395505050506040820135916060013590565b60008060008060008060c087890312156137c357600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060006060848603121561380257600080fd5b833592506130e560208501612edf565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101008b835260018060a01b03808c166020850152808b166040850152508860608401528760808401528660a08401528560c08401528060e08401526138bb8184018587613847565b9c9b505050505050505050505050565b6000808335601e198436030181126138e257600080fd5b8301803591506001600160401b038211156138fc57600080fd5b6020019150600581901b3603821315612fe957600080fd5b60006020828403121561392657600080fd5b612d5782613475565b8183526000602080850194508260005b8581101561396b576001600160a01b0361395883612edf565b168752958201959082019060010161393f565b509495945050505050565b81835260006001600160fb1b0383111561398f57600080fd5b8260051b80836020870137939093016020019392505050565b60006101608f83528e602084015260018060a01b03808f1660408501528d60608501528c6080850152808c1660a08501528160c08501526139ec8285018b8d61392f565b915083820360e0850152613a0182898b613976565b96151561010085015294851661012084015250509116610140909101529a9950505050505050505050565b9485526001600160a01b0393909316602085015260408401919091526060830152608082015260a00190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b86815285602082015260018060a01b038516604082015283606082015260a060808201526000613b2460a083018486613847565b98975050505050505050565b9384526001600160a01b03928316602085015291166040830152606082015260800190565b9182526001600160a01b0316602082015260400190565b8a81526001600160a01b038a16602082015260c060408201819052600090613b979083018a8c61392f565b8281036060840152613baa81898b613976565b90508281036080840152613bbf818789613976565b905082810360a0840152613bd4818587613976565b9d9c50505050505050505050505050565b600060208284031215613bf757600080fd5b5051919050565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613c308160178501602088016133c4565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613c618160288401602088016133c4565b01602801949350505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e5a57610e5a613c6d565b80820180821115610e5a57610e5a613c6d565b634e487b7160e01b600052603260045260246000fd5b600081613cd257613cd2613c6d565b506000190190565b60008251613cec8184602087016133c4565b919091019291505056fe793a6c9b7e0a9549c74edc2f9ae0dc50903dfaa9a56fb0116b27a8c71de3e2c6992b7de0144989096133dd485c7c23b149cc4ea0152d8a6481d467e12f7fc71f30d41a597cac127d8249d31298b50e481ee82c3f4a49ff93c76a22735aa9f3ad360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcd826f92d418c5d20475612da193d2053b8323c543561622a20bce855d857e321416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200f2a5cb0a30d718ba4baffb7e07bc7b85a5edaea7e70681bc11682e6053f2ee064736f6c63430008120033
Verified Source Code Full Match
Compiler: v0.8.18+commit.87f61d96
EVM: paris
Optimization: Yes (50 runs)
Versionable.sol 13 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @author TermLabs
/// @title Versionable contract
/// @notice This contract adds a version string that can be queried to all contracts that inherit from it.
/// @dev The version returned is replaced during the build process.
contract Versionable {
/// @dev This function returns the version of the contract.
function version() external view returns (string memory) {
return "0.9.0";
}
}
TermEventEmitter.sol 917 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
import {ITermEventEmitter} from "./interfaces/ITermEventEmitter.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
import {TermAuctionBid} from "./lib/TermAuctionBid.sol";
import {Versionable} from "./lib/Versionable.sol";
/// @author TermLabs
/// @title Term Event Emitter
/// @notice This contract is a centralized event emitter that records important events to the blockchain
/// @dev This contract operates at the protocol level and governs all instances of a Term Repo
contract TermEventEmitter is
ITermEventEmitter,
Initializable,
UUPSUpgradeable,
AccessControlUpgradeable,
Versionable
{
// ========================================================================
// = Access Role ======================================================
// ========================================================================
bytes32 public constant DEVOPS_ROLE = keccak256("DEVOPS_ROLE");
bytes32 public constant INITIALIZER_ROLE = keccak256("INITIALIZER_ROLE");
bytes32 public constant TERM_CONTRACT = keccak256("TERM_CONTRACT");
bytes32 public constant TERM_DELISTER = keccak256("TERM_DELISTER");
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(
address devopsWallet_,
address termDelister_,
address termInitializer_
) external initializer {
UUPSUpgradeable.__UUPSUpgradeable_init();
AccessControlUpgradeable.__AccessControl_init();
_grantRole(DEVOPS_ROLE, devopsWallet_);
_grantRole(INITIALIZER_ROLE, termInitializer_);
_grantRole(TERM_DELISTER, termDelister_);
}
function pairTermContract(
address termContract
) external onlyRole(INITIALIZER_ROLE) {
_grantRole(TERM_CONTRACT, termContract);
}
// ========================================================================
// = TermAuction Events ===================================================
// ========================================================================
/// @param termRepoId The id of the current Term Repo deployment being initialized
/// @param termAuctionId The id of the auction being initialized
/// @param termAuction The address of the auction contract being initialized
/// @param auctionEndTime The end time of the auction being initialized
/// @param version The version tag of the smart contract deployed
function emitTermAuctionInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuction,
uint256 auctionEndTime,
string calldata version
) external onlyRole(TERM_CONTRACT) {
emit TermAuctionInitialized(
termRepoId,
termAuctionId,
termAuction,
auctionEndTime,
version
);
}
/// @param termAuctionId A Term Auction id
/// @param id A bid id
/// @param amount The amount assigned to this bid
function emitBidAssigned(
bytes32 termAuctionId,
bytes32 id,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit BidAssigned(termAuctionId, id, amount);
}
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param amount The amount assigned to this offer
function emitOfferAssigned(
bytes32 termAuctionId,
bytes32 id,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit OfferAssigned(termAuctionId, id, amount);
}
/// @param termAuctionId The Term Auction id of auction completed
/// @param timestamp The timestamp of the current block
/// @param blockNumber The number of the current block
/// @param totalAssignedBids The number of assigned bids in the auction
/// @param totalAssignedOffers The number of assigned offers in the auction
/// @param clearingPrice The clearing price of the auction
function emitAuctionCompleted(
bytes32 termAuctionId,
uint256 timestamp,
uint256 blockNumber,
uint256 totalAssignedBids,
uint256 totalAssignedOffers,
uint256 clearingPrice
) external onlyRole(TERM_CONTRACT) {
emit AuctionCompleted(
termAuctionId,
timestamp,
blockNumber,
totalAssignedBids,
totalAssignedOffers,
clearingPrice
);
}
/// @param termAuctionId The id of the auction cancelled
/// @param nonViableAuction Auction not viable due to bid and offer prices not intersecting
/// @param auctionCancelledforWithdrawal Auction has been cancelled for manual fund withdrawal
function emitAuctionCancelled(
bytes32 termAuctionId,
bool nonViableAuction,
bool auctionCancelledforWithdrawal
) external onlyRole(TERM_CONTRACT) {
emit AuctionCancelled(
termAuctionId,
nonViableAuction,
auctionCancelledforWithdrawal
);
}
/// @param termAuctionId The id of the auction paused
/// @param termRepoId The Term Repo id associated with auction paused
function emitCompleteAuctionPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit CompleteAuctionPaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of the auction unpaused
/// @param termRepoId The Term Repo id associated with auction unpaused
function emitCompleteAuctionUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit CompleteAuctionUnpaused(termAuctionId, termRepoId);
}
// ========================================================================
// = TermAuctionBidLocker Events ==========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with BidLocker initialized
/// @param termAuctionId The Term Auction id associated with BidLocker initialized
/// @param termAuctionBidLocker The address of the TermAuctionBidLocker contract being intialized
/// @param auctionStartTime The time at which auction bids will be accepted for submission
/// @param revealTime The time at which sealed auction bids can be revealed
/// @param maxBidPrice The maximum bid price for the auction
/// @param minimumTenderAmount The minimum tender amount for the auction
/// @param dayCountFractionMantissa The day count fraction remainder
function emitTermAuctionBidLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionBidLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxBidPrice,
uint256 minimumTenderAmount,
uint256 dayCountFractionMantissa
) external onlyRole(TERM_CONTRACT) {
emit TermAuctionBidLockerInitialized(
termRepoId,
termAuctionId,
termAuctionBidLocker,
auctionStartTime,
revealTime,
maxBidPrice,
minimumTenderAmount,
dayCountFractionMantissa
);
}
/// @param termAuctionId A Term Auction id
/// @param bid A struct containing details of the locked bid
/// @param referralAddress The address of the referrer. Zero Address if none.
function emitBidLocked(
bytes32 termAuctionId,
TermAuctionBid calldata bid,
address referralAddress
) external onlyRole(TERM_CONTRACT) {
emit BidLocked(
termAuctionId,
bid.id,
bid.bidder,
bid.bidPriceHash,
bid.amount,
bid.purchaseToken,
bid.collateralTokens,
bid.collateralAmounts,
bid.isRollover,
bid.rolloverPairOffTermRepoServicer,
referralAddress
);
}
/// @param termAuctionId A Term Auction id
/// @param id The bid id
/// @param bidPrice The revealed price of the bid
function emitBidRevealed(
bytes32 termAuctionId,
bytes32 id,
uint256 bidPrice
) external onlyRole(TERM_CONTRACT) {
emit BidRevealed(termAuctionId, id, bidPrice);
}
/// @param termAuctionId A Term Auction id
/// @param id A bid id
function emitBidUnlocked(
bytes32 termAuctionId,
bytes32 id
) external onlyRole(TERM_CONTRACT) {
emit BidUnlocked(termAuctionId, id);
}
/// @param termAuctionId A Term Auction id
/// @param id A bid id
function emitBidInShortfall(
bytes32 termAuctionId,
bytes32 id
) external onlyRole(TERM_CONTRACT) {
emit BidInShortfall(termAuctionId, id);
}
/// @param termAuctionId The id of Term Auction where bid locking is paused
/// @param termRepoId The Term Repo id where bid locking is paused
function emitBidLockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit BidLockingPaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where bid locking is unpaused
/// @param termRepoId The Term Repo id where bid locking is unpaused
function emitBidLockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit BidLockingUnpaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where bid unlocking is paused
/// @param termRepoId The Term Repo id where bid unlocking is paused
function emitBidUnlockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit BidUnlockingPaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where bid unlocking is unpaused
/// @param termRepoId The Term Repo id where bid unlocking is unpaused
function emitBidUnlockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit BidUnlockingUnpaused(termAuctionId, termRepoId);
}
// ========================================================================
// = TermAuctionOfferLocker Events ========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with OfferLocker initialized
/// @param termAuctionId The Term Auction id associated with OfferLocker initialized
/// @param termAuctionOfferLocker The address of the TermAuctionOfferLocker contract being intialized
/// @param auctionStartTime The time at which auction bids will be accepted for submission
/// @param revealTime The time at which sealed auction bids can be revealed
/// @param maxOfferPrice The maximum offer price for the auction
/// @param minimumTenderAmount The minimum tender amount for the auction
function emitTermAuctionOfferLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionOfferLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxOfferPrice,
uint256 minimumTenderAmount
) external onlyRole(TERM_CONTRACT) {
emit TermAuctionOfferLockerInitialized(
termRepoId,
termAuctionId,
termAuctionOfferLocker,
auctionStartTime,
revealTime,
maxOfferPrice,
minimumTenderAmount
);
}
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param offeror The address of the offeror
/// @param offerPrice The offer price
/// @param amount The amount of purchase tokens offered
/// @param purchaseToken The address of the purchase token being offered
/// @param referralAddress The address of the referrer. Zero Address if none.
function emitOfferLocked(
bytes32 termAuctionId,
bytes32 id,
address offeror,
bytes32 offerPrice,
uint256 amount,
address purchaseToken,
address referralAddress
) external onlyRole(TERM_CONTRACT) {
emit OfferLocked(
termAuctionId,
id,
offeror,
offerPrice,
amount,
purchaseToken,
referralAddress
);
}
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param offerPrice The offer price revealed
function emitOfferRevealed(
bytes32 termAuctionId,
bytes32 id,
uint256 offerPrice
) external onlyRole(TERM_CONTRACT) {
emit OfferRevealed(termAuctionId, id, offerPrice);
}
/// @param termAuctionId A Term Auction id
/// @param id An offer id
function emitOfferUnlocked(
bytes32 termAuctionId,
bytes32 id
) external onlyRole(TERM_CONTRACT) {
emit OfferUnlocked(termAuctionId, id);
}
/// @param termAuctionId The id of Term Auction where offer locking is paused
/// @param termRepoId The Term Repo id where offer locking is paused
function emitOfferLockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit OfferLockingPaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where offer locking is unpaused
/// @param termRepoId The Term Repo id where offer locking is unpaused
function emitOfferLockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit OfferLockingUnpaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where offer unlocking is paused
/// @param termRepoId The Term Repo id where offer unlocking is paused
function emitOfferUnlockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit OfferUnlockingPaused(termAuctionId, termRepoId);
}
/// @param termAuctionId The id of Term Auction where offer unlocking is unpaused
/// @param termRepoId The Term Repo id where offer unlocking is unpaused
function emitOfferUnlockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit OfferUnlockingUnpaused(termAuctionId, termRepoId);
}
// ========================================================================
// = TermRepoCollateralManager Events =========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with collateral manger being initialized
/// @param termRepoCollateralManager The address of the TermRepoCollateralManager contract being intialized
/// @param collateralTokens An array containing a list of the addresses of all accepted collateral tokens
/// @param initialCollateralRatios An array containing the initial collateral ratios for each collateral token
/// @param maintenanceCollateralRatios An array containing the maintenance collateral ratios for each collateral token
/// @param liquidatedDamagesSchedule An array containing the liquidated damages applicable to each collateral token
function emitTermRepoCollateralManagerInitialized(
bytes32 termRepoId,
address termRepoCollateralManager,
address[] calldata collateralTokens,
uint256[] calldata initialCollateralRatios,
uint256[] calldata maintenanceCollateralRatios,
uint256[] calldata liquidatedDamagesSchedule
) external onlyRole(TERM_CONTRACT) {
emit TermRepoCollateralManagerInitialized(
termRepoId,
termRepoCollateralManager,
collateralTokens,
initialCollateralRatios,
maintenanceCollateralRatios,
liquidatedDamagesSchedule
);
}
/// @param termRepoId The Term Repo id for the Term Repo being reopened
/// @param termRepoCollateralManager The TermRepoCollateralManager address for the Term Repo being reopened
/// @param termAuctionBidLocker The new TermAuctionBidLocker to be paired for reopening
function emitPairReopeningBidLocker(
bytes32 termRepoId,
address termRepoCollateralManager,
address termAuctionBidLocker
) external onlyRole(TERM_CONTRACT) {
emit PairReopeningBidLocker(
termRepoId,
termRepoCollateralManager,
termAuctionBidLocker
);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param collateralToken The address of the collateral token locked
/// @param amount The amount of collateral being locked
function emitCollateralLocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit CollateralLocked(termRepoId, borrower, collateralToken, amount);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param collateralToken The address of the collateral token locked
/// @param amount The amount of collateral being unlocked
function emitCollateralUnlocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit CollateralUnlocked(termRepoId, borrower, collateralToken, amount);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param liquidator The address of the liquidator
/// @param closureAmount The amount of repurchase exposure covered
/// @param collateralToken The address of the collateral tokens liquidated
/// @param amountLiquidated The amount of collateral tokens liquidated
function emitLiquidation(
bytes32 termRepoId,
address borrower,
address liquidator,
uint256 closureAmount,
address collateralToken,
uint256 amountLiquidated,
uint256 protocolSeizureAmount,
bool defaultLiquidation
) external onlyRole(TERM_CONTRACT) {
emit Liquidation(
termRepoId,
borrower,
liquidator,
closureAmount,
collateralToken,
amountLiquidated,
protocolSeizureAmount,
defaultLiquidation
);
}
/// @param termRepoId The id of Term Repo where liquidations are paused
function emitLiquidationPaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit LiquidationsPaused(termRepoId);
}
/// @param termRepoId The id of Term Repo where liquidation is unpaused
function emitLiquidationUnpaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit LiquidationsUnpaused(termRepoId);
}
// ========================================================================
// = TermRepoServicer Events ===============================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoServicer being initialized
/// @param termRepoServicer The address of the TermRepoServicer contract being initialized
/// @param purchaseToken The address of the purchase token
/// @param maturityTimestamp The time at which repurchase is due
/// @param endOfRepurchaseWindow The time at which the repurchase window ends
/// @param redemptionTimestamp The time when redemption of Term Repo Tokens begins
/// @param servicingFee percentage share of bid amounts charged to bidder
/// @param version The version tag of the smart contract deployed
function emitTermRepoServicerInitialized(
bytes32 termRepoId,
address termRepoServicer,
address purchaseToken,
uint256 maturityTimestamp,
uint256 endOfRepurchaseWindow,
uint256 redemptionTimestamp,
uint256 servicingFee,
string calldata version
) external onlyRole(TERM_CONTRACT) {
emit TermRepoServicerInitialized(
termRepoId,
termRepoServicer,
purchaseToken,
maturityTimestamp,
endOfRepurchaseWindow,
redemptionTimestamp,
servicingFee,
version
);
}
/// @param termRepoId The Term Repo id for the Term Repo being reopened
/// @param termRepoServicer The address of the TermRepoServicer contract for the Term Repo being reopened
/// @param termAuctionOfferLocker The TermAuctionOfferLocker to be paired for reopening
/// @param termAuction The address of the TermAuction contract to be paired for reopening
function emitReopeningOfferLockerPaired(
bytes32 termRepoId,
address termRepoServicer,
address termAuctionOfferLocker,
address termAuction
) external onlyRole(TERM_CONTRACT) {
emit ReopeningOfferLockerPaired(
termRepoId,
termRepoServicer,
termAuctionOfferLocker,
termAuction
);
}
/// @param termRepoId A Term Repo id
/// @param offeror The address of the offeror
/// @param amount The offer amount to be locked
/// @notice This event is not to be confused with OfferLocked by TermOfferLocker
/// @notice Both this event and OfferLocked will be triggered, this one specifically refers to corresponding action taken by Term Servicer
function emitOfferLockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit OfferLockedByServicer(termRepoId, offeror, amount);
}
/// @param termRepoId A Term Repo id
/// @param offeror The address of the offeror
/// @param amount The offer amount to be unlocked
/// @notice This event is not to be confused with OfferUnlocked by TermOfferLocker
/// @notice Both this event and OfferLocked will be triggered, this one specifically refers to corresponding action taken by Term Servicer
function emitOfferUnlockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit OfferUnlockedByServicer(termRepoId, offeror, amount);
}
/// @param offerId A unique offer id
/// @param offeror The address of the offeror
/// @param purchasePrice The offer amount fulfilled
/// @param repurchasePrice The repurchase price due to offeror at maturity
/// @param repoTokensMinted The amount of Term Repo Tokens minted to offeror
function emitOfferFulfilled(
bytes32 offerId,
address offeror,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 repoTokensMinted
) external onlyRole(TERM_CONTRACT) {
emit OfferFulfilled(
offerId,
offeror,
purchasePrice,
repurchasePrice,
repoTokensMinted
);
}
/// @param termRepoId A Term Repo id
/// @param redeemer The address of the redeemer
/// @param redemptionAmount The amount of TermRepoTokens redeemed
/// @param redemptionHaircut The haircut applied to redemptions (if any) due to unrecoverable repo exposure
function emitTermRepoTokensRedeemed(
bytes32 termRepoId,
address redeemer,
uint256 redemptionAmount,
uint256 redemptionHaircut
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokensRedeemed(
termRepoId,
redeemer,
redemptionAmount,
redemptionHaircut
);
}
/// @param termRepoId A Term Repo id
/// @param bidder The address of the bidder
/// @param purchasePrice The bid amount fulfilled in auction
/// @param repurchasePrice The repurchase price due at maturity
/// @param servicingFees The fees earned by the protocol
function emitBidFulfilled(
bytes32 termRepoId,
address bidder,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
) external onlyRole(TERM_CONTRACT) {
emit BidFulfilled(
termRepoId,
bidder,
purchasePrice,
repurchasePrice,
servicingFees
);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param purchasePrice The purchase price received from new TermRepo
/// @param repurchasePrice The new repurchase price due at maturity of new TermRepo
/// @param servicingFees The fees earned by the protocol
function emitExposureOpenedOnRolloverNew(
bytes32 termRepoId,
address borrower,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
) external onlyRole(TERM_CONTRACT) {
emit ExposureOpenedOnRolloverNew(
termRepoId,
borrower,
purchasePrice,
repurchasePrice,
servicingFees
);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param amountRolled The repurchase exposure balance closed on old Term Repo
function emitExposureClosedOnRolloverExisting(
bytes32 termRepoId,
address borrower,
uint256 amountRolled
) external onlyRole(TERM_CONTRACT) {
emit ExposureClosedOnRolloverExisting(
termRepoId,
borrower,
amountRolled
);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param amount The amount submitted for repurchase
function emitRepurchasePaymentSubmitted(
bytes32 termRepoId,
address borrower,
uint256 amount
) external onlyRole(TERM_CONTRACT) {
emit RepurchasePaymentSubmitted(termRepoId, borrower, amount);
}
/// @param termRepoId A Term Repo id
/// @param authedUser User granted mint exposure access
function emitMintExposureAccessGranted(
bytes32 termRepoId,
address authedUser
) external onlyRole(TERM_CONTRACT) {
emit MintExposureAccessGranted(termRepoId, authedUser);
}
/// @param termRepoId A Term Repo id
/// @param minter The address of the minter
/// @param netTokensReceived The amount of Term Repo Tokens received by minter net of servicing fees
/// @param servicingFeeTokens The number of Term Repo Tokens retained by protocol in servicing fees
/// @param repurchasePrice The repurchase exposure opened by minter against Term Repo Token mint
function emitMintExposure(
bytes32 termRepoId,
address minter,
uint256 netTokensReceived,
uint256 servicingFeeTokens,
uint256 repurchasePrice
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenMint(
termRepoId,
minter,
netTokensReceived,
servicingFeeTokens,
repurchasePrice
);
}
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param closeAmount The amount of repurchase exposure to close
function emitBurnCollapseExposure(
bytes32 termRepoId,
address borrower,
uint256 closeAmount
) external onlyRole(TERM_CONTRACT) {
emit BurnCollapseExposure(termRepoId, borrower, closeAmount);
}
// ========================================================================
// = TermRepoRolloverManager Events ===========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoRolloverManager being initialized
/// @param rolloverManager The address of the TermRepoRolloverManager contract being initialized
function emitTermRepoRolloverManagerInitialized(
bytes32 termRepoId,
address rolloverManager
) external onlyRole(TERM_CONTRACT) {
emit TermRepoRolloverManagerInitialized(termRepoId, rolloverManager);
}
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermAuctionId The Term Auction Id that rollover bid will be submitted into
function emitRolloverTermApproved(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
) external onlyRole(TERM_CONTRACT) {
emit RolloverTermApproved(termRepoId, rolloverTermAuctionId);
}
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermAuctionId The Term Auction Id whose rollover approval is revoked
function emitRolloverTermApprovalRevoked(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
) external onlyRole(TERM_CONTRACT) {
emit RolloverTermApprovalRevoked(termRepoId, rolloverTermAuctionId);
}
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermRepoId The Term Repo Id of Rollover Term Repo
/// @param borrower The address of the borrower
/// @param rolloverAuction The address of the auction being rolled over to
/// @param rolloverAmount The repurchase amount being rolled over
/// @param hashedBidPrice The hash of the rollover bid price
function emitRolloverElection(
bytes32 termRepoId,
bytes32 rolloverTermRepoId,
address borrower,
address rolloverAuction,
uint256 rolloverAmount,
bytes32 hashedBidPrice
) external onlyRole(TERM_CONTRACT) {
emit RolloverElection(
termRepoId,
rolloverTermRepoId,
borrower,
rolloverAuction,
rolloverAmount,
hashedBidPrice
);
}
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param borrower The address of the borrower
function emitRolloverCancellation(
bytes32 termRepoId,
address borrower
) external onlyRole(TERM_CONTRACT) {
emit RolloverCancellation(termRepoId, borrower);
}
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param borrower The address of the borrower
function emitRolloverProcessed(
bytes32 termRepoId,
address borrower
) external onlyRole(TERM_CONTRACT) {
emit RolloverProcessed(termRepoId, borrower);
}
// ========================================================================
// = TermRepoLocker Events ======================================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoLocker contract being initialized
/// @param termRepoLocker The address of the TermRepoLocker contract being initialized
function emitTermRepoLockerInitialized(
bytes32 termRepoId,
address termRepoLocker
) external onlyRole(TERM_CONTRACT) {
emit TermRepoLockerInitialized(termRepoId, termRepoLocker);
}
/// @param termRepoId A Term Repo id
function emitTermRepoLockerTransfersPaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoLockerTransfersPaused(termRepoId);
}
/// @param termRepoId A Term Repo id
function emitTermRepoLockerTransfersUnpaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoLockerTransfersUnpaused(termRepoId);
}
// ========================================================================
// = TermRepoToken Events =====================================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with the TermRepoToken being initalized
/// @param termRepoToken The address of the TermRepoToken contract being initialized
/// @param redemptionRatio The number of purchase tokens redeemable per unit of Term Repo Token at par
function emitTermRepoTokenInitialized(
bytes32 termRepoId,
address termRepoToken,
uint256 redemptionRatio
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenInitialized(
termRepoId,
termRepoToken,
redemptionRatio
);
}
/// @param termRepoId The Term Repo id associated with the TermRepoToken where minting is paused
function emitTermRepoTokenMintingPaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenMintingPaused(termRepoId);
}
/// @param termRepoId The Term Repo id associated with the TermRepoToken where minting is unpaused
function emitTermRepoTokenMintingUnpaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenMintingUnpaused(termRepoId);
}
/// @param termRepoId The Term Repo id associated with the TermRepoToken where burning is paused
function emitTermRepoTokenBurningPaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenBurningPaused(termRepoId);
}
/// @param termRepoId The Term Repo id associated with the TermRepoToken where burning is unpaused
function emitTermRepoTokenBurningUnpaused(
bytes32 termRepoId
) external onlyRole(TERM_CONTRACT) {
emit TermRepoTokenBurningUnpaused(termRepoId);
}
// ========================================================================
// = TermEventEmitter Events ==============================================
// ========================================================================
/// @param termRepoId The id of the Term Repo being delisted
function emitDelistTermRepo(
bytes32 termRepoId
) external onlyRole(TERM_DELISTER) {
emit DelistTermRepo(termRepoId);
}
/// @param termAuctionId The id of the Term Auction being delisted
function emitDelistTermAuction(
bytes32 termAuctionId
) external onlyRole(TERM_DELISTER) {
emit DelistTermAuction(termAuctionId);
}
/// @param proxy address of proxy contract
/// @param implementation address of new impl contract proxy has been upgraded to
function emitTermContractUpgraded(
address proxy,
address implementation
) external onlyRole(TERM_CONTRACT) {
emit TermContractUpgraded(proxy, implementation);
}
// ========================================================================
// = Admin ===============================================================
// ========================================================================
// solhint-disable no-empty-blocks
///@dev required override by the OpenZeppelin UUPS module
function _authorizeUpgrade(
address
) internal view override onlyRole(DEVOPS_ROLE) {}
// solhint-enable no-empty-blocks
}
TermAuctionBid.sol 28 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @dev TermAuctionBid represents a bid to borrow a specific amount of tokens at a specific interest rate (or better)
struct TermAuctionBid {
/// @dev Unique identifier for this bid
bytes32 id;
/// @dev The address of the bidder
address bidder;
/// @dev Hash of the offered price as a percentage of the initial loaned amount vs amount returned at maturity. This stores 9 decimal places
bytes32 bidPriceHash;
/// @dev Revealed bid price; this is only a valid value if isRevealed is true; this stores 18 decimal places
uint256 bidPriceRevealed;
/// @dev The maximum amount of purchase tokens that can be borrowed
uint256 amount;
/// @dev The amount of collateral tokens initially locked
uint256[] collateralAmounts;
/// @dev The address of the ERC20 purchase token
address purchaseToken;
/// @dev The addresses of the collateral ERC20 tokens in the bid
address[] collateralTokens;
/// @dev A boolean indicating if bid was submitted as rollover from previous term
bool isRollover;
/// @dev The address of term repo servicer whose bid is being rolled over
address rolloverPairOffTermRepoServicer;
/// @dev A boolean that is true if bid has been revealed
bool isRevealed;
}
ITermEventEmitter.sol 593 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
import {ITermAuctionEvents} from "./ITermAuctionEvents.sol";
import {ITermAuctionBidLockerEvents} from "./ITermAuctionBidLockerEvents.sol";
import {ITermAuctionOfferLockerEvents} from "./ITermAuctionOfferLockerEvents.sol";
import {ITermRepoCollateralManagerEvents} from "./ITermRepoCollateralManagerEvents.sol";
import {ITermRepoServicerEvents} from "./ITermRepoServicerEvents.sol";
import {ITermRepoRolloverManagerEvents} from "./ITermRepoRolloverManagerEvents.sol";
import {ITermRepoLockerEvents} from "./ITermRepoLockerEvents.sol";
import {ITermRepoTokenEvents} from "./ITermRepoTokenEvents.sol";
import {ITermEventEmitterEvents} from "./ITermEventEmitterEvents.sol";
import {TermAuctionBid} from "../lib/TermAuctionBid.sol";
interface ITermEventEmitter is
ITermAuctionEvents,
ITermAuctionBidLockerEvents,
ITermAuctionOfferLockerEvents,
ITermRepoCollateralManagerEvents,
ITermRepoServicerEvents,
ITermRepoRolloverManagerEvents,
ITermRepoLockerEvents,
ITermRepoTokenEvents,
ITermEventEmitterEvents
{
//@param termContract New term contract to pair to event emitter.
function pairTermContract(address termContract) external;
// ========================================================================
// = TermAuction Events ===================================================
// ========================================================================
/// @param termRepoId The id of the current Term Repo deployment being initialized
/// @param termAuctionId The id of the auction being initialized
/// @param termAuction The address of the auction contract being initialized
/// @param auctionEndTime The end time of the auction being initialized
/// @param version The version tag of the smart contract deployed
function emitTermAuctionInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuction,
uint256 auctionEndTime,
string calldata version
) external;
/// @param termAuctionId A Term Auction id
/// @param id A bid id
/// @param amount The amount assigned to this bid
function emitBidAssigned(
bytes32 termAuctionId,
bytes32 id,
uint256 amount
) external;
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param amount The amount assigned to this offer
function emitOfferAssigned(
bytes32 termAuctionId,
bytes32 id,
uint256 amount
) external;
/// @param termAuctionId The Term Auction id of auction completed
/// @param timestamp The timestamp of the current block
/// @param blockNumber The number of the current block
/// @param totalAssignedBids The number of assigned bids in the auction
/// @param totalAssignedOffers The number of assigned offers in the auction
/// @param clearingPrice The clearing price of the auction
function emitAuctionCompleted(
bytes32 termAuctionId,
uint256 timestamp,
uint256 blockNumber,
uint256 totalAssignedBids,
uint256 totalAssignedOffers,
uint256 clearingPrice
) external;
/// @param nonViableAuction Auction not viable due to bid and offer prices not intersecting
/// @param auctionCancelledforWithdrawal Auction has been cancelled for withdrawal
function emitAuctionCancelled(
bytes32 termAuctionId,
bool nonViableAuction,
bool auctionCancelledforWithdrawal
) external;
/// @param termAuctionId The id of the auction paused
/// @param termRepoId The Term Repo id associated with auction paused
function emitCompleteAuctionPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of the auction unpaused
/// @param termRepoId The Term Repo id associated with auction unpaused
function emitCompleteAuctionUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
// ========================================================================
// = TermAuctionBidLocker Events ==========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with BidLocker initialized
/// @param termAuctionId The Term Auction id associated with BidLocker initialized
/// @param termAuctionBidLocker The address of the TermAuctionBidLocker contract being intialized
/// @param auctionStartTime The time at which auction bids will be accepted for submission
/// @param revealTime The time at which sealed auction bids can be revealed
/// @param maxBidPrice The maximum tender price (interest rate) in percentage
/// @param minimumTenderAmount The minimum amount of borrowed purchase token that will be accepted
/// @param dayCountFractionMantissa The day count fraction remainder
function emitTermAuctionBidLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionBidLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxBidPrice,
uint256 minimumTenderAmount,
uint256 dayCountFractionMantissa
) external;
/// @param termAuctionId A Term Auction id
/// @param bid A struct containing details of the locked bid
/// @param referralAddress The address of the referrer. Zero Address if none.
function emitBidLocked(
bytes32 termAuctionId,
TermAuctionBid calldata bid,
address referralAddress
) external;
/// @param termAuctionId A Term Auction id
/// @param id The bid id
/// @param bidPrice The revealed price of the bid
function emitBidRevealed(
bytes32 termAuctionId,
bytes32 id,
uint256 bidPrice
) external;
/// @param termAuctionId A Term Auction id
/// @param id A bid id
function emitBidUnlocked(bytes32 termAuctionId, bytes32 id) external;
/// @param termAuctionId A Term Auction id
/// @param id A bid id
function emitBidInShortfall(bytes32 termAuctionId, bytes32 id) external;
/// @param termAuctionId The id of Term Auction where bid locking is paused
/// @param termRepoId The Term Repo id where bid locking is paused
function emitBidLockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where bid locking is unpaused
/// @param termRepoId The Term Repo id where bid locking is unpaused
function emitBidLockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where bid unlocking is paused
/// @param termRepoId The Term Repo id where bid unlocking is paused
function emitBidUnlockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where bid unlocking is unpaused
/// @param termRepoId The Term Repo id where bid unlocking is unpaused
function emitBidUnlockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
// ========================================================================
// = TermAuctionOfferLocker Events ========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with OfferLocker initialized
/// @param termAuctionId The Term Auction id associated with OfferLocker initialized
/// @param termAuctionOfferLocker The address of the TermAuctionOfferLocker contract being intialized
/// @param auctionStartTime The time at which auction bids will be accepted for submission
/// @param revealTime The time at which sealed auction bids can be revealed
function emitTermAuctionOfferLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionOfferLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxOfferPrice,
uint256 minimumTenderAmount
) external;
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param offeror The address of the offeror
/// @param offerPrice The offer price
/// @param amount The amount of purchase tokens offered
/// @param purchaseToken The address of the purchase token being offered
/// @param referralAddress The address of the referrer. Zero Address if none.
function emitOfferLocked(
bytes32 termAuctionId,
bytes32 id,
address offeror,
bytes32 offerPrice,
uint256 amount,
address purchaseToken,
address referralAddress
) external;
/// @param termAuctionId A Term Auction id
/// @param id An offer id
/// @param offerPrice The offer price revealed
function emitOfferRevealed(
bytes32 termAuctionId,
bytes32 id,
uint256 offerPrice
) external;
/// @param termAuctionId A Term Auction id
/// @param id An offer id
function emitOfferUnlocked(bytes32 termAuctionId, bytes32 id) external;
/// @param termAuctionId The id of Term Auction where offer locking is paused
/// @param termRepoId The Term Repo id where offer locking is paused
function emitOfferLockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where offer locking is unpaused
/// @param termRepoId The Term Repo id where offer locking is unpaused
function emitOfferLockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where offer unlocking is paused
/// @param termRepoId The Term Repo id where offer unlocking is paused
function emitOfferUnlockingPaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
/// @param termAuctionId The id of Term Auction where offer unlocking is unpaused
/// @param termRepoId The Term Repo id where offer unlocking is unpaused
function emitOfferUnlockingUnpaused(
bytes32 termAuctionId,
bytes32 termRepoId
) external;
// ========================================================================
// = TermRepoCollateralManager Events =========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with collateral manger being initialized
/// @param termRepoCollateralManager The address of the TermRepoCollateralManager contract being intialized
/// @param collateralTokens An array containing a list of the addresses of all accepted collateral tokens
/// @param initialCollateralRatios An array containing the initial collateral ratios for each collateral token
/// @param maintenanceCollateralRatios An array containing the maintenance collateral ratios for each collateral token
/// @param liquidatedDamagesSchedule An array containing the liquidated damages applicable to each collateral token
function emitTermRepoCollateralManagerInitialized(
bytes32 termRepoId,
address termRepoCollateralManager,
address[] calldata collateralTokens,
uint256[] calldata initialCollateralRatios,
uint256[] calldata maintenanceCollateralRatios,
uint256[] calldata liquidatedDamagesSchedule
) external;
/// @param termRepoId The Term Repo id for the Term Repo being reopened
/// @param termRepoCollateralManager The TermRepoCollateralManager address for the Term Repo being reopened
/// @param termAuctionBidLocker New TermAuctionBidLocker to be paired for reopening
function emitPairReopeningBidLocker(
bytes32 termRepoId,
address termRepoCollateralManager,
address termAuctionBidLocker
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param collateralToken The address of the collateral token locked
/// @param amount The amount of collateral being locked
function emitCollateralLocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param collateralToken The address of the collateral token locked
/// @param amount The amount of collateral being unlocked
function emitCollateralUnlocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param liquidator The address of the liquidator
/// @param closureAmount The amount of repurchase exposure covered
/// @param collateralToken The address of the collateral tokens liquidated
/// @param amountLiquidated The amount of collateral tokens liquidated
function emitLiquidation(
bytes32 termRepoId,
address borrower,
address liquidator,
uint256 closureAmount,
address collateralToken,
uint256 amountLiquidated,
uint256 protocolSeizureAmount,
bool defaultLiquidation
) external;
/// @param termRepoId The id of Term Repo where liquidations are paused
function emitLiquidationPaused(bytes32 termRepoId) external;
/// @param termRepoId The id of Term Repo where liquidation is unpaused
function emitLiquidationUnpaused(bytes32 termRepoId) external;
// ========================================================================
// = TermRepoServicer Events ===============================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoServicer being initialized
/// @param termRepoServicer The address of the TermRepoServicer contract being initialized
/// @param purchaseToken The address of the purchase token
/// @param maturityTimestamp The time at which repurchase is due
/// @param endOfRepurchaseWindow The time at which the repurchase window ends
/// @param redemptionTimestamp The time when redemption of Term Repo Tokens begins
/// @param servicingFee percentage share of bid amounts charged to bidder
/// @param version The version tag of the smart contract deployed
function emitTermRepoServicerInitialized(
bytes32 termRepoId,
address termRepoServicer,
address purchaseToken,
uint256 maturityTimestamp,
uint256 endOfRepurchaseWindow,
uint256 redemptionTimestamp,
uint256 servicingFee,
string calldata version
) external;
/// @param termRepoId The Term Repo id for the Term Repo being reopened
/// @param termRepoServicer The address of the TermRepoServicer contract for the Term Repo being reopened
/// @param termAuctionOfferLocker The TermAuctionOfferLocker to be paired for reopening
/// @param termAuction The address of the TermAuction contract to be paired for reopening
function emitReopeningOfferLockerPaired(
bytes32 termRepoId,
address termRepoServicer,
address termAuctionOfferLocker,
address termAuction
) external;
/// @param termRepoId A Term Repo id
/// @param offeror The address of the offeror
/// @param amount The offer amount to be locked
/// @notice This event is not to be confused with OfferLocked by TermOfferLocker
/// @notice Both will be triggered, this one specifically refers to corresponding action taken by Term Servicer
function emitOfferLockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
) external;
/// @param termRepoId A Term Repo id
/// @param offeror The address of the offeror
/// @param amount The offer amount to be unlocked
/// @notice This event is not to be confused with OfferUnlocked by TermOfferLocker
/// @notice Both will be triggered, this one specifically refers to corresponding action taken by Term Servicer
function emitOfferUnlockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
) external;
/// @param offerId Unique id for offer
/// @param offeror The address of the offeror
/// @param purchasePrice The offer amount fulfilled
/// @param repurchasePrice The repurchase price due to offeror at maturity
/// @param repoTokensMinted The amount of Term Repo Tokens minted to offeror
function emitOfferFulfilled(
bytes32 offerId,
address offeror,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 repoTokensMinted
) external;
/// @param termRepoId A Term Repo id
/// @param redeemer The address of the redeemer
/// @param redemptionAmount The amount of TermRepoTokens redeemed
/// @param redemptionHaircut The haircut applied to redemptions (if any) due to unrecoverable repo exposure
function emitTermRepoTokensRedeemed(
bytes32 termRepoId,
address redeemer,
uint256 redemptionAmount,
uint256 redemptionHaircut
) external;
/// @param termRepoId A Term Repo id
/// @param bidder The address of the bidder
/// @param purchasePrice The bid amount fulfilled in auction
/// @param repurchasePrice The repurchase price due at maturity
/// @param servicingFees The fees earned by the protocol
function emitBidFulfilled(
bytes32 termRepoId,
address bidder,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param purchasePrice The purchase price received from new TermRepo
/// @param repurchasePrice The new repurchase price due at maturity of new TermRepo
/// @param servicingFees The fees earned by the protocol
function emitExposureOpenedOnRolloverNew(
bytes32 termRepoId,
address borrower,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param amountRolled The repurchase exposure balance closed on old Term Repo
function emitExposureClosedOnRolloverExisting(
bytes32 termRepoId,
address borrower,
uint256 amountRolled
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param amount The amount submitted for repurchase
function emitRepurchasePaymentSubmitted(
bytes32 termRepoId,
address borrower,
uint256 amount
) external;
/// @param termRepoId A Term Repo id
/// @param authedUser User granted mint exposure access
function emitMintExposureAccessGranted(
bytes32 termRepoId,
address authedUser
) external;
/// @param termRepoId A Term Repo id
/// @param minter The address of the minter
/// @param netTokensReceived The amount of Term Repo Tokens received by minter net of servicing fees
/// @param servicingFeeTokens The number of Term Repo Tokens retained by protocol in servicing fees
/// @param repurchasePrice The repurchase exposure opened by minter against Term Repo Token mint
function emitMintExposure(
bytes32 termRepoId,
address minter,
uint256 netTokensReceived,
uint256 servicingFeeTokens,
uint256 repurchasePrice
) external;
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
/// @param closeAmount The amount of repurchase exposure to close
function emitBurnCollapseExposure(
bytes32 termRepoId,
address borrower,
uint256 closeAmount
) external;
// ========================================================================
// = TermRepoRolloverManager Events ===========================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoRolloverManager being initialized
/// @param rolloverManager The address of the TermRepoRolloverManager contract being initialized
function emitTermRepoRolloverManagerInitialized(
bytes32 termRepoId,
address rolloverManager
) external;
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermAuctionId The Term Auction Id that rollover bid will be submitted into
function emitRolloverTermApproved(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
) external;
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermAuctionId The Term Auction Id whose rollover approval is revoked
function emitRolloverTermApprovalRevoked(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
) external;
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param rolloverTermRepoId Term Repo Id of Rollover Term Repo
/// @param borrower The address of the borrower
/// @param rolloverAuction The address of the auction being rolled over to
/// @param rolloverAmount The repurchase amount being rolled over
/// @param hashedBidPrice The hash of the rollover bid price
function emitRolloverElection(
bytes32 termRepoId,
bytes32 rolloverTermRepoId,
address borrower,
address rolloverAuction,
uint256 rolloverAmount,
bytes32 hashedBidPrice
) external;
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param borrower The address of the borrower
function emitRolloverCancellation(
bytes32 termRepoId,
address borrower
) external;
/// @param termRepoId The Term Repo id of existing Term Repo
/// @param borrower The address of the borrower
function emitRolloverProcessed(
bytes32 termRepoId,
address borrower
) external;
// ========================================================================
// = TermRepoLocker Events ======================================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with TermRepoLocker contract being initialized
/// @param termRepoLocker The address of the TermRepoLocker contract being initialized
function emitTermRepoLockerInitialized(
bytes32 termRepoId,
address termRepoLocker
) external;
/// @param termRepoId A Term Repo id
function emitTermRepoLockerTransfersPaused(bytes32 termRepoId) external;
/// @param termRepoId A Term Repo id
function emitTermRepoLockerTransfersUnpaused(bytes32 termRepoId) external;
// ========================================================================
// = TermRepoToken Events =====================================================
// ========================================================================
/// @param termRepoId The Term Repo id associated with the TermRepoToken being initalized
/// @param termRepoToken The address of the TermRepoToken contract being initialized
/// @param redemptionRatio The number of purchase tokens redeemable per unit of Term Repo Token at par
function emitTermRepoTokenInitialized(
bytes32 termRepoId,
address termRepoToken,
uint256 redemptionRatio
) external;
/// @param termRepoId The Term Repo id associated with the TermRepoToken where minting is paused
function emitTermRepoTokenMintingPaused(bytes32 termRepoId) external;
/// @param termRepoId The Term Repo id associated with the TermRepoToken where minting is unpaused
function emitTermRepoTokenMintingUnpaused(bytes32 termRepoId) external;
/// @param termRepoId The Term Repo id associated with the TermRepoToken where burning is paused
function emitTermRepoTokenBurningPaused(bytes32 termRepoId) external;
/// @param termRepoId The Term Repo id associated with the TermRepoToken where burning is unpaused
function emitTermRepoTokenBurningUnpaused(bytes32 termRepoId) external;
// ========================================================================
// = TermEventEmitter Events ==============================================
// ========================================================================
/// @param termRepoId The id of the Term Repo being delisted
function emitDelistTermRepo(bytes32 termRepoId) external;
/// @param termAuctionId The id of the Term Auction being delisted
function emitDelistTermAuction(bytes32 termAuctionId) external;
/// @param proxy address of proxy contract
/// @param implementation address of new impl contract proxy has been upgraded to
function emitTermContractUpgraded(
address proxy,
address implementation
) external;
}
ITermAuctionEvents.sol 67 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @title ITermAuctionEvents defines all events emitted by the TermAuctionContract.
interface ITermAuctionEvents {
/// Event emitted when a new auction is initialized
/// @param termRepoId The term ID
/// @param termAuctionId The term auction Id
/// @param termAuction auction contract address
/// @param auctionEndTime The auction end time
/// @param version The version tag of the smart contract deployed
event TermAuctionInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuction,
uint256 auctionEndTime,
string version
);
/// Event emitted when a bid is assigned
/// @param termAuctionId The auction ID
/// @param id The bid ID
/// @param amount The amount assigned
event BidAssigned(bytes32 termAuctionId, bytes32 id, uint256 amount);
/// Event emitted when an offer is assigned
/// @param termAuctionId The term ID
/// @param id The offer ID
/// @param amount The amount assigned
event OfferAssigned(bytes32 termAuctionId, bytes32 id, uint256 amount);
/// Event emitted when an auction is completed
/// @param termAuctionId The ID of the auction
/// @param timestamp The timestamp of the auction completion
/// @param block The block of the auction completion
/// @param totalAssignedBids The total amount of bids assigned
/// @param totalAssignedOffers The total amount of offers assigned
/// @param clearingPrice The clearing price of the auction
event AuctionCompleted(
bytes32 termAuctionId,
uint256 timestamp,
uint256 block,
uint256 totalAssignedBids,
uint256 totalAssignedOffers,
uint256 clearingPrice
);
/// Event emitted when an auction is cancelled.
/// @param termAuctionId The ID of the auction.
/// @param nonViableAuction Auction not viable due to bid and offer prices not intersecting
/// @param auctionCancelledforWithdrawal Auction has been cancelled for manual fund withdrawal
event AuctionCancelled(
bytes32 termAuctionId,
bool nonViableAuction,
bool auctionCancelledforWithdrawal
);
/// Event emitted when an auction is paused.
/// @param termAuctionId The ID of the auction.
/// @param termRepoId The ID of the repo.
event CompleteAuctionPaused(bytes32 termAuctionId, bytes32 termRepoId);
/// Event emitted when an auction is unpaused.
/// @param termAuctionId The ID of the auction.
/// @param termRepoId The ID of the repo.
event CompleteAuctionUnpaused(bytes32 termAuctionId, bytes32 termRepoId);
}
ITermRepoTokenEvents.sol 31 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermRepoTokenEvents is an interface that defines all events emitted by the Term Repo Token
interface ITermRepoTokenEvents {
/// @notice Event emitted when a Term Repo Servicer is initialized.
/// @param termRepoId term identifier
/// @param termRepoToken address of initialized term repo token
/// @param redemptionRatio The number of purchase tokens redeemable per unit of Term Repo Token at par
event TermRepoTokenInitialized(
bytes32 termRepoId,
address termRepoToken,
uint256 redemptionRatio
);
/// @notice Event emitted when a Term Repo Token Minting is Paused
/// @param termRepoId A Term Repo id
event TermRepoTokenMintingPaused(bytes32 termRepoId);
/// @notice Event emitted when a Term Repo Token Minting is Unpaused
/// @param termRepoId A Term Repo id
event TermRepoTokenMintingUnpaused(bytes32 termRepoId);
/// @notice Event emitted when a Term Repo Token Burning is Paused
/// @param termRepoId A Term Repo id
event TermRepoTokenBurningPaused(bytes32 termRepoId);
/// @notice Event emitted when a Term Repo Token Burning is Unpaused
/// @param termRepoId A Term Repo id
event TermRepoTokenBurningUnpaused(bytes32 termRepoId);
}
ITermRepoLockerEvents.sol 18 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermRepoLockerEvents is an interface that defines all events emitted by the TermRepoLocker.
interface ITermRepoLockerEvents {
/// @notice Event emitted when a TermRepoLocker is initialized.
/// @param termRepoId term identifier
/// @param termRepoLocker address of initialized term repo locker
event TermRepoLockerInitialized(bytes32 termRepoId, address termRepoLocker);
/// @notice Event emitted transfers for a TermRepoLocker are paused.
/// @param termRepoId term identifier
event TermRepoLockerTransfersPaused(bytes32 termRepoId);
/// @notice Event emitted transfers for a TermRepoLocker are unpaused.
/// @param termRepoId term identifier
event TermRepoLockerTransfersUnpaused(bytes32 termRepoId);
}
ITermEventEmitterEvents.sol 17 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
interface ITermEventEmitterEvents {
/// @notice Event emitted when a new Term Repo is delisted on Term Finance
/// @param termRepoId unique identifier for a Term Repo
event DelistTermRepo(bytes32 termRepoId);
/// @notice Event emitted when a new Term Auction is delisted on Term Finance
/// @param termAuctionId unique identifier for a Term Auction
event DelistTermAuction(bytes32 termAuctionId);
/// @notice Event emitted when a Term contract is upgraded to a new implementation
/// @param proxy address of proxy contract
/// @param implementation address of new impl contract proxy has been upgraded to
event TermContractUpgraded(address proxy, address implementation);
}
ITermRepoServicerEvents.sol 159 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermRepoServicerEvents is an interface that defines all events emitted by the Term Repo Servicer.
interface ITermRepoServicerEvents {
/// @notice Event emitted when a Term Loan Manager is initialized.
/// @param termRepoId A Term Repo id
/// @param purchaseToken The address of purchase token used for loans and repay
/// @param maturityTimestamp The timestamp at which term reaches maturity
/// @param endOfRepurchaseWindow The timestamp at which Term Repo is closed to repurchase
/// @param redemptionTimestamp The timestamp at which loaners can redeem term repo tokens
/// @param servicingFee percentage share of bid amounts charged to bidder
/// @param version The version tag of the smart contract deployed
event TermRepoServicerInitialized(
bytes32 termRepoId,
address termRepoServicer,
address purchaseToken,
uint256 maturityTimestamp,
uint256 endOfRepurchaseWindow,
uint256 redemptionTimestamp,
uint256 servicingFee,
string version
);
/// @notice Event emitted when a TermRepoLocker is reopened to another auction group
/// @param termRepoId A Term Repo id
/// @param termRepoServicer The address of loan manager
/// @param termAuctionOfferLocker The address of auction offer locker paired through reopening
/// @param termAuction The address of auction paired through reopening
event ReopeningOfferLockerPaired(
bytes32 termRepoId,
address termRepoServicer,
address termAuctionOfferLocker,
address termAuction
);
/// @notice Event emitted when a loan offer is locked.
/// @param termRepoId A Term Repo id
/// @param offeror The address who submitted offer
/// @param amount The amount of purchase token locked for offer
event OfferLockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
);
/// @notice Event emitted when a loan offer is unlocked.
/// @param termRepoId A Term Repo id
/// @param offeror The address who submitted offer
/// @param amount The amount of purchase token unlocked for offer
event OfferUnlockedByServicer(
bytes32 termRepoId,
address offeror,
uint256 amount
);
/// @notice Event emitted when a loan offer is fulfilled.
/// @param offerId A unique offer id
/// @param offeror The address whose offer is fulfilled
/// @param purchasePrice The purchasePrice of loan offer fulfilled
/// @param repurchasePrice The repurchasePrice of loan offer fulfilled
/// @param repoTokensMinted The amount of Term Repo Tokens minted to offeror
event OfferFulfilled(
bytes32 offerId,
address offeror,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 repoTokensMinted
);
/// @notice Event emitted when a term repo token is redeemed.
/// @param termRepoId A Term Repo id
/// @param redeemer The address who is redeeming term repo tokens
/// @param redemptionAmount The amount of loan offer redeemed by term repo tokens
/// @param redemptionHaircut The haircut applied to redemptions (if any) due to unrecoverable repo exposure
event TermRepoTokensRedeemed(
bytes32 termRepoId,
address redeemer,
uint256 redemptionAmount,
uint256 redemptionHaircut
);
/// @notice Event emitted when a loan is processed to a borrower
/// @param termRepoId A Term Repo id
/// @param bidder The address who is receiving the loan
/// @param purchasePrice The purchasePrice transferred to borrower
/// @param repurchasePrice The repurchasePrice owed by borrower at maturity
/// @param servicingFees The protocol fees paid for loan
event BidFulfilled(
bytes32 termRepoId,
address bidder,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
);
/// @notice Event emitted when mint exposure access is granted
/// @param termRepoId A Term Repo id
/// @param authedUser User granted mint exposure access
event MintExposureAccessGranted(bytes32 termRepoId, address authedUser);
/// @notice Event emitted when a rollover from a previous loan opens a position in this new term
/// @param termRepoId A Term Repo id
/// @param borrower The borrower who has loan position opened in new term
/// @param purchasePrice The purchasePrice transferred to previous term
/// @param repurchasePrice The repurchasePrice owed by borrower at maturity
/// @param servicingFees The protocol fees paid for loan
event ExposureOpenedOnRolloverNew(
bytes32 termRepoId,
address borrower,
uint256 purchasePrice,
uint256 repurchasePrice,
uint256 servicingFees
);
/// @notice Event emitted when a rollover from a previous loan opens a position in this new term
/// @param termRepoId A Term Repo id
/// @param borrower The borrower who has loan position opened in new term
/// @param amountRolled The amount of borrower loan collapsed by rollover opening
event ExposureClosedOnRolloverExisting(
bytes32 termRepoId,
address borrower,
uint256 amountRolled
);
/// @notice Event emitted when term repo tokens are minted for a loan
/// @param termRepoId A Term Repo id
/// @param minter The address who is opening the loan
/// @param netTokensReceived The amount of Term Repo Tokens received by minter net of servicing fees
/// @param servicingFeeTokens The number of Term Repo Tokens retained by protocol in servicing fees
/// @param repurchasePrice The repurchase exposure opened by minter against Term Repo Token mint
event TermRepoTokenMint(
bytes32 termRepoId,
address minter,
uint256 netTokensReceived,
uint256 servicingFeeTokens,
uint256 repurchasePrice
);
/// @notice Event emitted when a loan is collapsed by burning term repo tokens
/// @param termRepoId A Term Repo id
/// @param borrower The address who is repaying the loan
/// @param amountToClose The amount repaid by borrower
event BurnCollapseExposure(
bytes32 termRepoId,
address borrower,
uint256 amountToClose
);
/// @notice Event emitted when a loan is repaid by borrower
/// @param termRepoId A Term Repo id
/// @param borrower The address who is repaying the loan
/// @param repurchaseAmount The amount repaid by borrower
event RepurchasePaymentSubmitted(
bytes32 termRepoId,
address borrower,
uint256 repurchaseAmount
);
}
ITermAuctionBidLockerEvents.sol 44 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermAuctionBidLockerEvents is an interface that defines all events emitted by the Term Auction Bid Locker.
interface ITermAuctionBidLockerEvents {
event TermAuctionBidLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionBidLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxBidPrice,
uint256 minimumTenderAmount,
uint256 dayCountFractionMantissa
);
event BidLocked(
bytes32 termAuctionId,
bytes32 id,
address bidder,
bytes32 bidPrice,
uint256 amount,
address token,
address[] collateralTokens,
uint256[] collateralAmounts,
bool isRollover,
address rolloverPairOffTermRepoServicer,
address referralAddress
);
event BidRevealed(bytes32 termAuctionId, bytes32 id, uint256 bidPrice);
event BidUnlocked(bytes32 termAuctionId, bytes32 id);
event BidInShortfall(bytes32 termAuctionId, bytes32 id);
event BidLockingPaused(bytes32 termAuctionId, bytes32 termRepoId);
event BidLockingUnpaused(bytes32 termAuctionId, bytes32 termRepoId);
event BidUnlockingPaused(bytes32 termAuctionId, bytes32 termRepoId);
event BidUnlockingUnpaused(bytes32 termAuctionId, bytes32 termRepoId);
}
ITermAuctionOfferLockerEvents.sol 37 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermAuctionOfferLockerEvents is an interface that defines all events emitted by the Term Auction Offer Locker.
interface ITermAuctionOfferLockerEvents {
event TermAuctionOfferLockerInitialized(
bytes32 termRepoId,
bytes32 termAuctionId,
address termAuctionOfferLocker,
uint256 auctionStartTime,
uint256 revealTime,
uint256 maxOfferPrice,
uint256 minimumTenderAmount
);
event OfferLocked(
bytes32 termAuctionId,
bytes32 id,
address offeror,
bytes32 offerPrice,
uint256 amount,
address token,
address referralAddress
);
event OfferRevealed(bytes32 termAuctionId, bytes32 id, uint256 offerPrice);
event OfferUnlocked(bytes32 termAuctionId, bytes32 id);
event OfferLockingPaused(bytes32 termAuctionId, bytes32 termRepoId);
event OfferLockingUnpaused(bytes32 termAuctionId, bytes32 termRepoId);
event OfferUnlockingPaused(bytes32 termAuctionId, bytes32 termRepoId);
event OfferUnlockingUnpaused(bytes32 termAuctionId, bytes32 termRepoId);
}
ITermRepoRolloverManagerEvents.sol 55 lines
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.18;
/// @notice ITermRepoCollateralManagerEvents is an interface that defines all events emitted by Term Repo Collateral Manager.
interface ITermRepoRolloverManagerEvents {
/// @notice Event emitted when a rollover manager is initialized
/// @param termRepoId A Term Repo id
/// @param rolloverManager Address of rollover manager
event TermRepoRolloverManagerInitialized(
bytes32 termRepoId,
address rolloverManager
);
/// @notice Event emitted when a rollover manager approves a future term as a destination for borrows
/// @param termRepoId A Term Repo id
/// @param rolloverTermAuctionId The Term Auction Id that rollover bid will be submitted into
event RolloverTermApproved(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
);
/// @notice Event emitted when a rollover manager revokes approval for a future term as a destination for borrows
/// @param termRepoId A Term Repo id
/// @param rolloverTermAuctionId The Term Auction Id that rollover bid will be submitted into
event RolloverTermApprovalRevoked(
bytes32 termRepoId,
bytes32 rolloverTermAuctionId
);
/// @notice Event emitted when a borrower elects a rollover contract
/// @param termRepoId A Term Repo id
/// @param rolloverTermRepoId Term Repo Id of Rollover Term Repo
/// @param borrower The address of the borrower
/// @param rolloverAuction The address of rollover term contract
/// @param rolloverAmount Amount of purchase currency borrower is rolling over
/// @param hashedBidPrice The hash of rollover bid price
event RolloverElection(
bytes32 termRepoId,
bytes32 rolloverTermRepoId,
address borrower,
address rolloverAuction,
uint256 rolloverAmount,
bytes32 hashedBidPrice
);
/// @notice Event emitted when a borrower cancels a rollover election
/// @param termRepoId A Term Repo id
/// @param borrower The address of the borrower
event RolloverCancellation(bytes32 termRepoId, address borrower);
/// @notice Event emitted when a rollover is processed completely
/// @param termRepoId A Term Repo id
/// @param borrower The address of borrower
event RolloverProcessed(bytes32 termRepoId, address borrower);
}
ITermRepoCollateralManagerEvents.sol 82 lines
//SPDX-License-Identifier: CC-BY-NC-ND-4.0
pragma solidity ^0.8.18;
/// @notice ITermRepoCollateralManagerEvents is an interface that defines all events emitted by Term Repo Collateral Manager.
interface ITermRepoCollateralManagerEvents {
/// @notice Event emitted when a Term Repo Collateral Manager is initialized.
/// @param termRepoId term identifier
/// @param collateralTokens addresses of accepted collateral tokens
/// @param initialCollateralRatios list of initial collateral ratios for each collateral token in the same order as collateral tokens list
/// @param maintenanceCollateralRatios list of maintenance ratios for each collateral token in the same order as collateral tokens list
/// @param liquidatedDamagesSchedule liquidation discounts for collateral tokens
event TermRepoCollateralManagerInitialized(
bytes32 termRepoId,
address termRepoCollateralManager,
address[] collateralTokens,
uint256[] initialCollateralRatios,
uint256[] maintenanceCollateralRatios,
uint256[] liquidatedDamagesSchedule
);
/// @notice Event emitted when existing Term Repo Locker is reopened to another auction group
/// @param termRepoId term identifier
/// @param termRepoCollateralManager address of collateral manager
/// @param termAuctionBidLocker address of auction bid locker paired through reopening
event PairReopeningBidLocker(
bytes32 termRepoId,
address termRepoCollateralManager,
address termAuctionBidLocker
);
/// @notice Event emitted when collateral is locked.
/// @param termRepoId term identifier
/// @param borrower address of borrower who locked collateral
/// @param collateralToken address of collateral token
/// @param amount amount of collateral token locked
event CollateralLocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
);
/// @notice Event emitted when collateral is locked.
/// @param termRepoId term identifier
/// @param borrower address of borrower who locked collateral
/// @param collateralToken address of collateral token
/// @param amount amount of collateral token unlocked
event CollateralUnlocked(
bytes32 termRepoId,
address borrower,
address collateralToken,
uint256 amount
);
/// @notice Event emitted when a liquidation occurs
/// @param termRepoId term identifier
/// @param borrower address of borrower being liquidated
/// @param liquidator address of liquidator
/// @param closureAmount amount of loan repaid by liquidator
/// @param collateralToken address of collateral token liquidated
/// @param amountLiquidated amount of collateral liquidated
/// @param protocolSeizureAmount amount of collateral liquidated and seized by protocol as fee
/// @param defaultLiquidation boolean indicating if liquidation is a default or not
event Liquidation(
bytes32 termRepoId,
address borrower,
address liquidator,
uint256 closureAmount,
address collateralToken,
uint256 amountLiquidated,
uint256 protocolSeizureAmount,
bool defaultLiquidation
);
/// @notice Event emitted when a Liquidations are paused for a term
/// @param termRepoId term identifier
event LiquidationsPaused(bytes32 termRepoId);
/// @notice Event emitted when a Liquidations are unpaused for a term
/// @param termRepoId term identifier
event LiquidationsUnpaused(bytes32 termRepoId);
}
AddressUpgradeable.sol 244 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [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 Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @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-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(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);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
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);
}
}
}
ContextUpgradeable.sol 41 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
StringsUpgradeable.sol 85 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/MathUpgradeable.sol";
import "./math/SignedMathUpgradeable.sol";
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = MathUpgradeable.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, MathUpgradeable.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}
Initializable.sol 166 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}
MathUpgradeable.sol 339 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library MathUpgradeable {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}
UUPSUpgradeable.sol 112 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)
pragma solidity ^0.8.0;
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../ERC1967/ERC1967UpgradeUpgradeable.sol";
import {Initializable} from "./Initializable.sol";
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*
* _Available since v4.1._
*/
abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
address private immutable __self = address(this);
/**
* @dev Check that the execution is being performed through a delegatecall call and that the execution context is
* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
* fail.
*/
modifier onlyProxy() {
require(address(this) != __self, "Function must be called through delegatecall");
require(_getImplementation() == __self, "Function must be called through active proxy");
_;
}
/**
* @dev Check that the execution is not being performed through a delegate call. This allows a function to be
* callable on the implementing contract but not through proxies.
*/
modifier notDelegated() {
require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall");
_;
}
function __UUPSUpgradeable_init() internal onlyInitializing {
}
function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
}
/**
* @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
* implementation. It is used to validate the implementation's compatibility when performing an upgrade.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
*/
function proxiableUUID() external view virtual override notDelegated returns (bytes32) {
return _IMPLEMENTATION_SLOT;
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeTo(address newImplementation) public virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, new bytes(0), false);
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
* encoded in `data`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, data, true);
}
/**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeTo} and {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
*
* ```solidity
* function _authorizeUpgrade(address) internal override onlyOwner {}
* ```
*/
function _authorizeUpgrade(address newImplementation) internal virtual;
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
StorageSlotUpgradeable.sol 138 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
* _Available since v4.9 for `string`, `bytes`._
*/
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}
IERC1967Upgradeable.sol 26 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
*
* _Available since v4.8.3._
*/
interface IERC1967Upgradeable {
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
}
AccessControlUpgradeable.sol 261 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControlUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/StringsUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function __AccessControl_init() internal onlyInitializing {
}
function __AccessControl_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
StringsUpgradeable.toHexString(account),
" is missing role ",
StringsUpgradeable.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}
IBeaconUpgradeable.sol 16 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeaconUpgradeable {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
IAccessControlUpgradeable.sol 88 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControlUpgradeable {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}
SignedMathUpgradeable.sol 43 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMathUpgradeable {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
draft-IERC1822Upgradeable.sol 20 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822ProxiableUpgradeable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
ERC165Upgradeable.sol 42 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import {Initializable} from "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
IERC165Upgradeable.sol 25 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
ERC1967UpgradeUpgradeable.sol 170 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)
pragma solidity ^0.8.2;
import "../beacon/IBeaconUpgradeable.sol";
import "../../interfaces/IERC1967Upgradeable.sol";
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/StorageSlotUpgradeable.sol";
import {Initializable} from "../utils/Initializable.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*/
abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
function __ERC1967Upgrade_init() internal onlyInitializing {
}
function __ERC1967Upgrade_init_unchained() internal onlyInitializing {
}
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract");
StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Perform implementation upgrade
*
* Emits an {Upgraded} event.
*/
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
/**
* @dev Perform implementation upgrade with additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
_upgradeTo(newImplementation);
if (data.length > 0 || forceCall) {
AddressUpgradeable.functionDelegateCall(newImplementation, data);
}
}
/**
* @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
*
* Emits an {Upgraded} event.
*/
function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {
// Upgrades from old implementations will perform a rollback test. This test requires the new
// implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
// this special case will break upgrade paths from old UUPS implementation to new ones.
if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {
_setImplementation(newImplementation);
} else {
try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {
require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
} catch {
revert("ERC1967Upgrade: new implementation is not UUPS");
}
_upgradeToAndCall(newImplementation, data, forceCall);
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*/
function _getAdmin() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
require(newAdmin != address(0), "ERC1967: new admin is the zero address");
StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {AdminChanged} event.
*/
function _changeAdmin(address newAdmin) internal {
emit AdminChanged(_getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
*/
bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function _getBeacon() internal view returns (address) {
return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract");
require(
AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),
"ERC1967: beacon implementation is not a contract"
);
StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;
}
/**
* @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
* not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
*
* Emits a {BeaconUpgraded} event.
*/
function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0 || forceCall) {
AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);
}
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
Read Contract
DEFAULT_ADMIN_ROLE 0xa217fddf → bytes32
DEVOPS_ROLE 0x201a6625 → bytes32
INITIALIZER_ROLE 0x27df3d3e → bytes32
TERM_CONTRACT 0xefe6b381 → bytes32
TERM_DELISTER 0xbb452ef8 → bytes32
getRoleAdmin 0x248a9ca3 → bytes32
hasRole 0x91d14854 → bool
proxiableUUID 0x52d1902d → bytes32
supportsInterface 0x01ffc9a7 → bool
version 0x54fd4d50 → string
Write Contract 68 functions
These functions modify contract state and require a wallet transaction to execute.
emitAuctionCancelled 0xa098baba
bytes32 termAuctionId
bool nonViableAuction
bool auctionCancelledforWithdrawal
emitAuctionCompleted 0xef121670
bytes32 termAuctionId
uint256 timestamp
uint256 blockNumber
uint256 totalAssignedBids
uint256 totalAssignedOffers
uint256 clearingPrice
emitBidAssigned 0x03e852b1
bytes32 termAuctionId
bytes32 id
uint256 amount
emitBidFulfilled 0xff8b11c9
bytes32 termRepoId
address bidder
uint256 purchasePrice
uint256 repurchasePrice
uint256 servicingFees
emitBidInShortfall 0x5bcf235d
bytes32 termAuctionId
bytes32 id
emitBidLocked 0x3281fe3f
bytes32 termAuctionId
tuple bid
address referralAddress
emitBidLockingPaused 0x8435ab74
bytes32 termAuctionId
bytes32 termRepoId
emitBidLockingUnpaused 0xb423ac9d
bytes32 termAuctionId
bytes32 termRepoId
emitBidRevealed 0x2ba20e16
bytes32 termAuctionId
bytes32 id
uint256 bidPrice
emitBidUnlocked 0x07fec0e3
bytes32 termAuctionId
bytes32 id
emitBidUnlockingPaused 0x4960a11c
bytes32 termAuctionId
bytes32 termRepoId
emitBidUnlockingUnpaused 0x81100ddc
bytes32 termAuctionId
bytes32 termRepoId
emitBurnCollapseExposure 0x0190d5cf
bytes32 termRepoId
address borrower
uint256 closeAmount
emitCollateralLocked 0xee9e68bb
bytes32 termRepoId
address borrower
address collateralToken
uint256 amount
emitCollateralUnlocked 0x3b8d409b
bytes32 termRepoId
address borrower
address collateralToken
uint256 amount
emitCompleteAuctionPaused 0x5fdd1487
bytes32 termAuctionId
bytes32 termRepoId
emitCompleteAuctionUnpaused 0x03655a0c
bytes32 termAuctionId
bytes32 termRepoId
emitDelistTermAuction 0xbc166292
bytes32 termAuctionId
emitDelistTermRepo 0x895752dd
bytes32 termRepoId
emitExposureClosedOnRolloverExisting 0x380d9219
bytes32 termRepoId
address borrower
uint256 amountRolled
emitExposureOpenedOnRolloverNew 0xcd7b1e8c
bytes32 termRepoId
address borrower
uint256 purchasePrice
uint256 repurchasePrice
uint256 servicingFees
emitLiquidation 0x9cc487d7
bytes32 termRepoId
address borrower
address liquidator
uint256 closureAmount
address collateralToken
uint256 amountLiquidated
uint256 protocolSeizureAmount
bool defaultLiquidation
emitLiquidationPaused 0xc8df6179
bytes32 termRepoId
emitLiquidationUnpaused 0x5bbfdfa0
bytes32 termRepoId
emitMintExposure 0x4203247e
bytes32 termRepoId
address minter
uint256 netTokensReceived
uint256 servicingFeeTokens
uint256 repurchasePrice
emitMintExposureAccessGranted 0xf89c081e
bytes32 termRepoId
address authedUser
emitOfferAssigned 0xba0cf0ab
bytes32 termAuctionId
bytes32 id
uint256 amount
emitOfferFulfilled 0x158b36f6
bytes32 offerId
address offeror
uint256 purchasePrice
uint256 repurchasePrice
uint256 repoTokensMinted
emitOfferLocked 0xc8a2cfc0
bytes32 termAuctionId
bytes32 id
address offeror
bytes32 offerPrice
uint256 amount
address purchaseToken
address referralAddress
emitOfferLockedByServicer 0xbba53d05
bytes32 termRepoId
address offeror
uint256 amount
emitOfferLockingPaused 0x935dcfc7
bytes32 termAuctionId
bytes32 termRepoId
emitOfferLockingUnpaused 0x2f5d386f
bytes32 termAuctionId
bytes32 termRepoId
emitOfferRevealed 0x5ed17df6
bytes32 termAuctionId
bytes32 id
uint256 offerPrice
emitOfferUnlocked 0x5ba1a507
bytes32 termAuctionId
bytes32 id
emitOfferUnlockedByServicer 0xd3a93160
bytes32 termRepoId
address offeror
uint256 amount
emitOfferUnlockingPaused 0x703d84ab
bytes32 termAuctionId
bytes32 termRepoId
emitOfferUnlockingUnpaused 0x90b8e0aa
bytes32 termAuctionId
bytes32 termRepoId
emitPairReopeningBidLocker 0xf3782f21
bytes32 termRepoId
address termRepoCollateralManager
address termAuctionBidLocker
emitReopeningOfferLockerPaired 0x299cf962
bytes32 termRepoId
address termRepoServicer
address termAuctionOfferLocker
address termAuction
emitRepurchasePaymentSubmitted 0x5be4918a
bytes32 termRepoId
address borrower
uint256 amount
emitRolloverCancellation 0xf6b650b1
bytes32 termRepoId
address borrower
emitRolloverElection 0xb0b50c23
bytes32 termRepoId
bytes32 rolloverTermRepoId
address borrower
address rolloverAuction
uint256 rolloverAmount
bytes32 hashedBidPrice
emitRolloverProcessed 0x3f2194cf
bytes32 termRepoId
address borrower
emitRolloverTermApprovalRevoked 0x4b7025f7
bytes32 termRepoId
bytes32 rolloverTermAuctionId
emitRolloverTermApproved 0xa34bfcd1
bytes32 termRepoId
bytes32 rolloverTermAuctionId
emitTermAuctionBidLockerInitialized 0x2b6cea31
bytes32 termRepoId
bytes32 termAuctionId
address termAuctionBidLocker
uint256 auctionStartTime
uint256 revealTime
uint256 maxBidPrice
uint256 minimumTenderAmount
uint256 dayCountFractionMantissa
emitTermAuctionInitialized 0x383a8ab1
bytes32 termRepoId
bytes32 termAuctionId
address termAuction
uint256 auctionEndTime
string version
emitTermAuctionOfferLockerInitialized 0x8866d130
bytes32 termRepoId
bytes32 termAuctionId
address termAuctionOfferLocker
uint256 auctionStartTime
uint256 revealTime
uint256 maxOfferPrice
uint256 minimumTenderAmount
emitTermContractUpgraded 0xb3c2d50b
address proxy
address implementation
emitTermRepoCollateralManagerInitialized 0xa6cd751c
bytes32 termRepoId
address termRepoCollateralManager
address[] collateralTokens
uint256[] initialCollateralRatios
uint256[] maintenanceCollateralRatios
uint256[] liquidatedDamagesSchedule
emitTermRepoLockerInitialized 0x9c871b31
bytes32 termRepoId
address termRepoLocker
emitTermRepoLockerTransfersPaused 0x80c48d13
bytes32 termRepoId
emitTermRepoLockerTransfersUnpaused 0x481a750a
bytes32 termRepoId
emitTermRepoRolloverManagerInitialized 0xe69a5f47
bytes32 termRepoId
address rolloverManager
emitTermRepoServicerInitialized 0x046b6ef3
bytes32 termRepoId
address termRepoServicer
address purchaseToken
uint256 maturityTimestamp
uint256 endOfRepurchaseWindow
uint256 redemptionTimestamp
uint256 servicingFee
string version
emitTermRepoTokenBurningPaused 0x0954cf03
bytes32 termRepoId
emitTermRepoTokenBurningUnpaused 0xb29aaf75
bytes32 termRepoId
emitTermRepoTokenInitialized 0x9d207b1c
bytes32 termRepoId
address termRepoToken
uint256 redemptionRatio
emitTermRepoTokenMintingPaused 0x381b414c
bytes32 termRepoId
emitTermRepoTokenMintingUnpaused 0x3a094f36
bytes32 termRepoId
emitTermRepoTokensRedeemed 0xd4f417a2
bytes32 termRepoId
address redeemer
uint256 redemptionAmount
uint256 redemptionHaircut
grantRole 0x2f2ff15d
bytes32 role
address account
initialize 0xc0c53b8b
address devopsWallet_
address termDelister_
address termInitializer_
pairTermContract 0xee407388
address termContract
renounceRole 0x36568abe
bytes32 role
address account
revokeRole 0xd547741f
bytes32 role
address account
upgradeTo 0x3659cfe6
address newImplementation
upgradeToAndCall 0x4f1ef286
address newImplementation
bytes data
Recent Transactions
This address has 1 on-chain transactions, but only 0.6% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →