@pioneer-platform/pioneer-sdk 4.20.9 → 4.20.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +55 -13
- package/dist/index.es.js +55 -13
- package/dist/index.js +55 -13
- package/package.json +5 -5
- package/src/charts/evm.ts +91 -10
- package/src/charts/stable-coins-config.ts +162 -0
package/dist/index.cjs
CHANGED
|
@@ -40,7 +40,7 @@ var __export = (target, all) => {
|
|
|
40
40
|
});
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
//
|
|
43
|
+
// ../pioneer-client/lib/index.js
|
|
44
44
|
var require_lib = __commonJS((exports2) => {
|
|
45
45
|
var __assign = exports2 && exports2.__assign || function() {
|
|
46
46
|
__assign = Object.assign || function(t) {
|
|
@@ -432,7 +432,7 @@ var require_lib = __commonJS((exports2) => {
|
|
|
432
432
|
exports2.default = Pioneer;
|
|
433
433
|
});
|
|
434
434
|
|
|
435
|
-
// node_modules/coinselect/utils.js
|
|
435
|
+
// ../../../node_modules/coinselect/utils.js
|
|
436
436
|
var require_utils = __commonJS((exports2, module2) => {
|
|
437
437
|
var TX_EMPTY_SIZE = 4 + 1 + 1 + 4;
|
|
438
438
|
var TX_INPUT_BASE = 32 + 4 + 1 + 4;
|
|
@@ -505,7 +505,7 @@ var require_utils = __commonJS((exports2, module2) => {
|
|
|
505
505
|
};
|
|
506
506
|
});
|
|
507
507
|
|
|
508
|
-
// node_modules/coinselect/accumulative.js
|
|
508
|
+
// ../../../node_modules/coinselect/accumulative.js
|
|
509
509
|
var require_accumulative = __commonJS((exports2, module2) => {
|
|
510
510
|
var utils = require_utils();
|
|
511
511
|
module2.exports = function accumulative(utxos, outputs, feeRate) {
|
|
@@ -537,7 +537,7 @@ var require_accumulative = __commonJS((exports2, module2) => {
|
|
|
537
537
|
};
|
|
538
538
|
});
|
|
539
539
|
|
|
540
|
-
// node_modules/coinselect/blackjack.js
|
|
540
|
+
// ../../../node_modules/coinselect/blackjack.js
|
|
541
541
|
var require_blackjack = __commonJS((exports2, module2) => {
|
|
542
542
|
var utils = require_utils();
|
|
543
543
|
module2.exports = function blackjack(utxos, outputs, feeRate) {
|
|
@@ -566,7 +566,7 @@ var require_blackjack = __commonJS((exports2, module2) => {
|
|
|
566
566
|
};
|
|
567
567
|
});
|
|
568
568
|
|
|
569
|
-
// node_modules/coinselect/index.js
|
|
569
|
+
// ../../../node_modules/coinselect/index.js
|
|
570
570
|
var require_coinselect = __commonJS((exports2, module2) => {
|
|
571
571
|
var accumulative = require_accumulative();
|
|
572
572
|
var blackjack = require_blackjack();
|
|
@@ -585,7 +585,7 @@ var require_coinselect = __commonJS((exports2, module2) => {
|
|
|
585
585
|
};
|
|
586
586
|
});
|
|
587
587
|
|
|
588
|
-
// node_modules/coinselect/split.js
|
|
588
|
+
// ../../../node_modules/coinselect/split.js
|
|
589
589
|
var require_split = __commonJS((exports2, module2) => {
|
|
590
590
|
var utils = require_utils();
|
|
591
591
|
module2.exports = function split(utxos, outputs, feeRate) {
|
|
@@ -669,19 +669,32 @@ async function getEvmCharts(params) {
|
|
|
669
669
|
return balances;
|
|
670
670
|
}
|
|
671
671
|
console.log(tag, "Using EVM address for portfolio:", primaryAddress);
|
|
672
|
+
await fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context);
|
|
672
673
|
try {
|
|
673
|
-
let portfolio = await pioneer.GetPortfolio({
|
|
674
|
-
|
|
674
|
+
let portfolio = await pioneer.GetPortfolio({
|
|
675
|
+
networkId: "eip155:1",
|
|
676
|
+
address: primaryAddress
|
|
677
|
+
});
|
|
678
|
+
portfolio = portfolio.data?.data || portfolio.data;
|
|
675
679
|
if (!portfolio || !portfolio.balances) {
|
|
676
680
|
console.error(tag, "No portfolio.balances found:", portfolio);
|
|
677
681
|
return balances;
|
|
678
682
|
}
|
|
683
|
+
console.log(tag, `Portfolio returned ${portfolio.balances.length} balances`);
|
|
684
|
+
let processedCount = 0;
|
|
685
|
+
let skippedCount = 0;
|
|
679
686
|
for (const balance of portfolio.balances) {
|
|
680
687
|
const processedBalance = processPortfolioBalance(balance, primaryAddress, context, blockchains);
|
|
681
|
-
if (processedBalance
|
|
682
|
-
balances.
|
|
688
|
+
if (processedBalance) {
|
|
689
|
+
if (!checkDuplicateBalance(balances, processedBalance.caip, processedBalance.pubkey)) {
|
|
690
|
+
balances.push(processedBalance);
|
|
691
|
+
processedCount++;
|
|
692
|
+
}
|
|
693
|
+
} else {
|
|
694
|
+
skippedCount++;
|
|
683
695
|
}
|
|
684
696
|
}
|
|
697
|
+
console.log(tag, `Processed ${processedCount} balances, skipped ${skippedCount}`);
|
|
685
698
|
if (portfolio.tokens && portfolio.tokens.length > 0) {
|
|
686
699
|
console.log(tag, "Processing portfolio.tokens:", portfolio.tokens.length);
|
|
687
700
|
for (const token of portfolio.tokens) {
|
|
@@ -702,7 +715,8 @@ function processPortfolioBalance(balance, primaryAddress, context, blockchains)
|
|
|
702
715
|
return null;
|
|
703
716
|
}
|
|
704
717
|
const networkId = balance.caip.split("/")[0];
|
|
705
|
-
|
|
718
|
+
const isEip155 = networkId.startsWith("eip155:");
|
|
719
|
+
if (!isEip155 && !blockchains.includes(networkId)) {
|
|
706
720
|
return null;
|
|
707
721
|
}
|
|
708
722
|
const assetInfo = hydrateAssetData(balance.caip);
|
|
@@ -759,7 +773,8 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
759
773
|
} else if (token.networkId && token.networkId.includes("/")) {
|
|
760
774
|
extractedNetworkId = token.networkId.split("/")[0];
|
|
761
775
|
}
|
|
762
|
-
|
|
776
|
+
const isEip155 = extractedNetworkId.startsWith("eip155:");
|
|
777
|
+
if (!isEip155 && !blockchains.includes(extractedNetworkId)) {
|
|
763
778
|
return null;
|
|
764
779
|
}
|
|
765
780
|
const tokenAssetInfo = hydrateAssetData(token.assetCaip);
|
|
@@ -787,6 +802,33 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
787
802
|
};
|
|
788
803
|
return chartBalance;
|
|
789
804
|
}
|
|
805
|
+
async function fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context) {
|
|
806
|
+
console.log(tag, "Fetching stable coins for redundancy...");
|
|
807
|
+
const supportedNetworks = ["eip155:1", "eip155:137", "eip155:8453", "eip155:56"];
|
|
808
|
+
const networksToCheck = blockchains.filter((net) => supportedNetworks.includes(net));
|
|
809
|
+
if (networksToCheck.length === 0) {
|
|
810
|
+
console.log(tag, "No supported networks for stable coins");
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
console.log(tag, `Checking stable coins on ${networksToCheck.length} networks`);
|
|
814
|
+
for (const networkId of networksToCheck) {
|
|
815
|
+
try {
|
|
816
|
+
const response = await pioneer.GetStableCoins({ networkId, address: primaryAddress });
|
|
817
|
+
const stableCoins = response?.data?.tokens || [];
|
|
818
|
+
console.log(tag, `Found ${stableCoins.length} stable coins on ${networkId}`);
|
|
819
|
+
for (const token of stableCoins) {
|
|
820
|
+
const chartBalance = processPortfolioToken(token, primaryAddress, context, blockchains);
|
|
821
|
+
if (chartBalance && !checkDuplicateBalance(balances, chartBalance.caip, chartBalance.pubkey)) {
|
|
822
|
+
balances.push(chartBalance);
|
|
823
|
+
console.log(tag, `Added stable coin: ${chartBalance.symbol} = ${chartBalance.balance}`);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
} catch (error) {
|
|
827
|
+
console.error(tag, `Error fetching stable coins for ${networkId}:`, error.message);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
console.log(tag, `Stable coin redundancy complete. Total balances: ${balances.length}`);
|
|
831
|
+
}
|
|
790
832
|
|
|
791
833
|
// src/charts/maya.ts
|
|
792
834
|
var tag2 = "| charts-maya |";
|
|
@@ -982,7 +1024,7 @@ var getCharts = async (blockchains, pioneer, pubkeys, context) => {
|
|
|
982
1024
|
}
|
|
983
1025
|
};
|
|
984
1026
|
|
|
985
|
-
// node_modules/@coinmasters/types/dist/index.es.js
|
|
1027
|
+
// ../../../node_modules/@coinmasters/types/dist/index.es.js
|
|
986
1028
|
var n = /* @__PURE__ */ ((e) => (e.INVALID_INPUT_PARAMETERS = "1000", e.UNKNOWN_PROVIDERS = "1001", e.CANNOT_FIND_INBOUND_ADDRESS = "1002", e.NO_INBOUND_ADDRESSES = "1003", e.CHAIN_HALTED_OR_UNSUPPORTED = "1004", e.MISSING_INPUT_PARAMETER = "1005", e.INVALID_TYPE_GENERIC = "1100", e.INVALID_NUMBER_STRING = "1101", e.INVALID_NUMBER = "1102", e.INVALID_BOOLEAN = "1103", e.INVALID_OBJECT = "1104", e.INVALID_ARRAY = "1105", e.SELL_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2000", e.SELL_BUY_ASSETS_ARE_THE_SAME = "2001", e.MISSING_SOURCE_ADDRESS_FOR_SYNTH = "2002", e.AFF_ADDRESS_AND_BPS_OR_NEITHER = "2003", e.AFF_ADDRESS_TOO_LONG = "2004", e.AFF_BPS_INTEGER_0_100 = "2005", e.SOURCE_ADDRESS_INVALID_FOR_SELL_CHAIN = "2006", e.DESTINATION_ADDRESS_INVALID_FOR_BUY_CHAIN = "2007", e.PREFERRED_PROFVIDER_NOT_SUPPORTED = "2008", e.DESTINATION_ADDRESS_SMART_CONTRACT = "2009", e.BUY_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2010", e.SOURCE_ADDRESS_SMART_CONTRACT = "2011", e.INVALID_PROVIDER = "2100", e.MISSING_CROSS_CHAIN_PROVIDER = "2101", e.MISSING_AVAX_PROVIDER = "2102", e.MISSING_BSC_PROVIDER = "2103", e.MISSING_ETH_PROVIDER = "2104", e.INVALID_PROVIDER_FOR_SWAP_OUT = "2105", e.MISSING_ARB_PROVIDER = "2106", e.INVALID_CHAIN = "2200", e.INVALID_ASSET = "2201", e.INVALID_ASSET_IDENTIFIER = "2202", e.UNSUPPORTED_CHAIN = "2204", e.UNSUPPORTED_ASSET = "2203", e.UNSUPPORTED_ASSET_FOR_SWAPOUT = "2205", e.INVALID_SOURCE_ADDRESS = "2300", e.INVALID_DESTINATION_ADDRESS = "2301", e.THORNODE_QUOTE_GENERIC_ERROR = "3000", e.NOT_ENOUGH_SYNTH_BALANCE = "3001", e.SYNTH_MINTING_CAP_REACHED = "3002", e.INVALID_QUOTE_MODE = "4000", e.NO_QUOTES = "4001", e.SERVICE_UNAVAILABLE_GENERIC = "5000", e.MISSING_GAS_DATA_GENERIC = "5100", e.MISSING_TOKEN_INFO_GENERIC = "5200", e.CANT_FIND_TOKEN_LIST = "5201", e.NO_PRICE = "5202", e.PRICE_IS_STALE = "5203", e.ADDRESS_NOT_WHITELISTED = "6000", e.ADDRESS_ALREADY_CLAIMED = "6001", e.TEMPORARY_ERROR = "9999", e))(n || {});
|
|
987
1029
|
var b = {
|
|
988
1030
|
[n.INVALID_INPUT_PARAMETERS]: "Invalid input parameters: {0}.",
|
package/dist/index.es.js
CHANGED
|
@@ -23,7 +23,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
23
23
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
//
|
|
26
|
+
// ../pioneer-client/lib/index.js
|
|
27
27
|
var require_lib = __commonJS((exports) => {
|
|
28
28
|
var __assign = exports && exports.__assign || function() {
|
|
29
29
|
__assign = Object.assign || function(t) {
|
|
@@ -415,7 +415,7 @@ var require_lib = __commonJS((exports) => {
|
|
|
415
415
|
exports.default = Pioneer;
|
|
416
416
|
});
|
|
417
417
|
|
|
418
|
-
// node_modules/coinselect/utils.js
|
|
418
|
+
// ../../../node_modules/coinselect/utils.js
|
|
419
419
|
var require_utils = __commonJS((exports, module) => {
|
|
420
420
|
var TX_EMPTY_SIZE = 4 + 1 + 1 + 4;
|
|
421
421
|
var TX_INPUT_BASE = 32 + 4 + 1 + 4;
|
|
@@ -488,7 +488,7 @@ var require_utils = __commonJS((exports, module) => {
|
|
|
488
488
|
};
|
|
489
489
|
});
|
|
490
490
|
|
|
491
|
-
// node_modules/coinselect/accumulative.js
|
|
491
|
+
// ../../../node_modules/coinselect/accumulative.js
|
|
492
492
|
var require_accumulative = __commonJS((exports, module) => {
|
|
493
493
|
var utils = require_utils();
|
|
494
494
|
module.exports = function accumulative(utxos, outputs, feeRate) {
|
|
@@ -520,7 +520,7 @@ var require_accumulative = __commonJS((exports, module) => {
|
|
|
520
520
|
};
|
|
521
521
|
});
|
|
522
522
|
|
|
523
|
-
// node_modules/coinselect/blackjack.js
|
|
523
|
+
// ../../../node_modules/coinselect/blackjack.js
|
|
524
524
|
var require_blackjack = __commonJS((exports, module) => {
|
|
525
525
|
var utils = require_utils();
|
|
526
526
|
module.exports = function blackjack(utxos, outputs, feeRate) {
|
|
@@ -549,7 +549,7 @@ var require_blackjack = __commonJS((exports, module) => {
|
|
|
549
549
|
};
|
|
550
550
|
});
|
|
551
551
|
|
|
552
|
-
// node_modules/coinselect/index.js
|
|
552
|
+
// ../../../node_modules/coinselect/index.js
|
|
553
553
|
var require_coinselect = __commonJS((exports, module) => {
|
|
554
554
|
var accumulative = require_accumulative();
|
|
555
555
|
var blackjack = require_blackjack();
|
|
@@ -568,7 +568,7 @@ var require_coinselect = __commonJS((exports, module) => {
|
|
|
568
568
|
};
|
|
569
569
|
});
|
|
570
570
|
|
|
571
|
-
// node_modules/coinselect/split.js
|
|
571
|
+
// ../../../node_modules/coinselect/split.js
|
|
572
572
|
var require_split = __commonJS((exports, module) => {
|
|
573
573
|
var utils = require_utils();
|
|
574
574
|
module.exports = function split(utxos, outputs, feeRate) {
|
|
@@ -841,19 +841,32 @@ async function getEvmCharts(params) {
|
|
|
841
841
|
return balances;
|
|
842
842
|
}
|
|
843
843
|
console.log(tag, "Using EVM address for portfolio:", primaryAddress);
|
|
844
|
+
await fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context);
|
|
844
845
|
try {
|
|
845
|
-
let portfolio = await pioneer.GetPortfolio({
|
|
846
|
-
|
|
846
|
+
let portfolio = await pioneer.GetPortfolio({
|
|
847
|
+
networkId: "eip155:1",
|
|
848
|
+
address: primaryAddress
|
|
849
|
+
});
|
|
850
|
+
portfolio = portfolio.data?.data || portfolio.data;
|
|
847
851
|
if (!portfolio || !portfolio.balances) {
|
|
848
852
|
console.error(tag, "No portfolio.balances found:", portfolio);
|
|
849
853
|
return balances;
|
|
850
854
|
}
|
|
855
|
+
console.log(tag, `Portfolio returned ${portfolio.balances.length} balances`);
|
|
856
|
+
let processedCount = 0;
|
|
857
|
+
let skippedCount = 0;
|
|
851
858
|
for (const balance of portfolio.balances) {
|
|
852
859
|
const processedBalance = processPortfolioBalance(balance, primaryAddress, context, blockchains);
|
|
853
|
-
if (processedBalance
|
|
854
|
-
balances.
|
|
860
|
+
if (processedBalance) {
|
|
861
|
+
if (!checkDuplicateBalance(balances, processedBalance.caip, processedBalance.pubkey)) {
|
|
862
|
+
balances.push(processedBalance);
|
|
863
|
+
processedCount++;
|
|
864
|
+
}
|
|
865
|
+
} else {
|
|
866
|
+
skippedCount++;
|
|
855
867
|
}
|
|
856
868
|
}
|
|
869
|
+
console.log(tag, `Processed ${processedCount} balances, skipped ${skippedCount}`);
|
|
857
870
|
if (portfolio.tokens && portfolio.tokens.length > 0) {
|
|
858
871
|
console.log(tag, "Processing portfolio.tokens:", portfolio.tokens.length);
|
|
859
872
|
for (const token of portfolio.tokens) {
|
|
@@ -874,7 +887,8 @@ function processPortfolioBalance(balance, primaryAddress, context, blockchains)
|
|
|
874
887
|
return null;
|
|
875
888
|
}
|
|
876
889
|
const networkId = balance.caip.split("/")[0];
|
|
877
|
-
|
|
890
|
+
const isEip155 = networkId.startsWith("eip155:");
|
|
891
|
+
if (!isEip155 && !blockchains.includes(networkId)) {
|
|
878
892
|
return null;
|
|
879
893
|
}
|
|
880
894
|
const assetInfo = hydrateAssetData(balance.caip);
|
|
@@ -931,7 +945,8 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
931
945
|
} else if (token.networkId && token.networkId.includes("/")) {
|
|
932
946
|
extractedNetworkId = token.networkId.split("/")[0];
|
|
933
947
|
}
|
|
934
|
-
|
|
948
|
+
const isEip155 = extractedNetworkId.startsWith("eip155:");
|
|
949
|
+
if (!isEip155 && !blockchains.includes(extractedNetworkId)) {
|
|
935
950
|
return null;
|
|
936
951
|
}
|
|
937
952
|
const tokenAssetInfo = hydrateAssetData(token.assetCaip);
|
|
@@ -959,6 +974,33 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
959
974
|
};
|
|
960
975
|
return chartBalance;
|
|
961
976
|
}
|
|
977
|
+
async function fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context) {
|
|
978
|
+
console.log(tag, "Fetching stable coins for redundancy...");
|
|
979
|
+
const supportedNetworks = ["eip155:1", "eip155:137", "eip155:8453", "eip155:56"];
|
|
980
|
+
const networksToCheck = blockchains.filter((net) => supportedNetworks.includes(net));
|
|
981
|
+
if (networksToCheck.length === 0) {
|
|
982
|
+
console.log(tag, "No supported networks for stable coins");
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
console.log(tag, `Checking stable coins on ${networksToCheck.length} networks`);
|
|
986
|
+
for (const networkId of networksToCheck) {
|
|
987
|
+
try {
|
|
988
|
+
const response = await pioneer.GetStableCoins({ networkId, address: primaryAddress });
|
|
989
|
+
const stableCoins = response?.data?.tokens || [];
|
|
990
|
+
console.log(tag, `Found ${stableCoins.length} stable coins on ${networkId}`);
|
|
991
|
+
for (const token of stableCoins) {
|
|
992
|
+
const chartBalance = processPortfolioToken(token, primaryAddress, context, blockchains);
|
|
993
|
+
if (chartBalance && !checkDuplicateBalance(balances, chartBalance.caip, chartBalance.pubkey)) {
|
|
994
|
+
balances.push(chartBalance);
|
|
995
|
+
console.log(tag, `Added stable coin: ${chartBalance.symbol} = ${chartBalance.balance}`);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
} catch (error) {
|
|
999
|
+
console.error(tag, `Error fetching stable coins for ${networkId}:`, error.message);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
console.log(tag, `Stable coin redundancy complete. Total balances: ${balances.length}`);
|
|
1003
|
+
}
|
|
962
1004
|
|
|
963
1005
|
// src/charts/maya.ts
|
|
964
1006
|
var tag2 = "| charts-maya |";
|
|
@@ -1154,7 +1196,7 @@ var getCharts = async (blockchains, pioneer, pubkeys, context) => {
|
|
|
1154
1196
|
}
|
|
1155
1197
|
};
|
|
1156
1198
|
|
|
1157
|
-
// node_modules/@coinmasters/types/dist/index.es.js
|
|
1199
|
+
// ../../../node_modules/@coinmasters/types/dist/index.es.js
|
|
1158
1200
|
var n = /* @__PURE__ */ ((e) => (e.INVALID_INPUT_PARAMETERS = "1000", e.UNKNOWN_PROVIDERS = "1001", e.CANNOT_FIND_INBOUND_ADDRESS = "1002", e.NO_INBOUND_ADDRESSES = "1003", e.CHAIN_HALTED_OR_UNSUPPORTED = "1004", e.MISSING_INPUT_PARAMETER = "1005", e.INVALID_TYPE_GENERIC = "1100", e.INVALID_NUMBER_STRING = "1101", e.INVALID_NUMBER = "1102", e.INVALID_BOOLEAN = "1103", e.INVALID_OBJECT = "1104", e.INVALID_ARRAY = "1105", e.SELL_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2000", e.SELL_BUY_ASSETS_ARE_THE_SAME = "2001", e.MISSING_SOURCE_ADDRESS_FOR_SYNTH = "2002", e.AFF_ADDRESS_AND_BPS_OR_NEITHER = "2003", e.AFF_ADDRESS_TOO_LONG = "2004", e.AFF_BPS_INTEGER_0_100 = "2005", e.SOURCE_ADDRESS_INVALID_FOR_SELL_CHAIN = "2006", e.DESTINATION_ADDRESS_INVALID_FOR_BUY_CHAIN = "2007", e.PREFERRED_PROFVIDER_NOT_SUPPORTED = "2008", e.DESTINATION_ADDRESS_SMART_CONTRACT = "2009", e.BUY_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2010", e.SOURCE_ADDRESS_SMART_CONTRACT = "2011", e.INVALID_PROVIDER = "2100", e.MISSING_CROSS_CHAIN_PROVIDER = "2101", e.MISSING_AVAX_PROVIDER = "2102", e.MISSING_BSC_PROVIDER = "2103", e.MISSING_ETH_PROVIDER = "2104", e.INVALID_PROVIDER_FOR_SWAP_OUT = "2105", e.MISSING_ARB_PROVIDER = "2106", e.INVALID_CHAIN = "2200", e.INVALID_ASSET = "2201", e.INVALID_ASSET_IDENTIFIER = "2202", e.UNSUPPORTED_CHAIN = "2204", e.UNSUPPORTED_ASSET = "2203", e.UNSUPPORTED_ASSET_FOR_SWAPOUT = "2205", e.INVALID_SOURCE_ADDRESS = "2300", e.INVALID_DESTINATION_ADDRESS = "2301", e.THORNODE_QUOTE_GENERIC_ERROR = "3000", e.NOT_ENOUGH_SYNTH_BALANCE = "3001", e.SYNTH_MINTING_CAP_REACHED = "3002", e.INVALID_QUOTE_MODE = "4000", e.NO_QUOTES = "4001", e.SERVICE_UNAVAILABLE_GENERIC = "5000", e.MISSING_GAS_DATA_GENERIC = "5100", e.MISSING_TOKEN_INFO_GENERIC = "5200", e.CANT_FIND_TOKEN_LIST = "5201", e.NO_PRICE = "5202", e.PRICE_IS_STALE = "5203", e.ADDRESS_NOT_WHITELISTED = "6000", e.ADDRESS_ALREADY_CLAIMED = "6001", e.TEMPORARY_ERROR = "9999", e))(n || {});
|
|
1159
1201
|
var b2 = {
|
|
1160
1202
|
[n.INVALID_INPUT_PARAMETERS]: "Invalid input parameters: {0}.",
|
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
23
23
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
//
|
|
26
|
+
// ../pioneer-client/lib/index.js
|
|
27
27
|
var require_lib = __commonJS((exports) => {
|
|
28
28
|
var __assign = exports && exports.__assign || function() {
|
|
29
29
|
__assign = Object.assign || function(t) {
|
|
@@ -415,7 +415,7 @@ var require_lib = __commonJS((exports) => {
|
|
|
415
415
|
exports.default = Pioneer;
|
|
416
416
|
});
|
|
417
417
|
|
|
418
|
-
// node_modules/coinselect/utils.js
|
|
418
|
+
// ../../../node_modules/coinselect/utils.js
|
|
419
419
|
var require_utils = __commonJS((exports, module) => {
|
|
420
420
|
var TX_EMPTY_SIZE = 4 + 1 + 1 + 4;
|
|
421
421
|
var TX_INPUT_BASE = 32 + 4 + 1 + 4;
|
|
@@ -488,7 +488,7 @@ var require_utils = __commonJS((exports, module) => {
|
|
|
488
488
|
};
|
|
489
489
|
});
|
|
490
490
|
|
|
491
|
-
// node_modules/coinselect/accumulative.js
|
|
491
|
+
// ../../../node_modules/coinselect/accumulative.js
|
|
492
492
|
var require_accumulative = __commonJS((exports, module) => {
|
|
493
493
|
var utils = require_utils();
|
|
494
494
|
module.exports = function accumulative(utxos, outputs, feeRate) {
|
|
@@ -520,7 +520,7 @@ var require_accumulative = __commonJS((exports, module) => {
|
|
|
520
520
|
};
|
|
521
521
|
});
|
|
522
522
|
|
|
523
|
-
// node_modules/coinselect/blackjack.js
|
|
523
|
+
// ../../../node_modules/coinselect/blackjack.js
|
|
524
524
|
var require_blackjack = __commonJS((exports, module) => {
|
|
525
525
|
var utils = require_utils();
|
|
526
526
|
module.exports = function blackjack(utxos, outputs, feeRate) {
|
|
@@ -549,7 +549,7 @@ var require_blackjack = __commonJS((exports, module) => {
|
|
|
549
549
|
};
|
|
550
550
|
});
|
|
551
551
|
|
|
552
|
-
// node_modules/coinselect/index.js
|
|
552
|
+
// ../../../node_modules/coinselect/index.js
|
|
553
553
|
var require_coinselect = __commonJS((exports, module) => {
|
|
554
554
|
var accumulative = require_accumulative();
|
|
555
555
|
var blackjack = require_blackjack();
|
|
@@ -568,7 +568,7 @@ var require_coinselect = __commonJS((exports, module) => {
|
|
|
568
568
|
};
|
|
569
569
|
});
|
|
570
570
|
|
|
571
|
-
// node_modules/coinselect/split.js
|
|
571
|
+
// ../../../node_modules/coinselect/split.js
|
|
572
572
|
var require_split = __commonJS((exports, module) => {
|
|
573
573
|
var utils = require_utils();
|
|
574
574
|
module.exports = function split(utxos, outputs, feeRate) {
|
|
@@ -841,19 +841,32 @@ async function getEvmCharts(params) {
|
|
|
841
841
|
return balances;
|
|
842
842
|
}
|
|
843
843
|
console.log(tag, "Using EVM address for portfolio:", primaryAddress);
|
|
844
|
+
await fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context);
|
|
844
845
|
try {
|
|
845
|
-
let portfolio = await pioneer.GetPortfolio({
|
|
846
|
-
|
|
846
|
+
let portfolio = await pioneer.GetPortfolio({
|
|
847
|
+
networkId: "eip155:1",
|
|
848
|
+
address: primaryAddress
|
|
849
|
+
});
|
|
850
|
+
portfolio = portfolio.data?.data || portfolio.data;
|
|
847
851
|
if (!portfolio || !portfolio.balances) {
|
|
848
852
|
console.error(tag, "No portfolio.balances found:", portfolio);
|
|
849
853
|
return balances;
|
|
850
854
|
}
|
|
855
|
+
console.log(tag, `Portfolio returned ${portfolio.balances.length} balances`);
|
|
856
|
+
let processedCount = 0;
|
|
857
|
+
let skippedCount = 0;
|
|
851
858
|
for (const balance of portfolio.balances) {
|
|
852
859
|
const processedBalance = processPortfolioBalance(balance, primaryAddress, context, blockchains);
|
|
853
|
-
if (processedBalance
|
|
854
|
-
balances.
|
|
860
|
+
if (processedBalance) {
|
|
861
|
+
if (!checkDuplicateBalance(balances, processedBalance.caip, processedBalance.pubkey)) {
|
|
862
|
+
balances.push(processedBalance);
|
|
863
|
+
processedCount++;
|
|
864
|
+
}
|
|
865
|
+
} else {
|
|
866
|
+
skippedCount++;
|
|
855
867
|
}
|
|
856
868
|
}
|
|
869
|
+
console.log(tag, `Processed ${processedCount} balances, skipped ${skippedCount}`);
|
|
857
870
|
if (portfolio.tokens && portfolio.tokens.length > 0) {
|
|
858
871
|
console.log(tag, "Processing portfolio.tokens:", portfolio.tokens.length);
|
|
859
872
|
for (const token of portfolio.tokens) {
|
|
@@ -874,7 +887,8 @@ function processPortfolioBalance(balance, primaryAddress, context, blockchains)
|
|
|
874
887
|
return null;
|
|
875
888
|
}
|
|
876
889
|
const networkId = balance.caip.split("/")[0];
|
|
877
|
-
|
|
890
|
+
const isEip155 = networkId.startsWith("eip155:");
|
|
891
|
+
if (!isEip155 && !blockchains.includes(networkId)) {
|
|
878
892
|
return null;
|
|
879
893
|
}
|
|
880
894
|
const assetInfo = hydrateAssetData(balance.caip);
|
|
@@ -931,7 +945,8 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
931
945
|
} else if (token.networkId && token.networkId.includes("/")) {
|
|
932
946
|
extractedNetworkId = token.networkId.split("/")[0];
|
|
933
947
|
}
|
|
934
|
-
|
|
948
|
+
const isEip155 = extractedNetworkId.startsWith("eip155:");
|
|
949
|
+
if (!isEip155 && !blockchains.includes(extractedNetworkId)) {
|
|
935
950
|
return null;
|
|
936
951
|
}
|
|
937
952
|
const tokenAssetInfo = hydrateAssetData(token.assetCaip);
|
|
@@ -959,6 +974,33 @@ function processPortfolioToken(token, primaryAddress, context, blockchains) {
|
|
|
959
974
|
};
|
|
960
975
|
return chartBalance;
|
|
961
976
|
}
|
|
977
|
+
async function fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context) {
|
|
978
|
+
console.log(tag, "Fetching stable coins for redundancy...");
|
|
979
|
+
const supportedNetworks = ["eip155:1", "eip155:137", "eip155:8453", "eip155:56"];
|
|
980
|
+
const networksToCheck = blockchains.filter((net) => supportedNetworks.includes(net));
|
|
981
|
+
if (networksToCheck.length === 0) {
|
|
982
|
+
console.log(tag, "No supported networks for stable coins");
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
console.log(tag, `Checking stable coins on ${networksToCheck.length} networks`);
|
|
986
|
+
for (const networkId of networksToCheck) {
|
|
987
|
+
try {
|
|
988
|
+
const response = await pioneer.GetStableCoins({ networkId, address: primaryAddress });
|
|
989
|
+
const stableCoins = response?.data?.tokens || [];
|
|
990
|
+
console.log(tag, `Found ${stableCoins.length} stable coins on ${networkId}`);
|
|
991
|
+
for (const token of stableCoins) {
|
|
992
|
+
const chartBalance = processPortfolioToken(token, primaryAddress, context, blockchains);
|
|
993
|
+
if (chartBalance && !checkDuplicateBalance(balances, chartBalance.caip, chartBalance.pubkey)) {
|
|
994
|
+
balances.push(chartBalance);
|
|
995
|
+
console.log(tag, `Added stable coin: ${chartBalance.symbol} = ${chartBalance.balance}`);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
} catch (error) {
|
|
999
|
+
console.error(tag, `Error fetching stable coins for ${networkId}:`, error.message);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
console.log(tag, `Stable coin redundancy complete. Total balances: ${balances.length}`);
|
|
1003
|
+
}
|
|
962
1004
|
|
|
963
1005
|
// src/charts/maya.ts
|
|
964
1006
|
var tag2 = "| charts-maya |";
|
|
@@ -1154,7 +1196,7 @@ var getCharts = async (blockchains, pioneer, pubkeys, context) => {
|
|
|
1154
1196
|
}
|
|
1155
1197
|
};
|
|
1156
1198
|
|
|
1157
|
-
// node_modules/@coinmasters/types/dist/index.es.js
|
|
1199
|
+
// ../../../node_modules/@coinmasters/types/dist/index.es.js
|
|
1158
1200
|
var n = /* @__PURE__ */ ((e) => (e.INVALID_INPUT_PARAMETERS = "1000", e.UNKNOWN_PROVIDERS = "1001", e.CANNOT_FIND_INBOUND_ADDRESS = "1002", e.NO_INBOUND_ADDRESSES = "1003", e.CHAIN_HALTED_OR_UNSUPPORTED = "1004", e.MISSING_INPUT_PARAMETER = "1005", e.INVALID_TYPE_GENERIC = "1100", e.INVALID_NUMBER_STRING = "1101", e.INVALID_NUMBER = "1102", e.INVALID_BOOLEAN = "1103", e.INVALID_OBJECT = "1104", e.INVALID_ARRAY = "1105", e.SELL_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2000", e.SELL_BUY_ASSETS_ARE_THE_SAME = "2001", e.MISSING_SOURCE_ADDRESS_FOR_SYNTH = "2002", e.AFF_ADDRESS_AND_BPS_OR_NEITHER = "2003", e.AFF_ADDRESS_TOO_LONG = "2004", e.AFF_BPS_INTEGER_0_100 = "2005", e.SOURCE_ADDRESS_INVALID_FOR_SELL_CHAIN = "2006", e.DESTINATION_ADDRESS_INVALID_FOR_BUY_CHAIN = "2007", e.PREFERRED_PROFVIDER_NOT_SUPPORTED = "2008", e.DESTINATION_ADDRESS_SMART_CONTRACT = "2009", e.BUY_AMOUNT_MUST_BE_POSITIVE_INTEGER = "2010", e.SOURCE_ADDRESS_SMART_CONTRACT = "2011", e.INVALID_PROVIDER = "2100", e.MISSING_CROSS_CHAIN_PROVIDER = "2101", e.MISSING_AVAX_PROVIDER = "2102", e.MISSING_BSC_PROVIDER = "2103", e.MISSING_ETH_PROVIDER = "2104", e.INVALID_PROVIDER_FOR_SWAP_OUT = "2105", e.MISSING_ARB_PROVIDER = "2106", e.INVALID_CHAIN = "2200", e.INVALID_ASSET = "2201", e.INVALID_ASSET_IDENTIFIER = "2202", e.UNSUPPORTED_CHAIN = "2204", e.UNSUPPORTED_ASSET = "2203", e.UNSUPPORTED_ASSET_FOR_SWAPOUT = "2205", e.INVALID_SOURCE_ADDRESS = "2300", e.INVALID_DESTINATION_ADDRESS = "2301", e.THORNODE_QUOTE_GENERIC_ERROR = "3000", e.NOT_ENOUGH_SYNTH_BALANCE = "3001", e.SYNTH_MINTING_CAP_REACHED = "3002", e.INVALID_QUOTE_MODE = "4000", e.NO_QUOTES = "4001", e.SERVICE_UNAVAILABLE_GENERIC = "5000", e.MISSING_GAS_DATA_GENERIC = "5100", e.MISSING_TOKEN_INFO_GENERIC = "5200", e.CANT_FIND_TOKEN_LIST = "5201", e.NO_PRICE = "5202", e.PRICE_IS_STALE = "5203", e.ADDRESS_NOT_WHITELISTED = "6000", e.ADDRESS_ALREADY_CLAIMED = "6001", e.TEMPORARY_ERROR = "9999", e))(n || {});
|
|
1159
1201
|
var b2 = {
|
|
1160
1202
|
[n.INVALID_INPUT_PARAMETERS]: "Invalid input parameters: {0}.",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "highlander",
|
|
3
3
|
"name": "@pioneer-platform/pioneer-sdk",
|
|
4
|
-
"version": "4.20.
|
|
4
|
+
"version": "4.20.10",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@keepkey/keepkey-sdk": "^0.2.62",
|
|
7
7
|
"@pioneer-platform/loggerdog": "^8.11.0",
|
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
"react-native": "./src/index.ts",
|
|
50
50
|
"repository": "https://github.com/thorswap/SwapKit.git",
|
|
51
|
+
"type": "module",
|
|
52
|
+
"types": "./dist/index.d.ts",
|
|
51
53
|
"scripts": {
|
|
52
54
|
"build": "bash scripts/build.sh",
|
|
53
55
|
"build:watch": "nodemon --watch src --exec 'bun run build'",
|
|
@@ -55,7 +57,5 @@
|
|
|
55
57
|
"lint": "eslint ./ --ext .ts,.tsx --fix; tsc --noEmit",
|
|
56
58
|
"test": "echo 'vitest --run'",
|
|
57
59
|
"test:coverage": "echo 'vitest run --coverage'"
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
"types": "./dist/index.d.ts"
|
|
61
|
-
}
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/charts/evm.ts
CHANGED
|
@@ -6,7 +6,7 @@ const tag = '| charts-evm |';
|
|
|
6
6
|
export async function getEvmCharts(params: ChartParams): Promise<ChartBalance[]> {
|
|
7
7
|
const { blockchains, pioneer, pubkeys, context } = params;
|
|
8
8
|
const balances: ChartBalance[] = [];
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
// Find the primary address for portfolio lookup
|
|
11
11
|
// ONLY use EVM addresses since the portfolio endpoint uses Zapper which only supports Ethereum
|
|
12
12
|
const evmPubkey = pubkeys.find(
|
|
@@ -28,22 +28,45 @@ export async function getEvmCharts(params: ChartParams): Promise<ChartBalance[]>
|
|
|
28
28
|
|
|
29
29
|
console.log(tag, 'Using EVM address for portfolio:', primaryAddress);
|
|
30
30
|
|
|
31
|
+
// REDUNDANCY: Fetch stable coins from dedicated endpoint for ALL EVM networks
|
|
32
|
+
// This ensures USDC/USDT balances are always available even if Zapper fails
|
|
33
|
+
await fetchStableCoins(pioneer, primaryAddress, blockchains, balances, context);
|
|
34
|
+
|
|
31
35
|
try {
|
|
32
|
-
|
|
33
|
-
|
|
36
|
+
// NOTE: Zapper API returns portfolio data across ALL networks for a given address
|
|
37
|
+
// We use eip155:1 as the networkId parameter, but Zapper will return data for all EVM chains
|
|
38
|
+
let portfolio = await pioneer.GetPortfolio({
|
|
39
|
+
networkId: 'eip155:1', // Required by endpoint, but Zapper returns all networks
|
|
40
|
+
address: primaryAddress
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Handle double-wrapped response from Swagger client
|
|
44
|
+
// Server returns { data: { balances: [...] } }
|
|
45
|
+
// Swagger client wraps as { data: { data: { balances: [...] } } }
|
|
46
|
+
portfolio = portfolio.data?.data || portfolio.data;
|
|
34
47
|
|
|
35
48
|
if (!portfolio || !portfolio.balances) {
|
|
36
49
|
console.error(tag, 'No portfolio.balances found:', portfolio);
|
|
37
50
|
return balances;
|
|
38
51
|
}
|
|
39
52
|
|
|
53
|
+
console.log(tag, `Portfolio returned ${portfolio.balances.length} balances`);
|
|
54
|
+
|
|
40
55
|
// Process main balances
|
|
56
|
+
let processedCount = 0;
|
|
57
|
+
let skippedCount = 0;
|
|
41
58
|
for (const balance of portfolio.balances) {
|
|
42
59
|
const processedBalance = processPortfolioBalance(balance, primaryAddress, context, blockchains);
|
|
43
|
-
if (processedBalance
|
|
44
|
-
balances.
|
|
60
|
+
if (processedBalance) {
|
|
61
|
+
if (!checkDuplicateBalance(balances, processedBalance.caip, processedBalance.pubkey)) {
|
|
62
|
+
balances.push(processedBalance);
|
|
63
|
+
processedCount++;
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
skippedCount++;
|
|
45
67
|
}
|
|
46
68
|
}
|
|
69
|
+
console.log(tag, `Processed ${processedCount} balances, skipped ${skippedCount}`);
|
|
47
70
|
|
|
48
71
|
// Process tokens from portfolio (if they exist)
|
|
49
72
|
if (portfolio.tokens && portfolio.tokens.length > 0) {
|
|
@@ -76,9 +99,11 @@ function processPortfolioBalance(
|
|
|
76
99
|
|
|
77
100
|
// Always derive networkId from CAIP
|
|
78
101
|
const networkId = balance.caip.split('/')[0];
|
|
79
|
-
|
|
80
|
-
//
|
|
81
|
-
if
|
|
102
|
+
|
|
103
|
+
// Accept ALL EIP155 chains (since we have eip155:* pubkey)
|
|
104
|
+
// For non-EVM chains, check if explicitly in blockchains list
|
|
105
|
+
const isEip155 = networkId.startsWith('eip155:');
|
|
106
|
+
if (!isEip155 && !blockchains.includes(networkId)) {
|
|
82
107
|
return null;
|
|
83
108
|
}
|
|
84
109
|
|
|
@@ -162,8 +187,10 @@ function processPortfolioToken(
|
|
|
162
187
|
extractedNetworkId = token.networkId.split('/')[0];
|
|
163
188
|
}
|
|
164
189
|
|
|
165
|
-
//
|
|
166
|
-
if
|
|
190
|
+
// Accept ALL EIP155 chains (since we have eip155:* pubkey)
|
|
191
|
+
// For non-EVM chains, check if explicitly in blockchains list
|
|
192
|
+
const isEip155 = extractedNetworkId.startsWith('eip155:');
|
|
193
|
+
if (!isEip155 && !blockchains.includes(extractedNetworkId)) {
|
|
167
194
|
return null;
|
|
168
195
|
}
|
|
169
196
|
|
|
@@ -196,4 +223,58 @@ function processPortfolioToken(
|
|
|
196
223
|
};
|
|
197
224
|
|
|
198
225
|
return chartBalance;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Fetch hardcoded stable coins from dedicated endpoint
|
|
230
|
+
* This provides redundancy for USDC/USDT balances using direct web3 queries
|
|
231
|
+
*/
|
|
232
|
+
async function fetchStableCoins(
|
|
233
|
+
pioneer: any,
|
|
234
|
+
primaryAddress: string,
|
|
235
|
+
blockchains: string[],
|
|
236
|
+
balances: ChartBalance[],
|
|
237
|
+
context: string
|
|
238
|
+
): Promise<void> {
|
|
239
|
+
console.log(tag, 'Fetching stable coins for redundancy...');
|
|
240
|
+
|
|
241
|
+
// Networks that support stable coins endpoint
|
|
242
|
+
const supportedNetworks = ['eip155:1', 'eip155:137', 'eip155:8453', 'eip155:56'];
|
|
243
|
+
|
|
244
|
+
// Filter to only supported EVM networks
|
|
245
|
+
const networksToCheck = blockchains.filter(net => supportedNetworks.includes(net));
|
|
246
|
+
|
|
247
|
+
if (networksToCheck.length === 0) {
|
|
248
|
+
console.log(tag, 'No supported networks for stable coins');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
console.log(tag, `Checking stable coins on ${networksToCheck.length} networks`);
|
|
253
|
+
|
|
254
|
+
// Fetch stable coins for each network
|
|
255
|
+
for (const networkId of networksToCheck) {
|
|
256
|
+
try {
|
|
257
|
+
const response = await pioneer.GetStableCoins({ networkId, address: primaryAddress });
|
|
258
|
+
const stableCoins = response?.data?.tokens || [];
|
|
259
|
+
|
|
260
|
+
console.log(tag, `Found ${stableCoins.length} stable coins on ${networkId}`);
|
|
261
|
+
|
|
262
|
+
// Process each stable coin
|
|
263
|
+
for (const token of stableCoins) {
|
|
264
|
+
// Convert to ChartBalance format
|
|
265
|
+
const chartBalance = processPortfolioToken(token, primaryAddress, context, blockchains);
|
|
266
|
+
|
|
267
|
+
// Add if not already in balances (avoid duplicates)
|
|
268
|
+
if (chartBalance && !checkDuplicateBalance(balances, chartBalance.caip, chartBalance.pubkey)) {
|
|
269
|
+
balances.push(chartBalance);
|
|
270
|
+
console.log(tag, `Added stable coin: ${chartBalance.symbol} = ${chartBalance.balance}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
} catch (error: any) {
|
|
274
|
+
console.error(tag, `Error fetching stable coins for ${networkId}:`, error.message);
|
|
275
|
+
// Continue with other networks even if one fails
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
console.log(tag, `Stable coin redundancy complete. Total balances: ${balances.length}`);
|
|
199
280
|
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable Coins Configuration
|
|
3
|
+
*
|
|
4
|
+
* Hardcoded list of stable coin and high-priority token addresses across chains.
|
|
5
|
+
* This ensures we ALWAYS fetch balances for these tokens, even if the API fails.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface TokenConfig {
|
|
9
|
+
symbol: string;
|
|
10
|
+
name: string;
|
|
11
|
+
address: string;
|
|
12
|
+
networkId: string;
|
|
13
|
+
caip: string;
|
|
14
|
+
decimals: number;
|
|
15
|
+
icon?: string;
|
|
16
|
+
coingeckoId?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Ethereum Mainnet Tokens (eip155:1)
|
|
21
|
+
*/
|
|
22
|
+
export const ETHEREUM_STABLE_COINS: TokenConfig[] = [
|
|
23
|
+
// USDC - Circle USD Coin
|
|
24
|
+
{
|
|
25
|
+
symbol: 'USDC',
|
|
26
|
+
name: 'USD Coin',
|
|
27
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
28
|
+
networkId: 'eip155:1',
|
|
29
|
+
caip: 'eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
30
|
+
decimals: 6,
|
|
31
|
+
coingeckoId: 'usd-coin',
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
// USDT - Tether USD
|
|
35
|
+
{
|
|
36
|
+
symbol: 'USDT',
|
|
37
|
+
name: 'Tether USD',
|
|
38
|
+
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
|
39
|
+
networkId: 'eip155:1',
|
|
40
|
+
caip: 'eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
|
41
|
+
decimals: 6,
|
|
42
|
+
coingeckoId: 'tether',
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
// DAI - Dai Stablecoin
|
|
46
|
+
{
|
|
47
|
+
symbol: 'DAI',
|
|
48
|
+
name: 'Dai Stablecoin',
|
|
49
|
+
address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
|
|
50
|
+
networkId: 'eip155:1',
|
|
51
|
+
caip: 'eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F',
|
|
52
|
+
decimals: 18,
|
|
53
|
+
coingeckoId: 'dai',
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Polygon (MATIC) Tokens (eip155:137)
|
|
59
|
+
*/
|
|
60
|
+
export const POLYGON_STABLE_COINS: TokenConfig[] = [
|
|
61
|
+
// USDC on Polygon
|
|
62
|
+
{
|
|
63
|
+
symbol: 'USDC',
|
|
64
|
+
name: 'USD Coin (Polygon)',
|
|
65
|
+
address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',
|
|
66
|
+
networkId: 'eip155:137',
|
|
67
|
+
caip: 'eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174',
|
|
68
|
+
decimals: 6,
|
|
69
|
+
coingeckoId: 'usd-coin',
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
// USDT on Polygon
|
|
73
|
+
{
|
|
74
|
+
symbol: 'USDT',
|
|
75
|
+
name: 'Tether USD (Polygon)',
|
|
76
|
+
address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
|
|
77
|
+
networkId: 'eip155:137',
|
|
78
|
+
caip: 'eip155:137/erc20:0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
|
|
79
|
+
decimals: 6,
|
|
80
|
+
coingeckoId: 'tether',
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Base Tokens (eip155:8453)
|
|
86
|
+
*/
|
|
87
|
+
export const BASE_STABLE_COINS: TokenConfig[] = [
|
|
88
|
+
// USDC on Base
|
|
89
|
+
{
|
|
90
|
+
symbol: 'USDC',
|
|
91
|
+
name: 'USD Coin (Base)',
|
|
92
|
+
address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
93
|
+
networkId: 'eip155:8453',
|
|
94
|
+
caip: 'eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
95
|
+
decimals: 6,
|
|
96
|
+
coingeckoId: 'usd-coin',
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* BSC (BNB Smart Chain) Tokens (eip155:56)
|
|
102
|
+
*/
|
|
103
|
+
export const BSC_STABLE_COINS: TokenConfig[] = [
|
|
104
|
+
// USDT on BSC
|
|
105
|
+
{
|
|
106
|
+
symbol: 'USDT',
|
|
107
|
+
name: 'Tether USD (BSC)',
|
|
108
|
+
address: '0x55d398326f99059fF775485246999027B3197955',
|
|
109
|
+
networkId: 'eip155:56',
|
|
110
|
+
caip: 'eip155:56/erc20:0x55d398326f99059fF775485246999027B3197955',
|
|
111
|
+
decimals: 18,
|
|
112
|
+
coingeckoId: 'tether',
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
// USDC on BSC
|
|
116
|
+
{
|
|
117
|
+
symbol: 'USDC',
|
|
118
|
+
name: 'USD Coin (BSC)',
|
|
119
|
+
address: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',
|
|
120
|
+
networkId: 'eip155:56',
|
|
121
|
+
caip: 'eip155:56/erc20:0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',
|
|
122
|
+
decimals: 18,
|
|
123
|
+
coingeckoId: 'usd-coin',
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* All stable coins aggregated by network
|
|
129
|
+
*/
|
|
130
|
+
export const STABLE_COINS_BY_NETWORK: Record<string, TokenConfig[]> = {
|
|
131
|
+
'eip155:1': ETHEREUM_STABLE_COINS,
|
|
132
|
+
'eip155:137': POLYGON_STABLE_COINS,
|
|
133
|
+
'eip155:8453': BASE_STABLE_COINS,
|
|
134
|
+
'eip155:56': BSC_STABLE_COINS,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get all stable coins for a specific network
|
|
139
|
+
*/
|
|
140
|
+
export function getStableCoinsForNetwork(networkId: string): TokenConfig[] {
|
|
141
|
+
return STABLE_COINS_BY_NETWORK[networkId] || [];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Get all stable coins across all networks
|
|
146
|
+
*/
|
|
147
|
+
export function getAllStableCoins(): TokenConfig[] {
|
|
148
|
+
return [
|
|
149
|
+
...ETHEREUM_STABLE_COINS,
|
|
150
|
+
...POLYGON_STABLE_COINS,
|
|
151
|
+
...BASE_STABLE_COINS,
|
|
152
|
+
...BSC_STABLE_COINS,
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Check if a token address is a known stable coin
|
|
158
|
+
*/
|
|
159
|
+
export function isKnownStableCoin(networkId: string, address: string): boolean {
|
|
160
|
+
const coins = getStableCoinsForNetwork(networkId);
|
|
161
|
+
return coins.some(coin => coin.address.toLowerCase() === address.toLowerCase());
|
|
162
|
+
}
|