@vultisig/core-chain 5.1.0 → 5.3.0

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.
Files changed (105) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/chains/solana/spl/verification.d.ts +38 -0
  3. package/dist/chains/solana/spl/verification.d.ts.map +1 -0
  4. package/dist/chains/solana/spl/verification.js +45 -0
  5. package/dist/chains/solana/spl/verification.js.map +1 -0
  6. package/dist/chains/solana/spl/verifiedRegistry.d.ts +34 -0
  7. package/dist/chains/solana/spl/verifiedRegistry.d.ts.map +1 -0
  8. package/dist/chains/solana/spl/verifiedRegistry.js +65 -0
  9. package/dist/chains/solana/spl/verifiedRegistry.js.map +1 -0
  10. package/dist/chains/ton/failure.d.ts +70 -0
  11. package/dist/chains/ton/failure.d.ts.map +1 -0
  12. package/dist/chains/ton/failure.js +170 -0
  13. package/dist/chains/ton/failure.js.map +1 -0
  14. package/dist/chains/ton/jetton/symbol.d.ts +3 -5
  15. package/dist/chains/ton/jetton/symbol.d.ts.map +1 -1
  16. package/dist/chains/ton/jetton/symbol.js +5 -58
  17. package/dist/chains/ton/jetton/symbol.js.map +1 -1
  18. package/dist/chains/ton/jetton/verification.d.ts +1 -1
  19. package/dist/chains/ton/jetton/verification.d.ts.map +1 -1
  20. package/dist/chains/ton/jetton/verification.js +3 -3
  21. package/dist/chains/ton/jetton/verification.js.map +1 -1
  22. package/dist/chains/ton/jetton/verifiedRegistry.d.ts +1 -1
  23. package/dist/chains/ton/jetton/verifiedRegistry.d.ts.map +1 -1
  24. package/dist/chains/ton/jetton/verifiedRegistry.js +3 -3
  25. package/dist/chains/ton/jetton/verifiedRegistry.js.map +1 -1
  26. package/dist/chains/ton/wallet.d.ts +50 -0
  27. package/dist/chains/ton/wallet.d.ts.map +1 -0
  28. package/dist/chains/ton/wallet.js +54 -0
  29. package/dist/chains/ton/wallet.js.map +1 -0
  30. package/dist/chains/ton/walletV5R1.d.ts +27 -0
  31. package/dist/chains/ton/walletV5R1.d.ts.map +1 -0
  32. package/dist/chains/ton/walletV5R1.js +53 -0
  33. package/dist/chains/ton/walletV5R1.js.map +1 -0
  34. package/dist/coin/coingecko/coingeckoToken.d.ts +11 -0
  35. package/dist/coin/coingecko/coingeckoToken.d.ts.map +1 -1
  36. package/dist/coin/coingecko/getCoingeckoId.d.ts +10 -0
  37. package/dist/coin/coingecko/getCoingeckoId.d.ts.map +1 -1
  38. package/dist/coin/coingecko/getCoingeckoId.js +30 -1
  39. package/dist/coin/coingecko/getCoingeckoId.js.map +1 -1
  40. package/dist/coin/find/resolvers/solana/index.d.ts +22 -1
  41. package/dist/coin/find/resolvers/solana/index.d.ts.map +1 -1
  42. package/dist/coin/find/resolvers/solana/index.js +79 -11
  43. package/dist/coin/find/resolvers/solana/index.js.map +1 -1
  44. package/dist/coin/jupiter/api.d.ts +18 -0
  45. package/dist/coin/jupiter/api.d.ts.map +1 -0
  46. package/dist/coin/jupiter/api.js +52 -0
  47. package/dist/coin/jupiter/api.js.map +1 -0
  48. package/dist/coin/jupiter/token.d.ts +4 -0
  49. package/dist/coin/jupiter/token.d.ts.map +1 -1
  50. package/dist/coin/jupiter/token.js.map +1 -1
  51. package/dist/coin/token/metadata/resolvers/solana.d.ts +3 -1
  52. package/dist/coin/token/metadata/resolvers/solana.d.ts.map +1 -1
  53. package/dist/coin/token/metadata/resolvers/solana.js +10 -6
  54. package/dist/coin/token/metadata/resolvers/solana.js.map +1 -1
  55. package/dist/coin/tokenSymbol.d.ts +10 -0
  56. package/dist/coin/tokenSymbol.d.ts.map +1 -0
  57. package/dist/coin/tokenSymbol.js +62 -0
  58. package/dist/coin/tokenSymbol.js.map +1 -0
  59. package/dist/publicKey/address/deriveAddress.d.ts +8 -1
  60. package/dist/publicKey/address/deriveAddress.d.ts.map +1 -1
  61. package/dist/publicKey/address/deriveAddress.js +5 -1
  62. package/dist/publicKey/address/deriveAddress.js.map +1 -1
  63. package/dist/publicKey/address/getChainAddress.d.ts +4 -1
  64. package/dist/publicKey/address/getChainAddress.d.ts.map +1 -1
  65. package/dist/publicKey/address/getChainAddress.js +2 -2
  66. package/dist/publicKey/address/getChainAddress.js.map +1 -1
  67. package/dist/security/blockaid/tx/simulation/api/core.d.ts +17 -0
  68. package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
  69. package/dist/security/blockaid/tx/simulation/api/core.js +58 -41
  70. package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
  71. package/dist/swap/general/GeneralSwapQuote.d.ts +10 -0
  72. package/dist/swap/general/GeneralSwapQuote.d.ts.map +1 -1
  73. package/dist/swap/general/swapkit/api/getSwapKitQuote.d.ts.map +1 -1
  74. package/dist/swap/general/swapkit/api/getSwapKitQuote.js +40 -14
  75. package/dist/swap/general/swapkit/api/getSwapKitQuote.js.map +1 -1
  76. package/dist/swap/native/NativeSwapQuote.d.ts +6 -1
  77. package/dist/swap/native/NativeSwapQuote.d.ts.map +1 -1
  78. package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
  79. package/dist/tx/broadcast/resolvers/ton.js +8 -0
  80. package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
  81. package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts +10 -4
  82. package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts.map +1 -1
  83. package/dist/tx/fee/evm/clampEvmPriorityFee.js +35 -14
  84. package/dist/tx/fee/evm/clampEvmPriorityFee.js.map +1 -1
  85. package/dist/tx/fee/evm/evmGasLimit.d.ts +29 -0
  86. package/dist/tx/fee/evm/evmGasLimit.d.ts.map +1 -1
  87. package/dist/tx/fee/evm/evmGasLimit.js +47 -17
  88. package/dist/tx/fee/evm/evmGasLimit.js.map +1 -1
  89. package/dist/tx/fee/evm/gasPrice.d.ts +4 -0
  90. package/dist/tx/fee/evm/gasPrice.d.ts.map +1 -0
  91. package/dist/tx/fee/evm/gasPrice.js +4 -0
  92. package/dist/tx/fee/evm/gasPrice.js.map +1 -0
  93. package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts +8 -0
  94. package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts.map +1 -1
  95. package/dist/tx/fee/evm/maxPriorityFeePerGas.js +30 -1
  96. package/dist/tx/fee/evm/maxPriorityFeePerGas.js.map +1 -1
  97. package/dist/tx/status/index.d.ts +2 -2
  98. package/dist/tx/status/index.d.ts.map +1 -1
  99. package/dist/tx/status/resolver.d.ts +15 -0
  100. package/dist/tx/status/resolver.d.ts.map +1 -1
  101. package/dist/tx/status/resolvers/ton.d.ts +5 -1
  102. package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
  103. package/dist/tx/status/resolvers/ton.js +8 -29
  104. package/dist/tx/status/resolvers/ton.js.map +1 -1
  105. package/package.json +41 -1
@@ -1,61 +1,8 @@
1
+ import { normalizeTokenSymbol } from '@vultisig/core-chain/coin/tokenSymbol';
1
2
  /**
2
- * Homoglyphs scammers substitute into a jetton symbol so it *reads* like a
3
- * verified one while differing byte-for-byte: Cyrillic/Greek capitals that look
4
- * like Latin ones, the tugrik sign standing in for `T`, and stroked `D`s. Keys
5
- * are already upper-cased because the map is applied after `toUpperCase()`.
3
+ * Jetton-named alias of the chain-agnostic `normalizeTokenSymbol`, kept so
4
+ * importers of this subpath keep working. New code should import the shared
5
+ * normalizer from `coin/tokenSymbol` directly.
6
6
  */
7
- const confusables = {
8
- // Cyrillic
9
- А: 'A',
10
- В: 'B',
11
- Е: 'E',
12
- Ё: 'E',
13
- Ѕ: 'S',
14
- І: 'I',
15
- Ј: 'J',
16
- К: 'K',
17
- М: 'M',
18
- Н: 'H',
19
- О: 'O',
20
- Р: 'P',
21
- С: 'C',
22
- Т: 'T',
23
- У: 'Y',
24
- Х: 'X',
25
- Ԛ: 'Q',
26
- Ԝ: 'W',
27
- // Greek
28
- Α: 'A',
29
- Β: 'B',
30
- Ε: 'E',
31
- Ζ: 'Z',
32
- Η: 'H',
33
- Ι: 'I',
34
- Κ: 'K',
35
- Μ: 'M',
36
- Ν: 'N',
37
- Ο: 'O',
38
- Ρ: 'P',
39
- Τ: 'T',
40
- Υ: 'Y',
41
- Χ: 'X',
42
- // Currency and stroked letters
43
- '₮': 'T',
44
- Đ: 'D',
45
- Ð: 'D',
46
- Ɖ: 'D',
47
- Ŧ: 'T',
48
- };
49
- const combiningMarks = /[̀-ͯ]/g;
50
- /**
51
- * Collapses a jetton symbol or name to the Latin skeleton a user perceives, so
52
- * `USD₮`, `UЅDT` (Cyrillic Ѕ), `$USĐ₮` and `usdt` all compare equal to `USDT`.
53
- * Compatibility decomposition folds full-width and mathematical letter forms,
54
- * diacritics are dropped, known homoglyphs are mapped, and everything that is
55
- * not `A–Z`/`0–9` is removed. Returns an empty string when nothing survives.
56
- */
57
- export const normalizeJettonSymbol = (value) => Array.from(value.normalize('NFKD').replace(combiningMarks, '').toUpperCase())
58
- .map(char => confusables[char] ?? char)
59
- .join('')
60
- .replace(/[^A-Z0-9]/g, '');
7
+ export const normalizeJettonSymbol = normalizeTokenSymbol;
61
8
  //# sourceMappingURL=symbol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/symbol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,GAA2B;IAC1C,WAAW;IACX,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,QAAQ;IACR,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,+BAA+B;IAC/B,GAAG,EAAE,GAAG;IACR,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAA;AAED,MAAM,cAAc,GAAG,QAAQ,CAAA;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAU,EAAE,CAC7D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;KAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;KACtC,IAAI,CAAC,EAAE,CAAC;KACR,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAE5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,oBAAoB,CAAA"}
@@ -13,7 +13,7 @@ type ResolveTonJettonVerificationInput = {
13
13
  * Classifies a jetton against the verified registry. A listed address is
14
14
  * `verified` whatever it calls itself. An unlisted jetton is `scam` when the
15
15
  * indexer flags it or when its symbol or name collapses (see
16
- * `normalizeJettonSymbol`) onto a verified jetton's symbol or name — the
16
+ * `normalizeTokenSymbol`) onto a verified jetton's symbol or name — the
17
17
  * fake-USDT pattern, where the counterfeit is only distinguishable by address.
18
18
  * Anything else is `unverified`.
19
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verification.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAI/E,OAAO,EAAgC,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE5F,KAAK,iCAAiC,GAAG;IACvC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,yBAAyB,CAAA;CACpC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,GAAI,qDAM1C,iCAAiC,KAAG,iBAYtC,CAAA;AAED,KAAK,6BAA6B,GAAG;IACnC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAU,iBAG5C,6BAA6B,KAAG,OAAO,CAAC,iBAAiB,CAe3D,CAAA"}
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verification.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAG/E,OAAO,EAAgC,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE5F,KAAK,iCAAiC,GAAG;IACvC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,yBAAyB,CAAA;CACpC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,GAAI,qDAM1C,iCAAiC,KAAG,iBAYtC,CAAA;AAED,KAAK,6BAA6B,GAAG;IACnC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAA;IACV,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAU,iBAG5C,6BAA6B,KAAG,OAAO,CAAC,iBAAiB,CAe3D,CAAA"}
@@ -1,13 +1,13 @@
1
1
  import { tonAddressToRawKey } from '@vultisig/core-chain/chains/ton/address';
2
2
  import { getJettonMastersMetadata } from '@vultisig/core-chain/chains/ton/api';
3
+ import { normalizeTokenSymbol } from '@vultisig/core-chain/coin/tokenSymbol';
3
4
  import { attempt } from '@vultisig/lib-utils/attempt';
4
- import { normalizeJettonSymbol } from './symbol.js';
5
5
  import { getTonVerifiedJettonRegistry } from './verifiedRegistry.js';
6
6
  /**
7
7
  * Classifies a jetton against the verified registry. A listed address is
8
8
  * `verified` whatever it calls itself. An unlisted jetton is `scam` when the
9
9
  * indexer flags it or when its symbol or name collapses (see
10
- * `normalizeJettonSymbol`) onto a verified jetton's symbol or name — the
10
+ * `normalizeTokenSymbol`) onto a verified jetton's symbol or name — the
11
11
  * fake-USDT pattern, where the counterfeit is only distinguishable by address.
12
12
  * Anything else is `unverified`.
13
13
  */
@@ -17,7 +17,7 @@ export const resolveTonJettonVerification = ({ address, symbol, name, isFlaggedS
17
17
  if (isFlaggedScam)
18
18
  return 'scam';
19
19
  const impersonates = [symbol, name].some(label => {
20
- const skeleton = label ? normalizeJettonSymbol(label) : '';
20
+ const skeleton = label ? normalizeTokenSymbol(label) : '';
21
21
  return !!skeleton && (registry.symbols.has(skeleton) || registry.names.has(skeleton));
22
22
  });
23
23
  return impersonates ? 'scam' : 'unverified';
@@ -1 +1 @@
1
- {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,4BAA4B,EAA6B,MAAM,oBAAoB,CAAA;AAY5F;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,OAAO,EACP,MAAM,EACN,IAAI,EACJ,aAAa,EACb,QAAQ,GAC0B,EAAqB,EAAE;IACzD,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,UAAU,CAAA;IAEtE,IAAI,aAAa;QAAE,OAAO,MAAM,CAAA;IAEhC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAE1D,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IAEF,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAA;AAC7C,CAAC,CAAA;AASD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,EAC7C,EAAE,EACF,MAAM,GACwB,EAA8B,EAAE;IAC9D,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,4BAA4B,EAAE;QAC9B,OAAO,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEvF,OAAO,4BAA4B,CAAC;QAClC,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM;QAChC,IAAI,EAAE,MAAM,EAAE,IAAI;QAClB,aAAa,EAAE,MAAM,EAAE,aAAa;QACpC,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAE5E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAErD,OAAO,EAAE,4BAA4B,EAA6B,MAAM,oBAAoB,CAAA;AAY5F;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,EAC3C,OAAO,EACP,MAAM,EACN,IAAI,EACJ,aAAa,EACb,QAAQ,GAC0B,EAAqB,EAAE;IACzD,IAAI,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,UAAU,CAAA;IAEtE,IAAI,aAAa;QAAE,OAAO,MAAM,CAAA;IAEhC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEzD,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IAEF,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAA;AAC7C,CAAC,CAAA;AASD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAAE,EAC7C,EAAE,EACF,MAAM,GACwB,EAA8B,EAAE;IAC9D,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,4BAA4B,EAAE;QAC9B,OAAO,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEvF,OAAO,4BAA4B,CAAC;QAClC,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM;QAChC,IAAI,EAAE,MAAM,EAAE,IAAI;QAClB,aAAa,EAAE,MAAM,EAAE,aAAa;QACpC,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -16,7 +16,7 @@ export type VerifiedJetton = {
16
16
  /**
17
17
  * Verified jettons indexed for the two questions verification asks: "is this
18
18
  * address listed?" and "does this symbol or name belong to a listed jetton?".
19
- * `symbols` and `names` hold `normalizeJettonSymbol` skeletons.
19
+ * `symbols` and `names` hold `normalizeTokenSymbol` skeletons.
20
20
  */
21
21
  export type TonVerifiedJettonRegistry = {
22
22
  byAddress: Record<string, VerifiedJetton>;
@@ -1 +1 @@
1
- {"version":3,"file":"verifiedRegistry.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verifiedRegistry.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,6EAA6E,CAAA;AAW7G,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACzC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,GAAI,SAAS,cAAc,EAAE,KAAG,yBAezE,CAAA;AA4DD;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,QAAa,OAAO,CAAC,yBAAyB,CAOtF,CAAA"}
1
+ {"version":3,"file":"verifiedRegistry.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verifiedRegistry.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,6EAA6E,CAAA;AAW7G,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACzC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACpB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,GAAI,SAAS,cAAc,EAAE,KAAG,yBAezE,CAAA;AA4DD;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,QAAa,OAAO,CAAC,yBAAyB,CAOtF,CAAA"}
@@ -1,11 +1,11 @@
1
1
  import { Chain } from '@vultisig/core-chain/Chain';
2
2
  import { tonAddressToRawKey } from '@vultisig/core-chain/chains/ton/address';
3
3
  import { knownTokens } from '@vultisig/core-chain/coin/knownTokens';
4
+ import { normalizeTokenSymbol } from '@vultisig/core-chain/coin/tokenSymbol';
4
5
  import { attempt } from '@vultisig/lib-utils/attempt';
5
6
  import { memoizeAsync } from '@vultisig/lib-utils/memoizeAsync';
6
7
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
7
8
  import { convertDuration } from '@vultisig/lib-utils/time/convertDuration';
8
- import { normalizeJettonSymbol } from './symbol.js';
9
9
  /**
10
10
  * Tonkeeper's community-reviewed jetton whitelist, the list every major TON
11
11
  * wallet uses as its "verified" tier. Compiled from the repo's YAML sources on
@@ -26,10 +26,10 @@ export const makeTonVerifiedJettonRegistry = (jettons) => {
26
26
  for (const jetton of jettons) {
27
27
  const address = tonAddressToRawKey(jetton.address);
28
28
  registry.byAddress[address] ??= { ...jetton, address };
29
- const symbol = normalizeJettonSymbol(jetton.symbol);
29
+ const symbol = normalizeTokenSymbol(jetton.symbol);
30
30
  if (symbol)
31
31
  registry.symbols.add(symbol);
32
- const name = jetton.name ? normalizeJettonSymbol(jetton.name) : '';
32
+ const name = jetton.name ? normalizeTokenSymbol(jetton.name) : '';
33
33
  if (name)
34
34
  registry.names.add(name);
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verifiedRegistry.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verifiedRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAA;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,0EAA0E,CAAA;AAgC7G;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,OAAyB,EAA6B,EAAE;IACpG,MAAM,QAAQ,GAA8B,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAA;IAEnG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAClD,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAA;QAEtD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,MAAM;YAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAExC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAClE,IAAI,IAAI;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,GAAqB,EAAE,CAC/C,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CACjF,EAAE;IACA,CAAC,CAAC;QACE;YACE,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,IAAI;YACJ,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;SAC9D;KACF;IACH,CAAC,CAAC,EAAE,CACP,CAAA;AAEH,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA4B,EAAE,CACrE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA+B,CAAC,OAAO,KAAK,QAAQ,CAAA;AAE7G,MAAM,qBAAqB,GAAG,KAAK,IAA+B,EAAE;IAClE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAU,mBAAmB,CAAC,CAAA;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;QAC1G,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAA;QAEtB,OAAO;YACL;gBACE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC;gBACpC,MAAM,EAAE,MAAM;gBACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,MAAM,eAAe,GAAG,YAAY,CAClC,KAAK,IAAI,EAAE,CAAC,6BAA6B,CAAC,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,CAAC,MAAM,qBAAqB,EAAE,CAAC,CAAC,CAAC,EACvG,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAC7C,CAAA;AAED,IAAI,eAAsD,CAAA;AAE1D,MAAM,kBAAkB,GAAG,GAA8B,EAAE;IACzD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,6BAA6B,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,IAAwC,EAAE;IACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC/C,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IAEvD,OAAO,CAAC,IAAI,CAAC,qEAAqE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEjG,OAAO,kBAAkB,EAAE,CAAA;AAC7B,CAAC,CAAA"}
1
+ {"version":3,"file":"verifiedRegistry.js","sourceRoot":"","sources":["../../../../../../../packages/core/chain/chains/ton/jetton/verifiedRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { PublicKey, WalletCore } from '@trustwallet/wallet-core/dist/src/wallet-core';
2
+ import { tonV5R1WalletId } from '@vultisig/core-chain/chains/ton/walletV5R1';
3
+ /**
4
+ * The wallet contracts a Vultisig TON account can live in. The same Ed25519
5
+ * key yields a different address under each, so they are different accounts.
6
+ */
7
+ export declare const tonWalletVersions: readonly ["v4r2", "v5r1"];
8
+ export type TonWalletVersion = (typeof tonWalletVersions)[number];
9
+ /**
10
+ * The contract every Vultisig TON address has been derived from so far. W5 is
11
+ * an explicit opt-in: switching a key's default would silently move the user
12
+ * to an empty account.
13
+ */
14
+ export declare const defaultTonWalletVersion: TonWalletVersion;
15
+ export { tonV5R1WalletId };
16
+ /**
17
+ * How many outgoing messages one external request may carry. V4 is limited by
18
+ * the wallet code; W5 by the 255-entry action list.
19
+ */
20
+ export declare const tonMaxMessagesPerRequest: Record<TonWalletVersion, number>;
21
+ type DeriveTonAddressInput = {
22
+ publicKey: PublicKey;
23
+ walletCore: WalletCore;
24
+ version: TonWalletVersion;
25
+ };
26
+ /**
27
+ * The user-friendly, non-bounceable (`UQ…`) address of this key's wallet
28
+ * under the given contract. V4R2 is WalletCore's own TON derivation; W5 is the
29
+ * hash of the StateInit the contract is deployed from, built with `@ton/core`
30
+ * from the key bytes alone — no WalletCore feature beyond the public key, so it
31
+ * also works on React Native, whose native bridge exposes no `TONWallet`.
32
+ */
33
+ export declare const deriveTonAddress: ({ publicKey, walletCore, version }: DeriveTonAddressInput) => string;
34
+ type ResolveTonWalletVersionInput = {
35
+ address: string;
36
+ publicKey: PublicKey;
37
+ walletCore: WalletCore;
38
+ };
39
+ /**
40
+ * Which wallet contract an address is, for this key.
41
+ *
42
+ * The keysign payload carries no wallet-version field, so the sender address
43
+ * is the contract's identity: every co-signer derives both candidate addresses
44
+ * from the shared vault key and matches. An address that is neither is refused
45
+ * rather than assumed V4R2 — signing a V4R2 request for a wallet that is not
46
+ * one would either be rejected on chain or, worse, accepted by a contract we
47
+ * never meant to drive.
48
+ */
49
+ export declare const resolveTonWalletVersion: ({ address, publicKey, walletCore }: ResolveTonWalletVersionInput) => "v4r2" | "v5r1";
50
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/wallet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAA;AACrF,OAAO,EAAqB,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAG/F;;;GAGG;AACH,eAAO,MAAM,iBAAiB,2BAA4B,CAAA;AAE1D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,gBAAyB,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAA0B,CAAA;AAEhG,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,oCAAoC,qBAAqB,KAAG,MASzF,CAAA;AAEJ,KAAK,4BAA4B,GAAG;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,GAAI,oCAAoC,4BAA4B,oBAcvG,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { Address } from '@ton/core';
2
+ import { getTonV5R1Address, tonV5R1WalletId } from '@vultisig/core-chain/chains/ton/walletV5R1';
3
+ import { match } from '@vultisig/lib-utils/match';
4
+ /**
5
+ * The wallet contracts a Vultisig TON account can live in. The same Ed25519
6
+ * key yields a different address under each, so they are different accounts.
7
+ */
8
+ export const tonWalletVersions = ['v4r2', 'v5r1'];
9
+ /**
10
+ * The contract every Vultisig TON address has been derived from so far. W5 is
11
+ * an explicit opt-in: switching a key's default would silently move the user
12
+ * to an empty account.
13
+ */
14
+ export const defaultTonWalletVersion = 'v4r2';
15
+ export { tonV5R1WalletId };
16
+ /**
17
+ * How many outgoing messages one external request may carry. V4 is limited by
18
+ * the wallet code; W5 by the 255-entry action list.
19
+ */
20
+ export const tonMaxMessagesPerRequest = { v4r2: 4, v5r1: 255 };
21
+ /**
22
+ * The user-friendly, non-bounceable (`UQ…`) address of this key's wallet
23
+ * under the given contract. V4R2 is WalletCore's own TON derivation; W5 is the
24
+ * hash of the StateInit the contract is deployed from, built with `@ton/core`
25
+ * from the key bytes alone — no WalletCore feature beyond the public key, so it
26
+ * also works on React Native, whose native bridge exposes no `TONWallet`.
27
+ */
28
+ export const deriveTonAddress = ({ publicKey, walletCore, version }) => match(version, {
29
+ v4r2: () => walletCore.CoinTypeExt.deriveAddressFromPublicKey(walletCore.CoinType.ton, publicKey),
30
+ v5r1: () => getTonV5R1Address({ publicKey: publicKey.data() }).toString({
31
+ bounceable: false,
32
+ testOnly: false,
33
+ urlSafe: true,
34
+ }),
35
+ });
36
+ /**
37
+ * Which wallet contract an address is, for this key.
38
+ *
39
+ * The keysign payload carries no wallet-version field, so the sender address
40
+ * is the contract's identity: every co-signer derives both candidate addresses
41
+ * from the shared vault key and matches. An address that is neither is refused
42
+ * rather than assumed V4R2 — signing a V4R2 request for a wallet that is not
43
+ * one would either be rejected on chain or, worse, accepted by a contract we
44
+ * never meant to drive.
45
+ */
46
+ export const resolveTonWalletVersion = ({ address, publicKey, walletCore }) => {
47
+ const account = Address.parse(address);
48
+ const version = tonWalletVersions.find(candidate => Address.parse(deriveTonAddress({ publicKey, walletCore, version: candidate })).equals(account));
49
+ if (!version) {
50
+ throw new Error(`TON address ${address} is not this key's V4R2 or W5 wallet; refusing to sign for an unknown wallet contract`);
51
+ }
52
+ return version;
53
+ };
54
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAA;AAI1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAqB,MAAM,CAAA;AAE/D,OAAO,EAAE,eAAe,EAAE,CAAA;AAE1B;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAqC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;AAQhG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAyB,EAAU,EAAE,CACpG,KAAK,CAAC,OAAO,EAAE;IACb,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACjG,IAAI,EAAE,GAAG,EAAE,CACT,iBAAiB,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC;QAC1D,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,IAAI;KACd,CAAC;CACL,CAAC,CAAA;AAQJ;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgC,EAAE,EAAE;IAC1G,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEtC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CACjD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC/F,CAAA;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,uFAAuF,CAC9G,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { Address, StateInit } from '@ton/core';
2
+ /**
3
+ * W5R1 wallet id on mainnet, as the contract stores it: the network's global
4
+ * id (-239) XOR'd with the client context `1 | workchain 0 | version 0 |
5
+ * subwallet 0` (0x80000000), giving 0x7FFFFF11. WalletCore hardcodes this
6
+ * value for `WALLET_V5_R1`, so it is the only id that can be co-signed.
7
+ */
8
+ export declare const tonV5R1WalletId = 2147483409;
9
+ type BuildTonV5R1StateInitInput = {
10
+ /** The wallet's Ed25519 public key, 32 bytes. */
11
+ publicKey: Uint8Array;
12
+ /** Defaults to the mainnet id WalletCore uses. */
13
+ walletId?: number;
14
+ };
15
+ /**
16
+ * The W5R1 StateInit for a key: the published code cell plus the data cell
17
+ * `is_signature_allowed(1)=1 || seqno(32)=0 || wallet_id(int32) || publicKey(256) || bit(0)`
18
+ * (an empty extensions dictionary). Byte-identical to WalletCore's
19
+ * `WalletV5R1::state_init_impl`, but built from `@ton/core` alone so it runs
20
+ * wherever the key bytes are available — including React Native, whose native
21
+ * WalletCore bridge has no `TONWallet`.
22
+ */
23
+ export declare const buildTonV5R1StateInit: ({ publicKey, walletId, }: BuildTonV5R1StateInitInput) => StateInit;
24
+ /** The W5R1 wallet address (workchain 0) for a key: the hash of its StateInit. */
25
+ export declare const getTonV5R1Address: (input: BuildTonV5R1StateInitInput) => Address;
26
+ export {};
27
+ //# sourceMappingURL=walletV5R1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletV5R1.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/walletV5R1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoC,SAAS,EAAE,MAAM,WAAW,CAAA;AAYhF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAa,CAAA;AAiBzC,KAAK,0BAA0B,GAAG;IAChC,iDAAiD;IACjD,SAAS,EAAE,UAAU,CAAA;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAAI,0BAGnC,0BAA0B,KAAG,SAc/B,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAAI,OAAO,0BAA0B,KAAG,OACR,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { beginCell, Cell, contractAddress } from '@ton/core';
2
+ import { Buffer } from 'buffer';
3
+ /**
4
+ * Wallet V5R1 (W5) compiled code cell, base64 — the StateInit WalletCore 4.7
5
+ * emits for `WALLET_V5_R1`, code hash
6
+ * 20834b7b72b112147e1b2fb457b84e74d1a30f04f737d4f62a668e9552d2b72f, the
7
+ * published W5R1 mainnet code. Keep it copy-paste identical; do not reformat.
8
+ */
9
+ const walletV5R1CodeBase64 = 'te6cckECFAEAAoEAART/APSkE/S88sgLAQIBIAINAgFIAwQC3NAg10nBIJFbj2Mg1wsfIIIQZXh0br0hghBzaW50vbCSXwPgghBleHRuuo60gCDXIQHQdNch+kAw+kT4KPpEMFi9kVvg7UTQgQFB1yH0BYMH9A5voTGRMOGAQNchcH/bPOAxINdJgQKAuZEw4HDiEA8CASAFDAIBIAYJAgFuBwgAGa3OdqJoQCDrkOuF/8AAGa8d9qJoQBDrkOuFj8ACAUgKCwAXsyX7UTQcdch1wsfgABGyYvtRNDXCgCAAGb5fD2omhAgKDrkPoCwBAvIOAR4g1wsfghBzaWduuvLgin8PAeaO8O2i7fshgwjXIgKDCNcjIIAg1yHTH9Mf0x/tRNDSANMfINMf0//XCgAK+QFAzPkQmiiUXwrbMeHywIffArNQB7Dy0IRRJbry4IVQNrry4Ib4I7vy0IgikvgA3gGkf8jKAMsfAc8Wye1UIJL4D95w2zzYEAP27aLt+wL0BCFukmwhjkwCIdc5MHCUIccAs44tAdcoIHYeQ2wg10nACPLgkyDXSsAC8uCTINcdBscSwgBSMLDy0InXTNc5MAGk6GwShAe78uCT10rAAPLgk+1V4tIAAcAAkVvg69csCBQgkXCWAdcsCBwS4lIQseMPINdKERITAJYB+kAB+kT4KPpEMFi68uCR7UTQgQFB1xj0BQSdf8jKAEAEgwf0U/Lgi44UA4MH9Fvy4Iwi1woAIW4Bs7Dy0JDiyFADzxYS9ADJ7VQAcjDXLAgkji0h8uCS0gDtRNDSAFETuvLQj1RQMJExnAGBAUDXIdcKAPLgjuLIygBYzxbJ7VST8sCN4gAQk1vbMeHXTNC01sNe';
10
+ /**
11
+ * W5R1 wallet id on mainnet, as the contract stores it: the network's global
12
+ * id (-239) XOR'd with the client context `1 | workchain 0 | version 0 |
13
+ * subwallet 0` (0x80000000), giving 0x7FFFFF11. WalletCore hardcodes this
14
+ * value for `WALLET_V5_R1`, so it is the only id that can be co-signed.
15
+ */
16
+ export const tonV5R1WalletId = 2147483409;
17
+ const baseWorkchain = 0;
18
+ let cachedCodeCell;
19
+ /** Parsed on first use: `Cell.fromBoc` needs the Buffer polyfill, which a React Native entry installs at startup. */
20
+ const getWalletV5R1CodeCell = () => {
21
+ if (!cachedCodeCell) {
22
+ const [cell] = Cell.fromBoc(Buffer.from(walletV5R1CodeBase64, 'base64'));
23
+ if (!cell) {
24
+ throw new Error('TON W5 code cell failed to parse');
25
+ }
26
+ cachedCodeCell = cell;
27
+ }
28
+ return cachedCodeCell;
29
+ };
30
+ /**
31
+ * The W5R1 StateInit for a key: the published code cell plus the data cell
32
+ * `is_signature_allowed(1)=1 || seqno(32)=0 || wallet_id(int32) || publicKey(256) || bit(0)`
33
+ * (an empty extensions dictionary). Byte-identical to WalletCore's
34
+ * `WalletV5R1::state_init_impl`, but built from `@ton/core` alone so it runs
35
+ * wherever the key bytes are available — including React Native, whose native
36
+ * WalletCore bridge has no `TONWallet`.
37
+ */
38
+ export const buildTonV5R1StateInit = ({ publicKey, walletId = tonV5R1WalletId, }) => {
39
+ if (publicKey.length !== 32) {
40
+ throw new Error(`TON Ed25519 public key must be 32 bytes, got ${publicKey.length}`);
41
+ }
42
+ const data = beginCell()
43
+ .storeBit(true)
44
+ .storeUint(0, 32)
45
+ .storeInt(walletId, 32)
46
+ .storeBuffer(Buffer.from(publicKey))
47
+ .storeBit(false)
48
+ .endCell();
49
+ return { code: getWalletV5R1CodeCell(), data };
50
+ };
51
+ /** The W5R1 wallet address (workchain 0) for a key: the hash of its StateInit. */
52
+ export const getTonV5R1Address = (input) => contractAddress(baseWorkchain, buildTonV5R1StateInit(input));
53
+ //# sourceMappingURL=walletV5R1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletV5R1.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/ton/walletV5R1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,IAAI,EAAE,eAAe,EAAa,MAAM,WAAW,CAAA;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B;;;;;GAKG;AACH,MAAM,oBAAoB,GACxB,82BAA82B,CAAA;AAEh3B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC,MAAM,aAAa,GAAG,CAAC,CAAA;AAEvB,IAAI,cAAgC,CAAA;AACpC,qHAAqH;AACrH,MAAM,qBAAqB,GAAG,GAAS,EAAE;IACvC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAA;QACxE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QACrD,CAAC;QACD,cAAc,GAAG,IAAI,CAAA;IACvB,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC,CAAA;AASD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,SAAS,EACT,QAAQ,GAAG,eAAe,GACC,EAAa,EAAE;IAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,gDAAgD,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,EAAE;SACrB,QAAQ,CAAC,IAAI,CAAC;SACd,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;SAChB,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;SACtB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnC,QAAQ,CAAC,KAAK,CAAC;SACf,OAAO,EAAE,CAAA;IAEZ,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAA;AAChD,CAAC,CAAA;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAiC,EAAW,EAAE,CAC9E,eAAe,CAAC,aAAa,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAA"}
@@ -7,6 +7,17 @@ export type SolanaCoingeckoTokenResponse = {
7
7
  };
8
8
  };
9
9
  };
10
+ /** CoinGecko's on-chain multi-token lookup; a mint it does not index is simply missing from `data`. */
11
+ export type SolanaCoingeckoTokensResponse = {
12
+ data?: {
13
+ id: string;
14
+ type: 'token';
15
+ attributes?: {
16
+ address?: string;
17
+ coingecko_coin_id?: string | null;
18
+ };
19
+ }[];
20
+ };
10
21
  export type SolanaFmTokenResponse = {
11
22
  tokenList?: {
12
23
  extensions?: {
@@ -1 +1 @@
1
- {"version":3,"file":"coingeckoToken.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/coingeckoToken.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,OAAO,CAAA;QACb,UAAU,EAAE;YACV,iBAAiB,EAAE,MAAM,CAAA;SAC1B,CAAA;KACF,CAAA;CACF,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE;YACX,WAAW,CAAC,EAAE,MAAM,CAAA;SACrB,GAAG,IAAI,CAAA;KACT,GAAG,IAAI,CAAA;CACT,CAAA"}
1
+ {"version":3,"file":"coingeckoToken.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/coingeckoToken.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,OAAO,CAAA;QACb,UAAU,EAAE;YACV,iBAAiB,EAAE,MAAM,CAAA;SAC1B,CAAA;KACF,CAAA;CACF,CAAA;AAED,uGAAuG;AACvG,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,OAAO,CAAA;QACb,UAAU,CAAC,EAAE;YACX,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAClC,CAAA;KACF,EAAE,CAAA;CACJ,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,CAAC,EAAE;QACV,UAAU,CAAC,EAAE;YACX,WAAW,CAAC,EAAE,MAAM,CAAA;SACrB,GAAG,IAAI,CAAA;KACT,GAAG,IAAI,CAAA;CACT,CAAA"}
@@ -1,4 +1,14 @@
1
1
  export declare const getSolanaCoingeckoId: ({ id }: {
2
2
  id: string;
3
3
  }) => Promise<string | undefined>;
4
+ /**
5
+ * CoinGecko ids for the given mints, keyed by mint, read from CoinGecko's
6
+ * on-chain index thirty mints per call. Mints are matched exactly: base58 is
7
+ * case-sensitive and CoinGecko echoes the on-chain spelling. A mint it does
8
+ * not index, or lists without a coin id, is absent from the result. A failed
9
+ * call propagates instead of degrading to "no id": a caller that persists the
10
+ * answer would otherwise store a priced token as unpriced for good, whereas a
11
+ * failed call can simply be retried.
12
+ */
13
+ export declare const getSolanaCoingeckoIds: (ids: string[]) => Promise<Record<string, string>>;
4
14
  //# sourceMappingURL=getCoingeckoId.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCoingeckoId.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/getCoingeckoId.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oBAAoB,GAAU,QAAQ;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,gCAgBhE,CAAA"}
1
+ {"version":3,"file":"getCoingeckoId.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/getCoingeckoId.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,oBAAoB,GAAU,QAAQ;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,gCAchE,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAU,KAAK,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBzF,CAAA"}
@@ -1,8 +1,13 @@
1
1
  import { rootApiUrl } from '@vultisig/core-config';
2
+ import { toBatches } from '@vultisig/lib-utils/array/toBatches';
3
+ import { withoutDuplicates } from '@vultisig/lib-utils/array/withoutDuplicates';
2
4
  import { attempt } from '@vultisig/lib-utils/attempt';
3
5
  import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
6
+ const onchainSolanaTokensUrl = `${rootApiUrl}/coingeicko/api/v3/onchain/networks/solana/tokens`;
7
+ /** CoinGecko documents up to thirty addresses per multi-token call. */
8
+ const mintsPerLookup = 30;
4
9
  export const getSolanaCoingeckoId = async ({ id }) => {
5
- const cgResult = await attempt(() => queryUrl(`${rootApiUrl}/coingeicko/api/v3/onchain/networks/solana/tokens/${id}`));
10
+ const cgResult = await attempt(() => queryUrl(`${onchainSolanaTokensUrl}/${id}`));
6
11
  if ('data' in cgResult) {
7
12
  const coingeckoId = cgResult.data?.data?.attributes?.coingecko_coin_id ?? undefined;
8
13
  if (coingeckoId)
@@ -16,4 +21,28 @@ export const getSolanaCoingeckoId = async ({ id }) => {
16
21
  }
17
22
  return undefined;
18
23
  };
24
+ /**
25
+ * CoinGecko ids for the given mints, keyed by mint, read from CoinGecko's
26
+ * on-chain index thirty mints per call. Mints are matched exactly: base58 is
27
+ * case-sensitive and CoinGecko echoes the on-chain spelling. A mint it does
28
+ * not index, or lists without a coin id, is absent from the result. A failed
29
+ * call propagates instead of degrading to "no id": a caller that persists the
30
+ * answer would otherwise store a priced token as unpriced for good, whereas a
31
+ * failed call can simply be retried.
32
+ */
33
+ export const getSolanaCoingeckoIds = async (ids) => {
34
+ const requested = withoutDuplicates(ids);
35
+ const wanted = new Set(requested);
36
+ const responses = await Promise.all(toBatches(requested, mintsPerLookup).map(batch => queryUrl(`${onchainSolanaTokensUrl}/multi/${batch.join(',')}`)));
37
+ const result = {};
38
+ for (const { data } of responses) {
39
+ for (const { attributes } of data ?? []) {
40
+ const address = attributes?.address;
41
+ if (address && wanted.has(address) && attributes.coingecko_coin_id) {
42
+ result[address] = attributes.coingecko_coin_id;
43
+ }
44
+ }
45
+ }
46
+ return result;
47
+ };
19
48
  //# sourceMappingURL=getCoingeckoId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCoingeckoId.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/getCoingeckoId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAAE,EAAE,EAAkB,EAAE,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAClC,QAAQ,CAA+B,GAAG,UAAU,qDAAqD,EAAE,EAAE,CAAC,CAC/G,CAAA;IACD,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,IAAI,SAAS,CAAA;QACnF,IAAI,WAAW;YAAE,OAAO,WAAW,CAAA;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAwB,mCAAmC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC9G,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAA;QAC9D,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
1
+ {"version":3,"file":"getCoingeckoId.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/coingecko/getCoingeckoId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAI7D,MAAM,sBAAsB,GAAG,GAAG,UAAU,mDAAmD,CAAA;AAE/F,uEAAuE;AACvE,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EAAE,EAAE,EAAkB,EAAE,EAAE;IACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAA+B,GAAG,sBAAsB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAC/G,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,IAAI,SAAS,CAAA;QACnF,IAAI,WAAW;YAAE,OAAO,WAAW,CAAA;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAwB,mCAAmC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC9G,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAA;QAC9D,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,GAAa,EAAmC,EAAE;IAC5F,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IAEjC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAC/C,QAAQ,CAAgC,GAAG,sBAAsB,UAAU,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAC9F,CACF,CAAA;IAED,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,CAAA;YACnC,IAAI,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;gBACnE,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -1,3 +1,24 @@
1
+ import { OtherChain } from '@vultisig/core-chain/Chain';
1
2
  import { FindCoinsResolver } from '@vultisig/core-chain/coin/find/resolver';
2
- export declare const findSolanaCoins: FindCoinsResolver;
3
+ /**
4
+ * Discovers the SPL and Token-2022 holdings at `address` that pass verification.
5
+ *
6
+ * Only `verified` mints are returned. Solana wallets are carpet-bombed with
7
+ * airdropped counterfeits and zero-decimal spam, and auto-adding those to a
8
+ * vault would put a "USDT" balance on the home screen that the user never
9
+ * received. A verified token is returned whether or not a price id is known
10
+ * for it: gating on price hid legitimate unpriced tokens while letting priced
11
+ * scams through. Unverified and scam mints can still be added by hand, where
12
+ * the UI labels them.
13
+ *
14
+ * Jupiter answers for a hundred mints per call and CoinGecko for thirty, so a
15
+ * whole wallet costs a handful of calls; decimals come from the token account
16
+ * itself, and curated metadata wins for tokens we ship ourselves. When Jupiter
17
+ * cannot be reached, listed mints are still discovered from registry metadata
18
+ * and only a mint verified since the registry's last refresh waits for the
19
+ * next round. A failed price-id lookup, by contrast, fails the round: the
20
+ * caller persists the result, and a token saved without its price id would
21
+ * stay unpriced for good.
22
+ */
23
+ export declare const findSolanaCoins: FindCoinsResolver<OtherChain.Solana>;
3
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/solana/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAO3E,eAAO,MAAM,eAAe,EAAE,iBAiB7B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/solana/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAMvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAkB3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,EAAE,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAgEhE,CAAA"}