@remitmd/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.
Files changed (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/a2a.d.ts +137 -0
  4. package/dist/a2a.d.ts.map +1 -0
  5. package/dist/a2a.js +121 -0
  6. package/dist/a2a.js.map +1 -0
  7. package/dist/client.d.ts +41 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +81 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/errors.d.ts +108 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +218 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/http.d.ts +23 -0
  16. package/dist/http.d.ts.map +1 -0
  17. package/dist/http.js +150 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/index.d.ts +18 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +21 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/integrations/vercel-ai.d.ts +44 -0
  24. package/dist/integrations/vercel-ai.d.ts.map +1 -0
  25. package/dist/integrations/vercel-ai.js +175 -0
  26. package/dist/integrations/vercel-ai.js.map +1 -0
  27. package/dist/models/bounty.d.ts +22 -0
  28. package/dist/models/bounty.d.ts.map +1 -0
  29. package/dist/models/bounty.js +2 -0
  30. package/dist/models/bounty.js.map +1 -0
  31. package/dist/models/common.d.ts +78 -0
  32. package/dist/models/common.d.ts.map +1 -0
  33. package/dist/models/common.js +3 -0
  34. package/dist/models/common.js.map +1 -0
  35. package/dist/models/deposit.d.ts +13 -0
  36. package/dist/models/deposit.d.ts.map +1 -0
  37. package/dist/models/deposit.js +2 -0
  38. package/dist/models/deposit.js.map +1 -0
  39. package/dist/models/escrow.d.ts +16 -0
  40. package/dist/models/escrow.d.ts.map +1 -0
  41. package/dist/models/escrow.js +2 -0
  42. package/dist/models/escrow.js.map +1 -0
  43. package/dist/models/index.d.ts +9 -0
  44. package/dist/models/index.d.ts.map +1 -0
  45. package/dist/models/index.js +9 -0
  46. package/dist/models/index.js.map +1 -0
  47. package/dist/models/invoice.d.ts +30 -0
  48. package/dist/models/invoice.d.ts.map +1 -0
  49. package/dist/models/invoice.js +2 -0
  50. package/dist/models/invoice.js.map +1 -0
  51. package/dist/models/reputation.d.ts +7 -0
  52. package/dist/models/reputation.d.ts.map +1 -0
  53. package/dist/models/reputation.js +2 -0
  54. package/dist/models/reputation.js.map +1 -0
  55. package/dist/models/stream.d.ts +15 -0
  56. package/dist/models/stream.d.ts.map +1 -0
  57. package/dist/models/stream.js +2 -0
  58. package/dist/models/stream.js.map +1 -0
  59. package/dist/models/tab.d.ts +21 -0
  60. package/dist/models/tab.d.ts.map +1 -0
  61. package/dist/models/tab.js +2 -0
  62. package/dist/models/tab.js.map +1 -0
  63. package/dist/provider.d.ts +135 -0
  64. package/dist/provider.d.ts.map +1 -0
  65. package/dist/provider.js +218 -0
  66. package/dist/provider.js.map +1 -0
  67. package/dist/signer.d.ts +31 -0
  68. package/dist/signer.d.ts.map +1 -0
  69. package/dist/signer.js +35 -0
  70. package/dist/signer.js.map +1 -0
  71. package/dist/testing/local.d.ts +31 -0
  72. package/dist/testing/local.d.ts.map +1 -0
  73. package/dist/testing/local.js +100 -0
  74. package/dist/testing/local.js.map +1 -0
  75. package/dist/testing/mock.d.ts +95 -0
  76. package/dist/testing/mock.d.ts.map +1 -0
  77. package/dist/testing/mock.js +407 -0
  78. package/dist/testing/mock.js.map +1 -0
  79. package/dist/wallet.d.ts +162 -0
  80. package/dist/wallet.d.ts.map +1 -0
  81. package/dist/wallet.js +365 -0
  82. package/dist/wallet.js.map +1 -0
  83. package/dist/x402.d.ts +78 -0
  84. package/dist/x402.d.ts.map +1 -0
  85. package/dist/x402.js +151 -0
  86. package/dist/x402.js.map +1 -0
  87. package/eslint.config.js +27 -0
  88. package/package.json +39 -0
  89. package/src/a2a.ts +241 -0
  90. package/src/client.ts +104 -0
  91. package/src/errors.ts +261 -0
  92. package/src/http.ts +190 -0
  93. package/src/index.ts +94 -0
  94. package/src/integrations/vercel-ai.ts +213 -0
  95. package/src/models/bounty.ts +23 -0
  96. package/src/models/common.ts +106 -0
  97. package/src/models/deposit.ts +13 -0
  98. package/src/models/escrow.ts +16 -0
  99. package/src/models/index.ts +8 -0
  100. package/src/models/invoice.ts +32 -0
  101. package/src/models/reputation.ts +7 -0
  102. package/src/models/stream.ts +15 -0
  103. package/src/models/tab.ts +22 -0
  104. package/src/provider.ts +281 -0
  105. package/src/signer.ts +70 -0
  106. package/src/testing/local.ts +118 -0
  107. package/src/testing/mock.ts +507 -0
  108. package/src/wallet.ts +546 -0
  109. package/src/x402.ts +202 -0
  110. package/tests/acceptance/bounty.test.ts +82 -0
  111. package/tests/acceptance/deposit.test.ts +70 -0
  112. package/tests/acceptance/direct.test.ts +53 -0
  113. package/tests/acceptance/escrow.test.ts +67 -0
  114. package/tests/acceptance/setup.ts +113 -0
  115. package/tests/acceptance/stream.test.ts +98 -0
  116. package/tests/acceptance/tab.test.ts +108 -0
  117. package/tests/acceptance/x402.test.ts +140 -0
  118. package/tests/compliance/auth.ts +69 -0
  119. package/tests/compliance/escrows.ts +96 -0
  120. package/tests/compliance/helpers.ts +90 -0
  121. package/tests/compliance/payments.ts +69 -0
  122. package/tests/compliance/tabs.ts +52 -0
  123. package/tests/test_a2a.ts +151 -0
  124. package/tests/test_errors.ts +80 -0
  125. package/tests/test_golden_vectors.ts +162 -0
  126. package/tests/test_integrations.ts +115 -0
  127. package/tests/test_mock.ts +217 -0
  128. package/tests/test_permit.ts +216 -0
  129. package/tests/test_provider.ts +304 -0
  130. package/tests/test_wallet.ts +108 -0
  131. package/tests/test_x402.ts +302 -0
  132. package/tsconfig.json +19 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * MockRemit — in-memory test double. No network, no chain. <1ms per operation.
3
+ *
4
+ * Usage:
5
+ * const mock = new MockRemit();
6
+ * const wallet = mock.createWallet(1000);
7
+ * const other = mock.createWallet(0);
8
+ * const tab = await wallet.openTab({ to: other.address, limit: 100, perUnit: 1 });
9
+ */
10
+ import { Wallet } from "../wallet.js";
11
+ import type { Transaction, WalletStatus, Reputation, Webhook } from "../models/index.js";
12
+ import type { Invoice } from "../models/invoice.js";
13
+ import type { Escrow } from "../models/escrow.js";
14
+ import type { Tab } from "../models/tab.js";
15
+ import type { Stream } from "../models/stream.js";
16
+ import type { Bounty } from "../models/bounty.js";
17
+ import type { Deposit } from "../models/deposit.js";
18
+ /** State machine for a mock wallet. */
19
+ declare class MockWalletState {
20
+ balance: number;
21
+ forcedError: string | null;
22
+ constructor(balance: number);
23
+ }
24
+ export declare class MockRemit {
25
+ #private;
26
+ static _now(): number;
27
+ _now(): number;
28
+ /** Advance simulated time. Useful for testing timeouts and expirations. */
29
+ advanceTime(seconds: number): void;
30
+ /** Create a mock wallet with a given USDC balance. */
31
+ createWallet(balance?: number): MockWallet;
32
+ /** Force the next operation for a given wallet address to fail with an error code. */
33
+ setBehavior(address: string, errorCode: string | null): void;
34
+ _getState(address: string): MockWalletState;
35
+ _checkForced(address: string): void;
36
+ _debit(address: string, amount: number): void;
37
+ _credit(address: string, amount: number): void;
38
+ getEscrow(id: string): Escrow;
39
+ getTab(id: string): Tab;
40
+ getStream(id: string): Stream;
41
+ getBounty(id: string): Bounty;
42
+ getDeposit(id: string): Deposit;
43
+ getStatus(address: string): WalletStatus;
44
+ getReputation(address: string): Reputation;
45
+ listBounties(status?: string): Bounty[];
46
+ payDirect(from: string, to: string, amount: number): Transaction;
47
+ fundEscrow(from: string, invoice: Invoice): {
48
+ tx: Transaction;
49
+ escrow: Escrow;
50
+ };
51
+ releaseEscrow(from: string, invoiceId: string): Transaction;
52
+ cancelEscrow(from: string, invoiceId: string): Transaction;
53
+ openTab(from: string, to: string, limit: number, perUnit: number, expires?: number): Tab;
54
+ closeTab(from: string, tabId: string): Transaction;
55
+ openStream(from: string, to: string, rate: number, maxDuration?: number, maxTotal?: number): Stream;
56
+ closeStream(from: string, streamId: string): Transaction;
57
+ postBounty(from: string, amount: number, task: string, deadline: number, validation?: Bounty["validation"], maxAttempts?: number): Bounty;
58
+ submitBounty(from: string, bountyId: string, evidenceHash: string): {
59
+ id: number;
60
+ };
61
+ awardBounty(from: string, bountyId: string, submissionId: number): Transaction;
62
+ placeDeposit(from: string, to: string, amount: number, expires: number): Deposit;
63
+ }
64
+ /**
65
+ * MockWallet — a Wallet backed by MockRemit instead of the real API.
66
+ * Overrides all write methods to use the in-memory state machine.
67
+ */
68
+ export declare class MockWallet extends Wallet {
69
+ #private;
70
+ constructor(privateKey: string, mock: MockRemit);
71
+ payDirect(to: string, amount: number, _memo?: string): Promise<Transaction>;
72
+ pay(invoice: Invoice): Promise<Escrow>;
73
+ releaseEscrow(invoiceId: string): Promise<Transaction>;
74
+ cancelEscrow(invoiceId: string): Promise<Transaction>;
75
+ openTab(options: Parameters<Wallet["openTab"]>[0]): Promise<Tab>;
76
+ closeTab(tabId: string): Promise<Transaction>;
77
+ openStream(options: Parameters<Wallet["openStream"]>[0]): Promise<Stream>;
78
+ closeStream(streamId: string): Promise<Transaction>;
79
+ postBounty(options: Parameters<Wallet["postBounty"]>[0]): Promise<Bounty>;
80
+ submitBounty(bountyId: string, evidenceHash: string): Promise<Transaction>;
81
+ awardBounty(bountyId: string, submissionId: number): Promise<Transaction>;
82
+ placeDeposit(options: Parameters<Wallet["placeDeposit"]>[0]): Promise<Deposit>;
83
+ status(): Promise<WalletStatus>;
84
+ balance(): Promise<number>;
85
+ registerWebhook(url: string, events: string[]): Promise<Webhook>;
86
+ requestTestnetFunds(): Promise<Transaction>;
87
+ getEscrow(invoiceId: string): Promise<import("../models/escrow.js").Escrow>;
88
+ getTab(tabId: string): Promise<Tab>;
89
+ getStream(streamId: string): Promise<Stream>;
90
+ getBounty(bountyId: string): Promise<Bounty>;
91
+ getStatus(_wallet: string): Promise<WalletStatus>;
92
+ getReputation(wallet: string): Promise<import("../models/index.js").Reputation>;
93
+ }
94
+ export {};
95
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,407 @@
1
+ /**
2
+ * MockRemit — in-memory test double. No network, no chain. <1ms per operation.
3
+ *
4
+ * Usage:
5
+ * const mock = new MockRemit();
6
+ * const wallet = mock.createWallet(1000);
7
+ * const other = mock.createWallet(0);
8
+ * const tab = await wallet.openTab({ to: other.address, limit: 100, perUnit: 1 });
9
+ */
10
+ import { generatePrivateKey, privateKeyToAddress } from "viem/accounts";
11
+ import { Wallet } from "../wallet.js";
12
+ import { InsufficientBalanceError, EscrowNotFoundError, TabNotFoundError, StreamNotFoundError, BountyNotFoundError, } from "../errors.js";
13
+ let _idCounter = 1;
14
+ function nextId() {
15
+ return `mock-${_idCounter++}`;
16
+ }
17
+ function mkTx(invoiceId) {
18
+ return {
19
+ invoiceId,
20
+ txHash: `0x${nextId()}`,
21
+ chain: "base",
22
+ status: "confirmed",
23
+ createdAt: MockRemit._now(),
24
+ };
25
+ }
26
+ /** State machine for a mock wallet. */
27
+ class MockWalletState {
28
+ balance;
29
+ forcedError = null;
30
+ constructor(balance) {
31
+ this.balance = balance;
32
+ }
33
+ }
34
+ export class MockRemit {
35
+ #wallets = new Map();
36
+ #escrows = new Map();
37
+ #tabs = new Map();
38
+ #streams = new Map();
39
+ #bounties = new Map();
40
+ #deposits = new Map();
41
+ #timeOffset = 0;
42
+ static _now() {
43
+ return Math.floor(Date.now() / 1000);
44
+ }
45
+ _now() {
46
+ return MockRemit._now() + this.#timeOffset;
47
+ }
48
+ /** Advance simulated time. Useful for testing timeouts and expirations. */
49
+ advanceTime(seconds) {
50
+ this.#timeOffset += seconds;
51
+ }
52
+ /** Create a mock wallet with a given USDC balance. */
53
+ createWallet(balance = 1000) {
54
+ const key = generatePrivateKey();
55
+ const address = privateKeyToAddress(key);
56
+ this.#wallets.set(address, new MockWalletState(balance));
57
+ return new MockWallet(key, this);
58
+ }
59
+ /** Force the next operation for a given wallet address to fail with an error code. */
60
+ setBehavior(address, errorCode) {
61
+ const state = this.#wallets.get(address);
62
+ if (state)
63
+ state.forcedError = errorCode;
64
+ }
65
+ _getState(address) {
66
+ let state = this.#wallets.get(address);
67
+ if (!state) {
68
+ state = new MockWalletState(0);
69
+ this.#wallets.set(address, state);
70
+ }
71
+ return state;
72
+ }
73
+ _checkForced(address) {
74
+ const state = this._getState(address);
75
+ if (state.forcedError) {
76
+ const code = state.forcedError;
77
+ state.forcedError = null;
78
+ throw new Error(code);
79
+ }
80
+ }
81
+ _debit(address, amount) {
82
+ const state = this._getState(address);
83
+ if (state.balance < amount)
84
+ throw new InsufficientBalanceError();
85
+ state.balance -= amount;
86
+ }
87
+ _credit(address, amount) {
88
+ this._getState(address).balance += amount;
89
+ }
90
+ // ─── Read operations ─────────────────────────────────────────────────────────
91
+ getEscrow(id) {
92
+ const e = this.#escrows.get(id);
93
+ if (!e)
94
+ throw new EscrowNotFoundError();
95
+ return { ...e };
96
+ }
97
+ getTab(id) {
98
+ const t = this.#tabs.get(id);
99
+ if (!t)
100
+ throw new TabNotFoundError();
101
+ return { ...t };
102
+ }
103
+ getStream(id) {
104
+ const s = this.#streams.get(id);
105
+ if (!s)
106
+ throw new StreamNotFoundError();
107
+ return { ...s };
108
+ }
109
+ getBounty(id) {
110
+ const b = this.#bounties.get(id);
111
+ if (!b)
112
+ throw new BountyNotFoundError();
113
+ return { ...b };
114
+ }
115
+ getDeposit(id) {
116
+ const d = this.#deposits.get(id);
117
+ if (!d)
118
+ throw new Error("DEPOSIT_NOT_FOUND");
119
+ return { ...d };
120
+ }
121
+ getStatus(address) {
122
+ const state = this._getState(address);
123
+ return {
124
+ wallet: address,
125
+ balance: String(state.balance),
126
+ monthly_volume: "0",
127
+ tier: "trusted",
128
+ fee_rate_bps: 50,
129
+ active_escrows: 0,
130
+ active_tabs: 0,
131
+ active_streams: 0,
132
+ };
133
+ }
134
+ getReputation(address) {
135
+ return {
136
+ address,
137
+ score: 100,
138
+ totalPaid: 0,
139
+ totalReceived: 0,
140
+ escrowsCompleted: 0,
141
+ memberSince: this._now() - 86400 * 30,
142
+ };
143
+ }
144
+ listBounties(status = "open") {
145
+ return [...this.#bounties.values()].filter((b) => b.status === status);
146
+ }
147
+ // ─── Write operations ────────────────────────────────────────────────────────
148
+ payDirect(from, to, amount) {
149
+ this._checkForced(from);
150
+ this._debit(from, amount);
151
+ this._credit(to, amount);
152
+ return mkTx();
153
+ }
154
+ fundEscrow(from, invoice) {
155
+ this._checkForced(from);
156
+ this._debit(from, invoice.amount);
157
+ const id = invoice.id ?? nextId();
158
+ const escrow = {
159
+ invoiceId: id,
160
+ txHash: `0x${nextId()}`,
161
+ payer: from,
162
+ payee: invoice.to,
163
+ amount: invoice.amount,
164
+ chain: "base",
165
+ status: "funded",
166
+ createdAt: this._now(),
167
+ };
168
+ this.#escrows.set(id, escrow);
169
+ return { tx: mkTx(id), escrow };
170
+ }
171
+ releaseEscrow(from, invoiceId) {
172
+ this._checkForced(from);
173
+ const escrow = this.getEscrow(invoiceId);
174
+ if (escrow.status === "completed")
175
+ throw new Error("ESCROW_ALREADY_COMPLETED");
176
+ const mut = this.#escrows.get(invoiceId);
177
+ mut.status = "completed";
178
+ this._credit(escrow.payee, escrow.amount);
179
+ return mkTx(invoiceId);
180
+ }
181
+ cancelEscrow(from, invoiceId) {
182
+ this._checkForced(from);
183
+ const escrow = this.getEscrow(invoiceId);
184
+ const mut = this.#escrows.get(invoiceId);
185
+ mut.status = "cancelled";
186
+ this._credit(from, escrow.amount);
187
+ return mkTx(invoiceId);
188
+ }
189
+ openTab(from, to, limit, perUnit, expires = 86400) {
190
+ this._checkForced(from);
191
+ this._debit(from, limit);
192
+ const id = nextId();
193
+ const tab = {
194
+ id,
195
+ payer: from,
196
+ payee: to,
197
+ limit,
198
+ perUnit,
199
+ spent: 0,
200
+ chain: "base",
201
+ status: "open",
202
+ createdAt: this._now(),
203
+ expiresAt: this._now() + expires,
204
+ };
205
+ this.#tabs.set(id, tab);
206
+ return { ...tab };
207
+ }
208
+ closeTab(from, tabId) {
209
+ this._checkForced(from);
210
+ const tab = this.getTab(tabId);
211
+ const remaining = tab.limit - tab.spent;
212
+ const mut = this.#tabs.get(tabId);
213
+ mut.status = "closed";
214
+ // Refund unspent to payer
215
+ this._credit(from, remaining);
216
+ this._credit(tab.payee, tab.spent);
217
+ return mkTx();
218
+ }
219
+ openStream(from, to, rate, maxDuration = 3600, maxTotal) {
220
+ this._checkForced(from);
221
+ const reserve = maxTotal ?? rate * maxDuration;
222
+ this._debit(from, reserve);
223
+ const id = nextId();
224
+ const stream = {
225
+ id,
226
+ payer: from,
227
+ payee: to,
228
+ ratePerSecond: rate,
229
+ maxDuration,
230
+ maxTotal,
231
+ totalStreamed: 0,
232
+ chain: "base",
233
+ status: "active",
234
+ startedAt: this._now(),
235
+ };
236
+ this.#streams.set(id, stream);
237
+ return { ...stream };
238
+ }
239
+ closeStream(from, streamId) {
240
+ this._checkForced(from);
241
+ const stream = this.getStream(streamId);
242
+ const elapsed = Math.min(this._now() - stream.startedAt, stream.maxDuration);
243
+ const earned = Math.min(elapsed * stream.ratePerSecond, stream.maxTotal ?? Infinity);
244
+ const reserve = stream.maxTotal ?? stream.ratePerSecond * stream.maxDuration;
245
+ const refund = reserve - earned;
246
+ const mut = this.#streams.get(streamId);
247
+ mut.status = "closed";
248
+ mut.closedAt = this._now();
249
+ mut.totalStreamed = earned;
250
+ this._credit(stream.payee, earned);
251
+ this._credit(from, refund);
252
+ return mkTx();
253
+ }
254
+ postBounty(from, amount, task, deadline, validation = "poster", maxAttempts = 10) {
255
+ this._checkForced(from);
256
+ this._debit(from, amount);
257
+ const id = nextId();
258
+ const bounty = {
259
+ id,
260
+ poster: from,
261
+ amount,
262
+ task,
263
+ chain: "base",
264
+ status: "open",
265
+ validation,
266
+ maxAttempts,
267
+ submissions: [],
268
+ createdAt: this._now(),
269
+ deadline,
270
+ };
271
+ this.#bounties.set(id, bounty);
272
+ return { ...bounty };
273
+ }
274
+ submitBounty(from, bountyId, evidenceHash) {
275
+ this._checkForced(from);
276
+ const mut = this.#bounties.get(bountyId);
277
+ if (!mut)
278
+ throw new Error(`bounty ${bountyId} not found`);
279
+ mut.submissions.push({
280
+ submitter: from,
281
+ evidenceUri: evidenceHash,
282
+ submittedAt: this._now(),
283
+ });
284
+ return { id: mut.submissions.length };
285
+ }
286
+ awardBounty(from, bountyId, submissionId) {
287
+ this._checkForced(from);
288
+ const bounty = this.getBounty(bountyId);
289
+ const mut = this.#bounties.get(bountyId);
290
+ const submission = mut.submissions[submissionId - 1];
291
+ if (!submission)
292
+ throw new Error(`submission ${submissionId} not found`);
293
+ mut.status = "awarded";
294
+ mut.winner = submission.submitter;
295
+ this._credit(submission.submitter, bounty.amount);
296
+ return mkTx();
297
+ }
298
+ placeDeposit(from, to, amount, expires) {
299
+ this._checkForced(from);
300
+ this._debit(from, amount);
301
+ const id = nextId();
302
+ const deposit = {
303
+ id,
304
+ payer: from,
305
+ payee: to,
306
+ amount,
307
+ chain: "base",
308
+ status: "locked",
309
+ createdAt: this._now(),
310
+ expiresAt: this._now() + expires,
311
+ };
312
+ this.#deposits.set(id, deposit);
313
+ return { ...deposit };
314
+ }
315
+ }
316
+ /**
317
+ * MockWallet — a Wallet backed by MockRemit instead of the real API.
318
+ * Overrides all write methods to use the in-memory state machine.
319
+ */
320
+ export class MockWallet extends Wallet {
321
+ #mock;
322
+ constructor(privateKey, mock) {
323
+ // Pass a dummy apiUrl so no real HTTP is needed
324
+ super({ privateKey, apiUrl: "http://localhost:0" });
325
+ this.#mock = mock;
326
+ }
327
+ async payDirect(to, amount, _memo = "") {
328
+ return this.#mock.payDirect(this.address, to, amount);
329
+ }
330
+ async pay(invoice) {
331
+ const { escrow } = this.#mock.fundEscrow(this.address, invoice);
332
+ return escrow;
333
+ }
334
+ async releaseEscrow(invoiceId) {
335
+ return this.#mock.releaseEscrow(this.address, invoiceId);
336
+ }
337
+ async cancelEscrow(invoiceId) {
338
+ return this.#mock.cancelEscrow(this.address, invoiceId);
339
+ }
340
+ async openTab(options) {
341
+ return this.#mock.openTab(this.address, options.to, options.limit, options.perUnit, options.expires);
342
+ }
343
+ async closeTab(tabId) {
344
+ return this.#mock.closeTab(this.address, tabId);
345
+ }
346
+ async openStream(options) {
347
+ return this.#mock.openStream(this.address, options.to, options.rate, options.maxDuration, options.maxTotal);
348
+ }
349
+ async closeStream(streamId) {
350
+ return this.#mock.closeStream(this.address, streamId);
351
+ }
352
+ async postBounty(options) {
353
+ return this.#mock.postBounty(this.address, options.amount, options.task, options.deadline, options.validation, options.maxAttempts);
354
+ }
355
+ async submitBounty(bountyId, evidenceHash) {
356
+ this.#mock.submitBounty(this.address, bountyId, evidenceHash);
357
+ return mkTx();
358
+ }
359
+ async awardBounty(bountyId, submissionId) {
360
+ return this.#mock.awardBounty(this.address, bountyId, submissionId);
361
+ }
362
+ async placeDeposit(options) {
363
+ return this.#mock.placeDeposit(this.address, options.to, options.amount, options.expires);
364
+ }
365
+ async status() {
366
+ return this.#mock.getStatus(this.address);
367
+ }
368
+ async balance() {
369
+ return parseFloat((await this.status()).balance);
370
+ }
371
+ registerWebhook(url, events) {
372
+ const wh = {
373
+ id: `wh-${Date.now()}`,
374
+ wallet: this.address,
375
+ url,
376
+ events,
377
+ chains: ["base"],
378
+ active: true,
379
+ createdAt: MockRemit._now(),
380
+ };
381
+ return Promise.resolve(wh);
382
+ }
383
+ requestTestnetFunds() {
384
+ this.#mock._credit(this.address, 100);
385
+ return Promise.resolve(mkTx());
386
+ }
387
+ // Override the #auth-based get calls to use mock state
388
+ getEscrow(invoiceId) {
389
+ return Promise.resolve(this.#mock.getEscrow(invoiceId));
390
+ }
391
+ getTab(tabId) {
392
+ return Promise.resolve(this.#mock.getTab(tabId));
393
+ }
394
+ getStream(streamId) {
395
+ return Promise.resolve(this.#mock.getStream(streamId));
396
+ }
397
+ getBounty(bountyId) {
398
+ return Promise.resolve(this.#mock.getBounty(bountyId));
399
+ }
400
+ getStatus(_wallet) {
401
+ return this.status();
402
+ }
403
+ getReputation(wallet) {
404
+ return Promise.resolve(this.#mock.getReputation(wallet));
405
+ }
406
+ }
407
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"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"}