@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.
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/a2a.d.ts +137 -0
- package/dist/a2a.d.ts.map +1 -0
- package/dist/a2a.js +121 -0
- package/dist/a2a.js.map +1 -0
- package/dist/client.d.ts +41 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +81 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +108 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +218 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +23 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +150 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +44 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +175 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/models/bounty.d.ts +22 -0
- package/dist/models/bounty.d.ts.map +1 -0
- package/dist/models/bounty.js +2 -0
- package/dist/models/bounty.js.map +1 -0
- package/dist/models/common.d.ts +78 -0
- package/dist/models/common.d.ts.map +1 -0
- package/dist/models/common.js +3 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/deposit.d.ts +13 -0
- package/dist/models/deposit.d.ts.map +1 -0
- package/dist/models/deposit.js +2 -0
- package/dist/models/deposit.js.map +1 -0
- package/dist/models/escrow.d.ts +16 -0
- package/dist/models/escrow.d.ts.map +1 -0
- package/dist/models/escrow.js +2 -0
- package/dist/models/escrow.js.map +1 -0
- package/dist/models/index.d.ts +9 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +9 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/invoice.d.ts +30 -0
- package/dist/models/invoice.d.ts.map +1 -0
- package/dist/models/invoice.js +2 -0
- package/dist/models/invoice.js.map +1 -0
- package/dist/models/reputation.d.ts +7 -0
- package/dist/models/reputation.d.ts.map +1 -0
- package/dist/models/reputation.js +2 -0
- package/dist/models/reputation.js.map +1 -0
- package/dist/models/stream.d.ts +15 -0
- package/dist/models/stream.d.ts.map +1 -0
- package/dist/models/stream.js +2 -0
- package/dist/models/stream.js.map +1 -0
- package/dist/models/tab.d.ts +21 -0
- package/dist/models/tab.d.ts.map +1 -0
- package/dist/models/tab.js +2 -0
- package/dist/models/tab.js.map +1 -0
- package/dist/provider.d.ts +135 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +218 -0
- package/dist/provider.js.map +1 -0
- package/dist/signer.d.ts +31 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +35 -0
- package/dist/signer.js.map +1 -0
- package/dist/testing/local.d.ts +31 -0
- package/dist/testing/local.d.ts.map +1 -0
- package/dist/testing/local.js +100 -0
- package/dist/testing/local.js.map +1 -0
- package/dist/testing/mock.d.ts +95 -0
- package/dist/testing/mock.d.ts.map +1 -0
- package/dist/testing/mock.js +407 -0
- package/dist/testing/mock.js.map +1 -0
- package/dist/wallet.d.ts +162 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +365 -0
- package/dist/wallet.js.map +1 -0
- package/dist/x402.d.ts +78 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +151 -0
- package/dist/x402.js.map +1 -0
- package/eslint.config.js +27 -0
- package/package.json +39 -0
- package/src/a2a.ts +241 -0
- package/src/client.ts +104 -0
- package/src/errors.ts +261 -0
- package/src/http.ts +190 -0
- package/src/index.ts +94 -0
- package/src/integrations/vercel-ai.ts +213 -0
- package/src/models/bounty.ts +23 -0
- package/src/models/common.ts +106 -0
- package/src/models/deposit.ts +13 -0
- package/src/models/escrow.ts +16 -0
- package/src/models/index.ts +8 -0
- package/src/models/invoice.ts +32 -0
- package/src/models/reputation.ts +7 -0
- package/src/models/stream.ts +15 -0
- package/src/models/tab.ts +22 -0
- package/src/provider.ts +281 -0
- package/src/signer.ts +70 -0
- package/src/testing/local.ts +118 -0
- package/src/testing/mock.ts +507 -0
- package/src/wallet.ts +546 -0
- package/src/x402.ts +202 -0
- package/tests/acceptance/bounty.test.ts +82 -0
- package/tests/acceptance/deposit.test.ts +70 -0
- package/tests/acceptance/direct.test.ts +53 -0
- package/tests/acceptance/escrow.test.ts +67 -0
- package/tests/acceptance/setup.ts +113 -0
- package/tests/acceptance/stream.test.ts +98 -0
- package/tests/acceptance/tab.test.ts +108 -0
- package/tests/acceptance/x402.test.ts +140 -0
- package/tests/compliance/auth.ts +69 -0
- package/tests/compliance/escrows.ts +96 -0
- package/tests/compliance/helpers.ts +90 -0
- package/tests/compliance/payments.ts +69 -0
- package/tests/compliance/tabs.ts +52 -0
- package/tests/test_a2a.ts +151 -0
- package/tests/test_errors.ts +80 -0
- package/tests/test_golden_vectors.ts +162 -0
- package/tests/test_integrations.ts +115 -0
- package/tests/test_mock.ts +217 -0
- package/tests/test_permit.ts +216 -0
- package/tests/test_provider.ts +304 -0
- package/tests/test_wallet.ts +108 -0
- package/tests/test_x402.ts +302 -0
- 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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"}
|