1 tx
2 calls
constructor
constructor(address _pool)
functions
approximateDolaAndDbrNeeded
viewfunction approximateDolaAndDbrNeeded(uint256 dolaBorrowAmount, uint256 period, uint256 iterations) view returns (uint256 dolaForDbr, uint256 dbrNeeded)
CALLBACK_SUCCESS
viewfunction CALLBACK_SUCCESS() view returns (bytes32)
curvePool
viewfunction curvePool() view returns (address)
DBR
viewfunction DBR() view returns (address)
DELEVERAGE
viewfunction DELEVERAGE() view returns (bytes32)
flash
viewfunction flash() view returns (address)
isExchangeProxy
viewfunction isExchangeProxy(address) view returns (bool)
LEVERAGE
viewfunction LEVERAGE() view returns (bytes32)
markets
viewfunction markets(address) view returns (address buySellToken, address collateral, address helper, bool useProxy)
owner
viewfunction owner() view returns (address)
allowProxy
nonpayablefunction allowProxy(address _proxy)
deleveragePosition
payablefunction deleveragePosition(uint256 value, address market, address exchangeProxy, uint256 collateralAmount, bytes swapCallData, tuple permit, bytes helperData, tuple dbrData) payable
denyProxy
nonpayablefunction denyProxy(address _proxy)
depositAndLeveragePosition
payablefunction depositAndLeveragePosition(uint256 initialDeposit, uint256 value, address market, address exchangeProxy, bytes swapCallData, tuple permit, bytes helperData, tuple dbrData, bool depositCollateral) payable
leveragePosition
payablefunction leveragePosition(uint256 value, address market, address exchangeProxy, bytes swapCallData, tuple permit, bytes helperData, tuple dbrData) payable
onFlashLoan
nonpayablefunction onFlashLoan(address initiator, address, uint256 amount, uint256, bytes data) returns (bytes32)
renounceOwnership
nonpayablefunction renounceOwnership()
setMarket
nonpayablefunction setMarket(address _market, address _buySellToken, address _helper, bool useProxy)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updateMarketHelper
nonpayablefunction updateMarketHelper(address _market, address _helper)
events
Deposit
event Deposit(address indexed market, address indexed account, address indexed token, uint256 depositAmount)
LeverageDown
event LeverageDown(address indexed market, address indexed account, uint256 dolaFlashMinted, uint256 collateralSold, uint256 dolaUserRepaid, uint256 dbrSoldForDola)
LeverageUp
event LeverageUp(address indexed market, address indexed account, uint256 dolaFlashMinted, uint256 collateralDeposited, uint256 dolaBorrowed, uint256 dolaForDBR)
NewHelper
event NewHelper(address indexed market, address indexed helper)
NewMarket
event NewMarket(address indexed market, address indexed buySellToken, address collateral, address indexed helper)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
CollateralIsZero
error CollateralIsZero()
CollateralNotSet
error CollateralNotSet()
DepositFailed
error DepositFailed(uint256 expected, uint256 actual)
DOLAInvalidBorrow
error DOLAInvalidBorrow(uint256 expected, uint256 actual)
DOLAInvalidRepay
error DOLAInvalidRepay(uint256 expected, uint256 actual)
FailedCall
error FailedCall()
InsufficientBalance
error InsufficientBalance(uint256 balance, uint256 needed)
InvalidAction
error InvalidAction(bytes32 action)
InvalidHelperAddress
error InvalidHelperAddress()
InvalidProxyAddress
error InvalidProxyAddress()
MarketNotSet
error MarketNotSet(address market)
MarketSetupFailed
error MarketSetupFailed(address market, address buySellToken, address collateral, address helper)
NoMarket
error NoMarket(address market)
NotALE
error NotALE(address caller)
NotFlashMinter
error NotFlashMinter(address caller)
NothingToDeposit
error NothingToDeposit()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SwapFailed
error SwapFailed()
TotalSupplyChanged
error TotalSupplyChanged(uint256 expected, uint256 actual)
WithdrawFailed
error WithdrawFailed(uint256 expected, uint256 actual)
creation bytecode
0x60a060405234801562000010575f80fd5b5060405162004180380380620041808339810160408190526200003391620002ce565b8033806200005a57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b62000065816200027f565b50600180556001600160a01b038116608081905260405163095ea7b360e01b815260048101919091525f19602482015273865377367054516e17014ccded1e7d814edc9ce49063095ea7b3906044015f604051808303815f87803b158015620000cc575f80fd5b505af1158015620000df573d5f803e3d5ffd5b505060405163095ea7b360e01b81526001600160a01b03841660048201525f19602482015273ad038eb671c44b853887a7e32528fab35dc5d710925063095ea7b391506044015f604051808303815f87803b1580156200013d575f80fd5b505af115801562000150573d5f803e3d5ffd5b505060405163c661065760e01b81525f600482015273865377367054516e17014ccded1e7d814edc9ce492506001600160a01b038416915063c661065790602401602060405180830381865afa158015620001ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d39190620002ce565b6001600160a01b031603620001f1575f6003556001600255620001fb565b60016003555f6002555b5060405163095ea7b360e01b8152736c5fdc0c53b122ae0f15a863c349f3a481de8f1f60048201525f19602482015273865377367054516e17014ccded1e7d814edc9ce49063095ea7b3906044015f604051808303815f87803b15801562000261575f80fd5b505af115801562000274573d5f803e3d5ffd5b5050505050620002fd565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215620002df575f80fd5b81516001600160a01b0381168114620002f6575f80fd5b9392505050565b608051613e4e620003325f395f818161019701528181610d6f01528181610ea10152818161296a01526130050152613e4e5ff3fe60806040526004361061015a575f3560e01c80638e8f294b116100bb578063d336c82d11610071578063e0bfa25811610057578063e0bfa2581461046a578063f18524c0146104a8578063f2fde38b146104bb575f80fd5b8063d336c82d14610424578063dfc0791c1461044b575f80fd5b8063b8b71de1116100a1578063b8b71de1146103aa578063b9181d1c146103de578063c9f7e59614610411575f80fd5b80638e8f294b146102f2578063a92d64e01461038b575f80fd5b806376daa13e116101105780638237e538116100f65780638237e538146102705780638d01f0ba146102a35780638da5cb5b146102d6575f80fd5b806376daa13e1461023e5780637c65d3fc1461025d575f80fd5b806323e30c8b1161014057806323e30c8b146101d65780636d12471514610203578063715018a61461022a575f80fd5b80630715940e14610165578063218751b214610186575f80fd5b3661016157005b5f80fd5b348015610170575f80fd5b5061018461017f36600461325a565b6104da565b005b348015610191575f80fd5b506101b97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101e1575f80fd5b506101f56101f03660046132ba565b610560565b6040519081526020016101cd565b34801561020e575f80fd5b506101b973ad038eb671c44b853887a7e32528fab35dc5d71081565b348015610235575f80fd5b5061018461074c565b348015610249575f80fd5b5061018461025836600461325a565b61075f565b61018461026b366004613357565b6107e8565b34801561027b575f80fd5b506101f57f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd981565b3480156102ae575f80fd5b506101f57f147ae675f296256b5eecc84e9bf2bc391732bfd51dcbff57b4a60ba6cb0ffaf181565b3480156102e1575f80fd5b505f546001600160a01b03166101b9565b3480156102fd575f80fd5b5061035661030c36600461325a565b60056020525f90815260409020805460018201546002909201546001600160a01b039182169282169181169074010000000000000000000000000000000000000000900460ff1684565b6040516101cd94939291906001600160a01b039485168152928416602084015292166040820152901515606082015260800190565b348015610396575f80fd5b506101846103a5366004613416565b61097f565b3480156103b5575f80fd5b506103c96103c436600461344d565b610d19565b604080519283526020830191909152016101cd565b3480156103e9575f80fd5b506101f57f0d4f76b1b60020edd6acf708bcdea3786c83a63ebd71b191c28d7561a8c0fc2a81565b61018461041f36600461348e565b610fce565b34801561042f575f80fd5b506101b9736c5fdc0c53b122ae0f15a863c349f3a481de8f1f81565b348015610456575f80fd5b50610184610465366004613570565b6110d8565b348015610475575f80fd5b5061049861048436600461325a565b60046020525f908152604090205460ff1681565b60405190151581526020016101cd565b6101846104b63660046135c9565b611683565b3480156104c6575f80fd5b506101846104d536600461325a565b6117ee565b6104e2611844565b6001600160a01b038116610522576040517ffc9dfba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03165f90815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f6001600160a01b03871630146105b3576040517f09aeae910000000000000000000000000000000000000000000000000000000081526001600160a01b03881660048201526024015b60405180910390fd5b33736c5fdc0c53b122ae0f15a863c349f3a481de8f1f14610602576040517f3ca399320000000000000000000000000000000000000000000000000000000081523360048201526024016105aa565b5f61060f83850185613884565b505050505050505090507f147ae675f296256b5eecc84e9bf2bc391732bfd51dcbff57b4a60ba6cb0ffaf181036106845761067f8685858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061188992505050565b61071f565b7f0d4f76b1b60020edd6acf708bcdea3786c83a63ebd71b191c28d7561a8c0fc2a81036106ea5761067f8685858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611dc992505050565b6040517fa2160dcf000000000000000000000000000000000000000000000000000000008152600481018290526024016105aa565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9979650505050505050565b610754611844565b61075d5f61242b565b565b610767611844565b6001600160a01b0381166107a7576040517ffc9dfba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03165f90815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6107f0612492565b6001600160a01b038881165f908152600560205260409020541661084b576040517f31589d090000000000000000000000000000000000000000000000000000000081526001600160a01b03891660048201526024016105aa565b5f7f147ae675f296256b5eecc84e9bf2bc391732bfd51dcbff57b4a60ba6cb0ffaf1338a8a5f8b8b8b8b8b8b6040516020016108919b9a999897969594939291906139b5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f5cffe9de0000000000000000000000000000000000000000000000000000000082529150736c5fdc0c53b122ae0f15a863c349f3a481de8f1f90635cffe9de9061092990309073865377367054516e17014ccded1e7d814edc9ce4908f908790600401613abe565b6020604051808303815f875af1158015610945573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109699190613aef565b505061097460018055565b505050505050505050565b610987611844565b6001600160a01b038281165f90815260056020526040902054166109e2576040517f31589d090000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016105aa565b6001600160a01b038116610a22576040517ff79ccfb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038281165f908152600560205260408082206002810154905491517f095ea7b30000000000000000000000000000000000000000000000000000000081529084166004820181905260248201939093529192169063095ea7b3906044016020604051808303815f875af1158015610aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac69190613aef565b506001600160a01b038381165f908152600560205260408082206001015490517f095ea7b3000000000000000000000000000000000000000000000000000000008152848416600482015260248101929092529091169063095ea7b3906044016020604051808303815f875af1158015610b42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b669190613aef565b506001600160a01b038381165f90815260056020526040908190206002810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016868516908117909155905491517f095ea7b300000000000000000000000000000000000000000000000000000000815260048101919091525f19602482015291169063095ea7b3906044016020604051808303815f875af1158015610c10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c349190613aef565b506001600160a01b038381165f90815260056020526040908190206001015490517f095ea7b300000000000000000000000000000000000000000000000000000000815284831660048201525f19602482015291169063095ea7b3906044016020604051808303815f875af1158015610caf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd39190613aef565b50816001600160a01b0316836001600160a01b03167f06bc331032840de3e44179cee67a8860508a9c70737f1e433476e3a9a255b25f60405160405180910390a3505050565b5f808481610d28600283613b37565b6003546002546040517f556d6e9f00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018490529091505f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063556d6e9f90606401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190613b6f565b90505f6301e1338088610df38b87613b86565b610dfd9190613b99565b610e079190613b37565b90505f818311610e2057610e1b8383613bb0565b610e2a565b610e2a8284613bb0565b90505f5b88811015610f97578583851115610e5057610e498682613bb0565b9050610e5d565b610e5a8682613b86565b90505b6003546002546040517f556d6e9f00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063556d6e9f90606401602060405180830381865afa158015610eee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f129190613b6f565b90505f6301e133808d8f85610f279190613b86565b610f319190613b99565b610f3b9190613b37565b90505f818311610f5457610f4f8383613bb0565b610f5e565b610f5e8284613bb0565b905085811015610f75578297508196508095508399505b610f8060028a613b37565b98505050505080610f9090613bc3565b9050610e2e565b50846301e133808a610fa9838e613b86565b610fb39190613b99565b610fbd9190613b37565b965096505050505050935093915050565b8a5f03611007576040517f9a4f66bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f811561103157506001600160a01b03808a165f908152600560205260409020600101541661104d565b506001600160a01b03808a165f90815260056020526040902054165b6110626001600160a01b03821633308f6124d5565b806001600160a01b0316336001600160a01b03168b6001600160a01b03167f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a968f6040516110b191815260200190565b60405180910390a46110ca8b8b8b8b8b8b8b8b8b6107e8565b505050505050505050505050565b6110e0611844565b6040517f8e8f294b0000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015273ad038eb671c44b853887a7e32528fab35dc5d71090638e8f294b90602401602060405180830381865afa15801561114f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111739190613aef565b6111b4576040517f2df59b680000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105aa565b5f846001600160a01b031663d8dfeb456040518163ffffffff1660e01b81526004016020604051808303815f875af11580156111f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112169190613bdb565b90506001600160a01b038316158061123f5750806001600160a01b0316846001600160a01b0316145b156112fc578484866001600160a01b031663d8dfeb456040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611283573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a79190613bdb565b6040517f119a599e0000000000000000000000000000000000000000000000000000000081526001600160a01b03938416600482015291831660248301528216604482015290841660648201526084016105aa565b6001600160a01b038581165f818152600560205260409081902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811689861690811783556001909201805490911694861694909417909355517f095ea7b300000000000000000000000000000000000000000000000000000000815260048101919091525f19602482015263095ea7b3906044016020604051808303815f875af11580156113b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d49190613aef565b506001600160a01b038581165f81815260056020526040908190206001015490517f095ea7b300000000000000000000000000000000000000000000000000000000815260048101929092525f1960248301529091169063095ea7b3906044016020604051808303815f875af1158015611450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114749190613aef565b506001600160a01b038581165f90815260056020526040908190206002810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016878516908117909155905491517f095ea7b300000000000000000000000000000000000000000000000000000000815260048101919091525f19602482015291169063095ea7b3906044016020604051808303815f875af115801561151e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115429190613aef565b506001600160a01b038581165f90815260056020526040908190206001015490517f095ea7b300000000000000000000000000000000000000000000000000000000815285831660048201525f19602482015291169063095ea7b3906044016020604051808303815f875af11580156115bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e19190613aef565b506001600160a01b038581165f8181526005602090815260409182902060020180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000881515021790559051848416815286841693881692917f8ab0b8c470b101bb508ea695012478540f30a9857917e6c327eda5761d6f8be7910160405180910390a45050505050565b61168b612492565b6001600160a01b038981165f90815260056020526040902054166116e6576040517f31589d090000000000000000000000000000000000000000000000000000000081526001600160a01b038a1660048201526024016105aa565b5f7f0d4f76b1b60020edd6acf708bcdea3786c83a63ebd71b191c28d7561a8c0fc2a338b8b8b8b8b8b8b8b8b60405160200161172c9b9a99989796959493929190613bf6565b6040516020818303038152906040529050736c5fdc0c53b122ae0f15a863c349f3a481de8f1f6001600160a01b0316635cffe9de3073865377367054516e17014ccded1e7d814edc9ce48e856040518563ffffffff1660e01b81526004016117979493929190613abe565b6020604051808303815f875af11580156117b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d79190613aef565b50506117e260018055565b50505050505050505050565b6117f6611844565b6001600160a01b038116611838576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016105aa565b6118418161242b565b50565b5f546001600160a01b0316331461075d576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016105aa565b5f805f805f805f878060200190518101906118a49190613d11565b6001600160a01b0387165f90815260056020526040902060020154979f50959d50939b5090995097509095509093505074010000000000000000000000000000000000000000900460ff16159050611a65576001600160a01b0385165f9081526004602052604090205460ff16611947576040517ffc9dfba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602481018a905273865377367054516e17014ccded1e7d814edc9ce49063095ea7b3906044015f604051808303815f87803b1580156119b9575f80fd5b505af11580156119cb573d5f803e3d5ffd5b505050505f856001600160a01b031634866040516119e99190613dcd565b5f6040518083038185875af1925050503d805f8114611a23576040519150601f19603f3d011682016040523d82523d5f602084013e611a28565b606091505b5050905080611a63576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6001600160a01b038681165f908152600560205260408082205490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919216906370a0823190602401602060405180830381865afa158015611ad2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af69190613b6f565b9050805f03611b31576040517fb4f18b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038781165f908152600560205260409020600201541615611b6257611b5f88828986612557565b90505b6001600160a01b038781165f81815260056020526040908190206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291926347e7ef24928c92909116906370a0823190602401602060405180830381865afa158015611bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c019190613b6f565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015611c5c575f80fd5b505af1158015611c6e573d5f803e3d5ffd5b50505050611c7f888b86858b6126e0565b604082015115611d2c5760408281015190517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602481019190915273865377367054516e17014ccded1e7d814edc9ce49063a9059cbb906044016020604051808303815f875af1158015611d06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2a9190613aef565b505b815115801590611d3f57505f8260200151115b15611d5657611d56825f015183602001518a612905565b611d60888b6129da565b604080830151835182518d8152602081018590529283019190915260608201526001600160a01b03808a1691908916907f27adca66c335786d061cb91c67c649d181361d7245b6d38c4995b1f9b94017729060800160405180910390a350505050505050505050565b5f805f805f805f8088806020019051810190611de59190613d11565b9850985098509850985098509850985050611e04888b8786858c612b97565b6001600160a01b038088165f9081526005602052604090208054600290910154908216911615611f0557611e3b89878a8487612df9565b6001600160a01b038981165f908152600560205260408082206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015293995090929116906370a0823190602401602060405180830381865afa158015611eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed39190613b6f565b90508015611f03576001600160a01b03808a165f90815260056020526040902060010154611f0391168b83612f6f565b505b6001600160a01b0388165f9081526005602052604090206002015474010000000000000000000000000000000000000000900460ff161561213a576001600160a01b0387165f9081526004602052604090205460ff16611f91576040517ffc9dfba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301525f602483015282169063095ea7b3906044016020604051808303815f875af1158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190613aef565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526024820188905282169063095ea7b3906044016020604051808303815f875af115801561207f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a39190613aef565b505f876001600160a01b031634876040516120be9190613dcd565b5f6040518083038185875af1925050503d805f81146120f8576040519150601f19603f3d011682016040523d82523d5f602084013e6120fd565b606091505b5050905080612138576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6001600160a01b038881165f9081526005602052604090206002015416612225576001600160a01b038881165f908152600560205260408082206001015490517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152919216906370a0823190602401602060405180830381865afa1580156121cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ef9190613b6f565b9050801561221f576001600160a01b03808a165f9081526005602052604090206001015461221f91168b83612f6f565b506122e8565b6001600160a01b03811673865377367054516e17014ccded1e7d814edc9ce4146122e8576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa1580156122a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ca9190613b6f565b905080156122e6576122e66001600160a01b0383168b83612f6f565b505b8151158015906122fb57505f8260200151115b156123b75781516040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038b166004820152306024820152604481019190915273ad038eb671c44b853887a7e32528fab35dc5d710906323b872dd906064016020604051808303815f875af1158015612380573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a49190613aef565b506123b7825f015183602001518b612fa0565b6123c1898c6129da565b604080830151835182518e8152602081018a90529283019190915260608201526001600160a01b03808b1691908a16907fc9557b65f45f298d465e24590087886d84c9edd6e108069afb1a834ba704b7669060800160405180910390a35050505050505050505050565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6002600154036124ce576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b6040516001600160a01b0384811660248301528381166044830152606482018390526125519186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613034565b50505050565b6001600160a01b038083165f908152600560205260408082206002015490517fc87ae3340000000000000000000000000000000000000000000000000000000081529192839291169063c87ae334906125b890899089908890600401613de8565b6020604051808303815f875af11580156125d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125f89190613b6f565b6001600160a01b038581165f908152600560205260408082206001015490517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015293945090929116906370a0823190602401602060405180830381865afa15801561266c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126909190613b6f565b9050818110156126d6576040517f278c9d4000000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105aa565b9695505050505050565b815160408301515f91906126f49087613b86565b6126fe9190613b86565b84516020860151604080880151606089015191517f1ef08b750000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015260248201879052604482019590955260ff9093166064840152608483015260a4820152919250831690631ef08b759060c4015f604051808303815f87803b15801561278e575f80fd5b505af11580156127a0573d5f803e3d5ffd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015283925073865377367054516e17014ccded1e7d814edc9ce491506370a0823190602401602060405180830381865afa15801561280c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128309190613b6f565b10156128fd576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152819073865377367054516e17014ccded1e7d814edc9ce4906370a0823190602401602060405180830381865afa15801561289e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c29190613b6f565b6040517fc1c3f185000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044016105aa565b505050505050565b82156129d5576003546002546040517fce7d65030000000000000000000000000000000000000000000000000000000081526004810192909252602482015260448101849052606481018390525f60848201526001600160a01b0382811660a48301527f0000000000000000000000000000000000000000000000000000000000000000169063ce7d65039060c4015b6020604051808303815f875af11580156129b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125519190613b6f565b505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073865377367054516e17014ccded1e7d814edc9ce4906370a0823190602401602060405180830381865afa158015612a42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a669190613b6f565b905081811015612aac576040517fd694ba9500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105aa565b81811115612b5f5773865377367054516e17014ccded1e7d814edc9ce463a9059cbb84612ad98585613bb0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015612b39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613aef565b505b47156129d5576040516001600160a01b038416904780156108fc02915f818181858888f19350505050158015612551573d5f803e3d5ffd5b604082015115612c5b5760408281015190517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0388166004820152306024820152604481019190915273865377367054516e17014ccded1e7d814edc9ce4906323b872dd906064016020604051808303815f875af1158015612c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c489190613aef565b506040820151612c589086613b86565b94505b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024810186905273865377367054516e17014ccded1e7d814edc9ce49063095ea7b3906044015f604051808303815f87803b158015612ccd575f80fd5b505af1158015612cdf573d5f803e3d5ffd5b50506040517f22867d780000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201899052841692506322867d7891506044015f604051808303815f87803b158015612d43575f80fd5b505af1158015612d55573d5f803e3d5ffd5b505084516020860151604080880151606089015191517f3525f5910000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018c9052604482019590955260ff9093166064840152608483015260a48201529084169250633525f591915060c4015f604051808303815f87803b158015612de7575f80fd5b505af11580156117e2573d5f803e3d5ffd5b6001600160a01b038084165f908152600560205260408082206002015490517f3352519200000000000000000000000000000000000000000000000000000000815291928392911690633352519290612e5a908a908a908890600401613de8565b6020604051808303815f875af1158015612e76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e9a9190613b6f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1e9190613b6f565b905081811015612f64576040517fe50972c500000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016105aa565b979650505050505050565b6040516001600160a01b038381166024830152604482018390526129d591859182169063a9059cbb9060640161250a565b82156129d5576002546003546040517fce7d65030000000000000000000000000000000000000000000000000000000081526004810192909252602482015260448101849052606481018390525f60848201526001600160a01b0382811660a48301527f0000000000000000000000000000000000000000000000000000000000000000169063ce7d65039060c401612995565b5f6130486001600160a01b038416836130ae565b905080515f1415801561306c57508080602001905181019061306a9190613aef565b155b156129d5576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016105aa565b60606130bb83835f6130c4565b90505b92915050565b606081471015613109576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018390526044016105aa565b5f80856001600160a01b031684866040516131249190613dcd565b5f6040518083038185875af1925050503d805f811461315e576040519150601f19603f3d011682016040523d82523d5f602084013e613163565b606091505b509150915061317386838361317f565b925050505b9392505050565b6060826131945761318f826131f4565b613178565b81511580156131ab57506001600160a01b0384163b155b156131ed576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016105aa565b5080613178565b8051156132045780518082602001fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381168114611841575f80fd5b803561325581613236565b919050565b5f6020828403121561326a575f80fd5b813561317881613236565b5f8083601f840112613285575f80fd5b50813567ffffffffffffffff81111561329c575f80fd5b6020830191508360208285010111156132b3575f80fd5b9250929050565b5f805f805f8060a087890312156132cf575f80fd5b86356132da81613236565b955060208701356132ea81613236565b94506040870135935060608701359250608087013567ffffffffffffffff811115613313575f80fd5b61331f89828a01613275565b979a9699509497509295939492505050565b5f60808284031215613341575f80fd5b50919050565b5f60608284031215613341575f80fd5b5f805f805f805f805f6101808a8c031215613370575f80fd5b8935985060208a013561338281613236565b975060408a013561339281613236565b965060608a013567ffffffffffffffff808211156133ae575f80fd5b6133ba8d838e01613275565b90985096508691506133cf8d60808e01613331565b95506101008c01359150808211156133e5575f80fd5b506133f28c828d01613275565b909450925061340790508b6101208c01613347565b90509295985092959850929598565b5f8060408385031215613427575f80fd5b823561343281613236565b9150602083013561344281613236565b809150509250929050565b5f805f6060848603121561345f575f80fd5b505081359360208301359350604090920135919050565b8015158114611841575f80fd5b803561325581613476565b5f805f805f805f805f805f6101c08c8e0312156134a9575f80fd5b8b359a5060208c013599506134c160408d0135613236565b60408c013598506134d560608d0135613236565b60608c0135975067ffffffffffffffff8060808e013511156134f5575f80fd5b6135058e60808f01358f01613275565b90985096506135178e60a08f01613331565b9550806101208e0135111561352a575f80fd5b5061353c8d6101208e01358e01613275565b909450925061354f8d6101408e01613347565b915061355e6101a08d01613483565b90509295989b509295989b9093969950565b5f805f8060808587031215613583575f80fd5b843561358e81613236565b9350602085013561359e81613236565b925060408501356135ae81613236565b915060608501356135be81613476565b939692955090935050565b5f805f805f805f805f806101a08b8d0312156135e3575f80fd5b8a35995060208b01356135f581613236565b985060408b013561360581613236565b975060608b0135965060808b013567ffffffffffffffff80821115613628575f80fd5b6136348e838f01613275565b90985096508691506136498e60a08f01613331565b95506101208d013591508082111561365f575f80fd5b5061366c8d828e01613275565b909450925061368190508c6101408d01613347565b90509295989b9194979a5092959850565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156136e2576136e2613692565b60405290565b6040516060810167ffffffffffffffff811182821017156136e2576136e2613692565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561375257613752613692565b604052919050565b5f67ffffffffffffffff82111561377357613773613692565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126137ae575f80fd5b81356137c16137bc8261375a565b61370b565b8181528460208386010111156137d5575f80fd5b816020850160208301375f918101602001919091529392505050565b60ff81168114611841575f80fd5b5f6080828403121561380f575f80fd5b6138176136bf565b905081358152602082013561382b816137f1565b80602083015250604082013560408201526060820135606082015292915050565b5f6060828403121561385c575f80fd5b6138646136e8565b905081358152602082013560208201526040820135604082015292915050565b5f805f805f805f805f6101c08a8c03121561389d575f80fd5b8935985060208a01356138af81613236565b975060408a01356138bf81613236565b96506138cd60608b0161324a565b955060808a0135945060a08a013567ffffffffffffffff808211156138f0575f80fd5b6138fc8d838e0161379f565b955061390b8d60c08e016137ff565b94506101408c0135915080821115613921575f80fd5b5061392e8c828d0161379f565b9250506134078b6101608c0161384c565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b803582526020810135613998816137f1565b60ff16602083015260408181013590830152606090810135910152565b5f6101c08d83526001600160a01b03808e166020850152808d166040850152808c1660608501525060ff8a1660808401528060a08401526139f9818401898b61393f565b9050613a0860c0840188613986565b828103610140840152613a1c81868861393f565b8435610160850152602085013561018085015260408501356101a08501529150613a439050565b9c9b505050505050505050505050565b5f5b83811015613a6d578181015183820152602001613a55565b50505f910152565b5f8151808452613a8c816020860160208601613a53565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526126d66080830184613a75565b5f60208284031215613aff575f80fd5b815161317881613476565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f82613b6a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215613b7f575f80fd5b5051919050565b808201808211156130be576130be613b0a565b80820281158282048414176130be576130be613b0a565b818103818111156130be576130be613b0a565b5f5f198203613bd457613bd4613b0a565b5060010190565b5f60208284031215613beb575f80fd5b815161317881613236565b5f6101c08d83526001600160a01b03808e166020850152808d166040850152808c166060850152508960808401528060a08401526139f9818401898b61393f565b805161325581613236565b5f82601f830112613c51575f80fd5b8151613c5f6137bc8261375a565b818152846020838601011115613c73575f80fd5b613c84826020830160208701613a53565b949350505050565b5f60808284031215613c9c575f80fd5b613ca46136bf565b9050815181526020820151613cb8816137f1565b80602083015250604082015160408201526060820151606082015292915050565b5f60608284031215613ce9575f80fd5b613cf16136e8565b905081518152602082015160208201526040820151604082015292915050565b5f805f805f805f805f6101c08a8c031215613d2a575f80fd5b8951985060208a0151613d3c81613236565b60408b0151909850613d4d81613236565b9650613d5b60608b01613c37565b955060808a0151945060a08a015167ffffffffffffffff80821115613d7e575f80fd5b613d8a8d838e01613c42565b9550613d998d60c08e01613c8c565b94506101408c0151915080821115613daf575f80fd5b50613dbc8c828d01613c42565b9250506134078b6101608c01613cd9565b5f8251613dde818460208701613a53565b9190910192915050565b6001600160a01b0384168152826020820152606060408201525f613e0f6060830184613a75565b9594505050505056fea264697066735822122019cfcd885a9a2e1df737ebf5cd75d21eff0011b35f605448daf8907ac0bb5af364736f6c63430008140033000000000000000000000000c7de47b9ca2fc753d6a2f167d8b3e19c6d18b19a