@wormhole-foundation/sdk-connect 3.11.0 → 4.0.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.
Files changed (73) hide show
  1. package/dist/cjs/index.d.ts +1 -0
  2. package/dist/cjs/index.d.ts.map +1 -1
  3. package/dist/cjs/index.js +1 -0
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/indexers/AlchemyClient.d.ts +13 -0
  6. package/dist/cjs/indexers/AlchemyClient.d.ts.map +1 -0
  7. package/dist/cjs/indexers/AlchemyClient.js +105 -0
  8. package/dist/cjs/indexers/AlchemyClient.js.map +1 -0
  9. package/dist/cjs/indexers/GoldRushClient.d.ts +10 -0
  10. package/dist/cjs/indexers/GoldRushClient.d.ts.map +1 -0
  11. package/dist/cjs/indexers/GoldRushClient.js +88 -0
  12. package/dist/cjs/indexers/GoldRushClient.js.map +1 -0
  13. package/dist/cjs/indexers/__tests__/balances.test.d.ts +2 -0
  14. package/dist/cjs/indexers/__tests__/balances.test.d.ts.map +1 -0
  15. package/dist/cjs/indexers/__tests__/balances.test.js +323 -0
  16. package/dist/cjs/indexers/__tests__/balances.test.js.map +1 -0
  17. package/dist/cjs/indexers/__tests__/utils.test.d.ts +2 -0
  18. package/dist/cjs/indexers/__tests__/utils.test.d.ts.map +1 -0
  19. package/dist/cjs/indexers/__tests__/utils.test.js +71 -0
  20. package/dist/cjs/indexers/__tests__/utils.test.js.map +1 -0
  21. package/dist/cjs/indexers/balances.d.ts +5 -0
  22. package/dist/cjs/indexers/balances.d.ts.map +1 -0
  23. package/dist/cjs/indexers/balances.js +66 -0
  24. package/dist/cjs/indexers/balances.js.map +1 -0
  25. package/dist/cjs/indexers/index.d.ts +3 -0
  26. package/dist/cjs/indexers/index.d.ts.map +1 -0
  27. package/dist/cjs/indexers/index.js +21 -0
  28. package/dist/cjs/indexers/index.js.map +1 -0
  29. package/dist/cjs/indexers/types.d.ts +22 -0
  30. package/dist/cjs/indexers/types.d.ts.map +1 -0
  31. package/dist/cjs/indexers/types.js +3 -0
  32. package/dist/cjs/indexers/types.js.map +1 -0
  33. package/dist/cjs/indexers/utils.d.ts +2 -0
  34. package/dist/cjs/indexers/utils.d.ts.map +1 -0
  35. package/dist/cjs/indexers/utils.js +17 -0
  36. package/dist/cjs/indexers/utils.js.map +1 -0
  37. package/dist/esm/index.d.ts +1 -0
  38. package/dist/esm/index.d.ts.map +1 -1
  39. package/dist/esm/index.js +1 -0
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/indexers/AlchemyClient.d.ts +13 -0
  42. package/dist/esm/indexers/AlchemyClient.d.ts.map +1 -0
  43. package/dist/esm/indexers/AlchemyClient.js +103 -0
  44. package/dist/esm/indexers/AlchemyClient.js.map +1 -0
  45. package/dist/esm/indexers/GoldRushClient.d.ts +10 -0
  46. package/dist/esm/indexers/GoldRushClient.d.ts.map +1 -0
  47. package/dist/esm/indexers/GoldRushClient.js +86 -0
  48. package/dist/esm/indexers/GoldRushClient.js.map +1 -0
  49. package/dist/esm/indexers/__tests__/balances.test.d.ts +2 -0
  50. package/dist/esm/indexers/__tests__/balances.test.d.ts.map +1 -0
  51. package/dist/esm/indexers/__tests__/balances.test.js +318 -0
  52. package/dist/esm/indexers/__tests__/balances.test.js.map +1 -0
  53. package/dist/esm/indexers/__tests__/utils.test.d.ts +2 -0
  54. package/dist/esm/indexers/__tests__/utils.test.d.ts.map +1 -0
  55. package/dist/esm/indexers/__tests__/utils.test.js +69 -0
  56. package/dist/esm/indexers/__tests__/utils.test.js.map +1 -0
  57. package/dist/esm/indexers/balances.d.ts +5 -0
  58. package/dist/esm/indexers/balances.d.ts.map +1 -0
  59. package/dist/esm/indexers/balances.js +59 -0
  60. package/dist/esm/indexers/balances.js.map +1 -0
  61. package/dist/esm/indexers/index.d.ts +3 -0
  62. package/dist/esm/indexers/index.d.ts.map +1 -0
  63. package/dist/esm/indexers/index.js +3 -0
  64. package/dist/esm/indexers/index.js.map +1 -0
  65. package/dist/esm/indexers/types.d.ts +22 -0
  66. package/dist/esm/indexers/types.d.ts.map +1 -0
  67. package/dist/esm/indexers/types.js +2 -0
  68. package/dist/esm/indexers/types.js.map +1 -0
  69. package/dist/esm/indexers/utils.d.ts +2 -0
  70. package/dist/esm/indexers/utils.d.ts.map +1 -0
  71. package/dist/esm/indexers/utils.js +13 -0
  72. package/dist/esm/indexers/utils.js.map +1 -0
  73. package/package.json +9 -6
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_js_1 = require("../utils.js");
4
+ describe("utils", () => {
5
+ describe("parseBalance()", () => {
6
+ describe("valid inputs", () => {
7
+ it("should parse decimal string", () => {
8
+ const result = (0, utils_js_1.parseBalance)("100");
9
+ expect(result).not.toBeNull();
10
+ expect(result.toString()).toBe("100");
11
+ });
12
+ it("should parse hex string with 0x prefix", () => {
13
+ const result = (0, utils_js_1.parseBalance)("0x64");
14
+ expect(result).not.toBeNull();
15
+ expect(result.toString()).toBe("100");
16
+ });
17
+ it("should parse full-length hex balance from Alchemy", () => {
18
+ const result = (0, utils_js_1.parseBalance)("0x0000000000000000000000000000000000000000000000000de0b6b3a7640000");
19
+ expect(result).not.toBeNull();
20
+ expect(result.toString()).toBe("1000000000000000000");
21
+ });
22
+ it("should parse string with leading/trailing whitespace", () => {
23
+ const result = (0, utils_js_1.parseBalance)(" 123 ");
24
+ expect(result).not.toBeNull();
25
+ expect(result.toString()).toBe("123");
26
+ });
27
+ it("should parse zero as decimal", () => {
28
+ const result = (0, utils_js_1.parseBalance)("0");
29
+ expect(result).not.toBeNull();
30
+ expect(result.toString()).toBe("0");
31
+ });
32
+ it("should parse large balance value", () => {
33
+ const result = (0, utils_js_1.parseBalance)("1000000000000000000");
34
+ expect(result).not.toBeNull();
35
+ expect(result.toString()).toBe("1000000000000000000");
36
+ });
37
+ it("should parse hex zero", () => {
38
+ const result = (0, utils_js_1.parseBalance)("0x0");
39
+ expect(result).not.toBeNull();
40
+ expect(result.toString()).toBe("0");
41
+ });
42
+ });
43
+ describe("edge cases", () => {
44
+ it("should return null for empty string", () => {
45
+ expect((0, utils_js_1.parseBalance)("")).toBe(null);
46
+ });
47
+ it("should return 0n for 0x alone", () => {
48
+ const result = (0, utils_js_1.parseBalance)("0x");
49
+ expect(result).not.toBeNull();
50
+ expect(result.toString()).toBe("0");
51
+ });
52
+ it("should return 0n for string with only whitespace", () => {
53
+ const result = (0, utils_js_1.parseBalance)(" ");
54
+ expect(result).not.toBeNull();
55
+ expect(result.toString()).toBe("0");
56
+ });
57
+ });
58
+ describe("invalid inputs that return null", () => {
59
+ it("should return null for undefined", () => {
60
+ expect((0, utils_js_1.parseBalance)(undefined)).toBe(null);
61
+ });
62
+ it("should return null for invalid hex string", () => {
63
+ expect((0, utils_js_1.parseBalance)("invalid_hex")).toBe(null);
64
+ });
65
+ it("should return null for non-numeric string", () => {
66
+ expect((0, utils_js_1.parseBalance)("not a number")).toBe(null);
67
+ });
68
+ });
69
+ });
70
+ });
71
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/indexers/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Chain, Network } from "@wormhole-foundation/sdk-base";
2
+ import type { Balances } from "@wormhole-foundation/sdk-definitions";
3
+ import type { IndexerConfig } from "./types.js";
4
+ export declare function getWalletBalances(walletAddr: string, network: Network, chain: Chain, indexers?: IndexerConfig): Promise<Balances>;
5
+ //# sourceMappingURL=balances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../../src/indexers/balances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,YAAY,CAAC;AA4CrE,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,QAAQ,CAAC,CAgCnB"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getWalletBalances = void 0;
7
+ const AlchemyClient_js_1 = __importDefault(require("./AlchemyClient.js"));
8
+ const GoldRushClient_js_1 = __importDefault(require("./GoldRushClient.js"));
9
+ const DEFAULT_TIMEOUT_MS = 5000;
10
+ async function tryClient({ client, network, chain, walletAddr, name, timeoutMs = DEFAULT_TIMEOUT_MS, }) {
11
+ if (!client) {
12
+ return null;
13
+ }
14
+ try {
15
+ if (!client.supportsChain(network, chain)) {
16
+ console.info(`Network=${network} Chain=${chain} not supported by ${name} indexer API`);
17
+ return null;
18
+ }
19
+ const controller = new AbortController();
20
+ const timeout = setTimeout(() => {
21
+ controller.abort(new Error(`${name} request timed out after ${timeoutMs}ms`));
22
+ }, timeoutMs);
23
+ let balances;
24
+ try {
25
+ balances = await client.getBalances(network, chain, walletAddr, controller.signal);
26
+ }
27
+ finally {
28
+ clearTimeout(timeout);
29
+ }
30
+ return balances;
31
+ }
32
+ catch (e) {
33
+ console.info(`Error querying ${name} indexer API: ${e}`);
34
+ return null;
35
+ }
36
+ }
37
+ async function getWalletBalances(walletAddr, network, chain, indexers) {
38
+ if (!indexers) {
39
+ throw new Error("Can't get balances without an indexer.");
40
+ }
41
+ const { goldRush, alchemy } = indexers;
42
+ const commonConfig = { network, chain, walletAddr };
43
+ const clientConfigs = [
44
+ {
45
+ ...commonConfig,
46
+ client: goldRush?.apiKey ? new GoldRushClient_js_1.default(goldRush.apiKey) : undefined,
47
+ name: "Gold Rush",
48
+ timeoutMs: goldRush?.timeoutMs,
49
+ },
50
+ {
51
+ ...commonConfig,
52
+ client: alchemy?.apiKey ? new AlchemyClient_js_1.default(alchemy.apiKey) : undefined,
53
+ name: "Alchemy",
54
+ timeoutMs: alchemy?.timeoutMs,
55
+ },
56
+ ];
57
+ for (const config of clientConfigs) {
58
+ const result = await tryClient(config);
59
+ if (result) {
60
+ return result;
61
+ }
62
+ }
63
+ throw new Error("Failed to get a successful response from indexers");
64
+ }
65
+ exports.getWalletBalances = getWalletBalances;
66
+ //# sourceMappingURL=balances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.js","sourceRoot":"","sources":["../../../src/indexers/balances.ts"],"names":[],"mappings":";;;;;;AAEA,0EAA+C;AAC/C,4EAAiD;AAGjD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,KAAK,UAAU,SAAS,CAAC,EACvB,MAAM,EACN,OAAO,EACP,KAAK,EACL,UAAU,EACV,IAAI,EACJ,SAAS,GAAG,kBAAkB,GACV;IACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,UAAU,KAAK,qBAAqB,IAAI,cAAc,CAAC,CAAC;YAEvF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,SAAS,IAAI,CAAC,CAAC,CAAC;QAChF,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,QAAkB,CAAC;QAEvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACrF,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,OAAgB,EAChB,KAAY,EACZ,QAAwB;IAExB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IACvC,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEpD,MAAM,aAAa,GAA+B;QAChD;YACE,GAAG,YAAY;YACf,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,2BAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1E,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,QAAQ,EAAE,SAAS;SAC/B;QACD;YACE,GAAG,YAAY;YACf,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,0BAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YACvE,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B;KACF,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACvE,CAAC;AArCD,8CAqCC"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export { getWalletBalances } from "./balances.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/indexers/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.getWalletBalances = void 0;
18
+ __exportStar(require("./types.js"), exports);
19
+ var balances_js_1 = require("./balances.js");
20
+ Object.defineProperty(exports, "getWalletBalances", { enumerable: true, get: function () { return balances_js_1.getWalletBalances; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/indexers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAAkD;AAAzC,gHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,22 @@
1
+ import type { Chain, Network } from "@wormhole-foundation/sdk-base";
2
+ import type AlchemyClient from "./AlchemyClient.js";
3
+ import type GoldRushClient from "./GoldRushClient.js";
4
+ export interface IndexerConfig {
5
+ goldRush?: {
6
+ apiKey: string;
7
+ timeoutMs: number;
8
+ };
9
+ alchemy?: {
10
+ apiKey: string;
11
+ timeoutMs: number;
12
+ };
13
+ }
14
+ export interface IndexerClientConfig {
15
+ chain: Chain;
16
+ client?: GoldRushClient | AlchemyClient;
17
+ name: string;
18
+ network: Network;
19
+ timeoutMs?: number;
20
+ walletAddr: string;
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/indexers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/indexers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function parseBalance(balance: string | undefined): bigint | null;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/indexers/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CASvE"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBalance = void 0;
4
+ const sdk_base_1 = require("@wormhole-foundation/sdk-base");
5
+ function parseBalance(balance) {
6
+ try {
7
+ if (!balance) {
8
+ return null;
9
+ }
10
+ return sdk_base_1.encoding.bignum.decode(balance.trim());
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ exports.parseBalance = parseBalance;
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/indexers/utils.ts"],"names":[],"mappings":";;;AAAA,4DAAyD;AAEzD,SAAgB,YAAY,CAAC,OAA2B;IACtD,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,mBAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AATD,oCASC"}
@@ -8,6 +8,7 @@ export * as tasks from "./tasks.js";
8
8
  export * as circleApi from "./circle-api.js";
9
9
  export * as api from "./whscan-api.js";
10
10
  export * as routes from "./routes/index.js";
11
+ export * from "./indexers/index.js";
11
12
  export * from "@wormhole-foundation/sdk-base";
12
13
  export * from "@wormhole-foundation/sdk-definitions";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAG5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,cAAc,qBAAqB,CAAC;AAGpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
package/dist/esm/index.js CHANGED
@@ -8,6 +8,7 @@ export * as tasks from "./tasks.js";
8
8
  export * as circleApi from "./circle-api.js";
9
9
  export * as api from "./whscan-api.js";
10
10
  export * as routes from "./routes/index.js";
11
+ export * from "./indexers/index.js";
11
12
  // Re-export from core packages
12
13
  export * from "@wormhole-foundation/sdk-base";
13
14
  export * from "@wormhole-foundation/sdk-definitions";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,+BAA+B;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AAErC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,cAAc,qBAAqB,CAAC;AAEpC,+BAA+B;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Chain, Network } from "@wormhole-foundation/sdk-base";
2
+ import type { Balances } from "@wormhole-foundation/sdk-definitions";
3
+ declare class AlchemyClient {
4
+ private key;
5
+ constructor(key: string);
6
+ supportsChain(network: Network, chain: Chain): boolean;
7
+ private batchFetchFromAlchemy;
8
+ private parseEthTokenResponse;
9
+ private parseEthNativeResponse;
10
+ getBalances(network: Network, chain: Chain, walletAddr: string, signal?: AbortSignal): Promise<Balances>;
11
+ }
12
+ export default AlchemyClient;
13
+ //# sourceMappingURL=AlchemyClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlchemyClient.d.ts","sourceRoot":"","sources":["../../../src/indexers/AlchemyClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAmCrE,cAAM,aAAa;IACjB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM;IAIvB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;YAK9B,qBAAqB;IA6BnC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,sBAAsB;IAOxB,WAAW,CACf,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC;CAoCrB;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { parseBalance } from "./utils.js";
2
+ const ALCHEMY_CHAINS = {
3
+ Mainnet: {
4
+ Ethereum: "eth-mainnet",
5
+ Base: "base-mainnet",
6
+ Arbitrum: "arb-mainnet",
7
+ Optimism: "opt-mainnet",
8
+ Polygon: "polygon-mainnet",
9
+ Worldchain: "worldchain-mainnet",
10
+ Ink: "ink-mainnet",
11
+ Unichain: "unichain-mainnet",
12
+ Berachain: "berachain-mainnet",
13
+ Celo: "celo-mainnet",
14
+ Linea: "linea-mainnet",
15
+ },
16
+ Testnet: {
17
+ Ethereum: "eth-sepolia",
18
+ Base: "base-sepolia",
19
+ Arbitrum: "arb-sepolia",
20
+ Optimism: "opt-sepolia",
21
+ Polygon: "polygon-amoy",
22
+ Worldchain: "worldchain-sepolia",
23
+ Ink: "ink-sepolia",
24
+ Unichain: "unichain-sepolia",
25
+ Berachain: "berachain-bartio",
26
+ Monad: "monad-testnet",
27
+ },
28
+ Devnet: {},
29
+ };
30
+ const RPC_ID_TOKEN_BALANCES = 1;
31
+ const RPC_ID_NATIVE_BALANCE = 2;
32
+ class AlchemyClient {
33
+ key;
34
+ constructor(key) {
35
+ this.key = key;
36
+ }
37
+ supportsChain(network, chain) {
38
+ const endpoint = ALCHEMY_CHAINS[network][chain];
39
+ return endpoint !== undefined;
40
+ }
41
+ async batchFetchFromAlchemy(endpoint, requests, signal) {
42
+ const baseUrl = `https://${endpoint}.g.alchemy.com/v2/${this.key}`;
43
+ const response = await fetch(baseUrl, {
44
+ method: "POST",
45
+ headers: { "Content-Type": "application/json" },
46
+ body: JSON.stringify(requests.map((req) => ({
47
+ jsonrpc: "2.0",
48
+ id: req.id,
49
+ method: req.method,
50
+ params: req.params,
51
+ }))),
52
+ signal,
53
+ });
54
+ if (!response.ok) {
55
+ throw new Error(`Alchemy API request failed with status ${response.status}`);
56
+ }
57
+ const data = await response.json();
58
+ return data;
59
+ }
60
+ parseEthTokenResponse(tokenBalances, bals) {
61
+ for (let item of tokenBalances) {
62
+ const bal = parseBalance(item.tokenBalance || item.balance);
63
+ if (bal !== null) {
64
+ bals[item.contractAddress] = bal;
65
+ }
66
+ }
67
+ }
68
+ parseEthNativeResponse(nativeBalance, bals) {
69
+ const nativeBal = parseBalance(nativeBalance);
70
+ if (nativeBal !== null) {
71
+ bals.native = nativeBal;
72
+ }
73
+ }
74
+ async getBalances(network, chain, walletAddr, signal) {
75
+ const endpoint = ALCHEMY_CHAINS[network][chain];
76
+ if (!endpoint) {
77
+ throw new Error("Chain not supported by Alchemy indexer");
78
+ }
79
+ const responses = await this.batchFetchFromAlchemy(endpoint, [
80
+ {
81
+ method: "alchemy_getTokenBalances",
82
+ params: [walletAddr, "erc20"],
83
+ id: RPC_ID_TOKEN_BALANCES,
84
+ },
85
+ { method: "eth_getBalance", params: [walletAddr, "latest"], id: RPC_ID_NATIVE_BALANCE },
86
+ ], signal);
87
+ const bals = {};
88
+ for (const response of responses) {
89
+ if (!response) {
90
+ continue;
91
+ }
92
+ if (response.id === RPC_ID_TOKEN_BALANCES && response.result?.tokenBalances) {
93
+ this.parseEthTokenResponse(response.result.tokenBalances, bals);
94
+ }
95
+ else if (response.id === RPC_ID_NATIVE_BALANCE && response.result) {
96
+ this.parseEthNativeResponse(response.result, bals);
97
+ }
98
+ }
99
+ return bals;
100
+ }
101
+ }
102
+ export default AlchemyClient;
103
+ //# sourceMappingURL=AlchemyClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlchemyClient.js","sourceRoot":"","sources":["../../../src/indexers/AlchemyClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Chain, Network } from "@wormhole-foundation/sdk-base";
2
+ import type { Balances } from "@wormhole-foundation/sdk-definitions";
3
+ declare class GoldRushClient {
4
+ private key;
5
+ constructor(key: string);
6
+ supportsChain(network: Network, chain: Chain): boolean;
7
+ getBalances(network: Network, chain: Chain, walletAddr: string, signal?: AbortSignal): Promise<Balances>;
8
+ }
9
+ export default GoldRushClient;
10
+ //# sourceMappingURL=GoldRushClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoldRushClient.d.ts","sourceRoot":"","sources":["../../../src/indexers/GoldRushClient.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AA8CrE,cAAM,cAAc;IAClB,OAAO,CAAC,GAAG,CAAS;gBAER,GAAG,EAAE,MAAM;IAIvB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;IAKtC,WAAW,CACf,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC;CAyCrB;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,86 @@
1
+ // Covalent GoldRush indexer
2
+ // https://goldrush.dev/docs/api-reference/overview
3
+ //
4
+ // We don't use the official @covalenthq/client-sdk client for this because it's over 1MB and all we need
5
+ // is a small subset of one endpoint. This is how you know this code isn't AI slop.
6
+ import { parseBalance } from "./utils.js";
7
+ const GOLD_RUSH_CHAINS = {
8
+ Mainnet: {
9
+ Ethereum: "eth-mainnet",
10
+ Polygon: "matic-mainnet",
11
+ Bsc: "bsc-mainnet",
12
+ Optimism: "optimism-mainnet",
13
+ Base: "base-mainnet",
14
+ Worldchain: "world-mainnet",
15
+ Sei: "sei-mainnet",
16
+ Ink: "ink-mainnet",
17
+ Solana: "solana-mainnet",
18
+ Arbitrum: "arbitrum-mainnet",
19
+ Berachain: "berachain-mainnet",
20
+ Linea: "linea-mainnet",
21
+ Scroll: "scroll-mainnet",
22
+ Seievm: "sei-mainnet",
23
+ Unichain: "unichain-mainnet",
24
+ HyperEVM: "hyperevm-mainnet",
25
+ Moonbeam: "moonbeam-mainnet",
26
+ Mantle: "mantle-mainnet",
27
+ Celo: "celo-mainnet",
28
+ Fantom: "fantom-mainnet",
29
+ },
30
+ Testnet: {
31
+ Ethereum: "eth-sepolia",
32
+ Polygon: "polygon-amoy-testnet",
33
+ Bsc: "bsc-testnet",
34
+ Optimism: "optimism-sepolia",
35
+ Base: "base-sepolia-testnet",
36
+ Worldchain: "world-sepolia-testnet",
37
+ Unichain: "unichain-sepolia-testnet",
38
+ Berachain: "berachain-testnet",
39
+ Ink: "ink-sepolia-testnet",
40
+ Arbitrum: "arbitrum-sepolia",
41
+ Linea: "linea-sepolia-testnet",
42
+ Scroll: "scroll-sepolia-testnet",
43
+ Monad: "monad-testnet",
44
+ Mantle: "mantle-sepolia-testnet",
45
+ Fantom: "fantom-testnet",
46
+ },
47
+ Devnet: {},
48
+ };
49
+ class GoldRushClient {
50
+ key;
51
+ constructor(key) {
52
+ this.key = key;
53
+ }
54
+ supportsChain(network, chain) {
55
+ const endpoint = GOLD_RUSH_CHAINS[network][chain];
56
+ return endpoint !== undefined;
57
+ }
58
+ async getBalances(network, chain, walletAddr, signal) {
59
+ const endpoint = GOLD_RUSH_CHAINS[network][chain];
60
+ if (!endpoint) {
61
+ throw new Error("Chain not supported by GoldRush indexer");
62
+ }
63
+ const response = await fetch(`https://api.covalenthq.com/v1/${endpoint}/address/${walletAddr}/balances_v2/?key=${this.key}`, { signal });
64
+ if (!response.ok) {
65
+ throw new Error(`GoldRush API request failed with status ${response.status}`);
66
+ }
67
+ const { data } = await response.json();
68
+ const bals = {};
69
+ for (let item of data.items) {
70
+ const ca = item.contract_address.toLowerCase();
71
+ // GoldRush uses special addresses to represent native tokens:
72
+ // EVM chains: 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
73
+ // Solana: 11111111111111111111111111111111
74
+ const isNativeToken = ca === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" ||
75
+ ca === "11111111111111111111111111111111";
76
+ const addr = isNativeToken ? "native" : ca;
77
+ const bal = parseBalance(item.balance);
78
+ if (bal !== null) {
79
+ bals[addr] = bal;
80
+ }
81
+ }
82
+ return bals;
83
+ }
84
+ }
85
+ export default GoldRushClient;
86
+ //# sourceMappingURL=GoldRushClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoldRushClient.js","sourceRoot":"","sources":["../../../src/indexers/GoldRushClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=balances.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.test.d.ts","sourceRoot":"","sources":["../../../../src/indexers/__tests__/balances.test.ts"],"names":[],"mappings":""}