{
  "address": "0x227a52AF9D0bc5c37Bb6B3915D2201aAB188a893",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "conduitController",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "shadowToken",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "BadContractSignature",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BadFraction",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "BadReturnValueFromERC20OnTransfer",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        }
      ],
      "name": "BadSignatureV",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "orderIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "considerationIndex",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "shortfallAmount",
          "type": "uint256"
        }
      ],
      "name": "ConsiderationNotMet",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "identifiers",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "ERC1155BatchTransferGenericFailure",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "EtherTransferGenericFailure",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientEtherSupplied",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Invalid1155BatchTransferEncoding",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidBasicOrderParameterEncoding",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "conduit",
          "type": "address"
        }
      ],
      "name": "InvalidCallToConduit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidCanceller",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "conduitKey",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "conduit",
          "type": "address"
        }
      ],
      "name": "InvalidConduit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidERC721TransferAmount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "InvalidMsgValue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidNativeOfferItem",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidOrderParameters",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSignature",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSigner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTime",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MissingItemAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MissingOriginalConsiderationItems",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "NoContract",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoReentrantCalls",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoSpecifiedOrdersAvailable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderAlreadyFilled",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderAlreadyFinalized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderAlreadyStarted",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderInvalidRepayParameters",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderIsCancelled",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderNotExpired",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderNotStarted",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderNotValidated",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "OrderPartiallyFilled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PartialFillsNotEnabledForOrder",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "identifier",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "TokenTransferGenericFailure",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnusedItemParameters",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newCounter",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        }
      ],
      "name": "CounterIncremented",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        }
      ],
      "name": "OrderBroken",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        }
      ],
      "name": "OrderCancelled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "shadowId",
          "type": "uint256"
        }
      ],
      "name": "OrderFulfilled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "payTimes",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "finalized",
          "type": "bool"
        }
      ],
      "name": "OrderRepaid",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        }
      ],
      "name": "OrderValidated",
      "type": "event"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "offerer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "identifier",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "currency",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "artist",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "platform",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "endTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "duration",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "periods",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ratio",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "royalty",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "withdrawFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "salt",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "conduitKey",
              "type": "bytes32"
            }
          ],
          "internalType": "struct OrderParameters",
          "name": "parameters",
          "type": "tuple"
        }
      ],
      "name": "breakOrder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "broken",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "offerer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "identifier",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "currency",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "artist",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "platform",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "endTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "duration",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "periods",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ratio",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "royalty",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "withdrawFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "salt",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "conduitKey",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "counter",
              "type": "uint256"
            }
          ],
          "internalType": "struct OrderComponents[]",
          "name": "orders",
          "type": "tuple[]"
        }
      ],
      "name": "cancel",
      "outputs": [
        {
          "internalType": "bool",
          "name": "cancelled",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "offerer",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "identifier",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "currency",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "artist",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "platform",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "startTime",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "endTime",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "duration",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "periods",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "ratio",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "royalty",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "fee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "withdrawFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "salt",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes32",
                  "name": "conduitKey",
                  "type": "bytes32"
                }
              ],
              "internalType": "struct OrderParameters",
              "name": "parameters",
              "type": "tuple"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            }
          ],
          "internalType": "struct Order",
          "name": "order",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "fulfillerConduitKey",
          "type": "bytes32"
        }
      ],
      "name": "fulfillOrder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "fulfilled",
          "type": "bool"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "offerer",
          "type": "address"
        }
      ],
      "name": "getCounter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "counter",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "offerer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "identifier",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "currency",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "artist",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "platform",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "endTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "duration",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "periods",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ratio",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "royalty",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "withdrawFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "salt",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "conduitKey",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "counter",
              "type": "uint256"
            }
          ],
          "internalType": "struct OrderComponents",
          "name": "order",
          "type": "tuple"
        }
      ],
      "name": "getOrderHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "orderHash",
          "type": "bytes32"
        }
      ],
      "name": "getOrderStatus",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isValidated",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "isCancelled",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "isFinalized",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "isBroken",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "fulfiller",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "startedAt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "shadowId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "paidTimes",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "incrementCounter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "newCounter",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "information",
      "outputs": [
        {
          "internalType": "string",
          "name": "version",
          "type": "string"
        },
        {
          "internalType": "bytes32",
          "name": "domainSeparator",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "conduitController",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "offerer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "identifier",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "currency",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "artist",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "platform",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "startTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "endTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "duration",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "periods",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "ratio",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "royalty",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "withdrawFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "salt",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "conduitKey",
              "type": "bytes32"
            }
          ],
          "internalType": "struct OrderParameters",
          "name": "parameters",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "fulfillerConduitKey",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "payTimes",
          "type": "uint256"
        }
      ],
      "name": "repayOrder",
      "outputs": [
        {
          "internalType": "bool",
          "name": "repaid",
          "type": "bool"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "shadowToken",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "offerer",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "identifier",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "currency",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "artist",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "platform",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "startTime",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "endTime",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "duration",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "periods",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "ratio",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "royalty",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "fee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "withdrawFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "salt",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes32",
                  "name": "conduitKey",
                  "type": "bytes32"
                }
              ],
              "internalType": "struct OrderParameters",
              "name": "parameters",
              "type": "tuple"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            }
          ],
          "internalType": "struct Order[]",
          "name": "orders",
          "type": "tuple[]"
        }
      ],
      "name": "validate",
      "outputs": [
        {
          "internalType": "bool",
          "name": "validated",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x7192887f13424ce0ff56ec56d947762554a8ae0d4c363f40c8ae7e7a447f3bdd",
  "receipt": {
    "to": null,
    "from": "0xf90E1475dbA948Fec94Be2b83661d8381C900d91",
    "contractAddress": "0x227a52AF9D0bc5c37Bb6B3915D2201aAB188a893",
    "transactionIndex": 0,
    "gasUsed": "2863527",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x2a7765ac1fdc86c89289eded00068d2fe281ca1233ba1ff9a0958e4d8960099d",
    "transactionHash": "0x7192887f13424ce0ff56ec56d947762554a8ae0d4c363f40c8ae7e7a447f3bdd",
    "logs": [],
    "blockNumber": 6,
    "cumulativeGasUsed": "2863527",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x2E363baC1401ca138E0992f9b24f3ba8CE72A024",
    "0x42267923A3ae2282365Eae67d3244B9EeAb0a2f2"
  ],
  "numDeployments": 1,
  "solcInputHash": "302b5978d8e83675d9e89513cc8bfe9e",
  "metadata": "{\"compiler\":{\"version\":\"0.8.14+commit.80d49f37\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"conduitController\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"shadowToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadContractSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadFraction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BadReturnValueFromERC20OnTransfer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"}],\"name\":\"BadSignatureV\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"orderIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"considerationIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shortfallAmount\",\"type\":\"uint256\"}],\"name\":\"ConsiderationNotMet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"identifiers\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"ERC1155BatchTransferGenericFailure\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"EtherTransferGenericFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientEtherSupplied\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Invalid1155BatchTransferEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBasicOrderParameterEncoding\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"conduit\",\"type\":\"address\"}],\"name\":\"InvalidCallToConduit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCanceller\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"conduit\",\"type\":\"address\"}],\"name\":\"InvalidConduit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidERC721TransferAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeOfferItem\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOrderParameters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MissingItemAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MissingOriginalConsiderationItems\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"NoContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoReentrantCalls\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoSpecifiedOrdersAvailable\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderAlreadyFilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderAlreadyFinalized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderAlreadyStarted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderInvalidRepayParameters\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderIsCancelled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderNotExpired\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderNotStarted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderNotValidated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"OrderPartiallyFilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PartialFillsNotEnabledForOrder\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokenTransferGenericFailure\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnusedItemParameters\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newCounter\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"}],\"name\":\"CounterIncremented\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"}],\"name\":\"OrderBroken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"}],\"name\":\"OrderCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shadowId\",\"type\":\"uint256\"}],\"name\":\"OrderFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payTimes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"finalized\",\"type\":\"bool\"}],\"name\":\"OrderRepaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"}],\"name\":\"OrderValidated\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"}],\"internalType\":\"struct OrderParameters\",\"name\":\"parameters\",\"type\":\"tuple\"}],\"name\":\"breakOrder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"broken\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"counter\",\"type\":\"uint256\"}],\"internalType\":\"struct OrderComponents[]\",\"name\":\"orders\",\"type\":\"tuple[]\"}],\"name\":\"cancel\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"cancelled\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"}],\"internalType\":\"struct OrderParameters\",\"name\":\"parameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct Order\",\"name\":\"order\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"fulfillerConduitKey\",\"type\":\"bytes32\"}],\"name\":\"fulfillOrder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"fulfilled\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"}],\"name\":\"getCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"counter\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"counter\",\"type\":\"uint256\"}],\"internalType\":\"struct OrderComponents\",\"name\":\"order\",\"type\":\"tuple\"}],\"name\":\"getOrderHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"orderHash\",\"type\":\"bytes32\"}],\"name\":\"getOrderStatus\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isValidated\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isCancelled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isFinalized\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isBroken\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"fulfiller\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shadowId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"paidTimes\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"incrementCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"newCounter\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"information\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"conduitController\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"}],\"internalType\":\"struct OrderParameters\",\"name\":\"parameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"fulfillerConduitKey\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"payTimes\",\"type\":\"uint256\"}],\"name\":\"repayOrder\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"repaid\",\"type\":\"bool\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"shadowToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"offerer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"identifier\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"currency\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"artist\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"platform\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"duration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"periods\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ratio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"royalty\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salt\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"conduitKey\",\"type\":\"bytes32\"}],\"internalType\":\"struct OrderParameters\",\"name\":\"parameters\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"struct Order[]\",\"name\":\"orders\",\"type\":\"tuple[]\"}],\"name\":\"validate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"validated\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"BadContractSignature()\":[{\"details\":\"Revert with an error when an EIP-1271 call to an account fails.\"}],\"BadFraction()\":[{\"details\":\"Revert with an error when supplying a fraction with a value of zero      for the numerator or denominator, or one where the numerator exceeds      the denominator.\"}],\"BadReturnValueFromERC20OnTransfer(address,address,address,uint256)\":[{\"details\":\"Revert with an error when an ERC20 token transfer returns a falsey      value.\",\"params\":{\"amount\":\"The amount for the attempted ERC20 transfer.\",\"from\":\"The source of the attempted ERC20 transfer.\",\"to\":\"The recipient of the attempted ERC20 transfer.\",\"token\":\"The token for which the ERC20 transfer was attempted.\"}}],\"BadSignatureV(uint8)\":[{\"details\":\"Revert with an error when a signature that does not contain a v      value of 27 or 28 has been supplied.\",\"params\":{\"v\":\"The invalid v value.\"}}],\"ConsiderationNotMet(uint256,uint256,uint256)\":[{\"details\":\"Revert with an error if a consideration amount has not been fully      zeroed out after applying all fulfillments.\",\"params\":{\"considerationIndex\":\"The index of the consideration item on the                           order.\",\"orderIndex\":\"The index of the order with the consideration                           item with a shortfall.\",\"shortfallAmount\":\"The unfulfilled consideration amount.\"}}],\"ERC1155BatchTransferGenericFailure(address,address,address,uint256[],uint256[])\":[{\"details\":\"Revert with an error when a batch ERC1155 token transfer reverts.\",\"params\":{\"amounts\":\"The amounts for the attempted transfer.\",\"from\":\"The source of the attempted transfer.\",\"identifiers\":\"The identifiers for the attempted transfer.\",\"to\":\"The recipient of the attempted transfer.\",\"token\":\"The token for which the transfer was attempted.\"}}],\"EtherTransferGenericFailure(address,uint256)\":[{\"details\":\"Revert with an error when an ether transfer reverts.\"}],\"InsufficientEtherSupplied()\":[{\"details\":\"Revert with an error when insufficient ether is supplied as part of      msg.value when fulfilling orders.\"}],\"Invalid1155BatchTransferEncoding()\":[{\"details\":\"Revert with an error when attempting to execute an 1155 batch      transfer using calldata not produced by default ABI encoding or with      different lengths for ids and amounts arrays.\"}],\"InvalidBasicOrderParameterEncoding()\":[{\"details\":\"Revert with an error when attempting to fill a basic order using      calldata not produced by default ABI encoding.\"}],\"InvalidCallToConduit(address)\":[{\"details\":\"Revert with an error when a call to a conduit fails with revert data      that is too expensive to return.\"}],\"InvalidCanceller()\":[{\"details\":\"Revert with an error when attempting to cancel an order as a caller      other than the indicated offerer or zone.\"}],\"InvalidConduit(bytes32,address)\":[{\"details\":\"Revert with an error when attempting to fill an order referencing an      invalid conduit (i.e. one that has not been deployed).\"}],\"InvalidERC721TransferAmount()\":[{\"details\":\"Revert with an error when an ERC721 transfer with amount other than      one is attempted.\"}],\"InvalidMsgValue(uint256)\":[{\"details\":\"Revert with an error when a caller attempts to supply callvalue to a      non-payable basic order route or does not supply any callvalue to a      payable basic order route.\"}],\"InvalidNativeOfferItem()\":[{\"details\":\"Revert with an error when attempting to fulfill an order with an      offer for ETH outside of matching orders.\"}],\"InvalidSignature()\":[{\"details\":\"Revert with an error when a signer cannot be recovered from the      supplied signature.\"}],\"InvalidSigner()\":[{\"details\":\"Revert with an error when the signer recovered by the supplied      signature does not match the offerer or an allowed EIP-1271 signer      as specified by the offerer in the event they are a contract.\"}],\"InvalidTime()\":[{\"details\":\"Revert with an error when attempting to fill an order outside the      specified start time and end time.\"}],\"MissingItemAmount()\":[{\"details\":\"Revert with an error when attempting to fulfill an order where an      item has an amount of zero.\"}],\"MissingOriginalConsiderationItems()\":[{\"details\":\"Revert with an error when an order is supplied for fulfillment with      a consideration array that is shorter than the original array.\"}],\"NoContract(address)\":[{\"details\":\"Revert with an error when an account being called as an assumed      contract does not have code and returns no data.\",\"params\":{\"account\":\"The account that should contain code.\"}}],\"NoReentrantCalls()\":[{\"details\":\"Revert with an error when a caller attempts to reenter a protected      function.\"}],\"NoSpecifiedOrdersAvailable()\":[{\"details\":\"Revert with an error when attempting to fulfill any number of      available orders when none are fulfillable.\"}],\"OrderAlreadyFilled(bytes32)\":[{\"details\":\"Revert with an error when attempting to fill an order that has      already been fully filled.\",\"params\":{\"orderHash\":\"The order hash on which a fill was attempted.\"}}],\"OrderIsCancelled(bytes32)\":[{\"details\":\"Revert with an error when attempting to fill an order that has been      cancelled.\",\"params\":{\"orderHash\":\"The hash of the cancelled order.\"}}],\"OrderPartiallyFilled(bytes32)\":[{\"details\":\"Revert with an error when attempting to fill a basic order that has      been partially filled.\",\"params\":{\"orderHash\":\"The hash of the partially used order.\"}}],\"PartialFillsNotEnabledForOrder()\":[{\"details\":\"Revert with an error when a partial fill is attempted on an order      that does not specify partial fill support in its order type.\"}],\"TokenTransferGenericFailure(address,address,address,uint256,uint256)\":[{\"details\":\"Revert with an error when an ERC20, ERC721, or ERC1155 token      transfer reverts.\",\"params\":{\"amount\":\"The amount for the attempted transfer.\",\"from\":\"The source of the attempted transfer.\",\"identifier\":\"The identifier for the attempted transfer.\",\"to\":\"The recipient of the attempted transfer.\",\"token\":\"The token for which the transfer was attempted.\"}}],\"UnusedItemParameters()\":[{\"details\":\"Revert with an error when attempting to fulfill an order where an      item has unused parameters. This includes both the token and the      identifier parameters for native transfers as well as the identifier      parameter for ERC20 transfers. Note that the conduit does not      perform this check, leaving it up to the calling channel to enforce      when desired.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BNPL.sol\":\"BNPL\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"contracts/BNPL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.13;\\n\\nimport {\\n    Consideration\\n} from \\\"./lib/Consideration.sol\\\";\\n\\ncontract BNPL is Consideration {\\n\\n    constructor(address conduitController, address shadowToken) Consideration(conduitController, shadowToken) {}\\n\\n    function _nameString() internal pure override returns (string memory) {\\n        return \\\"BNPL\\\";\\n    }\\n}\",\"keccak256\":\"0x8bcb0c2407bca625c28866e4d4b4866853bdddc21282ca8a6d87b22eca0414ee\",\"license\":\"MIT\"},\"contracts/conduit/lib/ConduitEnums.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nenum ConduitItemType {\\n    NATIVE, // unused\\n    ERC20,\\n    ERC721,\\n    ERC1155\\n}\\n\",\"keccak256\":\"0x1a84850bbff4b820573334c70ee0797462f20fd8c9b86fdebeacc85ecb1963a6\",\"license\":\"MIT\"},\"contracts/conduit/lib/ConduitStructs.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport { ConduitItemType } from \\\"./ConduitEnums.sol\\\";\\n\\nstruct ConduitTransfer {\\n    ConduitItemType itemType;\\n    address token;\\n    address from;\\n    address to;\\n    uint256 identifier;\\n    uint256 amount;\\n}\\n\\nstruct ConduitBatch1155Transfer {\\n    address token;\\n    address from;\\n    address to;\\n    uint256[] ids;\\n    uint256[] amounts;\\n}\\n\",\"keccak256\":\"0xe3e87c74dd79c59293e49b7236cc7befdc19886bb79af5fe53208b1772fd24f9\",\"license\":\"MIT\"},\"contracts/interfaces/ConduitControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/**\\n * @title ConduitControllerInterface\\n * @author 0age\\n * @notice ConduitControllerInterface contains all external function interfaces,\\n *         structs, events, and errors for the conduit controller.\\n */\\ninterface ConduitControllerInterface {\\n    /**\\n     * @dev Track the conduit key, current owner, new potential owner, and open\\n     *      channels for each deployed conduit.\\n     */\\n    struct ConduitProperties {\\n        bytes32 key;\\n        address owner;\\n        address potentialOwner;\\n        address[] channels;\\n        mapping(address => uint256) channelIndexesPlusOne;\\n    }\\n\\n    /**\\n     * @dev Emit an event whenever a new conduit is created.\\n     *\\n     * @param conduit    The newly created conduit.\\n     * @param conduitKey The conduit key used to create the new conduit.\\n     */\\n    event NewConduit(address conduit, bytes32 conduitKey);\\n\\n    /**\\n     * @dev Emit an event whenever conduit ownership is transferred.\\n     *\\n     * @param conduit       The conduit for which ownership has been\\n     *                      transferred.\\n     * @param previousOwner The previous owner of the conduit.\\n     * @param newOwner      The new owner of the conduit.\\n     */\\n    event OwnershipTransferred(\\n        address indexed conduit,\\n        address indexed previousOwner,\\n        address indexed newOwner\\n    );\\n\\n    /**\\n     * @dev Emit an event whenever a conduit owner registers a new potential\\n     *      owner for that conduit.\\n     *\\n     * @param newPotentialOwner The new potential owner of the conduit.\\n     */\\n    event PotentialOwnerUpdated(address indexed newPotentialOwner);\\n\\n    /**\\n     * @dev Revert with an error when attempting to create a new conduit using a\\n     *      conduit key where the first twenty bytes of the key do not match the\\n     *      address of the caller.\\n     */\\n    error InvalidCreator();\\n\\n    /**\\n     * @dev Revert with an error when attempting to create a new conduit when no\\n     *      initial owner address is supplied.\\n     */\\n    error InvalidInitialOwner();\\n\\n    /**\\n     * @dev Revert with an error when attempting to set a new potential owner\\n     *      that is already set.\\n     */\\n    error NewPotentialOwnerAlreadySet(\\n        address conduit,\\n        address newPotentialOwner\\n    );\\n\\n    /**\\n     * @dev Revert with an error when attempting to cancel ownership transfer\\n     *      when no new potential owner is currently set.\\n     */\\n    error NoPotentialOwnerCurrentlySet(address conduit);\\n\\n    /**\\n     * @dev Revert with an error when attempting to interact with a conduit that\\n     *      does not yet exist.\\n     */\\n    error NoConduit();\\n\\n    /**\\n     * @dev Revert with an error when attempting to create a conduit that\\n     *      already exists.\\n     */\\n    error ConduitAlreadyExists(address conduit);\\n\\n    /**\\n     * @dev Revert with an error when attempting to update channels or transfer\\n     *      ownership of a conduit when the caller is not the owner of the\\n     *      conduit in question.\\n     */\\n    error CallerIsNotOwner(address conduit);\\n\\n    /**\\n     * @dev Revert with an error when attempting to register a new potential\\n     *      owner and supplying the null address.\\n     */\\n    error NewPotentialOwnerIsZeroAddress(address conduit);\\n\\n    /**\\n     * @dev Revert with an error when attempting to claim ownership of a conduit\\n     *      with a caller that is not the current potential owner for the\\n     *      conduit in question.\\n     */\\n    error CallerIsNotNewPotentialOwner(address conduit);\\n\\n    /**\\n     * @dev Revert with an error when attempting to retrieve a channel using an\\n     *      index that is out of range.\\n     */\\n    error ChannelOutOfRange(address conduit);\\n\\n    /**\\n     * @notice Deploy a new conduit using a supplied conduit key and assigning\\n     *         an initial owner for the deployed conduit. Note that the first\\n     *         twenty bytes of the supplied conduit key must match the caller\\n     *         and that a new conduit cannot be created if one has already been\\n     *         deployed using the same conduit key.\\n     *\\n     * @param conduitKey   The conduit key used to deploy the conduit. Note that\\n     *                     the first twenty bytes of the conduit key must match\\n     *                     the caller of this contract.\\n     * @param initialOwner The initial owner to set for the new conduit.\\n     *\\n     * @return conduit The address of the newly deployed conduit.\\n     */\\n    function createConduit(bytes32 conduitKey, address initialOwner)\\n        external\\n        returns (address conduit);\\n\\n    /**\\n     * @notice Open or close a channel on a given conduit, thereby allowing the\\n     *         specified account to execute transfers against that conduit.\\n     *         Extreme care must be taken when updating channels, as malicious\\n     *         or vulnerable channels can transfer any ERC20, ERC721 and ERC1155\\n     *         tokens where the token holder has granted the conduit approval.\\n     *         Only the owner of the conduit in question may call this function.\\n     *\\n     * @param conduit The conduit for which to open or close the channel.\\n     * @param channel The channel to open or close on the conduit.\\n     * @param isOpen  A boolean indicating whether to open or close the channel.\\n     */\\n    function updateChannel(\\n        address conduit,\\n        address channel,\\n        bool isOpen\\n    ) external;\\n\\n    /**\\n     * @notice Initiate conduit ownership transfer by assigning a new potential\\n     *         owner for the given conduit. Once set, the new potential owner\\n     *         may call `acceptOwnership` to claim ownership of the conduit.\\n     *         Only the owner of the conduit in question may call this function.\\n     *\\n     * @param conduit The conduit for which to initiate ownership transfer.\\n     * @param newPotentialOwner The new potential owner of the conduit.\\n     */\\n    function transferOwnership(address conduit, address newPotentialOwner)\\n        external;\\n\\n    /**\\n     * @notice Clear the currently set potential owner, if any, from a conduit.\\n     *         Only the owner of the conduit in question may call this function.\\n     *\\n     * @param conduit The conduit for which to cancel ownership transfer.\\n     */\\n    function cancelOwnershipTransfer(address conduit) external;\\n\\n    /**\\n     * @notice Accept ownership of a supplied conduit. Only accounts that the\\n     *         current owner has set as the new potential owner may call this\\n     *         function.\\n     *\\n     * @param conduit The conduit for which to accept ownership.\\n     */\\n    function acceptOwnership(address conduit) external;\\n\\n    /**\\n     * @notice Retrieve the current owner of a deployed conduit.\\n     *\\n     * @param conduit The conduit for which to retrieve the associated owner.\\n     *\\n     * @return owner The owner of the supplied conduit.\\n     */\\n    function ownerOf(address conduit) external view returns (address owner);\\n\\n    /**\\n     * @notice Retrieve the conduit key for a deployed conduit via reverse\\n     *         lookup.\\n     *\\n     * @param conduit The conduit for which to retrieve the associated conduit\\n     *                key.\\n     *\\n     * @return conduitKey The conduit key used to deploy the supplied conduit.\\n     */\\n    function getKey(address conduit) external view returns (bytes32 conduitKey);\\n\\n    /**\\n     * @notice Derive the conduit associated with a given conduit key and\\n     *         determine whether that conduit exists (i.e. whether it has been\\n     *         deployed).\\n     *\\n     * @param conduitKey The conduit key used to derive the conduit.\\n     *\\n     * @return conduit The derived address of the conduit.\\n     * @return exists  A boolean indicating whether the derived conduit has been\\n     *                 deployed or not.\\n     */\\n    function getConduit(bytes32 conduitKey)\\n        external\\n        view\\n        returns (address conduit, bool exists);\\n\\n    /**\\n     * @notice Retrieve the potential owner, if any, for a given conduit. The\\n     *         current owner may set a new potential owner via\\n     *         `transferOwnership` and that owner may then accept ownership of\\n     *         the conduit in question via `acceptOwnership`.\\n     *\\n     * @param conduit The conduit for which to retrieve the potential owner.\\n     *\\n     * @return potentialOwner The potential owner, if any, for the conduit.\\n     */\\n    function getPotentialOwner(address conduit)\\n        external\\n        view\\n        returns (address potentialOwner);\\n\\n    /**\\n     * @notice Retrieve the status (either open or closed) of a given channel on\\n     *         a conduit.\\n     *\\n     * @param conduit The conduit for which to retrieve the channel status.\\n     * @param channel The channel for which to retrieve the status.\\n     *\\n     * @return isOpen The status of the channel on the given conduit.\\n     */\\n    function getChannelStatus(address conduit, address channel)\\n        external\\n        view\\n        returns (bool isOpen);\\n\\n    /**\\n     * @notice Retrieve the total number of open channels for a given conduit.\\n     *\\n     * @param conduit The conduit for which to retrieve the total channel count.\\n     *\\n     * @return totalChannels The total number of open channels for the conduit.\\n     */\\n    function getTotalChannels(address conduit)\\n        external\\n        view\\n        returns (uint256 totalChannels);\\n\\n    /**\\n     * @notice Retrieve an open channel at a specific index for a given conduit.\\n     *         Note that the index of a channel can change as a result of other\\n     *         channels being closed on the conduit.\\n     *\\n     * @param conduit      The conduit for which to retrieve the open channel.\\n     * @param channelIndex The index of the channel in question.\\n     *\\n     * @return channel The open channel, if any, at the specified channel index.\\n     */\\n    function getChannel(address conduit, uint256 channelIndex)\\n        external\\n        view\\n        returns (address channel);\\n\\n    /**\\n     * @notice Retrieve all open channels for a given conduit. Note that calling\\n     *         this function for a conduit with many channels will revert with\\n     *         an out-of-gas error.\\n     *\\n     * @param conduit The conduit for which to retrieve open channels.\\n     *\\n     * @return channels An array of open channels on the given conduit.\\n     */\\n    function getChannels(address conduit)\\n        external\\n        view\\n        returns (address[] memory channels);\\n\\n    /**\\n     * @dev Retrieve the conduit creation code and runtime code hashes.\\n     */\\n    function getConduitCodeHashes()\\n        external\\n        view\\n        returns (bytes32 creationCodeHash, bytes32 runtimeCodeHash);\\n}\\n\",\"keccak256\":\"0xb124e40645efdf5d92b48fd54eaeb0ba1d05fde62bf51e7684c1bc3bf5343388\",\"license\":\"MIT\"},\"contracts/interfaces/ConduitInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport {\\n    ConduitTransfer,\\n    ConduitBatch1155Transfer\\n} from \\\"../conduit/lib/ConduitStructs.sol\\\";\\n\\n/**\\n * @title ConduitInterface\\n * @author 0age\\n * @notice ConduitInterface contains all external function interfaces, events,\\n *         and errors for conduit contracts.\\n */\\ninterface ConduitInterface {\\n    /**\\n     * @dev Revert with an error when attempting to execute transfers using a\\n     *      caller that does not have an open channel.\\n     */\\n    error ChannelClosed(address channel);\\n\\n    /**\\n     * @dev Revert with an error when attempting to update a channel to the\\n     *      current status of that channel.\\n     */\\n    error ChannelStatusAlreadySet(address channel, bool isOpen);\\n\\n    /**\\n     * @dev Revert with an error when attempting to execute a transfer for an\\n     *      item that does not have an ERC20/721/1155 item type.\\n     */\\n    error InvalidItemType();\\n\\n    /**\\n     * @dev Revert with an error when attempting to update the status of a\\n     *      channel from a caller that is not the conduit controller.\\n     */\\n    error InvalidController();\\n\\n    /**\\n     * @dev Emit an event whenever a channel is opened or closed.\\n     *\\n     * @param channel The channel that has been updated.\\n     * @param open    A boolean indicating whether the conduit is open or not.\\n     */\\n    event ChannelUpdated(address indexed channel, bool open);\\n\\n    /**\\n     * @notice Execute a sequence of ERC20/721/1155 transfers. Only a caller\\n     *         with an open channel can call this function.\\n     *\\n     * @param transfers The ERC20/721/1155 transfers to perform.\\n     *\\n     * @return magicValue A magic value indicating that the transfers were\\n     *                    performed successfully.\\n     */\\n    function execute(ConduitTransfer[] calldata transfers)\\n        external\\n        returns (bytes4 magicValue);\\n\\n    /**\\n     * @notice Execute a sequence of batch 1155 transfers. Only a caller with an\\n     *         open channel can call this function.\\n     *\\n     * @param batch1155Transfers The 1155 batch transfers to perform.\\n     *\\n     * @return magicValue A magic value indicating that the transfers were\\n     *                    performed successfully.\\n     */\\n    function executeBatch1155(\\n        ConduitBatch1155Transfer[] calldata batch1155Transfers\\n    ) external returns (bytes4 magicValue);\\n\\n    /**\\n     * @notice Execute a sequence of transfers, both single and batch 1155. Only\\n     *         a caller with an open channel can call this function.\\n     *\\n     * @param standardTransfers  The ERC20/721/1155 transfers to perform.\\n     * @param batch1155Transfers The 1155 batch transfers to perform.\\n     *\\n     * @return magicValue A magic value indicating that the transfers were\\n     *                    performed successfully.\\n     */\\n    function executeWithBatch1155(\\n        ConduitTransfer[] calldata standardTransfers,\\n        ConduitBatch1155Transfer[] calldata batch1155Transfers\\n    ) external returns (bytes4 magicValue);\\n\\n    /**\\n     * @notice Open or close a given channel. Only callable by the controller.\\n     *\\n     * @param channel The channel to open or close.\\n     * @param isOpen  The status of the channel (either open or closed).\\n     */\\n    function updateChannel(address channel, bool isOpen) external;\\n}\\n\",\"keccak256\":\"0x628e23ec7e820e8ac59c0999211bb022bb5c5581a5bc6bd39465d6419d7d85b5\",\"license\":\"MIT\"},\"contracts/interfaces/ConsiderationEventsAndErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/**\\n * @title ConsiderationEventsAndErrors\\n * @author 0age\\n * @notice ConsiderationEventsAndErrors contains all events and errors.\\n */\\ninterface ConsiderationEventsAndErrors {\\n\\n    event OrderFulfilled(\\n        bytes32 orderHash,\\n        address indexed offerer,\\n        uint256 shadowId\\n    );\\n\\n    event OrderRepaid(\\n        bytes32 orderHash,\\n        uint256 payTimes,\\n        bool finalized\\n    );\\n\\n    event OrderBroken(\\n        bytes32 orderHash,\\n        address indexed offerer\\n    );\\n\\n    /**\\n     * @dev Emit an event whenever an order is successfully cancelled.\\n     *\\n     * @param orderHash The hash of the cancelled order.\\n     * @param offerer   The offerer of the cancelled order.\\n     */\\n    event OrderCancelled(\\n        bytes32 orderHash,\\n        address indexed offerer\\n    );\\n\\n    /**\\n     * @dev Emit an event whenever an order is explicitly validated. Note that\\n     *      this event will not be emitted on partial fills even though they do\\n     *      validate the order as part of partial fulfillment.\\n     *\\n     * @param orderHash The hash of the validated order.\\n     * @param offerer   The offerer of the validated order.\\n     */\\n    event OrderValidated(\\n        bytes32 orderHash,\\n        address indexed offerer\\n    );\\n\\n    /**\\n     * @dev Emit an event whenever a counter for a given offerer is incremented.\\n     *\\n     * @param newCounter The new counter for the offerer.\\n     * @param offerer  The offerer in question.\\n     */\\n    event CounterIncremented(uint256 newCounter, address indexed offerer);\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill an order that has\\n     *      already been fully filled.\\n     *\\n     * @param orderHash The order hash on which a fill was attempted.\\n     */\\n    error OrderAlreadyFilled(bytes32 orderHash);\\n\\n    error OrderAlreadyFinalized(bytes32 orderHash);\\n\\n    error OrderAlreadyStarted(bytes32 orderHash);\\n\\n    error OrderNotStarted(bytes32 orderHash);\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill an order outside the\\n     *      specified start time and end time.\\n     */\\n    error InvalidTime();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill an order referencing an\\n     *      invalid conduit (i.e. one that has not been deployed).\\n     */\\n    error InvalidConduit(bytes32 conduitKey, address conduit);\\n\\n    /**\\n     * @dev Revert with an error when an order is supplied for fulfillment with\\n     *      a consideration array that is shorter than the original array.\\n     */\\n    error MissingOriginalConsiderationItems();\\n\\n    /**\\n     * @dev Revert with an error when a call to a conduit fails with revert data\\n     *      that is too expensive to return.\\n     */\\n    error InvalidCallToConduit(address conduit);\\n\\n    /**\\n     * @dev Revert with an error if a consideration amount has not been fully\\n     *      zeroed out after applying all fulfillments.\\n     *\\n     * @param orderIndex         The index of the order with the consideration\\n     *                           item with a shortfall.\\n     * @param considerationIndex The index of the consideration item on the\\n     *                           order.\\n     * @param shortfallAmount    The unfulfilled consideration amount.\\n     */\\n    error ConsiderationNotMet(\\n        uint256 orderIndex,\\n        uint256 considerationIndex,\\n        uint256 shortfallAmount\\n    );\\n\\n    /**\\n     * @dev Revert with an error when insufficient ether is supplied as part of\\n     *      msg.value when fulfilling orders.\\n     */\\n    error InsufficientEtherSupplied();\\n\\n    /**\\n     * @dev Revert with an error when an ether transfer reverts.\\n     */\\n    error EtherTransferGenericFailure(address account, uint256 amount);\\n\\n    /**\\n     * @dev Revert with an error when a partial fill is attempted on an order\\n     *      that does not specify partial fill support in its order type.\\n     */\\n    error PartialFillsNotEnabledForOrder();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill an order that has been\\n     *      cancelled.\\n     *\\n     * @param orderHash The hash of the cancelled order.\\n     */\\n    error OrderIsCancelled(bytes32 orderHash);\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill a basic order that has\\n     *      been partially filled.\\n     *\\n     * @param orderHash The hash of the partially used order.\\n     */\\n    error OrderPartiallyFilled(bytes32 orderHash);\\n\\n    /**\\n     * @dev Revert with an error when attempting to cancel an order as a caller\\n     *      other than the indicated offerer or zone.\\n     */\\n    error InvalidCanceller();\\n\\n    /**\\n     * @dev Revert with an error when supplying a fraction with a value of zero\\n     *      for the numerator or denominator, or one where the numerator exceeds\\n     *      the denominator.\\n     */\\n    error BadFraction();\\n\\n    /**\\n     * @dev Revert with an error when a caller attempts to supply callvalue to a\\n     *      non-payable basic order route or does not supply any callvalue to a\\n     *      payable basic order route.\\n     */\\n    error InvalidMsgValue(uint256 value);\\n\\n    /**\\n     * @dev Revert with an error when attempting to fill a basic order using\\n     *      calldata not produced by default ABI encoding.\\n     */\\n    error InvalidBasicOrderParameterEncoding();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fulfill any number of\\n     *      available orders when none are fulfillable.\\n     */\\n    error NoSpecifiedOrdersAvailable();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fulfill an order with an\\n     *      offer for ETH outside of matching orders.\\n     */\\n    error InvalidNativeOfferItem();\\n\\n    error OrderNotValidated(bytes32 orderHash);\\n\\n    error OrderExpired(bytes32 orderHash);\\n\\n    error OrderNotExpired(bytes32 orderHash);\\n\\n    error OrderInvalidRepayParameters(bytes32 orderHash);\\n\\n    error InvalidOrderParameters();\\n}\\n\",\"keccak256\":\"0x71a166db3dbdc44218081f02a9fe0de3cf2d3d9680ac88ef68c0b376eb1a3e97\",\"license\":\"MIT\"},\"contracts/interfaces/EIP1271Interface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\ninterface EIP1271Interface {\\n    function isValidSignature(bytes32 digest, bytes calldata signature)\\n        external\\n        view\\n        returns (bytes4);\\n}\",\"keccak256\":\"0xba82a40106e4565fda2909937d8ab23dc45622fead50d439ee09994d678828e0\",\"license\":\"MIT\"},\"contracts/interfaces/ReentrancyErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/**\\n * @title ReentrancyErrors\\n * @author 0age\\n * @notice ReentrancyErrors contains errors related to reentrancy.\\n */\\ninterface ReentrancyErrors {\\n    /**\\n     * @dev Revert with an error when a caller attempts to reenter a protected\\n     *      function.\\n     */\\n    error NoReentrantCalls();\\n}\\n\",\"keccak256\":\"0xd8825124dc105b07e1d2c857f219a30092f02f14b56905ae44e503ead6d276c8\",\"license\":\"MIT\"},\"contracts/interfaces/SignatureVerificationErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/**\\n * @title SignatureVerificationErrors\\n * @author 0age\\n * @notice SignatureVerificationErrors contains all errors related to signature\\n *         verification.\\n */\\ninterface SignatureVerificationErrors {\\n    /**\\n     * @dev Revert with an error when a signature that does not contain a v\\n     *      value of 27 or 28 has been supplied.\\n     *\\n     * @param v The invalid v value.\\n     */\\n    error BadSignatureV(uint8 v);\\n\\n    /**\\n     * @dev Revert with an error when the signer recovered by the supplied\\n     *      signature does not match the offerer or an allowed EIP-1271 signer\\n     *      as specified by the offerer in the event they are a contract.\\n     */\\n    error InvalidSigner();\\n\\n    /**\\n     * @dev Revert with an error when a signer cannot be recovered from the\\n     *      supplied signature.\\n     */\\n    error InvalidSignature();\\n\\n    /**\\n     * @dev Revert with an error when an EIP-1271 call to an account fails.\\n     */\\n    error BadContractSignature();\\n}\\n\",\"keccak256\":\"0xd0f5b26469ba6cd303e5ea9b53cf6b7c25cb00918097eb59a263678b51197381\",\"license\":\"MIT\"},\"contracts/interfaces/TokenTransferrerErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/**\\n * @title TokenTransferrerErrors\\n */\\ninterface TokenTransferrerErrors {\\n    /**\\n     * @dev Revert with an error when an ERC721 transfer with amount other than\\n     *      one is attempted.\\n     */\\n    error InvalidERC721TransferAmount();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fulfill an order where an\\n     *      item has an amount of zero.\\n     */\\n    error MissingItemAmount();\\n\\n    /**\\n     * @dev Revert with an error when attempting to fulfill an order where an\\n     *      item has unused parameters. This includes both the token and the\\n     *      identifier parameters for native transfers as well as the identifier\\n     *      parameter for ERC20 transfers. Note that the conduit does not\\n     *      perform this check, leaving it up to the calling channel to enforce\\n     *      when desired.\\n     */\\n    error UnusedItemParameters();\\n\\n    /**\\n     * @dev Revert with an error when an ERC20, ERC721, or ERC1155 token\\n     *      transfer reverts.\\n     *\\n     * @param token      The token for which the transfer was attempted.\\n     * @param from       The source of the attempted transfer.\\n     * @param to         The recipient of the attempted transfer.\\n     * @param identifier The identifier for the attempted transfer.\\n     * @param amount     The amount for the attempted transfer.\\n     */\\n    error TokenTransferGenericFailure(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount\\n    );\\n\\n    /**\\n     * @dev Revert with an error when a batch ERC1155 token transfer reverts.\\n     *\\n     * @param token       The token for which the transfer was attempted.\\n     * @param from        The source of the attempted transfer.\\n     * @param to          The recipient of the attempted transfer.\\n     * @param identifiers The identifiers for the attempted transfer.\\n     * @param amounts     The amounts for the attempted transfer.\\n     */\\n    error ERC1155BatchTransferGenericFailure(\\n        address token,\\n        address from,\\n        address to,\\n        uint256[] identifiers,\\n        uint256[] amounts\\n    );\\n\\n    /**\\n     * @dev Revert with an error when an ERC20 token transfer returns a falsey\\n     *      value.\\n     *\\n     * @param token      The token for which the ERC20 transfer was attempted.\\n     * @param from       The source of the attempted ERC20 transfer.\\n     * @param to         The recipient of the attempted ERC20 transfer.\\n     * @param amount     The amount for the attempted ERC20 transfer.\\n     */\\n    error BadReturnValueFromERC20OnTransfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    );\\n\\n    /**\\n     * @dev Revert with an error when an account being called as an assumed\\n     *      contract does not have code and returns no data.\\n     *\\n     * @param account The account that should contain code.\\n     */\\n    error NoContract(address account);\\n\\n    /**\\n     * @dev Revert with an error when attempting to execute an 1155 batch\\n     *      transfer using calldata not produced by default ABI encoding or with\\n     *      different lengths for ids and amounts arrays.\\n     */\\n    error Invalid1155BatchTransferEncoding();\\n}\\n\",\"keccak256\":\"0x0a89101400c263654f920aad668249ce67eaebd1af7d5582d38456c8384fc962\",\"license\":\"MIT\"},\"contracts/lib/Assertions.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { GettersAndDerivers } from \\\"./GettersAndDerivers.sol\\\";\\n\\nimport {\\n    TokenTransferrerErrors\\n} from \\\"../interfaces/TokenTransferrerErrors.sol\\\";\\n\\nimport { CounterManager } from \\\"./CounterManager.sol\\\";\\n\\ncontract Assertions is\\n    GettersAndDerivers,\\n    CounterManager,\\n    TokenTransferrerErrors\\n{\\n    constructor(address conduitController)\\n        GettersAndDerivers(conduitController)\\n    {}\\n\\n    function _assertNonZeroAmount(uint256 amount) internal pure {\\n        // Revert if the supplied amount is equal to zero.\\n        if (amount == 0) {\\n            revert MissingItemAmount();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5841bbb4c48b541f692567567de5672939afc452bc940ef69a9d0726697d6414\",\"license\":\"MIT\"},\"contracts/lib/Consideration.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {\\n    OrderParameters,\\n    OrderComponents,\\n    OrderStatus,\\n    Order\\n} from \\\"./ConsiderationStructs.sol\\\";\\n\\nimport {\\n    OrderFulfiller\\n} from \\\"./OrderFulfiller.sol\\\";\\n\\ncontract Consideration is OrderFulfiller {\\n\\n    mapping(bytes32 => OrderStatus) private _orderStatus;\\n\\n    constructor(address conduitController, address shadowToken) OrderFulfiller(conduitController, shadowToken) {}\\n\\n    function fulfillOrder(Order calldata order, bytes32 fulfillerConduitKey)\\n        external\\n        payable\\n        returns (bool fulfilled)\\n    {\\n        fulfilled = _validateAndFulfillOrder(order, fulfillerConduitKey);\\n    }\\n\\n    function repayOrder(OrderParameters calldata parameters, bytes32 fulfillerConduitKey, uint256 payTimes)\\n        external\\n        payable\\n        returns (bool repaid)\\n    {\\n        repaid = _validateAndRepayOrder(parameters, fulfillerConduitKey, payTimes);\\n    }\\n\\n    function breakOrder(OrderParameters calldata parameters)\\n        external\\n        returns (bool broken)\\n    {\\n        broken = _validateAndBreakOrder(parameters);\\n    }\\n\\n    function cancel(OrderComponents[] calldata orders)\\n        external\\n        returns (bool cancelled)\\n    {\\n        cancelled = _cancel(orders);\\n    }\\n\\n    function validate(Order[] calldata orders)\\n        external\\n        returns (bool validated)\\n    {\\n        validated = _validate(orders);\\n    }\\n\\n    function incrementCounter() external returns (uint256 newCounter) {\\n        newCounter = _incrementCounter();\\n    }\\n\\n    function getOrderHash(OrderComponents calldata order)\\n        external\\n        view\\n        returns (bytes32 orderHash)\\n    {\\n        orderHash = _deriveOrderHash(\\n            OrderParameters(\\n                order.offerer,\\n                order.token,\\n                order.identifier,\\n                order.currency,\\n                order.artist,\\n                order.platform,\\n                order.startTime,\\n                order.endTime,\\n                order.duration,\\n                order.periods,\\n                order.amount,\\n                order.ratio,\\n                order.royalty,\\n                order.fee,\\n                order.withdrawFee,\\n                order.salt,\\n                order.conduitKey\\n            ),\\n            order.counter\\n        );\\n    }\\n\\n    function getOrderStatus(bytes32 orderHash)\\n        external\\n        view\\n        returns (\\n            bool isValidated,\\n            bool isCancelled,\\n            bool isFinalized,\\n            bool isBroken,\\n            address fulfiller,\\n            uint256 startedAt,\\n            uint256 shadowId,\\n            uint256 paidTimes\\n        )\\n    {\\n        return _getOrderStatus(orderHash);\\n    }\\n\\n    function getCounter(address offerer)\\n        external\\n        view\\n        returns (uint256 counter)\\n    {\\n        counter = _getCounter(offerer);\\n    }\\n\\n    function information()\\n        external\\n        view\\n        returns (\\n            string memory version,\\n            bytes32 domainSeparator,\\n            address conduitController\\n        )\\n    {\\n        return _information();\\n    }\\n}\",\"keccak256\":\"0xabf6e7795c3f34483c6de6a3c2d74769f5067becdceee9ab53a647c7cd787e04\",\"license\":\"MIT\"},\"contracts/lib/ConsiderationBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {\\n    ConduitControllerInterface\\n} from \\\"../interfaces/ConduitControllerInterface.sol\\\";\\n\\ncontract ConsiderationBase {\\n    bytes32 internal immutable _NAME_HASH;\\n    bytes32 internal immutable _VERSION_HASH;\\n    bytes32 internal immutable _EIP_712_DOMAIN_TYPEHASH;\\n    bytes32 internal immutable _ORDER_TYPEHASH;\\n    uint256 internal immutable _CHAIN_ID;\\n    bytes32 internal immutable _DOMAIN_SEPARATOR;\\n\\n    ConduitControllerInterface internal immutable _CONDUIT_CONTROLLER;\\n    bytes32 internal immutable _CONDUIT_CREATION_CODE_HASH;\\n\\n    constructor(address conduitController) {\\n        (\\n            _NAME_HASH,\\n            _VERSION_HASH,\\n            _EIP_712_DOMAIN_TYPEHASH,\\n            _ORDER_TYPEHASH\\n        ) = _deriveTypehashes();\\n\\n        _CHAIN_ID = block.chainid;\\n        _DOMAIN_SEPARATOR = _deriveDomainSeparator();\\n\\n        _CONDUIT_CONTROLLER = ConduitControllerInterface(conduitController);\\n\\n        (_CONDUIT_CREATION_CODE_HASH, ) = (\\n            _CONDUIT_CONTROLLER.getConduitCodeHashes()\\n        );\\n    }\\n\\n    function _deriveDomainSeparator() internal view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                _EIP_712_DOMAIN_TYPEHASH,\\n                _NAME_HASH,\\n                _VERSION_HASH,\\n                block.chainid,\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    function _nameString() internal pure virtual returns (string memory) {\\n        return \\\"Consideration\\\";\\n    }\\n\\n    function _deriveTypehashes()\\n        internal\\n        pure\\n        returns (\\n            bytes32 nameHash,\\n            bytes32 versionHash,\\n            bytes32 eip712DomainTypehash,\\n            bytes32 orderTypehash\\n        )\\n    {\\n        nameHash = keccak256(bytes(_nameString()));\\n\\n        versionHash = keccak256(bytes(\\\"1.0\\\"));\\n\\n        bytes memory orderComponentsTypeString = abi.encodePacked(\\n            \\\"OrderComponents(\\\",\\n                \\\"address offerer,\\\",\\n                \\\"address token,\\\",\\n                \\\"uint256 identifier,\\\",\\n                \\\"address currency,\\\",\\n                \\\"address artist,\\\",\\n                \\\"address platform,\\\",\\n                \\\"uint256 startTime,\\\",\\n                \\\"uint256 endTime,\\\",\\n                \\\"uint256 duration,\\\",\\n                \\\"uint256 periods,\\\",\\n                \\\"uint256 amount,\\\",\\n                \\\"uint256 ratio,\\\",\\n                \\\"uint256 royalty,\\\",\\n                \\\"uint256 fee,\\\",\\n                \\\"uint256 withdrawFee,\\\",\\n                \\\"uint256 salt,\\\",\\n                \\\"bytes32 conduitKey,\\\",\\n                \\\"uint256 counter\\\",\\n            \\\")\\\"\\n        );\\n\\n        eip712DomainTypehash = keccak256(\\n            abi.encodePacked(\\n                \\\"EIP712Domain(\\\",\\n                    \\\"string name,\\\",\\n                    \\\"string version,\\\",\\n                    \\\"uint256 chainId,\\\",\\n                    \\\"address verifyingContract\\\",\\n                \\\")\\\"\\n            )\\n        );\\n\\n        orderTypehash = keccak256(orderComponentsTypeString);\\n    }\\n}\",\"keccak256\":\"0x9cd33c5b8bd60301ea09c0305587414ef38f6898fa7a1e0dfb217dd26091d106\",\"license\":\"MIT\"},\"contracts/lib/ConsiderationConstants.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/*\\n * -------------------------- Disambiguation & Other Notes ---------------------\\n *    - The term \\\"head\\\" is used as it is in the documentation for ABI encoding,\\n *      but only in reference to dynamic types, i.e. it always refers to the\\n *      offset or pointer to the body of a dynamic type. In calldata, the head\\n *      is always an offset (relative to the parent object), while in memory,\\n *      the head is always the pointer to the body. More information found here:\\n *      https://docs.soliditylang.org/en/v0.8.14/abi-spec.html#argument-encoding\\n *        - Note that the length of an array is separate from and precedes the\\n *          head of the array.\\n *\\n *    - The term \\\"body\\\" is used in place of the term \\\"head\\\" used in the ABI\\n *      documentation. It refers to the start of the data for a dynamic type,\\n *      e.g. the first word of a struct or the first word of the first element\\n *      in an array.\\n *\\n *    - The term \\\"pointer\\\" is used to describe the absolute position of a value\\n *      and never an offset relative to another value.\\n *        - The suffix \\\"_ptr\\\" refers to a memory pointer.\\n *        - The suffix \\\"_cdPtr\\\" refers to a calldata pointer.\\n *\\n *    - The term \\\"offset\\\" is used to describe the position of a value relative\\n *      to some parent value. For example, OrderParameters_conduit_offset is the\\n *      offset to the \\\"conduit\\\" value in the OrderParameters struct relative to\\n *      the start of the body.\\n *        - Note: Offsets are used to derive pointers.\\n *\\n *    - Some structs have pointers defined for all of their fields in this file.\\n *      Lines which are commented out are fields that are not used in the\\n *      codebase but have been left in for readability.\\n */\\n\\n// Declare constants for name, version, and reentrancy sentinel values.\\n\\n// Name is right padded, so it touches the length which is left padded. This\\n// enables writing both values at once. Length goes at byte 95 in memory, and\\n// name fills bytes 96-109, so both values can be written left-padded to 77.\\nuint256 constant NameLengthPtr = 77;\\nuint256 constant NameWithLength = 0x0d436F6E73696465726174696F6E;\\n\\nuint256 constant Version = 0x312e31;\\nuint256 constant Version_length = 3;\\nuint256 constant Version_shift = 0xe8;\\n\\nuint256 constant _NOT_ENTERED = 1;\\nuint256 constant _ENTERED = 2;\\n\\n// Common Offsets\\n// Offsets for identically positioned fields shared by:\\n// OfferItem, ConsiderationItem, SpentItem, ReceivedItem\\n\\nuint256 constant Common_token_offset = 0x20;\\nuint256 constant Common_identifier_offset = 0x40;\\nuint256 constant Common_amount_offset = 0x60;\\n\\nuint256 constant ReceivedItem_size = 0xa0;\\nuint256 constant ReceivedItem_amount_offset = 0x60;\\nuint256 constant ReceivedItem_recipient_offset = 0x80;\\n\\nuint256 constant ReceivedItem_CommonParams_size = 0x60;\\n\\nuint256 constant ConsiderationItem_recipient_offset = 0xa0;\\n// Store the same constant in an abbreviated format for a line length fix.\\nuint256 constant ConsiderItem_recipient_offset = 0xa0;\\n\\nuint256 constant Execution_offerer_offset = 0x20;\\nuint256 constant Execution_conduit_offset = 0x40;\\n\\nuint256 constant InvalidFulfillmentComponentData_error_signature = (\\n    0x7fda727900000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant InvalidFulfillmentComponentData_error_len = 0x04;\\n\\nuint256 constant Panic_error_signature = (\\n    0x4e487b7100000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant Panic_error_offset = 0x04;\\nuint256 constant Panic_error_length = 0x24;\\nuint256 constant Panic_arithmetic = 0x11;\\n\\nuint256 constant MissingItemAmount_error_signature = (\\n    0x91b3e51400000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant MissingItemAmount_error_len = 0x04;\\n\\nuint256 constant OrderParameters_offer_head_offset = 0x20;\\nuint256 constant OrderParameters_consideration_head_offset = 0x40;\\nuint256 constant OrderParameters_conduit_offset = 0x200;\\nuint256 constant OrderParameters_counter_offset = 0x220;\\n\\nuint256 constant Fulfillment_itemIndex_offset = 0x20;\\n\\nuint256 constant AdvancedOrder_numerator_offset = 0x20;\\n\\nuint256 constant AlmostOneWord = 0x1f;\\nuint256 constant OneWord = 0x20;\\nuint256 constant TwoWords = 0x40;\\nuint256 constant ThreeWords = 0x60;\\nuint256 constant FourWords = 0x80;\\nuint256 constant FiveWords = 0xa0;\\n\\nuint256 constant FreeMemoryPointerSlot = 0x40;\\nuint256 constant ZeroSlot = 0x60;\\nuint256 constant DefaultFreeMemoryPointer = 0x80;\\n\\nuint256 constant Slot0x80 = 0x80;\\nuint256 constant Slot0xA0 = 0xa0;\\n\\nuint256 constant BasicOrder_endAmount_cdPtr = 0x104;\\nuint256 constant BasicOrder_common_params_size = 0xa0;\\nuint256 constant BasicOrder_considerationHashesArray_ptr = 0x160;\\n\\nuint256 constant EIP712_Order_size = 0x260;\\nuint256 constant AdditionalRecipients_size = 0x40;\\n\\nuint256 constant EIP712_DomainSeparator_offset = 0x02;\\nuint256 constant EIP712_OrderHash_offset = 0x22;\\nuint256 constant EIP712_DigestPayload_size = 0x42;\\n\\nuint256 constant receivedItemsHash_ptr = 0x60;\\n\\n/*\\n *  Memory layout in _prepareBasicFulfillmentFromCalldata of\\n *  data for OrderFulfilled\\n *\\n *   event OrderFulfilled(\\n *     bytes32 orderHash,\\n *     address indexed offerer,\\n *     address indexed zone,\\n *     address fulfiller,\\n *     SpentItem[] offer,\\n *       > (itemType, token, id, amount)\\n *     ReceivedItem[] consideration\\n *       > (itemType, token, id, amount, recipient)\\n *   )\\n *\\n *  - 0x00: orderHash\\n *  - 0x20: fulfiller\\n *  - 0x40: offer offset (0x80)\\n *  - 0x60: consideration offset (0x120)\\n *  - 0x80: offer.length (1)\\n *  - 0xa0: offerItemType\\n *  - 0xc0: offerToken\\n *  - 0xe0: offerIdentifier\\n *  - 0x100: offerAmount\\n *  - 0x120: consideration.length (1 + additionalRecipients.length)\\n *  - 0x140: considerationItemType\\n *  - 0x160: considerationToken\\n *  - 0x180: considerationIdentifier\\n *  - 0x1a0: considerationAmount\\n *  - 0x1c0: considerationRecipient\\n *  - ...\\n */\\n\\n// Minimum length of the OrderFulfilled event data.\\n// Must be added to the size of the ReceivedItem array for additionalRecipients\\n// (0xa0 * additionalRecipients.length) to calculate full size of the buffer.\\nuint256 constant OrderFulfilled_baseSize = 0x1e0;\\nuint256 constant OrderFulfilled_selector = (\\n    0x9d9af8e38d66c62e2c12f0225249fd9d721c54b83f48d9352c97c6cacdcb6f31\\n);\\n\\n// Minimum offset in memory to OrderFulfilled event data.\\n// Must be added to the size of the EIP712 hash array for additionalRecipients\\n// (32 * additionalRecipients.length) to calculate the pointer to event data.\\nuint256 constant OrderFulfilled_baseOffset = 0x180;\\nuint256 constant OrderFulfilled_consideration_length_baseOffset = 0x2a0;\\nuint256 constant OrderFulfilled_offer_length_baseOffset = 0x200;\\n\\n// uint256 constant OrderFulfilled_orderHash_offset = 0x00;\\nuint256 constant OrderFulfilled_fulfiller_offset = 0x20;\\nuint256 constant OrderFulfilled_offer_head_offset = 0x40;\\nuint256 constant OrderFulfilled_offer_body_offset = 0x80;\\nuint256 constant OrderFulfilled_consideration_head_offset = 0x60;\\nuint256 constant OrderFulfilled_consideration_body_offset = 0x120;\\n\\n// BasicOrderParameters\\nuint256 constant BasicOrder_parameters_cdPtr = 0x04;\\nuint256 constant BasicOrder_considerationToken_cdPtr = 0x24;\\n// uint256 constant BasicOrder_considerationIdentifier_cdPtr = 0x44;\\nuint256 constant BasicOrder_considerationAmount_cdPtr = 0x64;\\nuint256 constant BasicOrder_offerer_cdPtr = 0x84;\\nuint256 constant BasicOrder_zone_cdPtr = 0xa4;\\nuint256 constant BasicOrder_offerToken_cdPtr = 0xc4;\\n// uint256 constant BasicOrder_offerIdentifier_cdPtr = 0xe4;\\nuint256 constant BasicOrder_offerAmount_cdPtr = 0x104;\\nuint256 constant BasicOrder_basicOrderType_cdPtr = 0x124;\\nuint256 constant BasicOrder_startTime_cdPtr = 0x144;\\n// uint256 constant BasicOrder_endTime_cdPtr = 0x164;\\n// uint256 constant BasicOrder_zoneHash_cdPtr = 0x184;\\n// uint256 constant BasicOrder_salt_cdPtr = 0x1a4;\\nuint256 constant BasicOrder_offererConduit_cdPtr = 0x1c4;\\nuint256 constant BasicOrder_fulfillerConduit_cdPtr = 0x1e4;\\nuint256 constant BasicOrder_totalOriginalAdditionalRecipients_cdPtr = 0x204;\\nuint256 constant BasicOrder_additionalRecipients_head_cdPtr = 0x224;\\nuint256 constant BasicOrder_signature_cdPtr = 0x244;\\nuint256 constant BasicOrder_additionalRecipients_length_cdPtr = 0x264;\\nuint256 constant BasicOrder_additionalRecipients_data_cdPtr = 0x284;\\n\\nuint256 constant BasicOrder_parameters_ptr = 0x20;\\n\\nuint256 constant BasicOrder_basicOrderType_range = 0x18; // 24 values\\n\\n/*\\n *  Memory layout in _prepareBasicFulfillmentFromCalldata of\\n *  EIP712 data for ConsiderationItem\\n *   - 0x80: ConsiderationItem EIP-712 typehash (constant)\\n *   - 0xa0: itemType\\n *   - 0xc0: token\\n *   - 0xe0: identifier\\n *   - 0x100: startAmount\\n *   - 0x120: endAmount\\n *   - 0x140: recipient\\n */\\nuint256 constant BasicOrder_considerationItem_typeHash_ptr = 0x80; // memoryPtr\\nuint256 constant BasicOrder_considerationItem_itemType_ptr = 0xa0;\\nuint256 constant BasicOrder_considerationItem_token_ptr = 0xc0;\\nuint256 constant BasicOrder_considerationItem_identifier_ptr = 0xe0;\\nuint256 constant BasicOrder_considerationItem_startAmount_ptr = 0x100;\\nuint256 constant BasicOrder_considerationItem_endAmount_ptr = 0x120;\\n// uint256 constant BasicOrder_considerationItem_recipient_ptr = 0x140;\\n\\n/*\\n *  Memory layout in _prepareBasicFulfillmentFromCalldata of\\n *  EIP712 data for OfferItem\\n *   - 0x80:  OfferItem EIP-712 typehash (constant)\\n *   - 0xa0:  itemType\\n *   - 0xc0:  token\\n *   - 0xe0:  identifier (reused for offeredItemsHash)\\n *   - 0x100: startAmount\\n *   - 0x120: endAmount\\n */\\nuint256 constant BasicOrder_offerItem_typeHash_ptr = DefaultFreeMemoryPointer;\\nuint256 constant BasicOrder_offerItem_itemType_ptr = 0xa0;\\nuint256 constant BasicOrder_offerItem_token_ptr = 0xc0;\\n// uint256 constant BasicOrder_offerItem_identifier_ptr = 0xe0;\\n// uint256 constant BasicOrder_offerItem_startAmount_ptr = 0x100;\\nuint256 constant BasicOrder_offerItem_endAmount_ptr = 0x120;\\n\\n/*\\n *  Memory layout in _prepareBasicFulfillmentFromCalldata of\\n *  EIP712 data for Order\\n *   - 0x80:   Order EIP-712 typehash (constant)\\n *   - 0xa0:   orderParameters.offerer\\n *   - 0xc0:   orderParameters.zone\\n *   - 0xe0:   keccak256(abi.encodePacked(offerHashes))\\n *   - 0x100:  keccak256(abi.encodePacked(considerationHashes))\\n *   - 0x120:  orderType\\n *   - 0x140:  startTime\\n *   - 0x160:  endTime\\n *   - 0x180:  zoneHash\\n *   - 0x1a0:  salt\\n *   - 0x1c0:  conduit\\n *   - 0x1e0:  _counters[orderParameters.offerer] (from storage)\\n */\\nuint256 constant BasicOrder_order_typeHash_ptr = 0x80;\\nuint256 constant BasicOrder_order_offerer_ptr = 0xa0;\\n// uint256 constant BasicOrder_order_zone_ptr = 0xc0;\\nuint256 constant BasicOrder_order_offerHashes_ptr = 0xe0;\\nuint256 constant BasicOrder_order_considerationHashes_ptr = 0x100;\\nuint256 constant BasicOrder_order_orderType_ptr = 0x120;\\nuint256 constant BasicOrder_order_startTime_ptr = 0x140;\\n// uint256 constant BasicOrder_order_endTime_ptr = 0x160;\\n// uint256 constant BasicOrder_order_zoneHash_ptr = 0x180;\\n// uint256 constant BasicOrder_order_salt_ptr = 0x1a0;\\n// uint256 constant BasicOrder_order_conduitKey_ptr = 0x1c0;\\nuint256 constant BasicOrder_order_counter_ptr = 0x1e0;\\nuint256 constant BasicOrder_additionalRecipients_head_ptr = 0x240;\\nuint256 constant BasicOrder_signature_ptr = 0x260;\\n\\n// Signature-related\\nbytes32 constant EIP2098_allButHighestBitMask = (\\n    0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\\n);\\nbytes32 constant ECDSA_twentySeventhAndTwentyEighthBytesSet = (\\n    0x0000000000000000000000000000000000000000000000000000000101000000\\n);\\nuint256 constant ECDSA_MaxLength = 65;\\nuint256 constant ECDSA_signature_s_offset = 0x40;\\nuint256 constant ECDSA_signature_v_offset = 0x60;\\n\\nbytes32 constant EIP1271_isValidSignature_selector = (\\n    0x1626ba7e00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant EIP1271_isValidSignature_signatureHead_negativeOffset = 0x20;\\nuint256 constant EIP1271_isValidSignature_digest_negativeOffset = 0x40;\\nuint256 constant EIP1271_isValidSignature_selector_negativeOffset = 0x44;\\nuint256 constant EIP1271_isValidSignature_calldata_baseLength = 0x64;\\n\\nuint256 constant EIP1271_isValidSignature_signature_head_offset = 0x40;\\n\\n// abi.encodeWithSignature(\\\"NoContract(address)\\\")\\nuint256 constant NoContract_error_signature = (\\n    0x5f15d67200000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant NoContract_error_sig_ptr = 0x0;\\nuint256 constant NoContract_error_token_ptr = 0x4;\\nuint256 constant NoContract_error_length = 0x24; // 4 + 32 == 36\\n\\nuint256 constant EIP_712_PREFIX = (\\n    0x1901000000000000000000000000000000000000000000000000000000000000\\n);\\n\\nuint256 constant ExtraGasBuffer = 0x20;\\nuint256 constant CostPerWord = 3;\\nuint256 constant MemoryExpansionCoefficient = 0x200; // 512\\n\\nuint256 constant Create2AddressDerivation_ptr = 0x0b;\\nuint256 constant Create2AddressDerivation_length = 0x55;\\n\\nuint256 constant MaskOverByteTwelve = (\\n    0x0000000000000000000000ff0000000000000000000000000000000000000000\\n);\\n\\nuint256 constant MaskOverLastTwentyBytes = (\\n    0x000000000000000000000000ffffffffffffffffffffffffffffffffffffffff\\n);\\n\\nuint256 constant MaskOverFirstFourBytes = (\\n    0xffffffff00000000000000000000000000000000000000000000000000000000\\n);\\n\\nuint256 constant Conduit_execute_signature = (\\n    0x4ce34aa200000000000000000000000000000000000000000000000000000000\\n);\\n\\nuint256 constant MaxUint8 = 0xff;\\nuint256 constant MaxUint120 = 0xffffffffffffffffffffffffffffff;\\n\\nuint256 constant Conduit_execute_ConduitTransfer_ptr = 0x20;\\nuint256 constant Conduit_execute_ConduitTransfer_length = 0x01;\\n\\nuint256 constant Conduit_execute_ConduitTransfer_offset_ptr = 0x04;\\nuint256 constant Conduit_execute_ConduitTransfer_length_ptr = 0x24;\\nuint256 constant Conduit_execute_transferItemType_ptr = 0x44;\\nuint256 constant Conduit_execute_transferToken_ptr = 0x64;\\nuint256 constant Conduit_execute_transferFrom_ptr = 0x84;\\nuint256 constant Conduit_execute_transferTo_ptr = 0xa4;\\nuint256 constant Conduit_execute_transferIdentifier_ptr = 0xc4;\\nuint256 constant Conduit_execute_transferAmount_ptr = 0xe4;\\n\\nuint256 constant OneConduitExecute_size = 0x104;\\n\\n// Sentinel value to indicate that the conduit accumulator is not armed.\\nuint256 constant AccumulatorDisarmed = 0x20;\\nuint256 constant AccumulatorArmed = 0x40;\\nuint256 constant Accumulator_conduitKey_ptr = 0x20;\\nuint256 constant Accumulator_selector_ptr = 0x40;\\nuint256 constant Accumulator_array_offset_ptr = 0x44;\\nuint256 constant Accumulator_array_length_ptr = 0x64;\\n\\nuint256 constant Accumulator_itemSizeOffsetDifference = 0x3c;\\n\\nuint256 constant Accumulator_array_offset = 0x20;\\nuint256 constant Conduit_transferItem_size = 0xc0;\\nuint256 constant Conduit_transferItem_token_ptr = 0x20;\\nuint256 constant Conduit_transferItem_from_ptr = 0x40;\\nuint256 constant Conduit_transferItem_to_ptr = 0x60;\\nuint256 constant Conduit_transferItem_identifier_ptr = 0x80;\\nuint256 constant Conduit_transferItem_amount_ptr = 0xa0;\\n\\n// Declare constant for errors related to amount derivation.\\n// error InexactFraction() @ AmountDerivationErrors.sol\\nuint256 constant InexactFraction_error_signature = (\\n    0xc63cf08900000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant InexactFraction_error_len = 0x04;\\n\\n// Declare constant for errors related to signature verification.\\nuint256 constant Ecrecover_precompile = 1;\\nuint256 constant Ecrecover_args_size = 0x80;\\nuint256 constant Signature_lower_v = 27;\\n\\n// error BadSignatureV(uint8) @ SignatureVerificationErrors.sol\\nuint256 constant BadSignatureV_error_signature = (\\n    0x1f003d0a00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant BadSignatureV_error_offset = 0x04;\\nuint256 constant BadSignatureV_error_length = 0x24;\\n\\n// error InvalidSigner() @ SignatureVerificationErrors.sol\\nuint256 constant InvalidSigner_error_signature = (\\n    0x815e1d6400000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant InvalidSigner_error_length = 0x04;\\n\\n// error InvalidSignature() @ SignatureVerificationErrors.sol\\nuint256 constant InvalidSignature_error_signature = (\\n    0x8baa579f00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant InvalidSignature_error_length = 0x04;\\n\\n// error BadContractSignature() @ SignatureVerificationErrors.sol\\nuint256 constant BadContractSignature_error_signature = (\\n    0x4f7fb80d00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant BadContractSignature_error_length = 0x04;\\n\\nuint256 constant NumBitsAfterSelector = 0xe0;\\n\\n// 69 is the lowest modulus for which the remainder\\n// of every selector other than the two match functions\\n// is greater than those of the match functions.\\nuint256 constant NonMatchSelector_MagicModulus = 69;\\n// Of the two match function selectors, the highest\\n// remainder modulo 69 is 29.\\nuint256 constant NonMatchSelector_MagicRemainder = 0x1d;\\n\",\"keccak256\":\"0xfbca8f942848c1ccbdfd92f61489474277e1013b2830a9d34068b63e1c68fca2\",\"license\":\"MIT\"},\"contracts/lib/ConsiderationEnums.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nenum ItemType {\\n    NATIVE,\\n    ERC20,\\n    ERC721,\\n    ERC1155\\n}\",\"keccak256\":\"0x6da855eedfe9a6360ac027a0b9ecebb6eacfd09fa5b0c5f55a141e21362808ea\",\"license\":\"MIT\"},\"contracts/lib/ConsiderationStructs.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nstruct OrderComponents {\\n    address offerer;\\n    address token;\\n    uint256 identifier;\\n    address currency;\\n    address artist;\\n    address platform;\\n    uint256 startTime;\\n    uint256 endTime;\\n    uint256 duration;\\n    uint256 periods;\\n    uint256 amount;\\n    uint256 ratio;\\n    uint256 royalty;\\n    uint256 fee;\\n    uint256 withdrawFee;\\n    uint256 salt;\\n    bytes32 conduitKey;\\n    uint256 counter;\\n}\\n\\nstruct OrderParameters {\\n    address offerer;    // 0x00\\n    address token;      // 0x20\\n    uint256 identifier; // 0x40\\n    address currency;   // 0x60\\n    address artist;     // 0x80\\n    address platform;   // 0xa0\\n    uint256 startTime;  // 0xc0\\n    uint256 endTime;    // 0xe0\\n    uint256 duration;   // 0x100\\n    uint256 periods;    // 0x120\\n    uint256 amount;     // 0x140\\n    uint256 ratio;      // 0x160\\n    uint256 royalty;    // 0x180\\n    uint256 fee;        // 0x1a0\\n    uint256 withdrawFee;// 0x1c0\\n    uint256 salt;       // 0x1e0\\n    bytes32 conduitKey; // 0x200\\n}\\n\\nstruct Order {\\n    OrderParameters parameters;\\n    bytes signature;\\n}\\n\\nstruct OrderStatus {\\n    bool isValidated;\\n    bool isCancelled;\\n    bool isFinalized;\\n    bool isBroken;\\n    address fulfiller;\\n    uint256 startedAt;\\n    uint256 shadowId;\\n    uint256 paidTimes;\\n}\",\"keccak256\":\"0xe0a311247127b5bbaf92415e092bec717f990ed8cfe6dec710046d755db38048\",\"license\":\"MIT\"},\"contracts/lib/CounterManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {\\n    ConsiderationEventsAndErrors\\n} from \\\"../interfaces/ConsiderationEventsAndErrors.sol\\\";\\n\\nimport { ReentrancyGuard } from \\\"./ReentrancyGuard.sol\\\";\\n\\ncontract CounterManager is ConsiderationEventsAndErrors, ReentrancyGuard {\\n\\n    mapping(address => uint256) private _counters;\\n\\n    function _incrementCounter() internal returns (uint256 newCounter) {\\n        _assertNonReentrant();\\n\\n        unchecked {\\n            newCounter = ++_counters[msg.sender];\\n        }\\n\\n        emit CounterIncremented(newCounter, msg.sender);\\n    }\\n\\n    function _getCounter(address offerer)\\n        internal\\n        view\\n        returns (uint256 currentCounter)\\n    {\\n        currentCounter = _counters[offerer];\\n    }\\n}\\n\",\"keccak256\":\"0xf07f27dab21fe6607342bc513064c81f10729cf4b9f41e6173ae66d6a4b7a25a\",\"license\":\"MIT\"},\"contracts/lib/Executor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { ConduitInterface } from \\\"../interfaces/ConduitInterface.sol\\\";\\n\\nimport { ConduitItemType } from \\\"../conduit/lib/ConduitEnums.sol\\\";\\n\\nimport { ItemType } from \\\"./ConsiderationEnums.sol\\\";\\n\\nimport { Verifiers } from \\\"./Verifiers.sol\\\";\\n\\nimport { TokenTransferrer } from \\\"./TokenTransferrer.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\n/**\\n * @title Executor\\n * @author 0age\\n * @notice Executor contains functions related to processing executions (i.e.\\n *         transferring items, either directly or via conduits).\\n */\\ncontract Executor is Verifiers, TokenTransferrer {\\n    /**\\n     * @dev Derive and set hashes, reference chainId, and associated domain\\n     *      separator during deployment.\\n     *\\n     * @param conduitController A contract that deploys conduits, or proxies\\n     *                          that may optionally be used to transfer approved\\n     *                          ERC20/721/1155 tokens.\\n     */\\n    constructor(address conduitController) Verifiers(conduitController) {}\\n\\n    /**\\n     * @dev Internal function to transfer an individual ERC721 or ERC1155 item\\n     *      from a given originator to a given recipient. The accumulator will\\n     *      be bypassed, meaning that this function should be utilized in cases\\n     *      where multiple item transfers can be accumulated into a single\\n     *      conduit call. Sufficient approvals must be set, either on the\\n     *      respective conduit or on this contract itself.\\n     *\\n     * @param itemType   The type of item to transfer, either ERC721 or ERC1155.\\n     * @param token      The token to transfer.\\n     * @param from       The originator of the transfer.\\n     * @param to         The recipient of the transfer.\\n     * @param identifier The tokenId to transfer.\\n     * @param amount     The amount to transfer.\\n     * @param conduitKey A bytes32 value indicating what corresponding conduit,\\n     *                   if any, to source token approvals from. The zero hash\\n     *                   signifies that no conduit should be used, with direct\\n     *                   approvals set on this contract.\\n     */\\n    function _transferIndividual721Or1155Item(\\n        ItemType itemType,\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount,\\n        bytes32 conduitKey\\n    ) internal {\\n        // Determine if the transfer is to be performed via a conduit.\\n        if (conduitKey != bytes32(0)) {\\n            // Use free memory pointer as calldata offset for the conduit call.\\n            uint256 callDataOffset;\\n\\n            // Utilize assembly to place each argument in free memory.\\n            assembly {\\n                // Retrieve the free memory pointer and use it as the offset.\\n                callDataOffset := mload(FreeMemoryPointerSlot)\\n\\n                // Write ConduitInterface.execute.selector to memory.\\n                mstore(callDataOffset, Conduit_execute_signature)\\n\\n                // Write the offset to the ConduitTransfer array in memory.\\n                mstore(\\n                    add(\\n                        callDataOffset,\\n                        Conduit_execute_ConduitTransfer_offset_ptr\\n                    ),\\n                    Conduit_execute_ConduitTransfer_ptr\\n                )\\n\\n                // Write the length of the ConduitTransfer array to memory.\\n                mstore(\\n                    add(\\n                        callDataOffset,\\n                        Conduit_execute_ConduitTransfer_length_ptr\\n                    ),\\n                    Conduit_execute_ConduitTransfer_length\\n                )\\n\\n                // Write the item type to memory.\\n                mstore(\\n                    add(callDataOffset, Conduit_execute_transferItemType_ptr),\\n                    itemType\\n                )\\n\\n                // Write the token to memory.\\n                mstore(\\n                    add(callDataOffset, Conduit_execute_transferToken_ptr),\\n                    token\\n                )\\n\\n                // Write the transfer source to memory.\\n                mstore(\\n                    add(callDataOffset, Conduit_execute_transferFrom_ptr),\\n                    from\\n                )\\n\\n                // Write the transfer recipient to memory.\\n                mstore(add(callDataOffset, Conduit_execute_transferTo_ptr), to)\\n\\n                // Write the token identifier to memory.\\n                mstore(\\n                    add(callDataOffset, Conduit_execute_transferIdentifier_ptr),\\n                    identifier\\n                )\\n\\n                // Write the transfer amount to memory.\\n                mstore(\\n                    add(callDataOffset, Conduit_execute_transferAmount_ptr),\\n                    amount\\n                )\\n            }\\n\\n            // Perform the call to the conduit.\\n            _callConduitUsingOffsets(\\n                conduitKey,\\n                callDataOffset,\\n                OneConduitExecute_size\\n            );\\n        } else {\\n            // Otherwise, determine whether it is an ERC721 or ERC1155 item.\\n            if (itemType == ItemType.ERC721) {\\n                // Ensure that exactly one 721 item is being transferred.\\n                if (amount != 1) {\\n                    revert InvalidERC721TransferAmount();\\n                }\\n\\n                // Perform transfer via the token contract directly.\\n                _performERC721Transfer(token, from, to, identifier);\\n            } else {\\n                // Perform transfer via the token contract directly.\\n                _performERC1155Transfer(token, from, to, identifier, amount);\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer Ether or other native tokens to a\\n     *      given recipient.\\n     *\\n     * @param to     The recipient of the transfer.\\n     * @param amount The amount to transfer.\\n     */\\n    function _transferEth(address payable to, uint256 amount) internal {\\n        // Ensure that the supplied amount is non-zero.\\n        _assertNonZeroAmount(amount);\\n\\n        // Declare a variable indicating whether the call was successful or not.\\n        bool success;\\n\\n        assembly {\\n            // Transfer the ETH and store if it succeeded or not.\\n            success := call(gas(), to, amount, 0, 0, 0, 0)\\n        }\\n\\n        // If the call fails...\\n        if (!success) {\\n            // Revert and pass the revert reason along if one was returned.\\n            _revertWithReasonIfOneIsReturned();\\n\\n            // Otherwise, revert with a generic error message.\\n            revert EtherTransferGenericFailure(to, amount);\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer ERC20 tokens from a given originator\\n     *      to a given recipient using a given conduit if applicable. Sufficient\\n     *      approvals must be set on this contract or on a respective conduit.\\n     *\\n     * @param token       The ERC20 token to transfer.\\n     * @param from        The originator of the transfer.\\n     * @param to          The recipient of the transfer.\\n     * @param amount      The amount to transfer.\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     */\\n    function _transferERC20(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        bytes32 conduitKey,\\n        bytes memory accumulator\\n    ) internal {\\n        // Ensure that the supplied amount is non-zero.\\n        _assertNonZeroAmount(amount);\\n\\n        // Trigger accumulated transfers if the conduits differ.\\n        _triggerIfArmedAndNotAccumulatable(accumulator, conduitKey);\\n\\n        // If no conduit has been specified...\\n        if (conduitKey == bytes32(0)) {\\n            // Perform the token transfer directly.\\n            _performERC20Transfer(token, from, to, amount);\\n        } else {\\n            // Insert the call to the conduit into the accumulator.\\n            _insert(\\n                conduitKey,\\n                accumulator,\\n                ConduitItemType.ERC20,\\n                token,\\n                from,\\n                to,\\n                uint256(0),\\n                amount\\n            );\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer a single ERC721 token from a given\\n     *      originator to a given recipient. Sufficient approvals must be set,\\n     *      either on the respective conduit or on this contract itself.\\n     *\\n     * @param token       The ERC721 token to transfer.\\n     * @param from        The originator of the transfer.\\n     * @param to          The recipient of the transfer.\\n     * @param identifier  The tokenId to transfer (must be 1 for ERC721).\\n     * @param amount      The amount to transfer.\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     */\\n    function _transferERC721(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount,\\n        bytes32 conduitKey,\\n        bytes memory accumulator\\n    ) internal {\\n        // Trigger accumulated transfers if the conduits differ.\\n        _triggerIfArmedAndNotAccumulatable(accumulator, conduitKey);\\n\\n        // If no conduit has been specified...\\n        if (conduitKey == bytes32(0)) {\\n            // Ensure that exactly one 721 item is being transferred.\\n            if (amount != 1) {\\n                revert InvalidERC721TransferAmount();\\n            }\\n\\n            // Perform transfer via the token contract directly.\\n            _performERC721Transfer(token, from, to, identifier);\\n        } else {\\n            // Insert the call to the conduit into the accumulator.\\n            _insert(\\n                conduitKey,\\n                accumulator,\\n                ConduitItemType.ERC721,\\n                token,\\n                from,\\n                to,\\n                identifier,\\n                amount\\n            );\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer ERC1155 tokens from a given originator\\n     *      to a given recipient. Sufficient approvals must be set, either on\\n     *      the respective conduit or on this contract itself.\\n     *\\n     * @param token       The ERC1155 token to transfer.\\n     * @param from        The originator of the transfer.\\n     * @param to          The recipient of the transfer.\\n     * @param identifier  The id to transfer.\\n     * @param amount      The amount to transfer.\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     */\\n    function _transferERC1155(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount,\\n        bytes32 conduitKey,\\n        bytes memory accumulator\\n    ) internal {\\n        // Ensure that the supplied amount is non-zero.\\n        _assertNonZeroAmount(amount);\\n\\n        // Trigger accumulated transfers if the conduits differ.\\n        _triggerIfArmedAndNotAccumulatable(accumulator, conduitKey);\\n\\n        // If no conduit has been specified...\\n        if (conduitKey == bytes32(0)) {\\n            // Perform transfer via the token contract directly.\\n            _performERC1155Transfer(token, from, to, identifier, amount);\\n        } else {\\n            // Insert the call to the conduit into the accumulator.\\n            _insert(\\n                conduitKey,\\n                accumulator,\\n                ConduitItemType.ERC1155,\\n                token,\\n                from,\\n                to,\\n                identifier,\\n                amount\\n            );\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to trigger a call to the conduit currently held by\\n     *      the accumulator if the accumulator contains item transfers (i.e. it\\n     *      is \\\"armed\\\") and the supplied conduit key does not match the key held\\n     *      by the accumulator.\\n     *\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     */\\n    function _triggerIfArmedAndNotAccumulatable(\\n        bytes memory accumulator,\\n        bytes32 conduitKey\\n    ) internal {\\n        // Retrieve the current conduit key from the accumulator.\\n        bytes32 accumulatorConduitKey = _getAccumulatorConduitKey(accumulator);\\n\\n        // Perform conduit call if the set key does not match the supplied key.\\n        if (accumulatorConduitKey != conduitKey) {\\n            _triggerIfArmed(accumulator);\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to trigger a call to the conduit currently held by\\n     *      the accumulator if the accumulator contains item transfers (i.e. it\\n     *      is \\\"armed\\\").\\n     *\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     */\\n    function _triggerIfArmed(bytes memory accumulator) internal {\\n        // Exit if the accumulator is not \\\"armed\\\".\\n        if (accumulator.length != AccumulatorArmed) {\\n            return;\\n        }\\n\\n        // Retrieve the current conduit key from the accumulator.\\n        bytes32 accumulatorConduitKey = _getAccumulatorConduitKey(accumulator);\\n\\n        // Perform conduit call.\\n        _trigger(accumulatorConduitKey, accumulator);\\n    }\\n\\n    /**\\n     * @dev Internal function to trigger a call to the conduit corresponding to\\n     *      a given conduit key, supplying all accumulated item transfers. The\\n     *      accumulator will be \\\"disarmed\\\" and reset in the process.\\n     *\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     */\\n    function _trigger(bytes32 conduitKey, bytes memory accumulator) internal {\\n        // Declare variables for offset in memory & size of calldata to conduit.\\n        uint256 callDataOffset;\\n        uint256 callDataSize;\\n\\n        // Call the conduit with all the accumulated transfers.\\n        assembly {\\n            // Call begins at third word; the first is length or \\\"armed\\\" status,\\n            // and the second is the current conduit key.\\n            callDataOffset := add(accumulator, TwoWords)\\n\\n            // 68 + items * 192\\n            callDataSize := add(\\n                Accumulator_array_offset_ptr,\\n                mul(\\n                    mload(add(accumulator, Accumulator_array_length_ptr)),\\n                    Conduit_transferItem_size\\n                )\\n            )\\n        }\\n\\n        // Call conduit derived from conduit key & supply accumulated transfers.\\n        _callConduitUsingOffsets(conduitKey, callDataOffset, callDataSize);\\n\\n        // Reset accumulator length to signal that it is now \\\"disarmed\\\".\\n        assembly {\\n            mstore(accumulator, AccumulatorDisarmed)\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to perform a call to the conduit corresponding to\\n     *      a given conduit key based on the offset and size of the calldata in\\n     *      question in memory.\\n     *\\n     * @param conduitKey     A bytes32 value indicating what corresponding\\n     *                       conduit, if any, to source token approvals from.\\n     *                       The zero hash signifies that no conduit should be\\n     *                       used, with direct approvals set on this contract.\\n     * @param callDataOffset The memory pointer where calldata is contained.\\n     * @param callDataSize   The size of calldata in memory.\\n     */\\n    function _callConduitUsingOffsets(\\n        bytes32 conduitKey,\\n        uint256 callDataOffset,\\n        uint256 callDataSize\\n    ) internal {\\n        // Derive the address of the conduit using the conduit key.\\n        address conduit = _deriveConduit(conduitKey);\\n\\n        bool success;\\n        bytes4 result;\\n\\n        // call the conduit.\\n        assembly {\\n            // Ensure first word of scratch space is empty.\\n            mstore(0, 0)\\n\\n            // Perform call, placing first word of return data in scratch space.\\n            success := call(\\n                gas(),\\n                conduit,\\n                0,\\n                callDataOffset,\\n                callDataSize,\\n                0,\\n                OneWord\\n            )\\n\\n            // Take value from scratch space and place it on the stack.\\n            result := mload(0)\\n        }\\n\\n        // If the call failed...\\n        if (!success) {\\n            // Pass along whatever revert reason was given by the conduit.\\n            _revertWithReasonIfOneIsReturned();\\n\\n            // Otherwise, revert with a generic error.\\n            revert InvalidCallToConduit(conduit);\\n        }\\n\\n        // Ensure result was extracted and matches EIP-1271 magic value.\\n        if (result != ConduitInterface.execute.selector) {\\n            revert InvalidConduit(conduitKey, conduit);\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal pure function to retrieve the current conduit key set for\\n     *      the accumulator.\\n     *\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     *\\n     * @return accumulatorConduitKey The conduit key currently set for the\\n     *                               accumulator.\\n     */\\n    function _getAccumulatorConduitKey(bytes memory accumulator)\\n        internal\\n        pure\\n        returns (bytes32 accumulatorConduitKey)\\n    {\\n        // Retrieve the current conduit key from the accumulator.\\n        assembly {\\n            accumulatorConduitKey := mload(\\n                add(accumulator, Accumulator_conduitKey_ptr)\\n            )\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal pure function to place an item transfer into an accumulator\\n     *      that collects a series of transfers to execute against a given\\n     *      conduit in a single call.\\n     *\\n     * @param conduitKey  A bytes32 value indicating what corresponding conduit,\\n     *                    if any, to source token approvals from. The zero hash\\n     *                    signifies that no conduit should be used, with direct\\n     *                    approvals set on this contract.\\n     * @param accumulator An open-ended array that collects transfers to execute\\n     *                    against a given conduit in a single call.\\n     * @param itemType    The type of the item to transfer.\\n     * @param token       The token to transfer.\\n     * @param from        The originator of the transfer.\\n     * @param to          The recipient of the transfer.\\n     * @param identifier  The tokenId to transfer.\\n     * @param amount      The amount to transfer.\\n     */\\n    function _insert(\\n        bytes32 conduitKey,\\n        bytes memory accumulator,\\n        ConduitItemType itemType,\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount\\n    ) internal pure {\\n        uint256 elements;\\n        // \\\"Arm\\\" and prime accumulator if it's not already armed. The sentinel\\n        // value is held in the length of the accumulator array.\\n        if (accumulator.length == AccumulatorDisarmed) {\\n            elements = 1;\\n            bytes4 selector = ConduitInterface.execute.selector;\\n            assembly {\\n                mstore(accumulator, AccumulatorArmed) // \\\"arm\\\" the accumulator.\\n                mstore(add(accumulator, Accumulator_conduitKey_ptr), conduitKey)\\n                mstore(add(accumulator, Accumulator_selector_ptr), selector)\\n                mstore(\\n                    add(accumulator, Accumulator_array_offset_ptr),\\n                    Accumulator_array_offset\\n                )\\n                mstore(add(accumulator, Accumulator_array_length_ptr), elements)\\n            }\\n        } else {\\n            // Otherwise, increase the number of elements by one.\\n            assembly {\\n                elements := add(\\n                    mload(add(accumulator, Accumulator_array_length_ptr)),\\n                    1\\n                )\\n                mstore(add(accumulator, Accumulator_array_length_ptr), elements)\\n            }\\n        }\\n\\n        // Insert the item.\\n        assembly {\\n            let itemPointer := sub(\\n                add(accumulator, mul(elements, Conduit_transferItem_size)),\\n                Accumulator_itemSizeOffsetDifference\\n            )\\n            mstore(itemPointer, itemType)\\n            mstore(add(itemPointer, Conduit_transferItem_token_ptr), token)\\n            mstore(add(itemPointer, Conduit_transferItem_from_ptr), from)\\n            mstore(add(itemPointer, Conduit_transferItem_to_ptr), to)\\n            mstore(\\n                add(itemPointer, Conduit_transferItem_identifier_ptr),\\n                identifier\\n            )\\n            mstore(add(itemPointer, Conduit_transferItem_amount_ptr), amount)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x4b3165cc66037d31d39c5ca2468c46202765bd3831c91a3b33e9c03a59b93a5d\",\"license\":\"MIT\"},\"contracts/lib/GettersAndDerivers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { OrderParameters } from \\\"./ConsiderationStructs.sol\\\";\\n\\nimport { ConsiderationBase } from \\\"./ConsiderationBase.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\ncontract GettersAndDerivers is ConsiderationBase {\\n\\n    constructor(address conduitController)\\n        ConsiderationBase(conduitController)\\n    {}\\n\\n    function _deriveOrderHash(\\n        OrderParameters memory orderParameters,\\n        uint256 counter\\n    ) internal view returns (bytes32 orderHash) {\\n        bytes32 typeHash = _ORDER_TYPEHASH;\\n\\n        assembly {\\n            let typeHashPtr := sub(orderParameters, OneWord)\\n\\n            let previousValue := mload(typeHashPtr)\\n\\n            mstore(typeHashPtr, typeHash)\\n\\n            let counterPtr := add(\\n                orderParameters,\\n                OrderParameters_counter_offset\\n            )\\n\\n            let counterDataPtr := mload(counterPtr)\\n\\n            mstore(counterPtr, counter)\\n\\n            orderHash := keccak256(typeHashPtr, EIP712_Order_size)\\n\\n            mstore(typeHashPtr, previousValue)\\n\\n            mstore(counterPtr, counterDataPtr)\\n        }\\n    }\\n\\n    function _deriveConduit(bytes32 conduitKey)\\n        internal\\n        view\\n        returns (address conduit)\\n    {\\n        // Read conduit controller address from runtime and place on the stack.\\n        address conduitController = address(_CONDUIT_CONTROLLER);\\n\\n        // Read conduit creation code hash from runtime and place on the stack.\\n        bytes32 conduitCreationCodeHash = _CONDUIT_CREATION_CODE_HASH;\\n\\n        // Leverage scratch space to perform an efficient hash.\\n        assembly {\\n            // Retrieve the free memory pointer; it will be replaced afterwards.\\n            let freeMemoryPointer := mload(FreeMemoryPointerSlot)\\n\\n            // Place the control character and the conduit controller in scratch\\n            // space; note that eleven bytes at the beginning are left unused.\\n            mstore(0, or(MaskOverByteTwelve, conduitController))\\n\\n            // Place the conduit key in the next region of scratch space.\\n            mstore(OneWord, conduitKey)\\n\\n            // Place conduit creation code hash in free memory pointer location.\\n            mstore(TwoWords, conduitCreationCodeHash)\\n\\n            // Derive conduit by hashing and applying a mask over last 20 bytes.\\n            conduit := and(\\n                // Hash the relevant region.\\n                keccak256(\\n                    // The region starts at memory pointer 11.\\n                    Create2AddressDerivation_ptr,\\n                    // The region is 85 bytes long (1 + 20 + 32 + 32).\\n                    Create2AddressDerivation_length\\n                ),\\n                // The address equals the last twenty bytes of the hash.\\n                MaskOverLastTwentyBytes\\n            )\\n\\n            // Restore the free memory pointer.\\n            mstore(FreeMemoryPointerSlot, freeMemoryPointer)\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal view function to get the EIP-712 domain separator. If the\\n     *      chainId matches the chainId set on deployment, the cached domain\\n     *      separator will be returned; otherwise, it will be derived from\\n     *      scratch.\\n     *\\n     * @return The domain separator.\\n     */\\n    function _domainSeparator() internal view returns (bytes32) {\\n        // prettier-ignore\\n        return block.chainid == _CHAIN_ID\\n            ? _DOMAIN_SEPARATOR\\n            : _deriveDomainSeparator();\\n    }\\n\\n    /**\\n     * @dev Internal view function to retrieve configuration information for\\n     *      this contract.\\n     *\\n     * @return version           The contract version.\\n     * @return domainSeparator   The domain separator for this contract.\\n     * @return conduitController The conduit Controller set for this contract.\\n     */\\n    function _information()\\n        internal\\n        view\\n        returns (\\n            string memory version,\\n            bytes32 domainSeparator,\\n            address conduitController\\n        )\\n    {\\n        // Derive the domain separator.\\n        domainSeparator = _domainSeparator();\\n\\n        // Declare variable as immutables cannot be accessed within assembly.\\n        conduitController = address(_CONDUIT_CONTROLLER);\\n\\n        // Allocate a string with the intended length.\\n        version = new string(Version_length);\\n\\n        // Set the version as data on the newly allocated string.\\n        assembly {\\n            mstore(add(version, OneWord), shl(Version_shift, Version))\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal pure function to efficiently derive an digest to sign for\\n     *      an order in accordance with EIP-712.\\n     *\\n     * @param domainSeparator The domain separator.\\n     * @param orderHash       The order hash.\\n     *\\n     * @return value The hash.\\n     */\\n    function _deriveEIP712Digest(bytes32 domainSeparator, bytes32 orderHash)\\n        internal\\n        pure\\n        returns (bytes32 value)\\n    {\\n        // Leverage scratch space to perform an efficient hash.\\n        assembly {\\n            // Place the EIP-712 prefix at the start of scratch space.\\n            mstore(0, EIP_712_PREFIX)\\n\\n            // Place the domain separator in the next region of scratch space.\\n            mstore(EIP712_DomainSeparator_offset, domainSeparator)\\n\\n            // Place the order hash in scratch space, spilling into the first\\n            // two bytes of the free memory pointer \\u2014 this should never be set\\n            // as memory cannot be expanded to that size, and will be zeroed out\\n            // after the hash is performed.\\n            mstore(EIP712_OrderHash_offset, orderHash)\\n\\n            // Hash the relevant region (65 bytes).\\n            value := keccak256(0, EIP712_DigestPayload_size)\\n\\n            // Clear out the dirtied bits in the memory pointer.\\n            mstore(EIP712_OrderHash_offset, 0)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5c0866572e7dfe34edad443a82e35851c4d3631cc9c5957994d68e41516dd6c4\",\"license\":\"MIT\"},\"contracts/lib/LowLevelHelpers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\n/**\\n * @title LowLevelHelpers\\n * @author 0age\\n * @notice LowLevelHelpers contains logic for performing various low-level\\n *         operations.\\n */\\ncontract LowLevelHelpers {\\n    /**\\n     * @dev Internal view function to staticcall an arbitrary target with given\\n     *      calldata. Note that no data is written to memory and no contract\\n     *      size check is performed.\\n     *\\n     * @param target   The account to staticcall.\\n     * @param callData The calldata to supply when staticcalling the target.\\n     *\\n     * @return success The status of the staticcall to the target.\\n     */\\n    function _staticcall(address target, bytes memory callData)\\n        internal\\n        view\\n        returns (bool success)\\n    {\\n        assembly {\\n            // Perform the staticcall.\\n            success := staticcall(\\n                gas(),\\n                target,\\n                add(callData, OneWord),\\n                mload(callData),\\n                0,\\n                0\\n            )\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal view function to revert and pass along the revert reason if\\n     *      data was returned by the last call and that the size of that data\\n     *      does not exceed the currently allocated memory size.\\n     */\\n    function _revertWithReasonIfOneIsReturned() internal view {\\n        assembly {\\n            // If it returned a message, bubble it up as long as sufficient gas\\n            // remains to do so:\\n            if returndatasize() {\\n                // Ensure that sufficient gas is available to copy returndata\\n                // while expanding memory where necessary. Start by computing\\n                // the word size of returndata and allocated memory.\\n                let returnDataWords := div(\\n                    add(returndatasize(), AlmostOneWord),\\n                    OneWord\\n                )\\n\\n                // Note: use the free memory pointer in place of msize() to work\\n                // around a Yul warning that prevents accessing msize directly\\n                // when the IR pipeline is activated.\\n                let msizeWords := div(mload(FreeMemoryPointerSlot), OneWord)\\n\\n                // Next, compute the cost of the returndatacopy.\\n                let cost := mul(CostPerWord, returnDataWords)\\n\\n                // Then, compute cost of new memory allocation.\\n                if gt(returnDataWords, msizeWords) {\\n                    cost := add(\\n                        cost,\\n                        add(\\n                            mul(sub(returnDataWords, msizeWords), CostPerWord),\\n                            div(\\n                                sub(\\n                                    mul(returnDataWords, returnDataWords),\\n                                    mul(msizeWords, msizeWords)\\n                                ),\\n                                MemoryExpansionCoefficient\\n                            )\\n                        )\\n                    )\\n                }\\n\\n                // Finally, add a small constant and compare to gas remaining;\\n                // bubble up the revert data if enough gas is still available.\\n                if lt(add(cost, ExtraGasBuffer), gas()) {\\n                    // Copy returndata to memory; overwrite existing memory.\\n                    returndatacopy(0, 0, returndatasize())\\n\\n                    // Revert, specifying memory region with copied returndata.\\n                    revert(0, returndatasize())\\n                }\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal pure function to determine if the first word of returndata\\n     *      matches an expected magic value.\\n     *\\n     * @param expected The expected magic value.\\n     *\\n     * @return A boolean indicating whether the expected value matches the one\\n     *         located in the first word of returndata.\\n     */\\n    function _doesNotMatchMagic(bytes4 expected) internal pure returns (bool) {\\n        // Declare a variable for the value held by the return data buffer.\\n        bytes4 result;\\n\\n        // Utilize assembly in order to read directly from returndata buffer.\\n        assembly {\\n            // Only put result on stack if return data is exactly one word.\\n            if eq(returndatasize(), OneWord) {\\n                // Copy the word directly from return data into scratch space.\\n                returndatacopy(0, 0, OneWord)\\n\\n                // Take value from scratch space and place it on the stack.\\n                result := mload(0)\\n            }\\n        }\\n\\n        // Return a boolean indicating whether expected and located value match.\\n        return result != expected;\\n    }\\n}\\n\",\"keccak256\":\"0x57700a6f8f18d1cdfc8492724ef3b9f89aa143382f13794489df70c1f3fc027c\",\"license\":\"MIT\"},\"contracts/lib/OrderFulfiller.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { ConduitInterface } from \\\"../interfaces/ConduitInterface.sol\\\";\\n\\nimport {\\n    ItemType\\n} from \\\"./ConsiderationEnums.sol\\\";\\n\\nimport {\\n    Order,\\n    OrderParameters\\n} from \\\"./ConsiderationStructs.sol\\\";\\n\\nimport { OrderValidator } from \\\"./OrderValidator.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\ncontract OrderFulfiller is OrderValidator {\\n\\n    struct Dispatch {\\n        uint256 payment;\\n        uint256 toOfferer;\\n        uint256 toPlatform;\\n        uint256 toArtist;\\n    }\\n\\n    constructor(address conduitController, address shadowToken) OrderValidator(conduitController, shadowToken) {}\\n\\n    function _calculateDispatch(\\n        OrderParameters calldata params,\\n        uint256 payTimes,\\n        bool isFirst,\\n        bool isFinalize\\n    )\\n        internal\\n        pure\\n        returns (Dispatch memory ret)\\n    {\\n        uint256 royalty;\\n        uint256 paidTimes = params.periods - payTimes;\\n\\n        ret.toPlatform = params.withdrawFee;\\n        if (isFinalize) {\\n            royalty = params.royalty - paidTimes * (params.royalty / params.periods);\\n            ret.payment = params.amount - paidTimes* (params.amount / params.periods);\\n            ret.toOfferer = params.amount - (params.amount / params.periods) * params.ratio / 10000 * paidTimes - ret.toPlatform - royalty;\\n            ret.toArtist = params.royalty;\\n        } else {\\n            royalty = payTimes * (params.royalty / params.periods);\\n            ret.payment = payTimes * (params.amount / params.periods);            \\n            ret.toOfferer = ret.payment * params.ratio / 10000 - ret.toPlatform - royalty;\\n            if (isFirst) {\\n                ret.payment += params.fee;\\n                ret.toPlatform += params.fee;\\n            }\\n        }\\n    }\\n\\n    function _validateAndFulfillOrder(Order calldata order, bytes32 fulfillerConduitKey)\\n        internal\\n        returns (bool)\\n    {\\n        (\\n            bytes32 orderHash,\\n            bool valid,\\n            uint256 shadowId\\n        ) = _validateOrderAndUpdateStatus(\\n            order,\\n            true\\n        );\\n\\n        if (!valid) {\\n            return false;\\n        }\\n\\n        OrderParameters calldata orderParameters = order.parameters;\\n        Dispatch memory dispatch = _calculateDispatch(orderParameters, 1, true, false);\\n\\n        if (orderParameters.currency == address(0)) {\\n            _transferIndividual721Or1155Item(\\n                ItemType.ERC721,\\n                orderParameters.token,\\n                orderParameters.offerer,\\n                address(this),\\n                orderParameters.identifier,\\n                1,\\n                orderParameters.conduitKey\\n            );\\n\\n            _transferEthAndFinalize(orderParameters, dispatch);\\n        } else {\\n            bytes memory accumulator = new bytes(AccumulatorDisarmed);\\n            _transferERC721(\\n                orderParameters.token,\\n                orderParameters.offerer,\\n                address(this),\\n                orderParameters.identifier,\\n                1,\\n                orderParameters.conduitKey,\\n                accumulator\\n            );\\n\\n            _transferERC20AndFinalize(\\n                orderParameters,\\n                dispatch,\\n                fulfillerConduitKey,\\n                accumulator\\n            );\\n        }\\n\\n        emit OrderFulfilled(\\n            orderHash,\\n            orderParameters.offerer,\\n            shadowId\\n        );\\n\\n        return true;\\n    }\\n\\n    function _validateAndRepayOrder(OrderParameters calldata parameters, bytes32 fulfillerConduitKey, uint256 payTimes)\\n        internal\\n        returns (bool)\\n    {\\n        bytes32 orderHash;\\n        address fulfiller;\\n        bool isFinalized;\\n        {\\n            bool valid;\\n            (\\n                orderHash,\\n                fulfiller,\\n                valid,\\n                isFinalized\\n            ) = _validateOrderAndUpdateRepayStatus(\\n                parameters,\\n                payTimes,\\n                true\\n            );\\n\\n            if (!valid) {\\n                return false;\\n            }\\n        }\\n\\n        Dispatch memory dispatch = _calculateDispatch(parameters, payTimes, false, isFinalized);\\n\\n        if (parameters.currency == address(0)) {\\n            _transferEthAndFinalize(parameters, dispatch);\\n        } else {\\n            bytes memory accumulator = new bytes(AccumulatorDisarmed);\\n            _transferERC20AndFinalize(\\n                parameters,\\n                dispatch,\\n                fulfillerConduitKey,\\n                accumulator\\n            );\\n        }\\n\\n        if (isFinalized) {\\n            _transferIndividual721Or1155Item(\\n                ItemType.ERC721,\\n                parameters.token,\\n                address(this),\\n                fulfiller,\\n                parameters.identifier,\\n                1,\\n                bytes32(0)\\n            );\\n        }\\n\\n        emit OrderRepaid(\\n            orderHash,\\n            payTimes,\\n            isFinalized\\n        );\\n\\n        return true;\\n    }\\n\\n    function _validateAndBreakOrder(OrderParameters calldata parameters)\\n        internal\\n        returns (bool)\\n    {\\n        (\\n            bytes32 orderHash,\\n            uint256 paidTimes,\\n            bool valid\\n        ) = _validateOrderAndUpdateBreakStatus(\\n            parameters,\\n            true\\n        );\\n\\n        if (!valid) {\\n            return false;\\n        }\\n\\n        _transferIndividual721Or1155Item(\\n            ItemType.ERC721,\\n            parameters.token,\\n            address(this),\\n            parameters.offerer,\\n            parameters.identifier,\\n            1,\\n            bytes32(0)\\n        );\\n\\n        if (parameters.currency == address(0)) {\\n            _transferEthBroken(parameters, paidTimes);\\n        } else {\\n            _transferERC20Broken(\\n                parameters,\\n                paidTimes\\n            );\\n        }\\n\\n        emit OrderBroken(\\n            orderHash,\\n            parameters.offerer\\n        );\\n\\n        return true;\\n    }\\n\\n    function _transferEthBroken(\\n        OrderParameters calldata orderParameters,\\n        uint256 paidTimes\\n    ) internal {\\n        _transferEth(\\n            payable(orderParameters.offerer),\\n            orderParameters.royalty / orderParameters.periods * paidTimes\\n        );\\n        uint256 toPlatform = orderParameters.amount / orderParameters.periods * paidTimes;\\n        toPlatform = toPlatform - toPlatform * orderParameters.ratio / 10000;\\n        _transferEth(\\n            payable(orderParameters.platform),\\n            toPlatform\\n        );\\n    }\\n\\n    function _transferERC20Broken(\\n        OrderParameters calldata parameters,\\n        uint256 paidTimes\\n    ) internal {\\n        _performSelfERC20Transfer(parameters.currency, parameters.offerer, parameters.royalty / parameters.periods * paidTimes);\\n\\n        uint256 toPlatform = parameters.amount / parameters.periods * paidTimes;\\n        toPlatform = toPlatform - toPlatform * parameters.ratio / 10000;\\n        _performSelfERC20Transfer(parameters.currency, parameters.platform, toPlatform);\\n    }\\n\\n    function _transferEthAndFinalize(\\n        OrderParameters calldata orderParameters,\\n        Dispatch memory dispatch\\n    ) internal {\\n        uint256 etherRemaining = msg.value;\\n\\n        if (dispatch.payment > etherRemaining) {\\n            revert InsufficientEtherSupplied();\\n        }\\n\\n        _transferEth(\\n            payable(orderParameters.offerer),\\n            dispatch.toOfferer\\n        );\\n\\n        _transferEth(\\n            payable(orderParameters.platform),\\n            dispatch.toPlatform\\n        );\\n\\n        if (dispatch.toArtist > 0) {\\n            _transferEth(\\n                payable(orderParameters.artist),\\n                dispatch.toArtist\\n            );\\n        }\\n\\n        etherRemaining -= dispatch.payment;\\n\\n        if (etherRemaining > 0) {\\n            unchecked {\\n                _transferEth(payable(msg.sender), etherRemaining);\\n            }\\n        }\\n    }\\n\\n    function _transferERC20AndFinalize(\\n        OrderParameters calldata parameters,\\n        Dispatch memory dispatch,\\n        bytes32 conduitKey,\\n        bytes memory accumulator\\n    ) internal {\\n        address from = msg.sender;\\n        address token = parameters.currency;\\n\\n        _transferERC20(\\n            token,\\n            from,\\n            parameters.platform,\\n            dispatch.toPlatform,\\n            conduitKey,\\n            accumulator\\n        );\\n\\n        if (dispatch.toArtist > 0) {\\n            _transferERC20(\\n                token,\\n                from,\\n                parameters.artist,\\n                dispatch.toArtist,\\n                conduitKey,\\n                accumulator\\n            );\\n        }\\n\\n        uint256 left = dispatch.payment - dispatch.toPlatform - dispatch.toArtist;\\n        if (left >= dispatch.toOfferer) {\\n            _transferERC20(\\n                token,\\n                from,\\n                parameters.offerer,\\n                dispatch.toOfferer,\\n                conduitKey,\\n                accumulator\\n            );\\n            left -= dispatch.toOfferer;\\n            if (left > 0) {\\n                _transferERC20(\\n                    token,\\n                    from,\\n                    address(this),\\n                    left,\\n                    conduitKey,\\n                    accumulator\\n                );\\n            }\\n            _triggerIfArmed(accumulator);\\n        } else {\\n            _transferERC20(\\n                token,\\n                from,\\n                parameters.offerer,\\n                left,\\n                conduitKey,\\n                accumulator\\n            );\\n            _triggerIfArmed(accumulator);\\n\\n            _performSelfERC20Transfer(token, parameters.offerer, dispatch.toOfferer - left);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xcc6c4cf70611dcb3ddb97629ce2d8650466b0d48a8889efbc8baf328535f523d\",\"license\":\"MIT\"},\"contracts/lib/OrderValidator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {\\n    OrderParameters,\\n    Order,\\n    OrderComponents,\\n    OrderStatus\\n} from \\\"./ConsiderationStructs.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\nimport { Executor } from \\\"./Executor.sol\\\";\\nimport { Shadow } from \\\"./Shadow.sol\\\";\\n\\ncontract OrderValidator is Executor, Shadow {\\n\\n    mapping(bytes32 => OrderStatus) private _orderStatus;\\n\\n    constructor(address conduitController, address shadowToken) Executor(conduitController) Shadow(shadowToken) {}\\n\\n    function _validateOrderAndUpdateStatus(\\n        Order calldata order,\\n        bool revertOnInvalid\\n    )\\n        internal\\n        returns (\\n            bytes32 orderHash,\\n            bool valid,\\n            uint256 shadowId\\n        )\\n    {\\n        OrderParameters calldata orderParameters = order.parameters;\\n        if (\\n            !_verifyTime(\\n                orderParameters.startTime,\\n                orderParameters.endTime,\\n                revertOnInvalid\\n            )\\n        ) {\\n            return (bytes32(0), false, 0);\\n        }\\n\\n        if (orderParameters.periods < 2) {\\n            if (revertOnInvalid) {\\n                revert InvalidOrderParameters();\\n            }\\n            return (bytes32(0), false, 0);\\n        }\\n\\n        orderHash = _deriveOrderHash(\\n            orderParameters,\\n            _getCounter(orderParameters.offerer)\\n        );\\n\\n        OrderStatus storage orderStatus = _orderStatus[orderHash];\\n\\n        if (\\n            !_verifyOrderStatus(\\n                orderHash,\\n                orderStatus,\\n                true,\\n                revertOnInvalid\\n            )\\n        ) {\\n            return (orderHash, false, 0);\\n        }\\n\\n        if (!orderStatus.isValidated) {\\n            _verifySignature(\\n                orderParameters.offerer,\\n                orderHash,\\n                order.signature\\n            );\\n        }\\n\\n        shadowId = _mintToken(\\n            msg.sender,\\n            orderParameters.token,\\n            orderParameters.identifier,\\n            orderParameters.duration\\n        );\\n\\n        orderStatus.isValidated = true;\\n        orderStatus.isCancelled = false;\\n        orderStatus.isBroken = false;\\n        orderStatus.fulfiller = msg.sender;\\n        orderStatus.startedAt = block.timestamp;\\n        orderStatus.shadowId = shadowId;\\n        orderStatus.paidTimes = 1;\\n\\n        valid = true;\\n    }\\n\\n    function _validateOrderAndUpdateRepayStatus(\\n        OrderParameters calldata parameters,\\n        uint256 payTimes,\\n        bool revertOnInvalid\\n    )\\n        internal\\n        returns (\\n            bytes32 orderHash,\\n            address fulfiller,\\n            bool valid,\\n            bool isFinalized\\n        )\\n    {\\n        orderHash = _deriveOrderHash(\\n            parameters,\\n            _getCounter(parameters.offerer)\\n        );\\n\\n        OrderStatus storage orderStatus = _orderStatus[orderHash];\\n        if (!orderStatus.isValidated) {\\n            if (revertOnInvalid) {\\n                revert OrderNotValidated(orderHash);\\n            }\\n            return (orderHash, address(0), false, false);\\n        }\\n\\n        if (\\n            !_verifyOrderStatus(\\n                orderHash,\\n                orderStatus,\\n                false,\\n                revertOnInvalid\\n            )\\n        ) {\\n            return (orderHash, address(0), false, false);\\n        }\\n\\n        if (orderStatus.paidTimes + payTimes > parameters.periods || payTimes < 1) {\\n            if (revertOnInvalid) {\\n                revert OrderInvalidRepayParameters(orderHash);\\n            }\\n            return (orderHash, address(0), false, false);\\n        }\\n\\n        if (orderStatus.startedAt + orderStatus.paidTimes * parameters.duration < block.timestamp) {\\n            if (revertOnInvalid) {\\n                revert OrderExpired(orderHash);\\n            }\\n            return (orderHash, address(0), false, false);\\n        }\\n\\n        orderStatus.paidTimes += payTimes;\\n        if (orderStatus.paidTimes == parameters.periods) {\\n            orderStatus.isFinalized = true;\\n            isFinalized = true;\\n            _burnToken(orderStatus.shadowId);\\n        } else {\\n            _extendToken(\\n                orderStatus.fulfiller,\\n                orderStatus.shadowId,\\n                orderStatus.startedAt + orderStatus.paidTimes * parameters.duration\\n            );\\n        }\\n\\n        valid = true;\\n        fulfiller = orderStatus.fulfiller;\\n    }\\n\\n    function _validateOrderAndUpdateBreakStatus(\\n        OrderParameters calldata parameters,\\n        bool revertOnInvalid\\n    )\\n        internal\\n        returns (\\n            bytes32 orderHash,\\n            uint256 paidTimes,\\n            bool valid\\n        )\\n    {\\n        orderHash = _deriveOrderHash(\\n            parameters,\\n            _getCounter(parameters.offerer)\\n        );\\n\\n        OrderStatus storage orderStatus = _orderStatus[orderHash];\\n        if (!orderStatus.isValidated) {\\n            if (revertOnInvalid) {\\n                revert OrderNotValidated(orderHash);\\n            }\\n            return (orderHash, paidTimes, false);\\n        }\\n\\n        paidTimes = orderStatus.paidTimes;\\n\\n        if (\\n            !_verifyOrderStatus(\\n                orderHash,\\n                orderStatus,\\n                false,\\n                revertOnInvalid\\n            )\\n        ) {\\n            return (orderHash, paidTimes, false);\\n        }\\n\\n        if (orderStatus.startedAt + paidTimes * parameters.duration > block.timestamp) {\\n            if (revertOnInvalid) {\\n                revert OrderNotExpired(orderHash);\\n            }\\n            return (orderHash, paidTimes, false);\\n        }\\n\\n        _burnToken(orderStatus.shadowId);\\n\\n        orderStatus.isFinalized = true;\\n        orderStatus.isBroken = true;\\n        valid = true;\\n    }\\n\\n    function _cancel(OrderComponents[] calldata orders)\\n        internal\\n        returns (bool cancelled)\\n    {\\n        // Ensure that the reentrancy guard is not currently set.\\n        _assertNonReentrant();\\n\\n        // Declare variables outside of the loop.\\n        OrderStatus storage orderStatus;\\n        address offerer;\\n\\n        // Skip overflow check as for loop is indexed starting at zero.\\n        unchecked {\\n            // Read length of the orders array from memory and place on stack.\\n            uint256 totalOrders = orders.length;\\n\\n            // Iterate over each order.\\n            for (uint256 i = 0; i < totalOrders; ) {\\n                // Retrieve the order.\\n                OrderComponents calldata order = orders[i];\\n\\n                offerer = order.offerer;\\n\\n                if (msg.sender != offerer) {\\n                    revert InvalidCanceller();\\n                }\\n\\n                // Derive order hash using the order parameters and the counter.\\n                bytes32 orderHash = _deriveOrderHash(\\n                    OrderParameters(\\n                        offerer,\\n                        order.token,\\n                        order.identifier,\\n                        order.currency,\\n                        order.artist,\\n                        order.platform,\\n                        order.startTime,\\n                        order.endTime,\\n                        order.duration,\\n                        order.periods,\\n                        order.amount,\\n                        order.ratio,\\n                        order.royalty,\\n                        order.fee,\\n                        order.withdrawFee,\\n                        order.salt,\\n                        order.conduitKey\\n                    ),\\n                    order.counter\\n                );\\n\\n                // Retrieve the order status using the derived order hash.\\n                orderStatus = _orderStatus[orderHash];\\n\\n                if (orderStatus.startedAt > 0) {\\n                    revert OrderAlreadyStarted(orderHash);\\n                }\\n\\n                // Update the order status as not valid and cancelled.\\n                orderStatus.isValidated = false;\\n                orderStatus.isCancelled = true;\\n\\n                // Emit an event signifying that the order has been cancelled.\\n                emit OrderCancelled(orderHash, offerer);\\n\\n                // Increment counter inside body of loop for gas efficiency.\\n                ++i;\\n            }\\n        }\\n\\n        // Return a boolean indicating that orders were successfully cancelled.\\n        cancelled = true;\\n    }\\n\\n    function _validate(Order[] calldata orders)\\n        internal\\n        returns (bool validated)\\n    {\\n        // Ensure that the reentrancy guard is not currently set.\\n        _assertNonReentrant();\\n\\n        // Declare variables outside of the loop.\\n        OrderStatus storage orderStatus;\\n        bytes32 orderHash;\\n        address offerer;\\n\\n        // Skip overflow check as for loop is indexed starting at zero.\\n        unchecked {\\n            // Read length of the orders array from memory and place on stack.\\n            uint256 totalOrders = orders.length;\\n\\n            // Iterate over each order.\\n            for (uint256 i = 0; i < totalOrders; ) {\\n                // Retrieve the order.\\n                Order calldata order = orders[i];\\n\\n                // Retrieve the order parameters.\\n                OrderParameters calldata orderParameters = order.parameters;\\n\\n                // Move offerer from memory to the stack.\\n                offerer = orderParameters.offerer;\\n\\n                // Get current counter & use it w/ params to derive order hash.\\n                orderHash = _deriveOrderHash(\\n                    OrderParameters(\\n                        offerer,\\n                        orderParameters.token,\\n                        orderParameters.identifier,\\n                        orderParameters.currency,\\n                        orderParameters.artist,\\n                        orderParameters.platform,\\n                        orderParameters.startTime,\\n                        orderParameters.endTime,\\n                        orderParameters.duration,\\n                        orderParameters.periods,\\n                        orderParameters.amount,\\n                        orderParameters.ratio,\\n                        orderParameters.royalty,\\n                        orderParameters.fee,\\n                        orderParameters.withdrawFee,\\n                        orderParameters.salt,\\n                        orderParameters.conduitKey\\n                    ),\\n                    _getCounter(orderParameters.offerer)\\n                );\\n\\n                // Retrieve the order status using the derived order hash.\\n                orderStatus = _orderStatus[orderHash];\\n\\n                // Ensure order is fillable and retrieve the filled amount.\\n                _verifyOrderStatus(\\n                    orderHash,\\n                    orderStatus,\\n                    true, // Signifies that partially filled orders are valid.\\n                    true // Signifies to revert if the order is invalid.\\n                );\\n\\n                // If the order has not already been validated...\\n                if (!orderStatus.isValidated) {\\n                    // Verify the supplied signature.\\n                    _verifySignature(offerer, orderHash, order.signature);\\n\\n                    // Update order status to mark the order as valid.\\n                    orderStatus.isValidated = true;\\n\\n                    // Emit an event signifying the order has been validated.\\n                    emit OrderValidated(\\n                        orderHash,\\n                        offerer\\n                    );\\n                }\\n\\n                // Increment counter inside body of the loop for gas efficiency.\\n                ++i;\\n            }\\n        }\\n\\n        // Return a boolean indicating that orders were successfully validated.\\n        validated = true;\\n    }\\n\\n    function _getOrderStatus(bytes32 orderHash)\\n        internal\\n        view\\n        returns (\\n            bool isValidated,\\n            bool isCancelled,\\n            bool isFinalized,\\n            bool isBroken,\\n            address fulfiller,\\n            uint256 startedAt,\\n            uint256 shadowId,\\n            uint256 paidTimes\\n        )\\n    {\\n        OrderStatus storage orderStatus = _orderStatus[orderHash];\\n        return (\\n            orderStatus.isValidated,\\n            orderStatus.isCancelled,\\n            orderStatus.isFinalized,\\n            orderStatus.isBroken,\\n            orderStatus.fulfiller,\\n            orderStatus.startedAt,\\n            orderStatus.shadowId,\\n            orderStatus.paidTimes\\n        );\\n    }\\n}\\n\",\"keccak256\":\"0x4076a1d39f964a1c535665dcacbe5a04e9b001273db63b3846bf5eec9c9e88bd\",\"license\":\"MIT\"},\"contracts/lib/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { ReentrancyErrors } from \\\"../interfaces/ReentrancyErrors.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\n/**\\n * @title ReentrancyGuard\\n * @author 0age\\n * @notice ReentrancyGuard contains a storage variable and related functionality\\n *         for protecting against reentrancy.\\n */\\ncontract ReentrancyGuard is ReentrancyErrors {\\n    // Prevent reentrant calls on protected functions.\\n    uint256 private _reentrancyGuard;\\n\\n    /**\\n     * @dev Initialize the reentrancy guard during deployment.\\n     */\\n    constructor() {\\n        // Initialize the reentrancy guard in a cleared state.\\n        _reentrancyGuard = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Internal function to ensure that the sentinel value for the\\n     *      reentrancy guard is not currently set and, if not, to set the\\n     *      sentinel value for the reentrancy guard.\\n     */\\n    function _setReentrancyGuard() internal {\\n        // Ensure that the reentrancy guard is not already set.\\n        _assertNonReentrant();\\n\\n        // Set the reentrancy guard.\\n        _reentrancyGuard = _ENTERED;\\n    }\\n\\n    /**\\n     * @dev Internal function to unset the reentrancy guard sentinel value.\\n     */\\n    function _clearReentrancyGuard() internal {\\n        // Clear the reentrancy guard.\\n        _reentrancyGuard = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Internal view function to ensure that the sentinel value for the\\n            reentrancy guard is not currently set.\\n     */\\n    function _assertNonReentrant() internal view {\\n        // Ensure that the reentrancy guard is not currently set.\\n        if (_reentrancyGuard != _NOT_ENTERED) {\\n            revert NoReentrantCalls();\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa52711c788a24071f8a872ea5ee3030f0f8f592abf8f0d5577707e585a7628d5\",\"license\":\"MIT\"},\"contracts/lib/Shadow.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { IERC4907A } from \\\"erc721a/contracts/extensions/IERC4907A.sol\\\";\\n\\ninterface IMintBurnableERC4907 {\\n    function mint(address to, address tokenAddress, uint256 tokenId) external returns (uint256);\\n    function burn(uint256 tokenId) external;\\n}\\n\\ncontract Shadow {\\n    \\n    address public immutable shadowToken;\\n\\n    constructor(address _token) {\\n        shadowToken = _token;\\n    }\\n\\n    function _mintToken(\\n        address to,\\n        address token,\\n        uint256 identifier,\\n        uint256 duration\\n    ) internal returns (uint256) {\\n        uint256 tid = IMintBurnableERC4907(shadowToken).mint(address(this), token, identifier);\\n        IERC4907A(shadowToken).setUser(tid, to, uint64(duration + block.timestamp));\\n        return tid;\\n    }\\n\\n    function _extendToken(address to, uint256 tokenId, uint256 expires) internal {\\n        IERC4907A(shadowToken).setUser(tokenId, to, uint64(expires));\\n    }\\n\\n    function _burnToken(uint256 tokenId) internal {\\n        IMintBurnableERC4907(shadowToken).burn(tokenId);\\n    }\\n}\",\"keccak256\":\"0x71b95c35b423d619bb4583e8a39c0227fd730c090d4b7071e79c8cac87910e8d\",\"license\":\"MIT\"},\"contracts/lib/SignatureVerification.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { EIP1271Interface } from \\\"../interfaces/EIP1271Interface.sol\\\";\\n\\nimport {\\n    SignatureVerificationErrors\\n} from \\\"../interfaces/SignatureVerificationErrors.sol\\\";\\n\\nimport { LowLevelHelpers } from \\\"./LowLevelHelpers.sol\\\";\\n\\nimport \\\"./ConsiderationConstants.sol\\\";\\n\\n/**\\n * @title SignatureVerification\\n * @author 0age\\n * @notice SignatureVerification contains logic for verifying signatures.\\n */\\ncontract SignatureVerification is SignatureVerificationErrors, LowLevelHelpers {\\n    /**\\n     * @dev Internal view function to verify the signature of an order. An\\n     *      ERC-1271 fallback will be attempted if either the signature length\\n     *      is not 64 or 65 bytes or if the recovered signer does not match the\\n     *      supplied signer.\\n     *\\n     * @param signer    The signer for the order.\\n     * @param digest    The digest to verify the signature against.\\n     * @param signature A signature from the signer indicating that the order\\n     *                  has been approved.\\n     */\\n    function _assertValidSignature(\\n        address signer,\\n        bytes32 digest,\\n        bytes memory signature\\n    ) internal view {\\n        // Declare value for ecrecover equality or 1271 call success status.\\n        bool success;\\n\\n        // Utilize assembly to perform optimized signature verification check.\\n        assembly {\\n            // Ensure that first word of scratch space is empty.\\n            mstore(0, 0)\\n\\n            // Declare value for v signature parameter.\\n            let v\\n\\n            // Get the length of the signature.\\n            let signatureLength := mload(signature)\\n\\n            // Get the pointer to the value preceding the signature length.\\n            // This will be used for temporary memory overrides - either the\\n            // signature head for isValidSignature or the digest for ecrecover.\\n            let wordBeforeSignaturePtr := sub(signature, OneWord)\\n\\n            // Cache the current value behind the signature to restore it later.\\n            let cachedWordBeforeSignature := mload(wordBeforeSignaturePtr)\\n\\n            // Declare lenDiff + recoveredSigner scope to manage stack pressure.\\n            {\\n                // Take the difference between the max ECDSA signature length\\n                // and the actual signature length. Overflow desired for any\\n                // values > 65. If the diff is not 0 or 1, it is not a valid\\n                // ECDSA signature - move on to EIP1271 check.\\n                let lenDiff := sub(ECDSA_MaxLength, signatureLength)\\n\\n                // Declare variable for recovered signer.\\n                let recoveredSigner\\n\\n                // If diff is 0 or 1, it may be an ECDSA signature.\\n                // Try to recover signer.\\n                if iszero(gt(lenDiff, 1)) {\\n                    // Read the signature `s` value.\\n                    let originalSignatureS := mload(\\n                        add(signature, ECDSA_signature_s_offset)\\n                    )\\n\\n                    // Read the first byte of the word after `s`. If the\\n                    // signature is 65 bytes, this will be the real `v` value.\\n                    // If not, it will need to be modified - doing it this way\\n                    // saves an extra condition.\\n                    v := byte(\\n                        0,\\n                        mload(add(signature, ECDSA_signature_v_offset))\\n                    )\\n\\n                    // If lenDiff is 1, parse 64-byte signature as ECDSA.\\n                    if lenDiff {\\n                        // Extract yParity from highest bit of vs and add 27 to\\n                        // get v.\\n                        v := add(\\n                            shr(MaxUint8, originalSignatureS),\\n                            Signature_lower_v\\n                        )\\n\\n                        // Extract canonical s from vs, all but the highest bit.\\n                        // Temporarily overwrite the original `s` value in the\\n                        // signature.\\n                        mstore(\\n                            add(signature, ECDSA_signature_s_offset),\\n                            and(\\n                                originalSignatureS,\\n                                EIP2098_allButHighestBitMask\\n                            )\\n                        )\\n                    }\\n                    // Temporarily overwrite the signature length with `v` to\\n                    // conform to the expected input for ecrecover.\\n                    mstore(signature, v)\\n\\n                    // Temporarily overwrite the word before the length with\\n                    // `digest` to conform to the expected input for ecrecover.\\n                    mstore(wordBeforeSignaturePtr, digest)\\n\\n                    // Attempt to recover the signer for the given signature. Do\\n                    // not check the call status as ecrecover will return a null\\n                    // address if the signature is invalid.\\n                    pop(\\n                        staticcall(\\n                            gas(),\\n                            Ecrecover_precompile, // Call ecrecover precompile.\\n                            wordBeforeSignaturePtr, // Use data memory location.\\n                            Ecrecover_args_size, // Size of digest, v, r, and s.\\n                            0, // Write result to scratch space.\\n                            OneWord // Provide size of returned result.\\n                        )\\n                    )\\n\\n                    // Restore cached word before signature.\\n                    mstore(wordBeforeSignaturePtr, cachedWordBeforeSignature)\\n\\n                    // Restore cached signature length.\\n                    mstore(signature, signatureLength)\\n\\n                    // Restore cached signature `s` value.\\n                    mstore(\\n                        add(signature, ECDSA_signature_s_offset),\\n                        originalSignatureS\\n                    )\\n\\n                    // Read the recovered signer from the buffer given as return\\n                    // space for ecrecover.\\n                    recoveredSigner := mload(0)\\n                }\\n\\n                // Set success to true if the signature provided was a valid\\n                // ECDSA signature and the signer is not the null address. Use\\n                // gt instead of direct as success is used outside of assembly.\\n                success := and(eq(signer, recoveredSigner), gt(signer, 0))\\n            }\\n\\n            // If the signature was not verified with ecrecover, try EIP1271.\\n            if iszero(success) {\\n                // Temporarily overwrite the word before the signature length\\n                // and use it as the head of the signature input to\\n                // `isValidSignature`, which has a value of 64.\\n                mstore(\\n                    wordBeforeSignaturePtr,\\n                    EIP1271_isValidSignature_signature_head_offset\\n                )\\n\\n                // Get pointer to use for the selector of `isValidSignature`.\\n                let selectorPtr := sub(\\n                    signature,\\n                    EIP1271_isValidSignature_selector_negativeOffset\\n                )\\n\\n                // Cache the value currently stored at the selector pointer.\\n                let cachedWordOverwrittenBySelector := mload(selectorPtr)\\n\\n                // Get pointer to use for `digest` input to `isValidSignature`.\\n                let digestPtr := sub(\\n                    signature,\\n                    EIP1271_isValidSignature_digest_negativeOffset\\n                )\\n\\n                // Cache the value currently stored at the digest pointer.\\n                let cachedWordOverwrittenByDigest := mload(digestPtr)\\n\\n                // Write the selector first, since it overlaps the digest.\\n                mstore(selectorPtr, EIP1271_isValidSignature_selector)\\n\\n                // Next, write the digest.\\n                mstore(digestPtr, digest)\\n\\n                // Call signer with `isValidSignature` to validate signature.\\n                success := staticcall(\\n                    gas(),\\n                    signer,\\n                    selectorPtr,\\n                    add(\\n                        signatureLength,\\n                        EIP1271_isValidSignature_calldata_baseLength\\n                    ),\\n                    0,\\n                    OneWord\\n                )\\n\\n                // Determine if the signature is valid on successful calls.\\n                if success {\\n                    // If first word of scratch space does not contain EIP-1271\\n                    // signature selector, revert.\\n                    if iszero(eq(mload(0), EIP1271_isValidSignature_selector)) {\\n                        // Revert with bad 1271 signature if signer has code.\\n                        if extcodesize(signer) {\\n                            // Bad contract signature.\\n                            mstore(0, BadContractSignature_error_signature)\\n                            revert(0, BadContractSignature_error_length)\\n                        }\\n\\n                        // Check if signature length was invalid.\\n                        if gt(sub(ECDSA_MaxLength, signatureLength), 1) {\\n                            // Revert with generic invalid signature error.\\n                            mstore(0, InvalidSignature_error_signature)\\n                            revert(0, InvalidSignature_error_length)\\n                        }\\n\\n                        // Check if v was invalid.\\n                        if iszero(\\n                            byte(v, ECDSA_twentySeventhAndTwentyEighthBytesSet)\\n                        ) {\\n                            // Revert with invalid v value.\\n                            mstore(0, BadSignatureV_error_signature)\\n                            mstore(BadSignatureV_error_offset, v)\\n                            revert(0, BadSignatureV_error_length)\\n                        }\\n\\n                        // Revert with generic invalid signer error message.\\n                        mstore(0, InvalidSigner_error_signature)\\n                        revert(0, InvalidSigner_error_length)\\n                    }\\n                }\\n\\n                // Restore the cached values overwritten by selector, digest and\\n                // signature head.\\n                mstore(wordBeforeSignaturePtr, cachedWordBeforeSignature)\\n                mstore(selectorPtr, cachedWordOverwrittenBySelector)\\n                mstore(digestPtr, cachedWordOverwrittenByDigest)\\n            }\\n        }\\n\\n        // If the call failed...\\n        if (!success) {\\n            // Revert and pass reason along if one was returned.\\n            _revertWithReasonIfOneIsReturned();\\n\\n            // Otherwise, revert with error indicating bad contract signature.\\n            assembly {\\n                mstore(0, BadContractSignature_error_signature)\\n                revert(0, BadContractSignature_error_length)\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9af8a720f3f6aac730d7896484f407ecea62105c1c9dc45666273d51555a0f42\",\"license\":\"MIT\"},\"contracts/lib/TokenTransferrer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"./TokenTransferrerConstants.sol\\\";\\n\\nimport {\\n    TokenTransferrerErrors\\n} from \\\"../interfaces/TokenTransferrerErrors.sol\\\";\\n\\nimport { ConduitBatch1155Transfer } from \\\"../conduit/lib/ConduitStructs.sol\\\";\\n\\n/**\\n * @title TokenTransferrer\\n * @author 0age\\n * @custom:coauthor d1ll0n\\n * @custom:coauthor transmissions11\\n * @notice TokenTransferrer is a library for performing optimized ERC20, ERC721,\\n *         ERC1155, and batch ERC1155 transfers, used by both Seaport as well as\\n *         by conduits deployed by the ConduitController. Use great caution when\\n *         considering these functions for use in other codebases, as there are\\n *         significant side effects and edge cases that need to be thoroughly\\n *         understood and carefully addressed.\\n */\\ncontract TokenTransferrer is TokenTransferrerErrors {\\n    /**\\n     * @dev Internal function to transfer ERC20 tokens from a given originator\\n     *      to a given recipient. Sufficient approvals must be set on the\\n     *      contract performing the transfer.\\n     *\\n     * @param token      The ERC20 token to transfer.\\n     * @param from       The originator of the transfer.\\n     * @param to         The recipient of the transfer.\\n     * @param amount     The amount to transfer.\\n     */\\n    function _performERC20Transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        // Utilize assembly to perform an optimized ERC20 token transfer.\\n        assembly {\\n            // The free memory pointer memory slot will be used when populating\\n            // call data for the transfer; read the value and restore it later.\\n            let memPointer := mload(FreeMemoryPointerSlot)\\n\\n            // Write call data into memory, starting with function selector.\\n            mstore(ERC20_transferFrom_sig_ptr, ERC20_transferFrom_signature)\\n            mstore(ERC20_transferFrom_from_ptr, from)\\n            mstore(ERC20_transferFrom_to_ptr, to)\\n            mstore(ERC20_transferFrom_amount_ptr, amount)\\n\\n            // Make call & copy up to 32 bytes of return data to scratch space.\\n            // Scratch space does not need to be cleared ahead of time, as the\\n            // subsequent check will ensure that either at least a full word of\\n            // return data is received (in which case it will be overwritten) or\\n            // that no data is received (in which case scratch space will be\\n            // ignored) on a successful call to the given token.\\n            let callStatus := call(\\n                gas(),\\n                token,\\n                0,\\n                ERC20_transferFrom_sig_ptr,\\n                ERC20_transferFrom_length,\\n                0,\\n                OneWord\\n            )\\n\\n            // Determine whether transfer was successful using status & result.\\n            let success := and(\\n                // Set success to whether the call reverted, if not check it\\n                // either returned exactly 1 (can't just be non-zero data), or\\n                // had no return data.\\n                or(\\n                    and(eq(mload(0), 1), gt(returndatasize(), 31)),\\n                    iszero(returndatasize())\\n                ),\\n                callStatus\\n            )\\n\\n            // Handle cases where either the transfer failed or no data was\\n            // returned. Group these, as most transfers will succeed with data.\\n            // Equivalent to `or(iszero(success), iszero(returndatasize()))`\\n            // but after it's inverted for JUMPI this expression is cheaper.\\n            if iszero(and(success, iszero(iszero(returndatasize())))) {\\n                // If the token has no code or the transfer failed: Equivalent\\n                // to `or(iszero(success), iszero(extcodesize(token)))` but\\n                // after it's inverted for JUMPI this expression is cheaper.\\n                if iszero(and(iszero(iszero(extcodesize(token))), success)) {\\n                    // If the transfer failed:\\n                    if iszero(success) {\\n                        // If it was due to a revert:\\n                        if iszero(callStatus) {\\n                            // If it returned a message, bubble it up as long as\\n                            // sufficient gas remains to do so:\\n                            if returndatasize() {\\n                                // Ensure that sufficient gas is available to\\n                                // copy returndata while expanding memory where\\n                                // necessary. Start by computing the word size\\n                                // of returndata and allocated memory. Round up\\n                                // to the nearest full word.\\n                                let returnDataWords := div(\\n                                    add(returndatasize(), AlmostOneWord),\\n                                    OneWord\\n                                )\\n\\n                                // Note: use the free memory pointer in place of\\n                                // msize() to work around a Yul warning that\\n                                // prevents accessing msize directly when the IR\\n                                // pipeline is activated.\\n                                let msizeWords := div(memPointer, OneWord)\\n\\n                                // Next, compute the cost of the returndatacopy.\\n                                let cost := mul(CostPerWord, returnDataWords)\\n\\n                                // Then, compute cost of new memory allocation.\\n                                if gt(returnDataWords, msizeWords) {\\n                                    cost := add(\\n                                        cost,\\n                                        add(\\n                                            mul(\\n                                                sub(\\n                                                    returnDataWords,\\n                                                    msizeWords\\n                                                ),\\n                                                CostPerWord\\n                                            ),\\n                                            div(\\n                                                sub(\\n                                                    mul(\\n                                                        returnDataWords,\\n                                                        returnDataWords\\n                                                    ),\\n                                                    mul(msizeWords, msizeWords)\\n                                                ),\\n                                                MemoryExpansionCoefficient\\n                                            )\\n                                        )\\n                                    )\\n                                }\\n\\n                                // Finally, add a small constant and compare to\\n                                // gas remaining; bubble up the revert data if\\n                                // enough gas is still available.\\n                                if lt(add(cost, ExtraGasBuffer), gas()) {\\n                                    // Copy returndata to memory; overwrite\\n                                    // existing memory.\\n                                    returndatacopy(0, 0, returndatasize())\\n\\n                                    // Revert, specifying memory region with\\n                                    // copied returndata.\\n                                    revert(0, returndatasize())\\n                                }\\n                            }\\n\\n                            // Otherwise revert with a generic error message.\\n                            mstore(\\n                                TokenTransferGenericFailure_error_sig_ptr,\\n                                TokenTransferGenericFailure_error_signature\\n                            )\\n                            mstore(\\n                                TokenTransferGenericFailure_error_token_ptr,\\n                                token\\n                            )\\n                            mstore(\\n                                TokenTransferGenericFailure_error_from_ptr,\\n                                from\\n                            )\\n                            mstore(TokenTransferGenericFailure_error_to_ptr, to)\\n                            mstore(TokenTransferGenericFailure_error_id_ptr, 0)\\n                            mstore(\\n                                TokenTransferGenericFailure_error_amount_ptr,\\n                                amount\\n                            )\\n                            revert(\\n                                TokenTransferGenericFailure_error_sig_ptr,\\n                                TokenTransferGenericFailure_error_length\\n                            )\\n                        }\\n\\n                        // Otherwise revert with a message about the token\\n                        // returning false or non-compliant return values.\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_sig_ptr,\\n                            BadReturnValueFromERC20OnTransfer_error_signature\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_token_ptr,\\n                            token\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_from_ptr,\\n                            from\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_to_ptr,\\n                            to\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_amount_ptr,\\n                            amount\\n                        )\\n                        revert(\\n                            BadReturnValueFromERC20OnTransfer_error_sig_ptr,\\n                            BadReturnValueFromERC20OnTransfer_error_length\\n                        )\\n                    }\\n\\n                    // Otherwise, revert with error about token not having code:\\n                    mstore(NoContract_error_sig_ptr, NoContract_error_signature)\\n                    mstore(NoContract_error_token_ptr, token)\\n                    revert(NoContract_error_sig_ptr, NoContract_error_length)\\n                }\\n\\n                // Otherwise, the token just returned no data despite the call\\n                // having succeeded; no need to optimize for this as it's not\\n                // technically ERC20 compliant.\\n            }\\n\\n            // Restore the original free memory pointer.\\n            mstore(FreeMemoryPointerSlot, memPointer)\\n\\n            // Restore the zero slot to zero.\\n            mstore(ZeroSlot, 0)\\n        }\\n    }\\n\\n    function _performSelfERC20Transfer(\\n        address token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        // Utilize assembly to perform an optimized ERC20 token transfer.\\n        assembly {\\n            // The free memory pointer memory slot will be used when populating\\n            // call data for the transfer; read the value and restore it later.\\n            let memPointer := mload(FreeMemoryPointerSlot)\\n\\n            // Write call data into memory, starting with function selector.\\n            mstore(ERC20_transfer_sig_ptr, ERC20_transfer_signature)\\n            mstore(ERC20_transfer_to_ptr, to)\\n            mstore(ERC20_transfer_amount_ptr, amount)\\n\\n            // Make call & copy up to 32 bytes of return data to scratch space.\\n            // Scratch space does not need to be cleared ahead of time, as the\\n            // subsequent check will ensure that either at least a full word of\\n            // return data is received (in which case it will be overwritten) or\\n            // that no data is received (in which case scratch space will be\\n            // ignored) on a successful call to the given token.\\n            let callStatus := call(\\n                gas(),\\n                token,\\n                0,\\n                ERC20_transfer_sig_ptr,\\n                ERC20_transfer_length,\\n                0,\\n                OneWord\\n            )\\n\\n            // Determine whether transfer was successful using status & result.\\n            let success := and(\\n                // Set success to whether the call reverted, if not check it\\n                // either returned exactly 1 (can't just be non-zero data), or\\n                // had no return data.\\n                or(\\n                    and(eq(mload(0), 1), gt(returndatasize(), 31)),\\n                    iszero(returndatasize())\\n                ),\\n                callStatus\\n            )\\n\\n            // Handle cases where either the transfer failed or no data was\\n            // returned. Group these, as most transfers will succeed with data.\\n            // Equivalent to `or(iszero(success), iszero(returndatasize()))`\\n            // but after it's inverted for JUMPI this expression is cheaper.\\n            if iszero(and(success, iszero(iszero(returndatasize())))) {\\n                // If the token has no code or the transfer failed: Equivalent\\n                // to `or(iszero(success), iszero(extcodesize(token)))` but\\n                // after it's inverted for JUMPI this expression is cheaper.\\n                if iszero(and(iszero(iszero(extcodesize(token))), success)) {\\n                    // If the transfer failed:\\n                    if iszero(success) {\\n                        // If it was due to a revert:\\n                        if iszero(callStatus) {\\n                            // If it returned a message, bubble it up as long as\\n                            // sufficient gas remains to do so:\\n                            if returndatasize() {\\n                                // Ensure that sufficient gas is available to\\n                                // copy returndata while expanding memory where\\n                                // necessary. Start by computing the word size\\n                                // of returndata and allocated memory. Round up\\n                                // to the nearest full word.\\n                                let returnDataWords := div(\\n                                    add(returndatasize(), AlmostOneWord),\\n                                    OneWord\\n                                )\\n\\n                                // Note: use the free memory pointer in place of\\n                                // msize() to work around a Yul warning that\\n                                // prevents accessing msize directly when the IR\\n                                // pipeline is activated.\\n                                let msizeWords := div(memPointer, OneWord)\\n\\n                                // Next, compute the cost of the returndatacopy.\\n                                let cost := mul(CostPerWord, returnDataWords)\\n\\n                                // Then, compute cost of new memory allocation.\\n                                if gt(returnDataWords, msizeWords) {\\n                                    cost := add(\\n                                        cost,\\n                                        add(\\n                                            mul(\\n                                                sub(\\n                                                    returnDataWords,\\n                                                    msizeWords\\n                                                ),\\n                                                CostPerWord\\n                                            ),\\n                                            div(\\n                                                sub(\\n                                                    mul(\\n                                                        returnDataWords,\\n                                                        returnDataWords\\n                                                    ),\\n                                                    mul(msizeWords, msizeWords)\\n                                                ),\\n                                                MemoryExpansionCoefficient\\n                                            )\\n                                        )\\n                                    )\\n                                }\\n\\n                                // Finally, add a small constant and compare to\\n                                // gas remaining; bubble up the revert data if\\n                                // enough gas is still available.\\n                                if lt(add(cost, ExtraGasBuffer), gas()) {\\n                                    // Copy returndata to memory; overwrite\\n                                    // existing memory.\\n                                    returndatacopy(0, 0, returndatasize())\\n\\n                                    // Revert, specifying memory region with\\n                                    // copied returndata.\\n                                    revert(0, returndatasize())\\n                                }\\n                            }\\n\\n                            // Otherwise revert with a generic error message.\\n                            mstore(\\n                                TokenTransferGenericFailure_error_sig_ptr,\\n                                TokenTransferGenericFailure_error_signature\\n                            )\\n                            mstore(\\n                                TokenTransferGenericFailure_error_token_ptr,\\n                                token\\n                            )\\n                            mstore(\\n                                TokenTransferGenericFailure_error_from_ptr,\\n                                address()\\n                            )\\n                            mstore(TokenTransferGenericFailure_error_to_ptr, to)\\n                            mstore(TokenTransferGenericFailure_error_id_ptr, 0)\\n                            mstore(\\n                                TokenTransferGenericFailure_error_amount_ptr,\\n                                amount\\n                            )\\n                            revert(\\n                                TokenTransferGenericFailure_error_sig_ptr,\\n                                TokenTransferGenericFailure_error_length\\n                            )\\n                        }\\n\\n                        // Otherwise revert with a message about the token\\n                        // returning false or non-compliant return values.\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_sig_ptr,\\n                            BadReturnValueFromERC20OnTransfer_error_signature\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_token_ptr,\\n                            token\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_from_ptr,\\n                            address()\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_to_ptr,\\n                            to\\n                        )\\n                        mstore(\\n                            BadReturnValueFromERC20OnTransfer_error_amount_ptr,\\n                            amount\\n                        )\\n                        revert(\\n                            BadReturnValueFromERC20OnTransfer_error_sig_ptr,\\n                            BadReturnValueFromERC20OnTransfer_error_length\\n                        )\\n                    }\\n\\n                    // Otherwise, revert with error about token not having code:\\n                    mstore(NoContract_error_sig_ptr, NoContract_error_signature)\\n                    mstore(NoContract_error_token_ptr, token)\\n                    revert(NoContract_error_sig_ptr, NoContract_error_length)\\n                }\\n\\n                // Otherwise, the token just returned no data despite the call\\n                // having succeeded; no need to optimize for this as it's not\\n                // technically ERC20 compliant.\\n            }\\n\\n            // Restore the original free memory pointer.\\n            mstore(FreeMemoryPointerSlot, memPointer)\\n\\n            // Restore the zero slot to zero.\\n            mstore(ZeroSlot, 0)\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer an ERC721 token from a given\\n     *      originator to a given recipient. Sufficient approvals must be set on\\n     *      the contract performing the transfer. Note that this function does\\n     *      not check whether the receiver can accept the ERC721 token (i.e. it\\n     *      does not use `safeTransferFrom`).\\n     *\\n     * @param token      The ERC721 token to transfer.\\n     * @param from       The originator of the transfer.\\n     * @param to         The recipient of the transfer.\\n     * @param identifier The tokenId to transfer.\\n     */\\n    function _performERC721Transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier\\n    ) internal {\\n        // Utilize assembly to perform an optimized ERC721 token transfer.\\n        assembly {\\n            // If the token has no code, revert.\\n            if iszero(extcodesize(token)) {\\n                mstore(NoContract_error_sig_ptr, NoContract_error_signature)\\n                mstore(NoContract_error_token_ptr, token)\\n                revert(NoContract_error_sig_ptr, NoContract_error_length)\\n            }\\n\\n            // The free memory pointer memory slot will be used when populating\\n            // call data for the transfer; read the value and restore it later.\\n            let memPointer := mload(FreeMemoryPointerSlot)\\n\\n            // Write call data to memory starting with function selector.\\n            mstore(ERC721_transferFrom_sig_ptr, ERC721_transferFrom_signature)\\n            mstore(ERC721_transferFrom_from_ptr, from)\\n            mstore(ERC721_transferFrom_to_ptr, to)\\n            mstore(ERC721_transferFrom_id_ptr, identifier)\\n\\n            // Perform the call, ignoring return data.\\n            let success := call(\\n                gas(),\\n                token,\\n                0,\\n                ERC721_transferFrom_sig_ptr,\\n                ERC721_transferFrom_length,\\n                0,\\n                0\\n            )\\n\\n            // If the transfer reverted:\\n            if iszero(success) {\\n                // If it returned a message, bubble it up as long as sufficient\\n                // gas remains to do so:\\n                if returndatasize() {\\n                    // Ensure that sufficient gas is available to copy\\n                    // returndata while expanding memory where necessary. Start\\n                    // by computing word size of returndata & allocated memory.\\n                    // Round up to the nearest full word.\\n                    let returnDataWords := div(\\n                        add(returndatasize(), AlmostOneWord),\\n                        OneWord\\n                    )\\n\\n                    // Note: use the free memory pointer in place of msize() to\\n                    // work around a Yul warning that prevents accessing msize\\n                    // directly when the IR pipeline is activated.\\n                    let msizeWords := div(memPointer, OneWord)\\n\\n                    // Next, compute the cost of the returndatacopy.\\n                    let cost := mul(CostPerWord, returnDataWords)\\n\\n                    // Then, compute cost of new memory allocation.\\n                    if gt(returnDataWords, msizeWords) {\\n                        cost := add(\\n                            cost,\\n                            add(\\n                                mul(\\n                                    sub(returnDataWords, msizeWords),\\n                                    CostPerWord\\n                                ),\\n                                div(\\n                                    sub(\\n                                        mul(returnDataWords, returnDataWords),\\n                                        mul(msizeWords, msizeWords)\\n                                    ),\\n                                    MemoryExpansionCoefficient\\n                                )\\n                            )\\n                        )\\n                    }\\n\\n                    // Finally, add a small constant and compare to gas\\n                    // remaining; bubble up the revert data if enough gas is\\n                    // still available.\\n                    if lt(add(cost, ExtraGasBuffer), gas()) {\\n                        // Copy returndata to memory; overwrite existing memory.\\n                        returndatacopy(0, 0, returndatasize())\\n\\n                        // Revert, giving memory region with copied returndata.\\n                        revert(0, returndatasize())\\n                    }\\n                }\\n\\n                // Otherwise revert with a generic error message.\\n                mstore(\\n                    TokenTransferGenericFailure_error_sig_ptr,\\n                    TokenTransferGenericFailure_error_signature\\n                )\\n                mstore(TokenTransferGenericFailure_error_token_ptr, token)\\n                mstore(TokenTransferGenericFailure_error_from_ptr, from)\\n                mstore(TokenTransferGenericFailure_error_to_ptr, to)\\n                mstore(TokenTransferGenericFailure_error_id_ptr, identifier)\\n                mstore(TokenTransferGenericFailure_error_amount_ptr, 1)\\n                revert(\\n                    TokenTransferGenericFailure_error_sig_ptr,\\n                    TokenTransferGenericFailure_error_length\\n                )\\n            }\\n\\n            // Restore the original free memory pointer.\\n            mstore(FreeMemoryPointerSlot, memPointer)\\n\\n            // Restore the zero slot to zero.\\n            mstore(ZeroSlot, 0)\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer ERC1155 tokens from a given\\n     *      originator to a given recipient. Sufficient approvals must be set on\\n     *      the contract performing the transfer and contract recipients must\\n     *      implement the ERC1155TokenReceiver interface to indicate that they\\n     *      are willing to accept the transfer.\\n     *\\n     * @param token      The ERC1155 token to transfer.\\n     * @param from       The originator of the transfer.\\n     * @param to         The recipient of the transfer.\\n     * @param identifier The id to transfer.\\n     * @param amount     The amount to transfer.\\n     */\\n    function _performERC1155Transfer(\\n        address token,\\n        address from,\\n        address to,\\n        uint256 identifier,\\n        uint256 amount\\n    ) internal {\\n        // Utilize assembly to perform an optimized ERC1155 token transfer.\\n        assembly {\\n            // If the token has no code, revert.\\n            if iszero(extcodesize(token)) {\\n                mstore(NoContract_error_sig_ptr, NoContract_error_signature)\\n                mstore(NoContract_error_token_ptr, token)\\n                revert(NoContract_error_sig_ptr, NoContract_error_length)\\n            }\\n\\n            // The following memory slots will be used when populating call data\\n            // for the transfer; read the values and restore them later.\\n            let memPointer := mload(FreeMemoryPointerSlot)\\n            let slot0x80 := mload(Slot0x80)\\n            let slot0xA0 := mload(Slot0xA0)\\n            let slot0xC0 := mload(Slot0xC0)\\n\\n            // Write call data into memory, beginning with function selector.\\n            mstore(\\n                ERC1155_safeTransferFrom_sig_ptr,\\n                ERC1155_safeTransferFrom_signature\\n            )\\n            mstore(ERC1155_safeTransferFrom_from_ptr, from)\\n            mstore(ERC1155_safeTransferFrom_to_ptr, to)\\n            mstore(ERC1155_safeTransferFrom_id_ptr, identifier)\\n            mstore(ERC1155_safeTransferFrom_amount_ptr, amount)\\n            mstore(\\n                ERC1155_safeTransferFrom_data_offset_ptr,\\n                ERC1155_safeTransferFrom_data_length_offset\\n            )\\n            mstore(ERC1155_safeTransferFrom_data_length_ptr, 0)\\n\\n            // Perform the call, ignoring return data.\\n            let success := call(\\n                gas(),\\n                token,\\n                0,\\n                ERC1155_safeTransferFrom_sig_ptr,\\n                ERC1155_safeTransferFrom_length,\\n                0,\\n                0\\n            )\\n\\n            // If the transfer reverted:\\n            if iszero(success) {\\n                // If it returned a message, bubble it up as long as sufficient\\n                // gas remains to do so:\\n                if returndatasize() {\\n                    // Ensure that sufficient gas is available to copy\\n                    // returndata while expanding memory where necessary. Start\\n                    // by computing word size of returndata & allocated memory.\\n                    // Round up to the nearest full word.\\n                    let returnDataWords := div(\\n                        add(returndatasize(), AlmostOneWord),\\n                        OneWord\\n                    )\\n\\n                    // Note: use the free memory pointer in place of msize() to\\n                    // work around a Yul warning that prevents accessing msize\\n                    // directly when the IR pipeline is activated.\\n                    let msizeWords := div(memPointer, OneWord)\\n\\n                    // Next, compute the cost of the returndatacopy.\\n                    let cost := mul(CostPerWord, returnDataWords)\\n\\n                    // Then, compute cost of new memory allocation.\\n                    if gt(returnDataWords, msizeWords) {\\n                        cost := add(\\n                            cost,\\n                            add(\\n                                mul(\\n                                    sub(returnDataWords, msizeWords),\\n                                    CostPerWord\\n                                ),\\n                                div(\\n                                    sub(\\n                                        mul(returnDataWords, returnDataWords),\\n                                        mul(msizeWords, msizeWords)\\n                                    ),\\n                                    MemoryExpansionCoefficient\\n                                )\\n                            )\\n                        )\\n                    }\\n\\n                    // Finally, add a small constant and compare to gas\\n                    // remaining; bubble up the revert data if enough gas is\\n                    // still available.\\n                    if lt(add(cost, ExtraGasBuffer), gas()) {\\n                        // Copy returndata to memory; overwrite existing memory.\\n                        returndatacopy(0, 0, returndatasize())\\n\\n                        // Revert, giving memory region with copied returndata.\\n                        revert(0, returndatasize())\\n                    }\\n                }\\n\\n                // Otherwise revert with a generic error message.\\n                mstore(\\n                    TokenTransferGenericFailure_error_sig_ptr,\\n                    TokenTransferGenericFailure_error_signature\\n                )\\n                mstore(TokenTransferGenericFailure_error_token_ptr, token)\\n                mstore(TokenTransferGenericFailure_error_from_ptr, from)\\n                mstore(TokenTransferGenericFailure_error_to_ptr, to)\\n                mstore(TokenTransferGenericFailure_error_id_ptr, identifier)\\n                mstore(TokenTransferGenericFailure_error_amount_ptr, amount)\\n                revert(\\n                    TokenTransferGenericFailure_error_sig_ptr,\\n                    TokenTransferGenericFailure_error_length\\n                )\\n            }\\n\\n            mstore(Slot0x80, slot0x80) // Restore slot 0x80.\\n            mstore(Slot0xA0, slot0xA0) // Restore slot 0xA0.\\n            mstore(Slot0xC0, slot0xC0) // Restore slot 0xC0.\\n\\n            // Restore the original free memory pointer.\\n            mstore(FreeMemoryPointerSlot, memPointer)\\n\\n            // Restore the zero slot to zero.\\n            mstore(ZeroSlot, 0)\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function to transfer ERC1155 tokens from a given\\n     *      originator to a given recipient. Sufficient approvals must be set on\\n     *      the contract performing the transfer and contract recipients must\\n     *      implement the ERC1155TokenReceiver interface to indicate that they\\n     *      are willing to accept the transfer. NOTE: this function is not\\n     *      memory-safe; it will overwrite existing memory, restore the free\\n     *      memory pointer to the default value, and overwrite the zero slot.\\n     *      This function should only be called once memory is no longer\\n     *      required and when uninitialized arrays are not utilized, and memory\\n     *      should be considered fully corrupted (aside from the existence of a\\n     *      default-value free memory pointer) after calling this function.\\n     *\\n     * @param batchTransfers The group of 1155 batch transfers to perform.\\n     */\\n    function _performERC1155BatchTransfers(\\n        ConduitBatch1155Transfer[] calldata batchTransfers\\n    ) internal {\\n        // Utilize assembly to perform optimized batch 1155 transfers.\\n        assembly {\\n            let len := batchTransfers.length\\n            // Pointer to first head in the array, which is offset to the struct\\n            // at each index. This gets incremented after each loop to avoid\\n            // multiplying by 32 to get the offset for each element.\\n            let nextElementHeadPtr := batchTransfers.offset\\n\\n            // Pointer to beginning of the head of the array. This is the\\n            // reference position each offset references. It's held static to\\n            // let each loop calculate the data position for an element.\\n            let arrayHeadPtr := nextElementHeadPtr\\n\\n            // Write the function selector, which will be reused for each call:\\n            // safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\\n            mstore(\\n                ConduitBatch1155Transfer_from_offset,\\n                ERC1155_safeBatchTransferFrom_signature\\n            )\\n\\n            // Iterate over each batch transfer.\\n            for {\\n                let i := 0\\n            } lt(i, len) {\\n                i := add(i, 1)\\n            } {\\n                // Read the offset to the beginning of the element and add\\n                // it to pointer to the beginning of the array head to get\\n                // the absolute position of the element in calldata.\\n                let elementPtr := add(\\n                    arrayHeadPtr,\\n                    calldataload(nextElementHeadPtr)\\n                )\\n\\n                // Retrieve the token from calldata.\\n                let token := calldataload(elementPtr)\\n\\n                // If the token has no code, revert.\\n                if iszero(extcodesize(token)) {\\n                    mstore(NoContract_error_sig_ptr, NoContract_error_signature)\\n                    mstore(NoContract_error_token_ptr, token)\\n                    revert(NoContract_error_sig_ptr, NoContract_error_length)\\n                }\\n\\n                // Get the total number of supplied ids.\\n                let idsLength := calldataload(\\n                    add(elementPtr, ConduitBatch1155Transfer_ids_length_offset)\\n                )\\n\\n                // Determine the expected offset for the amounts array.\\n                let expectedAmountsOffset := add(\\n                    ConduitBatch1155Transfer_amounts_length_baseOffset,\\n                    mul(idsLength, OneWord)\\n                )\\n\\n                // Validate struct encoding.\\n                let invalidEncoding := iszero(\\n                    and(\\n                        // ids.length == amounts.length\\n                        eq(\\n                            idsLength,\\n                            calldataload(add(elementPtr, expectedAmountsOffset))\\n                        ),\\n                        and(\\n                            // ids_offset == 0xa0\\n                            eq(\\n                                calldataload(\\n                                    add(\\n                                        elementPtr,\\n                                        ConduitBatch1155Transfer_ids_head_offset\\n                                    )\\n                                ),\\n                                ConduitBatch1155Transfer_ids_length_offset\\n                            ),\\n                            // amounts_offset == 0xc0 + ids.length*32\\n                            eq(\\n                                calldataload(\\n                                    add(\\n                                        elementPtr,\\n                                        ConduitBatchTransfer_amounts_head_offset\\n                                    )\\n                                ),\\n                                expectedAmountsOffset\\n                            )\\n                        )\\n                    )\\n                )\\n\\n                // Revert with an error if the encoding is not valid.\\n                if invalidEncoding {\\n                    mstore(\\n                        Invalid1155BatchTransferEncoding_ptr,\\n                        Invalid1155BatchTransferEncoding_selector\\n                    )\\n                    revert(\\n                        Invalid1155BatchTransferEncoding_ptr,\\n                        Invalid1155BatchTransferEncoding_length\\n                    )\\n                }\\n\\n                // Update the offset position for the next loop\\n                nextElementHeadPtr := add(nextElementHeadPtr, OneWord)\\n\\n                // Copy the first section of calldata (before dynamic values).\\n                calldatacopy(\\n                    BatchTransfer1155Params_ptr,\\n                    add(elementPtr, ConduitBatch1155Transfer_from_offset),\\n                    ConduitBatch1155Transfer_usable_head_size\\n                )\\n\\n                // Determine size of calldata required for ids and amounts. Note\\n                // that the size includes both lengths as well as the data.\\n                let idsAndAmountsSize := add(TwoWords, mul(idsLength, TwoWords))\\n\\n                // Update the offset for the data array in memory.\\n                mstore(\\n                    BatchTransfer1155Params_data_head_ptr,\\n                    add(\\n                        BatchTransfer1155Params_ids_length_offset,\\n                        idsAndAmountsSize\\n                    )\\n                )\\n\\n                // Set the length of the data array in memory to zero.\\n                mstore(\\n                    add(\\n                        BatchTransfer1155Params_data_length_basePtr,\\n                        idsAndAmountsSize\\n                    ),\\n                    0\\n                )\\n\\n                // Determine the total calldata size for the call to transfer.\\n                let transferDataSize := add(\\n                    BatchTransfer1155Params_calldata_baseSize,\\n                    idsAndAmountsSize\\n                )\\n\\n                // Copy second section of calldata (including dynamic values).\\n                calldatacopy(\\n                    BatchTransfer1155Params_ids_length_ptr,\\n                    add(elementPtr, ConduitBatch1155Transfer_ids_length_offset),\\n                    idsAndAmountsSize\\n                )\\n\\n                // Perform the call to transfer 1155 tokens.\\n                let success := call(\\n                    gas(),\\n                    token,\\n                    0,\\n                    ConduitBatch1155Transfer_from_offset, // Data portion start.\\n                    transferDataSize, // Location of the length of callData.\\n                    0,\\n                    0\\n                )\\n\\n                // If the transfer reverted:\\n                if iszero(success) {\\n                    // If it returned a message, bubble it up as long as\\n                    // sufficient gas remains to do so:\\n                    if returndatasize() {\\n                        // Ensure that sufficient gas is available to copy\\n                        // returndata while expanding memory where necessary.\\n                        // Start by computing word size of returndata and\\n                        // allocated memory. Round up to the nearest full word.\\n                        let returnDataWords := div(\\n                            add(returndatasize(), AlmostOneWord),\\n                            OneWord\\n                        )\\n\\n                        // Note: use transferDataSize in place of msize() to\\n                        // work around a Yul warning that prevents accessing\\n                        // msize directly when the IR pipeline is activated.\\n                        // The free memory pointer is not used here because\\n                        // this function does almost all memory management\\n                        // manually and does not update it, and transferDataSize\\n                        // should be the largest memory value used (unless a\\n                        // previous batch was larger).\\n                        let msizeWords := div(transferDataSize, OneWord)\\n\\n                        // Next, compute the cost of the returndatacopy.\\n                        let cost := mul(CostPerWord, returnDataWords)\\n\\n                        // Then, compute cost of new memory allocation.\\n                        if gt(returnDataWords, msizeWords) {\\n                            cost := add(\\n                                cost,\\n                                add(\\n                                    mul(\\n                                        sub(returnDataWords, msizeWords),\\n                                        CostPerWord\\n                                    ),\\n                                    div(\\n                                        sub(\\n                                            mul(\\n                                                returnDataWords,\\n                                                returnDataWords\\n                                            ),\\n                                            mul(msizeWords, msizeWords)\\n                                        ),\\n                                        MemoryExpansionCoefficient\\n                                    )\\n                                )\\n                            )\\n                        }\\n\\n                        // Finally, add a small constant and compare to gas\\n                        // remaining; bubble up the revert data if enough gas is\\n                        // still available.\\n                        if lt(add(cost, ExtraGasBuffer), gas()) {\\n                            // Copy returndata to memory; overwrite existing.\\n                            returndatacopy(0, 0, returndatasize())\\n\\n                            // Revert with memory region containing returndata.\\n                            revert(0, returndatasize())\\n                        }\\n                    }\\n\\n                    // Set the error signature.\\n                    mstore(\\n                        0,\\n                        ERC1155BatchTransferGenericFailure_error_signature\\n                    )\\n\\n                    // Write the token.\\n                    mstore(ERC1155BatchTransferGenericFailure_token_ptr, token)\\n\\n                    // Increase the offset to ids by 32.\\n                    mstore(\\n                        BatchTransfer1155Params_ids_head_ptr,\\n                        ERC1155BatchTransferGenericFailure_ids_offset\\n                    )\\n\\n                    // Increase the offset to amounts by 32.\\n                    mstore(\\n                        BatchTransfer1155Params_amounts_head_ptr,\\n                        add(\\n                            OneWord,\\n                            mload(BatchTransfer1155Params_amounts_head_ptr)\\n                        )\\n                    )\\n\\n                    // Return modified region. The total size stays the same as\\n                    // `token` uses the same number of bytes as `data.length`.\\n                    revert(0, transferDataSize)\\n                }\\n            }\\n\\n            // Reset the free memory pointer to the default value; memory must\\n            // be assumed to be dirtied and not reused from this point forward.\\n            // Also note that the zero slot is not reset to zero, meaning empty\\n            // arrays cannot be safely created or utilized until it is restored.\\n            mstore(FreeMemoryPointerSlot, DefaultFreeMemoryPointer)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9be626e5928b95748e08259c63a6168d3e0b3e490f2f340491b8afd546cbbcd1\",\"license\":\"MIT\"},\"contracts/lib/TokenTransferrerConstants.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\n/*\\n * -------------------------- Disambiguation & Other Notes ---------------------\\n *    - The term \\\"head\\\" is used as it is in the documentation for ABI encoding,\\n *      but only in reference to dynamic types, i.e. it always refers to the\\n *      offset or pointer to the body of a dynamic type. In calldata, the head\\n *      is always an offset (relative to the parent object), while in memory,\\n *      the head is always the pointer to the body. More information found here:\\n *      https://docs.soliditylang.org/en/v0.8.14/abi-spec.html#argument-encoding\\n *        - Note that the length of an array is separate from and precedes the\\n *          head of the array.\\n *\\n *    - The term \\\"body\\\" is used in place of the term \\\"head\\\" used in the ABI\\n *      documentation. It refers to the start of the data for a dynamic type,\\n *      e.g. the first word of a struct or the first word of the first element\\n *      in an array.\\n *\\n *    - The term \\\"pointer\\\" is used to describe the absolute position of a value\\n *      and never an offset relative to another value.\\n *        - The suffix \\\"_ptr\\\" refers to a memory pointer.\\n *        - The suffix \\\"_cdPtr\\\" refers to a calldata pointer.\\n *\\n *    - The term \\\"offset\\\" is used to describe the position of a value relative\\n *      to some parent value. For example, OrderParameters_conduit_offset is the\\n *      offset to the \\\"conduit\\\" value in the OrderParameters struct relative to\\n *      the start of the body.\\n *        - Note: Offsets are used to derive pointers.\\n *\\n *    - Some structs have pointers defined for all of their fields in this file.\\n *      Lines which are commented out are fields that are not used in the\\n *      codebase but have been left in for readability.\\n */\\n\\nuint256 constant AlmostOneWord = 0x1f;\\nuint256 constant OneWord = 0x20;\\nuint256 constant TwoWords = 0x40;\\nuint256 constant ThreeWords = 0x60;\\n\\nuint256 constant FreeMemoryPointerSlot = 0x40;\\nuint256 constant ZeroSlot = 0x60;\\nuint256 constant DefaultFreeMemoryPointer = 0x80;\\n\\nuint256 constant Slot0x80 = 0x80;\\nuint256 constant Slot0xA0 = 0xa0;\\nuint256 constant Slot0xC0 = 0xc0;\\n\\n// abi.encodeWithSignature(\\\"transferFrom(address,address,uint256)\\\")\\nuint256 constant ERC20_transferFrom_signature = (\\n    0x23b872dd00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant ERC20_transferFrom_sig_ptr = 0x0;\\nuint256 constant ERC20_transferFrom_from_ptr = 0x04;\\nuint256 constant ERC20_transferFrom_to_ptr = 0x24;\\nuint256 constant ERC20_transferFrom_amount_ptr = 0x44;\\nuint256 constant ERC20_transferFrom_length = 0x64; // 4 + 32 * 3 == 100\\n\\n// abi.encodeWithSignature(\\\"transfer(address,uint256)\\\")\\nuint256 constant ERC20_transfer_signature = (\\n    0xa9059cbb00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant ERC20_transfer_sig_ptr = 0x0;\\nuint256 constant ERC20_transfer_to_ptr = 0x04;\\nuint256 constant ERC20_transfer_amount_ptr = 0x24;\\nuint256 constant ERC20_transfer_length = 0x44; // 4 + 32 * 2 == 68\\n\\n// abi.encodeWithSignature(\\n//     \\\"safeTransferFrom(address,address,uint256,uint256,bytes)\\\"\\n// )\\nuint256 constant ERC1155_safeTransferFrom_signature = (\\n    0xf242432a00000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant ERC1155_safeTransferFrom_sig_ptr = 0x0;\\nuint256 constant ERC1155_safeTransferFrom_from_ptr = 0x04;\\nuint256 constant ERC1155_safeTransferFrom_to_ptr = 0x24;\\nuint256 constant ERC1155_safeTransferFrom_id_ptr = 0x44;\\nuint256 constant ERC1155_safeTransferFrom_amount_ptr = 0x64;\\nuint256 constant ERC1155_safeTransferFrom_data_offset_ptr = 0x84;\\nuint256 constant ERC1155_safeTransferFrom_data_length_ptr = 0xa4;\\nuint256 constant ERC1155_safeTransferFrom_length = 0xc4; // 4 + 32 * 6 == 196\\nuint256 constant ERC1155_safeTransferFrom_data_length_offset = 0xa0;\\n\\n// abi.encodeWithSignature(\\n//     \\\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\\\"\\n// )\\nuint256 constant ERC1155_safeBatchTransferFrom_signature = (\\n    0x2eb2c2d600000000000000000000000000000000000000000000000000000000\\n);\\n\\nbytes4 constant ERC1155_safeBatchTransferFrom_selector = bytes4(\\n    bytes32(ERC1155_safeBatchTransferFrom_signature)\\n);\\n\\nuint256 constant ERC721_transferFrom_signature = ERC20_transferFrom_signature;\\nuint256 constant ERC721_transferFrom_sig_ptr = 0x0;\\nuint256 constant ERC721_transferFrom_from_ptr = 0x04;\\nuint256 constant ERC721_transferFrom_to_ptr = 0x24;\\nuint256 constant ERC721_transferFrom_id_ptr = 0x44;\\nuint256 constant ERC721_transferFrom_length = 0x64; // 4 + 32 * 3 == 100\\n\\n// abi.encodeWithSignature(\\\"NoContract(address)\\\")\\nuint256 constant NoContract_error_signature = (\\n    0x5f15d67200000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant NoContract_error_sig_ptr = 0x0;\\nuint256 constant NoContract_error_token_ptr = 0x4;\\nuint256 constant NoContract_error_length = 0x24; // 4 + 32 == 36\\n\\n// abi.encodeWithSignature(\\n//     \\\"TokenTransferGenericFailure(address,address,address,uint256,uint256)\\\"\\n// )\\nuint256 constant TokenTransferGenericFailure_error_signature = (\\n    0xf486bc8700000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant TokenTransferGenericFailure_error_sig_ptr = 0x0;\\nuint256 constant TokenTransferGenericFailure_error_token_ptr = 0x4;\\nuint256 constant TokenTransferGenericFailure_error_from_ptr = 0x24;\\nuint256 constant TokenTransferGenericFailure_error_to_ptr = 0x44;\\nuint256 constant TokenTransferGenericFailure_error_id_ptr = 0x64;\\nuint256 constant TokenTransferGenericFailure_error_amount_ptr = 0x84;\\n\\n// 4 + 32 * 5 == 164\\nuint256 constant TokenTransferGenericFailure_error_length = 0xa4;\\n\\n// abi.encodeWithSignature(\\n//     \\\"BadReturnValueFromERC20OnTransfer(address,address,address,uint256)\\\"\\n// )\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_signature = (\\n    0x9889192300000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_sig_ptr = 0x0;\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_token_ptr = 0x4;\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_from_ptr = 0x24;\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_to_ptr = 0x44;\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_amount_ptr = 0x64;\\n\\n// 4 + 32 * 4 == 132\\nuint256 constant BadReturnValueFromERC20OnTransfer_error_length = 0x84;\\n\\nuint256 constant ExtraGasBuffer = 0x20;\\nuint256 constant CostPerWord = 3;\\nuint256 constant MemoryExpansionCoefficient = 0x200;\\n\\n// Values are offset by 32 bytes in order to write the token to the beginning\\n// in the event of a revert\\nuint256 constant BatchTransfer1155Params_ptr = 0x24;\\nuint256 constant BatchTransfer1155Params_ids_head_ptr = 0x64;\\nuint256 constant BatchTransfer1155Params_amounts_head_ptr = 0x84;\\nuint256 constant BatchTransfer1155Params_data_head_ptr = 0xa4;\\nuint256 constant BatchTransfer1155Params_data_length_basePtr = 0xc4;\\nuint256 constant BatchTransfer1155Params_calldata_baseSize = 0xc4;\\n\\nuint256 constant BatchTransfer1155Params_ids_length_ptr = 0xc4;\\n\\nuint256 constant BatchTransfer1155Params_ids_length_offset = 0xa0;\\nuint256 constant BatchTransfer1155Params_amounts_length_baseOffset = 0xc0;\\nuint256 constant BatchTransfer1155Params_data_length_baseOffset = 0xe0;\\n\\nuint256 constant ConduitBatch1155Transfer_usable_head_size = 0x80;\\n\\nuint256 constant ConduitBatch1155Transfer_from_offset = 0x20;\\nuint256 constant ConduitBatch1155Transfer_ids_head_offset = 0x60;\\nuint256 constant ConduitBatch1155Transfer_amounts_head_offset = 0x80;\\nuint256 constant ConduitBatch1155Transfer_ids_length_offset = 0xa0;\\nuint256 constant ConduitBatch1155Transfer_amounts_length_baseOffset = 0xc0;\\nuint256 constant ConduitBatch1155Transfer_calldata_baseSize = 0xc0;\\n\\n// Note: abbreviated version of above constant to adhere to line length limit.\\nuint256 constant ConduitBatchTransfer_amounts_head_offset = 0x80;\\n\\nuint256 constant Invalid1155BatchTransferEncoding_ptr = 0x00;\\nuint256 constant Invalid1155BatchTransferEncoding_length = 0x04;\\nuint256 constant Invalid1155BatchTransferEncoding_selector = (\\n    0xeba2084c00000000000000000000000000000000000000000000000000000000\\n);\\n\\nuint256 constant ERC1155BatchTransferGenericFailure_error_signature = (\\n    0xafc445e200000000000000000000000000000000000000000000000000000000\\n);\\nuint256 constant ERC1155BatchTransferGenericFailure_token_ptr = 0x04;\\nuint256 constant ERC1155BatchTransferGenericFailure_ids_offset = 0xc0;\\n\",\"keccak256\":\"0x002bea8dcc1d37a0cdd6d1c25f536a1a13e01e1fb32b7bbb2a3016425e40b672\",\"license\":\"MIT\"},\"contracts/lib/Verifiers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport { OrderStatus } from \\\"./ConsiderationStructs.sol\\\";\\n\\nimport { Assertions } from \\\"./Assertions.sol\\\";\\n\\nimport { SignatureVerification } from \\\"./SignatureVerification.sol\\\";\\n\\n/**\\n * @title Verifiers\\n * @author 0age\\n * @notice Verifiers contains functions for performing verifications.\\n */\\ncontract Verifiers is Assertions, SignatureVerification {\\n    /**\\n     * @dev Derive and set hashes, reference chainId, and associated domain\\n     *      separator during deployment.\\n     *\\n     * @param conduitController A contract that deploys conduits, or proxies\\n     *                          that may optionally be used to transfer approved\\n     *                          ERC20/721/1155 tokens.\\n     */\\n    constructor(address conduitController) Assertions(conduitController) {}\\n\\n    /**\\n     * @dev Internal view function to ensure that the current time falls within\\n     *      an order's valid timespan.\\n     *\\n     * @param startTime       The time at which the order becomes active.\\n     * @param endTime         The time at which the order becomes inactive.\\n     * @param revertOnInvalid A boolean indicating whether to revert if the\\n     *                        order is not active.\\n     *\\n     * @return valid A boolean indicating whether the order is active.\\n     */\\n    function _verifyTime(\\n        uint256 startTime,\\n        uint256 endTime,\\n        bool revertOnInvalid\\n    ) internal view returns (bool valid) {\\n        // Revert if order's timespan hasn't started yet or has already ended.\\n        if (startTime > block.timestamp || endTime <= block.timestamp) {\\n            // Only revert if revertOnInvalid has been supplied as true.\\n            if (revertOnInvalid) {\\n                revert InvalidTime();\\n            }\\n\\n            // Return false as the order is invalid.\\n            return false;\\n        }\\n\\n        // Return true as the order time is valid.\\n        valid = true;\\n    }\\n\\n    /**\\n     * @dev Internal view function to verify the signature of an order. An\\n     *      ERC-1271 fallback will be attempted if either the signature length\\n     *      is not 64 or 65 bytes or if the recovered signer does not match the\\n     *      supplied offerer. Note that in cases where a 64 or 65 byte signature\\n     *      is supplied, only standard ECDSA signatures that recover to a\\n     *      non-zero address are supported.\\n     *\\n     * @param offerer   The offerer for the order.\\n     * @param orderHash The order hash.\\n     * @param signature A signature from the offerer indicating that the order\\n     *                  has been approved.\\n     */\\n    function _verifySignature(\\n        address offerer,\\n        bytes32 orderHash,\\n        bytes memory signature\\n    ) internal view {\\n        // Skip signature verification if the offerer is the caller.\\n        if (offerer == msg.sender) {\\n            return;\\n        }\\n\\n        // Derive EIP-712 digest using the domain separator and the order hash.\\n        bytes32 digest = _deriveEIP712Digest(_domainSeparator(), orderHash);\\n\\n        // Ensure that the signature for the digest is valid for the offerer.\\n        _assertValidSignature(offerer, digest, signature);\\n    }\\n\\n    function _verifyOrderStatus(\\n        bytes32 orderHash,\\n        OrderStatus storage orderStatus,\\n        bool firstPay,\\n        bool revertOnInvalid\\n    ) internal view returns (bool valid) {\\n        if (orderStatus.isCancelled) {\\n            if (revertOnInvalid) {\\n                revert OrderIsCancelled(orderHash);\\n            }\\n\\n            return false;\\n        }\\n\\n        if (orderStatus.isFinalized) {\\n            if (revertOnInvalid) {\\n                revert OrderAlreadyFinalized(orderHash);\\n            }\\n\\n            return false;\\n        }\\n\\n        if (firstPay) {\\n            if (orderStatus.paidTimes > 0) {\\n                if (revertOnInvalid) {\\n                    revert OrderAlreadyStarted(orderHash);\\n                }\\n                return false;\\n            }\\n        } else {\\n            if (orderStatus.paidTimes == 0) {\\n                if (revertOnInvalid) {\\n                    revert OrderNotStarted(orderHash);\\n                }\\n                return false;\\n            }\\n        }\\n\\n        valid = true;\\n    }\\n}\\n\",\"keccak256\":\"0x4166159d504ffb5810fbad9c64445fd23659f5b19e84a61dde67f8760bcd1255\",\"license\":\"MIT\"},\"erc721a/contracts/IERC721A.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// ERC721A Contracts v4.2.3\\n// Creator: Chiru Labs\\n\\npragma solidity ^0.8.4;\\n\\n/**\\n * @dev Interface of ERC721A.\\n */\\ninterface IERC721A {\\n    /**\\n     * The caller must own the token or be an approved operator.\\n     */\\n    error ApprovalCallerNotOwnerNorApproved();\\n\\n    /**\\n     * The token does not exist.\\n     */\\n    error ApprovalQueryForNonexistentToken();\\n\\n    /**\\n     * Cannot query the balance for the zero address.\\n     */\\n    error BalanceQueryForZeroAddress();\\n\\n    /**\\n     * Cannot mint to the zero address.\\n     */\\n    error MintToZeroAddress();\\n\\n    /**\\n     * The quantity of tokens minted must be more than zero.\\n     */\\n    error MintZeroQuantity();\\n\\n    /**\\n     * The token does not exist.\\n     */\\n    error OwnerQueryForNonexistentToken();\\n\\n    /**\\n     * The caller must own the token or be an approved operator.\\n     */\\n    error TransferCallerNotOwnerNorApproved();\\n\\n    /**\\n     * The token must be owned by `from`.\\n     */\\n    error TransferFromIncorrectOwner();\\n\\n    /**\\n     * Cannot safely transfer to a contract that does not implement the\\n     * ERC721Receiver interface.\\n     */\\n    error TransferToNonERC721ReceiverImplementer();\\n\\n    /**\\n     * Cannot transfer to the zero address.\\n     */\\n    error TransferToZeroAddress();\\n\\n    /**\\n     * The token does not exist.\\n     */\\n    error URIQueryForNonexistentToken();\\n\\n    /**\\n     * The `quantity` minted with ERC2309 exceeds the safety limit.\\n     */\\n    error MintERC2309QuantityExceedsLimit();\\n\\n    /**\\n     * The `extraData` cannot be set on an unintialized ownership slot.\\n     */\\n    error OwnershipNotInitializedForExtraData();\\n\\n    // =============================================================\\n    //                            STRUCTS\\n    // =============================================================\\n\\n    struct TokenOwnership {\\n        // The address of the owner.\\n        address addr;\\n        // Stores the start time of ownership with minimal overhead for tokenomics.\\n        uint64 startTimestamp;\\n        // Whether the token has been burned.\\n        bool burned;\\n        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.\\n        uint24 extraData;\\n    }\\n\\n    // =============================================================\\n    //                         TOKEN COUNTERS\\n    // =============================================================\\n\\n    /**\\n     * @dev Returns the total number of tokens in existence.\\n     * Burned tokens will reduce the count.\\n     * To get the total number of tokens minted, please see {_totalMinted}.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    // =============================================================\\n    //                            IERC165\\n    // =============================================================\\n\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n\\n    // =============================================================\\n    //                            IERC721\\n    // =============================================================\\n\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables\\n     * (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in `owner`'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`,\\n     * checking first that contract recipients are aware of the ERC721 protocol\\n     * to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move\\n     * this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement\\n     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes calldata data\\n    ) external payable;\\n\\n    /**\\n     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external payable;\\n\\n    /**\\n     * @dev Transfers `tokenId` from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}\\n     * whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token\\n     * by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external payable;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the\\n     * zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external payable;\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom}\\n     * for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}.\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    // =============================================================\\n    //                        IERC721Metadata\\n    // =============================================================\\n\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n\\n    // =============================================================\\n    //                           IERC2309\\n    // =============================================================\\n\\n    /**\\n     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`\\n     * (inclusive) is transferred from `from` to `to`, as defined in the\\n     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.\\n     *\\n     * See {_mintERC2309} for more details.\\n     */\\n    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);\\n}\\n\",\"keccak256\":\"0xa31dfe2635a25f899e279befef27ffcc02fd16e636c58d4c251a303f2355f7ad\",\"license\":\"MIT\"},\"erc721a/contracts/extensions/IERC4907A.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// ERC721A Contracts v4.2.3\\n// Creator: Chiru Labs\\n\\npragma solidity ^0.8.4;\\n\\nimport '../IERC721A.sol';\\n\\n/**\\n * @dev Interface of ERC4907A.\\n */\\ninterface IERC4907A is IERC721A {\\n    /**\\n     * The caller must own the token or be an approved operator.\\n     */\\n    error SetUserCallerNotOwnerNorApproved();\\n\\n    /**\\n     * @dev Emitted when the `user` of an NFT or the `expires` of the `user` is changed.\\n     * The zero address for user indicates that there is no user address.\\n     */\\n    event UpdateUser(uint256 indexed tokenId, address indexed user, uint64 expires);\\n\\n    /**\\n     * @dev Sets the `user` and `expires` for `tokenId`.\\n     * The zero address indicates there is no user.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own `tokenId` or be an approved operator.\\n     */\\n    function setUser(\\n        uint256 tokenId,\\n        address user,\\n        uint64 expires\\n    ) external;\\n\\n    /**\\n     * @dev Returns the user address for `tokenId`.\\n     * The zero address indicates that there is no user or if the user is expired.\\n     */\\n    function userOf(uint256 tokenId) external view returns (address);\\n\\n    /**\\n     * @dev Returns the user's expires of `tokenId`.\\n     */\\n    function userExpires(uint256 tokenId) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x92750c714391c355811da39c599a30e29442bbda258bb89b8e39dc38292a33bf\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6101a06040523480156200001257600080fd5b5060405162003806380380620038068339810160408190526200003591620004a5565b8181818181818082808080806200004b6200013b565b60e05260c081815260a0838152608085815246610100819052604080516020818101979097528082019890985260608801969096529086015230858201528351808603909101815293019091528151910120610120526001600160a01b03811661014081905260408051630a96ad3960e01b81528151630a96ad39926004808401939192918290030181865afa158015620000ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001109190620004dd565b5061016052505060016000555050506001600160a01b03166101805250620005029650505050505050565b6000808080620001626040805180820190915260048152631093941360e21b602082015290565b805160209182012060408051808201825260038152620312e360ec1b90840152519095507fe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b39450600091620003bd91016f09ee4c8cae486dedae0dedccadce8e6560831b81526f1859191c995cdcc81bd999995c995c8b60821b60108201526d1859191c995cdcc81d1bdad95b8b60921b60208201527f75696e74323536206964656e7469666965722c00000000000000000000000000602e820152701859191c995cdcc818dd5c9c995b98de4b607a1b60418201526e1859191c995cdcc8185c9d1a5cdd0b608a1b6052820152701859191c995cdcc81c1b185d199bdc9b4b607a1b6061820152711d5a5b9d0c8d4d881cdd185c9d151a5b594b60721b60728201526f1d5a5b9d0c8d4d88195b99151a5b594b60821b6084820152701d5a5b9d0c8d4d88191d5c985d1a5bdb8b607a1b60948201526f1d5a5b9d0c8d4d881c195c9a5bd91ccb60821b60a58201526e1d5a5b9d0c8d4d88185b5bdd5b9d0b608a1b60b58201526d1d5a5b9d0c8d4d881c985d1a5bcb60921b60c48201526f1d5a5b9d0c8d4d881c9bde585b1d1e4b60821b60d28201526b1d5a5b9d0c8d4d881999594b60a21b60e28201527f75696e743235362077697468647261774665652c00000000000000000000000060ee8201526c1d5a5b9d0c8d4d881cd85b1d0b609a1b6101028201527f6279746573333220636f6e647569744b65792c0000000000000000000000000061010f8201526e3ab4b73a191a9b1031b7bab73a32b960891b610122820152602960f81b6101318201526101320190565b60408051601f19818403018152908290526c08a92a06e626488dedac2d2dc5609b1b60208301526b1cdd1c9a5b99c81b985b594b60a21b602d8301526e1cdd1c9a5b99c81d995c9cda5bdb8b608a1b60398301526f1d5a5b9d0c8d4d8818da185a5b92590b60821b60488301527f6164647265737320766572696679696e67436f6e7472616374000000000000006058830152602960f81b60718301529150607201604051602081830303815290604052805190602001209250808051906020012091505090919293565b80516001600160a01b0381168114620004a057600080fd5b919050565b60008060408385031215620004b957600080fd5b620004c48362000488565b9150620004d46020840162000488565b90509250929050565b60008060408385031215620004f157600080fd5b505080516020909101519092909150565b60805160a05160c05160e05161010051610120516101405161016051610180516132696200059d6000396000818161026e015281816120260152818161270a0152818161279001526129d8015260006120e2015260008181610ef601526120a001526000611dbc01526000611cec01526000818161051d01526107c701526000611d1a01526000611d6801526000611d4001526132696000f3fe6080604052600436106100bc5760003560e01c8063b86ae9e111610074578063f07ec3731161004e578063f07ec37314610218578063f47b774014610238578063ffc5d97a1461025c57600080fd5b8063b86ae9e1146101d2578063be92d18e146101f2578063d9e534111461020557600080fd5b80635b34b966116100a55780635b34b9661461016f5780639432cc1d14610192578063a3210e7c146101b257600080fd5b806322378003146100c157806346423aa7146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004612c46565b6102b5565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b50610116610111366004612cbb565b6102c8565b604080519815158952961515602089015294151595870195909552911515606086015273ffffffffffffffffffffffffffffffffffffffff16608085015260a084015260c083019190915260e0820152610100016100ed565b34801561017b57600080fd5b5061018461035b565b6040519081526020016100ed565b34801561019e57600080fd5b506100e16101ad366004612cd4565b61036a565b3480156101be57600080fd5b506100e16101cd366004612d51565b610376565b3480156101de57600080fd5b506101846101ed366004612d81565b610387565b6100e1610200366004612d9e565b610556565b6100e1610213366004612de3565b610562565b34801561022457600080fd5b50610184610233366004612e43565b610577565b34801561024457600080fd5b5061024d6105a2565b6040516100ed93929190612e5e565b34801561026857600080fd5b506102907f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b60006102c183836105ba565b9392505050565b600080600080600080600080610340896000908152600260208190526040909120805460018201549282015460039092015460ff8083169561010084048216956201000085048316956301000000860490931694640100000000900473ffffffffffffffffffffffffffffffffffffffff1693909291565b97509750975097509750975097509750919395975091939597565b600061036561090a565b905090565b60006102c18383610967565b600061038182610b27565b92915050565b60408051610220810190915260009061038190806103a86020860186612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260408086013560208301520161040a6080860160608701612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260200161043560a0860160808701612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260200161046060c0860160a08701612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460c0013581526020018460e00135815260200184610100013581526020018461012001358152602001846101400135815260200184610160013581526020018461018001358152602001846101a001358152602001846101c001358152602001846101e0013581526020018461020001358152508361022001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60006102c18383610c2c565b600061056f848484610dad565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054610381565b60606000806105af610ed5565b925092509250909192565b60006105c4610f50565b6000808084815b818110156108fc57368888838181106105e6576105e6612ef7565b90506020028101906105f89190612f26565b9050806106086020820182612e43565b94506108006040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018360200160208101906106489190612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260408085013560208301520161067c6080850160608601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106a760a0850160808601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106d260c0850160a08601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018360c0013581526020018360e00135815260200183610100013581526020018361012001358152602001836101400135815260200183610160013581526020018361018001358152602001836101a001358152602001836101c001358152602001836101e0013581526020018361020001358152506107a08360000160208101906107789190612e43565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60008181526002602052604090209750955061081f8688600180610f8e565b50865460ff166108f257610876858761083c610220860186612f64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110d092505050565b86547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117875560405173ffffffffffffffffffffffffffffffffffffffff8616907f09e126c208c7c6b8de91fb519ff46ef1f6eb471f6376862ca4de42ea000026d6906108e99089815260200190565b60405180910390a25b50506001016105cb565b506001979650505050505050565b6000610914610f50565b503360008181526001602081815260409283902080549092019182905591518181529092917f721c20121297512b72821b97f5326877ea8ecf4bb9948fea5bfcb6453074d37f910160405180910390a290565b6000610971610f50565b60008083815b81811015610b1a573687878381811061099257610992612ef7565b610240029190910191506109ab90506020820182612e43565b93503373ffffffffffffffffffffffffffffffffffffffff8516146109fc576040517f80ec737400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a3c6040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e43565b6000818152600260205260409020600181015490975090915015610a94576040517f9633f278000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010017865560405173ffffffffffffffffffffffffffffffffffffffff8616907fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275390610b089084815260200190565b60405180910390a25050600101610977565b5060019695505050505050565b600080600080610b3885600161114d565b92509250925080610b4e57506000949350505050565b610b7f6002610b636040880160208901612e43565b30610b7160208a018a612e43565b60408a013560016000611299565b6000610b916080870160608801612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610bbb57610bb68583611388565b610bc5565b610bc58583611425565b610bd26020860186612e43565b73ffffffffffffffffffffffffffffffffffffffff167fe68e1577ba456c32a752dbe4fa63fbaa46841e7e54bc9667d021b9af64a1cada84604051610c1991815260200190565b60405180910390a2506001949350505050565b600080600080610c3d8660016114dd565b92509250925081610c545760009350505050610381565b856000610c648260018084611654565b90506000610c786080840160608501612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610cd757610cc86002610ca86040850160208601612e43565b610cb56020860186612e43565b3086604001356001886102000135611299565b610cd28282611843565b610d3a565b604080516020808252818301909252600091602082018180368337019050509050610d2c610d0b6040850160208601612e43565b610d186020860186612e43565b3086604001356001886102000135876118fc565b610d3883838a84611962565b505b610d476020830183612e43565b73ffffffffffffffffffffffffffffffffffffffff167f8fb2c26b66af59de39b1b2f4e1fba157f4408a9b52495599333e37e3191b08698685604051610d97929190918252602082015260400190565b60405180910390a2506001979650505050505050565b6000806000806000610dc188876001611a83565b929650909450909250905080610dde5760009450505050506102c1565b506000610dee8887600085611654565b90506000610e0260808a0160608b01612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610e2c57610e278882611843565b610e5b565b604080516020808252818301909252600091602082018180368337019050509050610e5989838a84611962565b505b8115610e8657610e866002610e7660408b0160208c01612e43565b308660408d013560016000611299565b60408051858152602081018890528315158183015290517f6cb64aa506cc92732fc83160c8ea61203b5a13a8cf92e5b5c7ccc4ba6bb41d389181900360600190a1506001979650505050505050565b6060600080610ee2611ce8565b6040805160038082528183019092529193507f0000000000000000000000000000000000000000000000000000000000000000925060208201818036833750507f312e3100000000000000000000000000000000000000000000000000000000006020830152509391925090565b600160005414610f8c576040517f7fa8a98700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8254600090610100900460ff1615610fe3578115610fdb576040517f1a51557400000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b50600061056f565b835462010000900460ff161561102e578115610fdb576040517f836f8ef900000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b821561107e57600384015415611079578115610fdb576040517f9633f27800000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b6110c5565b83600301546000036110c5578115610fdb576040517fe567c93e00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b506001949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8416036110f257505050565b600061113a6110ff611ce8565b7f1901000000000000000000000000000000000000000000000000000000000000600090815260029190915260228581526042822091905290565b9050611147848284611dde565b50505050565b6000808061117361116336879003870187613021565b6107a06107786020890189612e43565b600081815260026020526040902080549194509060ff166111d35784156111c9576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b5060009050611292565b806003015492506111e78482600088610f8e565b6111f5575060009050611292565b4261120561010088013585613144565b82600101546112149190613181565b11156112555784156111c9576040517f031ea4cb00000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b6112628160020154611ff7565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1663010100001790555060015b9250925092565b801561130e57600060405190507f4ce34aa200000000000000000000000000000000000000000000000000000000815260206004820152600160248201528760448201528660648201528560848201528460a48201528360c48201528260e4820152611308828261010461209a565b5061137f565b600287600381111561132257611322613199565b036113725781600114611361576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136d86868686612236565b61137f565b61137f8686868686612345565b50505050505050565b6113bc6113986020840184612e43565b826113ad6101208601356101808701356131c8565b6113b79190613144565b612477565b6000816113d36101208501356101408601356131c8565b6113dd9190613144565b90506127106113f161016085013583613144565b6113fb91906131c8565b6114059082613203565b905061142061141a60c0850160a08601612e43565b82612477565b505050565b6114696114386080840160608501612e43565b6114456020850185612e43565b8361145a6101208701356101808801356131c8565b6114649190613144565b6124ec565b6000816114806101208501356101408601356131c8565b61148a9190613144565b905061271061149e61016085013583613144565b6114a891906131c8565b6114b29082613203565b90506114206114c76080850160608601612e43565b6114d760c0860160a08701612e43565b836124ec565b60008080846114f560c082013560e083013587612654565b611509575060009250829150819050611292565b6002816101200135101561155f57841561154f576040517f0a199cb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009250829150819050611292565b61158161157136839003830183613021565b6107a06107786020850185612e43565b600081815260026020526040902090945061159f8582600189610f8e565b6115b25750600092508291506112929050565b805460ff166115da576115da6115cb6020840184612e43565b8661083c6102208b018b612f64565b6115fe336115ee6040850160208601612e43565b84604001358561010001356126b3565b815460017fffffffffffffffff000000000000000000000000000000000000000000ff00009091163364010000000002178117835542818401556002830182905560039092018290559497909650939450505050565b61167f6040518060800160405280600081526020016000815260200160008152602001600081525090565b60008061169186610120890135613203565b6101c088013560408501529050831561177d576116b86101208801356101808901356131c8565b6116c29082613144565b6116d190610180890135613203565b91506116e76101208801356101408901356131c8565b6116f19082613144565b61170090610140890135613203565b835260408301518290826127106101608b01356117276101208d01356101408e01356131c8565b6117319190613144565b61173b91906131c8565b6117459190613144565b611754906101408b0135613203565b61175e9190613203565b6117689190613203565b60208401526101808701356060840152611839565b6117916101208801356101808901356131c8565b61179b9087613144565b91506117b16101208801356101408901356131c8565b6117bb9087613144565b80845260408401518391612710906117d9906101608c013590613144565b6117e391906131c8565b6117ed9190613203565b6117f79190613203565b6020840152841561183957866101a00135836000018181516118199190613181565b9052506040830180516101a08901359190611835908390613181565b9052505b5050949350505050565b80513490811015611880576040517f1a783b8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189a6118906020850185612e43565b8360200151612477565b6118b76118ad60c0850160a08601612e43565b8360400151612477565b6060820151156118de576118de6118d460a0850160808601612e43565b8360600151612477565b81516118ea9082613203565b90508015611420576114203382612477565b6119068183612860565b816119515782600114611945576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136d87878787612236565b61137f828260028a8a8a8a8a61287f565b3360006119756080870160608801612e43565b9050611998818361198c60c08a0160a08b01612e43565b88604001518888612918565b6060850151156119c3576119c381836119b760a08a0160808b01612e43565b88606001518888612918565b606085015160408601518651600092916119dc91613203565b6119e69190613203565b905085602001518110611a3f57611a118284611a0560208b018b612e43565b89602001518989612918565b6020860151611a209082613203565b90508015611a3657611a36828430848989612918565b61136d84612953565b611a598284611a5160208b018b612e43565b848989612918565b611a6284612953565b61137f82611a7360208a018a612e43565b8389602001516114649190613203565b6000808080611aaa611a9a36899003890189613021565b6107a061077860208b018b612e43565b600081815260026020526040902080549195509060ff16611b10578515611b00576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b5060009250829150819050611cdf565b611b1d8582600089610f8e565b611b31575060009250829150819050611cdf565b876101200135878260030154611b479190613181565b1180611b535750600187105b15611b93578515611b00576040517fc8910ec000000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b428861010001358260030154611ba99190613144565b8260010154611bb89190613181565b1015611bf9578515611b00576040517f2e775cae00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b86816003016000828254611c0d9190613181565b909155505060038101546101208901359003611c655780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000178155600281015460019250611c6090611ff7565b611cb9565b805460028201546003830154611cb992640100000000900473ffffffffffffffffffffffffffffffffffffffff169190611ca5906101008d013590613144565b8460010154611cb49190613181565b61297c565b54640100000000900473ffffffffffffffffffffffffffffffffffffffff169250600191505b93509350935093565b60007f00000000000000000000000000000000000000000000000000000000000000004614611db957610365604080517f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000806000526000825160208403805182604103600060018211611e65576040880151606089015160001a96508215611e4357601b8160ff1c0196507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811660408a01525b8689528985526020600060808760015afa508385528589526040890152506000515b8914891515169550859050611fbc57604082526044860380516040880380517f1626ba7e0000000000000000000000000000000000000000000000000000000084528a82526020600060648901868f5afa98508815611fb2577f1626ba7e0000000000000000000000000000000000000000000000000000000060005114611fb2578b3b15611f18577f4f7fb80d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6001876041031115611f4e577f8baa579f0000000000000000000000000000000000000000000000000000000060005260046000fd5b640101000000881a611f88577f1f003d0a000000000000000000000000000000000000000000000000000000006000528760045260246000fd5b7f815e1d640000000000000000000000000000000000000000000000000000000060005260046000fd5b8486529190925290525b505050508061114757611fcd612a30565b7f4f7fb80d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b15801561207f57600080fd5b505af1158015612093573d6000803e3d6000fd5b5050505050565b604080517f000000000000000000000000000000000000000000000000000000000000000074ff000000000000000000000000000000000000000017600090815260208690527f000000000000000000000000000000000000000000000000000000000000000083526055600b209190925273ffffffffffffffffffffffffffffffffffffffff169050600080600080526020600085876000875af191506000519050816121945761214a612a30565b6040517fd13d53d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610a8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4ce34aa2000000000000000000000000000000000000000000000000000000001461222e576040517f1cf99b260000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff84166024820152604401610a8b565b505050505050565b833b61226a577f5f15d672000000000000000000000000000000000000000000000000000000006000528360045260246000fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000006000528360045282602452816044526000806064600080895af180612336573d156122f7576020601f3d01046020830481600302818311156122de57818303600302610200838002858002030401015b5a6020820110156122f3573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005285600452846024528360445282606452600160845260a46000fd5b50604052505060006060525050565b843b612379577f5f15d672000000000000000000000000000000000000000000000000000000006000528460045260246000fd5b60405160805160a05160c0517ff242432a000000000000000000000000000000000000000000000000000000006000528760045286602452856044528460645260a0608452600060a45260008060c46000808d5af18061245b573d1561241d576020601f3d010460208604816003028183111561240457818303600302610200838002858002030401015b5a602082011015612419573d6000803e3d6000fd5b5050505b7ff486bc8700000000000000000000000000000000000000000000000000000000600052896004528860245287604452866064528560845260a46000fd5b5060809290925260a05260c05260405250506000606052505050565b61248081612a78565b600080600080600085875af19050806114205761249b612a30565b6040517f470c7c1d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610a8b565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528260045281602452602060006044600080885af1803d15601f3d116001600051141617163d151581166126455780863b151516612645578061261757816125dd573d1561259e576020601f3d010460208404816003028183111561258557818303600302610200838002858002030401015b5a60208201101561259a573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005285600452306024528460445260006064528360845260a46000fd5b7f98891923000000000000000000000000000000000000000000000000000000006000528560045230602452846044528360645260846000fd5b7f5f15d672000000000000000000000000000000000000000000000000000000006000528560045260246000fd5b50506040525050600060605250565b6000428411806126645750428311155b156126a95781156126a1576040517f6f7eac2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006102c1565b5060019392505050565b6040517fc6c3bbe600000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84811660248301526044820184905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c6c3bbe6906064016020604051808303816000875af1158015612753573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612777919061321a565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663e030565e82886127c14288613181565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff909116602483015267ffffffffffffffff166044820152606401600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b509298975050505050505050565b600061286d836020015190565b90508181146114205761142083612953565b600060208851036128d35750604080885260208089018a90527f4ce34aa2000000000000000000000000000000000000000000000000000000009189019190915260448801526001606488018190526128e2565b50606487018051600101908190525b603c60c082028901038781528660208201528560408201528460608201528360808201528260a082015250505050505050505050565b61292183612a78565b61292b8183612860565b816129415761293c86868686612ab5565b61222e565b61222e8282600189898960008a61287f565b604081511461295f5750565b600061296c826020015190565b90506129788183612c22565b5050565b6040517fe030565e0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff848116602483015267ffffffffffffffff831660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e030565e90606401600060405180830381600087803b158015612a1c57600080fd5b505af115801561137f573d6000803e3d6000fd5b3d15610f8c576020601f3d01046020604051048160030281831115612a6357818303600302610200838002858002030401015b5a602082011015611420573d6000803e3d6000fd5b80600003612ab2576040517f91b3e51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000600052836004528260245281604452602060006064600080895af1803d15601f3d116001600051141617163d15158116612c125780873b151516612c125780612be45781612baa573d15612b6b576020601f3d0104602084048160030281831115612b5257818303600302610200838002858002030401015b5a602082011015612b67573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005286600452856024528460445260006064528360845260a46000fd5b7f98891923000000000000000000000000000000000000000000000000000000006000528660045285602452846044528360645260846000fd5b7f5f15d672000000000000000000000000000000000000000000000000000000006000528660045260246000fd5b5050604052505060006060525050565b6064810151604082019060c002604401612c3d84838361209a565b50506020905250565b60008060208385031215612c5957600080fd5b823567ffffffffffffffff80821115612c7157600080fd5b818501915085601f830112612c8557600080fd5b813581811115612c9457600080fd5b8660208260051b8501011115612ca957600080fd5b60209290920196919550909350505050565b600060208284031215612ccd57600080fd5b5035919050565b60008060208385031215612ce757600080fd5b823567ffffffffffffffff80821115612cff57600080fd5b818501915085601f830112612d1357600080fd5b813581811115612d2257600080fd5b86602061024083028501011115612ca957600080fd5b60006102208284031215612d4b57600080fd5b50919050565b60006102208284031215612d6457600080fd5b6102c18383612d38565b60006102408284031215612d4b57600080fd5b60006102408284031215612d9457600080fd5b6102c18383612d6e565b60008060408385031215612db157600080fd5b823567ffffffffffffffff811115612dc857600080fd5b612dd485828601612d6e565b95602094909401359450505050565b60008060006102608486031215612df957600080fd5b612e038585612d38565b956102208501359550610240909401359392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e3e57600080fd5b919050565b600060208284031215612e5557600080fd5b6102c182612e1a565b606081526000845180606084015260005b81811015612e8c5760208188018101516080868401015201612e6f565b81811115612e9e576000608083860101525b5060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc1833603018112612f5a57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612f9957600080fd5b83018035915067ffffffffffffffff821115612fb457600080fd5b602001915036819003821315612fc957600080fd5b9250929050565b604051610220810167ffffffffffffffff8111828210171561301b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000610220828403121561303457600080fd5b61303c612fd0565b61304583612e1a565b815261305360208401612e1a565b60208201526040830135604082015261306e60608401612e1a565b606082015261307f60808401612e1a565b608082015261309060a08401612e1a565b60a082015260c0838101359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e08084013590820152610200928301359281019290925250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317c5761317c613115565b500290565b6000821982111561319457613194613115565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000826131fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561321557613215613115565b500390565b60006020828403121561322c57600080fd5b505191905056fea26469706673582212208973cac9304a6e97f804d4e16010abc1590e388228a5665d8cd4bbe0352376b264736f6c634300080e0033",
  "deployedBytecode": "0x6080604052600436106100bc5760003560e01c8063b86ae9e111610074578063f07ec3731161004e578063f07ec37314610218578063f47b774014610238578063ffc5d97a1461025c57600080fd5b8063b86ae9e1146101d2578063be92d18e146101f2578063d9e534111461020557600080fd5b80635b34b966116100a55780635b34b9661461016f5780639432cc1d14610192578063a3210e7c146101b257600080fd5b806322378003146100c157806346423aa7146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004612c46565b6102b5565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b50610116610111366004612cbb565b6102c8565b604080519815158952961515602089015294151595870195909552911515606086015273ffffffffffffffffffffffffffffffffffffffff16608085015260a084015260c083019190915260e0820152610100016100ed565b34801561017b57600080fd5b5061018461035b565b6040519081526020016100ed565b34801561019e57600080fd5b506100e16101ad366004612cd4565b61036a565b3480156101be57600080fd5b506100e16101cd366004612d51565b610376565b3480156101de57600080fd5b506101846101ed366004612d81565b610387565b6100e1610200366004612d9e565b610556565b6100e1610213366004612de3565b610562565b34801561022457600080fd5b50610184610233366004612e43565b610577565b34801561024457600080fd5b5061024d6105a2565b6040516100ed93929190612e5e565b34801561026857600080fd5b506102907f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b60006102c183836105ba565b9392505050565b600080600080600080600080610340896000908152600260208190526040909120805460018201549282015460039092015460ff8083169561010084048216956201000085048316956301000000860490931694640100000000900473ffffffffffffffffffffffffffffffffffffffff1693909291565b97509750975097509750975097509750919395975091939597565b600061036561090a565b905090565b60006102c18383610967565b600061038182610b27565b92915050565b60408051610220810190915260009061038190806103a86020860186612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260408086013560208301520161040a6080860160608701612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260200161043560a0860160808701612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260200161046060c0860160a08701612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460c0013581526020018460e00135815260200184610100013581526020018461012001358152602001846101400135815260200184610160013581526020018461018001358152602001846101a001358152602001846101c001358152602001846101e0013581526020018461020001358152508361022001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60006102c18383610c2c565b600061056f848484610dad565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054610381565b60606000806105af610ed5565b925092509250909192565b60006105c4610f50565b6000808084815b818110156108fc57368888838181106105e6576105e6612ef7565b90506020028101906105f89190612f26565b9050806106086020820182612e43565b94506108006040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018360200160208101906106489190612e43565b73ffffffffffffffffffffffffffffffffffffffff16815260408085013560208301520161067c6080850160608601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106a760a0850160808601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106d260c0850160a08601612e43565b73ffffffffffffffffffffffffffffffffffffffff1681526020018360c0013581526020018360e00135815260200183610100013581526020018361012001358152602001836101400135815260200183610160013581526020018361018001358152602001836101a001358152602001836101c001358152602001836101e0013581526020018361020001358152506107a08360000160208101906107789190612e43565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60008181526002602052604090209750955061081f8688600180610f8e565b50865460ff166108f257610876858761083c610220860186612f64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110d092505050565b86547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117875560405173ffffffffffffffffffffffffffffffffffffffff8616907f09e126c208c7c6b8de91fb519ff46ef1f6eb471f6376862ca4de42ea000026d6906108e99089815260200190565b60405180910390a25b50506001016105cb565b506001979650505050505050565b6000610914610f50565b503360008181526001602081815260409283902080549092019182905591518181529092917f721c20121297512b72821b97f5326877ea8ecf4bb9948fea5bfcb6453074d37f910160405180910390a290565b6000610971610f50565b60008083815b81811015610b1a573687878381811061099257610992612ef7565b610240029190910191506109ab90506020820182612e43565b93503373ffffffffffffffffffffffffffffffffffffffff8516146109fc576040517f80ec737400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a3c6040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e43565b6000818152600260205260409020600181015490975090915015610a94576040517f9633f278000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010017865560405173ffffffffffffffffffffffffffffffffffffffff8616907fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275390610b089084815260200190565b60405180910390a25050600101610977565b5060019695505050505050565b600080600080610b3885600161114d565b92509250925080610b4e57506000949350505050565b610b7f6002610b636040880160208901612e43565b30610b7160208a018a612e43565b60408a013560016000611299565b6000610b916080870160608801612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610bbb57610bb68583611388565b610bc5565b610bc58583611425565b610bd26020860186612e43565b73ffffffffffffffffffffffffffffffffffffffff167fe68e1577ba456c32a752dbe4fa63fbaa46841e7e54bc9667d021b9af64a1cada84604051610c1991815260200190565b60405180910390a2506001949350505050565b600080600080610c3d8660016114dd565b92509250925081610c545760009350505050610381565b856000610c648260018084611654565b90506000610c786080840160608501612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610cd757610cc86002610ca86040850160208601612e43565b610cb56020860186612e43565b3086604001356001886102000135611299565b610cd28282611843565b610d3a565b604080516020808252818301909252600091602082018180368337019050509050610d2c610d0b6040850160208601612e43565b610d186020860186612e43565b3086604001356001886102000135876118fc565b610d3883838a84611962565b505b610d476020830183612e43565b73ffffffffffffffffffffffffffffffffffffffff167f8fb2c26b66af59de39b1b2f4e1fba157f4408a9b52495599333e37e3191b08698685604051610d97929190918252602082015260400190565b60405180910390a2506001979650505050505050565b6000806000806000610dc188876001611a83565b929650909450909250905080610dde5760009450505050506102c1565b506000610dee8887600085611654565b90506000610e0260808a0160608b01612e43565b73ffffffffffffffffffffffffffffffffffffffff1603610e2c57610e278882611843565b610e5b565b604080516020808252818301909252600091602082018180368337019050509050610e5989838a84611962565b505b8115610e8657610e866002610e7660408b0160208c01612e43565b308660408d013560016000611299565b60408051858152602081018890528315158183015290517f6cb64aa506cc92732fc83160c8ea61203b5a13a8cf92e5b5c7ccc4ba6bb41d389181900360600190a1506001979650505050505050565b6060600080610ee2611ce8565b6040805160038082528183019092529193507f0000000000000000000000000000000000000000000000000000000000000000925060208201818036833750507f312e3100000000000000000000000000000000000000000000000000000000006020830152509391925090565b600160005414610f8c576040517f7fa8a98700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8254600090610100900460ff1615610fe3578115610fdb576040517f1a51557400000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b50600061056f565b835462010000900460ff161561102e578115610fdb576040517f836f8ef900000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b821561107e57600384015415611079578115610fdb576040517f9633f27800000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b6110c5565b83600301546000036110c5578115610fdb576040517fe567c93e00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b506001949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8416036110f257505050565b600061113a6110ff611ce8565b7f1901000000000000000000000000000000000000000000000000000000000000600090815260029190915260228581526042822091905290565b9050611147848284611dde565b50505050565b6000808061117361116336879003870187613021565b6107a06107786020890189612e43565b600081815260026020526040902080549194509060ff166111d35784156111c9576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b5060009050611292565b806003015492506111e78482600088610f8e565b6111f5575060009050611292565b4261120561010088013585613144565b82600101546112149190613181565b11156112555784156111c9576040517f031ea4cb00000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b6112628160020154611ff7565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1663010100001790555060015b9250925092565b801561130e57600060405190507f4ce34aa200000000000000000000000000000000000000000000000000000000815260206004820152600160248201528760448201528660648201528560848201528460a48201528360c48201528260e4820152611308828261010461209a565b5061137f565b600287600381111561132257611322613199565b036113725781600114611361576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136d86868686612236565b61137f565b61137f8686868686612345565b50505050505050565b6113bc6113986020840184612e43565b826113ad6101208601356101808701356131c8565b6113b79190613144565b612477565b6000816113d36101208501356101408601356131c8565b6113dd9190613144565b90506127106113f161016085013583613144565b6113fb91906131c8565b6114059082613203565b905061142061141a60c0850160a08601612e43565b82612477565b505050565b6114696114386080840160608501612e43565b6114456020850185612e43565b8361145a6101208701356101808801356131c8565b6114649190613144565b6124ec565b6000816114806101208501356101408601356131c8565b61148a9190613144565b905061271061149e61016085013583613144565b6114a891906131c8565b6114b29082613203565b90506114206114c76080850160608601612e43565b6114d760c0860160a08701612e43565b836124ec565b60008080846114f560c082013560e083013587612654565b611509575060009250829150819050611292565b6002816101200135101561155f57841561154f576040517f0a199cb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009250829150819050611292565b61158161157136839003830183613021565b6107a06107786020850185612e43565b600081815260026020526040902090945061159f8582600189610f8e565b6115b25750600092508291506112929050565b805460ff166115da576115da6115cb6020840184612e43565b8661083c6102208b018b612f64565b6115fe336115ee6040850160208601612e43565b84604001358561010001356126b3565b815460017fffffffffffffffff000000000000000000000000000000000000000000ff00009091163364010000000002178117835542818401556002830182905560039092018290559497909650939450505050565b61167f6040518060800160405280600081526020016000815260200160008152602001600081525090565b60008061169186610120890135613203565b6101c088013560408501529050831561177d576116b86101208801356101808901356131c8565b6116c29082613144565b6116d190610180890135613203565b91506116e76101208801356101408901356131c8565b6116f19082613144565b61170090610140890135613203565b835260408301518290826127106101608b01356117276101208d01356101408e01356131c8565b6117319190613144565b61173b91906131c8565b6117459190613144565b611754906101408b0135613203565b61175e9190613203565b6117689190613203565b60208401526101808701356060840152611839565b6117916101208801356101808901356131c8565b61179b9087613144565b91506117b16101208801356101408901356131c8565b6117bb9087613144565b80845260408401518391612710906117d9906101608c013590613144565b6117e391906131c8565b6117ed9190613203565b6117f79190613203565b6020840152841561183957866101a00135836000018181516118199190613181565b9052506040830180516101a08901359190611835908390613181565b9052505b5050949350505050565b80513490811015611880576040517f1a783b8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189a6118906020850185612e43565b8360200151612477565b6118b76118ad60c0850160a08601612e43565b8360400151612477565b6060820151156118de576118de6118d460a0850160808601612e43565b8360600151612477565b81516118ea9082613203565b90508015611420576114203382612477565b6119068183612860565b816119515782600114611945576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136d87878787612236565b61137f828260028a8a8a8a8a61287f565b3360006119756080870160608801612e43565b9050611998818361198c60c08a0160a08b01612e43565b88604001518888612918565b6060850151156119c3576119c381836119b760a08a0160808b01612e43565b88606001518888612918565b606085015160408601518651600092916119dc91613203565b6119e69190613203565b905085602001518110611a3f57611a118284611a0560208b018b612e43565b89602001518989612918565b6020860151611a209082613203565b90508015611a3657611a36828430848989612918565b61136d84612953565b611a598284611a5160208b018b612e43565b848989612918565b611a6284612953565b61137f82611a7360208a018a612e43565b8389602001516114649190613203565b6000808080611aaa611a9a36899003890189613021565b6107a061077860208b018b612e43565b600081815260026020526040902080549195509060ff16611b10578515611b00576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b5060009250829150819050611cdf565b611b1d8582600089610f8e565b611b31575060009250829150819050611cdf565b876101200135878260030154611b479190613181565b1180611b535750600187105b15611b93578515611b00576040517fc8910ec000000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b428861010001358260030154611ba99190613144565b8260010154611bb89190613181565b1015611bf9578515611b00576040517f2e775cae00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b86816003016000828254611c0d9190613181565b909155505060038101546101208901359003611c655780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000178155600281015460019250611c6090611ff7565b611cb9565b805460028201546003830154611cb992640100000000900473ffffffffffffffffffffffffffffffffffffffff169190611ca5906101008d013590613144565b8460010154611cb49190613181565b61297c565b54640100000000900473ffffffffffffffffffffffffffffffffffffffff169250600191505b93509350935093565b60007f00000000000000000000000000000000000000000000000000000000000000004614611db957610365604080517f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000806000526000825160208403805182604103600060018211611e65576040880151606089015160001a96508215611e4357601b8160ff1c0196507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811660408a01525b8689528985526020600060808760015afa508385528589526040890152506000515b8914891515169550859050611fbc57604082526044860380516040880380517f1626ba7e0000000000000000000000000000000000000000000000000000000084528a82526020600060648901868f5afa98508815611fb2577f1626ba7e0000000000000000000000000000000000000000000000000000000060005114611fb2578b3b15611f18577f4f7fb80d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6001876041031115611f4e577f8baa579f0000000000000000000000000000000000000000000000000000000060005260046000fd5b640101000000881a611f88577f1f003d0a000000000000000000000000000000000000000000000000000000006000528760045260246000fd5b7f815e1d640000000000000000000000000000000000000000000000000000000060005260046000fd5b8486529190925290525b505050508061114757611fcd612a30565b7f4f7fb80d0000000000000000000000000000000000000000000000000000000060005260046000fd5b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b15801561207f57600080fd5b505af1158015612093573d6000803e3d6000fd5b5050505050565b604080517f000000000000000000000000000000000000000000000000000000000000000074ff000000000000000000000000000000000000000017600090815260208690527f000000000000000000000000000000000000000000000000000000000000000083526055600b209190925273ffffffffffffffffffffffffffffffffffffffff169050600080600080526020600085876000875af191506000519050816121945761214a612a30565b6040517fd13d53d400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610a8b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f4ce34aa2000000000000000000000000000000000000000000000000000000001461222e576040517f1cf99b260000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff84166024820152604401610a8b565b505050505050565b833b61226a577f5f15d672000000000000000000000000000000000000000000000000000000006000528360045260246000fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000006000528360045282602452816044526000806064600080895af180612336573d156122f7576020601f3d01046020830481600302818311156122de57818303600302610200838002858002030401015b5a6020820110156122f3573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005285600452846024528360445282606452600160845260a46000fd5b50604052505060006060525050565b843b612379577f5f15d672000000000000000000000000000000000000000000000000000000006000528460045260246000fd5b60405160805160a05160c0517ff242432a000000000000000000000000000000000000000000000000000000006000528760045286602452856044528460645260a0608452600060a45260008060c46000808d5af18061245b573d1561241d576020601f3d010460208604816003028183111561240457818303600302610200838002858002030401015b5a602082011015612419573d6000803e3d6000fd5b5050505b7ff486bc8700000000000000000000000000000000000000000000000000000000600052896004528860245287604452866064528560845260a46000fd5b5060809290925260a05260c05260405250506000606052505050565b61248081612a78565b600080600080600085875af19050806114205761249b612a30565b6040517f470c7c1d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610a8b565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528260045281602452602060006044600080885af1803d15601f3d116001600051141617163d151581166126455780863b151516612645578061261757816125dd573d1561259e576020601f3d010460208404816003028183111561258557818303600302610200838002858002030401015b5a60208201101561259a573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005285600452306024528460445260006064528360845260a46000fd5b7f98891923000000000000000000000000000000000000000000000000000000006000528560045230602452846044528360645260846000fd5b7f5f15d672000000000000000000000000000000000000000000000000000000006000528560045260246000fd5b50506040525050600060605250565b6000428411806126645750428311155b156126a95781156126a1576040517f6f7eac2600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006102c1565b5060019392505050565b6040517fc6c3bbe600000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff84811660248301526044820184905260009182917f0000000000000000000000000000000000000000000000000000000000000000169063c6c3bbe6906064016020604051808303816000875af1158015612753573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612777919061321a565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663e030565e82886127c14288613181565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff909116602483015267ffffffffffffffff166044820152606401600060405180830381600087803b15801561283e57600080fd5b505af1158015612852573d6000803e3d6000fd5b509298975050505050505050565b600061286d836020015190565b90508181146114205761142083612953565b600060208851036128d35750604080885260208089018a90527f4ce34aa2000000000000000000000000000000000000000000000000000000009189019190915260448801526001606488018190526128e2565b50606487018051600101908190525b603c60c082028901038781528660208201528560408201528460608201528360808201528260a082015250505050505050505050565b61292183612a78565b61292b8183612860565b816129415761293c86868686612ab5565b61222e565b61222e8282600189898960008a61287f565b604081511461295f5750565b600061296c826020015190565b90506129788183612c22565b5050565b6040517fe030565e0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff848116602483015267ffffffffffffffff831660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e030565e90606401600060405180830381600087803b158015612a1c57600080fd5b505af115801561137f573d6000803e3d6000fd5b3d15610f8c576020601f3d01046020604051048160030281831115612a6357818303600302610200838002858002030401015b5a602082011015611420573d6000803e3d6000fd5b80600003612ab2576040517f91b3e51400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000600052836004528260245281604452602060006064600080895af1803d15601f3d116001600051141617163d15158116612c125780873b151516612c125780612be45781612baa573d15612b6b576020601f3d0104602084048160030281831115612b5257818303600302610200838002858002030401015b5a602082011015612b67573d6000803e3d6000fd5b5050505b7ff486bc870000000000000000000000000000000000000000000000000000000060005286600452856024528460445260006064528360845260a46000fd5b7f98891923000000000000000000000000000000000000000000000000000000006000528660045285602452846044528360645260846000fd5b7f5f15d672000000000000000000000000000000000000000000000000000000006000528660045260246000fd5b5050604052505060006060525050565b6064810151604082019060c002604401612c3d84838361209a565b50506020905250565b60008060208385031215612c5957600080fd5b823567ffffffffffffffff80821115612c7157600080fd5b818501915085601f830112612c8557600080fd5b813581811115612c9457600080fd5b8660208260051b8501011115612ca957600080fd5b60209290920196919550909350505050565b600060208284031215612ccd57600080fd5b5035919050565b60008060208385031215612ce757600080fd5b823567ffffffffffffffff80821115612cff57600080fd5b818501915085601f830112612d1357600080fd5b813581811115612d2257600080fd5b86602061024083028501011115612ca957600080fd5b60006102208284031215612d4b57600080fd5b50919050565b60006102208284031215612d6457600080fd5b6102c18383612d38565b60006102408284031215612d4b57600080fd5b60006102408284031215612d9457600080fd5b6102c18383612d6e565b60008060408385031215612db157600080fd5b823567ffffffffffffffff811115612dc857600080fd5b612dd485828601612d6e565b95602094909401359450505050565b60008060006102608486031215612df957600080fd5b612e038585612d38565b956102208501359550610240909401359392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e3e57600080fd5b919050565b600060208284031215612e5557600080fd5b6102c182612e1a565b606081526000845180606084015260005b81811015612e8c5760208188018101516080868401015201612e6f565b81811115612e9e576000608083860101525b5060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc1833603018112612f5a57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612f9957600080fd5b83018035915067ffffffffffffffff821115612fb457600080fd5b602001915036819003821315612fc957600080fd5b9250929050565b604051610220810167ffffffffffffffff8111828210171561301b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b6000610220828403121561303457600080fd5b61303c612fd0565b61304583612e1a565b815261305360208401612e1a565b60208201526040830135604082015261306e60608401612e1a565b606082015261307f60808401612e1a565b608082015261309060a08401612e1a565b60a082015260c0838101359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e08084013590820152610200928301359281019290925250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561317c5761317c613115565b500290565b6000821982111561319457613194613115565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000826131fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008282101561321557613215613115565b500390565b60006020828403121561322c57600080fd5b505191905056fea26469706673582212208973cac9304a6e97f804d4e16010abc1590e388228a5665d8cd4bbe0352376b264736f6c634300080e0033",
  "devdoc": {
    "errors": {
      "BadContractSignature()": [
        {
          "details": "Revert with an error when an EIP-1271 call to an account fails."
        }
      ],
      "BadFraction()": [
        {
          "details": "Revert with an error when supplying a fraction with a value of zero      for the numerator or denominator, or one where the numerator exceeds      the denominator."
        }
      ],
      "BadReturnValueFromERC20OnTransfer(address,address,address,uint256)": [
        {
          "details": "Revert with an error when an ERC20 token transfer returns a falsey      value.",
          "params": {
            "amount": "The amount for the attempted ERC20 transfer.",
            "from": "The source of the attempted ERC20 transfer.",
            "to": "The recipient of the attempted ERC20 transfer.",
            "token": "The token for which the ERC20 transfer was attempted."
          }
        }
      ],
      "BadSignatureV(uint8)": [
        {
          "details": "Revert with an error when a signature that does not contain a v      value of 27 or 28 has been supplied.",
          "params": {
            "v": "The invalid v value."
          }
        }
      ],
      "ConsiderationNotMet(uint256,uint256,uint256)": [
        {
          "details": "Revert with an error if a consideration amount has not been fully      zeroed out after applying all fulfillments.",
          "params": {
            "considerationIndex": "The index of the consideration item on the                           order.",
            "orderIndex": "The index of the order with the consideration                           item with a shortfall.",
            "shortfallAmount": "The unfulfilled consideration amount."
          }
        }
      ],
      "ERC1155BatchTransferGenericFailure(address,address,address,uint256[],uint256[])": [
        {
          "details": "Revert with an error when a batch ERC1155 token transfer reverts.",
          "params": {
            "amounts": "The amounts for the attempted transfer.",
            "from": "The source of the attempted transfer.",
            "identifiers": "The identifiers for the attempted transfer.",
            "to": "The recipient of the attempted transfer.",
            "token": "The token for which the transfer was attempted."
          }
        }
      ],
      "EtherTransferGenericFailure(address,uint256)": [
        {
          "details": "Revert with an error when an ether transfer reverts."
        }
      ],
      "InsufficientEtherSupplied()": [
        {
          "details": "Revert with an error when insufficient ether is supplied as part of      msg.value when fulfilling orders."
        }
      ],
      "Invalid1155BatchTransferEncoding()": [
        {
          "details": "Revert with an error when attempting to execute an 1155 batch      transfer using calldata not produced by default ABI encoding or with      different lengths for ids and amounts arrays."
        }
      ],
      "InvalidBasicOrderParameterEncoding()": [
        {
          "details": "Revert with an error when attempting to fill a basic order using      calldata not produced by default ABI encoding."
        }
      ],
      "InvalidCallToConduit(address)": [
        {
          "details": "Revert with an error when a call to a conduit fails with revert data      that is too expensive to return."
        }
      ],
      "InvalidCanceller()": [
        {
          "details": "Revert with an error when attempting to cancel an order as a caller      other than the indicated offerer or zone."
        }
      ],
      "InvalidConduit(bytes32,address)": [
        {
          "details": "Revert with an error when attempting to fill an order referencing an      invalid conduit (i.e. one that has not been deployed)."
        }
      ],
      "InvalidERC721TransferAmount()": [
        {
          "details": "Revert with an error when an ERC721 transfer with amount other than      one is attempted."
        }
      ],
      "InvalidMsgValue(uint256)": [
        {
          "details": "Revert with an error when a caller attempts to supply callvalue to a      non-payable basic order route or does not supply any callvalue to a      payable basic order route."
        }
      ],
      "InvalidNativeOfferItem()": [
        {
          "details": "Revert with an error when attempting to fulfill an order with an      offer for ETH outside of matching orders."
        }
      ],
      "InvalidSignature()": [
        {
          "details": "Revert with an error when a signer cannot be recovered from the      supplied signature."
        }
      ],
      "InvalidSigner()": [
        {
          "details": "Revert with an error when the signer recovered by the supplied      signature does not match the offerer or an allowed EIP-1271 signer      as specified by the offerer in the event they are a contract."
        }
      ],
      "InvalidTime()": [
        {
          "details": "Revert with an error when attempting to fill an order outside the      specified start time and end time."
        }
      ],
      "MissingItemAmount()": [
        {
          "details": "Revert with an error when attempting to fulfill an order where an      item has an amount of zero."
        }
      ],
      "MissingOriginalConsiderationItems()": [
        {
          "details": "Revert with an error when an order is supplied for fulfillment with      a consideration array that is shorter than the original array."
        }
      ],
      "NoContract(address)": [
        {
          "details": "Revert with an error when an account being called as an assumed      contract does not have code and returns no data.",
          "params": {
            "account": "The account that should contain code."
          }
        }
      ],
      "NoReentrantCalls()": [
        {
          "details": "Revert with an error when a caller attempts to reenter a protected      function."
        }
      ],
      "NoSpecifiedOrdersAvailable()": [
        {
          "details": "Revert with an error when attempting to fulfill any number of      available orders when none are fulfillable."
        }
      ],
      "OrderAlreadyFilled(bytes32)": [
        {
          "details": "Revert with an error when attempting to fill an order that has      already been fully filled.",
          "params": {
            "orderHash": "The order hash on which a fill was attempted."
          }
        }
      ],
      "OrderIsCancelled(bytes32)": [
        {
          "details": "Revert with an error when attempting to fill an order that has been      cancelled.",
          "params": {
            "orderHash": "The hash of the cancelled order."
          }
        }
      ],
      "OrderPartiallyFilled(bytes32)": [
        {
          "details": "Revert with an error when attempting to fill a basic order that has      been partially filled.",
          "params": {
            "orderHash": "The hash of the partially used order."
          }
        }
      ],
      "PartialFillsNotEnabledForOrder()": [
        {
          "details": "Revert with an error when a partial fill is attempted on an order      that does not specify partial fill support in its order type."
        }
      ],
      "TokenTransferGenericFailure(address,address,address,uint256,uint256)": [
        {
          "details": "Revert with an error when an ERC20, ERC721, or ERC1155 token      transfer reverts.",
          "params": {
            "amount": "The amount for the attempted transfer.",
            "from": "The source of the attempted transfer.",
            "identifier": "The identifier for the attempted transfer.",
            "to": "The recipient of the attempted transfer.",
            "token": "The token for which the transfer was attempted."
          }
        }
      ],
      "UnusedItemParameters()": [
        {
          "details": "Revert with an error when attempting to fulfill an order where an      item has unused parameters. This includes both the token and the      identifier parameters for native transfers as well as the identifier      parameter for ERC20 transfers. Note that the conduit does not      perform this check, leaving it up to the calling channel to enforce      when desired."
        }
      ]
    },
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 7723,
        "contract": "contracts/BNPL.sol:BNPL",
        "label": "_reentrancyGuard",
        "offset": 0,
        "slot": "0",
        "type": "t_uint256"
      },
      {
        "astId": 5403,
        "contract": "contracts/BNPL.sol:BNPL",
        "label": "_counters",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 6907,
        "contract": "contracts/BNPL.sol:BNPL",
        "label": "_orderStatus",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_bytes32,t_struct(OrderStatus)5389_storage)"
      },
      {
        "astId": 4379,
        "contract": "contracts/BNPL.sol:BNPL",
        "label": "_orderStatus",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_bytes32,t_struct(OrderStatus)5389_storage)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_bytes32,t_struct(OrderStatus)5389_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct OrderStatus)",
        "numberOfBytes": "32",
        "value": "t_struct(OrderStatus)5389_storage"
      },
      "t_struct(OrderStatus)5389_storage": {
        "encoding": "inplace",
        "label": "struct OrderStatus",
        "members": [
          {
            "astId": 5374,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "isValidated",
            "offset": 0,
            "slot": "0",
            "type": "t_bool"
          },
          {
            "astId": 5376,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "isCancelled",
            "offset": 1,
            "slot": "0",
            "type": "t_bool"
          },
          {
            "astId": 5378,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "isFinalized",
            "offset": 2,
            "slot": "0",
            "type": "t_bool"
          },
          {
            "astId": 5380,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "isBroken",
            "offset": 3,
            "slot": "0",
            "type": "t_bool"
          },
          {
            "astId": 5382,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "fulfiller",
            "offset": 4,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 5384,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "startedAt",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 5386,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "shadowId",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 5388,
            "contract": "contracts/BNPL.sol:BNPL",
            "label": "paidTimes",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "128"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}