@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.
- package/CHANGELOG.md +67 -0
- package/dist/chains/solana/spl/verification.d.ts +38 -0
- package/dist/chains/solana/spl/verification.d.ts.map +1 -0
- package/dist/chains/solana/spl/verification.js +45 -0
- package/dist/chains/solana/spl/verification.js.map +1 -0
- package/dist/chains/solana/spl/verifiedRegistry.d.ts +34 -0
- package/dist/chains/solana/spl/verifiedRegistry.d.ts.map +1 -0
- package/dist/chains/solana/spl/verifiedRegistry.js +65 -0
- package/dist/chains/solana/spl/verifiedRegistry.js.map +1 -0
- package/dist/chains/ton/failure.d.ts +70 -0
- package/dist/chains/ton/failure.d.ts.map +1 -0
- package/dist/chains/ton/failure.js +170 -0
- package/dist/chains/ton/failure.js.map +1 -0
- package/dist/chains/ton/jetton/symbol.d.ts +3 -5
- package/dist/chains/ton/jetton/symbol.d.ts.map +1 -1
- package/dist/chains/ton/jetton/symbol.js +5 -58
- package/dist/chains/ton/jetton/symbol.js.map +1 -1
- package/dist/chains/ton/jetton/verification.d.ts +1 -1
- package/dist/chains/ton/jetton/verification.d.ts.map +1 -1
- package/dist/chains/ton/jetton/verification.js +3 -3
- package/dist/chains/ton/jetton/verification.js.map +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.d.ts +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.d.ts.map +1 -1
- package/dist/chains/ton/jetton/verifiedRegistry.js +3 -3
- package/dist/chains/ton/jetton/verifiedRegistry.js.map +1 -1
- package/dist/chains/ton/wallet.d.ts +50 -0
- package/dist/chains/ton/wallet.d.ts.map +1 -0
- package/dist/chains/ton/wallet.js +54 -0
- package/dist/chains/ton/wallet.js.map +1 -0
- package/dist/chains/ton/walletV5R1.d.ts +27 -0
- package/dist/chains/ton/walletV5R1.d.ts.map +1 -0
- package/dist/chains/ton/walletV5R1.js +53 -0
- package/dist/chains/ton/walletV5R1.js.map +1 -0
- package/dist/coin/coingecko/coingeckoToken.d.ts +11 -0
- package/dist/coin/coingecko/coingeckoToken.d.ts.map +1 -1
- package/dist/coin/coingecko/getCoingeckoId.d.ts +10 -0
- package/dist/coin/coingecko/getCoingeckoId.d.ts.map +1 -1
- package/dist/coin/coingecko/getCoingeckoId.js +30 -1
- package/dist/coin/coingecko/getCoingeckoId.js.map +1 -1
- package/dist/coin/find/resolvers/solana/index.d.ts +22 -1
- package/dist/coin/find/resolvers/solana/index.d.ts.map +1 -1
- package/dist/coin/find/resolvers/solana/index.js +79 -11
- package/dist/coin/find/resolvers/solana/index.js.map +1 -1
- package/dist/coin/jupiter/api.d.ts +18 -0
- package/dist/coin/jupiter/api.d.ts.map +1 -0
- package/dist/coin/jupiter/api.js +52 -0
- package/dist/coin/jupiter/api.js.map +1 -0
- package/dist/coin/jupiter/token.d.ts +4 -0
- package/dist/coin/jupiter/token.d.ts.map +1 -1
- package/dist/coin/jupiter/token.js.map +1 -1
- package/dist/coin/token/metadata/resolvers/solana.d.ts +3 -1
- package/dist/coin/token/metadata/resolvers/solana.d.ts.map +1 -1
- package/dist/coin/token/metadata/resolvers/solana.js +10 -6
- package/dist/coin/token/metadata/resolvers/solana.js.map +1 -1
- package/dist/coin/tokenSymbol.d.ts +10 -0
- package/dist/coin/tokenSymbol.d.ts.map +1 -0
- package/dist/coin/tokenSymbol.js +62 -0
- package/dist/coin/tokenSymbol.js.map +1 -0
- package/dist/publicKey/address/deriveAddress.d.ts +8 -1
- package/dist/publicKey/address/deriveAddress.d.ts.map +1 -1
- package/dist/publicKey/address/deriveAddress.js +5 -1
- package/dist/publicKey/address/deriveAddress.js.map +1 -1
- package/dist/publicKey/address/getChainAddress.d.ts +4 -1
- package/dist/publicKey/address/getChainAddress.d.ts.map +1 -1
- package/dist/publicKey/address/getChainAddress.js +2 -2
- package/dist/publicKey/address/getChainAddress.js.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.d.ts +17 -0
- package/dist/security/blockaid/tx/simulation/api/core.d.ts.map +1 -1
- package/dist/security/blockaid/tx/simulation/api/core.js +58 -41
- package/dist/security/blockaid/tx/simulation/api/core.js.map +1 -1
- package/dist/swap/general/GeneralSwapQuote.d.ts +10 -0
- package/dist/swap/general/GeneralSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/swapkit/api/getSwapKitQuote.d.ts.map +1 -1
- package/dist/swap/general/swapkit/api/getSwapKitQuote.js +40 -14
- package/dist/swap/general/swapkit/api/getSwapKitQuote.js.map +1 -1
- package/dist/swap/native/NativeSwapQuote.d.ts +6 -1
- package/dist/swap/native/NativeSwapQuote.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/broadcast/resolvers/ton.js +8 -0
- package/dist/tx/broadcast/resolvers/ton.js.map +1 -1
- package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts +10 -4
- package/dist/tx/fee/evm/clampEvmPriorityFee.d.ts.map +1 -1
- package/dist/tx/fee/evm/clampEvmPriorityFee.js +35 -14
- package/dist/tx/fee/evm/clampEvmPriorityFee.js.map +1 -1
- package/dist/tx/fee/evm/evmGasLimit.d.ts +29 -0
- package/dist/tx/fee/evm/evmGasLimit.d.ts.map +1 -1
- package/dist/tx/fee/evm/evmGasLimit.js +47 -17
- package/dist/tx/fee/evm/evmGasLimit.js.map +1 -1
- package/dist/tx/fee/evm/gasPrice.d.ts +4 -0
- package/dist/tx/fee/evm/gasPrice.d.ts.map +1 -0
- package/dist/tx/fee/evm/gasPrice.js +4 -0
- package/dist/tx/fee/evm/gasPrice.js.map +1 -0
- package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts +8 -0
- package/dist/tx/fee/evm/maxPriorityFeePerGas.d.ts.map +1 -1
- package/dist/tx/fee/evm/maxPriorityFeePerGas.js +30 -1
- package/dist/tx/fee/evm/maxPriorityFeePerGas.js.map +1 -1
- package/dist/tx/status/index.d.ts +2 -2
- package/dist/tx/status/index.d.ts.map +1 -1
- package/dist/tx/status/resolver.d.ts +15 -0
- package/dist/tx/status/resolver.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ton.d.ts +5 -1
- package/dist/tx/status/resolvers/ton.d.ts.map +1 -1
- package/dist/tx/status/resolvers/ton.js +8 -29
- package/dist/tx/status/resolvers/ton.js.map +1 -1
- package/package.json +41 -1
|
@@ -1,61 +1,8 @@
|
|
|
1
|
+
import { normalizeTokenSymbol } from '@vultisig/core-chain/coin/tokenSymbol';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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
|
|
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
|
|
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
|
-
* `
|
|
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":"
|
|
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
|
-
* `
|
|
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 ?
|
|
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;
|
|
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 `
|
|
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":"
|
|
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 =
|
|
29
|
+
const symbol = normalizeTokenSymbol(jetton.symbol);
|
|
30
30
|
if (symbol)
|
|
31
31
|
registry.symbols.add(symbol);
|
|
32
|
-
const name = 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
|
|
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":"
|
|
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(`${
|
|
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,
|
|
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
|
-
|
|
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":"
|
|
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"}
|