zerc20-client-sdk 0.2.0 → 0.2.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/README.md CHANGED
@@ -170,6 +170,42 @@ const quote = await buildCrossUnwrapQuote({
170
170
  });
171
171
  ```
172
172
 
173
+ ### Adaptor Withdraw (Stuck Fund Recovery)
174
+
175
+ When a cross-chain unwrap fails (e.g. due to Stargate liquidity shortage), user funds may remain in the destination chain's Adaptor contract. The SDK provides functions to detect and recover these stuck funds:
176
+
177
+ ```typescript
178
+ import {
179
+ fetchAdaptorBalances,
180
+ hasStuckFunds,
181
+ withdrawFromAdaptor,
182
+ NATIVE_TOKEN_ADDRESS,
183
+ } from "zerc20-client-sdk";
184
+
185
+ // Check if a user has stuck funds in an adaptor
186
+ const stuck = await hasStuckFunds({
187
+ provider: readProvider,
188
+ account: "0xUser...",
189
+ adaptorAddress: "0xAdaptor...",
190
+ });
191
+
192
+ // Fetch detailed balances
193
+ const balances = await fetchAdaptorBalances({
194
+ provider: readProvider,
195
+ account: "0xUser...",
196
+ adaptorAddress: "0xAdaptor...",
197
+ });
198
+ // balances.underlyingTokenBalance, balances.zerc20Balance, balances.nativeBalance
199
+
200
+ // Withdraw stuck funds
201
+ const result = await withdrawFromAdaptor({
202
+ writeProvider,
203
+ adaptorAddress: "0xAdaptor...",
204
+ token: balances.underlyingTokenAddress, // or zerc20TokenAddress, or NATIVE_TOKEN_ADDRESS
205
+ amount: balances.underlyingTokenBalance,
206
+ });
207
+ ```
208
+
173
209
  ### LayerZero Scan
174
210
 
175
211
  Track and decode LayerZero cross-chain messages. Configuration and providers are injected as parameters, making this module framework-agnostic:
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adaptorWithdraw.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptorWithdraw.test.d.ts","sourceRoot":"","sources":["../../../../src/operations/liquidityManager/__tests__/adaptorWithdraw.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ import { beforeEach, describe, expect, test, vi } from "vitest";
2
+ import { fetchAdaptorBalances, hasStuckFunds, withdrawFromAdaptor } from "../adaptorWithdraw.js";
3
+ describe("fetchAdaptorBalances", () => {
4
+ const mockProvider = {
5
+ readContract: vi.fn(),
6
+ };
7
+ beforeEach(() => {
8
+ vi.clearAllMocks();
9
+ });
10
+ test("fetches all adaptor balances for a user", async () => {
11
+ const underlyingToken = "0x1234567890123456789012345678901234567890";
12
+ const zerc20Token = "0xabcdef1234567890abcdef1234567890abcdef12";
13
+ mockProvider.readContract
14
+ .mockResolvedValueOnce(100n) // underlyingTokenBalances
15
+ .mockResolvedValueOnce(200n) // zerc20Balances
16
+ .mockResolvedValueOnce(300n) // nativeBalances
17
+ .mockResolvedValueOnce(underlyingToken) // UNDERLYING_TOKEN
18
+ .mockResolvedValueOnce(zerc20Token); // ZERC20_TOKEN
19
+ const result = await fetchAdaptorBalances({
20
+ provider: mockProvider,
21
+ account: "0xUser1234567890123456789012345678901234",
22
+ adaptorAddress: "0xAdaptor123456789012345678901234567890ab",
23
+ });
24
+ expect(result.underlyingTokenBalance).toBe(100n);
25
+ expect(result.zerc20Balance).toBe(200n);
26
+ expect(result.nativeBalance).toBe(300n);
27
+ expect(result.underlyingTokenAddress).toBe(underlyingToken.toLowerCase());
28
+ expect(result.zerc20TokenAddress).toBe(zerc20Token.toLowerCase());
29
+ });
30
+ test("returns zero balances when no funds are stuck", async () => {
31
+ mockProvider.readContract
32
+ .mockResolvedValueOnce(0n)
33
+ .mockResolvedValueOnce(0n)
34
+ .mockResolvedValueOnce(0n)
35
+ .mockResolvedValueOnce("0x1234567890123456789012345678901234567890")
36
+ .mockResolvedValueOnce("0xabcdef1234567890abcdef1234567890abcdef12");
37
+ const result = await fetchAdaptorBalances({
38
+ provider: mockProvider,
39
+ account: "0xUser",
40
+ adaptorAddress: "0xAdaptor",
41
+ });
42
+ expect(result.underlyingTokenBalance).toBe(0n);
43
+ expect(result.zerc20Balance).toBe(0n);
44
+ expect(result.nativeBalance).toBe(0n);
45
+ });
46
+ test("calls readContract with correct function names", async () => {
47
+ mockProvider.readContract
48
+ .mockResolvedValueOnce(0n)
49
+ .mockResolvedValueOnce(0n)
50
+ .mockResolvedValueOnce(0n)
51
+ .mockResolvedValueOnce("0x1234567890123456789012345678901234567890")
52
+ .mockResolvedValueOnce("0xabcdef1234567890abcdef1234567890abcdef12");
53
+ await fetchAdaptorBalances({
54
+ provider: mockProvider,
55
+ account: "0xUser1234567890123456789012345678901234",
56
+ adaptorAddress: "0xAdaptor123456789012345678901234567890ab",
57
+ });
58
+ const calls = mockProvider.readContract.mock.calls;
59
+ const functionNames = calls.map((c) => c[0].functionName);
60
+ expect(functionNames).toContain("underlyingTokenBalances");
61
+ expect(functionNames).toContain("zerc20Balances");
62
+ expect(functionNames).toContain("nativeBalances");
63
+ expect(functionNames).toContain("UNDERLYING_TOKEN");
64
+ expect(functionNames).toContain("ZERC20_TOKEN");
65
+ });
66
+ });
67
+ describe("hasStuckFunds", () => {
68
+ const mockProvider = {
69
+ readContract: vi.fn(),
70
+ };
71
+ beforeEach(() => {
72
+ vi.clearAllMocks();
73
+ });
74
+ const setupMock = (underlying, zerc20, native) => {
75
+ mockProvider.readContract
76
+ .mockResolvedValueOnce(underlying)
77
+ .mockResolvedValueOnce(zerc20)
78
+ .mockResolvedValueOnce(native)
79
+ .mockResolvedValueOnce("0x1234567890123456789012345678901234567890")
80
+ .mockResolvedValueOnce("0xabcdef1234567890abcdef1234567890abcdef12");
81
+ };
82
+ test("returns true when underlying balance is stuck", async () => {
83
+ setupMock(100n, 0n, 0n);
84
+ expect(await hasStuckFunds({
85
+ provider: mockProvider,
86
+ account: "0xUser",
87
+ adaptorAddress: "0xAdaptor",
88
+ })).toBe(true);
89
+ });
90
+ test("returns true when zerc20 balance is stuck", async () => {
91
+ setupMock(0n, 50n, 0n);
92
+ expect(await hasStuckFunds({
93
+ provider: mockProvider,
94
+ account: "0xUser",
95
+ adaptorAddress: "0xAdaptor",
96
+ })).toBe(true);
97
+ });
98
+ test("returns true when native balance is stuck", async () => {
99
+ setupMock(0n, 0n, 10n);
100
+ expect(await hasStuckFunds({
101
+ provider: mockProvider,
102
+ account: "0xUser",
103
+ adaptorAddress: "0xAdaptor",
104
+ })).toBe(true);
105
+ });
106
+ test("returns false when no funds are stuck", async () => {
107
+ setupMock(0n, 0n, 0n);
108
+ expect(await hasStuckFunds({
109
+ provider: mockProvider,
110
+ account: "0xUser",
111
+ adaptorAddress: "0xAdaptor",
112
+ })).toBe(false);
113
+ });
114
+ });
115
+ describe("withdrawFromAdaptor", () => {
116
+ const mockWriteProvider = {
117
+ account: { address: "0xUser1234567890123456789012345678901234" },
118
+ chain: { id: 1 },
119
+ writeContract: vi.fn(),
120
+ waitForTransactionReceipt: vi.fn(),
121
+ };
122
+ beforeEach(() => {
123
+ vi.clearAllMocks();
124
+ });
125
+ test("executes withdraw transaction", async () => {
126
+ const txHash = "0xabc123";
127
+ mockWriteProvider.writeContract.mockResolvedValue(txHash);
128
+ mockWriteProvider.waitForTransactionReceipt.mockResolvedValue({ transactionHash: txHash });
129
+ const result = await withdrawFromAdaptor({
130
+ writeProvider: mockWriteProvider,
131
+ adaptorAddress: "0xAdaptor123456789012345678901234567890ab",
132
+ token: "0xToken1234567890123456789012345678901234",
133
+ amount: 100n,
134
+ });
135
+ expect(result.transactionHash).toBe(txHash);
136
+ const call = mockWriteProvider.writeContract.mock.calls[0][0];
137
+ expect(call.functionName).toBe("withdraw");
138
+ expect(call.args).toEqual(["0x0token1234567890123456789012345678901234", 100n]);
139
+ });
140
+ test("throws when amount is zero", async () => {
141
+ await expect(withdrawFromAdaptor({
142
+ writeProvider: mockWriteProvider,
143
+ adaptorAddress: "0xAdaptor",
144
+ token: "0xToken",
145
+ amount: 0n,
146
+ })).rejects.toThrow("amount must be greater than zero");
147
+ });
148
+ test("throws when amount is negative", async () => {
149
+ await expect(withdrawFromAdaptor({
150
+ writeProvider: mockWriteProvider,
151
+ adaptorAddress: "0xAdaptor",
152
+ token: "0xToken",
153
+ amount: -1n,
154
+ })).rejects.toThrow("amount must be greater than zero");
155
+ });
156
+ });
157
+ //# sourceMappingURL=adaptorWithdraw.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptorWithdraw.test.js","sourceRoot":"","sources":["../../../../src/operations/liquidityManager/__tests__/adaptorWithdraw.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Adaptor withdraw operations for rescuing stuck funds from failed cross-chain unwraps.
3
+ */
4
+ import type { EvmReadProvider, EvmWriteProvider } from "../../types/evm.js";
5
+ import { type FeeOverrides } from "../../utils/fees.js";
6
+ /**
7
+ * Balances stuck in an adaptor contract for a given user.
8
+ */
9
+ export interface AdaptorBalances {
10
+ /** Underlying token balance stuck in the adaptor. */
11
+ underlyingTokenBalance: bigint;
12
+ /** zERC20 token balance stuck in the adaptor. */
13
+ zerc20Balance: bigint;
14
+ /** Native token balance stuck in the adaptor. */
15
+ nativeBalance: bigint;
16
+ /** Underlying token address as configured in the adaptor. */
17
+ underlyingTokenAddress: `0x${string}`;
18
+ /** zERC20 token address as configured in the adaptor. */
19
+ zerc20TokenAddress: `0x${string}`;
20
+ }
21
+ /**
22
+ * Parameters for `withdrawFromAdaptor`.
23
+ */
24
+ export interface AdaptorWithdrawParams {
25
+ /** Write provider used to sign and submit transactions. */
26
+ writeProvider: EvmWriteProvider;
27
+ /** Optional read provider for receipt polling. */
28
+ readProvider?: EvmReadProvider;
29
+ /** Adaptor contract address. */
30
+ adaptorAddress: string;
31
+ /** Token address to withdraw (underlying, zERC20, or native sentinel). */
32
+ token: string;
33
+ /** Amount to withdraw (bigint-like). */
34
+ amount: bigint | number | string;
35
+ /** Optional fee overrides (e.g., gas, maxFeePerGas). */
36
+ feeOverrides?: FeeOverrides;
37
+ }
38
+ /**
39
+ * Fetch balances stuck in an adaptor contract for a given user.
40
+ *
41
+ * @remarks
42
+ * When a cross-chain unwrap fails (e.g. due to Stargate liquidity shortage),
43
+ * user funds remain in the adaptor contract. This function reads those balances
44
+ * so the UI can prompt the user to withdraw.
45
+ *
46
+ * @param params.provider - Provider to use for contract reads.
47
+ * @param params.account - User address to check balances for.
48
+ * @param params.adaptorAddress - Adaptor contract address.
49
+ */
50
+ export declare function fetchAdaptorBalances(params: {
51
+ provider: EvmReadProvider;
52
+ account: string;
53
+ adaptorAddress: string;
54
+ }): Promise<AdaptorBalances>;
55
+ /**
56
+ * Check whether any funds are stuck in the adaptor for a given user.
57
+ *
58
+ * @remarks Convenience wrapper around `fetchAdaptorBalances` that returns `true`
59
+ * if any balance (underlying, zERC20, or native) is greater than zero.
60
+ */
61
+ export declare function hasStuckFunds(params: {
62
+ provider: EvmReadProvider;
63
+ account: string;
64
+ adaptorAddress: string;
65
+ }): Promise<boolean>;
66
+ /**
67
+ * Withdraw stuck funds from an adaptor contract.
68
+ *
69
+ * @remarks
70
+ * Calls the adaptor's `withdraw(token, amount)` function. The token parameter
71
+ * should be one of:
72
+ * - The underlying token address (for funds that were unwrapped but failed to bridge)
73
+ * - The zERC20 token address (for funds that failed before unwrap)
74
+ * - The native token sentinel `0xEeee...` (for stuck native token)
75
+ *
76
+ * @throws If `amount` is not positive.
77
+ * @returns Transaction hash for the withdraw.
78
+ */
79
+ export declare function withdrawFromAdaptor(params: AdaptorWithdrawParams): Promise<{
80
+ transactionHash: string;
81
+ }>;
82
+ //# sourceMappingURL=adaptorWithdraw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptorWithdraw.d.ts","sourceRoot":"","sources":["../../../src/operations/liquidityManager/adaptorWithdraw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAO,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAW5E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;IACtC,yDAAyD;IACzD,kBAAkB,EAAE,KAAK,MAAM,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,aAAa,EAAE,gBAAgB,CAAC;IAChC,kDAAkD;IAClD,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiD3B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBtC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Adaptor withdraw operations for rescuing stuck funds from failed cross-chain unwraps.
3
+ */
4
+ import AdaptorArtifact from "../../assets/abi/Adaptor.json" with { type: "json" };
5
+ import { spreadFeeOverrides } from "../../utils/fees.js";
6
+ import { ensureAccount, ensureBigintLike, normalizeAddress, receiptProvider, } from "./helpers.js";
7
+ /**
8
+ * Fetch balances stuck in an adaptor contract for a given user.
9
+ *
10
+ * @remarks
11
+ * When a cross-chain unwrap fails (e.g. due to Stargate liquidity shortage),
12
+ * user funds remain in the adaptor contract. This function reads those balances
13
+ * so the UI can prompt the user to withdraw.
14
+ *
15
+ * @param params.provider - Provider to use for contract reads.
16
+ * @param params.account - User address to check balances for.
17
+ * @param params.adaptorAddress - Adaptor contract address.
18
+ */
19
+ export async function fetchAdaptorBalances(params) {
20
+ const { provider, account, adaptorAddress } = params;
21
+ const normalizedAccount = normalizeAddress(account);
22
+ const normalizedAdaptor = normalizeAddress(adaptorAddress);
23
+ const [underlyingTokenBalance, zerc20Balance, nativeBalance, underlyingTokenAddress, zerc20TokenAddress,] = await Promise.all([
24
+ provider.readContract({
25
+ address: normalizedAdaptor,
26
+ abi: AdaptorArtifact.abi,
27
+ functionName: "underlyingTokenBalances",
28
+ args: [normalizedAccount],
29
+ }),
30
+ provider.readContract({
31
+ address: normalizedAdaptor,
32
+ abi: AdaptorArtifact.abi,
33
+ functionName: "zerc20Balances",
34
+ args: [normalizedAccount],
35
+ }),
36
+ provider.readContract({
37
+ address: normalizedAdaptor,
38
+ abi: AdaptorArtifact.abi,
39
+ functionName: "nativeBalances",
40
+ args: [normalizedAccount],
41
+ }),
42
+ provider.readContract({
43
+ address: normalizedAdaptor,
44
+ abi: AdaptorArtifact.abi,
45
+ functionName: "UNDERLYING_TOKEN",
46
+ }),
47
+ provider.readContract({
48
+ address: normalizedAdaptor,
49
+ abi: AdaptorArtifact.abi,
50
+ functionName: "ZERC20_TOKEN",
51
+ }),
52
+ ]);
53
+ return {
54
+ underlyingTokenBalance: ensureBigintLike(underlyingTokenBalance, "underlyingTokenBalance"),
55
+ zerc20Balance: ensureBigintLike(zerc20Balance, "zerc20Balance"),
56
+ nativeBalance: ensureBigintLike(nativeBalance, "nativeBalance"),
57
+ underlyingTokenAddress: normalizeAddress(underlyingTokenAddress),
58
+ zerc20TokenAddress: normalizeAddress(zerc20TokenAddress),
59
+ };
60
+ }
61
+ /**
62
+ * Check whether any funds are stuck in the adaptor for a given user.
63
+ *
64
+ * @remarks Convenience wrapper around `fetchAdaptorBalances` that returns `true`
65
+ * if any balance (underlying, zERC20, or native) is greater than zero.
66
+ */
67
+ export async function hasStuckFunds(params) {
68
+ const balances = await fetchAdaptorBalances(params);
69
+ return (balances.underlyingTokenBalance > 0n ||
70
+ balances.zerc20Balance > 0n ||
71
+ balances.nativeBalance > 0n);
72
+ }
73
+ /**
74
+ * Withdraw stuck funds from an adaptor contract.
75
+ *
76
+ * @remarks
77
+ * Calls the adaptor's `withdraw(token, amount)` function. The token parameter
78
+ * should be one of:
79
+ * - The underlying token address (for funds that were unwrapped but failed to bridge)
80
+ * - The zERC20 token address (for funds that failed before unwrap)
81
+ * - The native token sentinel `0xEeee...` (for stuck native token)
82
+ *
83
+ * @throws If `amount` is not positive.
84
+ * @returns Transaction hash for the withdraw.
85
+ */
86
+ export async function withdrawFromAdaptor(params) {
87
+ const { writeProvider, readProvider, adaptorAddress, token, amount, feeOverrides } = params;
88
+ const normalizedAmount = ensureBigintLike(amount, "amount");
89
+ if (normalizedAmount <= 0n) {
90
+ throw new Error("amount must be greater than zero");
91
+ }
92
+ const account = ensureAccount(writeProvider);
93
+ const normalizedAdaptor = normalizeAddress(adaptorAddress);
94
+ const normalizedToken = normalizeAddress(token);
95
+ const receipt = receiptProvider(writeProvider, readProvider);
96
+ const txOverrides = { account, chain: writeProvider.chain, ...spreadFeeOverrides(feeOverrides) };
97
+ const withdrawHash = await writeProvider.writeContract({
98
+ address: normalizedAdaptor,
99
+ abi: AdaptorArtifact.abi,
100
+ functionName: "withdraw",
101
+ args: [normalizedToken, normalizedAmount],
102
+ ...txOverrides,
103
+ });
104
+ const withdrawReceipt = await receipt.waitForTransactionReceipt({ hash: withdrawHash });
105
+ return { transactionHash: withdrawReceipt.transactionHash };
106
+ }
107
+ //# sourceMappingURL=adaptorWithdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptorWithdraw.js","sourceRoot":"","sources":["../../../src/operations/liquidityManager/adaptorWithdraw.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,7 @@ export type { LocalUnwrapParams } from "./unwrap.js";
9
9
  export { quoteLocalUnwrap, unwrapWithLiquidityManager } from "./unwrap.js";
10
10
  export type { CrossUnwrapQuoteParams, CrossUnwrapSendParams } from "./crossUnwrap.js";
11
11
  export { applySlippage, buildCrossUnwrapQuote, sendCrossUnwrap } from "./crossUnwrap.js";
12
- export { removeDust } from "./helpers.js";
12
+ export type { AdaptorBalances, AdaptorWithdrawParams } from "./adaptorWithdraw.js";
13
+ export { fetchAdaptorBalances, hasStuckFunds, withdrawFromAdaptor } from "./adaptorWithdraw.js";
14
+ export { NATIVE_TOKEN_ADDRESS, removeDust } from "./helpers.js";
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/operations/liquidityManager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAG7D,YAAY,EAAE,8BAA8B,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAG3E,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/operations/liquidityManager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAG7D,YAAY,EAAE,8BAA8B,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAGrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAG3E,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGzF,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -6,6 +6,7 @@ export { fetchLiquidityManagerBalances } from "./balance.js";
6
6
  export { wrapWithLiquidityManager } from "./wrap.js";
7
7
  export { quoteLocalUnwrap, unwrapWithLiquidityManager } from "./unwrap.js";
8
8
  export { applySlippage, buildCrossUnwrapQuote, sendCrossUnwrap } from "./crossUnwrap.js";
9
+ export { fetchAdaptorBalances, hasStuckFunds, withdrawFromAdaptor } from "./adaptorWithdraw.js";
9
10
  // Helpers
10
- export { removeDust } from "./helpers.js";
11
+ export { NATIVE_TOKEN_ADDRESS, removeDust } from "./helpers.js";
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/operations/liquidityManager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,qBAAqB;AACrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAI7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAIrD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAI3E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzF,UAAU;AACV,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/operations/liquidityManager/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,qBAAqB;AACrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAI7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAIrD,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAI3E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIzF,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhG,UAAU;AACV,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -124,6 +124,39 @@ describe("AggregationStateCacheManager", () => {
124
124
  });
125
125
  expect(mockFetchAggregationTreeState).toHaveBeenCalledTimes(2);
126
126
  });
127
+ test("uses different cache keys for different eventBlockSpan values", async () => {
128
+ const manager = new AggregationStateCacheManager();
129
+ await manager.fetchWithCache({
130
+ hub: mockHub,
131
+ token: mockToken,
132
+ eventBlockSpan: 1000n,
133
+ cacheTtlMs: 60000,
134
+ });
135
+ await manager.fetchWithCache({
136
+ hub: mockHub,
137
+ token: mockToken,
138
+ eventBlockSpan: 2000n,
139
+ cacheTtlMs: 60000,
140
+ });
141
+ expect(mockFetchAggregationTreeState).toHaveBeenCalledTimes(2);
142
+ expect(manager.size()).toBe(2);
143
+ });
144
+ test("uses different cache keys when eventBlockSpan is present vs absent", async () => {
145
+ const manager = new AggregationStateCacheManager();
146
+ await manager.fetchWithCache({
147
+ hub: mockHub,
148
+ token: mockToken,
149
+ cacheTtlMs: 60000,
150
+ });
151
+ await manager.fetchWithCache({
152
+ hub: mockHub,
153
+ token: mockToken,
154
+ eventBlockSpan: 1000n,
155
+ cacheTtlMs: 60000,
156
+ });
157
+ expect(mockFetchAggregationTreeState).toHaveBeenCalledTimes(2);
158
+ expect(manager.size()).toBe(2);
159
+ });
127
160
  test("passes eventBlockSpan to fetchAggregationTreeState", async () => {
128
161
  const manager = new AggregationStateCacheManager();
129
162
  await manager.fetchWithCache({
@@ -1 +1 @@
1
- {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../../src/operations/receive/__tests__/cache.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../../src/operations/receive/__tests__/cache.test.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,6 @@ export declare class AggregationStateCacheManager {
46
46
  /**
47
47
  * Return true if the cache contains an entry for the given hub and chain.
48
48
  */
49
- hasEntry(hubAddress: string, chainId: bigint): boolean;
49
+ hasEntry(hubAddress: string, chainId: bigint, eventBlockSpan?: bigint | number): boolean;
50
50
  }
51
51
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/operations/receive/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAa3D,MAAM,WAAW,2BAA2B;IAC1C,8DAA8D;IAC9D,GAAG,EAAE,QAAQ,CAAC;IACd,6DAA6D;IAC7D,KAAK,EAAE,UAAU,CAAC;IAClB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD;;GAEG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoBxF;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAQzB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAGvD"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/operations/receive/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAa3D,MAAM,WAAW,2BAA2B;IAC1C,8DAA8D;IAC9D,GAAG,EAAE,QAAQ,CAAC;IACd,6DAA6D;IAC7D,KAAK,EAAE,UAAU,CAAC;IAClB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmBD;;GAEG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwBxF;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAQzB;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;CAGzF"}
@@ -5,8 +5,9 @@ import { fetchAggregationTreeState } from "../../wasm/index.js";
5
5
  // ============================================================================
6
6
  // Internal Utilities
7
7
  // ============================================================================
8
- function getCacheKey(hubAddress, chainId) {
9
- return `${hubAddress.toLowerCase()}-${chainId}`;
8
+ function getCacheKey(hubAddress, chainId, eventBlockSpan) {
9
+ const base = `${hubAddress.toLowerCase()}-${chainId}`;
10
+ return eventBlockSpan != null ? `${base}-${eventBlockSpan}` : base;
10
11
  }
11
12
  // ============================================================================
12
13
  // AggregationStateCacheManager Class
@@ -22,7 +23,7 @@ export class AggregationStateCacheManager {
22
23
  */
23
24
  async fetchWithCache(params) {
24
25
  const cacheTtl = params.cacheTtlMs;
25
- const cacheKey = getCacheKey(params.hub.hubAddress, params.token.chainId);
26
+ const cacheKey = getCacheKey(params.hub.hubAddress, params.token.chainId, params.eventBlockSpan);
26
27
  const cached = this.cache.get(cacheKey);
27
28
  const now = Date.now();
28
29
  if (cacheTtl != null && cached && now - cached.timestamp < cacheTtl) {
@@ -68,8 +69,8 @@ export class AggregationStateCacheManager {
68
69
  /**
69
70
  * Return true if the cache contains an entry for the given hub and chain.
70
71
  */
71
- hasEntry(hubAddress, chainId) {
72
- return this.cache.has(getCacheKey(hubAddress, chainId));
72
+ hasEntry(hubAddress, chainId, eventBlockSpan) {
73
+ return this.cache.has(getCacheKey(hubAddress, chainId, eventBlockSpan));
73
74
  }
74
75
  }
75
76
  //# sourceMappingURL=cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/operations/receive/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AA0BhE,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,SAAS,WAAW,CAAC,UAAkB,EAAE,OAAe;IACtD,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,4BAA4B;IACtB,KAAK,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEnE;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,MAAmC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACvB,KAAK;YACL,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;SAC9B,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAY;QAChB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,UAAkB,EAAE,OAAe;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/operations/receive/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AA0BhE,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,SAAS,WAAW,CAClB,UAAkB,EAClB,OAAe,EACf,cAAgC;IAEhC,MAAM,IAAI,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;IACtD,OAAO,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,4BAA4B;IACtB,KAAK,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEnE;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,MAAmC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAC1B,MAAM,CAAC,GAAG,CAAC,UAAU,EACrB,MAAM,CAAC,KAAK,CAAC,OAAO,EACpB,MAAM,CAAC,cAAc,CACtB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACvB,KAAK;YACL,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;SAC9B,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAY;QAChB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,UAAkB,EAAE,OAAe,EAAE,cAAgC;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zerc20-client-sdk",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Client SDK for interacting with ZERC20 rollup services from browser or node environments.",
5
5
  "type": "module",
6
6
  "license": "MIT",