epistery 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -201,38 +201,28 @@ url=https://rootz.digital/api/v0
201
201
  [cli]
202
202
  default_domain=localhost
203
203
 
204
- # Legacy single provider (still supported):
205
- [default.provider]
206
- chainId=137
207
- name=Polygon Mainnet
208
- rpc=https://polygon-rpc.com
204
+ # Which chain the claim-page dropdown selects by default.
205
+ [default]
206
+ defaultChainId=137
207
+
208
+ # Private RPC overrides, keyed by chainId. Only needed when the chain's
209
+ # built-in public RPC isn't sufficient (rate-limited, needs an API key).
210
+ # Everything else — name, public RPC, currency, fee policy — lives in
211
+ # the chain classes (src/chains/) and doesn't need to be configured.
212
+
213
+ [default.rpc.137]
214
+ privateRpc=https://polygon-mainnet.infura.io/v3/YOUR_KEY
215
+
216
+ [default.rpc.1]
217
+ privateRpc=https://mainnet.infura.io/v3/YOUR_KEY
218
+ ```
209
219
 
210
- # Preferred: array of providers with public/private RPC separation.
211
- # epistery-host uses this to populate the network selection dropdown
212
- # and to inject private (API-key) RPCs for server-side calls.
220
+ Legacy single-provider format is also supported:
213
221
 
214
- [[default.providers]]
222
+ ```ini
223
+ [default.provider]
215
224
  chainId=137
216
- name=Polygon Mainnet
217
- publicRpc=https://polygon-rpc.com
218
- privateRpc=https://polygon-mainnet.g.alchemy.com/v2/YOUR_KEY
219
- nativeCurrencyName=POL
220
- nativeCurrencySymbol=POL
221
- nativeCurrencyDecimals=18
222
-
223
- [[default.providers]]
224
- chainId=81
225
- name=Japan Open Chain
226
- publicRpc=https://rpc-2.japanopenchain.org:8545
227
- nativeCurrencyName=JOC
228
- nativeCurrencySymbol=JOC
229
- nativeCurrencyDecimals=18
230
-
231
- # Optional per-chain policy overrides (defaults are in code):
232
- [default.providers.policy]
233
- minPriorityFeeGwei=25
234
- maxFeeMultiplier=2
235
- gasLimitMultiplier=1.3
225
+ privateRpc=https://polygon-mainnet.infura.io/v3/YOUR_KEY
236
226
  ```
237
227
 
238
228
  ### Domain Config (`~/.epistery/mydomain.com/config.ini`)
@@ -334,22 +324,26 @@ See [Architecture.md](Architecture.md) for detailed architecture documentation.
334
324
 
335
325
  ### Chain Support
336
326
 
337
- Each EVM chain epistery talks to is represented by a `Chain` object that owns the JSON-RPC provider, fee policy, and gas estimation strategy. Built-in chains:
327
+ Each EVM chain epistery talks to is represented by a `Chain` object that owns the JSON-RPC provider, fee policy, gas estimation strategy, and default public RPC. No configuration is needed to use a built-in chain — every detail is in the class itself.
338
328
 
339
- | Chain | ID | Fee Model |
340
- |-------|----|-----------|
341
- | Polygon Mainnet | 137 | EIP-1559 with 25 gwei priority floor |
342
- | Polygon Amoy | 80002 | EIP-1559 with 25 gwei priority floor |
343
- | Ethereum Mainnet | 1 | Standard EIP-1559 |
344
- | Sepolia Testnet | 11155111 | Standard EIP-1559 |
345
- | Japan Open Chain | 81 | Legacy gasPrice with 30 gwei floor |
329
+ | Chain | ID | Fee Model | Default RPC |
330
+ |-------|----|-----------|-------------|
331
+ | Polygon Mainnet | 137 | EIP-1559, 25 gwei priority floor | polygon-rpc.com |
332
+ | Polygon Amoy | 80002 | EIP-1559, 25 gwei priority floor | rpc-amoy.polygon.technology |
333
+ | Ethereum Mainnet | 1 | Standard EIP-1559 | eth.llamarpc.com |
334
+ | Sepolia Testnet | 11155111 | Standard EIP-1559 | eth-sepolia.public.blastapi.io |
335
+ | Japan Open Chain | 81 | Legacy gasPrice, 30 gwei floor | rpc-2.japanopenchain.org |
346
336
 
347
- Use `chainFor()` to get a chain instance from a provider config:
337
+ Use `chainFor()` to get a chain instance. Only `chainId` is required — everything else comes from the chain class defaults:
348
338
 
349
339
  ```javascript
350
- import { chainFor } from 'epistery';
340
+ import { chainFor, registeredChains } from 'epistery';
351
341
 
352
- const chain = chainFor(domainConfig.provider);
342
+ // Minimal — chain class supplies name, RPC, currency, fee policy
343
+ const chain = chainFor({ chainId: 137 });
344
+
345
+ // Or with an override — privateRpc for server-side calls with an API key
346
+ const chain = chainFor({ chainId: 137, privateRpc: 'https://polygon-mainnet.infura.io/v3/KEY' });
353
347
 
354
348
  // Provider with explicit network info (no "could not detect network" errors)
355
349
  const wallet = ethers.Wallet.fromMnemonic(mnemonic).connect(chain.provider);
@@ -359,6 +353,9 @@ const feeData = await chain.getFeeData();
359
353
  // → Polygon: { maxPriorityFeePerGas: 25 gwei, maxFeePerGas: 50 gwei }
360
354
  // → JOC: { gasPrice: 30 gwei }
361
355
  // → Ethereum: { maxPriorityFeePerGas: <network>, maxFeePerGas: <network> }
356
+
357
+ // Get the full built-in chain list (for UI dropdowns, etc.)
358
+ const chains = registeredChains();
362
359
  ```
363
360
 
364
361
  Adding a new chain is a single file — extend `Chain`, override the fee hooks that differ, and call `registerChain()`. No edits to existing code. See [src/chains/README.md](src/chains/README.md) for details.
@@ -46,6 +46,13 @@ export interface ChainConfig extends ProviderConfig {
46
46
  * - domain config storage
47
47
  */
48
48
  export declare class Chain {
49
+ /**
50
+ * Subclasses override `defaults` to carry the canonical network details.
51
+ * `chainFor({chainId: 137})` merges caller config on top of these defaults
52
+ * so only the chainId is required — name, public RPC, currency etc. are
53
+ * all built in.
54
+ */
55
+ static defaults: Partial<ChainConfig>;
49
56
  readonly chainId: number;
50
57
  readonly name: string;
51
58
  readonly rpc: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Chain.d.ts","sourceRoot":"","sources":["../../src/chains/Chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,KAAK;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,OAAO,CAAC,SAAS,CAAiD;gBAEtD,MAAM,EAAE,WAAW;IAgB/B;;;;;OAKG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CAQ/C;IAED,2EAA2E;IAC3E,eAAe,IAAI,OAAO;IAI1B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAczC;;;;;;OAMG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,GAC7C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IAQ5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;IAmChF;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO;IAgBzC,wCAAwC;IACxC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS;CAG5C"}
1
+ {"version":3,"file":"Chain.d.ts","sourceRoot":"","sources":["../../src/chains/Chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,cAAc;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,KAAK;IAChB;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAM;IAE3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,OAAO,CAAC,SAAS,CAAiD;gBAEtD,MAAM,EAAE,WAAW;IAgB/B;;;;;OAKG;IACH,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CAQ/C;IAED,2EAA2E;IAC3E,eAAe,IAAI,OAAO;IAI1B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAczC;;;;;;OAMG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,GAC7C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IAQ5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;IAmChF;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO;IAgBzC,wCAAwC;IACxC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS;CAG5C"}
@@ -24,7 +24,7 @@ class Chain {
24
24
  throw new Error(`Chain config missing chainId: ${JSON.stringify(config)}`);
25
25
  }
26
26
  this.chainId = Number(config.chainId);
27
- this.name = config.name;
27
+ this.name = config.name || '';
28
28
  this.rpc = config.privateRpc || config.rpc;
29
29
  this.publicRpc = config.publicRpc || config.rpc;
30
30
  this.currency = {
@@ -172,4 +172,11 @@ class Chain {
172
172
  }
173
173
  }
174
174
  exports.Chain = Chain;
175
+ /**
176
+ * Subclasses override `defaults` to carry the canonical network details.
177
+ * `chainFor({chainId: 137})` merges caller config on top of these defaults
178
+ * so only the chainId is required — name, public RPC, currency etc. are
179
+ * all built in.
180
+ */
181
+ Chain.defaults = {};
175
182
  //# sourceMappingURL=Chain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Chain.js","sourceRoot":"","sources":["../../src/chains/Chain.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAuChC;;;;;;;;;;;;;;GAcG;AACH,MAAa,KAAK;IAUhB,YAAY,MAAmB;QAFvB,cAAS,GAA4C,IAAI,CAAC;QAGhE,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,EAAE,MAAM,CAAC,kBAAkB,IAAI,EAAE;YACrC,MAAM,EAAE,MAAM,CAAC,oBAAoB,IAAI,EAAE;YACzC,QAAQ,EAAE,MAAM,CAAC,sBAAsB,IAAI,EAAE;SAC9C,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,IAAI,eAAM,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC9D,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2EAA2E;IAC3E,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,oBAAoB,EAAE,CAAC;YACzE,OAAO;gBACL,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,oBAAoB,EAAE,EAAE,CAAC,oBAAoB;aAC9C,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC;QACnC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,+BAA+B,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CACf,SAA8C;QAE9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC;QACzD,uDAAuD;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,YAAY,CAA4B,QAAW,EAAE,GAAuB;QAC1E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACvC,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM;gBAAE,SAAS;YACjF,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAe,CAAC,CAAC;YAC3C,IAAI,OAAO,QAAQ,KAAK,UAAU;gBAAE,SAAS;YAC7C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE;gBACnC,KAAK,EAAE,KAAK,WAAW,GAAG,IAAW;oBACnC,IAAI,SAAc,CAAC;oBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACnC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;wBACrC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;wBAChC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;wBACrC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACvB,CAAC;oBACD,OAAQ,QAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACtD,CAAC;gBACD,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAY,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,CAAM;QAC7B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,eAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAClD,OAAO,CACL,UAAU,IAAI,CAAC;YACf,cAAc,IAAI,CAAC;YACnB,sBAAsB,IAAI,CAAC;YAC3B,UAAU,IAAI,CAAC;YACf,OAAO,IAAI,CAAC;YACZ,OAAO,IAAI,CAAC;YACZ,MAAM,IAAI,CAAC;YACX,MAAM,IAAI,CAAC,CACZ,CAAC;IACJ,CAAC;IAED,wCAAwC;IAC9B,IAAI,CAAC,CAAS;QACtB,OAAO,eAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;CACF;AAtKD,sBAsKC"}
1
+ {"version":3,"file":"Chain.js","sourceRoot":"","sources":["../../src/chains/Chain.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,25 @@ import { Chain } from './Chain';
8
8
  */
9
9
  export declare class EthereumChain extends Chain {
10
10
  static chainId: number;
11
+ static defaults: {
12
+ name: string;
13
+ rpc: string;
14
+ nativeCurrencyName: string;
15
+ nativeCurrencySymbol: string;
16
+ nativeCurrencyDecimals: number;
17
+ };
11
18
  }
12
19
  /**
13
20
  * Sepolia testnet (chainId 11155111). Same behavior as Ethereum mainnet.
14
21
  */
15
22
  export declare class SepoliaChain extends Chain {
16
23
  static chainId: number;
24
+ static defaults: {
25
+ name: string;
26
+ rpc: string;
27
+ nativeCurrencyName: string;
28
+ nativeCurrencySymbol: string;
29
+ nativeCurrencyDecimals: number;
30
+ };
17
31
  }
18
32
  //# sourceMappingURL=EthereumChain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EthereumChain.d.ts","sourceRoot":"","sources":["../../src/chains/EthereumChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,MAAM,CAAC,OAAO,SAAK;CACpB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,MAAM,CAAC,OAAO,SAAY;CAC3B"}
1
+ {"version":3,"file":"EthereumChain.d.ts","sourceRoot":"","sources":["../../src/chains/EthereumChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,MAAM,CAAC,OAAO,SAAK;IACnB,MAAM,CAAC,QAAQ;;;;;;MAMb;CACH;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,MAAM,CAAC,OAAO,SAAY;IAC1B,MAAM,CAAC,QAAQ;;;;;;MAMb;CACH"}
@@ -14,6 +14,13 @@ class EthereumChain extends Chain_1.Chain {
14
14
  }
15
15
  exports.EthereumChain = EthereumChain;
16
16
  EthereumChain.chainId = 1;
17
+ EthereumChain.defaults = {
18
+ name: 'Ethereum Mainnet',
19
+ rpc: 'https://eth.llamarpc.com',
20
+ nativeCurrencyName: 'Ether',
21
+ nativeCurrencySymbol: 'ETH',
22
+ nativeCurrencyDecimals: 18,
23
+ };
17
24
  /**
18
25
  * Sepolia testnet (chainId 11155111). Same behavior as Ethereum mainnet.
19
26
  */
@@ -21,6 +28,13 @@ class SepoliaChain extends Chain_1.Chain {
21
28
  }
22
29
  exports.SepoliaChain = SepoliaChain;
23
30
  SepoliaChain.chainId = 11155111;
31
+ SepoliaChain.defaults = {
32
+ name: 'Sepolia Testnet',
33
+ rpc: 'https://eth-sepolia.public.blastapi.io',
34
+ nativeCurrencyName: 'Ether',
35
+ nativeCurrencySymbol: 'ETH',
36
+ nativeCurrencyDecimals: 18,
37
+ };
24
38
  (0, registry_1.registerChain)(EthereumChain.chainId, EthereumChain);
25
39
  (0, registry_1.registerChain)(SepoliaChain.chainId, SepoliaChain);
26
40
  //# sourceMappingURL=EthereumChain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EthereumChain.js","sourceRoot":"","sources":["../../src/chains/EthereumChain.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,yCAA2C;AAE3C;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,aAAK;;AAAxC,sCAEC;AADQ,qBAAO,GAAG,CAAC,CAAC;AAGrB;;GAEG;AACH,MAAa,YAAa,SAAQ,aAAK;;AAAvC,oCAEC;AADQ,oBAAO,GAAG,QAAQ,CAAC;AAG5B,IAAA,wBAAa,EAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACpD,IAAA,wBAAa,EAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"EthereumChain.js","sourceRoot":"","sources":["../../src/chains/EthereumChain.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,yCAA2C;AAE3C;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,aAAK;;AAAxC,sCASC;AARQ,qBAAO,GAAG,CAAC,CAAC;AACZ,sBAAQ,GAAG;IAChB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,0BAA0B;IAC/B,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAGJ;;GAEG;AACH,MAAa,YAAa,SAAQ,aAAK;;AAAvC,oCASC;AARQ,oBAAO,GAAG,QAAQ,CAAC;AACnB,qBAAQ,GAAG;IAChB,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,wCAAwC;IAC7C,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAGJ,IAAA,wBAAa,EAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACpD,IAAA,wBAAa,EAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC"}
@@ -14,6 +14,13 @@ import { Chain, ChainFeeData } from './Chain';
14
14
  */
15
15
  export declare class JapanOpenChain extends Chain {
16
16
  static chainId: number;
17
+ static defaults: {
18
+ name: string;
19
+ rpc: string;
20
+ nativeCurrencyName: string;
21
+ nativeCurrencySymbol: string;
22
+ nativeCurrencyDecimals: number;
23
+ };
17
24
  supportsEIP1559(): boolean;
18
25
  protected minGasPrice(): ethers.BigNumber;
19
26
  getFeeData(): Promise<ChainFeeData>;
@@ -1 +1 @@
1
- {"version":3,"file":"JapanOpenChain.d.ts","sourceRoot":"","sources":["../../src/chains/JapanOpenChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;GAWG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,MAAM,CAAC,OAAO,SAAM;IAEpB,eAAe,IAAI,OAAO;IAI1B,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS;IAInC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;CAO1C"}
1
+ {"version":3,"file":"JapanOpenChain.d.ts","sourceRoot":"","sources":["../../src/chains/JapanOpenChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;GAWG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,MAAM,CAAC,OAAO,SAAM;IACpB,MAAM,CAAC,QAAQ;;;;;;MAMb;IAEF,eAAe,IAAI,OAAO;IAI1B,SAAS,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS;IAInC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;CAO1C"}
@@ -32,5 +32,12 @@ class JapanOpenChain extends Chain_1.Chain {
32
32
  }
33
33
  exports.JapanOpenChain = JapanOpenChain;
34
34
  JapanOpenChain.chainId = 81;
35
+ JapanOpenChain.defaults = {
36
+ name: 'Japan Open Chain',
37
+ rpc: 'https://rpc-2.japanopenchain.org:8545',
38
+ nativeCurrencyName: 'JOC',
39
+ nativeCurrencySymbol: 'JOC',
40
+ nativeCurrencyDecimals: 18,
41
+ };
35
42
  (0, registry_1.registerChain)(JapanOpenChain.chainId, JapanOpenChain);
36
43
  //# sourceMappingURL=JapanOpenChain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JapanOpenChain.js","sourceRoot":"","sources":["../../src/chains/JapanOpenChain.ts"],"names":[],"mappings":";;;AACA,mCAA8C;AAC9C,yCAA2C;AAE3C;;;;;;;;;;;GAWG;AACH,MAAa,cAAe,SAAQ,aAAK;IAGvC,eAAe;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAES,WAAW;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;;AAjBH,wCAkBC;AAjBQ,sBAAO,GAAG,EAAE,CAAC;AAmBtB,IAAA,wBAAa,EAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"JapanOpenChain.js","sourceRoot":"","sources":["../../src/chains/JapanOpenChain.ts"],"names":[],"mappings":";;;AACA,mCAA8C;AAC9C,yCAA2C;AAE3C;;;;;;;;;;;GAWG;AACH,MAAa,cAAe,SAAQ,aAAK;IAUvC,eAAe;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAES,WAAW;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;;AAxBH,wCAyBC;AAxBQ,sBAAO,GAAG,EAAE,CAAC;AACb,uBAAQ,GAAG;IAChB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,uCAAuC;IAC5C,kBAAkB,EAAE,KAAK;IACzB,oBAAoB,EAAE,KAAK;IAC3B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAmBJ,IAAA,wBAAa,EAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC"}
@@ -15,6 +15,13 @@ import { Chain, ChainFeeData } from './Chain';
15
15
  */
16
16
  export declare class PolygonChain extends Chain {
17
17
  static chainId: number;
18
+ static defaults: {
19
+ name: string;
20
+ rpc: string;
21
+ nativeCurrencyName: string;
22
+ nativeCurrencySymbol: string;
23
+ nativeCurrencyDecimals: number;
24
+ };
18
25
  protected minPriorityFee(): ethers.BigNumber;
19
26
  getFeeData(): Promise<ChainFeeData>;
20
27
  }
@@ -27,5 +34,12 @@ export declare class PolygonChain extends Chain {
27
34
  */
28
35
  export declare class AmoyChain extends PolygonChain {
29
36
  static chainId: number;
37
+ static defaults: {
38
+ name: string;
39
+ rpc: string;
40
+ nativeCurrencyName: string;
41
+ nativeCurrencySymbol: string;
42
+ nativeCurrencyDecimals: number;
43
+ };
30
44
  }
31
45
  //# sourceMappingURL=PolygonChain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PolygonChain.d.ts","sourceRoot":"","sources":["../../src/chains/PolygonChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,MAAM,CAAC,OAAO,SAAO;IAErB,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,SAAS;IAItC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;CAc1C;AAED;;;;;;GAMG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,MAAM,CAAC,OAAO,SAAS;CACxB"}
1
+ {"version":3,"file":"PolygonChain.d.ts","sourceRoot":"","sources":["../../src/chains/PolygonChain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,MAAM,CAAC,OAAO,SAAO;IACrB,MAAM,CAAC,QAAQ;;;;;;MAMb;IAEF,SAAS,CAAC,cAAc,IAAI,MAAM,CAAC,SAAS;IAItC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;CAc1C;AAED;;;;;;GAMG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,MAAM,CAAC,OAAO,SAAS;IACvB,MAAM,CAAC,QAAQ;;;;;;MAMb;CACH"}
@@ -34,6 +34,13 @@ class PolygonChain extends Chain_1.Chain {
34
34
  }
35
35
  exports.PolygonChain = PolygonChain;
36
36
  PolygonChain.chainId = 137;
37
+ PolygonChain.defaults = {
38
+ name: 'Polygon Mainnet',
39
+ rpc: 'https://polygon.drpc.org',
40
+ nativeCurrencyName: 'POL',
41
+ nativeCurrencySymbol: 'POL',
42
+ nativeCurrencyDecimals: 18,
43
+ };
37
44
  /**
38
45
  * Polygon Amoy testnet (chainId 80002).
39
46
  *
@@ -45,6 +52,13 @@ class AmoyChain extends PolygonChain {
45
52
  }
46
53
  exports.AmoyChain = AmoyChain;
47
54
  AmoyChain.chainId = 80002;
55
+ AmoyChain.defaults = {
56
+ name: 'Polygon Amoy Testnet',
57
+ rpc: 'https://rpc-amoy.polygon.technology',
58
+ nativeCurrencyName: 'POL',
59
+ nativeCurrencySymbol: 'POL',
60
+ nativeCurrencyDecimals: 18,
61
+ };
48
62
  (0, registry_1.registerChain)(PolygonChain.chainId, PolygonChain);
49
63
  (0, registry_1.registerChain)(AmoyChain.chainId, AmoyChain);
50
64
  //# sourceMappingURL=PolygonChain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PolygonChain.js","sourceRoot":"","sources":["../../src/chains/PolygonChain.ts"],"names":[],"mappings":";;;AACA,mCAA8C;AAC9C,yCAA2C;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAa,YAAa,SAAQ,aAAK;IAG3B,cAAc;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEpC,MAAM,eAAe,GAAG,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC;QACzD,MAAM,oBAAoB,GAAG,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,IAAI,SAAS,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;IAChD,CAAC;;AApBH,oCAqBC;AApBQ,oBAAO,GAAG,GAAG,CAAC;AAsBvB;;;;;;GAMG;AACH,MAAa,SAAU,SAAQ,YAAY;;AAA3C,8BAEC;AADQ,iBAAO,GAAG,KAAK,CAAC;AAGzB,IAAA,wBAAa,EAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAClD,IAAA,wBAAa,EAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"PolygonChain.js","sourceRoot":"","sources":["../../src/chains/PolygonChain.ts"],"names":[],"mappings":";;;AACA,mCAA8C;AAC9C,yCAA2C;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAa,YAAa,SAAQ,aAAK;IAU3B,cAAc;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEpC,MAAM,eAAe,GAAG,EAAE,CAAC,oBAAoB,IAAI,KAAK,CAAC;QACzD,MAAM,oBAAoB,GAAG,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,IAAI,SAAS,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;IAChD,CAAC;;AA3BH,oCA4BC;AA3BQ,oBAAO,GAAG,GAAG,CAAC;AACd,qBAAQ,GAAG;IAChB,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,0BAA0B;IAC/B,kBAAkB,EAAE,KAAK;IACzB,oBAAoB,EAAE,KAAK;IAC3B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAsBJ;;;;;;GAMG;AACH,MAAa,SAAU,SAAQ,YAAY;;AAA3C,8BASC;AARQ,iBAAO,GAAG,KAAK,CAAC;AAChB,kBAAQ,GAAG;IAChB,IAAI,EAAE,sBAAsB;IAC5B,GAAG,EAAE,qCAAqC;IAC1C,kBAAkB,EAAE,KAAK;IACzB,oBAAoB,EAAE,KAAK;IAC3B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAGJ,IAAA,wBAAa,EAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAClD,IAAA,wBAAa,EAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -15,7 +15,7 @@
15
15
  * happens exactly once.
16
16
  */
17
17
  export { Chain, ChainConfig, ChainFeeData, ChainPolicy } from './Chain';
18
- export { chainFor, registerChain, hasRegisteredChain, registeredChainIds } from './registry';
18
+ export { chainFor, registerChain, hasRegisteredChain, registeredChainIds, registeredChains } from './registry';
19
19
  export { PolygonChain, AmoyChain } from './PolygonChain';
20
20
  export { EthereumChain, SepoliaChain } from './EthereumChain';
21
21
  export { JapanOpenChain } from './JapanOpenChain';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chains/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK7F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chains/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK/G,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -16,7 +16,7 @@
16
16
  * happens exactly once.
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.JapanOpenChain = exports.SepoliaChain = exports.EthereumChain = exports.AmoyChain = exports.PolygonChain = exports.registeredChainIds = exports.hasRegisteredChain = exports.registerChain = exports.chainFor = exports.Chain = void 0;
19
+ exports.JapanOpenChain = exports.SepoliaChain = exports.EthereumChain = exports.AmoyChain = exports.PolygonChain = exports.registeredChains = exports.registeredChainIds = exports.hasRegisteredChain = exports.registerChain = exports.chainFor = exports.Chain = void 0;
20
20
  // Public API
21
21
  var Chain_1 = require("./Chain");
22
22
  Object.defineProperty(exports, "Chain", { enumerable: true, get: function () { return Chain_1.Chain; } });
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "chainFor", { enumerable: true, get: function ()
25
25
  Object.defineProperty(exports, "registerChain", { enumerable: true, get: function () { return registry_1.registerChain; } });
26
26
  Object.defineProperty(exports, "hasRegisteredChain", { enumerable: true, get: function () { return registry_1.hasRegisteredChain; } });
27
27
  Object.defineProperty(exports, "registeredChainIds", { enumerable: true, get: function () { return registry_1.registeredChainIds; } });
28
+ Object.defineProperty(exports, "registeredChains", { enumerable: true, get: function () { return registry_1.registeredChains; } });
28
29
  // Built-in chains — imported for their registerChain() side effect.
29
30
  // Re-exported so callers that want a concrete subclass (e.g. for instanceof
30
31
  // checks or to subclass it themselves) can import from the barrel.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chains/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,aAAa;AACb,iCAAwE;AAA/D,8FAAA,KAAK,OAAA;AACd,uCAA6F;AAApF,oGAAA,QAAQ,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAExE,oEAAoE;AACpE,4EAA4E;AAC5E,mEAAmE;AACnE,+CAAyD;AAAhD,4GAAA,YAAY,OAAA;AAAE,yGAAA,SAAS,OAAA;AAChC,iDAA8D;AAArD,8GAAA,aAAa,OAAA;AAAE,6GAAA,YAAY,OAAA;AACpC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chains/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,aAAa;AACb,iCAAwE;AAA/D,8FAAA,KAAK,OAAA;AACd,uCAA+G;AAAtG,oGAAA,QAAQ,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAE1F,oEAAoE;AACpE,4EAA4E;AAC5E,mEAAmE;AACnE,+CAAyD;AAAhD,4GAAA,YAAY,OAAA;AAAE,yGAAA,SAAS,OAAA;AAChC,iDAA8D;AAArD,8GAAA,aAAa,OAAA;AAAE,6GAAA,YAAY,OAAA;AACpC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
@@ -1,5 +1,7 @@
1
1
  import { Chain, ChainConfig } from './Chain';
2
- type ChainCtor = new (config: ChainConfig) => Chain;
2
+ type ChainCtor = (new (config: ChainConfig) => Chain) & {
3
+ defaults: Partial<ChainConfig>;
4
+ };
3
5
  /**
4
6
  * Register a Chain subclass for a given chainId. Overwrites any existing
5
7
  * entry — last write wins, so a downstream app can override a built-in if it
@@ -7,12 +9,25 @@ type ChainCtor = new (config: ChainConfig) => Chain;
7
9
  */
8
10
  export declare function registerChain(chainId: number, ctor: ChainCtor): void;
9
11
  /**
10
- * Get a Chain instance for the given provider config. If no subclass is
11
- * registered for the chainId, returns a generic Chain which uses pure
12
- * EIP-1559 with no floors and the standard estimateGas. That works for any
13
- * well-behaved EVM chain; misbehaving chains need their own subclass.
12
+ * Get a Chain instance for the given provider config. The caller's config
13
+ * is merged ON TOP of the subclass's built-in defaults, so only chainId is
14
+ * strictly required everything else (name, rpc, currency) comes from the
15
+ * chain class if not explicitly overridden.
16
+ *
17
+ * This means a host installation only needs to set `privateRpc` in
18
+ * `~/.epistery/config.ini` for chains where the public RPC is insufficient;
19
+ * all other details live in the chain class.
20
+ *
21
+ * If no subclass is registered for the chainId, returns a generic Chain —
22
+ * which uses pure EIP-1559 with no floors and the standard estimateGas.
14
23
  */
15
24
  export declare function chainFor(config: ChainConfig): Chain;
25
+ /**
26
+ * Return the built-in chain list — one entry per registered chain, using
27
+ * each subclass's defaults. This is the authoritative network list for
28
+ * UI dropdowns. No root config needed.
29
+ */
30
+ export declare function registeredChains(): ChainConfig[];
16
31
  /** Visible for tests / debug. Returns true if a chainId has a registered subclass. */
17
32
  export declare function hasRegisteredChain(chainId: number): boolean;
18
33
  /** Visible for tests / debug. Returns the list of registered chainIds. */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/chains/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7C,KAAK,SAAS,GAAG,KAAK,MAAM,EAAE,WAAW,KAAK,KAAK,CAAC;AAmBpD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAMnD;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/chains/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7C,KAAK,SAAS,GAAG,CAAC,KAAK,MAAM,EAAE,WAAW,KAAK,KAAK,CAAC,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CAAE,CAAC;AAmB3F;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAanD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAShD;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerChain = registerChain;
4
4
  exports.chainFor = chainFor;
5
+ exports.registeredChains = registeredChains;
5
6
  exports.hasRegisteredChain = hasRegisteredChain;
6
7
  exports.registeredChainIds = registeredChainIds;
7
8
  const Chain_1 = require("./Chain");
@@ -30,17 +31,46 @@ function registerChain(chainId, ctor) {
30
31
  REGISTRY.set(Number(chainId), ctor);
31
32
  }
32
33
  /**
33
- * Get a Chain instance for the given provider config. If no subclass is
34
- * registered for the chainId, returns a generic Chain which uses pure
35
- * EIP-1559 with no floors and the standard estimateGas. That works for any
36
- * well-behaved EVM chain; misbehaving chains need their own subclass.
34
+ * Get a Chain instance for the given provider config. The caller's config
35
+ * is merged ON TOP of the subclass's built-in defaults, so only chainId is
36
+ * strictly required everything else (name, rpc, currency) comes from the
37
+ * chain class if not explicitly overridden.
38
+ *
39
+ * This means a host installation only needs to set `privateRpc` in
40
+ * `~/.epistery/config.ini` for chains where the public RPC is insufficient;
41
+ * all other details live in the chain class.
42
+ *
43
+ * If no subclass is registered for the chainId, returns a generic Chain —
44
+ * which uses pure EIP-1559 with no floors and the standard estimateGas.
37
45
  */
38
46
  function chainFor(config) {
39
47
  if (config.chainId == null) {
40
48
  throw new Error(`chainFor: provider config missing chainId: ${JSON.stringify(config)}`);
41
49
  }
42
50
  const Ctor = REGISTRY.get(Number(config.chainId)) || Chain_1.Chain;
43
- return new Ctor(config);
51
+ // Subclass defaults fill in anything the caller didn't specify.
52
+ const merged = { ...Ctor.defaults, ...config };
53
+ // If caller provided only `rpc` but chain has a default public RPC,
54
+ // preserve the public one for UI display.
55
+ if (!config.publicRpc && Ctor.defaults.rpc) {
56
+ merged.publicRpc = Ctor.defaults.rpc;
57
+ }
58
+ return new Ctor(merged);
59
+ }
60
+ /**
61
+ * Return the built-in chain list — one entry per registered chain, using
62
+ * each subclass's defaults. This is the authoritative network list for
63
+ * UI dropdowns. No root config needed.
64
+ */
65
+ function registeredChains() {
66
+ const chains = [];
67
+ for (const [chainId, Ctor] of REGISTRY) {
68
+ chains.push({
69
+ ...Ctor.defaults,
70
+ chainId,
71
+ });
72
+ }
73
+ return chains;
44
74
  }
45
75
  /** Visible for tests / debug. Returns true if a chainId has a registered subclass. */
46
76
  function hasRegisteredChain(chainId) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/chains/registry.ts"],"names":[],"mappings":";;AA0BA,sCAEC;AAQD,4BAMC;AAGD,gDAEC;AAGD,gDAEC;AApDD,mCAA6C;AAI7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C;;;;GAIG;AACH,SAAgB,aAAa,CAAC,OAAe,EAAE,IAAe;IAC5D,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,MAAmB;IAC1C,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,aAAK,CAAC;IAC3D,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,sFAAsF;AACtF,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,0EAA0E;AAC1E,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/chains/registry.ts"],"names":[],"mappings":";;AA0BA,sCAEC;AAeD,4BAaC;AAOD,4CASC;AAGD,gDAEC;AAGD,gDAEC;AAlFD,mCAA6C;AAI7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE9C;;;;GAIG;AACH,SAAgB,aAAa,CAAC,OAAe,EAAE,IAAe;IAC5D,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,QAAQ,CAAC,MAAmB;IAC1C,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,aAAK,CAAC;IAC3D,gEAAgE;IAChE,MAAM,MAAM,GAAgB,EAAE,GAAI,IAAI,CAAC,QAAwB,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7E,oEAAoE;IACpE,0CAA0C;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC3C,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC;YACV,GAAI,IAAI,CAAC,QAAwB;YACjC,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,0EAA0E;AAC1E,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC"}
package/index.mjs CHANGED
@@ -5,7 +5,7 @@ import { fileURLToPath } from "url";
5
5
  import { Epistery } from "./dist/epistery.js";
6
6
  import { Utils } from "./dist/utils/Utils.js";
7
7
  import { Config } from "./dist/utils/Config.js";
8
- import { chainFor, registerChain, Chain } from "./dist/chains/index.js";
8
+ import { chainFor, registerChain, registeredChains, Chain } from "./dist/chains/index.js";
9
9
  import createRoutes from "./routes/index.mjs";
10
10
 
11
11
  const __filename = fileURLToPath(import.meta.url);
@@ -627,4 +627,4 @@ class EpisteryAttach {
627
627
  }
628
628
  }
629
629
 
630
- export { EpisteryAttach as Epistery, Config, chainFor, registerChain, Chain };
630
+ export { EpisteryAttach as Epistery, Config, chainFor, registerChain, registeredChains, Chain };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epistery",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "Epistery brings blockchain capabilities to mundane web tasks like engagement metrics, authentication and commerce of all sorts.",
5
5
  "author": "Rootz Corp.",
6
6
  "license": "MIT",
@@ -34,8 +34,9 @@
34
34
  "aqua-js-sdk": "^3.2.1-44",
35
35
  "cookie-parser": "^1.4.7",
36
36
  "dotenv": "^17.2.2",
37
- "express": "^5.1.0",
37
+ "epistery": "^1.4.1",
38
38
  "ethers": "^5.8.0",
39
+ "express": "^5.1.0",
39
40
  "ini": "^5.0.0",
40
41
  "kubo-rpc-client": "^5.2.0",
41
42
  "node-fetch": "^3.3.2",
@@ -53,6 +53,14 @@ export interface ChainConfig extends ProviderConfig {
53
53
  * - domain config storage
54
54
  */
55
55
  export class Chain {
56
+ /**
57
+ * Subclasses override `defaults` to carry the canonical network details.
58
+ * `chainFor({chainId: 137})` merges caller config on top of these defaults
59
+ * so only the chainId is required — name, public RPC, currency etc. are
60
+ * all built in.
61
+ */
62
+ static defaults: Partial<ChainConfig> = {};
63
+
56
64
  readonly chainId: number;
57
65
  readonly name: string;
58
66
  readonly rpc: string; // private/server-side RPC (with API key if any)
@@ -67,7 +75,7 @@ export class Chain {
67
75
  throw new Error(`Chain config missing chainId: ${JSON.stringify(config)}`);
68
76
  }
69
77
  this.chainId = Number(config.chainId);
70
- this.name = config.name;
78
+ this.name = config.name || '';
71
79
  this.rpc = config.privateRpc || config.rpc;
72
80
  this.publicRpc = config.publicRpc || config.rpc;
73
81
  this.currency = {
@@ -10,6 +10,13 @@ import { registerChain } from './registry';
10
10
  */
11
11
  export class EthereumChain extends Chain {
12
12
  static chainId = 1;
13
+ static defaults = {
14
+ name: 'Ethereum Mainnet',
15
+ rpc: 'https://eth.llamarpc.com',
16
+ nativeCurrencyName: 'Ether',
17
+ nativeCurrencySymbol: 'ETH',
18
+ nativeCurrencyDecimals: 18,
19
+ };
13
20
  }
14
21
 
15
22
  /**
@@ -17,6 +24,13 @@ export class EthereumChain extends Chain {
17
24
  */
18
25
  export class SepoliaChain extends Chain {
19
26
  static chainId = 11155111;
27
+ static defaults = {
28
+ name: 'Sepolia Testnet',
29
+ rpc: 'https://eth-sepolia.public.blastapi.io',
30
+ nativeCurrencyName: 'Ether',
31
+ nativeCurrencySymbol: 'ETH',
32
+ nativeCurrencyDecimals: 18,
33
+ };
20
34
  }
21
35
 
22
36
  registerChain(EthereumChain.chainId, EthereumChain);
@@ -16,6 +16,13 @@ import { registerChain } from './registry';
16
16
  */
17
17
  export class JapanOpenChain extends Chain {
18
18
  static chainId = 81;
19
+ static defaults = {
20
+ name: 'Japan Open Chain',
21
+ rpc: 'https://rpc-2.japanopenchain.org:8545',
22
+ nativeCurrencyName: 'JOC',
23
+ nativeCurrencySymbol: 'JOC',
24
+ nativeCurrencyDecimals: 18,
25
+ };
19
26
 
20
27
  supportsEIP1559(): boolean {
21
28
  return false;
@@ -17,6 +17,13 @@ import { registerChain } from './registry';
17
17
  */
18
18
  export class PolygonChain extends Chain {
19
19
  static chainId = 137;
20
+ static defaults = {
21
+ name: 'Polygon Mainnet',
22
+ rpc: 'https://polygon.drpc.org',
23
+ nativeCurrencyName: 'POL',
24
+ nativeCurrencySymbol: 'POL',
25
+ nativeCurrencyDecimals: 18,
26
+ };
20
27
 
21
28
  protected minPriorityFee(): ethers.BigNumber {
22
29
  return this.gwei(this.policy.minPriorityFeeGwei ?? 25);
@@ -47,6 +54,13 @@ export class PolygonChain extends Chain {
47
54
  */
48
55
  export class AmoyChain extends PolygonChain {
49
56
  static chainId = 80002;
57
+ static defaults = {
58
+ name: 'Polygon Amoy Testnet',
59
+ rpc: 'https://rpc-amoy.polygon.technology',
60
+ nativeCurrencyName: 'POL',
61
+ nativeCurrencySymbol: 'POL',
62
+ nativeCurrencyDecimals: 18,
63
+ };
50
64
  }
51
65
 
52
66
  registerChain(PolygonChain.chainId, PolygonChain);
@@ -17,7 +17,7 @@
17
17
 
18
18
  // Public API
19
19
  export { Chain, ChainConfig, ChainFeeData, ChainPolicy } from './Chain';
20
- export { chainFor, registerChain, hasRegisteredChain, registeredChainIds } from './registry';
20
+ export { chainFor, registerChain, hasRegisteredChain, registeredChainIds, registeredChains } from './registry';
21
21
 
22
22
  // Built-in chains — imported for their registerChain() side effect.
23
23
  // Re-exported so callers that want a concrete subclass (e.g. for instanceof
@@ -1,6 +1,6 @@
1
1
  import { Chain, ChainConfig } from './Chain';
2
2
 
3
- type ChainCtor = new (config: ChainConfig) => Chain;
3
+ type ChainCtor = (new (config: ChainConfig) => Chain) & { defaults: Partial<ChainConfig> };
4
4
 
5
5
  /**
6
6
  * Registry of chainId → Chain subclass.
@@ -29,17 +29,47 @@ export function registerChain(chainId: number, ctor: ChainCtor): void {
29
29
  }
30
30
 
31
31
  /**
32
- * Get a Chain instance for the given provider config. If no subclass is
33
- * registered for the chainId, returns a generic Chain which uses pure
34
- * EIP-1559 with no floors and the standard estimateGas. That works for any
35
- * well-behaved EVM chain; misbehaving chains need their own subclass.
32
+ * Get a Chain instance for the given provider config. The caller's config
33
+ * is merged ON TOP of the subclass's built-in defaults, so only chainId is
34
+ * strictly required everything else (name, rpc, currency) comes from the
35
+ * chain class if not explicitly overridden.
36
+ *
37
+ * This means a host installation only needs to set `privateRpc` in
38
+ * `~/.epistery/config.ini` for chains where the public RPC is insufficient;
39
+ * all other details live in the chain class.
40
+ *
41
+ * If no subclass is registered for the chainId, returns a generic Chain —
42
+ * which uses pure EIP-1559 with no floors and the standard estimateGas.
36
43
  */
37
44
  export function chainFor(config: ChainConfig): Chain {
38
45
  if (config.chainId == null) {
39
46
  throw new Error(`chainFor: provider config missing chainId: ${JSON.stringify(config)}`);
40
47
  }
41
48
  const Ctor = REGISTRY.get(Number(config.chainId)) || Chain;
42
- return new Ctor(config);
49
+ // Subclass defaults fill in anything the caller didn't specify.
50
+ const merged: ChainConfig = { ...(Ctor.defaults as ChainConfig), ...config };
51
+ // If caller provided only `rpc` but chain has a default public RPC,
52
+ // preserve the public one for UI display.
53
+ if (!config.publicRpc && Ctor.defaults.rpc) {
54
+ merged.publicRpc = Ctor.defaults.rpc;
55
+ }
56
+ return new Ctor(merged);
57
+ }
58
+
59
+ /**
60
+ * Return the built-in chain list — one entry per registered chain, using
61
+ * each subclass's defaults. This is the authoritative network list for
62
+ * UI dropdowns. No root config needed.
63
+ */
64
+ export function registeredChains(): ChainConfig[] {
65
+ const chains: ChainConfig[] = [];
66
+ for (const [chainId, Ctor] of REGISTRY) {
67
+ chains.push({
68
+ ...(Ctor.defaults as ChainConfig),
69
+ chainId,
70
+ });
71
+ }
72
+ return chains;
43
73
  }
44
74
 
45
75
  /** Visible for tests / debug. Returns true if a chainId has a registered subclass. */