@hashlock-tech/sdk 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -453,8 +453,8 @@ var HashLock = class {
|
|
|
453
453
|
query HTLCStatus($tradeId: ID!) {
|
|
454
454
|
htlcStatus(tradeId: $tradeId) {
|
|
455
455
|
tradeId status
|
|
456
|
-
initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash
|
|
457
|
-
counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash
|
|
456
|
+
initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }
|
|
457
|
+
counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }
|
|
458
458
|
}
|
|
459
459
|
}
|
|
460
460
|
`, { tradeId });
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/hashlock.ts"],"sourcesContent":["export { HashLock, MAINNET_ENDPOINT } from './hashlock.js';\nexport { HashLockError, GraphQLError, NetworkError, AuthError } from './errors.js';\nexport type * from './types.js';\n","/**\n * Base error class for all HashLock SDK errors.\n */\nexport class HashLockError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'HashLockError';\n }\n}\n\n/**\n * GraphQL returned errors in the response.\n */\nexport class GraphQLError extends HashLockError {\n constructor(\n message: string,\n public readonly errors: Array<{ message: string; path?: string[] }>,\n ) {\n super(message, 'GRAPHQL_ERROR', errors);\n this.name = 'GraphQLError';\n }\n}\n\n/**\n * Network-level error (timeout, DNS failure, etc.).\n */\nexport class NetworkError extends HashLockError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Authentication error — token missing or expired.\n */\nexport class AuthError extends HashLockError {\n constructor(message: string = 'Authentication required — set accessToken in config or call setAccessToken()') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthError';\n }\n}\n","import type { HashLockConfig } from './types.js';\nimport { GraphQLError, NetworkError, AuthError } from './errors.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 3;\nconst RETRY_DELAY_BASE = 1000;\n\ninterface GQLResponse<T> {\n data?: T;\n errors?: Array<{ message: string; path?: string[] }>;\n}\n\n/**\n * Low-level GraphQL client with retry logic, timeout, and error normalization.\n * Used internally by all SDK methods — not exported to consumers.\n */\nexport class GraphQLClient {\n private endpoint: string;\n private accessToken: string | undefined;\n private timeout: number;\n private retries: number;\n private fetchFn: typeof fetch;\n\n constructor(config: HashLockConfig) {\n this.endpoint = config.endpoint;\n this.accessToken = config.accessToken;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.retries = config.retries ?? DEFAULT_RETRIES;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n\n if (!this.fetchFn) {\n throw new Error('fetch is not available — pass a custom fetch implementation or use Node.js >= 18');\n }\n }\n\n setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n /**\n * Execute a GraphQL query with automatic retries on transient failures.\n * Retries on: network errors, 5xx status codes.\n * Does NOT retry on: 4xx errors, GraphQL validation errors.\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, true);\n }\n\n /**\n * Execute a GraphQL mutation.\n * Only retries on network errors (not on 5xx — mutations are not idempotent).\n */\n async mutate<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, false);\n }\n\n private async execute<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n retryOn5xx: boolean,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n const response = await this.fetchFn(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n // Auth errors — don't retry\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Server errors — retry only for queries\n if (response.status >= 500) {\n const msg = `Server error: HTTP ${response.status}`;\n if (retryOn5xx && attempt < this.retries) {\n lastError = new NetworkError(msg);\n await this.delay(attempt);\n continue;\n }\n throw new NetworkError(msg);\n }\n\n const json = (await response.json()) as GQLResponse<T>;\n\n // GraphQL errors\n if (json.errors?.length) {\n throw new GraphQLError(\n json.errors[0].message,\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new GraphQLError('No data returned', [{ message: 'Empty response' }]);\n }\n\n return json.data;\n } catch (err) {\n if (err instanceof AuthError || err instanceof GraphQLError) {\n throw err;\n }\n\n // Network/timeout errors — retry\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const isNetwork = err instanceof TypeError; // fetch network failure\n\n if ((isAbort || isNetwork) && attempt < this.retries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n await this.delay(attempt);\n continue;\n }\n\n if (err instanceof NetworkError) throw err;\n\n throw new NetworkError(\n isAbort ? 'Request timed out' : `Network error: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after all retries');\n }\n\n private delay(attempt: number): Promise<void> {\n const ms = RETRY_DELAY_BASE * Math.pow(2, attempt);\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { GraphQLClient } from './client.js';\nimport type {\n HashLockConfig,\n RFQ,\n Quote,\n Trade,\n HTLC,\n HTLCStatusResult,\n FundHTLCResult,\n FundHTLCInput,\n ClaimHTLCInput,\n RefundHTLCInput,\n CreateRFQInput,\n SubmitQuoteInput,\n ConfirmDirectTradeInput,\n ConfirmSettlementWalletsInput,\n PrepareBitcoinHTLCInput,\n BitcoinHTLCPrepareResult,\n BuildBitcoinClaimPSBTInput,\n BitcoinClaimPSBTResult,\n BroadcastBitcoinTxInput,\n BitcoinBroadcastResult,\n TradeStatus,\n RFQStatus,\n} from './types.js';\n\n/** Mainnet endpoint */\nexport const MAINNET_ENDPOINT = 'http://142.93.106.129/graphql';\n\n/**\n * HashLock SDK — TypeScript client for HashLock OTC trading platform.\n *\n * @example\n * ```ts\n * import { HashLock } from '@hashlock/sdk';\n *\n * const hl = new HashLock({\n * endpoint: 'http://142.93.106.129/graphql',\n * accessToken: 'your-jwt-token',\n * });\n *\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '1.0',\n * });\n * ```\n */\nexport class HashLock {\n private client: GraphQLClient;\n\n constructor(config: HashLockConfig) {\n this.client = new GraphQLClient(config);\n }\n\n /** Update the access token (e.g., after login or token refresh) */\n setAccessToken(token: string): void {\n this.client.setAccessToken(token);\n }\n\n // ─── RFQ ─────────────────────────────────────────────────\n\n /**\n * Create a Request for Quote (RFQ).\n * Broadcasts to market makers who can respond with prices.\n *\n * @example\n * ```ts\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '10.0',\n * expiresIn: 300, // 5 minutes\n * });\n * console.log(`RFQ created: ${rfq.id}`);\n * ```\n */\n async createRFQ(input: CreateRFQInput): Promise<RFQ> {\n const { createRFQ } = await this.client.mutate<{ createRFQ: RFQ }>(`\n mutation CreateRFQ($baseToken: String!, $quoteToken: String!, $side: Side!, $amount: String!, $expiresIn: Int, $isBlind: Boolean) {\n createRFQ(baseToken: $baseToken, quoteToken: $quoteToken, side: $side, amount: $amount, expiresIn: $expiresIn, isBlind: $isBlind) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n }\n }\n `, input);\n return createRFQ;\n }\n\n /**\n * Get a single RFQ by ID.\n */\n async getRFQ(id: string): Promise<RFQ | null> {\n const { rfq } = await this.client.query<{ rfq: RFQ | null }>(`\n query GetRFQ($id: ID!) {\n rfq(id: $id) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n quotes { id rfqId marketMakerId price amount status createdAt }\n }\n }\n `, { id });\n return rfq;\n }\n\n /**\n * List RFQs with optional status filter and pagination.\n */\n async listRFQs(params?: { status?: RFQStatus; page?: number; pageSize?: number }) {\n const { rfqs } = await this.client.query<{ rfqs: { rfqs: RFQ[]; total: number; page: number; pageSize: number } }>(`\n query ListRFQs($status: RFQStatus, $page: Int, $pageSize: Int) {\n rfqs(status: $status, page: $page, pageSize: $pageSize) {\n rfqs { id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount }\n total page pageSize\n }\n }\n `, params);\n return rfqs;\n }\n\n /**\n * Cancel an active RFQ.\n */\n async cancelRFQ(id: string): Promise<RFQ> {\n const { cancelRFQ } = await this.client.mutate<{ cancelRFQ: RFQ }>(`\n mutation CancelRFQ($id: ID!) {\n cancelRFQ(id: $id) {\n id status\n }\n }\n `, { id });\n return cancelRFQ;\n }\n\n // ─── Quotes ──────────────────────────────────────────────\n\n /**\n * Submit a price quote in response to an RFQ.\n *\n * @example\n * ```ts\n * const quote = await hl.submitQuote({\n * rfqId: 'rfq-uuid',\n * price: '3450.00',\n * amount: '10.0',\n * });\n * ```\n */\n async submitQuote(input: SubmitQuoteInput): Promise<Quote> {\n const { submitQuote } = await this.client.mutate<{ submitQuote: Quote }>(`\n mutation SubmitQuote($rfqId: ID!, $price: String!, $amount: String!, $expiresIn: Int) {\n submitQuote(rfqId: $rfqId, price: $price, amount: $amount, expiresIn: $expiresIn) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n }\n }\n `, input);\n return submitQuote;\n }\n\n /**\n * Accept a quote — creates a trade from the RFQ flow.\n */\n async acceptQuote(quoteId: string): Promise<Quote> {\n const { acceptQuote } = await this.client.mutate<{ acceptQuote: Quote }>(`\n mutation AcceptQuote($quoteId: ID!) {\n acceptQuote(quoteId: $quoteId) {\n id rfqId status trade { id status }\n }\n }\n `, { quoteId });\n return acceptQuote;\n }\n\n /**\n * Get all quotes for an RFQ.\n */\n async getQuotes(rfqId: string): Promise<Quote[]> {\n const { quotes } = await this.client.query<{ quotes: Quote[] }>(`\n query GetQuotes($rfqId: ID!) {\n quotes(rfqId: $rfqId) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n deliveryDelayHours collateralBtcSats isCollateralBacked\n }\n }\n `, { rfqId });\n return quotes;\n }\n\n // ─── Trades ──────────────────────────────────────────────\n\n /**\n * Get a single trade by ID.\n */\n async getTrade(id: string): Promise<Trade | null> {\n const { trade } = await this.client.query<{ trade: Trade | null }>(`\n query GetTrade($id: ID!) {\n trade(id: $id) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, { id });\n return trade;\n }\n\n /**\n * List trades with optional status filter.\n */\n async listTrades(params?: { status?: TradeStatus; page?: number; pageSize?: number }) {\n const { trades } = await this.client.query<{ trades: { trades: Trade[]; total: number } }>(`\n query ListTrades($status: TradeStatus, $page: Int, $pageSize: Int) {\n trades(status: $status, page: $page, pageSize: $pageSize) {\n trades { id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt }\n total\n }\n }\n `, params);\n return trades;\n }\n\n /**\n * Create a direct trade from 1-on-1 chat (skips RFQ flow).\n */\n async confirmDirectTrade(input: ConfirmDirectTradeInput): Promise<Trade> {\n const { confirmDirectTrade } = await this.client.mutate<{ confirmDirectTrade: Trade }>(`\n mutation ConfirmDirectTrade($counterpartyId: ID!, $baseToken: String!, $quoteToken: String!, $side: Side!, $baseAmount: String!, $price: String!, $chainId: String!, $broadcastRfqId: ID, $conversationId: ID) {\n confirmDirectTrade(counterpartyId: $counterpartyId, baseToken: $baseToken, quoteToken: $quoteToken, side: $side, baseAmount: $baseAmount, price: $price, chainId: $chainId, broadcastRfqId: $broadcastRfqId, conversationId: $conversationId) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, input);\n return confirmDirectTrade;\n }\n\n /**\n * Accept a proposed trade.\n */\n async acceptTrade(tradeId: string): Promise<Trade> {\n const { acceptTrade } = await this.client.mutate<{ acceptTrade: Trade }>(`\n mutation AcceptTrade($tradeId: ID!) {\n acceptTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return acceptTrade;\n }\n\n /**\n * Cancel a trade.\n */\n async cancelTrade(tradeId: string): Promise<Trade> {\n const { cancelTrade } = await this.client.mutate<{ cancelTrade: Trade }>(`\n mutation CancelTrade($tradeId: ID!) {\n cancelTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return cancelTrade;\n }\n\n /**\n * Confirm settlement wallets for a trade.\n */\n async confirmSettlementWallets(input: ConfirmSettlementWalletsInput): Promise<Trade> {\n const { confirmSettlementWallets } = await this.client.mutate<{ confirmSettlementWallets: Trade }>(`\n mutation ConfirmWallets($tradeId: ID!, $sendWalletId: ID!, $receiveWalletId: ID!) {\n confirmSettlementWallets(tradeId: $tradeId, sendWalletId: $sendWalletId, receiveWalletId: $receiveWalletId) {\n id status\n }\n }\n `, input);\n return confirmSettlementWallets;\n }\n\n // ─── HTLC — EVM (ETH / ERC-20) ──────────────────────────\n\n /**\n * Record an on-chain HTLC funding transaction.\n * Called after the user sends an ETH/ERC20 lock tx on-chain.\n *\n * @example\n * ```ts\n * // After sending ETH lock tx on-chain via ethers/viem:\n * const result = await hl.fundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xabc...',\n * role: 'INITIATOR',\n * timelock: Math.floor(Date.now() / 1000) + 3600,\n * hashlock: '0x...',\n * });\n * ```\n */\n async fundHTLC(input: FundHTLCInput): Promise<FundHTLCResult> {\n const { fundHTLC } = await this.client.mutate<{ fundHTLC: FundHTLCResult }>(`\n mutation FundHTLC($tradeId: ID!, $txHash: String!, $role: HTLCRole!, $timelock: Int, $hashlock: String, $chainType: String, $senderPubKey: String, $receiverPubKey: String, $redeemScript: String, $refundTxHex: String, $preimage: String) {\n fundHTLC(tradeId: $tradeId, txHash: $txHash, role: $role, timelock: $timelock, hashlock: $hashlock, chainType: $chainType, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, redeemScript: $redeemScript, refundTxHex: $refundTxHex, preimage: $preimage) {\n tradeId txHash status\n }\n }\n `, input);\n return fundHTLC;\n }\n\n /**\n * Record an on-chain HTLC claim (preimage reveal).\n *\n * @example\n * ```ts\n * const result = await hl.claimHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xdef...',\n * preimage: '0x...',\n * });\n * ```\n */\n async claimHTLC(input: ClaimHTLCInput): Promise<HTLCStatusResult> {\n const { claimHTLC } = await this.client.mutate<{ claimHTLC: HTLCStatusResult }>(`\n mutation ClaimHTLC($tradeId: ID!, $txHash: String!, $preimage: String!, $chainType: String) {\n claimHTLC(tradeId: $tradeId, txHash: $txHash, preimage: $preimage, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return claimHTLC;\n }\n\n /**\n * Record an on-chain HTLC refund (after timelock expiry).\n *\n * @example\n * ```ts\n * const result = await hl.refundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0x...',\n * });\n * ```\n */\n async refundHTLC(input: RefundHTLCInput): Promise<HTLCStatusResult> {\n const { refundHTLC } = await this.client.mutate<{ refundHTLC: HTLCStatusResult }>(`\n mutation RefundHTLC($tradeId: ID!, $txHash: String!, $chainType: String) {\n refundHTLC(tradeId: $tradeId, txHash: $txHash, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return refundHTLC;\n }\n\n /**\n * Get HTLC status for a trade (both initiator and counterparty HTLCs).\n */\n async getHTLCStatus(tradeId: string): Promise<HTLCStatusResult | null> {\n const { htlcStatus } = await this.client.query<{ htlcStatus: HTLCStatusResult | null }>(`\n query HTLCStatus($tradeId: ID!) {\n htlcStatus(tradeId: $tradeId) {\n tradeId status\n initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainType }\n counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainType }\n }\n }\n `, { tradeId });\n return htlcStatus;\n }\n\n /**\n * Get all HTLCs for a trade.\n */\n async getHTLCs(tradeId: string): Promise<HTLC[]> {\n const { htlcs } = await this.client.query<{ htlcs: HTLC[] }>(`\n query GetHTLCs($tradeId: ID!) {\n htlcs(tradeId: $tradeId) {\n id tradeId role status contractAddress hashlock timelock amount txHash chainType preimage\n }\n }\n `, { tradeId });\n return htlcs;\n }\n\n // ─── HTLC — Bitcoin ──────────────────────────────────────\n\n /**\n * Prepare a Bitcoin HTLC. Returns P2WSH address and redeem script.\n * The client funds this address, then calls fundHTLC with the txHash.\n *\n * @example\n * ```ts\n * const btcHtlc = await hl.prepareBitcoinHTLC({\n * tradeId: 'trade-uuid',\n * role: 'INITIATOR',\n * senderPubKey: '02abc...',\n * receiverPubKey: '03def...',\n * timelock: Math.floor(Date.now() / 1000) + 7200,\n * amountSats: '100000', // 0.001 BTC\n * });\n * console.log(`Fund this address: ${btcHtlc.htlcAddress}`);\n * ```\n */\n async prepareBitcoinHTLC(input: PrepareBitcoinHTLCInput): Promise<BitcoinHTLCPrepareResult> {\n const { prepareBitcoinHTLC } = await this.client.mutate<{ prepareBitcoinHTLC: BitcoinHTLCPrepareResult }>(`\n mutation PrepareBTCHTLC($tradeId: ID!, $role: HTLCRole!, $senderPubKey: String!, $receiverPubKey: String!, $timelock: Int!, $amountSats: String!) {\n prepareBitcoinHTLC(tradeId: $tradeId, role: $role, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, timelock: $timelock, amountSats: $amountSats) {\n tradeId htlcId htlcAddress redeemScript hashlock preimageHash timelock amountSats estimatedClaimFee estimatedRefundFee refundPsbt\n }\n }\n `, input);\n return prepareBitcoinHTLC;\n }\n\n /**\n * Build an unsigned claim PSBT for a Bitcoin HTLC.\n * The client signs with their wallet, then broadcasts via broadcastBitcoinTx.\n */\n async buildBitcoinClaimPSBT(input: BuildBitcoinClaimPSBTInput): Promise<BitcoinClaimPSBTResult> {\n const { buildBitcoinClaimPSBT } = await this.client.mutate<{ buildBitcoinClaimPSBT: BitcoinClaimPSBTResult }>(`\n mutation BuildClaim($tradeId: ID!, $htlcId: ID!, $preimage: String!, $destinationPubKey: String!, $feeRate: Int) {\n buildBitcoinClaimPSBT(tradeId: $tradeId, htlcId: $htlcId, preimage: $preimage, destinationPubKey: $destinationPubKey, feeRate: $feeRate) {\n tradeId htlcId psbtBase64 fee utxoTxid utxoVout\n }\n }\n `, input);\n return buildBitcoinClaimPSBT;\n }\n\n /**\n * Broadcast a signed Bitcoin transaction.\n */\n async broadcastBitcoinTx(input: BroadcastBitcoinTxInput): Promise<BitcoinBroadcastResult> {\n const { broadcastBitcoinTx } = await this.client.mutate<{ broadcastBitcoinTx: BitcoinBroadcastResult }>(`\n mutation BroadcastBTC($tradeId: ID!, $txHex: String!) {\n broadcastBitcoinTx(tradeId: $tradeId, txHex: $txHex) { txid success }\n }\n `, input);\n return broadcastBitcoinTx;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts","../src/hashlock.ts"],"sourcesContent":["export { HashLock, MAINNET_ENDPOINT } from './hashlock.js';\nexport { HashLockError, GraphQLError, NetworkError, AuthError } from './errors.js';\nexport type * from './types.js';\n","/**\n * Base error class for all HashLock SDK errors.\n */\nexport class HashLockError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'HashLockError';\n }\n}\n\n/**\n * GraphQL returned errors in the response.\n */\nexport class GraphQLError extends HashLockError {\n constructor(\n message: string,\n public readonly errors: Array<{ message: string; path?: string[] }>,\n ) {\n super(message, 'GRAPHQL_ERROR', errors);\n this.name = 'GraphQLError';\n }\n}\n\n/**\n * Network-level error (timeout, DNS failure, etc.).\n */\nexport class NetworkError extends HashLockError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Authentication error — token missing or expired.\n */\nexport class AuthError extends HashLockError {\n constructor(message: string = 'Authentication required — set accessToken in config or call setAccessToken()') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthError';\n }\n}\n","import type { HashLockConfig } from './types.js';\nimport { GraphQLError, NetworkError, AuthError } from './errors.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 3;\nconst RETRY_DELAY_BASE = 1000;\n\ninterface GQLResponse<T> {\n data?: T;\n errors?: Array<{ message: string; path?: string[] }>;\n}\n\n/**\n * Low-level GraphQL client with retry logic, timeout, and error normalization.\n * Used internally by all SDK methods — not exported to consumers.\n */\nexport class GraphQLClient {\n private endpoint: string;\n private accessToken: string | undefined;\n private timeout: number;\n private retries: number;\n private fetchFn: typeof fetch;\n\n constructor(config: HashLockConfig) {\n this.endpoint = config.endpoint;\n this.accessToken = config.accessToken;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.retries = config.retries ?? DEFAULT_RETRIES;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n\n if (!this.fetchFn) {\n throw new Error('fetch is not available — pass a custom fetch implementation or use Node.js >= 18');\n }\n }\n\n setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n /**\n * Execute a GraphQL query with automatic retries on transient failures.\n * Retries on: network errors, 5xx status codes.\n * Does NOT retry on: 4xx errors, GraphQL validation errors.\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, true);\n }\n\n /**\n * Execute a GraphQL mutation.\n * Only retries on network errors (not on 5xx — mutations are not idempotent).\n */\n async mutate<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, false);\n }\n\n private async execute<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n retryOn5xx: boolean,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n const response = await this.fetchFn(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n // Auth errors — don't retry\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Server errors — retry only for queries\n if (response.status >= 500) {\n const msg = `Server error: HTTP ${response.status}`;\n if (retryOn5xx && attempt < this.retries) {\n lastError = new NetworkError(msg);\n await this.delay(attempt);\n continue;\n }\n throw new NetworkError(msg);\n }\n\n const json = (await response.json()) as GQLResponse<T>;\n\n // GraphQL errors\n if (json.errors?.length) {\n throw new GraphQLError(\n json.errors[0].message,\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new GraphQLError('No data returned', [{ message: 'Empty response' }]);\n }\n\n return json.data;\n } catch (err) {\n if (err instanceof AuthError || err instanceof GraphQLError) {\n throw err;\n }\n\n // Network/timeout errors — retry\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const isNetwork = err instanceof TypeError; // fetch network failure\n\n if ((isAbort || isNetwork) && attempt < this.retries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n await this.delay(attempt);\n continue;\n }\n\n if (err instanceof NetworkError) throw err;\n\n throw new NetworkError(\n isAbort ? 'Request timed out' : `Network error: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after all retries');\n }\n\n private delay(attempt: number): Promise<void> {\n const ms = RETRY_DELAY_BASE * Math.pow(2, attempt);\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { GraphQLClient } from './client.js';\nimport type {\n HashLockConfig,\n RFQ,\n Quote,\n Trade,\n HTLC,\n HTLCStatusResult,\n FundHTLCResult,\n FundHTLCInput,\n ClaimHTLCInput,\n RefundHTLCInput,\n CreateRFQInput,\n SubmitQuoteInput,\n ConfirmDirectTradeInput,\n ConfirmSettlementWalletsInput,\n PrepareBitcoinHTLCInput,\n BitcoinHTLCPrepareResult,\n BuildBitcoinClaimPSBTInput,\n BitcoinClaimPSBTResult,\n BroadcastBitcoinTxInput,\n BitcoinBroadcastResult,\n TradeStatus,\n RFQStatus,\n} from './types.js';\n\n/** Mainnet endpoint */\nexport const MAINNET_ENDPOINT = 'http://142.93.106.129/graphql';\n\n/**\n * HashLock SDK — TypeScript client for HashLock OTC trading platform.\n *\n * @example\n * ```ts\n * import { HashLock } from '@hashlock/sdk';\n *\n * const hl = new HashLock({\n * endpoint: 'http://142.93.106.129/graphql',\n * accessToken: 'your-jwt-token',\n * });\n *\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '1.0',\n * });\n * ```\n */\nexport class HashLock {\n private client: GraphQLClient;\n\n constructor(config: HashLockConfig) {\n this.client = new GraphQLClient(config);\n }\n\n /** Update the access token (e.g., after login or token refresh) */\n setAccessToken(token: string): void {\n this.client.setAccessToken(token);\n }\n\n // ─── RFQ ─────────────────────────────────────────────────\n\n /**\n * Create a Request for Quote (RFQ).\n * Broadcasts to market makers who can respond with prices.\n *\n * @example\n * ```ts\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '10.0',\n * expiresIn: 300, // 5 minutes\n * });\n * console.log(`RFQ created: ${rfq.id}`);\n * ```\n */\n async createRFQ(input: CreateRFQInput): Promise<RFQ> {\n const { createRFQ } = await this.client.mutate<{ createRFQ: RFQ }>(`\n mutation CreateRFQ($baseToken: String!, $quoteToken: String!, $side: Side!, $amount: String!, $expiresIn: Int, $isBlind: Boolean) {\n createRFQ(baseToken: $baseToken, quoteToken: $quoteToken, side: $side, amount: $amount, expiresIn: $expiresIn, isBlind: $isBlind) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n }\n }\n `, input);\n return createRFQ;\n }\n\n /**\n * Get a single RFQ by ID.\n */\n async getRFQ(id: string): Promise<RFQ | null> {\n const { rfq } = await this.client.query<{ rfq: RFQ | null }>(`\n query GetRFQ($id: ID!) {\n rfq(id: $id) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n quotes { id rfqId marketMakerId price amount status createdAt }\n }\n }\n `, { id });\n return rfq;\n }\n\n /**\n * List RFQs with optional status filter and pagination.\n */\n async listRFQs(params?: { status?: RFQStatus; page?: number; pageSize?: number }) {\n const { rfqs } = await this.client.query<{ rfqs: { rfqs: RFQ[]; total: number; page: number; pageSize: number } }>(`\n query ListRFQs($status: RFQStatus, $page: Int, $pageSize: Int) {\n rfqs(status: $status, page: $page, pageSize: $pageSize) {\n rfqs { id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount }\n total page pageSize\n }\n }\n `, params);\n return rfqs;\n }\n\n /**\n * Cancel an active RFQ.\n */\n async cancelRFQ(id: string): Promise<RFQ> {\n const { cancelRFQ } = await this.client.mutate<{ cancelRFQ: RFQ }>(`\n mutation CancelRFQ($id: ID!) {\n cancelRFQ(id: $id) {\n id status\n }\n }\n `, { id });\n return cancelRFQ;\n }\n\n // ─── Quotes ──────────────────────────────────────────────\n\n /**\n * Submit a price quote in response to an RFQ.\n *\n * @example\n * ```ts\n * const quote = await hl.submitQuote({\n * rfqId: 'rfq-uuid',\n * price: '3450.00',\n * amount: '10.0',\n * });\n * ```\n */\n async submitQuote(input: SubmitQuoteInput): Promise<Quote> {\n const { submitQuote } = await this.client.mutate<{ submitQuote: Quote }>(`\n mutation SubmitQuote($rfqId: ID!, $price: String!, $amount: String!, $expiresIn: Int) {\n submitQuote(rfqId: $rfqId, price: $price, amount: $amount, expiresIn: $expiresIn) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n }\n }\n `, input);\n return submitQuote;\n }\n\n /**\n * Accept a quote — creates a trade from the RFQ flow.\n */\n async acceptQuote(quoteId: string): Promise<Quote> {\n const { acceptQuote } = await this.client.mutate<{ acceptQuote: Quote }>(`\n mutation AcceptQuote($quoteId: ID!) {\n acceptQuote(quoteId: $quoteId) {\n id rfqId status trade { id status }\n }\n }\n `, { quoteId });\n return acceptQuote;\n }\n\n /**\n * Get all quotes for an RFQ.\n */\n async getQuotes(rfqId: string): Promise<Quote[]> {\n const { quotes } = await this.client.query<{ quotes: Quote[] }>(`\n query GetQuotes($rfqId: ID!) {\n quotes(rfqId: $rfqId) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n deliveryDelayHours collateralBtcSats isCollateralBacked\n }\n }\n `, { rfqId });\n return quotes;\n }\n\n // ─── Trades ──────────────────────────────────────────────\n\n /**\n * Get a single trade by ID.\n */\n async getTrade(id: string): Promise<Trade | null> {\n const { trade } = await this.client.query<{ trade: Trade | null }>(`\n query GetTrade($id: ID!) {\n trade(id: $id) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, { id });\n return trade;\n }\n\n /**\n * List trades with optional status filter.\n */\n async listTrades(params?: { status?: TradeStatus; page?: number; pageSize?: number }) {\n const { trades } = await this.client.query<{ trades: { trades: Trade[]; total: number } }>(`\n query ListTrades($status: TradeStatus, $page: Int, $pageSize: Int) {\n trades(status: $status, page: $page, pageSize: $pageSize) {\n trades { id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt }\n total\n }\n }\n `, params);\n return trades;\n }\n\n /**\n * Create a direct trade from 1-on-1 chat (skips RFQ flow).\n */\n async confirmDirectTrade(input: ConfirmDirectTradeInput): Promise<Trade> {\n const { confirmDirectTrade } = await this.client.mutate<{ confirmDirectTrade: Trade }>(`\n mutation ConfirmDirectTrade($counterpartyId: ID!, $baseToken: String!, $quoteToken: String!, $side: Side!, $baseAmount: String!, $price: String!, $chainId: String!, $broadcastRfqId: ID, $conversationId: ID) {\n confirmDirectTrade(counterpartyId: $counterpartyId, baseToken: $baseToken, quoteToken: $quoteToken, side: $side, baseAmount: $baseAmount, price: $price, chainId: $chainId, broadcastRfqId: $broadcastRfqId, conversationId: $conversationId) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, input);\n return confirmDirectTrade;\n }\n\n /**\n * Accept a proposed trade.\n */\n async acceptTrade(tradeId: string): Promise<Trade> {\n const { acceptTrade } = await this.client.mutate<{ acceptTrade: Trade }>(`\n mutation AcceptTrade($tradeId: ID!) {\n acceptTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return acceptTrade;\n }\n\n /**\n * Cancel a trade.\n */\n async cancelTrade(tradeId: string): Promise<Trade> {\n const { cancelTrade } = await this.client.mutate<{ cancelTrade: Trade }>(`\n mutation CancelTrade($tradeId: ID!) {\n cancelTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return cancelTrade;\n }\n\n /**\n * Confirm settlement wallets for a trade.\n */\n async confirmSettlementWallets(input: ConfirmSettlementWalletsInput): Promise<Trade> {\n const { confirmSettlementWallets } = await this.client.mutate<{ confirmSettlementWallets: Trade }>(`\n mutation ConfirmWallets($tradeId: ID!, $sendWalletId: ID!, $receiveWalletId: ID!) {\n confirmSettlementWallets(tradeId: $tradeId, sendWalletId: $sendWalletId, receiveWalletId: $receiveWalletId) {\n id status\n }\n }\n `, input);\n return confirmSettlementWallets;\n }\n\n // ─── HTLC — EVM (ETH / ERC-20) ──────────────────────────\n\n /**\n * Record an on-chain HTLC funding transaction.\n * Called after the user sends an ETH/ERC20 lock tx on-chain.\n *\n * @example\n * ```ts\n * // After sending ETH lock tx on-chain via ethers/viem:\n * const result = await hl.fundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xabc...',\n * role: 'INITIATOR',\n * timelock: Math.floor(Date.now() / 1000) + 3600,\n * hashlock: '0x...',\n * });\n * ```\n */\n async fundHTLC(input: FundHTLCInput): Promise<FundHTLCResult> {\n const { fundHTLC } = await this.client.mutate<{ fundHTLC: FundHTLCResult }>(`\n mutation FundHTLC($tradeId: ID!, $txHash: String!, $role: HTLCRole!, $timelock: Int, $hashlock: String, $chainType: String, $senderPubKey: String, $receiverPubKey: String, $redeemScript: String, $refundTxHex: String, $preimage: String) {\n fundHTLC(tradeId: $tradeId, txHash: $txHash, role: $role, timelock: $timelock, hashlock: $hashlock, chainType: $chainType, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, redeemScript: $redeemScript, refundTxHex: $refundTxHex, preimage: $preimage) {\n tradeId txHash status\n }\n }\n `, input);\n return fundHTLC;\n }\n\n /**\n * Record an on-chain HTLC claim (preimage reveal).\n *\n * @example\n * ```ts\n * const result = await hl.claimHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xdef...',\n * preimage: '0x...',\n * });\n * ```\n */\n async claimHTLC(input: ClaimHTLCInput): Promise<HTLCStatusResult> {\n const { claimHTLC } = await this.client.mutate<{ claimHTLC: HTLCStatusResult }>(`\n mutation ClaimHTLC($tradeId: ID!, $txHash: String!, $preimage: String!, $chainType: String) {\n claimHTLC(tradeId: $tradeId, txHash: $txHash, preimage: $preimage, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return claimHTLC;\n }\n\n /**\n * Record an on-chain HTLC refund (after timelock expiry).\n *\n * @example\n * ```ts\n * const result = await hl.refundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0x...',\n * });\n * ```\n */\n async refundHTLC(input: RefundHTLCInput): Promise<HTLCStatusResult> {\n const { refundHTLC } = await this.client.mutate<{ refundHTLC: HTLCStatusResult }>(`\n mutation RefundHTLC($tradeId: ID!, $txHash: String!, $chainType: String) {\n refundHTLC(tradeId: $tradeId, txHash: $txHash, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return refundHTLC;\n }\n\n /**\n * Get HTLC status for a trade (both initiator and counterparty HTLCs).\n */\n async getHTLCStatus(tradeId: string): Promise<HTLCStatusResult | null> {\n const { htlcStatus } = await this.client.query<{ htlcStatus: HTLCStatusResult | null }>(`\n query HTLCStatus($tradeId: ID!) {\n htlcStatus(tradeId: $tradeId) {\n tradeId status\n initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }\n counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }\n }\n }\n `, { tradeId });\n return htlcStatus;\n }\n\n /**\n * Get all HTLCs for a trade.\n */\n async getHTLCs(tradeId: string): Promise<HTLC[]> {\n const { htlcs } = await this.client.query<{ htlcs: HTLC[] }>(`\n query GetHTLCs($tradeId: ID!) {\n htlcs(tradeId: $tradeId) {\n id tradeId role status contractAddress hashlock timelock amount txHash chainType preimage\n }\n }\n `, { tradeId });\n return htlcs;\n }\n\n // ─── HTLC — Bitcoin ──────────────────────────────────────\n\n /**\n * Prepare a Bitcoin HTLC. Returns P2WSH address and redeem script.\n * The client funds this address, then calls fundHTLC with the txHash.\n *\n * @example\n * ```ts\n * const btcHtlc = await hl.prepareBitcoinHTLC({\n * tradeId: 'trade-uuid',\n * role: 'INITIATOR',\n * senderPubKey: '02abc...',\n * receiverPubKey: '03def...',\n * timelock: Math.floor(Date.now() / 1000) + 7200,\n * amountSats: '100000', // 0.001 BTC\n * });\n * console.log(`Fund this address: ${btcHtlc.htlcAddress}`);\n * ```\n */\n async prepareBitcoinHTLC(input: PrepareBitcoinHTLCInput): Promise<BitcoinHTLCPrepareResult> {\n const { prepareBitcoinHTLC } = await this.client.mutate<{ prepareBitcoinHTLC: BitcoinHTLCPrepareResult }>(`\n mutation PrepareBTCHTLC($tradeId: ID!, $role: HTLCRole!, $senderPubKey: String!, $receiverPubKey: String!, $timelock: Int!, $amountSats: String!) {\n prepareBitcoinHTLC(tradeId: $tradeId, role: $role, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, timelock: $timelock, amountSats: $amountSats) {\n tradeId htlcId htlcAddress redeemScript hashlock preimageHash timelock amountSats estimatedClaimFee estimatedRefundFee refundPsbt\n }\n }\n `, input);\n return prepareBitcoinHTLC;\n }\n\n /**\n * Build an unsigned claim PSBT for a Bitcoin HTLC.\n * The client signs with their wallet, then broadcasts via broadcastBitcoinTx.\n */\n async buildBitcoinClaimPSBT(input: BuildBitcoinClaimPSBTInput): Promise<BitcoinClaimPSBTResult> {\n const { buildBitcoinClaimPSBT } = await this.client.mutate<{ buildBitcoinClaimPSBT: BitcoinClaimPSBTResult }>(`\n mutation BuildClaim($tradeId: ID!, $htlcId: ID!, $preimage: String!, $destinationPubKey: String!, $feeRate: Int) {\n buildBitcoinClaimPSBT(tradeId: $tradeId, htlcId: $htlcId, preimage: $preimage, destinationPubKey: $destinationPubKey, feeRate: $feeRate) {\n tradeId htlcId psbtBase64 fee utxoTxid utxoVout\n }\n }\n `, input);\n return buildBitcoinClaimPSBT;\n }\n\n /**\n * Broadcast a signed Bitcoin transaction.\n */\n async broadcastBitcoinTx(input: BroadcastBitcoinTxInput): Promise<BitcoinBroadcastResult> {\n const { broadcastBitcoinTx } = await this.client.mutate<{ broadcastBitcoinTx: BitcoinBroadcastResult }>(`\n mutation BroadcastBTC($tradeId: ID!, $txHex: String!) {\n broadcastBitcoinTx(tradeId: $tradeId, txHex: $txHex) { txid success }\n }\n `, input);\n return broadcastBitcoinTx;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -422,8 +422,8 @@ var HashLock = class {
|
|
|
422
422
|
query HTLCStatus($tradeId: ID!) {
|
|
423
423
|
htlcStatus(tradeId: $tradeId) {
|
|
424
424
|
tradeId status
|
|
425
|
-
initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash
|
|
426
|
-
counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash
|
|
425
|
+
initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }
|
|
426
|
+
counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
429
|
`, { tradeId });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/hashlock.ts"],"sourcesContent":["/**\n * Base error class for all HashLock SDK errors.\n */\nexport class HashLockError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'HashLockError';\n }\n}\n\n/**\n * GraphQL returned errors in the response.\n */\nexport class GraphQLError extends HashLockError {\n constructor(\n message: string,\n public readonly errors: Array<{ message: string; path?: string[] }>,\n ) {\n super(message, 'GRAPHQL_ERROR', errors);\n this.name = 'GraphQLError';\n }\n}\n\n/**\n * Network-level error (timeout, DNS failure, etc.).\n */\nexport class NetworkError extends HashLockError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Authentication error — token missing or expired.\n */\nexport class AuthError extends HashLockError {\n constructor(message: string = 'Authentication required — set accessToken in config or call setAccessToken()') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthError';\n }\n}\n","import type { HashLockConfig } from './types.js';\nimport { GraphQLError, NetworkError, AuthError } from './errors.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 3;\nconst RETRY_DELAY_BASE = 1000;\n\ninterface GQLResponse<T> {\n data?: T;\n errors?: Array<{ message: string; path?: string[] }>;\n}\n\n/**\n * Low-level GraphQL client with retry logic, timeout, and error normalization.\n * Used internally by all SDK methods — not exported to consumers.\n */\nexport class GraphQLClient {\n private endpoint: string;\n private accessToken: string | undefined;\n private timeout: number;\n private retries: number;\n private fetchFn: typeof fetch;\n\n constructor(config: HashLockConfig) {\n this.endpoint = config.endpoint;\n this.accessToken = config.accessToken;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.retries = config.retries ?? DEFAULT_RETRIES;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n\n if (!this.fetchFn) {\n throw new Error('fetch is not available — pass a custom fetch implementation or use Node.js >= 18');\n }\n }\n\n setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n /**\n * Execute a GraphQL query with automatic retries on transient failures.\n * Retries on: network errors, 5xx status codes.\n * Does NOT retry on: 4xx errors, GraphQL validation errors.\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, true);\n }\n\n /**\n * Execute a GraphQL mutation.\n * Only retries on network errors (not on 5xx — mutations are not idempotent).\n */\n async mutate<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, false);\n }\n\n private async execute<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n retryOn5xx: boolean,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n const response = await this.fetchFn(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n // Auth errors — don't retry\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Server errors — retry only for queries\n if (response.status >= 500) {\n const msg = `Server error: HTTP ${response.status}`;\n if (retryOn5xx && attempt < this.retries) {\n lastError = new NetworkError(msg);\n await this.delay(attempt);\n continue;\n }\n throw new NetworkError(msg);\n }\n\n const json = (await response.json()) as GQLResponse<T>;\n\n // GraphQL errors\n if (json.errors?.length) {\n throw new GraphQLError(\n json.errors[0].message,\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new GraphQLError('No data returned', [{ message: 'Empty response' }]);\n }\n\n return json.data;\n } catch (err) {\n if (err instanceof AuthError || err instanceof GraphQLError) {\n throw err;\n }\n\n // Network/timeout errors — retry\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const isNetwork = err instanceof TypeError; // fetch network failure\n\n if ((isAbort || isNetwork) && attempt < this.retries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n await this.delay(attempt);\n continue;\n }\n\n if (err instanceof NetworkError) throw err;\n\n throw new NetworkError(\n isAbort ? 'Request timed out' : `Network error: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after all retries');\n }\n\n private delay(attempt: number): Promise<void> {\n const ms = RETRY_DELAY_BASE * Math.pow(2, attempt);\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { GraphQLClient } from './client.js';\nimport type {\n HashLockConfig,\n RFQ,\n Quote,\n Trade,\n HTLC,\n HTLCStatusResult,\n FundHTLCResult,\n FundHTLCInput,\n ClaimHTLCInput,\n RefundHTLCInput,\n CreateRFQInput,\n SubmitQuoteInput,\n ConfirmDirectTradeInput,\n ConfirmSettlementWalletsInput,\n PrepareBitcoinHTLCInput,\n BitcoinHTLCPrepareResult,\n BuildBitcoinClaimPSBTInput,\n BitcoinClaimPSBTResult,\n BroadcastBitcoinTxInput,\n BitcoinBroadcastResult,\n TradeStatus,\n RFQStatus,\n} from './types.js';\n\n/** Mainnet endpoint */\nexport const MAINNET_ENDPOINT = 'http://142.93.106.129/graphql';\n\n/**\n * HashLock SDK — TypeScript client for HashLock OTC trading platform.\n *\n * @example\n * ```ts\n * import { HashLock } from '@hashlock/sdk';\n *\n * const hl = new HashLock({\n * endpoint: 'http://142.93.106.129/graphql',\n * accessToken: 'your-jwt-token',\n * });\n *\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '1.0',\n * });\n * ```\n */\nexport class HashLock {\n private client: GraphQLClient;\n\n constructor(config: HashLockConfig) {\n this.client = new GraphQLClient(config);\n }\n\n /** Update the access token (e.g., after login or token refresh) */\n setAccessToken(token: string): void {\n this.client.setAccessToken(token);\n }\n\n // ─── RFQ ─────────────────────────────────────────────────\n\n /**\n * Create a Request for Quote (RFQ).\n * Broadcasts to market makers who can respond with prices.\n *\n * @example\n * ```ts\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '10.0',\n * expiresIn: 300, // 5 minutes\n * });\n * console.log(`RFQ created: ${rfq.id}`);\n * ```\n */\n async createRFQ(input: CreateRFQInput): Promise<RFQ> {\n const { createRFQ } = await this.client.mutate<{ createRFQ: RFQ }>(`\n mutation CreateRFQ($baseToken: String!, $quoteToken: String!, $side: Side!, $amount: String!, $expiresIn: Int, $isBlind: Boolean) {\n createRFQ(baseToken: $baseToken, quoteToken: $quoteToken, side: $side, amount: $amount, expiresIn: $expiresIn, isBlind: $isBlind) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n }\n }\n `, input);\n return createRFQ;\n }\n\n /**\n * Get a single RFQ by ID.\n */\n async getRFQ(id: string): Promise<RFQ | null> {\n const { rfq } = await this.client.query<{ rfq: RFQ | null }>(`\n query GetRFQ($id: ID!) {\n rfq(id: $id) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n quotes { id rfqId marketMakerId price amount status createdAt }\n }\n }\n `, { id });\n return rfq;\n }\n\n /**\n * List RFQs with optional status filter and pagination.\n */\n async listRFQs(params?: { status?: RFQStatus; page?: number; pageSize?: number }) {\n const { rfqs } = await this.client.query<{ rfqs: { rfqs: RFQ[]; total: number; page: number; pageSize: number } }>(`\n query ListRFQs($status: RFQStatus, $page: Int, $pageSize: Int) {\n rfqs(status: $status, page: $page, pageSize: $pageSize) {\n rfqs { id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount }\n total page pageSize\n }\n }\n `, params);\n return rfqs;\n }\n\n /**\n * Cancel an active RFQ.\n */\n async cancelRFQ(id: string): Promise<RFQ> {\n const { cancelRFQ } = await this.client.mutate<{ cancelRFQ: RFQ }>(`\n mutation CancelRFQ($id: ID!) {\n cancelRFQ(id: $id) {\n id status\n }\n }\n `, { id });\n return cancelRFQ;\n }\n\n // ─── Quotes ──────────────────────────────────────────────\n\n /**\n * Submit a price quote in response to an RFQ.\n *\n * @example\n * ```ts\n * const quote = await hl.submitQuote({\n * rfqId: 'rfq-uuid',\n * price: '3450.00',\n * amount: '10.0',\n * });\n * ```\n */\n async submitQuote(input: SubmitQuoteInput): Promise<Quote> {\n const { submitQuote } = await this.client.mutate<{ submitQuote: Quote }>(`\n mutation SubmitQuote($rfqId: ID!, $price: String!, $amount: String!, $expiresIn: Int) {\n submitQuote(rfqId: $rfqId, price: $price, amount: $amount, expiresIn: $expiresIn) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n }\n }\n `, input);\n return submitQuote;\n }\n\n /**\n * Accept a quote — creates a trade from the RFQ flow.\n */\n async acceptQuote(quoteId: string): Promise<Quote> {\n const { acceptQuote } = await this.client.mutate<{ acceptQuote: Quote }>(`\n mutation AcceptQuote($quoteId: ID!) {\n acceptQuote(quoteId: $quoteId) {\n id rfqId status trade { id status }\n }\n }\n `, { quoteId });\n return acceptQuote;\n }\n\n /**\n * Get all quotes for an RFQ.\n */\n async getQuotes(rfqId: string): Promise<Quote[]> {\n const { quotes } = await this.client.query<{ quotes: Quote[] }>(`\n query GetQuotes($rfqId: ID!) {\n quotes(rfqId: $rfqId) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n deliveryDelayHours collateralBtcSats isCollateralBacked\n }\n }\n `, { rfqId });\n return quotes;\n }\n\n // ─── Trades ──────────────────────────────────────────────\n\n /**\n * Get a single trade by ID.\n */\n async getTrade(id: string): Promise<Trade | null> {\n const { trade } = await this.client.query<{ trade: Trade | null }>(`\n query GetTrade($id: ID!) {\n trade(id: $id) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, { id });\n return trade;\n }\n\n /**\n * List trades with optional status filter.\n */\n async listTrades(params?: { status?: TradeStatus; page?: number; pageSize?: number }) {\n const { trades } = await this.client.query<{ trades: { trades: Trade[]; total: number } }>(`\n query ListTrades($status: TradeStatus, $page: Int, $pageSize: Int) {\n trades(status: $status, page: $page, pageSize: $pageSize) {\n trades { id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt }\n total\n }\n }\n `, params);\n return trades;\n }\n\n /**\n * Create a direct trade from 1-on-1 chat (skips RFQ flow).\n */\n async confirmDirectTrade(input: ConfirmDirectTradeInput): Promise<Trade> {\n const { confirmDirectTrade } = await this.client.mutate<{ confirmDirectTrade: Trade }>(`\n mutation ConfirmDirectTrade($counterpartyId: ID!, $baseToken: String!, $quoteToken: String!, $side: Side!, $baseAmount: String!, $price: String!, $chainId: String!, $broadcastRfqId: ID, $conversationId: ID) {\n confirmDirectTrade(counterpartyId: $counterpartyId, baseToken: $baseToken, quoteToken: $quoteToken, side: $side, baseAmount: $baseAmount, price: $price, chainId: $chainId, broadcastRfqId: $broadcastRfqId, conversationId: $conversationId) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, input);\n return confirmDirectTrade;\n }\n\n /**\n * Accept a proposed trade.\n */\n async acceptTrade(tradeId: string): Promise<Trade> {\n const { acceptTrade } = await this.client.mutate<{ acceptTrade: Trade }>(`\n mutation AcceptTrade($tradeId: ID!) {\n acceptTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return acceptTrade;\n }\n\n /**\n * Cancel a trade.\n */\n async cancelTrade(tradeId: string): Promise<Trade> {\n const { cancelTrade } = await this.client.mutate<{ cancelTrade: Trade }>(`\n mutation CancelTrade($tradeId: ID!) {\n cancelTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return cancelTrade;\n }\n\n /**\n * Confirm settlement wallets for a trade.\n */\n async confirmSettlementWallets(input: ConfirmSettlementWalletsInput): Promise<Trade> {\n const { confirmSettlementWallets } = await this.client.mutate<{ confirmSettlementWallets: Trade }>(`\n mutation ConfirmWallets($tradeId: ID!, $sendWalletId: ID!, $receiveWalletId: ID!) {\n confirmSettlementWallets(tradeId: $tradeId, sendWalletId: $sendWalletId, receiveWalletId: $receiveWalletId) {\n id status\n }\n }\n `, input);\n return confirmSettlementWallets;\n }\n\n // ─── HTLC — EVM (ETH / ERC-20) ──────────────────────────\n\n /**\n * Record an on-chain HTLC funding transaction.\n * Called after the user sends an ETH/ERC20 lock tx on-chain.\n *\n * @example\n * ```ts\n * // After sending ETH lock tx on-chain via ethers/viem:\n * const result = await hl.fundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xabc...',\n * role: 'INITIATOR',\n * timelock: Math.floor(Date.now() / 1000) + 3600,\n * hashlock: '0x...',\n * });\n * ```\n */\n async fundHTLC(input: FundHTLCInput): Promise<FundHTLCResult> {\n const { fundHTLC } = await this.client.mutate<{ fundHTLC: FundHTLCResult }>(`\n mutation FundHTLC($tradeId: ID!, $txHash: String!, $role: HTLCRole!, $timelock: Int, $hashlock: String, $chainType: String, $senderPubKey: String, $receiverPubKey: String, $redeemScript: String, $refundTxHex: String, $preimage: String) {\n fundHTLC(tradeId: $tradeId, txHash: $txHash, role: $role, timelock: $timelock, hashlock: $hashlock, chainType: $chainType, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, redeemScript: $redeemScript, refundTxHex: $refundTxHex, preimage: $preimage) {\n tradeId txHash status\n }\n }\n `, input);\n return fundHTLC;\n }\n\n /**\n * Record an on-chain HTLC claim (preimage reveal).\n *\n * @example\n * ```ts\n * const result = await hl.claimHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xdef...',\n * preimage: '0x...',\n * });\n * ```\n */\n async claimHTLC(input: ClaimHTLCInput): Promise<HTLCStatusResult> {\n const { claimHTLC } = await this.client.mutate<{ claimHTLC: HTLCStatusResult }>(`\n mutation ClaimHTLC($tradeId: ID!, $txHash: String!, $preimage: String!, $chainType: String) {\n claimHTLC(tradeId: $tradeId, txHash: $txHash, preimage: $preimage, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return claimHTLC;\n }\n\n /**\n * Record an on-chain HTLC refund (after timelock expiry).\n *\n * @example\n * ```ts\n * const result = await hl.refundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0x...',\n * });\n * ```\n */\n async refundHTLC(input: RefundHTLCInput): Promise<HTLCStatusResult> {\n const { refundHTLC } = await this.client.mutate<{ refundHTLC: HTLCStatusResult }>(`\n mutation RefundHTLC($tradeId: ID!, $txHash: String!, $chainType: String) {\n refundHTLC(tradeId: $tradeId, txHash: $txHash, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return refundHTLC;\n }\n\n /**\n * Get HTLC status for a trade (both initiator and counterparty HTLCs).\n */\n async getHTLCStatus(tradeId: string): Promise<HTLCStatusResult | null> {\n const { htlcStatus } = await this.client.query<{ htlcStatus: HTLCStatusResult | null }>(`\n query HTLCStatus($tradeId: ID!) {\n htlcStatus(tradeId: $tradeId) {\n tradeId status\n initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainType }\n counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainType }\n }\n }\n `, { tradeId });\n return htlcStatus;\n }\n\n /**\n * Get all HTLCs for a trade.\n */\n async getHTLCs(tradeId: string): Promise<HTLC[]> {\n const { htlcs } = await this.client.query<{ htlcs: HTLC[] }>(`\n query GetHTLCs($tradeId: ID!) {\n htlcs(tradeId: $tradeId) {\n id tradeId role status contractAddress hashlock timelock amount txHash chainType preimage\n }\n }\n `, { tradeId });\n return htlcs;\n }\n\n // ─── HTLC — Bitcoin ──────────────────────────────────────\n\n /**\n * Prepare a Bitcoin HTLC. Returns P2WSH address and redeem script.\n * The client funds this address, then calls fundHTLC with the txHash.\n *\n * @example\n * ```ts\n * const btcHtlc = await hl.prepareBitcoinHTLC({\n * tradeId: 'trade-uuid',\n * role: 'INITIATOR',\n * senderPubKey: '02abc...',\n * receiverPubKey: '03def...',\n * timelock: Math.floor(Date.now() / 1000) + 7200,\n * amountSats: '100000', // 0.001 BTC\n * });\n * console.log(`Fund this address: ${btcHtlc.htlcAddress}`);\n * ```\n */\n async prepareBitcoinHTLC(input: PrepareBitcoinHTLCInput): Promise<BitcoinHTLCPrepareResult> {\n const { prepareBitcoinHTLC } = await this.client.mutate<{ prepareBitcoinHTLC: BitcoinHTLCPrepareResult }>(`\n mutation PrepareBTCHTLC($tradeId: ID!, $role: HTLCRole!, $senderPubKey: String!, $receiverPubKey: String!, $timelock: Int!, $amountSats: String!) {\n prepareBitcoinHTLC(tradeId: $tradeId, role: $role, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, timelock: $timelock, amountSats: $amountSats) {\n tradeId htlcId htlcAddress redeemScript hashlock preimageHash timelock amountSats estimatedClaimFee estimatedRefundFee refundPsbt\n }\n }\n `, input);\n return prepareBitcoinHTLC;\n }\n\n /**\n * Build an unsigned claim PSBT for a Bitcoin HTLC.\n * The client signs with their wallet, then broadcasts via broadcastBitcoinTx.\n */\n async buildBitcoinClaimPSBT(input: BuildBitcoinClaimPSBTInput): Promise<BitcoinClaimPSBTResult> {\n const { buildBitcoinClaimPSBT } = await this.client.mutate<{ buildBitcoinClaimPSBT: BitcoinClaimPSBTResult }>(`\n mutation BuildClaim($tradeId: ID!, $htlcId: ID!, $preimage: String!, $destinationPubKey: String!, $feeRate: Int) {\n buildBitcoinClaimPSBT(tradeId: $tradeId, htlcId: $htlcId, preimage: $preimage, destinationPubKey: $destinationPubKey, feeRate: $feeRate) {\n tradeId htlcId psbtBase64 fee utxoTxid utxoVout\n }\n }\n `, input);\n return buildBitcoinClaimPSBT;\n }\n\n /**\n * Broadcast a signed Bitcoin transaction.\n */\n async broadcastBitcoinTx(input: BroadcastBitcoinTxInput): Promise<BitcoinBroadcastResult> {\n const { broadcastBitcoinTx } = await this.client.mutate<{ broadcastBitcoinTx: BitcoinBroadcastResult }>(`\n mutation BroadcastBTC($tradeId: ID!, $txHex: String!) {\n broadcastBitcoinTx(tradeId: $tradeId, txHex: $txHex) { txid success }\n }\n `, input);\n return broadcastBitcoinTx;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/hashlock.ts"],"sourcesContent":["/**\n * Base error class for all HashLock SDK errors.\n */\nexport class HashLockError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = 'HashLockError';\n }\n}\n\n/**\n * GraphQL returned errors in the response.\n */\nexport class GraphQLError extends HashLockError {\n constructor(\n message: string,\n public readonly errors: Array<{ message: string; path?: string[] }>,\n ) {\n super(message, 'GRAPHQL_ERROR', errors);\n this.name = 'GraphQLError';\n }\n}\n\n/**\n * Network-level error (timeout, DNS failure, etc.).\n */\nexport class NetworkError extends HashLockError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR', cause);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Authentication error — token missing or expired.\n */\nexport class AuthError extends HashLockError {\n constructor(message: string = 'Authentication required — set accessToken in config or call setAccessToken()') {\n super(message, 'AUTH_ERROR');\n this.name = 'AuthError';\n }\n}\n","import type { HashLockConfig } from './types.js';\nimport { GraphQLError, NetworkError, AuthError } from './errors.js';\n\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 3;\nconst RETRY_DELAY_BASE = 1000;\n\ninterface GQLResponse<T> {\n data?: T;\n errors?: Array<{ message: string; path?: string[] }>;\n}\n\n/**\n * Low-level GraphQL client with retry logic, timeout, and error normalization.\n * Used internally by all SDK methods — not exported to consumers.\n */\nexport class GraphQLClient {\n private endpoint: string;\n private accessToken: string | undefined;\n private timeout: number;\n private retries: number;\n private fetchFn: typeof fetch;\n\n constructor(config: HashLockConfig) {\n this.endpoint = config.endpoint;\n this.accessToken = config.accessToken;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.retries = config.retries ?? DEFAULT_RETRIES;\n this.fetchFn = config.fetch ?? globalThis.fetch;\n\n if (!this.fetchFn) {\n throw new Error('fetch is not available — pass a custom fetch implementation or use Node.js >= 18');\n }\n }\n\n setAccessToken(token: string): void {\n this.accessToken = token;\n }\n\n /**\n * Execute a GraphQL query with automatic retries on transient failures.\n * Retries on: network errors, 5xx status codes.\n * Does NOT retry on: 4xx errors, GraphQL validation errors.\n */\n async query<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, true);\n }\n\n /**\n * Execute a GraphQL mutation.\n * Only retries on network errors (not on 5xx — mutations are not idempotent).\n */\n async mutate<T>(\n query: string,\n variables?: Record<string, unknown> | object,\n ): Promise<T> {\n return this.execute<T>(query, variables, false);\n }\n\n private async execute<T>(\n query: string,\n variables: Record<string, unknown> | undefined,\n retryOn5xx: boolean,\n ): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n\n const response = await this.fetchFn(this.endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n // Auth errors — don't retry\n if (response.status === 401 || response.status === 403) {\n throw new AuthError(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n // Server errors — retry only for queries\n if (response.status >= 500) {\n const msg = `Server error: HTTP ${response.status}`;\n if (retryOn5xx && attempt < this.retries) {\n lastError = new NetworkError(msg);\n await this.delay(attempt);\n continue;\n }\n throw new NetworkError(msg);\n }\n\n const json = (await response.json()) as GQLResponse<T>;\n\n // GraphQL errors\n if (json.errors?.length) {\n throw new GraphQLError(\n json.errors[0].message,\n json.errors,\n );\n }\n\n if (!json.data) {\n throw new GraphQLError('No data returned', [{ message: 'Empty response' }]);\n }\n\n return json.data;\n } catch (err) {\n if (err instanceof AuthError || err instanceof GraphQLError) {\n throw err;\n }\n\n // Network/timeout errors — retry\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const isNetwork = err instanceof TypeError; // fetch network failure\n\n if ((isAbort || isNetwork) && attempt < this.retries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n await this.delay(attempt);\n continue;\n }\n\n if (err instanceof NetworkError) throw err;\n\n throw new NetworkError(\n isAbort ? 'Request timed out' : `Network error: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after all retries');\n }\n\n private delay(attempt: number): Promise<void> {\n const ms = RETRY_DELAY_BASE * Math.pow(2, attempt);\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { GraphQLClient } from './client.js';\nimport type {\n HashLockConfig,\n RFQ,\n Quote,\n Trade,\n HTLC,\n HTLCStatusResult,\n FundHTLCResult,\n FundHTLCInput,\n ClaimHTLCInput,\n RefundHTLCInput,\n CreateRFQInput,\n SubmitQuoteInput,\n ConfirmDirectTradeInput,\n ConfirmSettlementWalletsInput,\n PrepareBitcoinHTLCInput,\n BitcoinHTLCPrepareResult,\n BuildBitcoinClaimPSBTInput,\n BitcoinClaimPSBTResult,\n BroadcastBitcoinTxInput,\n BitcoinBroadcastResult,\n TradeStatus,\n RFQStatus,\n} from './types.js';\n\n/** Mainnet endpoint */\nexport const MAINNET_ENDPOINT = 'http://142.93.106.129/graphql';\n\n/**\n * HashLock SDK — TypeScript client for HashLock OTC trading platform.\n *\n * @example\n * ```ts\n * import { HashLock } from '@hashlock/sdk';\n *\n * const hl = new HashLock({\n * endpoint: 'http://142.93.106.129/graphql',\n * accessToken: 'your-jwt-token',\n * });\n *\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '1.0',\n * });\n * ```\n */\nexport class HashLock {\n private client: GraphQLClient;\n\n constructor(config: HashLockConfig) {\n this.client = new GraphQLClient(config);\n }\n\n /** Update the access token (e.g., after login or token refresh) */\n setAccessToken(token: string): void {\n this.client.setAccessToken(token);\n }\n\n // ─── RFQ ─────────────────────────────────────────────────\n\n /**\n * Create a Request for Quote (RFQ).\n * Broadcasts to market makers who can respond with prices.\n *\n * @example\n * ```ts\n * const rfq = await hl.createRFQ({\n * baseToken: 'ETH',\n * quoteToken: 'USDT',\n * side: 'SELL',\n * amount: '10.0',\n * expiresIn: 300, // 5 minutes\n * });\n * console.log(`RFQ created: ${rfq.id}`);\n * ```\n */\n async createRFQ(input: CreateRFQInput): Promise<RFQ> {\n const { createRFQ } = await this.client.mutate<{ createRFQ: RFQ }>(`\n mutation CreateRFQ($baseToken: String!, $quoteToken: String!, $side: Side!, $amount: String!, $expiresIn: Int, $isBlind: Boolean) {\n createRFQ(baseToken: $baseToken, quoteToken: $quoteToken, side: $side, amount: $amount, expiresIn: $expiresIn, isBlind: $isBlind) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n }\n }\n `, input);\n return createRFQ;\n }\n\n /**\n * Get a single RFQ by ID.\n */\n async getRFQ(id: string): Promise<RFQ | null> {\n const { rfq } = await this.client.query<{ rfq: RFQ | null }>(`\n query GetRFQ($id: ID!) {\n rfq(id: $id) {\n id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount\n quotes { id rfqId marketMakerId price amount status createdAt }\n }\n }\n `, { id });\n return rfq;\n }\n\n /**\n * List RFQs with optional status filter and pagination.\n */\n async listRFQs(params?: { status?: RFQStatus; page?: number; pageSize?: number }) {\n const { rfqs } = await this.client.query<{ rfqs: { rfqs: RFQ[]; total: number; page: number; pageSize: number } }>(`\n query ListRFQs($status: RFQStatus, $page: Int, $pageSize: Int) {\n rfqs(status: $status, page: $page, pageSize: $pageSize) {\n rfqs { id userId baseToken quoteToken side amount isBlind status expiresAt createdAt quotesCount }\n total page pageSize\n }\n }\n `, params);\n return rfqs;\n }\n\n /**\n * Cancel an active RFQ.\n */\n async cancelRFQ(id: string): Promise<RFQ> {\n const { cancelRFQ } = await this.client.mutate<{ cancelRFQ: RFQ }>(`\n mutation CancelRFQ($id: ID!) {\n cancelRFQ(id: $id) {\n id status\n }\n }\n `, { id });\n return cancelRFQ;\n }\n\n // ─── Quotes ──────────────────────────────────────────────\n\n /**\n * Submit a price quote in response to an RFQ.\n *\n * @example\n * ```ts\n * const quote = await hl.submitQuote({\n * rfqId: 'rfq-uuid',\n * price: '3450.00',\n * amount: '10.0',\n * });\n * ```\n */\n async submitQuote(input: SubmitQuoteInput): Promise<Quote> {\n const { submitQuote } = await this.client.mutate<{ submitQuote: Quote }>(`\n mutation SubmitQuote($rfqId: ID!, $price: String!, $amount: String!, $expiresIn: Int) {\n submitQuote(rfqId: $rfqId, price: $price, amount: $amount, expiresIn: $expiresIn) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n }\n }\n `, input);\n return submitQuote;\n }\n\n /**\n * Accept a quote — creates a trade from the RFQ flow.\n */\n async acceptQuote(quoteId: string): Promise<Quote> {\n const { acceptQuote } = await this.client.mutate<{ acceptQuote: Quote }>(`\n mutation AcceptQuote($quoteId: ID!) {\n acceptQuote(quoteId: $quoteId) {\n id rfqId status trade { id status }\n }\n }\n `, { quoteId });\n return acceptQuote;\n }\n\n /**\n * Get all quotes for an RFQ.\n */\n async getQuotes(rfqId: string): Promise<Quote[]> {\n const { quotes } = await this.client.query<{ quotes: Quote[] }>(`\n query GetQuotes($rfqId: ID!) {\n quotes(rfqId: $rfqId) {\n id rfqId marketMakerId price amount status createdAt expiresAt\n deliveryDelayHours collateralBtcSats isCollateralBacked\n }\n }\n `, { rfqId });\n return quotes;\n }\n\n // ─── Trades ──────────────────────────────────────────────\n\n /**\n * Get a single trade by ID.\n */\n async getTrade(id: string): Promise<Trade | null> {\n const { trade } = await this.client.query<{ trade: Trade | null }>(`\n query GetTrade($id: ID!) {\n trade(id: $id) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, { id });\n return trade;\n }\n\n /**\n * List trades with optional status filter.\n */\n async listTrades(params?: { status?: TradeStatus; page?: number; pageSize?: number }) {\n const { trades } = await this.client.query<{ trades: { trades: Trade[]; total: number } }>(`\n query ListTrades($status: TradeStatus, $page: Int, $pageSize: Int) {\n trades(status: $status, page: $page, pageSize: $pageSize) {\n trades { id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt }\n total\n }\n }\n `, params);\n return trades;\n }\n\n /**\n * Create a direct trade from 1-on-1 chat (skips RFQ flow).\n */\n async confirmDirectTrade(input: ConfirmDirectTradeInput): Promise<Trade> {\n const { confirmDirectTrade } = await this.client.mutate<{ confirmDirectTrade: Trade }>(`\n mutation ConfirmDirectTrade($counterpartyId: ID!, $baseToken: String!, $quoteToken: String!, $side: Side!, $baseAmount: String!, $price: String!, $chainId: String!, $broadcastRfqId: ID, $conversationId: ID) {\n confirmDirectTrade(counterpartyId: $counterpartyId, baseToken: $baseToken, quoteToken: $quoteToken, side: $side, baseAmount: $baseAmount, price: $price, chainId: $chainId, broadcastRfqId: $broadcastRfqId, conversationId: $conversationId) {\n id initiatorId counterpartyId baseToken quoteToken side baseAmount quoteAmount price status createdAt\n }\n }\n `, input);\n return confirmDirectTrade;\n }\n\n /**\n * Accept a proposed trade.\n */\n async acceptTrade(tradeId: string): Promise<Trade> {\n const { acceptTrade } = await this.client.mutate<{ acceptTrade: Trade }>(`\n mutation AcceptTrade($tradeId: ID!) {\n acceptTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return acceptTrade;\n }\n\n /**\n * Cancel a trade.\n */\n async cancelTrade(tradeId: string): Promise<Trade> {\n const { cancelTrade } = await this.client.mutate<{ cancelTrade: Trade }>(`\n mutation CancelTrade($tradeId: ID!) {\n cancelTrade(tradeId: $tradeId) { id status }\n }\n `, { tradeId });\n return cancelTrade;\n }\n\n /**\n * Confirm settlement wallets for a trade.\n */\n async confirmSettlementWallets(input: ConfirmSettlementWalletsInput): Promise<Trade> {\n const { confirmSettlementWallets } = await this.client.mutate<{ confirmSettlementWallets: Trade }>(`\n mutation ConfirmWallets($tradeId: ID!, $sendWalletId: ID!, $receiveWalletId: ID!) {\n confirmSettlementWallets(tradeId: $tradeId, sendWalletId: $sendWalletId, receiveWalletId: $receiveWalletId) {\n id status\n }\n }\n `, input);\n return confirmSettlementWallets;\n }\n\n // ─── HTLC — EVM (ETH / ERC-20) ──────────────────────────\n\n /**\n * Record an on-chain HTLC funding transaction.\n * Called after the user sends an ETH/ERC20 lock tx on-chain.\n *\n * @example\n * ```ts\n * // After sending ETH lock tx on-chain via ethers/viem:\n * const result = await hl.fundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xabc...',\n * role: 'INITIATOR',\n * timelock: Math.floor(Date.now() / 1000) + 3600,\n * hashlock: '0x...',\n * });\n * ```\n */\n async fundHTLC(input: FundHTLCInput): Promise<FundHTLCResult> {\n const { fundHTLC } = await this.client.mutate<{ fundHTLC: FundHTLCResult }>(`\n mutation FundHTLC($tradeId: ID!, $txHash: String!, $role: HTLCRole!, $timelock: Int, $hashlock: String, $chainType: String, $senderPubKey: String, $receiverPubKey: String, $redeemScript: String, $refundTxHex: String, $preimage: String) {\n fundHTLC(tradeId: $tradeId, txHash: $txHash, role: $role, timelock: $timelock, hashlock: $hashlock, chainType: $chainType, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, redeemScript: $redeemScript, refundTxHex: $refundTxHex, preimage: $preimage) {\n tradeId txHash status\n }\n }\n `, input);\n return fundHTLC;\n }\n\n /**\n * Record an on-chain HTLC claim (preimage reveal).\n *\n * @example\n * ```ts\n * const result = await hl.claimHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0xdef...',\n * preimage: '0x...',\n * });\n * ```\n */\n async claimHTLC(input: ClaimHTLCInput): Promise<HTLCStatusResult> {\n const { claimHTLC } = await this.client.mutate<{ claimHTLC: HTLCStatusResult }>(`\n mutation ClaimHTLC($tradeId: ID!, $txHash: String!, $preimage: String!, $chainType: String) {\n claimHTLC(tradeId: $tradeId, txHash: $txHash, preimage: $preimage, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return claimHTLC;\n }\n\n /**\n * Record an on-chain HTLC refund (after timelock expiry).\n *\n * @example\n * ```ts\n * const result = await hl.refundHTLC({\n * tradeId: 'trade-uuid',\n * txHash: '0x...',\n * });\n * ```\n */\n async refundHTLC(input: RefundHTLCInput): Promise<HTLCStatusResult> {\n const { refundHTLC } = await this.client.mutate<{ refundHTLC: HTLCStatusResult }>(`\n mutation RefundHTLC($tradeId: ID!, $txHash: String!, $chainType: String) {\n refundHTLC(tradeId: $tradeId, txHash: $txHash, chainType: $chainType) {\n tradeId status\n }\n }\n `, input);\n return refundHTLC;\n }\n\n /**\n * Get HTLC status for a trade (both initiator and counterparty HTLCs).\n */\n async getHTLCStatus(tradeId: string): Promise<HTLCStatusResult | null> {\n const { htlcStatus } = await this.client.query<{ htlcStatus: HTLCStatusResult | null }>(`\n query HTLCStatus($tradeId: ID!) {\n htlcStatus(tradeId: $tradeId) {\n tradeId status\n initiatorHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }\n counterpartyHTLC { id tradeId role status contractAddress hashlock timelock amount txHash chainId }\n }\n }\n `, { tradeId });\n return htlcStatus;\n }\n\n /**\n * Get all HTLCs for a trade.\n */\n async getHTLCs(tradeId: string): Promise<HTLC[]> {\n const { htlcs } = await this.client.query<{ htlcs: HTLC[] }>(`\n query GetHTLCs($tradeId: ID!) {\n htlcs(tradeId: $tradeId) {\n id tradeId role status contractAddress hashlock timelock amount txHash chainType preimage\n }\n }\n `, { tradeId });\n return htlcs;\n }\n\n // ─── HTLC — Bitcoin ──────────────────────────────────────\n\n /**\n * Prepare a Bitcoin HTLC. Returns P2WSH address and redeem script.\n * The client funds this address, then calls fundHTLC with the txHash.\n *\n * @example\n * ```ts\n * const btcHtlc = await hl.prepareBitcoinHTLC({\n * tradeId: 'trade-uuid',\n * role: 'INITIATOR',\n * senderPubKey: '02abc...',\n * receiverPubKey: '03def...',\n * timelock: Math.floor(Date.now() / 1000) + 7200,\n * amountSats: '100000', // 0.001 BTC\n * });\n * console.log(`Fund this address: ${btcHtlc.htlcAddress}`);\n * ```\n */\n async prepareBitcoinHTLC(input: PrepareBitcoinHTLCInput): Promise<BitcoinHTLCPrepareResult> {\n const { prepareBitcoinHTLC } = await this.client.mutate<{ prepareBitcoinHTLC: BitcoinHTLCPrepareResult }>(`\n mutation PrepareBTCHTLC($tradeId: ID!, $role: HTLCRole!, $senderPubKey: String!, $receiverPubKey: String!, $timelock: Int!, $amountSats: String!) {\n prepareBitcoinHTLC(tradeId: $tradeId, role: $role, senderPubKey: $senderPubKey, receiverPubKey: $receiverPubKey, timelock: $timelock, amountSats: $amountSats) {\n tradeId htlcId htlcAddress redeemScript hashlock preimageHash timelock amountSats estimatedClaimFee estimatedRefundFee refundPsbt\n }\n }\n `, input);\n return prepareBitcoinHTLC;\n }\n\n /**\n * Build an unsigned claim PSBT for a Bitcoin HTLC.\n * The client signs with their wallet, then broadcasts via broadcastBitcoinTx.\n */\n async buildBitcoinClaimPSBT(input: BuildBitcoinClaimPSBTInput): Promise<BitcoinClaimPSBTResult> {\n const { buildBitcoinClaimPSBT } = await this.client.mutate<{ buildBitcoinClaimPSBT: BitcoinClaimPSBTResult }>(`\n mutation BuildClaim($tradeId: ID!, $htlcId: ID!, $preimage: String!, $destinationPubKey: String!, $feeRate: Int) {\n buildBitcoinClaimPSBT(tradeId: $tradeId, htlcId: $htlcId, preimage: $preimage, destinationPubKey: $destinationPubKey, feeRate: $feeRate) {\n tradeId htlcId psbtBase64 fee utxoTxid utxoVout\n }\n }\n `, input);\n return buildBitcoinClaimPSBT;\n }\n\n /**\n * Broadcast a signed Bitcoin transaction.\n */\n async broadcastBitcoinTx(input: BroadcastBitcoinTxInput): Promise<BitcoinBroadcastResult> {\n const { broadcastBitcoinTx } = await this.client.mutate<{ broadcastBitcoinTx: BitcoinBroadcastResult }>(`\n mutation BroadcastBTC($tradeId: ID!, $txHex: String!) {\n broadcastBitcoinTx(tradeId: $tradeId, txHex: $txHex) { txid success }\n }\n `, input);\n return broadcastBitcoinTx;\n }\n}\n"],"mappings":"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","names":[]}
|