@marigoldlabs/web3-tester 0.1.1 → 0.4.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.
Files changed (80) hide show
  1. package/.env.example +26 -17
  2. package/LICENSE +21 -0
  3. package/README.md +167 -41
  4. package/dist/anvil.d.ts +90 -2
  5. package/dist/anvil.d.ts.map +1 -1
  6. package/dist/anvil.js +215 -13
  7. package/dist/anvil.js.map +1 -1
  8. package/dist/contracts/test-erc20.d.ts +227 -0
  9. package/dist/contracts/test-erc20.d.ts.map +1 -0
  10. package/dist/contracts/test-erc20.js +8 -0
  11. package/dist/contracts/test-erc20.js.map +1 -0
  12. package/dist/erc20.d.ts +38 -0
  13. package/dist/erc20.d.ts.map +1 -0
  14. package/dist/erc20.js +229 -0
  15. package/dist/erc20.js.map +1 -0
  16. package/dist/fixtures.d.ts +44 -2
  17. package/dist/fixtures.d.ts.map +1 -1
  18. package/dist/fixtures.js +162 -17
  19. package/dist/fixtures.js.map +1 -1
  20. package/dist/index.d.ts +17 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +7 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/injected-provider.d.ts.map +1 -1
  25. package/dist/injected-provider.js +142 -79
  26. package/dist/injected-provider.js.map +1 -1
  27. package/dist/live-fixtures.d.ts +32 -3
  28. package/dist/live-fixtures.d.ts.map +1 -1
  29. package/dist/live-fixtures.js +64 -27
  30. package/dist/live-fixtures.js.map +1 -1
  31. package/dist/matchers.d.ts +90 -0
  32. package/dist/matchers.d.ts.map +1 -0
  33. package/dist/matchers.js +268 -0
  34. package/dist/matchers.js.map +1 -0
  35. package/dist/metamask-extension.d.ts +34 -0
  36. package/dist/metamask-extension.d.ts.map +1 -0
  37. package/dist/metamask-extension.js +97 -0
  38. package/dist/metamask-extension.js.map +1 -0
  39. package/dist/mock-wallet-controller.d.ts +205 -3
  40. package/dist/mock-wallet-controller.d.ts.map +1 -1
  41. package/dist/mock-wallet-controller.js +843 -46
  42. package/dist/mock-wallet-controller.js.map +1 -1
  43. package/dist/private-key-rpc-client.d.ts +1730 -0
  44. package/dist/private-key-rpc-client.d.ts.map +1 -1
  45. package/dist/private-key-rpc-client.js +105 -12
  46. package/dist/private-key-rpc-client.js.map +1 -1
  47. package/dist/real-wallet-cache.d.ts +65 -0
  48. package/dist/real-wallet-cache.d.ts.map +1 -0
  49. package/dist/real-wallet-cache.js +245 -0
  50. package/dist/real-wallet-cache.js.map +1 -0
  51. package/dist/real-wallet-fixtures.d.ts +52 -0
  52. package/dist/real-wallet-fixtures.d.ts.map +1 -0
  53. package/dist/real-wallet-fixtures.js +73 -0
  54. package/dist/real-wallet-fixtures.js.map +1 -0
  55. package/dist/real-wallet-setup.d.ts +4 -0
  56. package/dist/real-wallet-setup.d.ts.map +1 -0
  57. package/dist/real-wallet-setup.js +5 -0
  58. package/dist/real-wallet-setup.js.map +1 -0
  59. package/dist/real-wallet.d.ts +124 -15
  60. package/dist/real-wallet.d.ts.map +1 -1
  61. package/dist/real-wallet.js +1682 -138
  62. package/dist/real-wallet.js.map +1 -1
  63. package/dist/transactions.d.ts +118 -0
  64. package/dist/transactions.d.ts.map +1 -0
  65. package/dist/transactions.js +207 -0
  66. package/dist/transactions.js.map +1 -0
  67. package/dist/types.d.ts +1 -0
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/walletconnect.d.ts +206 -0
  70. package/dist/walletconnect.d.ts.map +1 -0
  71. package/dist/walletconnect.js +359 -0
  72. package/dist/walletconnect.js.map +1 -0
  73. package/examples/live-sepolia.spec.ts +21 -2
  74. package/examples/local-wallet.spec.ts +1 -1
  75. package/package.json +62 -6
  76. package/docs/API.md +0 -223
  77. package/docs/ARCHITECTURE.md +0 -81
  78. package/docs/CONSUMING_FROM_FJORD.md +0 -123
  79. package/docs/FJORD_LIVE_QA.md +0 -87
  80. package/docs/RELEASE_CHECKLIST.md +0 -55
@@ -1,17 +1,112 @@
1
1
  import type { Page } from '@playwright/test';
2
2
  import { type Address, type Hex } from 'viem';
3
- import type { RpcClient, WalletProviderInfo } from './types.js';
3
+ import type { JsonRpcRequest, RpcClient, WalletProviderInfo } from './types.js';
4
4
  export type RejectionRule = {
5
5
  methods?: readonly string[];
6
6
  message?: string;
7
7
  };
8
+ export type HeldRequest = {
9
+ method: string;
10
+ params: readonly unknown[];
11
+ approve: () => void;
12
+ reject: (message?: string) => void;
13
+ };
14
+ export type SentTransactionRecord = {
15
+ hash: Hex;
16
+ /** The wallet's active chain when the transaction was sent. */
17
+ chainId: Hex;
18
+ from?: Address;
19
+ to?: Hex;
20
+ data?: Hex;
21
+ value?: string;
22
+ };
23
+ /** A chain backend: any RpcClient, or an http(s) RPC URL string. */
24
+ export type ChainBackend = RpcClient | string;
25
+ export type AtomicCapabilityStatus = 'supported' | 'ready' | 'unsupported';
26
+ export type Eip5792Options = {
27
+ /** Master switch. false = legacy wallet: all four methods throw 4200. Default: true. */
28
+ enabled?: boolean;
29
+ /** Atomic capability advertised for backed chains. Default: 'supported'. */
30
+ atomic?: AtomicCapabilityStatus;
31
+ /** Extra/override capability objects merged per chain ('0x0' = cross-chain per spec). */
32
+ capabilities?: Record<Hex, Record<string, unknown>>;
33
+ /** Batches with more calls throw 5740. Default: 100. */
34
+ maxCallsPerBatch?: number;
35
+ };
36
+ export type CallsBatchRecord = {
37
+ id: Hex;
38
+ chainId: Hex;
39
+ from: Address;
40
+ version: '2.0.0';
41
+ /** Execution mode actually used (the spec requires it to reflect reality). */
42
+ atomic: boolean;
43
+ /** What the dapp requested. */
44
+ atomicRequired: boolean;
45
+ capabilities?: Record<string, unknown>;
46
+ calls: readonly {
47
+ to?: Hex;
48
+ data?: Hex;
49
+ value?: Hex;
50
+ }[];
51
+ /** Submitted hashes in call order (rolled-back hashes included). */
52
+ txHashes: readonly Hex[];
53
+ /**
54
+ * 'atomic-rollback': something landed and everything was reverted (500).
55
+ * 'nothing-landed': no call made it onchain (400). Otherwise the status is
56
+ * computed from receipts.
57
+ */
58
+ failure?: 'atomic-rollback' | 'nothing-landed';
59
+ };
60
+ export type HttpRpcClientOptions = {
61
+ /** Request timeout in ms. Defaults to viem's transport default (10s). */
62
+ timeout?: number;
63
+ /** Retry count. Defaults to 0 so dead endpoints fail deterministically. */
64
+ retryCount?: number;
65
+ };
66
+ /**
67
+ * Adapter: EIP-1193 RpcClient over a plain JSON-RPC URL (viem http
68
+ * transport). URL-backed chains serve reads, eth_sendRawTransaction, and
69
+ * dapp-side flows; node-side signing (personal_sign, eth_sendTransaction)
70
+ * needs a node that signs — back those chains with Anvil or a
71
+ * PrivateKeyRpcClient instead.
72
+ */
73
+ export declare function httpRpcClient(url: string, options?: HttpRpcClientOptions): RpcClient;
8
74
  export type MockWalletControllerOptions = {
9
75
  accounts: readonly Address[];
10
76
  chainId: number | Hex;
77
+ /**
78
+ * Additional chains the wallet can switch to, keyed by chain id (number or
79
+ * 0x-hex). The constructor's rpcClient remains the backend for `chainId`;
80
+ * listing `chainId` here too is a construction error. Forwarded calls
81
+ * route to the active chain's backend; a known-but-unbacked chain throws
82
+ * 4901 (EIP-1193 "Chain Disconnected").
83
+ */
84
+ chains?: Readonly<Record<number | Hex, ChainBackend>>;
85
+ /**
86
+ * Honor dapp-supplied rpcUrls[0] in wallet_addEthereumChain: the URL is
87
+ * probed (its eth_chainId must match, per EIP-3085) and registered as the
88
+ * chain's backend. Default false: the chain id is registered (so the
89
+ * 4902 -> add -> switch flow completes) but forwarded calls on it throw
90
+ * 4901 until a backend is registered via `chains` or addChain(). Never
91
+ * enable this for wallets fronting a real key.
92
+ */
93
+ trustDappRpcUrls?: boolean;
94
+ /**
95
+ * EIP-5792 support (wallet_getCapabilities/sendCalls/getCallsStatus/
96
+ * showCallsStatus). Enabled by default, like 2026 MetaMask; pass false for
97
+ * a legacy wallet that answers 4200.
98
+ */
99
+ eip5792?: boolean | Eip5792Options;
11
100
  providerInfo?: Partial<WalletProviderInfo>;
12
101
  additionalProviders?: readonly Partial<WalletProviderInfo>[];
13
102
  autoApprove?: boolean;
14
103
  connected?: boolean;
104
+ /**
105
+ * When set, only frames whose origin matches an entry (URL or origin
106
+ * string) can reach the wallet; everything else gets a 4100 error. Leave
107
+ * unset to serve every frame, like a real extension.
108
+ */
109
+ allowedOrigins?: readonly string[];
15
110
  };
16
111
  export declare class MockWalletController {
17
112
  private readonly page;
@@ -21,21 +116,128 @@ export declare class MockWalletController {
21
116
  private connected;
22
117
  private approveRequests;
23
118
  private rejectionQueue;
119
+ private holdQueue;
120
+ private approvalQueue;
121
+ private readonly knownChainIds;
122
+ private readonly chainBackends;
123
+ private readonly trustDappRpcUrls;
124
+ private readonly allowedOrigins?;
125
+ private readonly providerEventListeners;
126
+ private sendQueue;
127
+ private nodeAccountsCache?;
128
+ private readonly eip5792;
129
+ private atomicStatus;
130
+ private upgradeRejectionArmed;
131
+ private readonly callBatches;
132
+ /** Every accepted wallet_sendCalls batch, for test assertions. */
133
+ readonly sentCallBatches: CallsBatchRecord[];
134
+ /** Ids the page passed to wallet_showCallsStatus (a headless no-op). */
135
+ readonly shownCallsStatusIds: Hex[];
136
+ readonly sentTransactions: Hex[];
137
+ readonly sentTransactionRequests: SentTransactionRecord[];
24
138
  constructor(page: Page, rpcClient: RpcClient, options: MockWalletControllerOptions);
25
139
  readonly providerInfo: WalletProviderInfo;
26
140
  readonly providerInfos: readonly WalletProviderInfo[];
27
141
  get primaryAccount(): Address;
142
+ /** Current account list; index 0 is the selected account. */
143
+ get currentAccounts(): readonly Address[];
28
144
  get currentChainId(): Hex;
145
+ /** Chain ids that currently have an RPC backend, canonical hex. */
146
+ get backedChainIds(): readonly Hex[];
147
+ /**
148
+ * Test-side chain registration (Synpress addNetwork analogue): registers
149
+ * the backend and marks the chain known — no approval gate, no probe, and
150
+ * re-registration overwrites (tests may rewire).
151
+ */
152
+ addChain(chainId: number | Hex, backend: ChainBackend): void;
153
+ /**
154
+ * Dispatch a request arriving from a non-injected transport (e.g. a
155
+ * WalletConnect session). Approval gating applies exactly as for injected
156
+ * requests. When allowedOrigins is configured, `context.origin` is
157
+ * enforced; an absent origin counts as "null" and is refused.
158
+ * `bypassOriginCheck` is the deliberate opt-out for transports that cannot
159
+ * attest origins — approval gating still applies.
160
+ */
161
+ handleExternalRequest(request: JsonRpcRequest, context?: {
162
+ origin?: string;
163
+ bypassOriginCheck?: boolean;
164
+ }): Promise<unknown>;
165
+ /**
166
+ * Observe provider events (chainChanged, accountsChanged, connect,
167
+ * disconnect) node-side — the hook non-injected transports use to push
168
+ * session events. Dispatch is fire-and-forget; listener errors are
169
+ * swallowed. Returns an unsubscribe function.
170
+ */
171
+ onProviderEvent(listener: (event: string, payload: unknown) => void): () => void;
29
172
  injectMockProvider(): Promise<void>;
30
173
  autoApprove(enabled?: boolean): void;
174
+ /**
175
+ * One-shot: the next atomicRequired wallet_sendCalls while the atomic
176
+ * capability is 'ready' throws 5750 (user rejected the EOA upgrade)
177
+ * instead of upgrading to 'supported'.
178
+ */
179
+ simulateAtomicUpgradeRejection(): void;
180
+ /**
181
+ * Arms approval for the next matching request while autoApprove is off —
182
+ * the explicit per-call grant for real-key (live) wallets. Queued
183
+ * rejections and holds still take precedence.
184
+ *
185
+ * A grant without `match` approves whatever matching request arrives first
186
+ * and never expires, so any page script (including a third-party include on
187
+ * an allowed origin) can race the dapp for it. Pass `match` to bind the
188
+ * grant to the expected payload, or use holdNextRequest() to inspect the
189
+ * request before deciding.
190
+ */
191
+ approveNext(methods?: string | readonly string[], match?: (method: string, params: readonly unknown[]) => boolean): void;
31
192
  simulateRejection(methods?: string | readonly string[], message?: string): Promise<void>;
32
- setAccounts(accounts: readonly Address[]): Promise<void>;
193
+ /**
194
+ * Intercepts the next matching request and keeps it pending until the test
195
+ * approves or rejects it — for asserting "confirm in your wallet" UI states.
196
+ * Resolves once the page actually issues the request.
197
+ */
198
+ holdNextRequest(methods?: string | readonly string[]): Promise<HeldRequest>;
199
+ /**
200
+ * Resolves with the hash of the next transaction the page submits after
201
+ * this call. Invoke before triggering the dapp action, then await it.
202
+ */
203
+ waitForNextTransaction(options?: {
204
+ timeoutMs?: number;
205
+ }): Promise<Hex>;
206
+ /**
207
+ * Replaces the account set (and reconnects a disconnected wallet — unlike
208
+ * switchAccount, which only reorders). Accounts are validated against the
209
+ * backing node's eth_accounts; pass { allowUnknownAccounts: true } only
210
+ * for custom RpcClients whose account list the probe cannot see.
211
+ */
212
+ setAccounts(accounts: readonly Address[], options?: {
213
+ allowUnknownAccounts?: boolean;
214
+ }): Promise<void>;
215
+ /**
216
+ * Re-selects one of the wallet's existing accounts: moves it to index 0
217
+ * (MetaMask orders eth_accounts most-recently-selected first) and emits
218
+ * accountsChanged with the reordered array. No event when it is already
219
+ * selected, and — unlike setAccounts — no reconnect while disconnected:
220
+ * the reorder stays internal until the wallet reconnects.
221
+ */
222
+ switchAccount(address: Address): Promise<void>;
33
223
  disconnect(): Promise<void>;
34
224
  reconnect(): Promise<void>;
35
225
  switchNetwork(chainId: number | Hex): Promise<void>;
36
226
  private emit;
37
- private consumeRejection;
227
+ private clientForChain;
228
+ private get activeRpcClient();
229
+ private enqueueSend;
230
+ private assertEip5792Enabled;
231
+ private batchForId;
232
+ private handleSendCalls;
233
+ private executeBatch;
234
+ private buildCallsStatus;
235
+ private consumeRule;
236
+ private fetchNodeAccounts;
237
+ private assertAccountsKnownToNode;
238
+ private assertOriginAllowed;
38
239
  private assertUserApproved;
240
+ private permissionResponse;
39
241
  private handleRpcRequest;
40
242
  }
41
243
  //# sourceMappingURL=mock-wallet-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-wallet-controller.d.ts","sourceRoot":"","sources":["../src/mock-wallet-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAS,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAOrD,OAAO,KAAK,EAKV,SAAS,EACT,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C,mBAAmB,CAAC,EAAE,SAAS,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;IAC7D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAgDF,qBAAa,oBAAoB;IAQ7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,cAAc,CAAuB;gBAG1B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACrC,OAAO,EAAE,2BAA2B;IA2BtC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAEtD,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,IAAI,cAAc,IAAI,GAAG,CAExB;IAEK,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BzC,WAAW,CAAC,OAAO,UAAO,GAAG,IAAI;IAI3B,iBAAiB,CACrB,OAAO,GAAE,MAAM,GAAG,SAAS,MAAM,EAAyB,EAC1D,OAAO,SAA+B,GACrC,OAAO,CAAC,IAAI,CAAC;IAOV,WAAW,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAM1B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAK3C,IAAI;IAYlB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;YAWZ,gBAAgB;CAgF/B"}
1
+ {"version":3,"file":"mock-wallet-controller.d.ts","sourceRoot":"","sources":["../src/mock-wallet-controller.ts"],"names":[],"mappings":"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"}