2 txs
162 calls
constructor
constructor((address pool, address oracle, address token, uint256 tokenScale) constants, (uint128 debtFloor, uint64 liquidationRatio, uint64 liquidationPenalty, uint64 liquidationDiscount, address roleAdmin, address vaultAdmin, address pauseAdmin) config)
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getDebtData
viewfunction getDebtData(address position) view returns (tuple)
getDebtInfo
viewfunction getDebtInfo(address position) view returns (uint256 debt, uint256 accruedInterest, uint256 cumulativeQuotaInterest)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasPermission
viewfunction hasPermission(address owner, address caller) view returns (bool)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
liquidationConfig
viewfunction liquidationConfig() view returns (uint64 liquidationPenalty, uint64 liquidationDiscount)
oracle
viewfunction oracle() view returns (address)
paused
viewfunction paused() view returns (bool)
pausedAt
viewfunction pausedAt() view returns (uint256)
pool
viewfunction pool() view returns (address)
poolQuotaKeeper
viewfunction poolQuotaKeeper() view returns (address)
poolUnderlying
viewfunction poolUnderlying() view returns (address)
poolUnderlyingScale
viewfunction poolUnderlyingScale() view returns (uint256)
positions
viewfunction positions(address) view returns (uint256 collateral, uint256 debt, uint256 lastDebtUpdate, uint256 cumulativeIndexLastUpdate, uint192 cumulativeQuotaIndexLU, uint128 cumulativeQuotaInterest)
quotasInterest
viewfunction quotasInterest(address position) view returns (uint256)
rewardController
viewfunction rewardController() view returns (address)
rewardManager
viewfunction rewardManager() view returns (address)
spotPrice
viewfunction spotPrice() view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
token
viewfunction token() view returns (address)
tokenScale
viewfunction tokenScale() view returns (uint256)
totalDebt
viewfunction totalDebt() view returns (uint256)
vaultConfig
viewfunction vaultConfig() view returns (uint128 debtFloor, uint64 liquidationRatio)
virtualDebt
viewfunction virtualDebt(address position) view returns (uint256)
borrow
nonpayablefunction borrow(address borrower, address position, uint256 amount) returns (uint256 borrowAmount)
deposit
nonpayablefunction deposit(address to, uint256 amount) returns (uint256 tokenAmount)
getRewards
nonpayablefunction getRewards(address owner)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
liquidatePosition
nonpayablefunction liquidatePosition(address owner, uint256 repayAmount)
liquidatePositionBadDebt
nonpayablefunction liquidatePositionBadDebt(address owner, uint256 repayAmount)
modifyCollateralAndDebt
nonpayablefunction modifyCollateralAndDebt(address owner, address collateralizer, address creditor, int256 deltaCollateral, int256 deltaDebt)
modifyPermission
nonpayablefunction modifyPermission(address caller, bool permitted)
modifyPermission
nonpayablefunction modifyPermission(address owner, address caller, bool permitted)
pause
nonpayablefunction pause()
recoverERC20
nonpayablefunction recoverERC20(address tokenAddress, address to, uint256 tokenAmount)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address account)
repay
nonpayablefunction repay(address borrower, address position, uint256 amount) returns (uint256 repayAmount)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setParameter
nonpayablefunction setParameter(bytes32 parameter, address data)
setParameter
nonpayablefunction setParameter(bytes32 parameter, uint256 data)
setPermissionAgent
nonpayablefunction setPermissionAgent(address agent, bool permitted)
unpause
nonpayablefunction unpause()
withdraw
nonpayablefunction withdraw(address to, uint256 amount) returns (uint256 tokenAmount)
events
LiquidatePosition
event LiquidatePosition(address indexed position, uint256 collateralReleased, uint256 normalDebtRepaid, address indexed liquidator)
ModifyCollateralAndDebt
event ModifyCollateralAndDebt(address indexed position, address indexed collateralizer, address indexed creditor, int256 deltaCollateral, int256 deltaDebt)
ModifyPermission
event ModifyPermission(address authorizer, address owner, address caller, bool grant)
ModifyPosition
event ModifyPosition(address indexed position, uint256 debt, uint256 collateral, uint256 totalDebt)
Paused
event Paused(address account)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SetParameter
event SetParameter(bytes32 indexed parameter, address data)
SetParameter
event SetParameter(bytes32 indexed parameter, uint256 data)
SetPermittedAgent
event SetPermittedAgent(address owner, address agent, bool grant)
Unpaused
event Unpaused(address account)
VaultCreated
event VaultCreated(address indexed vault, address indexed token, address indexed owner)
errors
CDPVault__BadDebt
error CDPVault__BadDebt()
CDPVault__liquidatePosition_invalidParameters
error CDPVault__liquidatePosition_invalidParameters()
CDPVault__liquidatePosition_invalidSpotPrice
error CDPVault__liquidatePosition_invalidSpotPrice()
CDPVault__liquidatePosition_notUnsafe
error CDPVault__liquidatePosition_notUnsafe()
CDPVault__modifyCollateralAndDebt_maxUtilizationRatio
error CDPVault__modifyCollateralAndDebt_maxUtilizationRatio()
CDPVault__modifyCollateralAndDebt_noPermission
error CDPVault__modifyCollateralAndDebt_noPermission()
CDPVault__modifyCollateralAndDebt_notSafe
error CDPVault__modifyCollateralAndDebt_notSafe()
CDPVault__modifyPosition_debtFloor
error CDPVault__modifyPosition_debtFloor()
CDPVault__noBadDebt
error CDPVault__noBadDebt()
CDPVault__recoverERC20_invalidToken
error CDPVault__recoverERC20_invalidToken()
CDPVault__repayAmountNotEnough
error CDPVault__repayAmountNotEnough()
CDPVault__setParameter_unrecognizedParameter
error CDPVault__setParameter_unrecognizedParameter()
CDPVault__tooHighRepayAmount
error CDPVault__tooHighRepayAmount()
Math__add_overflow_signed
error Math__add_overflow_signed()
Math__mul_overflow_signed
error Math__mul_overflow_signed()
Math__toInt256_overflow
error Math__toInt256_overflow()
Permission__modifyPermission_notPermitted
error Permission__modifyPermission_notPermitted()
creation bytecode
0x6101206040523480156200001257600080fd5b506040516200488e3803806200488e83398101604081905262000035916200049a565b6001805460ff1916905581516001600160a01b0390811660c052602080840151600b80546001600160a01b03191691841691909117905560408085018051841660805251815163313ce56760e01b8152915193169263313ce567926004808401939192918290030181865afa158015620000b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d99190620005c9565b620000e690600a62000708565b60a0818152505060c0516001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200012e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000154919062000719565b6001600160a01b031660e08190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa1580156200019e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c49190620005c9565b620001d190600a62000708565b6101005260408051808201825282516001600160801b03168082526020808501516001600160401b03908116938201849052600580546001600160c01b031916909317600160801b909402939093179091558251808401845292840151821680845260608501519092169201829052600880546001600160801b03191690911768010000000000000000909202919091179055608081015162000277906000906200033b565b620002ad7f7e2be3cffb06427cbcb9b1d12d4b78adcf14a2bf640e9bbdeb54bb711b65ec718260a001516200033b60201b60201c565b620002e37f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8260c001516200033b60201b60201c565b80608001516001600160a01b03166080516001600160a01b0316306001600160a01b03167f897c133dfbfe1f6239e98b4ffd7e4f6c86a62350a131a7a37790419f58af02f960405160405180910390a4505062000739565b620003478282620003c4565b620003c0576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200037f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b604051608081016001600160401b03811182821017156200042057634e487b7160e01b600052604160045260246000fd5b60405290565b60405160e081016001600160401b03811182821017156200042057634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200046d57600080fd5b50565b80516001600160401b03811681146200048857600080fd5b919050565b8051620004888162000457565b600080828403610160811215620004b057600080fd5b6080811215620004bf57600080fd5b620004c9620003ef565b8451620004d68162000457565b81526020850151620004e88162000457565b60208201526040850151620004fd8162000457565b604082015260608581015190820152925060e0607f19820112156200052157600080fd5b506200052c62000426565b60808401516001600160801b03811681146200054757600080fd5b81526200055760a0850162000470565b60208201526200056a60c0850162000470565b60408201526200057d60e0850162000470565b60608201526200059161010085016200048d565b6080820152620005a561012085016200048d565b60a0820152620005b961014085016200048d565b60c0820152809150509250929050565b600060208284031215620005dc57600080fd5b815160ff81168114620005ee57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200064c578160001904821115620006305762000630620005f5565b808516156200063e57918102915b93841c939080029062000610565b509250929050565b6000826200066557506001620003e9565b816200067457506000620003e9565b81600181146200068d57600281146200069857620006b8565b6001915050620003e9565b60ff841115620006ac57620006ac620005f5565b50506001821b620003e9565b5060208310610133831016604e8410600b8410161715620006dd575081810a620003e9565b620006e983836200060b565b8060001904821115620007005762000700620005f5565b029392505050565b6000620005ee60ff84168362000654565b6000602082840312156200072c57600080fd5b8151620005ee8162000457565b60805160a05160c05160e05161010051613fdc620008b2600039600081816102db0152818161083401528181610d3c01528181610e0901528181610e3b01528181610e6901528181610fa1015281816110af015281816116240152818161166101528181611e6f01528181611f6b0152818161206d01526122f30152600081816105d801528181610d6f015281816115650152818161177f0152611f9e01526000818161031001528181610d9201528181610eb401528181610fdf01528181611532015281816116ac015281816117a2015281816117dd0152818161187401528181611b7701528181611ebc01528181611fc1015281816120b801528181612331015261270e01526000818161040801528181610f200152818161105f015281816117180152818161217201526125e2015260008181610753015281816107c201528181610a7301528181610f530152818161174b015281816121a50152818161220001528181612cd0015261311d0152613fdc6000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c8063745b5ef511610151578063be8da14b116100c3578063d9c70f5711610087578063d9c70f5714610697578063de55f11e146106aa578063df4014d914610728578063f3fef3a31461073b578063fc0c546a1461074e578063fc7b9c181461077557600080fd5b8063be8da14b14610643578063c11e47341461064b578063c75a4b5e1461065e578063cde6804114610671578063d547741f1461068457600080fd5b80637dff3797116101155780637dff3797146105d35780638309dbdd146105fa5780638456cb591461060d5780638cc5ce991461061557806391d1485414610628578063a217fddf1461063b57600080fd5b8063745b5ef51461053b57806376f899651461054e57806379ee54f7146105615780637cc34bb4146105745780637dc0d1d0146105c057600080fd5b80632f2ff15d116101ea57806341c2f54c116101ae57806341c2f54c1461044d57806347e7ef24146104605780635224372c1461047357806355f57510146104865780635c975abb1461051d578063723507be1461052857600080fd5b80632f2ff15d146103f0578063342c02b11461040357806336568abe1461042a578063398482d81461043d5780633f4ba83a1461044557600080fd5b80631c580ad51161023c5780631c580ad5146103325780631da649cf14610370578063248a9ca314610383578063280c37ef146103a65780632aa5270e146103b95780632e55d0f2146103e757600080fd5b806301ffc9a7146102795780630f4ef8a6146102a15780631171bda9146102c15780631665e3fe146102d657806316f0115b1461030b575b600080fd5b61028c61028736600461384c565b61077e565b60405190151581526020015b60405180910390f35b600a546102b4906001600160a01b031681565b6040516102989190613876565b6102d46102cf36600461389f565b6107b5565b005b6102fd7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610298565b6102b47f000000000000000000000000000000000000000000000000000000000000000081565b600854610350906001600160401b0380821691600160401b90041682565b604080516001600160401b03938416815292909116602083015201610298565b6102fd61037e36600461389f565b61082c565b6102fd6103913660046138e0565b60009081526020819052604090206001015490565b6102d46103b4366004613907565b610886565b6103cc6103c7366004613940565b6108fd565b60408051938452602084019290925290820152606001610298565b6102fd60025481565b6102d46103fe36600461395d565b61099d565b6102fd7f000000000000000000000000000000000000000000000000000000000000000081565b6102d461043836600461395d565b6109c7565b6102fd610a4a565b6102d4610ae1565b6102d461045b366004613982565b610b1b565b6102fd61046e366004613982565b611057565b6102fd61048136600461389f565b6110a7565b6104de610494366004613940565b60076020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160c01b03909116906001600160801b031686565b6040805196875260208701959095529385019290925260608401526001600160c01b031660808301526001600160801b031660a082015260c001610298565b60015460ff1661028c565b6102d46105363660046139ae565b6110e0565b6102fd610549366004613940565b611265565b6102d461055c366004613982565b6112f2565b6102d461056f366004613940565b61190b565b600554610599906001600160801b03811690600160801b90046001600160401b031682565b604080516001600160801b0390931683526001600160401b03909116602083015201610298565b600b546102b4906001600160a01b031681565b6102b47f000000000000000000000000000000000000000000000000000000000000000081565b6102d46106083660046139d0565b611a49565b6102d4611b18565b6009546102b4906001600160a01b031681565b61028c61063636600461395d565b611b4a565b6102fd600081565b6102b4611b73565b6102d461065936600461395d565b611bf7565b6102d461066c366004613a1b565b611cf6565b61028c61067f366004613a76565b612407565b6102d461069236600461395d565b612455565b6102d46106a5366004613907565b61247a565b6106bd6106b8366004613940565b6124dd565b60405161029891908151815260208083015190820152604080830151908201526060808301516001600160801b0316908201526080808301516001600160c01b039081169183019190915260a0808401519091169082015260c0918201519181019190915260e00190565b6102fd610736366004613940565b61255f565b6102fd610749366004613982565b6125da565b6102b47f000000000000000000000000000000000000000000000000000000000000000081565b6102fd60065481565b60006001600160e01b03198216637965db0b60e01b14806107af57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006107c08161261c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036108125760405163df3f588760e01b815260040160405180910390fd5b6108266001600160a01b0385168484612626565b50505050565b6000610858827f0000000000000000000000000000000000000000000000000000000000000000612689565b90506000610865826126d8565b61086e90613aba565b905061087e848587600085611cf6565b509392505050565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815194855291840192909252908201527f6501e8bfa2d3e686d62fe2c0c3275df594494583b0a63a70b7452d3eeb712bd6906060015b60405180910390a15050565b6001600160a01b0381166000908152600760209081526040808320815160c081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160c01b03166080830152600501546001600160801b031660a082015281908190819061097a90612702565b805160c082015160609092015190979196506001600160801b0316945092505050565b6000828152602081905260409020600101546109b88161261c565b6109c2838361283b565b505050565b6001600160a01b0381163314610a3c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a4682826128bf565b5050565b600b54604051632cbf04c160e01b81526000916001600160a01b031690632cbf04c190610a9b907f000000000000000000000000000000000000000000000000000000000000000090600401613876565b602060405180830381865afa158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190613ad6565b905090565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b0b8161261c565b610b13612924565b506000600255565b610b23612970565b6001600160a01b0382161580610b37575080155b15610b5557604051632bdc849360e21b815260040160405180910390fd5b604080518082018252600580546001600160801b0380821684526001600160401b03600160801b9092048216602080860191909152855180870187526008548085168252600160401b9004909316838201526001600160a01b038816600090815260078252868120875160c081018952815481526001820154938101939093526002810154978301979097526003870154606083015260048701546001600160c01b0316608083015295909301541660a08301529192610c1482612702565b90506000610c20610a4a565b905080600003610c4357604051636ec7a8fb60e11b815260040160405180910390fd5b610c6e610c4f836129b8565b8451610c5b90846129cb565b87602001516001600160401b03166129f9565b15610c8c5760405163f87e38e960e01b815260040160405180910390fd5b6000610ca58286602001516001600160401b03166129cb565b9050610cb58460000151826129cb565b610cbe846129b8565b11610cdc5760405163196e08b760e21b815260040160405180910390fd5b6000610ce88883612689565b8551909150811015610d0d5760405163031e966360e01b815260040160405180910390fd5b508351610d1a81836129cb565b9750600088610d28866129b8565b610d329190613aef565b90506000610d608a7f00000000000000000000000000000000000000000000000000000000000000006129cb565b9050610db76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f000000000000000000000000000000000000000000000000000000000000000084612a10565b600060a088018190526080808801516001600160c01b0316908901526020870151610dfb918d918a9190610dea886126d8565b610df390613aba565b600654612a48565b96506000610e2d87600001517f00000000000000000000000000000000000000000000000000000000000000006129cb565b90506000610e5f8860c001517f00000000000000000000000000000000000000000000000000000000000000006129cb565b90506000610e8d857f00000000000000000000000000000000000000000000000000000000000000006129cb565b6040516332a5417960e21b81526004810185905260248101849052604481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ca9505e490606401600060405180830381600087803b158015610f0057600080fd5b505af1158015610f14573d6000803e3d6000fd5b505050506000610f44877f00000000000000000000000000000000000000000000000000000000000000006129cb565b9050610f7a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612626565b6000610f928b60000151610f8d90613aba565b612cb5565b90508015611045576000610fc67f000000000000000000000000000000000000000000000000000000000000000083612d58565b604051636b22c77560e11b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d6458eea90602401600060405180830381600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b50505050505b50505050505050505050505050505050565b6000611083827f0000000000000000000000000000000000000000000000000000000000000000612689565b90506000611090826126d8565b90506110a0843333846000611cf6565b5092915050565b60006110d3827f0000000000000000000000000000000000000000000000000000000000000000612689565b9050600061086e826126d8565b6110e8612970565b7f7e2be3cffb06427cbcb9b1d12d4b78adcf14a2bf640e9bbdeb54bb711b65ec716111128161261c565b82683232b13a233637b7b960b91b0361114557600580546001600160801b0319166001600160801b038416179055611226565b826f6c69717569646174696f6e526174696f60801b03611189576005805467ffffffffffffffff60801b1916600160801b6001600160401b03851602179055611226565b82716c69717569646174696f6e50656e616c747960701b036111c6576008805467ffffffffffffffff19166001600160401b038416179055611226565b82721b1a5c5d5a59185d1a5bdb911a5cd8dbdd5b9d606a1b0361120d576008805467ffffffffffffffff60401b1916600160401b6001600160401b03851602179055611226565b604051638dd691e760e01b815260040160405180910390fd5b827f4327e67d6578eb2c9293fb22f9334006073ac1397c7100f5dd5adca09ad71c088360405161125891815260200190565b60405180910390a2505050565b6001600160a01b0381166000908152600760209081526040808320815160c081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160c01b03166080830152600501546001600160801b031660a082015281906112de90612702565b606001516001600160801b03169392505050565b6112fa612970565b6001600160a01b038216158061130e575080155b1561132c57604051632bdc849360e21b815260040160405180910390fd5b604080518082018252600580546001600160801b0380821684526001600160401b03600160801b9092048216602080860191909152855180870187526008548085168252600160401b9004909316838201526001600160a01b038816600090815260078252868120875160c081018952815481526001820154938101939093526002810154978301979097526003870154606083015260048701546001600160c01b0316608083015295909301541660a083015291926113eb82612702565b905060006113f7610a4a565b905060006114128286602001516001600160401b03166129cb565b90508160000361143557604051636ec7a8fb60e11b815260040160405180910390fd5b835161144190826129cb565b61144a846129b8565b11156114695760405163b53a43fd60e01b815260040160405180910390fd5b60006114758883612689565b905060006114908988600001516001600160401b03166129cb565b905060006114be8a89600001516001600160401b0316670de0b6b3a76400006114b99190613aef565b6129cb565b87519091508311156114e35760405163542e88e560e11b815260040160405180910390fd5b61150e6114ef876129b8565b88516114fb90886129cb565b8b602001516001600160401b03166129f9565b1561152c5760405163f87e38e960e01b815260040160405180910390fd5b61158d337f000000000000000000000000000000000000000000000000000000000000000061155b848e613aef565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190612a10565b600080600061159b896129b8565b905060008186036115c35750602089015160c08a0151600060a08d01819052945092506115f7565b6115e0868b600001518c602001518d604001518e60600151612d82565b6001600160801b031660a08f015291955090935090505b6080808b01516001600160c01b0316908c015261161a8f8c8684610dea8c6126d8565b9a506000611648847f00000000000000000000000000000000000000000000000000000000000000006129cb565b90506000611685868d6000015161165f9190613aef565b7f00000000000000000000000000000000000000000000000000000000000000006129cb565b6040516332a5417960e21b81526004810182905260248101849052600060448201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ca9505e490606401600060405180830381600087803b1580156116f857600080fd5b505af115801561170c573d6000803e3d6000fd5b50505050600061173c8a7f00000000000000000000000000000000000000000000000000000000000000006129cb565b90506117726001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612626565b6117c76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f00000000000000000000000000000000000000000000000000000000000000008b612a10565b60405163369a8cf560e21b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063da6a33d490602401600060405180830381600087803b15801561182957600080fd5b505af115801561183d573d6000803e3d6000fd5b50508e5161184e9250899150613aef565b156118f7576000611868888f6000015161165f9190613aef565b90506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d6458eea6118a5610f8d84613aba565b6040518263ffffffff1660e01b81526004016118c391815260200190565b600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b50505050505b505050505050505050505050505050505050565b600a546001600160a01b031615611a4657600a546001600160a01b038281166000908152600760205260408082205490516363fcb8d760e11b815291938493849391169163c7f971ae916119659188918690600401613b02565b6000604051808303816000875af1158015611984573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119ac9190810190613c07565b92509250925060005b8351811015611a41578281815181106119d0576119d0613cdb565b6020026020010151600014611a2f57611a2f828483815181106119f5576119f5613cdb565b6020026020010151868481518110611a0f57611a0f613cdb565b60200260200101516001600160a01b03166126269092919063ffffffff16565b80611a3981613cf1565b9150506119b5565b505050505b50565b6001600160a01b0383163314801590611a8657506001600160a01b038316600090815260046020908152604080832033845290915290205460ff16155b15611aa457604051638743d2ff60e01b815260040160405180910390fd5b6001600160a01b0383811660009081526003602090815260408083209386168352929052819020805460ff1916831515179055517fdcf2bd5a4c47afeb1792d170f6f5e6e528e30c6b546fffe62b697a11f8953b2b90611b0b903390869086908690613d0a565b60405180910390a1505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611b428161261c565b611a46612ee8565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663be8da14b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190613d34565b611bff612970565b7f7e2be3cffb06427cbcb9b1d12d4b78adcf14a2bf640e9bbdeb54bb711b65ec71611c298161261c565b826f3932bbb0b93221b7b73a3937b63632b960811b03611c6357600980546001600160a01b0319166001600160a01b038416179055611cc6565b826c3932bbb0b93226b0b730b3b2b960991b03611c9a57600a80546001600160a01b0319166001600160a01b038416179055611cc6565b82656f7261636c6560d01b0361120d57600b80546001600160a01b0319166001600160a01b0384161790555b827f83e498545bbe12d733822c752ac843578daa6554fe6f90753853156c3478e4f0836040516112589190613876565b6000811380611d055750600082125b8015611d185750611d168533612407565b155b80611d355750600082138015611d355750611d338433612407565b155b80611d525750600081128015611d525750611d508333612407565b155b15611d7057604051634c26249960e01b815260040160405180910390fd5b6000811380611d7e57508115155b15611d8b57611d8b612970565b6001600160a01b0385166000908152600760209081526040808320815160c081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160c01b03166080830152600501546001600160801b031660a082015290611e0382612702565b90506000806000806000871315611f21576000879050611e3181886020015188602001518a60600151612ef6565b60608801516001600160801b031660a08a01526080808901516001600160c01b0316908a01529095509350611e6588612cb5565b91506000611e93827f00000000000000000000000000000000000000000000000000000000000000006129cb565b60405163bf28068b60e01b8152600481018290526001600160a01b038d811660248301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063bf28068b90604401600060405180830381600087803b158015611f0257600080fd5b505af1158015611f16573d6000803e3d6000fd5b505050505050612159565b600087121561214a5760ff87901c60009081038089011890611f42876129b8565b9050808210611f6357809150611f57826126d8565b611f6090613aba565b98505b6000611f8f837f00000000000000000000000000000000000000000000000000000000000000006129cb565b9050611fe66001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168d7f000000000000000000000000000000000000000000000000000000000000000084612a10565b600082840361200a5760009750886020015196508860c00151955060009050612032565b612027848b602001518b602001518d606001518d60600151612d82565b929a50909850965090505b885161204c90612043908a90613aef565b610f8d90613aba565b94506000612063898b6000015161165f9190613aef565b90506000612091887f00000000000000000000000000000000000000000000000000000000000000006129cb565b6040516332a5417960e21b81526004810184905260248101829052600060448201529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ca9505e490606401600060405180830381600087803b15801561210457600080fd5b505af1158015612118573d6000803e3d6000fd5b5050506001600160801b0390931660a08d01525050506080808901516001600160c01b0316908a015250612159915050565b85602001519350846040015192505b60008813156121d35760006121966121708a612f82565b7f00000000000000000000000000000000000000000000000000000000000000006129cb565b90506121cd6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168c3084612a10565b50612229565b60008812156122295760006121f160ff8a901c8203808b0118612170565b90506122276001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168c83612626565b505b6122398b8786868c600654612a48565b604080518082019091526005546001600160801b0381168252600160801b90046001600160401b031660208201529096506000612274610a4a565b905060006122868960000151836129cb565b905060008a1380612297575060008b125b80156122c857506122c66122b26122ad8b612702565b6129b8565b8285602001516001600160401b03166129f9565b155b156122e657604051633f66923d60e01b815260040160405180910390fd5b83156123975760006123187f000000000000000000000000000000000000000000000000000000000000000086612d58565b604051636b22c77560e11b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d6458eea90602401600060405180830381600087803b15801561237d57600080fd5b505af1158015612391573d6000803e3d6000fd5b50505050505b8b6001600160a01b03168d6001600160a01b03168f6001600160a01b03167f7ce3e27b99e7e2e42f0ddcb6f6679a25081a5fd4ca991bcd05c45e54daa997088e8e6040516123ef929190918252602082015260400190565b60405180910390a45050505050505050505050505050565b6000816001600160a01b0316836001600160a01b0316148061244e57506001600160a01b0380841660009081526003602090815260408083209386168352929052205460ff165b9392505050565b6000828152602081905260409020600101546124708161261c565b6109c283836128bf565b3360008181526003602090815260408083206001600160a01b038716845290915290819020805460ff1916841515179055517fdcf2bd5a4c47afeb1792d170f6f5e6e528e30c6b546fffe62b697a11f8953b2b916108f191819086908690613d0a565b6124e56137f4565b6001600160a01b038216600090815260076020908152604091829020825160c081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160c01b031660808201526005909101546001600160801b031660a08201526107af90612702565b6001600160a01b0381166000908152600760209081526040808320815160c081018352815481526001820154938101939093526002810154918301919091526003810154606083015260048101546001600160c01b03166080830152600501546001600160801b031660a08201526107af906122ad90612702565b6000612606827f0000000000000000000000000000000000000000000000000000000000000000612689565b90506000612613826126d8565b61109090613aba565b611a468133612fd4565b6040516001600160a01b0383166024820152604481018290526109c290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261302d565b60007812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a7640000021582026126c65763bcbede656000526004601cfd5b50670de0b6b3a7640000919091020490565b6000600160ff1b82106126fe57604051632db27c5360e01b815260040160405180910390fd5b5090565b61270a6137f4565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663faaba9e26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561276a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278e9190613ad6565b602080850151845283018190526060840151604084015260808401516001600160c01b031660a084015290506127c382613102565b6001600160c01b031660808401526001600160801b03166060830181815260a0850151916127f2908390613d51565b6001600160801b0316905250815160408301516128109190836131ba565b60c0830181815260608401516001600160801b031691612831908390613d71565b9052509092915050565b6128458282611b4a565b610a46576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561287b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6128c98282611b4a565b15610a46576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61292c6131f4565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516129669190613876565b60405180910390a1565b60015460ff16156129b65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a33565b565b60c081015181516000916107af91613d71565b6000816000190483118202156129e95763c4c5d7f56000526004601cfd5b50670de0b6b3a764000091020490565b600083612a068484612689565b1015949350505050565b6040516001600160a01b03808516602483015283166044820152606481018290526108269085906323b872dd60e01b90608401612652565b612a936040518060c001604052806000815260200160008152602001600081526020016000815260200160006001600160c01b0316815260200160006001600160801b031681525090565b60208601518651612aa4818661323d565b885260208801879052606088018690524260408901528615801590612ad9575060055460208901516001600160801b03909116115b15612af757604051634b2c23a160e11b815260040160405180910390fd5b6001600160a01b0389166000908152600760209081526040918290208a518155908a015160018201559089015160028201556060890151600382015560808901516004820180546001600160c01b0319166001600160c01b0390921691909117905560a0890151600590910180546001600160801b0319166001600160801b0390921691909117905581871115612ba357612b928288613aef565b612b9c9085613d71565b9350612bba565b612bad8783613aef565b612bb79085613aef565b93505b60068490556009546001600160a01b031615612c3b576009546020890151604051631d94f24d60e01b81526001600160a01b0390921691631d94f24d91612c08918d91908990600401613b02565b600060405180830381600087803b158015612c2257600080fd5b505af1158015612c36573d6000803e3d6000fd5b505050505b600a546001600160a01b031615612c5757612c57898287613282565b602088810151895160408051928352928201529081018590526001600160a01b038a16907f5c97e4677e876dd60652844f112967ea027e30e6b2c479ef10dcafcfef253e8d9060600160405180910390a25095979650505050505050565b600080612cc0611b73565b6001600160a01b0316630ab3640f7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401612d0b9190613876565b602060405180830381865afa158015612d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4c9190613d84565b905061244e81846133da565b6000670de0b6b3a7640000612d6d84846133f7565b81612d7a57612d7a613da8565b059392505050565b6000808080886001600160801b03861615801590612d9f57508015155b15612e1357856001600160801b03168110612de757612dc76001600160801b03871682613aef565b9050612ddc6001600160801b03871684613d71565b925060009150612e17565b80612df28185613d71565b935060009150612e0b816001600160801b038916613aef565b925050612e17565b8591505b8015612ecb576000612e2a8a898b6131ba565b9050808210612e5357612e3d8183613aef565b9150612e498185613d71565b9350889450612ec5565b612e5d8285613d71565b93508988612e6f84633b9aca00613dbe565b612e799190613dbe565b612e839190613dd5565b612e918a633b9aca00613dbe565b612e9b9190613aef565b88612eaa8b633b9aca00613dbe565b612eb49190613dbe565b612ebe9190613dd5565b9450600091505b50612ecf565b8693505b612ed9818a613aef565b94505095509550955095915050565b612ef0613440565b42600255565b60008084600003612f0b575084905082612f79565b612f158686613d71565b9150612f2586633b9aca00613dbe565b8386612f3587633b9aca00613dbe565b612f3f9190613dbe565b612f499190613dd5565b612f539190613d71565b633b9aca00612f628487613dbe565b612f6c9190613dbe565b612f769190613dd5565b90505b94509492505050565b6000808212156126fe5760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610a33565b612fde8282611b4a565b610a4657612feb8161347b565b612ff683602061348d565b604051602001613007929190613e0d565b60408051601f198184030181529082905262461bcd60e51b8252610a3391600401613e7c565b6000613082826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136289092919063ffffffff16565b90508051600014806130a35750808060200190518101906130a39190613eaf565b6109c25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a33565b60008061310d611b73565b6001600160a01b031663e08a03db7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016131589190613876565b602060405180830381865afa158015613175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131999190613ecc565b905060006131b08460000151838660a00151613637565b9491935090915050565b6000836000036131cc5750600061244e565b83836131d88483613dbe565b6131e29190613dd5565b6131ec9190613aef565b949350505050565b60015460ff166129b65760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a33565b81810160008213801561324f57508281105b80613264575060008212801561326457508281115b156107af576040516354012a2960e11b815260040160405180910390fd5b60008113156132f657600a5460405163775c43d360e01b81526001600160a01b039091169063775c43d3906132bf90869086908690600401613b02565b600060405180830381600087803b1580156132d957600080fd5b505af11580156132ed573d6000803e3d6000fd5b50505050505050565b60008112156109c257600a546040516363fcb8d760e11b8152600091829182916001600160a01b03169063c7f971ae9061333890899089908990600401613b02565b6000604051808303816000875af1158015613357573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261337f9190810190613c07565b92509250925060005b83518110156132ed578281815181106133a3576133a3613cdb565b60200260200101516000146133c8576133c8828483815181106119f5576119f5613cdb565b806133d281613cf1565b915050613388565b60006127106133ed61ffff851684613ef5565b61244e9190613f25565b81810260008312806134225750811580159061342257508282828161341e5761341e613da8565b0514155b156107af57604051631eed389360e01b815260040160405180910390fd5b613448612970565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612959565b60606107af6001600160a01b03831660145b6060600061349c836002613dbe565b6134a7906002613d71565b6001600160401b038111156134be576134be613b23565b6040519080825280601f01601f1916602001820160405280156134e8576020820181803683370190505b509050600360fc1b8160008151811061350357613503613cdb565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061353257613532613cdb565b60200101906001600160f81b031916908160001a9053506000613556846002613dbe565b613561906001613d71565b90505b60018111156135d9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061359557613595613cdb565b1a60f81b8282815181106135ab576135ab613cdb565b60200101906001600160f81b031916908160001a90535060049490941c936135d281613f53565b9050613564565b50831561244e5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a33565b60606131ec848460008561367b565b60006b033b2e3c9fd0803ce80000006136508385613f6a565b613671906001600160c01b03166bffffffffffffffffffffffff8716613dbe565b6131ec9190613dd5565b6060824710156136dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a33565b600080866001600160a01b031685876040516136f89190613f8a565b60006040518083038185875af1925050503d8060008114613735576040519150601f19603f3d011682016040523d82523d6000602084013e61373a565b606091505b509150915061374b87838387613756565b979650505050505050565b606083156137c55782516000036137be576001600160a01b0385163b6137be5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a33565b50816131ec565b6131ec83838151156137da5781518083602001fd5b8060405162461bcd60e51b8152600401610a339190613e7c565b6040518060e0016040528060008152602001600081526020016000815260200160006001600160801b0316815260200160006001600160c01b0316815260200160006001600160c01b03168152602001600081525090565b60006020828403121561385e57600080fd5b81356001600160e01b03198116811461244e57600080fd5b6001600160a01b0391909116815260200190565b6001600160a01b0381168114611a4657600080fd5b6000806000606084860312156138b457600080fd5b83356138bf8161388a565b925060208401356138cf8161388a565b929592945050506040919091013590565b6000602082840312156138f257600080fd5b5035919050565b8015158114611a4657600080fd5b6000806040838503121561391a57600080fd5b82356139258161388a565b91506020830135613935816138f9565b809150509250929050565b60006020828403121561395257600080fd5b813561244e8161388a565b6000806040838503121561397057600080fd5b8235915060208301356139358161388a565b6000806040838503121561399557600080fd5b82356139a08161388a565b946020939093013593505050565b600080604083850312156139c157600080fd5b50508035926020909101359150565b6000806000606084860312156139e557600080fd5b83356139f08161388a565b92506020840135613a008161388a565b91506040840135613a10816138f9565b809150509250925092565b600080600080600060a08688031215613a3357600080fd5b8535613a3e8161388a565b94506020860135613a4e8161388a565b93506040860135613a5e8161388a565b94979396509394606081013594506080013592915050565b60008060408385031215613a8957600080fd5b8235613a948161388a565b915060208301356139358161388a565b634e487b7160e01b600052601160045260246000fd5b6000600160ff1b8201613acf57613acf613aa4565b5060000390565b600060208284031215613ae857600080fd5b5051919050565b818103818111156107af576107af613aa4565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613b6157613b61613b23565b604052919050565b60006001600160401b03821115613b8257613b82613b23565b5060051b60200190565b8051613b978161388a565b919050565b600082601f830112613bad57600080fd5b81516020613bc2613bbd83613b69565b613b39565b82815260059290921b84018101918181019086841115613be157600080fd5b8286015b84811015613bfc5780518352918301918301613be5565b509695505050505050565b600080600060608486031215613c1c57600080fd5b83516001600160401b0380821115613c3357600080fd5b818601915086601f830112613c4757600080fd5b81516020613c57613bbd83613b69565b82815260059290921b8401810191818101908a841115613c7657600080fd5b948201945b83861015613c9d578551613c8e8161388a565b82529482019490820190613c7b565b91890151919750909350505080821115613cb657600080fd5b50613cc386828701613b9c565b925050613cd260408501613b8c565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201613d0357613d03613aa4565b5060010190565b6001600160a01b039485168152928416602084015292166040820152901515606082015260800190565b600060208284031215613d4657600080fd5b815161244e8161388a565b6001600160801b038181168382160190808211156110a0576110a0613aa4565b808201808211156107af576107af613aa4565b600060208284031215613d9657600080fd5b815161ffff8116811461244e57600080fd5b634e487b7160e01b600052601260045260246000fd5b80820281158282048414176107af576107af613aa4565b600082613de457613de4613da8565b500490565b60005b83811015613e04578181015183820152602001613dec565b50506000910152565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260008351613e3f816017850160208801613de9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613e70816028840160208801613de9565b01602801949350505050565b6020815260008251806020840152613e9b816040850160208701613de9565b601f01601f19169190910160400192915050565b600060208284031215613ec157600080fd5b815161244e816138f9565b600060208284031215613ede57600080fd5b81516001600160c01b038116811461244e57600080fd5b80820260008212600160ff1b84141615613f1157613f11613aa4565b81810583148215176107af576107af613aa4565b600082613f3457613f34613da8565b600160ff1b821460001984141615613f4e57613f4e613aa4565b500590565b600081613f6257613f62613aa4565b506000190190565b6001600160c01b038281168282160390808211156110a0576110a0613aa4565b60008251613f9c818460208701613de9565b919091019291505056fea2646970667358221220e2d6dc288eb7cdd3be316389d71b87bb5455dcc64429a0d326d1fe223594604164736f6c634300081300330000000000000000000000000eecbdbf7331b8a50fcd0bf2c267bf47bd876054000000000000000000000000078f2b1ee5ef03079c1ebc0275d922dd6ad4721600000000000000000000000045f163e583d34b8e276445dd3da9ae077d137d720000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000f43fc2c04ee00000000000000000000000000000000000000000000000000000dbd2fc137a300000000000000000000000000000000000000000000000000000d99a8cec7e200000000000000000000000000009b2205e4e62e333141117fc895dc77b558e2a2bc0000000000000000000000009b2205e4e62e333141117fc895dc77b558e2a2bc0000000000000000000000009b2205e4e62e333141117fc895dc77b558e2a2bc