@talismn/balances 0.0.0-pr2091-20250721015613 → 0.0.0-pr2091-20250727075918

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.
@@ -11,6 +11,9 @@ var BigNumber = require('bignumber.js');
11
11
  var web3_js = require('@solana/web3.js');
12
12
  var util = require('@talismn/util');
13
13
  var scale = require('@talismn/scale');
14
+ var mplTokenMetadata = require('@metaplex-foundation/mpl-token-metadata');
15
+ var umi = require('@metaplex-foundation/umi');
16
+ var splToken = require('@solana/spl-token');
14
17
  var tokenRates = require('@talismn/token-rates');
15
18
  var utils = require('@polkadot-api/utils');
16
19
  var polkadotApi = require('polkadot-api');
@@ -30,8 +33,8 @@ var BigNumber__default = /*#__PURE__*/_interopDefault(BigNumber);
30
33
  var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
31
34
  var PQueue__default = /*#__PURE__*/_interopDefault(PQueue);
32
35
 
33
- const MODULE_TYPE$9 = chaindataProvider.EvmErc20TokenSchema.shape.type.value;
34
- const PLATFORM$9 = chaindataProvider.EvmErc20TokenSchema.shape.platform.value;
36
+ const MODULE_TYPE$a = chaindataProvider.EvmErc20TokenSchema.shape.type.value;
37
+ const PLATFORM$a = chaindataProvider.EvmErc20TokenSchema.shape.platform.value;
35
38
 
36
39
  const abiMulticall = viem.parseAbi(["struct Call { address target; bytes callData; }", "struct Call3 { address target; bool allowFailure; bytes callData; }", "struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }", "struct Result { bool success; bytes returnData; }", "function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)", "function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)", "function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)", "function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)", "function getBasefee() view returns (uint256 basefee)", "function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)", "function getBlockNumber() view returns (uint256 blockNumber)", "function getChainId() view returns (uint256 chainid)", "function getCurrentBlockCoinbase() view returns (address coinbase)", "function getCurrentBlockDifficulty() view returns (uint256 difficulty)", "function getCurrentBlockGasLimit() view returns (uint256 gaslimit)", "function getCurrentBlockTimestamp() view returns (uint256 timestamp)", "function getEthBalance(address addr) view returns (uint256 balance)", "function getLastBlockHash() view returns (bytes32 blockHash)", "function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)", "function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)"]);
37
40
 
@@ -627,7 +630,7 @@ const getBalanceDefs = addressesByToken => {
627
630
  // if there is at least one storage entry, the results will be an array with a single object
628
631
  // if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array
629
632
 
630
- const fetchBalances$9 = async ({
633
+ const fetchBalances$a = async ({
631
634
  networkId,
632
635
  tokensWithAddresses,
633
636
  connector
@@ -639,7 +642,7 @@ const fetchBalances$9 = async ({
639
642
  const client = await connector.getPublicClientForEvmNetwork(networkId);
640
643
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
641
644
  for (const [token, addresses] of tokensWithAddresses) {
642
- if (token.type !== MODULE_TYPE$9 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
645
+ if (token.type !== MODULE_TYPE$a || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
643
646
  for (const address of addresses) if (!crypto.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
644
647
  }
645
648
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
@@ -669,7 +672,7 @@ const fetchWithoutAggregator = async (client, balanceDefs) => {
669
672
  address,
670
673
  tokenId: token.id,
671
674
  value: result.toString(),
672
- source: MODULE_TYPE$9,
675
+ source: MODULE_TYPE$a,
673
676
  networkId: chaindataProvider.parseEvmErc20TokenId(token.id).networkId,
674
677
  status: "live"
675
678
  };
@@ -712,7 +715,7 @@ const fetchWithAggregator = async (client, balanceDefs, erc20BalancesAggregatorA
712
715
  address: balanceDef.address,
713
716
  tokenId: balanceDef.token.id,
714
717
  value: erc20Balances[index].toString(),
715
- source: MODULE_TYPE$9,
718
+ source: MODULE_TYPE$a,
716
719
  networkId: chaindataProvider.parseTokenId(balanceDef.token.id).networkId,
717
720
  status: "live"
718
721
  }));
@@ -769,7 +772,7 @@ const getTypedContract$1 = (client, abi, contractAddress) => viem.getContract({
769
772
  }
770
773
  });
771
774
 
772
- const TokenCacheSchema$1 = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
775
+ const TokenCacheSchema$2 = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
773
776
  id: chaindataProvider.EvmErc20TokenSchema.shape.id,
774
777
  isValid: z__default.default.literal(true),
775
778
  ...chaindataProvider.EvmErc20TokenSchema.pick({
@@ -781,7 +784,7 @@ const TokenCacheSchema$1 = z__default.default.discriminatedUnion("isValid", [z__
781
784
  id: chaindataProvider.EvmErc20TokenSchema.shape.id,
782
785
  isValid: z__default.default.literal(false)
783
786
  })]);
784
- const fetchTokens$9 = async ({
787
+ const fetchTokens$a = async ({
785
788
  networkId,
786
789
  tokens,
787
790
  connector,
@@ -790,7 +793,7 @@ const fetchTokens$9 = async ({
790
793
  const result = [];
791
794
  for (const tokenConfig of tokens) {
792
795
  const tokenId = chaindataProvider.evmErc20TokenId(networkId, tokenConfig.contractAddress);
793
- const cached = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
796
+ const cached = cache[tokenId] && TokenCacheSchema$2.safeParse(cache[tokenId]).data;
794
797
  if (!cached) {
795
798
  const client = await connector.getPublicClientForEvmNetwork(networkId);
796
799
  if (!client) {
@@ -803,7 +806,7 @@ const fetchTokens$9 = async ({
803
806
  decimals,
804
807
  symbol
805
808
  } = await getErc20ContractData$1(client, tokenConfig.contractAddress);
806
- cache[tokenId] = TokenCacheSchema$1.parse({
809
+ cache[tokenId] = TokenCacheSchema$2.parse({
807
810
  id: tokenId,
808
811
  symbol,
809
812
  decimals,
@@ -821,11 +824,11 @@ const fetchTokens$9 = async ({
821
824
  }
822
825
  const base = {
823
826
  id: tokenId,
824
- type: MODULE_TYPE$9,
825
- platform: PLATFORM$9,
827
+ type: MODULE_TYPE$a,
828
+ platform: PLATFORM$a,
826
829
  networkId
827
830
  };
828
- const cached2 = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
831
+ const cached2 = cache[tokenId] && TokenCacheSchema$2.safeParse(cache[tokenId]).data;
829
832
  if (cached2?.isValid === false) continue;
830
833
  const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
831
834
  const parsed = chaindataProvider.EvmErc20TokenSchema.safeParse(token);
@@ -840,17 +843,17 @@ const fetchTokens$9 = async ({
840
843
  return result;
841
844
  };
842
845
 
843
- const getMiniMetadata$9 = () => {
846
+ const getMiniMetadata$a = () => {
844
847
  throw new Error("MiniMetadata is not supported for ethereum tokens");
845
848
  };
846
849
 
847
- const getTransferCallData$9 = ({
850
+ const getTransferCallData$a = ({
848
851
  from,
849
852
  to,
850
853
  value,
851
854
  token
852
855
  }) => {
853
- if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$9)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$9}.`);
856
+ if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$a)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$a}.`);
854
857
  if (!crypto.isEthereumAddress(from)) throw new Error("Invalid from address");
855
858
  if (!crypto.isEthereumAddress(to)) throw new Error("Invalid to address");
856
859
  const data = viem.encodeFunctionData({
@@ -865,8 +868,8 @@ const getTransferCallData$9 = ({
865
868
  };
866
869
  };
867
870
 
868
- const SUBSCRIPTION_INTERVAL$5 = 6_000;
869
- const subscribeBalances$9 = ({
871
+ const SUBSCRIPTION_INTERVAL$6 = 6_000;
872
+ const subscribeBalances$a = ({
870
873
  networkId,
871
874
  tokensWithAddresses,
872
875
  connector
@@ -880,17 +883,17 @@ const subscribeBalances$9 = ({
880
883
  const poll = async () => {
881
884
  try {
882
885
  if (abortController.signal.aborted) return;
883
- const balances = await fetchBalances$9({
886
+ const balances = await fetchBalances$a({
884
887
  networkId,
885
888
  tokensWithAddresses: tokensWithAddresses,
886
889
  connector
887
890
  });
888
891
  if (abortController.signal.aborted) return;
889
892
  subscriber.next(balances);
890
- setTimeout(poll, SUBSCRIPTION_INTERVAL$5);
893
+ setTimeout(poll, SUBSCRIPTION_INTERVAL$6);
891
894
  } catch (error) {
892
895
  log.error("Error", {
893
- module: MODULE_TYPE$9,
896
+ module: MODULE_TYPE$a,
894
897
  networkId,
895
898
  addressesByToken: tokensWithAddresses,
896
899
  error
@@ -906,13 +909,13 @@ const subscribeBalances$9 = ({
906
909
  };
907
910
 
908
911
  const EvmErc20BalanceModule = {
909
- type: MODULE_TYPE$9,
910
- platform: PLATFORM$9,
911
- getMiniMetadata: getMiniMetadata$9,
912
- fetchTokens: fetchTokens$9,
913
- fetchBalances: fetchBalances$9,
914
- subscribeBalances: subscribeBalances$9,
915
- getTransferCallData: getTransferCallData$9
912
+ type: MODULE_TYPE$a,
913
+ platform: PLATFORM$a,
914
+ getMiniMetadata: getMiniMetadata$a,
915
+ fetchTokens: fetchTokens$a,
916
+ fetchBalances: fetchBalances$a,
917
+ subscribeBalances: subscribeBalances$a,
918
+ getTransferCallData: getTransferCallData$a
916
919
  };
917
920
 
918
921
  const TokenConfigBaseSchema = chaindataProvider.TokenBaseSchema.partial().omit({
@@ -925,10 +928,10 @@ const EvmErc20TokenConfigSchema = z__default.default.strictObject({
925
928
  ...TokenConfigBaseSchema.shape
926
929
  });
927
930
 
928
- const MODULE_TYPE$8 = chaindataProvider.EvmNativeTokenSchema.shape.type.value;
929
- const PLATFORM$8 = chaindataProvider.EvmNativeTokenSchema.shape.platform.value;
931
+ const MODULE_TYPE$9 = chaindataProvider.EvmNativeTokenSchema.shape.type.value;
932
+ const PLATFORM$9 = chaindataProvider.EvmNativeTokenSchema.shape.platform.value;
930
933
 
931
- const fetchBalances$8 = async ({
934
+ const fetchBalances$9 = async ({
932
935
  networkId,
933
936
  tokensWithAddresses,
934
937
  connector
@@ -940,7 +943,7 @@ const fetchBalances$8 = async ({
940
943
  const client = await connector.getPublicClientForEvmNetwork(networkId);
941
944
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
942
945
  for (const [token, addresses] of tokensWithAddresses) {
943
- if (token.type !== MODULE_TYPE$8 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
946
+ if (token.type !== MODULE_TYPE$9 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
944
947
  for (const address of addresses) if (!crypto.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
945
948
  }
946
949
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
@@ -967,7 +970,7 @@ const fetchWithoutMulticall = async (client, balanceDefs) => {
967
970
  address,
968
971
  tokenId: token.id,
969
972
  value: result.toString(),
970
- source: MODULE_TYPE$8,
973
+ source: MODULE_TYPE$9,
971
974
  networkId: chaindataProvider.parseTokenId(token.id).networkId,
972
975
  status: "live"
973
976
  };
@@ -1013,7 +1016,7 @@ const fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
1013
1016
  address: balanceDefs[index].address,
1014
1017
  tokenId: balanceDefs[index].token.id,
1015
1018
  value: result.result.toString(),
1016
- source: MODULE_TYPE$8,
1019
+ source: MODULE_TYPE$9,
1017
1020
  networkId: chaindataProvider.parseTokenId(balanceDefs[index].token.id).networkId,
1018
1021
  status: "live"
1019
1022
  });
@@ -1043,7 +1046,7 @@ const fetchWithMulticall = async (client, balanceDefs, multicall3Address) => {
1043
1046
  }
1044
1047
  };
1045
1048
 
1046
- const fetchTokens$8 = async ({
1049
+ const fetchTokens$9 = async ({
1047
1050
  networkId,
1048
1051
  tokens
1049
1052
  }) => {
@@ -1051,8 +1054,8 @@ const fetchTokens$8 = async ({
1051
1054
  if (tokens.length !== 1) throw new Error("EVM Native module expects the nativeCurrency to be passed as a single token in the array");
1052
1055
  const token = lodashEs.assign({
1053
1056
  id: chaindataProvider.evmNativeTokenId(networkId),
1054
- type: MODULE_TYPE$8,
1055
- platform: PLATFORM$8,
1057
+ type: MODULE_TYPE$9,
1058
+ platform: PLATFORM$9,
1056
1059
  networkId,
1057
1060
  isDefault: true
1058
1061
  }, tokens[0]);
@@ -1064,17 +1067,17 @@ const fetchTokens$8 = async ({
1064
1067
  return [parsed.data];
1065
1068
  };
1066
1069
 
1067
- const getMiniMetadata$8 = () => {
1070
+ const getMiniMetadata$9 = () => {
1068
1071
  throw new Error("MiniMetadata is not supported for ethereum tokens");
1069
1072
  };
1070
1073
 
1071
- const getTransferCallData$8 = ({
1074
+ const getTransferCallData$9 = ({
1072
1075
  from,
1073
1076
  to,
1074
1077
  value,
1075
1078
  token
1076
1079
  }) => {
1077
- if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$8)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$8}.`);
1080
+ if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$9)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$9}.`);
1078
1081
  if (!crypto.isEthereumAddress(from)) throw new Error("Invalid from address");
1079
1082
  if (!crypto.isEthereumAddress(to)) throw new Error("Invalid to address");
1080
1083
  return {
@@ -1085,8 +1088,8 @@ const getTransferCallData$8 = ({
1085
1088
  };
1086
1089
  };
1087
1090
 
1088
- const SUBSCRIPTION_INTERVAL$4 = 6_000;
1089
- const subscribeBalances$8 = ({
1091
+ const SUBSCRIPTION_INTERVAL$5 = 6_000;
1092
+ const subscribeBalances$9 = ({
1090
1093
  networkId,
1091
1094
  tokensWithAddresses,
1092
1095
  connector
@@ -1100,17 +1103,17 @@ const subscribeBalances$8 = ({
1100
1103
  const poll = async () => {
1101
1104
  try {
1102
1105
  if (abortController.signal.aborted) return;
1103
- const balances = await fetchBalances$8({
1106
+ const balances = await fetchBalances$9({
1104
1107
  networkId,
1105
1108
  tokensWithAddresses: tokensWithAddresses,
1106
1109
  connector
1107
1110
  });
1108
1111
  if (abortController.signal.aborted) return;
1109
1112
  subscriber.next(balances);
1110
- setTimeout(poll, SUBSCRIPTION_INTERVAL$4);
1113
+ setTimeout(poll, SUBSCRIPTION_INTERVAL$5);
1111
1114
  } catch (error) {
1112
1115
  log.error("Error", {
1113
- module: MODULE_TYPE$8,
1116
+ module: MODULE_TYPE$9,
1114
1117
  networkId,
1115
1118
  addressesByToken: tokensWithAddresses,
1116
1119
  error
@@ -1126,13 +1129,13 @@ const subscribeBalances$8 = ({
1126
1129
  };
1127
1130
 
1128
1131
  const EvmNativeBalanceModule = {
1129
- type: MODULE_TYPE$8,
1130
- platform: PLATFORM$8,
1131
- getMiniMetadata: getMiniMetadata$8,
1132
- fetchTokens: fetchTokens$8,
1133
- fetchBalances: fetchBalances$8,
1134
- subscribeBalances: subscribeBalances$8,
1135
- getTransferCallData: getTransferCallData$8
1132
+ type: MODULE_TYPE$9,
1133
+ platform: PLATFORM$9,
1134
+ getMiniMetadata: getMiniMetadata$9,
1135
+ fetchTokens: fetchTokens$9,
1136
+ fetchBalances: fetchBalances$9,
1137
+ subscribeBalances: subscribeBalances$9,
1138
+ getTransferCallData: getTransferCallData$9
1136
1139
  };
1137
1140
 
1138
1141
  // to be used by chaindata too
@@ -1140,10 +1143,10 @@ const EvmNativeTokenConfigSchema = z__default.default.strictObject({
1140
1143
  ...TokenConfigBaseSchema.shape
1141
1144
  });
1142
1145
 
1143
- const MODULE_TYPE$7 = chaindataProvider.EvmUniswapV2TokenSchema.shape.type.value;
1144
- const PLATFORM$7 = chaindataProvider.EvmUniswapV2TokenSchema.shape.platform.value;
1146
+ const MODULE_TYPE$8 = chaindataProvider.EvmUniswapV2TokenSchema.shape.type.value;
1147
+ const PLATFORM$8 = chaindataProvider.EvmUniswapV2TokenSchema.shape.platform.value;
1145
1148
 
1146
- const fetchBalances$7 = async ({
1149
+ const fetchBalances$8 = async ({
1147
1150
  networkId,
1148
1151
  tokensWithAddresses,
1149
1152
  connector
@@ -1155,7 +1158,7 @@ const fetchBalances$7 = async ({
1155
1158
  const client = await connector.getPublicClientForEvmNetwork(networkId);
1156
1159
  if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`);
1157
1160
  for (const [token, addresses] of tokensWithAddresses) {
1158
- if (token.type !== MODULE_TYPE$7 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
1161
+ if (token.type !== MODULE_TYPE$8 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`);
1159
1162
  for (const address of addresses) if (!crypto.isEthereumAddress(address)) throw new Error(`Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`);
1160
1163
  }
1161
1164
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
@@ -1242,7 +1245,7 @@ const fetchPoolBalances = async (client, balanceDefs) => {
1242
1245
  acc.success.push({
1243
1246
  address,
1244
1247
  tokenId: token.id,
1245
- source: MODULE_TYPE$7,
1248
+ source: MODULE_TYPE$8,
1246
1249
  networkId: chaindataProvider.parseTokenId(token.id).networkId,
1247
1250
  status: "live",
1248
1251
  values: [{
@@ -1302,7 +1305,7 @@ const getUniswapV2PairContractData = async (client, contractAddress) => {
1302
1305
  };
1303
1306
  };
1304
1307
 
1305
- const TokenCacheSchema = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
1308
+ const TokenCacheSchema$1 = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
1306
1309
  id: chaindataProvider.EvmUniswapV2TokenSchema.shape.id,
1307
1310
  isValid: z__default.default.literal(true),
1308
1311
  ...chaindataProvider.EvmUniswapV2TokenSchema.pick({
@@ -1320,7 +1323,7 @@ const TokenCacheSchema = z__default.default.discriminatedUnion("isValid", [z__de
1320
1323
  id: chaindataProvider.EvmUniswapV2TokenSchema.shape.id,
1321
1324
  isValid: z__default.default.literal(false)
1322
1325
  })]);
1323
- const fetchTokens$7 = async ({
1326
+ const fetchTokens$8 = async ({
1324
1327
  networkId,
1325
1328
  tokens,
1326
1329
  connector,
@@ -1329,7 +1332,7 @@ const fetchTokens$7 = async ({
1329
1332
  const result = [];
1330
1333
  for (const tokenConfig of tokens) {
1331
1334
  const tokenId = chaindataProvider.evmUniswapV2TokenId(networkId, tokenConfig.contractAddress);
1332
- const cached = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
1335
+ const cached = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
1333
1336
  if (!cached) {
1334
1337
  const client = await connector.getPublicClientForEvmNetwork(networkId);
1335
1338
  if (!client) {
@@ -1351,7 +1354,7 @@ const fetchTokens$7 = async ({
1351
1354
  symbol: symbol1,
1352
1355
  decimals: decimals1
1353
1356
  } = await getErc20ContractData(client, token1);
1354
- cache[tokenId] = TokenCacheSchema.parse({
1357
+ cache[tokenId] = TokenCacheSchema$1.parse({
1355
1358
  id: tokenId,
1356
1359
  symbol: `${symbol0}/${symbol1}`,
1357
1360
  decimals,
@@ -1379,11 +1382,11 @@ const fetchTokens$7 = async ({
1379
1382
  }
1380
1383
  const base = {
1381
1384
  id: tokenId,
1382
- type: MODULE_TYPE$7,
1383
- platform: PLATFORM$7,
1385
+ type: MODULE_TYPE$8,
1386
+ platform: PLATFORM$8,
1384
1387
  networkId
1385
1388
  };
1386
- const cached2 = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
1389
+ const cached2 = cache[tokenId] && TokenCacheSchema$1.safeParse(cache[tokenId]).data;
1387
1390
  if (cached2?.isValid === false) continue;
1388
1391
  const token = lodashEs.assign(base, cached2?.isValid ? lodashEs.omit(cached2, ["isValid"]) : {}, tokenConfig);
1389
1392
  const parsed = chaindataProvider.EvmUniswapV2TokenSchema.safeParse(token);
@@ -1396,17 +1399,17 @@ const fetchTokens$7 = async ({
1396
1399
  return result;
1397
1400
  };
1398
1401
 
1399
- const getMiniMetadata$7 = () => {
1402
+ const getMiniMetadata$8 = () => {
1400
1403
  throw new Error("MiniMetadata is not supported for ethereum tokens");
1401
1404
  };
1402
1405
 
1403
- const getTransferCallData$7 = ({
1406
+ const getTransferCallData$8 = ({
1404
1407
  from,
1405
1408
  to,
1406
1409
  value,
1407
1410
  token
1408
1411
  }) => {
1409
- if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$7)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$7}.`);
1412
+ if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$8)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$8}.`);
1410
1413
  if (!crypto.isEthereumAddress(from)) throw new Error("Invalid from address");
1411
1414
  if (!crypto.isEthereumAddress(to)) throw new Error("Invalid to address");
1412
1415
  const data = viem.encodeFunctionData({
@@ -1421,8 +1424,8 @@ const getTransferCallData$7 = ({
1421
1424
  };
1422
1425
  };
1423
1426
 
1424
- const SUBSCRIPTION_INTERVAL$3 = 6_000;
1425
- const subscribeBalances$7 = ({
1427
+ const SUBSCRIPTION_INTERVAL$4 = 6_000;
1428
+ const subscribeBalances$8 = ({
1426
1429
  networkId,
1427
1430
  tokensWithAddresses,
1428
1431
  connector
@@ -1436,17 +1439,17 @@ const subscribeBalances$7 = ({
1436
1439
  const poll = async () => {
1437
1440
  try {
1438
1441
  if (abortController.signal.aborted) return;
1439
- const balances = await fetchBalances$7({
1442
+ const balances = await fetchBalances$8({
1440
1443
  networkId,
1441
1444
  tokensWithAddresses: tokensWithAddresses,
1442
1445
  connector
1443
1446
  });
1444
1447
  if (abortController.signal.aborted) return;
1445
1448
  subscriber.next(balances);
1446
- setTimeout(poll, SUBSCRIPTION_INTERVAL$3);
1449
+ setTimeout(poll, SUBSCRIPTION_INTERVAL$4);
1447
1450
  } catch (error) {
1448
1451
  log.error("Error", {
1449
- module: MODULE_TYPE$7,
1452
+ module: MODULE_TYPE$8,
1450
1453
  networkId,
1451
1454
  addressesByToken: tokensWithAddresses,
1452
1455
  error
@@ -1462,13 +1465,13 @@ const subscribeBalances$7 = ({
1462
1465
  };
1463
1466
 
1464
1467
  const EvmUniswapV2BalanceModule = {
1465
- type: MODULE_TYPE$7,
1466
- platform: PLATFORM$7,
1467
- getMiniMetadata: getMiniMetadata$7,
1468
- fetchTokens: fetchTokens$7,
1469
- fetchBalances: fetchBalances$7,
1470
- subscribeBalances: subscribeBalances$7,
1471
- getTransferCallData: getTransferCallData$7
1468
+ type: MODULE_TYPE$8,
1469
+ platform: PLATFORM$8,
1470
+ getMiniMetadata: getMiniMetadata$8,
1471
+ fetchTokens: fetchTokens$8,
1472
+ fetchBalances: fetchBalances$8,
1473
+ subscribeBalances: subscribeBalances$8,
1474
+ getTransferCallData: getTransferCallData$8
1472
1475
  };
1473
1476
 
1474
1477
  // to be used by chaindata too
@@ -1477,10 +1480,10 @@ const EvmUniswapV2TokenConfigSchema = z__default.default.strictObject({
1477
1480
  ...TokenConfigBaseSchema.shape
1478
1481
  });
1479
1482
 
1480
- const MODULE_TYPE$6 = chaindataProvider.SolNativeTokenSchema.shape.type.value;
1481
- const PLATFORM$6 = chaindataProvider.SolNativeTokenSchema.shape.platform.value;
1483
+ const MODULE_TYPE$7 = chaindataProvider.SolNativeTokenSchema.shape.type.value;
1484
+ const PLATFORM$7 = chaindataProvider.SolNativeTokenSchema.shape.platform.value;
1482
1485
 
1483
- const fetchBalances$6 = async ({
1486
+ const fetchBalances$7 = async ({
1484
1487
  networkId,
1485
1488
  tokensWithAddresses,
1486
1489
  connector
@@ -1492,7 +1495,7 @@ const fetchBalances$6 = async ({
1492
1495
  const connection = await connector.getConnection(networkId);
1493
1496
  if (!connection) throw new Error(`Could not get rpc provider for sol network ${networkId}`);
1494
1497
  for (const [token, addresses] of tokensWithAddresses) {
1495
- if (token.type !== MODULE_TYPE$6 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for balance module: ${token.type} on ${token.networkId}`);
1498
+ if (token.type !== MODULE_TYPE$7 || token.networkId !== networkId) throw new Error(`Invalid token type or networkId for balance module: ${token.type} on ${token.networkId}`);
1496
1499
  for (const address of addresses) if (!crypto.isSolanaAddress(address)) throw new Error(`Invalid solana address for balance module: ${address} for token ${token.id}`);
1497
1500
  }
1498
1501
  const balanceDefs = getBalanceDefs(tokensWithAddresses);
@@ -1507,7 +1510,7 @@ const fetchBalances$6 = async ({
1507
1510
  address: address,
1508
1511
  tokenId: token.id,
1509
1512
  value: lamports.toString(),
1510
- source: MODULE_TYPE$6,
1513
+ source: MODULE_TYPE$7,
1511
1514
  networkId: token.networkId,
1512
1515
  status: "live"
1513
1516
  };
@@ -1531,7 +1534,7 @@ const fetchBalances$6 = async ({
1531
1534
  });
1532
1535
  };
1533
1536
 
1534
- const fetchTokens$6 = async ({
1537
+ const fetchTokens$7 = async ({
1535
1538
  networkId,
1536
1539
  tokens
1537
1540
  }) => {
@@ -1539,8 +1542,8 @@ const fetchTokens$6 = async ({
1539
1542
  if (tokens.length !== 1) throw new Error("EVM Native module expects the nativeCurrency to be passed as a single token in the array");
1540
1543
  const token = lodashEs.assign({
1541
1544
  id: chaindataProvider.solNativeTokenId(networkId),
1542
- type: MODULE_TYPE$6,
1543
- platform: PLATFORM$6,
1545
+ type: MODULE_TYPE$7,
1546
+ platform: PLATFORM$7,
1544
1547
  networkId,
1545
1548
  isDefault: true
1546
1549
  }, tokens[0]);
@@ -1552,17 +1555,17 @@ const fetchTokens$6 = async ({
1552
1555
  return [parsed.data];
1553
1556
  };
1554
1557
 
1555
- const getMiniMetadata$6 = () => {
1558
+ const getMiniMetadata$7 = () => {
1556
1559
  throw new Error("MiniMetadata is not supported for sol-native tokens");
1557
1560
  };
1558
1561
 
1559
- const getTransferCallData$6 = ({
1562
+ const getTransferCallData$7 = ({
1560
1563
  from,
1561
1564
  to,
1562
1565
  value,
1563
1566
  token
1564
1567
  }) => {
1565
- if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$6)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$6}.`);
1568
+ if (!chaindataProvider.isTokenOfType(token, MODULE_TYPE$7)) throw new Error(`Token type ${token.type} is not ${MODULE_TYPE$7}.`);
1566
1569
  const fromPubkey = new web3_js.PublicKey(from);
1567
1570
  const transferIx = web3_js.SystemProgram.transfer({
1568
1571
  fromPubkey,
@@ -1572,8 +1575,8 @@ const getTransferCallData$6 = ({
1572
1575
  return transferIx;
1573
1576
  };
1574
1577
 
1575
- const SUBSCRIPTION_INTERVAL$2 = 6_000;
1576
- const subscribeBalances$6 = ({
1578
+ const SUBSCRIPTION_INTERVAL$3 = 6_000;
1579
+ const subscribeBalances$7 = ({
1577
1580
  networkId,
1578
1581
  tokensWithAddresses,
1579
1582
  connector
@@ -1587,17 +1590,17 @@ const subscribeBalances$6 = ({
1587
1590
  const poll = async () => {
1588
1591
  try {
1589
1592
  if (abortController.signal.aborted) return;
1590
- const balances = await fetchBalances$6({
1593
+ const balances = await fetchBalances$7({
1591
1594
  networkId,
1592
1595
  tokensWithAddresses,
1593
1596
  connector
1594
1597
  });
1595
1598
  if (abortController.signal.aborted) return;
1596
1599
  subscriber.next(balances);
1597
- setTimeout(poll, SUBSCRIPTION_INTERVAL$2);
1600
+ setTimeout(poll, SUBSCRIPTION_INTERVAL$3);
1598
1601
  } catch (error) {
1599
1602
  log.error("Error", {
1600
- module: MODULE_TYPE$6,
1603
+ module: MODULE_TYPE$7,
1601
1604
  networkId,
1602
1605
  tokensWithAddresses,
1603
1606
  error
@@ -1613,13 +1616,13 @@ const subscribeBalances$6 = ({
1613
1616
  };
1614
1617
 
1615
1618
  const SolNativeBalanceModule = {
1616
- type: MODULE_TYPE$6,
1617
- platform: PLATFORM$6,
1618
- getMiniMetadata: getMiniMetadata$6,
1619
- fetchTokens: fetchTokens$6,
1620
- fetchBalances: fetchBalances$6,
1621
- subscribeBalances: subscribeBalances$6,
1622
- getTransferCallData: getTransferCallData$6
1619
+ type: MODULE_TYPE$7,
1620
+ platform: PLATFORM$7,
1621
+ getMiniMetadata: getMiniMetadata$7,
1622
+ fetchTokens: fetchTokens$7,
1623
+ fetchBalances: fetchBalances$7,
1624
+ subscribeBalances: subscribeBalances$7,
1625
+ getTransferCallData: getTransferCallData$7
1623
1626
  };
1624
1627
 
1625
1628
  // to be used by chaindata too
@@ -1627,8 +1630,61 @@ const SolNativeTokenConfigSchema = z__default.default.strictObject({
1627
1630
  ...TokenConfigBaseSchema.shape
1628
1631
  });
1629
1632
 
1630
- const MODULE_TYPE$5 = chaindataProvider.SubAssetsTokenSchema.shape.type.value;
1631
- const PLATFORM$5 = chaindataProvider.SubAssetsTokenSchema.shape.platform.value;
1633
+ const MODULE_TYPE$6 = chaindataProvider.SolSplTokenSchema.shape.type.value;
1634
+ const PLATFORM$6 = chaindataProvider.SolSplTokenSchema.shape.platform.value;
1635
+
1636
+ const fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName, method, args) => {
1637
+ const {
1638
+ builder
1639
+ } = scale.parseMetadataRpc(metadataRpc);
1640
+ const call = builder.buildRuntimeCall(apiName, method);
1641
+ const hex = await connector.send(networkId, "state_call", [`${apiName}_${method}`, scale.toHex(call.args.enc(args))]);
1642
+ return call.value.dec(hex);
1643
+ };
1644
+
1645
+ const hasStorageItem = (metadata, palletName, itemName) => {
1646
+ const pallet = metadata.pallets.find(p => p.name === palletName);
1647
+ if (!pallet || !pallet.storage) return false;
1648
+ return pallet.storage.items.some(item => item.name === itemName);
1649
+ };
1650
+ const hasStorageItems = (metadata, palletName, itemNames) => {
1651
+ const pallet = metadata.pallets.find(p => p.name === palletName);
1652
+ if (!pallet || !pallet.storage) return false;
1653
+ return itemNames.every(itemName => pallet.storage?.items.some(item => item.name === itemName));
1654
+ };
1655
+ const hasRuntimeApi = (metadata, apiName, method) => {
1656
+ const api = metadata.apis.find(api => api.name === apiName);
1657
+ if (!api || !api.methods) return false;
1658
+ return api.methods.some(m => m.name === method);
1659
+ };
1660
+ const getConstantValue = (metadataRpc, pallet, constant) => {
1661
+ const {
1662
+ unifiedMetadata,
1663
+ builder
1664
+ } = scale.parseMetadataRpc(metadataRpc);
1665
+ const codec = builder.buildConstant(pallet, constant);
1666
+ const encodedValue = unifiedMetadata.pallets.find(({
1667
+ name
1668
+ }) => name === pallet)?.constants.find(({
1669
+ name
1670
+ }) => name === constant)?.value;
1671
+ if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`);
1672
+ return codec.dec(encodedValue);
1673
+ };
1674
+ const tryGetConstantValue = (metadataRpc, pallet, constant) => {
1675
+ const {
1676
+ unifiedMetadata,
1677
+ builder
1678
+ } = scale.parseMetadataRpc(metadataRpc);
1679
+ const encodedValue = unifiedMetadata.pallets.find(({
1680
+ name
1681
+ }) => name === pallet)?.constants.find(({
1682
+ name
1683
+ }) => name === constant)?.value;
1684
+ if (!encodedValue) return null;
1685
+ const codec = builder.buildConstant(pallet, constant);
1686
+ return codec.dec(encodedValue);
1687
+ };
1632
1688
 
1633
1689
  const fetchRpcQueryPack = async (connector, networkId, queries) => {
1634
1690
  const allStateKeys = queries.flatMap(({
@@ -1693,59 +1749,6 @@ const decodeRpcQueryPack = (queries, result) => {
1693
1749
  }, []);
1694
1750
  };
1695
1751
 
1696
- const fetchRuntimeCallResult = async (connector, networkId, metadataRpc, apiName, method, args) => {
1697
- const {
1698
- builder
1699
- } = scale.parseMetadataRpc(metadataRpc);
1700
- const call = builder.buildRuntimeCall(apiName, method);
1701
- const hex = await connector.send(networkId, "state_call", [`${apiName}_${method}`, scale.toHex(call.args.enc(args))]);
1702
- return call.value.dec(hex);
1703
- };
1704
-
1705
- const hasStorageItem = (metadata, palletName, itemName) => {
1706
- const pallet = metadata.pallets.find(p => p.name === palletName);
1707
- if (!pallet || !pallet.storage) return false;
1708
- return pallet.storage.items.some(item => item.name === itemName);
1709
- };
1710
- const hasStorageItems = (metadata, palletName, itemNames) => {
1711
- const pallet = metadata.pallets.find(p => p.name === palletName);
1712
- if (!pallet || !pallet.storage) return false;
1713
- return itemNames.every(itemName => pallet.storage?.items.some(item => item.name === itemName));
1714
- };
1715
- const hasRuntimeApi = (metadata, apiName, method) => {
1716
- const api = metadata.apis.find(api => api.name === apiName);
1717
- if (!api || !api.methods) return false;
1718
- return api.methods.some(m => m.name === method);
1719
- };
1720
- const getConstantValue = (metadataRpc, pallet, constant) => {
1721
- const {
1722
- unifiedMetadata,
1723
- builder
1724
- } = scale.parseMetadataRpc(metadataRpc);
1725
- const codec = builder.buildConstant(pallet, constant);
1726
- const encodedValue = unifiedMetadata.pallets.find(({
1727
- name
1728
- }) => name === pallet)?.constants.find(({
1729
- name
1730
- }) => name === constant)?.value;
1731
- if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`);
1732
- return codec.dec(encodedValue);
1733
- };
1734
- const tryGetConstantValue = (metadataRpc, pallet, constant) => {
1735
- const {
1736
- unifiedMetadata,
1737
- builder
1738
- } = scale.parseMetadataRpc(metadataRpc);
1739
- const encodedValue = unifiedMetadata.pallets.find(({
1740
- name
1741
- }) => name === pallet)?.constants.find(({
1742
- name
1743
- }) => name === constant)?.value;
1744
- if (!encodedValue) return null;
1745
- const codec = builder.buildConstant(pallet, constant);
1746
- return codec.dec(encodedValue);
1747
- };
1748
-
1749
1752
  const buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
1750
1753
  if (!miniMetadata.data) return null;
1751
1754
  const metadata = scale.unifyMetadata(scale.decAnyMetadata(miniMetadata.data));
@@ -1769,6 +1772,258 @@ const buildNetworkStorageCoders = (chainId, miniMetadata, coders) => {
1769
1772
  return null;
1770
1773
  };
1771
1774
 
1775
+ const fetchBalances$6 = async ({
1776
+ networkId,
1777
+ tokensWithAddresses,
1778
+ connector
1779
+ }) => {
1780
+ if (!tokensWithAddresses.length) return {
1781
+ success: [],
1782
+ errors: []
1783
+ };
1784
+ const connection = await connector.getConnection(networkId);
1785
+ if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`);
1786
+
1787
+ // fetch balances for each address and output the ones for which we have a token
1788
+
1789
+ const accountAddresses = lodashEs.uniq(tokensWithAddresses.flatMap(([, addresses]) => addresses));
1790
+
1791
+ // TODO look for a way to fetch balances for all accounts in one request
1792
+ // hint: connection.getProgramAccounts
1793
+
1794
+ const balancesPerAddress = await Promise.all(accountAddresses.map(async address => {
1795
+ const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new web3_js.PublicKey(address), {
1796
+ programId: new web3_js.PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") // SPL Token Program ID
1797
+ });
1798
+ const balances = tokenAccounts.value.map(d => {
1799
+ try {
1800
+ const mintAddress = d.account.data.parsed.info.mint;
1801
+ const value = d.account.data.parsed.info.tokenAmount.amount ?? "0";
1802
+ return {
1803
+ tokenId: chaindataProvider.solSplTokenId(networkId, mintAddress),
1804
+ networkId,
1805
+ address,
1806
+ source: MODULE_TYPE$6,
1807
+ status: "live",
1808
+ value
1809
+ };
1810
+ } catch (err) {
1811
+ log.warn("Failed to parse token amount", {
1812
+ address,
1813
+ d
1814
+ });
1815
+ return null;
1816
+ }
1817
+ }).filter(util.isNotNil);
1818
+ return [address, balances];
1819
+ }));
1820
+ const allBalancesByKey = lodashEs.keyBy(balancesPerAddress.flatMap(([, addressBalances]) => addressBalances), b => getBalanceKey(b.tokenId, b.address));
1821
+ const balanceDefs = getBalanceDefs(tokensWithAddresses);
1822
+
1823
+ // return a balance entry for all token/address pairs that were requested
1824
+ const success = balanceDefs.map(bd => {
1825
+ const found = allBalancesByKey[getBalanceKey(bd.token.id, bd.address)];
1826
+ return found ?? {
1827
+ tokenId: bd.token.id,
1828
+ networkId: bd.token.networkId,
1829
+ address: bd.address,
1830
+ source: MODULE_TYPE$6,
1831
+ status: "live",
1832
+ value: "0"
1833
+ };
1834
+ });
1835
+
1836
+ // return only the balances that match the tokens we are interested in
1837
+ return {
1838
+ success,
1839
+ errors: []
1840
+ }; // TODO output errors if any
1841
+ };
1842
+ const getBalanceKey = (tokenId, address) => `${tokenId}:${address}`;
1843
+
1844
+ const TokenCacheSchema = z__default.default.discriminatedUnion("isValid", [z__default.default.strictObject({
1845
+ id: chaindataProvider.SolSplTokenSchema.shape.id,
1846
+ isValid: z__default.default.literal(true),
1847
+ ...chaindataProvider.SolSplTokenSchema.pick({
1848
+ symbol: true,
1849
+ decimals: true,
1850
+ name: true,
1851
+ logo: true
1852
+ }).shape
1853
+ }), z__default.default.strictObject({
1854
+ id: chaindataProvider.SolSplTokenSchema.shape.id,
1855
+ isValid: z__default.default.literal(false)
1856
+ })]);
1857
+ const METAPLEX_PROGRAM_ID = new web3_js.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
1858
+ const fetchTokens$6 = async ({
1859
+ networkId,
1860
+ tokens,
1861
+ connector,
1862
+ cache
1863
+ }) => {
1864
+ const result = [];
1865
+ for (const tokenConfig of tokens) {
1866
+ const tokenId = chaindataProvider.solSplTokenId(networkId, tokenConfig.mintAddress);
1867
+ let cached = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
1868
+ if (!cached) {
1869
+ const tokenInfo = await fetchOnChainTokenData(connector, tokenId);
1870
+ if (tokenInfo) cache[tokenId] = tokenInfo;
1871
+ }
1872
+ cached = cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data;
1873
+ if (cached?.isValid === false) continue;
1874
+ const base = {
1875
+ id: tokenId,
1876
+ type: MODULE_TYPE$6,
1877
+ platform: PLATFORM$6,
1878
+ networkId
1879
+ };
1880
+ const token = lodashEs.assign(base, cached?.isValid ? lodashEs.omit(cached, ["isValid"]) : {}, tokenConfig);
1881
+ const parsed = chaindataProvider.SolSplTokenSchema.safeParse(token);
1882
+ if (!parsed.success) {
1883
+ log.warn("Ignoring token with invalid SolSplTokenSchema", {
1884
+ token
1885
+ });
1886
+ continue;
1887
+ }
1888
+ result.push(parsed.data);
1889
+ }
1890
+ return result;
1891
+ };
1892
+ const ERROR_NO_MINT = "No mint info available";
1893
+ const ERROR_NO_METADATA = "No metadata account found ";
1894
+ const fetchOnChainTokenData = async (connector, tokenId) => {
1895
+ try {
1896
+ const {
1897
+ networkId,
1898
+ mintAddress
1899
+ } = chaindataProvider.parseSolSplTokenId(tokenId);
1900
+ const connection = await connector.getConnection(networkId);
1901
+ if (!connection) {
1902
+ log.warn(`No connection found for network ${networkId}`);
1903
+ return null;
1904
+ }
1905
+ const mintPubKey = new web3_js.PublicKey(mintAddress);
1906
+ const mintInfo = await connection.getAccountInfo(mintPubKey); // connection.getParsedAccountInfo(mint)
1907
+ if (!mintInfo?.data) throw new Error(ERROR_NO_MINT);
1908
+ const mint = splToken.MintLayout.decode(mintInfo.data);
1909
+ const [metadataPDA] = web3_js.PublicKey.findProgramAddressSync([Buffer.from("metadata"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()], METAPLEX_PROGRAM_ID);
1910
+
1911
+ // 3. Fetch metadata account directly (traditional way)
1912
+ const metadataAccount = await connection.getAccountInfo(new web3_js.PublicKey(metadataPDA));
1913
+ if (!metadataAccount) throw new Error(ERROR_NO_METADATA);
1914
+ const metadata = mplTokenMetadata.deserializeMetadata({
1915
+ publicKey: umi.publicKey(metadataPDA),
1916
+ executable: metadataAccount.executable,
1917
+ owner: umi.publicKey(metadataAccount.owner),
1918
+ lamports: umi.sol(metadataAccount.lamports),
1919
+ data: metadataAccount.data
1920
+ });
1921
+ return TokenCacheSchema.parse({
1922
+ id: tokenId,
1923
+ symbol: metadata.symbol.trim(),
1924
+ name: metadata.name.trim(),
1925
+ decimals: mint.decimals,
1926
+ isValid: true
1927
+ });
1928
+ } catch (err) {
1929
+ const msg = err.message;
1930
+ if ([ERROR_NO_MINT, ERROR_NO_METADATA].includes(msg)) return TokenCacheSchema.parse({
1931
+ id: tokenId,
1932
+ isValid: false
1933
+ });
1934
+ log.warn("Failed to fetch sol-spl token data for %s", tokenId, {
1935
+ err
1936
+ });
1937
+ }
1938
+ return null;
1939
+ };
1940
+
1941
+ const getMiniMetadata$6 = () => {
1942
+ throw new Error("MiniMetadata is not supported for solana tokens");
1943
+ };
1944
+
1945
+ const getTransferCallData$6 = () =>
1946
+ // {
1947
+ // from,
1948
+ // to,
1949
+ // value,
1950
+ // token,
1951
+ // }
1952
+ {
1953
+ throw new Error("Not implemented");
1954
+ // if (!isTokenOfType(token, MODULE_TYPE))
1955
+ // throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)
1956
+ // if (!isEthereumAddress(from)) throw new Error("Invalid from address")
1957
+ // if (!isEthereumAddress(to)) throw new Error("Invalid to address")
1958
+
1959
+ // const data = encodeFunctionData({
1960
+ // abi: erc20Abi,
1961
+ // functionName: "transfer",
1962
+ // args: [to, BigInt(value)],
1963
+ // })
1964
+
1965
+ // return { from, to: token.contractAddress, data }
1966
+ };
1967
+
1968
+ const SUBSCRIPTION_INTERVAL$2 = 6_000;
1969
+ const subscribeBalances$6 = ({
1970
+ networkId,
1971
+ tokensWithAddresses,
1972
+ connector
1973
+ }) => {
1974
+ if (!tokensWithAddresses.length) return rxjs.of({
1975
+ success: [],
1976
+ errors: []
1977
+ });
1978
+ return new rxjs.Observable(subscriber => {
1979
+ const abortController = new AbortController();
1980
+ const poll = async () => {
1981
+ try {
1982
+ if (abortController.signal.aborted) return;
1983
+ const balances = await fetchBalances$6({
1984
+ networkId,
1985
+ tokensWithAddresses: tokensWithAddresses,
1986
+ connector
1987
+ });
1988
+ if (abortController.signal.aborted) return;
1989
+ subscriber.next(balances);
1990
+ setTimeout(poll, SUBSCRIPTION_INTERVAL$2);
1991
+ } catch (error) {
1992
+ log.error("Error", {
1993
+ module: MODULE_TYPE$6,
1994
+ networkId,
1995
+ addressesByToken: tokensWithAddresses,
1996
+ error
1997
+ });
1998
+ subscriber.error(error);
1999
+ }
2000
+ };
2001
+ poll();
2002
+ return () => {
2003
+ abortController.abort();
2004
+ };
2005
+ }).pipe(rxjs.distinctUntilChanged(lodashEs.isEqual));
2006
+ };
2007
+
2008
+ const SolSplBalanceModule = {
2009
+ type: MODULE_TYPE$6,
2010
+ platform: PLATFORM$6,
2011
+ getMiniMetadata: getMiniMetadata$6,
2012
+ fetchTokens: fetchTokens$6,
2013
+ fetchBalances: fetchBalances$6,
2014
+ subscribeBalances: subscribeBalances$6,
2015
+ getTransferCallData: getTransferCallData$6
2016
+ };
2017
+
2018
+ // to be used by chaindata too
2019
+ const SolSplTokenConfigSchema = z__default.default.strictObject({
2020
+ mintAddress: chaindataProvider.SolSplTokenSchema.shape.mintAddress,
2021
+ ...TokenConfigBaseSchema.shape
2022
+ });
2023
+
2024
+ const MODULE_TYPE$5 = chaindataProvider.SubAssetsTokenSchema.shape.type.value;
2025
+ const PLATFORM$5 = chaindataProvider.SubAssetsTokenSchema.shape.platform.value;
2026
+
1772
2027
  const buildQueries$2 = (networkId, balanceDefs, miniMetadata) => {
1773
2028
  const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {
1774
2029
  storage: ["Assets", "Account"]
@@ -6303,7 +6558,7 @@ const SubTokensMiniMetadataExtraSchema = z__default.default.strictObject({
6303
6558
  palletId: z__default.default.string()
6304
6559
  });
6305
6560
 
6306
- const BALANCE_MODULES = [SubNativeBalanceModule, SubAssetsBalanceModule, SubHydrationBalanceModule, SubForeignAssetsBalanceModule, SubPsp22BalanceModule, SubTokensBalanceModule, EvmErc20BalanceModule, EvmUniswapV2BalanceModule, EvmNativeBalanceModule, SolNativeBalanceModule];
6561
+ const BALANCE_MODULES = [SubNativeBalanceModule, SubAssetsBalanceModule, SubHydrationBalanceModule, SubForeignAssetsBalanceModule, SubPsp22BalanceModule, SubTokensBalanceModule, EvmErc20BalanceModule, EvmUniswapV2BalanceModule, EvmNativeBalanceModule, SolNativeBalanceModule, SolSplBalanceModule];
6307
6562
 
6308
6563
  // share requests as all modules will call this at once
6309
6564
  const CACHE$1 = new Map();
@@ -6835,6 +7090,8 @@ exports.SUBTENSOR_MIN_STAKE_AMOUNT_PLANK = SUBTENSOR_MIN_STAKE_AMOUNT_PLANK;
6835
7090
  exports.SUBTENSOR_ROOT_NETUID = SUBTENSOR_ROOT_NETUID;
6836
7091
  exports.SolNativeBalanceModule = SolNativeBalanceModule;
6837
7092
  exports.SolNativeTokenConfigSchema = SolNativeTokenConfigSchema;
7093
+ exports.SolSplBalanceModule = SolSplBalanceModule;
7094
+ exports.SolSplTokenConfigSchema = SolSplTokenConfigSchema;
6838
7095
  exports.SubAssetsBalanceModule = SubAssetsBalanceModule;
6839
7096
  exports.SubAssetsTokenConfigSchema = SubAssetsTokenConfigSchema;
6840
7097
  exports.SubForeignAssetsBalanceModule = SubForeignAssetsBalanceModule;