@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.
- package/dist/declarations/src/modules/index.d.ts +12 -0
- package/dist/declarations/src/modules/sol-spl/config.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/fetchBalances.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/fetchTokens.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/getMiniMetadata.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/getTransferCallData.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/index.d.ts +2 -0
- package/dist/declarations/src/modules/sol-spl/module.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/subscribeBalances.d.ts +3 -0
- package/dist/declarations/src/modules/sol-spl/types.d.ts +14 -0
- package/dist/declarations/src/types/balances.d.ts +15 -0
- package/dist/talismn-balances.cjs.dev.js +415 -158
- package/dist/talismn-balances.cjs.prod.js +415 -158
- package/dist/talismn-balances.esm.js +415 -160
- package/package.json +13 -10
@@ -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$
|
34
|
-
const PLATFORM$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
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$
|
825
|
-
platform: PLATFORM$
|
827
|
+
type: MODULE_TYPE$a,
|
828
|
+
platform: PLATFORM$a,
|
826
829
|
networkId
|
827
830
|
};
|
828
|
-
const cached2 = cache[tokenId] && TokenCacheSchema$
|
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$
|
846
|
+
const getMiniMetadata$a = () => {
|
844
847
|
throw new Error("MiniMetadata is not supported for ethereum tokens");
|
845
848
|
};
|
846
849
|
|
847
|
-
const getTransferCallData$
|
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$
|
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$
|
869
|
-
const subscribeBalances$
|
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$
|
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$
|
893
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL$6);
|
891
894
|
} catch (error) {
|
892
895
|
log.error("Error", {
|
893
|
-
module: MODULE_TYPE$
|
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$
|
910
|
-
platform: PLATFORM$
|
911
|
-
getMiniMetadata: getMiniMetadata$
|
912
|
-
fetchTokens: fetchTokens$
|
913
|
-
fetchBalances: fetchBalances$
|
914
|
-
subscribeBalances: subscribeBalances$
|
915
|
-
getTransferCallData: getTransferCallData$
|
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$
|
929
|
-
const PLATFORM$
|
931
|
+
const MODULE_TYPE$9 = chaindataProvider.EvmNativeTokenSchema.shape.type.value;
|
932
|
+
const PLATFORM$9 = chaindataProvider.EvmNativeTokenSchema.shape.platform.value;
|
930
933
|
|
931
|
-
const fetchBalances$
|
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$
|
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$
|
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$
|
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$
|
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$
|
1055
|
-
platform: PLATFORM$
|
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$
|
1070
|
+
const getMiniMetadata$9 = () => {
|
1068
1071
|
throw new Error("MiniMetadata is not supported for ethereum tokens");
|
1069
1072
|
};
|
1070
1073
|
|
1071
|
-
const getTransferCallData$
|
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$
|
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$
|
1089
|
-
const subscribeBalances$
|
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$
|
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$
|
1113
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL$5);
|
1111
1114
|
} catch (error) {
|
1112
1115
|
log.error("Error", {
|
1113
|
-
module: MODULE_TYPE$
|
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$
|
1130
|
-
platform: PLATFORM$
|
1131
|
-
getMiniMetadata: getMiniMetadata$
|
1132
|
-
fetchTokens: fetchTokens$
|
1133
|
-
fetchBalances: fetchBalances$
|
1134
|
-
subscribeBalances: subscribeBalances$
|
1135
|
-
getTransferCallData: getTransferCallData$
|
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$
|
1144
|
-
const PLATFORM$
|
1146
|
+
const MODULE_TYPE$8 = chaindataProvider.EvmUniswapV2TokenSchema.shape.type.value;
|
1147
|
+
const PLATFORM$8 = chaindataProvider.EvmUniswapV2TokenSchema.shape.platform.value;
|
1145
1148
|
|
1146
|
-
const fetchBalances$
|
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$
|
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$
|
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$
|
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$
|
1383
|
-
platform: PLATFORM$
|
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$
|
1402
|
+
const getMiniMetadata$8 = () => {
|
1400
1403
|
throw new Error("MiniMetadata is not supported for ethereum tokens");
|
1401
1404
|
};
|
1402
1405
|
|
1403
|
-
const getTransferCallData$
|
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$
|
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$
|
1425
|
-
const subscribeBalances$
|
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$
|
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$
|
1449
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL$4);
|
1447
1450
|
} catch (error) {
|
1448
1451
|
log.error("Error", {
|
1449
|
-
module: MODULE_TYPE$
|
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$
|
1466
|
-
platform: PLATFORM$
|
1467
|
-
getMiniMetadata: getMiniMetadata$
|
1468
|
-
fetchTokens: fetchTokens$
|
1469
|
-
fetchBalances: fetchBalances$
|
1470
|
-
subscribeBalances: subscribeBalances$
|
1471
|
-
getTransferCallData: getTransferCallData$
|
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$
|
1481
|
-
const PLATFORM$
|
1483
|
+
const MODULE_TYPE$7 = chaindataProvider.SolNativeTokenSchema.shape.type.value;
|
1484
|
+
const PLATFORM$7 = chaindataProvider.SolNativeTokenSchema.shape.platform.value;
|
1482
1485
|
|
1483
|
-
const fetchBalances$
|
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$
|
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$
|
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$
|
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$
|
1543
|
-
platform: PLATFORM$
|
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$
|
1558
|
+
const getMiniMetadata$7 = () => {
|
1556
1559
|
throw new Error("MiniMetadata is not supported for sol-native tokens");
|
1557
1560
|
};
|
1558
1561
|
|
1559
|
-
const getTransferCallData$
|
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$
|
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$
|
1576
|
-
const subscribeBalances$
|
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$
|
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$
|
1600
|
+
setTimeout(poll, SUBSCRIPTION_INTERVAL$3);
|
1598
1601
|
} catch (error) {
|
1599
1602
|
log.error("Error", {
|
1600
|
-
module: MODULE_TYPE$
|
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$
|
1617
|
-
platform: PLATFORM$
|
1618
|
-
getMiniMetadata: getMiniMetadata$
|
1619
|
-
fetchTokens: fetchTokens$
|
1620
|
-
fetchBalances: fetchBalances$
|
1621
|
-
subscribeBalances: subscribeBalances$
|
1622
|
-
getTransferCallData: getTransferCallData$
|
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$
|
1631
|
-
const PLATFORM$
|
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;
|