{"version":3,"file":"exchangeOrderBuilderV2.cjs","names":["CTF_EXCHANGE_V2_DOMAIN_NAME","CTF_EXCHANGE_V2_DOMAIN_VERSION","contractAddress: string","chainId: number","signer: ClobSigner","generateOrderSalt","SignatureTypeV2","getSignerAddress","bytes32Zero","EIP712_DOMAIN","CTF_EXCHANGE_V2_ORDER_STRUCT","signTypedDataWithSigner"],"sources":["../../src/order-utils/exchangeOrderBuilderV2.ts"],"sourcesContent":["import { type Address, encodeAbiParameters, hashTypedData, keccak256, toHex } from \"viem\";\n\nimport { bytes32Zero } from \"../constants.js\";\nimport { type ClobSigner, getSignerAddress, signTypedDataWithSigner } from \"../signing/signer.js\";\nimport {\n\tCTF_EXCHANGE_V2_DOMAIN_NAME,\n\tCTF_EXCHANGE_V2_DOMAIN_VERSION,\n\tCTF_EXCHANGE_V2_ORDER_STRUCT,\n} from \"./model/ctfExchangeV2TypedData.js\";\nimport { EIP712_DOMAIN, type EIP712TypedData } from \"./model/eip712.js\";\nimport type { OrderHash, OrderSignature } from \"./model/order.js\";\nimport type { OrderDataV2, OrderV2, SignedOrderV2 } from \"./model/orderDataV2.js\";\nimport { SignatureTypeV2 } from \"./model/signatureTypeV2.js\";\nimport { generateOrderSalt } from \"./utils.js\";\n\nconst ORDER_TYPE_STRING =\n\t\"Order(uint256 salt,address maker,address signer,uint256 tokenId,uint256 makerAmount,uint256 takerAmount,uint8 side,uint8 signatureType,uint256 timestamp,bytes32 metadata,bytes32 builder)\";\n\nconst ORDER_TYPE_HASH = keccak256(toHex(ORDER_TYPE_STRING));\n\nconst DOMAIN_TYPE_HASH = keccak256(\n\ttoHex(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n);\n\nconst TYPED_DATA_SIGN_STRUCT = [\n\t{ name: \"contents\", type: \"Order\" },\n\t{ name: \"name\", type: \"string\" },\n\t{ name: \"version\", type: \"string\" },\n\t{ name: \"chainId\", type: \"uint256\" },\n\t{ name: \"verifyingContract\", type: \"address\" },\n\t{ name: \"salt\", type: \"bytes32\" },\n];\n\nconst CTF_EXCHANGE_NAME_HASH = keccak256(toHex(CTF_EXCHANGE_V2_DOMAIN_NAME));\nconst CTF_EXCHANGE_VERSION_HASH = keccak256(toHex(CTF_EXCHANGE_V2_DOMAIN_VERSION));\n\nexport class ExchangeOrderBuilderV2 {\n\tprivate readonly appDomainSep: `0x${string}`;\n\n\tconstructor(\n\t\tprivate readonly contractAddress: string,\n\t\tprivate readonly chainId: number,\n\t\tprivate readonly signer: ClobSigner,\n\t\tprivate readonly generateSalt = generateOrderSalt,\n\t) {\n\t\tthis.appDomainSep = keccak256(\n\t\t\tencodeAbiParameters(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"address\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\tDOMAIN_TYPE_HASH,\n\t\t\t\t\tCTF_EXCHANGE_NAME_HASH,\n\t\t\t\t\tCTF_EXCHANGE_VERSION_HASH,\n\t\t\t\t\tBigInt(chainId),\n\t\t\t\t\tcontractAddress as Address,\n\t\t\t\t],\n\t\t\t),\n\t\t);\n\t}\n\n\tasync buildSignedOrder(orderData: OrderDataV2): Promise<SignedOrderV2> {\n\t\tconst order = await this.buildOrder(orderData);\n\t\tconst orderTypedData = this.buildOrderTypedData(order);\n\t\tconst orderSignature = await this.buildOrderSignature(orderTypedData);\n\n\t\treturn {\n\t\t\t...order,\n\t\t\tsignature: orderSignature,\n\t\t} as SignedOrderV2;\n\t}\n\n\tasync buildOrder({\n\t\tmaker,\n\t\ttokenId,\n\t\tmakerAmount,\n\t\ttakerAmount,\n\t\tside,\n\t\tsigner,\n\t\tsignatureType,\n\t\ttimestamp,\n\t\tmetadata,\n\t\tbuilder,\n\t\texpiration,\n\t}: OrderDataV2): Promise<OrderV2> {\n\t\tif (!signer) {\n\t\t\tsigner = maker;\n\t\t}\n\n\t\t// For POLY_1271 (deposit wallets), signer is the wallet contract — skip EOA address check\n\t\tif (signatureType !== SignatureTypeV2.POLY_1271) {\n\t\t\tconst signerAddress = await getSignerAddress(this.signer);\n\t\t\tif (signer !== signerAddress) {\n\t\t\t\tthrow new Error(\"signer does not match\");\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsalt: this.generateSalt(),\n\t\t\tmaker,\n\t\t\tsigner,\n\t\t\ttokenId,\n\t\t\tmakerAmount,\n\t\t\ttakerAmount,\n\t\t\tside,\n\t\t\tsignatureType: signatureType ?? SignatureTypeV2.EOA,\n\t\t\tmetadata: metadata ?? bytes32Zero,\n\t\t\tbuilder: builder ?? bytes32Zero,\n\t\t\ttimestamp: timestamp ?? Date.now().toString(),\n\t\t\texpiration: expiration ?? \"0\",\n\t\t};\n\t}\n\n\tbuildOrderTypedData(order: OrderV2): EIP712TypedData {\n\t\treturn {\n\t\t\tprimaryType: \"Order\",\n\t\t\ttypes: {\n\t\t\t\tEIP712Domain: EIP712_DOMAIN,\n\t\t\t\tOrder: CTF_EXCHANGE_V2_ORDER_STRUCT,\n\t\t\t},\n\t\t\tdomain: {\n\t\t\t\tname: CTF_EXCHANGE_V2_DOMAIN_NAME,\n\t\t\t\tversion: CTF_EXCHANGE_V2_DOMAIN_VERSION,\n\t\t\t\tchainId: this.chainId,\n\t\t\t\tverifyingContract: this.contractAddress,\n\t\t\t},\n\t\t\tmessage: {\n\t\t\t\tsalt: order.salt,\n\t\t\t\tmaker: order.maker,\n\t\t\t\tsigner: order.signer,\n\t\t\t\ttokenId: order.tokenId,\n\t\t\t\tmakerAmount: order.makerAmount,\n\t\t\t\ttakerAmount: order.takerAmount,\n\t\t\t\ttimestamp: order.timestamp,\n\t\t\t\tside: order.side === \"BUY\" ? 0 : 1,\n\t\t\t\tsignatureType: order.signatureType,\n\t\t\t\tmetadata: order.metadata,\n\t\t\t\tbuilder: order.builder,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync buildOrderSignature(typedData: EIP712TypedData): Promise<OrderSignature> {\n\t\tdelete typedData.types.EIP712Domain;\n\n\t\tconst msg = typedData.message;\n\n\t\tif ((msg.signatureType as number) !== SignatureTypeV2.POLY_1271) {\n\t\t\treturn signTypedDataWithSigner({\n\t\t\t\tsigner: this.signer,\n\t\t\t\tdomain: typedData.domain,\n\t\t\t\ttypes: typedData.types,\n\t\t\t\tvalue: typedData.message,\n\t\t\t\tprimaryType: typedData.primaryType,\n\t\t\t});\n\t\t}\n\n\t\tconst contentsHash = keccak256(\n\t\t\tencodeAbiParameters(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"address\" },\n\t\t\t\t\t{ type: \"address\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"uint8\" },\n\t\t\t\t\t{ type: \"uint8\" },\n\t\t\t\t\t{ type: \"uint256\" },\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t\t{ type: \"bytes32\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\tORDER_TYPE_HASH,\n\t\t\t\t\tBigInt(msg.salt as string),\n\t\t\t\t\tmsg.maker as Address,\n\t\t\t\t\tmsg.signer as Address,\n\t\t\t\t\tBigInt(msg.tokenId as string),\n\t\t\t\t\tBigInt(msg.makerAmount as string),\n\t\t\t\t\tBigInt(msg.takerAmount as string),\n\t\t\t\t\tmsg.side as number,\n\t\t\t\t\tmsg.signatureType as number,\n\t\t\t\t\tBigInt(msg.timestamp as string),\n\t\t\t\t\tmsg.metadata as `0x${string}`,\n\t\t\t\t\tmsg.builder as `0x${string}`,\n\t\t\t\t],\n\t\t\t),\n\t\t);\n\n\t\tconst innerSig = await signTypedDataWithSigner({\n\t\t\tsigner: this.signer,\n\t\t\tdomain: {\n\t\t\t\tname: CTF_EXCHANGE_V2_DOMAIN_NAME,\n\t\t\t\tversion: CTF_EXCHANGE_V2_DOMAIN_VERSION,\n\t\t\t\tchainId: this.chainId,\n\t\t\t\tverifyingContract: this.contractAddress,\n\t\t\t},\n\t\t\ttypes: {\n\t\t\t\tTypedDataSign: TYPED_DATA_SIGN_STRUCT,\n\t\t\t\tOrder: CTF_EXCHANGE_V2_ORDER_STRUCT,\n\t\t\t},\n\t\t\tprimaryType: \"TypedDataSign\",\n\t\t\tvalue: {\n\t\t\t\tcontents: typedData.message,\n\t\t\t\tname: \"DepositWallet\",\n\t\t\t\tversion: \"1\",\n\t\t\t\tchainId: this.chainId,\n\t\t\t\tverifyingContract: msg.signer,\n\t\t\t\tsalt: bytes32Zero,\n\t\t\t},\n\t\t});\n\n\t\t// innerSig (65) || appDomainSep (32) || contentsHash (32) || contentsType || uint16_BE(len)\n\t\tconst ctLen = ORDER_TYPE_STRING.length;\n\t\tconst lenHex = ctLen.toString(16).padStart(4, \"0\");\n\t\treturn `0x${innerSig.slice(2)}${this.appDomainSep.slice(2)}${contentsHash.slice(2)}${toHex(ORDER_TYPE_STRING).slice(2)}${lenHex}`;\n\t}\n\n\tbuildOrderHash(orderTypedData: EIP712TypedData): OrderHash {\n\t\treturn hashTypedData(orderTypedData);\n\t}\n}\n"],"mappings":"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"}