@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,18 +1,86 @@
|
|
|
1
1
|
import { getSplAccounts } from '@vultisig/core-chain/chains/solana/spl/getSplAccounts';
|
|
2
|
+
import { resolveSolanaTokenVerification } from '@vultisig/core-chain/chains/solana/spl/verification';
|
|
3
|
+
import { getSolanaVerifiedTokenRegistry } from '@vultisig/core-chain/chains/solana/spl/verifiedRegistry';
|
|
4
|
+
import { getSolanaCoingeckoIds } from '@vultisig/core-chain/coin/coingecko/getCoingeckoId';
|
|
5
|
+
import { getJupiterTokens } from '@vultisig/core-chain/coin/jupiter/api';
|
|
6
|
+
import { knownTokensIndex } from '@vultisig/core-chain/coin/knownTokens';
|
|
2
7
|
import { without } from '@vultisig/lib-utils/array/without';
|
|
3
8
|
import { attempt } from '@vultisig/lib-utils/attempt';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
const toHolding = (account) => {
|
|
10
|
+
const { mint, tokenAmount } = account.account.data.parsed.info;
|
|
11
|
+
return { mint: String(mint), amount: BigInt(tokenAmount.amount), decimals: Number(tokenAmount.decimals) };
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Discovers the SPL and Token-2022 holdings at `address` that pass verification.
|
|
15
|
+
*
|
|
16
|
+
* Only `verified` mints are returned. Solana wallets are carpet-bombed with
|
|
17
|
+
* airdropped counterfeits and zero-decimal spam, and auto-adding those to a
|
|
18
|
+
* vault would put a "USDT" balance on the home screen that the user never
|
|
19
|
+
* received. A verified token is returned whether or not a price id is known
|
|
20
|
+
* for it: gating on price hid legitimate unpriced tokens while letting priced
|
|
21
|
+
* scams through. Unverified and scam mints can still be added by hand, where
|
|
22
|
+
* the UI labels them.
|
|
23
|
+
*
|
|
24
|
+
* Jupiter answers for a hundred mints per call and CoinGecko for thirty, so a
|
|
25
|
+
* whole wallet costs a handful of calls; decimals come from the token account
|
|
26
|
+
* itself, and curated metadata wins for tokens we ship ourselves. When Jupiter
|
|
27
|
+
* cannot be reached, listed mints are still discovered from registry metadata
|
|
28
|
+
* and only a mint verified since the registry's last refresh waits for the
|
|
29
|
+
* next round. A failed price-id lookup, by contrast, fails the round: the
|
|
30
|
+
* caller persists the result, and a token saved without its price id would
|
|
31
|
+
* stay unpriced for good.
|
|
32
|
+
*/
|
|
33
|
+
export const findSolanaCoins = async ({ address, chain }) => {
|
|
7
34
|
const accounts = await getSplAccounts(address);
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
35
|
+
const holdings = new Map();
|
|
36
|
+
for (const account of accounts) {
|
|
37
|
+
const holding = toHolding(account);
|
|
38
|
+
if (holding.amount > 0n && !holdings.has(holding.mint))
|
|
39
|
+
holdings.set(holding.mint, holding);
|
|
40
|
+
}
|
|
41
|
+
if (holdings.size === 0)
|
|
42
|
+
return [];
|
|
43
|
+
const mints = [...holdings.keys()];
|
|
44
|
+
const [jupiter, registry] = await Promise.all([attempt(getJupiterTokens(mints)), getSolanaVerifiedTokenRegistry()]);
|
|
45
|
+
if ('error' in jupiter) {
|
|
46
|
+
console.warn('[solana] Jupiter metadata unavailable; discovering registry-listed mints only', jupiter.error);
|
|
47
|
+
}
|
|
48
|
+
const tokens = 'data' in jupiter && jupiter.data ? jupiter.data : {};
|
|
49
|
+
const verified = [...holdings.values()].filter(({ mint }) => {
|
|
50
|
+
const token = tokens[mint];
|
|
51
|
+
const verification = resolveSolanaTokenVerification({
|
|
52
|
+
address: mint,
|
|
53
|
+
symbol: token?.symbol,
|
|
54
|
+
name: token?.name,
|
|
55
|
+
isVerified: token?.isVerified,
|
|
56
|
+
registry,
|
|
57
|
+
});
|
|
58
|
+
return verification === 'verified';
|
|
59
|
+
});
|
|
60
|
+
const getKnown = (mint) => knownTokensIndex[chain][mint.toLowerCase()];
|
|
61
|
+
const priceProviderIds = await getSolanaCoingeckoIds(verified.filter(({ mint }) => !getKnown(mint)).map(({ mint }) => mint));
|
|
62
|
+
const coins = verified.map(({ mint: id, decimals }) => {
|
|
63
|
+
const known = getKnown(id);
|
|
64
|
+
if (known) {
|
|
65
|
+
return { ...known, chain, id, address };
|
|
14
66
|
}
|
|
15
|
-
|
|
16
|
-
|
|
67
|
+
const token = tokens[id];
|
|
68
|
+
const listed = registry.byAddress[id];
|
|
69
|
+
const ticker = token?.symbol ?? listed?.symbol;
|
|
70
|
+
if (!ticker)
|
|
71
|
+
return;
|
|
72
|
+
const logo = token?.icon ?? listed?.logo;
|
|
73
|
+
const priceProviderId = priceProviderIds[id];
|
|
74
|
+
return {
|
|
75
|
+
chain,
|
|
76
|
+
id,
|
|
77
|
+
address,
|
|
78
|
+
ticker,
|
|
79
|
+
decimals,
|
|
80
|
+
...(logo === undefined ? {} : { logo }),
|
|
81
|
+
...(priceProviderId === undefined ? {} : { priceProviderId }),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
return without(coins, undefined);
|
|
17
85
|
};
|
|
18
86
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/solana/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/find/resolvers/solana/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SolanaJupiterToken } from '@vultisig/core-chain/coin/jupiter/token';
|
|
2
|
+
/** Jupiter's Token API v2, reached through the Vultisig proxy. */
|
|
3
|
+
export declare const baseJupiterTokensUrl: string;
|
|
4
|
+
/**
|
|
5
|
+
* Metadata for the given mints, keyed by mint. One search call covers a
|
|
6
|
+
* hundred mints, so a whole wallet costs a call or two rather than one per
|
|
7
|
+
* token. A mint Jupiter does not index is simply absent from the result, and
|
|
8
|
+
* the response is filtered to the requested mints so a lookalike match can
|
|
9
|
+
* never stand in for a mint that was asked about.
|
|
10
|
+
*/
|
|
11
|
+
export declare const getJupiterTokens: (mints: string[]) => Promise<Record<string, SolanaJupiterToken>>;
|
|
12
|
+
/**
|
|
13
|
+
* Every mint Jupiter marks verified: the community-reviewed list the major
|
|
14
|
+
* Solana wallets show as their "verified" tier. Several megabytes, so callers
|
|
15
|
+
* cache it.
|
|
16
|
+
*/
|
|
17
|
+
export declare const getJupiterVerifiedTokens: () => Promise<SolanaJupiterToken[]>;
|
|
18
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAM5E,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,QAAgC,CAAA;AA6BjE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAU,OAAO,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAkBlG,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAa,OAAO,CAAC,kBAAkB,EAAE,CAI3E,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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';
|
|
4
|
+
import { queryUrl } from '@vultisig/lib-utils/query/queryUrl';
|
|
5
|
+
/** Jupiter's Token API v2, reached through the Vultisig proxy. */
|
|
6
|
+
export const baseJupiterTokensUrl = `${rootApiUrl}/jup/tokens/v2`;
|
|
7
|
+
/** Jupiter's search endpoint accepts up to a hundred comma-separated mints per call. */
|
|
8
|
+
const mintsPerSearch = 100;
|
|
9
|
+
// The verified list runs to several megabytes; a slow link should not turn it
|
|
10
|
+
// into a timeout, which would leave legitimate tokens unrecognised until retry.
|
|
11
|
+
const verifiedListTimeoutMs = 60_000;
|
|
12
|
+
const isJupiterToken = (value) => {
|
|
13
|
+
if (typeof value !== 'object' || value === null)
|
|
14
|
+
return false;
|
|
15
|
+
const { id, symbol, name, decimals } = value;
|
|
16
|
+
return (typeof id === 'string' && typeof symbol === 'string' && typeof name === 'string' && typeof decimals === 'number');
|
|
17
|
+
};
|
|
18
|
+
// An entry missing a required field is dropped rather than passed on as a
|
|
19
|
+
// partial token that would surface as `decimals: undefined` downstream.
|
|
20
|
+
const parseJupiterTokens = (response, source) => {
|
|
21
|
+
if (!Array.isArray(response)) {
|
|
22
|
+
throw new Error(`Jupiter ${source} did not return a token list`);
|
|
23
|
+
}
|
|
24
|
+
return response.filter(isJupiterToken);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Metadata for the given mints, keyed by mint. One search call covers a
|
|
28
|
+
* hundred mints, so a whole wallet costs a call or two rather than one per
|
|
29
|
+
* token. A mint Jupiter does not index is simply absent from the result, and
|
|
30
|
+
* the response is filtered to the requested mints so a lookalike match can
|
|
31
|
+
* never stand in for a mint that was asked about.
|
|
32
|
+
*/
|
|
33
|
+
export const getJupiterTokens = async (mints) => {
|
|
34
|
+
const requested = withoutDuplicates(mints);
|
|
35
|
+
const wanted = new Set(requested);
|
|
36
|
+
const responses = await Promise.all(toBatches(requested, mintsPerSearch).map(batch => queryUrl(`${baseJupiterTokensUrl}/search?query=${batch.join(',')}`)));
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const response of responses) {
|
|
39
|
+
for (const token of parseJupiterTokens(response, 'search')) {
|
|
40
|
+
if (wanted.has(token.id))
|
|
41
|
+
result[token.id] = token;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Every mint Jupiter marks verified: the community-reviewed list the major
|
|
48
|
+
* Solana wallets show as their "verified" tier. Several megabytes, so callers
|
|
49
|
+
* cache it.
|
|
50
|
+
*/
|
|
51
|
+
export const getJupiterVerifiedTokens = async () => parseJupiterTokens(await queryUrl(`${baseJupiterTokensUrl}/tag?query=verified`, { timeoutMs: verifiedListTimeoutMs }), 'verified list');
|
|
52
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/api.ts"],"names":[],"mappings":"AACA,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,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAE7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,UAAU,gBAAgB,CAAA;AAEjE,wFAAwF;AACxF,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAEpC,MAAM,cAAc,GAAG,CAAC,KAAc,EAA+B,EAAE;IACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAE7D,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAgC,CAAA;IAEvE,OAAO,CACL,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,CACjH,CAAA;AACH,CAAC,CAAA;AAED,0EAA0E;AAC1E,wEAAwE;AACxE,MAAM,kBAAkB,GAAG,CAAC,QAAiB,EAAE,MAAc,EAAwB,EAAE;IACrF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,8BAA8B,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AACxC,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,KAAe,EAA+C,EAAE;IACrG,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1C,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,CAAU,GAAG,oBAAoB,iBAAiB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAC7E,CACF,CAAA;IAED,MAAM,MAAM,GAAuC,EAAE,CAAA;IACrD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3D,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAA;QACpD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,IAAmC,EAAE,CAChF,kBAAkB,CAChB,MAAM,QAAQ,CAAU,GAAG,oBAAoB,qBAAqB,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC,EAC3G,eAAe,CAChB,CAAA"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
2
|
import { Coin } from '@vultisig/core-chain/coin/Coin';
|
|
3
|
+
/** One entry of Jupiter's Token API v2, as returned by its search and tag endpoints. */
|
|
3
4
|
export type SolanaJupiterToken = {
|
|
4
5
|
id: string;
|
|
5
6
|
name: string;
|
|
6
7
|
symbol: string;
|
|
7
8
|
decimals: number;
|
|
8
9
|
icon?: string;
|
|
10
|
+
/** Jupiter's own verification flag; `null` for a mint it indexes but does not vouch for. */
|
|
11
|
+
isVerified?: boolean | null;
|
|
12
|
+
tags?: string[];
|
|
9
13
|
};
|
|
10
14
|
type FromSolanaJupiterTokensInput = {
|
|
11
15
|
tokens: SolanaJupiterToken[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAA;AAErD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAA;AAErD,wFAAwF;AACxF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4FAA4F;IAC5F,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAA;IAC5B,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAI,mBAAmB,4BAA4B,KAAG,IAAI,EAU7F,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/coin/jupiter/token.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAgC,EAAU,EAAE;IACjG,OAAO,MAAM;SACV,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,6CAA6C;SAC3E,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACb,KAAK;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC,CAAA;AACP,CAAC,CAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { baseJupiterTokensUrl } from '@vultisig/core-chain/coin/jupiter/api';
|
|
1
2
|
import { TokenMetadataResolver } from '../resolver.js';
|
|
2
|
-
|
|
3
|
+
/** Kept on this subpath for consumers that read the Jupiter base URL from the resolver module. */
|
|
4
|
+
export { baseJupiterTokensUrl };
|
|
3
5
|
export declare const getSolanaTokenMetadata: TokenMetadataResolver;
|
|
4
6
|
//# sourceMappingURL=solana.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/solana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,uCAAuC,CAAA;AAG9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,kGAAkG;AAClG,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAE/B,eAAO,MAAM,sBAAsB,EAAE,qBAcpC,CAAA"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { baseJupiterTokensUrl, getJupiterTokens } from '@vultisig/core-chain/coin/jupiter/api';
|
|
2
2
|
import { getSolanaCoingeckoId } from '../../../coingecko/getCoingeckoId.js';
|
|
3
|
-
|
|
3
|
+
/** Kept on this subpath for consumers that read the Jupiter base URL from the resolver module. */
|
|
4
|
+
export { baseJupiterTokensUrl };
|
|
4
5
|
export const getSolanaTokenMetadata = async ({ id }) => {
|
|
5
|
-
const
|
|
6
|
+
const token = (await getJupiterTokens([id]))[id];
|
|
7
|
+
if (!token) {
|
|
8
|
+
throw new Error(`Jupiter has no metadata for Solana mint ${id}`);
|
|
9
|
+
}
|
|
6
10
|
const coingeckoId = await getSolanaCoingeckoId({ id });
|
|
7
11
|
return {
|
|
8
|
-
decimals,
|
|
9
|
-
logo: icon,
|
|
10
|
-
ticker: symbol,
|
|
12
|
+
decimals: token.decimals,
|
|
13
|
+
logo: token.icon,
|
|
14
|
+
ticker: token.symbol,
|
|
11
15
|
priceProviderId: coingeckoId,
|
|
12
16
|
};
|
|
13
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/solana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/coin/token/metadata/resolvers/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAE9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAGxE,kGAAkG;AAClG,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAE/B,MAAM,CAAC,MAAM,sBAAsB,GAA0B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC5E,MAAM,KAAK,GAAG,CAAC,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAEtD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,eAAe,EAAE,WAAW;KAC7B,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapses a token symbol or name to the Latin skeleton a user perceives, so
|
|
3
|
+
* `USD₮`, `UЅDT` (Cyrillic Ѕ), `$USĐ₮` and `usdt` all compare equal to `USDT`.
|
|
4
|
+
* Compatibility decomposition folds full-width and mathematical letter forms,
|
|
5
|
+
* diacritics are dropped, known homoglyphs are mapped, and everything that is
|
|
6
|
+
* not `A–Z`/`0–9` is removed. Returns an empty string when nothing survives.
|
|
7
|
+
* Chain-agnostic: every chain's counterfeit heuristic compares these skeletons.
|
|
8
|
+
*/
|
|
9
|
+
export declare const normalizeTokenSymbol: (value: string) => string;
|
|
10
|
+
//# sourceMappingURL=tokenSymbol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenSymbol.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/coin/tokenSymbol.ts"],"names":[],"mappings":"AAmDA;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,MAIvB,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Homoglyphs scammers substitute into a token 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()`.
|
|
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 token 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
|
+
* Chain-agnostic: every chain's counterfeit heuristic compares these skeletons.
|
|
57
|
+
*/
|
|
58
|
+
export const normalizeTokenSymbol = (value) => Array.from(value.normalize('NFKD').replace(combiningMarks, '').toUpperCase())
|
|
59
|
+
.map(char => confusables[char] ?? char)
|
|
60
|
+
.join('')
|
|
61
|
+
.replace(/[^A-Z0-9]/g, '');
|
|
62
|
+
//# sourceMappingURL=tokenSymbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenSymbol.js","sourceRoot":"","sources":["../../../../../packages/core/chain/coin/tokenSymbol.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;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAU,EAAE,CAC5D,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,10 +1,17 @@
|
|
|
1
1
|
import { PublicKey, WalletCore } from '@trustwallet/wallet-core/dist/src/wallet-core';
|
|
2
2
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
|
+
import { TonWalletVersion } from '@vultisig/core-chain/chains/ton/wallet';
|
|
3
4
|
type DeriveAddressInput = {
|
|
4
5
|
chain: Chain;
|
|
5
6
|
publicKey: PublicKey;
|
|
6
7
|
walletCore: WalletCore;
|
|
8
|
+
/**
|
|
9
|
+
* TON only: which wallet contract to derive for. Defaults to V4R2, the
|
|
10
|
+
* contract every existing Vultisig TON address uses; W5 is a different
|
|
11
|
+
* account for the same key and must be an explicit choice.
|
|
12
|
+
*/
|
|
13
|
+
tonWalletVersion?: TonWalletVersion;
|
|
7
14
|
};
|
|
8
|
-
export declare const deriveAddress: ({ chain, publicKey, walletCore }: DeriveAddressInput) => string;
|
|
15
|
+
export declare const deriveAddress: ({ chain, publicKey, walletCore, tonWalletVersion }: DeriveAddressInput) => string;
|
|
9
16
|
export {};
|
|
10
17
|
//# sourceMappingURL=deriveAddress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deriveAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAA;AACrF,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"deriveAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAA;AACrF,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAA6C,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAMpH,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAID,eAAO,MAAM,aAAa,GAAI,oDAAoD,kBAAkB,WAmCnG,CAAA"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
2
|
+
import { defaultTonWalletVersion, deriveTonAddress } from '@vultisig/core-chain/chains/ton/wallet';
|
|
2
3
|
import { getCoinType } from '@vultisig/core-chain/coin/coinType';
|
|
3
4
|
import { deriveBittensorAddress } from './bittensor.js';
|
|
4
5
|
import { deriveCardanoAddress } from './cardano.js';
|
|
5
6
|
const bitcoinCashPrefix = 'bitcoincash:';
|
|
6
|
-
export const deriveAddress = ({ chain, publicKey, walletCore }) => {
|
|
7
|
+
export const deriveAddress = ({ chain, publicKey, walletCore, tonWalletVersion }) => {
|
|
8
|
+
if (chain === Chain.Ton) {
|
|
9
|
+
return deriveTonAddress({ publicKey, walletCore, version: tonWalletVersion ?? defaultTonWalletVersion });
|
|
10
|
+
}
|
|
7
11
|
const coinType = getCoinType({
|
|
8
12
|
chain,
|
|
9
13
|
walletCore,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deriveAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"deriveAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/deriveAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAoB,MAAM,wCAAwC,CAAA;AACpH,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAchD,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAExC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAsB,EAAE,EAAE;IACtG,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,OAAO,gBAAgB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,KAAK;QACL,UAAU;KACX,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAC,UAAU,CAAC,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;IACnG,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC;YAC1B,SAAS;YACT,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,sBAAsB,CAAC;YAC5B,SAAS;YACT,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAEtF,IAAI,KAAK,KAAK,KAAK,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzE,OAAO,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WalletCore } from '@trustwallet/wallet-core';
|
|
2
2
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
|
+
import { TonWalletVersion } from '@vultisig/core-chain/chains/ton/wallet';
|
|
3
4
|
import { PublicKeys } from '@vultisig/core-chain/publicKey/PublicKeys';
|
|
4
5
|
type GetChainAddressInput = {
|
|
5
6
|
chain: Chain;
|
|
@@ -8,8 +9,10 @@ type GetChainAddressInput = {
|
|
|
8
9
|
publicKeys: PublicKeys;
|
|
9
10
|
publicKeyMldsa?: string;
|
|
10
11
|
chainPublicKeys?: Partial<Record<Chain, string>>;
|
|
12
|
+
/** TON only: wallet contract to derive for. Defaults to V4R2. */
|
|
13
|
+
tonWalletVersion?: TonWalletVersion;
|
|
11
14
|
};
|
|
12
15
|
/** Derives the on-chain address for any chain, including MLDSA-based chains like QBTC. */
|
|
13
|
-
export declare const getChainAddress: ({ chain, walletCore, hexChainCode, publicKeys, publicKeyMldsa, chainPublicKeys, }: GetChainAddressInput) => string;
|
|
16
|
+
export declare const getChainAddress: ({ chain, walletCore, hexChainCode, publicKeys, publicKeyMldsa, chainPublicKeys, tonWalletVersion, }: GetChainAddressInput) => string;
|
|
14
17
|
export {};
|
|
15
18
|
//# sourceMappingURL=getChainAddress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getChainAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/getChainAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"getChainAddress.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/getChainAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAIzE,OAAO,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAA;AAGtE,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAChD,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,eAAe,GAAI,qGAQ7B,oBAAoB,KAAG,MAczB,CAAA"}
|
|
@@ -4,7 +4,7 @@ import { deriveQbtcAddress } from '@vultisig/core-chain/publicKey/address/derive
|
|
|
4
4
|
import { getPublicKey } from '@vultisig/core-chain/publicKey/getPublicKey';
|
|
5
5
|
import { shouldBePresent } from '@vultisig/lib-utils/assert/shouldBePresent';
|
|
6
6
|
/** Derives the on-chain address for any chain, including MLDSA-based chains like QBTC. */
|
|
7
|
-
export const getChainAddress = ({ chain, walletCore, hexChainCode, publicKeys, publicKeyMldsa, chainPublicKeys, }) => {
|
|
7
|
+
export const getChainAddress = ({ chain, walletCore, hexChainCode, publicKeys, publicKeyMldsa, chainPublicKeys, tonWalletVersion, }) => {
|
|
8
8
|
if (chain === Chain.QBTC) {
|
|
9
9
|
return deriveQbtcAddress(shouldBePresent(publicKeyMldsa, 'MLDSA public key'));
|
|
10
10
|
}
|
|
@@ -15,6 +15,6 @@ export const getChainAddress = ({ chain, walletCore, hexChainCode, publicKeys, p
|
|
|
15
15
|
publicKeys,
|
|
16
16
|
chainPublicKeys,
|
|
17
17
|
});
|
|
18
|
-
return deriveAddress({ chain, publicKey, walletCore });
|
|
18
|
+
return deriveAddress({ chain, publicKey, walletCore, tonWalletVersion });
|
|
19
19
|
};
|
|
20
20
|
//# sourceMappingURL=getChainAddress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getChainAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/getChainAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"getChainAddress.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/publicKey/address/getChainAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,sDAAsD,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAA;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAa5E,0FAA0F;AAC1F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,GACK,EAAU,EAAE;IACjC,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,iBAAiB,CAAC,eAAe,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAC/E,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC;QAC7B,KAAK;QACL,UAAU;QACV,YAAY;QACZ,UAAU;QACV,eAAe;KAChB,CAAC,CAAA;IAEF,OAAO,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAA;AAC1E,CAAC,CAAA"}
|
|
@@ -114,6 +114,23 @@ export type BlockaidEVMSimulation = {
|
|
|
114
114
|
}>;
|
|
115
115
|
};
|
|
116
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* Parse a Blockaid Solana simulation into the user's net balance change,
|
|
119
|
+
* classified as a `swap` (two distinct mints move) or a `transfer` (one
|
|
120
|
+
* mint moves net-negative).
|
|
121
|
+
*
|
|
122
|
+
* Diffs are grouped by resolved mint and netted (`in - out`) per group,
|
|
123
|
+
* mirroring `parseBlockaidEvmSimulation`. This collapses a wrap-then-spend or
|
|
124
|
+
* an unwrap/close-account pair — native SOL and the WSOL mint landing in the
|
|
125
|
+
* same bucket — into the single net movement it actually is, instead of
|
|
126
|
+
* surfacing a same-asset "SOL -> WSOL swap" whose destination amount is only
|
|
127
|
+
* the token account's rent-exempt residual (sdk#1997).
|
|
128
|
+
*
|
|
129
|
+
* Throws when the netted result isn't representable as `swap`/`transfer`
|
|
130
|
+
* (net-zero, a pure net-receive with no matching type, or 3+ distinct
|
|
131
|
+
* nonzero mints) rather than guess — the caller falls back to showing no
|
|
132
|
+
* preview, which is safe; a wrong number is not.
|
|
133
|
+
*/
|
|
117
134
|
export declare const parseBlockaidSolanaSimulation: (simulation: BlockaidSolanaSimulation) => Promise<BlockaidSolanaSimulationInfo>;
|
|
118
135
|
/**
|
|
119
136
|
* Parse a Blockaid EVM simulation into the user's net balance changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/chain/security/blockaid/tx/simulation/api/core.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/chain/security/blockaid/tx/simulation/api/core.ts"],"names":[],"mappings":"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"}
|