eip-1193 0.6.6 → 0.7.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/index.d.ts +1014 -246
- package/package.json +22 -2
package/index.d.ts
CHANGED
|
@@ -1,77 +1,219 @@
|
|
|
1
1
|
// ------------------------------------------------------------------------------------------------
|
|
2
|
-
//
|
|
2
|
+
// PRIMITIVES
|
|
3
3
|
// ------------------------------------------------------------------------------------------------
|
|
4
|
-
export type EIP1193DATA = `0x${string}`;
|
|
5
|
-
export type EIP1193BlockTag = EIP1193QUANTITY | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized';
|
|
6
|
-
|
|
7
|
-
export type EIP1193INTEGER = EIP1193DATA | number;
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Unformatted binary data, hex-encoded with a `0x` prefix.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: `EIP1193DATA` and `EIP1193QUANTITY` are the SAME structural type. The distinction is
|
|
9
|
+
* documentation only: TypeScript cannot tell them apart, so mislabelling one as the other is
|
|
10
|
+
* invisible to the compiler. That is exactly how several fields in this file drifted away from
|
|
11
|
+
* the spec in the past. `test-d/index.test-d.ts` exists to catch that drift by asserting against
|
|
12
|
+
* real payload shapes.
|
|
13
|
+
*/
|
|
14
|
+
export type EIP1193DATA = `0x${string}`;
|
|
18
15
|
|
|
16
|
+
/**
|
|
17
|
+
* An unsigned integer, hex-encoded with a `0x` prefix and no leading zeroes.
|
|
18
|
+
* See the note on {@link EIP1193DATA}: structurally identical, semantically different.
|
|
19
|
+
*/
|
|
19
20
|
export type EIP1193QUANTITY = `0x${string}`;
|
|
21
|
+
|
|
22
|
+
/** An EIP-155 chain id, hex-encoded per EIP-695. */
|
|
20
23
|
export type EIP1193ChainId = `0x${string}`;
|
|
24
|
+
|
|
25
|
+
/** A 20-byte address. */
|
|
21
26
|
export type EIP1193Account = `0x${string}`;
|
|
27
|
+
|
|
22
28
|
export type EIP1193Accounts = EIP1193Account[];
|
|
23
29
|
|
|
30
|
+
/** A list of addresses, e.g. as a log-filter constraint. Unrelated to owned accounts. */
|
|
31
|
+
export type EIP1193AddressList = EIP1193Account[];
|
|
32
|
+
|
|
33
|
+
export type EIP1193BlockTag = EIP1193QUANTITY | 'latest' | 'earliest' | 'pending' | 'safe' | 'finalized';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A block tag that also accepts a block hash.
|
|
37
|
+
*
|
|
38
|
+
* Two spellings are accepted in the wild:
|
|
39
|
+
* - the EIP-1898 object forms (`{blockHash, requireCanonical?}` / `{blockNumber}`)
|
|
40
|
+
* - a bare 32-byte block hash, which is what `execution-apis` now specifies
|
|
41
|
+
* (`BlockNumberOrTagOrHash`)
|
|
42
|
+
*
|
|
43
|
+
* The bare-hash form is already covered by `EIP1193QUANTITY`, since both are `0x${string}`.
|
|
44
|
+
*/
|
|
45
|
+
export type EIP1898BlockTag =
|
|
46
|
+
| EIP1193BlockTag
|
|
47
|
+
| EIP1193DATA // bare block hash, per `BlockNumberOrTagOrHash`
|
|
48
|
+
| {blockHash: EIP1193DATA; requireCanonical?: boolean} // EIP-1898
|
|
49
|
+
| {blockNumber: EIP1193QUANTITY}; // EIP-1898
|
|
50
|
+
|
|
51
|
+
// ------------------------------------------------------------------------------------------------
|
|
52
|
+
// FEES
|
|
53
|
+
// ------------------------------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Result of `eth_feeHistory`.
|
|
57
|
+
*
|
|
58
|
+
* `gasUsedRatio` / `blobGasUsedRatio` are raw JSON floats (`0.945886...`), NOT hex quantities.
|
|
59
|
+
* `reward` is only returned when `rewardPercentiles` was supplied in the request.
|
|
60
|
+
*/
|
|
24
61
|
export type EIP1193FeeHistory = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
62
|
+
/** Lowest numbered block of the returned range. */
|
|
63
|
+
oldestBlock: EIP1193QUANTITY;
|
|
64
|
+
/** One entry per returned block, PLUS one for the next block after the newest. */
|
|
65
|
+
baseFeePerGas: EIP1193QUANTITY[];
|
|
66
|
+
/** Ratio of gasUsed to gasLimit, as a float between 0 and 1. */
|
|
67
|
+
gasUsedRatio: number[];
|
|
68
|
+
/** EIP-4844. Same "+1 entry" rule as `baseFeePerGas`. Absent on pre-Cancun clients. */
|
|
69
|
+
baseFeePerBlobGas?: EIP1193QUANTITY[];
|
|
70
|
+
/** EIP-4844, as a float between 0 and 1. Absent on pre-Cancun clients. */
|
|
71
|
+
blobGasUsedRatio?: number[];
|
|
72
|
+
/** Only present when `rewardPercentiles` was passed. Outer array: blocks. Inner: percentiles. */
|
|
73
|
+
reward?: EIP1193QUANTITY[][];
|
|
29
74
|
};
|
|
30
75
|
|
|
31
|
-
|
|
32
|
-
|
|
76
|
+
// ------------------------------------------------------------------------------------------------
|
|
77
|
+
// ACCESS LISTS / AUTHORIZATIONS
|
|
78
|
+
// ------------------------------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
export type EIP1193AccessListEntry = {address: EIP1193Account; storageKeys: EIP1193DATA[]};
|
|
81
|
+
export type EIP1193AccessList = EIP1193AccessListEntry[];
|
|
82
|
+
|
|
83
|
+
/** A single EIP-7702 authorization tuple, as returned inside a type `0x4` transaction. */
|
|
84
|
+
export type EIP1193Authorization = {
|
|
85
|
+
chainId: EIP1193QUANTITY;
|
|
86
|
+
address: EIP1193Account;
|
|
87
|
+
nonce: EIP1193QUANTITY;
|
|
88
|
+
yParity: EIP1193QUANTITY;
|
|
89
|
+
r: EIP1193QUANTITY;
|
|
90
|
+
s: EIP1193QUANTITY;
|
|
91
|
+
};
|
|
92
|
+
export type EIP1193AuthorizationList = EIP1193Authorization[];
|
|
93
|
+
|
|
94
|
+
// ------------------------------------------------------------------------------------------------
|
|
95
|
+
// TRANSACTIONS (as returned by the node)
|
|
96
|
+
// ------------------------------------------------------------------------------------------------
|
|
97
|
+
|
|
98
|
+
/** Fields a node attaches to a transaction on top of the signed transaction itself. */
|
|
99
|
+
type EIP1193TransactionContext = {
|
|
100
|
+
/** `null` while the transaction is still pending. */
|
|
101
|
+
blockHash: EIP1193DATA | null;
|
|
102
|
+
/** `null` while the transaction is still pending. */
|
|
33
103
|
blockNumber: EIP1193QUANTITY | null;
|
|
104
|
+
/** `null` while the transaction is still pending. */
|
|
105
|
+
transactionIndex: EIP1193QUANTITY | null;
|
|
106
|
+
/**
|
|
107
|
+
* Timestamp of the block this transaction is in.
|
|
108
|
+
* Added to `TransactionInfo` by execution-apis; not emitted by every client yet, so treat
|
|
109
|
+
* `undefined` as "this node does not provide it" and fall back rather than defaulting to 0.
|
|
110
|
+
*/
|
|
111
|
+
blockTimestamp?: EIP1193QUANTITY;
|
|
112
|
+
hash: EIP1193DATA;
|
|
34
113
|
from: EIP1193Account;
|
|
114
|
+
/** `null` for a contract-creation transaction. */
|
|
115
|
+
to: EIP1193Account | null;
|
|
35
116
|
gas: EIP1193QUANTITY;
|
|
36
|
-
hash: EIP1193DATA;
|
|
37
117
|
input: EIP1193DATA;
|
|
38
118
|
nonce: EIP1193QUANTITY;
|
|
39
|
-
to: EIP1193Account | null;
|
|
40
|
-
transactionIndex: EIP1193QUANTITY | null;
|
|
41
119
|
value: EIP1193QUANTITY;
|
|
42
|
-
v: EIP1193QUANTITY;
|
|
43
120
|
r: EIP1193QUANTITY;
|
|
44
121
|
s: EIP1193QUANTITY;
|
|
45
122
|
};
|
|
46
123
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
124
|
+
/** Legacy (pre EIP-2718) signature: `v` carries the parity, EIP-155-encoded with the chain id. */
|
|
125
|
+
type EIP1193LegacySignature = {
|
|
126
|
+
v: EIP1193QUANTITY;
|
|
127
|
+
yParity?: never;
|
|
50
128
|
};
|
|
51
129
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
130
|
+
/** Typed-transaction signature: `yParity` is authoritative, `v` is a deprecated alias. */
|
|
131
|
+
type EIP1193TypedSignature = {
|
|
132
|
+
yParity: EIP1193QUANTITY;
|
|
133
|
+
/** @deprecated Provided for backwards compatibility. Use `yParity`. */
|
|
134
|
+
v?: EIP1193QUANTITY;
|
|
57
135
|
};
|
|
58
136
|
|
|
59
|
-
export type
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
137
|
+
export type EIP1193TransactionType0 = EIP1193TransactionContext &
|
|
138
|
+
EIP1193LegacySignature & {
|
|
139
|
+
/** Omitted by some clients for legacy transactions. */
|
|
140
|
+
type?: '0x0';
|
|
141
|
+
gasPrice: EIP1193QUANTITY;
|
|
142
|
+
/** Present only for EIP-155 replay-protected legacy transactions. */
|
|
143
|
+
chainId?: EIP1193ChainId;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/** EIP-2930 access-list transaction. */
|
|
147
|
+
export type EIP1193TransactionType1 = EIP1193TransactionContext &
|
|
148
|
+
EIP1193TypedSignature & {
|
|
149
|
+
type: '0x1';
|
|
150
|
+
chainId: EIP1193ChainId;
|
|
151
|
+
gasPrice: EIP1193QUANTITY;
|
|
152
|
+
accessList: EIP1193AccessList;
|
|
153
|
+
};
|
|
66
154
|
|
|
67
|
-
|
|
155
|
+
/** EIP-1559 fee-market transaction. */
|
|
156
|
+
export type EIP1193TransactionType2 = EIP1193TransactionContext &
|
|
157
|
+
EIP1193TypedSignature & {
|
|
158
|
+
type: '0x2';
|
|
159
|
+
chainId: EIP1193ChainId;
|
|
160
|
+
accessList: EIP1193AccessList;
|
|
161
|
+
maxFeePerGas: EIP1193QUANTITY;
|
|
162
|
+
maxPriorityFeePerGas: EIP1193QUANTITY;
|
|
163
|
+
/** @deprecated The effective gas price. Prefer `effectiveGasPrice` on the receipt. */
|
|
164
|
+
gasPrice?: EIP1193QUANTITY;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** EIP-4844 blob transaction. Cannot be a contract creation, so `to` is never `null`. */
|
|
168
|
+
export type EIP1193TransactionType3 = Omit<EIP1193TransactionContext, 'to'> &
|
|
169
|
+
EIP1193TypedSignature & {
|
|
170
|
+
type: '0x3';
|
|
171
|
+
to: EIP1193Account;
|
|
172
|
+
chainId: EIP1193ChainId;
|
|
173
|
+
accessList: EIP1193AccessList;
|
|
174
|
+
maxFeePerGas: EIP1193QUANTITY;
|
|
175
|
+
maxPriorityFeePerGas: EIP1193QUANTITY;
|
|
176
|
+
maxFeePerBlobGas: EIP1193QUANTITY;
|
|
177
|
+
blobVersionedHashes: EIP1193DATA[];
|
|
178
|
+
/** @deprecated The effective gas price. Prefer `effectiveGasPrice` on the receipt. */
|
|
179
|
+
gasPrice?: EIP1193QUANTITY;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/** EIP-7702 set-code transaction. Cannot be a contract creation, so `to` is never `null`. */
|
|
183
|
+
export type EIP1193TransactionType4 = Omit<EIP1193TransactionContext, 'to'> &
|
|
184
|
+
EIP1193TypedSignature & {
|
|
185
|
+
type: '0x4';
|
|
186
|
+
to: EIP1193Account;
|
|
187
|
+
chainId: EIP1193ChainId;
|
|
188
|
+
accessList: EIP1193AccessList;
|
|
189
|
+
maxFeePerGas: EIP1193QUANTITY;
|
|
190
|
+
maxPriorityFeePerGas: EIP1193QUANTITY;
|
|
191
|
+
authorizationList: EIP1193AuthorizationList;
|
|
192
|
+
/** @deprecated The effective gas price. Prefer `effectiveGasPrice` on the receipt. */
|
|
193
|
+
gasPrice?: EIP1193QUANTITY;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export type EIP1193Transaction =
|
|
197
|
+
| EIP1193TransactionType0
|
|
198
|
+
| EIP1193TransactionType1
|
|
199
|
+
| EIP1193TransactionType2
|
|
200
|
+
| EIP1193TransactionType3
|
|
201
|
+
| EIP1193TransactionType4;
|
|
202
|
+
|
|
203
|
+
// ------------------------------------------------------------------------------------------------
|
|
204
|
+
// TRANSACTIONS (as submitted by the caller)
|
|
205
|
+
// ------------------------------------------------------------------------------------------------
|
|
68
206
|
|
|
69
207
|
type BaseEIP1193TransactionData = {
|
|
70
208
|
from: EIP1193Account;
|
|
209
|
+
/** Omit for a contract creation. */
|
|
71
210
|
to?: EIP1193Account;
|
|
72
211
|
gas?: EIP1193QUANTITY;
|
|
73
212
|
value?: EIP1193QUANTITY;
|
|
213
|
+
/** The calldata. `execution-apis` names this field `input`; both spellings are accepted. */
|
|
74
214
|
data?: EIP1193DATA;
|
|
215
|
+
/** Alias of `data`, matching the `execution-apis` `GenericTransaction` schema. */
|
|
216
|
+
input?: EIP1193DATA;
|
|
75
217
|
nonce?: EIP1193QUANTITY;
|
|
76
218
|
};
|
|
77
219
|
|
|
@@ -87,9 +229,6 @@ export type EIP1193TransactionDataOfType1 = BaseEIP1193TransactionData & {
|
|
|
87
229
|
gasPrice?: EIP1193QUANTITY;
|
|
88
230
|
};
|
|
89
231
|
|
|
90
|
-
export type EIP1193AccessListEntry = {address: EIP1193Account; storageKeys: EIP1193DATA[]};
|
|
91
|
-
export type EIP1193AccessList = EIP1193AccessListEntry[];
|
|
92
|
-
|
|
93
232
|
export type EIP1193TransactionDataOfType2 = BaseEIP1193TransactionData & {
|
|
94
233
|
type: '0x2';
|
|
95
234
|
chainId?: EIP1193ChainId;
|
|
@@ -98,38 +237,172 @@ export type EIP1193TransactionDataOfType2 = BaseEIP1193TransactionData & {
|
|
|
98
237
|
maxPriorityFeePerGas?: EIP1193QUANTITY;
|
|
99
238
|
};
|
|
100
239
|
|
|
240
|
+
/** EIP-4844 blob transaction. */
|
|
241
|
+
export type EIP1193TransactionDataOfType3 = BaseEIP1193TransactionData & {
|
|
242
|
+
type: '0x3';
|
|
243
|
+
to: EIP1193Account;
|
|
244
|
+
chainId?: EIP1193ChainId;
|
|
245
|
+
accessList?: EIP1193AccessList;
|
|
246
|
+
maxFeePerGas?: EIP1193QUANTITY;
|
|
247
|
+
maxPriorityFeePerGas?: EIP1193QUANTITY;
|
|
248
|
+
maxFeePerBlobGas?: EIP1193QUANTITY;
|
|
249
|
+
blobVersionedHashes?: EIP1193DATA[];
|
|
250
|
+
blobs?: EIP1193DATA[];
|
|
251
|
+
commitments?: EIP1193DATA[];
|
|
252
|
+
proofs?: EIP1193DATA[];
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/** EIP-7702 set-code transaction. */
|
|
256
|
+
export type EIP1193TransactionDataOfType4 = BaseEIP1193TransactionData & {
|
|
257
|
+
type: '0x4';
|
|
258
|
+
to: EIP1193Account;
|
|
259
|
+
chainId?: EIP1193ChainId;
|
|
260
|
+
accessList?: EIP1193AccessList;
|
|
261
|
+
maxFeePerGas?: EIP1193QUANTITY;
|
|
262
|
+
maxPriorityFeePerGas?: EIP1193QUANTITY;
|
|
263
|
+
authorizationList?: EIP1193AuthorizationList;
|
|
264
|
+
};
|
|
265
|
+
|
|
101
266
|
export type EIP1193TransactionData =
|
|
102
267
|
| EIP1193LegacyTransactionData
|
|
103
268
|
| EIP1193TransactionDataOfType1
|
|
104
|
-
| EIP1193TransactionDataOfType2
|
|
269
|
+
| EIP1193TransactionDataOfType2
|
|
270
|
+
| EIP1193TransactionDataOfType3
|
|
271
|
+
| EIP1193TransactionDataOfType4;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* The `GenericTransaction` object accepted by `eth_call`, `eth_estimateGas` and
|
|
275
|
+
* `eth_createAccessList`. Every field is optional: a call with only `data` is a
|
|
276
|
+
* contract-creation simulation, and a call with only `to` is a plain read.
|
|
277
|
+
*/
|
|
278
|
+
export type EIP1193CallParam = {
|
|
279
|
+
type?: EIP1193QUANTITY;
|
|
280
|
+
nonce?: EIP1193QUANTITY;
|
|
281
|
+
from?: EIP1193Account;
|
|
282
|
+
to?: EIP1193Account | null;
|
|
283
|
+
gas?: EIP1193QUANTITY;
|
|
284
|
+
value?: EIP1193QUANTITY;
|
|
285
|
+
/** The calldata. `execution-apis` names this field `input`; both spellings are accepted. */
|
|
286
|
+
data?: EIP1193DATA;
|
|
287
|
+
/** Alias of `data`, matching the `execution-apis` `GenericTransaction` schema. */
|
|
288
|
+
input?: EIP1193DATA;
|
|
289
|
+
gasPrice?: EIP1193QUANTITY;
|
|
290
|
+
maxFeePerGas?: EIP1193QUANTITY;
|
|
291
|
+
maxPriorityFeePerGas?: EIP1193QUANTITY;
|
|
292
|
+
maxFeePerBlobGas?: EIP1193QUANTITY;
|
|
293
|
+
accessList?: EIP1193AccessList;
|
|
294
|
+
blobVersionedHashes?: EIP1193DATA[];
|
|
295
|
+
blobs?: EIP1193DATA[];
|
|
296
|
+
commitments?: EIP1193DATA[];
|
|
297
|
+
proofs?: EIP1193DATA[];
|
|
298
|
+
chainId?: EIP1193ChainId;
|
|
299
|
+
authorizationList?: EIP1193AuthorizationList;
|
|
300
|
+
};
|
|
105
301
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
302
|
+
/** Per-account entry of the `eth_call` / `eth_estimateGas` state override set. */
|
|
303
|
+
export type EIP1193AccountOverride = {
|
|
304
|
+
balance?: EIP1193QUANTITY;
|
|
305
|
+
nonce?: EIP1193QUANTITY;
|
|
306
|
+
code?: EIP1193DATA;
|
|
307
|
+
/** Replaces the account's entire storage. Mutually exclusive with `stateDiff`. */
|
|
308
|
+
state?: {[slot: EIP1193DATA]: EIP1193DATA};
|
|
309
|
+
/** Overrides individual slots. Mutually exclusive with `state`. */
|
|
310
|
+
stateDiff?: {[slot: EIP1193DATA]: EIP1193DATA};
|
|
311
|
+
movePrecompileToAddress?: EIP1193Account;
|
|
110
312
|
};
|
|
111
313
|
|
|
112
|
-
|
|
314
|
+
/**
|
|
315
|
+
* Optional third parameter of `eth_call` / `eth_estimateGas`.
|
|
316
|
+
* Not part of `execution-apis` yet, but implemented by go-ethereum, erigon, reth, anvil and hardhat.
|
|
317
|
+
*/
|
|
318
|
+
export type EIP1193StateOverride = {[address: EIP1193Account]: EIP1193AccountOverride};
|
|
319
|
+
|
|
320
|
+
// ------------------------------------------------------------------------------------------------
|
|
321
|
+
// BLOCKS
|
|
322
|
+
// ------------------------------------------------------------------------------------------------
|
|
323
|
+
|
|
324
|
+
export type EIP1193Withdrawal = {
|
|
325
|
+
index: EIP1193QUANTITY;
|
|
326
|
+
validatorIndex: EIP1193QUANTITY;
|
|
327
|
+
address: EIP1193Account;
|
|
328
|
+
amount: EIP1193QUANTITY;
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
/** A block header, i.e. a block without its body. This is what a `newHeads` subscription pushes. */
|
|
332
|
+
export type EIP1193BlockHeader = {
|
|
113
333
|
number: EIP1193QUANTITY;
|
|
114
334
|
hash: EIP1193DATA;
|
|
115
335
|
parentHash: EIP1193DATA;
|
|
116
336
|
nonce: EIP1193DATA;
|
|
337
|
+
mixHash: EIP1193DATA;
|
|
117
338
|
sha3Uncles: EIP1193DATA;
|
|
118
339
|
logsBloom: EIP1193DATA;
|
|
119
340
|
transactionsRoot: EIP1193DATA;
|
|
120
341
|
stateRoot: EIP1193DATA;
|
|
121
342
|
receiptsRoot: EIP1193DATA;
|
|
122
343
|
miner: EIP1193Account;
|
|
344
|
+
/** Always `0x0` after the merge, but still emitted by every client. */
|
|
123
345
|
difficulty: EIP1193QUANTITY;
|
|
124
|
-
|
|
346
|
+
/**
|
|
347
|
+
* @deprecated Removed from `execution-apis` and no longer emitted by go-ethereum (>= 1.14).
|
|
348
|
+
* Do not rely on it being present.
|
|
349
|
+
*/
|
|
350
|
+
totalDifficulty?: EIP1193QUANTITY;
|
|
125
351
|
extraData: EIP1193DATA;
|
|
126
|
-
size: EIP1193QUANTITY;
|
|
127
352
|
gasLimit: EIP1193QUANTITY;
|
|
128
353
|
gasUsed: EIP1193QUANTITY;
|
|
129
354
|
timestamp: EIP1193QUANTITY;
|
|
355
|
+
/** EIP-1559. Absent on pre-London blocks. */
|
|
356
|
+
baseFeePerGas?: EIP1193QUANTITY;
|
|
357
|
+
/** EIP-4895. Absent on pre-Shanghai blocks. */
|
|
358
|
+
withdrawalsRoot?: EIP1193DATA;
|
|
359
|
+
/** EIP-4844. Absent on pre-Cancun blocks. */
|
|
360
|
+
blobGasUsed?: EIP1193QUANTITY;
|
|
361
|
+
/** EIP-4844. Absent on pre-Cancun blocks. */
|
|
362
|
+
excessBlobGas?: EIP1193QUANTITY;
|
|
363
|
+
/** EIP-4788. Absent on pre-Cancun blocks. */
|
|
364
|
+
parentBeaconBlockRoot?: EIP1193DATA;
|
|
365
|
+
/** EIP-7685. Absent on pre-Prague blocks. */
|
|
366
|
+
requestsHash?: EIP1193DATA;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* A block as returned by `eth_getBlockByHash` / `eth_getBlockByNumber` with the hydrated flag
|
|
371
|
+
* set to `false` (or omitted): `transactions` is a list of transaction HASHES.
|
|
372
|
+
*/
|
|
373
|
+
export type EIP1193Block = EIP1193BlockHeader & {
|
|
374
|
+
size: EIP1193QUANTITY;
|
|
375
|
+
transactions: EIP1193DATA[];
|
|
130
376
|
uncles: EIP1193DATA[];
|
|
377
|
+
/** EIP-4895. Absent on pre-Shanghai blocks. */
|
|
378
|
+
withdrawals?: EIP1193Withdrawal[];
|
|
131
379
|
};
|
|
132
380
|
|
|
381
|
+
/**
|
|
382
|
+
* A block as returned with the hydrated flag set to `true`: `transactions` holds the full
|
|
383
|
+
* transaction objects.
|
|
384
|
+
*/
|
|
385
|
+
export type EIP1193BlockWithTransactions = Omit<EIP1193Block, 'transactions'> & {
|
|
386
|
+
transactions: EIP1193Transaction[];
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
type EIP1193PendingBlockOverrides = {
|
|
390
|
+
number: null;
|
|
391
|
+
hash: null;
|
|
392
|
+
nonce: null;
|
|
393
|
+
logsBloom: null;
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
export type EIP1193PendingBlock = Omit<EIP1193Block, keyof EIP1193PendingBlockOverrides> & EIP1193PendingBlockOverrides;
|
|
397
|
+
|
|
398
|
+
export type EIP1193PendingBlockWithTransactions = Omit<EIP1193PendingBlock, 'transactions'> & {
|
|
399
|
+
transactions: EIP1193Transaction[];
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
// ------------------------------------------------------------------------------------------------
|
|
403
|
+
// LOGS & RECEIPTS
|
|
404
|
+
// ------------------------------------------------------------------------------------------------
|
|
405
|
+
|
|
133
406
|
export type EIP1193Log = {
|
|
134
407
|
removed: boolean;
|
|
135
408
|
logIndex: EIP1193QUANTITY | null;
|
|
@@ -163,63 +436,170 @@ export type EIP1193TransactionReceipt = {
|
|
|
163
436
|
blockHash: EIP1193DATA;
|
|
164
437
|
blockNumber: EIP1193QUANTITY;
|
|
165
438
|
from: EIP1193Account;
|
|
166
|
-
|
|
439
|
+
/** `null` for a contract-creation transaction. */
|
|
440
|
+
to: EIP1193Account | null;
|
|
167
441
|
cumulativeGasUsed: EIP1193QUANTITY;
|
|
168
442
|
effectiveGasPrice: EIP1193QUANTITY;
|
|
169
443
|
gasUsed: EIP1193QUANTITY;
|
|
170
|
-
|
|
444
|
+
/** EIP-4844. Only present for blob transactions. */
|
|
445
|
+
blobGasUsed?: EIP1193QUANTITY;
|
|
446
|
+
/** EIP-4844. Only present for blob transactions. */
|
|
447
|
+
blobGasPrice?: EIP1193QUANTITY;
|
|
448
|
+
/** The address of the created contract, or `null` if this was not a contract creation. */
|
|
449
|
+
contractAddress: EIP1193Account | null;
|
|
171
450
|
logs: EIP1193Log[];
|
|
172
451
|
logsBloom: EIP1193DATA;
|
|
173
|
-
type:
|
|
174
|
-
|
|
452
|
+
type: EIP1193QUANTITY;
|
|
453
|
+
/**
|
|
454
|
+
* The post-transaction state root. Only present for transactions included BEFORE the
|
|
455
|
+
* Byzantium upgrade (2017), where it takes the place of `status`. Effectively never present
|
|
456
|
+
* on any chain in current use, which is why `status` is kept required here.
|
|
457
|
+
*/
|
|
458
|
+
root?: EIP1193DATA;
|
|
459
|
+
/** `0x1` on success, `0x0` on failure. Present since Byzantium. */
|
|
175
460
|
status: EIP1193QUANTITY;
|
|
176
461
|
};
|
|
177
462
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
463
|
+
/** The filter object accepted by `eth_getLogs`, `eth_newFilter` and `eth_subscribe('logs', ...)`. */
|
|
464
|
+
export type EIP1193LogsParam = {
|
|
465
|
+
fromBlock?: EIP1193BlockTag;
|
|
466
|
+
toBlock?: EIP1193BlockTag;
|
|
467
|
+
address?: EIP1193Account | EIP1193AddressList | null;
|
|
468
|
+
topics?: (EIP1193DATA | EIP1193DATA[] | null)[] | null;
|
|
469
|
+
/**
|
|
470
|
+
* Restricts the query to a single block. Mutually exclusive with `fromBlock`/`toBlock`.
|
|
471
|
+
*
|
|
472
|
+
* NOTE the casing: it is `blockHash`, not `blockhash`. Both `execution-apis` (`filter.yaml`)
|
|
473
|
+
* and go-ethereum (`FilterCriteria.UnmarshalJSON`) use camelCase.
|
|
474
|
+
*/
|
|
475
|
+
blockHash?: EIP1193DATA;
|
|
183
476
|
};
|
|
184
477
|
|
|
185
|
-
|
|
186
|
-
|
|
478
|
+
// ------------------------------------------------------------------------------------------------
|
|
479
|
+
// PROOFS & SYNC
|
|
480
|
+
// ------------------------------------------------------------------------------------------------
|
|
481
|
+
|
|
482
|
+
export type EIP1193StorageProof = {
|
|
483
|
+
key: EIP1193DATA;
|
|
484
|
+
value: EIP1193QUANTITY;
|
|
485
|
+
proof: EIP1193DATA[];
|
|
187
486
|
};
|
|
188
487
|
|
|
189
|
-
export type
|
|
190
|
-
|
|
488
|
+
export type EIP1193AccountProof = {
|
|
489
|
+
address: EIP1193Account;
|
|
490
|
+
accountProof: EIP1193DATA[];
|
|
491
|
+
balance: EIP1193QUANTITY;
|
|
492
|
+
codeHash: EIP1193DATA;
|
|
493
|
+
nonce: EIP1193QUANTITY;
|
|
494
|
+
storageHash: EIP1193DATA;
|
|
495
|
+
storageProof: EIP1193StorageProof[];
|
|
191
496
|
};
|
|
192
497
|
|
|
193
|
-
type
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
data?: EIP1193DATA;
|
|
198
|
-
nonce?: EIP1193QUANTITY;
|
|
498
|
+
export type EIP1193SyncingStatus = {
|
|
499
|
+
startingBlock: EIP1193QUANTITY;
|
|
500
|
+
currentBlock: EIP1193QUANTITY;
|
|
501
|
+
highestBlock: EIP1193QUANTITY;
|
|
199
502
|
};
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Payload pushed by a `syncing` subscription.
|
|
506
|
+
*
|
|
507
|
+
* NOTE: unlike the `eth_syncing` RESULT, go-ethereum pushes plain JSON numbers here, not hex
|
|
508
|
+
* quantities. That asymmetry is in the client, not a mistake in these types.
|
|
509
|
+
*/
|
|
510
|
+
export type EIP1193SyncingSubscriptionStatus = {
|
|
511
|
+
syncing: boolean;
|
|
512
|
+
status: {
|
|
513
|
+
startingBlock: number;
|
|
514
|
+
currentBlock: number;
|
|
515
|
+
highestBlock: number;
|
|
516
|
+
pulledStates: number;
|
|
517
|
+
knownStates: number;
|
|
518
|
+
};
|
|
203
519
|
};
|
|
204
520
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
521
|
+
// ------------------------------------------------------------------------------------------------
|
|
522
|
+
// TRACING
|
|
523
|
+
// ------------------------------------------------------------------------------------------------
|
|
524
|
+
|
|
525
|
+
export type EIP1193StructLog = {
|
|
526
|
+
pc: number;
|
|
527
|
+
op: string;
|
|
528
|
+
gas: number;
|
|
529
|
+
gasCost: number;
|
|
530
|
+
depth: number;
|
|
531
|
+
error?: string;
|
|
532
|
+
stack?: EIP1193DATA[];
|
|
533
|
+
memory?: EIP1193DATA[];
|
|
534
|
+
storage?: {[slot: string]: EIP1193DATA};
|
|
535
|
+
refund?: number;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
export type EIP1193TracedTransaction = {
|
|
539
|
+
failed: boolean;
|
|
540
|
+
gas: number;
|
|
541
|
+
returnValue: string;
|
|
542
|
+
structLogs: EIP1193StructLog[];
|
|
208
543
|
};
|
|
209
544
|
|
|
210
|
-
export type
|
|
211
|
-
|
|
212
|
-
|
|
545
|
+
export type EIP1193TraceConfig = {
|
|
546
|
+
tracer?: string;
|
|
547
|
+
tracerConfig?: {[key: string]: unknown};
|
|
548
|
+
timeout?: string;
|
|
549
|
+
disableStack?: boolean;
|
|
550
|
+
disableStorage?: boolean;
|
|
551
|
+
enableMemory?: boolean;
|
|
552
|
+
enableReturnData?: boolean;
|
|
553
|
+
};
|
|
213
554
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
555
|
+
// ------------------------------------------------------------------------------------------------
|
|
556
|
+
// SIGNING
|
|
557
|
+
// ------------------------------------------------------------------------------------------------
|
|
558
|
+
|
|
559
|
+
export type EIP712TypedDataField = {name: string; type: string};
|
|
560
|
+
|
|
561
|
+
export type EIP712Domain = {
|
|
562
|
+
name?: string;
|
|
563
|
+
version?: string;
|
|
564
|
+
chainId?: number | EIP1193ChainId;
|
|
565
|
+
verifyingContract?: EIP1193Account;
|
|
566
|
+
salt?: EIP1193DATA;
|
|
221
567
|
};
|
|
222
568
|
|
|
569
|
+
/** An EIP-712 typed-data payload, as passed to `eth_signTypedData_v4`. */
|
|
570
|
+
export type EIP1193TypedData = {
|
|
571
|
+
types: {[typeName: string]: EIP712TypedDataField[]};
|
|
572
|
+
primaryType: string;
|
|
573
|
+
domain: EIP712Domain;
|
|
574
|
+
message: {[field: string]: any};
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* The typed-data parameter of `eth_signTypedData_v3` / `eth_signTypedData_v4`.
|
|
579
|
+
*
|
|
580
|
+
* MetaMask's canonical form is a JSON STRING (`JSON.stringify(typedData)`); other wallets and
|
|
581
|
+
* most libraries accept the object directly. Both are allowed here.
|
|
582
|
+
*/
|
|
583
|
+
export type EIP1193TypedSignatureParam = EIP1193TypedData | string;
|
|
584
|
+
|
|
585
|
+
/** A single field of the legacy V1 `eth_signTypedData` payload. */
|
|
586
|
+
export type EIP1193TypedDataV1Field = {
|
|
587
|
+
name: string;
|
|
588
|
+
type: string;
|
|
589
|
+
value: any;
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* The legacy V1 `eth_signTypedData` payload: a flat ARRAY of fields, not an EIP-712 object.
|
|
594
|
+
* Note that V1 also takes its parameters in the opposite order to v3/v4.
|
|
595
|
+
*/
|
|
596
|
+
export type EIP1193TypedDataV1 = EIP1193TypedDataV1Field[];
|
|
597
|
+
|
|
598
|
+
// ------------------------------------------------------------------------------------------------
|
|
599
|
+
// WALLET METHOD PARAMS (EIP-3085 / 3326 / 747 / 2255 / 5792)
|
|
600
|
+
// ------------------------------------------------------------------------------------------------
|
|
601
|
+
|
|
602
|
+
/** EIP-3085. Only `chainId` is required by the EIP, but wallets in practice require more. */
|
|
223
603
|
export type EIP1193AddChainParam = {
|
|
224
604
|
chainId: EIP1193ChainId;
|
|
225
605
|
rpcUrls?: string[];
|
|
@@ -233,93 +613,287 @@ export type EIP1193AddChainParam = {
|
|
|
233
613
|
};
|
|
234
614
|
};
|
|
235
615
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
616
|
+
/** EIP-3326. */
|
|
617
|
+
export type EIP1193SwitchChainParam = {chainId: EIP1193ChainId};
|
|
618
|
+
|
|
619
|
+
/** EIP-747. `type` is open-ended by design; the three below are what wallets ship today. */
|
|
620
|
+
export type EIP1193WatchAssetParam = {
|
|
621
|
+
type: 'ERC20' | 'ERC721' | 'ERC1155' | (string & {});
|
|
622
|
+
options: {
|
|
623
|
+
address: EIP1193Account;
|
|
624
|
+
symbol?: string;
|
|
625
|
+
decimals?: number;
|
|
626
|
+
image?: string;
|
|
627
|
+
tokenId?: string;
|
|
628
|
+
chainId?: number;
|
|
629
|
+
};
|
|
242
630
|
};
|
|
243
631
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
returnValue: EIP1193DATA;
|
|
248
|
-
structLogs: any[]; // TODO
|
|
249
|
-
// TODO more
|
|
632
|
+
/** EIP-2255 permission request: `{[methodName]: {[caveatName]: value}}`. */
|
|
633
|
+
export type EIP1193PermissionRequest = {
|
|
634
|
+
[methodName: string]: {[caveatName: string]: any};
|
|
250
635
|
};
|
|
251
636
|
|
|
252
|
-
export type
|
|
637
|
+
export type EIP1193Caveat = {
|
|
638
|
+
type: string;
|
|
639
|
+
value: any;
|
|
640
|
+
};
|
|
253
641
|
|
|
254
|
-
|
|
642
|
+
/** EIP-2255 permission, as returned by `wallet_getPermissions`. */
|
|
643
|
+
export type EIP1193Permission = {
|
|
644
|
+
invoker: string;
|
|
645
|
+
parentCapability: string;
|
|
646
|
+
caveats: EIP1193Caveat[];
|
|
647
|
+
date?: number;
|
|
648
|
+
};
|
|
255
649
|
|
|
256
|
-
|
|
257
|
-
|
|
650
|
+
/** EIP-2255 permission, as returned by `wallet_requestPermissions`. */
|
|
651
|
+
export type EIP1193RequestedPermission = {
|
|
652
|
+
parentCapability: string;
|
|
653
|
+
date?: number;
|
|
258
654
|
};
|
|
259
655
|
|
|
260
|
-
|
|
261
|
-
|
|
656
|
+
/** EIP-5792 capability entry. `optional: true` lets a wallet ignore one it does not support. */
|
|
657
|
+
export type EIP1193Capability = {
|
|
658
|
+
optional?: boolean;
|
|
659
|
+
[key: string]: unknown;
|
|
262
660
|
};
|
|
263
661
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
662
|
+
/** EIP-5792 `wallet_sendCalls` parameter. */
|
|
663
|
+
export type EIP1193SendCallsParam = {
|
|
664
|
+
version: string;
|
|
665
|
+
id?: string;
|
|
666
|
+
from?: EIP1193Account;
|
|
667
|
+
chainId: EIP1193ChainId;
|
|
668
|
+
atomicRequired: boolean;
|
|
669
|
+
calls: {
|
|
670
|
+
to?: EIP1193Account;
|
|
671
|
+
data?: EIP1193DATA;
|
|
672
|
+
value?: EIP1193QUANTITY;
|
|
673
|
+
capabilities?: {[name: string]: EIP1193Capability};
|
|
674
|
+
}[];
|
|
675
|
+
capabilities?: {[name: string]: EIP1193Capability};
|
|
676
|
+
};
|
|
677
|
+
|
|
678
|
+
export type EIP1193SendCallsResult = {
|
|
679
|
+
id: string;
|
|
680
|
+
capabilities?: {[name: string]: any};
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* EIP-5792 batch status codes.
|
|
685
|
+
* 100 pending, 200 confirmed, 400 offchain failure, 500 fully reverted, 600 partially reverted.
|
|
686
|
+
*/
|
|
687
|
+
export type EIP1193CallsStatusCode = 100 | 200 | 400 | 500 | 600 | (number & {});
|
|
688
|
+
|
|
689
|
+
export type EIP1193CallsStatus = {
|
|
690
|
+
version: string;
|
|
691
|
+
id: EIP1193DATA;
|
|
692
|
+
chainId: EIP1193ChainId;
|
|
693
|
+
status: EIP1193CallsStatusCode;
|
|
694
|
+
atomic: boolean;
|
|
695
|
+
/** A strict subset of `eth_getTransactionReceipt`, restricted to the submitted calls. */
|
|
696
|
+
receipts?: {
|
|
697
|
+
logs: {address: EIP1193Account; data: EIP1193DATA; topics: EIP1193DATA[]}[];
|
|
698
|
+
status: EIP1193QUANTITY;
|
|
699
|
+
blockHash: EIP1193DATA;
|
|
700
|
+
blockNumber: EIP1193QUANTITY;
|
|
701
|
+
gasUsed: EIP1193QUANTITY;
|
|
702
|
+
transactionHash: EIP1193DATA;
|
|
703
|
+
}[];
|
|
704
|
+
capabilities?: {[name: string]: any};
|
|
705
|
+
};
|
|
272
706
|
|
|
273
|
-
|
|
707
|
+
/** EIP-5792 `wallet_getCapabilities` result, keyed by chain id. */
|
|
708
|
+
export type EIP1193Capabilities = {[chainId: EIP1193ChainId]: {[name: string]: any}};
|
|
274
709
|
|
|
275
710
|
// ------------------------------------------------------------------------------------------------
|
|
276
|
-
//
|
|
711
|
+
// ERRORS
|
|
277
712
|
// ------------------------------------------------------------------------------------------------
|
|
278
713
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
714
|
+
/** EIP-1193 provider error codes. */
|
|
715
|
+
export type EIP1193ProviderErrorCode =
|
|
716
|
+
/** The user rejected the request. */
|
|
717
|
+
| 4001
|
|
718
|
+
/** The requested method and/or account has not been authorized by the user. */
|
|
719
|
+
| 4100
|
|
720
|
+
/** The Provider does not support the requested method. */
|
|
721
|
+
| 4200
|
|
722
|
+
/** The Provider is disconnected from all chains. */
|
|
723
|
+
| 4900
|
|
724
|
+
/** The Provider is not connected to the requested chain. */
|
|
725
|
+
| 4901;
|
|
726
|
+
|
|
727
|
+
/** JSON-RPC 2.0 and EIP-1474 error codes. */
|
|
728
|
+
export type EIP1193RpcErrorCode =
|
|
729
|
+
| -32700 // Parse error
|
|
730
|
+
| -32600 // Invalid request
|
|
731
|
+
| -32601 // Method not found
|
|
732
|
+
| -32602 // Invalid params
|
|
733
|
+
| -32603 // Internal error
|
|
734
|
+
| -32000 // Invalid input
|
|
735
|
+
| -32001 // Resource not found
|
|
736
|
+
| -32002 // Resource unavailable (MetaMask: a request is already pending)
|
|
737
|
+
| -32003 // Transaction rejected
|
|
738
|
+
| -32004 // Method not supported
|
|
739
|
+
| -32005 // Limit exceeded
|
|
740
|
+
| -32006 // JSON-RPC version not supported
|
|
741
|
+
| 3; // Execution reverted; the raw revert data is in `data`
|
|
742
|
+
|
|
743
|
+
export type EIP1193ErrorCode = EIP1193ProviderErrorCode | EIP1193RpcErrorCode;
|
|
285
744
|
|
|
286
|
-
export
|
|
745
|
+
export interface EIP1193ProviderRpcError extends Error {
|
|
746
|
+
/** `EIP1193ErrorCode` lists the standardized values; any integer is legal. */
|
|
747
|
+
code: EIP1193ErrorCode | (number & {});
|
|
748
|
+
data?: unknown;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/**
|
|
752
|
+
* @deprecated `wallet_addEthereumChain` resolves with `null` and THROWS on failure (EIP-3085),
|
|
753
|
+
* so there is no error-shaped result to type. Catch an {@link EIP1193ProviderRpcError} instead.
|
|
754
|
+
*/
|
|
755
|
+
export type EIP1193AddChainError = EIP1193ProviderRpcError;
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* @deprecated `wallet_switchEthereumChain` resolves with `null` and THROWS on failure (EIP-3326),
|
|
759
|
+
* so there is no error-shaped result to type. Catch an {@link EIP1193ProviderRpcError} instead.
|
|
760
|
+
*/
|
|
761
|
+
export type EIP1193SwitchChainError = EIP1193ProviderRpcError;
|
|
762
|
+
|
|
763
|
+
// ------------------------------------------------------------------------------------------------
|
|
764
|
+
// EVENTS
|
|
765
|
+
// ------------------------------------------------------------------------------------------------
|
|
766
|
+
|
|
767
|
+
export interface EIP1193ConnectInfoMessage {
|
|
768
|
+
readonly chainId: EIP1193ChainId;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
/** Payloads a subscription can push, depending on the subscription kind. */
|
|
772
|
+
export type EIP1193SubscriptionResult =
|
|
773
|
+
| EIP1193BlockHeader // newHeads
|
|
774
|
+
| EIP1193Log // logs
|
|
775
|
+
| EIP1193DATA // newPendingTransactions (hash form)
|
|
776
|
+
| EIP1193Transaction // newPendingTransactions (full form)
|
|
777
|
+
| EIP1193TransactionReceipt[] // transactionReceipts
|
|
778
|
+
| EIP1193SyncingSubscriptionStatus; // syncing
|
|
779
|
+
|
|
780
|
+
/** The `eth_subscription` message, the only `message` payload standardized by EIP-1193. */
|
|
781
|
+
export type EIP1193SubscriptionMessage = {
|
|
782
|
+
readonly type: 'eth_subscription';
|
|
783
|
+
readonly data: {
|
|
784
|
+
readonly subscription: EIP1193DATA;
|
|
785
|
+
readonly result: EIP1193SubscriptionResult;
|
|
786
|
+
};
|
|
787
|
+
};
|
|
788
|
+
|
|
789
|
+
/** Any other, non-standard message a provider may choose to emit. */
|
|
790
|
+
export type EIP1193UnknownMessage = {
|
|
791
|
+
readonly type: string;
|
|
792
|
+
readonly data: unknown;
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
/**
|
|
796
|
+
* The `message` event payload.
|
|
797
|
+
*
|
|
798
|
+
* This is deliberately NOT `EIP1193SubscriptionMessage | EIP1193UnknownMessage`. A union member
|
|
799
|
+
* typed `{type: string; data: unknown}` absorbs the literal member, so
|
|
800
|
+
* `if (m.type === 'eth_subscription')` would leave `m.data` as `unknown` and the discriminated
|
|
801
|
+
* union would buy you nothing. `eth_subscription` is the only standardized type, so it is the
|
|
802
|
+
* default here.
|
|
803
|
+
*
|
|
804
|
+
* If your provider emits non-standard message types, widen at the call site. That is allowed,
|
|
805
|
+
* because a listener accepting a wider parameter is assignable to a narrower listener:
|
|
806
|
+
*
|
|
807
|
+
* provider.on('message', (m: EIP1193AnyMessage) => { ... });
|
|
808
|
+
*/
|
|
809
|
+
export type EIP1193Message = EIP1193SubscriptionMessage;
|
|
810
|
+
|
|
811
|
+
/** The honest, unnarrowable union. Opt in when you need to handle non-standard messages. */
|
|
812
|
+
export type EIP1193AnyMessage = EIP1193SubscriptionMessage | EIP1193UnknownMessage;
|
|
813
|
+
|
|
814
|
+
/** @deprecated Renamed to {@link EIP1193SubscriptionMessage}. */
|
|
815
|
+
export type EIP1193KnownSubscriptionMessage = EIP1193SubscriptionMessage;
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* @deprecated Renamed to {@link EIP1193SubscriptionMessage}. The previous "known" / "unknown"
|
|
819
|
+
* split described the same `eth_subscription` shape twice and never narrowed.
|
|
820
|
+
*/
|
|
821
|
+
export type EIP1193UnknownSubscriptionMessage = EIP1193SubscriptionMessage;
|
|
822
|
+
|
|
823
|
+
/** The return value of a listener is ignored by the provider. */
|
|
824
|
+
type Listener<Message> = (message: Message) => unknown;
|
|
825
|
+
|
|
826
|
+
// ------------------------------------------------------------------------------------------------
|
|
827
|
+
// METHOD GROUPS
|
|
828
|
+
// ------------------------------------------------------------------------------------------------
|
|
829
|
+
//
|
|
830
|
+
// Groups are split by WHO can serve a method, so a provider type never claims a method its
|
|
831
|
+
// implementation does not have:
|
|
832
|
+
//
|
|
833
|
+
// ClientMethods - client/network identity. Browser wallets AND nodes.
|
|
834
|
+
// ReadMethods - chain reads. Browser wallets AND nodes.
|
|
835
|
+
// WriteMethods - raw submission. Browser wallets AND nodes.
|
|
836
|
+
// SignerMethods - anything needing a key. Wallets, and nodes with unlocked accounts.
|
|
837
|
+
// ConnectedAccountMethods - needs a key AND a currently selected account.
|
|
838
|
+
// WalletOnlyMethods - the wallet-namespaced UX methods. Browser wallets only.
|
|
839
|
+
// NodeOnlyReadMethods - node introspection and heavy reads. JSON-RPC endpoints only.
|
|
840
|
+
// FilterMethods - poll-based log filters. Stateful transports.
|
|
841
|
+
// SubscriptionMethods - push subscriptions. Browser wallets AND WS/IPC nodes, but NOT
|
|
842
|
+
// plain HTTP endpoints.
|
|
843
|
+
// LegacyNodeMethods - pre-merge leftovers, removed from execution-apis.
|
|
844
|
+
// DebugOnlyMethods - the debug namespace.
|
|
845
|
+
//
|
|
846
|
+
// ------------------------------------------------------------------------------------------------
|
|
847
|
+
|
|
848
|
+
/** Client and network identity. Served by browser wallets as well as nodes. */
|
|
849
|
+
export type ClientMethods = {
|
|
850
|
+
eth_chainId: {result: EIP1193ChainId};
|
|
851
|
+
/**
|
|
852
|
+
* The network id as a DECIMAL string (`'1'`), NOT a hex quantity.
|
|
853
|
+
* `execution-apis` types this as `uintDecimal`.
|
|
854
|
+
*/
|
|
855
|
+
net_version: {result: string};
|
|
287
856
|
web3_clientVersion: {result: string};
|
|
288
|
-
|
|
289
|
-
net_version: {result: EIP1193ChainId};
|
|
290
|
-
net_listening: {result: boolean};
|
|
291
|
-
net_peerCount: {result: EIP1193QUANTITY};
|
|
292
|
-
eth_protocolVersion: {result: string};
|
|
293
|
-
eth_syncing: {result: EIP1193SyncingStatus | false};
|
|
294
|
-
eth_coinbase: {result: EIP1193Account};
|
|
295
|
-
eth_mining: {result: boolean}; // TODO check
|
|
296
|
-
eth_hashrate: {result: unknown}; // TODO
|
|
857
|
+
web3_sha3: {params: [EIP1193DATA]; result: EIP1193DATA};
|
|
297
858
|
};
|
|
298
859
|
|
|
860
|
+
/** Chain reads available on both a browser wallet and a plain JSON-RPC endpoint. */
|
|
299
861
|
export type ReadMethods = {
|
|
300
|
-
eth_gasPrice: {result: EIP1193QUANTITY};
|
|
301
|
-
|
|
302
862
|
eth_blockNumber: {result: EIP1193QUANTITY};
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
863
|
+
|
|
864
|
+
eth_gasPrice: {result: EIP1193QUANTITY};
|
|
865
|
+
eth_maxPriorityFeePerGas: {result: EIP1193QUANTITY};
|
|
866
|
+
/** EIP-4844. */
|
|
867
|
+
eth_blobBaseFee: {result: EIP1193QUANTITY};
|
|
868
|
+
eth_feeHistory: {
|
|
869
|
+
params: [blockCount: EIP1193QUANTITY, newestBlock: EIP1193BlockTag, rewardPercentiles: number[]];
|
|
870
|
+
result: EIP1193FeeHistory;
|
|
307
871
|
};
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
eth_estimateGas: {params: [EIP1193CallParam
|
|
872
|
+
|
|
873
|
+
eth_getBalance: {params: [EIP1193Account, EIP1898BlockTag?]; result: EIP1193QUANTITY};
|
|
874
|
+
eth_getCode: {params: [EIP1193Account, EIP1898BlockTag?]; result: EIP1193DATA};
|
|
875
|
+
eth_getStorageAt: {params: [EIP1193Account, EIP1193DATA, EIP1898BlockTag?]; result: EIP1193DATA};
|
|
876
|
+
eth_getTransactionCount: {params: [EIP1193Account, EIP1898BlockTag?]; result: EIP1193QUANTITY};
|
|
877
|
+
|
|
878
|
+
eth_call: {params: [EIP1193CallParam, EIP1898BlockTag?, EIP1193StateOverride?]; result: EIP1193DATA};
|
|
879
|
+
/** Note: unlike `eth_call`, the block parameter here does NOT accept a block hash. */
|
|
880
|
+
eth_estimateGas: {params: [EIP1193CallParam, EIP1193BlockTag?, EIP1193StateOverride?]; result: EIP1193QUANTITY};
|
|
881
|
+
|
|
882
|
+
/**
|
|
883
|
+
* The second parameter selects the shape of the result, so these are two separate call
|
|
884
|
+
* signatures rather than one signature returning a union. Pass a LITERAL `true` / `false`
|
|
885
|
+
* (a value of type `boolean` cannot be narrowed and will not match either signature).
|
|
886
|
+
*/
|
|
317
887
|
eth_getBlockByHash:
|
|
318
|
-
| {params: [EIP1193DATA,
|
|
319
|
-
| {params: [EIP1193DATA,
|
|
888
|
+
| {params: [EIP1193DATA, false?]; result: EIP1193Block | null}
|
|
889
|
+
| {params: [EIP1193DATA, true]; result: EIP1193BlockWithTransactions | null};
|
|
320
890
|
eth_getBlockByNumber:
|
|
321
|
-
| {params: [EIP1193BlockTag,
|
|
322
|
-
| {params: [EIP1193BlockTag,
|
|
891
|
+
| {params: [EIP1193BlockTag, false?]; result: EIP1193Block | null}
|
|
892
|
+
| {params: [EIP1193BlockTag, true]; result: EIP1193BlockWithTransactions | null};
|
|
893
|
+
|
|
894
|
+
eth_getBlockTransactionCountByHash: {params: [EIP1193DATA]; result: EIP1193QUANTITY | null};
|
|
895
|
+
eth_getBlockTransactionCountByNumber: {params: [EIP1193BlockTag]; result: EIP1193QUANTITY | null};
|
|
896
|
+
|
|
323
897
|
eth_getTransactionByHash: {params: [EIP1193DATA]; result: EIP1193Transaction | null};
|
|
324
898
|
eth_getTransactionByBlockHashAndIndex: {params: [EIP1193DATA, EIP1193QUANTITY]; result: EIP1193Transaction | null};
|
|
325
899
|
eth_getTransactionByBlockNumberAndIndex: {
|
|
@@ -328,116 +902,233 @@ export type ReadMethods = {
|
|
|
328
902
|
};
|
|
329
903
|
|
|
330
904
|
eth_getTransactionReceipt: {params: [EIP1193DATA]; result: EIP1193TransactionReceipt | null};
|
|
331
|
-
|
|
332
|
-
|
|
905
|
+
eth_getBlockReceipts: {params: [EIP1898BlockTag]; result: EIP1193TransactionReceipt[] | null};
|
|
906
|
+
|
|
333
907
|
eth_getLogs: {params: [EIP1193LogsParam]; result: EIP1193Log[]};
|
|
334
|
-
|
|
908
|
+
};
|
|
909
|
+
|
|
910
|
+
/** Node introspection and heavy reads. Browser wallets generally reject these. */
|
|
911
|
+
export type NodeOnlyReadMethods = {
|
|
912
|
+
net_listening: {result: boolean};
|
|
913
|
+
net_peerCount: {result: EIP1193QUANTITY};
|
|
335
914
|
|
|
915
|
+
eth_syncing: {result: EIP1193SyncingStatus | false};
|
|
916
|
+
eth_coinbase: {result: EIP1193Account};
|
|
917
|
+
|
|
918
|
+
eth_getProof: {
|
|
919
|
+
params: [EIP1193Account, EIP1193DATA[], EIP1898BlockTag?];
|
|
920
|
+
result: EIP1193AccountProof;
|
|
921
|
+
};
|
|
922
|
+
eth_createAccessList: {
|
|
923
|
+
params: [EIP1193CallParam, EIP1193BlockTag?];
|
|
924
|
+
result: {accessList: EIP1193AccessList; gasUsed: EIP1193QUANTITY; error?: string};
|
|
925
|
+
};
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
/**
|
|
929
|
+
* Poll-based log filters. Stateful, so not available on naively load-balanced endpoints.
|
|
930
|
+
* Served by browser wallets too (MetaMask ships `eth-json-rpc-filters`).
|
|
931
|
+
*/
|
|
932
|
+
export type FilterMethods = {
|
|
933
|
+
eth_newFilter: {params: [EIP1193LogsParam]; result: EIP1193QUANTITY};
|
|
934
|
+
eth_newBlockFilter: {result: EIP1193QUANTITY};
|
|
935
|
+
eth_newPendingTransactionFilter: {result: EIP1193QUANTITY};
|
|
936
|
+
eth_uninstallFilter: {params: [EIP1193QUANTITY]; result: boolean};
|
|
937
|
+
/** Block/transaction hashes for block and pending-transaction filters, logs for log filters. */
|
|
938
|
+
eth_getFilterChanges: {params: [EIP1193QUANTITY]; result: EIP1193DATA[] | EIP1193Log[]};
|
|
939
|
+
eth_getFilterLogs: {params: [EIP1193QUANTITY]; result: EIP1193Log[]};
|
|
940
|
+
};
|
|
941
|
+
|
|
942
|
+
/**
|
|
943
|
+
* Push subscriptions.
|
|
944
|
+
*
|
|
945
|
+
* Requires a transport that can deliver server-initiated notifications: WebSocket, IPC, or an
|
|
946
|
+
* injected browser wallet with an internal event channel. NOT available over plain HTTP.
|
|
947
|
+
* Browser wallets DO serve these (they are listed in MetaMask's own api-specs), and EIP-1193
|
|
948
|
+
* specifies the `message` event precisely to carry their notifications, so they are part of the
|
|
949
|
+
* default wallet surface.
|
|
950
|
+
*
|
|
951
|
+
* Notifications arrive through the `message` event as {@link EIP1193SubscriptionMessage}.
|
|
952
|
+
*/
|
|
953
|
+
export type SubscriptionMethods = {
|
|
336
954
|
eth_subscribe:
|
|
337
|
-
| {params: ['newHeads'
|
|
338
|
-
| {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
topics: (EIP1193DATA[] | EIP1193DATA)[];
|
|
344
|
-
}
|
|
345
|
-
];
|
|
346
|
-
result: string;
|
|
347
|
-
};
|
|
955
|
+
| {params: ['newHeads']; result: EIP1193DATA}
|
|
956
|
+
| {params: ['logs', EIP1193LogsParam?]; result: EIP1193DATA}
|
|
957
|
+
| {params: ['newPendingTransactions', boolean?]; result: EIP1193DATA}
|
|
958
|
+
| {params: ['transactionReceipts', {transactionHashes?: EIP1193DATA[]}?]; result: EIP1193DATA}
|
|
959
|
+
/** Not in execution-apis, but implemented by go-ethereum. */
|
|
960
|
+
| {params: ['syncing']; result: EIP1193DATA};
|
|
348
961
|
eth_unsubscribe: {params: [EIP1193DATA]; result: boolean};
|
|
349
|
-
|
|
962
|
+
};
|
|
350
963
|
|
|
351
|
-
|
|
964
|
+
/**
|
|
965
|
+
* Pre-merge leftovers. Removed from `execution-apis`, still answered by some clients.
|
|
966
|
+
* Uncles are always empty after the merge.
|
|
967
|
+
*/
|
|
968
|
+
export type LegacyNodeMethods = {
|
|
969
|
+
/** @deprecated Removed from execution-apis. */
|
|
970
|
+
eth_protocolVersion: {result: string};
|
|
971
|
+
/** @deprecated Always `false` after the merge. */
|
|
972
|
+
eth_mining: {result: boolean};
|
|
973
|
+
/** @deprecated Always `0x0` after the merge. */
|
|
974
|
+
eth_hashrate: {result: EIP1193QUANTITY};
|
|
975
|
+
/** @deprecated Always `0x0` after the merge. */
|
|
976
|
+
eth_getUncleCountByBlockHash: {params: [EIP1193DATA]; result: EIP1193QUANTITY | null};
|
|
977
|
+
/** @deprecated Always `0x0` after the merge. */
|
|
978
|
+
eth_getUncleCountByBlockNumber: {params: [EIP1193BlockTag]; result: EIP1193QUANTITY | null};
|
|
979
|
+
/** @deprecated Always `null` after the merge. */
|
|
980
|
+
eth_getUncleByBlockHashAndIndex: {params: [EIP1193DATA, EIP1193QUANTITY]; result: EIP1193Block | null};
|
|
981
|
+
/** @deprecated Always `null` after the merge. */
|
|
982
|
+
eth_getUncleByBlockNumberAndIndex: {params: [EIP1193BlockTag, EIP1193QUANTITY]; result: EIP1193Block | null};
|
|
352
983
|
};
|
|
353
984
|
|
|
985
|
+
/** Submission of an already-signed transaction. Needs no key. */
|
|
354
986
|
export type WriteMethods = {
|
|
355
987
|
eth_sendRawTransaction: {params: [EIP1193DATA]; result: EIP1193DATA};
|
|
356
988
|
};
|
|
357
989
|
|
|
990
|
+
/** Anything that requires access to a private key. */
|
|
358
991
|
export type SignerMethods = {
|
|
359
992
|
eth_accounts: {result: EIP1193Accounts};
|
|
993
|
+
/** @deprecated Signs an arbitrary digest. Disabled by default in most wallets. Use `personal_sign`. */
|
|
360
994
|
eth_sign: {params: [EIP1193Account, EIP1193DATA]; result: EIP1193DATA};
|
|
361
995
|
eth_signTransaction: {params: [EIP1193TransactionData]; result: EIP1193DATA};
|
|
362
996
|
|
|
997
|
+
/** Params are `[message, address]`, in that order. */
|
|
363
998
|
personal_sign: {params: [EIP1193DATA, EIP1193Account]; result: EIP1193DATA};
|
|
999
|
+
personal_ecRecover: {params: [EIP1193DATA, EIP1193DATA]; result: EIP1193Account};
|
|
1000
|
+
|
|
1001
|
+
/**
|
|
1002
|
+
* The legacy V1 API. Takes `[typedData, address]` -- the REVERSE of v3/v4 -- and a flat array
|
|
1003
|
+
* of `{name, type, value}` fields rather than an EIP-712 object.
|
|
1004
|
+
*
|
|
1005
|
+
* @deprecated Use `eth_signTypedData_v4`.
|
|
1006
|
+
*/
|
|
1007
|
+
eth_signTypedData: {params: [EIP1193TypedDataV1 | string, EIP1193Account]; result: EIP1193DATA};
|
|
1008
|
+
/** @deprecated Does not handle arrays or nested structs correctly. Use `eth_signTypedData_v4`. */
|
|
1009
|
+
eth_signTypedData_v3: {params: [EIP1193Account, EIP1193TypedSignatureParam]; result: EIP1193DATA};
|
|
364
1010
|
eth_signTypedData_v4: {params: [EIP1193Account, EIP1193TypedSignatureParam]; result: EIP1193DATA};
|
|
365
|
-
eth_signTypedData: {params: [EIP1193Account, EIP1193TypedSignatureParam]; result: EIP1193DATA};
|
|
366
1011
|
};
|
|
367
1012
|
|
|
1013
|
+
/** Requires a key AND a currently selected account. */
|
|
368
1014
|
export type ConnectedAccountMethods = {
|
|
369
1015
|
eth_sendTransaction: {params: [EIP1193TransactionData]; result: EIP1193DATA};
|
|
370
1016
|
};
|
|
371
1017
|
|
|
1018
|
+
/** Wallet UX methods. Only a browser wallet can serve these; a JSON-RPC endpoint cannot. */
|
|
372
1019
|
export type WalletOnlyMethods = {
|
|
1020
|
+
/** EIP-1102. */
|
|
373
1021
|
eth_requestAccounts: {result: EIP1193Accounts};
|
|
374
|
-
wallet_switchEthereumChain: {
|
|
375
|
-
params: [
|
|
376
|
-
{
|
|
377
|
-
chainId: EIP1193ChainId;
|
|
378
|
-
}
|
|
379
|
-
];
|
|
380
|
-
result: EIP1193SwitchChainError | null;
|
|
381
|
-
};
|
|
382
|
-
wallet_addEthereumChain: {params: [EIP1193AddChainParam]; result: EIP1193AddChainError | null};
|
|
383
|
-
};
|
|
384
1022
|
|
|
385
|
-
|
|
386
|
-
|
|
1023
|
+
/** EIP-3326. Resolves with `null` on success; failures are THROWN, not returned. */
|
|
1024
|
+
wallet_switchEthereumChain: {params: [EIP1193SwitchChainParam]; result: null};
|
|
1025
|
+
/** EIP-3085. Resolves with `null` on success; failures are THROWN, not returned. */
|
|
1026
|
+
wallet_addEthereumChain: {params: [EIP1193AddChainParam]; result: null};
|
|
1027
|
+
/** EIP-747. Returns `true` if the request was valid, regardless of the user's answer. */
|
|
1028
|
+
wallet_watchAsset: {params: [EIP1193WatchAssetParam]; result: boolean};
|
|
1029
|
+
|
|
1030
|
+
/** EIP-2255. */
|
|
1031
|
+
wallet_getPermissions: {result: EIP1193Permission[]};
|
|
1032
|
+
/** EIP-2255. */
|
|
1033
|
+
wallet_requestPermissions: {params: [EIP1193PermissionRequest]; result: EIP1193RequestedPermission[]};
|
|
1034
|
+
/** Not standardized as an EIP, but implemented by MetaMask and others. */
|
|
1035
|
+
wallet_revokePermissions: {params: [EIP1193PermissionRequest]; result: null};
|
|
1036
|
+
|
|
1037
|
+
/** EIP-5792. */
|
|
1038
|
+
wallet_sendCalls: {params: [EIP1193SendCallsParam]; result: EIP1193SendCallsResult};
|
|
1039
|
+
/** EIP-5792. */
|
|
1040
|
+
wallet_getCallsStatus: {params: [string]; result: EIP1193CallsStatus};
|
|
1041
|
+
/** EIP-5792. */
|
|
1042
|
+
wallet_showCallsStatus: {params: [string]; result: null};
|
|
1043
|
+
/** EIP-5792. */
|
|
1044
|
+
wallet_getCapabilities: {params: [EIP1193Account, EIP1193ChainId[]?]; result: EIP1193Capabilities};
|
|
1045
|
+
|
|
1046
|
+
/** MetaMask-specific. Registers the site as the onboarding initiator. */
|
|
1047
|
+
wallet_registerOnboarding: {result: boolean};
|
|
1048
|
+
/** MetaMask-specific. Opens the QR scanner and returns the scanned value. */
|
|
1049
|
+
wallet_scanQRCode: {params: [string?]; result: string};
|
|
1050
|
+
|
|
1051
|
+
/** @deprecated Removed from MetaMask. Was used for eth-sig-util encryption. */
|
|
1052
|
+
eth_getEncryptionPublicKey: {params: [EIP1193Account]; result: string};
|
|
1053
|
+
/** @deprecated Removed from MetaMask. Was used for eth-sig-util encryption. */
|
|
1054
|
+
eth_decrypt: {params: [EIP1193DATA, EIP1193Account]; result: string};
|
|
387
1055
|
};
|
|
388
1056
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
1057
|
+
/** The `debug` namespace. Only exposed by nodes explicitly started with it enabled. */
|
|
1058
|
+
export type DebugOnlyMethods = {
|
|
1059
|
+
debug_traceTransaction: {params: [EIP1193DATA, EIP1193TraceConfig?]; result: EIP1193TracedTransaction};
|
|
1060
|
+
debug_traceCall: {
|
|
1061
|
+
params: [EIP1193CallParam, EIP1898BlockTag?, EIP1193TraceConfig?];
|
|
1062
|
+
result: EIP1193TracedTransaction;
|
|
1063
|
+
};
|
|
396
1064
|
};
|
|
397
1065
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
data?: unknown;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
export interface EIP1193ConnectInfoMessage {
|
|
405
|
-
readonly chainId: EIP1193ChainId;
|
|
406
|
-
}
|
|
1066
|
+
// ------------------------------------------------------------------------------------------------
|
|
1067
|
+
// METHOD SETS
|
|
1068
|
+
// ------------------------------------------------------------------------------------------------
|
|
407
1069
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
1070
|
+
/**
|
|
1071
|
+
* Everything a browser wallet provider exposes. This is the surface EIP-1193 actually describes,
|
|
1072
|
+
* so it is also the default {@link Methods}.
|
|
1073
|
+
*/
|
|
1074
|
+
export type WalletMethods = ClientMethods &
|
|
1075
|
+
ReadMethods &
|
|
1076
|
+
FilterMethods &
|
|
1077
|
+
SubscriptionMethods &
|
|
1078
|
+
WriteMethods &
|
|
1079
|
+
SignerMethods &
|
|
1080
|
+
ConnectedAccountMethods &
|
|
1081
|
+
WalletOnlyMethods;
|
|
412
1082
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
1083
|
+
/**
|
|
1084
|
+
* Everything a full JSON-RPC node exposes. Note this includes the signer methods (a node with
|
|
1085
|
+
* unlocked accounts serves them) but NOT the `wallet_*` namespace, which has no meaning
|
|
1086
|
+
* server-side.
|
|
1087
|
+
*/
|
|
1088
|
+
export type NodeMethods = ClientMethods &
|
|
1089
|
+
ReadMethods &
|
|
1090
|
+
NodeOnlyReadMethods &
|
|
1091
|
+
FilterMethods &
|
|
1092
|
+
SubscriptionMethods &
|
|
1093
|
+
LegacyNodeMethods &
|
|
1094
|
+
WriteMethods &
|
|
1095
|
+
SignerMethods &
|
|
1096
|
+
ConnectedAccountMethods;
|
|
1097
|
+
|
|
1098
|
+
/**
|
|
1099
|
+
* The default method set: a browser wallet provider.
|
|
1100
|
+
*
|
|
1101
|
+
* If you are typing a plain JSON-RPC endpoint rather than a wallet, use {@link NodeMethods} /
|
|
1102
|
+
* {@link EIP1193NodeProvider}. If you genuinely want the union of everything, use
|
|
1103
|
+
* {@link AllMethods}.
|
|
1104
|
+
*/
|
|
1105
|
+
export type Methods = WalletMethods;
|
|
1106
|
+
|
|
1107
|
+
/**
|
|
1108
|
+
* A plain HTTP JSON-RPC endpoint: {@link NodeMethods} minus the push subscriptions, which need a
|
|
1109
|
+
* transport that can deliver server-initiated notifications.
|
|
1110
|
+
*/
|
|
1111
|
+
export type HttpNodeMethods = Omit<NodeMethods, keyof SubscriptionMethods>;
|
|
1112
|
+
|
|
1113
|
+
/**
|
|
1114
|
+
* The core every provider here serves: a browser wallet, a JSON-RPC node and a plain HTTP node.
|
|
1115
|
+
* The other sets are this core plus extras: {@link WalletMethods} adds subscriptions and the
|
|
1116
|
+
* `wallet_*` namespace, {@link NodeMethods} adds subscriptions, node introspection and the legacy
|
|
1117
|
+
* methods, and {@link HttpNodeMethods} is the node set without subscriptions.
|
|
1118
|
+
*
|
|
1119
|
+
* Use it to type a PARAMETER: code that only reads chain state, signs and broadcasts can then
|
|
1120
|
+
* accept whichever kind of provider the caller holds. Typing the parameter as the wallet surface
|
|
1121
|
+
* would reject a node provider (and the reverse), although the code needs neither side's extras.
|
|
1122
|
+
*/
|
|
1123
|
+
export type CoreMethods = ClientMethods &
|
|
1124
|
+
ReadMethods &
|
|
1125
|
+
FilterMethods &
|
|
1126
|
+
WriteMethods &
|
|
1127
|
+
SignerMethods &
|
|
1128
|
+
ConnectedAccountMethods;
|
|
420
1129
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
readonly data: {
|
|
424
|
-
readonly subscription: EIP1193DATA;
|
|
425
|
-
readonly result:
|
|
426
|
-
| EIP1193Log
|
|
427
|
-
| EIP1193Block
|
|
428
|
-
| EIP1193DATA // transaction hash
|
|
429
|
-
| {
|
|
430
|
-
syncing: boolean;
|
|
431
|
-
status: {
|
|
432
|
-
startingBlock: number;
|
|
433
|
-
currentBlock: number;
|
|
434
|
-
highestBlock: number;
|
|
435
|
-
pulledStates: number;
|
|
436
|
-
knownStates: number;
|
|
437
|
-
};
|
|
438
|
-
};
|
|
439
|
-
};
|
|
440
|
-
};
|
|
1130
|
+
/** Every method in this file, node and wallet and debug. Permissive; prefer a narrower set. */
|
|
1131
|
+
export type AllMethods = NodeMethods & WalletMethods & DebugOnlyMethods;
|
|
441
1132
|
|
|
442
1133
|
// ------------------------------------------------------------------------------------------------
|
|
443
1134
|
// TOOLS
|
|
@@ -454,21 +1145,24 @@ type DeepReadonly<T> = Readonly<{
|
|
|
454
1145
|
DeepReadonly<T[K]>;
|
|
455
1146
|
}>;
|
|
456
1147
|
|
|
457
|
-
export type RPCRequestData = {params?: any; result?: any
|
|
1148
|
+
export type RPCRequestData = {params?: any; result?: any};
|
|
458
1149
|
|
|
1150
|
+
/** A method table. A value may be a UNION of entries, which becomes a union of overloads. */
|
|
459
1151
|
export type RPCMethods = Record<string, RPCRequestData>;
|
|
460
1152
|
|
|
461
1153
|
export type RemoteRequestCallType<
|
|
462
1154
|
Method extends string,
|
|
463
1155
|
Value,
|
|
464
1156
|
Params extends any[] | Record<string, any> | undefined = undefined
|
|
465
|
-
> = Params extends undefined
|
|
1157
|
+
> = [Params] extends [undefined]
|
|
466
1158
|
? {
|
|
467
|
-
|
|
1159
|
+
// no-param methods: `params` may be omitted, or sent as an empty array, which is what
|
|
1160
|
+
// most JSON-RPC transports do on the wire.
|
|
1161
|
+
request: (req: {method: Method; params?: readonly []}) => Promise<Value>;
|
|
468
1162
|
}
|
|
469
|
-
: Params extends []
|
|
1163
|
+
: [Params] extends [readonly []]
|
|
470
1164
|
? {
|
|
471
|
-
request: (req: {method: Method}) => Promise<Value>;
|
|
1165
|
+
request: (req: {method: Method; params?: readonly []}) => Promise<Value>;
|
|
472
1166
|
}
|
|
473
1167
|
: {
|
|
474
1168
|
request: (req: {method: Method; params: DeepReadonly<Params>}) => Promise<Value>;
|
|
@@ -476,37 +1170,103 @@ export type RemoteRequestCallType<
|
|
|
476
1170
|
|
|
477
1171
|
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
478
1172
|
|
|
1173
|
+
/**
|
|
1174
|
+
* Builds ONE call signature per entry.
|
|
1175
|
+
*
|
|
1176
|
+
* `Entry` is a naked type parameter, so this conditional DISTRIBUTES over a union of entries.
|
|
1177
|
+
* That is what makes a method declared as
|
|
1178
|
+
*
|
|
1179
|
+
* eth_getBlockByNumber:
|
|
1180
|
+
* | {params: [tag, false?]; result: Block | null}
|
|
1181
|
+
* | {params: [tag, true]; result: BlockWithTransactions | null}
|
|
1182
|
+
*
|
|
1183
|
+
* produce two real overloads instead of collapsing into a single signature whose result is
|
|
1184
|
+
* `Block | BlockWithTransactions | null`. Indexing `T[Property]['result']` directly, as an
|
|
1185
|
+
* earlier version did, does NOT distribute and loses the narrowing.
|
|
1186
|
+
*/
|
|
1187
|
+
type MethodRequestCallType<Method extends string, Entry> = Entry extends RPCRequestData
|
|
1188
|
+
? RemoteRequestCallType<
|
|
1189
|
+
Method,
|
|
1190
|
+
Entry extends {result: any} ? Entry['result'] : undefined,
|
|
1191
|
+
Entry extends {params: any} ? Entry['params'] : undefined
|
|
1192
|
+
>
|
|
1193
|
+
: never;
|
|
1194
|
+
|
|
479
1195
|
export type RequestUnion<T extends RPCMethods> = {
|
|
480
|
-
[Property in keyof T]:
|
|
481
|
-
Property extends string ? Property : never,
|
|
482
|
-
T[Property] extends {result: any} ? T[Property]['result'] : undefined,
|
|
483
|
-
T[Property] extends {params: any} ? T[Property]['params'] : undefined
|
|
484
|
-
>;
|
|
1196
|
+
[Property in keyof T]: MethodRequestCallType<Property extends string ? Property : never, T[Property]>;
|
|
485
1197
|
}[keyof T];
|
|
486
1198
|
|
|
487
1199
|
// ------------------------------------------------------------------------------------------------
|
|
488
1200
|
// PROVIDERS
|
|
489
1201
|
// ------------------------------------------------------------------------------------------------
|
|
490
1202
|
|
|
1203
|
+
/**
|
|
1204
|
+
* Turns a method table into a `{request(...)}` object with one overload per method.
|
|
1205
|
+
*
|
|
1206
|
+
* There is deliberately NO `request(req: {method: string; ...})` catch-all overload here. A
|
|
1207
|
+
* catch-all matches every call, so a typo like `eth_blockNumbr` used to compile away into
|
|
1208
|
+
* `Promise<unknown>`, and every genuine mistake was reported as an unreadable "No overload
|
|
1209
|
+
* matches this call / Index signature for type 'string' is missing" against the catch-all
|
|
1210
|
+
* instead of against the method you actually called.
|
|
1211
|
+
*
|
|
1212
|
+
* To call a method that is not in the table, either extend the table:
|
|
1213
|
+
*
|
|
1214
|
+
* type MyMethods = Methods & {my_method: {params: [string]; result: boolean}};
|
|
1215
|
+
* declare const provider: RequestRPC<MyMethods> & EIP1193EventsProvider;
|
|
1216
|
+
*
|
|
1217
|
+
* or reach for the untyped escape hatch: {@link EIP1193GenericRequestProvider}.
|
|
1218
|
+
*/
|
|
491
1219
|
export type RequestRPC<T extends RPCMethods> = UnionToIntersection<RequestUnion<T>> & {
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
}): Promise<
|
|
1220
|
+
// Diagnostic-only overload, deliberately LAST and deliberately unsatisfiable (`params: never`).
|
|
1221
|
+
// TypeScript reports the last overload when no overload matches, so this is what turns
|
|
1222
|
+
// "No overload matches this call" into a message that names the method you actually meant.
|
|
1223
|
+
request(req: {method: keyof T & string; params: never}): Promise<any>;
|
|
496
1224
|
};
|
|
497
1225
|
|
|
1226
|
+
/** A browser wallet provider without the event emitter. */
|
|
498
1227
|
export type EIP1193ProviderWithoutEvents = RequestRPC<Methods>;
|
|
499
1228
|
|
|
500
|
-
|
|
501
|
-
|
|
1229
|
+
/** A browser wallet provider (`window.ethereum`), without events. */
|
|
502
1230
|
export type EIP1193WalletProvider = RequestRPC<WalletMethods>;
|
|
503
1231
|
|
|
1232
|
+
/** A browser wallet provider (`window.ethereum`), with events. */
|
|
504
1233
|
export type EIP1193WindowWalletProvider = EIP1193WalletProvider & EIP1193EventsProvider;
|
|
505
1234
|
|
|
1235
|
+
/** A JSON-RPC node endpoint: node methods, no `wallet_*` namespace, no events. */
|
|
1236
|
+
export type EIP1193NodeProvider = RequestRPC<NodeMethods>;
|
|
1237
|
+
|
|
1238
|
+
/** A node reached over plain HTTP, where `eth_subscribe` cannot work. */
|
|
1239
|
+
export type EIP1193HttpNodeProvider = RequestRPC<HttpNodeMethods>;
|
|
1240
|
+
|
|
1241
|
+
/**
|
|
1242
|
+
* Accepts a wallet, a node or an HTTP node provider: see {@link CoreMethods}. Prefer it for a
|
|
1243
|
+
* parameter whose code only needs the methods all of them serve.
|
|
1244
|
+
*/
|
|
1245
|
+
export type EIP1193CoreProvider = RequestRPC<CoreMethods>;
|
|
1246
|
+
|
|
1247
|
+
/** Just the key-holding methods. */
|
|
506
1248
|
export type EIP1193SignerProvider = RequestRPC<SignerMethods>;
|
|
507
1249
|
|
|
508
|
-
|
|
1250
|
+
/** A node provider with the `debug` namespace enabled. */
|
|
1251
|
+
export type EIP1193DebugProvider = EIP1193NodeProvider & RequestRPC<DebugOnlyMethods>;
|
|
1252
|
+
|
|
1253
|
+
/** Every method in this file. Permissive; prefer a narrower provider type. */
|
|
1254
|
+
export type EIP1193AllMethodsProvider = RequestRPC<AllMethods>;
|
|
1255
|
+
|
|
1256
|
+
export type EIP1193GenericRequest = {
|
|
1257
|
+
method: string;
|
|
1258
|
+
/** EIP-1193 allows either positional or named parameters. */
|
|
1259
|
+
params?: Readonly<unknown[]> | Record<string, unknown>;
|
|
1260
|
+
};
|
|
509
1261
|
|
|
1262
|
+
/**
|
|
1263
|
+
* The untyped escape hatch, for proxies and for methods not covered by any table here.
|
|
1264
|
+
*
|
|
1265
|
+
* Intersecting this with a typed provider would reintroduce the catch-all overload problem
|
|
1266
|
+
* described on {@link RequestRPC}, so cast at the point of use instead:
|
|
1267
|
+
*
|
|
1268
|
+
* await (provider as unknown as EIP1193GenericRequestProvider).request({method, params});
|
|
1269
|
+
*/
|
|
510
1270
|
export type EIP1193GenericRequestProvider = {
|
|
511
1271
|
request<T = unknown, V extends EIP1193GenericRequest = EIP1193GenericRequest>(args: V): Promise<T>;
|
|
512
1272
|
};
|
|
@@ -527,8 +1287,8 @@ export interface EIP1193OnConnectionProvider {
|
|
|
527
1287
|
}
|
|
528
1288
|
|
|
529
1289
|
export interface EIP1193OnAccountsChangedProvider {
|
|
530
|
-
on(eventName: 'accountsChanged', listener: Listener<
|
|
531
|
-
removeListener(eventName: 'accountsChanged', listener: Listener<
|
|
1290
|
+
on(eventName: 'accountsChanged', listener: Listener<EIP1193Accounts>): this;
|
|
1291
|
+
removeListener(eventName: 'accountsChanged', listener: Listener<EIP1193Accounts>): this;
|
|
532
1292
|
}
|
|
533
1293
|
|
|
534
1294
|
export interface EIP1193OnChainChangedProvider {
|
|
@@ -536,6 +1296,13 @@ export interface EIP1193OnChainChangedProvider {
|
|
|
536
1296
|
removeListener(eventName: 'chainChanged', listener: Listener<EIP1193ChainId>): this;
|
|
537
1297
|
}
|
|
538
1298
|
|
|
1299
|
+
/**
|
|
1300
|
+
* The five events EIP-1193 requires, via the two methods it requires (`on` / `removeListener`).
|
|
1301
|
+
*
|
|
1302
|
+
* Wallets commonly also ship the rest of the Node `EventEmitter` surface (`once`, `off`,
|
|
1303
|
+
* `addListener`, `removeAllListeners`), but EIP-1193 does not mandate them, so they are not
|
|
1304
|
+
* declared here.
|
|
1305
|
+
*/
|
|
539
1306
|
export interface EIP1193EventsProvider {
|
|
540
1307
|
on(eventName: 'message', listener: Listener<EIP1193Message>): this;
|
|
541
1308
|
removeListener(eventName: 'message', listener: Listener<EIP1193Message>): this;
|
|
@@ -545,11 +1312,12 @@ export interface EIP1193EventsProvider {
|
|
|
545
1312
|
removeListener(eventName: 'connect', listener: Listener<EIP1193ConnectInfoMessage>): this;
|
|
546
1313
|
removeListener(eventName: 'disconnect', listener: Listener<EIP1193ProviderRpcError>): this;
|
|
547
1314
|
|
|
548
|
-
on(eventName: 'accountsChanged', listener: Listener<
|
|
549
|
-
removeListener(eventName: 'accountsChanged', listener: Listener<
|
|
1315
|
+
on(eventName: 'accountsChanged', listener: Listener<EIP1193Accounts>): this;
|
|
1316
|
+
removeListener(eventName: 'accountsChanged', listener: Listener<EIP1193Accounts>): this;
|
|
550
1317
|
|
|
551
1318
|
on(eventName: 'chainChanged', listener: Listener<EIP1193ChainId>): this;
|
|
552
1319
|
removeListener(eventName: 'chainChanged', listener: Listener<EIP1193ChainId>): this;
|
|
553
1320
|
}
|
|
554
1321
|
|
|
1322
|
+
/** An EIP-1193 provider: what a browser wallet injects as `window.ethereum`. */
|
|
555
1323
|
export interface EIP1193Provider extends EIP1193ProviderWithoutEvents, EIP1193EventsProvider {}
|