@kheopskit/core 0.1.1 → 0.1.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/dist/index.d.mts CHANGED
@@ -148,6 +148,8 @@ type EthereumAccount = {
148
148
  platform: "ethereum";
149
149
  client: WalletClient<CustomTransport, undefined, Account, undefined>;
150
150
  address: `0x${string}`;
151
+ /** Current chain ID the wallet is connected to. `undefined` while loading or after provider disconnect. */
152
+ chainId: number | undefined;
151
153
  walletName: string;
152
154
  walletId: string;
153
155
  isWalletDefault: boolean;
@@ -174,6 +176,8 @@ type CachedAccount = {
174
176
  platform: WalletPlatform;
175
177
  address: string;
176
178
  name?: string;
179
+ /** Cached chain ID for Ethereum accounts. */
180
+ chainId?: number;
177
181
  walletId: WalletId;
178
182
  walletName: string;
179
183
  };
package/dist/index.d.ts CHANGED
@@ -148,6 +148,8 @@ type EthereumAccount = {
148
148
  platform: "ethereum";
149
149
  client: WalletClient<CustomTransport, undefined, Account, undefined>;
150
150
  address: `0x${string}`;
151
+ /** Current chain ID the wallet is connected to. `undefined` while loading or after provider disconnect. */
152
+ chainId: number | undefined;
151
153
  walletName: string;
152
154
  walletId: string;
153
155
  isWalletDefault: boolean;
@@ -174,6 +176,8 @@ type CachedAccount = {
174
176
  platform: WalletPlatform;
175
177
  address: string;
176
178
  name?: string;
179
+ /** Cached chain ID for Ethereum accounts. */
180
+ chainId?: number;
177
181
  walletId: WalletId;
178
182
  walletName: string;
179
183
  };
package/dist/index.js CHANGED
@@ -166,6 +166,7 @@ var hydrateAccount = (cached) => {
166
166
  id: cached.id,
167
167
  platform: "ethereum",
168
168
  address: cached.address,
169
+ chainId: cached.chainId,
169
170
  walletId: cached.walletId,
170
171
  walletName: cached.walletName,
171
172
  isWalletDefault: false,
@@ -188,6 +189,7 @@ var serializeAccount = (account) => ({
188
189
  platform: account.platform,
189
190
  address: account.address,
190
191
  name: "name" in account ? account.name : void 0,
192
+ chainId: account.platform === "ethereum" ? account.chainId : void 0,
191
193
  walletId: account.walletId,
192
194
  walletName: account.walletName
193
195
  });
@@ -697,12 +699,37 @@ var getWalletAccountId = (walletId, address) => {
697
699
  };
698
700
 
699
701
  // src/api/ethereum/accounts.ts
702
+ var normalizeEvmChainId = (value) => {
703
+ let raw = value;
704
+ if (typeof raw === "string" && raw.startsWith("eip155:")) {
705
+ raw = raw.slice("eip155:".length);
706
+ }
707
+ if (typeof raw === "bigint") {
708
+ return raw >= 0n ? Number(raw) : void 0;
709
+ }
710
+ if (typeof raw === "number") {
711
+ return Number.isInteger(raw) && raw >= 0 ? raw : void 0;
712
+ }
713
+ if (typeof raw === "string") {
714
+ const normalized = raw.trim().toLowerCase();
715
+ if (!normalized) return void 0;
716
+ const parsed = normalized.startsWith("0x") ? Number.parseInt(normalized, 16) : Number.parseInt(normalized, 10);
717
+ return Number.isNaN(parsed) ? void 0 : parsed;
718
+ }
719
+ return void 0;
720
+ };
721
+ var toCaipNetworkId = (value) => {
722
+ const chainId = normalizeEvmChainId(value);
723
+ return chainId === void 0 ? void 0 : `eip155:${chainId}`;
724
+ };
700
725
  var getInjectedWalletAccounts$ = (wallet) => {
701
726
  if (!wallet.isConnected) return (0, import_rxjs5.of)([]);
702
727
  return getCachedObservable$(
703
728
  `accounts:${wallet.id}`,
704
729
  () => new import_rxjs5.Observable((subscriber) => {
705
- const getAccount = (address, i) => {
730
+ const addresses$ = new import_rxjs5.ReplaySubject(1);
731
+ const chainId$ = new import_rxjs5.ReplaySubject(1);
732
+ const getAccount = (address, i, chainId) => {
706
733
  const client = (0, import_viem2.createWalletClient)({
707
734
  account: address,
708
735
  transport: (0, import_viem2.custom)(wallet.provider)
@@ -712,26 +739,42 @@ var getInjectedWalletAccounts$ = (wallet) => {
712
739
  platform: "ethereum",
713
740
  client,
714
741
  address: (0, import_viem2.getAddress)(address),
742
+ chainId,
715
743
  walletName: wallet.name,
716
744
  walletId: wallet.id,
717
745
  isWalletDefault: i === 0
718
746
  };
719
747
  };
720
- const handleAccountsChanged = (addresses) => {
721
- subscriber.next(addresses.map(getAccount));
748
+ const handleAccountsChanged = (addrs) => {
749
+ addresses$.next(addrs);
750
+ };
751
+ const handleChainChanged = (chainIdHex) => {
752
+ chainId$.next(normalizeEvmChainId(chainIdHex));
753
+ };
754
+ const handleDisconnect = () => {
755
+ chainId$.next(void 0);
722
756
  };
723
757
  wallet.provider.on("accountsChanged", handleAccountsChanged);
724
- wallet.provider.request({ method: "eth_accounts" }).then((addresses) => {
725
- subscriber.next(addresses.map(getAccount));
726
- }).catch((err) => {
758
+ wallet.provider.on("chainChanged", handleChainChanged);
759
+ wallet.provider.on("disconnect", handleDisconnect);
760
+ wallet.provider.request({ method: "eth_accounts" }).then((addrs) => addresses$.next(addrs)).catch((err) => {
727
761
  console.error("Failed to get accounts", err);
728
- subscriber.next([]);
762
+ addresses$.next([]);
729
763
  });
764
+ wallet.provider.request({ method: "eth_chainId" }).then(handleChainChanged).catch(() => chainId$.next(void 0));
765
+ const sub = (0, import_rxjs5.combineLatest)([addresses$, chainId$]).pipe(
766
+ (0, import_rxjs5.map)(
767
+ ([addresses, chainId]) => addresses.map((addr, i) => getAccount(addr, i, chainId))
768
+ )
769
+ ).subscribe(subscriber);
730
770
  return () => {
731
771
  wallet.provider.removeListener(
732
772
  "accountsChanged",
733
773
  handleAccountsChanged
734
774
  );
775
+ wallet.provider.removeListener("chainChanged", handleChainChanged);
776
+ wallet.provider.removeListener("disconnect", handleDisconnect);
777
+ sub.unsubscribe();
735
778
  };
736
779
  }).pipe((0, import_rxjs5.shareReplay)({ refCount: true, bufferSize: 1 }))
737
780
  );
@@ -760,24 +803,29 @@ var getAppKitAccounts$ = (wallet) => {
760
803
  () => new import_rxjs5.Observable((subscriber) => {
761
804
  const caipNetworkId$ = new import_rxjs5.ReplaySubject(1);
762
805
  const handleChainChanged = (chainId) => {
763
- caipNetworkId$.next(`eip155:${chainId}`);
806
+ const caipNetworkId = toCaipNetworkId(chainId);
807
+ if (caipNetworkId) {
808
+ caipNetworkId$.next(caipNetworkId);
809
+ }
764
810
  };
765
811
  provider.on("chainChanged", handleChainChanged);
766
812
  provider.request({ method: "eth_chainId" }).then(handleChainChanged);
767
813
  const sub = caipNetworkId$.pipe(
768
814
  (0, import_rxjs5.distinctUntilChanged)(),
769
- (0, import_rxjs5.map)(
770
- (caipNetworkId) => (0, import_viem2.custom)(
815
+ (0, import_rxjs5.map)((caipNetworkId) => {
816
+ const chainId = normalizeEvmChainId(caipNetworkId);
817
+ const transport = (0, import_viem2.custom)(
771
818
  wrapWalletConnectProvider(
772
819
  provider,
773
820
  // biome-ignore lint/style/noNonNullAssertion: legacy
774
821
  provider.session.topic,
775
822
  caipNetworkId
776
823
  )
777
- )
778
- ),
824
+ );
825
+ return { transport, chainId };
826
+ }),
779
827
  (0, import_rxjs5.map)(
780
- (transport) => account.allAccounts.map((acc, i) => {
828
+ ({ transport, chainId }) => account.allAccounts.map((acc, i) => {
781
829
  const client = (0, import_viem2.createWalletClient)({
782
830
  account: acc.address,
783
831
  transport
@@ -789,6 +837,7 @@ var getAppKitAccounts$ = (wallet) => {
789
837
  walletId: wallet.id,
790
838
  address: acc.address,
791
839
  client,
840
+ chainId,
792
841
  isWalletDefault: i === 0
793
842
  };
794
843
  })
@@ -823,7 +872,9 @@ var getEthereumAccounts$ = (ethereumWallets) => new import_rxjs5.Observable((sub
823
872
  );
824
873
  var isSameAccountsList = (a, b) => {
825
874
  if (a.length !== b.length) return false;
826
- return a.every((account, i) => account.id === b[i]?.id);
875
+ return a.every(
876
+ (account, i) => account.id === b[i]?.id && account.chainId === b[i]?.chainId
877
+ );
827
878
  };
828
879
 
829
880
  // src/api/polkadot/accounts.ts
@@ -1039,7 +1090,8 @@ var toCompactStore = (data) => {
1039
1090
  (account) => [
1040
1091
  account.walletId,
1041
1092
  account.address,
1042
- account.name ?? null
1093
+ account.name ?? null,
1094
+ account.chainId ?? null
1043
1095
  ]
1044
1096
  );
1045
1097
  return {
@@ -1064,13 +1116,14 @@ var fromCompactStore = (data) => {
1064
1116
  };
1065
1117
  });
1066
1118
  const accounts = (data.a ?? []).map((item) => {
1067
- const [walletId, address, name] = item;
1119
+ const [walletId, address, name, chainId] = item;
1068
1120
  const { platform } = parseWalletId(walletId);
1069
1121
  return {
1070
1122
  id: getWalletAccountId(walletId, address),
1071
1123
  platform,
1072
1124
  address,
1073
1125
  name: name ?? void 0,
1126
+ chainId: chainId ?? void 0,
1074
1127
  walletId,
1075
1128
  walletName: walletNameMap.get(walletId) ?? walletId
1076
1129
  };
@@ -1532,7 +1585,9 @@ var getKheopskit$ = (config, ssrCookies, existingStore) => {
1532
1585
  var arraysEqual = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
1533
1586
  var statesEqual = (a, b) => a.isHydrating === b.isHydrating && a.wallets.length === b.wallets.length && a.accounts.length === b.accounts.length && a.wallets.every(
1534
1587
  (w, i) => w.id === b.wallets[i]?.id && w.isConnected === b.wallets[i]?.isConnected
1535
- ) && a.accounts.every((acc, i) => acc.id === b.accounts[i]?.id);
1588
+ ) && a.accounts.every(
1589
+ (acc, i) => acc.id === b.accounts[i]?.id && (acc.platform !== "ethereum" || acc.chainId === b.accounts[i]?.chainId)
1590
+ );
1536
1591
  // Annotate the CommonJS export names for ESM import in node:
1537
1592
  0 && (module.exports = {
1538
1593
  DEFAULT_STORAGE_KEY,