@olympex-io/olympex-sdk 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.
package/dist/index.mjs ADDED
@@ -0,0 +1,817 @@
1
+ // src/errors/base-error.ts
2
+ var OlympexSdkError = class extends Error {
3
+ code;
4
+ metadata;
5
+ constructor(message, code = "OLYMPEX_SDK_ERROR", metadata) {
6
+ super(message);
7
+ this.name = new.target.name;
8
+ this.code = code;
9
+ this.metadata = metadata;
10
+ }
11
+ };
12
+
13
+ // src/errors/graphql-error.ts
14
+ var OlympexGraphQLError = class extends OlympexSdkError {
15
+ constructor(message, metadata) {
16
+ super(message, "OLYMPEX_GRAPHQL_ERROR", metadata);
17
+ }
18
+ };
19
+
20
+ // src/errors/network-error.ts
21
+ var OlympexNetworkError = class extends OlympexSdkError {
22
+ constructor(message, metadata) {
23
+ super(message, "OLYMPEX_NETWORK_ERROR", metadata);
24
+ }
25
+ };
26
+
27
+ // src/errors/redact.ts
28
+ var SENSITIVE_KEY_PATTERN = /api[-_]?key|authorization|cookie|token|secret|password/i;
29
+ function isPlainObject(value) {
30
+ return typeof value === "object" && value !== null && !Array.isArray(value);
31
+ }
32
+ function redact(value) {
33
+ if (Array.isArray(value)) {
34
+ return value.map((item) => redact(item));
35
+ }
36
+ if (!isPlainObject(value)) {
37
+ return value;
38
+ }
39
+ return Object.fromEntries(
40
+ Object.entries(value).map(([key, entry]) => [
41
+ key,
42
+ SENSITIVE_KEY_PATTERN.test(key) ? "<REDACTED>" : redact(entry)
43
+ ])
44
+ );
45
+ }
46
+
47
+ // src/client/request-signing.ts
48
+ import crypto from "crypto";
49
+ function generateBodySignature(body) {
50
+ const hashBuffer = crypto.createHash("sha256").update(body).digest();
51
+ return hashBuffer.toString("base64url");
52
+ }
53
+ function getTimestamp() {
54
+ return Math.floor(Date.now() / 1e3).toString();
55
+ }
56
+ function generateNonce() {
57
+ return crypto.randomBytes(12).toString("hex");
58
+ }
59
+ function sign({ message, secret }) {
60
+ return crypto.createHmac("sha256", secret).update(message).digest("hex");
61
+ }
62
+ function buildSignedHeaders({
63
+ apiKey,
64
+ apiSecret,
65
+ passphrase,
66
+ body,
67
+ timestamp,
68
+ nonce
69
+ }) {
70
+ const bodyHash = generateBodySignature(body);
71
+ const resolvedTimestamp = timestamp ?? getTimestamp();
72
+ const resolvedNonce = nonce ?? generateNonce();
73
+ const message = `${resolvedTimestamp}
74
+ ${resolvedNonce}
75
+ ${bodyHash}`;
76
+ const headerData = Buffer.from(message).toString("base64");
77
+ return {
78
+ "x-api-key-id": apiKey,
79
+ "x-value-info": headerData,
80
+ "x-passphrase": passphrase,
81
+ "x-signature": sign({ message, secret: apiSecret })
82
+ };
83
+ }
84
+
85
+ // src/client/graphql-client.ts
86
+ var OlympexGraphQLClient = class {
87
+ apiKey;
88
+ apiSecret;
89
+ passphrase;
90
+ endpoint;
91
+ headers;
92
+ logger;
93
+ timeoutMs;
94
+ constructor(options) {
95
+ this.apiKey = options.apiKey;
96
+ this.apiSecret = options.apiSecret;
97
+ this.passphrase = options.passphrase;
98
+ this.endpoint = options.endpoint;
99
+ this.headers = options.headers ?? {};
100
+ this.logger = options.logger;
101
+ this.timeoutMs = options.timeoutMs;
102
+ }
103
+ async request(document, variables) {
104
+ const controller = new AbortController();
105
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
106
+ try {
107
+ this.logger?.log(
108
+ "debug",
109
+ "Sending Olympex GraphQL request",
110
+ redact({
111
+ endpoint: this.endpoint,
112
+ variables
113
+ })
114
+ );
115
+ const bodyToFetch = JSON.stringify({ query: document, variables });
116
+ const signedHeaders = buildSignedHeaders({
117
+ apiKey: this.apiKey,
118
+ apiSecret: this.apiSecret,
119
+ body: bodyToFetch,
120
+ passphrase: this.passphrase
121
+ });
122
+ const response = await fetch(this.endpoint, {
123
+ body: bodyToFetch,
124
+ headers: {
125
+ accept: "application/json",
126
+ "content-type": "application/json",
127
+ ...this.headers,
128
+ ...signedHeaders
129
+ },
130
+ method: "POST",
131
+ signal: controller.signal
132
+ });
133
+ let body;
134
+ try {
135
+ body = await response.json();
136
+ } catch {
137
+ this.logger?.log(
138
+ "error",
139
+ "Olympex GraphQL response was not valid JSON",
140
+ redact({
141
+ contentType: response.headers.get("content-type") ?? void 0,
142
+ endpoint: this.endpoint,
143
+ status: response.status
144
+ })
145
+ );
146
+ throw new OlympexNetworkError("GraphQL response was not valid JSON", {
147
+ contentType: response.headers.get("content-type") ?? void 0,
148
+ status: response.status,
149
+ statusText: response.statusText
150
+ });
151
+ }
152
+ if (!response.ok) {
153
+ this.logger?.log(
154
+ "error",
155
+ "Olympex GraphQL request failed with HTTP status",
156
+ redact({
157
+ endpoint: this.endpoint,
158
+ status: response.status,
159
+ statusText: response.statusText
160
+ })
161
+ );
162
+ throw new OlympexNetworkError(`GraphQL request failed with status ${response.status}`, {
163
+ status: response.status,
164
+ statusText: response.statusText
165
+ });
166
+ }
167
+ if (body?.errors?.length) {
168
+ const firstError = body.errors[0];
169
+ this.logger?.log(
170
+ "warn",
171
+ "Olympex GraphQL response contains errors",
172
+ redact({
173
+ endpoint: this.endpoint,
174
+ errorCount: body.errors.length,
175
+ extensions: firstError?.extensions,
176
+ firstMessage: firstError?.message
177
+ })
178
+ );
179
+ throw new OlympexGraphQLError(body.errors[0]?.message ?? "GraphQL request failed", {
180
+ errors: body.errors.map((error) => ({
181
+ extensions: error.extensions,
182
+ message: error.message,
183
+ path: error.path
184
+ }))
185
+ });
186
+ }
187
+ if (!body?.data) {
188
+ throw new OlympexGraphQLError("GraphQL response did not include data");
189
+ }
190
+ return body.data;
191
+ } catch (error) {
192
+ if (error instanceof OlympexGraphQLError || error instanceof OlympexNetworkError) {
193
+ throw error;
194
+ }
195
+ const errorName = error instanceof Error ? error.name : "UnknownError";
196
+ const errorMessage = error instanceof Error ? error.message : "Unknown network error";
197
+ this.logger?.log(
198
+ "error",
199
+ "Olympex GraphQL network failure",
200
+ redact({
201
+ endpoint: this.endpoint,
202
+ errorMessage,
203
+ errorName
204
+ })
205
+ );
206
+ throw new OlympexNetworkError(errorMessage);
207
+ } finally {
208
+ clearTimeout(timeout);
209
+ }
210
+ }
211
+ };
212
+
213
+ // src/errors/config-error.ts
214
+ var OlympexConfigError = class extends OlympexSdkError {
215
+ constructor(message, metadata) {
216
+ super(message, "OLYMPEX_CONFIG_ERROR", metadata);
217
+ }
218
+ };
219
+
220
+ // src/fees/validation.ts
221
+ import { isAddress } from "ethers";
222
+
223
+ // src/fees/constants.ts
224
+ var FEE_BPS_MIN = 0;
225
+ var FEE_BPS_MAX = 100;
226
+
227
+ // src/fees/validation.ts
228
+ function validateFeeOptions(fees) {
229
+ if (!fees) {
230
+ return;
231
+ }
232
+ if (fees.feeBps !== void 0) {
233
+ if (!Number.isFinite(fees.feeBps) || fees.feeBps < FEE_BPS_MIN || fees.feeBps > FEE_BPS_MAX) {
234
+ throw new OlympexConfigError(`feeBps must be between ${FEE_BPS_MIN} and ${FEE_BPS_MAX}`);
235
+ }
236
+ }
237
+ if (fees.feeRecipient !== void 0 && !isAddress(fees.feeRecipient)) {
238
+ throw new OlympexConfigError("feeRecipient must be a valid Ethereum address");
239
+ }
240
+ }
241
+
242
+ // src/config/backend-url.ts
243
+ var DEFAULT_BACKEND_URL = "https://back.olympex.io/graphql";
244
+ var BACKEND_URL_ENV = "OLYMPEX_BACKEND_URL";
245
+ var GRAPHQL_PATH = "/graphql";
246
+ function readBackendUrlEnv() {
247
+ const raw = process.env[BACKEND_URL_ENV];
248
+ if (raw === void 0) {
249
+ return void 0;
250
+ }
251
+ const trimmed = raw.trim();
252
+ return trimmed.length > 0 ? trimmed : void 0;
253
+ }
254
+ function validateBackendUrl(url) {
255
+ let parsed;
256
+ try {
257
+ parsed = new URL(url);
258
+ } catch {
259
+ throw new OlympexConfigError(`Invalid ${BACKEND_URL_ENV}: ${url}`);
260
+ }
261
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
262
+ throw new OlympexConfigError(`Invalid ${BACKEND_URL_ENV}: ${url}`);
263
+ }
264
+ if (parsed.search || parsed.hash) {
265
+ throw new OlympexConfigError(`Invalid ${BACKEND_URL_ENV}: ${url}`);
266
+ }
267
+ const pathname = parsed.pathname.replace(/\/$/, "") || "/";
268
+ if (pathname !== "/" && pathname !== GRAPHQL_PATH) {
269
+ throw new OlympexConfigError(`Invalid ${BACKEND_URL_ENV}: ${url}`);
270
+ }
271
+ return parsed;
272
+ }
273
+ function normalizeBase(baseUrl) {
274
+ return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
275
+ }
276
+ function toGraphqlEndpoint(url) {
277
+ const parsed = validateBackendUrl(url);
278
+ const pathname = parsed.pathname.replace(/\/$/, "") || "/";
279
+ if (pathname === GRAPHQL_PATH) {
280
+ return `${parsed.origin}${GRAPHQL_PATH}`;
281
+ }
282
+ return `${parsed.origin}${GRAPHQL_PATH}`;
283
+ }
284
+ function resolveBackendBaseUrl() {
285
+ const configured = readBackendUrlEnv();
286
+ const candidate = configured ?? DEFAULT_BACKEND_URL;
287
+ return toGraphqlEndpoint(candidate);
288
+ }
289
+ function getGraphqlEndpoint() {
290
+ return normalizeBase(resolveBackendBaseUrl());
291
+ }
292
+ function getRestBaseUrl() {
293
+ const graphqlEndpoint = normalizeBase(resolveBackendBaseUrl());
294
+ if (graphqlEndpoint.endsWith(GRAPHQL_PATH)) {
295
+ return graphqlEndpoint.slice(0, -GRAPHQL_PATH.length);
296
+ }
297
+ return graphqlEndpoint;
298
+ }
299
+
300
+ // src/methods/account.ts
301
+ var CREATE_ACCOUNT_PATH = "/api/v1/accounts";
302
+ function extractCredentials(payload) {
303
+ if (!payload || typeof payload !== "object") {
304
+ return null;
305
+ }
306
+ const directPayload = payload;
307
+ const candidatePayloads = [directPayload];
308
+ if (directPayload.data !== void 0) {
309
+ candidatePayloads.push(directPayload.data);
310
+ }
311
+ for (const candidate of candidatePayloads) {
312
+ if (!candidate || typeof candidate !== "object") {
313
+ continue;
314
+ }
315
+ const values = candidate;
316
+ if (typeof values.apiKey === "string" && typeof values.secretKey === "string") {
317
+ return {
318
+ apiKey: values.apiKey,
319
+ secretKey: values.secretKey
320
+ };
321
+ }
322
+ }
323
+ return null;
324
+ }
325
+ function parseResponseMessage(payload) {
326
+ if (!payload || typeof payload !== "object") {
327
+ return void 0;
328
+ }
329
+ const maybeMessage = payload.message;
330
+ return typeof maybeMessage === "string" ? maybeMessage : void 0;
331
+ }
332
+ async function createAccount({
333
+ name,
334
+ password
335
+ }) {
336
+ const normalizedName = name.trim();
337
+ const normalizedPassword = password.trim();
338
+ if (!normalizedName) {
339
+ throw new OlympexConfigError("name is required");
340
+ }
341
+ if (!normalizedPassword) {
342
+ throw new OlympexConfigError("password is required");
343
+ }
344
+ const endpoint = `${getRestBaseUrl()}${CREATE_ACCOUNT_PATH}`;
345
+ const response = await fetch(endpoint, {
346
+ body: JSON.stringify({ name: normalizedName, password: normalizedPassword }),
347
+ headers: {
348
+ accept: "application/json",
349
+ "content-type": "application/json"
350
+ },
351
+ method: "POST"
352
+ });
353
+ let responseBody;
354
+ try {
355
+ responseBody = await response.json();
356
+ } catch {
357
+ throw new OlympexNetworkError("createAccount response was not valid JSON", {
358
+ contentType: response.headers.get("content-type") ?? void 0,
359
+ endpoint,
360
+ status: response.status,
361
+ statusText: response.statusText
362
+ });
363
+ }
364
+ if (!response.ok) {
365
+ throw new OlympexNetworkError(`createAccount request failed with status ${response.status}`, {
366
+ endpoint,
367
+ responseMessage: parseResponseMessage(responseBody),
368
+ status: response.status,
369
+ statusText: response.statusText
370
+ });
371
+ }
372
+ const credentials = extractCredentials(responseBody);
373
+ if (!credentials) {
374
+ throw new OlympexNetworkError("createAccount response did not include credentials", {
375
+ endpoint,
376
+ status: response.status
377
+ });
378
+ }
379
+ return credentials;
380
+ }
381
+
382
+ // src/methods/get-version.ts
383
+ var VERSION = "0.0.0";
384
+ function getVersion() {
385
+ return VERSION;
386
+ }
387
+
388
+ // src/errors/domain-error.ts
389
+ var OlympexDomainError = class extends OlympexSdkError {
390
+ constructor(message, metadata) {
391
+ super(message, "OLYMPEX_DOMAIN_ERROR", metadata);
392
+ }
393
+ };
394
+
395
+ // src/client/domain-response.ts
396
+ function requireSuccessfulDomainResponse(response, payloadName) {
397
+ if (response === null || response === void 0) {
398
+ throw new OlympexDomainError(`Missing ${payloadName} response`);
399
+ }
400
+ if (response.success === false) {
401
+ throw new OlympexDomainError(response.message ?? `${payloadName} failed`, {
402
+ code: response.code,
403
+ success: response.success
404
+ });
405
+ }
406
+ return response;
407
+ }
408
+ function requirePayload(payload, payloadName) {
409
+ if (payload === null || payload === void 0) {
410
+ throw new OlympexDomainError(`Missing ${payloadName} payload`);
411
+ }
412
+ return payload;
413
+ }
414
+
415
+ // src/fees/defaults.ts
416
+ function resolveFeeOptions(callFees, clientDefaultFees) {
417
+ if (!callFees && !clientDefaultFees) {
418
+ return void 0;
419
+ }
420
+ return {
421
+ ...clientDefaultFees,
422
+ ...callFees
423
+ };
424
+ }
425
+
426
+ // src/fees/serialize.ts
427
+ function serializeFeeOptions(fees) {
428
+ if (!fees) {
429
+ return void 0;
430
+ }
431
+ const serialized = {};
432
+ if (fees.feeBps !== void 0) {
433
+ serialized.feeBps = fees.feeBps;
434
+ }
435
+ if (fees.feeRecipient !== void 0) {
436
+ serialized.feeRecipient = fees.feeRecipient;
437
+ }
438
+ return Object.keys(serialized).length > 0 ? serialized : void 0;
439
+ }
440
+ function mergeParamsWithFees(params, fees) {
441
+ const serialized = serializeFeeOptions(fees);
442
+ if (!serialized) {
443
+ return params;
444
+ }
445
+ return {
446
+ ...params,
447
+ ...serialized
448
+ };
449
+ }
450
+
451
+ // src/graphql/operations.ts
452
+ var GET_ENABLED_CHAINS = (
453
+ /* GraphQL */
454
+ `
455
+ query GetEnabledChains {
456
+ getEnabledChains {
457
+ chainIds
458
+ }
459
+ }
460
+ `
461
+ );
462
+ var GET_QUOTE = (
463
+ /* GraphQL */
464
+ `
465
+ query GetQuote($getQuoteParams: QuoteInput!) {
466
+ getQuote(params: $getQuoteParams) {
467
+ outAmount
468
+ estimatedGas
469
+ aggregatorId
470
+ aggregatorOrder
471
+ market {
472
+ dexName
473
+ swapAmount
474
+ dexImageURL
475
+ }
476
+ routes {
477
+ percentage
478
+ subRoutes {
479
+ from
480
+ to
481
+ dexes {
482
+ name
483
+ percentage
484
+ }
485
+ }
486
+ }
487
+ dataFeeTransaction {
488
+ effectiveGasPrice
489
+ nativePrice
490
+ transactionFee
491
+ transactionFeeInUSD
492
+ tokenPrice
493
+ transactionFeeInTokenIn
494
+ valueToApprove
495
+ }
496
+ gasMultiplier
497
+ }
498
+ }
499
+ `
500
+ );
501
+ var GET_QUOTE_SWAP = (
502
+ /* GraphQL */
503
+ `
504
+ mutation GetQuoteSwap($getQuoteSwapParams: QuoteSwapInput!) {
505
+ getQuoteSwap(params: $getQuoteSwapParams) {
506
+ code
507
+ message
508
+ quoteSwap {
509
+ data
510
+ estimatedGas
511
+ minOutAmount
512
+ outAmount
513
+ value
514
+ approveTransaction
515
+ }
516
+ success
517
+ }
518
+ }
519
+ `
520
+ );
521
+ var GET_CROSS_CHAIN_QUOTE = (
522
+ /* GraphQL */
523
+ `
524
+ query GetCrossChainQuote($params: CrossChainQuoteInput!) {
525
+ getCrossChainQuote(params: $params) {
526
+ code
527
+ message
528
+ success
529
+ crossChainQuote {
530
+ aggregatorId
531
+ estimatedGas
532
+ estimatedTime
533
+ estimateCostInUSD
534
+ fromTokenAmount
535
+ toTokenAmount
536
+ minimumReceived
537
+ bridgeInfo {
538
+ icon
539
+ displayName
540
+ }
541
+ middlewareRoute {
542
+ chainFrom {
543
+ fromAsset {
544
+ address
545
+ decimals
546
+ symbol
547
+ }
548
+ toAsset {
549
+ address
550
+ decimals
551
+ symbol
552
+ }
553
+ }
554
+ chainTo {
555
+ fromAsset {
556
+ address
557
+ decimals
558
+ symbol
559
+ }
560
+ toAsset {
561
+ address
562
+ decimals
563
+ symbol
564
+ }
565
+ }
566
+ }
567
+ }
568
+ }
569
+ }
570
+ `
571
+ );
572
+ var GET_CROSS_CHAIN_SWAP = (
573
+ /* GraphQL */
574
+ `
575
+ mutation GetCrossChainSwap($params: CrossChainSwapInput!) {
576
+ getCrossChainSwap(params: $params) {
577
+ code
578
+ message
579
+ success
580
+ crossChainSwap {
581
+ calldata
582
+ value
583
+ approveTransaction
584
+ dexHash
585
+ }
586
+ }
587
+ }
588
+ `
589
+ );
590
+ var GET_CROSS_CHAIN_TX_STATUS = (
591
+ /* GraphQL */
592
+ `
593
+ query GetCrossChainTxStatus($hash: String!, $chainId: String!, $dexHash: String!) {
594
+ getCrossChainTxStatus(txHash: $hash, chainId: $chainId, dexHash: $dexHash) {
595
+ message
596
+ success
597
+ txStatus {
598
+ toChainId
599
+ fromChainId
600
+ detailStatus
601
+ status
602
+ }
603
+ }
604
+ }
605
+ `
606
+ );
607
+
608
+ // src/methods/quote.ts
609
+ function createQuoteMethod(graphqlClient, defaultFees, logger) {
610
+ return async function quote(input) {
611
+ const fees = resolveFeeOptions(input.fees, defaultFees);
612
+ validateFeeOptions(fees);
613
+ if (input.mode === "single-chain") {
614
+ logger?.log(
615
+ "info",
616
+ "Olympex quote requested",
617
+ redact({
618
+ chainId: input.params.chainId,
619
+ mode: "single-chain"
620
+ })
621
+ );
622
+ const data2 = await graphqlClient.request(
623
+ GET_QUOTE,
624
+ {
625
+ getQuoteParams: mergeParamsWithFees(input.params, fees)
626
+ }
627
+ );
628
+ return {
629
+ mode: "single-chain",
630
+ quote: requirePayload(data2.getQuote, "getQuote")
631
+ };
632
+ }
633
+ logger?.log(
634
+ "info",
635
+ "Olympex quote requested",
636
+ redact({
637
+ fromChainId: input.params.fromChainId,
638
+ mode: "cross-chain",
639
+ toChainId: input.params.toChainId
640
+ })
641
+ );
642
+ const data = await graphqlClient.request(
643
+ GET_CROSS_CHAIN_QUOTE,
644
+ {
645
+ params: mergeParamsWithFees(input.params, fees)
646
+ }
647
+ );
648
+ const response = requireSuccessfulDomainResponse(data.getCrossChainQuote, "getCrossChainQuote");
649
+ return {
650
+ mode: "cross-chain",
651
+ quote: requirePayload(response.crossChainQuote, "crossChainQuote")
652
+ };
653
+ };
654
+ }
655
+
656
+ // src/methods/support-chain.ts
657
+ function createSupportChainMethod(graphqlClient) {
658
+ return async function supportChain(chainId) {
659
+ const data = await graphqlClient.request(
660
+ GET_ENABLED_CHAINS,
661
+ {}
662
+ );
663
+ const enabledChains = requirePayload(data.getEnabledChains, "getEnabledChains");
664
+ return enabledChains.chainIds.includes(String(chainId));
665
+ };
666
+ }
667
+
668
+ // src/methods/swap.ts
669
+ function createSwapMethod(graphqlClient, defaultFees, logger) {
670
+ return async function swap(input) {
671
+ const fees = resolveFeeOptions(input.fees, defaultFees);
672
+ validateFeeOptions(fees);
673
+ if (input.mode === "single-chain") {
674
+ logger?.log(
675
+ "info",
676
+ "Olympex swap requested",
677
+ redact({
678
+ chainId: input.params.chainId,
679
+ mode: "single-chain"
680
+ })
681
+ );
682
+ const data2 = await graphqlClient.request(
683
+ GET_QUOTE_SWAP,
684
+ {
685
+ getQuoteSwapParams: mergeParamsWithFees(input.params, fees)
686
+ }
687
+ );
688
+ const response2 = requireSuccessfulDomainResponse(data2.getQuoteSwap, "getQuoteSwap");
689
+ return {
690
+ mode: "single-chain",
691
+ swap: requirePayload(response2.quoteSwap, "quoteSwap")
692
+ };
693
+ }
694
+ logger?.log(
695
+ "info",
696
+ "Olympex swap requested",
697
+ redact({
698
+ fromChainId: input.params.fromChainId,
699
+ mode: "cross-chain",
700
+ toChainId: input.params.toChainId
701
+ })
702
+ );
703
+ const data = await graphqlClient.request(
704
+ GET_CROSS_CHAIN_SWAP,
705
+ {
706
+ params: mergeParamsWithFees(input.params, fees)
707
+ }
708
+ );
709
+ const response = requireSuccessfulDomainResponse(data.getCrossChainSwap, "getCrossChainSwap");
710
+ return {
711
+ mode: "cross-chain",
712
+ swap: requirePayload(response.crossChainSwap, "crossChainSwap")
713
+ };
714
+ };
715
+ }
716
+
717
+ // src/methods/tx-status.ts
718
+ function createTxStatusMethod(graphqlClient) {
719
+ return async function txStatus(input) {
720
+ const data = await graphqlClient.request(
721
+ GET_CROSS_CHAIN_TX_STATUS,
722
+ input
723
+ );
724
+ const response = requireSuccessfulDomainResponse(
725
+ data.getCrossChainTxStatus,
726
+ "getCrossChainTxStatus"
727
+ );
728
+ return requirePayload(response.txStatus, "txStatus");
729
+ };
730
+ }
731
+
732
+ // src/config/initialize.ts
733
+ var DEFAULT_TIMEOUT_MS = 3e4;
734
+ function initialize(options) {
735
+ const apiKey = options.apiKey.trim();
736
+ const apiSecret = options.apiSecret.trim();
737
+ const passphrase = options.passphrase.trim();
738
+ if (!apiKey) {
739
+ throw new OlympexConfigError("apiKey is required");
740
+ }
741
+ if (!apiSecret) {
742
+ throw new OlympexConfigError("apiSecret is required");
743
+ }
744
+ if (!passphrase) {
745
+ throw new OlympexConfigError("passphrase is required");
746
+ }
747
+ validateFeeOptions(options.defaultFees);
748
+ const graphqlClient = new OlympexGraphQLClient({
749
+ apiKey,
750
+ apiSecret,
751
+ endpoint: getGraphqlEndpoint(),
752
+ headers: options.headers,
753
+ logger: options.logger,
754
+ passphrase,
755
+ timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS
756
+ });
757
+ return {
758
+ apiKey,
759
+ createAccount,
760
+ getVersion,
761
+ quote: createQuoteMethod(graphqlClient, options.defaultFees, options.logger),
762
+ supportChain: createSupportChainMethod(graphqlClient),
763
+ swap: createSwapMethod(graphqlClient, options.defaultFees, options.logger),
764
+ txStatus: createTxStatusMethod(graphqlClient)
765
+ };
766
+ }
767
+
768
+ // src/logging/console-logger.ts
769
+ var LEVEL_RANK = {
770
+ debug: 10,
771
+ info: 20,
772
+ warn: 30,
773
+ error: 40
774
+ };
775
+ function createConsoleLogger(options = {}) {
776
+ const minRank = LEVEL_RANK[options.minLevel ?? "info"];
777
+ const target = (level) => {
778
+ const method = globalThis.console[level];
779
+ return typeof method === "function" ? method.bind(globalThis.console) : globalThis.console.log.bind(globalThis.console);
780
+ };
781
+ return Object.freeze({
782
+ log(level, message, metadata) {
783
+ if (LEVEL_RANK[level] < minRank) {
784
+ return;
785
+ }
786
+ try {
787
+ const write = target(level);
788
+ if (metadata === void 0) {
789
+ write(message);
790
+ } else {
791
+ write(message, metadata);
792
+ }
793
+ } catch {
794
+ }
795
+ }
796
+ });
797
+ }
798
+
799
+ // src/errors/not-implemented-error.ts
800
+ var OlympexNotImplementedError = class extends OlympexSdkError {
801
+ constructor(message, metadata) {
802
+ super(message, "OLYMPEX_NOT_IMPLEMENTED", metadata);
803
+ }
804
+ };
805
+ export {
806
+ OlympexConfigError,
807
+ OlympexDomainError,
808
+ OlympexGraphQLError,
809
+ OlympexNetworkError,
810
+ OlympexNotImplementedError,
811
+ OlympexSdkError,
812
+ createAccount,
813
+ createConsoleLogger,
814
+ getVersion,
815
+ initialize
816
+ };
817
+ //# sourceMappingURL=index.mjs.map