UNPKG

@perp/curie-deployments

Version:

Perpetual Protocol Curie (v2) contract artifacts (ABIs) and deployed addresses

895 lines 115 kB
{ "_format": "hh-sol-artifact-1", "contractName": "OrderBook", "sourceName": "contracts/OrderBook.sol", "abi": [ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "clearingHouse", "type": "address" } ], "name": "ClearingHouseChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "exchange", "type": "address" } ], "name": "ExchangeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "uint256", "name": "base", "type": "uint256" }, { "internalType": "uint256", "name": "quote", "type": "uint256" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "components": [ { "internalType": "int256", "name": "twPremiumX96", "type": "int256" }, { "internalType": "int256", "name": "twPremiumDivBySqrtPriceX96", "type": "int256" } ], "internalType": "struct Funding.Growth", "name": "fundingGrowthGlobal", "type": "tuple" } ], "internalType": "struct IOrderBook.AddLiquidityParams", "name": "params", "type": "tuple" } ], "name": "addLiquidity", "outputs": [ { "components": [ { "internalType": "uint256", "name": "base", "type": "uint256" }, { "internalType": "uint256", "name": "quote", "type": "uint256" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "uint128", "name": "liquidity", "type": "uint128" } ], "internalType": "struct IOrderBook.AddLiquidityResponse", "name": "", "type": "tuple" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "candidate", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getClearingHouse", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getExchange", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "components": [ { "internalType": "int256", "name": "twPremiumX96", "type": "int256" }, { "internalType": "int256", "name": "twPremiumDivBySqrtPriceX96", "type": "int256" } ], "internalType": "struct Funding.Growth", "name": "fundingGrowthGlobal", "type": "tuple" } ], "name": "getLiquidityCoefficientInFundingPayment", "outputs": [ { "internalType": "int256", "name": "liquidityCoefficientInFundingPayment", "type": "int256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getMarketRegistry", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" } ], "name": "getOpenOrder", "outputs": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint256", "name": "lastFeeGrowthInsideX128", "type": "uint256" }, { "internalType": "int256", "name": "lastTwPremiumGrowthInsideX96", "type": "int256" }, { "internalType": "int256", "name": "lastTwPremiumGrowthBelowX96", "type": "int256" }, { "internalType": "int256", "name": "lastTwPremiumDivBySqrtPriceGrowthInsideX96", "type": "int256" }, { "internalType": "uint256", "name": "baseDebt", "type": "uint256" }, { "internalType": "uint256", "name": "quoteDebt", "type": "uint256" } ], "internalType": "struct OpenOrder.Info", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "orderId", "type": "bytes32" } ], "name": "getOpenOrderById", "outputs": [ { "components": [ { "internalType": "uint128", "name": "liquidity", "type": "uint128" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint256", "name": "lastFeeGrowthInsideX128", "type": "uint256" }, { "internalType": "int256", "name": "lastTwPremiumGrowthInsideX96", "type": "int256" }, { "internalType": "int256", "name": "lastTwPremiumGrowthBelowX96", "type": "int256" }, { "internalType": "int256", "name": "lastTwPremiumDivBySqrtPriceGrowthInsideX96", "type": "int256" }, { "internalType": "uint256", "name": "baseDebt", "type": "uint256" }, { "internalType": "uint256", "name": "quoteDebt", "type": "uint256" } ], "internalType": "struct OpenOrder.Info", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" } ], "name": "getOpenOrderIds", "outputs": [ { "internalType": "bytes32[]", "name": "", "type": "bytes32[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" } ], "name": "getPendingFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "bool", "name": "fetchBase", "type": "bool" } ], "name": "getTotalOrderDebt", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address[]", "name": "baseTokens", "type": "address[]" } ], "name": "getTotalQuoteBalanceAndPendingFee", "outputs": [ { "internalType": "int256", "name": "totalQuoteAmountInPools", "type": "int256" }, { "internalType": "uint256", "name": "totalPendingFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "bool", "name": "fetchBase", "type": "bool" } ], "name": "getTotalTokenAmountInPoolAndPendingFee", "outputs": [ { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" }, { "internalType": "uint256", "name": "pendingFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address[]", "name": "tokens", "type": "address[]" } ], "name": "hasOrder", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "marketRegistryArg", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "maker", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "int24", "name": "lowerTick", "type": "int24" }, { "internalType": "int24", "name": "upperTick", "type": "int24" }, { "internalType": "uint128", "name": "liquidity", "type": "uint128" } ], "internalType": "struct IOrderBook.RemoveLiquidityParams", "name": "params", "type": "tuple" } ], "name": "removeLiquidity", "outputs": [ { "components": [ { "internalType": "uint256", "name": "base", "type": "uint256" }, { "internalType": "uint256", "name": "quote", "type": "uint256" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "int256", "name": "takerBase", "type": "int256" }, { "internalType": "int256", "name": "takerQuote", "type": "int256" } ], "internalType": "struct IOrderBook.RemoveLiquidityResponse", "name": "", "type": "tuple" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "baseToken", "type": "address" }, { "internalType": "bool", "name": "isBaseToQuote", "type": "bool" }, { "internalType": "bool", "name": "shouldUpdateState", "type": "bool" }, { "internalType": "int256", "name": "amount", "type": "int256" }, { "internalType": "uint160", "name": "sqrtPriceLimitX96", "type": "uint160" }, { "internalType": "uint24", "name": "exchangeFeeRatio", "type": "uint24" }, { "internalType": "uint24", "name": "uniswapFeeRatio", "type": "uint24" }, { "components": [ { "internalType": "int256", "name": "twPremiumX96", "type": "int256" }, { "internalType": "int256", "name": "twPremiumDivBySqrtPriceX96", "type": "int256" } ], "internalType": "struct Funding.Growth", "name": "globalFundingGrowth", "type": "tuple" }, { "internalType": "address", "name": "pool", "type": "address" }, { "internalType": "uint24", "name": "insuranceFundFeeRatio", "type": "uint24" } ], "internalType": "struct IOrderBook.ReplaySwapParams", "name": "params", "type": "tuple" } ], "name": "replaySwap", "outputs": [ { "components": [ { "internalType": "int24", "name": "tick", "type": "int24" }, { "internalType": "uint256", "name": "fee", "type": "uint256" }, { "internalType": "uint256", "name": "insuranceFundFee", "type": "uint256" } ], "internalType": "struct IOrderBook.ReplaySwapResponse", "name": "", "type": "tuple" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "clearingHouseArg", "type": "address" } ], "name": "setClearingHouse", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "exchangeArg", "type": "address" } ], "name": "setExchange", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "setOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount0Owed", "type": "uint256" }, { "internalType": "uint256", "name": "amount1Owed", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "uniswapV3MintCallback", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "trader", "type": "address" }, { "internalType": "address", "name": "baseToken", "type": "address" }, { "components": [ { "internalType": "int256", "name": "twPremiumX96", "type": "int256" }, { "internalType": "int256", "name": "twPremiumDivBySqrtPriceX96", "type": "int256" } ], "internalType": "struct Funding.Growth", "name": "fundingGrowthGlobal", "type": "tuple" } ], "name": "updateFundingGrowthAndLiquidityCoefficientInFundingPayment", "outputs": [ { "internalType": "int256", "name": "liquidityCoefficientInFundingPayment", "type": "int256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "orderId", "type": "bytes32" }, { "internalType": "int256", "name": "base", "type": "int256" }, { "internalType": "int256", "name": "quote", "type": "int256" } ], "name": "updateOrderDebt", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "updateOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x608060405234801561001057600080fd5b50615bbe80620000216000396000f3fe608060405234801561001057600080fd5b506004361061016e5760003560e01c80638da5cb5b116100ce578063c66b8ed211610087578063c66b8ed214610319578063d0581a9314610321578063d348799714610334578063e8ab2fb314610347578063eaad235414610367578063f807cd221461037a578063fb112d6c146103825761016e565b80638da5cb5b146102bb578063acf71827146102c3578063b0c04174146102e3578063bc5920ba146102f6578063c4d66de8146102fe578063c575ff79146103115761016e565b80635d8a541d1161012b5780635d8a541d1461022457806367267e8a1461024557806367b1f5df146102655780636c8381f814610278578063715018a61461028d5780637c2b7c53146102955780637fc26736146102a85761016e565b806313af403514610173578063436933ea14610188578063449323d8146101b157806347b52fb7146101c45780634dffaee5146101e45780635b778b9d14610204575b600080fd5b61018661018136600461507b565b610395565b005b61019b6101963660046150b3565b6104f0565b6040516101a89190615729565b60405180910390f35b6101866101bf36600461507b565b61056a565b6101d76101d2366004615190565b610611565b6040516101a891906157ba565b6101f76101f23660046151d7565b610832565b6040516101a8919061576d565b610217610212366004615307565b6108b5565b6040516101a89190615958565b6102376102323660046150eb565b610a5f565b6040516101a89291906157c3565b610258610253366004615318565b610a79565b6040516101a89190615992565b61018661027336600461507b565b610f44565b610280610feb565b6040516101a89190615652565b610186610ffa565b6101d76102a33660046150eb565b61109b565b6101d76102b6366004615190565b61120d565b610280611471565b6102d66102d1366004615259565b611480565b6040516101a891906158be565b6101866102f1366004615271565b61151b565b61018661157b565b61018661030c36600461507b565b611667565b61028061171b565b61028061172a565b61023761032f3660046151d7565b611739565b6101866103423660046155b6565b6117b0565b61035a6103553660046152d4565b611959565b6040516101a8919061588a565b6102d6610375366004615135565b611d26565b610280611ddb565b6101d7610390366004615135565b611dea565b61039d611ea3565b6001600160a01b03166103ae611471565b6001600160a01b0316146103f2576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6001600160a01b038116610436576040805162461bcd60e51b81526020600482015260066024820152650534f5f4e57360d41b604482015290519081900360640190fd5b6033546001600160a01b0382811691161415610482576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414f60d01b604482015290519081900360640190fd5b6034546001600160a01b03828116911614156104ce576040805162461bcd60e51b8152602060048201526006602482015265534f5f53414360d01b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808316600090815260ce6020908152604080832093851683529281529082902080548351818402810184019094528084526060939283018282801561055c57602002820191906000526020600020905b815481526020019060010190808311610548575b505050505090505b92915050565b610572611ea3565b6001600160a01b0316610583611471565b6001600160a01b0316146105c7576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b606780546001600160a01b0319166001600160a01b0383169081179091556040517fd0654f5900f9e7e4e605a19334306e6a2786bbf960ac0484a4c12feb6428fe2f90600090a250565b6001600160a01b03808416600090815260ce602090815260408083209386168352928152828220805484518184028101840190955280855292938493909283018282801561067e57602002820191906000526020600020905b81548152602001906001019080831161066a575b5050506001600160a01b03808816600090815260d06020526040808220609a54915163bbe4f6db60e01b815296975095919450909116915063bbe4f6db906106ca908990600401615652565b60206040518083038186803b1580156106e257600080fd5b505afa1580156106f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071a9190615097565b9050600061072782611ea7565b505050505091505060005b845181101561082557600060cf600087848151811061074d57fe5b6020908102919091018101518252818101929092526040908101600090812082516101208101845281546001600160801b0381168252600160801b8104600290810b810b810b838801819052600160981b909204810b810b810b958301869052600184015460608401528301546080830152600383015460a0830152600483015460c0830152600583015460e08301526006909201546101008201528c51948d01519095509193610803938a9390918991611f3a565b9050610819610812838361201e565b899061210a565b97505050600101610732565b50505050505b9392505050565b6000805b828110156108aa576001600160a01b038516600090815260ce602052604081208186868581811061086357fe5b9050602002016020810190610878919061507b565b6001600160a01b0316815260208101919091526040016000205411156108a257600191505061082b565b600101610836565b506000949350505050565b6108bd614e2e565b6108c561216f565b609a546000906001600160a01b031663bbe4f6db6108e9604086016020870161507b565b6040518263ffffffff1660e01b81526004016109059190615652565b60206040518083038186803b15801561091d57600080fd5b505afa158015610931573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109559190615097565b9050600061099e610969602086018661507b565b610979604087016020880161507b565b610989606088016040890161529c565b6109996080890160608a0161529c565b6121ab565b6040805160e08101909152909150610a5590806109be602088018861507b565b6001600160a01b031681526020018660200160208101906109df919061507b565b6001600160a01b03168152602001846001600160a01b03168152602001838152602001866040016020810190610a15919061529c565b60020b8152602001610a2d608088016060890161529c565b60020b8152602001610a4560a08801608089016153dd565b6001600160801b0316905261220c565b925050505b919050565b600080610a6d85858561238e565b90969095509350505050565b610a81614e5d565b610a8961266a565b606082015161010083015183516001600160a01b0316600090815260d1602052604081205481841393919283928392610ac39291906126a4565b905085608001516001600160a01b0316600014610ae4578560800151610b0e565b8560200151610b075773fffd8963efd1fc6a506488495d951d5263988d25610b0e565b6401000276a45b6001600160a01b03166080870152610100860151600090610b2e9061277a565b90505b604082015115801590610b5e575086608001516001600160a01b031682602001516001600160a01b031614155b15610ef557610b6b614e81565b6020808401516001600160a01b031682526101008901518451918a0151610b94929085906127ed565b15156040830152600290810b810b60208301819052620d89e719910b1215610bc557620d89e7196020820152610be4565b6020810151620d89e860029190910b1315610be457620d89e860208201525b610bf1816020015161290f565b6001600160a01b0316606082015260208084015190890151610c8e9190610c345789608001516001600160a01b031683606001516001600160a01b031611610c52565b89608001516001600160a01b031683606001516001600160a01b0316105b610c60578260600151610c66565b89608001515b856080015186604001518c60200151610c83578c60a00151610c89565b8c60c001515b612c37565b60c085015260a084015260808301526001600160a01b031660208401528515610cec57610ce2610cd7610cd28360c001518460800151612e2990919063ffffffff16565b612e83565b604085015190612ecf565b6040840152610d0d565b610d07610cfc8260a00151612e83565b60408501519061210a565b60408401525b60808301516001600160801b031615610db457876020015115610d4b57610d458160a001518960a0015162ffffff16620f4240612f34565b60c08201525b60c081015161012089015195810195600091610d6f9162ffffff16620f4240612f34565b60c083015195810195909150600090610d889083612f6e565b9050610da681600160801b87608001516001600160801b0316612fcb565b606086018051909101905250505b80606001516001600160a01b031683602001516001600160a01b03161415610eb757806040015115610e8d57876040015115610e3f5787516001600160a01b0316600090815260d0602090815260409182902083820151835160608082018652880151815260e08d018051518286015251909301519383019390935291610e3d9183919061307a565b505b6000610e5489610100015183602001516130b9565b9050886020015115610e6f57610e6c81600f0b613148565b90505b610e7d84608001518261317b565b6001600160801b03166080850152505b8760200151610ea0578060200151610ea9565b60018160200151035b600290810b900b8352610eef565b80600001516001600160a01b031683602001516001600160a01b031614610eef57610ee58360200151613231565b600290810b900b83525b50610b31565b866040015115610f1f57606082015187516001600160a01b0316600090815260d160205260409020555b5060408051606081018252915160020b82526020820193909352918201529392505050565b610f4c611ea3565b6001600160a01b0316610f5d611471565b6001600160a01b031614610fa1576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b60cd80546001600160a01b0319166001600160a01b0383169081179091556040517f39870277935708b88965de17b0c29d3c1ad93a200dce569fc56702229432973e90600090a250565b6034546001600160a01b031690565b611002611ea3565b6001600160a01b0316611013611471565b6001600160a01b031614611057576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4f60d01b604482015290519081900360640190fd5b6033546040516000916001600160a01b031690600080516020615af6833981519152908390a3603380546001600160a01b0319908116909155603480549091169055565b6001600160a01b03808416600090815260ce602090815260408083209386168352928152828220805484518184028101840190955280855292938493849391929183018282801561110b57602002820191906000526020600020905b8154815260200190600101908083116110f7575b505083519394506000925050505b8181101561120157600060cf600085848151811061113357fe5b6020908102919091018101518252818101929092526040908101600090812082516101208101845281546001600160801b0381168252600160801b8104600290810b810b810b96830196909652600160981b9004850b850b850b9381019390935260018101546060840152928301546080830152600383015460a0830152600483015460c0830152600583015460e08301526006909201546101008201529150876111e3578161010001516111e9565b8160e001515b90506111f58682612e29565b95505050600101611119565b50919695505050505050565b600061121761266a565b6001600160a01b03808516600090815260ce6020908152604080832093871683529281528282208054845181840281018401909552808552929392909183018282801561128357602002820191906000526020600020905b81548152602001906001019080831161126f575b5050506001600160a01b03808816600090815260d06020526040808220609a54915163bbe4f6db60e01b815296975095919450909116915063bbe4f6db906112cf908990600401615652565b60206040518083038186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f9190615097565b8351909150600061132f83611ea7565b505050505091505060005b8281101561146457600060cf600088848151811061135457fe5b602090810291909101810151825281810192909252604001600090812080548c51938d015191945091926113a3928a92600160801b8204600290810b93600160981b909304900b918991611f3a565b604080516101208101825284546001600160801b0381168252600160801b8104600290810b810b810b6020840152600160981b909104810b810b810b9282019290925260018501546060820152908401546080820152600384015460a0820152600484015460c0820152600584015460e0820152600684015461010082015290915061143a90611433908361201e565b8a9061210a565b8151600284015560208201516003840155604090910151600490920191909155965060010161133a565b5050505050509392505050565b6033546001600160a01b031690565b611488614ebd565b50600090815260cf602090815260409182902082516101208101845281546001600160801b0381168252600160801b8104600290810b810b810b94830194909452600160981b9004830b830b830b9381019390935260018101546060840152908101546080830152600381015460a0830152600481015460c0830152600581015460e08301526006015461010082015290565b61152361216f565b600083815260cf6020526040902060058101546115549061154f90859061154990612e83565b9061210a565b613530565b816005018190555061157061154f836115498460060154612e83565b600690910155505050565b6034546001600160a01b03166115c0576040805162461bcd60e51b81526020600482015260056024820152640534f5f43360dc1b604482015290519081900360640190fd5b6115c8611ea3565b6034546001600160a01b03908116911614611613576040805162461bcd60e51b8152602060048201526006602482015265534f5f434e4360d01b604482015290519081900360640190fd5b6034546033546040516001600160a01b039283169290911690600080516020615af683398151915290600090a360348054603380546001600160a01b03199081166001600160a01b03841617909155169055565b600054610100900460ff16806116805750611680613587565b8061168e575060005460ff16155b6116c95760405162461bcd60e51b815260040180806020018281038252602e815260200180615aa7602e913960400191505060405180910390fd5b600054610100900460ff161580156116f4576000805460ff1961ff0019909116610100171660011790555b6116fc613598565b61170582613642565b8015611717576000805461ff00191690555b5050565b6067546001600160a01b031690565b609a546001600160a01b031690565b60008060005b838110156117a757600085858381811061175557fe5b905060200201602081019061176a919061507b565b905060008061177b89846000613707565b909250905061178a868361210a565b95506117968582612e29565b9450506001909201915061173f9050565b50935093915050565b60006117ba611ea3565b90506000816001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156117f757600080fd5b505afa15801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f9190615097565b609a5460405163bbe4f6db60e01b81529192506001600160a01b03169063bbe4f6db90611860908490600401615652565b60206040518083038186803b15801561187857600080fd5b505afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190615097565b6001600160a01b0316826001600160a01b0316146118e95760405162461bcd60e51b81526004016118e090615812565b60405180910390fd5b60675460405163d348799760e01b81526001600160a01b039091169063d34879979061191f9089908990899089906004016159b6565b600060405180830381600087803b15801561193957600080fd5b505af115801561194d573d6000803e3d6000fd5b50505050505050505050565b611961614f18565b61196961216f565b609a546000906001600160a01b031663bbe4f6db61198d604086016020870161507b565b6040518263ffffffff1660e01b81526004016119a99190615652565b60206040518083038186803b1580156119c157600080fd5b505afa1580156119d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f99190615097565b9050600060d181611a10604087016020880161507b565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050600060d06000866020016020810190611a4c919061507b565b6001600160a01b03166001600160a01b031681526020019081526020016000209050611a76614f49565b6000611a9185611a8c60a08a0160808b0161529c565b61374e565b90506000611aa986611a8c60c08b0160a08c0161529c565b9050611b6f6040518060c00160405280886001600160a01b031681526020018a6080016020810190611adb919061529c565b60020b8152602001611af360c08c0160a08d0161529c565b60020b81526020018a6040013581526020018a60600135815260200160405180604001604052808c6000016020810190611b2d919061507b565b6001600160a01b031681526020018a6001600160a01b0316815250604051602001611b589190615935565b6040516020818303038152906040528152506137dc565b92506000611b7c87611ea7565b505050505091505082158015611ba15750611ba187611a8c60a08c0160808d0161529c565b15611be657611be6611bb960a08b0160808c0161529c565b6040805160608101825289815260c08d0135602082015260e08d01359181019190915287919084906138f6565b81158015611c035750611c0387611a8c60c08c0160a08d0161529c565b15611c1b57611c1b611bb960c08b0160a08c0161529c565b505060408051610140810190915260009150611cea9080611c3f60208b018b61507b565b6001600160a01b03168152602001896020016020810190611c60919061507b565b6001600160a01b03908116825288166020820152604001611c8760a08b0160808c0161529c565b60020b8152602001611c9f60c08b0160a08c0161529c565b60020b815260208082018890526040868101516001600160801b03169083015285516060830152850151608082015260a001611ce3368b90038b0160c08c016152ec565b9052613935565b6040805160808101825284518152602080860151908201528082019290925292909201516001600160801b031660608301525095945050505050565b611d2e614ebd565b60cf6000611d3e878787876121ab565b8152602080820192909252604090810160002081516101208101835281546001600160801b0381168252600160801b8104600290810b810b810b95830195909552600160981b9004840b840b840b9281019290925260018101546060830152918201546080820152600382015460a0820152600482015460c0820152600582015460e082015260069091015461010082015290505b949350505050565b60cd546001600160a01b031690565b600080611e988560cf6000611e018a8a8a8a6121ab565b8152602080820192909252604090810160002081516101208101835281546001600160801b0381168252600160801b8104600290810b810b810b95830195909552600160981b9004840b840b840b9281019290925260018101546060830152918201546080820152600382015460a0820152600482015460c0820152600582015460e0820152600690910154610100820152613c3b565b509695505050505050565b3390565b6000806000806000806000876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015611eeb57600080fd5b505afa158015611eff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2391906154ed565b959e949d50929b5090995097509550909350915050565b611f42614f73565b600286810b810b60009081526020899052604080822088840b90930b8252902060018083015490820154611f74614f73565b8a60020b8960020b1215611f8a57828803611f8c565b825b6020820152600060028b810b908b900b12611fa957828903611fab565b825b905060008660020154905060008660020154905060008e60020b8d60020b1215611fd757828b03611fd9565b825b905060008e60020b8e60020b12611ff257828c03611ff4565b825b6020870151909d03949094038552909903999099036040830152509b9a5050505050505050505050565b60008061202e846040015161290f565b9050600061204b612042866020015161290f565b86518490613cea565b9050600061207c61206d8760a001518760200151612ecf90919063ffffffff16565b61207684612e83565b90613d53565b905060006120e56120d16120b86120a48a608001518a60000151612ecf90919063ffffffff16565b600160601b886001600160a01b0316613dfc565b60c08a015160408a01516120cb91612ecf565b90612ecf565b8851612076906001600160801b0316612e83565b90506120ff600160601b6120f9848461210a565b90613ea0565b979650505050505050565b600082820181831280159061211f5750838112155b80612134575060008312801561213457508381125b61082b5760405162461bcd60e51b8152600401808060200182810382526021815260200180615a866021913960400191505060405180910390fd5b6067546001600160a01b0316612183611ea3565b6001600160a01b0316146121a95760405162461bcd60e51b81526004016118e0906157d1565b565b604080516bffffffffffffffffffffffff19606096871b81166020808401919091529590961b9095166034860152600292830b60e890811b60488701529190920b901b604b8401528051602e818503018152604e9093019052815191012090565b612214614e2e565b600061228b6040518060a0016040528085604001516001600160a01b03168152602001606760009054906101000a90046001600160a01b03166001600160a01b03168152602001856080015160020b81526020018560a0015160020b81526020018560c001516001600160801b0316815250613f58565b9050600080600061229b866140ae565b92509250925060006122ba6122af84612e83565b86516120cb90612e83565b905060006122d76122ca84612e83565b6120cb8860200151612e83565b90506122eb8860400151896080015161374e565b61231a5760808801516020808a01516001600160a01b0316600090815260d09091526040902061231a91614277565b61232c88604001518960a0015161374e565b61235b5760a08801516020808a01516001600160a01b0316600090815260d09091526040902061235b91614277565b6040805160a081018252875181526020978801519781019790975286019490945260608501525050608082015292915050565b6001600160a01b03808416600090815260ce60209081526040808320938616835292815282822080548451818402810184019095528085529293849384939192918301828280156123fe57602002820191906000526020600020905b8154815260200190600101908083116123ea575b5050609a5460405163bbe4f6db60e01b815294955060009461249294506001600160a01b03909116925063bbe4f6db915061243d908a90600401615652565b60206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d9190615097565b611ea7565b50508651949550600093505050505b8181101561265e57600060cf60008684815181106124bb57fe5b6020908102919091018101518252818101929092526040908101600090812082516101208101845281546001600160801b0381168252600160801b8104600290810b810b810b968301879052600160981b909104810b810b810b9482019490945260018201546060820152928101546080840152600381015460a0840152600481015460c0840152600581015460e0840152600601546101008301529092509081906125669061290f565b90506000612577846040015161290f565b90508a80156125975750806001600160a01b0316876001600160a01b0316105b156125d0576125c9826001600160a01b0316886001600160a01b0316116125be57826125c0565b875b85518390613cea565b9250612623565b8a1580156125ef5750816001600160a01b0316876001600160a01b0316115b156126235761262082826001600160a01b0316896001600160a01b0316106126175782612619565b885b865161429b565b92505b5061263090508882612e29565b9750886126545760006126438b84613c3b565b5090506126508882612e29565b9750505b50506001016124a1565b50505050935093915050565b60cd546001600160a01b031661267e611ea3565b6001600160a01b0316146121a95760405162461bcd60e51b81526004016118e0906157f2565b6126ac614f94565b6000806126b886611ea7565b5050505050915091506000866001600160a01b0316631a6865026040518163ffffffff1660e01b815260040160206040518083038186803b1580156126fc57600080fd5b505afa158015612710573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273491906153f9565b6040805160a08101825260029490940b84526001600160a01b0390941660208401529282019590955260608101939093526001600160801b031660808301525092915050565b6000816001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b557600080fd5b505afa1580156127c9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056491906152b8565b60008060008460020b8660020b8161280157fe5b05905060008660020b12801561282857508460020b8660020b8161282157fe5b0760020b15155b1561283257600019015b831561289b57600080612844836142de565b9092509050600160ff82161b8001600019016000816128638c866142f0565b16801515965090508561287d57888360ff16860302612890565b886128878261436f565b840360ff168603025b965050505050612905565b6000806128aa836001016142de565b9092509050600019600160ff83161b01196000816128c88c866142f0565b1680151596509050856128e857888360ff0360ff168660010101026128fe565b88836128f38361440a565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612926578260020b61292e565b8260020b6000035b9050620d89e881111561296c576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b60006001821661298057600160801b612992565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b0316905060028216156129bc576ffff97272373d413259a46990580e213a0260801c5b60048216156129db576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156129fa576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a19576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612a38576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612a57576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612a76576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612a96576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612ab6576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612ad6576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612af6576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b16576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612b36576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612b56576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612b76576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612b97576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612bb7576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612bd6576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612bf3576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612c0e578060001981612c0a57fe5b0490505b640100000000810615612c22576001612c25565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590612cbc576000612c708989620f42400362ffffff16620f4240612fcb565b905082612c8957612c848c8c8c60016144f4565b612c96565b612c968b8d8c600161456d565b9550858110612ca7578a9650612cb6565b612cb38c8b838661460d565b96505b50612d06565b81612cd357612cce8b8b8b600061456d565b612ce0565b612ce08a8c8b60006144f4565b9350838860000310612cf457899550612d06565b612d038b8a8a60000385614659565b95505b6001600160a01b038a8116908716148215612d6957808015612d255750815b612d3b57612d36878d8c600161456d565b612d3d565b855b9550808015612d4a575081155b612d6057612d5b878d8c60006144f4565b612d62565b845b9450612db3565b808015612d735750815b612d8957612d848c888c60016144f4565b612d8b565b855b9550808015612d98575081155b612dae57612da98c888c600061456d565b612db0565b845b94505b81158015612dc357508860000385115b15612dcf578860000394505b818015612dee57508a6001600160a01b0316876001600160a01b031614155b15612dfd578589039350612e1a565b612e17868962ffffff168a620f42400362ffffff16612f34565b93505b50505095509550955095915050565b60008282018381101561082b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006001600160ff1b03821115612ecb5760405162461bcd60e51b8152600401808060200182810382526028815260200180615b3d6028913960400191505060405180910390fd5b5090565b6000818303818312801590612ee45750838113155b80612ef95750600083128015612ef957508381135b61082b5760405162461bcd60e51b8152600401808060200182810382526024815260200180615b656024913960400191505060405180910390fd5b6000612f41848484612fcb565b905060008280612f4d57fe5b848609111561082b576000198110612f6457600080fd5b6001019392505050565b600082821115612fc5576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008080600019858709868602925082811090839003039050806130015760008411612ff657600080fd5b50829004905061082b565b80841161300d57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600291820b820b600090815260209384526040908190208054835103815560018101805495840151959095039094559290910180549190920151039055565b60405163f30dba9360e01b81526000906001600160a01b0384169063f30dba93906130e8908590600401615786565b6101006040518083038186803b15801561310157600080fd5b505afa158015613115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131399190615415565b50949998505050505050505050565b600060016001607f1b031982600f0b136131745760405162461bcd60e51b81526004016118e090615833565b5060000390565b60008082600f0b12156131e057826001600160801b03168260000384039150816001600160801b0316106131db576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b610564565b826001600160801b03168284019150816001600160801b03161015610564576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b0383161080159061326d575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6132a2576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061333657607f810383901c9150613340565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c6001603f1b161760c19b909b1c6001603e1b169a909a1760c29990991c6001603d1b169890981760c39790971c6001603c1b169690961760c49590951c6001603b1b169490941760c59390931c6001603a1b169290921760c69190911c600160391b161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461352157886001600160a01b03166135058261290f565b6001600160a01b0316111561351a578161351c565b805b613523565b815b9998505050505050505050565b600080821215612ecb576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b6000613592306146a5565b15905090565b600054610100900460ff16806135b157506135b1613587565b806135bf575060005460ff16155b6135fa5760405162461bcd60e51b815260040180806020018281038252602e815260200180615aa7602e913960400191505060405180910390fd5b600054610100900460ff16158015613625576000805460ff1961ff0019909116610100171660011790555b61362d6146ab565b801561363f576000805461ff00191690555b50565b600054610100900460ff168061365b575061365b613587565b80613669575060005460ff16155b6136a45760405162461bcd60e51b815260040180806020018281038252602e815260200180615aa7602e913960400191505060405180910390fd5b600054610100900460ff161580156136cf576000805460ff1961ff0019909116610100171660011790555b6136d761479a565b609a80546001600160a01b0319166001600160a01b0384161790558015611717576000805461ff00191690555050565b60008060008061371887878761238e565b91509150600061372988888861109b565b905061374061373782612e83565b6120cb85612e83565b989197509095505050505050565b60405163f30dba9360e01b81526000906001600160a01b0384169063f30dba939061377d908590600401615786565b6101006040518083038186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ce9190615415565b9a9950505050505050505050565b6137e4614f49