@backt/protocol
Version:
Backt smart contracts implementation
1,558 lines • 204 kB
JSON
{
"contractName": "ContractForDifference",
"abi": [
{
"constant": true,
"inputs": [],
"name": "seller",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "feedsAddr",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "terminated",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "FORCE_TERMINATE_PENALTY_PERCENT",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerSaleStrikePrice",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerInitialNotional",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "FACTOR_INT",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerDepositBalance",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "upgradeCalledBy",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "notionalAmountWei",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "upgradeable",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "closed",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MINIMUM_COLLATERAL_PERCENT",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerSaleTimeLimit",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerInitialStrikePrice",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "LIQUIDATE_THRESHOLD_PERCENT_RAISED",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyer",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerInitialNotional",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerSaleStrikePrice",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "registry",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MAXIMUM_COLLATERAL_PERCENT",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "market",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "LIQUIDATE_THRESHOLD_PERCENT",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "cfdRegistryAddr",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerDepositBalance",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "initiated",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerSelling",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "strikePrice",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "buyerInitialStrikePrice",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "withdrawable",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "FACTOR_UINT",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MINIMUM_NOTIONAL_AMOUNT_WEI",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerSaleTimeLimit",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "sellerSelling",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "creator",
"type": "address"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
},
{
"indexed": false,
"name": "notionalAmountWei",
"type": "uint256"
},
{
"indexed": false,
"name": "deposit",
"type": "uint256"
}
],
"name": "LogCFDCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "joiner",
"type": "address"
},
{
"indexed": false,
"name": "amountSent",
"type": "uint256"
},
{
"indexed": false,
"name": "buyer",
"type": "address"
},
{
"indexed": false,
"name": "seller",
"type": "address"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
},
{
"indexed": false,
"name": "notionalAmountWei",
"type": "uint256"
},
{
"indexed": false,
"name": "strikePrice",
"type": "uint256"
},
{
"indexed": false,
"name": "buyerDepositBalance",
"type": "uint256"
},
{
"indexed": false,
"name": "sellerDepositBalance",
"type": "uint256"
}
],
"name": "LogCFDInitiated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "oldOwner",
"type": "address"
},
{
"indexed": false,
"name": "newOwner",
"type": "address"
}
],
"name": "LogCFDTransferPosition",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
}
],
"name": "LogCFDCanceledNew",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
},
{
"indexed": false,
"name": "newStrikePrice",
"type": "uint256"
}
],
"name": "LogCFDStrikePriceUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
},
{
"indexed": false,
"name": "saleStrikePrice",
"type": "uint256"
},
{
"indexed": false,
"name": "timeLimit",
"type": "uint256"
}
],
"name": "LogCFDSale",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
}
],
"name": "LogCFDSaleCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
},
{
"indexed": false,
"name": "newPrice",
"type": "uint256"
}
],
"name": "LogCFDSaleUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "by",
"type": "address"
},
{
"indexed": false,
"name": "newNotional",
"type": "uint256"
},
{
"indexed": false,
"name": "sellerAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "buyerDeposit",
"type": "uint256"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
}
],
"name": "LogCFDSold",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "receiver",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
}
],
"name": "LogCFDSendCollateralFailure",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "withdrawer",
"type": "address"
}
],
"name": "LogCFDWithrewUnsent",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "party",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"name": "isWithdraw",
"type": "bool"
},
{
"indexed": false,
"name": "newBalance",
"type": "uint256"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
}
],
"name": "LogCFDPartyBalanceUpdate",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "receiver",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
}
],
"name": "LogCFDTransferFunds",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "winner",
"type": "address"
},
{
"indexed": false,
"name": "buyerCollateral",
"type": "uint256"
},
{
"indexed": false,
"name": "sellerCollateral",
"type": "uint256"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
}
],
"name": "LogCFDClosed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "terminator",
"type": "address"
},
{
"indexed": false,
"name": "terminatorAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "otherParty",
"type": "address"
},
{
"indexed": false,
"name": "otherPartyAmount",
"type": "uint256"
},
{
"indexed": false,
"name": "market",
"type": "bytes32"
}
],
"name": "LogCFDForceTerminated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "newCFD",
"type": "address"
}
],
"name": "LogCFDUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "remainder",
"type": "uint256"
}
],
"name": "LogCFDRemainingBalanceUnexpected",
"type": "event"
},
{
"constant": true,
"inputs": [],
"name": "isActive",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isBuyerSelling",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isSellerSelling",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_party",
"type": "address"
}
],
"name": "isSelling",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_party",
"type": "address"
}
],
"name": "isContractParty",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "notional",
"type": "uint256"
}
],
"name": "creatorFee",
"outputs": [
{
"name": "fee",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "notional",
"type": "uint256"
}
],
"name": "joinerFee",
"outputs": [
{
"name": "fee",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_registryAddr",
"type": "address"
},
{
"name": "_cfdRegistryAddr",
"type": "address"
},
{
"name": "_feedsAddr",
"type": "address"
},
{
"name": "_partyAddr",
"type": "address"
},
{
"name": "_marketId",
"type": "bytes32"
},
{
"name": "_strikePrice",
"type": "uint256"
},
{
"name": "_notionalAmountWei",
"type": "uint256"
},
{
"name": "_isBuyer",
"type": "bool"
}
],
"name": "create",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_cfdAddr",
"type": "address"
},
{
"name": "_registryAddr",
"type": "address"
},
{
"name": "_cfdRegistryAddr",
"type": "address"
},
{
"name": "_feedsAddr",
"type": "address"
}
],
"name": "createByUpgrade",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCfdAttributes",
"outputs": [
{
"name": "",
"type": "address"
},
{
"name": "",
"type": "address"
},
{
"name": "",
"type": "bytes32"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "bool"
},
{
"name": "",
"type": "bool"
},
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCfdAttributes2",
"outputs": [
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCfdAttributes3",
"outputs": [
{
"name": "",
"type": "bool"
},
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "deposit",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "cancelNew",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "topup",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_withdrawAmount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newAddress",
"type": "address"
}
],
"name": "transferPosition",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_desiredStrikePrice",
"type": "uint256"
},
{
"name": "_timeLimit",
"type": "uint256"
}
],
"name": "sellPrepare",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newPrice",
"type": "uint256"
}
],
"name": "sellUpdate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_newStrikePrice",
"type": "uint256"
}
],
"name": "changeStrikePrice",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "sellCancel",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_buyBuyerSide",
"type": "bool"
}
],
"name": "buy",
"outputs": [],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_oldNotional",
"type": "uint256"
},
{
"name": "_oldStrikePrice",
"type": "uint256"
},
{
"name": "_newStrikePrice",
"type": "uint256"
}
],
"name": "calculateNewNotional",
"outputs": [
{
"name": "newNotional",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "liquidate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "forceTerminate",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "upgrade",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "status",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawUnsent",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_strikePrice",
"type": "uint256"
},
{
"name": "_currentPrice",
"type": "uint256"
},
{
"name": "_notionalAmount",
"type": "uint256"
}
],
"name": "changeInWei",
"outputs": [
{
"name": "change",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_value",
"type": "uint256"
},
{
"name": "_newValue",
"type": "uint256"
}
],
"name": "percentChange",
"outputs": [
{
"name": "percent",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_amount",
"type": "uint256"
},
{
"name": "_percent",
"type": "uint256"
}
],
"name": "percentOf",
"outputs": [
{
"name": "adjusted",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_strikePrice",
"type": "uint256"
},
{
"name": "_marketPrice",
"type": "uint256"
},
{
"name": "_notionalAmount",
"type": "uint256"
},
{
"name": "_depositBalance",
"type": "uint256"
},
{
"name": "_isBuyer",
"type": "bool"
}
],
"name": "calculateCollateralAmount",
"outputs": [
{
"name": "collateral",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_notionalAmount",
"type": "uint256"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "collateralInRange",
"outputs": [
{
"name": "inRange",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_marketPrice",
"type": "uint256"
},
{
"name": "_buyerDepositBalance",
"type": "uint256"
},
{
"name": "_sellerDepositBalance",
"type": "uint256"
},
{
"name": "_strikePrice",
"type": "uint256"
}
],
"name": "marketPriceInRange",
"outputs": [
{
"name": "inRange",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_notionalAmountWei",
"type": "uint256"
},
{
"name": "_depositBalance",
"type": "uint256"
},
{
"name": "_strikePrice",
"type": "uint256"
},
{
"name": "_calcForBuyerSide",
"type": "bool"
}
],
"name": "cutOffPrice",
"outputs": [
{
"name": "price",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
}
],
"bytecode": "0x60806040526000601060026101000a81548160ff0219169083151502179055506000601060036101000a81548160ff0219169083151502179055506000601060056101000a81548160ff0219169083151502179055506000601060066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156100a357600080fd5b50615ed080620000b46000396000f30060806040526004361061032d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806308551a53146103325780630a10ff5f14610389578063194307bf146103e05780631a9fddf21461040f5780631bcccdf71461043c5780631bdfca0114610467578063200d2ed21461049257806322e20d2a146104cb57806322f3e2d4146104f65780632802759b1461052557806328970492146105bb57806328a07025146105e65780632a6d096f146105fd5780632d4dce7d146106595780632e1a7d4d146106845780632f301a78146106b1578063333c9dda14610706578063393d85331461075d5780633c79ad64146107be57806341c20c8e146107e957806346f33a6d14610818578063497b13d3146108475780635407baea1461085e578063597e1fb5146108b95780635ab3076c146108e85780635df0d4cd146109135780635dfa360a146109d75780635e24e35d14610a425780636182fab314610a8557806369774c2d14610ab05780636a8100b214610aba5780636ca6bbd814610ae55780637028875e14610b105780637150d8ae14610b305780637185b30c14610b875780637856193914610bb257806378c3829b14610bdd5780637af5cde914610c1e5780637b10399914610c815780637b433e0914610cd85780637d21f95014610d0357806380f5560514610d65578063818197ea14610d985780638505571e14610dc2578063917faf0e14610e0357806393a9651214610e2e57806398074eb414610e4557806398531f2814610e9c5780639c03d24a14610ecb5780639dec143014610f165780639f11853614610f41578063a22adf3b14610f70578063a6f4082114610f87578063ae3cde5914610fd2578063c2ef94f614611001578063c52987cf146110d3578063c93c88d7146110fe578063c9e2525114611129578063ce513b6f1461114b578063d0e30db0146111a2578063d525be32146111ac578063d55ec69714611207578063d7a7afac1461121e578063dc2ae6e814611249578063de46da8014611298578063df0fdcdc146112c3578063f797efda146112ee578063f7d740ac14611305578063fe2e56991461135a575b600080fd5b34801561033e57600080fd5b50610347611389565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039557600080fd5b5061039e6113af565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103ec57600080fd5b506103f56113d5565b604051808215151515815260200191505060405180910390f35b34801561041b57600080fd5b5061043a600480360381019080803590602001909291905050506113e8565b005b34801561044857600080fd5b50610451611552565b6040518082815260200191505060405180910390f35b34801561047357600080fd5b5061047c611557565b6040518082815260200191505060405180910390f35b34801561049e57600080fd5b506104a761155d565b604051808260038111156104b757fe5b60ff16815260200191505060405180910390f35b3480156104d757600080fd5b506104e06115d6565b6040518082815260200191505060405180910390f35b34801561050257600080fd5b5061050b6115dc565b604051808215151515815260200191505060405180910390f35b6105b9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611619565b005b3480156105c757600080fd5b506105d0611f72565b6040518082815260200191505060405180910390f35b3480156105f257600080fd5b506105fb611f7f565b005b34801561060957600080fd5b506106126122f5565b604051808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b34801561066557600080fd5b5061066e612333565b6040518082815260200191505060405180910390f35b34801561069057600080fd5b506106af60048036038101908080359060200190929190505050612339565b005b3480156106bd57600080fd5b506106f06004803603810190808035906020019092919080359060200190929190803590602001909291905050506126b5565b6040518082815260200191505060405180910390f35b34801561071257600080fd5b5061071b6126ed565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561076957600080fd5b506107a8600480360381019080803590602001909291908035906020019092919080359060200190929190803515159060200190929190505050612713565b6040518082815260200191505060405180910390f35b3480156107ca57600080fd5b506107d36127d9565b6040518082815260200191505060405180910390f35b3480156107f557600080fd5b506107fe6127df565b604051808215151515815260200191505060405180910390f35b34801561082457600080fd5b5061082d6127f2565b604051808215151515815260200191505060405180910390f35b34801561085357600080fd5b5061085c612823565b005b34801561086a57600080fd5b5061089f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a6e565b604051808215151515815260200191505060405180910390f35b3480156108c557600080fd5b506108ce612b1f565b604051808215151515815260200191505060405180910390f35b3480156108f457600080fd5b506108fd612b32565b6040518082815260200191505060405180910390f35b6109d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356000191690602001909291908035906020019092919080359060200190929190803515159060200190929190505050612b37565b005b3480156109e357600080fd5b50610a2c60048036038101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190505050613021565b6040518082815260200191505060405180910390f35b348015610a4e57600080fd5b50610a83600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130b1565b005b348015610a9157600080fd5b50610a9a6133c2565b6040518082815260200191505060405180910390f35b610ab86133c8565b005b348015610ac657600080fd5b50610acf613586565b6040518082815260200191505060405180910390f35b348015610af157600080fd5b50610afa61358c565b6040518082815260200191505060405180910390f35b610b2e600480360381019080803590602001909291905050506135a8565b005b348015610b3c57600080fd5b50610b4561369a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9357600080fd5b50610b9c6136bf565b6040518082815260200191505060405180910390f35b348015610bbe57600080fd5b50610bc76136c5565b6040518082815260200191505060405180910390f35b348015610be957600080fd5b50610c08600480360381019080803590602001909291905050506136cb565b6040518082815260200191505060405180910390f35b348015610c2a57600080fd5b50610c67600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001909291905050506136eb565b604051808215151515815260200191505060405180910390f35b348015610c8d57600080fd5b50610c9661372c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ce457600080fd5b50610ced613752565b6040518082815260200191505060405180910390f35b348015610d0f57600080fd5b50610d18613758565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b348015610d7157600080fd5b50610d7a613796565b60405180826000191660001916815260200191505060405180910390f35b610dc0600480360381019080803590602001909291908035906020019092919050505061379c565b005b348015610dce57600080fd5b50610ded60048036038101908080359060200190929190505050613a53565b6040518082815260200191505060405180910390f35b348015610e0f57600080fd5b50610e18613a73565b6040518082815260200191505060405180910390f35b348015610e3a57600080fd5b50610e43613a78565b005b348015610e5157600080fd5b50610e5a6142d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610ea857600080fd5b50610eb16142fc565b604051808215151515815260200191505060405180910390f35b348015610ed757600080fd5b50610f00600480360381019080803590602001909291908035906020019092919050505061432d565b6040518082815260200191505060405180910390f35b348015610f2257600080fd5b50610f2b614377565b6040518082815260200191505060405180910390f35b348015610f4d57600080fd5b50610f5661437d565b604051808215151515815260200191505060405180910390f35b348015610f7c57600080fd5b50610f85614390565b005b348015610f9357600080fd5b50610fbc6004803603810190808035906020019092919080359060200190929190505050614515565b6040518082815260200191505060405180910390f35b348015610fde57600080fd5b50610fe761452e565b604051808215151515815260200191505060405180910390f35b34801561100d57600080fd5b50611016614541565b604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001876000191660001916815260200186815260200185815260200184151515158152602001831515151581526020018260038111156110b857fe5b60ff1681526020019850505050505050505060405180910390f35b3480156110df57600080fd5b506110e86145dd565b6040518082815260200191505060405180910390f35b34801561110a57600080fd5b506111136145e3565b6040518082815260200191505060405180910390f35b6111496004803603810190808035151590602001909291905050506145e9565b005b34801561115757600080fd5b5061118c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614b1d565b6040518082815260200191505060405180910390f35b6111aa614b35565b005b3480156111b857600080fd5b506111ed600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050615429565b604051808215151515815260200191505060405180910390f35b34801561121357600080fd5b5061121c6154fa565b005b34801561122a57600080fd5b50611233615a4e565b6040518082815260200191505060405180910390f35b34801561125557600080fd5b5061127e6004803603810190808035906020019092919080359060200190929190505050615a5b565b604051808215151515815260200191505060405180910390f35b3480156112a457600080fd5b506112ad615a8a565b6040518082815260200191505060405180910390f35b3480156112cf57600080fd5b506112d8615a8f565b6040518082815260200191505060405180910390f35b3480156112fa57600080fd5b50611303615a95565b005b34801561131157600080fd5b50611344600480360381019080803590602001909291908035906020019092919080359060200190929190505050615b7d565b6040518082815260200191505060405180910390f35b34801561136657600080fd5b5061136f615ba0565b604051808215151515815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060049054906101000a900460ff1681565b6113f06115dc565b8015156113fc57600080fd5b61140533615429565b80151561141157600080fd5b6000831180151561142157600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156114825783600c819055506114e1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156114e05783600e819055505b5b7fbbee2154904c4910310beb779cb9f970f5faa539a34158662d3963477f19ce313385604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150505050565b600581565b600c5481565b600060011515601060039054906101000a900460ff161515141561158457600390506115d3565b60001515601060029054906101000a900460ff16151514156115a957600090506115d3565b6115b16142fc565b806115c057506115bf6127f2565b5b156115ce57600290506115d3565b600190505b90565b60055481565b600060011515601060029054906101000a900460ff161515148015611614575060001515601060039054906101000a900460ff161515145b905090565b60008490508073ffffffffffffffffffffffffffffffffffffffff166380f556056040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561168057600080fd5b505afa158015611694573d6000803e3d6000fd5b505050506040513d60208110156116aa57600080fd5b8101908080519060200190929190505050600281600019169055508073ffffffffffffffffffffffffffffffffffffffff16633c79ad646040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561172757600080fd5b505afa15801561173b573d6000803e3d6000fd5b505050506040513d602081101561175157600080fd5b81019080805190602001909291905050506003819055508073ffffffffffffffffffffffffffffffffffffffff1663c52987cf6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156117ca57600080fd5b505afa1580156117de573d6000803e3d6000fd5b505050506040513d60208110156117f457600080fd5b81019080805190602001909291905050506006819055508073ffffffffffffffffffffffffffffffffffffffff16637150d8ae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561186d57600080fd5b505afa158015611881573d6000803e3d6000fd5b505050506040513d602081101561189757600080fd5b81019080805190602001909291905050506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166308551a536040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d602081101561197357600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16639dec14306040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611a2657600080fd5b505afa158015611a3a573d6000803e3d6000fd5b505050506040513d6020811015611a5057600080fd5b81019080805190602001909291905050506009819055508073ffffffffffffffffffffffffffffffffffffffff16637185b30c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611ac957600080fd5b505afa158015611add573d6000803e3d6000fd5b505050506040513d6020811015611af357600080fd5b81019080805190602001909291905050506004819055508073ffffffffffffffffffffffffffffffffffffffff1663c93c88d76040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611b6c57600080fd5b505afa158015611b80573d6000803e3d6000fd5b505050506040513d6020811015611b9657600080fd5b81019080805190602001909291905050506007819055508073ffffffffffffffffffffffffffffffffffffffff16632d4dce7d6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611c0f57600080fd5b505afa158015611c23573d6000803e3d6000fd5b505050506040513d6020811015611c3957600080fd5b8101908080519060200190929190505050600a819055508073ffffffffffffffffffffffffffffffffffffffff166322e20d2a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611cb257600080fd5b505afa158015611cc6573d6000803e3d6000fd5b505050506040513d6020811015611cdc57600080fd5b81019080805190602001909291905050506005819055508073ffffffffffffffffffffffffffffffffffffffff16636a8100b26040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d6020811015611d7f57600080fd5b810190808051906020019092919050505060088190555082601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601060026101000a81548160ff021916908315150217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381e8dfa2600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b505050505050505050565b68056bc75e2d6310000081565b6000806000806000611f8f6115dc565b801515611f9b57600080fd5b611fa3615bb3565b9550611fb786600954600a546006546136eb565b151515612052576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f4c6971756964617465207468726573686f6c64206e6f7420796574207265616381526020017f686564000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6120656003546009546006546001612713565b945084861193508361209957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120bc565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b92503073ffffffffffffffffffffffffffffffffffffffff163191508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156121c75781600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f4ef7babf760ae67aea11df6f2f8872dd3c883143d490e6cd77f9a4b709dc70d68383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1612233565b7fae0c91484288809ae2c2fb81551bd9d06d4d3bcbbce87f3c5a3d5775f299358b8383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15b6001601060036101000a81548160ff0219169083151502179055507faa0254c6ef7b0f13349b08e091c677fb9d83e5829f3e697eee7127c0702292b3838561227c57600061227e565b835b86612289578461228c565b60005b600254604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001826000191660001916815260200194505050505060405180910390a1505050505050565b600080600080600080600080600454600554600954600a54600c54600e54600754600854975097509750975097509750975097509091929394959697565b600a5481565b6000806000806000856001811015151561235257600080fd5b60011515601060029054906101000a900460ff16151514151561237457600080fd5b60001515601060039054906101000a900460ff16151514151561239657600080fd5b61239f33612a6e565b15156123aa57600080fd5b600015156123b733615429565b15151415156123c557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161495508561242457600a54612428565b6009545b94508487111561243757600080fd5b8685039350612444615bb3565b9250612470838761245757600954612459565b855b886124645786612468565b600a545b6006546136eb565b151561247b57600080fd5b61248c60065484600354878a613021565b915061249a60035483615a5b565b15156124a557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc889081150290604051600060405180830381858888f1935050505015156125945786600b60003373fffffffffffffffffffffffffffffffffffffff