@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.
@@ -3878,7 +3878,7 @@ function getEmbeddedTrustBase(network) {
3878
3878
  case "dev":
3879
3879
  return TRUSTBASE_DEV;
3880
3880
  default:
3881
- return TRUSTBASE_TESTNET;
3881
+ throw new SphereError(`getEmbeddedTrustBase: unknown network "${network}"`, "INVALID_CONFIG");
3882
3882
  }
3883
3883
  }
3884
3884
  var BaseTrustBaseLoader = class {
@@ -3898,9 +3898,24 @@ var BaseTrustBaseLoader = class {
3898
3898
  // impl/browser/oracle/index.ts
3899
3899
  var BrowserTrustBaseLoader = class extends BaseTrustBaseLoader {
3900
3900
  url;
3901
- constructor(networkOrUrl = "testnet") {
3901
+ /**
3902
+ * @param networkOrUrl - a NetworkType, or a URL to fetch the trust base from
3903
+ * @param fallbackNetwork - network used for the embedded fallback when a URL is
3904
+ * supplied (and the fetch fails). Required when networkOrUrl is a URL — we must
3905
+ * never silently fall back to testnet on a different network.
3906
+ */
3907
+ constructor(networkOrUrl, fallbackNetwork) {
3908
+ if (!networkOrUrl) {
3909
+ throw new SphereError("BrowserTrustBaseLoader: network or trustBaseUrl is required.", "INVALID_CONFIG");
3910
+ }
3902
3911
  if (networkOrUrl.startsWith("/") || networkOrUrl.startsWith("http")) {
3903
- super("testnet");
3912
+ if (!fallbackNetwork) {
3913
+ throw new SphereError(
3914
+ "BrowserTrustBaseLoader: fallbackNetwork is required when a trustBaseUrl is supplied.",
3915
+ "INVALID_CONFIG"
3916
+ );
3917
+ }
3918
+ super(fallbackNetwork);
3904
3919
  this.url = networkOrUrl;
3905
3920
  } else {
3906
3921
  super(networkOrUrl);
@@ -3918,14 +3933,21 @@ var BrowserTrustBaseLoader = class extends BaseTrustBaseLoader {
3918
3933
  return null;
3919
3934
  }
3920
3935
  };
3921
- function createBrowserTrustBaseLoader(networkOrUrl) {
3922
- return new BrowserTrustBaseLoader(networkOrUrl);
3936
+ function createBrowserTrustBaseLoader(networkOrUrl, fallbackNetwork) {
3937
+ return new BrowserTrustBaseLoader(networkOrUrl, fallbackNetwork);
3923
3938
  }
3924
3939
  function createUnicityAggregatorProvider(config) {
3925
3940
  const { trustBaseUrl, network, ...restConfig } = config;
3941
+ if (!trustBaseUrl && !network) {
3942
+ throw new SphereError(
3943
+ "createUnicityAggregatorProvider: network or trustBaseUrl required.",
3944
+ "INVALID_CONFIG"
3945
+ );
3946
+ }
3926
3947
  return new UnicityAggregatorProvider({
3927
3948
  ...restConfig,
3928
- trustBaseLoader: createBrowserTrustBaseLoader(trustBaseUrl ?? network ?? "testnet")
3949
+ // When a URL is supplied, `network` (if any) is the embedded-fallback network.
3950
+ trustBaseLoader: createBrowserTrustBaseLoader(trustBaseUrl ?? network, network)
3929
3951
  });
3930
3952
  }
3931
3953
  var createUnicityOracleProvider = createUnicityAggregatorProvider;
@@ -6367,6 +6389,19 @@ var TokenRegistry = class _TokenRegistry {
6367
6389
  // ===========================================================================
6368
6390
  // Cache (StorageProvider)
6369
6391
  // ===========================================================================
6392
+ /**
6393
+ * Per-network cache keys. The registry cache MUST be namespaced by remoteUrl:
6394
+ * testnet and testnet2 ship DIFFERENT coinIds for the same symbol, so a single
6395
+ * global key let a stale testnet snapshot be served for a testnet2 request —
6396
+ * wrong/missing icons AND self-mint resolving the wrong-network coinId. Keying
6397
+ * by remoteUrl isolates the snapshots so a network can never read another's.
6398
+ */
6399
+ cacheKeys() {
6400
+ const base = STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE;
6401
+ const baseTs = STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS;
6402
+ if (!this.remoteUrl) return { data: base, ts: baseTs };
6403
+ return { data: `${base}:${this.remoteUrl}`, ts: `${baseTs}:${this.remoteUrl}` };
6404
+ }
6370
6405
  /**
6371
6406
  * Load definitions from StorageProvider cache.
6372
6407
  * Only applies if cache exists and is fresh (within refreshIntervalMs).
@@ -6374,9 +6409,10 @@ var TokenRegistry = class _TokenRegistry {
6374
6409
  async loadFromCache() {
6375
6410
  if (!this.storage) return false;
6376
6411
  try {
6412
+ const { data: dataKey, ts: tsKey } = this.cacheKeys();
6377
6413
  const [cached, cachedTs] = await Promise.all([
6378
- this.storage.get(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE),
6379
- this.storage.get(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS)
6414
+ this.storage.get(dataKey),
6415
+ this.storage.get(tsKey)
6380
6416
  ]);
6381
6417
  if (!cached || !cachedTs) return false;
6382
6418
  const ts = parseInt(cachedTs, 10);
@@ -6399,9 +6435,10 @@ var TokenRegistry = class _TokenRegistry {
6399
6435
  async saveToCache(definitions) {
6400
6436
  if (!this.storage) return;
6401
6437
  try {
6438
+ const { data: dataKey, ts: tsKey } = this.cacheKeys();
6402
6439
  await Promise.all([
6403
- this.storage.set(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE, JSON.stringify(definitions)),
6404
- this.storage.set(STORAGE_KEYS_GLOBAL.TOKEN_REGISTRY_CACHE_TS, String(Date.now()))
6440
+ this.storage.set(dataKey, JSON.stringify(definitions)),
6441
+ this.storage.set(tsKey, String(Date.now()))
6405
6442
  ]);
6406
6443
  } catch {
6407
6444
  }
@@ -6786,7 +6823,10 @@ function resolveTokenSyncConfig(network, config) {
6786
6823
  return Object.keys(result).length > 0 ? result : void 0;
6787
6824
  }
6788
6825
  function createBrowserProviders(config) {
6789
- const network = config?.network ?? "mainnet";
6826
+ if (!config?.network) {
6827
+ throw new SphereError("createBrowserProviders: config.network is required.", "INVALID_CONFIG");
6828
+ }
6829
+ const network = config.network;
6790
6830
  if (config?.debug !== void 0) {
6791
6831
  logger.configure({ debug: config.debug });
6792
6832
  }