@hybridx-exchange/orderbook-core
Version:
🎛 Core contracts for the HybridX protocol
907 lines • 6.3 MB
JSON
{
"contracts": {
"contracts/OrderBook.sol:OrderBook": {
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderCanceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountUsed",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderClosed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amountUsed",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "OrderUpdate",
"type": "event"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"constant": true,
"inputs": [],
"name": "baseBalance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "baseDecimal",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "baseToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
}
],
"name": "cancelLimitOrder",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "createBuyLimitOrder",
"outputs": [
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "createSellLimitOrder",
"outputs": [
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOutOffer",
"type": "uint256"
}
],
"name": "getAmountInForMovePrice",
"outputs": [
{
"internalType": "uint256",
"name": "amountInGet",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nextReserveBase",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nextReserveQuote",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountInOffer",
"type": "uint256"
}
],
"name": "getAmountOutForMovePrice",
"outputs": [
{
"internalType": "uint256",
"name": "amountOutGet",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nextReserveBase",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "nextReserveQuote",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getPrice",
"outputs": [
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getReserves",
"outputs": [
{
"internalType": "uint112",
"name": "reserveBase",
"type": "uint112"
},
{
"internalType": "uint112",
"name": "reserveQuote",
"type": "uint112"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "getUserOrders",
"outputs": [
{
"internalType": "uint256[]",
"name": "orderIds",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "_pair",
"type": "address"
},
{
"internalType": "address",
"name": "_baseToken",
"type": "address"
},
{
"internalType": "address",
"name": "_quoteToken",
"type": "address"
},
{
"internalType": "uint256",
"name": "_priceStep",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_minAmount",
"type": "uint256"
}
],
"name": "initialize",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "direction",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "maxSize",
"type": "uint32"
}
],
"name": "marketBook",
"outputs": [
{
"internalType": "uint256[]",
"name": "prices",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
}
],
"name": "marketOrder",
"outputs": [
{
"internalType": "uint256[]",
"name": "order",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "marketOrders",
"outputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "orderId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOffer",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountRemain",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "orderType",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "orderIndex",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "minAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newMinAmount",
"type": "uint256"
}
],
"name": "minAmountUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "pair",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "priceDecimal",
"outputs": [
{
"internalType": "uint256",
"name": "decimal",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "priceStep",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newPriceStep",
"type": "uint256"
}
],
"name": "priceStepUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "protocolFeeRate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newProtocolFeeRate",
"type": "uint256"
}
],
"name": "protocolFeeRateUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "quoteBalance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "quoteToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "uint256",
"name": "direction",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "price",
"type": "uint256"
}
],
"name": "rangeBook",
"outputs": [
{
"internalType": "uint256[]",
"name": "prices",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address payable",
"name": "to",
"type": "address"
}
],
"name": "safeRefund",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "subsidyFeeRate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "uint256",
"name": "newSubsidyFeeRate",
"type": "uint256"
}
],
"name": "subsidyFeeRateUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "takeOrderWhenMovePrice",
"outputs": [
{
"internalType": "uint256",
"name": "amountOutLeft",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "accounts",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "userOrders",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "60806040526001601255600580546001600160a01b031916331790556159288061002a6000396000f3fe60806040526004361061017e5760003560e01c8063053b4b9d1461018057806306fdde03146102635780630902f1ac146102ed57806319eda4bc14610328578063217a4b7014610352578063346970f91461038357806338bde791146103fa578063573dd9db1461042157806358f858801461049b5780636069f080146104b057806363c69f08146104da5780637de81d8b1461050d578063856652e9146105d657806388d519c41461060f578063950f59b21461062457806398d5fdca146106675780639b2cb5d81461067c578063a5cdc8fc14610691578063a6b63eb8146106bb578063a8aa1b311461070a578063bc9113f01461071f578063c2ffea8f14610734578063c45a01551461078b578063c55dae63146107a0578063cb160866146107b5578063db7b373e146107f0578063deb65ac314610805578063e52fa98b1461082f578063e68cc59714610865578063f12dbb9f1461089e578063f1564c0b146108e1578063f1a2e8491461090b578063f361df0814610920575b005b34801561018c57600080fd5b506101c3600480360360608110156101a357600080fd5b506001600160a01b03813581169160208101359160409091013516610935565b604051808481526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561020d5781810151838201526020016101f5565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561024c578181015183820152602001610234565b505050509050019550505050505060405180910390f35b34801561026f57600080fd5b50610278610bbe565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b257818101518382015260200161029a565b50505050905090810190601f1680156102df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f957600080fd5b50610302610beb565b604080516001600160701b03938416815291909216602082015281519081900390910190f35b34801561033457600080fd5b5061017e6004803603602081101561034b57600080fd5b5035610c1c565b34801561035e57600080fd5b50610367610d1a565b604080516001600160a01b039092168252519081900360200190f35b34801561038f57600080fd5b506103ad600480360360208110156103a657600080fd5b5035610d29565b604080516001600160a01b03998a168152979098166020880152868801959095526060860193909352608085019190915260a084015260c083015260e08201529051908190036101000190f35b34801561040657600080fd5b5061040f610d79565b60408051918252519081900360200190f35b34801561042d57600080fd5b5061044b6004803603602081101561044457600080fd5b5035610d7f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561048757818101518382015260200161046f565b505050509050019250505060405180910390f35b3480156104a757600080fd5b5061040f610f1c565b3480156104bc57600080fd5b5061017e600480360360208110156104d357600080fd5b5035610f22565b3480156104e657600080fd5b5061044b600480360360208110156104fd57600080fd5b50356001600160a01b0316611020565b34801561051957600080fd5b5061053d6004803603604081101561053057600080fd5b508035906020013561108c565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610581578181015183820152602001610569565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105c05781810151838201526020016105a8565b5050505090500194505050505060405180910390f35b3480156105e257600080fd5b5061040f600480360360408110156105f957600080fd5b506001600160a01b0381351690602001356111db565b34801561061b57600080fd5b5061040f611209565b34801561063057600080fd5b5061040f6004803603606081101561064757600080fd5b506001600160a01b0381358116916020810135916040909101351661120f565b34801561067357600080fd5b5061040f611483565b34801561068857600080fd5b5061040f6114fc565b34801561069d57600080fd5b5061017e600480360360208110156106b457600080fd5b5035611502565b3480156106c757600080fd5b5061017e600480360360a08110156106de57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135611770565b34801561071657600080fd5b50610367611a95565b34801561072b57600080fd5b5061040f611aa4565b34801561074057600080fd5b5061076d6004803603604081101561075757600080fd5b506001600160a01b038135169060200135611b1d565b60408051938452602084019290925282820152519081900360600190f35b34801561079757600080fd5b50610367611c6b565b3480156107ac57600080fd5b50610367611c7a565b3480156107c157600080fd5b5061017e600480360360408110156107d857600080fd5b506001600160a01b0381358116916020013516611c89565b3480156107fc57600080fd5b5061040f611e97565b34801561081157600080fd5b5061017e6004803603602081101561082857600080fd5b5035611e9d565b34801561083b57600080fd5b5061053d6004803603604081101561085257600080fd5b508035906020013563ffffffff16611fc1565b34801561087157600080fd5b5061076d6004803603604081101561088857600080fd5b506001600160a01b0381351690602001356120ce565b3480156108aa57600080fd5b5061040f600480360360608110156108c157600080fd5b506001600160a01b03813581169160208101359160409091013516612215565b3480156108ed57600080fd5b5061017e6004803603602081101561090457600080fd5b5035612476565b34801561091757600080fd5b5061040f61259a565b34801561092c57600080fd5b5061040f6125a0565b600060608060125460011461097a576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b60006012556006546001600160a01b031633146109cf576040805162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b604482015290519081900360640190fd5b60408051600280825260608083018452926020830190803883395050600654600a54600b54939450610a12936001600160a01b03928316935090821691166125a6565b816001600160701b03169150806001600160701b0316905082600081518110610a3757fe5b6020026020010183600181518110610a4b57fe5b6020908102919091010191909152526000610a6588612715565b90506000610a728261273d565b9050600080610a82836000612762565b915091505b8115610b2f576000610ac7858c88600081518110610aa157fe5b602002602001015189600181518110610ab657fe5b602002602001015187600954612784565b5050505090508060001415610adc5750610b2f565b6000610aed8b878487878e8e6128cb565b909b509950909150610b0790508c8263ffffffff61295c16565b9b5081811415610b18575050610b2f565b610b2285856129ac565b9094509250610a87915050565b610b376129b9565b8915610ba85760018414610b7d57610b788a86600081518110610b5657fe5b602002602001015187600181518110610b6b57fe5b6020026020010151612aaf565b610ba3565b610ba38a86600181518110610b8e57fe5b602002602001015187600081518110610b6b57fe5b880197505b5050505050600160128190555093509350939050565b6040518060400160405280601181526020017048796272696458204f72646572426f6f6b60781b81525081565b600654600a54600b546000928392610c13926001600160a01b039283169291821691166125a6565b90939092509050565b601254600114610c5c576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554610c76906001600160a01b0316612bc0565b6001600160a01b0316336001600160a01b031614610cc7576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b6064811115610d10576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420466565205261746560801b604482015290519081900360640190fd5b600f556001601255565b600b546001600160a01b031681565b601060205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007909701546001600160a01b03968716979590961695939492939192909188565b600c5481565b60408051600880825261012082019092526060916020820161010080388339019050509050610dac615859565b50600082815260106020908152604080832081516101008101835281546001600160a01b039081168083526001840154909116948201949094526002820154928101929092526003810154606083015260048101546080830152600581015460a0830152600681015460c08301526007015460e0820152835190928491610e2f57fe5b60200260200101818152505080602001516001600160a01b031682600181518110610e5657fe5b602002602001018181525050806040015182600281518110610e7457fe5b602002602001018181525050806060015182600381518110610e9257fe5b602002602001018181525050806080015182600481518110610eb057fe5b6020026020010181815250508060a0015182600581518110610ece57fe5b6020026020010181815250508060c0015182600681518110610eec57fe5b6020026020010181815250508060e0015182600781518110610f0a57fe5b60200260200101818152505050919050565b600e5481565b601254600114610f62576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554610f7c906001600160a01b0316612bc0565b6001600160a01b0316336001600160a01b031614610fcd576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b601e811115611016576040805162461bcd60e51b815260206004820152601060248201526f496e76616c696420466565205261746560801b604482015290519081900360640190fd5b600e556001601255565b6001600160a01b03811660009081526011602090815260409182902080548351818402810184019094528084526060939283018282801561108057602002820191906000526020600020905b81548152602001906001019080831161106c575b50505050509050919050565b606080600061109c856000612c9b565b9050600060018614156110d7575b81158015906110b95750848210155b156110d2576110c88683612c9b565b91506001016110aa565b611109565b6002861415611109575b81158015906110f05750848211155b15611109576110ff8683612c9b565b91506001016110e1565b80156111d25780604051908082528060200260200182016040528015611139578160200160208202803883390190505b50935080604051908082528060200260200182016040528015611166578160200160208202803883390190505b509250611174866000612c9b565b915060005b818110156111d0578285828151811061118e57fe5b6020026020010181815250506111a48784612cb8565b8482815181106111b057fe5b6020026020010181815250506111c68784612c9b565b9250600101611179565b505b50509250929050565b601160205281600052604060002081815481106111f457fe5b90600052602060002001600091509150505481565b60075481565b6000601254600114611251576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255821580159061126e5750600754838161126b57fe5b06155b6112af576040805162461bcd60e51b815260206004820152600d60248201526c141c9a58d948125b9d985b1a59609a1b604482015290519081900360640190fd5b6005546001600160a01b03166112c481612d32565b6001600160a01b031614611317576040805162461bcd60e51b815260206004820152601560248201527413dc99195c909bdbdac81d5b98dbdb9b9958dd1959605a1b604482015290519081900360640190fd5b6000611321612ddb565b90506000600d54821161133557600061133b565b600d5482035b9050600061134e60085487600954612e57565b905080821015611396576040805162461bcd60e51b815260206004820152600e60248201526d105b5bdd5b9d08125b9d985b1a5960921b604482015290519081900360640190fd5b6006546040805163bc25cf7760e01b81526001600160a01b038a811660048301529151919092169163bc25cf7791602480830192600092919082900301818387803b1580156113e457600080fd5b505af11580156113f8573d6000803e3d6000fd5b505050506000611409838888612e85565b9050801561146a57611420888785848b600161327e565b60408051858152602081018490528082018a90526001606082015290519196506001600160a01b0380891692908b16916000805160206158b1833981519152919081900360800190a35b6114726129b9565b505060016012555090949350505050565b600654600a54600b54600092839283926114ac926001600160a01b0390811692811691166125a6565b91509150816001600160701b03166000146114f757816001600160701b03166114ec600954600a0a836001600160701b03166134cf90919063ffffffff16565b816114f357fe5b0492505b505090565b60085481565b601254600114611542576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060125561154f615859565b5060008181526010602090815260409182902082516101008101845281546001600160a01b039081168083526001840154909116938201939093526002820154938101939093526003810154606084015260048101546080840152600581015460a0840152600681015460c08401526007015460e0830152331461160a576040805162461bcd60e51b815260206004820152600d60248201526c13dddb995c88125b9d985b1a59609a1b604482015290519081900360640190fd5b61161381613532565b600060018260c001511461163257600a546001600160a01b031661163f565b600b546001600160a01b03165b90506116548183602001518460a001516136ec565b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d60208110156116c857600080fd5b505160c0840151909150600114156116e457600d8190556116ea565b600c8190555b82602001516001600160a01b031683600001516001600160a01b03167fd32766082eb3d1ee39881604cae4ea25b61931060c8fbc7d5f05556040053b5785608001518660a0015187606001518860c001516040518085815260200184815260200183815260200182815260200194505050505060405180910390a3505060016012555050565b6005546001600160a01b031633146117bb576040805162461bcd60e51b81526020600482015260096024820152682327a92124a22222a760b91b604482015290519081900360640190fd5b6001821015611806576040805162461bcd60e51b8152602060048201526012602482015271141c9a58d94814dd195c08125b9d985b1a5960721b604482015290519081900360640190fd5b6001811015611851576040805162461bcd60e51b8152602060048201526012602482015271135a5b88105b5bdd5b9d08125b9d985b1a5960721b604482015290519081900360640190fd5b600080866001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561188d57600080fd5b505afa1580156118a1573d6000803e3d6000fd5b505050506040513d60208110156118b757600080fd5b50516040805163d21220a760e01b815290516001600160a01b038a169163d21220a7916004808301926020929190829003018186803b1580156118f957600080fd5b505afa15801561190d573d6000803e3d6000fd5b505050506040513d602081101561192357600080fd5b505190925090506001600160a01b038083169087161480156119565750846001600160a01b0316816001600160a01b0316145b8061198e5750856001600160a01b0316816001600160a01b031614801561198e5750846001600160a01b0316826001600160a01b0316145b6119d4576040805162461bcd60e51b8152602060048201526012602482015271151bdad95b8814185a5c88125b9d985b1a5960721b604482015290519081900360640190fd5b600680546001600160a01b03808a166001600160a01b031992831617909255600a80548984169083168117909155600b80549389169390921692909217905560078590556040805163313ce56760e01b8152905163313ce56791600481810192602092909190829003018186803b158015611a4e57600080fd5b505afa158015611a62573d6000803e3d6000fd5b505050506040513d6020811015611a7857600080fd5b505160ff1660095550506008555050601e600e5550506032600f55565b6006546001600160a01b031681565b600b546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015611ae957600080fd5b505afa158015611afd573d6000803e3d6000fd5b505050506040513d6020811015611b1357600080fd5b505160ff16919050565b600654600a54600b546000928392839283928392611b4b926001600160a01b039283169291821691166125a6565b6001600160701b031691506001600160701b031691506000611b6c88612715565b90506000611b798261273d565b600097509050878780611b8c8482612762565b915091505b8115611c2f576000611ba986858a8a87600954612784565b909d509b50919250505080611bbe5750611c2f565b6000806000611bd8898588600954600e54600f548b6137f1565b91945092509050611bef828263ffffffff61295c16565b909d019c611c03878463ffffffff61295c16565b965083831415611c165750505050611c2f565b611c208887612762565b9096509450611b919350505050565b8215611c5d5760018514611c4d57611c48838888612aaf565b611c58565b611c58838789612aaf565b8a0199505b505050505050509250925092565b6005546001600160a01b031681565b600a546001600160a01b031681565b601254600114611cc9576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554611ce3906001600160a01b0316612bc0565b6001600160a01b0316336001600160a01b031614611d34576040805162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b604482015290519081900360640190fd5b6001600160a01b038216611d8757478015611d81576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b505b50611e8e565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015611dd157600080fd5b505afa158015611de5573d6000803e3d6000fd5b505050506040513d6020811015611dfb57600080fd5b5051600a5490915081906001600160a01b0385811691161415611e40576000611e246002613983565b9050808311611e34576000611e38565b8083035b915050611e7a565b600b546001600160a01b0385811691161415611e7a576000611e626001613983565b9050808311611e72576000611e76565b8083035b9150505b8015611e8b57611e8b8484836139bf565b50505b50506001601255565b60095481565b601254600114611edd576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601255600554611ef7906001600160a01b0316612bc0565b6001600160a01b0316336001600160a01b031614611f6c57611f196001613b47565b158015611f2d5750611f2b6002613b47565b155b611f6c576040805162461bcd60e51b815260206004820152600b60248201526a13dc99195c88115e1a5cdd60aa1b604482015290519081900360640190fd5b6001811015611fb7576040805162461bcd60e51b8152602060048201526012602482015271141c9a58d94814dd195c08125b9d985b1a5960721b604482015290519081900360640190fd5b6007556001601255565b6060806000611fcf85613b47565b90508363ffffffff168111611fe45780611fec565b8363ffffffff165b905080604051908082528060200260200182016040528015612018578160200160208202803883390190505b50925080604051908082528060200260200182016040528015612045578160200160208202803883390190505b5091506000612055866000612c9b565b905060005b811580159061206e5750828163ffffffff16105b156111d05781858263ffffffff168151811061208657fe5b60200260200101818152505061209c8783612cb8565b848263ffffffff16815181106120ae57fe5b6020026020010181815250506120c48783612c9b565b915060010161205a565b600654600a54600b5460009283928392839283926120fc926001600160a01b039283169291821691166125a6565b6001600160701b031691506001600160701b03169150600061211d88612715565b9050600061212a8261273d565b60009750905087878061213d8582612762565b915091505b81156121f157600061215a85858a8a87600954613b59565b909d509b5091925050508061216f57506121f1565b6000806000612189888588600954600e54600f548b613c97565b919450925090506121a183600163ffffffff613dc816565b909d019c6121c56121b8838363ffffffff61295c16565b889063ffffffff61295c16565b9650838214156121d857505050506121f1565b6121e28987612762565b90965094506121429350505050565b8215611c5d576001841461220a57611c48838888613e17565b611c58838789613e17565b6000601254600114612257576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060125582158015906122745750600754838161227157fe5b06155b6122b5576040805162461bcd60e51b815260206004820152600d60248201526c141c9a58d948125b9d985b1a59609a1b604482015290519081900360640190fd5b6005546001600160a01b03166122ca81612d32565b6001600160a01b03161461231d576040805162461bcd60e51b815260206004820152601560248201527413dc99195c909bdbdac81d5b98dbdb9b9958dd1959605a1b604482015290519081900360640190fd5b6000612327613f1d565b90506000600c54821161233b576000612341565b600c5482035b905060085481101561238b576040805162461bcd60e51b815260206004820152600e60248201526d105b5bdd5b9d08125b9d985b1a5960921b604482015290519081900360640190fd5b6006546040805163bc25cf7760e01b81526001600160a01b0389811660048301529151919092169163bc25cf7791602480830192600092919082900301818387803b1580156123d957600080fd5b505af11580156123ed573d6000803e3d6000fd5b5050505060006123fe828787613f68565b9050801561245f57612415878684848a600261327e565b60408051848152602081018490528082018990526002606082015290519195506001600160a01b0380881692908a16916000805160206158b1833981519152919081900360800190a35b6124676129b9565b50506001601255509392505050565b6012546001146124b6576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b60006012556005546124d0906001600160a01b0316612bc0565b6001600160a01b0316336001600160a01b031614612545576124f26001613b47565b15801561250657506125046002613b47565b155b612545576040805162461bcd60e51b815260206004820152600b60248201526a13dc99195c88115e1a5cdd60aa1b604482015290519081900360640190fd5b6001811015612590576040805162461bcd60e51b8152602060048201526012602482015271135a5b88105b5bdd5b9d08125b9d985b1a5960721b604482015290519081900360640190fd5b6008556001601255565b600d5481565b600f5481565b600080826001600160a01b0316846001600160a01b03161415612606576040805162461bcd60e51b81526020600482015260136024820152724944454e544943414c5f41444452455353455360681b604482015290519081900360640190fd5b6000836001600160a01b0316856001600160a01b0316106126275783612629565b845b90506001600160a01b038116612675576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b600080876001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156126b157600080fd5b505afa1580156126c5573d6000803e3d6000fd5b505050506040513d60608110156126db57600080fd5b50805160209091015190925090506001600160a01b0387811690841614612703578082612706565b81815b90999098509650505050505050565b600b546000906001600160a01b03838116911614612734576002612737565b60015b92915050565b600081600114156127505750600261275d565b816002141561275d575060015b919050565b60008061276f8484612c9b565b915061277b8483612cb8565b90509250929050565b600080600080600060018b14156128205760006127a38a8a8a8a61430a565b905060006127b98a6107cd63ffffffff6134cf16565b90508082116127c95760006127dd565b6127dd8183036107ca63ffffffff61435616565b94508b85116127ec57846127ee565b8b5b9450841561280657612801858b8d612aaf565b612809565b60005b858d039750955050508389039150508682016128bd565b60028b14156128b45760006128378a8a8a8a614369565b9050600061284d8b6107cd63ffffffff6134cf16565b905080821161285d576000612871565b6128718183036107ca63ffffffff61435616565b95508b86116128805785612882565b8b5b9550851561289a57612895868c8c612aaf565b61289d565b60005b868d039750945050508884019150508187036128bd565b50889350879050865b965096509650965096915050565b6000806060806000806128e08c8c8c8c6143a7565b9399509650919450925090506128f683886143f2565b925061290284896144ae565b9350612914828263ffffffff61295c16565b9450600060018d1461293157600b546001600160a01b031661293e565b600a546001600160a01b03165b905061294b818f886139bf565b505050975097509750979350505050565b80820382811115612737576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008061276f848461457d565b600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a0457600080fd5b505afa158015612a18573d6000803e3d6000fd5b505050506040513d6020811015612a2e57600080fd5b5051600c55600b54604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a7e57600080fd5b505afa158015612a92573d6000803e3d6000fd5b505050506040513d6020811015612aa857600080fd5b5051600d55565b6000808411612b01576040805162461bcd60e51b8152602060048201526019602482015278125394d551919250d251539517d25394155517d05353d55395603a1b604482015290519081900360640190fd5b600083118015612b115750600082115b612b5b576040805162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b604482015290519081900360640190fd5b6000612b6f856103e563ffffffff6134cf16565b90506000612b83828563ffffffff6134cf16565b90506000612ba983612b9d886103e863ffffffff6134cf16565b9063ffffffff613dc816565b9050808281612bb457fe5b04979650505050505050565b6000816001600160a01b031663e14f870d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bfb57600080fd5b505afa158015612c0f573d6000803e3d6000fd5b505050506040513d6020811015612c2557600080fd5b5051604080516303e1469160e61b815290516001600160a01b039092169163f851a44091600480820192602092909190829003018186803b158015612c6957600080fd5b505afa158015612c7d573d6000803e3d6000fd5b505050506040513d6020811015612c9357600080fd5b505192915050565b600091825260036020908152604080842092845291905290205490565b600082815260016020908152604080832084845282528083205485845260028352818420858552909252822054815b81811015612d29576000868152602081815260408083208884528252808320848452825280832054835260109091529020600501549390930192600101612ce7565b50505092915050565b6000816001600160a01b031663e14f870d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d6d57600080fd5b505afa158015612d81573d6000803e3d6000fd5b505050506040513d6020811015612d9757600080fd5b50516040805163def0d2cb60e01b815290516001600160a01b039092169163def0d2cb91600480820192602092909190829003018186803b158015612c6957600080fd5b600b54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612e2657600080fd5b505afa158015612e3a573d6000803e3d6000fd5b505050506040513d6020811015612e5057600080fd5b5051919050565b6000612e7d600a83900a612e71868663ffffffff6134cf16565b9063ffffffff61435616565b949350505050565b60408051600480825260a0820190925260009160609190602082016080803883395050600654600a54600b54939450612ecf936001600160a01b03928316935090821691166125a6565b816001600160701b03169150806001600160701b0316905082600081518110612ef457fe5b6020026020010183600181518110612f0857fe5b602002602001018281525082815250505080600081518110612f2657fe5b602002602001015181600181518110612f3b57fe5b602002602001015182600281518110612f5057fe5b6020026020010183600381518110612f6457fe5b602002602001018281525082815250505060008082600081518110612f8557fe5b6020026020010151118015612fae5750600082600181518110612fa457fe5b6020026020010151115b905060008060008895506000612fc660026000612c9b565b90505b8015801590612fd85750888111155b15613100578685156130635761301d60018989600081518110612ff757fe5b60200260200101518a60018151811061300c57fe5b602002602001015186600954612784565b8b60028151811061302a57fe5b602002602001018c60038151811061303e57fe5b6020908102919091010191909152529096509450905080613063576000975050613100565b6000613070600284612cb8565b905060008060006060806130876001888a896143a7565b9398509196509450925090506130a3848463ffffffff61295c16565b600b549901986130bd906001600160a01b031683836145c5565b868514156130d55760009d5050505050505050613100565b6130e58e8663ffffffff61295c16565b9d506130f260028961457d565b975050505050505050612fc9565b811561311d57600a5461311d906001600160a01b031689846136ec565b84801561312a5750600087115b80156131365750888114155b156131ac576131746001888860008151811061314e57fe5b60200260200101518960018151811061316357fe5b60200260200101518d600954612784565b8a60028151811061318157fe5b602002602001018b60038151811061319557fe5b602090810291909101019190915252919850945092505b82156132715786156131f7576131f08784886002815181106131ca57fe5b6020026020010151896003815181106131df57fe5b60200260200101518d60095461473d565b5090975092505b600b54600a54613217918a916001600160a01b0391821691168688614820565b86158061322b575088613228611483565b10155b613271576040805162461bcd60e51b8152602060048201526012602482015271084eaf240e0e4d2c6ca40dad2e6dac2e8c6d60731b604482015290519081900360640190fd5b5050505050509392505050565b6001600160a01b038616600090815260116020908152604080832080548251818502810185019093528083526060938301828280156132dc57602002820191906000526020600020905b8154815260200190600101908083116132c8575b5050505050905060ff815110613334576040805162461bcd60e51b815260206004820152601860248201527713dc99195c88139d5b58995c881a5cc8195e18d95959195960421b604482015290519081900360640190fd5b805161333e615859565b6040518061010001604052808b6001600160a01b031681526020018a6001600160a01b03168152602001613370614c3c565b8152602001878152602001898152602001888152602001868152602001838152509050601160008b6001600160a01b03166001600160a01b031681526020019081526020016000208160400151908060018154018082558091505090600182039060005260206000200160009091929091909150555080601060008360400151815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151