@unicitylabs/sphere-sdk 0.8.0-dev.3 → 0.8.0-dev.5

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.
@@ -3830,7 +3830,7 @@ function getEmbeddedTrustBase(network) {
3830
3830
  case "dev":
3831
3831
  return TRUSTBASE_DEV;
3832
3832
  default:
3833
- return TRUSTBASE_TESTNET;
3833
+ throw new SphereError(`getEmbeddedTrustBase: unknown network "${network}"`, "INVALID_CONFIG");
3834
3834
  }
3835
3835
  }
3836
3836
  var BaseTrustBaseLoader = class {
@@ -3850,9 +3850,24 @@ var BaseTrustBaseLoader = class {
3850
3850
  // impl/browser/oracle/index.ts
3851
3851
  var BrowserTrustBaseLoader = class extends BaseTrustBaseLoader {
3852
3852
  url;
3853
- constructor(networkOrUrl = "testnet") {
3853
+ /**
3854
+ * @param networkOrUrl - a NetworkType, or a URL to fetch the trust base from
3855
+ * @param fallbackNetwork - network used for the embedded fallback when a URL is
3856
+ * supplied (and the fetch fails). Required when networkOrUrl is a URL — we must
3857
+ * never silently fall back to testnet on a different network.
3858
+ */
3859
+ constructor(networkOrUrl, fallbackNetwork) {
3860
+ if (!networkOrUrl) {
3861
+ throw new SphereError("BrowserTrustBaseLoader: network or trustBaseUrl is required.", "INVALID_CONFIG");
3862
+ }
3854
3863
  if (networkOrUrl.startsWith("/") || networkOrUrl.startsWith("http")) {
3855
- super("testnet");
3864
+ if (!fallbackNetwork) {
3865
+ throw new SphereError(
3866
+ "BrowserTrustBaseLoader: fallbackNetwork is required when a trustBaseUrl is supplied.",
3867
+ "INVALID_CONFIG"
3868
+ );
3869
+ }
3870
+ super(fallbackNetwork);
3856
3871
  this.url = networkOrUrl;
3857
3872
  } else {
3858
3873
  super(networkOrUrl);
@@ -3870,14 +3885,21 @@ var BrowserTrustBaseLoader = class extends BaseTrustBaseLoader {
3870
3885
  return null;
3871
3886
  }
3872
3887
  };
3873
- function createBrowserTrustBaseLoader(networkOrUrl) {
3874
- return new BrowserTrustBaseLoader(networkOrUrl);
3888
+ function createBrowserTrustBaseLoader(networkOrUrl, fallbackNetwork) {
3889
+ return new BrowserTrustBaseLoader(networkOrUrl, fallbackNetwork);
3875
3890
  }
3876
3891
  function createUnicityAggregatorProvider(config) {
3877
3892
  const { trustBaseUrl, network, ...restConfig } = config;
3893
+ if (!trustBaseUrl && !network) {
3894
+ throw new SphereError(
3895
+ "createUnicityAggregatorProvider: network or trustBaseUrl required.",
3896
+ "INVALID_CONFIG"
3897
+ );
3898
+ }
3878
3899
  return new UnicityAggregatorProvider({
3879
3900
  ...restConfig,
3880
- trustBaseLoader: createBrowserTrustBaseLoader(trustBaseUrl ?? network ?? "testnet")
3901
+ // When a URL is supplied, `network` (if any) is the embedded-fallback network.
3902
+ trustBaseLoader: createBrowserTrustBaseLoader(trustBaseUrl ?? network, network)
3881
3903
  });
3882
3904
  }
3883
3905
  var createUnicityOracleProvider = createUnicityAggregatorProvider;
@@ -6319,6 +6341,19 @@ var TokenRegistry = class _TokenRegistry {
6319
6341
  // ===========================================================================
6320
6342
  // Cache (StorageProvider)
6321
6343
  // ===========================================================================
6344
+ /**
6345
+ * Per-network cache keys. The registry cache MUST be namespaced by remoteUrl:
6346
+ * testnet and testnet2 ship DIFFERENT coinIds for the same symbol, so a single
6347
+ * global key let a stale testnet snapshot be served for a testnet2 request —
6348
+ * wrong/missing icons AND self-mint resolving the wrong-network coinId. Keying
6349
+ * by remoteUrl isolates the snapshots so a network can never read another's.
6350
+ */
6351
+ cacheKeys() {
6352
+ const base = STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE;
6353
+ const baseTs = STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS;
6354
+ if (!this.remoteUrl) return { data: base, ts: baseTs };
6355
+ return { data: `${base}:${this.remoteUrl}`, ts: `${baseTs}:${this.remoteUrl}` };
6356
+ }
6322
6357
  /**
6323
6358
  * Load definitions from StorageProvider cache.
6324
6359
  * Only applies if cache exists and is fresh (within refreshIntervalMs).
@@ -6326,9 +6361,10 @@ var TokenRegistry = class _TokenRegistry {
6326
6361
  async loadFromCache() {
6327
6362
  if (!this.storage) return false;
6328
6363
  try {
6364
+ const { data: dataKey, ts: tsKey } = this.cacheKeys();
6329
6365
  const [cached, cachedTs] = await Promise.all([
6330
- this.storage.get(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE),
6331
- this.storage.get(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS)
6366
+ this.storage.get(dataKey),
6367
+ this.storage.get(tsKey)
6332
6368
  ]);
6333
6369
  if (!cached || !cachedTs) return false;
6334
6370
  const ts = parseInt(cachedTs, 10);
@@ -6351,9 +6387,10 @@ var TokenRegistry = class _TokenRegistry {
6351
6387
  async saveToCache(definitions) {
6352
6388
  if (!this.storage) return;
6353
6389
  try {
6390
+ const { data: dataKey, ts: tsKey } = this.cacheKeys();
6354
6391
  await Promise.all([
6355
- this.storage.set(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE, JSON.stringify(definitions)),
6356
- this.storage.set(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS, String(Date.now()))
6392
+ this.storage.set(dataKey, JSON.stringify(definitions)),
6393
+ this.storage.set(tsKey, String(Date.now()))
6357
6394
  ]);
6358
6395
  } catch {
6359
6396
  }
@@ -6738,7 +6775,10 @@ function resolveTokenSyncConfig(network, config) {
6738
6775
  return Object.keys(result).length > 0 ? result : void 0;
6739
6776
  }
6740
6777
  function createBrowserProviders(config) {
6741
- const network = config?.network ?? "mainnet";
6778
+ if (!config?.network) {
6779
+ throw new SphereError("createBrowserProviders: config.network is required.", "INVALID_CONFIG");
6780
+ }
6781
+ const network = config.network;
6742
6782
  if (config?.debug !== void 0) {
6743
6783
  logger.configure({ debug: config.debug });
6744
6784
  }