2945 lines
779 KiB
JSON
2945 lines
779 KiB
JSON
{
|
|
"schemaVersion": "2.0.0",
|
|
"contractName": "NativeOrdersFeature",
|
|
"compilerOutput": {
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "zeroExAddress",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IEtherTokenV06",
|
|
"name": "weth",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IStaking",
|
|
"name": "staking",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract FeeCollectorController",
|
|
"name": "feeCollectorController",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint32",
|
|
"name": "protocolFeeMultiplier",
|
|
"type": "uint32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "greedyTokensBloomFilter",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "constructor"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "protocolFeePaid",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "LimitOrderFilled",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "OrderCancelled",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "minValidSalt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "PairCancelledLimitOrders",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "minValidSalt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "PairCancelledRfqOrders",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"name": "RfqOrderFilled",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address",
|
|
"name": "origin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "address[]",
|
|
"name": "addrs",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "bool",
|
|
"name": "allowed",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"name": "RfqOrderOriginsAllowed",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "EIP712_DOMAIN_SEPARATOR",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "FEATURE_NAME",
|
|
"outputs": [
|
|
{
|
|
"internalType": "string",
|
|
"name": "",
|
|
"type": "string"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "FEATURE_VERSION",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "GREEDY_TOKENS_BLOOM_FILTER",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "PROTOCOL_FEE_MULTIPLIER",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint32",
|
|
"name": "",
|
|
"type": "uint32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "_fillLimitOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "_fillRfqOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder[]",
|
|
"name": "orders",
|
|
"type": "tuple[]"
|
|
}
|
|
],
|
|
"name": "batchCancelLimitOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06[]",
|
|
"name": "makerTokens",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06[]",
|
|
"name": "takerTokens",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "minValidSalts",
|
|
"type": "uint256[]"
|
|
}
|
|
],
|
|
"name": "batchCancelPairLimitOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06[]",
|
|
"name": "makerTokens",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06[]",
|
|
"name": "takerTokens",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "minValidSalts",
|
|
"type": "uint256[]"
|
|
}
|
|
],
|
|
"name": "batchCancelPairRfqOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder[]",
|
|
"name": "orders",
|
|
"type": "tuple[]"
|
|
}
|
|
],
|
|
"name": "batchCancelRfqOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder[]",
|
|
"name": "orders",
|
|
"type": "tuple[]"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature[]",
|
|
"name": "signatures",
|
|
"type": "tuple[]"
|
|
}
|
|
],
|
|
"name": "batchGetLimitOrderRelevantStates",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo[]",
|
|
"name": "orderInfos",
|
|
"type": "tuple[]"
|
|
},
|
|
{
|
|
"internalType": "uint128[]",
|
|
"name": "actualFillableTakerTokenAmounts",
|
|
"type": "uint128[]"
|
|
},
|
|
{
|
|
"internalType": "bool[]",
|
|
"name": "isSignatureValids",
|
|
"type": "bool[]"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder[]",
|
|
"name": "orders",
|
|
"type": "tuple[]"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature[]",
|
|
"name": "signatures",
|
|
"type": "tuple[]"
|
|
}
|
|
],
|
|
"name": "batchGetRfqOrderRelevantStates",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo[]",
|
|
"name": "orderInfos",
|
|
"type": "tuple[]"
|
|
},
|
|
{
|
|
"internalType": "uint128[]",
|
|
"name": "actualFillableTakerTokenAmounts",
|
|
"type": "uint128[]"
|
|
},
|
|
{
|
|
"internalType": "bool[]",
|
|
"name": "isSignatureValids",
|
|
"type": "bool[]"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "cancelLimitOrder",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "minValidSalt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "cancelPairLimitOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "minValidSalt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "cancelPairRfqOrders",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "cancelRfqOrder",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"name": "fillLimitOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"name": "fillOrKillLimitOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"name": "fillOrKillRfqOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFillAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"name": "fillRfqOrder",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getLimitOrderHash",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getLimitOrderInfo",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo",
|
|
"name": "orderInfo",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFeeAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "sender",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "feeRecipient",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.LimitOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getLimitOrderRelevantState",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo",
|
|
"name": "orderInfo",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "actualFillableTakerTokenAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "bool",
|
|
"name": "isSignatureValid",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "getProtocolFeeMultiplier",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint32",
|
|
"name": "multiplier",
|
|
"type": "uint32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getRfqOrderHash",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getRfqOrderInfo",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo",
|
|
"name": "orderInfo",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "makerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "contract IERC20TokenV06",
|
|
"name": "takerToken",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "makerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "maker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "taker",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "txOrigin",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "pool",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint64",
|
|
"name": "expiry",
|
|
"type": "uint64"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "salt",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.RfqOrder",
|
|
"name": "order",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "enum LibSignature.SignatureType",
|
|
"name": "signatureType",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint8",
|
|
"name": "v",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "r",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "s",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct LibSignature.Signature",
|
|
"name": "signature",
|
|
"type": "tuple"
|
|
}
|
|
],
|
|
"name": "getRfqOrderRelevantState",
|
|
"outputs": [
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "orderHash",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "enum LibNativeOrder.OrderStatus",
|
|
"name": "status",
|
|
"type": "uint8"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "takerTokenFilledAmount",
|
|
"type": "uint128"
|
|
}
|
|
],
|
|
"internalType": "struct LibNativeOrder.OrderInfo",
|
|
"name": "orderInfo",
|
|
"type": "tuple"
|
|
},
|
|
{
|
|
"internalType": "uint128",
|
|
"name": "actualFillableTakerTokenAmount",
|
|
"type": "uint128"
|
|
},
|
|
{
|
|
"internalType": "bool",
|
|
"name": "isSignatureValid",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "migrate",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bytes4",
|
|
"name": "success",
|
|
"type": "bytes4"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address[]",
|
|
"name": "origins",
|
|
"type": "address[]"
|
|
},
|
|
{
|
|
"internalType": "bool",
|
|
"name": "allowed",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"name": "registerAllowedRfqOrigins",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "bytes32[]",
|
|
"name": "poolIds",
|
|
"type": "bytes32[]"
|
|
}
|
|
],
|
|
"name": "transferProtocolFeesForPools",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"devdoc": {
|
|
"details": "Feature for interacting with limit and RFQ orders.",
|
|
"kind": "dev",
|
|
"methods": {
|
|
"_fillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128,address,address)": {
|
|
"details": "Fill a limit order. Internal variant. ETH protocol fees can be attached to this call.",
|
|
"params": {
|
|
"order": "The limit order.",
|
|
"sender": "The order sender.",
|
|
"signature": "The order signature.",
|
|
"taker": "The order taker.",
|
|
"takerTokenFillAmount": "Maximum taker token to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled.",
|
|
"takerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"_fillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128,address)": {
|
|
"details": "Fill an RFQ order. Internal variant. ETH protocol fees can be attached to this call. Any unspent ETH will be refunded to `msg.sender` (not `sender`).",
|
|
"params": {
|
|
"order": "The RFQ order.",
|
|
"signature": "The order signature.",
|
|
"taker": "The order taker.",
|
|
"takerTokenFillAmount": "Maximum taker token to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled.",
|
|
"takerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"batchCancelLimitOrders((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256)[])": {
|
|
"details": "Cancel multiple limit orders. The caller must be the maker. Silently succeeds if the order has already been cancelled.",
|
|
"params": {
|
|
"orders": "The limit orders."
|
|
}
|
|
},
|
|
"batchCancelPairLimitOrders(address[],address[],uint256[])": {
|
|
"details": "Cancel all limit orders for a given maker and pair with a salt less than the value provided. The caller must be the maker. Subsequent calls to this function with the same caller and pair require the new salt to be >= the old salt.",
|
|
"params": {
|
|
"makerTokens": "The maker tokens.",
|
|
"minValidSalts": "The new minimum valid salts.",
|
|
"takerTokens": "The taker tokens."
|
|
}
|
|
},
|
|
"batchCancelPairRfqOrders(address[],address[],uint256[])": {
|
|
"details": "Cancel all RFQ orders for a given maker and pair with a salt less than the value provided. The caller must be the maker. Subsequent calls to this function with the same caller and pair require the new salt to be >= the old salt.",
|
|
"params": {
|
|
"makerTokens": "The maker tokens.",
|
|
"minValidSalts": "The new minimum valid salts.",
|
|
"takerTokens": "The taker tokens."
|
|
}
|
|
},
|
|
"batchCancelRfqOrders((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256)[])": {
|
|
"details": "Cancel multiple RFQ orders. The caller must be the maker. Silently succeeds if the order has already been cancelled.",
|
|
"params": {
|
|
"orders": "The RFQ orders."
|
|
}
|
|
},
|
|
"batchGetLimitOrderRelevantStates((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256)[],(uint8,uint8,bytes32,bytes32)[])": {
|
|
"details": "Batch version of `getLimitOrderRelevantState()`, without reverting. Orders that would normally cause `getLimitOrderRelevantState()` to revert will have empty results.",
|
|
"params": {
|
|
"orders": "The limit orders.",
|
|
"signatures": "The order signatures."
|
|
},
|
|
"returns": {
|
|
"actualFillableTakerTokenAmounts": "How much of each order is fillable based on maker funds, in taker tokens.",
|
|
"isSignatureValids": "Whether each signature is valid for the order.",
|
|
"orderInfos": "Info about the orders."
|
|
}
|
|
},
|
|
"batchGetRfqOrderRelevantStates((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256)[],(uint8,uint8,bytes32,bytes32)[])": {
|
|
"details": "Batch version of `getRfqOrderRelevantState()`, without reverting. Orders that would normally cause `getRfqOrderRelevantState()` to revert will have empty results.",
|
|
"params": {
|
|
"orders": "The RFQ orders.",
|
|
"signatures": "The order signatures."
|
|
},
|
|
"returns": {
|
|
"actualFillableTakerTokenAmounts": "How much of each order is fillable based on maker funds, in taker tokens.",
|
|
"isSignatureValids": "Whether each signature is valid for the order.",
|
|
"orderInfos": "Info about the orders."
|
|
}
|
|
},
|
|
"cancelLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Cancel a single limit order. The caller must be the maker. Silently succeeds if the order has already been cancelled.",
|
|
"params": {
|
|
"order": "The limit order."
|
|
}
|
|
},
|
|
"cancelPairLimitOrders(address,address,uint256)": {
|
|
"details": "Cancel all limit orders for a given maker and pair with a salt less than the value provided. The caller must be the maker. Subsequent calls to this function with the same caller and pair require the new salt to be >= the old salt.",
|
|
"params": {
|
|
"makerToken": "The maker token.",
|
|
"minValidSalt": "The new minimum valid salt.",
|
|
"takerToken": "The taker token."
|
|
}
|
|
},
|
|
"cancelPairRfqOrders(address,address,uint256)": {
|
|
"details": "Cancel all RFQ orders for a given maker and pair with a salt less than the value provided. The caller must be the maker. Subsequent calls to this function with the same caller and pair require the new salt to be >= the old salt.",
|
|
"params": {
|
|
"makerToken": "The maker token.",
|
|
"minValidSalt": "The new minimum valid salt.",
|
|
"takerToken": "The taker token."
|
|
}
|
|
},
|
|
"cancelRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Cancel a single RFQ order. The caller must be the maker. Silently succeeds if the order has already been cancelled.",
|
|
"params": {
|
|
"order": "The RFQ order."
|
|
}
|
|
},
|
|
"fillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": {
|
|
"details": "Fill a limit order. The taker and sender will be the caller.",
|
|
"params": {
|
|
"order": "The limit order. ETH protocol fees can be attached to this call. Any unspent ETH will be refunded to the caller.",
|
|
"signature": "The order signature.",
|
|
"takerTokenFillAmount": "Maximum taker token amount to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled.",
|
|
"takerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"fillOrKillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": {
|
|
"details": "Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens. The taker will be the caller. ETH protocol fees can be attached to this call. Any unspent ETH will be refunded to the caller.",
|
|
"params": {
|
|
"order": "The limit order.",
|
|
"signature": "The order signature.",
|
|
"takerTokenFillAmount": "How much taker token to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"fillOrKillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": {
|
|
"details": "Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens. The taker will be the caller. ETH protocol fees can be attached to this call. Any unspent ETH will be refunded to the caller.",
|
|
"params": {
|
|
"order": "The RFQ order.",
|
|
"signature": "The order signature.",
|
|
"takerTokenFillAmount": "How much taker token to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"fillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": {
|
|
"details": "Fill an RFQ order for up to `takerTokenFillAmount` taker tokens. The taker will be the caller. ETH should be attached to pay the protocol fee.",
|
|
"params": {
|
|
"order": "The RFQ order.",
|
|
"signature": "The order signature.",
|
|
"takerTokenFillAmount": "Maximum taker token amount to fill this order with."
|
|
},
|
|
"returns": {
|
|
"makerTokenFilledAmount": "How much maker token was filled.",
|
|
"takerTokenFilledAmount": "How much maker token was filled."
|
|
}
|
|
},
|
|
"getLimitOrderHash((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Get the canonical hash of a limit order.",
|
|
"params": {
|
|
"order": "The limit order."
|
|
},
|
|
"returns": {
|
|
"orderHash": "The order hash."
|
|
}
|
|
},
|
|
"getLimitOrderInfo((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Get the order info for a limit order.",
|
|
"params": {
|
|
"order": "The limit order."
|
|
},
|
|
"returns": {
|
|
"orderInfo": "Info about the order."
|
|
}
|
|
},
|
|
"getLimitOrderRelevantState((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32))": {
|
|
"details": "Get order info, fillable amount, and signature validity for a limit order. Fillable amount is determined using balances and allowances of the maker.",
|
|
"params": {
|
|
"order": "The limit order.",
|
|
"signature": "The order signature."
|
|
},
|
|
"returns": {
|
|
"actualFillableTakerTokenAmount": "How much of the order is fillable based on maker funds, in taker tokens.",
|
|
"isSignatureValid": "Whether the signature is valid.",
|
|
"orderInfo": "Info about the order."
|
|
}
|
|
},
|
|
"getProtocolFeeMultiplier()": {
|
|
"details": "Get the protocol fee multiplier. This should be multiplied by the gas price to arrive at the required protocol fee to fill a native order.",
|
|
"returns": {
|
|
"multiplier": "The protocol fee multiplier."
|
|
}
|
|
},
|
|
"getRfqOrderHash((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Get the canonical hash of an RFQ order.",
|
|
"params": {
|
|
"order": "The RFQ order."
|
|
},
|
|
"returns": {
|
|
"orderHash": "The order hash."
|
|
}
|
|
},
|
|
"getRfqOrderInfo((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": {
|
|
"details": "Get the order info for an RFQ order.",
|
|
"params": {
|
|
"order": "The RFQ order."
|
|
},
|
|
"returns": {
|
|
"orderInfo": "Info about the order."
|
|
}
|
|
},
|
|
"getRfqOrderRelevantState((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32))": {
|
|
"details": "Get order info, fillable amount, and signature validity for an RFQ order. Fillable amount is determined using balances and allowances of the maker.",
|
|
"params": {
|
|
"order": "The RFQ order.",
|
|
"signature": "The order signature."
|
|
},
|
|
"returns": {
|
|
"actualFillableTakerTokenAmount": "How much of the order is fillable based on maker funds, in taker tokens.",
|
|
"isSignatureValid": "Whether the signature is valid.",
|
|
"orderInfo": "Info about the order."
|
|
}
|
|
},
|
|
"migrate()": {
|
|
"details": "Initialize and register this feature. Should be delegatecalled by `Migrate.migrate()`.",
|
|
"returns": {
|
|
"success": "`LibMigrate.SUCCESS` on success."
|
|
}
|
|
},
|
|
"registerAllowedRfqOrigins(address[],bool)": {
|
|
"details": "Mark what tx.origin addresses are allowed to fill an order that specifies the message sender as its txOrigin.",
|
|
"params": {
|
|
"allowed": "True to register, false to unregister.",
|
|
"origins": "An array of origin addresses to update."
|
|
}
|
|
},
|
|
"transferProtocolFeesForPools(bytes32[])": {
|
|
"details": "Transfers protocol fees from the `FeeCollector` pools into the staking contract.",
|
|
"params": {
|
|
"poolIds": "Staking pool IDs"
|
|
}
|
|
}
|
|
},
|
|
"stateVariables": {
|
|
"FEATURE_NAME": {
|
|
"details": "Name of this feature."
|
|
},
|
|
"FEATURE_VERSION": {
|
|
"details": "Version of this feature."
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"evm": {
|
|
"bytecode": {
|
|
"linkReferences": {},
|
|
"object": "0x6101a0604052620000146001600081620001df565b610180523480156200002557600080fd5b50604051620056bb380380620056bb833981016040819052620000489162000211565b85858585858584848484838383838d898181808260004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f9e5dae0addaf20578aeb5d70341d092b53b4e14480ac5726438fd436df7ba4277f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c8385604051602001620000dc959493929190620002b8565b60408051601f19818403018152828252805160209182012060805260a0959095526001600160601b031960608c901b1660e052633c9506a360e21b8252516001600160a01b038b16985063f2541a8c975060048083019750949550939084900301915082905086803b1580156200015257600080fd5b505afa15801562000167573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018d91906200029f565b61010052606093841b6001600160601b03199081166101205292841b909216610140525060e01b6001600160e01b03191660c05230901b6101605250620002fd9e505050505050505050505050505050565b6bffffffff0000000000000000604084901b1667ffffffff00000000602084901b161763ffffffff8216179392505050565b60008060008060008060c087890312156200022a578182fd5b86516200023781620002e4565b60208801519096506200024a81620002e4565b60408801519095506200025d81620002e4565b60608801519094506200027081620002e4565b608088015190935063ffffffff811681146200028a578283fd5b8092505060a087015190509295509295509295565b600060208284031215620002b1578081fd5b5051919050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6001600160a01b0381168114620002fa57600080fd5b50565b60805160a05160c05160e01c60e05160601c610100516101205160601c6101405160601c6101605160601c6101805161532e6200038d600039806105eb525080612c215250806122515250806121625250806138a95250806120d55280613888525080610ad252806112c2528061385c525080611a0852806139d2525080611a2c5280611cc9525061532e6000f3fe6080604052600436106101d85760003560e01c80639548088911610102578063b4658bfb11610095578063dd11d22511610064578063dd11d2251461055b578063f6274f661461057b578063f6e0f6a51461058e578063fe55a3ef146105ae576101d8565b8063b4658bfb146104f1578063d0a55fb014610511578063d925a56d14610531578063dab400f314610546576101d8565b8063a656186b116100d1578063a656186b14610462578063aa77476c14610482578063ad354eeb146104a2578063b09f1fb1146104d1576101d8565b806395480889146103ed5780639a4f809c1461040d5780639baa45a81461042d578063a0edcef51461044d576101d8565b8063414e4ccf1161017a5780637d49ec1a116101495780637d49ec1a1461037857806386a0c8d7146103985780638fd3ab80146103b85780639240529c146103da576101d8565b8063414e4ccf146102e6578063438cdfc514610307578063487b5c20146103345780636ae4b4f714610356576101d8565b80631fb09795116101b65780631fb097951461024a578063346693c51461027957806337f381d8146102a65780633cd2f026146102c6576101d8565b8063016a6d65146101dd578063031b905c146102135780630f0e8cf714610228575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046145ac565b6105ce565b60405161020a9190614b33565b60405180910390f35b34801561021f57600080fd5b506101fd6105e9565b34801561023457600080fd5b5061024861024336600461409a565b61060d565b005b34801561025657600080fd5b5061026a610265366004614414565b6106bc565b60405161020a93929190615099565b34801561028557600080fd5b506102996102943660046145ac565b6107b9565b60405161020a919061508b565b3480156102b257600080fd5b5061026a6102c13660046145c8565b610871565b3480156102d257600080fd5b506102486102e136600461402b565b610961565b6102f96102f43660046144bd565b610994565b60405161020a9291906151e4565b34801561031357600080fd5b506103276103223660046145fe565b610a3e565b60405161020a91906151c7565b34801561034057600080fd5b50610349610ad0565b60405161020a9190615215565b34801561036257600080fd5b5061036b610af4565b60405161020a9190614d71565b34801561038457600080fd5b506102486103933660046143f8565b610b2d565b3480156103a457600080fd5b506102486103b336600461409a565b610b95565b3480156103c457600080fd5b506103cd610c35565b60405161020a9190614cb5565b6103276103e8366004614472565b61105d565b3480156103f957600080fd5b506102996104083660046143f8565b611120565b34801561041957600080fd5b506102486104283660046143b8565b6111ab565b34801561043957600080fd5b5061024861044836600461420a565b611290565b34801561045957600080fd5b506103496112c0565b34801561046e57600080fd5b506102f961047d36600461463e565b6112e4565b34801561048e57600080fd5b506102f961049d3660046145fe565b611327565b3480156104ae57600080fd5b506104c26104bd3660046142a9565b611356565b60405161020a93929190614a8f565b3480156104dd57600080fd5b506102486104ec366004613f7c565b6115bc565b3480156104fd57600080fd5b506104c261050c366004614175565b6116d5565b34801561051d57600080fd5b5061024861052c3660046143b8565b611930565b34801561053d57600080fd5b506101fd611a06565b34801561055257600080fd5b506101fd611a2a565b34801561056757600080fd5b506101fd6105763660046143f8565b611a4e565b6102f9610589366004614472565b611a5c565b34801561059a57600080fd5b506102486105a936600461430b565b611afa565b3480156105ba57600080fd5b506102486105c93660046145ac565b611b2a565b60006105e16105dc83611b8e565b611cc5565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b8151835114801561061f575080518351145b61065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e3e565b60405180910390fd5b60005b83518110156106b6576106ae84828151811061067957fe5b602002602001015184838151811061068d57fe5b60200260200101518484815181106106a157fe5b60200260200101516111ab565b600101610661565b50505050565b6106c4613c1a565b6000806106d085611120565b92506107616040518060a001604052808760a0015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250611d17565b835190925061077e906107793687900387018761469b565b611e40565b73ffffffffffffffffffffffffffffffffffffffff168560a0015173ffffffffffffffffffffffffffffffffffffffff161490509250925092565b6107c1613c1a565b6107ca826105ce565b815260006107d6611f97565b608084015173ffffffffffffffffffffffffffffffffffffffff90811660009081526002929092016020908152604080842087518416855282528084208288015190931684529190529020546060840151610100850151610120860151929350610844928592919085611fa4565b60c083015173ffffffffffffffffffffffffffffffffffffffff1661086b57600060208301525b50919050565b610879613c1a565b600080610885856107b9565b92506109166040518060a00160405280876080015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250611d17565b9150610926836000015185611e40565b73ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff161490509250925092565b60005b8181101561098f5761098783838381811061097b57fe5b90506020020135612095565b600101610964565b505050565b6000803330146109af576109af6109aa336122e3565b61239b565b6109b7613c3c565b610a246040518060a001604052808a8152602001898152602001886fffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152506123a3565b602081015160409091015190999098509650505050505050565b6000610a48613c3c565b610a548585853361274f565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161015610ac457610ac46109aa610a95876105ce565b83602001516fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff16612a82565b60400151949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040518060400160405280600b81526020017f4c696d69744f726465727300000000000000000000000000000000000000000081525081565b6000610b3882611a4e565b90508160a0015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8357610b836109aa82338560a00151612b40565b610b91818360a00151612b78565b5050565b81518351148015610ba7575080518351145b610bdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e3e565b60005b83518110156106b657610c2d848281518110610bf857fe5b6020026020010151848381518110610c0c57fe5b6020026020010151848481518110610c2057fe5b6020026020010151611930565b600101610be0565b6000610c607f3cd2f02600000000000000000000000000000000000000000000000000000000612beb565b610c897ff6274f6600000000000000000000000000000000000000000000000000000000612beb565b610cb27faa77476c00000000000000000000000000000000000000000000000000000000612beb565b610cdb7f9240529c00000000000000000000000000000000000000000000000000000000612beb565b610d047f438cdfc500000000000000000000000000000000000000000000000000000000612beb565b610d2d7f414e4ccf00000000000000000000000000000000000000000000000000000000612beb565b610d567fa656186b00000000000000000000000000000000000000000000000000000000612beb565b610d7f7f7d49ec1a00000000000000000000000000000000000000000000000000000000612beb565b610da87ffe55a3ef00000000000000000000000000000000000000000000000000000000612beb565b610dd17f9baa45a800000000000000000000000000000000000000000000000000000000612beb565b610dfa7ff6e0f6a500000000000000000000000000000000000000000000000000000000612beb565b610e237fd0a55fb000000000000000000000000000000000000000000000000000000000612beb565b610e4c7f86a0c8d700000000000000000000000000000000000000000000000000000000612beb565b610e757f9a4f809c00000000000000000000000000000000000000000000000000000000612beb565b610e9e7f0f0e8cf700000000000000000000000000000000000000000000000000000000612beb565b610ec77f9548088900000000000000000000000000000000000000000000000000000000612beb565b610ef07f346693c500000000000000000000000000000000000000000000000000000000612beb565b610f197fdd11d22500000000000000000000000000000000000000000000000000000000612beb565b610f427f016a6d6500000000000000000000000000000000000000000000000000000000612beb565b610f6b7f487b5c2000000000000000000000000000000000000000000000000000000000612beb565b610f947fb09f1fb100000000000000000000000000000000000000000000000000000000612beb565b610fbd7f1fb0979500000000000000000000000000000000000000000000000000000000612beb565b610fe67f37f381d800000000000000000000000000000000000000000000000000000000612beb565b61100f7fb4658bfb00000000000000000000000000000000000000000000000000000000612beb565b6110387fad354eeb00000000000000000000000000000000000000000000000000000000612beb565b507f2c64c5ef0000000000000000000000000000000000000000000000000000000090565b6000611067613c3c565b6110d46040518060a00160405280878152602001868152602001856fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506123a3565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161015611115576111156109aa610a9587611a4e565b8051610ac490612c77565b611128613c1a565b61113182611a4e565b8152600061113d611f97565b60a084015173ffffffffffffffffffffffffffffffffffffffff9081166000908152600192909201602090815260408084208751841685528252808420828801519093168452919052902054606084015161014085015161016086015192935061086b928592919085611fa4565b60006111b5611f97565b336000908152600282016020908152604080832073ffffffffffffffffffffffffffffffffffffffff898116855290835281842090881684529091529020549091508281111561120c5761120c6109aa8483612d1a565b336000818152600284016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a81168552908352818420908916845290915290819020859055517ffe7ffb1edfe79f4df716cb2dcad21cf2f31b104d816a7976ba1e6e4653c1efb19161128191889088908890614947565b60405180910390a15050505050565b60005b8151811015610b91576112b88282815181106112ab57fe5b6020026020010151610b2d565b600101611293565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000803330146112fa576112fa6109aa336122e3565b611302613c3c565b61130e8787878761274f565b6020810151604090910151909890975095505050505050565b600080611332613c3c565b61133e8686863361274f565b60208101516040909101519097909650945050505050565b60608080858414611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614d84565b8567ffffffffffffffff811180156113aa57600080fd5b506040519080825280602002602001820160405280156113e457816020015b6113d1613c1a565b8152602001906001900390816113c95790505b5092508567ffffffffffffffff811180156113fe57600080fd5b50604051908082528060200260200182016040528015611428578160200160208202803683370190505b5091508567ffffffffffffffff8111801561144257600080fd5b5060405190808252806020026020018201604052801561146c578160200160208202803683370190505b50905060005b868110156115b157306337f381d889898481811061148c57fe5b9050610140020188888581811061149f57fe5b9050608002016040518363ffffffff1660e01b81526004016114c29291906150cf565b60a06040518083038186803b1580156114da57600080fd5b505afa925050508015611528575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261152591810190614530565b60015b611531576115a9565b8287858151811061153e57fe5b60200260200101819052508186858151811061155657fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508085858151811061159557fe5b911515602092830291909101909101525050505b600101611472565b509450945094915050565b3332146115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614de1565b60006115ff611f97565b905060005b8351811015611694573360009081526003830160205260408120855185929087908590811061162f57fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611604565b507f02dfead5eb769b298e82dd9650b31c40559a3d42701dbf53c931bc2682847c313384846040516116c89392919061497e565b60405180910390a1505050565b60608080858414611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614d84565b8567ffffffffffffffff8111801561172957600080fd5b5060405190808252806020026020018201604052801561176357816020015b611750613c1a565b8152602001906001900390816117485790505b5092508567ffffffffffffffff8111801561177d57600080fd5b506040519080825280602002602001820160405280156117a7578160200160208202803683370190505b5091508567ffffffffffffffff811180156117c157600080fd5b506040519080825280602002602001820160405280156117eb578160200160208202803683370190505b50905060005b868110156115b15730631fb0979589898481811061180b57fe5b9050610180020188888581811061181e57fe5b9050608002016040518363ffffffff1660e01b8152600401611841929190614f55565b60a06040518083038186803b15801561185957600080fd5b505afa9250505080156118a7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526118a491810190614530565b60015b6118b057611928565b828785815181106118bd57fe5b6020026020010181905250818685815181106118d557fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508085858151811061191457fe5b911515602092830291909101909101525050505b6001016117f1565b600061193a611f97565b336000908152600182016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8981168552908352818420908816845290915290205490915082811115611991576119916109aa8483612d1a565b336000818152600184016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a81168552908352818420908916845290915290819020859055517fa91fe7ae62fce669df2c7f880f8c14d178531aae72515558e5c948e37c32a5729161128191889088908890614947565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006105e16105dc83612dd5565b600080611a67613c3c565b611ad46040518060a00160405280888152602001878152602001866fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506123a3565b9050611ae38160000151612c77565b602081015160409091015190969095509350505050565b60005b8151811015610b9157611b22828281518110611b1557fe5b6020026020010151611b2a565b600101611afd565b6000611b35826105ce565b9050816080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8057611b806109aa82338560800151612b40565b610b91818360800151612b78565b60006040517fe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da98152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff166080820152608083015173ffffffffffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015161010082015261010083015167ffffffffffffffff166101208201526101208301516101408201526101608120915050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001611cfa9291906148bc565b604051602081830303815290604052805190602001209050919050565b600081604001516fffffffffffffffffffffffffffffffff1660001480611d52575060608201516fffffffffffffffffffffffffffffffff16155b15611d5f575060006105e4565b60018260800151602001516004811115611d7557fe5b14611d82575060006105e4565b6000611ddb8360800151604001518460600151036fffffffffffffffffffffffffffffffff1684606001516fffffffffffffffffffffffffffffffff1685604001516fffffffffffffffffffffffffffffffff16612f4c565b9050611df881611df385602001518660000151612f6a565b61309c565b9050611e39611e348285604001516fffffffffffffffffffffffffffffffff1686606001516fffffffffffffffffffffffffffffffff166130b2565b6130d6565b9392505050565b6000611e4c8383613102565b600282516003811115611e5b57fe5b1415611ec35760018383602001518460400151856060015160405160008152602001604052604051611e909493929190614c97565b6020604051602081039080840390855afa158015611eb2573d6000803e3d6000fd5b505050602060405103519050611f68565b600382516003811115611ed257fe5b1415611f685760007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005283601c52603c600020905060018184602001518560400151866060015160405160008152602001604052604051611f389493929190614c97565b6020604051602081039080840390855afa158015611f5a573d6000803e3d6000fd5b505050602060405103519150505b73ffffffffffffffffffffffffffffffffffffffff8116611f9157611f916109aa6005856131ae565b92915050565b600080611f9160076131e4565b6000611fae611f97565b865160009081526020829052604090819020546fffffffffffffffffffffffffffffffff808216928a0183905292935091871611612005576020870160025b90816004811115611ffa57fe5b81525050505061208e565b7f800000000000000000000000000000000000000000000000000000000000000081161561203857602087016003611fed565b504267ffffffffffffffff168467ffffffffffffffff1611612072576020860160045b9081600481111561206857fe5b815250505061208e565b828211156120855760208601600361205b565b50600160208601525b5050505050565b6040517f319bed9a00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063319bed9a9061210a908590600401614b33565b602060405180830381600087803b15801561212457600080fd5b505af1158015612138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215c919061439c565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016121b991906148f5565b60206040518083038186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220991906146b6565b9050600181111561098f576040517fa3b4a32700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3b4a327906122ac90859081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff870190600401614916565b600060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b50505050505050565b60607ff0ec779b0bcda6d84abf99ee2c67647d1100ebbb553a9c2d1c2ba1579592832c8260405160240161231791906148f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b6123ab613c3c565b6123b3613c1a565b82516123be90611120565b90506001816020015160048111156123d257fe5b146123f7576123f76109aa8260000151836020015160048111156123f257fe5b6131ff565b825160c0015173ffffffffffffffffffffffffffffffffffffffff16158015906124595750826060015173ffffffffffffffffffffffffffffffffffffffff16836000015160c0015173ffffffffffffffffffffffffffffffffffffffff1614155b1561247c5761247c6109aa82600001518560600151866000015160c00151613235565b825160e0015173ffffffffffffffffffffffffffffffffffffffff16158015906124de5750826080015173ffffffffffffffffffffffffffffffffffffffff16836000015160e0015173ffffffffffffffffffffffffffffffffffffffff1614155b15612501576125016109aa82600001518560800151866000015160e0015161326d565b600061251582600001518560200151611e40565b9050836000015160a0015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612569578151845160a00151612569916109aa9184906132a5565b508251610120015161257a906132dd565b8252604080516101208101825282518152845160a09081015173ffffffffffffffffffffffffffffffffffffffff908116602080850191909152606080890151831685870152885151831681860152885190910151909116608084015286518401516fffffffffffffffffffffffffffffffff9081169284019290925286510151811660c083015285830151811660e083015291830151909116610100820152612623906133b2565b6fffffffffffffffffffffffffffffffff9081166040850152908116602084015283516080015116156126da576126a582602001516fffffffffffffffffffffffffffffffff168460000151606001516fffffffffffffffffffffffffffffffff168560000151608001516fffffffffffffffffffffffffffffffff16612f4c565b6fffffffffffffffffffffffffffffffff1660608084018290528451602081015191860151610100909101516126da9361352d565b8051835160a08101516060808701516101008401518451602080870151908a01516040808c0151968c01518c51610120909a015191517fab614d2b738543c0ea21f56347cf696a3a0c42a7cbec3212a5ca22a4dcff21249b6127419b909a99939091614b8c565b60405180910390a150919050565b612757613c3c565b61275f613c1a565b612768866107b9565b905060018160200151600481111561277c57fe5b1461279c5761279c6109aa8260000151836020015160048111156123f257fe5b60006127a6611f97565b60c088015190915073ffffffffffffffffffffffffffffffffffffffff16321480159061280a575060c087015173ffffffffffffffffffffffffffffffffffffffff166000908152600382016020908152604080832032845290915290205460ff16155b15612825576128256109aa8360000151328a60c00151613734565b5060a086015173ffffffffffffffffffffffffffffffffffffffff161580159061287f57508273ffffffffffffffffffffffffffffffffffffffff168660a0015173ffffffffffffffffffffffffffffffffffffffff1614155b1561289a5761289a6109aa8260000151858960a00151613235565b60006128aa826000015187611e40565b9050866080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146128f9576128f96109aa8360000151838a608001516132a5565b506129fe60405180610120016040528083600001518152602001886080015173ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001886000015173ffffffffffffffffffffffffffffffffffffffff168152602001886020015173ffffffffffffffffffffffffffffffffffffffff16815260200188604001516fffffffffffffffffffffffffffffffff16815260200188606001516fffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff16815260200183604001516fffffffffffffffffffffffffffffffff168152506133b2565b6fffffffffffffffffffffffffffffffff9081166040808601829052929091166020808601829052845160808b01518b51928c015160e08d015196517f829fa99d94dc4636925b38632e625736a614c154d55006b7ab6bea979c210c3297612a7197949693958c95909492909190614c0c565b60405180910390a150949350505050565b60607f21948612b5ef214ec0508df4901600e07a810a371be76b25d59ade73826e3d97848484604051602401612aba93929190614c70565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b60607f88b2c08e4a5f57d416ad23dad18c20497ccfe684b1379b28fd564adaf582b80f848484604051602401612aba93929190614b60565b6000612b82611f97565b6000848152602082905260409081902080547f8000000000000000000000000000000000000000000000000000000000000000179055519091507fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba52753906116c89085908590614b3c565b6040517f6eb224cb0000000000000000000000000000000000000000000000000000000081523090636eb224cb90612c499084907f000000000000000000000000000000000000000000000000000000000000000090600401614ce2565b600060405180830381600087803b158015612c6357600080fd5b505af115801561208e573d6000803e3d6000fd5b8034118015612c865750333014155b15612d17576000612c97348361376c565b905060003373ffffffffffffffffffffffffffffffffffffffff1682604051612cbf906148f2565b60006040518083038185875af1925050503d8060008114612cfc576040519150601f19603f3d011682016040523d82523d6000602084013e612d01565b606091505b505090508061098f5761098f6109aa338461378b565b50565b60607fb12bc7e7d341f4431d6faf05f991ee3b779183e341b24243064e10c886cd18738383604051602401612d50929190615207565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60006040517fce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d498152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff16608082015260808301516fffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015173ffffffffffffffffffffffffffffffffffffffff1661010082015261010083015173ffffffffffffffffffffffffffffffffffffffff1661012082015261012083015161014082015261014083015167ffffffffffffffff166101608201526101608301516101808201526101a08120915050919050565b6000612f6283612f5c86856137c1565b906137f2565b949350505050565b6000611e398373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612faa9291906149f0565b60206040518083038186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa91906146b6565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906370a082319061304c9087906004016148f5565b60206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df391906146b6565b60008183106130ab5781611e39565b5090919050565b6000612f6283612f5c6130c682600161376c565b6130d088876137c1565b9061381c565b60006fffffffffffffffffffffffffffffffff8211156130fe576130fe6109aa600384613838565b5090565b60408101517ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141111580613159575060608101517f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a111155b1561316c5761316c6109aa6005846131ae565b60008151600381111561317b57fe5b141561318f5761318f6109aa6003846131ae565b60018151600381111561319e57fe5b1415610b9157610b916109aa6000845b60607ff18f11f3027e735c758137924b262d4d3aff0037dcd785aca3c699fa05d960bd8383604051602401612d50929190614d63565b600060808260078111156131f457fe5b600101901b92915050565b60607f47ab394e41470191eaf9fa542e84ac483a12665fbd616eb8d1c022ced6c940008383604051602401612d50929190614c86565b60607f5d3300180a4547b3e27137be832d3ebf56f1ba5ebb30dd580999c61f77fa6396848484604051602401612aba93929190614b60565b60607f15e6a383bb02d79ee933b927fbecba78cdde16cba84b94a99661f44bcce3b736848484604051602401612aba93929190614b60565b60607ff13e65d925201525f3d71a731833b19bb26e44cfbd97caf72a366b73866f7124848484604051602401612aba93929190614b60565b6000806132e8613855565b9050806132f95760009150506105e4565b600061330484613881565b905060008173ffffffffffffffffffffffffffffffffffffffff168360405161332c906148f2565b60006040518083038185875af1925050503d8060008114613369576040519150601f19603f3d011682016040523d82523d6000602084013e61336e565b606091505b50509050806133a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614ef8565b50909392505050565b6000806133f08360e001516133eb8561010001518660c001516fffffffffffffffffffffffffffffffff166138ce90919063ffffffff16565b61392f565b915061343b826fffffffffffffffffffffffffffffffff168460c001516fffffffffffffffffffffffffffffffff168560a001516fffffffffffffffffffffffffffffffff16612f4c565b90506fffffffffffffffffffffffffffffffff8216158061346c57506fffffffffffffffffffffffffffffffff8116155b1561347c57506000905080613528565b61010083015161349e906fffffffffffffffffffffffffffffffff1683613962565b6fffffffffffffffffffffffffffffffff166134b8611f97565b600001600085600001518152602001908152602001600020819055506134fe836080015184604001518560200151856fffffffffffffffffffffffffffffffff1661352d565b613528836060015184602001518560400151846fffffffffffffffffffffffffffffffff1661352d565b915091565b6000606073ffffffffffffffffffffffffffffffffffffffff8616301415613581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e9b565b61358a866139b7565b1561365e576040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e906135e590899030906004016149f0565b60206040518083038186803b1580156135fd57600080fd5b505afa158015613611573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363591906146b6565b101561365e5761365786868686604051806020016040528060008152506139f7565b50506106b6565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015273ffffffffffffffffffffffffffffffffffffffff85166024820152836044820152600080606483600073ffffffffffffffffffffffffffffffffffffffff8c165af192503d806000602084013e60016020830151146020821015168115178416935083613718578082528192508060208301016040525b50508161372c5761372c86868686856139f7565b505050505050565b60607fc0972f3cc4234ca2091de7e7bc7081494bd29ac280167d66f0d44168973b1634848484604051602401612aba93929190614b60565b600082821115613785576137856109aa60028585613abf565b50900390565b60607fbde95cc2119e0200d80642397198abfcf98e6e4dddd0de9c6320d86252ad40ab8383604051602401612d50929190614a69565b6000826137d057506000611f91565b828202828482816137dd57fe5b0414611e3957611e396109aa60018686613abf565b600081613808576138086109aa60038585613abf565b600082848161381357fe5b04949350505050565b600082820183811015611e3957611e396109aa60008686613abf565b606063c996af7b60e01b8383604051602401612d50929190614d4c565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000163a0290565b60006105e17f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000084613ade565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161115613785576137856109aa6002856fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff16613abf565b6000816fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff16106130ab5781611e39565b60008282016fffffffffffffffffffffffffffffffff8085169082161015611e3957611e396109aa6000866fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff16613abf565b600081815260209020600160ff92831681901b929091161b177f000000000000000000000000000000000000000000000000000000000000000081161490565b6040517f89dd02e700000000000000000000000000000000000000000000000000000000815230906389dd02e790613a39908890889088908890600401614947565b600060405180830381600087803b158015613a5357600080fd5b505af1925050508015613a64575060015b61208e573d808015613a92576040519150601f19603f3d011682016040523d82523d6000602084013e613a97565b606091505b50613ab96109aa87878787875160001415613ab25786613ab4565b875b613b56565b5061208e565b606063e946c1bb60e01b848484604051602401612aba93929190614d2a565b604051600090613b18907fff0000000000000000000000000000000000000000000000000000000000000090869085908790602001614858565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60607fdfdc6f57cf82bede92bcfdd44fedb82b2d5cecabf56ec21964db6ee2c3e82cf48686868686604051602401613b92959493929190614a17565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040805160608101909152600080825260208201908152600060209091015290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b8035611f91816152aa565b600082601f830112613c7e578081fd5b8135613c91613c8c8261524d565b615226565b818152915060208083019084810181840286018201871015613cb257600080fd5b60005b84811015613cda578135613cc8816152aa565b84529282019290820190600101613cb5565b505050505092915050565b60008083601f840112613cf6578182fd5b50813567ffffffffffffffff811115613d0d578182fd5b602083019150836020608083028501011115613d2857600080fd5b9250929050565b8035611f91816152cc565b6000610180808385031215613d4d578182fd5b613d5681615226565b915050613d638383613c63565b8152613d728360208401613c63565b6020820152613d848360408401613f48565b6040820152613d968360608401613f48565b6060820152613da88360808401613f48565b6080820152613dba8360a08401613c63565b60a0820152613dcc8360c08401613c63565b60c0820152613dde8360e08401613c63565b60e0820152610100613df284828501613c63565b908201526101208281013590820152610140613e1084828501613f53565b818301525061016080830135818301525092915050565b6000610140808385031215613e3a578182fd5b613e4381615226565b915050613e508383613c63565b8152613e5f8360208401613c63565b6020820152613e718360408401613f48565b6040820152613e838360608401613f48565b6060820152613e958360808401613c63565b6080820152613ea78360a08401613c63565b60a0820152613eb98360c08401613c63565b60c082015260e082013560e0820152610100613ed784828501613f53565b818301525061012080830135818301525092915050565b600060808284031215613eff578081fd5b613f096080615226565b9050813560048110613f1a57600080fd5b8152613f298360208401613f6b565b6020820152604082013560408201526060820135606082015292915050565b8035611f91816152da565b803567ffffffffffffffff81168114611f9157600080fd5b803560ff81168114611f9157600080fd5b60008060408385031215613f8e578182fd5b823567ffffffffffffffff811115613fa4578283fd5b8301601f81018513613fb4578283fd5b8035613fc2613c8c8261524d565b808282526020808301925080850189828387028801011115613fe2578788fd5b8795505b8486101561400d578035613ff9816152aa565b845260019590950194928101928101613fe6565b5081965061401d89828a01613d2f565b955050505050509250929050565b6000806020838503121561403d578182fd5b823567ffffffffffffffff80821115614054578384fd5b818501915085601f830112614067578384fd5b813581811115614075578485fd5b8660208083028501011115614088578485fd5b60209290920196919550909350505050565b6000806000606084860312156140ae578081fd5b833567ffffffffffffffff808211156140c5578283fd5b6140d187838801613c6e565b94506020915081860135818111156140e7578384fd5b6140f388828901613c6e565b945050604086013581811115614107578384fd5b86019050601f81018713614119578283fd5b8035614127613c8c8261524d565b81815283810190838501858402850186018b1015614143578687fd5b8694505b83851015614165578035835260019490940193918501918501614147565b5080955050505050509250925092565b6000806000806040858703121561418a578182fd5b843567ffffffffffffffff808211156141a1578384fd5b818701915087601f8301126141b4578384fd5b8135818111156141c2578485fd5b886020610180830285010111156141d7578485fd5b6020928301965094509086013590808211156141f1578384fd5b506141fe87828801613ce5565b95989497509550505050565b6000602080838503121561421c578182fd5b823567ffffffffffffffff811115614232578283fd5b8301601f81018513614242578283fd5b8035614250613c8c8261524d565b81815283810190838501610180808502860187018a101561426f578788fd5b8795505b8486101561429b576142858a83613d3a565b8452600195909501949286019290810190614273565b509098975050505050505050565b600080600080604085870312156142be578182fd5b843567ffffffffffffffff808211156142d5578384fd5b818701915087601f8301126142e8578384fd5b8135818111156142f6578485fd5b886020610140830285010111156141d7578485fd5b6000602080838503121561431d578182fd5b823567ffffffffffffffff811115614333578283fd5b8301601f81018513614343578283fd5b8035614351613c8c8261524d565b81815283810190838501610140808502860187018a1015614370578788fd5b8795505b8486101561429b576143868a83613e27565b8452600195909501949286019290810190614374565b6000602082840312156143ad578081fd5b8151611e39816152aa565b6000806000606084860312156143cc578081fd5b83356143d7816152aa565b925060208401356143e7816152aa565b929592945050506040919091013590565b6000610180828403121561440a578081fd5b611e398383613d3a565b600080828403610200811215614428578283fd5b6144328585613d3a565b925060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8082011215614463578182fd5b50610180830190509250929050565b60008060006102208486031215614487578081fd5b6144918585613d3a565b92506144a1856101808601613eee565b91506102008401356144b2816152da565b809150509250925092565b600080600080600061026086880312156144d5578283fd5b6144df8787613d3a565b94506144ef876101808801613eee565b9350610200860135614500816152da565b9250610220860135614511816152aa565b9150610240860135614522816152aa565b809150509295509295909350565b600080600083850360a0811215614545578182fd5b6060811215614552578182fd5b5061455d6060615226565b84518152602085015160058110614572578283fd5b60208201526040850151614585816152da565b6040820152606085015190935061459b816152da565b60808501519092506144b2816152cc565b600061014082840312156145be578081fd5b611e398383613e27565b6000806101c083850312156145db578182fd5b6145e58484613e27565b91506145f5846101408501613eee565b90509250929050565b60008060006101e08486031215614613578081fd5b61461d8585613e27565b925061462d856101408601613eee565b91506101c08401356144b2816152da565b6000806000806102008587031215614654578182fd5b61465e8686613e27565b935061466e866101408701613eee565b92506101c085013561467f816152da565b91506101e0850135614690816152aa565b939692955090935050565b6000608082840312156146ac578081fd5b611e398383613eee565b6000602082840312156146c7578081fd5b5051919050565b60006146da83836147bb565b505060600190565b6fffffffffffffffffffffffffffffffff16815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015614747578151151587529582019590820190600101614729565b509495945050505050565b60008151808452815b818110156147775760208185018101518683018201520161475b565b818111156147885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151600581106147ce57fe5b60208301526040908101516fffffffffffffffffffffffffffffffff16910152565b8035600481106147ff57600080fd5b614808816152a0565b82526040810160ff61481d8260208501613f6b565b166020840152356040830152606090810135910152565b6fffffffffffffffffffffffffffffffff169052565b67ffffffffffffffff169052565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b60006060820173ffffffffffffffffffffffffffffffffffffffff808716845260206060818601528287518085526080870191508289019450855b818110156149d75785518516835294830194918301916001016149b9565b5050809450505050508215156040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a06080830152614a5e60a0830184614752565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006060820160608352808651614aa68184614b33565b915060209250828801845b82811015614ad257614ac48483516146ce565b935090840190600101614ab1565b50505083810382850152808651614ae98184614b33565b91508388019250845b81811015614b1357614b058385516146e2565b938501939250600101614af2565b50508481036040860152614b278187614716565b98975050505050505050565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b9a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015297891660408b015295881660608a015293871660808901529190951660a08701526fffffffffffffffffffffffffffffffff94851660c0870152841660e08601529092166101008401526101208301919091526101408201526101600190565b97885273ffffffffffffffffffffffffffffffffffffffff968716602089015294861660408801529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a085015290911660c083015260e08201526101000190565b9283526020830191909152604082015260600190565b91825260ff16602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6060810160048510614d3857fe5b938152602081019290925260409091015290565b60408101614d59846152a0565b9281526020015290565b6040810160068410614d5957fe5b600060208252611e396020830184614752565b6020808252602c908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f4160408201527f525241595f4c454e475448530000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f4e61746976654f7264657273466561747572652f4e4f5f434f4e54524143545f60408201527f4f524947494e5300000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f5060408201527f4149525f4f52444552535f41525241595f4c454e475448530000000000000000606082015260800190565b60208082526024908201527f466978696e546f6b656e5370656e6465722f43414e4e4f545f494e564f4b455f60408201527f53454c4600000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f466978696e50726f746f636f6c466565732f45544845525f5452414e5346455260408201527f5f46414c49454400000000000000000000000000000000000000000000000000606082015260800190565b610200810160208401614f7183614f6c8388613c63565b6146fc565b614f7b818661526d565b9050614f8a60208401826146fc565b50614f98604085018561527a565b614fa56040840182614834565b50614fb3606085018561527a565b614fc06060840182614834565b50614fce608085018561527a565b614fdb6080840182614834565b50614fe960a085018561526d565b614ff660a08401826146fc565b5061500460c085018561526d565b61501160c08401826146fc565b5061501f60e085018561526d565b61502c60e08401826146fc565b5061010061503c8186018661526d565b615048828501826146fc565b5050610120848101359083015261014061506481860186615287565b6150708285018261484a565b50506101608481013590830152611e396101808301846147f0565b60608101611f9182846147bb565b60a081016150a782866147bb565b6fffffffffffffffffffffffffffffffff841660608301528215156080830152949350505050565b6101c08101602084016150e683614f6c8388613c63565b6150f0818661526d565b90506150ff60208401826146fc565b5061510d604085018561527a565b61511a6040840182614834565b50615128606085018561527a565b6151356060840182614834565b50615143608085018561526d565b61515060808401826146fc565b5061515e60a085018561526d565b61516b60a08401826146fc565b5061517960c085018561526d565b61518660c08401826146fc565b5060e084013560e08301526101006151a081860186615287565b6151ac8285018261484a565b50506101208481013590830152611e396101408301846147f0565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561524557600080fd5b604052919050565b600067ffffffffffffffff821115615263578081fd5b5060209081020190565b60008235611e39816152aa565b60008235611e39816152da565b6000823567ffffffffffffffff81168114611e39578182fd5b60048110612d1757fe5b73ffffffffffffffffffffffffffffffffffffffff81168114612d1757600080fd5b8015158114612d1757600080fd5b6fffffffffffffffffffffffffffffffff81168114612d1757600080fdfea26469706673582212207be86ebfe95c4272ef9fd60e01d1026d9fd06dd80ea122231fa85912daab50c564736f6c634300060c0033",
|
|
"opcodes": "PUSH2 0x1A0 PUSH1 0x40 MSTORE PUSH3 0x14 PUSH1 0x1 PUSH1 0x0 DUP2 PUSH3 0x1DF JUMP JUMPDEST PUSH2 0x180 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x56BB CODESIZE SUB DUP1 PUSH3 0x56BB DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x48 SWAP2 PUSH3 0x211 JUMP JUMPDEST DUP6 DUP6 DUP6 DUP6 DUP6 DUP6 DUP5 DUP5 DUP5 DUP5 DUP4 DUP4 DUP4 DUP4 DUP14 DUP10 DUP2 DUP2 DUP1 DUP3 PUSH1 0x0 CHAINID SWAP1 POP PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH32 0x9E5DAE0ADDAF20578AEB5D70341D092B53B4E14480AC5726438FD436DF7BA427 PUSH32 0x6C015BD22B4C69690933C1058878EBDFEF31F9AAAE40BBE86D8A09FE1B2972C DUP4 DUP6 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH3 0xDC SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x2B8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x80 MSTORE PUSH1 0xA0 SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 DUP13 SWAP1 SHL AND PUSH1 0xE0 MSTORE PUSH4 0x3C9506A3 PUSH1 0xE2 SHL DUP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND SWAP9 POP PUSH4 0xF2541A8C SWAP8 POP PUSH1 0x4 DUP1 DUP4 ADD SWAP8 POP SWAP5 SWAP6 POP SWAP4 SWAP1 DUP5 SWAP1 SUB ADD SWAP2 POP DUP3 SWAP1 POP DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x167 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH3 0x18D SWAP2 SWAP1 PUSH3 0x29F JUMP JUMPDEST PUSH2 0x100 MSTORE PUSH1 0x60 SWAP4 DUP5 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT SWAP1 DUP2 AND PUSH2 0x120 MSTORE SWAP3 DUP5 SHL SWAP1 SWAP3 AND PUSH2 0x140 MSTORE POP PUSH1 0xE0 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0xC0 MSTORE ADDRESS SWAP1 SHL PUSH2 0x160 MSTORE POP PUSH3 0x2FD SWAP15 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH12 0xFFFFFFFF0000000000000000 PUSH1 0x40 DUP5 SWAP1 SHL AND PUSH8 0xFFFFFFFF00000000 PUSH1 0x20 DUP5 SWAP1 SHL AND OR PUSH4 0xFFFFFFFF DUP3 AND OR SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH3 0x22A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 MLOAD PUSH3 0x237 DUP2 PUSH3 0x2E4 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD MLOAD SWAP1 SWAP7 POP PUSH3 0x24A DUP2 PUSH3 0x2E4 JUMP JUMPDEST PUSH1 0x40 DUP9 ADD MLOAD SWAP1 SWAP6 POP PUSH3 0x25D DUP2 PUSH3 0x2E4 JUMP JUMPDEST PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x270 DUP2 PUSH3 0x2E4 JUMP JUMPDEST PUSH1 0x80 DUP9 ADD MLOAD SWAP1 SWAP4 POP PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH3 0x28A JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xA0 DUP8 ADD MLOAD SWAP1 POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x2B1 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0xE0 SHR PUSH1 0xE0 MLOAD PUSH1 0x60 SHR PUSH2 0x100 MLOAD PUSH2 0x120 MLOAD PUSH1 0x60 SHR PUSH2 0x140 MLOAD PUSH1 0x60 SHR PUSH2 0x160 MLOAD PUSH1 0x60 SHR PUSH2 0x180 MLOAD PUSH2 0x532E PUSH3 0x38D PUSH1 0x0 CODECOPY DUP1 PUSH2 0x5EB MSTORE POP DUP1 PUSH2 0x2C21 MSTORE POP DUP1 PUSH2 0x2251 MSTORE POP DUP1 PUSH2 0x2162 MSTORE POP DUP1 PUSH2 0x38A9 MSTORE POP DUP1 PUSH2 0x20D5 MSTORE DUP1 PUSH2 0x3888 MSTORE POP DUP1 PUSH2 0xAD2 MSTORE DUP1 PUSH2 0x12C2 MSTORE DUP1 PUSH2 0x385C MSTORE POP DUP1 PUSH2 0x1A08 MSTORE DUP1 PUSH2 0x39D2 MSTORE POP DUP1 PUSH2 0x1A2C MSTORE DUP1 PUSH2 0x1CC9 MSTORE POP PUSH2 0x532E PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1D8 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95480889 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xB4658BFB GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xDD11D225 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xDD11D225 EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0xF6274F66 EQ PUSH2 0x57B JUMPI DUP1 PUSH4 0xF6E0F6A5 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0xFE55A3EF EQ PUSH2 0x5AE JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xB4658BFB EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xD0A55FB0 EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xD925A56D EQ PUSH2 0x531 JUMPI DUP1 PUSH4 0xDAB400F3 EQ PUSH2 0x546 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xA656186B GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0xA656186B EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xAA77476C EQ PUSH2 0x482 JUMPI DUP1 PUSH4 0xAD354EEB EQ PUSH2 0x4A2 JUMPI DUP1 PUSH4 0xB09F1FB1 EQ PUSH2 0x4D1 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x95480889 EQ PUSH2 0x3ED JUMPI DUP1 PUSH4 0x9A4F809C EQ PUSH2 0x40D JUMPI DUP1 PUSH4 0x9BAA45A8 EQ PUSH2 0x42D JUMPI DUP1 PUSH4 0xA0EDCEF5 EQ PUSH2 0x44D JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x414E4CCF GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x7D49EC1A GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x7D49EC1A EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x86A0C8D7 EQ PUSH2 0x398 JUMPI DUP1 PUSH4 0x8FD3AB80 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x9240529C EQ PUSH2 0x3DA JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x414E4CCF EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x438CDFC5 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x487B5C20 EQ PUSH2 0x334 JUMPI DUP1 PUSH4 0x6AE4B4F7 EQ PUSH2 0x356 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x1FB09795 GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x1FB09795 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0x346693C5 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x37F381D8 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0x3CD2F026 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x16A6D65 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x31B905C EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF0E8CF7 EQ PUSH2 0x228 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4B33 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x5E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x243 CALLDATASIZE PUSH1 0x4 PUSH2 0x409A JUMP JUMPDEST PUSH2 0x60D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x4414 JUMP JUMPDEST PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5099 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x299 PUSH2 0x294 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x508B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x2C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x45C8 JUMP JUMPDEST PUSH2 0x871 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x2E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x402B JUMP JUMPDEST PUSH2 0x961 JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x2F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x44BD JUMP JUMPDEST PUSH2 0x994 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP3 SWAP2 SWAP1 PUSH2 0x51E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x327 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x45FE JUMP JUMPDEST PUSH2 0xA3E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x51C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x349 PUSH2 0xAD0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x36B PUSH2 0xAF4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0xB2D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x3B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x409A JUMP JUMPDEST PUSH2 0xB95 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CD PUSH2 0xC35 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4CB5 JUMP JUMPDEST PUSH2 0x327 PUSH2 0x3E8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4472 JUMP JUMPDEST PUSH2 0x105D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x299 PUSH2 0x408 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0x1120 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x419 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x428 CALLDATASIZE PUSH1 0x4 PUSH2 0x43B8 JUMP JUMPDEST PUSH2 0x11AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x448 CALLDATASIZE PUSH1 0x4 PUSH2 0x420A JUMP JUMPDEST PUSH2 0x1290 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x459 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x349 PUSH2 0x12C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH2 0x47D CALLDATASIZE PUSH1 0x4 PUSH2 0x463E JUMP JUMPDEST PUSH2 0x12E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH2 0x49D CALLDATASIZE PUSH1 0x4 PUSH2 0x45FE JUMP JUMPDEST PUSH2 0x1327 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4C2 PUSH2 0x4BD CALLDATASIZE PUSH1 0x4 PUSH2 0x42A9 JUMP JUMPDEST PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4A8F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x4EC CALLDATASIZE PUSH1 0x4 PUSH2 0x3F7C JUMP JUMPDEST PUSH2 0x15BC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4C2 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x4175 JUMP JUMPDEST PUSH2 0x16D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x43B8 JUMP JUMPDEST PUSH2 0x1930 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1A06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1A2A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x576 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0x1A4E JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x589 CALLDATASIZE PUSH1 0x4 PUSH2 0x4472 JUMP JUMPDEST PUSH2 0x1A5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x5A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x430B JUMP JUMPDEST PUSH2 0x1AFA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x5C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH2 0x5DC DUP4 PUSH2 0x1B8E JUMP JUMPDEST PUSH2 0x1CC5 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x61F JUMPI POP DUP1 MLOAD DUP4 MLOAD EQ JUMPDEST PUSH2 0x65E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E3E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x6B6 JUMPI PUSH2 0x6AE DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x679 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x68D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x6A1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x11AB JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x661 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6C4 PUSH2 0x3C1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x6D0 DUP6 PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP PUSH2 0x761 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE POP PUSH2 0x1D17 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP3 POP PUSH2 0x77E SWAP1 PUSH2 0x779 CALLDATASIZE DUP8 SWAP1 SUB DUP8 ADD DUP8 PUSH2 0x469B JUMP JUMPDEST PUSH2 0x1E40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x7C1 PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x7CA DUP3 PUSH2 0x5CE JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH2 0x7D6 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP8 MLOAD DUP5 AND DUP6 MSTORE DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP3 DUP9 ADD MLOAD SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x100 DUP6 ADD MLOAD PUSH2 0x120 DUP7 ADD MLOAD SWAP3 SWAP4 POP PUSH2 0x844 SWAP3 DUP6 SWAP3 SWAP2 SWAP1 DUP6 PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x86B JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x879 PUSH2 0x3C1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x885 DUP6 PUSH2 0x7B9 JUMP JUMPDEST SWAP3 POP PUSH2 0x916 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE POP PUSH2 0x1D17 JUMP JUMPDEST SWAP2 POP PUSH2 0x926 DUP4 PUSH1 0x0 ADD MLOAD DUP6 PUSH2 0x1E40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x98F JUMPI PUSH2 0x987 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x97B JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x2095 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x964 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER ADDRESS EQ PUSH2 0x9AF JUMPI PUSH2 0x9AF PUSH2 0x9AA CALLER PUSH2 0x22E3 JUMP JUMPDEST PUSH2 0x239B JUMP JUMPDEST PUSH2 0x9B7 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0xA24 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP10 SWAP1 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA48 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0xA54 DUP6 DUP6 DUP6 CALLER PUSH2 0x274F JUMP JUMPDEST SWAP1 POP DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0xAC4 JUMPI PUSH2 0xAC4 PUSH2 0x9AA PUSH2 0xA95 DUP8 PUSH2 0x5CE JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2A82 JUMP JUMPDEST PUSH1 0x40 ADD MLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C696D69744F7264657273000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB38 DUP3 PUSH2 0x1A4E JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xB83 JUMPI PUSH2 0xB83 PUSH2 0x9AA DUP3 CALLER DUP6 PUSH1 0xA0 ADD MLOAD PUSH2 0x2B40 JUMP JUMPDEST PUSH2 0xB91 DUP2 DUP4 PUSH1 0xA0 ADD MLOAD PUSH2 0x2B78 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xBA7 JUMPI POP DUP1 MLOAD DUP4 MLOAD EQ JUMPDEST PUSH2 0xBDD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E3E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x6B6 JUMPI PUSH2 0xC2D DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xBF8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xC0C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC20 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1930 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBE0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC60 PUSH32 0x3CD2F02600000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xC89 PUSH32 0xF6274F6600000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xCB2 PUSH32 0xAA77476C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xCDB PUSH32 0x9240529C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD04 PUSH32 0x438CDFC500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD2D PUSH32 0x414E4CCF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD56 PUSH32 0xA656186B00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD7F PUSH32 0x7D49EC1A00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDA8 PUSH32 0xFE55A3EF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDD1 PUSH32 0x9BAA45A800000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDFA PUSH32 0xF6E0F6A500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE23 PUSH32 0xD0A55FB000000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE4C PUSH32 0x86A0C8D700000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE75 PUSH32 0x9A4F809C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE9E PUSH32 0xF0E8CF700000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xEC7 PUSH32 0x9548088900000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xEF0 PUSH32 0x346693C500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF19 PUSH32 0xDD11D22500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF42 PUSH32 0x16A6D6500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF6B PUSH32 0x487B5C2000000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF94 PUSH32 0xB09F1FB100000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xFBD PUSH32 0x1FB0979500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xFE6 PUSH32 0x37F381D800000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x100F PUSH32 0xB4658BFB00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x1038 PUSH32 0xAD354EEB00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST POP PUSH32 0x2C64C5EF00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1067 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x10D4 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST SWAP1 POP DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x1115 JUMPI PUSH2 0x1115 PUSH2 0x9AA PUSH2 0xA95 DUP8 PUSH2 0x1A4E JUMP JUMPDEST DUP1 MLOAD PUSH2 0xAC4 SWAP1 PUSH2 0x2C77 JUMP JUMPDEST PUSH2 0x1128 PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x1131 DUP3 PUSH2 0x1A4E JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH2 0x113D PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP8 MLOAD DUP5 AND DUP6 MSTORE DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP3 DUP9 ADD MLOAD SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP3 SWAP4 POP PUSH2 0x86B SWAP3 DUP6 SWAP3 SWAP2 SWAP1 DUP6 PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11B5 PUSH2 0x1F97 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP DUP3 DUP2 GT ISZERO PUSH2 0x120C JUMPI PUSH2 0x120C PUSH2 0x9AA DUP5 DUP4 PUSH2 0x2D1A JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP5 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0xFE7FFB1EDFE79F4DF716CB2DCAD21CF2F31B104D816A7976BA1E6E4653C1EFB1 SWAP2 PUSH2 0x1281 SWAP2 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4947 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xB91 JUMPI PUSH2 0x12B8 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x12AB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0xB2D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1293 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER ADDRESS EQ PUSH2 0x12FA JUMPI PUSH2 0x12FA PUSH2 0x9AA CALLER PUSH2 0x22E3 JUMP JUMPDEST PUSH2 0x1302 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x130E DUP8 DUP8 DUP8 DUP8 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP9 SWAP1 SWAP8 POP SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1332 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x133E DUP7 DUP7 DUP7 CALLER PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP6 DUP5 EQ PUSH2 0x1393 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4D84 JUMP JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x13AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x13E4 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x13D1 PUSH2 0x3C1A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x13C9 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x13FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1428 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1442 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x146C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15B1 JUMPI ADDRESS PUSH4 0x37F381D8 DUP10 DUP10 DUP5 DUP2 DUP2 LT PUSH2 0x148C JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x140 MUL ADD DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x149F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x80 MUL ADD PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x14C2 SWAP3 SWAP2 SWAP1 PUSH2 0x50CF JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1528 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x1525 SWAP2 DUP2 ADD SWAP1 PUSH2 0x4530 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1531 JUMPI PUSH2 0x15A9 JUMP JUMPDEST DUP3 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x153E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP2 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1556 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP6 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1595 JUMPI INVALID JUMPDEST SWAP2 ISZERO ISZERO PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1472 JUMP JUMPDEST POP SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST CALLER ORIGIN EQ PUSH2 0x15F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4DE1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15FF PUSH2 0x1F97 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x1694 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP6 MLOAD DUP6 SWAP3 SWAP1 DUP8 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x162F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 ADD PUSH2 0x1604 JUMP JUMPDEST POP PUSH32 0x2DFEAD5EB769B298E82DD9650B31C40559A3D42701DBF53C931BC2682847C31 CALLER DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x16C8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x497E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP6 DUP5 EQ PUSH2 0x1712 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4D84 JUMP JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1763 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1750 PUSH2 0x3C1A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1748 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x177D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x17C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17EB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15B1 JUMPI ADDRESS PUSH4 0x1FB09795 DUP10 DUP10 DUP5 DUP2 DUP2 LT PUSH2 0x180B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x180 MUL ADD DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x181E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x80 MUL ADD PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1841 SWAP3 SWAP2 SWAP1 PUSH2 0x4F55 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1859 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x18A7 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x18A4 SWAP2 DUP2 ADD SWAP1 PUSH2 0x4530 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x18B0 JUMPI PUSH2 0x1928 JUMP JUMPDEST DUP3 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x18BD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP2 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x18D5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP6 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1914 JUMPI INVALID JUMPDEST SWAP2 ISZERO ISZERO PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x17F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x193A PUSH2 0x1F97 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP DUP3 DUP2 GT ISZERO PUSH2 0x1991 JUMPI PUSH2 0x1991 PUSH2 0x9AA DUP5 DUP4 PUSH2 0x2D1A JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0xA91FE7AE62FCE669DF2C7F880F8C14D178531AAE72515558E5C948E37C32A572 SWAP2 PUSH2 0x1281 SWAP2 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4947 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH2 0x5DC DUP4 PUSH2 0x2DD5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A67 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x1AD4 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE3 DUP2 PUSH1 0x0 ADD MLOAD PUSH2 0x2C77 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xB91 JUMPI PUSH2 0x1B22 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1B15 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1AFD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B35 DUP3 PUSH2 0x5CE JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1B80 JUMPI PUSH2 0x1B80 PUSH2 0x9AA DUP3 CALLER DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x2B40 JUMP JUMPDEST PUSH2 0xB91 DUP2 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x2B78 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0xE593D3FDFA8B60E5E17A1B2204662ECBE15C23F2084B9AD5BAE40359540A7DA9 DUP2 MSTORE DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x160 DUP2 KECCAK256 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1CFA SWAP3 SWAP2 SWAP1 PUSH2 0x48BC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 EQ DUP1 PUSH2 0x1D52 JUMPI POP PUSH1 0x60 DUP3 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO JUMPDEST ISZERO PUSH2 0x1D5F JUMPI POP PUSH1 0x0 PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x80 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1D75 JUMPI INVALID JUMPDEST EQ PUSH2 0x1D82 JUMPI POP PUSH1 0x0 PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DDB DUP4 PUSH1 0x80 ADD MLOAD PUSH1 0x40 ADD MLOAD DUP5 PUSH1 0x60 ADD MLOAD SUB PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST SWAP1 POP PUSH2 0x1DF8 DUP2 PUSH2 0x1DF3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x2F6A JUMP JUMPDEST PUSH2 0x309C JUMP JUMPDEST SWAP1 POP PUSH2 0x1E39 PUSH2 0x1E34 DUP3 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0x30D6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E4C DUP4 DUP4 PUSH2 0x3102 JUMP JUMPDEST PUSH1 0x2 DUP3 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1E5B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1EC3 JUMPI PUSH1 0x1 DUP4 DUP4 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1E90 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C97 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EB2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP PUSH2 0x1F68 JUMP JUMPDEST PUSH1 0x3 DUP3 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1ED2 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1F68 JUMPI PUSH1 0x0 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x0 MSTORE DUP4 PUSH1 0x1C MSTORE PUSH1 0x3C PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1F38 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C97 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F5A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP2 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1F91 JUMPI PUSH2 0x1F91 PUSH2 0x9AA PUSH1 0x5 DUP6 PUSH2 0x31AE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F91 PUSH1 0x7 PUSH2 0x31E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1FAE PUSH2 0x1F97 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP3 DUP11 ADD DUP4 SWAP1 MSTORE SWAP3 SWAP4 POP SWAP2 DUP8 AND GT PUSH2 0x2005 JUMPI PUSH1 0x20 DUP8 ADD PUSH1 0x2 JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1FFA JUMPI INVALID JUMPDEST DUP2 MSTORE POP POP POP POP PUSH2 0x208E JUMP JUMPDEST PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 DUP2 AND ISZERO PUSH2 0x2038 JUMPI PUSH1 0x20 DUP8 ADD PUSH1 0x3 PUSH2 0x1FED JUMP JUMPDEST POP TIMESTAMP PUSH8 0xFFFFFFFFFFFFFFFF AND DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x2072 JUMPI PUSH1 0x20 DUP7 ADD PUSH1 0x4 JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2068 JUMPI INVALID JUMPDEST DUP2 MSTORE POP POP POP PUSH2 0x208E JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x2085 JUMPI PUSH1 0x20 DUP7 ADD PUSH1 0x3 PUSH2 0x205B JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x20 DUP7 ADD MSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x319BED9A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x319BED9A SWAP1 PUSH2 0x210A SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B33 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2138 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x215C SWAP2 SWAP1 PUSH2 0x439C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x21B9 SWAP2 SWAP1 PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x21E5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2209 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x98F JUMPI PUSH1 0x40 MLOAD PUSH32 0xA3B4A32700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0xA3B4A327 SWAP1 PUSH2 0x22AC SWAP1 DUP6 SWAP1 DUP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 ADD SWAP1 PUSH1 0x4 ADD PUSH2 0x4916 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22DA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xF0EC779B0BCDA6D84ABF99EE2C67647D1100EBBB553A9C2D1C2BA1579592832C DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2317 SWAP2 SWAP1 PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x23AB PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x23B3 PUSH2 0x3C1A JUMP JUMPDEST DUP3 MLOAD PUSH2 0x23BE SWAP1 PUSH2 0x1120 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23D2 JUMPI INVALID JUMPDEST EQ PUSH2 0x23F7 JUMPI PUSH2 0x23F7 PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23F2 JUMPI INVALID JUMPDEST PUSH2 0x31FF JUMP JUMPDEST DUP3 MLOAD PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2459 JUMPI POP DUP3 PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x247C JUMPI PUSH2 0x247C PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0xC0 ADD MLOAD PUSH2 0x3235 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x24DE JUMPI POP DUP3 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x2501 JUMPI PUSH2 0x2501 PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x80 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2515 DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x1E40 JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2569 JUMPI DUP2 MLOAD DUP5 MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0x2569 SWAP2 PUSH2 0x9AA SWAP2 DUP5 SWAP1 PUSH2 0x32A5 JUMP JUMPDEST POP DUP3 MLOAD PUSH2 0x120 ADD MLOAD PUSH2 0x257A SWAP1 PUSH2 0x32DD JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0xA0 SWAP1 DUP2 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP1 DUP10 ADD MLOAD DUP4 AND DUP6 DUP8 ADD MSTORE DUP9 MLOAD MLOAD DUP4 AND DUP2 DUP7 ADD MSTORE DUP9 MLOAD SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP2 AND PUSH1 0x80 DUP5 ADD MSTORE DUP7 MLOAD DUP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP7 MLOAD ADD MLOAD DUP2 AND PUSH1 0xC0 DUP4 ADD MSTORE DUP6 DUP4 ADD MLOAD DUP2 AND PUSH1 0xE0 DUP4 ADD MSTORE SWAP2 DUP4 ADD MLOAD SWAP1 SWAP2 AND PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x2623 SWAP1 PUSH2 0x33B2 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE DUP4 MLOAD PUSH1 0x80 ADD MLOAD AND ISZERO PUSH2 0x26DA JUMPI PUSH2 0x26A5 DUP3 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP5 MLOAD PUSH1 0x20 DUP2 ADD MLOAD SWAP2 DUP7 ADD MLOAD PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH2 0x26DA SWAP4 PUSH2 0x352D JUMP JUMPDEST DUP1 MLOAD DUP4 MLOAD PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x60 DUP1 DUP8 ADD MLOAD PUSH2 0x100 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x20 DUP1 DUP8 ADD MLOAD SWAP1 DUP11 ADD MLOAD PUSH1 0x40 DUP1 DUP13 ADD MLOAD SWAP7 DUP13 ADD MLOAD DUP13 MLOAD PUSH2 0x120 SWAP1 SWAP11 ADD MLOAD SWAP2 MLOAD PUSH32 0xAB614D2B738543C0EA21F56347CF696A3A0C42A7CBEC3212A5CA22A4DCFF2124 SWAP12 PUSH2 0x2741 SWAP12 SWAP1 SWAP11 SWAP10 SWAP4 SWAP1 SWAP2 PUSH2 0x4B8C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2757 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x275F PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x2768 DUP7 PUSH2 0x7B9 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x277C JUMPI INVALID JUMPDEST EQ PUSH2 0x279C JUMPI PUSH2 0x279C PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23F2 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH2 0x27A6 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0xC0 DUP9 ADD MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 ISZERO SWAP1 PUSH2 0x280A JUMPI POP PUSH1 0xC0 DUP8 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 ORIGIN DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST ISZERO PUSH2 0x2825 JUMPI PUSH2 0x2825 PUSH2 0x9AA DUP4 PUSH1 0x0 ADD MLOAD ORIGIN DUP11 PUSH1 0xC0 ADD MLOAD PUSH2 0x3734 JUMP JUMPDEST POP PUSH1 0xA0 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x287F JUMPI POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x289A JUMPI PUSH2 0x289A PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 DUP10 PUSH1 0xA0 ADD MLOAD PUSH2 0x3235 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28AA DUP3 PUSH1 0x0 ADD MLOAD DUP8 PUSH2 0x1E40 JUMP JUMPDEST SWAP1 POP DUP7 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x28F9 JUMPI PUSH2 0x28F9 PUSH2 0x9AA DUP4 PUSH1 0x0 ADD MLOAD DUP4 DUP11 PUSH1 0x80 ADD MLOAD PUSH2 0x32A5 JUMP JUMPDEST POP PUSH2 0x29FE PUSH1 0x40 MLOAD DUP1 PUSH2 0x120 ADD PUSH1 0x40 MSTORE DUP1 DUP4 PUSH1 0x0 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x33B2 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x20 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE DUP5 MLOAD PUSH1 0x80 DUP12 ADD MLOAD DUP12 MLOAD SWAP3 DUP13 ADD MLOAD PUSH1 0xE0 DUP14 ADD MLOAD SWAP7 MLOAD PUSH32 0x829FA99D94DC4636925B38632E625736A614C154D55006B7AB6BEA979C210C32 SWAP8 PUSH2 0x2A71 SWAP8 SWAP5 SWAP7 SWAP4 SWAP6 DUP13 SWAP6 SWAP1 SWAP5 SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x4C0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x21948612B5EF214EC0508DF4901600E07A810A371BE76B25D59ADE73826E3D97 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x88B2C08E4A5F57D416AD23DAD18C20497CCFE684B1379B28FD564ADAF582B80F DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B82 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 OR SWAP1 SSTORE MLOAD SWAP1 SWAP2 POP PUSH32 0xA6EB7CDC219E1518CED964E9A34E61D68A94E4F1569DB3E84256BA981BA52753 SWAP1 PUSH2 0x16C8 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6EB224CB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS SWAP1 PUSH4 0x6EB224CB SWAP1 PUSH2 0x2C49 SWAP1 DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x4CE2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x208E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST DUP1 CALLVALUE GT DUP1 ISZERO PUSH2 0x2C86 JUMPI POP CALLER ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x2D17 JUMPI PUSH1 0x0 PUSH2 0x2C97 CALLVALUE DUP4 PUSH2 0x376C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0x2CBF SWAP1 PUSH2 0x48F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2CFC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2D01 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x98F JUMPI PUSH2 0x98F PUSH2 0x9AA CALLER DUP5 PUSH2 0x378B JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xB12BC7E7D341F4431D6FAF05F991EE3B779183E341B24243064E10C886CD1873 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x5207 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0xCE918627CB55462DDBB85E73DE69A8B322F2BC88F4507C52FCAD6D4C33C29D49 DUP2 MSTORE DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x140 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x160 DUP3 ADD MSTORE PUSH2 0x160 DUP4 ADD MLOAD PUSH2 0x180 DUP3 ADD MSTORE PUSH2 0x1A0 DUP2 KECCAK256 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F62 DUP4 PUSH2 0x2F5C DUP7 DUP6 PUSH2 0x37C1 JUMP JUMPDEST SWAP1 PUSH2 0x37F2 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E39 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E DUP5 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2FAA SWAP3 SWAP2 SWAP1 PUSH2 0x49F0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2FD6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2FFA SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x304C SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3064 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3078 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1DF3 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x30AB JUMPI DUP2 PUSH2 0x1E39 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F62 DUP4 PUSH2 0x2F5C PUSH2 0x30C6 DUP3 PUSH1 0x1 PUSH2 0x376C JUMP JUMPDEST PUSH2 0x30D0 DUP9 DUP8 PUSH2 0x37C1 JUMP JUMPDEST SWAP1 PUSH2 0x381C JUMP JUMPDEST PUSH1 0x0 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x30FE JUMPI PUSH2 0x30FE PUSH2 0x9AA PUSH1 0x3 DUP5 PUSH2 0x3838 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 GT ISZERO DUP1 PUSH2 0x3159 JUMPI POP PUSH1 0x60 DUP2 ADD MLOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 GT ISZERO JUMPDEST ISZERO PUSH2 0x316C JUMPI PUSH2 0x316C PUSH2 0x9AA PUSH1 0x5 DUP5 PUSH2 0x31AE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x317B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x318F JUMPI PUSH2 0x318F PUSH2 0x9AA PUSH1 0x3 DUP5 PUSH2 0x31AE JUMP JUMPDEST PUSH1 0x1 DUP2 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x319E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB91 JUMPI PUSH2 0xB91 PUSH2 0x9AA PUSH1 0x0 DUP5 JUMPDEST PUSH1 0x60 PUSH32 0xF18F11F3027E735C758137924B262D4D3AFF0037DCD785ACA3C699FA05D960BD DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4D63 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x31F4 JUMPI INVALID JUMPDEST PUSH1 0x1 ADD SWAP1 SHL SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x47AB394E41470191EAF9FA542E84AC483A12665FBD616EB8D1C022CED6C94000 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4C86 JUMP JUMPDEST PUSH1 0x60 PUSH32 0x5D3300180A4547B3E27137BE832D3EBF56F1BA5EBB30DD580999C61F77FA6396 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x60 PUSH32 0x15E6A383BB02D79EE933B927FBECBA78CDDE16CBA84B94A99661F44BCCE3B736 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xF13E65D925201525F3D71A731833B19BB26E44CFBD97CAF72A366B73866F7124 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x32E8 PUSH2 0x3855 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x32F9 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3304 DUP5 PUSH2 0x3881 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x332C SWAP1 PUSH2 0x48F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3369 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x336E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x33A9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4EF8 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33F0 DUP4 PUSH1 0xE0 ADD MLOAD PUSH2 0x33EB DUP6 PUSH2 0x100 ADD MLOAD DUP7 PUSH1 0xC0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x38CE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x392F JUMP JUMPDEST SWAP2 POP PUSH2 0x343B DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0xC0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0xA0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST SWAP1 POP PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 PUSH2 0x346C JUMPI POP PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO JUMPDEST ISZERO PUSH2 0x347C JUMPI POP PUSH1 0x0 SWAP1 POP DUP1 PUSH2 0x3528 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x349E SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x3962 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x34B8 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x0 ADD PUSH1 0x0 DUP6 PUSH1 0x0 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x34FE DUP4 PUSH1 0x80 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x352D JUMP JUMPDEST PUSH2 0x3528 DUP4 PUSH1 0x60 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP5 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x352D JUMP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND ADDRESS EQ ISZERO PUSH2 0x3581 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E9B JUMP JUMPDEST PUSH2 0x358A DUP7 PUSH2 0x39B7 JUMP JUMPDEST ISZERO PUSH2 0x365E JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP4 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x35E5 SWAP1 DUP10 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x49F0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3611 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3635 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST LT ISZERO PUSH2 0x365E JUMPI PUSH2 0x3657 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x39F7 JUMP JUMPDEST POP POP PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x24 DUP3 ADD MSTORE DUP4 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x0 DUP1 PUSH1 0x64 DUP4 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND GAS CALL SWAP3 POP RETURNDATASIZE DUP1 PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH1 0x1 PUSH1 0x20 DUP4 ADD MLOAD EQ PUSH1 0x20 DUP3 LT ISZERO AND DUP2 ISZERO OR DUP5 AND SWAP4 POP DUP4 PUSH2 0x3718 JUMPI DUP1 DUP3 MSTORE DUP2 SWAP3 POP DUP1 PUSH1 0x20 DUP4 ADD ADD PUSH1 0x40 MSTORE JUMPDEST POP POP DUP2 PUSH2 0x372C JUMPI PUSH2 0x372C DUP7 DUP7 DUP7 DUP7 DUP6 PUSH2 0x39F7 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xC0972F3CC4234CA2091DE7E7BC7081494BD29AC280167D66F0D44168973B1634 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x3785 JUMPI PUSH2 0x3785 PUSH2 0x9AA PUSH1 0x2 DUP6 DUP6 PUSH2 0x3ABF JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xBDE95CC2119E0200D80642397198ABFCF98E6E4DDDD0DE9C6320D86252AD40AB DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4A69 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x37D0 JUMPI POP PUSH1 0x0 PUSH2 0x1F91 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x37DD JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x1 DUP7 DUP7 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3808 JUMPI PUSH2 0x3808 PUSH2 0x9AA PUSH1 0x3 DUP6 DUP6 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x3813 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x0 DUP7 DUP7 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x60 PUSH4 0xC996AF7B PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH32 0x0 AND GASPRICE MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH32 0x0 PUSH32 0x0 DUP5 PUSH2 0x3ADE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x3785 JUMPI PUSH2 0x3785 PUSH2 0x9AA PUSH1 0x2 DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT PUSH2 0x30AB JUMPI DUP2 PUSH2 0x1E39 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x0 DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH1 0x1 PUSH1 0xFF SWAP3 DUP4 AND DUP2 SWAP1 SHL SWAP3 SWAP1 SWAP2 AND SHL OR PUSH32 0x0 DUP2 AND EQ SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x89DD02E700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS SWAP1 PUSH4 0x89DD02E7 SWAP1 PUSH2 0x3A39 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4947 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3A64 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x208E JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3A92 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3A97 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH2 0x3AB9 PUSH2 0x9AA DUP8 DUP8 DUP8 DUP8 DUP8 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x3AB2 JUMPI DUP7 PUSH2 0x3AB4 JUMP JUMPDEST DUP8 JUMPDEST PUSH2 0x3B56 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D2A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x3B18 SWAP1 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP7 SWAP1 DUP6 SWAP1 DUP8 SWAP1 PUSH1 0x20 ADD PUSH2 0x4858 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xDFDC6F57CF82BEDE92BCFDD44FEDB82B2D5CECABF56EC21964DB6EE2C3E82CF4 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3B92 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4A17 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C7E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C91 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST PUSH2 0x5226 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3CB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x3CDA JUMPI DUP2 CALLDATALOAD PUSH2 0x3CC8 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CB5 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3CF6 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D0D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 PUSH1 0x80 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x3D28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52CC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3D4D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3D56 DUP2 PUSH2 0x5226 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D63 DUP4 DUP4 PUSH2 0x3C63 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3D72 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3D84 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3D96 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x3DA8 DUP4 PUSH1 0x80 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x3DBA DUP4 PUSH1 0xA0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x3DCC DUP4 PUSH1 0xC0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x3DDE DUP4 PUSH1 0xE0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 PUSH2 0x3DF2 DUP5 DUP3 DUP6 ADD PUSH2 0x3C63 JUMP JUMPDEST SWAP1 DUP3 ADD MSTORE PUSH2 0x120 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x140 PUSH2 0x3E10 DUP5 DUP3 DUP6 ADD PUSH2 0x3F53 JUMP JUMPDEST DUP2 DUP4 ADD MSTORE POP PUSH2 0x160 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3E3A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3E43 DUP2 PUSH2 0x5226 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3E50 DUP4 DUP4 PUSH2 0x3C63 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3E5F DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3E71 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3E83 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x3E95 DUP4 PUSH1 0x80 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x3EA7 DUP4 PUSH1 0xA0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x3EB9 DUP4 PUSH1 0xC0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 PUSH2 0x3ED7 DUP5 DUP3 DUP6 ADD PUSH2 0x3F53 JUMP JUMPDEST DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EFF JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x3F09 PUSH1 0x80 PUSH2 0x5226 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH1 0x4 DUP2 LT PUSH2 0x3F1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MSTORE PUSH2 0x3F29 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3F6B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52DA JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F8E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FA4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x3FB4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x3FC2 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP1 DUP3 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP6 ADD DUP10 DUP3 DUP4 DUP8 MUL DUP9 ADD ADD GT ISZERO PUSH2 0x3FE2 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x400D JUMPI DUP1 CALLDATALOAD PUSH2 0x3FF9 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x3FE6 JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x401D DUP10 DUP3 DUP11 ADD PUSH2 0x3D2F JUMP JUMPDEST SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x403D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4054 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4067 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4075 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x4088 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x40AE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x40C5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x40D1 DUP8 DUP4 DUP9 ADD PUSH2 0x3C6E JUMP JUMPDEST SWAP5 POP PUSH1 0x20 SWAP2 POP DUP2 DUP7 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x40E7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x40F3 DUP9 DUP3 DUP10 ADD PUSH2 0x3C6E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4107 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 ADD SWAP1 POP PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x4119 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4127 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP12 LT ISZERO PUSH2 0x4143 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x4165 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4147 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x418A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x41A1 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x41B4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x41C2 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 PUSH2 0x180 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x41D7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP SWAP1 DUP7 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x41F1 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x41FE DUP8 DUP3 DUP9 ADD PUSH2 0x3CE5 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x421C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4232 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4250 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD PUSH2 0x180 DUP1 DUP6 MUL DUP7 ADD DUP8 ADD DUP11 LT ISZERO PUSH2 0x426F JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x429B JUMPI PUSH2 0x4285 DUP11 DUP4 PUSH2 0x3D3A JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP7 ADD SWAP3 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4273 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x42BE JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x42D5 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x42E8 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x42F6 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 PUSH2 0x140 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x41D7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x431D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4333 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4343 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4351 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD PUSH2 0x140 DUP1 DUP6 MUL DUP7 ADD DUP8 ADD DUP11 LT ISZERO PUSH2 0x4370 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x429B JUMPI PUSH2 0x4386 DUP11 DUP4 PUSH2 0x3E27 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP7 ADD SWAP3 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4374 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x43AD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1E39 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43CC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x43D7 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x43E7 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x440A JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3D3A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 SUB PUSH2 0x200 DUP2 SLT ISZERO PUSH2 0x4428 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4432 DUP6 DUP6 PUSH2 0x3D3A JUMP JUMPDEST SWAP3 POP PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE80 DUP3 ADD SLT ISZERO PUSH2 0x4463 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x180 DUP4 ADD SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x220 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4487 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4491 DUP6 DUP6 PUSH2 0x3D3A JUMP JUMPDEST SWAP3 POP PUSH2 0x44A1 DUP6 PUSH2 0x180 DUP7 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP2 POP PUSH2 0x200 DUP5 ADD CALLDATALOAD PUSH2 0x44B2 DUP2 PUSH2 0x52DA JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x260 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x44D5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x44DF DUP8 DUP8 PUSH2 0x3D3A JUMP JUMPDEST SWAP5 POP PUSH2 0x44EF DUP8 PUSH2 0x180 DUP9 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP4 POP PUSH2 0x200 DUP7 ADD CALLDATALOAD PUSH2 0x4500 DUP2 PUSH2 0x52DA JUMP JUMPDEST SWAP3 POP PUSH2 0x220 DUP7 ADD CALLDATALOAD PUSH2 0x4511 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP2 POP PUSH2 0x240 DUP7 ADD CALLDATALOAD PUSH2 0x4522 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0xA0 DUP2 SLT ISZERO PUSH2 0x4545 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x4552 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x455D PUSH1 0x60 PUSH2 0x5226 JUMP JUMPDEST DUP5 MLOAD DUP2 MSTORE PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x4572 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x4585 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x459B DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x44B2 DUP2 PUSH2 0x52CC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x45BE JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3E27 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C0 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45DB JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x45E5 DUP5 DUP5 PUSH2 0x3E27 JUMP JUMPDEST SWAP2 POP PUSH2 0x45F5 DUP5 PUSH2 0x140 DUP6 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1E0 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4613 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x461D DUP6 DUP6 PUSH2 0x3E27 JUMP JUMPDEST SWAP3 POP PUSH2 0x462D DUP6 PUSH2 0x140 DUP7 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP2 POP PUSH2 0x1C0 DUP5 ADD CALLDATALOAD PUSH2 0x44B2 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x200 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4654 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x465E DUP7 DUP7 PUSH2 0x3E27 JUMP JUMPDEST SWAP4 POP PUSH2 0x466E DUP7 PUSH2 0x140 DUP8 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP3 POP PUSH2 0x1C0 DUP6 ADD CALLDATALOAD PUSH2 0x467F DUP2 PUSH2 0x52DA JUMP JUMPDEST SWAP2 POP PUSH2 0x1E0 DUP6 ADD CALLDATALOAD PUSH2 0x4690 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46AC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3EEE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46C7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46DA DUP4 DUP4 PUSH2 0x47BB JUMP JUMPDEST POP POP PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4747 JUMPI DUP2 MLOAD ISZERO ISZERO DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4729 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4777 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x475B JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x4788 JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x47CE JUMPI INVALID JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x4 DUP2 LT PUSH2 0x47FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4808 DUP2 PUSH2 0x52A0 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD PUSH1 0xFF PUSH2 0x481D DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x3F6B JUMP JUMPDEST AND PUSH1 0x20 DUP5 ADD MSTORE CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 DUP2 ADD CALLDATALOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP5 SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x60 SWAP3 SWAP1 SWAP3 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND PUSH1 0x1 DUP5 ADD MSTORE PUSH1 0x15 DUP4 ADD MSTORE PUSH1 0x35 DUP3 ADD MSTORE PUSH1 0x55 ADD SWAP1 JUMP JUMPDEST PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND DUP5 MSTORE PUSH1 0x20 PUSH1 0x60 DUP2 DUP7 ADD MSTORE DUP3 DUP8 MLOAD DUP1 DUP6 MSTORE PUSH1 0x80 DUP8 ADD SWAP2 POP DUP3 DUP10 ADD SWAP5 POP DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x49D7 JUMPI DUP6 MLOAD DUP6 AND DUP4 MSTORE SWAP5 DUP4 ADD SWAP5 SWAP2 DUP4 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x49B9 JUMP JUMPDEST POP POP DUP1 SWAP5 POP POP POP POP POP DUP3 ISZERO ISZERO PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x4A5E PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x4752 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH1 0x60 DUP4 MSTORE DUP1 DUP7 MLOAD PUSH2 0x4AA6 DUP2 DUP5 PUSH2 0x4B33 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 SWAP3 POP DUP3 DUP9 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4AD2 JUMPI PUSH2 0x4AC4 DUP5 DUP4 MLOAD PUSH2 0x46CE JUMP JUMPDEST SWAP4 POP SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4AB1 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP7 MLOAD PUSH2 0x4AE9 DUP2 DUP5 PUSH2 0x4B33 JUMP JUMPDEST SWAP2 POP DUP4 DUP9 ADD SWAP3 POP DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4B13 JUMPI PUSH2 0x4B05 DUP4 DUP6 MLOAD PUSH2 0x46E2 JUMP JUMPDEST SWAP4 DUP6 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x4AF2 JUMP JUMPDEST POP POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x4B27 DUP2 DUP8 PUSH2 0x4716 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP11 DUP12 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP10 DUP11 AND PUSH1 0x20 DUP13 ADD MSTORE SWAP8 DUP10 AND PUSH1 0x40 DUP12 ADD MSTORE SWAP6 DUP9 AND PUSH1 0x60 DUP11 ADD MSTORE SWAP4 DUP8 AND PUSH1 0x80 DUP10 ADD MSTORE SWAP2 SWAP1 SWAP6 AND PUSH1 0xA0 DUP8 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0xC0 DUP8 ADD MSTORE DUP5 AND PUSH1 0xE0 DUP7 ADD MSTORE SWAP1 SWAP3 AND PUSH2 0x100 DUP5 ADD MSTORE PUSH2 0x120 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x160 ADD SWAP1 JUMP JUMPDEST SWAP8 DUP9 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND PUSH1 0x20 DUP10 ADD MSTORE SWAP5 DUP7 AND PUSH1 0x40 DUP9 ADD MSTORE SWAP3 DUP6 AND PUSH1 0x60 DUP8 ADD MSTORE SWAP4 AND PUSH1 0x80 DUP6 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0xA0 DUP6 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0xFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x4D38 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D59 DUP5 PUSH2 0x52A0 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH1 0x6 DUP5 LT PUSH2 0x4D59 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x1E39 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4752 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4D49534D4154434845445F41 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x525241595F4C454E475448530000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4E4F5F434F4E54524143545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4F524947494E5300000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4D49534D4154434845445F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4149525F4F52444552535F41525241595F4C454E475448530000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x466978696E546F6B656E5370656E6465722F43414E4E4F545F494E564F4B455F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x53454C4600000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x466978696E50726F746F636F6C466565732F45544845525F5452414E53464552 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F46414C49454400000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH2 0x200 DUP2 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x4F71 DUP4 PUSH2 0x4F6C DUP4 DUP9 PUSH2 0x3C63 JUMP JUMPDEST PUSH2 0x46FC JUMP JUMPDEST PUSH2 0x4F7B DUP2 DUP7 PUSH2 0x526D JUMP JUMPDEST SWAP1 POP PUSH2 0x4F8A PUSH1 0x20 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x4F98 PUSH1 0x40 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FA5 PUSH1 0x40 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FB3 PUSH1 0x60 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FC0 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FCE PUSH1 0x80 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FDB PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FE9 PUSH1 0xA0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x4FF6 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x5004 PUSH1 0xC0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5011 PUSH1 0xC0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x501F PUSH1 0xE0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x502C PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x100 PUSH2 0x503C DUP2 DUP7 ADD DUP7 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5048 DUP3 DUP6 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP POP PUSH2 0x120 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x140 PUSH2 0x5064 DUP2 DUP7 ADD DUP7 PUSH2 0x5287 JUMP JUMPDEST PUSH2 0x5070 DUP3 DUP6 ADD DUP3 PUSH2 0x484A JUMP JUMPDEST POP POP PUSH2 0x160 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x1E39 PUSH2 0x180 DUP4 ADD DUP5 PUSH2 0x47F0 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1F91 DUP3 DUP5 PUSH2 0x47BB JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x50A7 DUP3 DUP7 PUSH2 0x47BB JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x60 DUP4 ADD MSTORE DUP3 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1C0 DUP2 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x50E6 DUP4 PUSH2 0x4F6C DUP4 DUP9 PUSH2 0x3C63 JUMP JUMPDEST PUSH2 0x50F0 DUP2 DUP7 PUSH2 0x526D JUMP JUMPDEST SWAP1 POP PUSH2 0x50FF PUSH1 0x20 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x510D PUSH1 0x40 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x511A PUSH1 0x40 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x5128 PUSH1 0x60 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x5135 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x5143 PUSH1 0x80 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5150 PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x515E PUSH1 0xA0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x516B PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x5179 PUSH1 0xC0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5186 PUSH1 0xC0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 PUSH2 0x51A0 DUP2 DUP7 ADD DUP7 PUSH2 0x5287 JUMP JUMPDEST PUSH2 0x51AC DUP3 DUP6 ADD DUP3 PUSH2 0x484A JUMP JUMPDEST POP POP PUSH2 0x120 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x1E39 PUSH2 0x140 DUP4 ADD DUP5 PUSH2 0x47F0 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5263 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH2 0x1E39 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH2 0x1E39 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1E39 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x2D17 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0xE86EBFE95C4272EF9FD60E01D1026D9FD06DD80EA122231FA85912DA 0xAB POP 0xC5 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
|
|
"sourceMap": "916:2880:8:-:0;;;1186:23;1201:1;1204;1201;1186:14;:23::i;:::-;1134:75;;1216:522;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1513:13;1540:4;1558:7;1579:22;1615:21;1650:23;3466:4:20;3472:7;3481:22;3505:21;1438:4:19;1444:7;1453:22;1477:21;3393:13:20;3408:23;1523:13:17;1538:23;1888::18;1847:13;1158:15:22;1209:9;1198:20;;1318:292;1632:19;1673:18;1713:7;1742:13;1286:487;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1286:487:22;;;;;;;;;1259:528;;1286:487;1259:528;;;;1233:554;;1614:52:24;;;;;-1:-1:-1;;;;;;1685:49:23;;;;;;;-1:-1:-1;;;1787:53:23;;;-1:-1:-1;;;;;1685:49:23;;;-1:-1:-1;1787:51:23;;-1:-1:-1;1787:53:23;;;;;-1:-1:-1;1286:487:22;;-1:-1:-1;1787:53:23;;;;;;;-1:-1:-1;1787:53:23;;-1:-1:-1;1685:49:23;1787:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1744:96;;1850:11;;;;-1:-1:-1;;;;;;1850:11:23;;;;;1871:17;;;;;;;;-1:-1:-1;1898:47:23;;-1:-1:-1;;;;;;1898:47:23;;;1920:4:21;1894:31;;;;-1:-1:-1;916:2880:8;;-1:-1:-1;;;;;;;;;;;;;;;916:2880:8;2672:235:21;2834:20;2852:2;2834:20;;;;2859;2877:2;2859:20;;;;2833:47;2883:17;;;2833:67;2672:235;;;;;:::o;989:1084:-1:-;;;;;;;1258:3;1246:9;1237:7;1233:23;1229:33;1226:2;;;-1:-1;;1265:12;1226:2;89:6;83:13;101:33;128:5;101:33;:::i;:::-;1428:2;1501:22;;589:13;1317:74;;-1:-1;607:56;589:13;607:56;:::i;:::-;1570:2;1637:22;;770:13;1436:97;;-1:-1;788:50;770:13;788:50;:::i;:::-;1706:2;1786:22;;395:13;1578:91;;-1:-1;413:63;395:13;413:63;:::i;:::-;1855:3;1905:22;;927:13;1714:104;;-1:-1;4205:10;4194:22;;5046:34;;5036:2;;-1:-1;;5084:12;5036:2;1864:73;;;;1974:3;2029:9;2025:22;224:13;1983:74;;1220:853;;;;;;;;:::o;2080:263::-;;2195:2;2183:9;2174:7;2170:23;2166:32;2163:2;;;-1:-1;;2201:12;2163:2;-1:-1;224:13;;2157:186;-1:-1;2157:186::o;2710:668::-;2541:37;;;3114:2;3099:18;;2541:37;;;;3197:2;3182:18;;2541:37;;;;3280:2;3265:18;;2541:37;-1:-1;;;;;3988:54;3363:3;3348:19;;2421:37;2949:3;2934:19;;2920:458::o;4228:117::-;-1:-1;;;;;3988:54;;4287:35;;4277:2;;4336:1;;4326:12;4277:2;4271:74;:::o;:::-;916:2880:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
|
|
},
|
|
"deployedBytecode": {
|
|
"immutableReferences": {
|
|
"715": [
|
|
{
|
|
"length": 32,
|
|
"start": 1515
|
|
}
|
|
],
|
|
"4029": [
|
|
{
|
|
"length": 32,
|
|
"start": 11297
|
|
}
|
|
],
|
|
"4159": [
|
|
{
|
|
"length": 32,
|
|
"start": 6700
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 7369
|
|
}
|
|
],
|
|
"4219": [
|
|
{
|
|
"length": 32,
|
|
"start": 2770
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 4802
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 14428
|
|
}
|
|
],
|
|
"4222": [
|
|
{
|
|
"length": 32,
|
|
"start": 8405
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 14472
|
|
}
|
|
],
|
|
"4225": [
|
|
{
|
|
"length": 32,
|
|
"start": 14505
|
|
}
|
|
],
|
|
"4228": [
|
|
{
|
|
"length": 32,
|
|
"start": 8546
|
|
}
|
|
],
|
|
"4231": [
|
|
{
|
|
"length": 32,
|
|
"start": 8785
|
|
}
|
|
],
|
|
"4413": [
|
|
{
|
|
"length": 32,
|
|
"start": 6664
|
|
},
|
|
{
|
|
"length": 32,
|
|
"start": 14802
|
|
}
|
|
]
|
|
},
|
|
"linkReferences": {},
|
|
"object": "0x6080604052600436106101d85760003560e01c80639548088911610102578063b4658bfb11610095578063dd11d22511610064578063dd11d2251461055b578063f6274f661461057b578063f6e0f6a51461058e578063fe55a3ef146105ae576101d8565b8063b4658bfb146104f1578063d0a55fb014610511578063d925a56d14610531578063dab400f314610546576101d8565b8063a656186b116100d1578063a656186b14610462578063aa77476c14610482578063ad354eeb146104a2578063b09f1fb1146104d1576101d8565b806395480889146103ed5780639a4f809c1461040d5780639baa45a81461042d578063a0edcef51461044d576101d8565b8063414e4ccf1161017a5780637d49ec1a116101495780637d49ec1a1461037857806386a0c8d7146103985780638fd3ab80146103b85780639240529c146103da576101d8565b8063414e4ccf146102e6578063438cdfc514610307578063487b5c20146103345780636ae4b4f714610356576101d8565b80631fb09795116101b65780631fb097951461024a578063346693c51461027957806337f381d8146102a65780633cd2f026146102c6576101d8565b8063016a6d65146101dd578063031b905c146102135780630f0e8cf714610228575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046145ac565b6105ce565b60405161020a9190614b33565b60405180910390f35b34801561021f57600080fd5b506101fd6105e9565b34801561023457600080fd5b5061024861024336600461409a565b61060d565b005b34801561025657600080fd5b5061026a610265366004614414565b6106bc565b60405161020a93929190615099565b34801561028557600080fd5b506102996102943660046145ac565b6107b9565b60405161020a919061508b565b3480156102b257600080fd5b5061026a6102c13660046145c8565b610871565b3480156102d257600080fd5b506102486102e136600461402b565b610961565b6102f96102f43660046144bd565b610994565b60405161020a9291906151e4565b34801561031357600080fd5b506103276103223660046145fe565b610a3e565b60405161020a91906151c7565b34801561034057600080fd5b50610349610ad0565b60405161020a9190615215565b34801561036257600080fd5b5061036b610af4565b60405161020a9190614d71565b34801561038457600080fd5b506102486103933660046143f8565b610b2d565b3480156103a457600080fd5b506102486103b336600461409a565b610b95565b3480156103c457600080fd5b506103cd610c35565b60405161020a9190614cb5565b6103276103e8366004614472565b61105d565b3480156103f957600080fd5b506102996104083660046143f8565b611120565b34801561041957600080fd5b506102486104283660046143b8565b6111ab565b34801561043957600080fd5b5061024861044836600461420a565b611290565b34801561045957600080fd5b506103496112c0565b34801561046e57600080fd5b506102f961047d36600461463e565b6112e4565b34801561048e57600080fd5b506102f961049d3660046145fe565b611327565b3480156104ae57600080fd5b506104c26104bd3660046142a9565b611356565b60405161020a93929190614a8f565b3480156104dd57600080fd5b506102486104ec366004613f7c565b6115bc565b3480156104fd57600080fd5b506104c261050c366004614175565b6116d5565b34801561051d57600080fd5b5061024861052c3660046143b8565b611930565b34801561053d57600080fd5b506101fd611a06565b34801561055257600080fd5b506101fd611a2a565b34801561056757600080fd5b506101fd6105763660046143f8565b611a4e565b6102f9610589366004614472565b611a5c565b34801561059a57600080fd5b506102486105a936600461430b565b611afa565b3480156105ba57600080fd5b506102486105c93660046145ac565b611b2a565b60006105e16105dc83611b8e565b611cc5565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b8151835114801561061f575080518351145b61065e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e3e565b60405180910390fd5b60005b83518110156106b6576106ae84828151811061067957fe5b602002602001015184838151811061068d57fe5b60200260200101518484815181106106a157fe5b60200260200101516111ab565b600101610661565b50505050565b6106c4613c1a565b6000806106d085611120565b92506107616040518060a001604052808760a0015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250611d17565b835190925061077e906107793687900387018761469b565b611e40565b73ffffffffffffffffffffffffffffffffffffffff168560a0015173ffffffffffffffffffffffffffffffffffffffff161490509250925092565b6107c1613c1a565b6107ca826105ce565b815260006107d6611f97565b608084015173ffffffffffffffffffffffffffffffffffffffff90811660009081526002929092016020908152604080842087518416855282528084208288015190931684529190529020546060840151610100850151610120860151929350610844928592919085611fa4565b60c083015173ffffffffffffffffffffffffffffffffffffffff1661086b57600060208301525b50919050565b610879613c1a565b600080610885856107b9565b92506109166040518060a00160405280876080015173ffffffffffffffffffffffffffffffffffffffff168152602001876000015173ffffffffffffffffffffffffffffffffffffffff16815260200187604001516fffffffffffffffffffffffffffffffff16815260200187606001516fffffffffffffffffffffffffffffffff16815260200185815250611d17565b9150610926836000015185611e40565b73ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff161490509250925092565b60005b8181101561098f5761098783838381811061097b57fe5b90506020020135612095565b600101610964565b505050565b6000803330146109af576109af6109aa336122e3565b61239b565b6109b7613c3c565b610a246040518060a001604052808a8152602001898152602001886fffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152506123a3565b602081015160409091015190999098509650505050505050565b6000610a48613c3c565b610a548585853361274f565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161015610ac457610ac46109aa610a95876105ce565b83602001516fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff16612a82565b60400151949350505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6040518060400160405280600b81526020017f4c696d69744f726465727300000000000000000000000000000000000000000081525081565b6000610b3882611a4e565b90508160a0015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b8357610b836109aa82338560a00151612b40565b610b91818360a00151612b78565b5050565b81518351148015610ba7575080518351145b610bdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e3e565b60005b83518110156106b657610c2d848281518110610bf857fe5b6020026020010151848381518110610c0c57fe5b6020026020010151848481518110610c2057fe5b6020026020010151611930565b600101610be0565b6000610c607f3cd2f02600000000000000000000000000000000000000000000000000000000612beb565b610c897ff6274f6600000000000000000000000000000000000000000000000000000000612beb565b610cb27faa77476c00000000000000000000000000000000000000000000000000000000612beb565b610cdb7f9240529c00000000000000000000000000000000000000000000000000000000612beb565b610d047f438cdfc500000000000000000000000000000000000000000000000000000000612beb565b610d2d7f414e4ccf00000000000000000000000000000000000000000000000000000000612beb565b610d567fa656186b00000000000000000000000000000000000000000000000000000000612beb565b610d7f7f7d49ec1a00000000000000000000000000000000000000000000000000000000612beb565b610da87ffe55a3ef00000000000000000000000000000000000000000000000000000000612beb565b610dd17f9baa45a800000000000000000000000000000000000000000000000000000000612beb565b610dfa7ff6e0f6a500000000000000000000000000000000000000000000000000000000612beb565b610e237fd0a55fb000000000000000000000000000000000000000000000000000000000612beb565b610e4c7f86a0c8d700000000000000000000000000000000000000000000000000000000612beb565b610e757f9a4f809c00000000000000000000000000000000000000000000000000000000612beb565b610e9e7f0f0e8cf700000000000000000000000000000000000000000000000000000000612beb565b610ec77f9548088900000000000000000000000000000000000000000000000000000000612beb565b610ef07f346693c500000000000000000000000000000000000000000000000000000000612beb565b610f197fdd11d22500000000000000000000000000000000000000000000000000000000612beb565b610f427f016a6d6500000000000000000000000000000000000000000000000000000000612beb565b610f6b7f487b5c2000000000000000000000000000000000000000000000000000000000612beb565b610f947fb09f1fb100000000000000000000000000000000000000000000000000000000612beb565b610fbd7f1fb0979500000000000000000000000000000000000000000000000000000000612beb565b610fe67f37f381d800000000000000000000000000000000000000000000000000000000612beb565b61100f7fb4658bfb00000000000000000000000000000000000000000000000000000000612beb565b6110387fad354eeb00000000000000000000000000000000000000000000000000000000612beb565b507f2c64c5ef0000000000000000000000000000000000000000000000000000000090565b6000611067613c3c565b6110d46040518060a00160405280878152602001868152602001856fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506123a3565b9050826fffffffffffffffffffffffffffffffff1681602001516fffffffffffffffffffffffffffffffff161015611115576111156109aa610a9587611a4e565b8051610ac490612c77565b611128613c1a565b61113182611a4e565b8152600061113d611f97565b60a084015173ffffffffffffffffffffffffffffffffffffffff9081166000908152600192909201602090815260408084208751841685528252808420828801519093168452919052902054606084015161014085015161016086015192935061086b928592919085611fa4565b60006111b5611f97565b336000908152600282016020908152604080832073ffffffffffffffffffffffffffffffffffffffff898116855290835281842090881684529091529020549091508281111561120c5761120c6109aa8483612d1a565b336000818152600284016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a81168552908352818420908916845290915290819020859055517ffe7ffb1edfe79f4df716cb2dcad21cf2f31b104d816a7976ba1e6e4653c1efb19161128191889088908890614947565b60405180910390a15050505050565b60005b8151811015610b91576112b88282815181106112ab57fe5b6020026020010151610b2d565b600101611293565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000803330146112fa576112fa6109aa336122e3565b611302613c3c565b61130e8787878761274f565b6020810151604090910151909890975095505050505050565b600080611332613c3c565b61133e8686863361274f565b60208101516040909101519097909650945050505050565b60608080858414611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614d84565b8567ffffffffffffffff811180156113aa57600080fd5b506040519080825280602002602001820160405280156113e457816020015b6113d1613c1a565b8152602001906001900390816113c95790505b5092508567ffffffffffffffff811180156113fe57600080fd5b50604051908082528060200260200182016040528015611428578160200160208202803683370190505b5091508567ffffffffffffffff8111801561144257600080fd5b5060405190808252806020026020018201604052801561146c578160200160208202803683370190505b50905060005b868110156115b157306337f381d889898481811061148c57fe5b9050610140020188888581811061149f57fe5b9050608002016040518363ffffffff1660e01b81526004016114c29291906150cf565b60a06040518083038186803b1580156114da57600080fd5b505afa925050508015611528575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261152591810190614530565b60015b611531576115a9565b8287858151811061153e57fe5b60200260200101819052508186858151811061155657fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508085858151811061159557fe5b911515602092830291909101909101525050505b600101611472565b509450945094915050565b3332146115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614de1565b60006115ff611f97565b905060005b8351811015611694573360009081526003830160205260408120855185929087908590811061162f57fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101611604565b507f02dfead5eb769b298e82dd9650b31c40559a3d42701dbf53c931bc2682847c313384846040516116c89392919061497e565b60405180910390a1505050565b60608080858414611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614d84565b8567ffffffffffffffff8111801561172957600080fd5b5060405190808252806020026020018201604052801561176357816020015b611750613c1a565b8152602001906001900390816117485790505b5092508567ffffffffffffffff8111801561177d57600080fd5b506040519080825280602002602001820160405280156117a7578160200160208202803683370190505b5091508567ffffffffffffffff811180156117c157600080fd5b506040519080825280602002602001820160405280156117eb578160200160208202803683370190505b50905060005b868110156115b15730631fb0979589898481811061180b57fe5b9050610180020188888581811061181e57fe5b9050608002016040518363ffffffff1660e01b8152600401611841929190614f55565b60a06040518083038186803b15801561185957600080fd5b505afa9250505080156118a7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526118a491810190614530565b60015b6118b057611928565b828785815181106118bd57fe5b6020026020010181905250818685815181106118d557fe5b60200260200101906fffffffffffffffffffffffffffffffff1690816fffffffffffffffffffffffffffffffff16815250508085858151811061191457fe5b911515602092830291909101909101525050505b6001016117f1565b600061193a611f97565b336000908152600182016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8981168552908352818420908816845290915290205490915082811115611991576119916109aa8483612d1a565b336000818152600184016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a81168552908352818420908916845290915290819020859055517fa91fe7ae62fce669df2c7f880f8c14d178531aae72515558e5c948e37c32a5729161128191889088908890614947565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006105e16105dc83612dd5565b600080611a67613c3c565b611ad46040518060a00160405280888152602001878152602001866fffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506123a3565b9050611ae38160000151612c77565b602081015160409091015190969095509350505050565b60005b8151811015610b9157611b22828281518110611b1557fe5b6020026020010151611b2a565b600101611afd565b6000611b35826105ce565b9050816080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b8057611b806109aa82338560800151612b40565b610b91818360800151612b78565b60006040517fe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da98152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff166080820152608083015173ffffffffffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015161010082015261010083015167ffffffffffffffff166101208201526101208301516101408201526101608120915050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082604051602001611cfa9291906148bc565b604051602081830303815290604052805190602001209050919050565b600081604001516fffffffffffffffffffffffffffffffff1660001480611d52575060608201516fffffffffffffffffffffffffffffffff16155b15611d5f575060006105e4565b60018260800151602001516004811115611d7557fe5b14611d82575060006105e4565b6000611ddb8360800151604001518460600151036fffffffffffffffffffffffffffffffff1684606001516fffffffffffffffffffffffffffffffff1685604001516fffffffffffffffffffffffffffffffff16612f4c565b9050611df881611df385602001518660000151612f6a565b61309c565b9050611e39611e348285604001516fffffffffffffffffffffffffffffffff1686606001516fffffffffffffffffffffffffffffffff166130b2565b6130d6565b9392505050565b6000611e4c8383613102565b600282516003811115611e5b57fe5b1415611ec35760018383602001518460400151856060015160405160008152602001604052604051611e909493929190614c97565b6020604051602081039080840390855afa158015611eb2573d6000803e3d6000fd5b505050602060405103519050611f68565b600382516003811115611ed257fe5b1415611f685760007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005283601c52603c600020905060018184602001518560400151866060015160405160008152602001604052604051611f389493929190614c97565b6020604051602081039080840390855afa158015611f5a573d6000803e3d6000fd5b505050602060405103519150505b73ffffffffffffffffffffffffffffffffffffffff8116611f9157611f916109aa6005856131ae565b92915050565b600080611f9160076131e4565b6000611fae611f97565b865160009081526020829052604090819020546fffffffffffffffffffffffffffffffff808216928a0183905292935091871611612005576020870160025b90816004811115611ffa57fe5b81525050505061208e565b7f800000000000000000000000000000000000000000000000000000000000000081161561203857602087016003611fed565b504267ffffffffffffffff168467ffffffffffffffff1611612072576020860160045b9081600481111561206857fe5b815250505061208e565b828211156120855760208601600361205b565b50600160208601525b5050505050565b6040517f319bed9a00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063319bed9a9061210a908590600401614b33565b602060405180830381600087803b15801561212457600080fd5b505af1158015612138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215c919061439c565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016121b991906148f5565b60206040518083038186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220991906146b6565b9050600181111561098f576040517fa3b4a32700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a3b4a327906122ac90859081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff870190600401614916565b600060405180830381600087803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b50505050505050565b60607ff0ec779b0bcda6d84abf99ee2c67647d1100ebbb553a9c2d1c2ba1579592832c8260405160240161231791906148f5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b6123ab613c3c565b6123b3613c1a565b82516123be90611120565b90506001816020015160048111156123d257fe5b146123f7576123f76109aa8260000151836020015160048111156123f257fe5b6131ff565b825160c0015173ffffffffffffffffffffffffffffffffffffffff16158015906124595750826060015173ffffffffffffffffffffffffffffffffffffffff16836000015160c0015173ffffffffffffffffffffffffffffffffffffffff1614155b1561247c5761247c6109aa82600001518560600151866000015160c00151613235565b825160e0015173ffffffffffffffffffffffffffffffffffffffff16158015906124de5750826080015173ffffffffffffffffffffffffffffffffffffffff16836000015160e0015173ffffffffffffffffffffffffffffffffffffffff1614155b15612501576125016109aa82600001518560800151866000015160e0015161326d565b600061251582600001518560200151611e40565b9050836000015160a0015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612569578151845160a00151612569916109aa9184906132a5565b508251610120015161257a906132dd565b8252604080516101208101825282518152845160a09081015173ffffffffffffffffffffffffffffffffffffffff908116602080850191909152606080890151831685870152885151831681860152885190910151909116608084015286518401516fffffffffffffffffffffffffffffffff9081169284019290925286510151811660c083015285830151811660e083015291830151909116610100820152612623906133b2565b6fffffffffffffffffffffffffffffffff9081166040850152908116602084015283516080015116156126da576126a582602001516fffffffffffffffffffffffffffffffff168460000151606001516fffffffffffffffffffffffffffffffff168560000151608001516fffffffffffffffffffffffffffffffff16612f4c565b6fffffffffffffffffffffffffffffffff1660608084018290528451602081015191860151610100909101516126da9361352d565b8051835160a08101516060808701516101008401518451602080870151908a01516040808c0151968c01518c51610120909a015191517fab614d2b738543c0ea21f56347cf696a3a0c42a7cbec3212a5ca22a4dcff21249b6127419b909a99939091614b8c565b60405180910390a150919050565b612757613c3c565b61275f613c1a565b612768866107b9565b905060018160200151600481111561277c57fe5b1461279c5761279c6109aa8260000151836020015160048111156123f257fe5b60006127a6611f97565b60c088015190915073ffffffffffffffffffffffffffffffffffffffff16321480159061280a575060c087015173ffffffffffffffffffffffffffffffffffffffff166000908152600382016020908152604080832032845290915290205460ff16155b15612825576128256109aa8360000151328a60c00151613734565b5060a086015173ffffffffffffffffffffffffffffffffffffffff161580159061287f57508273ffffffffffffffffffffffffffffffffffffffff168660a0015173ffffffffffffffffffffffffffffffffffffffff1614155b1561289a5761289a6109aa8260000151858960a00151613235565b60006128aa826000015187611e40565b9050866080015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146128f9576128f96109aa8360000151838a608001516132a5565b506129fe60405180610120016040528083600001518152602001886080015173ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001886000015173ffffffffffffffffffffffffffffffffffffffff168152602001886020015173ffffffffffffffffffffffffffffffffffffffff16815260200188604001516fffffffffffffffffffffffffffffffff16815260200188606001516fffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff16815260200183604001516fffffffffffffffffffffffffffffffff168152506133b2565b6fffffffffffffffffffffffffffffffff9081166040808601829052929091166020808601829052845160808b01518b51928c015160e08d015196517f829fa99d94dc4636925b38632e625736a614c154d55006b7ab6bea979c210c3297612a7197949693958c95909492909190614c0c565b60405180910390a150949350505050565b60607f21948612b5ef214ec0508df4901600e07a810a371be76b25d59ade73826e3d97848484604051602401612aba93929190614c70565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b60607f88b2c08e4a5f57d416ad23dad18c20497ccfe684b1379b28fd564adaf582b80f848484604051602401612aba93929190614b60565b6000612b82611f97565b6000848152602082905260409081902080547f8000000000000000000000000000000000000000000000000000000000000000179055519091507fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba52753906116c89085908590614b3c565b6040517f6eb224cb0000000000000000000000000000000000000000000000000000000081523090636eb224cb90612c499084907f000000000000000000000000000000000000000000000000000000000000000090600401614ce2565b600060405180830381600087803b158015612c6357600080fd5b505af115801561208e573d6000803e3d6000fd5b8034118015612c865750333014155b15612d17576000612c97348361376c565b905060003373ffffffffffffffffffffffffffffffffffffffff1682604051612cbf906148f2565b60006040518083038185875af1925050503d8060008114612cfc576040519150601f19603f3d011682016040523d82523d6000602084013e612d01565b606091505b505090508061098f5761098f6109aa338461378b565b50565b60607fb12bc7e7d341f4431d6faf05f991ee3b779183e341b24243064e10c886cd18738383604051602401612d50929190615207565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b60006040517fce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d498152825173ffffffffffffffffffffffffffffffffffffffff166020820152602083015173ffffffffffffffffffffffffffffffffffffffff16604082015260408301516fffffffffffffffffffffffffffffffff16606082015260608301516fffffffffffffffffffffffffffffffff16608082015260808301516fffffffffffffffffffffffffffffffff1660a082015260a083015173ffffffffffffffffffffffffffffffffffffffff1660c082015260c083015173ffffffffffffffffffffffffffffffffffffffff1660e082015260e083015173ffffffffffffffffffffffffffffffffffffffff1661010082015261010083015173ffffffffffffffffffffffffffffffffffffffff1661012082015261012083015161014082015261014083015167ffffffffffffffff166101608201526101608301516101808201526101a08120915050919050565b6000612f6283612f5c86856137c1565b906137f2565b949350505050565b6000611e398373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612faa9291906149f0565b60206040518083038186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa91906146b6565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616906370a082319061304c9087906004016148f5565b60206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df391906146b6565b60008183106130ab5781611e39565b5090919050565b6000612f6283612f5c6130c682600161376c565b6130d088876137c1565b9061381c565b60006fffffffffffffffffffffffffffffffff8211156130fe576130fe6109aa600384613838565b5090565b60408101517ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141111580613159575060608101517f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a111155b1561316c5761316c6109aa6005846131ae565b60008151600381111561317b57fe5b141561318f5761318f6109aa6003846131ae565b60018151600381111561319e57fe5b1415610b9157610b916109aa6000845b60607ff18f11f3027e735c758137924b262d4d3aff0037dcd785aca3c699fa05d960bd8383604051602401612d50929190614d63565b600060808260078111156131f457fe5b600101901b92915050565b60607f47ab394e41470191eaf9fa542e84ac483a12665fbd616eb8d1c022ced6c940008383604051602401612d50929190614c86565b60607f5d3300180a4547b3e27137be832d3ebf56f1ba5ebb30dd580999c61f77fa6396848484604051602401612aba93929190614b60565b60607f15e6a383bb02d79ee933b927fbecba78cdde16cba84b94a99661f44bcce3b736848484604051602401612aba93929190614b60565b60607ff13e65d925201525f3d71a731833b19bb26e44cfbd97caf72a366b73866f7124848484604051602401612aba93929190614b60565b6000806132e8613855565b9050806132f95760009150506105e4565b600061330484613881565b905060008173ffffffffffffffffffffffffffffffffffffffff168360405161332c906148f2565b60006040518083038185875af1925050503d8060008114613369576040519150601f19603f3d011682016040523d82523d6000602084013e61336e565b606091505b50509050806133a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614ef8565b50909392505050565b6000806133f08360e001516133eb8561010001518660c001516fffffffffffffffffffffffffffffffff166138ce90919063ffffffff16565b61392f565b915061343b826fffffffffffffffffffffffffffffffff168460c001516fffffffffffffffffffffffffffffffff168560a001516fffffffffffffffffffffffffffffffff16612f4c565b90506fffffffffffffffffffffffffffffffff8216158061346c57506fffffffffffffffffffffffffffffffff8116155b1561347c57506000905080613528565b61010083015161349e906fffffffffffffffffffffffffffffffff1683613962565b6fffffffffffffffffffffffffffffffff166134b8611f97565b600001600085600001518152602001908152602001600020819055506134fe836080015184604001518560200151856fffffffffffffffffffffffffffffffff1661352d565b613528836060015184602001518560400151846fffffffffffffffffffffffffffffffff1661352d565b915091565b6000606073ffffffffffffffffffffffffffffffffffffffff8616301415613581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065590614e9b565b61358a866139b7565b1561365e576040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e906135e590899030906004016149f0565b60206040518083038186803b1580156135fd57600080fd5b505afa158015613611573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363591906146b6565b101561365e5761365786868686604051806020016040528060008152506139f7565b50506106b6565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015273ffffffffffffffffffffffffffffffffffffffff85166024820152836044820152600080606483600073ffffffffffffffffffffffffffffffffffffffff8c165af192503d806000602084013e60016020830151146020821015168115178416935083613718578082528192508060208301016040525b50508161372c5761372c86868686856139f7565b505050505050565b60607fc0972f3cc4234ca2091de7e7bc7081494bd29ac280167d66f0d44168973b1634848484604051602401612aba93929190614b60565b600082821115613785576137856109aa60028585613abf565b50900390565b60607fbde95cc2119e0200d80642397198abfcf98e6e4dddd0de9c6320d86252ad40ab8383604051602401612d50929190614a69565b6000826137d057506000611f91565b828202828482816137dd57fe5b0414611e3957611e396109aa60018686613abf565b600081613808576138086109aa60038585613abf565b600082848161381357fe5b04949350505050565b600082820183811015611e3957611e396109aa60008686613abf565b606063c996af7b60e01b8383604051602401612d50929190614d4c565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000163a0290565b60006105e17f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000084613ade565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161115613785576137856109aa6002856fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff16613abf565b6000816fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff16106130ab5781611e39565b60008282016fffffffffffffffffffffffffffffffff8085169082161015611e3957611e396109aa6000866fffffffffffffffffffffffffffffffff16866fffffffffffffffffffffffffffffffff16613abf565b600081815260209020600160ff92831681901b929091161b177f000000000000000000000000000000000000000000000000000000000000000081161490565b6040517f89dd02e700000000000000000000000000000000000000000000000000000000815230906389dd02e790613a39908890889088908890600401614947565b600060405180830381600087803b158015613a5357600080fd5b505af1925050508015613a64575060015b61208e573d808015613a92576040519150601f19603f3d011682016040523d82523d6000602084013e613a97565b606091505b50613ab96109aa87878787875160001415613ab25786613ab4565b875b613b56565b5061208e565b606063e946c1bb60e01b848484604051602401612aba93929190614d2a565b604051600090613b18907fff0000000000000000000000000000000000000000000000000000000000000090869085908790602001614858565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b60607fdfdc6f57cf82bede92bcfdd44fedb82b2d5cecabf56ec21964db6ee2c3e82cf48686868686604051602401613b92959493929190614a17565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905095945050505050565b6040805160608101909152600080825260208201908152600060209091015290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b8035611f91816152aa565b600082601f830112613c7e578081fd5b8135613c91613c8c8261524d565b615226565b818152915060208083019084810181840286018201871015613cb257600080fd5b60005b84811015613cda578135613cc8816152aa565b84529282019290820190600101613cb5565b505050505092915050565b60008083601f840112613cf6578182fd5b50813567ffffffffffffffff811115613d0d578182fd5b602083019150836020608083028501011115613d2857600080fd5b9250929050565b8035611f91816152cc565b6000610180808385031215613d4d578182fd5b613d5681615226565b915050613d638383613c63565b8152613d728360208401613c63565b6020820152613d848360408401613f48565b6040820152613d968360608401613f48565b6060820152613da88360808401613f48565b6080820152613dba8360a08401613c63565b60a0820152613dcc8360c08401613c63565b60c0820152613dde8360e08401613c63565b60e0820152610100613df284828501613c63565b908201526101208281013590820152610140613e1084828501613f53565b818301525061016080830135818301525092915050565b6000610140808385031215613e3a578182fd5b613e4381615226565b915050613e508383613c63565b8152613e5f8360208401613c63565b6020820152613e718360408401613f48565b6040820152613e838360608401613f48565b6060820152613e958360808401613c63565b6080820152613ea78360a08401613c63565b60a0820152613eb98360c08401613c63565b60c082015260e082013560e0820152610100613ed784828501613f53565b818301525061012080830135818301525092915050565b600060808284031215613eff578081fd5b613f096080615226565b9050813560048110613f1a57600080fd5b8152613f298360208401613f6b565b6020820152604082013560408201526060820135606082015292915050565b8035611f91816152da565b803567ffffffffffffffff81168114611f9157600080fd5b803560ff81168114611f9157600080fd5b60008060408385031215613f8e578182fd5b823567ffffffffffffffff811115613fa4578283fd5b8301601f81018513613fb4578283fd5b8035613fc2613c8c8261524d565b808282526020808301925080850189828387028801011115613fe2578788fd5b8795505b8486101561400d578035613ff9816152aa565b845260019590950194928101928101613fe6565b5081965061401d89828a01613d2f565b955050505050509250929050565b6000806020838503121561403d578182fd5b823567ffffffffffffffff80821115614054578384fd5b818501915085601f830112614067578384fd5b813581811115614075578485fd5b8660208083028501011115614088578485fd5b60209290920196919550909350505050565b6000806000606084860312156140ae578081fd5b833567ffffffffffffffff808211156140c5578283fd5b6140d187838801613c6e565b94506020915081860135818111156140e7578384fd5b6140f388828901613c6e565b945050604086013581811115614107578384fd5b86019050601f81018713614119578283fd5b8035614127613c8c8261524d565b81815283810190838501858402850186018b1015614143578687fd5b8694505b83851015614165578035835260019490940193918501918501614147565b5080955050505050509250925092565b6000806000806040858703121561418a578182fd5b843567ffffffffffffffff808211156141a1578384fd5b818701915087601f8301126141b4578384fd5b8135818111156141c2578485fd5b886020610180830285010111156141d7578485fd5b6020928301965094509086013590808211156141f1578384fd5b506141fe87828801613ce5565b95989497509550505050565b6000602080838503121561421c578182fd5b823567ffffffffffffffff811115614232578283fd5b8301601f81018513614242578283fd5b8035614250613c8c8261524d565b81815283810190838501610180808502860187018a101561426f578788fd5b8795505b8486101561429b576142858a83613d3a565b8452600195909501949286019290810190614273565b509098975050505050505050565b600080600080604085870312156142be578182fd5b843567ffffffffffffffff808211156142d5578384fd5b818701915087601f8301126142e8578384fd5b8135818111156142f6578485fd5b886020610140830285010111156141d7578485fd5b6000602080838503121561431d578182fd5b823567ffffffffffffffff811115614333578283fd5b8301601f81018513614343578283fd5b8035614351613c8c8261524d565b81815283810190838501610140808502860187018a1015614370578788fd5b8795505b8486101561429b576143868a83613e27565b8452600195909501949286019290810190614374565b6000602082840312156143ad578081fd5b8151611e39816152aa565b6000806000606084860312156143cc578081fd5b83356143d7816152aa565b925060208401356143e7816152aa565b929592945050506040919091013590565b6000610180828403121561440a578081fd5b611e398383613d3a565b600080828403610200811215614428578283fd5b6144328585613d3a565b925060807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8082011215614463578182fd5b50610180830190509250929050565b60008060006102208486031215614487578081fd5b6144918585613d3a565b92506144a1856101808601613eee565b91506102008401356144b2816152da565b809150509250925092565b600080600080600061026086880312156144d5578283fd5b6144df8787613d3a565b94506144ef876101808801613eee565b9350610200860135614500816152da565b9250610220860135614511816152aa565b9150610240860135614522816152aa565b809150509295509295909350565b600080600083850360a0811215614545578182fd5b6060811215614552578182fd5b5061455d6060615226565b84518152602085015160058110614572578283fd5b60208201526040850151614585816152da565b6040820152606085015190935061459b816152da565b60808501519092506144b2816152cc565b600061014082840312156145be578081fd5b611e398383613e27565b6000806101c083850312156145db578182fd5b6145e58484613e27565b91506145f5846101408501613eee565b90509250929050565b60008060006101e08486031215614613578081fd5b61461d8585613e27565b925061462d856101408601613eee565b91506101c08401356144b2816152da565b6000806000806102008587031215614654578182fd5b61465e8686613e27565b935061466e866101408701613eee565b92506101c085013561467f816152da565b91506101e0850135614690816152aa565b939692955090935050565b6000608082840312156146ac578081fd5b611e398383613eee565b6000602082840312156146c7578081fd5b5051919050565b60006146da83836147bb565b505060600190565b6fffffffffffffffffffffffffffffffff16815260200190565b73ffffffffffffffffffffffffffffffffffffffff169052565b6000815180845260208085019450808401835b83811015614747578151151587529582019590820190600101614729565b509495945050505050565b60008151808452815b818110156147775760208185018101518683018201520161475b565b818111156147885782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151600581106147ce57fe5b60208301526040908101516fffffffffffffffffffffffffffffffff16910152565b8035600481106147ff57600080fd5b614808816152a0565b82526040810160ff61481d8260208501613f6b565b166020840152356040830152606090810135910152565b6fffffffffffffffffffffffffffffffff169052565b67ffffffffffffffff169052565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b90565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b60006060820173ffffffffffffffffffffffffffffffffffffffff808716845260206060818601528287518085526080870191508289019450855b818110156149d75785518516835294830194918301916001016149b9565b5050809450505050508215156040830152949350505050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352808716602084015280861660408401525083606083015260a06080830152614a5e60a0830184614752565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60006060820160608352808651614aa68184614b33565b915060209250828801845b82811015614ad257614ac48483516146ce565b935090840190600101614ab1565b50505083810382850152808651614ae98184614b33565b91508388019250845b81811015614b1357614b058385516146e2565b938501939250600101614af2565b50508481036040860152614b278187614716565b98975050505050505050565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b9a8b5273ffffffffffffffffffffffffffffffffffffffff998a1660208c015297891660408b015295881660608a015293871660808901529190951660a08701526fffffffffffffffffffffffffffffffff94851660c0870152841660e08601529092166101008401526101208301919091526101408201526101600190565b97885273ffffffffffffffffffffffffffffffffffffffff968716602089015294861660408801529285166060870152931660808501526fffffffffffffffffffffffffffffffff92831660a085015290911660c083015260e08201526101000190565b9283526020830191909152604082015260600190565b91825260ff16602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6060810160048510614d3857fe5b938152602081019290925260409091015290565b60408101614d59846152a0565b9281526020015290565b6040810160068410614d5957fe5b600060208252611e396020830184614752565b6020808252602c908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f4160408201527f525241595f4c454e475448530000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f4e61746976654f7264657273466561747572652f4e4f5f434f4e54524143545f60408201527f4f524947494e5300000000000000000000000000000000000000000000000000606082015260800190565b60208082526038908201527f4e61746976654f7264657273466561747572652f4d49534d4154434845445f5060408201527f4149525f4f52444552535f41525241595f4c454e475448530000000000000000606082015260800190565b60208082526024908201527f466978696e546f6b656e5370656e6465722f43414e4e4f545f494e564f4b455f60408201527f53454c4600000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f466978696e50726f746f636f6c466565732f45544845525f5452414e5346455260408201527f5f46414c49454400000000000000000000000000000000000000000000000000606082015260800190565b610200810160208401614f7183614f6c8388613c63565b6146fc565b614f7b818661526d565b9050614f8a60208401826146fc565b50614f98604085018561527a565b614fa56040840182614834565b50614fb3606085018561527a565b614fc06060840182614834565b50614fce608085018561527a565b614fdb6080840182614834565b50614fe960a085018561526d565b614ff660a08401826146fc565b5061500460c085018561526d565b61501160c08401826146fc565b5061501f60e085018561526d565b61502c60e08401826146fc565b5061010061503c8186018661526d565b615048828501826146fc565b5050610120848101359083015261014061506481860186615287565b6150708285018261484a565b50506101608481013590830152611e396101808301846147f0565b60608101611f9182846147bb565b60a081016150a782866147bb565b6fffffffffffffffffffffffffffffffff841660608301528215156080830152949350505050565b6101c08101602084016150e683614f6c8388613c63565b6150f0818661526d565b90506150ff60208401826146fc565b5061510d604085018561527a565b61511a6040840182614834565b50615128606085018561527a565b6151356060840182614834565b50615143608085018561526d565b61515060808401826146fc565b5061515e60a085018561526d565b61516b60a08401826146fc565b5061517960c085018561526d565b61518660c08401826146fc565b5060e084013560e08301526101006151a081860186615287565b6151ac8285018261484a565b50506101208481013590830152611e396101408301846147f0565b6fffffffffffffffffffffffffffffffff91909116815260200190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b918252602082015260400190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561524557600080fd5b604052919050565b600067ffffffffffffffff821115615263578081fd5b5060209081020190565b60008235611e39816152aa565b60008235611e39816152da565b6000823567ffffffffffffffff81168114611e39578182fd5b60048110612d1757fe5b73ffffffffffffffffffffffffffffffffffffffff81168114612d1757600080fd5b8015158114612d1757600080fd5b6fffffffffffffffffffffffffffffffff81168114612d1757600080fdfea26469706673582212207be86ebfe95c4272ef9fd60e01d1026d9fd06dd80ea122231fa85912daab50c564736f6c634300060c0033",
|
|
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1D8 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x95480889 GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xB4658BFB GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xDD11D225 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xDD11D225 EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0xF6274F66 EQ PUSH2 0x57B JUMPI DUP1 PUSH4 0xF6E0F6A5 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0xFE55A3EF EQ PUSH2 0x5AE JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xB4658BFB EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xD0A55FB0 EQ PUSH2 0x511 JUMPI DUP1 PUSH4 0xD925A56D EQ PUSH2 0x531 JUMPI DUP1 PUSH4 0xDAB400F3 EQ PUSH2 0x546 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xA656186B GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0xA656186B EQ PUSH2 0x462 JUMPI DUP1 PUSH4 0xAA77476C EQ PUSH2 0x482 JUMPI DUP1 PUSH4 0xAD354EEB EQ PUSH2 0x4A2 JUMPI DUP1 PUSH4 0xB09F1FB1 EQ PUSH2 0x4D1 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x95480889 EQ PUSH2 0x3ED JUMPI DUP1 PUSH4 0x9A4F809C EQ PUSH2 0x40D JUMPI DUP1 PUSH4 0x9BAA45A8 EQ PUSH2 0x42D JUMPI DUP1 PUSH4 0xA0EDCEF5 EQ PUSH2 0x44D JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x414E4CCF GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x7D49EC1A GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x7D49EC1A EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x86A0C8D7 EQ PUSH2 0x398 JUMPI DUP1 PUSH4 0x8FD3AB80 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x9240529C EQ PUSH2 0x3DA JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x414E4CCF EQ PUSH2 0x2E6 JUMPI DUP1 PUSH4 0x438CDFC5 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x487B5C20 EQ PUSH2 0x334 JUMPI DUP1 PUSH4 0x6AE4B4F7 EQ PUSH2 0x356 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x1FB09795 GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x1FB09795 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0x346693C5 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x37F381D8 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0x3CD2F026 EQ PUSH2 0x2C6 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x16A6D65 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x31B905C EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0xF0E8CF7 EQ PUSH2 0x228 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4B33 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x5E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x243 CALLDATASIZE PUSH1 0x4 PUSH2 0x409A JUMP JUMPDEST PUSH2 0x60D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x4414 JUMP JUMPDEST PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5099 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x299 PUSH2 0x294 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x508B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x2C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x45C8 JUMP JUMPDEST PUSH2 0x871 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x2E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x402B JUMP JUMPDEST PUSH2 0x961 JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x2F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x44BD JUMP JUMPDEST PUSH2 0x994 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP3 SWAP2 SWAP1 PUSH2 0x51E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x327 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x45FE JUMP JUMPDEST PUSH2 0xA3E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x51C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x349 PUSH2 0xAD0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x5215 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x36B PUSH2 0xAF4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4D71 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0xB2D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x3B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x409A JUMP JUMPDEST PUSH2 0xB95 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CD PUSH2 0xC35 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP2 SWAP1 PUSH2 0x4CB5 JUMP JUMPDEST PUSH2 0x327 PUSH2 0x3E8 CALLDATASIZE PUSH1 0x4 PUSH2 0x4472 JUMP JUMPDEST PUSH2 0x105D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x299 PUSH2 0x408 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0x1120 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x419 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x428 CALLDATASIZE PUSH1 0x4 PUSH2 0x43B8 JUMP JUMPDEST PUSH2 0x11AB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x439 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x448 CALLDATASIZE PUSH1 0x4 PUSH2 0x420A JUMP JUMPDEST PUSH2 0x1290 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x459 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x349 PUSH2 0x12C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH2 0x47D CALLDATASIZE PUSH1 0x4 PUSH2 0x463E JUMP JUMPDEST PUSH2 0x12E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH2 0x49D CALLDATASIZE PUSH1 0x4 PUSH2 0x45FE JUMP JUMPDEST PUSH2 0x1327 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4C2 PUSH2 0x4BD CALLDATASIZE PUSH1 0x4 PUSH2 0x42A9 JUMP JUMPDEST PUSH2 0x1356 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x20A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4A8F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x4EC CALLDATASIZE PUSH1 0x4 PUSH2 0x3F7C JUMP JUMPDEST PUSH2 0x15BC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4C2 PUSH2 0x50C CALLDATASIZE PUSH1 0x4 PUSH2 0x4175 JUMP JUMPDEST PUSH2 0x16D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x52C CALLDATASIZE PUSH1 0x4 PUSH2 0x43B8 JUMP JUMPDEST PUSH2 0x1930 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1A06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1A2A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x576 CALLDATASIZE PUSH1 0x4 PUSH2 0x43F8 JUMP JUMPDEST PUSH2 0x1A4E JUMP JUMPDEST PUSH2 0x2F9 PUSH2 0x589 CALLDATASIZE PUSH1 0x4 PUSH2 0x4472 JUMP JUMPDEST PUSH2 0x1A5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x5A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x430B JUMP JUMPDEST PUSH2 0x1AFA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH2 0x5C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x45AC JUMP JUMPDEST PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH2 0x5DC DUP4 PUSH2 0x1B8E JUMP JUMPDEST PUSH2 0x1CC5 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x61F JUMPI POP DUP1 MLOAD DUP4 MLOAD EQ JUMPDEST PUSH2 0x65E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E3E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x6B6 JUMPI PUSH2 0x6AE DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x679 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x68D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x6A1 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x11AB JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x661 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6C4 PUSH2 0x3C1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x6D0 DUP6 PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP PUSH2 0x761 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE POP PUSH2 0x1D17 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP3 POP PUSH2 0x77E SWAP1 PUSH2 0x779 CALLDATASIZE DUP8 SWAP1 SUB DUP8 ADD DUP8 PUSH2 0x469B JUMP JUMPDEST PUSH2 0x1E40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x7C1 PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x7CA DUP3 PUSH2 0x5CE JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH2 0x7D6 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP8 MLOAD DUP5 AND DUP6 MSTORE DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP3 DUP9 ADD MLOAD SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x100 DUP6 ADD MLOAD PUSH2 0x120 DUP7 ADD MLOAD SWAP3 SWAP4 POP PUSH2 0x844 SWAP3 DUP6 SWAP3 SWAP2 SWAP1 DUP6 PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x86B JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x879 PUSH2 0x3C1A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x885 DUP6 PUSH2 0x7B9 JUMP JUMPDEST SWAP3 POP PUSH2 0x916 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE POP PUSH2 0x1D17 JUMP JUMPDEST SWAP2 POP PUSH2 0x926 DUP4 PUSH1 0x0 ADD MLOAD DUP6 PUSH2 0x1E40 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x98F JUMPI PUSH2 0x987 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x97B JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x2095 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x964 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER ADDRESS EQ PUSH2 0x9AF JUMPI PUSH2 0x9AF PUSH2 0x9AA CALLER PUSH2 0x22E3 JUMP JUMPDEST PUSH2 0x239B JUMP JUMPDEST PUSH2 0x9B7 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0xA24 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP10 SWAP1 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA48 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0xA54 DUP6 DUP6 DUP6 CALLER PUSH2 0x274F JUMP JUMPDEST SWAP1 POP DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0xAC4 JUMPI PUSH2 0xAC4 PUSH2 0x9AA PUSH2 0xA95 DUP8 PUSH2 0x5CE JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2A82 JUMP JUMPDEST PUSH1 0x40 ADD MLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xB DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4C696D69744F7264657273000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB38 DUP3 PUSH2 0x1A4E JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xB83 JUMPI PUSH2 0xB83 PUSH2 0x9AA DUP3 CALLER DUP6 PUSH1 0xA0 ADD MLOAD PUSH2 0x2B40 JUMP JUMPDEST PUSH2 0xB91 DUP2 DUP4 PUSH1 0xA0 ADD MLOAD PUSH2 0x2B78 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xBA7 JUMPI POP DUP1 MLOAD DUP4 MLOAD EQ JUMPDEST PUSH2 0xBDD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E3E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x6B6 JUMPI PUSH2 0xC2D DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0xBF8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0xC0C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0xC20 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1930 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBE0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC60 PUSH32 0x3CD2F02600000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xC89 PUSH32 0xF6274F6600000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xCB2 PUSH32 0xAA77476C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xCDB PUSH32 0x9240529C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD04 PUSH32 0x438CDFC500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD2D PUSH32 0x414E4CCF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD56 PUSH32 0xA656186B00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xD7F PUSH32 0x7D49EC1A00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDA8 PUSH32 0xFE55A3EF00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDD1 PUSH32 0x9BAA45A800000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xDFA PUSH32 0xF6E0F6A500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE23 PUSH32 0xD0A55FB000000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE4C PUSH32 0x86A0C8D700000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE75 PUSH32 0x9A4F809C00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xE9E PUSH32 0xF0E8CF700000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xEC7 PUSH32 0x9548088900000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xEF0 PUSH32 0x346693C500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF19 PUSH32 0xDD11D22500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF42 PUSH32 0x16A6D6500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF6B PUSH32 0x487B5C2000000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xF94 PUSH32 0xB09F1FB100000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xFBD PUSH32 0x1FB0979500000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0xFE6 PUSH32 0x37F381D800000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x100F PUSH32 0xB4658BFB00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x1038 PUSH32 0xAD354EEB00000000000000000000000000000000000000000000000000000000 PUSH2 0x2BEB JUMP JUMPDEST POP PUSH32 0x2C64C5EF00000000000000000000000000000000000000000000000000000000 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1067 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x10D4 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST SWAP1 POP DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT ISZERO PUSH2 0x1115 JUMPI PUSH2 0x1115 PUSH2 0x9AA PUSH2 0xA95 DUP8 PUSH2 0x1A4E JUMP JUMPDEST DUP1 MLOAD PUSH2 0xAC4 SWAP1 PUSH2 0x2C77 JUMP JUMPDEST PUSH2 0x1128 PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x1131 DUP3 PUSH2 0x1A4E JUMP JUMPDEST DUP2 MSTORE PUSH1 0x0 PUSH2 0x113D PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP8 MLOAD DUP5 AND DUP6 MSTORE DUP3 MSTORE DUP1 DUP5 KECCAK256 DUP3 DUP9 ADD MLOAD SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x60 DUP5 ADD MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP3 SWAP4 POP PUSH2 0x86B SWAP3 DUP6 SWAP3 SWAP2 SWAP1 DUP6 PUSH2 0x1FA4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11B5 PUSH2 0x1F97 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP DUP3 DUP2 GT ISZERO PUSH2 0x120C JUMPI PUSH2 0x120C PUSH2 0x9AA DUP5 DUP4 PUSH2 0x2D1A JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 DUP5 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0xFE7FFB1EDFE79F4DF716CB2DCAD21CF2F31B104D816A7976BA1E6E4653C1EFB1 SWAP2 PUSH2 0x1281 SWAP2 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4947 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xB91 JUMPI PUSH2 0x12B8 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x12AB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0xB2D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1293 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER ADDRESS EQ PUSH2 0x12FA JUMPI PUSH2 0x12FA PUSH2 0x9AA CALLER PUSH2 0x22E3 JUMP JUMPDEST PUSH2 0x1302 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x130E DUP8 DUP8 DUP8 DUP8 PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP9 SWAP1 SWAP8 POP SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1332 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x133E DUP7 DUP7 DUP7 CALLER PUSH2 0x274F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP6 DUP5 EQ PUSH2 0x1393 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4D84 JUMP JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x13AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x13E4 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x13D1 PUSH2 0x3C1A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x13C9 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x13FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1428 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1442 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x146C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15B1 JUMPI ADDRESS PUSH4 0x37F381D8 DUP10 DUP10 DUP5 DUP2 DUP2 LT PUSH2 0x148C JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x140 MUL ADD DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x149F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x80 MUL ADD PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x14C2 SWAP3 SWAP2 SWAP1 PUSH2 0x50CF JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x1528 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x1525 SWAP2 DUP2 ADD SWAP1 PUSH2 0x4530 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x1531 JUMPI PUSH2 0x15A9 JUMP JUMPDEST DUP3 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x153E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP2 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1556 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP6 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1595 JUMPI INVALID JUMPDEST SWAP2 ISZERO ISZERO PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1472 JUMP JUMPDEST POP SWAP5 POP SWAP5 POP SWAP5 SWAP2 POP POP JUMP JUMPDEST CALLER ORIGIN EQ PUSH2 0x15F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4DE1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15FF PUSH2 0x1F97 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x1694 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP6 MLOAD DUP6 SWAP3 SWAP1 DUP8 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x162F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 ADD PUSH2 0x1604 JUMP JUMPDEST POP PUSH32 0x2DFEAD5EB769B298E82DD9650B31C40559A3D42701DBF53C931BC2682847C31 CALLER DUP5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x16C8 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x497E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP1 DUP6 DUP5 EQ PUSH2 0x1712 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4D84 JUMP JUMPDEST DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1729 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1763 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x1750 PUSH2 0x3C1A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1748 JUMPI SWAP1 POP JUMPDEST POP SWAP3 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x177D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A7 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP6 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x17C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17EB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15B1 JUMPI ADDRESS PUSH4 0x1FB09795 DUP10 DUP10 DUP5 DUP2 DUP2 LT PUSH2 0x180B JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x180 MUL ADD DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x181E JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x80 MUL ADD PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1841 SWAP3 SWAP2 SWAP1 PUSH2 0x4F55 JUMP JUMPDEST PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1859 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x18A7 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND DUP3 ADD SWAP1 SWAP3 MSTORE PUSH2 0x18A4 SWAP2 DUP2 ADD SWAP1 PUSH2 0x4530 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH2 0x18B0 JUMPI PUSH2 0x1928 JUMP JUMPDEST DUP3 DUP8 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x18BD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 SWAP1 MSTORE POP DUP2 DUP7 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x18D5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP6 DUP6 DUP2 MLOAD DUP2 LT PUSH2 0x1914 JUMPI INVALID JUMPDEST SWAP2 ISZERO ISZERO PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE POP POP POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x17F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x193A PUSH2 0x1F97 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP DUP3 DUP2 GT ISZERO PUSH2 0x1991 JUMPI PUSH2 0x1991 PUSH2 0x9AA DUP5 DUP4 PUSH2 0x2D1A JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 DUP2 AND DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 SWAP1 DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0xA91FE7AE62FCE669DF2C7F880F8C14D178531AAE72515558E5C948E37C32A572 SWAP2 PUSH2 0x1281 SWAP2 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x4947 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH2 0x5DC DUP4 PUSH2 0x2DD5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A67 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x1AD4 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x23A3 JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE3 DUP2 PUSH1 0x0 ADD MLOAD PUSH2 0x2C77 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x40 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0xB91 JUMPI PUSH2 0x1B22 DUP3 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1B15 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x1B2A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1AFD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B35 DUP3 PUSH2 0x5CE JUMP JUMPDEST SWAP1 POP DUP2 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1B80 JUMPI PUSH2 0x1B80 PUSH2 0x9AA DUP3 CALLER DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x2B40 JUMP JUMPDEST PUSH2 0xB91 DUP2 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x2B78 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0xE593D3FDFA8B60E5E17A1B2204662ECBE15C23F2084B9AD5BAE40359540A7DA9 DUP2 MSTORE DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x160 DUP2 KECCAK256 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1CFA SWAP3 SWAP2 SWAP1 PUSH2 0x48BC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 EQ DUP1 PUSH2 0x1D52 JUMPI POP PUSH1 0x60 DUP3 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO JUMPDEST ISZERO PUSH2 0x1D5F JUMPI POP PUSH1 0x0 PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x80 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1D75 JUMPI INVALID JUMPDEST EQ PUSH2 0x1D82 JUMPI POP PUSH1 0x0 PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DDB DUP4 PUSH1 0x80 ADD MLOAD PUSH1 0x40 ADD MLOAD DUP5 PUSH1 0x60 ADD MLOAD SUB PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST SWAP1 POP PUSH2 0x1DF8 DUP2 PUSH2 0x1DF3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0x2F6A JUMP JUMPDEST PUSH2 0x309C JUMP JUMPDEST SWAP1 POP PUSH2 0x1E39 PUSH2 0x1E34 DUP3 DUP6 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x30B2 JUMP JUMPDEST PUSH2 0x30D6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E4C DUP4 DUP4 PUSH2 0x3102 JUMP JUMPDEST PUSH1 0x2 DUP3 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1E5B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1EC3 JUMPI PUSH1 0x1 DUP4 DUP4 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1E90 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C97 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EB2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP1 POP PUSH2 0x1F68 JUMP JUMPDEST PUSH1 0x3 DUP3 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1ED2 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1F68 JUMPI PUSH1 0x0 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x0 MSTORE DUP4 PUSH1 0x1C MSTORE PUSH1 0x3C PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x1F38 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C97 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F5A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP2 POP POP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1F91 JUMPI PUSH2 0x1F91 PUSH2 0x9AA PUSH1 0x5 DUP6 PUSH2 0x31AE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1F91 PUSH1 0x7 PUSH2 0x31E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1FAE PUSH2 0x1F97 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP3 AND SWAP3 DUP11 ADD DUP4 SWAP1 MSTORE SWAP3 SWAP4 POP SWAP2 DUP8 AND GT PUSH2 0x2005 JUMPI PUSH1 0x20 DUP8 ADD PUSH1 0x2 JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x1FFA JUMPI INVALID JUMPDEST DUP2 MSTORE POP POP POP POP PUSH2 0x208E JUMP JUMPDEST PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 DUP2 AND ISZERO PUSH2 0x2038 JUMPI PUSH1 0x20 DUP8 ADD PUSH1 0x3 PUSH2 0x1FED JUMP JUMPDEST POP TIMESTAMP PUSH8 0xFFFFFFFFFFFFFFFF AND DUP5 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x2072 JUMPI PUSH1 0x20 DUP7 ADD PUSH1 0x4 JUMPDEST SWAP1 DUP2 PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x2068 JUMPI INVALID JUMPDEST DUP2 MSTORE POP POP POP PUSH2 0x208E JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x2085 JUMPI PUSH1 0x20 DUP7 ADD PUSH1 0x3 PUSH2 0x205B JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x20 DUP7 ADD MSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x319BED9A00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0x319BED9A SWAP1 PUSH2 0x210A SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B33 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2138 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x215C SWAP2 SWAP1 PUSH2 0x439C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x21B9 SWAP2 SWAP1 PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x21E5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2209 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT ISZERO PUSH2 0x98F JUMPI PUSH1 0x40 MLOAD PUSH32 0xA3B4A32700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH32 0x0 AND SWAP1 PUSH4 0xA3B4A327 SWAP1 PUSH2 0x22AC SWAP1 DUP6 SWAP1 DUP2 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 ADD SWAP1 PUSH1 0x4 ADD PUSH2 0x4916 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22DA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xF0EC779B0BCDA6D84ABF99EE2C67647D1100EBBB553A9C2D1C2BA1579592832C DUP3 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2317 SWAP2 SWAP1 PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH2 0x23AB PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x23B3 PUSH2 0x3C1A JUMP JUMPDEST DUP3 MLOAD PUSH2 0x23BE SWAP1 PUSH2 0x1120 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23D2 JUMPI INVALID JUMPDEST EQ PUSH2 0x23F7 JUMPI PUSH2 0x23F7 PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23F2 JUMPI INVALID JUMPDEST PUSH2 0x31FF JUMP JUMPDEST DUP3 MLOAD PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2459 JUMPI POP DUP3 PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xC0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x247C JUMPI PUSH2 0x247C PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0xC0 ADD MLOAD PUSH2 0x3235 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x24DE JUMPI POP DUP3 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x2501 JUMPI PUSH2 0x2501 PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x80 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x326D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2515 DUP3 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x1E40 JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x0 ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2569 JUMPI DUP2 MLOAD DUP5 MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0x2569 SWAP2 PUSH2 0x9AA SWAP2 DUP5 SWAP1 PUSH2 0x32A5 JUMP JUMPDEST POP DUP3 MLOAD PUSH2 0x120 ADD MLOAD PUSH2 0x257A SWAP1 PUSH2 0x32DD JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH2 0x120 DUP2 ADD DUP3 MSTORE DUP3 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0xA0 SWAP1 DUP2 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP1 DUP10 ADD MLOAD DUP4 AND DUP6 DUP8 ADD MSTORE DUP9 MLOAD MLOAD DUP4 AND DUP2 DUP7 ADD MSTORE DUP9 MLOAD SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP2 AND PUSH1 0x80 DUP5 ADD MSTORE DUP7 MLOAD DUP5 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP3 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP7 MLOAD ADD MLOAD DUP2 AND PUSH1 0xC0 DUP4 ADD MSTORE DUP6 DUP4 ADD MLOAD DUP2 AND PUSH1 0xE0 DUP4 ADD MSTORE SWAP2 DUP4 ADD MLOAD SWAP1 SWAP2 AND PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x2623 SWAP1 PUSH2 0x33B2 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE DUP4 MLOAD PUSH1 0x80 ADD MLOAD AND ISZERO PUSH2 0x26DA JUMPI PUSH2 0x26A5 DUP3 PUSH1 0x20 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x80 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP1 DUP5 ADD DUP3 SWAP1 MSTORE DUP5 MLOAD PUSH1 0x20 DUP2 ADD MLOAD SWAP2 DUP7 ADD MLOAD PUSH2 0x100 SWAP1 SWAP2 ADD MLOAD PUSH2 0x26DA SWAP4 PUSH2 0x352D JUMP JUMPDEST DUP1 MLOAD DUP4 MLOAD PUSH1 0xA0 DUP2 ADD MLOAD PUSH1 0x60 DUP1 DUP8 ADD MLOAD PUSH2 0x100 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x20 DUP1 DUP8 ADD MLOAD SWAP1 DUP11 ADD MLOAD PUSH1 0x40 DUP1 DUP13 ADD MLOAD SWAP7 DUP13 ADD MLOAD DUP13 MLOAD PUSH2 0x120 SWAP1 SWAP11 ADD MLOAD SWAP2 MLOAD PUSH32 0xAB614D2B738543C0EA21F56347CF696A3A0C42A7CBEC3212A5CA22A4DCFF2124 SWAP12 PUSH2 0x2741 SWAP12 SWAP1 SWAP11 SWAP10 SWAP4 SWAP1 SWAP2 PUSH2 0x4B8C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2757 PUSH2 0x3C3C JUMP JUMPDEST PUSH2 0x275F PUSH2 0x3C1A JUMP JUMPDEST PUSH2 0x2768 DUP7 PUSH2 0x7B9 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x277C JUMPI INVALID JUMPDEST EQ PUSH2 0x279C JUMPI PUSH2 0x279C PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x4 DUP2 GT ISZERO PUSH2 0x23F2 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH2 0x27A6 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0xC0 DUP9 ADD MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ORIGIN EQ DUP1 ISZERO SWAP1 PUSH2 0x280A JUMPI POP PUSH1 0xC0 DUP8 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 DUP3 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 ORIGIN DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST ISZERO PUSH2 0x2825 JUMPI PUSH2 0x2825 PUSH2 0x9AA DUP4 PUSH1 0x0 ADD MLOAD ORIGIN DUP11 PUSH1 0xC0 ADD MLOAD PUSH2 0x3734 JUMP JUMPDEST POP PUSH1 0xA0 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x287F JUMPI POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0xA0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x289A JUMPI PUSH2 0x289A PUSH2 0x9AA DUP3 PUSH1 0x0 ADD MLOAD DUP6 DUP10 PUSH1 0xA0 ADD MLOAD PUSH2 0x3235 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28AA DUP3 PUSH1 0x0 ADD MLOAD DUP8 PUSH2 0x1E40 JUMP JUMPDEST SWAP1 POP DUP7 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x28F9 JUMPI PUSH2 0x28F9 PUSH2 0x9AA DUP4 PUSH1 0x0 ADD MLOAD DUP4 DUP11 PUSH1 0x80 ADD MLOAD PUSH2 0x32A5 JUMP JUMPDEST POP PUSH2 0x29FE PUSH1 0x40 MLOAD DUP1 PUSH2 0x120 ADD PUSH1 0x40 MSTORE DUP1 DUP4 PUSH1 0x0 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x60 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x40 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP PUSH2 0x33B2 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x40 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE SWAP3 SWAP1 SWAP2 AND PUSH1 0x20 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE DUP5 MLOAD PUSH1 0x80 DUP12 ADD MLOAD DUP12 MLOAD SWAP3 DUP13 ADD MLOAD PUSH1 0xE0 DUP14 ADD MLOAD SWAP7 MLOAD PUSH32 0x829FA99D94DC4636925B38632E625736A614C154D55006B7AB6BEA979C210C32 SWAP8 PUSH2 0x2A71 SWAP8 SWAP5 SWAP7 SWAP4 SWAP6 DUP13 SWAP6 SWAP1 SWAP5 SWAP3 SWAP1 SWAP2 SWAP1 PUSH2 0x4C0C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x21948612B5EF214EC0508DF4901600E07A810A371BE76B25D59ADE73826E3D97 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4C70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x88B2C08E4A5F57D416AD23DAD18C20497CCFE684B1379B28FD564ADAF582B80F DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B82 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0x8000000000000000000000000000000000000000000000000000000000000000 OR SWAP1 SSTORE MLOAD SWAP1 SWAP2 POP PUSH32 0xA6EB7CDC219E1518CED964E9A34E61D68A94E4F1569DB3E84256BA981BA52753 SWAP1 PUSH2 0x16C8 SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6EB224CB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS SWAP1 PUSH4 0x6EB224CB SWAP1 PUSH2 0x2C49 SWAP1 DUP5 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x4CE2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x208E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST DUP1 CALLVALUE GT DUP1 ISZERO PUSH2 0x2C86 JUMPI POP CALLER ADDRESS EQ ISZERO JUMPDEST ISZERO PUSH2 0x2D17 JUMPI PUSH1 0x0 PUSH2 0x2C97 CALLVALUE DUP4 PUSH2 0x376C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x40 MLOAD PUSH2 0x2CBF SWAP1 PUSH2 0x48F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2CFC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2D01 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x98F JUMPI PUSH2 0x98F PUSH2 0x9AA CALLER DUP5 PUSH2 0x378B JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xB12BC7E7D341F4431D6FAF05F991EE3B779183E341B24243064E10C886CD1873 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x5207 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0xCE918627CB55462DDBB85E73DE69A8B322F2BC88F4507C52FCAD6D4C33C29D49 DUP2 MSTORE DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0x80 DUP4 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xE0 DUP3 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x100 DUP3 ADD MSTORE PUSH2 0x100 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x120 DUP3 ADD MSTORE PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x140 DUP4 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x160 DUP3 ADD MSTORE PUSH2 0x160 DUP4 ADD MLOAD PUSH2 0x180 DUP3 ADD MSTORE PUSH2 0x1A0 DUP2 KECCAK256 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F62 DUP4 PUSH2 0x2F5C DUP7 DUP6 PUSH2 0x37C1 JUMP JUMPDEST SWAP1 PUSH2 0x37F2 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E39 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E DUP5 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2FAA SWAP3 SWAP2 SWAP1 PUSH2 0x49F0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FC2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2FD6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2FFA SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x304C SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x48F5 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3064 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3078 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1DF3 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x30AB JUMPI DUP2 PUSH2 0x1E39 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F62 DUP4 PUSH2 0x2F5C PUSH2 0x30C6 DUP3 PUSH1 0x1 PUSH2 0x376C JUMP JUMPDEST PUSH2 0x30D0 DUP9 DUP8 PUSH2 0x37C1 JUMP JUMPDEST SWAP1 PUSH2 0x381C JUMP JUMPDEST PUSH1 0x0 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x30FE JUMPI PUSH2 0x30FE PUSH2 0x9AA PUSH1 0x3 DUP5 PUSH2 0x3838 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 GT ISZERO DUP1 PUSH2 0x3159 JUMPI POP PUSH1 0x60 DUP2 ADD MLOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 GT ISZERO JUMPDEST ISZERO PUSH2 0x316C JUMPI PUSH2 0x316C PUSH2 0x9AA PUSH1 0x5 DUP5 PUSH2 0x31AE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x317B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x318F JUMPI PUSH2 0x318F PUSH2 0x9AA PUSH1 0x3 DUP5 PUSH2 0x31AE JUMP JUMPDEST PUSH1 0x1 DUP2 MLOAD PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x319E JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB91 JUMPI PUSH2 0xB91 PUSH2 0x9AA PUSH1 0x0 DUP5 JUMPDEST PUSH1 0x60 PUSH32 0xF18F11F3027E735C758137924B262D4D3AFF0037DCD785ACA3C699FA05D960BD DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4D63 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 PUSH1 0x7 DUP2 GT ISZERO PUSH2 0x31F4 JUMPI INVALID JUMPDEST PUSH1 0x1 ADD SWAP1 SHL SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0x47AB394E41470191EAF9FA542E84AC483A12665FBD616EB8D1C022CED6C94000 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4C86 JUMP JUMPDEST PUSH1 0x60 PUSH32 0x5D3300180A4547B3E27137BE832D3EBF56F1BA5EBB30DD580999C61F77FA6396 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x60 PUSH32 0x15E6A383BB02D79EE933B927FBECBA78CDDE16CBA84B94A99661F44BCCE3B736 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xF13E65D925201525F3D71A731833B19BB26E44CFBD97CAF72A366B73866F7124 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x32E8 PUSH2 0x3855 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x32F9 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x5E4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3304 DUP5 PUSH2 0x3881 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH2 0x332C SWAP1 PUSH2 0x48F2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3369 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x336E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x33A9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4EF8 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33F0 DUP4 PUSH1 0xE0 ADD MLOAD PUSH2 0x33EB DUP6 PUSH2 0x100 ADD MLOAD DUP7 PUSH1 0xC0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x38CE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x392F JUMP JUMPDEST SWAP2 POP PUSH2 0x343B DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0xC0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0xA0 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2F4C JUMP JUMPDEST SWAP1 POP PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 PUSH2 0x346C JUMPI POP PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO JUMPDEST ISZERO PUSH2 0x347C JUMPI POP PUSH1 0x0 SWAP1 POP DUP1 PUSH2 0x3528 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x349E SWAP1 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH2 0x3962 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x34B8 PUSH2 0x1F97 JUMP JUMPDEST PUSH1 0x0 ADD PUSH1 0x0 DUP6 PUSH1 0x0 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x34FE DUP4 PUSH1 0x80 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x352D JUMP JUMPDEST PUSH2 0x3528 DUP4 PUSH1 0x60 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP5 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x352D JUMP JUMPDEST SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND ADDRESS EQ ISZERO PUSH2 0x3581 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x655 SWAP1 PUSH2 0x4E9B JUMP JUMPDEST PUSH2 0x358A DUP7 PUSH2 0x39B7 JUMP JUMPDEST ISZERO PUSH2 0x365E JUMPI PUSH1 0x40 MLOAD PUSH32 0xDD62ED3E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP4 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x35E5 SWAP1 DUP10 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x49F0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3611 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3635 SWAP2 SWAP1 PUSH2 0x46B6 JUMP JUMPDEST LT ISZERO PUSH2 0x365E JUMPI PUSH2 0x3657 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x39F7 JUMP JUMPDEST POP POP PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x24 DUP3 ADD MSTORE DUP4 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x0 DUP1 PUSH1 0x64 DUP4 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND GAS CALL SWAP3 POP RETURNDATASIZE DUP1 PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH1 0x1 PUSH1 0x20 DUP4 ADD MLOAD EQ PUSH1 0x20 DUP3 LT ISZERO AND DUP2 ISZERO OR DUP5 AND SWAP4 POP DUP4 PUSH2 0x3718 JUMPI DUP1 DUP3 MSTORE DUP2 SWAP3 POP DUP1 PUSH1 0x20 DUP4 ADD ADD PUSH1 0x40 MSTORE JUMPDEST POP POP DUP2 PUSH2 0x372C JUMPI PUSH2 0x372C DUP7 DUP7 DUP7 DUP7 DUP6 PUSH2 0x39F7 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xC0972F3CC4234CA2091DE7E7BC7081494BD29AC280167D66F0D44168973B1634 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B60 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x3785 JUMPI PUSH2 0x3785 PUSH2 0x9AA PUSH1 0x2 DUP6 DUP6 PUSH2 0x3ABF JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH32 0xBDE95CC2119E0200D80642397198ABFCF98E6E4DDDD0DE9C6320D86252AD40AB DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4A69 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x37D0 JUMPI POP PUSH1 0x0 PUSH2 0x1F91 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x37DD JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x1 DUP7 DUP7 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x3808 JUMPI PUSH2 0x3808 PUSH2 0x9AA PUSH1 0x3 DUP6 DUP6 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH2 0x3813 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x0 DUP7 DUP7 PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x60 PUSH4 0xC996AF7B PUSH1 0xE0 SHL DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D50 SWAP3 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH32 0x0 AND GASPRICE MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5E1 PUSH32 0x0 PUSH32 0x0 DUP5 PUSH2 0x3ADE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO PUSH2 0x3785 JUMPI PUSH2 0x3785 PUSH2 0x9AA PUSH1 0x2 DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND LT PUSH2 0x30AB JUMPI DUP2 PUSH2 0x1E39 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x1E39 JUMPI PUSH2 0x1E39 PUSH2 0x9AA PUSH1 0x0 DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x3ABF JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH1 0x1 PUSH1 0xFF SWAP3 DUP4 AND DUP2 SWAP1 SHL SWAP3 SWAP1 SWAP2 AND SHL OR PUSH32 0x0 DUP2 AND EQ SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x89DD02E700000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS SWAP1 PUSH4 0x89DD02E7 SWAP1 PUSH2 0x3A39 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4947 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0x3A64 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0x208E JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0x3A92 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3A97 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH2 0x3AB9 PUSH2 0x9AA DUP8 DUP8 DUP8 DUP8 DUP8 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0x3AB2 JUMPI DUP7 PUSH2 0x3AB4 JUMP JUMPDEST DUP8 JUMPDEST PUSH2 0x3B56 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2ABA SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4D2A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x3B18 SWAP1 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP7 SWAP1 DUP6 SWAP1 DUP8 SWAP1 PUSH1 0x20 ADD PUSH2 0x4858 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH32 0xDFDC6F57CF82BEDE92BCFDD44FEDB82B2D5CECABF56EC21964DB6EE2C3E82CF4 DUP7 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3B92 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4A17 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x3C7E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C91 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST PUSH2 0x5226 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x3CB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x3CDA JUMPI DUP2 CALLDATALOAD PUSH2 0x3CC8 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3CB5 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x3CF6 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D0D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 PUSH1 0x80 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x3D28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52CC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3D4D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3D56 DUP2 PUSH2 0x5226 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D63 DUP4 DUP4 PUSH2 0x3C63 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3D72 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3D84 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3D96 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x3DA8 DUP4 PUSH1 0x80 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x3DBA DUP4 PUSH1 0xA0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x3DCC DUP4 PUSH1 0xC0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH2 0x3DDE DUP4 PUSH1 0xE0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 PUSH2 0x3DF2 DUP5 DUP3 DUP6 ADD PUSH2 0x3C63 JUMP JUMPDEST SWAP1 DUP3 ADD MSTORE PUSH2 0x120 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x140 PUSH2 0x3E10 DUP5 DUP3 DUP6 ADD PUSH2 0x3F53 JUMP JUMPDEST DUP2 DUP4 ADD MSTORE POP PUSH2 0x160 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3E3A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x3E43 DUP2 PUSH2 0x5226 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3E50 DUP4 DUP4 PUSH2 0x3C63 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x3E5F DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3E71 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x3E83 DUP4 PUSH1 0x60 DUP5 ADD PUSH2 0x3F48 JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE PUSH2 0x3E95 DUP4 PUSH1 0x80 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0x80 DUP3 ADD MSTORE PUSH2 0x3EA7 DUP4 PUSH1 0xA0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MSTORE PUSH2 0x3EB9 DUP4 PUSH1 0xC0 DUP5 ADD PUSH2 0x3C63 JUMP JUMPDEST PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 PUSH2 0x3ED7 DUP5 DUP3 DUP6 ADD PUSH2 0x3F53 JUMP JUMPDEST DUP2 DUP4 ADD MSTORE POP PUSH2 0x120 DUP1 DUP4 ADD CALLDATALOAD DUP2 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3EFF JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x3F09 PUSH1 0x80 PUSH2 0x5226 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH1 0x4 DUP2 LT PUSH2 0x3F1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MSTORE PUSH2 0x3F29 DUP4 PUSH1 0x20 DUP5 ADD PUSH2 0x3F6B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x1F91 DUP2 PUSH2 0x52DA JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F8E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FA4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x3FB4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x3FC2 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP1 DUP3 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP3 POP DUP1 DUP6 ADD DUP10 DUP3 DUP4 DUP8 MUL DUP9 ADD ADD GT ISZERO PUSH2 0x3FE2 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x400D JUMPI DUP1 CALLDATALOAD PUSH2 0x3FF9 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP2 ADD SWAP3 DUP2 ADD PUSH2 0x3FE6 JUMP JUMPDEST POP DUP2 SWAP7 POP PUSH2 0x401D DUP10 DUP3 DUP11 ADD PUSH2 0x3D2F JUMP JUMPDEST SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x403D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4054 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4067 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4075 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x4088 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x40AE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x40C5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x40D1 DUP8 DUP4 DUP9 ADD PUSH2 0x3C6E JUMP JUMPDEST SWAP5 POP PUSH1 0x20 SWAP2 POP DUP2 DUP7 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x40E7 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x40F3 DUP9 DUP3 DUP10 ADD PUSH2 0x3C6E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4107 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 ADD SWAP1 POP PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x4119 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4127 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP12 LT ISZERO PUSH2 0x4143 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x4165 JUMPI DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4147 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x418A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x41A1 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x41B4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x41C2 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 PUSH2 0x180 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x41D7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP SWAP1 DUP7 ADD CALLDATALOAD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x41F1 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x41FE DUP8 DUP3 DUP9 ADD PUSH2 0x3CE5 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x421C JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4232 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4250 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD PUSH2 0x180 DUP1 DUP6 MUL DUP7 ADD DUP8 ADD DUP11 LT ISZERO PUSH2 0x426F JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x429B JUMPI PUSH2 0x4285 DUP11 DUP4 PUSH2 0x3D3A JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP7 ADD SWAP3 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4273 JUMP JUMPDEST POP SWAP1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x42BE JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x42D5 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x42E8 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x42F6 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP9 PUSH1 0x20 PUSH2 0x140 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x41D7 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x431D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4333 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4343 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4351 PUSH2 0x3C8C DUP3 PUSH2 0x524D JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD PUSH2 0x140 DUP1 DUP6 MUL DUP7 ADD DUP8 ADD DUP11 LT ISZERO PUSH2 0x4370 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP5 DUP7 LT ISZERO PUSH2 0x429B JUMPI PUSH2 0x4386 DUP11 DUP4 PUSH2 0x3E27 JUMP JUMPDEST DUP5 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP3 DUP7 ADD SWAP3 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4374 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x43AD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1E39 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x43CC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x43D7 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x43E7 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x440A JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3D3A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 SUB PUSH2 0x200 DUP2 SLT ISZERO PUSH2 0x4428 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4432 DUP6 DUP6 PUSH2 0x3D3A JUMP JUMPDEST SWAP3 POP PUSH1 0x80 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE80 DUP3 ADD SLT ISZERO PUSH2 0x4463 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x180 DUP4 ADD SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x220 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4487 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4491 DUP6 DUP6 PUSH2 0x3D3A JUMP JUMPDEST SWAP3 POP PUSH2 0x44A1 DUP6 PUSH2 0x180 DUP7 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP2 POP PUSH2 0x200 DUP5 ADD CALLDATALOAD PUSH2 0x44B2 DUP2 PUSH2 0x52DA JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x260 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x44D5 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x44DF DUP8 DUP8 PUSH2 0x3D3A JUMP JUMPDEST SWAP5 POP PUSH2 0x44EF DUP8 PUSH2 0x180 DUP9 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP4 POP PUSH2 0x200 DUP7 ADD CALLDATALOAD PUSH2 0x4500 DUP2 PUSH2 0x52DA JUMP JUMPDEST SWAP3 POP PUSH2 0x220 DUP7 ADD CALLDATALOAD PUSH2 0x4511 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP2 POP PUSH2 0x240 DUP7 ADD CALLDATALOAD PUSH2 0x4522 DUP2 PUSH2 0x52AA JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0xA0 DUP2 SLT ISZERO PUSH2 0x4545 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x60 DUP2 SLT ISZERO PUSH2 0x4552 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x455D PUSH1 0x60 PUSH2 0x5226 JUMP JUMPDEST DUP5 MLOAD DUP2 MSTORE PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x4572 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP6 ADD MLOAD PUSH2 0x4585 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x459B DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x80 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x44B2 DUP2 PUSH2 0x52CC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x45BE JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3E27 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C0 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45DB JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x45E5 DUP5 DUP5 PUSH2 0x3E27 JUMP JUMPDEST SWAP2 POP PUSH2 0x45F5 DUP5 PUSH2 0x140 DUP6 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1E0 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4613 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x461D DUP6 DUP6 PUSH2 0x3E27 JUMP JUMPDEST SWAP3 POP PUSH2 0x462D DUP6 PUSH2 0x140 DUP7 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP2 POP PUSH2 0x1C0 DUP5 ADD CALLDATALOAD PUSH2 0x44B2 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x200 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4654 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x465E DUP7 DUP7 PUSH2 0x3E27 JUMP JUMPDEST SWAP4 POP PUSH2 0x466E DUP7 PUSH2 0x140 DUP8 ADD PUSH2 0x3EEE JUMP JUMPDEST SWAP3 POP PUSH2 0x1C0 DUP6 ADD CALLDATALOAD PUSH2 0x467F DUP2 PUSH2 0x52DA JUMP JUMPDEST SWAP2 POP PUSH2 0x1E0 DUP6 ADD CALLDATALOAD PUSH2 0x4690 DUP2 PUSH2 0x52AA JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46AC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1E39 DUP4 DUP4 PUSH2 0x3EEE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x46C7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46DA DUP4 DUP4 PUSH2 0x47BB JUMP JUMPDEST POP POP PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4747 JUMPI DUP2 MLOAD ISZERO ISZERO DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4729 JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4777 JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x475B JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x4788 JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x5 DUP2 LT PUSH2 0x47CE JUMPI INVALID JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x4 DUP2 LT PUSH2 0x47FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4808 DUP2 PUSH2 0x52A0 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x40 DUP2 ADD PUSH1 0xFF PUSH2 0x481D DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x3F6B JUMP JUMPDEST AND PUSH1 0x20 DUP5 ADD MSTORE CALLDATALOAD PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 SWAP1 DUP2 ADD CALLDATALOAD SWAP2 ADD MSTORE JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 MSTORE JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 SWAP5 SWAP1 SWAP5 AND DUP5 MSTORE PUSH1 0x60 SWAP3 SWAP1 SWAP3 SHL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 AND PUSH1 0x1 DUP5 ADD MSTORE PUSH1 0x15 DUP4 ADD MSTORE PUSH1 0x35 DUP3 ADD MSTORE PUSH1 0x55 ADD SWAP1 JUMP JUMPDEST PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x22 DUP3 ADD MSTORE PUSH1 0x42 ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND DUP5 MSTORE PUSH1 0x20 PUSH1 0x60 DUP2 DUP7 ADD MSTORE DUP3 DUP8 MLOAD DUP1 DUP6 MSTORE PUSH1 0x80 DUP8 ADD SWAP2 POP DUP3 DUP10 ADD SWAP5 POP DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x49D7 JUMPI DUP6 MLOAD DUP6 AND DUP4 MSTORE SWAP5 DUP4 ADD SWAP5 SWAP2 DUP4 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x49B9 JUMP JUMPDEST POP POP DUP1 SWAP5 POP POP POP POP POP DUP3 ISZERO ISZERO PUSH1 0x40 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND DUP4 MSTORE DUP1 DUP8 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP7 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP4 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE PUSH2 0x4A5E PUSH1 0xA0 DUP4 ADD DUP5 PUSH2 0x4752 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 ADD PUSH1 0x60 DUP4 MSTORE DUP1 DUP7 MLOAD PUSH2 0x4AA6 DUP2 DUP5 PUSH2 0x4B33 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 SWAP3 POP DUP3 DUP9 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4AD2 JUMPI PUSH2 0x4AC4 DUP5 DUP4 MLOAD PUSH2 0x46CE JUMP JUMPDEST SWAP4 POP SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4AB1 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP7 MLOAD PUSH2 0x4AE9 DUP2 DUP5 PUSH2 0x4B33 JUMP JUMPDEST SWAP2 POP DUP4 DUP9 ADD SWAP3 POP DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4B13 JUMPI PUSH2 0x4B05 DUP4 DUP6 MLOAD PUSH2 0x46E2 JUMP JUMPDEST SWAP4 DUP6 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x4AF2 JUMP JUMPDEST POP POP DUP5 DUP2 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x4B27 DUP2 DUP8 PUSH2 0x4716 JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP11 DUP12 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP10 DUP11 AND PUSH1 0x20 DUP13 ADD MSTORE SWAP8 DUP10 AND PUSH1 0x40 DUP12 ADD MSTORE SWAP6 DUP9 AND PUSH1 0x60 DUP11 ADD MSTORE SWAP4 DUP8 AND PUSH1 0x80 DUP10 ADD MSTORE SWAP2 SWAP1 SWAP6 AND PUSH1 0xA0 DUP8 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0xC0 DUP8 ADD MSTORE DUP5 AND PUSH1 0xE0 DUP7 ADD MSTORE SWAP1 SWAP3 AND PUSH2 0x100 DUP5 ADD MSTORE PUSH2 0x120 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x140 DUP3 ADD MSTORE PUSH2 0x160 ADD SWAP1 JUMP JUMPDEST SWAP8 DUP9 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 DUP8 AND PUSH1 0x20 DUP10 ADD MSTORE SWAP5 DUP7 AND PUSH1 0x40 DUP9 ADD MSTORE SWAP3 DUP6 AND PUSH1 0x60 DUP8 ADD MSTORE SWAP4 AND PUSH1 0x80 DUP6 ADD MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0xA0 DUP6 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0xC0 DUP4 ADD MSTORE PUSH1 0xE0 DUP3 ADD MSTORE PUSH2 0x100 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0xFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x4D38 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4D59 DUP5 PUSH2 0x52A0 JUMP JUMPDEST SWAP3 DUP2 MSTORE PUSH1 0x20 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH1 0x6 DUP5 LT PUSH2 0x4D59 JUMPI INVALID JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x1E39 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4752 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4D49534D4154434845445F41 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x525241595F4C454E475448530000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4E4F5F434F4E54524143545F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4F524947494E5300000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4E61746976654F7264657273466561747572652F4D49534D4154434845445F50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x4149525F4F52444552535F41525241595F4C454E475448530000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x466978696E546F6B656E5370656E6465722F43414E4E4F545F494E564F4B455F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x53454C4600000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x466978696E50726F746F636F6C466565732F45544845525F5452414E53464552 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x5F46414C49454400000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH2 0x200 DUP2 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x4F71 DUP4 PUSH2 0x4F6C DUP4 DUP9 PUSH2 0x3C63 JUMP JUMPDEST PUSH2 0x46FC JUMP JUMPDEST PUSH2 0x4F7B DUP2 DUP7 PUSH2 0x526D JUMP JUMPDEST SWAP1 POP PUSH2 0x4F8A PUSH1 0x20 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x4F98 PUSH1 0x40 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FA5 PUSH1 0x40 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FB3 PUSH1 0x60 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FC0 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FCE PUSH1 0x80 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x4FDB PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x4FE9 PUSH1 0xA0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x4FF6 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x5004 PUSH1 0xC0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5011 PUSH1 0xC0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x501F PUSH1 0xE0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x502C PUSH1 0xE0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x100 PUSH2 0x503C DUP2 DUP7 ADD DUP7 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5048 DUP3 DUP6 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP POP PUSH2 0x120 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x140 PUSH2 0x5064 DUP2 DUP7 ADD DUP7 PUSH2 0x5287 JUMP JUMPDEST PUSH2 0x5070 DUP3 DUP6 ADD DUP3 PUSH2 0x484A JUMP JUMPDEST POP POP PUSH2 0x160 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x1E39 PUSH2 0x180 DUP4 ADD DUP5 PUSH2 0x47F0 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1F91 DUP3 DUP5 PUSH2 0x47BB JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH2 0x50A7 DUP3 DUP7 PUSH2 0x47BB JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x60 DUP4 ADD MSTORE DUP3 ISZERO ISZERO PUSH1 0x80 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1C0 DUP2 ADD PUSH1 0x20 DUP5 ADD PUSH2 0x50E6 DUP4 PUSH2 0x4F6C DUP4 DUP9 PUSH2 0x3C63 JUMP JUMPDEST PUSH2 0x50F0 DUP2 DUP7 PUSH2 0x526D JUMP JUMPDEST SWAP1 POP PUSH2 0x50FF PUSH1 0x20 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x510D PUSH1 0x40 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x511A PUSH1 0x40 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x5128 PUSH1 0x60 DUP6 ADD DUP6 PUSH2 0x527A JUMP JUMPDEST PUSH2 0x5135 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x4834 JUMP JUMPDEST POP PUSH2 0x5143 PUSH1 0x80 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5150 PUSH1 0x80 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x515E PUSH1 0xA0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x516B PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH2 0x5179 PUSH1 0xC0 DUP6 ADD DUP6 PUSH2 0x526D JUMP JUMPDEST PUSH2 0x5186 PUSH1 0xC0 DUP5 ADD DUP3 PUSH2 0x46FC JUMP JUMPDEST POP PUSH1 0xE0 DUP5 ADD CALLDATALOAD PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x100 PUSH2 0x51A0 DUP2 DUP7 ADD DUP7 PUSH2 0x5287 JUMP JUMPDEST PUSH2 0x51AC DUP3 DUP6 ADD DUP3 PUSH2 0x484A JUMP JUMPDEST POP POP PUSH2 0x120 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP4 ADD MSTORE PUSH2 0x1E39 PUSH2 0x140 DUP4 ADD DUP5 PUSH2 0x47F0 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5263 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH2 0x1E39 DUP2 PUSH2 0x52AA JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH2 0x1E39 DUP2 PUSH2 0x52DA JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1E39 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x4 DUP2 LT PUSH2 0x2D17 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x2D17 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0xE86EBFE95C4272EF9FD60E01D1026D9FD06DD80EA122231FA85912DA 0xAB POP 0xC5 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
|
|
"sourceMap": "916:2880:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4342:236:18;;;;;;;;;;-1:-1:-1;4342:236:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1134:75:8;;;;;;;;;;;;;:::i;8099:622:17:-;;;;;;;;;;-1:-1:-1;8099:622:17;;;;;:::i;:::-;;:::i;:::-;;5092:893:18;;;;;;;;;;-1:-1:-1;5092:893:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2960:863::-;;;;;;;;;;-1:-1:-1;2960:863:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6496:885::-;;;;;;;;;;-1:-1:-1;6496:885:18;;;;;:::i;:::-;;:::i;1707:205:19:-;;;;;;;;;;-1:-1:-1;1707:205:19;;;;;:::i;:::-;;:::i;9537:847:20:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8165:867::-;;;;;;;;;;-1:-1:-1;8165:867:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2139:153:19:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1030:60:8:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1805:416:17:-;;;;;;;;;;-1:-1:-1;1805:416:17;;;;;:::i;:::-;;:::i;5542:626::-;;;;;;;;;;-1:-1:-1;5542:626:17;;;;;:::i;:::-;;:::i;1914:1880:8:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6589:1089:20:-;;;;;;:::i;:::-;;:::i;2110:710:18:-;;;;;;;;;;-1:-1:-1;2110:710:18;;;;;:::i;:::-;;:::i;6597:1067:17:-;;;;;;;;;;-1:-1:-1;6597:1067:17;;;;;:::i;:::-;;:::i;3006:206::-;;;;;;;;;;-1:-1:-1;3006:206:17;;;;;:::i;:::-;;:::i;1045:47:23:-;;;;;;;;;;;;;:::i;10924:691:20:-;;;;;;;;;;-1:-1:-1;10924:691:20;;;;;:::i;:::-;;:::i;5461:639::-;;;;;;;;;;-1:-1:-1;5461:639:20;;;;;:::i;:::-;;:::i;9848:1329:18:-;;;;;;;;;;-1:-1:-1;9848:1329:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;11882:527:20:-;;;;;;;;;;-1:-1:-1;11882:527:20;;;;;:::i;:::-;;:::i;7950:1335:18:-;;;;;;;;;;-1:-1:-1;7950:1335:18;;;;;:::i;:::-;;:::i;4030:1075:17:-;;;;;;;;;;-1:-1:-1;4030:1075:17;;;;;:::i;:::-;;:::i;1401:51:24:-;;;;;;;;;;;;;:::i;990:48:22:-;;;;;;;;;;;;;:::i;3963:242:18:-;;;;;;;;;;-1:-1:-1;3963:242:18;;;;;:::i;:::-;;:::i;4100:859:20:-;;;;;;:::i;:::-;;:::i;3399:200:17:-;;;;;;;;;;-1:-1:-1;3399:200:17;;;;;:::i;:::-;;:::i;2405:410::-;;;;;;;;;;-1:-1:-1;2405:410:17;;;;;:::i;:::-;;:::i;4342:236:18:-;4450:17;4490:81;4518:43;4555:5;4518:36;:43::i;:::-;4490:14;:81::i;:::-;4483:88;;4342:236;;;;:::o;1134:75:8:-;;;:::o;8099:622:17:-;8341:11;:18;8319:11;:18;:40;:98;;;;;8397:13;:20;8375:11;:18;:42;8319:98;8298:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;8515:9;8510:205;8534:11;:18;8530:1;:22;8510:205;;;8573:131;8610:11;8622:1;8610:14;;;;;;;;;;;;;;8642:11;8654:1;8642:14;;;;;;;;;;;;;;8674:13;8688:1;8674:16;;;;;;;;;;;;;;8573:19;:131::i;:::-;8554:3;;8510:205;;;;8099:622;;;:::o;5092:893:18:-;5291:41;;:::i;:::-;5346:38;5398:21;5456:24;5474:5;5456:17;:24::i;:::-;5444:36;;5523:339;5571:281;;;;;;;;5636:5;:11;;;5571:281;;;;;;5677:5;:16;;;5571:281;;;;;;5729:5;:17;;;5571:281;;;;;;5782:5;:17;;;5571:281;;;;;;5828:9;5571:281;;;5523:34;:339::i;:::-;5947:19;;5490:372;;-1:-1:-1;5918:60:18;;;;;;;;;5968:9;5918:60;:::i;:::-;:28;:60::i;:::-;5891:87;;:5;:11;;;:87;;;5872:106;;5092:893;;;;;:::o;2960:863::-;3068:41;;:::i;:::-;3196:22;3212:5;3196:15;:22::i;:::-;3174:44;;:19;3251:35;:33;:35::i;:::-;3375:11;;;;3251:136;;;;;;;;:106;;;;;:136;;;;;;;;3413:16;;3251:180;;;;;;;;;3457:16;;;;3251:224;;;;;;;;;;;3552:17;;;;3583:12;;;;3609:10;;;;3251:224;;-1:-1:-1;3485:170:18;;3529:9;;3552:17;3583:12;3251:224;3485:30;:170::i;:::-;3709:14;;;;:28;;3705:112;;3772:34;3753:16;;;:53;3705:112;2960:863;;;;:::o;6496:885::-;6689:41;;:::i;:::-;6744:38;6796:21;6854:22;6870:5;6854:15;:22::i;:::-;6842:34;;6919:339;6967:281;;;;;;;;7032:5;:11;;;6967:281;;;;;;7073:5;:16;;;6967:281;;;;;;7125:5;:17;;;6967:281;;;;;;7178:5;:17;;;6967:281;;;;;;7224:9;6967:281;;;6919:34;:339::i;:::-;6886:372;;7314:60;7343:9;:19;;;7364:9;7314:28;:60::i;:::-;7287:87;;:5;:11;;;:87;;;7268:106;;6496:885;;;;;:::o;1707:205:19:-;1809:9;1804:102;1824:18;;;1804:102;;;1863:32;1884:7;;1892:1;1884:10;;;;;;;;;;;;;1863:20;:32::i;:::-;1844:3;;1804:102;;;;1707:205;;:::o;9537:847:20:-;9831:30;;1272:10:21;1294:4;1272:27;1268:123;;1315:65;:55;1359:10;1315:43;:55::i;:::-;:63;:65::i;:::-;9909:37:20::1;;:::i;:::-;9961:257;9984:233;;;;;;;;10037:5;9984:233;;;;10071:9;9984:233;;;;10120:20;9984:233;;;;;;10165:5;9984:233;;;;;;10196:6;9984:233;;;;::::0;9961:22:::1;:257::i;:::-;10293:30;::::0;::::1;::::0;10337::::1;::::0;;::::1;::::0;10293;;10337;;-1:-1:-1;9537:847:20;-1:-1:-1;;;;;;;9537:847:20:o;8165:867::-;8364:30;8410:37;;:::i;:::-;8462:150;8500:5;8523:9;8550:20;8588:10;8462:20;:150::i;:::-;8410:202;;8717:20;8684:53;;:7;:30;;;:53;;;8680:281;;;8753:197;:187;8818:22;8834:5;8818:15;:22::i;:::-;8858:7;:30;;;8753:187;;8906:20;8753:187;;:47;:187::i;:197::-;8995:30;;;;8165:867;-1:-1:-1;;;;8165:867:20:o;2139:153:19:-;2262:23;2139:153;:::o;1030:60:8:-;;;;;;;;;;;;;;;;;;;:::o;1805:416:17:-;1900:17;1920:24;1938:5;1920:17;:24::i;:::-;1900:44;;1972:5;:11;;;1958:25;;:10;:25;;;1954:211;;1999:155;:145;2064:9;2091:10;2119:5;:11;;;1999:47;:145::i;:155::-;2174:40;2191:9;2202:5;:11;;;2174:16;:40::i;:::-;1805:416;;:::o;5542:626::-;5786:11;:18;5764:11;:18;:40;:98;;;;;5842:13;:20;5820:11;:18;:42;5764:98;5743:201;;;;;;;;;;;;:::i;:::-;5960:9;5955:207;5979:11;:18;5975:1;:22;5955:207;;;6018:133;6057:11;6069:1;6057:14;;;;;;;;;;;;;;6089:11;6101:1;6089:14;;;;;;;;;;;;;;6121:13;6135:1;6121:16;;;;;;;;;;;;;;6018:21;:133::i;:::-;5999:3;;5955:207;;1914:1880:8;1967:14;1997:68;2022:42;1997:24;:68::i;:::-;2075:54;2100:28;2075:24;:54::i;:::-;2139:52;2164:26;2139:24;:52::i;:::-;2201:60;2226:34;2201:24;:60::i;:::-;2271:58;2296:32;2271:24;:58::i;:::-;2339:55;2364:29;2339:24;:55::i;:::-;2404:53;2429:27;2404:24;:53::i;:::-;2467:56;2492:30;2467:24;:56::i;:::-;2533:54;2558:28;2533:24;:54::i;:::-;2597:62;2622:36;2597:24;:62::i;:::-;2669:60;2694:34;2669:24;:60::i;:::-;2739:61;2764:35;2739:24;:61::i;:::-;2810:66;2835:40;2810:24;:66::i;:::-;2886:59;2911:33;2886:24;:59::i;:::-;2955:64;2980:38;2955:24;:64::i;:::-;3029:57;3054:31;3029:24;:57::i;:::-;3096:55;3121:29;3096:24;:55::i;:::-;3161:57;3186:31;3161:24;:57::i;:::-;3228:55;3253:29;3228:24;:55::i;:::-;3293:64;3318:38;3293:24;:64::i;:::-;3367:65;3392:39;3367:24;:65::i;:::-;3442:66;3467:40;3442:24;:66::i;:::-;3518:64;3543:38;3518:24;:64::i;:::-;3592:72;3617:46;3592:24;:72::i;:::-;3674:70;3699:44;3674:24;:70::i;:::-;-1:-1:-1;3761:26:8;1914:1880;:::o;6589:1089:20:-;6808:30;6854:37;;:::i;:::-;6906:266;6929:242;;;;;;;;6982:5;6929:242;;;;7016:9;6929:242;;;;7065:20;6929:242;;;;;;7110:10;6929:242;;;;;;7146:10;6929:242;;;;;6906:22;:266::i;:::-;6854:318;;7277:20;7244:53;;:7;:30;;;:53;;;7240:283;;;7313:199;:189;7378:24;7396:5;7378:17;:24::i;7313:199::-;7579:26;;7532:74;;:46;:74::i;2110:710:18:-;2222:41;;:::i;:::-;2350:24;2368:5;2350:17;:24::i;:::-;2328:46;;:19;2407:35;:33;:35::i;:::-;2533:11;;;;2407:138;;;;;;;;:108;;;;;:138;;;;;;;;2571:16;;2407:182;;;;;;;;;2615:16;;;;2407:226;;;;;;;;;;;2710:17;;;;2741:12;;;;2767:10;;;;2407:226;;-1:-1:-1;2643:170:18;;2687:9;;2710:17;2741:12;2407:226;2643:30;:170::i;6597:1067:17:-;6761:43;6819:35;:33;:35::i;:::-;6983:10;6865:23;6903:91;;;:62;;;:91;;;;;;;;;:129;;;;;;;;;;;:167;;;;;;;;;;;6761:93;;-1:-1:-1;7130:30:17;;;7126:187;;;7176:126;:95;7241:12;7255:15;7176:64;:95::i;:126::-;7399:10;7323:87;;;;:62;;;:87;;;;;;;;;:121;;;;;;;;;;;:155;;;;;;;;;;;;:170;;;7509:148;;;;;7432:10;;7466;;7481:12;;7509:148;:::i;:::-;;;;;;;;6597:1067;;;;;:::o;3006:206::-;3115:9;3110:96;3134:6;:13;3130:1;:17;3110:96;;;3168:27;3185:6;3192:1;3185:9;;;;;;;;;;;;;;3168:16;:27::i;:::-;3149:3;;3110:96;;1045:47:23;;;:::o;10924:691:20:-;11174:30;;1272:10:21;1294:4;1272:27;1268:123;;1315:65;:55;1359:10;1315:43;:55::i;:65::-;11252:37:20::1;;:::i;:::-;11304:145;11342:5;11365:9;11392:20;11430:5;11304:20;:145::i;:::-;11524:30;::::0;::::1;::::0;11568::::1;::::0;;::::1;::::0;11524;;11568;;-1:-1:-1;10924:691:20;-1:-1:-1;;;;;;10924:691:20:o;5461:639::-;5654:30;5686;5732:37;;:::i;:::-;5784:150;5822:5;5845:9;5872:20;5910:10;5784:20;:150::i;:::-;6009:30;;;;6053;;;;;6009;;6053;;-1:-1:-1;5461:639:20;-1:-1:-1;;;;;5461:639:20:o;9848:1329:18:-;10059:44;;;10256:34;;;10235:125;;;;;;;;;;;;:::i;:::-;10414:6;10383:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;10370:58:18;-1:-1:-1;10486:6:18;10472:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10472:28:18;-1:-1:-1;10438:62:18;-1:-1:-1;10541:6:18;10530:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10530:25:18;;10510:45;;10570:9;10565:606;10585:17;;;10565:606;;;10643:4;:29;10673:6;;10680:1;10673:9;;;;;;;;;;;;10684:10;;10695:1;10684:13;;;;;;;;;;;;10643:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10643:55:18;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;10623:538;;;;;10974:9;10958:10;10969:1;10958:13;;;;;;;;;;;;;:25;;;;11038:30;11001:31;11033:1;11001:34;;;;;;;;;;;;;:67;;;;;;;;;;;11109:16;11086:17;11104:1;11086:20;;;;;;;;:39;;;:20;;;;;;;;;;;:39;-1:-1:-1;;;10623:538:18;10604:3;;10565:606;;;;9848:1329;;;;;;;;:::o;11882:527:20:-;12018:10;12032:9;12018:23;12010:87;;;;;;;;;;;;:::i;:::-;12108:43;12166:35;:33;:35::i;:::-;12108:93;;12217:9;12212:123;12236:7;:14;12232:1;:18;12212:123;;;12291:10;12271:31;;;;:19;;;:31;;;;;12303:10;;12317:7;;12271:31;12303:7;;12311:1;;12303:10;;;;;;;;;;;;;;;;;12271:43;;;;;;;;;;;;-1:-1:-1;12271:43:20;:53;;;;;;;;;;;;;-1:-1:-1;12252:3:20;12212:123;;;;12350:52;12373:10;12385:7;12394;12350:52;;;;;;;;:::i;:::-;;;;;;;;11882:527;;;:::o;7950:1335:18:-;8165:44;;;8362:34;;;8341:125;;;;;;;;;;;;:::i;:::-;8520:6;8489:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;8476:58:18;-1:-1:-1;8592:6:18;8578:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8578:28:18;-1:-1:-1;8544:62:18;-1:-1:-1;8647:6:18;8636:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8636:25:18;;8616:45;;8676:9;8671:608;8691:17;;;8671:608;;;8749:4;:31;8781:6;;8788:1;8781:9;;;;;;;;;;;;8792:10;;8803:1;8792:13;;;;;;;;;;;;8749:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8749:57:18;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;8729:540;;;;;9082:9;9066:10;9077:1;9066:13;;;;;;;;;;;;;:25;;;;9146:30;9109:31;9141:1;9109:34;;;;;;;;;;;;;:67;;;;;;;;;;;9217:16;9194:17;9212:1;9194:20;;;;;;;;:39;;;:20;;;;;;;;;;;:39;-1:-1:-1;;;8729:540:18;8710:3;;8671:608;;4030:1075:17;4196:43;4254:35;:33;:35::i;:::-;4420:10;4300:23;4338:93;;;:64;;;:93;;;;;;;;;:131;;;;;;;;;;;:169;;;;;;;;;;;4196:93;;-1:-1:-1;4567:30:17;;;4563:187;;;4613:126;:95;4678:12;4692:15;4613:64;:95::i;:126::-;4838:10;4760:89;;;;:64;;;:89;;;;;;;;;:123;;;;;;;;;;;:157;;;;;;;;;;;;:172;;;4948:150;;;;;4871:10;;4905;;4920:12;;4948:150;:::i;1401:51:24:-;;;:::o;990:48:22:-;;;:::o;3963:242:18:-;4075:17;4115:83;4143:45;4182:5;4143:38;:45::i;4100:859:20:-;4313:30;4345;4391:37;;:::i;:::-;4443:266;4466:242;;;;;;;;4519:5;4466:242;;;;4553:9;4466:242;;;;4602:20;4466:242;;;;;;4647:10;4466:242;;;;;;4683:10;4466:242;;;;;4443:22;:266::i;:::-;4391:318;;4719:74;4766:7;:26;;;4719:46;:74::i;:::-;4868:30;;;;4912;;;;;4868;;4912;;-1:-1:-1;4100:859:20;-1:-1:-1;;;;4100:859:20:o;3399:200:17:-;3504:9;3499:94;3523:6;:13;3519:1;:17;3499:94;;;3557:25;3572:6;3579:1;3572:9;;;;;;;;;;;;;;3557:14;:25::i;:::-;3538:3;;3499:94;;2405:410;2496:17;2516:22;2532:5;2516:15;:22::i;:::-;2496:42;;2566:5;:11;;;2552:25;;:10;:25;;;2548:211;;2593:155;:145;2658:9;2685:10;2713:5;:11;;;2593:47;:145::i;:155::-;2768:40;2785:9;2796:5;:11;;;2768:16;:40::i;5911:1727:15:-;6012:18;6472:4;6466:11;6502:19;6497:3;6490:32;6615:5;6609:12;6595;6591:31;6584:4;6579:3;6575:14;6568:55;6727:4;6720:5;6716:16;6710:23;6696:12;6692:42;6685:4;6680:3;6676:14;6669:66;6841:4;6834:5;6830:16;6824:23;6809:13;6805:43;6798:4;6793:3;6789:14;6782:67;6955:4;6948:5;6944:16;6938:23;6923:13;6919:43;6912:4;6907:3;6903:14;6896:67;7062:4;7055:5;7051:16;7045:23;7031:12;7027:42;7020:4;7015:3;7011:14;7004:66;7169:4;7162:5;7158:16;7152:23;7138:12;7134:42;7127:4;7122:3;7118:14;7111:66;7279:4;7272:5;7268:16;7262:23;7248:12;7244:42;7237:4;7232:3;7228:14;7221:66;7368:4;7361:5;7357:16;7351:23;7343:5;7338:3;7334:15;7327:48;7476:5;7469;7465:17;7459:24;7445:12;7441:43;7433:5;7428:3;7424:15;7417:68;7566:5;7559;7555:17;7549:24;7541:5;7536:3;7532:15;7525:49;7616:5;7611:3;7601:21;7587:35;;;6441:1191;;;:::o;1810:260:22:-;1901:18;2005:23;2042:10;1952:110;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1942:121;;;;;;1935:128;;1810:260;;;:::o;13300:1442:18:-;13459:38;13517:6;:23;;;:28;;13544:1;13517:28;:60;;;-1:-1:-1;13549:23:18;;;;:28;;;13517:60;13513:127;;;-1:-1:-1;13628:1:18;13621:8;;13513:127;13680:35;13653:6;:16;;;:23;;;:62;;;;;;;;;13649:130;;-1:-1:-1;13767:1:18;13760:8;;13649:130;13900:32;13935:268;14048:6;:16;;;:39;;;14006:6;:23;;;:81;13981:120;;14123:6;:23;;;14115:32;;14169:6;:23;;;14161:32;;13935;:268::i;:::-;13900:303;;14338:143;14373:24;14411:60;14439:6;:17;;;14458:6;:12;;;14411:27;:60::i;:::-;14338:21;:143::i;:::-;14311:170;;14540:195;:171;14585:24;14631:6;:23;;;14623:32;;14677:6;:23;;;14669:32;;14540:31;:171::i;:::-;:193;:195::i;:::-;14533:202;13300:1442;-1:-1:-1;;;13300:1442:18:o;2295:1567:16:-;2431:17;2545:49;2578:4;2584:9;2545:32;:49::i;:::-;2636:20;2609:23;;:47;;;;;;;;;2605:929;;;2719:132;2746:4;2768:9;:11;;;2797:9;:11;;;2826:9;:11;;;2719:132;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2707:144;;2605:929;;;2899:21;2872:23;;:48;;;;;;;;;2868:666;;;3092:19;3199:20;3196:1;3189:31;3270:4;3266:2;3259:16;3342:2;3339:1;3329:16;3314:31;;3384:139;3411:11;3440:9;:11;;;3469:9;:11;;;3498:9;:11;;;3384:139;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3372:151;;2868:666;;3624:23;;;3620:236;;3663:182;:172;3728:71;3817:4;3663:47;:172::i;:182::-;2295:1567;;;;:::o;1893:473:26:-;1938:20;1970:19;1992:82;2031:33;1992:25;:82::i;11645:1523:18:-;11889:43;11947:35;:33;:35::i;:::-;12269:19;;12178:33;12230:59;;;;;;;;;;;;;12303:69;;;;:32;;;:69;;;11889:93;;-1:-1:-1;12230:59:18;12390:47;;-1:-1:-1;12386:162:18;;12457:16;;;12476:33;12457:52;;;;;;;;;;;;;;;12527:7;;;;12386:162;1705:8;12565:36;;:41;12561:159;;12626:16;;;12645:36;12626:55;;12561:159;11645:1523;12794:15;12777:33;;:6;:33;;;12773:137;;12826:16;;;12845:34;12826:53;;;;;;;;;;;;;;;12893:7;;;12773:137;12992:4;12977:12;:19;12973:125;;;13012:16;;;13031:36;13012:55;;12973:125;-1:-1:-1;13126:35:18;13107:16;;;:54;11645:1523;;;;;;:::o;2900:672:23:-;3126:61;;;;;3086:25;;3126:53;:24;:53;;;;:61;;3180:6;;3126:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3086:101;;3261:11;3275:4;:14;;;3298:12;3275:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3261:51;;3332:1;3326:3;:7;3322:244;;;3429:126;;;;;:22;:7;:22;;;;:126;;3477:12;;;;3547:7;;;;3429:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2900:672;;;:::o;724:257:0:-;820:12;898:45;958:6;855:119;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;724:257:0;;;:::o;1531:170:38:-;1674:9;1668:16;1661:4;1650:9;1646:20;1639:46;12580:3530:20;12688:37;;:::i;:::-;12741:41;;:::i;:::-;12803:12;;12785:31;;:17;:31::i;:::-;12741:75;-1:-1:-1;12880:35:20;12860:9;:16;;;:55;;;;;;;;;12856:235;;12931:149;:139;12996:9;:19;;;13039:9;:16;;;13033:23;;;;;;;;12931:47;:139::i;:149::-;13147:12;;:18;;;:32;;;;;;:70;;;13205:6;:12;;;13183:34;;:6;:12;;;:18;;;:34;;;;13147:70;13143:282;;;13233:181;:171;13305:9;:19;;;13342:6;:12;;;13372:6;:12;;;:18;;;13233:54;:171::i;:181::-;13482:12;;:19;;;:33;;;;;;:73;;;13542:6;:13;;;13519:36;;:6;:12;;;:19;;;:36;;;;13482:73;13478:288;;;13571:184;:174;13644:9;:19;;;13681:6;:13;;;13712:6;:12;;;:19;;;13571:55;:174::i;:184::-;13840:14;13857:113;13903:9;:19;;;13940:6;:16;;;13857:28;:113::i;:::-;13840:130;;13998:6;:12;;;:18;;;13988:28;;:6;:28;;;13984:256;;14110:19;;14179:12;;:18;;;14036:189;;:179;;14151:6;;14036:52;:179::i;:189::-;-1:-1:-1;14342:12:20;;:17;;;14322:38;;:19;:38::i;:::-;14293:67;;14511:548;;;;;;;;14556:19;;14511:548;;14600:12;;:18;;;;;14511:548;;;;;;;;;;;;14643:12;;;;;14511:548;;;;;;14700:12;;:23;14511:548;;;;;;14769:12;;:23;;;;14511:548;;;-1:-1:-1;14511:548:20;;;14824:12;;:24;;;14511:548;;;;;;;;;;;14879:12;;:24;;14511:548;;;;;;14943:27;;;;14511:548;;;;;;15012:32;;;;14511:548;;;;;;;14485:584;;:12;:584::i;:::-;14418:651;;;;14451:30;;;14418:651;;;;14419:30;;;14418:651;15118:12;;:32;;;:36;;15114:520;;15214:186;15264:7;:30;;;15214:186;;15312:6;:12;;;:24;;;15214:186;;15354:6;:12;;;:32;;;15214:186;;:32;:186::i;:::-;15170:231;;:33;;;;:231;;;15453:12;;:23;;;;15494:12;;;;15524:25;;;;;15415:208;;:20;:208::i;:::-;15679:19;;15712:12;;:18;;;;15744:12;;;;;15770:25;;;;15817:23;;15863;;;;;15901:30;;;;15945;;;;;15989:33;;;;16036:26;;16076:17;;;;;15649:454;;;;;;15679:19;;15712:18;15945:30;16036:26;;15649:454;:::i;:::-;;;;;;;;12580:3530;;;;:::o;16442:2812::-;16667:37;;:::i;:::-;16720:41;;:::i;:::-;16764:22;16780:5;16764:15;:22::i;:::-;16720:66;-1:-1:-1;16850:35:20;16830:9;:16;;;:55;;;;;;;;;16826:235;;16901:149;:139;16966:9;:19;;;17009:9;:16;;;17003:23;;;;;;;16901:149;17085:43;17147:35;:33;:35::i;:::-;17251:14;;;;17085:97;;-1:-1:-1;17251:27:20;;17269:9;17251:27;;;;:78;;-1:-1:-1;17303:14:20;;;;17283:35;;;;;;:19;;;:35;;;;;;;;17319:9;17283:46;;;;;;;;;;17282:47;17251:78;17247:308;;;17349:191;:181;17426:9;:19;;;17467:9;17498:5;:14;;;17349:55;:181::i;:191::-;-1:-1:-1;17621:11:20;;;;:25;;;;;;:49;;;17665:5;17650:20;;:5;:11;;;:20;;;;17621:49;17617:247;;;17686:167;:157;17758:9;:19;;;17795:5;17818;:11;;;17686:54;:157::i;:167::-;17938:14;17955:60;17984:9;:19;;;18005:9;17955:28;:60::i;:::-;17938:77;;18043:5;:11;;;18033:21;;:6;:21;;;18029:242;;18074:182;:172;18148:9;:19;;;18189:6;18217:5;:11;;;18074:52;:172::i;:182::-;16442:2812;18405:535;18431:499;;;;;;;;18476:9;:19;;;18431:499;;;;18520:5;:11;;;18431:499;;;;;;18556:5;18431:499;;;;;;18606:5;:16;;;18431:499;;;;;;18668:5;:16;;;18431:499;;;;;;18716:5;:17;;;18431:499;;;;;;18764:5;:17;;;18431:499;;;;;;18821:20;18431:499;;;;;;18883:9;:32;;;18431:499;;;;;18405:12;:535::i;:::-;18338:602;;;;18371:30;;;;18338:602;;;;;;;18339:30;;;;18338:602;;;18984:19;;19017:11;;;;19069:16;;19108;;;;19227:10;;;;18956:291;;;;;;18984:19;;19017:11;;19042:5;;19069:16;;18338:602;;;19227:10;18956:291;:::i;:::-;;;;;;;;16442:2812;;;;;;;:::o;3387:437:1:-;3576:12;3654:59;3728:9;3751:22;3787:20;3611:206;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3387:437:1;;;;;:::o;3830:375::-;3988:12;4066:59;4140:9;4163:6;4183:5;4023:175;;;;;;;;;;:::i;8885:430:17:-;8975:43;9033:35;:33;:35::i;:::-;9199:38;:49;;;;;;;;;;;;:61;;1376:8;9199:61;;;9276:32;8975:93;;-1:-1:-1;9276:32:17;;;;9238:9;;9302:5;;9276:32;:::i;2201:168:21:-;2283:79;;;;;2322:4;;2283:52;;:79;;2336:8;;2346:15;;2283:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7797:567:15;7913:18;7901:9;:30;:61;;;;-1:-1:-1;7935:10:15;7957:4;7935:27;;7901:61;7897:461;;;7978:20;8001:37;:9;8019:18;8001:17;:37::i;:::-;7978:60;;8053:12;8070:27;:49;;8127:12;8070:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8052:92;;;8163:7;8158:190;;8190:143;:133;8261:10;8293:12;8190:49;:133::i;7897:461::-;7797:567;:::o;3032:349:1:-;3179:12;3257:51;3323:12;3349:15;3214:160;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3032:349:1;;;;:::o;3721:2042:15:-;3826:18;4357:4;4351:11;4387:21;4382:3;4375:34;4502:5;4496:12;4482;4478:31;4471:4;4466:3;4462:14;4455:55;4614:4;4607:5;4603:16;4597:23;4583:12;4579:42;4572:4;4567:3;4563:14;4556:66;4728:4;4721:5;4717:16;4711:23;4696:13;4692:43;4685:4;4680:3;4676:14;4669:67;4842:4;4835:5;4831:16;4825:23;4810:13;4806:43;4799:4;4794:3;4790:14;4783:67;4964:4;4957:5;4953:16;4947:23;4932:13;4928:43;4921:4;4916:3;4912:14;4905:67;5071:4;5064:5;5060:16;5054:23;5040:12;5036:42;5029:4;5024:3;5020:14;5013:66;5178:4;5171:5;5167:16;5161:23;5147:12;5143:42;5136:4;5131:3;5127:14;5120:66;5287:4;5280:5;5276:16;5270:23;5256:12;5252:42;5244:5;5239:3;5235:15;5228:67;5402:5;5395;5391:17;5385:24;5371:12;5367:43;5359:5;5354:3;5350:15;5343:68;5492:5;5485;5481:17;5475:24;5467:5;5462:3;5458:15;5451:49;5601:5;5594;5590:17;5584:24;5570:12;5566:43;5558:5;5553:3;5549:15;5542:68;5691:5;5684;5680:17;5674:24;5666:5;5661:3;5657:15;5650:49;5741:5;5736:3;5726:21;5712:35;;;4326:1431;;;:::o;3247:300:32:-;3411:21;3464:46;3498:11;3464:25;:9;3482:6;3464:17;:25::i;:::-;:33;;:46::i;:::-;3448:62;3247:300;-1:-1:-1;;;;3247:300:32:o;5124:298:24:-;5267:7;5297:118;5332:5;:15;;;5348:5;5363:4;5332:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5383:22;;;;;:15;;;;;;:22;;5399:5;;5383:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2544:135:33:-;2629:7;2663:1;2659;:5;:13;;2671:1;2659:13;;;-1:-1:-1;2667:1:33;;2544:135;-1:-1:-1;2544:135:33:o;3834:545:32:-;3997:21;4237:104;4329:11;4237:70;4284:22;4329:11;4304:1;4284:19;:22::i;:::-;4237:25;:9;4255:6;4237:17;:25::i;:::-;:46;;:70::i;4618:401:33:-;4707:7;4738:17;4734:21;;4730:256;;;4771:204;4796:178;4859:82;4959:1;4796:45;:178::i;4771:204::-;-1:-1:-1;5010:1:33;4618:401::o;4028:1255:16:-;4251:11;;;;1321:66;-1:-1:-1;4243:47:16;;:110;;-1:-1:-1;4314:11:16;;;;1584:31;-1:-1:-1;4306:47:16;4243:110;4239:331;;;4377:182;:172;4442:71;4531:4;4377:47;:172::i;:182::-;4648:21;4621:23;;:48;;;;;;;;;4617:250;;;4685:171;:161;4750:60;4828:4;4685:47;:161::i;:171::-;4935:21;4908:23;;:48;;;;;;;;;4904:257;;;4972:178;:168;5037:67;5122:4;1380:337:3;1533:12;1611:52;1678:4;1696;1568:142;;;;;;;;;:::i;1606:335:27:-;1698:12;922:3;1899:9;1891:18;;;;;;;;1912:1;1891:22;1890:44;;;1606:335;-1:-1:-1;;1606:335:27:o;1492:331:1:-;1630:12;1708:49;1772:9;1795:11;1665:151;;;;;;;;;:::i;2629:397::-;2798:12;2876:66;2957:9;2980:5;2999:10;2833:186;;;;;;;;;;:::i;2220:403::-;2392:12;2470:67;2552:9;2575:6;2595:11;2427:189;;;;;;;;;;:::i;1829:385::-;1992:12;2070:64;2149:9;2172:6;2192:5;2027:180;;;;;;;;;;:::i;2236:520:23:-;2315:26;2357:23;2383;:21;:23::i;:::-;2357:49;-1:-1:-1;2420:20:23;2416:89;;2493:1;2486:8;;;;;2416:89;2514:25;2542:24;2559:6;2542:16;:24::i;:::-;2514:52;;2577:12;2602;2594:26;;2628:15;2594:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:72;;;2666:7;2658:59;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2734:15:23;;2236:520;-1:-1:-1;;;2236:520:23:o;19542:1738:20:-;19632:30;19664;19804:158;19839:10;:31;;;19884:68;19918:10;:33;;;19884:10;:22;;;:33;;;;:68;;;;:::i;:::-;19804:21;:158::i;:::-;19779:183;;20146:177;20200:22;20192:31;;20245:10;:22;;;20237:31;;20290:10;:22;;;20282:31;;20146:32;:177::i;:::-;20113:211;-1:-1:-1;20339:27:20;;;;;:58;;-1:-1:-1;20370:27:20;;;;20339:58;20335:132;;;-1:-1:-1;20451:1:20;;-1:-1:-1;20451:1:20;20443:13;;20335:132;20789:33;;;;:68;;:44;;20834:22;20789:44;:68::i;:::-;20523:334;;:48;:46;:48::i;:::-;:95;;:117;20619:10;:20;;;20523:117;;;;;;;;;;;:334;;;;20904:161;20938:10;:21;;;20973:10;:16;;;21003:10;:16;;;21033:22;20904:161;;:20;:161::i;:::-;21112;21146:10;:21;;;21181:10;:16;;;21211:10;:16;;;21241:22;21112:161;;:20;:161::i;:::-;19542:1738;;;:::o;1928:2914:24:-;2092:12;2114:23;2156:31;;;2182:4;2156:31;;2148:80;;;;;;;;;;;;:::i;:::-;2438:29;2461:5;2438:22;:29::i;:::-;2434:466;;;2603:37;;;;;2643:6;;2603:15;;;;;;:37;;2619:5;;2634:4;;2603:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;2599:291;;;2669:182;2725:5;2752;2779:2;2803:6;2669:182;;;;;;;;;;;;:34;:182::i;:::-;2869:7;;;;2599:291;2950:4;2944:11;3070:66;3065:3;3058:79;3184:12;3177:5;3173:24;3166:4;3161:3;3157:14;3150:48;3242:12;3238:2;3234:21;3227:4;3222:3;3218:14;3211:45;3292:6;3285:4;3280:3;3276:14;3269:30;3492:1;3473;3451:4;3430:3;3411:1;3380:12;3373:5;3369:24;3346:5;3324:183;3313:194;;3535:16;3599:6;3596:1;3589:4;3584:3;3580:14;3565:41;4203:1;4195:4;4190:3;4186:14;4180:21;4177:28;4121:2;4113:6;4110:14;4103:22;4074:179;4006:6;3999:14;3975:296;3897:7;3876:409;3865:420;;4309:7;4299:2;;4414:6;4409:3;4402:19;4452:3;4438:17;;4589:6;4582:4;4577:3;4573:14;4569:27;4563:4;4556:41;4299:2;;;4636:7;4631:205;;4659:166;4711:5;4734;4757:2;4777:6;4801:10;4659:34;:166::i;:::-;1928:2914;;;;;;:::o;1075:411:1:-;1251:12;1329:67;1411:9;1434:8;1456:13;1286:193;;;;;;;;;;:::i;1625:373:33:-;1711:7;1742:1;1738;:5;1734:236;;;1759:200;1784:174;1844:62;1924:1;1943;1784:42;:174::i;1759:200::-;-1:-1:-1;1986:5:33;;;1625:373::o;730:339:1:-;872:12;950:53;1018:8;1040:12;907:155;;;;;;;;;:::i;764:457:33:-;850:7;877:6;873:45;;-1:-1:-1;906:1:33;899:8;;873:45;939:5;;;943:1;939;:5;:1;958:5;;;;;:10;954:243;;984:202;1009:176;1069:64;1151:1;1170;1009:42;:176::i;1227:392::-;1313:7;1340:6;1336:232;;1362:195;1387:169;1447:57;1522:1;1541;1387:42;:169::i;1362:195::-;1577:9;1593:1;1589;:5;;;;;;;1227:392;-1:-1:-1;;;;1227:392:33:o;2004:::-;2090:7;2125:5;;;2144;;;2140:232;;;2165:196;2190:170;2250:58;2326:1;2345;2190:42;:170::i;1729:297:39:-;1869:12;966:10;1940:31;;1985:9;2008:1;1904:115;;;;;;;;;:::i;4123:181:23:-;4251:32;4259:23;4251:32;4286:11;4251:46;4123:181;:::o;3691:302::-;3780:12;3828:157;3888:24;3927:28;3969:6;3828:38;:157::i;3552:376:33:-;3641:7;3672:1;3668:5;;:1;:5;;;3664:236;;;3689:200;3714:174;3774:62;3854:1;3714:174;;3873:1;3714:174;;:42;:174::i;4477:135::-;4562:7;4596:1;4592:5;;:1;:5;;;:13;;4604:1;4592:13;;3934:395;4023:7;4058:5;;;4077;;;;;;;;4073:232;;;4098:196;4123:170;4183:58;4259:1;4123:170;;4278:1;4123:170;;:42;:170::i;5538:446:24:-;5639:21;5817:16;;;5875:2;5862:16;;5911:1;5894:15;;;;5890:23;;;5858:26;;;;5854:34;5851:63;5945:26;5941:30;;5940:37;;5538:446::o;6124:952::-;6385:157;;;;;6414:4;;6385:53;;:157;;6456:5;;6479;;6502:2;;6522:6;;6385:157;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6381:689;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6800:259;:249;6882:5;6906;6929:2;6949:6;6973:17;:24;7001:1;6973:29;;:62;;7025:10;6973:62;;;7005:17;6973:62;6800:56;:249::i;:259::-;6555:515;6381:689;;1401:322:39;1554:12;818:10;1625:28;;1667:9;1690:1;1705;1589:127;;;;;;;;;;:::i;1048:432:7:-;1331:139;;1185:35;;1331:139;;1361:10;;1385;;1409:6;;1448:12;;1331:139;;;:::i;:::-;;;;;;;;;;;;;;1321:150;;1331:139;1321:150;;;;;1048:432;-1:-1:-1;;;;1048:432:7:o;725:500:4:-;945:12;1023:87;1125:5;1144;1163:2;1179:6;1199:9;980:238;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;725:500:4;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;1287:776::-;;1427:3;1420:4;1412:6;1408:17;1404:27;1394:2;;-1:-1;;1435:12;1394:2;1482:6;1469:20;1504:103;1519:87;1599:6;1519:87;:::i;:::-;1504:103;:::i;:::-;1635:21;;;1495:112;-1:-1;1679:4;1692:14;;;;1667:17;;;1781;;;1772:27;;;;1769:36;-1:-1;1766:2;;;1818:1;;1808:12;1766:2;1843:1;1828:229;1853:6;1850:1;1847:13;1828:229;;;6611:6;6598:20;6623:56;6673:5;6623:56;:::i;:::-;1921:73;;2008:14;;;;2036;;;;1875:1;1868:9;1828:229;;;1832:14;;;;;1387:676;;;;:::o;4661:381::-;;;4820:3;4813:4;4805:6;4801:17;4797:27;4787:2;;-1:-1;;4828:12;4787:2;-1:-1;4858:20;;4898:18;4887:30;;4884:2;;;-1:-1;;4920:12;4884:2;4964:4;4956:6;4952:17;4940:29;;5015:3;4964:4;5007;4999:6;4995:17;4956:6;4981:32;;4978:41;4975:2;;;5032:1;;5022:12;4975:2;4780:262;;;;;:::o;5783:124::-;5847:20;;5872:30;5847:20;5872:30;:::i;7076:2030::-;;7193:6;;7181:9;7176:3;7172:19;7168:32;7165:2;;;-1:-1;;7203:12;7165:2;7231:22;7193:6;7231:22;:::i;:::-;7222:31;;;7341:72;7409:3;7385:22;7341:72;:::i;:::-;7323:16;7316:98;7514:72;7582:3;7481:2;7562:9;7558:22;7514:72;:::i;:::-;7481:2;7500:5;7496:16;7489:98;7688:49;7733:3;7655:2;7713:9;7709:22;7688:49;:::i;:::-;7655:2;7674:5;7670:16;7663:75;7839:49;7884:3;7806:2;7864:9;7860:22;7839:49;:::i;:::-;7806:2;7825:5;7821:16;7814:75;7999:49;8044:3;7965;8024:9;8020:22;7999:49;:::i;:::-;7965:3;7985:5;7981:16;7974:75;8145:49;8190:3;8111;8170:9;8166:22;8145:49;:::i;:::-;8111:3;8131:5;8127:16;8120:75;8291:49;8336:3;8257;8316:9;8312:22;8291:49;:::i;:::-;8257:3;8277:5;8273:16;8266:75;8438:49;8483:3;8404;8463:9;8459:22;8438:49;:::i;:::-;8404:3;8424:5;8420:16;8413:75;8557:3;8593:49;8638:3;8557;8618:9;8614:22;8593:49;:::i;:::-;8573:18;;;8566:77;8704:3;8761:22;;;6116:20;8720:18;;;8713:77;8853:3;8889:48;8933:3;8909:22;;;8889:48;:::i;:::-;8853:3;8873:5;8869:18;8862:76;;8999:3;;9060:9;9056:22;12980:20;8999:3;9019:5;9015:18;9008:77;;7159:1947;;;;:::o;9893:1713::-;;10008:6;;9996:9;9991:3;9987:19;9983:32;9980:2;;;-1:-1;;10018:12;9980:2;10046:22;10008:6;10046:22;:::i;:::-;10037:31;;;10156:72;10224:3;10200:22;10156:72;:::i;:::-;10138:16;10131:98;10329:72;10397:3;10296:2;10377:9;10373:22;10329:72;:::i;:::-;10296:2;10315:5;10311:16;10304:98;10503:49;10548:3;10470:2;10528:9;10524:22;10503:49;:::i;:::-;10470:2;10489:5;10485:16;10478:75;10654:49;10699:3;10621:2;10679:9;10675:22;10654:49;:::i;:::-;10621:2;10640:5;10636:16;10629:75;10800:49;10845:3;10766;10825:9;10821:22;10800:49;:::i;:::-;10766:3;10786:5;10782:16;10775:75;10946:49;10991:3;10912;10971:9;10967:22;10946:49;:::i;:::-;10912:3;10932:5;10928:16;10921:75;11095:49;11140:3;11061;11120:9;11116:22;11095:49;:::i;:::-;11061:3;11081:5;11077:16;11070:75;11206:3;11265:9;11261:22;6116:20;11206:3;11226:5;11222:16;11215:75;11353:3;11389:48;11433:3;11353;11413:9;11409:22;11389:48;:::i;:::-;11353:3;11373:5;11369:18;11362:76;;11499:3;;11560:9;11556:22;12980:20;11499:3;11519:5;11515:18;11508:77;;9974:1632;;;;:::o;11855:773::-;;11971:4;11959:9;11954:3;11950:19;11946:30;11943:2;;;-1:-1;;11979:12;11943:2;12007:20;11971:4;12007:20;:::i;:::-;11998:29;;6962:6;6949:20;74244:1;74237:5;74234:12;74224:2;;-1:-1;;74250:12;74224:2;12093:93;;12277:47;12320:3;12244:2;12296:22;;12277:47;:::i;:::-;12244:2;12263:5;12259:16;12252:73;12383:2;12441:9;12437:22;6116:20;12383:2;12402:5;12398:16;12391:75;12524:2;12582:9;12578:22;6116:20;12524:2;12543:5;12539:16;12532:75;11937:691;;;;:::o;12635:130::-;12702:20;;12727:33;12702:20;12727:33;:::i;13191:128::-;13257:20;;70302:18;70291:30;;74582:34;;74572:2;;74630:1;;74620:12;13326:126;13391:20;;70404:4;70393:16;;74703:33;;74693:2;;74750:1;;74740:12;13459:496;;;13602:2;13590:9;13581:7;13577:23;13573:32;13570:2;;;-1:-1;;13608:12;13570:2;13666:17;13653:31;13704:18;13696:6;13693:30;13690:2;;;-1:-1;;13726:12;13690:2;13802:22;;270:4;258:17;;254:27;-1:-1;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;659:14;13746:88;;;13889:50;13931:7;506:4;13911:9;13907:22;13889:50;:::i;:::-;13879:60;;;;;;;13564:391;;;;;:::o;13962:397::-;;;14101:2;14089:9;14080:7;14076:23;14072:32;14069:2;;;-1:-1;;14107:12;14069:2;14165:17;14152:31;14203:18;;14195:6;14192:30;14189:2;;;-1:-1;;14225:12;14189:2;14326:6;14315:9;14311:22;;;1023:3;1016:4;1008:6;1004:17;1000:27;990:2;;-1:-1;;1031:12;990:2;1074:6;1061:20;14203:18;1093:6;1090:30;1087:2;;;-1:-1;;1123:12;1087:2;1218:3;14101:2;;1202:6;1198:17;1159:6;1184:32;;1181:41;1178:2;;;-1:-1;;1225:12;1178:2;14101;1155:17;;;;;14245:98;;-1:-1;14063:296;;-1:-1;;;;14063:296::o;14366:991::-;;;;14625:2;14613:9;14604:7;14600:23;14596:32;14593:2;;;-1:-1;;14631:12;14593:2;14689:17;14676:31;14727:18;;14719:6;14716:30;14713:2;;;-1:-1;;14749:12;14713:2;14779:101;14872:7;14863:6;14852:9;14848:22;14779:101;:::i;:::-;14769:111;;14945:2;;;;14934:9;14930:18;14917:32;14727:18;14961:6;14958:30;14955:2;;;-1:-1;;14991:12;14955:2;15021:101;15114:7;15105:6;15094:9;15090:22;15021:101;:::i;:::-;15011:111;;;15187:2;15176:9;15172:18;15159:32;14727:18;15203:6;15200:30;15197:2;;;-1:-1;;15233:12;15197:2;15309:22;;;-1:-1;5178:4;5166:17;;5162:27;-1:-1;5152:2;;-1:-1;;5193:12;5152:2;5240:6;5227:20;5262:80;5277:64;5334:6;5277:64;:::i;5262:80::-;5370:21;;;5427:14;;;;5402:17;;;5516;;;5507:27;;;;5504:36;-1:-1;5501:2;;;-1:-1;;5543:12;5501:2;-1:-1;5569:10;;5563:206;5588:6;5585:1;5582:13;5563:206;;;12980:20;;5656:50;;5610:1;5603:9;;;;;5720:14;;;;5748;;5563:206;;;5567:14;15253:88;;;;;;;;14587:770;;;;;:::o;15364:796::-;;;;;15614:2;15602:9;15593:7;15589:23;15585:32;15582:2;;;-1:-1;;15620:12;15582:2;15678:17;15665:31;15716:18;;15708:6;15705:30;15702:2;;;-1:-1;;15738:12;15702:2;15869:6;15858:9;15854:22;;;2274:3;2267:4;2259:6;2255:17;2251:27;2241:2;;-1:-1;;2282:12;2241:2;2325:6;2312:20;15716:18;2344:6;2341:30;2338:2;;;-1:-1;;2374:12;2338:2;2471:3;2418:4;2461:6;2453;2449:19;2410:6;2435:34;;2432:43;2429:2;;;-1:-1;;2478:12;2429:2;2418:4;2406:17;;;;-1:-1;15758:128;-1:-1;15936:18;;;15923:32;;15964:30;;;15961:2;;;-1:-1;;15997:12;15961:2;;16035:109;16136:7;16127:6;16116:9;16112:22;16035:109;:::i;:::-;15576:584;;;;-1:-1;16017:127;-1:-1;;;;15576:584::o;16167:433::-;;16324:2;;16312:9;16303:7;16299:23;16295:32;16292:2;;;-1:-1;;16330:12;16292:2;16388:17;16375:31;16426:18;16418:6;16415:30;16412:2;;;-1:-1;;16448:12;16412:2;16552:22;;2687:4;2675:17;;2671:27;-1:-1;2661:2;;-1:-1;;2702:12;2661:2;2749:6;2736:20;2771:108;2786:92;2871:6;2786:92;:::i;2771:108::-;2907:21;;;2964:14;;;;2939:17;;;3065:6;3053:19;;;3044:29;;;;3041:38;-1:-1;3038:2;;;-1:-1;;3082:12;3038:2;-1:-1;3108:10;;3102:236;3127:6;3124:1;3121:13;3102:236;;;3207:65;3268:3;3256:10;3207:65;:::i;:::-;3195:78;;3149:1;3142:9;;;;;3287:14;;;;3315:16;;;;3102:236;;;-1:-1;16468:116;;16286:314;-1:-1;;;;;;;;16286:314::o;16607:792::-;;;;;16855:2;16843:9;16834:7;16830:23;16826:32;16823:2;;;-1:-1;;16861:12;16823:2;16919:17;16906:31;16957:18;;16949:6;16946:30;16943:2;;;-1:-1;;16979:12;16943:2;17108:6;17097:9;17093:22;;;3551:3;3544:4;3536:6;3532:17;3528:27;3518:2;;-1:-1;;3559:12;3518:2;3602:6;3589:20;16957:18;3621:6;3618:30;3615:2;;;-1:-1;;3651:12;3615:2;3748:3;3695:4;3738:6;3730;3726:19;3687:6;3712:34;;3709:43;3706:2;;;-1:-1;;3755:12;17406:429;;17561:2;;17549:9;17540:7;17536:23;17532:32;17529:2;;;-1:-1;;17567:12;17529:2;17625:17;17612:31;17663:18;17655:6;17652:30;17649:2;;;-1:-1;;17685:12;17649:2;17787:22;;3960:4;3948:17;;3944:27;-1:-1;3934:2;;-1:-1;;3975:12;3934:2;4022:6;4009:20;4044:106;4059:90;4142:6;4059:90;:::i;4044:106::-;4178:21;;;4235:14;;;;4210:17;;;4336:6;4324:19;;;4315:29;;;;4312:38;-1:-1;4309:2;;;-1:-1;;4353:12;4309:2;-1:-1;4379:10;;4373:234;4398:6;4395:1;4392:13;4373:234;;;4478:63;4537:3;4525:10;4478:63;:::i;:::-;4466:76;;4420:1;4413:9;;;;;4556:14;;;;4584:16;;;;4373:234;;17842:303;;17977:2;17965:9;17956:7;17952:23;17948:32;17945:2;;;-1:-1;;17983:12;17945:2;6431:6;6425:13;6443:53;6490:5;6443:53;:::i;18152:583::-;;;;18336:2;18324:9;18315:7;18311:23;18307:32;18304:2;;;-1:-1;;18342:12;18304:2;6611:6;6598:20;6623:56;6673:5;6623:56;:::i;:::-;18394:86;-1:-1;18517:2;18579:22;;6598:20;6623:56;6598:20;6623:56;:::i;:::-;18298:437;;18525:86;;-1:-1;;;18648:2;18687:22;;;;12980:20;;18298:437::o;18742:298::-;;18874:3;18862:9;18853:7;18849:23;18845:33;18842:2;;;-1:-1;;18881:12;18842:2;18943:81;19016:7;18992:22;18943:81;:::i;19047:482::-;;;19213:9;19204:7;19200:23;19225:3;19200:23;19196:33;19193:2;;;-1:-1;;19232:12;19193:2;19294:81;19367:7;19343:22;19294:81;:::i;:::-;19284:91;;11764:3;11746:16;;;11742:26;11739:2;;;-1:-1;;11771:12;11739:2;;19412:3;19485:9;19481:22;19421:92;;19187:342;;;;;:::o;19536:604::-;;;;19729:3;19717:9;19708:7;19704:23;19700:33;19697:2;;;-1:-1;;19736:12;19697:2;19798:81;19871:7;19847:22;19798:81;:::i;:::-;19788:91;;19935:80;20007:7;19916:3;19987:9;19983:22;19935:80;:::i;:::-;19925:90;;20052:3;20096:9;20092:22;12702:20;12727:33;12754:5;12727:33;:::i;:::-;20061:63;;;;19691:449;;;;;:::o;20147:856::-;;;;;;20374:3;20362:9;20353:7;20349:23;20345:33;20342:2;;;-1:-1;;20381:12;20342:2;20443:81;20516:7;20492:22;20443:81;:::i;:::-;20433:91;;20580:80;20652:7;20561:3;20632:9;20628:22;20580:80;:::i;:::-;20570:90;;20697:3;20741:9;20737:22;12702:20;12727:33;12754:5;12727:33;:::i;:::-;20706:63;-1:-1;20806:3;20846:22;;72:20;97:33;72:20;97:33;:::i;:::-;20815:63;-1:-1;20915:3;20955:22;;72:20;97:33;72:20;97:33;:::i;:::-;20924:63;;;;20336:667;;;;;;;;:::o;21010:585::-;;;;21171:9;21162:7;21158:23;21183:3;21158:23;21154:33;21151:2;;;-1:-1;;21190:12;21151:2;9278:4;9257:19;9253:30;9250:2;;;-1:-1;;9286:12;9250:2;;9314:20;9278:4;9314:20;:::i;:::-;9453:22;6264:13;9403:16;9396:86;9545:2;9630:9;9626:22;6785:13;74125:1;74118:5;74115:12;74105:2;;-1:-1;;74131:12;74105:2;9545;9560:16;;9553:102;9734:2;9799:22;;12850:13;12868:33;12850:13;12868:33;:::i;:::-;9734:2;9749:16;;9742:86;9278:4;21430:22;;12850:13;9753:5;;-1:-1;12868:33;12850:13;12868:33;:::i;:::-;21499:3;21547:22;;5989:13;21388:74;;-1:-1;6007:30;5989:13;6007:30;:::i;21602:294::-;;21732:3;21720:9;21711:7;21707:23;21703:33;21700:2;;;-1:-1;;21739:12;21700:2;21801:79;21872:7;21848:22;21801:79;:::i;21903:474::-;;;22077:3;22065:9;22056:7;22052:23;22048:33;22045:2;;;-1:-1;;22084:12;22045:2;22146:79;22217:7;22193:22;22146:79;:::i;:::-;22136:89;;22281:80;22353:7;22262:3;22333:9;22329:22;22281:80;:::i;:::-;22271:90;;22039:338;;;;;:::o;22384:600::-;;;;22575:3;22563:9;22554:7;22550:23;22546:33;22543:2;;;-1:-1;;22582:12;22543:2;22644:79;22715:7;22691:22;22644:79;:::i;:::-;22634:89;;22779:80;22851:7;22760:3;22831:9;22827:22;22779:80;:::i;:::-;22769:90;;22896:3;22940:9;22936:22;12702:20;12727:33;12754:5;12727:33;:::i;22991:726::-;;;;;23199:3;23187:9;23178:7;23174:23;23170:33;23167:2;;;-1:-1;;23206:12;23167:2;23268:79;23339:7;23315:22;23268:79;:::i;:::-;23258:89;;23403:80;23475:7;23384:3;23455:9;23451:22;23403:80;:::i;:::-;23393:90;;23520:3;23564:9;23560:22;12702:20;12727:33;12754:5;12727:33;:::i;:::-;23529:63;-1:-1;23629:3;23669:22;;72:20;97:33;72:20;97:33;:::i;:::-;23161:556;;;;-1:-1;23161:556;;-1:-1;;23161:556::o;23724:296::-;;23855:3;23843:9;23834:7;23830:23;23826:33;23823:2;;;-1:-1;;23862:12;23823:2;23924:80;23996:7;23972:22;23924:80;:::i;24027:263::-;;24142:2;24130:9;24121:7;24117:23;24113:32;24110:2;;;-1:-1;;24148:12;24110:2;-1:-1;13128:13;;24104:186;-1:-1;24104:186::o;24650:281::-;;24791:100;24887:3;24879:6;24791:100;:::i;:::-;-1:-1;;24920:4;24911:14;;24784:147::o;24940:173::-;69881:34;69870:46;41579:37;;25102:4;25093:14;;25020:93::o;25270:103::-;70001:42;69990:54;25331:37;;25325:48::o;26413:666::-;;26597:5;64339:12;65708:6;65703:3;65696:19;65745:4;;65740:3;65736:14;26609:90;;65745:4;26767:5;63695:14;-1:-1;26806:251;26831:6;26828:1;26825:13;26806:251;;;26892:13;;68369;68362:21;28864:34;;24621:14;;;;65182;;;;26853:1;26846:9;26806:251;;;-1:-1;27063:10;;26531:548;-1:-1;;;;;26531:548::o;29682:343::-;;29824:5;64339:12;65708:6;65703:3;65696:19;-1:-1;71970:101;71984:6;71981:1;71978:13;71970:101;;;65745:4;72051:11;;;;;72045:18;72032:11;;;;;72025:39;71999:10;71970:101;;;72086:6;72083:1;72080:13;72077:2;;;-1:-1;65745:4;72142:6;65740:3;72133:16;;72126:27;72077:2;-1:-1;72621:2;72601:14;72617:7;72597:28;29981:39;;;;65745:4;29981:39;;29772:253;-1:-1;;29772:253::o;36900:663::-;37114:16;37108:23;29244:3;29237:37;37281:4;37274:5;37270:16;37264:23;73064:1;73057:5;73054:12;73044:2;;73070:9;73044:2;37281:4;37355:14;;30799:64;37467:4;37456:16;;;37450:23;69881:34;69870:46;37527:14;;41579:37;37010:553::o;40585:926::-;6962:6;6949:20;74244:1;74237:5;74234:12;74224:2;;74260:1;;74250:12;74224:2;69111:53;69158:5;69111:53;:::i;:::-;30952:66;;68072:12;;;70404:4;68048:37;68072:12;67575:2;67566:12;;68048:37;:::i;:::-;70393:16;67575:2;41119:14;;42259:35;6116:20;68072:12;41297:14;;29237:37;67228:12;;;;6116:20;41475:14;;29237:37;40707:804::o;41518:103::-;69881:34;69870:46;41579:37;;41573:48::o;42095:100::-;70302:18;70291:30;42154:36;;42148:47::o;42420:665::-;68467:66;68456:78;;;;29108:56;;72712:2;72708:14;;;;;;42725:1;42716:11;;25589:58;42826:12;;;29237:37;42937:12;;;29237:37;43048:12;;;42618:467::o;43092:659::-;31875:66;31855:87;;31840:1;31961:11;;29237:37;;;;43603:12;;;29237:37;43714:12;;;43337:414::o;43758:379::-;44122:10;43946:191::o;44144:222::-;70001:42;69990:54;;;;25331:37;;44271:2;44256:18;;44242:124::o;44618:476::-;70001:42;69990:54;;;25200:58;;69990:54;;;;44997:2;44982:18;;25200:58;45080:2;45065:18;;29237:37;;;;44817:2;44802:18;;44788:306::o;45101:572::-;70001:42;69990:54;;;25200:58;;69990:54;;;45493:2;45478:18;;25331:37;69990:54;;45576:2;45561:18;;25331:37;45659:2;45644:18;;29237:37;;;;45320:3;45305:19;;45291:382::o;45680:596::-;;45915:2;45904:9;45900:18;70001:42;;68179:5;69990:54;25207:3;25200:58;46041:2;45915;46041;46030:9;46026:18;46019:48;46081:108;25883:5;64339:12;65708:6;65703:3;65696:19;65736:14;45904:9;65736:14;25895:93;;46041:2;26059:5;63695:14;26071:21;;-1:-1;26098:260;26123:6;26120:1;26117:13;26098:260;;;26184:13;;69990:54;;25331:37;;65182:14;;;;24451;;;;26145:1;26138:9;26098:260;;;26102:14;;46073:116;;;;;;;28891:5;68369:13;68362:21;46262:2;46251:9;46247:18;28864:34;45886:390;;;;;;:::o;46283:333::-;70001:42;69990:54;;;25331:37;;69990:54;;46602:2;46587:18;;25331:37;46438:2;46423:18;;46409:207::o;46623:752::-;;70001:42;;25361:5;69990:54;25338:3;25331:37;70001:42;25361:5;69990:54;47045:2;47034:9;47030:18;25331:37;70001:42;25361:5;69990:54;47128:2;47117:9;47113:18;25331:37;;29267:5;47211:2;47200:9;47196:18;29237:37;46880:3;47248;47237:9;47233:19;47226:49;47289:76;46880:3;46869:9;46865:19;47351:6;47289:76;:::i;:::-;47281:84;46851:524;-1:-1;;;;;;;46851:524::o;47382:333::-;70001:42;69990:54;;;;25331:37;;47701:2;47686:18;;29237:37;47537:2;47522:18;;47508:207::o;47722:984::-;;48103:2;48092:9;48088:18;48103:2;48124:17;48117:47;48178:162;27440:5;64339:12;27459:113;27565:6;27560:3;27459:113;:::i;:::-;27452:120;;63704:4;;;;27670:5;63695:14;-1:-1;27709:341;27734:6;27731:1;27728:13;27709:341;;;27822:117;27935:3;27801:6;27795:13;27822:117;:::i;:::-;27815:124;-1:-1;65182:14;;;;27756:1;27749:9;27709:341;;;27713:14;;;48388:9;48382:4;48378:20;63704:4;48362:9;48358:18;48351:48;48413:108;28304:5;64339:12;28323:86;28402:6;28397:3;28323:86;:::i;:::-;28316:93;;63704:4;28480:5;63695:14;28492:21;;-1:-1;28519:260;28544:6;28541:1;28538:13;28519:260;;;28632:63;28691:3;28611:6;28605:13;28632:63;:::i;:::-;65182:14;;;;28625:70;-1:-1;27756:1;28559:9;28519:260;;;28523:14;;48569:9;48563:4;48559:20;48554:2;48543:9;48539:18;48532:48;48594:102;48691:4;48682:6;48594:102;:::i;:::-;48586:110;48074:632;-1:-1;;;;;;;;48074:632::o;48713:222::-;29237:37;;;48840:2;48825:18;;48811:124::o;48942:333::-;29237:37;;;70001:42;69990:54;49261:2;49246:18;;25331:37;49097:2;49082:18;;49068:207::o;49282:444::-;29237:37;;;70001:42;69990:54;;;49629:2;49614:18;;25331:37;69990:54;49712:2;49697:18;;25331:37;49465:2;49450:18;;49436:290::o;49733:1342::-;29237:37;;;70001:42;69990:54;;;50306:2;50291:18;;25331:37;69990:54;;;50389:2;50374:18;;25331:37;69990:54;;;50472:2;50457:18;;25331:37;69990:54;;;50555:3;50540:19;;25331:37;69990:54;;;;50639:3;50624:19;;25331:37;69881:34;69870:46;;;50723:3;50708:19;;41579:37;69870:46;;50807:3;50792:19;;41579:37;69870:46;;;50891:3;50876:19;;41579:37;50975:3;50960:19;;29237:37;;;;51060:3;51045:19;;29237:37;50141:3;50126:19;;50112:963::o;51082:1004::-;29237:37;;;70001:42;69990:54;;;51570:2;51555:18;;25331:37;69990:54;;;51653:2;51638:18;;25331:37;69990:54;;;51736:2;51721:18;;25331:37;69990:54;;51819:3;51804:19;;25331:37;69881:34;69870:46;;;51903:3;51888:19;;41579:37;69870:46;;;51987:3;51972:19;;41579:37;52071:3;52056:19;;29237:37;51405:3;51390:19;;51376:710::o;52093:444::-;29237:37;;;52440:2;52425:18;;29237:37;;;;52523:2;52508:18;;29237:37;52276:2;52261:18;;52247:290::o;52544:325::-;29237:37;;;70404:4;70393:16;52855:2;52840:18;;42259:35;52695:2;52680:18;;52666:203::o;52876:548::-;29237:37;;;70404:4;70393:16;;;;53244:2;53229:18;;42259:35;53327:2;53312:18;;29237:37;53410:2;53395:18;;29237:37;53083:3;53068:19;;53054:370::o;53431:218::-;68697:66;68686:78;;;;29634:36;;53556:2;53541:18;;53527:122::o;53656:329::-;68697:66;68686:78;;;;29634:36;;70001:42;69990:54;53971:2;53956:18;;25331:37;53809:2;53794:18;;53780:205::o;54601:480::-;54802:2;54787:18;;72829:1;72819:12;;72809:2;;72835:9;72809:2;30469:68;;;54984:2;54969:18;;29237:37;;;;55067:2;55052:18;;;29237:37;54773:308;:::o;55088:375::-;55264:2;55249:18;;69111:53;69158:5;69111:53;:::i;:::-;30641:71;;;55449:2;55434:18;29237:37;55235:228;:::o;55470:395::-;55656:2;55641:18;;73311:1;73301:12;;73291:2;;73317:9;55872:310;;56019:2;56040:17;56033:47;56094:78;56019:2;56008:9;56004:18;56158:6;56094:78;:::i;56189:416::-;56389:2;56403:47;;;32211:2;56374:18;;;65696:19;32247:34;65736:14;;;32227:55;32316:14;32302:12;;;32295:36;32350:12;;;56360:245::o;56612:416::-;56812:2;56826:47;;;32601:2;56797:18;;;65696:19;32637:34;65736:14;;;32617:55;32706:9;32692:12;;;32685:31;32735:12;;;56783:245::o;57035:416::-;57235:2;57249:47;;;33291:2;57220:18;;;65696:19;33327:34;65736:14;;;33307:55;33396:26;33382:12;;;33375:48;33442:12;;;57206:245::o;57458:416::-;57658:2;57672:47;;;33693:2;57643:18;;;65696:19;33729:34;65736:14;;;33709:55;33798:6;33784:12;;;33777:28;33824:12;;;57629:245::o;57881:416::-;58081:2;58095:47;;;34075:2;58066:18;;;65696:19;34111:34;65736:14;;;34091:55;34180:9;34166:12;;;34159:31;34209:12;;;58052:245::o;58304:563::-;58573:3;58558:19;;67411:2;67402:12;;34614:86;58562:9;67353:62;67402:12;34591:16;67353:62;:::i;:::-;34614:86;:::i;:::-;34768:73;34824:16;34817:5;34768:73;:::i;:::-;34748:93;;34847:86;67411:2;34922:3;34918:14;34904:12;34847:86;:::i;:::-;;35002:50;35046:4;35039:5;35035:16;35028:5;35002:50;:::i;:::-;35058:63;35046:4;35110:3;35106:14;35092:12;35058:63;:::i;:::-;;35190:50;35234:4;35227:5;35223:16;35216:5;35190:50;:::i;:::-;35246:63;35234:4;35298:3;35294:14;35280:12;35246:63;:::i;:::-;;35386:50;35430:4;35423:5;35419:16;35412:5;35386:50;:::i;:::-;35442:63;35430:4;35494:3;35490:14;35476:12;35442:63;:::i;:::-;;35568:50;35612:4;35605:5;35601:16;35594:5;35568:50;:::i;:::-;35624:63;35612:4;35676:3;35672:14;35658:12;35624:63;:::i;:::-;;35750:50;35794:4;35787:5;35783:16;35776:5;35750:50;:::i;:::-;35806:63;35794:4;35858:3;35854:14;35840:12;35806:63;:::i;:::-;;35933:50;35977:4;35970:5;35966:16;35959:5;35933:50;:::i;:::-;35989:63;35977:4;36041:3;36037:14;36023:12;35989:63;:::i;:::-;;36166:6;36122:52;36166:6;36159:5;36155:18;36148:5;36122:52;:::i;:::-;36180:65;36166:6;36232:3;36228:16;36214:12;36180:65;:::i;:::-;-1:-1;;36351:6;36340:18;;;6116:20;36413:16;;;29237:37;36537:6;36494:51;36526:18;;;36344:5;36494:51;:::i;:::-;36551:63;36537:6;36601:3;36597:16;36583:12;36551:63;:::i;:::-;-1:-1;;36720:6;36709:18;;;12980:20;36782:16;;;29237:37;58728:129;58852:3;58837:19;;58828:6;58728:129;:::i;58874:330::-;59055:2;59040:18;;59069:125;59044:9;59167:6;59069:125;:::i;59211:542::-;59442:3;59427:19;;59457:125;59431:9;59555:6;59457:125;:::i;:::-;69881:34;41609:5;69870:46;59661:2;59650:9;59646:18;41579:37;28891:5;68369:13;68362:21;59738:3;59727:9;59723:19;28864:34;59413:340;;;;;;:::o;59760:555::-;60025:3;60010:19;;67411:2;67402:12;;38694:86;60014:9;67353:62;67402:12;38671:16;67353:62;:::i;38694:86::-;38848:73;38904:16;38897:5;38848:73;:::i;:::-;38828:93;;38927:86;67411:2;39002:3;38998:14;38984:12;38927:86;:::i;:::-;;39082:50;39126:4;39119:5;39115:16;39108:5;39082:50;:::i;:::-;39138:63;39126:4;39190:3;39186:14;39172:12;39138:63;:::i;:::-;;39270:50;39314:4;39307:5;39303:16;39296:5;39270:50;:::i;:::-;39326:63;39314:4;39378:3;39374:14;39360:12;39326:63;:::i;:::-;;39452:50;39496:4;39489:5;39485:16;39478:5;39452:50;:::i;:::-;39508:63;39496:4;39560:3;39556:14;39542:12;39508:63;:::i;:::-;;39634:50;39678:4;39671:5;39667:16;39660:5;39634:50;:::i;:::-;39690:63;39678:4;39742:3;39738:14;39724:12;39690:63;:::i;:::-;;39819:50;39863:4;39856:5;39852:16;39845:5;39819:50;:::i;:::-;39875:63;39863:4;39927:3;39923:14;39909:12;39875:63;:::i;:::-;;40044:4;40037:5;40033:16;6116:20;40044:4;40108:3;40104:14;29237:37;40226:6;40183:51;40226:6;40219:5;40215:18;40208:5;40183:51;:::i;:::-;40240:63;40226:6;40290:3;40286:16;40272:12;40240:63;:::i;:::-;-1:-1;;40409:6;40398:18;;;12980:20;40471:16;;;29237:37;60176:129;60300:3;60285:19;;60276:6;60176:129;:::i;60322:222::-;69881:34;69870:46;;;;41579:37;;60449:2;60434:18;;60420:124::o;60551:333::-;69881:34;69870:46;;;41579:37;;69870:46;;60870:2;60855:18;;41579:37;60706:2;60691:18;;60677:207::o;61120:333::-;29237:37;;;61439:2;61424:18;;29237:37;61275:2;61260:18;;61246:207::o;61460:218::-;70207:10;70196:22;;;;42047:36;;61585:2;61570:18;;61556:122::o;61685:256::-;61747:2;61741:9;61773:17;;;61848:18;61833:34;;61869:22;;;61830:62;61827:2;;;61905:1;;61895:12;61827:2;61747;61914:22;61725:216;;-1:-1;61725:216::o;61948:304::-;;62107:18;62099:6;62096:30;62093:2;;;-1:-1;;62129:12;62093:2;-1:-1;62174:4;62162:17;;;62227:15;;62030:222::o;67000:119::-;;85:6;72:20;97:33;124:5;97:33;:::i;67594:119::-;;12715:6;12702:20;12727:33;12754:5;12727:33;:::i;67850:117::-;;13270:6;13257:20;70302:18;74609:5;70291:30;74585:5;74582:34;74572:2;;-1:-1;;74620:12;72740:111;72829:1;72822:5;72819:12;72809:2;;72835:9;73340:117;70001:42;73427:5;69990:54;73402:5;73399:35;73389:2;;73448:1;;73438:12;73464:111;73545:5;68369:13;68362:21;73523:5;73520:32;73510:2;;73566:1;;73556:12;74276:117;69881:34;74363:5;69870:46;74338:5;74335:35;74325:2;;74384:1;;74374:12"
|
|
},
|
|
"methodIdentifiers": {
|
|
"EIP712_DOMAIN_SEPARATOR()": "dab400f3",
|
|
"FEATURE_NAME()": "6ae4b4f7",
|
|
"FEATURE_VERSION()": "031b905c",
|
|
"GREEDY_TOKENS_BLOOM_FILTER()": "d925a56d",
|
|
"PROTOCOL_FEE_MULTIPLIER()": "a0edcef5",
|
|
"_fillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128,address,address)": "414e4ccf",
|
|
"_fillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128,address)": "a656186b",
|
|
"batchCancelLimitOrders((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256)[])": "9baa45a8",
|
|
"batchCancelPairLimitOrders(address[],address[],uint256[])": "86a0c8d7",
|
|
"batchCancelPairRfqOrders(address[],address[],uint256[])": "0f0e8cf7",
|
|
"batchCancelRfqOrders((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256)[])": "f6e0f6a5",
|
|
"batchGetLimitOrderRelevantStates((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256)[],(uint8,uint8,bytes32,bytes32)[])": "b4658bfb",
|
|
"batchGetRfqOrderRelevantStates((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256)[],(uint8,uint8,bytes32,bytes32)[])": "ad354eeb",
|
|
"cancelLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": "7d49ec1a",
|
|
"cancelPairLimitOrders(address,address,uint256)": "d0a55fb0",
|
|
"cancelPairRfqOrders(address,address,uint256)": "9a4f809c",
|
|
"cancelRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": "fe55a3ef",
|
|
"fillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": "f6274f66",
|
|
"fillOrKillLimitOrder((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": "9240529c",
|
|
"fillOrKillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": "438cdfc5",
|
|
"fillRfqOrder((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32),uint128)": "aa77476c",
|
|
"getLimitOrderHash((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": "dd11d225",
|
|
"getLimitOrderInfo((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256))": "95480889",
|
|
"getLimitOrderRelevantState((address,address,uint128,uint128,uint128,address,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32))": "1fb09795",
|
|
"getProtocolFeeMultiplier()": "487b5c20",
|
|
"getRfqOrderHash((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": "016a6d65",
|
|
"getRfqOrderInfo((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256))": "346693c5",
|
|
"getRfqOrderRelevantState((address,address,uint128,uint128,address,address,address,bytes32,uint64,uint256),(uint8,uint8,bytes32,bytes32))": "37f381d8",
|
|
"migrate()": "8fd3ab80",
|
|
"registerAllowedRfqOrigins(address[],bool)": "b09f1fb1",
|
|
"transferProtocolFeesForPools(bytes32[])": "3cd2f026"
|
|
}
|
|
}
|
|
},
|
|
"sourceTreeHashHex": "0x2cdbdee95e24b2edc0fdfbf1a87bac79afa9e5c27a642f4ba9fbb9ce08747b1a",
|
|
"sources": {
|
|
"./NativeOrdersFeature.sol": {
|
|
"id": 8,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"../migrations/LibMigrate.sol\";\nimport \"./interfaces/IFeature.sol\";\nimport \"./interfaces/INativeOrdersFeature.sol\";\nimport \"./native_orders/NativeOrdersSettlement.sol\";\n\n\n/// @dev Feature for interacting with limit and RFQ orders.\ncontract NativeOrdersFeature is\n IFeature,\n NativeOrdersSettlement\n{\n /// @dev Name of this feature.\n string public constant override FEATURE_NAME = \"LimitOrders\";\n /// @dev Version of this feature.\n uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1);\n\n constructor(\n address zeroExAddress,\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier,\n bytes32 greedyTokensBloomFilter\n )\n public\n NativeOrdersSettlement(\n zeroExAddress,\n weth,\n staking,\n feeCollectorController,\n protocolFeeMultiplier,\n greedyTokensBloomFilter\n )\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Initialize and register this feature.\n /// Should be delegatecalled by `Migrate.migrate()`.\n /// @return success `LibMigrate.SUCCESS` on success.\n function migrate()\n external\n returns (bytes4 success)\n {\n _registerFeatureFunction(this.transferProtocolFeesForPools.selector);\n _registerFeatureFunction(this.fillLimitOrder.selector);\n _registerFeatureFunction(this.fillRfqOrder.selector);\n _registerFeatureFunction(this.fillOrKillLimitOrder.selector);\n _registerFeatureFunction(this.fillOrKillRfqOrder.selector);\n _registerFeatureFunction(this._fillLimitOrder.selector);\n _registerFeatureFunction(this._fillRfqOrder.selector);\n _registerFeatureFunction(this.cancelLimitOrder.selector);\n _registerFeatureFunction(this.cancelRfqOrder.selector);\n _registerFeatureFunction(this.batchCancelLimitOrders.selector);\n _registerFeatureFunction(this.batchCancelRfqOrders.selector);\n _registerFeatureFunction(this.cancelPairLimitOrders.selector);\n _registerFeatureFunction(this.batchCancelPairLimitOrders.selector);\n _registerFeatureFunction(this.cancelPairRfqOrders.selector);\n _registerFeatureFunction(this.batchCancelPairRfqOrders.selector);\n _registerFeatureFunction(this.getLimitOrderInfo.selector);\n _registerFeatureFunction(this.getRfqOrderInfo.selector);\n _registerFeatureFunction(this.getLimitOrderHash.selector);\n _registerFeatureFunction(this.getRfqOrderHash.selector);\n _registerFeatureFunction(this.getProtocolFeeMultiplier.selector);\n _registerFeatureFunction(this.registerAllowedRfqOrigins.selector);\n _registerFeatureFunction(this.getLimitOrderRelevantState.selector);\n _registerFeatureFunction(this.getRfqOrderRelevantState.selector);\n _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector);\n _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector);\n return LibMigrate.MIGRATE_SUCCESS;\n }\n}\n"
|
|
},
|
|
"../migrations/LibMigrate.sol": {
|
|
"id": 25,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\n\n\nlibrary LibMigrate {\n\n /// @dev Magic bytes returned by a migrator to indicate success.\n /// This is `keccack('MIGRATE_SUCCESS')`.\n bytes4 internal constant MIGRATE_SUCCESS = 0x2c64c5ef;\n\n using LibRichErrorsV06 for bytes;\n\n /// @dev Perform a delegatecall and ensure it returns the magic bytes.\n /// @param target The call target.\n /// @param data The call data.\n function delegatecallMigrateFunction(\n address target,\n bytes memory data\n )\n internal\n {\n (bool success, bytes memory resultData) = target.delegatecall(data);\n if (!success ||\n resultData.length != 32 ||\n abi.decode(resultData, (bytes4)) != MIGRATE_SUCCESS)\n {\n LibOwnableRichErrors.MigrateCallFailedError(target, resultData).rrevert();\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol": {
|
|
"id": 38,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibRichErrorsV06 {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(string memory message)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n"
|
|
},
|
|
"../errors/LibOwnableRichErrors.sol": {
|
|
"id": 2,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibOwnableRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyOwnerError(address,address)\")),\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n );\n }\n\n function MigrateCallFailedError(address target, bytes memory resultData)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"MigrateCallFailedError(address,bytes)\")),\n target,\n resultData\n );\n }\n}\n"
|
|
},
|
|
"./interfaces/IFeature.sol": {
|
|
"id": 9,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Basic interface for a feature contract.\ninterface IFeature {\n\n // solhint-disable func-name-mixedcase\n\n /// @dev The name of this feature set.\n function FEATURE_NAME() external view returns (string memory name);\n\n /// @dev The version of this feature set.\n function FEATURE_VERSION() external view returns (uint256 version);\n}\n"
|
|
},
|
|
"./interfaces/INativeOrdersFeature.sol": {
|
|
"id": 11,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./INativeOrdersEvents.sol\";\n\n\n/// @dev Feature for interacting with limit orders.\ninterface INativeOrdersFeature is\n INativeOrdersEvents\n{\n\n /// @dev Transfers protocol fees from the `FeeCollector` pools into\n /// the staking contract.\n /// @param poolIds Staking pool IDs\n function transferProtocolFeesForPools(bytes32[] calldata poolIds)\n external;\n\n /// @dev Fill a limit order. The taker and sender will be the caller.\n /// @param order The limit order. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for up to `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n payable\n returns (uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n returns (uint128 makerTokenFilledAmount);\n\n /// @dev Fill a limit order. Internal variant. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// `msg.sender` (not `sender`).\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @param sender The order sender.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount,\n address taker,\n address sender\n )\n external\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order. Internal variant.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n external\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Cancel a single limit order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The limit order.\n function cancelLimitOrder(LibNativeOrder.LimitOrder calldata order)\n external;\n\n /// @dev Cancel a single RFQ order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The RFQ order.\n function cancelRfqOrder(LibNativeOrder.RfqOrder calldata order)\n external;\n\n /// @dev Mark what tx.origin addresses are allowed to fill an order that\n /// specifies the message sender as its txOrigin.\n /// @param origins An array of origin addresses to update.\n /// @param allowed True to register, false to unregister.\n function registerAllowedRfqOrigins(address[] memory origins, bool allowed)\n external;\n\n /// @dev Cancel multiple limit orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The limit orders.\n function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] calldata orders)\n external;\n\n /// @dev Cancel multiple RFQ orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The RFQ orders.\n function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] calldata orders)\n external;\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairLimitOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n external;\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairLimitOrders(\n IERC20TokenV06[] calldata makerTokens,\n IERC20TokenV06[] calldata takerTokens,\n uint256[] calldata minValidSalts\n )\n external;\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairRfqOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n external;\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairRfqOrders(\n IERC20TokenV06[] calldata makerTokens,\n IERC20TokenV06[] calldata takerTokens,\n uint256[] calldata minValidSalts\n )\n external;\n\n /// @dev Get the order info for a limit order.\n /// @param order The limit order.\n /// @return orderInfo Info about the order.\n function getLimitOrderInfo(LibNativeOrder.LimitOrder calldata order)\n external\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo);\n\n /// @dev Get the order info for an RFQ order.\n /// @param order The RFQ order.\n /// @return orderInfo Info about the order.\n function getRfqOrderInfo(LibNativeOrder.RfqOrder calldata order)\n external\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo);\n\n /// @dev Get the canonical hash of a limit order.\n /// @param order The limit order.\n /// @return orderHash The order hash.\n function getLimitOrderHash(LibNativeOrder.LimitOrder calldata order)\n external\n view\n returns (bytes32 orderHash);\n\n /// @dev Get the canonical hash of an RFQ order.\n /// @param order The RFQ order.\n /// @return orderHash The order hash.\n function getRfqOrderHash(LibNativeOrder.RfqOrder calldata order)\n external\n view\n returns (bytes32 orderHash);\n\n /// @dev Get the protocol fee multiplier. This should be multiplied by the\n /// gas price to arrive at the required protocol fee to fill a native order.\n /// @return multiplier The protocol fee multiplier.\n function getProtocolFeeMultiplier()\n external\n view\n returns (uint32 multiplier);\n\n /// @dev Get order info, fillable amount, and signature validity for a limit order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getLimitOrderRelevantState(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n );\n\n /// @dev Get order info, fillable amount, and signature validity for an RFQ order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getRfqOrderRelevantState(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n );\n\n /// @dev Batch version of `getLimitOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getLimitOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The limit orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetLimitOrderRelevantStates(\n LibNativeOrder.LimitOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n );\n\n /// @dev Batch version of `getRfqOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getRfqOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The RFQ orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetRfqOrderRelevantStates(\n LibNativeOrder.RfqOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n );\n}\n"
|
|
},
|
|
"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol": {
|
|
"id": 29,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IERC20TokenV06 {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed from,\n address indexed to,\n uint256 value\n );\n\n event Approval(\n address indexed owner,\n address indexed spender,\n uint256 value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address to, uint256 value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param from The address of the sender\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address from,\n address to,\n uint256 value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `spender` to spend `value` tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @param value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address spender, uint256 value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @dev Get the balance of `owner`.\n /// @param owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address owner)\n external\n view\n returns (uint256);\n\n /// @dev Get the allowance for `spender` to spend from `owner`.\n /// @param owner The address of the account owning tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address owner, address spender)\n external\n view\n returns (uint256);\n\n /// @dev Get the number of decimals this token has.\n function decimals()\n external\n view\n returns (uint8);\n}\n"
|
|
},
|
|
"./libs/LibSignature.sol": {
|
|
"id": 16,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../../errors/LibSignatureRichErrors.sol\";\n\n\n/// @dev A library for validating signatures.\nlibrary LibSignature {\n using LibRichErrorsV06 for bytes;\n\n // '\\x19Ethereum Signed Message:\\n32\\x00\\x00\\x00\\x00' in a word.\n uint256 private constant ETH_SIGN_HASH_PREFIX =\n 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000;\n /// @dev Exclusive upper limit on ECDSA signatures 'R' values.\n /// The valid range is given by fig (282) of the yellow paper.\n uint256 private constant ECDSA_SIGNATURE_R_LIMIT =\n uint256(0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141);\n /// @dev Exclusive upper limit on ECDSA signatures 'S' values.\n /// The valid range is given by fig (283) of the yellow paper.\n uint256 private constant ECDSA_SIGNATURE_S_LIMIT = ECDSA_SIGNATURE_R_LIMIT / 2 + 1;\n\n /// @dev Allowed signature types.\n enum SignatureType {\n ILLEGAL,\n INVALID,\n EIP712,\n ETHSIGN\n }\n\n /// @dev Encoded EC signature.\n struct Signature {\n // How to validate the signature.\n SignatureType signatureType;\n // EC Signature data.\n uint8 v;\n // EC Signature data.\n bytes32 r;\n // EC Signature data.\n bytes32 s;\n }\n\n /// @dev Retrieve the signer of a signature.\n /// Throws if the signature can't be validated.\n /// @param hash The hash that was signed.\n /// @param signature The signature.\n /// @return recovered The recovered signer address.\n function getSignerOfHash(\n bytes32 hash,\n Signature memory signature\n )\n internal\n pure\n returns (address recovered)\n {\n // Ensure this is a signature type that can be validated against a hash.\n _validateHashCompatibleSignature(hash, signature);\n\n if (signature.signatureType == SignatureType.EIP712) {\n // Signed using EIP712\n recovered = ecrecover(\n hash,\n signature.v,\n signature.r,\n signature.s\n );\n } else if (signature.signatureType == SignatureType.ETHSIGN) {\n // Signed using `eth_sign`\n // Need to hash `hash` with \"\\x19Ethereum Signed Message:\\n32\" prefix\n // in packed encoding.\n bytes32 ethSignHash;\n assembly {\n // Use scratch space\n mstore(0, ETH_SIGN_HASH_PREFIX) // length of 28 bytes\n mstore(28, hash) // length of 32 bytes\n ethSignHash := keccak256(0, 60)\n }\n recovered = ecrecover(\n ethSignHash,\n signature.v,\n signature.r,\n signature.s\n );\n }\n // `recovered` can be null if the signature values are out of range.\n if (recovered == address(0)) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,\n hash\n ).rrevert();\n }\n }\n\n /// @dev Validates that a signature is compatible with a hash signee.\n /// @param hash The hash that was signed.\n /// @param signature The signature.\n function _validateHashCompatibleSignature(\n bytes32 hash,\n Signature memory signature\n )\n private\n pure\n {\n // Ensure the r and s are within malleability limits.\n if (uint256(signature.r) >= ECDSA_SIGNATURE_R_LIMIT ||\n uint256(signature.s) >= ECDSA_SIGNATURE_S_LIMIT)\n {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,\n hash\n ).rrevert();\n }\n\n // Always illegal signature.\n if (signature.signatureType == SignatureType.ILLEGAL) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.ILLEGAL,\n hash\n ).rrevert();\n }\n\n // Always invalid.\n if (signature.signatureType == SignatureType.INVALID) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.ALWAYS_INVALID,\n hash\n ).rrevert();\n }\n\n // Solidity should check that the signature type is within enum range for us\n // when abi-decoding.\n }\n}\n"
|
|
},
|
|
"../errors/LibSignatureRichErrors.sol": {
|
|
"id": 3,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSignatureRichErrors {\n\n enum SignatureValidationErrorCodes {\n ALWAYS_INVALID,\n INVALID_LENGTH,\n UNSUPPORTED,\n ILLEGAL,\n WRONG_SIGNER,\n BAD_SIGNATURE_DATA\n }\n\n // solhint-disable func-name-mixedcase\n\n function SignatureValidationError(\n SignatureValidationErrorCodes code,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SignatureValidationError(uint8,bytes32,address,bytes)\")),\n code,\n hash,\n signerAddress,\n signature\n );\n }\n\n function SignatureValidationError(\n SignatureValidationErrorCodes code,\n bytes32 hash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SignatureValidationError(uint8,bytes32)\")),\n code,\n hash\n );\n }\n}\n"
|
|
},
|
|
"./libs/LibNativeOrder.sol": {
|
|
"id": 15,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\n\n\n/// @dev A library for common native order operations.\nlibrary LibNativeOrder {\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n enum OrderStatus {\n INVALID,\n FILLABLE,\n FILLED,\n CANCELLED,\n EXPIRED\n }\n\n /// @dev A standard OTC or OO limit order.\n struct LimitOrder {\n IERC20TokenV06 makerToken;\n IERC20TokenV06 takerToken;\n uint128 makerAmount;\n uint128 takerAmount;\n uint128 takerTokenFeeAmount;\n address maker;\n address taker;\n address sender;\n address feeRecipient;\n bytes32 pool;\n uint64 expiry;\n uint256 salt;\n }\n\n /// @dev An RFQ limit order.\n struct RfqOrder {\n IERC20TokenV06 makerToken;\n IERC20TokenV06 takerToken;\n uint128 makerAmount;\n uint128 takerAmount;\n address maker;\n address taker;\n address txOrigin;\n bytes32 pool;\n uint64 expiry;\n uint256 salt;\n }\n\n /// @dev Info on a limit or RFQ order.\n struct OrderInfo {\n bytes32 orderHash;\n OrderStatus status;\n uint128 takerTokenFilledAmount;\n }\n\n uint256 private constant UINT_128_MASK = (1 << 128) - 1;\n uint256 private constant UINT_64_MASK = (1 << 64) - 1;\n uint256 private constant ADDRESS_MASK = (1 << 160) - 1;\n\n // The type hash for limit orders, which is:\n // keccak256(abi.encodePacked(\n // \"LimitOrder(\",\n // \"address makerToken,\",\n // \"address takerToken,\",\n // \"uint128 makerAmount,\",\n // \"uint128 takerAmount,\",\n // \"uint128 takerTokenFeeAmount,\",\n // \"address maker,\",\n // \"address taker,\",\n // \"address sender,\",\n // \"address feeRecipient,\",\n // \"bytes32 pool,\",\n // \"uint64 expiry,\",\n // \"uint256 salt\"\n // \")\"\n // ))\n uint256 private constant _LIMIT_ORDER_TYPEHASH =\n 0xce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d49;\n\n // The type hash for RFQ orders, which is:\n // keccak256(abi.encodePacked(\n // \"RfqOrder(\",\n // \"address makerToken,\",\n // \"address takerToken,\",\n // \"uint128 makerAmount,\",\n // \"uint128 takerAmount,\",\n // \"address maker,\",\n // \"address taker,\",\n // \"address txOrigin,\",\n // \"bytes32 pool,\",\n // \"uint64 expiry,\",\n // \"uint256 salt\"\n // \")\"\n // ))\n uint256 private constant _RFQ_ORDER_TYPEHASH =\n 0xe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da9;\n\n /// @dev Get the struct hash of a limit order.\n /// @param order The limit order.\n /// @return structHash The struct hash of the order.\n function getLimitOrderStructHash(LimitOrder memory order)\n internal\n pure\n returns (bytes32 structHash)\n {\n // The struct hash is:\n // keccak256(abi.encode(\n // TYPE_HASH,\n // order.makerToken,\n // order.takerToken,\n // order.makerAmount,\n // order.takerAmount,\n // order.takerTokenFeeAmount,\n // order.maker,\n // order.taker,\n // order.sender,\n // order.feeRecipient,\n // order.pool,\n // order.expiry,\n // order.salt,\n // ))\n assembly {\n let mem := mload(0x40)\n mstore(mem, _LIMIT_ORDER_TYPEHASH)\n // order.makerToken;\n mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))\n // order.takerToken;\n mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))\n // order.makerAmount;\n mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))\n // order.takerAmount;\n mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))\n // order.takerTokenFeeAmount;\n mstore(add(mem, 0xA0), and(UINT_128_MASK, mload(add(order, 0x80))))\n // order.maker;\n mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))\n // order.taker;\n mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))\n // order.sender;\n mstore(add(mem, 0x100), and(ADDRESS_MASK, mload(add(order, 0xE0))))\n // order.feeRecipient;\n mstore(add(mem, 0x120), and(ADDRESS_MASK, mload(add(order, 0x100))))\n // order.pool;\n mstore(add(mem, 0x140), mload(add(order, 0x120)))\n // order.expiry;\n mstore(add(mem, 0x160), and(UINT_64_MASK, mload(add(order, 0x140))))\n // order.salt;\n mstore(add(mem, 0x180), mload(add(order, 0x160)))\n structHash := keccak256(mem, 0x1A0)\n }\n }\n\n /// @dev Get the struct hash of a RFQ order.\n /// @param order The RFQ order.\n /// @return structHash The struct hash of the order.\n function getRfqOrderStructHash(RfqOrder memory order)\n internal\n pure\n returns (bytes32 structHash)\n {\n // The struct hash is:\n // keccak256(abi.encode(\n // TYPE_HASH,\n // order.makerToken,\n // order.takerToken,\n // order.makerAmount,\n // order.takerAmount,\n // order.maker,\n // order.taker,\n // order.txOrigin,\n // order.pool,\n // order.expiry,\n // order.salt,\n // ))\n assembly {\n let mem := mload(0x40)\n mstore(mem, _RFQ_ORDER_TYPEHASH)\n // order.makerToken;\n mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))\n // order.takerToken;\n mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))\n // order.makerAmount;\n mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))\n // order.takerAmount;\n mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))\n // order.maker;\n mstore(add(mem, 0xA0), and(ADDRESS_MASK, mload(add(order, 0x80))))\n // order.taker;\n mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))\n // order.txOrigin;\n mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))\n // order.pool;\n mstore(add(mem, 0x100), mload(add(order, 0xE0)))\n // order.expiry;\n mstore(add(mem, 0x120), and(UINT_64_MASK, mload(add(order, 0x100))))\n // order.salt;\n mstore(add(mem, 0x140), mload(add(order, 0x120)))\n structHash := keccak256(mem, 0x160)\n }\n }\n\n /// @dev Refund any leftover protocol fees in `msg.value` to `msg.sender`.\n /// @param ethProtocolFeePaid How much ETH was paid in protocol fees.\n function refundExcessProtocolFeeToSender(uint256 ethProtocolFeePaid)\n internal\n {\n if (msg.value > ethProtocolFeePaid && msg.sender != address(this)) {\n uint256 refundAmount = msg.value.safeSub(ethProtocolFeePaid);\n (bool success,) = msg\n .sender\n .call{value: refundAmount}(\"\");\n if (!success) {\n LibNativeOrdersRichErrors.ProtocolFeeRefundFailed(\n msg.sender,\n refundAmount\n ).rrevert();\n }\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol": {
|
|
"id": 33,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibSafeMathRichErrorsV06.sol\";\n\n\nlibrary LibSafeMathV06 {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function safeMul128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (a == 0) {\n return 0;\n }\n uint128 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint128 c = a / b;\n return c;\n }\n\n function safeSub128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n uint128 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a >= b ? a : b;\n }\n\n function min128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a < b ? a : b;\n }\n\n function safeDowncastToUint128(uint256 a)\n internal\n pure\n returns (uint128)\n {\n if (a > type(uint128).max) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError(\n LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,\n a\n ));\n }\n return uint128(a);\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibSafeMathRichErrorsV06.sol": {
|
|
"id": 39,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSafeMathRichErrorsV06 {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n"
|
|
},
|
|
"../errors/LibNativeOrdersRichErrors.sol": {
|
|
"id": 1,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibNativeOrdersRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function ProtocolFeeRefundFailed(\n address receiver,\n uint256 refundAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"ProtocolFeeRefundFailed(address,uint256)\")),\n receiver,\n refundAmount\n );\n }\n\n function OrderNotFillableByOriginError(\n bytes32 orderHash,\n address txOrigin,\n address orderTxOrigin\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableByOriginError(bytes32,address,address)\")),\n orderHash,\n txOrigin,\n orderTxOrigin\n );\n }\n\n function OrderNotFillableError(\n bytes32 orderHash,\n uint8 orderStatus\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableError(bytes32,uint8)\")),\n orderHash,\n orderStatus\n );\n }\n\n function OrderNotSignedByMakerError(\n bytes32 orderHash,\n address signer,\n address maker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotSignedByMakerError(bytes32,address,address)\")),\n orderHash,\n signer,\n maker\n );\n }\n\n function OrderNotFillableBySenderError(\n bytes32 orderHash,\n address sender,\n address orderSender\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableBySenderError(bytes32,address,address)\")),\n orderHash,\n sender,\n orderSender\n );\n }\n\n function OrderNotFillableByTakerError(\n bytes32 orderHash,\n address taker,\n address orderTaker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableByTakerError(bytes32,address,address)\")),\n orderHash,\n taker,\n orderTaker\n );\n }\n\n function CancelSaltTooLowError(\n uint256 minValidSalt,\n uint256 oldMinValidSalt\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"CancelSaltTooLowError(uint256,uint256)\")),\n minValidSalt,\n oldMinValidSalt\n );\n }\n\n function FillOrKillFailedError(\n bytes32 orderHash,\n uint256 takerTokenFilledAmount,\n uint256 takerTokenFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"FillOrKillFailedError(bytes32,uint256,uint256)\")),\n orderHash,\n takerTokenFilledAmount,\n takerTokenFillAmount\n );\n }\n\n function OnlyOrderMakerAllowed(\n bytes32 orderHash,\n address sender,\n address maker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyOrderMakerAllowed(bytes32,address,address)\")),\n orderHash,\n sender,\n maker\n );\n }\n\n function BatchFillIncompleteError(\n bytes32 orderHash,\n uint256 takerTokenFilledAmount,\n uint256 takerTokenFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"BatchFillIncompleteError(bytes32,uint256,uint256)\")),\n orderHash,\n takerTokenFilledAmount,\n takerTokenFillAmount\n );\n }\n}\n"
|
|
},
|
|
"./interfaces/INativeOrdersEvents.sol": {
|
|
"id": 10,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\n\n\n/// @dev Events emitted by NativeOrdersFeature.\ninterface INativeOrdersEvents {\n\n /// @dev Emitted whenever a `LimitOrder` is filled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The maker of the order.\n /// @param taker The taker of the order.\n /// @param feeRecipient Fee recipient of the order.\n /// @param takerTokenFilledAmount How much taker token was filled.\n /// @param makerTokenFilledAmount How much maker token was filled.\n /// @param protocolFeePaid How much protocol fee was paid.\n /// @param pool The fee pool associated with this order.\n event LimitOrderFilled(\n bytes32 orderHash,\n address maker,\n address taker,\n address feeRecipient,\n address makerToken,\n address takerToken,\n uint128 takerTokenFilledAmount,\n uint128 makerTokenFilledAmount,\n uint128 takerTokenFeeFilledAmount,\n uint256 protocolFeePaid,\n bytes32 pool\n );\n\n /// @dev Emitted whenever an `RfqOrder` is filled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The maker of the order.\n /// @param taker The taker of the order.\n /// @param takerTokenFilledAmount How much taker token was filled.\n /// @param makerTokenFilledAmount How much maker token was filled.\n /// @param pool The fee pool associated with this order.\n event RfqOrderFilled(\n bytes32 orderHash,\n address maker,\n address taker,\n address makerToken,\n address takerToken,\n uint128 takerTokenFilledAmount,\n uint128 makerTokenFilledAmount,\n bytes32 pool\n );\n\n /// @dev Emitted whenever a limit or RFQ order is cancelled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The order maker.\n event OrderCancelled(\n bytes32 orderHash,\n address maker\n );\n\n /// @dev Emitted whenever Limit orders are cancelled by pair by a maker.\n /// @param maker The maker of the order.\n /// @param makerToken The maker token in a pair for the orders cancelled.\n /// @param takerToken The taker token in a pair for the orders cancelled.\n /// @param minValidSalt The new minimum valid salt an order with this pair must\n /// have.\n event PairCancelledLimitOrders(\n address maker,\n address makerToken,\n address takerToken,\n uint256 minValidSalt\n );\n\n /// @dev Emitted whenever RFQ orders are cancelled by pair by a maker.\n /// @param maker The maker of the order.\n /// @param makerToken The maker token in a pair for the orders cancelled.\n /// @param takerToken The taker token in a pair for the orders cancelled.\n /// @param minValidSalt The new minimum valid salt an order with this pair must\n /// have.\n event PairCancelledRfqOrders(\n address maker,\n address makerToken,\n address takerToken,\n uint256 minValidSalt\n );\n\n /// @dev Emitted when new addresses are allowed or disallowed to fill\n /// orders with a given txOrigin.\n /// @param origin The address doing the allowing.\n /// @param addrs The address being allowed/disallowed.\n /// @param allowed Indicates whether the address should be allowed.\n event RfqOrderOriginsAllowed(\n address origin,\n address[] addrs,\n bool allowed\n );\n}\n"
|
|
},
|
|
"./native_orders/NativeOrdersSettlement.sol": {
|
|
"id": 20,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../fixins/FixinCommon.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../../vendor/v3/IStaking.sol\";\nimport \"../interfaces/INativeOrdersEvents.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./NativeOrdersCancellation.sol\";\nimport \"./NativeOrdersProtocolFees.sol\";\n\n\n/// @dev Mixin for settling limit and RFQ orders.\nabstract contract NativeOrdersSettlement is\n INativeOrdersEvents,\n NativeOrdersCancellation,\n NativeOrdersProtocolFees,\n FixinCommon\n{\n using LibSafeMathV06 for uint128;\n using LibRichErrorsV06 for bytes;\n\n /// @dev Params for `_settleOrder()`.\n struct SettleOrderInfo {\n // Order hash.\n bytes32 orderHash;\n // Maker of the order.\n address maker;\n // Taker of the order.\n address taker;\n // Maker token.\n IERC20TokenV06 makerToken;\n // Taker token.\n IERC20TokenV06 takerToken;\n // Maker token amount.\n uint128 makerAmount;\n // Taker token amount.\n uint128 takerAmount;\n // Maximum taker token amount to fill.\n uint128 takerTokenFillAmount;\n // How much taker token amount has already been filled in this order.\n uint128 takerTokenFilledAmount;\n }\n\n /// @dev Params for `_fillLimitOrderPrivate()`\n struct FillLimitOrderPrivateParams {\n // The limit order.\n LibNativeOrder.LimitOrder order;\n // The order signature.\n LibSignature.Signature signature;\n // Maximum taker token to fill this order with.\n uint128 takerTokenFillAmount;\n // The order taker.\n address taker;\n // The order sender.\n address sender;\n }\n\n // @dev Fill results returned by `_fillLimitOrderPrivate()` and\n /// `_fillRfqOrderPrivate()`.\n struct FillNativeOrderResults {\n uint256 ethProtocolFeePaid;\n uint128 takerTokenFilledAmount;\n uint128 makerTokenFilledAmount;\n uint128 takerTokenFeeFilledAmount;\n }\n\n constructor(\n address zeroExAddress,\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier,\n bytes32 greedyTokensBloomFilter\n )\n public\n NativeOrdersCancellation(zeroExAddress, greedyTokensBloomFilter)\n NativeOrdersProtocolFees(weth, staking, feeCollectorController, protocolFeeMultiplier)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Fill a limit order. The taker and sender will be the caller.\n /// @param order The limit order. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: msg.sender,\n sender: msg.sender\n }));\n LibNativeOrder.refundExcessProtocolFeeToSender(results.ethProtocolFeePaid);\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order for up to `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH should be attached to pay the\n /// protocol fee.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n msg.sender\n );\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n payable\n returns (uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: msg.sender,\n sender: msg.sender\n }));\n // Must have filled exactly the amount requested.\n if (results.takerTokenFilledAmount < takerTokenFillAmount) {\n LibNativeOrdersRichErrors.FillOrKillFailedError(\n getLimitOrderHash(order),\n results.takerTokenFilledAmount,\n takerTokenFillAmount\n ).rrevert();\n }\n LibNativeOrder.refundExcessProtocolFeeToSender(results.ethProtocolFeePaid);\n makerTokenFilledAmount = results.makerTokenFilledAmount;\n }\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n returns (uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n msg.sender\n );\n // Must have filled exactly the amount requested.\n if (results.takerTokenFilledAmount < takerTokenFillAmount) {\n LibNativeOrdersRichErrors.FillOrKillFailedError(\n getRfqOrderHash(order),\n results.takerTokenFilledAmount,\n takerTokenFillAmount\n ).rrevert();\n }\n makerTokenFilledAmount = results.makerTokenFilledAmount;\n }\n\n /// @dev Fill a limit order. Internal variant. ETH protocol fees can be\n /// attached to this call.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @param sender The order sender.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker,\n address sender\n )\n public\n virtual\n payable\n onlySelf\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: taker,\n sender: sender\n }));\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order. Internal variant. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// `msg.sender` (not `sender`).\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n public\n virtual\n onlySelf\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n taker\n );\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Mark what tx.origin addresses are allowed to fill an order that\n /// specifies the message sender as its txOrigin.\n /// @param origins An array of origin addresses to update.\n /// @param allowed True to register, false to unregister.\n function registerAllowedRfqOrigins(\n address[] memory origins,\n bool allowed\n )\n external\n {\n require(msg.sender == tx.origin,\n \"NativeOrdersFeature/NO_CONTRACT_ORIGINS\");\n\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n for (uint256 i = 0; i < origins.length; i++) {\n stor.originRegistry[msg.sender][origins[i]] = allowed;\n }\n\n emit RfqOrderOriginsAllowed(msg.sender, origins, allowed);\n }\n\n /// @dev Fill a limit order. Private variant. Does not refund protocol fees.\n /// @param params Function params.\n /// @return results Results of the fill.\n function _fillLimitOrderPrivate(FillLimitOrderPrivateParams memory params)\n private\n returns (FillNativeOrderResults memory results)\n {\n LibNativeOrder.OrderInfo memory orderInfo = getLimitOrderInfo(params.order);\n\n // Must be fillable.\n if (orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n LibNativeOrdersRichErrors.OrderNotFillableError(\n orderInfo.orderHash,\n uint8(orderInfo.status)\n ).rrevert();\n }\n\n // Must be fillable by the taker.\n if (params.order.taker != address(0) && params.order.taker != params.taker) {\n LibNativeOrdersRichErrors.OrderNotFillableByTakerError(\n orderInfo.orderHash,\n params.taker,\n params.order.taker\n ).rrevert();\n }\n\n // Must be fillable by the sender.\n if (params.order.sender != address(0) && params.order.sender != params.sender) {\n LibNativeOrdersRichErrors.OrderNotFillableBySenderError(\n orderInfo.orderHash,\n params.sender,\n params.order.sender\n ).rrevert();\n }\n\n // Signature must be valid for the order.\n {\n address signer = LibSignature.getSignerOfHash(\n orderInfo.orderHash,\n params.signature\n );\n if (signer != params.order.maker) {\n LibNativeOrdersRichErrors.OrderNotSignedByMakerError(\n orderInfo.orderHash,\n signer,\n params.order.maker\n ).rrevert();\n }\n }\n\n // Pay the protocol fee.\n results.ethProtocolFeePaid = _collectProtocolFee(params.order.pool);\n\n // Settle between the maker and taker.\n (results.takerTokenFilledAmount, results.makerTokenFilledAmount) = _settleOrder(\n SettleOrderInfo({\n orderHash: orderInfo.orderHash,\n maker: params.order.maker,\n taker: params.taker,\n makerToken: IERC20TokenV06(params.order.makerToken),\n takerToken: IERC20TokenV06(params.order.takerToken),\n makerAmount: params.order.makerAmount,\n takerAmount: params.order.takerAmount,\n takerTokenFillAmount: params.takerTokenFillAmount,\n takerTokenFilledAmount: orderInfo.takerTokenFilledAmount\n })\n );\n\n // Pay the fee recipient.\n if (params.order.takerTokenFeeAmount > 0) {\n results.takerTokenFeeFilledAmount = uint128(LibMathV06.getPartialAmountFloor(\n results.takerTokenFilledAmount,\n params.order.takerAmount,\n params.order.takerTokenFeeAmount\n ));\n _transferERC20Tokens(\n params.order.takerToken,\n params.taker,\n params.order.feeRecipient,\n uint256(results.takerTokenFeeFilledAmount)\n );\n }\n\n emit LimitOrderFilled(\n orderInfo.orderHash,\n params.order.maker,\n params.taker,\n params.order.feeRecipient,\n address(params.order.makerToken),\n address(params.order.takerToken),\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount,\n results.takerTokenFeeFilledAmount,\n results.ethProtocolFeePaid,\n params.order.pool\n );\n }\n\n /// @dev Fill an RFQ order. Private variant. Does not refund protocol fees.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return results Results of the fill.\n function _fillRfqOrderPrivate(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n private\n returns (FillNativeOrderResults memory results)\n {\n LibNativeOrder.OrderInfo memory orderInfo = getRfqOrderInfo(order);\n\n // Must be fillable.\n if (orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n LibNativeOrdersRichErrors.OrderNotFillableError(\n orderInfo.orderHash,\n uint8(orderInfo.status)\n ).rrevert();\n }\n\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n // Must be fillable by the tx.origin.\n if (order.txOrigin != tx.origin && !stor.originRegistry[order.txOrigin][tx.origin]) {\n LibNativeOrdersRichErrors.OrderNotFillableByOriginError(\n orderInfo.orderHash,\n tx.origin,\n order.txOrigin\n ).rrevert();\n }\n }\n\n // Must be fillable by the taker.\n if (order.taker != address(0) && order.taker != taker) {\n LibNativeOrdersRichErrors.OrderNotFillableByTakerError(\n orderInfo.orderHash,\n taker,\n order.taker\n ).rrevert();\n }\n\n // Signature must be valid for the order.\n {\n address signer = LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n if (signer != order.maker) {\n LibNativeOrdersRichErrors.OrderNotSignedByMakerError(\n orderInfo.orderHash,\n signer,\n order.maker\n ).rrevert();\n }\n }\n\n // Settle between the maker and taker.\n (results.takerTokenFilledAmount, results.makerTokenFilledAmount) = _settleOrder(\n SettleOrderInfo({\n orderHash: orderInfo.orderHash,\n maker: order.maker,\n taker: taker,\n makerToken: IERC20TokenV06(order.makerToken),\n takerToken: IERC20TokenV06(order.takerToken),\n makerAmount: order.makerAmount,\n takerAmount: order.takerAmount,\n takerTokenFillAmount: takerTokenFillAmount,\n takerTokenFilledAmount: orderInfo.takerTokenFilledAmount\n })\n );\n\n emit RfqOrderFilled(\n orderInfo.orderHash,\n order.maker,\n taker,\n address(order.makerToken),\n address(order.takerToken),\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount,\n order.pool\n );\n }\n\n /// @dev Settle the trade between an order's maker and taker.\n /// @param settleInfo Information needed to execute the settlement.\n /// @return takerTokenFilledAmount How much taker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _settleOrder(SettleOrderInfo memory settleInfo)\n private\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n // Clamp the taker token fill amount to the fillable amount.\n takerTokenFilledAmount = LibSafeMathV06.min128(\n settleInfo.takerTokenFillAmount,\n settleInfo.takerAmount.safeSub128(settleInfo.takerTokenFilledAmount)\n );\n // Compute the maker token amount.\n // This should never overflow because the values are all clamped to\n // (2^128-1).\n makerTokenFilledAmount = uint128(LibMathV06.getPartialAmountFloor(\n uint256(takerTokenFilledAmount),\n uint256(settleInfo.takerAmount),\n uint256(settleInfo.makerAmount)\n ));\n\n if (takerTokenFilledAmount == 0 || makerTokenFilledAmount == 0) {\n // Nothing to do.\n return (0, 0);\n }\n\n // Update filled state for the order.\n LibNativeOrdersStorage\n .getStorage()\n .orderHashToTakerTokenFilledAmount[settleInfo.orderHash] =\n // OK to overwrite the whole word because we shouldn't get to this\n // function if the order is cancelled.\n settleInfo.takerTokenFilledAmount.safeAdd128(takerTokenFilledAmount);\n\n // Transfer taker -> maker.\n _transferERC20Tokens(\n settleInfo.takerToken,\n settleInfo.taker,\n settleInfo.maker,\n takerTokenFilledAmount\n );\n\n // Transfer maker -> taker.\n _transferERC20Tokens(\n settleInfo.makerToken,\n settleInfo.maker,\n settleInfo.taker,\n makerTokenFilledAmount\n );\n }\n}\n"
|
|
},
|
|
"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol": {
|
|
"id": 30,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IERC20TokenV06.sol\";\n\n\ninterface IEtherTokenV06 is\n IERC20TokenV06\n{\n /// @dev Wrap ether.\n function deposit() external payable;\n\n /// @dev Unwrap ether.\n function withdraw(uint256 amount) external;\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol": {
|
|
"id": 32,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./LibSafeMathV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibMathRichErrorsV06.sol\";\n\n\nlibrary LibMathV06 {\n\n using LibSafeMathV06 for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return isError Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return isError Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibMathRichErrorsV06.sol": {
|
|
"id": 36,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibMathRichErrorsV06 {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n"
|
|
},
|
|
"../fixins/FixinCommon.sol": {
|
|
"id": 21,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibCommonRichErrors.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\nimport \"../features/interfaces/IOwnableFeature.sol\";\nimport \"../features/interfaces/ISimpleFunctionRegistryFeature.sol\";\n\n\n/// @dev Common feature utilities.\nabstract contract FixinCommon {\n\n using LibRichErrorsV06 for bytes;\n\n /// @dev The implementation address of this feature.\n address internal immutable _implementation;\n\n /// @dev The caller must be this contract.\n modifier onlySelf() virtual {\n if (msg.sender != address(this)) {\n LibCommonRichErrors.OnlyCallableBySelfError(msg.sender).rrevert();\n }\n _;\n }\n\n /// @dev The caller of this function must be the owner.\n modifier onlyOwner() virtual {\n {\n address owner = IOwnableFeature(address(this)).owner();\n if (msg.sender != owner) {\n LibOwnableRichErrors.OnlyOwnerError(\n msg.sender,\n owner\n ).rrevert();\n }\n }\n _;\n }\n\n constructor() internal {\n // Remember this feature's original address.\n _implementation = address(this);\n }\n\n /// @dev Registers a function implemented by this feature at `_implementation`.\n /// Can and should only be called within a `migrate()`.\n /// @param selector The selector of the function whose implementation\n /// is at `_implementation`.\n function _registerFeatureFunction(bytes4 selector)\n internal\n {\n ISimpleFunctionRegistryFeature(address(this)).extend(selector, _implementation);\n }\n\n /// @dev Encode a feature version as a `uint256`.\n /// @param major The major version number of the feature.\n /// @param minor The minor version number of the feature.\n /// @param revision The revision number of the feature.\n /// @return encodedVersion The encoded version number.\n function _encodeVersion(uint32 major, uint32 minor, uint32 revision)\n internal\n pure\n returns (uint256 encodedVersion)\n {\n return (uint256(major) << 64) | (uint256(minor) << 32) | uint256(revision);\n }\n}\n"
|
|
},
|
|
"../errors/LibCommonRichErrors.sol": {
|
|
"id": 0,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibCommonRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function OnlyCallableBySelfError(address sender)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyCallableBySelfError(address)\")),\n sender\n );\n }\n\n function IllegalReentrancyError(bytes4 selector, uint256 reentrancyFlags)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"IllegalReentrancyError(bytes4,uint256)\")),\n selector,\n reentrancyFlags\n );\n }\n}\n"
|
|
},
|
|
"./interfaces/IOwnableFeature.sol": {
|
|
"id": 12,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/interfaces/IOwnableV06.sol\";\n\n\n// solhint-disable no-empty-blocks\n/// @dev Owner management and migration features.\ninterface IOwnableFeature is\n IOwnableV06\n{\n /// @dev Emitted when `migrate()` is called.\n /// @param caller The caller of `migrate()`.\n /// @param migrator The migration contract.\n /// @param newOwner The address of the new owner.\n event Migrated(address caller, address migrator, address newOwner);\n\n /// @dev Execute a migration function in the context of the ZeroEx contract.\n /// The result of the function being called should be the magic bytes\n /// 0x2c64c5ef (`keccack('MIGRATE_SUCCESS')`). Only callable by the owner.\n /// The owner will be temporarily set to `address(this)` inside the call.\n /// Before returning, the owner will be set to `newOwner`.\n /// @param target The migrator contract address.\n /// @param newOwner The address of the new owner.\n /// @param data The call data.\n function migrate(address target, bytes calldata data, address newOwner) external;\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/interfaces/IOwnableV06.sol": {
|
|
"id": 41,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IOwnableV06 {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner) external;\n\n /// @dev The owner of this contract.\n /// @return ownerAddress The owner address.\n function owner() external view returns (address ownerAddress);\n}\n"
|
|
},
|
|
"./interfaces/ISimpleFunctionRegistryFeature.sol": {
|
|
"id": 13,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Basic registry management features.\ninterface ISimpleFunctionRegistryFeature {\n\n /// @dev A function implementation was updated via `extend()` or `rollback()`.\n /// @param selector The function selector.\n /// @param oldImpl The implementation contract address being replaced.\n /// @param newImpl The replacement implementation contract address.\n event ProxyFunctionUpdated(bytes4 indexed selector, address oldImpl, address newImpl);\n\n /// @dev Roll back to a prior implementation of a function.\n /// @param selector The function selector.\n /// @param targetImpl The address of an older implementation of the function.\n function rollback(bytes4 selector, address targetImpl) external;\n\n /// @dev Register or replace a function.\n /// @param selector The function selector.\n /// @param impl The implementation contract for the function.\n function extend(bytes4 selector, address impl) external;\n\n /// @dev Retrieve the length of the rollback history for a function.\n /// @param selector The function selector.\n /// @return rollbackLength The number of items in the rollback history for\n /// the function.\n function getRollbackLength(bytes4 selector)\n external\n view\n returns (uint256 rollbackLength);\n\n /// @dev Retrieve an entry in the rollback history for a function.\n /// @param selector The function selector.\n /// @param idx The index in the rollback history.\n /// @return impl An implementation address for the function at\n /// index `idx`.\n function getRollbackEntryAtIndex(bytes4 selector, uint256 idx)\n external\n view\n returns (address impl);\n}\n"
|
|
},
|
|
"../storage/LibNativeOrdersStorage.sol": {
|
|
"id": 26,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"./LibStorage.sol\";\n\n\n/// @dev Storage helpers for `NativeOrdersFeature`.\nlibrary LibNativeOrdersStorage {\n\n /// @dev Storage bucket for this feature.\n struct Storage {\n // How much taker token has been filled in order.\n // The lower `uint128` is the taker token fill amount.\n // The high bit will be `1` if the order was directly cancelled.\n mapping(bytes32 => uint256) orderHashToTakerTokenFilledAmount;\n // The minimum valid order salt for a given maker and order pair (maker, taker)\n // for limit orders.\n mapping(address => mapping(address => mapping(address => uint256)))\n limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt;\n // The minimum valid order salt for a given maker and order pair (maker, taker)\n // for RFQ orders.\n mapping(address => mapping(address => mapping(address => uint256)))\n rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt;\n // For a given order origin, which tx.origin addresses are allowed to\n // fill the order.\n mapping(address => mapping(address => bool)) originRegistry;\n }\n\n /// @dev Get the storage bucket for this contract.\n function getStorage() internal pure returns (Storage storage stor) {\n uint256 storageSlot = LibStorage.getStorageSlot(\n LibStorage.StorageId.NativeOrders\n );\n // Dip into assembly to change the slot pointed to by the local\n // variable `stor`.\n // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries\n assembly { stor_slot := storageSlot }\n }\n}\n"
|
|
},
|
|
"../storage/LibStorage.sol": {
|
|
"id": 27,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Common storage helpers\nlibrary LibStorage {\n\n /// @dev What to bit-shift a storage ID by to get its slot.\n /// This gives us a maximum of 2**128 inline fields in each bucket.\n uint256 private constant STORAGE_SLOT_EXP = 128;\n\n /// @dev Storage IDs for feature storage buckets.\n /// WARNING: APPEND-ONLY.\n enum StorageId {\n Proxy,\n SimpleFunctionRegistry,\n Ownable,\n TokenSpender,\n TransformERC20,\n MetaTransactions,\n ReentrancyGuard,\n NativeOrders\n }\n\n /// @dev Get the storage slot given a storage ID. We assign unique, well-spaced\n /// slots to storage bucket variables to ensure they do not overlap.\n /// See: https://solidity.readthedocs.io/en/v0.6.6/assembly.html#access-to-external-variables-functions-and-libraries\n /// @param storageId An entry in `StorageId`\n /// @return slot The storage slot.\n function getStorageSlot(StorageId storageId)\n internal\n pure\n returns (uint256 slot)\n {\n // This should never overflow with a reasonable `STORAGE_SLOT_EXP`\n // because Solidity will do a range check on `storageId` during the cast.\n return (uint256(storageId) + 1) << STORAGE_SLOT_EXP;\n }\n}\n"
|
|
},
|
|
"../vendor/v3/IStaking.sol": {
|
|
"id": 28,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\ninterface IStaking {\n function joinStakingPoolAsMaker(bytes32) external;\n function payProtocolFee(address, address, uint256) external payable;\n}\n"
|
|
},
|
|
"./native_orders/NativeOrdersCancellation.sol": {
|
|
"id": 17,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../interfaces/INativeOrdersEvents.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./NativeOrdersInfo.sol\";\n\n/// @dev Feature for cancelling limit and RFQ orders.\nabstract contract NativeOrdersCancellation is\n INativeOrdersEvents,\n NativeOrdersInfo\n{\n using LibRichErrorsV06 for bytes;\n\n /// @dev Highest bit of a uint256, used to flag cancelled orders.\n uint256 private constant HIGH_BIT = 1 << 255;\n\n constructor(\n address zeroExAddress,\n bytes32 greedyTokensBloomFilter\n )\n internal\n NativeOrdersInfo(zeroExAddress, greedyTokensBloomFilter)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Cancel a single limit order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The limit order.\n function cancelLimitOrder(LibNativeOrder.LimitOrder memory order)\n public\n {\n bytes32 orderHash = getLimitOrderHash(order);\n if (msg.sender != order.maker) {\n LibNativeOrdersRichErrors.OnlyOrderMakerAllowed(\n orderHash,\n msg.sender,\n order.maker\n ).rrevert();\n }\n _cancelOrderHash(orderHash, order.maker);\n }\n\n /// @dev Cancel a single RFQ order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The RFQ order.\n function cancelRfqOrder(LibNativeOrder.RfqOrder memory order)\n public\n {\n bytes32 orderHash = getRfqOrderHash(order);\n if (msg.sender != order.maker) {\n LibNativeOrdersRichErrors.OnlyOrderMakerAllowed(\n orderHash,\n msg.sender,\n order.maker\n ).rrevert();\n }\n _cancelOrderHash(orderHash, order.maker);\n }\n\n /// @dev Cancel multiple limit orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The limit orders.\n function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; ++i) {\n cancelLimitOrder(orders[i]);\n }\n }\n\n /// @dev Cancel multiple RFQ orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The RFQ orders.\n function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; ++i) {\n cancelRfqOrder(orders[i]);\n }\n }\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairLimitOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n public\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n uint256 oldMinValidSalt =\n stor.limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)];\n\n // New min salt must >= the old one.\n if (oldMinValidSalt > minValidSalt) {\n LibNativeOrdersRichErrors.\n CancelSaltTooLowError(minValidSalt, oldMinValidSalt)\n .rrevert();\n }\n\n stor.limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)] = minValidSalt;\n\n emit PairCancelledLimitOrders(\n msg.sender,\n address(makerToken),\n address(takerToken),\n minValidSalt\n );\n }\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairLimitOrders(\n IERC20TokenV06[] memory makerTokens,\n IERC20TokenV06[] memory takerTokens,\n uint256[] memory minValidSalts\n )\n public\n {\n require(\n makerTokens.length == takerTokens.length &&\n makerTokens.length == minValidSalts.length,\n \"NativeOrdersFeature/MISMATCHED_PAIR_ORDERS_ARRAY_LENGTHS\"\n );\n\n for (uint256 i = 0; i < makerTokens.length; ++i) {\n cancelPairLimitOrders(\n makerTokens[i],\n takerTokens[i],\n minValidSalts[i]\n );\n }\n }\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairRfqOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n public\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n uint256 oldMinValidSalt =\n stor.rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)];\n\n // New min salt must >= the old one.\n if (oldMinValidSalt > minValidSalt) {\n LibNativeOrdersRichErrors.\n CancelSaltTooLowError(minValidSalt, oldMinValidSalt)\n .rrevert();\n }\n\n stor.rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)] = minValidSalt;\n\n emit PairCancelledRfqOrders(\n msg.sender,\n address(makerToken),\n address(takerToken),\n minValidSalt\n );\n }\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairRfqOrders(\n IERC20TokenV06[] memory makerTokens,\n IERC20TokenV06[] memory takerTokens,\n uint256[] memory minValidSalts\n )\n public\n {\n require(\n makerTokens.length == takerTokens.length &&\n makerTokens.length == minValidSalts.length,\n \"NativeOrdersFeature/MISMATCHED_PAIR_ORDERS_ARRAY_LENGTHS\"\n );\n\n for (uint256 i = 0; i < makerTokens.length; ++i) {\n cancelPairRfqOrders(\n makerTokens[i],\n takerTokens[i],\n minValidSalts[i]\n );\n }\n }\n\n /// @dev Cancel a limit or RFQ order directly by its order hash.\n /// @param orderHash The order's order hash.\n /// @param maker The order's maker.\n function _cancelOrderHash(bytes32 orderHash, address maker)\n private\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n // Set the high bit on the raw taker token fill amount to indicate\n // a cancel. It's OK to cancel twice.\n stor.orderHashToTakerTokenFilledAmount[orderHash] |= HIGH_BIT;\n\n emit OrderCancelled(orderHash, maker);\n }\n}\n"
|
|
},
|
|
"./native_orders/NativeOrdersInfo.sol": {
|
|
"id": 18,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol\";\nimport \"../../fixins/FixinEIP712.sol\";\nimport \"../../fixins/FixinTokenSpender.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\n\n\n/// @dev Feature for getting info about limit and RFQ orders.\nabstract contract NativeOrdersInfo is\n FixinEIP712,\n FixinTokenSpender\n{\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n // @dev Params for `_getActualFillableTakerTokenAmount()`.\n struct GetActualFillableTakerTokenAmountParams {\n address maker;\n IERC20TokenV06 makerToken;\n uint128 orderMakerAmount;\n uint128 orderTakerAmount;\n LibNativeOrder.OrderInfo orderInfo;\n }\n\n /// @dev Highest bit of a uint256, used to flag cancelled orders.\n uint256 private constant HIGH_BIT = 1 << 255;\n\n constructor(\n address zeroExAddress,\n bytes32 greedyTokensBloomFilter\n )\n internal\n FixinEIP712(zeroExAddress)\n FixinTokenSpender(greedyTokensBloomFilter)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Get the order info for a limit order.\n /// @param order The limit order.\n /// @return orderInfo Info about the order.\n function getLimitOrderInfo(LibNativeOrder.LimitOrder memory order)\n public\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo)\n {\n // Recover maker and compute order hash.\n orderInfo.orderHash = getLimitOrderHash(order);\n uint256 minValidSalt = LibNativeOrdersStorage.getStorage()\n .limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [order.maker]\n [address(order.makerToken)]\n [address(order.takerToken)];\n _populateCommonOrderInfoFields(\n orderInfo,\n order.takerAmount,\n order.expiry,\n order.salt,\n minValidSalt\n );\n }\n\n /// @dev Get the order info for an RFQ order.\n /// @param order The RFQ order.\n /// @return orderInfo Info about the order.\n function getRfqOrderInfo(LibNativeOrder.RfqOrder memory order)\n public\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo)\n {\n // Recover maker and compute order hash.\n orderInfo.orderHash = getRfqOrderHash(order);\n uint256 minValidSalt = LibNativeOrdersStorage.getStorage()\n .rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [order.maker]\n [address(order.makerToken)]\n [address(order.takerToken)];\n _populateCommonOrderInfoFields(\n orderInfo,\n order.takerAmount,\n order.expiry,\n order.salt,\n minValidSalt\n );\n\n // Check for missing txOrigin.\n if (order.txOrigin == address(0)) {\n orderInfo.status = LibNativeOrder.OrderStatus.INVALID;\n }\n }\n\n /// @dev Get the canonical hash of a limit order.\n /// @param order The limit order.\n /// @return orderHash The order hash.\n function getLimitOrderHash(LibNativeOrder.LimitOrder memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n return _getEIP712Hash(\n LibNativeOrder.getLimitOrderStructHash(order)\n );\n }\n\n /// @dev Get the canonical hash of an RFQ order.\n /// @param order The RFQ order.\n /// @return orderHash The order hash.\n function getRfqOrderHash(LibNativeOrder.RfqOrder memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n return _getEIP712Hash(\n LibNativeOrder.getRfqOrderStructHash(order)\n );\n }\n\n /// @dev Get order info, fillable amount, and signature validity for a limit order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getLimitOrderRelevantState(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature calldata signature\n )\n public\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfo = getLimitOrderInfo(order);\n actualFillableTakerTokenAmount = _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams({\n maker: order.maker,\n makerToken: order.makerToken,\n orderMakerAmount: order.makerAmount,\n orderTakerAmount: order.takerAmount,\n orderInfo: orderInfo\n })\n );\n isSignatureValid = order.maker ==\n LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n }\n\n /// @dev Get order info, fillable amount, and signature validity for an RFQ order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getRfqOrderRelevantState(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature\n )\n public\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfo = getRfqOrderInfo(order);\n actualFillableTakerTokenAmount = _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams({\n maker: order.maker,\n makerToken: order.makerToken,\n orderMakerAmount: order.makerAmount,\n orderTakerAmount: order.takerAmount,\n orderInfo: orderInfo\n })\n );\n isSignatureValid = order.maker ==\n LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n }\n\n /// @dev Batch version of `getLimitOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getLimitOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The limit orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetLimitOrderRelevantStates(\n LibNativeOrder.LimitOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n )\n {\n require(\n orders.length == signatures.length,\n \"NativeOrdersFeature/MISMATCHED_ARRAY_LENGTHS\"\n );\n orderInfos = new LibNativeOrder.OrderInfo[](orders.length);\n actualFillableTakerTokenAmounts = new uint128[](orders.length);\n isSignatureValids = new bool[](orders.length);\n for (uint256 i = 0; i < orders.length; ++i) {\n try\n this.getLimitOrderRelevantState(orders[i], signatures[i])\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfos[i] = orderInfo;\n actualFillableTakerTokenAmounts[i] = actualFillableTakerTokenAmount;\n isSignatureValids[i] = isSignatureValid;\n }\n catch {}\n }\n }\n\n /// @dev Batch version of `getRfqOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getRfqOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The RFQ orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetRfqOrderRelevantStates(\n LibNativeOrder.RfqOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n )\n {\n require(\n orders.length == signatures.length,\n \"NativeOrdersFeature/MISMATCHED_ARRAY_LENGTHS\"\n );\n orderInfos = new LibNativeOrder.OrderInfo[](orders.length);\n actualFillableTakerTokenAmounts = new uint128[](orders.length);\n isSignatureValids = new bool[](orders.length);\n for (uint256 i = 0; i < orders.length; ++i) {\n try\n this.getRfqOrderRelevantState(orders[i], signatures[i])\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfos[i] = orderInfo;\n actualFillableTakerTokenAmounts[i] = actualFillableTakerTokenAmount;\n isSignatureValids[i] = isSignatureValid;\n }\n catch {}\n }\n }\n\n /// @dev Populate `status` and `takerTokenFilledAmount` fields in\n /// `orderInfo`, which use the same code path for both limit and\n /// RFQ orders.\n /// @param orderInfo `OrderInfo` with `orderHash` and `maker` filled.\n /// @param takerAmount The order's taker token amount..\n /// @param expiry The order's expiry.\n /// @param salt The order's salt.\n /// @param salt The minimum valid salt for the maker and pair combination.\n function _populateCommonOrderInfoFields(\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 takerAmount,\n uint64 expiry,\n uint256 salt,\n uint256 minValidSalt\n )\n private\n view\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n // Get the filled and direct cancel state.\n {\n // The high bit of the raw taker token filled amount will be set\n // if the order was cancelled.\n uint256 rawTakerTokenFilledAmount =\n stor.orderHashToTakerTokenFilledAmount[orderInfo.orderHash];\n orderInfo.takerTokenFilledAmount = uint128(rawTakerTokenFilledAmount);\n if (orderInfo.takerTokenFilledAmount >= takerAmount) {\n orderInfo.status = LibNativeOrder.OrderStatus.FILLED;\n return;\n }\n if (rawTakerTokenFilledAmount & HIGH_BIT != 0) {\n orderInfo.status = LibNativeOrder.OrderStatus.CANCELLED;\n return;\n }\n }\n\n // Check for expiration.\n if (expiry <= uint64(block.timestamp)) {\n orderInfo.status = LibNativeOrder.OrderStatus.EXPIRED;\n return;\n }\n\n // Check if the order was cancelled by salt.\n if (minValidSalt > salt) {\n orderInfo.status = LibNativeOrder.OrderStatus.CANCELLED;\n return;\n }\n orderInfo.status = LibNativeOrder.OrderStatus.FILLABLE;\n }\n\n /// @dev Calculate the actual fillable taker token amount of an order\n /// based on maker allowance and balances.\n function _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams memory params\n )\n private\n view\n returns (uint128 actualFillableTakerTokenAmount)\n {\n if (params.orderMakerAmount == 0 || params.orderTakerAmount == 0) {\n // Empty order.\n return 0;\n }\n if (params.orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n // Not fillable.\n return 0;\n }\n\n // Get the fillable maker amount based on the order quantities and\n // previously filled amount\n uint256 fillableMakerTokenAmount = LibMathV06.getPartialAmountFloor(\n uint256(\n params.orderTakerAmount\n - params.orderInfo.takerTokenFilledAmount\n ),\n uint256(params.orderTakerAmount),\n uint256(params.orderMakerAmount)\n );\n // Clamp it to the amount of maker tokens we can spend on behalf of the\n // maker.\n fillableMakerTokenAmount = LibSafeMathV06.min256(\n fillableMakerTokenAmount,\n _getSpendableERC20BalanceOf(params.makerToken, params.maker)\n );\n // Convert to taker token amount.\n return LibMathV06.getPartialAmountCeil(\n fillableMakerTokenAmount,\n uint256(params.orderMakerAmount),\n uint256(params.orderTakerAmount)\n ).safeDowncastToUint128();\n }\n}\n"
|
|
},
|
|
"../fixins/FixinEIP712.sol": {
|
|
"id": 22,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibCommonRichErrors.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\n\n\n/// @dev EIP712 helpers for features.\nabstract contract FixinEIP712 {\n\n /// @dev The domain hash separator for the entire exchange proxy.\n bytes32 public immutable EIP712_DOMAIN_SEPARATOR;\n\n constructor(address zeroExAddress) internal {\n // Compute `EIP712_DOMAIN_SEPARATOR`\n {\n uint256 chainId;\n assembly { chainId := chainid() }\n EIP712_DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\n \"EIP712Domain(\"\n \"string name,\"\n \"string version,\"\n \"uint256 chainId,\"\n \"address verifyingContract\"\n \")\"\n ),\n keccak256(\"ZeroEx\"),\n keccak256(\"1.0.0\"),\n chainId,\n zeroExAddress\n )\n );\n }\n }\n\n function _getEIP712Hash(bytes32 structHash)\n internal\n view\n returns (bytes32 eip712Hash)\n {\n return keccak256(abi.encodePacked(\n hex\"1901\",\n EIP712_DOMAIN_SEPARATOR,\n structHash\n ));\n }\n}\n"
|
|
},
|
|
"../fixins/FixinTokenSpender.sol": {
|
|
"id": 24,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../features/interfaces/ITokenSpenderFeature.sol\";\nimport \"../errors/LibSpenderRichErrors.sol\";\nimport \"../external/FeeCollector.sol\";\nimport \"../vendor/v3/IStaking.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n\n/// @dev Helpers for moving tokens around.\nabstract contract FixinTokenSpender {\n using LibRichErrorsV06 for bytes;\n\n // Mask of the lower 20 bytes of a bytes32.\n uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;\n /// @dev A bloom filter for tokens that consume all gas when `transferFrom()` fails.\n bytes32 public immutable GREEDY_TOKENS_BLOOM_FILTER;\n\n /// @param greedyTokensBloomFilter The bloom filter for all greedy tokens.\n constructor(bytes32 greedyTokensBloomFilter)\n internal\n {\n GREEDY_TOKENS_BLOOM_FILTER = greedyTokensBloomFilter;\n }\n\n /// @dev Transfers ERC20 tokens from `owner` to `to`.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @param to The recipient of the tokens.\n /// @param amount The amount of `token` to transfer.\n function _transferERC20Tokens(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount\n )\n internal\n {\n bool success;\n bytes memory revertData;\n\n require(address(token) != address(this), \"FixinTokenSpender/CANNOT_INVOKE_SELF\");\n\n // If the token eats all gas when failing, we do not want to perform\n // optimistic fall through to the old AllowanceTarget contract if the\n // direct transferFrom() fails.\n if (_isTokenPossiblyGreedy(token)) {\n // If the token does not have a direct allowance on us then we use\n // the allowance target.\n if (token.allowance(owner, address(this)) < amount) {\n _transferFromLegacyAllowanceTarget(\n token,\n owner,\n to,\n amount,\n \"\"\n );\n return;\n }\n }\n\n assembly {\n let ptr := mload(0x40) // free memory pointer\n\n // selector for transferFrom(address,address,uint256)\n mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK))\n mstore(add(ptr, 0x24), and(to, ADDRESS_MASK))\n mstore(add(ptr, 0x44), amount)\n\n success := call(\n gas(),\n and(token, ADDRESS_MASK),\n 0,\n ptr,\n 0x64,\n 0,\n 0\n )\n\n let rdsize := returndatasize()\n\n returndatacopy(add(ptr, 0x20), 0, rdsize) // reuse memory\n\n // Check for ERC20 success. ERC20 tokens should return a boolean,\n // but some don't. We accept 0-length return data as success, or at\n // least 32 bytes that starts with a 32-byte boolean true.\n success := and(\n success, // call itself succeeded\n or(\n iszero(rdsize), // no return data, or\n and(\n iszero(lt(rdsize, 32)), // at least 32 bytes\n eq(mload(add(ptr, 0x20)), 1) // starts with uint256(1)\n )\n )\n )\n\n if iszero(success) {\n // revertData is a bytes, so length-prefixed data\n mstore(ptr, rdsize)\n revertData := ptr\n\n // update free memory pointer (ptr + 32-byte length + return data)\n mstore(0x40, add(add(ptr, 0x20), rdsize))\n }\n }\n\n if (!success) {\n _transferFromLegacyAllowanceTarget(\n token,\n owner,\n to,\n amount,\n revertData\n );\n }\n }\n\n /// @dev Gets the maximum amount of an ERC20 token `token` that can be\n /// pulled from `owner` by this address.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @return amount The amount of tokens that can be pulled.\n function _getSpendableERC20BalanceOf(\n IERC20TokenV06 token,\n address owner\n )\n internal\n view\n returns (uint256)\n {\n return LibSafeMathV06.min256(\n token.allowance(owner, address(this)),\n token.balanceOf(owner)\n );\n }\n\n /// @dev Check if a token possibly belongs to the `GREEDY_TOKENS_BLOOM_FILTER`\n /// bloom filter.\n function _isTokenPossiblyGreedy(IERC20TokenV06 token)\n internal\n view\n returns (bool isPossiblyGreedy)\n {\n // The hash is given by:\n // (1 << (keccak256(token) % 256)) | (1 << (token % 256))\n bytes32 h;\n assembly {\n mstore(0, token)\n h := or(shl(mod(keccak256(0, 32), 256), 1), shl(mod(token, 256), 1))\n }\n return (h & GREEDY_TOKENS_BLOOM_FILTER) == h;\n }\n\n /// @dev Transfer tokens using the legacy allowance target instead of\n /// allowances directly set on the exchange proxy.\n function _transferFromLegacyAllowanceTarget(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount,\n bytes memory initialRevertData\n )\n private\n {\n // Try the old AllowanceTarget.\n try ITokenSpenderFeature(address(this))._spendERC20Tokens(\n token,\n owner,\n to,\n amount\n ) {\n } catch (bytes memory revertData) {\n // Bubble up the first error message. (In general, the fallback to the\n // allowance target is opportunistic. We ignore the specific error\n // message if it fails.)\n LibSpenderRichErrors.SpenderERC20TransferFromFailedError(\n address(token),\n owner,\n to,\n amount,\n initialRevertData.length != 0 ? initialRevertData : revertData\n ).rrevert();\n }\n }\n}\n"
|
|
},
|
|
"./interfaces/ITokenSpenderFeature.sol": {
|
|
"id": 14,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\n/// @dev Feature that allows spending token allowances.\ninterface ITokenSpenderFeature {\n\n /// @dev Transfers ERC20 tokens from `owner` to `to`.\n /// Only callable from within.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @param to The recipient of the tokens.\n /// @param amount The amount of `token` to transfer.\n function _spendERC20Tokens(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount\n )\n external;\n\n /// @dev Gets the maximum amount of an ERC20 token `token` that can be\n /// pulled from `owner`.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @return amount The amount of tokens that can be pulled.\n function getSpendableERC20BalanceOf(IERC20TokenV06 token, address owner)\n external\n view\n returns (uint256 amount);\n\n /// @dev Get the address of the allowance target.\n /// @return target The target of token allowances.\n function getAllowanceTarget() external view returns (address target);\n}\n"
|
|
},
|
|
"../errors/LibSpenderRichErrors.sol": {
|
|
"id": 4,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSpenderRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function SpenderERC20TransferFromFailedError(\n address token,\n address owner,\n address to,\n uint256 amount,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SpenderERC20TransferFromFailedError(address,address,address,uint256,bytes)\")),\n token,\n owner,\n to,\n amount,\n errorData\n );\n }\n}\n"
|
|
},
|
|
"../external/FeeCollector.sol": {
|
|
"id": 5,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n/// @dev The collector contract for protocol fees\ncontract FeeCollector is AuthorizableV06 {\n /// @dev Allow ether transfers to the collector.\n receive() external payable { }\n\n constructor() public {\n _addAuthorizedAddress(msg.sender);\n }\n\n /// @dev Approve the staking contract and join a pool. Only an authority\n /// can call this.\n /// @param weth The WETH contract.\n /// @param staking The staking contract.\n /// @param poolId The pool ID this contract is collecting fees for.\n function initialize(\n IEtherTokenV06 weth,\n IStaking staking,\n bytes32 poolId\n )\n external\n onlyAuthorized\n {\n weth.approve(address(staking), type(uint256).max);\n staking.joinStakingPoolAsMaker(poolId);\n }\n\n /// @dev Convert all held ether to WETH. Only an authority can call this.\n /// @param weth The WETH contract.\n function convertToWeth(\n IEtherTokenV06 weth\n )\n external\n onlyAuthorized\n {\n if (address(this).balance > 0) {\n weth.deposit{value: address(this).balance}();\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol": {
|
|
"id": 31,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./interfaces/IAuthorizableV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibAuthorizableRichErrorsV06.sol\";\nimport \"./OwnableV06.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract AuthorizableV06 is\n OwnableV06,\n IAuthorizableV06\n{\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n _assertSenderIsAuthorized();\n _;\n }\n\n // @dev Whether an address is authorized to call privileged functions.\n // @param 0 Address to query.\n // @return 0 Whether the address is authorized.\n mapping (address => bool) public override authorized;\n // @dev Whether an address is authorized to call privileged functions.\n // @param 0 Index of authorized address.\n // @return 0 Authorized address.\n address[] public override authorities;\n\n /// @dev Initializes the `owner` address.\n constructor()\n public\n OwnableV06()\n {}\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n override\n onlyOwner\n {\n _addAuthorizedAddress(target);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n override\n onlyOwner\n {\n if (!authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));\n }\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n _removeAuthorizedAddressAtIndex(target, i);\n break;\n }\n }\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n override\n onlyOwner\n {\n _removeAuthorizedAddressAtIndex(target, index);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n override\n view\n returns (address[] memory)\n {\n return authorities;\n }\n\n /// @dev Reverts if msg.sender is not authorized.\n function _assertSenderIsAuthorized()\n internal\n view\n {\n if (!authorized[msg.sender]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.SenderNotAuthorizedError(msg.sender));\n }\n }\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function _addAuthorizedAddress(address target)\n internal\n {\n // Ensure that the target is not the zero address.\n if (target == address(0)) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.ZeroCantBeAuthorizedError());\n }\n\n // Ensure that the target is not already authorized.\n if (authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetAlreadyAuthorizedError(target));\n }\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function _removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n internal\n {\n if (!authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));\n }\n if (index >= authorities.length) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.IndexOutOfBoundsError(\n index,\n authorities.length\n ));\n }\n if (authorities[index] != target) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.AuthorizedAddressMismatchError(\n authorities[index],\n target\n ));\n }\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.pop();\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/interfaces/IAuthorizableV06.sol": {
|
|
"id": 40,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IOwnableV06.sol\";\n\n\ninterface IAuthorizableV06 is\n IOwnableV06\n{\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n\n /// @dev Gets all authorized addresses.\n /// @return authorizedAddresses Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory authorizedAddresses);\n\n /// @dev Whether an adderss is authorized to call privileged functions.\n /// @param addr Address to query.\n /// @return isAuthorized Whether the address is authorized.\n function authorized(address addr) external view returns (bool isAuthorized);\n\n /// @dev All addresseses authorized to call privileged functions.\n /// @param idx Index of authorized address.\n /// @return addr Authorized address.\n function authorities(uint256 idx) external view returns (address addr);\n\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/IOwnableV06.sol": {
|
|
"id": 41,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IOwnableV06 {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner) external;\n\n /// @dev The owner of this contract.\n /// @return ownerAddress The owner address.\n function owner() external view returns (address ownerAddress);\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibAuthorizableRichErrorsV06.sol": {
|
|
"id": 35,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibAuthorizableRichErrorsV06 {\n\n // bytes4(keccak256(\"AuthorizedAddressMismatchError(address,address)\"))\n bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR =\n 0x140a84db;\n\n // bytes4(keccak256(\"IndexOutOfBoundsError(uint256,uint256)\"))\n bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR =\n 0xe9f83771;\n\n // bytes4(keccak256(\"SenderNotAuthorizedError(address)\"))\n bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xb65a25b9;\n\n // bytes4(keccak256(\"TargetAlreadyAuthorizedError(address)\"))\n bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR =\n 0xde16f1a0;\n\n // bytes4(keccak256(\"TargetNotAuthorizedError(address)\"))\n bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xeb5108a2;\n\n // bytes4(keccak256(\"ZeroCantBeAuthorizedError()\"))\n bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES =\n hex\"57654fe4\";\n\n // solhint-disable func-name-mixedcase\n function AuthorizedAddressMismatchError(\n address authorized,\n address target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,\n authorized,\n target\n );\n }\n\n function IndexOutOfBoundsError(\n uint256 index,\n uint256 length\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,\n index,\n length\n );\n }\n\n function SenderNotAuthorizedError(address sender)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,\n sender\n );\n }\n\n function TargetAlreadyAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function TargetNotAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function ZeroCantBeAuthorizedError()\n internal\n pure\n returns (bytes memory)\n {\n return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/OwnableV06.sol": {
|
|
"id": 34,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./interfaces/IOwnableV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibOwnableRichErrorsV06.sol\";\n\n\ncontract OwnableV06 is\n IOwnableV06\n{\n /// @dev The owner of this contract.\n /// @return 0 The owner address.\n address public override owner;\n\n constructor() public {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n _assertSenderIsOwner();\n _;\n }\n\n /// @dev Change the owner of this contract.\n /// @param newOwner New owner address.\n function transferOwnership(address newOwner)\n public\n override\n onlyOwner\n {\n if (newOwner == address(0)) {\n LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.TransferOwnerToZeroError());\n } else {\n owner = newOwner;\n emit OwnershipTransferred(msg.sender, newOwner);\n }\n }\n\n function _assertSenderIsOwner()\n internal\n view\n {\n if (msg.sender != owner) {\n LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.OnlyOwnerError(\n msg.sender,\n owner\n ));\n }\n }\n}\n"
|
|
},
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibOwnableRichErrorsV06.sol": {
|
|
"id": 37,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.6.5;\n\n\nlibrary LibOwnableRichErrorsV06 {\n\n // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n 0x1de45ad1;\n\n // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n hex\"e69edc3e\";\n\n // solhint-disable func-name-mixedcase\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_OWNER_ERROR_SELECTOR,\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\n }\n}\n"
|
|
},
|
|
"./native_orders/NativeOrdersProtocolFees.sol": {
|
|
"id": 19,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../fixins/FixinProtocolFees.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../vendor/v3/IStaking.sol\";\n\n\n/// @dev Mixin for protocol fee utility functions.\nabstract contract NativeOrdersProtocolFees is\n FixinProtocolFees\n{\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier\n )\n internal\n FixinProtocolFees(weth, staking, feeCollectorController, protocolFeeMultiplier)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Transfers protocol fees from the `FeeCollector` pools into\n /// the staking contract.\n /// @param poolIds Staking pool IDs\n function transferProtocolFeesForPools(bytes32[] calldata poolIds)\n external\n {\n for (uint256 i = 0; i < poolIds.length; ++i) {\n _transferFeesForPool(poolIds[i]);\n }\n }\n\n /// @dev Get the protocol fee multiplier. This should be multiplied by the\n /// gas price to arrive at the required protocol fee to fill a native order.\n /// @return multiplier The protocol fee multiplier.\n function getProtocolFeeMultiplier()\n external\n view\n returns (uint32 multiplier)\n {\n return PROTOCOL_FEE_MULTIPLIER;\n }\n}\n"
|
|
},
|
|
"../fixins/FixinProtocolFees.sol": {
|
|
"id": 23,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../external/FeeCollector.sol\";\nimport \"../external/FeeCollectorController.sol\";\nimport \"../external/LibFeeCollector.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n\n/// @dev Helpers for collecting protocol fees.\nabstract contract FixinProtocolFees {\n\n /// @dev The protocol fee multiplier.\n uint32 public immutable PROTOCOL_FEE_MULTIPLIER;\n /// @dev The `FeeCollectorController` contract.\n FeeCollectorController private immutable FEE_COLLECTOR_CONTROLLER;\n /// @dev Hash of the fee collector init code.\n bytes32 private immutable FEE_COLLECTOR_INIT_CODE_HASH;\n /// @dev The WETH token contract.\n IEtherTokenV06 private immutable WETH;\n /// @dev The staking contract.\n IStaking private immutable STAKING;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier\n )\n internal\n {\n FEE_COLLECTOR_CONTROLLER = feeCollectorController;\n FEE_COLLECTOR_INIT_CODE_HASH =\n feeCollectorController.FEE_COLLECTOR_INIT_CODE_HASH();\n WETH = weth;\n STAKING = staking;\n PROTOCOL_FEE_MULTIPLIER = protocolFeeMultiplier;\n }\n\n /// @dev Collect the specified protocol fee in ETH.\n /// The fee is stored in a per-pool fee collector contract.\n /// @param poolId The pool ID for which a fee is being collected.\n /// @return ethProtocolFeePaid How much protocol fee was collected in ETH.\n function _collectProtocolFee(bytes32 poolId)\n internal\n returns (uint256 ethProtocolFeePaid)\n {\n uint256 protocolFeePaid = _getSingleProtocolFee();\n if (protocolFeePaid == 0) {\n // Nothing to do.\n return 0;\n }\n FeeCollector feeCollector = _getFeeCollector(poolId);\n (bool success,) = address(feeCollector).call{value: protocolFeePaid}(\"\");\n require(success, \"FixinProtocolFees/ETHER_TRANSFER_FALIED\");\n return protocolFeePaid;\n }\n\n /// @dev Transfer fees for a given pool to the staking contract.\n /// @param poolId Identifies the pool whose fees are being paid.\n function _transferFeesForPool(bytes32 poolId)\n internal\n {\n // This will create a FeeCollector contract (if necessary) and wrap\n // fees for the pool ID.\n FeeCollector feeCollector =\n FEE_COLLECTOR_CONTROLLER.prepareFeeCollectorToPayFees(poolId);\n // All fees in the fee collector should be in WETH now.\n uint256 bal = WETH.balanceOf(address(feeCollector));\n if (bal > 1) {\n // Leave 1 wei behind to avoid high SSTORE cost of zero-->non-zero.\n STAKING.payProtocolFee(\n address(feeCollector),\n address(feeCollector),\n bal - 1);\n }\n }\n\n /// @dev Compute the CREATE2 address for a fee collector.\n /// @param poolId The fee collector's pool ID.\n function _getFeeCollector(bytes32 poolId)\n internal\n view\n returns (FeeCollector)\n {\n return FeeCollector(LibFeeCollector.getFeeCollectorAddress(\n address(FEE_COLLECTOR_CONTROLLER),\n FEE_COLLECTOR_INIT_CODE_HASH,\n poolId\n ));\n }\n\n /// @dev Get the cost of a single protocol fee.\n /// @return protocolFeeAmount The protocol fee amount, in ETH/WETH.\n function _getSingleProtocolFee()\n internal\n view\n returns (uint256 protocolFeeAmount)\n {\n return uint256(PROTOCOL_FEE_MULTIPLIER) * tx.gasprice;\n }\n}\n"
|
|
},
|
|
"../external/FeeCollectorController.sol": {
|
|
"id": 6,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../vendor/v3/IStaking.sol\";\nimport \"./FeeCollector.sol\";\nimport \"./LibFeeCollector.sol\";\n\n\n/// @dev A contract that manages `FeeCollector` contracts.\ncontract FeeCollectorController {\n\n /// @dev Hash of the fee collector init code.\n bytes32 public immutable FEE_COLLECTOR_INIT_CODE_HASH;\n /// @dev The WETH contract.\n IEtherTokenV06 private immutable WETH;\n /// @dev The staking contract.\n IStaking private immutable STAKING;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking\n )\n public\n {\n FEE_COLLECTOR_INIT_CODE_HASH = keccak256(type(FeeCollector).creationCode);\n WETH = weth;\n STAKING = staking;\n }\n\n /// @dev Deploy (if needed) a `FeeCollector` contract for `poolId`\n /// and wrap its ETH into WETH. Anyone may call this.\n /// @param poolId The pool ID associated with the staking pool.\n /// @return feeCollector The `FeeCollector` contract instance.\n function prepareFeeCollectorToPayFees(bytes32 poolId)\n external\n returns (FeeCollector feeCollector)\n {\n feeCollector = getFeeCollector(poolId);\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(feeCollector)\n }\n\n if (codeSize == 0) {\n // Create and initialize the contract if necessary.\n new FeeCollector{salt: bytes32(poolId)}();\n feeCollector.initialize(WETH, STAKING, poolId);\n }\n\n if (address(feeCollector).balance > 1) {\n feeCollector.convertToWeth(WETH);\n }\n\n return feeCollector;\n }\n\n /// @dev Get the `FeeCollector` contract for a given pool ID. The contract\n /// will not actually exist until `prepareFeeCollectorToPayFees()`\n /// has been called once.\n /// @param poolId The pool ID associated with the staking pool.\n /// @return feeCollector The `FeeCollector` contract instance.\n function getFeeCollector(bytes32 poolId)\n public\n view\n returns (FeeCollector feeCollector)\n {\n return FeeCollector(LibFeeCollector.getFeeCollectorAddress(\n address(this),\n FEE_COLLECTOR_INIT_CODE_HASH,\n poolId\n ));\n }\n}\n"
|
|
},
|
|
"../external/LibFeeCollector.sol": {
|
|
"id": 7,
|
|
"content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Helpers for computing `FeeCollector` contract addresses.\nlibrary LibFeeCollector {\n\n /// @dev Compute the CREATE2 address for a fee collector.\n /// @param controller The address of the `FeeCollectorController` contract.\n /// @param initCodeHash The init code hash of the `FeeCollector` contract.\n /// @param poolId The fee collector's pool ID.\n function getFeeCollectorAddress(address controller, bytes32 initCodeHash, bytes32 poolId)\n internal\n pure\n returns (address payable feeCollectorAddress)\n {\n // Compute the CREATE2 address for the fee collector.\n return address(uint256(keccak256(abi.encodePacked(\n byte(0xff),\n controller,\n poolId, // pool ID is salt\n initCodeHash\n ))));\n }\n}\n"
|
|
}
|
|
},
|
|
"sourceCodes": {
|
|
"./NativeOrdersFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"../migrations/LibMigrate.sol\";\nimport \"./interfaces/IFeature.sol\";\nimport \"./interfaces/INativeOrdersFeature.sol\";\nimport \"./native_orders/NativeOrdersSettlement.sol\";\n\n\n/// @dev Feature for interacting with limit and RFQ orders.\ncontract NativeOrdersFeature is\n IFeature,\n NativeOrdersSettlement\n{\n /// @dev Name of this feature.\n string public constant override FEATURE_NAME = \"LimitOrders\";\n /// @dev Version of this feature.\n uint256 public immutable override FEATURE_VERSION = _encodeVersion(1, 0, 1);\n\n constructor(\n address zeroExAddress,\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier,\n bytes32 greedyTokensBloomFilter\n )\n public\n NativeOrdersSettlement(\n zeroExAddress,\n weth,\n staking,\n feeCollectorController,\n protocolFeeMultiplier,\n greedyTokensBloomFilter\n )\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Initialize and register this feature.\n /// Should be delegatecalled by `Migrate.migrate()`.\n /// @return success `LibMigrate.SUCCESS` on success.\n function migrate()\n external\n returns (bytes4 success)\n {\n _registerFeatureFunction(this.transferProtocolFeesForPools.selector);\n _registerFeatureFunction(this.fillLimitOrder.selector);\n _registerFeatureFunction(this.fillRfqOrder.selector);\n _registerFeatureFunction(this.fillOrKillLimitOrder.selector);\n _registerFeatureFunction(this.fillOrKillRfqOrder.selector);\n _registerFeatureFunction(this._fillLimitOrder.selector);\n _registerFeatureFunction(this._fillRfqOrder.selector);\n _registerFeatureFunction(this.cancelLimitOrder.selector);\n _registerFeatureFunction(this.cancelRfqOrder.selector);\n _registerFeatureFunction(this.batchCancelLimitOrders.selector);\n _registerFeatureFunction(this.batchCancelRfqOrders.selector);\n _registerFeatureFunction(this.cancelPairLimitOrders.selector);\n _registerFeatureFunction(this.batchCancelPairLimitOrders.selector);\n _registerFeatureFunction(this.cancelPairRfqOrders.selector);\n _registerFeatureFunction(this.batchCancelPairRfqOrders.selector);\n _registerFeatureFunction(this.getLimitOrderInfo.selector);\n _registerFeatureFunction(this.getRfqOrderInfo.selector);\n _registerFeatureFunction(this.getLimitOrderHash.selector);\n _registerFeatureFunction(this.getRfqOrderHash.selector);\n _registerFeatureFunction(this.getProtocolFeeMultiplier.selector);\n _registerFeatureFunction(this.registerAllowedRfqOrigins.selector);\n _registerFeatureFunction(this.getLimitOrderRelevantState.selector);\n _registerFeatureFunction(this.getRfqOrderRelevantState.selector);\n _registerFeatureFunction(this.batchGetLimitOrderRelevantStates.selector);\n _registerFeatureFunction(this.batchGetRfqOrderRelevantStates.selector);\n return LibMigrate.MIGRATE_SUCCESS;\n }\n}\n",
|
|
"../migrations/LibMigrate.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\n\n\nlibrary LibMigrate {\n\n /// @dev Magic bytes returned by a migrator to indicate success.\n /// This is `keccack('MIGRATE_SUCCESS')`.\n bytes4 internal constant MIGRATE_SUCCESS = 0x2c64c5ef;\n\n using LibRichErrorsV06 for bytes;\n\n /// @dev Perform a delegatecall and ensure it returns the magic bytes.\n /// @param target The call target.\n /// @param data The call data.\n function delegatecallMigrateFunction(\n address target,\n bytes memory data\n )\n internal\n {\n (bool success, bytes memory resultData) = target.delegatecall(data);\n if (!success ||\n resultData.length != 32 ||\n abi.decode(resultData, (bytes4)) != MIGRATE_SUCCESS)\n {\n LibOwnableRichErrors.MigrateCallFailedError(target, resultData).rrevert();\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibRichErrorsV06 {\n\n // bytes4(keccak256(\"Error(string)\"))\n bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;\n\n // solhint-disable func-name-mixedcase\n /// @dev ABI encode a standard, string revert error payload.\n /// This is the same payload that would be included by a `revert(string)`\n /// solidity statement. It has the function signature `Error(string)`.\n /// @param message The error string.\n /// @return The ABI encoded error.\n function StandardError(string memory message)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n STANDARD_ERROR_SELECTOR,\n bytes(message)\n );\n }\n // solhint-enable func-name-mixedcase\n\n /// @dev Reverts an encoded rich revert reason `errorData`.\n /// @param errorData ABI encoded error data.\n function rrevert(bytes memory errorData)\n internal\n pure\n {\n assembly {\n revert(add(errorData, 0x20), mload(errorData))\n }\n }\n}\n",
|
|
"../errors/LibOwnableRichErrors.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibOwnableRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyOwnerError(address,address)\")),\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n );\n }\n\n function MigrateCallFailedError(address target, bytes memory resultData)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"MigrateCallFailedError(address,bytes)\")),\n target,\n resultData\n );\n }\n}\n",
|
|
"./interfaces/IFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Basic interface for a feature contract.\ninterface IFeature {\n\n // solhint-disable func-name-mixedcase\n\n /// @dev The name of this feature set.\n function FEATURE_NAME() external view returns (string memory name);\n\n /// @dev The version of this feature set.\n function FEATURE_VERSION() external view returns (uint256 version);\n}\n",
|
|
"./interfaces/INativeOrdersFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./INativeOrdersEvents.sol\";\n\n\n/// @dev Feature for interacting with limit orders.\ninterface INativeOrdersFeature is\n INativeOrdersEvents\n{\n\n /// @dev Transfers protocol fees from the `FeeCollector` pools into\n /// the staking contract.\n /// @param poolIds Staking pool IDs\n function transferProtocolFeesForPools(bytes32[] calldata poolIds)\n external;\n\n /// @dev Fill a limit order. The taker and sender will be the caller.\n /// @param order The limit order. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for up to `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n payable\n returns (uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount\n )\n external\n returns (uint128 makerTokenFilledAmount);\n\n /// @dev Fill a limit order. Internal variant. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// `msg.sender` (not `sender`).\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @param sender The order sender.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillLimitOrder(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount,\n address taker,\n address sender\n )\n external\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Fill an RFQ order. Internal variant.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillRfqOrder(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n external\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount);\n\n /// @dev Cancel a single limit order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The limit order.\n function cancelLimitOrder(LibNativeOrder.LimitOrder calldata order)\n external;\n\n /// @dev Cancel a single RFQ order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The RFQ order.\n function cancelRfqOrder(LibNativeOrder.RfqOrder calldata order)\n external;\n\n /// @dev Mark what tx.origin addresses are allowed to fill an order that\n /// specifies the message sender as its txOrigin.\n /// @param origins An array of origin addresses to update.\n /// @param allowed True to register, false to unregister.\n function registerAllowedRfqOrigins(address[] memory origins, bool allowed)\n external;\n\n /// @dev Cancel multiple limit orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The limit orders.\n function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] calldata orders)\n external;\n\n /// @dev Cancel multiple RFQ orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The RFQ orders.\n function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] calldata orders)\n external;\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairLimitOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n external;\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairLimitOrders(\n IERC20TokenV06[] calldata makerTokens,\n IERC20TokenV06[] calldata takerTokens,\n uint256[] calldata minValidSalts\n )\n external;\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairRfqOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n external;\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairRfqOrders(\n IERC20TokenV06[] calldata makerTokens,\n IERC20TokenV06[] calldata takerTokens,\n uint256[] calldata minValidSalts\n )\n external;\n\n /// @dev Get the order info for a limit order.\n /// @param order The limit order.\n /// @return orderInfo Info about the order.\n function getLimitOrderInfo(LibNativeOrder.LimitOrder calldata order)\n external\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo);\n\n /// @dev Get the order info for an RFQ order.\n /// @param order The RFQ order.\n /// @return orderInfo Info about the order.\n function getRfqOrderInfo(LibNativeOrder.RfqOrder calldata order)\n external\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo);\n\n /// @dev Get the canonical hash of a limit order.\n /// @param order The limit order.\n /// @return orderHash The order hash.\n function getLimitOrderHash(LibNativeOrder.LimitOrder calldata order)\n external\n view\n returns (bytes32 orderHash);\n\n /// @dev Get the canonical hash of an RFQ order.\n /// @param order The RFQ order.\n /// @return orderHash The order hash.\n function getRfqOrderHash(LibNativeOrder.RfqOrder calldata order)\n external\n view\n returns (bytes32 orderHash);\n\n /// @dev Get the protocol fee multiplier. This should be multiplied by the\n /// gas price to arrive at the required protocol fee to fill a native order.\n /// @return multiplier The protocol fee multiplier.\n function getProtocolFeeMultiplier()\n external\n view\n returns (uint32 multiplier);\n\n /// @dev Get order info, fillable amount, and signature validity for a limit order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getLimitOrderRelevantState(\n LibNativeOrder.LimitOrder calldata order,\n LibSignature.Signature calldata signature\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n );\n\n /// @dev Get order info, fillable amount, and signature validity for an RFQ order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getRfqOrderRelevantState(\n LibNativeOrder.RfqOrder calldata order,\n LibSignature.Signature calldata signature\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n );\n\n /// @dev Batch version of `getLimitOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getLimitOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The limit orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetLimitOrderRelevantStates(\n LibNativeOrder.LimitOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n );\n\n /// @dev Batch version of `getRfqOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getRfqOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The RFQ orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetRfqOrderRelevantStates(\n LibNativeOrder.RfqOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n );\n}\n",
|
|
"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IERC20TokenV06 {\n\n // solhint-disable no-simple-event-func-name\n event Transfer(\n address indexed from,\n address indexed to,\n uint256 value\n );\n\n event Approval(\n address indexed owner,\n address indexed spender,\n uint256 value\n );\n\n /// @dev send `value` token to `to` from `msg.sender`\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transfer(address to, uint256 value)\n external\n returns (bool);\n\n /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param from The address of the sender\n /// @param to The address of the recipient\n /// @param value The amount of token to be transferred\n /// @return True if transfer was successful\n function transferFrom(\n address from,\n address to,\n uint256 value\n )\n external\n returns (bool);\n\n /// @dev `msg.sender` approves `spender` to spend `value` tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @param value The amount of wei to be approved for transfer\n /// @return Always true if the call has enough gas to complete execution\n function approve(address spender, uint256 value)\n external\n returns (bool);\n\n /// @dev Query total supply of token\n /// @return Total supply of token\n function totalSupply()\n external\n view\n returns (uint256);\n\n /// @dev Get the balance of `owner`.\n /// @param owner The address from which the balance will be retrieved\n /// @return Balance of owner\n function balanceOf(address owner)\n external\n view\n returns (uint256);\n\n /// @dev Get the allowance for `spender` to spend from `owner`.\n /// @param owner The address of the account owning tokens\n /// @param spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address owner, address spender)\n external\n view\n returns (uint256);\n\n /// @dev Get the number of decimals this token has.\n function decimals()\n external\n view\n returns (uint8);\n}\n",
|
|
"./libs/LibSignature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../../errors/LibSignatureRichErrors.sol\";\n\n\n/// @dev A library for validating signatures.\nlibrary LibSignature {\n using LibRichErrorsV06 for bytes;\n\n // '\\x19Ethereum Signed Message:\\n32\\x00\\x00\\x00\\x00' in a word.\n uint256 private constant ETH_SIGN_HASH_PREFIX =\n 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000;\n /// @dev Exclusive upper limit on ECDSA signatures 'R' values.\n /// The valid range is given by fig (282) of the yellow paper.\n uint256 private constant ECDSA_SIGNATURE_R_LIMIT =\n uint256(0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141);\n /// @dev Exclusive upper limit on ECDSA signatures 'S' values.\n /// The valid range is given by fig (283) of the yellow paper.\n uint256 private constant ECDSA_SIGNATURE_S_LIMIT = ECDSA_SIGNATURE_R_LIMIT / 2 + 1;\n\n /// @dev Allowed signature types.\n enum SignatureType {\n ILLEGAL,\n INVALID,\n EIP712,\n ETHSIGN\n }\n\n /// @dev Encoded EC signature.\n struct Signature {\n // How to validate the signature.\n SignatureType signatureType;\n // EC Signature data.\n uint8 v;\n // EC Signature data.\n bytes32 r;\n // EC Signature data.\n bytes32 s;\n }\n\n /// @dev Retrieve the signer of a signature.\n /// Throws if the signature can't be validated.\n /// @param hash The hash that was signed.\n /// @param signature The signature.\n /// @return recovered The recovered signer address.\n function getSignerOfHash(\n bytes32 hash,\n Signature memory signature\n )\n internal\n pure\n returns (address recovered)\n {\n // Ensure this is a signature type that can be validated against a hash.\n _validateHashCompatibleSignature(hash, signature);\n\n if (signature.signatureType == SignatureType.EIP712) {\n // Signed using EIP712\n recovered = ecrecover(\n hash,\n signature.v,\n signature.r,\n signature.s\n );\n } else if (signature.signatureType == SignatureType.ETHSIGN) {\n // Signed using `eth_sign`\n // Need to hash `hash` with \"\\x19Ethereum Signed Message:\\n32\" prefix\n // in packed encoding.\n bytes32 ethSignHash;\n assembly {\n // Use scratch space\n mstore(0, ETH_SIGN_HASH_PREFIX) // length of 28 bytes\n mstore(28, hash) // length of 32 bytes\n ethSignHash := keccak256(0, 60)\n }\n recovered = ecrecover(\n ethSignHash,\n signature.v,\n signature.r,\n signature.s\n );\n }\n // `recovered` can be null if the signature values are out of range.\n if (recovered == address(0)) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,\n hash\n ).rrevert();\n }\n }\n\n /// @dev Validates that a signature is compatible with a hash signee.\n /// @param hash The hash that was signed.\n /// @param signature The signature.\n function _validateHashCompatibleSignature(\n bytes32 hash,\n Signature memory signature\n )\n private\n pure\n {\n // Ensure the r and s are within malleability limits.\n if (uint256(signature.r) >= ECDSA_SIGNATURE_R_LIMIT ||\n uint256(signature.s) >= ECDSA_SIGNATURE_S_LIMIT)\n {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.BAD_SIGNATURE_DATA,\n hash\n ).rrevert();\n }\n\n // Always illegal signature.\n if (signature.signatureType == SignatureType.ILLEGAL) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.ILLEGAL,\n hash\n ).rrevert();\n }\n\n // Always invalid.\n if (signature.signatureType == SignatureType.INVALID) {\n LibSignatureRichErrors.SignatureValidationError(\n LibSignatureRichErrors.SignatureValidationErrorCodes.ALWAYS_INVALID,\n hash\n ).rrevert();\n }\n\n // Solidity should check that the signature type is within enum range for us\n // when abi-decoding.\n }\n}\n",
|
|
"../errors/LibSignatureRichErrors.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSignatureRichErrors {\n\n enum SignatureValidationErrorCodes {\n ALWAYS_INVALID,\n INVALID_LENGTH,\n UNSUPPORTED,\n ILLEGAL,\n WRONG_SIGNER,\n BAD_SIGNATURE_DATA\n }\n\n // solhint-disable func-name-mixedcase\n\n function SignatureValidationError(\n SignatureValidationErrorCodes code,\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SignatureValidationError(uint8,bytes32,address,bytes)\")),\n code,\n hash,\n signerAddress,\n signature\n );\n }\n\n function SignatureValidationError(\n SignatureValidationErrorCodes code,\n bytes32 hash\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SignatureValidationError(uint8,bytes32)\")),\n code,\n hash\n );\n }\n}\n",
|
|
"./libs/LibNativeOrder.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\n\n\n/// @dev A library for common native order operations.\nlibrary LibNativeOrder {\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n enum OrderStatus {\n INVALID,\n FILLABLE,\n FILLED,\n CANCELLED,\n EXPIRED\n }\n\n /// @dev A standard OTC or OO limit order.\n struct LimitOrder {\n IERC20TokenV06 makerToken;\n IERC20TokenV06 takerToken;\n uint128 makerAmount;\n uint128 takerAmount;\n uint128 takerTokenFeeAmount;\n address maker;\n address taker;\n address sender;\n address feeRecipient;\n bytes32 pool;\n uint64 expiry;\n uint256 salt;\n }\n\n /// @dev An RFQ limit order.\n struct RfqOrder {\n IERC20TokenV06 makerToken;\n IERC20TokenV06 takerToken;\n uint128 makerAmount;\n uint128 takerAmount;\n address maker;\n address taker;\n address txOrigin;\n bytes32 pool;\n uint64 expiry;\n uint256 salt;\n }\n\n /// @dev Info on a limit or RFQ order.\n struct OrderInfo {\n bytes32 orderHash;\n OrderStatus status;\n uint128 takerTokenFilledAmount;\n }\n\n uint256 private constant UINT_128_MASK = (1 << 128) - 1;\n uint256 private constant UINT_64_MASK = (1 << 64) - 1;\n uint256 private constant ADDRESS_MASK = (1 << 160) - 1;\n\n // The type hash for limit orders, which is:\n // keccak256(abi.encodePacked(\n // \"LimitOrder(\",\n // \"address makerToken,\",\n // \"address takerToken,\",\n // \"uint128 makerAmount,\",\n // \"uint128 takerAmount,\",\n // \"uint128 takerTokenFeeAmount,\",\n // \"address maker,\",\n // \"address taker,\",\n // \"address sender,\",\n // \"address feeRecipient,\",\n // \"bytes32 pool,\",\n // \"uint64 expiry,\",\n // \"uint256 salt\"\n // \")\"\n // ))\n uint256 private constant _LIMIT_ORDER_TYPEHASH =\n 0xce918627cb55462ddbb85e73de69a8b322f2bc88f4507c52fcad6d4c33c29d49;\n\n // The type hash for RFQ orders, which is:\n // keccak256(abi.encodePacked(\n // \"RfqOrder(\",\n // \"address makerToken,\",\n // \"address takerToken,\",\n // \"uint128 makerAmount,\",\n // \"uint128 takerAmount,\",\n // \"address maker,\",\n // \"address taker,\",\n // \"address txOrigin,\",\n // \"bytes32 pool,\",\n // \"uint64 expiry,\",\n // \"uint256 salt\"\n // \")\"\n // ))\n uint256 private constant _RFQ_ORDER_TYPEHASH =\n 0xe593d3fdfa8b60e5e17a1b2204662ecbe15c23f2084b9ad5bae40359540a7da9;\n\n /// @dev Get the struct hash of a limit order.\n /// @param order The limit order.\n /// @return structHash The struct hash of the order.\n function getLimitOrderStructHash(LimitOrder memory order)\n internal\n pure\n returns (bytes32 structHash)\n {\n // The struct hash is:\n // keccak256(abi.encode(\n // TYPE_HASH,\n // order.makerToken,\n // order.takerToken,\n // order.makerAmount,\n // order.takerAmount,\n // order.takerTokenFeeAmount,\n // order.maker,\n // order.taker,\n // order.sender,\n // order.feeRecipient,\n // order.pool,\n // order.expiry,\n // order.salt,\n // ))\n assembly {\n let mem := mload(0x40)\n mstore(mem, _LIMIT_ORDER_TYPEHASH)\n // order.makerToken;\n mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))\n // order.takerToken;\n mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))\n // order.makerAmount;\n mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))\n // order.takerAmount;\n mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))\n // order.takerTokenFeeAmount;\n mstore(add(mem, 0xA0), and(UINT_128_MASK, mload(add(order, 0x80))))\n // order.maker;\n mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))\n // order.taker;\n mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))\n // order.sender;\n mstore(add(mem, 0x100), and(ADDRESS_MASK, mload(add(order, 0xE0))))\n // order.feeRecipient;\n mstore(add(mem, 0x120), and(ADDRESS_MASK, mload(add(order, 0x100))))\n // order.pool;\n mstore(add(mem, 0x140), mload(add(order, 0x120)))\n // order.expiry;\n mstore(add(mem, 0x160), and(UINT_64_MASK, mload(add(order, 0x140))))\n // order.salt;\n mstore(add(mem, 0x180), mload(add(order, 0x160)))\n structHash := keccak256(mem, 0x1A0)\n }\n }\n\n /// @dev Get the struct hash of a RFQ order.\n /// @param order The RFQ order.\n /// @return structHash The struct hash of the order.\n function getRfqOrderStructHash(RfqOrder memory order)\n internal\n pure\n returns (bytes32 structHash)\n {\n // The struct hash is:\n // keccak256(abi.encode(\n // TYPE_HASH,\n // order.makerToken,\n // order.takerToken,\n // order.makerAmount,\n // order.takerAmount,\n // order.maker,\n // order.taker,\n // order.txOrigin,\n // order.pool,\n // order.expiry,\n // order.salt,\n // ))\n assembly {\n let mem := mload(0x40)\n mstore(mem, _RFQ_ORDER_TYPEHASH)\n // order.makerToken;\n mstore(add(mem, 0x20), and(ADDRESS_MASK, mload(order)))\n // order.takerToken;\n mstore(add(mem, 0x40), and(ADDRESS_MASK, mload(add(order, 0x20))))\n // order.makerAmount;\n mstore(add(mem, 0x60), and(UINT_128_MASK, mload(add(order, 0x40))))\n // order.takerAmount;\n mstore(add(mem, 0x80), and(UINT_128_MASK, mload(add(order, 0x60))))\n // order.maker;\n mstore(add(mem, 0xA0), and(ADDRESS_MASK, mload(add(order, 0x80))))\n // order.taker;\n mstore(add(mem, 0xC0), and(ADDRESS_MASK, mload(add(order, 0xA0))))\n // order.txOrigin;\n mstore(add(mem, 0xE0), and(ADDRESS_MASK, mload(add(order, 0xC0))))\n // order.pool;\n mstore(add(mem, 0x100), mload(add(order, 0xE0)))\n // order.expiry;\n mstore(add(mem, 0x120), and(UINT_64_MASK, mload(add(order, 0x100))))\n // order.salt;\n mstore(add(mem, 0x140), mload(add(order, 0x120)))\n structHash := keccak256(mem, 0x160)\n }\n }\n\n /// @dev Refund any leftover protocol fees in `msg.value` to `msg.sender`.\n /// @param ethProtocolFeePaid How much ETH was paid in protocol fees.\n function refundExcessProtocolFeeToSender(uint256 ethProtocolFeePaid)\n internal\n {\n if (msg.value > ethProtocolFeePaid && msg.sender != address(this)) {\n uint256 refundAmount = msg.value.safeSub(ethProtocolFeePaid);\n (bool success,) = msg\n .sender\n .call{value: refundAmount}(\"\");\n if (!success) {\n LibNativeOrdersRichErrors.ProtocolFeeRefundFailed(\n msg.sender,\n refundAmount\n ).rrevert();\n }\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibSafeMathRichErrorsV06.sol\";\n\n\nlibrary LibSafeMathV06 {\n\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function safeMul128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (a == 0) {\n return 0;\n }\n uint128 c = a * b;\n if (c / a != b) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function safeDiv128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b == 0) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.DIVISION_BY_ZERO,\n a,\n b\n ));\n }\n uint128 c = a / b;\n return c;\n }\n\n function safeSub128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n if (b > a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n a,\n b\n ));\n }\n return a - b;\n }\n\n function safeAdd128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n uint128 c = a + b;\n if (c < a) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256BinOpError(\n LibSafeMathRichErrorsV06.BinOpErrorCodes.ADDITION_OVERFLOW,\n a,\n b\n ));\n }\n return c;\n }\n\n function max128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a >= b ? a : b;\n }\n\n function min128(uint128 a, uint128 b)\n internal\n pure\n returns (uint128)\n {\n return a < b ? a : b;\n }\n\n function safeDowncastToUint128(uint256 a)\n internal\n pure\n returns (uint128)\n {\n if (a > type(uint128).max) {\n LibRichErrorsV06.rrevert(LibSafeMathRichErrorsV06.Uint256DowncastError(\n LibSafeMathRichErrorsV06.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128,\n a\n ));\n }\n return uint128(a);\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibSafeMathRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSafeMathRichErrorsV06 {\n\n // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n 0xe946c1bb;\n\n // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n 0xc996af7b;\n\n enum BinOpErrorCodes {\n ADDITION_OVERFLOW,\n MULTIPLICATION_OVERFLOW,\n SUBTRACTION_UNDERFLOW,\n DIVISION_BY_ZERO\n }\n\n enum DowncastErrorCodes {\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,\n VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT128\n }\n\n // solhint-disable func-name-mixedcase\n function Uint256BinOpError(\n BinOpErrorCodes errorCode,\n uint256 a,\n uint256 b\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_BINOP_ERROR_SELECTOR,\n errorCode,\n a,\n b\n );\n }\n\n function Uint256DowncastError(\n DowncastErrorCodes errorCode,\n uint256 a\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n UINT256_DOWNCAST_ERROR_SELECTOR,\n errorCode,\n a\n );\n }\n}\n",
|
|
"../errors/LibNativeOrdersRichErrors.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibNativeOrdersRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function ProtocolFeeRefundFailed(\n address receiver,\n uint256 refundAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"ProtocolFeeRefundFailed(address,uint256)\")),\n receiver,\n refundAmount\n );\n }\n\n function OrderNotFillableByOriginError(\n bytes32 orderHash,\n address txOrigin,\n address orderTxOrigin\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableByOriginError(bytes32,address,address)\")),\n orderHash,\n txOrigin,\n orderTxOrigin\n );\n }\n\n function OrderNotFillableError(\n bytes32 orderHash,\n uint8 orderStatus\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableError(bytes32,uint8)\")),\n orderHash,\n orderStatus\n );\n }\n\n function OrderNotSignedByMakerError(\n bytes32 orderHash,\n address signer,\n address maker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotSignedByMakerError(bytes32,address,address)\")),\n orderHash,\n signer,\n maker\n );\n }\n\n function OrderNotFillableBySenderError(\n bytes32 orderHash,\n address sender,\n address orderSender\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableBySenderError(bytes32,address,address)\")),\n orderHash,\n sender,\n orderSender\n );\n }\n\n function OrderNotFillableByTakerError(\n bytes32 orderHash,\n address taker,\n address orderTaker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OrderNotFillableByTakerError(bytes32,address,address)\")),\n orderHash,\n taker,\n orderTaker\n );\n }\n\n function CancelSaltTooLowError(\n uint256 minValidSalt,\n uint256 oldMinValidSalt\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"CancelSaltTooLowError(uint256,uint256)\")),\n minValidSalt,\n oldMinValidSalt\n );\n }\n\n function FillOrKillFailedError(\n bytes32 orderHash,\n uint256 takerTokenFilledAmount,\n uint256 takerTokenFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"FillOrKillFailedError(bytes32,uint256,uint256)\")),\n orderHash,\n takerTokenFilledAmount,\n takerTokenFillAmount\n );\n }\n\n function OnlyOrderMakerAllowed(\n bytes32 orderHash,\n address sender,\n address maker\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyOrderMakerAllowed(bytes32,address,address)\")),\n orderHash,\n sender,\n maker\n );\n }\n\n function BatchFillIncompleteError(\n bytes32 orderHash,\n uint256 takerTokenFilledAmount,\n uint256 takerTokenFillAmount\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"BatchFillIncompleteError(bytes32,uint256,uint256)\")),\n orderHash,\n takerTokenFilledAmount,\n takerTokenFillAmount\n );\n }\n}\n",
|
|
"./interfaces/INativeOrdersEvents.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\n\n\n/// @dev Events emitted by NativeOrdersFeature.\ninterface INativeOrdersEvents {\n\n /// @dev Emitted whenever a `LimitOrder` is filled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The maker of the order.\n /// @param taker The taker of the order.\n /// @param feeRecipient Fee recipient of the order.\n /// @param takerTokenFilledAmount How much taker token was filled.\n /// @param makerTokenFilledAmount How much maker token was filled.\n /// @param protocolFeePaid How much protocol fee was paid.\n /// @param pool The fee pool associated with this order.\n event LimitOrderFilled(\n bytes32 orderHash,\n address maker,\n address taker,\n address feeRecipient,\n address makerToken,\n address takerToken,\n uint128 takerTokenFilledAmount,\n uint128 makerTokenFilledAmount,\n uint128 takerTokenFeeFilledAmount,\n uint256 protocolFeePaid,\n bytes32 pool\n );\n\n /// @dev Emitted whenever an `RfqOrder` is filled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The maker of the order.\n /// @param taker The taker of the order.\n /// @param takerTokenFilledAmount How much taker token was filled.\n /// @param makerTokenFilledAmount How much maker token was filled.\n /// @param pool The fee pool associated with this order.\n event RfqOrderFilled(\n bytes32 orderHash,\n address maker,\n address taker,\n address makerToken,\n address takerToken,\n uint128 takerTokenFilledAmount,\n uint128 makerTokenFilledAmount,\n bytes32 pool\n );\n\n /// @dev Emitted whenever a limit or RFQ order is cancelled.\n /// @param orderHash The canonical hash of the order.\n /// @param maker The order maker.\n event OrderCancelled(\n bytes32 orderHash,\n address maker\n );\n\n /// @dev Emitted whenever Limit orders are cancelled by pair by a maker.\n /// @param maker The maker of the order.\n /// @param makerToken The maker token in a pair for the orders cancelled.\n /// @param takerToken The taker token in a pair for the orders cancelled.\n /// @param minValidSalt The new minimum valid salt an order with this pair must\n /// have.\n event PairCancelledLimitOrders(\n address maker,\n address makerToken,\n address takerToken,\n uint256 minValidSalt\n );\n\n /// @dev Emitted whenever RFQ orders are cancelled by pair by a maker.\n /// @param maker The maker of the order.\n /// @param makerToken The maker token in a pair for the orders cancelled.\n /// @param takerToken The taker token in a pair for the orders cancelled.\n /// @param minValidSalt The new minimum valid salt an order with this pair must\n /// have.\n event PairCancelledRfqOrders(\n address maker,\n address makerToken,\n address takerToken,\n uint256 minValidSalt\n );\n\n /// @dev Emitted when new addresses are allowed or disallowed to fill\n /// orders with a given txOrigin.\n /// @param origin The address doing the allowing.\n /// @param addrs The address being allowed/disallowed.\n /// @param allowed Indicates whether the address should be allowed.\n event RfqOrderOriginsAllowed(\n address origin,\n address[] addrs,\n bool allowed\n );\n}\n",
|
|
"./native_orders/NativeOrdersSettlement.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../fixins/FixinCommon.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../../vendor/v3/IStaking.sol\";\nimport \"../interfaces/INativeOrdersEvents.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./NativeOrdersCancellation.sol\";\nimport \"./NativeOrdersProtocolFees.sol\";\n\n\n/// @dev Mixin for settling limit and RFQ orders.\nabstract contract NativeOrdersSettlement is\n INativeOrdersEvents,\n NativeOrdersCancellation,\n NativeOrdersProtocolFees,\n FixinCommon\n{\n using LibSafeMathV06 for uint128;\n using LibRichErrorsV06 for bytes;\n\n /// @dev Params for `_settleOrder()`.\n struct SettleOrderInfo {\n // Order hash.\n bytes32 orderHash;\n // Maker of the order.\n address maker;\n // Taker of the order.\n address taker;\n // Maker token.\n IERC20TokenV06 makerToken;\n // Taker token.\n IERC20TokenV06 takerToken;\n // Maker token amount.\n uint128 makerAmount;\n // Taker token amount.\n uint128 takerAmount;\n // Maximum taker token amount to fill.\n uint128 takerTokenFillAmount;\n // How much taker token amount has already been filled in this order.\n uint128 takerTokenFilledAmount;\n }\n\n /// @dev Params for `_fillLimitOrderPrivate()`\n struct FillLimitOrderPrivateParams {\n // The limit order.\n LibNativeOrder.LimitOrder order;\n // The order signature.\n LibSignature.Signature signature;\n // Maximum taker token to fill this order with.\n uint128 takerTokenFillAmount;\n // The order taker.\n address taker;\n // The order sender.\n address sender;\n }\n\n // @dev Fill results returned by `_fillLimitOrderPrivate()` and\n /// `_fillRfqOrderPrivate()`.\n struct FillNativeOrderResults {\n uint256 ethProtocolFeePaid;\n uint128 takerTokenFilledAmount;\n uint128 makerTokenFilledAmount;\n uint128 takerTokenFeeFilledAmount;\n }\n\n constructor(\n address zeroExAddress,\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier,\n bytes32 greedyTokensBloomFilter\n )\n public\n NativeOrdersCancellation(zeroExAddress, greedyTokensBloomFilter)\n NativeOrdersProtocolFees(weth, staking, feeCollectorController, protocolFeeMultiplier)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Fill a limit order. The taker and sender will be the caller.\n /// @param order The limit order. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n payable\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: msg.sender,\n sender: msg.sender\n }));\n LibNativeOrder.refundExcessProtocolFeeToSender(results.ethProtocolFeePaid);\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order for up to `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH should be attached to pay the\n /// protocol fee.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token amount to fill this order with.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n msg.sender\n );\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n payable\n returns (uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: msg.sender,\n sender: msg.sender\n }));\n // Must have filled exactly the amount requested.\n if (results.takerTokenFilledAmount < takerTokenFillAmount) {\n LibNativeOrdersRichErrors.FillOrKillFailedError(\n getLimitOrderHash(order),\n results.takerTokenFilledAmount,\n takerTokenFillAmount\n ).rrevert();\n }\n LibNativeOrder.refundExcessProtocolFeeToSender(results.ethProtocolFeePaid);\n makerTokenFilledAmount = results.makerTokenFilledAmount;\n }\n\n /// @dev Fill an RFQ order for exactly `takerTokenFillAmount` taker tokens.\n /// The taker will be the caller. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// the caller.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount How much taker token to fill this order with.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function fillOrKillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount\n )\n public\n returns (uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n msg.sender\n );\n // Must have filled exactly the amount requested.\n if (results.takerTokenFilledAmount < takerTokenFillAmount) {\n LibNativeOrdersRichErrors.FillOrKillFailedError(\n getRfqOrderHash(order),\n results.takerTokenFilledAmount,\n takerTokenFillAmount\n ).rrevert();\n }\n makerTokenFilledAmount = results.makerTokenFilledAmount;\n }\n\n /// @dev Fill a limit order. Internal variant. ETH protocol fees can be\n /// attached to this call.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @param sender The order sender.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillLimitOrder(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker,\n address sender\n )\n public\n virtual\n payable\n onlySelf\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillLimitOrderPrivate(FillLimitOrderPrivateParams({\n order: order,\n signature: signature,\n takerTokenFillAmount: takerTokenFillAmount,\n taker: taker,\n sender: sender\n }));\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Fill an RFQ order. Internal variant. ETH protocol fees can be\n /// attached to this call. Any unspent ETH will be refunded to\n /// `msg.sender` (not `sender`).\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return takerTokenFilledAmount How much maker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _fillRfqOrder(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n public\n virtual\n onlySelf\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n FillNativeOrderResults memory results =\n _fillRfqOrderPrivate(\n order,\n signature,\n takerTokenFillAmount,\n taker\n );\n (takerTokenFilledAmount, makerTokenFilledAmount) = (\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount\n );\n }\n\n /// @dev Mark what tx.origin addresses are allowed to fill an order that\n /// specifies the message sender as its txOrigin.\n /// @param origins An array of origin addresses to update.\n /// @param allowed True to register, false to unregister.\n function registerAllowedRfqOrigins(\n address[] memory origins,\n bool allowed\n )\n external\n {\n require(msg.sender == tx.origin,\n \"NativeOrdersFeature/NO_CONTRACT_ORIGINS\");\n\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n for (uint256 i = 0; i < origins.length; i++) {\n stor.originRegistry[msg.sender][origins[i]] = allowed;\n }\n\n emit RfqOrderOriginsAllowed(msg.sender, origins, allowed);\n }\n\n /// @dev Fill a limit order. Private variant. Does not refund protocol fees.\n /// @param params Function params.\n /// @return results Results of the fill.\n function _fillLimitOrderPrivate(FillLimitOrderPrivateParams memory params)\n private\n returns (FillNativeOrderResults memory results)\n {\n LibNativeOrder.OrderInfo memory orderInfo = getLimitOrderInfo(params.order);\n\n // Must be fillable.\n if (orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n LibNativeOrdersRichErrors.OrderNotFillableError(\n orderInfo.orderHash,\n uint8(orderInfo.status)\n ).rrevert();\n }\n\n // Must be fillable by the taker.\n if (params.order.taker != address(0) && params.order.taker != params.taker) {\n LibNativeOrdersRichErrors.OrderNotFillableByTakerError(\n orderInfo.orderHash,\n params.taker,\n params.order.taker\n ).rrevert();\n }\n\n // Must be fillable by the sender.\n if (params.order.sender != address(0) && params.order.sender != params.sender) {\n LibNativeOrdersRichErrors.OrderNotFillableBySenderError(\n orderInfo.orderHash,\n params.sender,\n params.order.sender\n ).rrevert();\n }\n\n // Signature must be valid for the order.\n {\n address signer = LibSignature.getSignerOfHash(\n orderInfo.orderHash,\n params.signature\n );\n if (signer != params.order.maker) {\n LibNativeOrdersRichErrors.OrderNotSignedByMakerError(\n orderInfo.orderHash,\n signer,\n params.order.maker\n ).rrevert();\n }\n }\n\n // Pay the protocol fee.\n results.ethProtocolFeePaid = _collectProtocolFee(params.order.pool);\n\n // Settle between the maker and taker.\n (results.takerTokenFilledAmount, results.makerTokenFilledAmount) = _settleOrder(\n SettleOrderInfo({\n orderHash: orderInfo.orderHash,\n maker: params.order.maker,\n taker: params.taker,\n makerToken: IERC20TokenV06(params.order.makerToken),\n takerToken: IERC20TokenV06(params.order.takerToken),\n makerAmount: params.order.makerAmount,\n takerAmount: params.order.takerAmount,\n takerTokenFillAmount: params.takerTokenFillAmount,\n takerTokenFilledAmount: orderInfo.takerTokenFilledAmount\n })\n );\n\n // Pay the fee recipient.\n if (params.order.takerTokenFeeAmount > 0) {\n results.takerTokenFeeFilledAmount = uint128(LibMathV06.getPartialAmountFloor(\n results.takerTokenFilledAmount,\n params.order.takerAmount,\n params.order.takerTokenFeeAmount\n ));\n _transferERC20Tokens(\n params.order.takerToken,\n params.taker,\n params.order.feeRecipient,\n uint256(results.takerTokenFeeFilledAmount)\n );\n }\n\n emit LimitOrderFilled(\n orderInfo.orderHash,\n params.order.maker,\n params.taker,\n params.order.feeRecipient,\n address(params.order.makerToken),\n address(params.order.takerToken),\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount,\n results.takerTokenFeeFilledAmount,\n results.ethProtocolFeePaid,\n params.order.pool\n );\n }\n\n /// @dev Fill an RFQ order. Private variant. Does not refund protocol fees.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @param takerTokenFillAmount Maximum taker token to fill this order with.\n /// @param taker The order taker.\n /// @return results Results of the fill.\n function _fillRfqOrderPrivate(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature,\n uint128 takerTokenFillAmount,\n address taker\n )\n private\n returns (FillNativeOrderResults memory results)\n {\n LibNativeOrder.OrderInfo memory orderInfo = getRfqOrderInfo(order);\n\n // Must be fillable.\n if (orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n LibNativeOrdersRichErrors.OrderNotFillableError(\n orderInfo.orderHash,\n uint8(orderInfo.status)\n ).rrevert();\n }\n\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n // Must be fillable by the tx.origin.\n if (order.txOrigin != tx.origin && !stor.originRegistry[order.txOrigin][tx.origin]) {\n LibNativeOrdersRichErrors.OrderNotFillableByOriginError(\n orderInfo.orderHash,\n tx.origin,\n order.txOrigin\n ).rrevert();\n }\n }\n\n // Must be fillable by the taker.\n if (order.taker != address(0) && order.taker != taker) {\n LibNativeOrdersRichErrors.OrderNotFillableByTakerError(\n orderInfo.orderHash,\n taker,\n order.taker\n ).rrevert();\n }\n\n // Signature must be valid for the order.\n {\n address signer = LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n if (signer != order.maker) {\n LibNativeOrdersRichErrors.OrderNotSignedByMakerError(\n orderInfo.orderHash,\n signer,\n order.maker\n ).rrevert();\n }\n }\n\n // Settle between the maker and taker.\n (results.takerTokenFilledAmount, results.makerTokenFilledAmount) = _settleOrder(\n SettleOrderInfo({\n orderHash: orderInfo.orderHash,\n maker: order.maker,\n taker: taker,\n makerToken: IERC20TokenV06(order.makerToken),\n takerToken: IERC20TokenV06(order.takerToken),\n makerAmount: order.makerAmount,\n takerAmount: order.takerAmount,\n takerTokenFillAmount: takerTokenFillAmount,\n takerTokenFilledAmount: orderInfo.takerTokenFilledAmount\n })\n );\n\n emit RfqOrderFilled(\n orderInfo.orderHash,\n order.maker,\n taker,\n address(order.makerToken),\n address(order.takerToken),\n results.takerTokenFilledAmount,\n results.makerTokenFilledAmount,\n order.pool\n );\n }\n\n /// @dev Settle the trade between an order's maker and taker.\n /// @param settleInfo Information needed to execute the settlement.\n /// @return takerTokenFilledAmount How much taker token was filled.\n /// @return makerTokenFilledAmount How much maker token was filled.\n function _settleOrder(SettleOrderInfo memory settleInfo)\n private\n returns (uint128 takerTokenFilledAmount, uint128 makerTokenFilledAmount)\n {\n // Clamp the taker token fill amount to the fillable amount.\n takerTokenFilledAmount = LibSafeMathV06.min128(\n settleInfo.takerTokenFillAmount,\n settleInfo.takerAmount.safeSub128(settleInfo.takerTokenFilledAmount)\n );\n // Compute the maker token amount.\n // This should never overflow because the values are all clamped to\n // (2^128-1).\n makerTokenFilledAmount = uint128(LibMathV06.getPartialAmountFloor(\n uint256(takerTokenFilledAmount),\n uint256(settleInfo.takerAmount),\n uint256(settleInfo.makerAmount)\n ));\n\n if (takerTokenFilledAmount == 0 || makerTokenFilledAmount == 0) {\n // Nothing to do.\n return (0, 0);\n }\n\n // Update filled state for the order.\n LibNativeOrdersStorage\n .getStorage()\n .orderHashToTakerTokenFilledAmount[settleInfo.orderHash] =\n // OK to overwrite the whole word because we shouldn't get to this\n // function if the order is cancelled.\n settleInfo.takerTokenFilledAmount.safeAdd128(takerTokenFilledAmount);\n\n // Transfer taker -> maker.\n _transferERC20Tokens(\n settleInfo.takerToken,\n settleInfo.taker,\n settleInfo.maker,\n takerTokenFilledAmount\n );\n\n // Transfer maker -> taker.\n _transferERC20Tokens(\n settleInfo.makerToken,\n settleInfo.maker,\n settleInfo.taker,\n makerTokenFilledAmount\n );\n }\n}\n",
|
|
"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IERC20TokenV06.sol\";\n\n\ninterface IEtherTokenV06 is\n IERC20TokenV06\n{\n /// @dev Wrap ether.\n function deposit() external payable;\n\n /// @dev Unwrap ether.\n function withdraw(uint256 amount) external;\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./LibSafeMathV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibMathRichErrorsV06.sol\";\n\n\nlibrary LibMathV06 {\n\n using LibSafeMathV06 for uint256;\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded down.\n function safeGetPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorFloor(\n numerator,\n denominator,\n target\n )) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// Reverts if rounding error is >= 0.1%\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded up.\n function safeGetPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n if (isRoundingErrorCeil(\n numerator,\n denominator,\n target\n )) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.RoundingError(\n numerator,\n denominator,\n target\n ));\n }\n\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded down.\n function getPartialAmountFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = numerator.safeMul(target).safeDiv(denominator);\n return partialAmount;\n }\n\n /// @dev Calculates partial value given a numerator and denominator rounded down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return partialAmount Partial value of target rounded up.\n function getPartialAmountCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n // ceil(a / b) = floor((a + b - 1) / b)\n // To implement `ceil(a / b)` using safeDiv.\n partialAmount = numerator.safeMul(target)\n .safeAdd(denominator.safeSub(1))\n .safeDiv(denominator);\n\n return partialAmount;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding down.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return isError Rounding error is present.\n function isRoundingErrorFloor(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());\n }\n\n // The absolute rounding error is the difference between the rounded\n // value and the ideal value. The relative rounding error is the\n // absolute rounding error divided by the absolute value of the\n // ideal value. This is undefined when the ideal value is zero.\n //\n // The ideal value is `numerator * target / denominator`.\n // Let's call `numerator * target % denominator` the remainder.\n // The absolute error is `remainder / denominator`.\n //\n // When the ideal value is zero, we require the absolute error to\n // be zero. Fortunately, this is always the case. The ideal value is\n // zero iff `numerator == 0` and/or `target == 0`. In this case the\n // remainder and absolute error are also zero.\n if (target == 0 || numerator == 0) {\n return false;\n }\n\n // Otherwise, we want the relative rounding error to be strictly\n // less than 0.1%.\n // The relative error is `remainder / (numerator * target)`.\n // We want the relative error less than 1 / 1000:\n // remainder / (numerator * denominator) < 1 / 1000\n // or equivalently:\n // 1000 * remainder < numerator * target\n // so we have a rounding error iff:\n // 1000 * remainder >= numerator * target\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n\n /// @dev Checks if rounding error >= 0.1% when rounding up.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return isError Rounding error is present.\n function isRoundingErrorCeil(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n if (denominator == 0) {\n LibRichErrorsV06.rrevert(LibMathRichErrorsV06.DivisionByZeroError());\n }\n\n // See the comments in `isRoundingError`.\n if (target == 0 || numerator == 0) {\n // When either is zero, the ideal value and rounded value are zero\n // and there is no rounding error. (Although the relative error\n // is undefined.)\n return false;\n }\n // Compute remainder as before\n uint256 remainder = mulmod(\n target,\n numerator,\n denominator\n );\n remainder = denominator.safeSub(remainder) % denominator;\n isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n return isError;\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibMathRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibMathRichErrorsV06 {\n\n // bytes4(keccak256(\"DivisionByZeroError()\"))\n bytes internal constant DIVISION_BY_ZERO_ERROR =\n hex\"a791837c\";\n\n // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n 0x339f3de2;\n\n // solhint-disable func-name-mixedcase\n function DivisionByZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return DIVISION_BY_ZERO_ERROR;\n }\n\n function RoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ROUNDING_ERROR_SELECTOR,\n numerator,\n denominator,\n target\n );\n }\n}\n",
|
|
"../fixins/FixinCommon.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibCommonRichErrors.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\nimport \"../features/interfaces/IOwnableFeature.sol\";\nimport \"../features/interfaces/ISimpleFunctionRegistryFeature.sol\";\n\n\n/// @dev Common feature utilities.\nabstract contract FixinCommon {\n\n using LibRichErrorsV06 for bytes;\n\n /// @dev The implementation address of this feature.\n address internal immutable _implementation;\n\n /// @dev The caller must be this contract.\n modifier onlySelf() virtual {\n if (msg.sender != address(this)) {\n LibCommonRichErrors.OnlyCallableBySelfError(msg.sender).rrevert();\n }\n _;\n }\n\n /// @dev The caller of this function must be the owner.\n modifier onlyOwner() virtual {\n {\n address owner = IOwnableFeature(address(this)).owner();\n if (msg.sender != owner) {\n LibOwnableRichErrors.OnlyOwnerError(\n msg.sender,\n owner\n ).rrevert();\n }\n }\n _;\n }\n\n constructor() internal {\n // Remember this feature's original address.\n _implementation = address(this);\n }\n\n /// @dev Registers a function implemented by this feature at `_implementation`.\n /// Can and should only be called within a `migrate()`.\n /// @param selector The selector of the function whose implementation\n /// is at `_implementation`.\n function _registerFeatureFunction(bytes4 selector)\n internal\n {\n ISimpleFunctionRegistryFeature(address(this)).extend(selector, _implementation);\n }\n\n /// @dev Encode a feature version as a `uint256`.\n /// @param major The major version number of the feature.\n /// @param minor The minor version number of the feature.\n /// @param revision The revision number of the feature.\n /// @return encodedVersion The encoded version number.\n function _encodeVersion(uint32 major, uint32 minor, uint32 revision)\n internal\n pure\n returns (uint256 encodedVersion)\n {\n return (uint256(major) << 64) | (uint256(minor) << 32) | uint256(revision);\n }\n}\n",
|
|
"../errors/LibCommonRichErrors.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibCommonRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function OnlyCallableBySelfError(address sender)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"OnlyCallableBySelfError(address)\")),\n sender\n );\n }\n\n function IllegalReentrancyError(bytes4 selector, uint256 reentrancyFlags)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"IllegalReentrancyError(bytes4,uint256)\")),\n selector,\n reentrancyFlags\n );\n }\n}\n",
|
|
"./interfaces/IOwnableFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/interfaces/IOwnableV06.sol\";\n\n\n// solhint-disable no-empty-blocks\n/// @dev Owner management and migration features.\ninterface IOwnableFeature is\n IOwnableV06\n{\n /// @dev Emitted when `migrate()` is called.\n /// @param caller The caller of `migrate()`.\n /// @param migrator The migration contract.\n /// @param newOwner The address of the new owner.\n event Migrated(address caller, address migrator, address newOwner);\n\n /// @dev Execute a migration function in the context of the ZeroEx contract.\n /// The result of the function being called should be the magic bytes\n /// 0x2c64c5ef (`keccack('MIGRATE_SUCCESS')`). Only callable by the owner.\n /// The owner will be temporarily set to `address(this)` inside the call.\n /// Before returning, the owner will be set to `newOwner`.\n /// @param target The migrator contract address.\n /// @param newOwner The address of the new owner.\n /// @param data The call data.\n function migrate(address target, bytes calldata data, address newOwner) external;\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/interfaces/IOwnableV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IOwnableV06 {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner) external;\n\n /// @dev The owner of this contract.\n /// @return ownerAddress The owner address.\n function owner() external view returns (address ownerAddress);\n}\n",
|
|
"./interfaces/ISimpleFunctionRegistryFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Basic registry management features.\ninterface ISimpleFunctionRegistryFeature {\n\n /// @dev A function implementation was updated via `extend()` or `rollback()`.\n /// @param selector The function selector.\n /// @param oldImpl The implementation contract address being replaced.\n /// @param newImpl The replacement implementation contract address.\n event ProxyFunctionUpdated(bytes4 indexed selector, address oldImpl, address newImpl);\n\n /// @dev Roll back to a prior implementation of a function.\n /// @param selector The function selector.\n /// @param targetImpl The address of an older implementation of the function.\n function rollback(bytes4 selector, address targetImpl) external;\n\n /// @dev Register or replace a function.\n /// @param selector The function selector.\n /// @param impl The implementation contract for the function.\n function extend(bytes4 selector, address impl) external;\n\n /// @dev Retrieve the length of the rollback history for a function.\n /// @param selector The function selector.\n /// @return rollbackLength The number of items in the rollback history for\n /// the function.\n function getRollbackLength(bytes4 selector)\n external\n view\n returns (uint256 rollbackLength);\n\n /// @dev Retrieve an entry in the rollback history for a function.\n /// @param selector The function selector.\n /// @param idx The index in the rollback history.\n /// @return impl An implementation address for the function at\n /// index `idx`.\n function getRollbackEntryAtIndex(bytes4 selector, uint256 idx)\n external\n view\n returns (address impl);\n}\n",
|
|
"../storage/LibNativeOrdersStorage.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"./LibStorage.sol\";\n\n\n/// @dev Storage helpers for `NativeOrdersFeature`.\nlibrary LibNativeOrdersStorage {\n\n /// @dev Storage bucket for this feature.\n struct Storage {\n // How much taker token has been filled in order.\n // The lower `uint128` is the taker token fill amount.\n // The high bit will be `1` if the order was directly cancelled.\n mapping(bytes32 => uint256) orderHashToTakerTokenFilledAmount;\n // The minimum valid order salt for a given maker and order pair (maker, taker)\n // for limit orders.\n mapping(address => mapping(address => mapping(address => uint256)))\n limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt;\n // The minimum valid order salt for a given maker and order pair (maker, taker)\n // for RFQ orders.\n mapping(address => mapping(address => mapping(address => uint256)))\n rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt;\n // For a given order origin, which tx.origin addresses are allowed to\n // fill the order.\n mapping(address => mapping(address => bool)) originRegistry;\n }\n\n /// @dev Get the storage bucket for this contract.\n function getStorage() internal pure returns (Storage storage stor) {\n uint256 storageSlot = LibStorage.getStorageSlot(\n LibStorage.StorageId.NativeOrders\n );\n // Dip into assembly to change the slot pointed to by the local\n // variable `stor`.\n // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries\n assembly { stor_slot := storageSlot }\n }\n}\n",
|
|
"../storage/LibStorage.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Common storage helpers\nlibrary LibStorage {\n\n /// @dev What to bit-shift a storage ID by to get its slot.\n /// This gives us a maximum of 2**128 inline fields in each bucket.\n uint256 private constant STORAGE_SLOT_EXP = 128;\n\n /// @dev Storage IDs for feature storage buckets.\n /// WARNING: APPEND-ONLY.\n enum StorageId {\n Proxy,\n SimpleFunctionRegistry,\n Ownable,\n TokenSpender,\n TransformERC20,\n MetaTransactions,\n ReentrancyGuard,\n NativeOrders\n }\n\n /// @dev Get the storage slot given a storage ID. We assign unique, well-spaced\n /// slots to storage bucket variables to ensure they do not overlap.\n /// See: https://solidity.readthedocs.io/en/v0.6.6/assembly.html#access-to-external-variables-functions-and-libraries\n /// @param storageId An entry in `StorageId`\n /// @return slot The storage slot.\n function getStorageSlot(StorageId storageId)\n internal\n pure\n returns (uint256 slot)\n {\n // This should never overflow with a reasonable `STORAGE_SLOT_EXP`\n // because Solidity will do a range check on `storageId` during the cast.\n return (uint256(storageId) + 1) << STORAGE_SLOT_EXP;\n }\n}\n",
|
|
"../vendor/v3/IStaking.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\ninterface IStaking {\n function joinStakingPoolAsMaker(bytes32) external;\n function payProtocolFee(address, address, uint256) external payable;\n}\n",
|
|
"./native_orders/NativeOrdersCancellation.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../interfaces/INativeOrdersEvents.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\nimport \"./NativeOrdersInfo.sol\";\n\n/// @dev Feature for cancelling limit and RFQ orders.\nabstract contract NativeOrdersCancellation is\n INativeOrdersEvents,\n NativeOrdersInfo\n{\n using LibRichErrorsV06 for bytes;\n\n /// @dev Highest bit of a uint256, used to flag cancelled orders.\n uint256 private constant HIGH_BIT = 1 << 255;\n\n constructor(\n address zeroExAddress,\n bytes32 greedyTokensBloomFilter\n )\n internal\n NativeOrdersInfo(zeroExAddress, greedyTokensBloomFilter)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Cancel a single limit order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The limit order.\n function cancelLimitOrder(LibNativeOrder.LimitOrder memory order)\n public\n {\n bytes32 orderHash = getLimitOrderHash(order);\n if (msg.sender != order.maker) {\n LibNativeOrdersRichErrors.OnlyOrderMakerAllowed(\n orderHash,\n msg.sender,\n order.maker\n ).rrevert();\n }\n _cancelOrderHash(orderHash, order.maker);\n }\n\n /// @dev Cancel a single RFQ order. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param order The RFQ order.\n function cancelRfqOrder(LibNativeOrder.RfqOrder memory order)\n public\n {\n bytes32 orderHash = getRfqOrderHash(order);\n if (msg.sender != order.maker) {\n LibNativeOrdersRichErrors.OnlyOrderMakerAllowed(\n orderHash,\n msg.sender,\n order.maker\n ).rrevert();\n }\n _cancelOrderHash(orderHash, order.maker);\n }\n\n /// @dev Cancel multiple limit orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The limit orders.\n function batchCancelLimitOrders(LibNativeOrder.LimitOrder[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; ++i) {\n cancelLimitOrder(orders[i]);\n }\n }\n\n /// @dev Cancel multiple RFQ orders. The caller must be the maker.\n /// Silently succeeds if the order has already been cancelled.\n /// @param orders The RFQ orders.\n function batchCancelRfqOrders(LibNativeOrder.RfqOrder[] memory orders)\n public\n {\n for (uint256 i = 0; i < orders.length; ++i) {\n cancelRfqOrder(orders[i]);\n }\n }\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairLimitOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n public\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n uint256 oldMinValidSalt =\n stor.limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)];\n\n // New min salt must >= the old one.\n if (oldMinValidSalt > minValidSalt) {\n LibNativeOrdersRichErrors.\n CancelSaltTooLowError(minValidSalt, oldMinValidSalt)\n .rrevert();\n }\n\n stor.limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)] = minValidSalt;\n\n emit PairCancelledLimitOrders(\n msg.sender,\n address(makerToken),\n address(takerToken),\n minValidSalt\n );\n }\n\n /// @dev Cancel all limit orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairLimitOrders(\n IERC20TokenV06[] memory makerTokens,\n IERC20TokenV06[] memory takerTokens,\n uint256[] memory minValidSalts\n )\n public\n {\n require(\n makerTokens.length == takerTokens.length &&\n makerTokens.length == minValidSalts.length,\n \"NativeOrdersFeature/MISMATCHED_PAIR_ORDERS_ARRAY_LENGTHS\"\n );\n\n for (uint256 i = 0; i < makerTokens.length; ++i) {\n cancelPairLimitOrders(\n makerTokens[i],\n takerTokens[i],\n minValidSalts[i]\n );\n }\n }\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerToken The maker token.\n /// @param takerToken The taker token.\n /// @param minValidSalt The new minimum valid salt.\n function cancelPairRfqOrders(\n IERC20TokenV06 makerToken,\n IERC20TokenV06 takerToken,\n uint256 minValidSalt\n )\n public\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n uint256 oldMinValidSalt =\n stor.rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)];\n\n // New min salt must >= the old one.\n if (oldMinValidSalt > minValidSalt) {\n LibNativeOrdersRichErrors.\n CancelSaltTooLowError(minValidSalt, oldMinValidSalt)\n .rrevert();\n }\n\n stor.rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [msg.sender]\n [address(makerToken)]\n [address(takerToken)] = minValidSalt;\n\n emit PairCancelledRfqOrders(\n msg.sender,\n address(makerToken),\n address(takerToken),\n minValidSalt\n );\n }\n\n /// @dev Cancel all RFQ orders for a given maker and pair with a salt less\n /// than the value provided. The caller must be the maker. Subsequent\n /// calls to this function with the same caller and pair require the\n /// new salt to be >= the old salt.\n /// @param makerTokens The maker tokens.\n /// @param takerTokens The taker tokens.\n /// @param minValidSalts The new minimum valid salts.\n function batchCancelPairRfqOrders(\n IERC20TokenV06[] memory makerTokens,\n IERC20TokenV06[] memory takerTokens,\n uint256[] memory minValidSalts\n )\n public\n {\n require(\n makerTokens.length == takerTokens.length &&\n makerTokens.length == minValidSalts.length,\n \"NativeOrdersFeature/MISMATCHED_PAIR_ORDERS_ARRAY_LENGTHS\"\n );\n\n for (uint256 i = 0; i < makerTokens.length; ++i) {\n cancelPairRfqOrders(\n makerTokens[i],\n takerTokens[i],\n minValidSalts[i]\n );\n }\n }\n\n /// @dev Cancel a limit or RFQ order directly by its order hash.\n /// @param orderHash The order's order hash.\n /// @param maker The order's maker.\n function _cancelOrderHash(bytes32 orderHash, address maker)\n private\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n // Set the high bit on the raw taker token fill amount to indicate\n // a cancel. It's OK to cancel twice.\n stor.orderHashToTakerTokenFilledAmount[orderHash] |= HIGH_BIT;\n\n emit OrderCancelled(orderHash, maker);\n }\n}\n",
|
|
"./native_orders/NativeOrdersInfo.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibMathV06.sol\";\nimport \"../../fixins/FixinEIP712.sol\";\nimport \"../../fixins/FixinTokenSpender.sol\";\nimport \"../../storage/LibNativeOrdersStorage.sol\";\nimport \"../libs/LibSignature.sol\";\nimport \"../libs/LibNativeOrder.sol\";\n\n\n/// @dev Feature for getting info about limit and RFQ orders.\nabstract contract NativeOrdersInfo is\n FixinEIP712,\n FixinTokenSpender\n{\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n // @dev Params for `_getActualFillableTakerTokenAmount()`.\n struct GetActualFillableTakerTokenAmountParams {\n address maker;\n IERC20TokenV06 makerToken;\n uint128 orderMakerAmount;\n uint128 orderTakerAmount;\n LibNativeOrder.OrderInfo orderInfo;\n }\n\n /// @dev Highest bit of a uint256, used to flag cancelled orders.\n uint256 private constant HIGH_BIT = 1 << 255;\n\n constructor(\n address zeroExAddress,\n bytes32 greedyTokensBloomFilter\n )\n internal\n FixinEIP712(zeroExAddress)\n FixinTokenSpender(greedyTokensBloomFilter)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Get the order info for a limit order.\n /// @param order The limit order.\n /// @return orderInfo Info about the order.\n function getLimitOrderInfo(LibNativeOrder.LimitOrder memory order)\n public\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo)\n {\n // Recover maker and compute order hash.\n orderInfo.orderHash = getLimitOrderHash(order);\n uint256 minValidSalt = LibNativeOrdersStorage.getStorage()\n .limitOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [order.maker]\n [address(order.makerToken)]\n [address(order.takerToken)];\n _populateCommonOrderInfoFields(\n orderInfo,\n order.takerAmount,\n order.expiry,\n order.salt,\n minValidSalt\n );\n }\n\n /// @dev Get the order info for an RFQ order.\n /// @param order The RFQ order.\n /// @return orderInfo Info about the order.\n function getRfqOrderInfo(LibNativeOrder.RfqOrder memory order)\n public\n view\n returns (LibNativeOrder.OrderInfo memory orderInfo)\n {\n // Recover maker and compute order hash.\n orderInfo.orderHash = getRfqOrderHash(order);\n uint256 minValidSalt = LibNativeOrdersStorage.getStorage()\n .rfqOrdersMakerToMakerTokenToTakerTokenToMinValidOrderSalt\n [order.maker]\n [address(order.makerToken)]\n [address(order.takerToken)];\n _populateCommonOrderInfoFields(\n orderInfo,\n order.takerAmount,\n order.expiry,\n order.salt,\n minValidSalt\n );\n\n // Check for missing txOrigin.\n if (order.txOrigin == address(0)) {\n orderInfo.status = LibNativeOrder.OrderStatus.INVALID;\n }\n }\n\n /// @dev Get the canonical hash of a limit order.\n /// @param order The limit order.\n /// @return orderHash The order hash.\n function getLimitOrderHash(LibNativeOrder.LimitOrder memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n return _getEIP712Hash(\n LibNativeOrder.getLimitOrderStructHash(order)\n );\n }\n\n /// @dev Get the canonical hash of an RFQ order.\n /// @param order The RFQ order.\n /// @return orderHash The order hash.\n function getRfqOrderHash(LibNativeOrder.RfqOrder memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n return _getEIP712Hash(\n LibNativeOrder.getRfqOrderStructHash(order)\n );\n }\n\n /// @dev Get order info, fillable amount, and signature validity for a limit order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The limit order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getLimitOrderRelevantState(\n LibNativeOrder.LimitOrder memory order,\n LibSignature.Signature calldata signature\n )\n public\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfo = getLimitOrderInfo(order);\n actualFillableTakerTokenAmount = _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams({\n maker: order.maker,\n makerToken: order.makerToken,\n orderMakerAmount: order.makerAmount,\n orderTakerAmount: order.takerAmount,\n orderInfo: orderInfo\n })\n );\n isSignatureValid = order.maker ==\n LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n }\n\n /// @dev Get order info, fillable amount, and signature validity for an RFQ order.\n /// Fillable amount is determined using balances and allowances of the maker.\n /// @param order The RFQ order.\n /// @param signature The order signature.\n /// @return orderInfo Info about the order.\n /// @return actualFillableTakerTokenAmount How much of the order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValid Whether the signature is valid.\n function getRfqOrderRelevantState(\n LibNativeOrder.RfqOrder memory order,\n LibSignature.Signature memory signature\n )\n public\n view\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfo = getRfqOrderInfo(order);\n actualFillableTakerTokenAmount = _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams({\n maker: order.maker,\n makerToken: order.makerToken,\n orderMakerAmount: order.makerAmount,\n orderTakerAmount: order.takerAmount,\n orderInfo: orderInfo\n })\n );\n isSignatureValid = order.maker ==\n LibSignature.getSignerOfHash(orderInfo.orderHash, signature);\n }\n\n /// @dev Batch version of `getLimitOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getLimitOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The limit orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetLimitOrderRelevantStates(\n LibNativeOrder.LimitOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n )\n {\n require(\n orders.length == signatures.length,\n \"NativeOrdersFeature/MISMATCHED_ARRAY_LENGTHS\"\n );\n orderInfos = new LibNativeOrder.OrderInfo[](orders.length);\n actualFillableTakerTokenAmounts = new uint128[](orders.length);\n isSignatureValids = new bool[](orders.length);\n for (uint256 i = 0; i < orders.length; ++i) {\n try\n this.getLimitOrderRelevantState(orders[i], signatures[i])\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfos[i] = orderInfo;\n actualFillableTakerTokenAmounts[i] = actualFillableTakerTokenAmount;\n isSignatureValids[i] = isSignatureValid;\n }\n catch {}\n }\n }\n\n /// @dev Batch version of `getRfqOrderRelevantState()`, without reverting.\n /// Orders that would normally cause `getRfqOrderRelevantState()`\n /// to revert will have empty results.\n /// @param orders The RFQ orders.\n /// @param signatures The order signatures.\n /// @return orderInfos Info about the orders.\n /// @return actualFillableTakerTokenAmounts How much of each order is fillable\n /// based on maker funds, in taker tokens.\n /// @return isSignatureValids Whether each signature is valid for the order.\n function batchGetRfqOrderRelevantStates(\n LibNativeOrder.RfqOrder[] calldata orders,\n LibSignature.Signature[] calldata signatures\n )\n external\n view\n returns (\n LibNativeOrder.OrderInfo[] memory orderInfos,\n uint128[] memory actualFillableTakerTokenAmounts,\n bool[] memory isSignatureValids\n )\n {\n require(\n orders.length == signatures.length,\n \"NativeOrdersFeature/MISMATCHED_ARRAY_LENGTHS\"\n );\n orderInfos = new LibNativeOrder.OrderInfo[](orders.length);\n actualFillableTakerTokenAmounts = new uint128[](orders.length);\n isSignatureValids = new bool[](orders.length);\n for (uint256 i = 0; i < orders.length; ++i) {\n try\n this.getRfqOrderRelevantState(orders[i], signatures[i])\n returns (\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 actualFillableTakerTokenAmount,\n bool isSignatureValid\n )\n {\n orderInfos[i] = orderInfo;\n actualFillableTakerTokenAmounts[i] = actualFillableTakerTokenAmount;\n isSignatureValids[i] = isSignatureValid;\n }\n catch {}\n }\n }\n\n /// @dev Populate `status` and `takerTokenFilledAmount` fields in\n /// `orderInfo`, which use the same code path for both limit and\n /// RFQ orders.\n /// @param orderInfo `OrderInfo` with `orderHash` and `maker` filled.\n /// @param takerAmount The order's taker token amount..\n /// @param expiry The order's expiry.\n /// @param salt The order's salt.\n /// @param salt The minimum valid salt for the maker and pair combination.\n function _populateCommonOrderInfoFields(\n LibNativeOrder.OrderInfo memory orderInfo,\n uint128 takerAmount,\n uint64 expiry,\n uint256 salt,\n uint256 minValidSalt\n )\n private\n view\n {\n LibNativeOrdersStorage.Storage storage stor =\n LibNativeOrdersStorage.getStorage();\n\n // Get the filled and direct cancel state.\n {\n // The high bit of the raw taker token filled amount will be set\n // if the order was cancelled.\n uint256 rawTakerTokenFilledAmount =\n stor.orderHashToTakerTokenFilledAmount[orderInfo.orderHash];\n orderInfo.takerTokenFilledAmount = uint128(rawTakerTokenFilledAmount);\n if (orderInfo.takerTokenFilledAmount >= takerAmount) {\n orderInfo.status = LibNativeOrder.OrderStatus.FILLED;\n return;\n }\n if (rawTakerTokenFilledAmount & HIGH_BIT != 0) {\n orderInfo.status = LibNativeOrder.OrderStatus.CANCELLED;\n return;\n }\n }\n\n // Check for expiration.\n if (expiry <= uint64(block.timestamp)) {\n orderInfo.status = LibNativeOrder.OrderStatus.EXPIRED;\n return;\n }\n\n // Check if the order was cancelled by salt.\n if (minValidSalt > salt) {\n orderInfo.status = LibNativeOrder.OrderStatus.CANCELLED;\n return;\n }\n orderInfo.status = LibNativeOrder.OrderStatus.FILLABLE;\n }\n\n /// @dev Calculate the actual fillable taker token amount of an order\n /// based on maker allowance and balances.\n function _getActualFillableTakerTokenAmount(\n GetActualFillableTakerTokenAmountParams memory params\n )\n private\n view\n returns (uint128 actualFillableTakerTokenAmount)\n {\n if (params.orderMakerAmount == 0 || params.orderTakerAmount == 0) {\n // Empty order.\n return 0;\n }\n if (params.orderInfo.status != LibNativeOrder.OrderStatus.FILLABLE) {\n // Not fillable.\n return 0;\n }\n\n // Get the fillable maker amount based on the order quantities and\n // previously filled amount\n uint256 fillableMakerTokenAmount = LibMathV06.getPartialAmountFloor(\n uint256(\n params.orderTakerAmount\n - params.orderInfo.takerTokenFilledAmount\n ),\n uint256(params.orderTakerAmount),\n uint256(params.orderMakerAmount)\n );\n // Clamp it to the amount of maker tokens we can spend on behalf of the\n // maker.\n fillableMakerTokenAmount = LibSafeMathV06.min256(\n fillableMakerTokenAmount,\n _getSpendableERC20BalanceOf(params.makerToken, params.maker)\n );\n // Convert to taker token amount.\n return LibMathV06.getPartialAmountCeil(\n fillableMakerTokenAmount,\n uint256(params.orderMakerAmount),\n uint256(params.orderTakerAmount)\n ).safeDowncastToUint128();\n }\n}\n",
|
|
"../fixins/FixinEIP712.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"../errors/LibCommonRichErrors.sol\";\nimport \"../errors/LibOwnableRichErrors.sol\";\n\n\n/// @dev EIP712 helpers for features.\nabstract contract FixinEIP712 {\n\n /// @dev The domain hash separator for the entire exchange proxy.\n bytes32 public immutable EIP712_DOMAIN_SEPARATOR;\n\n constructor(address zeroExAddress) internal {\n // Compute `EIP712_DOMAIN_SEPARATOR`\n {\n uint256 chainId;\n assembly { chainId := chainid() }\n EIP712_DOMAIN_SEPARATOR = keccak256(\n abi.encode(\n keccak256(\n \"EIP712Domain(\"\n \"string name,\"\n \"string version,\"\n \"uint256 chainId,\"\n \"address verifyingContract\"\n \")\"\n ),\n keccak256(\"ZeroEx\"),\n keccak256(\"1.0.0\"),\n chainId,\n zeroExAddress\n )\n );\n }\n }\n\n function _getEIP712Hash(bytes32 structHash)\n internal\n view\n returns (bytes32 eip712Hash)\n {\n return keccak256(abi.encodePacked(\n hex\"1901\",\n EIP712_DOMAIN_SEPARATOR,\n structHash\n ));\n }\n}\n",
|
|
"../fixins/FixinTokenSpender.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../features/interfaces/ITokenSpenderFeature.sol\";\nimport \"../errors/LibSpenderRichErrors.sol\";\nimport \"../external/FeeCollector.sol\";\nimport \"../vendor/v3/IStaking.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n\n/// @dev Helpers for moving tokens around.\nabstract contract FixinTokenSpender {\n using LibRichErrorsV06 for bytes;\n\n // Mask of the lower 20 bytes of a bytes32.\n uint256 constant private ADDRESS_MASK = 0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff;\n /// @dev A bloom filter for tokens that consume all gas when `transferFrom()` fails.\n bytes32 public immutable GREEDY_TOKENS_BLOOM_FILTER;\n\n /// @param greedyTokensBloomFilter The bloom filter for all greedy tokens.\n constructor(bytes32 greedyTokensBloomFilter)\n internal\n {\n GREEDY_TOKENS_BLOOM_FILTER = greedyTokensBloomFilter;\n }\n\n /// @dev Transfers ERC20 tokens from `owner` to `to`.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @param to The recipient of the tokens.\n /// @param amount The amount of `token` to transfer.\n function _transferERC20Tokens(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount\n )\n internal\n {\n bool success;\n bytes memory revertData;\n\n require(address(token) != address(this), \"FixinTokenSpender/CANNOT_INVOKE_SELF\");\n\n // If the token eats all gas when failing, we do not want to perform\n // optimistic fall through to the old AllowanceTarget contract if the\n // direct transferFrom() fails.\n if (_isTokenPossiblyGreedy(token)) {\n // If the token does not have a direct allowance on us then we use\n // the allowance target.\n if (token.allowance(owner, address(this)) < amount) {\n _transferFromLegacyAllowanceTarget(\n token,\n owner,\n to,\n amount,\n \"\"\n );\n return;\n }\n }\n\n assembly {\n let ptr := mload(0x40) // free memory pointer\n\n // selector for transferFrom(address,address,uint256)\n mstore(ptr, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n mstore(add(ptr, 0x04), and(owner, ADDRESS_MASK))\n mstore(add(ptr, 0x24), and(to, ADDRESS_MASK))\n mstore(add(ptr, 0x44), amount)\n\n success := call(\n gas(),\n and(token, ADDRESS_MASK),\n 0,\n ptr,\n 0x64,\n 0,\n 0\n )\n\n let rdsize := returndatasize()\n\n returndatacopy(add(ptr, 0x20), 0, rdsize) // reuse memory\n\n // Check for ERC20 success. ERC20 tokens should return a boolean,\n // but some don't. We accept 0-length return data as success, or at\n // least 32 bytes that starts with a 32-byte boolean true.\n success := and(\n success, // call itself succeeded\n or(\n iszero(rdsize), // no return data, or\n and(\n iszero(lt(rdsize, 32)), // at least 32 bytes\n eq(mload(add(ptr, 0x20)), 1) // starts with uint256(1)\n )\n )\n )\n\n if iszero(success) {\n // revertData is a bytes, so length-prefixed data\n mstore(ptr, rdsize)\n revertData := ptr\n\n // update free memory pointer (ptr + 32-byte length + return data)\n mstore(0x40, add(add(ptr, 0x20), rdsize))\n }\n }\n\n if (!success) {\n _transferFromLegacyAllowanceTarget(\n token,\n owner,\n to,\n amount,\n revertData\n );\n }\n }\n\n /// @dev Gets the maximum amount of an ERC20 token `token` that can be\n /// pulled from `owner` by this address.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @return amount The amount of tokens that can be pulled.\n function _getSpendableERC20BalanceOf(\n IERC20TokenV06 token,\n address owner\n )\n internal\n view\n returns (uint256)\n {\n return LibSafeMathV06.min256(\n token.allowance(owner, address(this)),\n token.balanceOf(owner)\n );\n }\n\n /// @dev Check if a token possibly belongs to the `GREEDY_TOKENS_BLOOM_FILTER`\n /// bloom filter.\n function _isTokenPossiblyGreedy(IERC20TokenV06 token)\n internal\n view\n returns (bool isPossiblyGreedy)\n {\n // The hash is given by:\n // (1 << (keccak256(token) % 256)) | (1 << (token % 256))\n bytes32 h;\n assembly {\n mstore(0, token)\n h := or(shl(mod(keccak256(0, 32), 256), 1), shl(mod(token, 256), 1))\n }\n return (h & GREEDY_TOKENS_BLOOM_FILTER) == h;\n }\n\n /// @dev Transfer tokens using the legacy allowance target instead of\n /// allowances directly set on the exchange proxy.\n function _transferFromLegacyAllowanceTarget(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount,\n bytes memory initialRevertData\n )\n private\n {\n // Try the old AllowanceTarget.\n try ITokenSpenderFeature(address(this))._spendERC20Tokens(\n token,\n owner,\n to,\n amount\n ) {\n } catch (bytes memory revertData) {\n // Bubble up the first error message. (In general, the fallback to the\n // allowance target is opportunistic. We ignore the specific error\n // message if it fails.)\n LibSpenderRichErrors.SpenderERC20TransferFromFailedError(\n address(token),\n owner,\n to,\n amount,\n initialRevertData.length != 0 ? initialRevertData : revertData\n ).rrevert();\n }\n }\n}\n",
|
|
"./interfaces/ITokenSpenderFeature.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IERC20TokenV06.sol\";\n\n\n/// @dev Feature that allows spending token allowances.\ninterface ITokenSpenderFeature {\n\n /// @dev Transfers ERC20 tokens from `owner` to `to`.\n /// Only callable from within.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @param to The recipient of the tokens.\n /// @param amount The amount of `token` to transfer.\n function _spendERC20Tokens(\n IERC20TokenV06 token,\n address owner,\n address to,\n uint256 amount\n )\n external;\n\n /// @dev Gets the maximum amount of an ERC20 token `token` that can be\n /// pulled from `owner`.\n /// @param token The token to spend.\n /// @param owner The owner of the tokens.\n /// @return amount The amount of tokens that can be pulled.\n function getSpendableERC20BalanceOf(IERC20TokenV06 token, address owner)\n external\n view\n returns (uint256 amount);\n\n /// @dev Get the address of the allowance target.\n /// @return target The target of token allowances.\n function getAllowanceTarget() external view returns (address target);\n}\n",
|
|
"../errors/LibSpenderRichErrors.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibSpenderRichErrors {\n\n // solhint-disable func-name-mixedcase\n\n function SpenderERC20TransferFromFailedError(\n address token,\n address owner,\n address to,\n uint256 amount,\n bytes memory errorData\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"SpenderERC20TransferFromFailedError(address,address,address,uint256,bytes)\")),\n token,\n owner,\n to,\n amount,\n errorData\n );\n }\n}\n",
|
|
"../external/FeeCollector.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n/// @dev The collector contract for protocol fees\ncontract FeeCollector is AuthorizableV06 {\n /// @dev Allow ether transfers to the collector.\n receive() external payable { }\n\n constructor() public {\n _addAuthorizedAddress(msg.sender);\n }\n\n /// @dev Approve the staking contract and join a pool. Only an authority\n /// can call this.\n /// @param weth The WETH contract.\n /// @param staking The staking contract.\n /// @param poolId The pool ID this contract is collecting fees for.\n function initialize(\n IEtherTokenV06 weth,\n IStaking staking,\n bytes32 poolId\n )\n external\n onlyAuthorized\n {\n weth.approve(address(staking), type(uint256).max);\n staking.joinStakingPoolAsMaker(poolId);\n }\n\n /// @dev Convert all held ether to WETH. Only an authority can call this.\n /// @param weth The WETH contract.\n function convertToWeth(\n IEtherTokenV06 weth\n )\n external\n onlyAuthorized\n {\n if (address(this).balance > 0) {\n weth.deposit{value: address(this).balance}();\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/AuthorizableV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./interfaces/IAuthorizableV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibAuthorizableRichErrorsV06.sol\";\nimport \"./OwnableV06.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract AuthorizableV06 is\n OwnableV06,\n IAuthorizableV06\n{\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n _assertSenderIsAuthorized();\n _;\n }\n\n // @dev Whether an address is authorized to call privileged functions.\n // @param 0 Address to query.\n // @return 0 Whether the address is authorized.\n mapping (address => bool) public override authorized;\n // @dev Whether an address is authorized to call privileged functions.\n // @param 0 Index of authorized address.\n // @return 0 Authorized address.\n address[] public override authorities;\n\n /// @dev Initializes the `owner` address.\n constructor()\n public\n OwnableV06()\n {}\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n override\n onlyOwner\n {\n _addAuthorizedAddress(target);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n override\n onlyOwner\n {\n if (!authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));\n }\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n _removeAuthorizedAddressAtIndex(target, i);\n break;\n }\n }\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n override\n onlyOwner\n {\n _removeAuthorizedAddressAtIndex(target, index);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n override\n view\n returns (address[] memory)\n {\n return authorities;\n }\n\n /// @dev Reverts if msg.sender is not authorized.\n function _assertSenderIsAuthorized()\n internal\n view\n {\n if (!authorized[msg.sender]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.SenderNotAuthorizedError(msg.sender));\n }\n }\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function _addAuthorizedAddress(address target)\n internal\n {\n // Ensure that the target is not the zero address.\n if (target == address(0)) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.ZeroCantBeAuthorizedError());\n }\n\n // Ensure that the target is not already authorized.\n if (authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetAlreadyAuthorizedError(target));\n }\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function _removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n internal\n {\n if (!authorized[target]) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.TargetNotAuthorizedError(target));\n }\n if (index >= authorities.length) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.IndexOutOfBoundsError(\n index,\n authorities.length\n ));\n }\n if (authorities[index] != target) {\n LibRichErrorsV06.rrevert(LibAuthorizableRichErrorsV06.AuthorizedAddressMismatchError(\n authorities[index],\n target\n ));\n }\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.pop();\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/interfaces/IAuthorizableV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./IOwnableV06.sol\";\n\n\ninterface IAuthorizableV06 is\n IOwnableV06\n{\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n\n /// @dev Gets all authorized addresses.\n /// @return authorizedAddresses Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory authorizedAddresses);\n\n /// @dev Whether an adderss is authorized to call privileged functions.\n /// @param addr Address to query.\n /// @return isAuthorized Whether the address is authorized.\n function authorized(address addr) external view returns (bool isAuthorized);\n\n /// @dev All addresseses authorized to call privileged functions.\n /// @param idx Index of authorized address.\n /// @return addr Authorized address.\n function authorities(uint256 idx) external view returns (address addr);\n\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/IOwnableV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\ninterface IOwnableV06 {\n\n /// @dev Emitted by Ownable when ownership is transferred.\n /// @param previousOwner The previous owner of the contract.\n /// @param newOwner The new owner of the contract.\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /// @dev Transfers ownership of the contract to a new address.\n /// @param newOwner The address that will become the owner.\n function transferOwnership(address newOwner) external;\n\n /// @dev The owner of this contract.\n /// @return ownerAddress The owner address.\n function owner() external view returns (address ownerAddress);\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibAuthorizableRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\n\nlibrary LibAuthorizableRichErrorsV06 {\n\n // bytes4(keccak256(\"AuthorizedAddressMismatchError(address,address)\"))\n bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR =\n 0x140a84db;\n\n // bytes4(keccak256(\"IndexOutOfBoundsError(uint256,uint256)\"))\n bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR =\n 0xe9f83771;\n\n // bytes4(keccak256(\"SenderNotAuthorizedError(address)\"))\n bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xb65a25b9;\n\n // bytes4(keccak256(\"TargetAlreadyAuthorizedError(address)\"))\n bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR =\n 0xde16f1a0;\n\n // bytes4(keccak256(\"TargetNotAuthorizedError(address)\"))\n bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR =\n 0xeb5108a2;\n\n // bytes4(keccak256(\"ZeroCantBeAuthorizedError()\"))\n bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES =\n hex\"57654fe4\";\n\n // solhint-disable func-name-mixedcase\n function AuthorizedAddressMismatchError(\n address authorized,\n address target\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR,\n authorized,\n target\n );\n }\n\n function IndexOutOfBoundsError(\n uint256 index,\n uint256 length\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR,\n index,\n length\n );\n }\n\n function SenderNotAuthorizedError(address sender)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n SENDER_NOT_AUTHORIZED_ERROR_SELECTOR,\n sender\n );\n }\n\n function TargetAlreadyAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function TargetNotAuthorizedError(address target)\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n TARGET_NOT_AUTHORIZED_ERROR_SELECTOR,\n target\n );\n }\n\n function ZeroCantBeAuthorizedError()\n internal\n pure\n returns (bytes memory)\n {\n return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/OwnableV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2019 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\n\nimport \"./interfaces/IOwnableV06.sol\";\nimport \"./errors/LibRichErrorsV06.sol\";\nimport \"./errors/LibOwnableRichErrorsV06.sol\";\n\n\ncontract OwnableV06 is\n IOwnableV06\n{\n /// @dev The owner of this contract.\n /// @return 0 The owner address.\n address public override owner;\n\n constructor() public {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n _assertSenderIsOwner();\n _;\n }\n\n /// @dev Change the owner of this contract.\n /// @param newOwner New owner address.\n function transferOwnership(address newOwner)\n public\n override\n onlyOwner\n {\n if (newOwner == address(0)) {\n LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.TransferOwnerToZeroError());\n } else {\n owner = newOwner;\n emit OwnershipTransferred(msg.sender, newOwner);\n }\n }\n\n function _assertSenderIsOwner()\n internal\n view\n {\n if (msg.sender != owner) {\n LibRichErrorsV06.rrevert(LibOwnableRichErrorsV06.OnlyOwnerError(\n msg.sender,\n owner\n ));\n }\n }\n}\n",
|
|
"@0x/contracts-utils/contracts/src/v06/errors/LibOwnableRichErrorsV06.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity ^0.6.5;\n\n\nlibrary LibOwnableRichErrorsV06 {\n\n // bytes4(keccak256(\"OnlyOwnerError(address,address)\"))\n bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR =\n 0x1de45ad1;\n\n // bytes4(keccak256(\"TransferOwnerToZeroError()\"))\n bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES =\n hex\"e69edc3e\";\n\n // solhint-disable func-name-mixedcase\n function OnlyOwnerError(\n address sender,\n address owner\n )\n internal\n pure\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n ONLY_OWNER_ERROR_SELECTOR,\n sender,\n owner\n );\n }\n\n function TransferOwnerToZeroError()\n internal\n pure\n returns (bytes memory)\n {\n return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;\n }\n}\n",
|
|
"./native_orders/NativeOrdersProtocolFees.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2021 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol\";\nimport \"@0x/contracts-utils/contracts/src/v06/LibSafeMathV06.sol\";\nimport \"../../fixins/FixinProtocolFees.sol\";\nimport \"../../errors/LibNativeOrdersRichErrors.sol\";\nimport \"../../vendor/v3/IStaking.sol\";\n\n\n/// @dev Mixin for protocol fee utility functions.\nabstract contract NativeOrdersProtocolFees is\n FixinProtocolFees\n{\n using LibSafeMathV06 for uint256;\n using LibRichErrorsV06 for bytes;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier\n )\n internal\n FixinProtocolFees(weth, staking, feeCollectorController, protocolFeeMultiplier)\n {\n // solhint-disable no-empty-blocks\n }\n\n /// @dev Transfers protocol fees from the `FeeCollector` pools into\n /// the staking contract.\n /// @param poolIds Staking pool IDs\n function transferProtocolFeesForPools(bytes32[] calldata poolIds)\n external\n {\n for (uint256 i = 0; i < poolIds.length; ++i) {\n _transferFeesForPool(poolIds[i]);\n }\n }\n\n /// @dev Get the protocol fee multiplier. This should be multiplied by the\n /// gas price to arrive at the required protocol fee to fill a native order.\n /// @return multiplier The protocol fee multiplier.\n function getProtocolFeeMultiplier()\n external\n view\n returns (uint32 multiplier)\n {\n return PROTOCOL_FEE_MULTIPLIER;\n }\n}\n",
|
|
"../fixins/FixinProtocolFees.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../external/FeeCollector.sol\";\nimport \"../external/FeeCollectorController.sol\";\nimport \"../external/LibFeeCollector.sol\";\nimport \"../vendor/v3/IStaking.sol\";\n\n\n/// @dev Helpers for collecting protocol fees.\nabstract contract FixinProtocolFees {\n\n /// @dev The protocol fee multiplier.\n uint32 public immutable PROTOCOL_FEE_MULTIPLIER;\n /// @dev The `FeeCollectorController` contract.\n FeeCollectorController private immutable FEE_COLLECTOR_CONTROLLER;\n /// @dev Hash of the fee collector init code.\n bytes32 private immutable FEE_COLLECTOR_INIT_CODE_HASH;\n /// @dev The WETH token contract.\n IEtherTokenV06 private immutable WETH;\n /// @dev The staking contract.\n IStaking private immutable STAKING;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking,\n FeeCollectorController feeCollectorController,\n uint32 protocolFeeMultiplier\n )\n internal\n {\n FEE_COLLECTOR_CONTROLLER = feeCollectorController;\n FEE_COLLECTOR_INIT_CODE_HASH =\n feeCollectorController.FEE_COLLECTOR_INIT_CODE_HASH();\n WETH = weth;\n STAKING = staking;\n PROTOCOL_FEE_MULTIPLIER = protocolFeeMultiplier;\n }\n\n /// @dev Collect the specified protocol fee in ETH.\n /// The fee is stored in a per-pool fee collector contract.\n /// @param poolId The pool ID for which a fee is being collected.\n /// @return ethProtocolFeePaid How much protocol fee was collected in ETH.\n function _collectProtocolFee(bytes32 poolId)\n internal\n returns (uint256 ethProtocolFeePaid)\n {\n uint256 protocolFeePaid = _getSingleProtocolFee();\n if (protocolFeePaid == 0) {\n // Nothing to do.\n return 0;\n }\n FeeCollector feeCollector = _getFeeCollector(poolId);\n (bool success,) = address(feeCollector).call{value: protocolFeePaid}(\"\");\n require(success, \"FixinProtocolFees/ETHER_TRANSFER_FALIED\");\n return protocolFeePaid;\n }\n\n /// @dev Transfer fees for a given pool to the staking contract.\n /// @param poolId Identifies the pool whose fees are being paid.\n function _transferFeesForPool(bytes32 poolId)\n internal\n {\n // This will create a FeeCollector contract (if necessary) and wrap\n // fees for the pool ID.\n FeeCollector feeCollector =\n FEE_COLLECTOR_CONTROLLER.prepareFeeCollectorToPayFees(poolId);\n // All fees in the fee collector should be in WETH now.\n uint256 bal = WETH.balanceOf(address(feeCollector));\n if (bal > 1) {\n // Leave 1 wei behind to avoid high SSTORE cost of zero-->non-zero.\n STAKING.payProtocolFee(\n address(feeCollector),\n address(feeCollector),\n bal - 1);\n }\n }\n\n /// @dev Compute the CREATE2 address for a fee collector.\n /// @param poolId The fee collector's pool ID.\n function _getFeeCollector(bytes32 poolId)\n internal\n view\n returns (FeeCollector)\n {\n return FeeCollector(LibFeeCollector.getFeeCollectorAddress(\n address(FEE_COLLECTOR_CONTROLLER),\n FEE_COLLECTOR_INIT_CODE_HASH,\n poolId\n ));\n }\n\n /// @dev Get the cost of a single protocol fee.\n /// @return protocolFeeAmount The protocol fee amount, in ETH/WETH.\n function _getSingleProtocolFee()\n internal\n view\n returns (uint256 protocolFeeAmount)\n {\n return uint256(PROTOCOL_FEE_MULTIPLIER) * tx.gasprice;\n }\n}\n",
|
|
"../external/FeeCollectorController.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol\";\nimport \"../vendor/v3/IStaking.sol\";\nimport \"./FeeCollector.sol\";\nimport \"./LibFeeCollector.sol\";\n\n\n/// @dev A contract that manages `FeeCollector` contracts.\ncontract FeeCollectorController {\n\n /// @dev Hash of the fee collector init code.\n bytes32 public immutable FEE_COLLECTOR_INIT_CODE_HASH;\n /// @dev The WETH contract.\n IEtherTokenV06 private immutable WETH;\n /// @dev The staking contract.\n IStaking private immutable STAKING;\n\n constructor(\n IEtherTokenV06 weth,\n IStaking staking\n )\n public\n {\n FEE_COLLECTOR_INIT_CODE_HASH = keccak256(type(FeeCollector).creationCode);\n WETH = weth;\n STAKING = staking;\n }\n\n /// @dev Deploy (if needed) a `FeeCollector` contract for `poolId`\n /// and wrap its ETH into WETH. Anyone may call this.\n /// @param poolId The pool ID associated with the staking pool.\n /// @return feeCollector The `FeeCollector` contract instance.\n function prepareFeeCollectorToPayFees(bytes32 poolId)\n external\n returns (FeeCollector feeCollector)\n {\n feeCollector = getFeeCollector(poolId);\n uint256 codeSize;\n assembly {\n codeSize := extcodesize(feeCollector)\n }\n\n if (codeSize == 0) {\n // Create and initialize the contract if necessary.\n new FeeCollector{salt: bytes32(poolId)}();\n feeCollector.initialize(WETH, STAKING, poolId);\n }\n\n if (address(feeCollector).balance > 1) {\n feeCollector.convertToWeth(WETH);\n }\n\n return feeCollector;\n }\n\n /// @dev Get the `FeeCollector` contract for a given pool ID. The contract\n /// will not actually exist until `prepareFeeCollectorToPayFees()`\n /// has been called once.\n /// @param poolId The pool ID associated with the staking pool.\n /// @return feeCollector The `FeeCollector` contract instance.\n function getFeeCollector(bytes32 poolId)\n public\n view\n returns (FeeCollector feeCollector)\n {\n return FeeCollector(LibFeeCollector.getFeeCollectorAddress(\n address(this),\n FEE_COLLECTOR_INIT_CODE_HASH,\n poolId\n ));\n }\n}\n",
|
|
"../external/LibFeeCollector.sol": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n Copyright 2020 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.6.5;\npragma experimental ABIEncoderV2;\n\n\n/// @dev Helpers for computing `FeeCollector` contract addresses.\nlibrary LibFeeCollector {\n\n /// @dev Compute the CREATE2 address for a fee collector.\n /// @param controller The address of the `FeeCollectorController` contract.\n /// @param initCodeHash The init code hash of the `FeeCollector` contract.\n /// @param poolId The fee collector's pool ID.\n function getFeeCollectorAddress(address controller, bytes32 initCodeHash, bytes32 poolId)\n internal\n pure\n returns (address payable feeCollectorAddress)\n {\n // Compute the CREATE2 address for the fee collector.\n return address(uint256(keccak256(abi.encodePacked(\n byte(0xff),\n controller,\n poolId, // pool ID is salt\n initCodeHash\n ))));\n }\n}\n"
|
|
},
|
|
"compiler": {
|
|
"name": "solc",
|
|
"version": "0.6.12+commit.27d51765",
|
|
"settings": {
|
|
"remappings": [
|
|
"@0x/contracts-utils=/Users/michaelzhu/protocol/node_modules/@0x/contracts-utils",
|
|
"@0x/contracts-erc20=/Users/michaelzhu/protocol/contracts/zero-ex/node_modules/@0x/contracts-erc20"
|
|
],
|
|
"optimizer": {
|
|
"enabled": true,
|
|
"runs": 1000000,
|
|
"details": {
|
|
"yul": true,
|
|
"deduplicate": true,
|
|
"cse": true,
|
|
"constantOptimizer": true
|
|
}
|
|
},
|
|
"outputSelection": {
|
|
"*": {
|
|
"*": [
|
|
"abi",
|
|
"devdoc",
|
|
"evm.bytecode.object",
|
|
"evm.bytecode.sourceMap",
|
|
"evm.deployedBytecode.object",
|
|
"evm.deployedBytecode.sourceMap",
|
|
"evm.methodIdentifiers"
|
|
]
|
|
}
|
|
},
|
|
"evmVersion": "istanbul"
|
|
}
|
|
},
|
|
"chains": {}
|
|
}
|