@speculite/clob-client 0.1.0

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.
@@ -0,0 +1,48 @@
1
+ import { type Address, type Hex } from 'viem';
2
+ import type { OnchainExecutionResult, PrepareApproveUsdcArgs, PrepareClaimArgs, PrepareMergeArgs, PrepareMintArgs, PrepareResolveArgs, PreparedOnchainTransaction, PreparedResolveTransaction } from '../types.js';
3
+ import { TradingClient } from './tradingClient.js';
4
+ /**
5
+ * Wallet-native lifecycle helpers.
6
+ *
7
+ * `prepare*` methods return unsigned tx payloads.
8
+ * action methods (`mintTokens`, `claimWinnings`, ...) prepare + send in one call.
9
+ */
10
+ export declare class LifecycleClient extends TradingClient {
11
+ /** Prepares ERC20 approve tx (typically USDC -> exchange). */
12
+ prepareApproveUsdcTx(args: PrepareApproveUsdcArgs): Promise<PreparedOnchainTransaction>;
13
+ /** Prepares mint tx for paired YES/NO tokens. */
14
+ prepareMintTx(args: PrepareMintArgs): Promise<PreparedOnchainTransaction>;
15
+ /** Prepares merge tx to redeem paired tokens back to USDC. */
16
+ prepareMergeTx(args: PrepareMergeArgs): Promise<PreparedOnchainTransaction>;
17
+ /** Prepares claim tx for resolved-market winnings. */
18
+ prepareClaimTx(args: PrepareClaimArgs): Promise<PreparedOnchainTransaction>;
19
+ /**
20
+ * Prepares resolve tx:
21
+ * - fetches Pyth update data
22
+ * - computes update fee + safety buffer
23
+ * - returns payable tx payload
24
+ */
25
+ prepareResolveTx(args: PrepareResolveArgs): Promise<PreparedResolveTransaction>;
26
+ /** Sends a prepared transaction via configured wallet client. */
27
+ sendPreparedTransaction(tx: PreparedOnchainTransaction, account?: Address): Promise<Hex>;
28
+ /** Prepares + sends approve tx. */
29
+ approveUsdc(args: PrepareApproveUsdcArgs & {
30
+ account?: Address;
31
+ }): Promise<OnchainExecutionResult<PreparedOnchainTransaction>>;
32
+ /** Prepares + sends mint tx. */
33
+ mintTokens(args: PrepareMintArgs & {
34
+ account?: Address;
35
+ }): Promise<OnchainExecutionResult<PreparedOnchainTransaction>>;
36
+ /** Prepares + sends merge tx. */
37
+ mergeTokens(args: PrepareMergeArgs & {
38
+ account?: Address;
39
+ }): Promise<OnchainExecutionResult<PreparedOnchainTransaction>>;
40
+ /** Prepares + sends claim tx. */
41
+ claimWinnings(args: PrepareClaimArgs & {
42
+ account?: Address;
43
+ }): Promise<OnchainExecutionResult<PreparedOnchainTransaction>>;
44
+ /** Prepares + sends resolve tx. */
45
+ resolveMarket(args: PrepareResolveArgs & {
46
+ account?: Address;
47
+ }): Promise<OnchainExecutionResult<PreparedResolveTransaction>>;
48
+ }
@@ -0,0 +1,163 @@
1
+ import { encodeFunctionData, parseUnits } from 'viem';
2
+ import { ERC20_ABI, EXCHANGE_CLAIM_ABI, EXCHANGE_MERGE_ABI, EXCHANGE_MINT_ABI, EXCHANGE_RESOLVE_ABI, MIN_UPDATE_FEE_BUFFER_WEI, PYTH_ABI, } from '../internal/constants.js';
3
+ import { normalizeAddress, toPositiveDecimalString } from '../internal/utils.js';
4
+ import { TradingClient } from './tradingClient.js';
5
+ /**
6
+ * Wallet-native lifecycle helpers.
7
+ *
8
+ * `prepare*` methods return unsigned tx payloads.
9
+ * action methods (`mintTokens`, `claimWinnings`, ...) prepare + send in one call.
10
+ */
11
+ export class LifecycleClient extends TradingClient {
12
+ /** Prepares ERC20 approve tx (typically USDC -> exchange). */
13
+ async prepareApproveUsdcTx(args) {
14
+ const spender = normalizeAddress(args.spender, 'spender');
15
+ const usdcAddress = normalizeAddress(args.usdcAddress, 'usdcAddress');
16
+ const amount = parseUnits(toPositiveDecimalString(args.amount, 'amount'), 6);
17
+ const data = encodeFunctionData({
18
+ abi: ERC20_ABI,
19
+ functionName: 'approve',
20
+ args: [spender, amount]
21
+ });
22
+ return {
23
+ to: usdcAddress,
24
+ data,
25
+ chainId: this.chainId,
26
+ kind: 'approve_usdc'
27
+ };
28
+ }
29
+ /** Prepares mint tx for paired YES/NO tokens. */
30
+ async prepareMintTx(args) {
31
+ const market = await this.resolveOnchainMarketInfo(args.marketId, args.market);
32
+ const amount = parseUnits(toPositiveDecimalString(args.amount, 'amount'), 6);
33
+ const data = encodeFunctionData({
34
+ abi: EXCHANGE_MINT_ABI,
35
+ functionName: 'mint',
36
+ args: [BigInt(market.marketIdOnchain), amount]
37
+ });
38
+ return {
39
+ to: market.exchangeAddress,
40
+ data,
41
+ chainId: this.chainId,
42
+ kind: 'mint'
43
+ };
44
+ }
45
+ /** Prepares merge tx to redeem paired tokens back to USDC. */
46
+ async prepareMergeTx(args) {
47
+ const market = await this.resolveOnchainMarketInfo(args.marketId, args.market);
48
+ const holder = normalizeAddress(args.holder, 'holder');
49
+ const pairs = parseUnits(toPositiveDecimalString(args.pairs, 'pairs'), 6);
50
+ const data = encodeFunctionData({
51
+ abi: EXCHANGE_MERGE_ABI,
52
+ functionName: 'mergeFor',
53
+ args: [BigInt(market.marketIdOnchain), holder, pairs]
54
+ });
55
+ return {
56
+ to: market.exchangeAddress,
57
+ data,
58
+ chainId: this.chainId,
59
+ kind: 'merge'
60
+ };
61
+ }
62
+ /** Prepares claim tx for resolved-market winnings. */
63
+ async prepareClaimTx(args) {
64
+ const market = await this.resolveOnchainMarketInfo(args.marketId, args.market);
65
+ const data = encodeFunctionData({
66
+ abi: EXCHANGE_CLAIM_ABI,
67
+ functionName: 'claimWinnings',
68
+ args: [BigInt(market.marketIdOnchain)]
69
+ });
70
+ return {
71
+ to: market.exchangeAddress,
72
+ data,
73
+ chainId: this.chainId,
74
+ kind: 'claim'
75
+ };
76
+ }
77
+ /**
78
+ * Prepares resolve tx:
79
+ * - fetches Pyth update data
80
+ * - computes update fee + safety buffer
81
+ * - returns payable tx payload
82
+ */
83
+ async prepareResolveTx(args) {
84
+ const market = await this.resolveOnchainMarketInfo(args.marketId, args.market);
85
+ const pythAddress = normalizeAddress(args.pythAddress || this.defaultPythAddress, 'pythAddress');
86
+ if (!market.pythFeedId) {
87
+ throw new Error('Market is missing pyth_feed_id');
88
+ }
89
+ if (!market.expiryTimestamp) {
90
+ throw new Error('Market is missing expiration_timestamp');
91
+ }
92
+ const updateData = await this.fetchPythUpdateData(market.pythFeedId, market.expiryTimestamp, args.pythPriceServiceUrl || this.pythPriceServiceUrl, args.allowLatestFallback !== false);
93
+ const publicClient = this.resolvePublicClient(args.rpcUrl);
94
+ const updateFee = await publicClient.readContract({
95
+ address: pythAddress,
96
+ abi: PYTH_ABI,
97
+ functionName: 'getUpdateFee',
98
+ args: [updateData]
99
+ });
100
+ const feeBuffer = updateFee > 100000n
101
+ ? updateFee / 100n
102
+ : MIN_UPDATE_FEE_BUFFER_WEI;
103
+ const feeWithBuffer = updateFee + feeBuffer;
104
+ const data = encodeFunctionData({
105
+ abi: EXCHANGE_RESOLVE_ABI,
106
+ functionName: 'resolveMarketWithPyth',
107
+ args: [BigInt(market.marketIdOnchain), pythAddress, updateData]
108
+ });
109
+ return {
110
+ to: market.exchangeAddress,
111
+ data,
112
+ value: feeWithBuffer,
113
+ chainId: this.chainId,
114
+ kind: 'resolve',
115
+ updateData,
116
+ updateFeeWei: feeWithBuffer,
117
+ marketIdOnchain: market.marketIdOnchain
118
+ };
119
+ }
120
+ /** Sends a prepared transaction via configured wallet client. */
121
+ async sendPreparedTransaction(tx, account) {
122
+ const walletClient = this.requireWalletClient();
123
+ const fromAccount = await this.resolveWalletAccount(walletClient, account);
124
+ return walletClient.sendTransaction({
125
+ account: fromAccount,
126
+ to: tx.to,
127
+ data: tx.data,
128
+ value: tx.value || 0n,
129
+ chain: walletClient.chain ?? null
130
+ });
131
+ }
132
+ /** Prepares + sends approve tx. */
133
+ async approveUsdc(args) {
134
+ const tx = await this.prepareApproveUsdcTx(args);
135
+ const hash = await this.sendPreparedTransaction(tx, args.account);
136
+ return { hash, tx };
137
+ }
138
+ /** Prepares + sends mint tx. */
139
+ async mintTokens(args) {
140
+ const tx = await this.prepareMintTx(args);
141
+ const hash = await this.sendPreparedTransaction(tx, args.account);
142
+ return { hash, tx };
143
+ }
144
+ /** Prepares + sends merge tx. */
145
+ async mergeTokens(args) {
146
+ const tx = await this.prepareMergeTx(args);
147
+ const hash = await this.sendPreparedTransaction(tx, args.account);
148
+ return { hash, tx };
149
+ }
150
+ /** Prepares + sends claim tx. */
151
+ async claimWinnings(args) {
152
+ const tx = await this.prepareClaimTx(args);
153
+ const hash = await this.sendPreparedTransaction(tx, args.account);
154
+ return { hash, tx };
155
+ }
156
+ /** Prepares + sends resolve tx. */
157
+ async resolveMarket(args) {
158
+ const tx = await this.prepareResolveTx(args);
159
+ const hash = await this.sendPreparedTransaction(tx, args.account);
160
+ return { hash, tx };
161
+ }
162
+ }
163
+ //# sourceMappingURL=lifecycleClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleClient.js","sourceRoot":"","sources":["../../src/client/lifecycleClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { BaseClient } from './baseClient.js';
2
+ import type { DeveloperApiKeyRevokeResponse, DeveloperApiKeysResponse, DeveloperAuthMeResponse, DeveloperCancelOrderResponse, DeveloperOpenOrdersResponse, DeveloperOrderAcceptedResponse, DeveloperOrderHistoryResponse, DeveloperOrderRequest, DeveloperListParams, DeveloperPositionsParams, DeveloperPositionsResponse, DeveloperResolveMarketResponse, DeveloperTradesResponse, DeveloperWalletActivityResponse, MarketDataBatchResponse, MarketDataResponse, MarketResponse, MarketsResponse, OrderbookResponse, RequestOptions } from '../types.js';
3
+ /**
4
+ * Read/data and authenticated REST methods.
5
+ *
6
+ * Includes:
7
+ * - public market reads
8
+ * - developer key management helpers (bearer-auth)
9
+ * - developer trading/account state methods (HMAC-auth)
10
+ */
11
+ export declare class PublicClient extends BaseClient {
12
+ /** Lists API keys for the authenticated app user (UI/session token). */
13
+ listApiKeys(authToken: string): Promise<DeveloperApiKeysResponse>;
14
+ /** Revokes one API key for the authenticated app user. */
15
+ revokeApiKey(apiKeyId: string, authToken: string): Promise<DeveloperApiKeyRevokeResponse>;
16
+ /** Returns wallet activity observed through developer-key trading. */
17
+ getWalletActivity(authToken: string): Promise<DeveloperWalletActivityResponse>;
18
+ /** Fetches markets with optional query filters. */
19
+ getMarkets(query?: RequestOptions['query']): Promise<MarketsResponse>;
20
+ /** Fetches one market by UUID. */
21
+ getMarket(marketId: string): Promise<MarketResponse>;
22
+ /** Fetches latest market data point for one market. */
23
+ getMarketData(marketId: string): Promise<MarketDataResponse>;
24
+ /** Fetches latest market data points for multiple markets. */
25
+ getMarketDataBatch(marketIds: string[]): Promise<MarketDataBatchResponse>;
26
+ /** Fetches current orderbook snapshot for one market. */
27
+ getOrderbook(marketId: string): Promise<OrderbookResponse>;
28
+ /** Validates current developer API credentials. */
29
+ getAuthMe(): Promise<DeveloperAuthMeResponse>;
30
+ /** Lists open/partially-filled orders for developer principal. */
31
+ getOpenOrders(marketId?: string): Promise<DeveloperOpenOrdersResponse>;
32
+ /** Lists historical orders for developer principal. */
33
+ getOrderHistory(params?: DeveloperListParams): Promise<DeveloperOrderHistoryResponse>;
34
+ /** Lists trade fills for developer principal. */
35
+ getTrades(params?: DeveloperListParams): Promise<DeveloperTradesResponse>;
36
+ /** Lists tracked positions for developer principal. */
37
+ getPositions(params?: DeveloperPositionsParams): Promise<DeveloperPositionsResponse>;
38
+ /** Cancels one open order owned by developer principal. */
39
+ cancelOrder(orderId: string): Promise<DeveloperCancelOrderResponse>;
40
+ /** Triggers backend/operator resolution for an expired market. */
41
+ resolveExpiredMarket(marketId: string): Promise<DeveloperResolveMarketResponse>;
42
+ /** Posts an already-signed order payload. */
43
+ postOrder(order: DeveloperOrderRequest): Promise<DeveloperOrderAcceptedResponse>;
44
+ }
@@ -0,0 +1,127 @@
1
+ import { BaseClient } from './baseClient.js';
2
+ /**
3
+ * Read/data and authenticated REST methods.
4
+ *
5
+ * Includes:
6
+ * - public market reads
7
+ * - developer key management helpers (bearer-auth)
8
+ * - developer trading/account state methods (HMAC-auth)
9
+ */
10
+ export class PublicClient extends BaseClient {
11
+ /** Lists API keys for the authenticated app user (UI/session token). */
12
+ async listApiKeys(authToken) {
13
+ return this.request('GET', '/api/developer/keys', {
14
+ auth: 'bearer',
15
+ authToken
16
+ });
17
+ }
18
+ /** Revokes one API key for the authenticated app user. */
19
+ async revokeApiKey(apiKeyId, authToken) {
20
+ return this.request('DELETE', `/api/developer/keys/${apiKeyId}`, {
21
+ auth: 'bearer',
22
+ authToken
23
+ });
24
+ }
25
+ /** Returns wallet activity observed through developer-key trading. */
26
+ async getWalletActivity(authToken) {
27
+ return this.request('GET', '/api/developer/wallets', {
28
+ auth: 'bearer',
29
+ authToken
30
+ });
31
+ }
32
+ /** Fetches markets with optional query filters. */
33
+ async getMarkets(query = {}) {
34
+ return this.request('GET', '/api/markets', { query });
35
+ }
36
+ /** Fetches one market by UUID. */
37
+ async getMarket(marketId) {
38
+ return this.request('GET', `/api/markets/${marketId}`);
39
+ }
40
+ /** Fetches latest market data point for one market. */
41
+ async getMarketData(marketId) {
42
+ return this.request('GET', `/api/market-data/${marketId}`);
43
+ }
44
+ /** Fetches latest market data points for multiple markets. */
45
+ async getMarketDataBatch(marketIds) {
46
+ return this.request('POST', '/api/market-data/batch', {
47
+ body: { market_ids: marketIds }
48
+ });
49
+ }
50
+ /** Fetches current orderbook snapshot for one market. */
51
+ async getOrderbook(marketId) {
52
+ return this.request('GET', '/clob/orderbook', {
53
+ query: { market_id: marketId }
54
+ });
55
+ }
56
+ /** Validates current developer API credentials. */
57
+ async getAuthMe() {
58
+ return this.request('GET', '/api/developer/auth/me', {
59
+ auth: 'developer'
60
+ });
61
+ }
62
+ /** Lists open/partially-filled orders for developer principal. */
63
+ async getOpenOrders(marketId) {
64
+ return this.request('GET', '/api/developer/orders/open', {
65
+ auth: 'developer',
66
+ query: marketId ? { market_id: marketId } : undefined
67
+ });
68
+ }
69
+ /** Lists historical orders for developer principal. */
70
+ async getOrderHistory(params = {}) {
71
+ return this.request('GET', '/api/developer/orders/history', {
72
+ auth: 'developer',
73
+ query: {
74
+ market_id: params.marketId,
75
+ limit: params.limit,
76
+ offset: params.offset
77
+ }
78
+ });
79
+ }
80
+ /** Lists trade fills for developer principal. */
81
+ async getTrades(params = {}) {
82
+ return this.request('GET', '/api/developer/trades', {
83
+ auth: 'developer',
84
+ query: {
85
+ market_id: params.marketId,
86
+ limit: params.limit,
87
+ offset: params.offset
88
+ }
89
+ });
90
+ }
91
+ /** Lists tracked positions for developer principal. */
92
+ async getPositions(params = {}) {
93
+ return this.request('GET', '/api/developer/positions', {
94
+ auth: 'developer',
95
+ query: {
96
+ market_id: params.marketId,
97
+ include_closed: params.includeClosed,
98
+ limit: params.limit,
99
+ offset: params.offset
100
+ }
101
+ });
102
+ }
103
+ /** Cancels one open order owned by developer principal. */
104
+ async cancelOrder(orderId) {
105
+ return this.request('DELETE', `/api/developer/orders/${orderId}`, {
106
+ auth: 'developer'
107
+ });
108
+ }
109
+ /** Triggers backend/operator resolution for an expired market. */
110
+ async resolveExpiredMarket(marketId) {
111
+ const normalizedMarketId = marketId.trim();
112
+ if (!normalizedMarketId) {
113
+ throw new Error('marketId is required');
114
+ }
115
+ return this.request('POST', `/api/developer/markets/${normalizedMarketId}/resolve`, {
116
+ auth: 'developer'
117
+ });
118
+ }
119
+ /** Posts an already-signed order payload. */
120
+ async postOrder(order) {
121
+ return this.request('POST', '/api/developer/orders', {
122
+ auth: 'developer',
123
+ body: order
124
+ });
125
+ }
126
+ }
127
+ //# sourceMappingURL=publicClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicClient.js","sourceRoot":"","sources":["../../src/client/publicClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type CreateOrderArgs, type DeveloperOrderAcceptedResponse, type DeveloperOrderRequest, type MarketSigningInfo } from '../types.js';
2
+ import { PublicClient } from './publicClient.js';
3
+ /**
4
+ * Order signing/composition helpers layered on top of REST methods.
5
+ */
6
+ export declare class TradingClient extends PublicClient {
7
+ /**
8
+ * Builds and signs an EIP-712 order payload without submitting it.
9
+ */
10
+ createOrder(args: CreateOrderArgs, marketInfo?: MarketSigningInfo): Promise<DeveloperOrderRequest>;
11
+ /**
12
+ * Convenience wrapper: `createOrder` + `postOrder`.
13
+ */
14
+ createAndPostOrder(args: CreateOrderArgs, marketInfo?: MarketSigningInfo): Promise<DeveloperOrderAcceptedResponse>;
15
+ }
@@ -0,0 +1,75 @@
1
+ import { OrderType, Side } from '../types.js';
2
+ import { normalizeHexSignature, scaleToInt, scaledToDecimalString } from '../internal/utils.js';
3
+ import { PublicClient } from './publicClient.js';
4
+ /**
5
+ * Order signing/composition helpers layered on top of REST methods.
6
+ */
7
+ export class TradingClient extends PublicClient {
8
+ /**
9
+ * Builds and signs an EIP-712 order payload without submitting it.
10
+ */
11
+ async createOrder(args, marketInfo) {
12
+ const signer = this.requireSigner();
13
+ const maker = await this.resolveMakerAddress(args.maker);
14
+ const market = marketInfo || await this.fetchMarketSigningInfo(args.marketId);
15
+ const priceScaled = scaleToInt(args.price, 'price');
16
+ if (priceScaled > 1_000_000) {
17
+ throw new Error('price must be less than or equal to 1');
18
+ }
19
+ const sizeScaled = scaleToInt(args.size, 'size');
20
+ const nonce = args.nonce !== undefined ? String(args.nonce) : this.nextNonce();
21
+ if (!/^\d+$/.test(nonce)) {
22
+ throw new Error('nonce must be an unsigned integer');
23
+ }
24
+ const nowSeconds = Math.floor(this.now() / 1000);
25
+ const expiry = args.expiry !== undefined ? Math.floor(args.expiry) : nowSeconds + 7 * 24 * 60 * 60;
26
+ if (!Number.isFinite(expiry) || expiry <= nowSeconds) {
27
+ throw new Error('expiry must be a future unix timestamp in seconds');
28
+ }
29
+ const isSell = args.side === Side.SELL;
30
+ const tokenId = args.outcome === 'YES' ? 0 : 1;
31
+ const domain = {
32
+ name: 'SpeculiteExchange',
33
+ version: '1',
34
+ chainId: this.chainId,
35
+ verifyingContract: market.exchangeAddress
36
+ };
37
+ const message = {
38
+ marketId: BigInt(market.marketIdOnchain),
39
+ maker,
40
+ isSell,
41
+ tokenId: BigInt(tokenId),
42
+ amount: BigInt(sizeScaled),
43
+ price: BigInt(priceScaled),
44
+ feeBps: BigInt(market.takerFeeBps),
45
+ nonce: BigInt(nonce),
46
+ expiry: BigInt(expiry)
47
+ };
48
+ const signature = normalizeHexSignature(await this.signTypedData(signer, domain, message, maker));
49
+ const order = {
50
+ market_id: args.marketId,
51
+ maker,
52
+ outcome: args.outcome,
53
+ side: args.side,
54
+ price: scaledToDecimalString(priceScaled),
55
+ size: scaledToDecimalString(sizeScaled),
56
+ nonce,
57
+ expiry,
58
+ signature,
59
+ order_type: args.orderType || OrderType.LIMIT
60
+ };
61
+ if (args.orderType === OrderType.MARKET && args.maxSlippage !== undefined) {
62
+ const slippageScaled = scaleToInt(args.maxSlippage, 'maxSlippage');
63
+ order.max_slippage = scaledToDecimalString(slippageScaled);
64
+ }
65
+ return order;
66
+ }
67
+ /**
68
+ * Convenience wrapper: `createOrder` + `postOrder`.
69
+ */
70
+ async createAndPostOrder(args, marketInfo) {
71
+ const order = await this.createOrder(args, marketInfo);
72
+ return this.postOrder(order);
73
+ }
74
+ }
75
+ //# sourceMappingURL=tradingClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tradingClient.js","sourceRoot":"","sources":["../../src/client/tradingClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class SpeculiteApiError extends Error {
2
+ /** HTTP status returned by the Speculite API. */
3
+ readonly status: number;
4
+ /** Raw response payload returned by the API. */
5
+ readonly payload: unknown;
6
+ constructor(status: number, payload: unknown);
7
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Extracts a readable message from heterogeneous API error payloads.
3
+ */
4
+ function readJsonErrorMessage(payload, status) {
5
+ if (typeof payload === 'string' && payload.trim()) {
6
+ return payload;
7
+ }
8
+ if (payload && typeof payload === 'object') {
9
+ const obj = payload;
10
+ const message = obj.message;
11
+ const error = obj.error;
12
+ if (typeof message === 'string' && message.trim())
13
+ return message;
14
+ if (typeof error === 'string' && error.trim())
15
+ return error;
16
+ }
17
+ return `Speculite API request failed with status ${status}`;
18
+ }
19
+ export class SpeculiteApiError extends Error {
20
+ /** HTTP status returned by the Speculite API. */
21
+ status;
22
+ /** Raw response payload returned by the API. */
23
+ payload;
24
+ constructor(status, payload) {
25
+ super(readJsonErrorMessage(payload, status));
26
+ this.name = 'SpeculiteApiError';
27
+ this.status = status;
28
+ this.payload = payload;
29
+ }
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAgB,EAAE,MAAc;IAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAqB,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,OAAO,CAAC;QAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,4CAA4C,MAAM,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,iDAAiD;IACxC,MAAM,CAAS;IACxB,gDAAgD;IACvC,OAAO,CAAU;IAE1B,YAAY,MAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export * from './speculiteClobClient.js';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './speculiteClobClient.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}