@vultisig/core-chain 2.24.2 → 2.24.3
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 +6 -0
- package/dist/amount/toChainAmount.d.ts.map +1 -1
- package/dist/amount/toChainAmount.js +5 -3
- package/dist/amount/toChainAmount.js.map +1 -1
- package/dist/chains/solana/assertSafeSolanaSwapInstructions.d.ts +96 -0
- package/dist/chains/solana/assertSafeSolanaSwapInstructions.d.ts.map +1 -0
- package/dist/chains/solana/assertSafeSolanaSwapInstructions.js +260 -0
- package/dist/chains/solana/assertSafeSolanaSwapInstructions.js.map +1 -0
- package/dist/swap/general/jupiter/api/getJupiterSwapQuote.d.ts.map +1 -1
- package/dist/swap/general/jupiter/api/getJupiterSwapQuote.js +9 -0
- package/dist/swap/general/jupiter/api/getJupiterSwapQuote.js.map +1 -1
- package/dist/swap/general/jupiter/api/jupiterFeeAta.d.ts +2 -1
- package/dist/swap/general/jupiter/api/jupiterFeeAta.d.ts.map +1 -1
- package/dist/swap/general/jupiter/api/jupiterFeeAta.js +7 -35
- package/dist/swap/general/jupiter/api/jupiterFeeAta.js.map +1 -1
- package/fixtures/jupiter-swap-transactions.json +30 -0
- package/package.json +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @vultisig/core-chain
|
|
2
2
|
|
|
3
|
+
## 2.24.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1115](https://github.com/vultisig/vultisig-sdk/pull/1115) [`4483754`](https://github.com/vultisig/vultisig-sdk/commit/4483754748190fe25654de79fc12fba0edb73963) Thanks [@rcoderdev](https://github.com/rcoderdev)! - Expand large scientific-notation numeric amounts before base-unit parsing.
|
|
8
|
+
|
|
3
9
|
## 2.24.2
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toChainAmount.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/amount/toChainAmount.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA0B;gBAEpC,OAAO,EAAE,MAAM;CAG5B;
|
|
1
|
+
{"version":3,"file":"toChainAmount.d.ts","sourceRoot":"","sources":["../../../../../packages/core/chain/amount/toChainAmount.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA0B;gBAEpC,OAAO,EAAE,MAAM;CAG5B;AAoGD,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,GAAG,MAAM,EAAE,UAAU,MAAM,WAatE,CAAA"}
|
|
@@ -75,6 +75,10 @@ const expandScientificNotationToDecimalString = (s) => {
|
|
|
75
75
|
}
|
|
76
76
|
return absResult;
|
|
77
77
|
};
|
|
78
|
+
const formatNumberAmount = (amount) => {
|
|
79
|
+
const str = amount.toString();
|
|
80
|
+
return /[eE]/.test(str) ? expandScientificNotationToDecimalString(str) : str;
|
|
81
|
+
};
|
|
78
82
|
/**
|
|
79
83
|
* Truncate a plain decimal string to at most `decimals` fractional digits so
|
|
80
84
|
* parseUnits cannot round up. viem's parseUnits rounds half-up at decimals=0
|
|
@@ -105,8 +109,6 @@ export const toChainAmount = (amount, decimals) => {
|
|
|
105
109
|
}
|
|
106
110
|
return parseUnits(truncateToDecimals(trimmed, decimals), decimals);
|
|
107
111
|
}
|
|
108
|
-
|
|
109
|
-
const value = /[eE]/.test(str) ? amount.toFixed(decimals) : str;
|
|
110
|
-
return parseUnits(truncateToDecimals(value, decimals), decimals);
|
|
112
|
+
return parseUnits(truncateToDecimals(formatNumberAmount(amount), decimals), decimals);
|
|
111
113
|
};
|
|
112
114
|
//# sourceMappingURL=toChainAmount.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toChainAmount.js","sourceRoot":"","sources":["../../../../../packages/core/chain/amount/toChainAmount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAEjC,iFAAiF;AACjF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC5B,IAAI,GAAG,uBAAuB,CAAA;IAEhD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;CACF;AAED,MAAM,kBAAkB,GAAG,mDAAmD,CAAA;AAE9E,iFAAiF;AACjF,MAAM,aAAa,GAAG,MAAO,CAAA;AAE7B,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAU,EAAE;IACnE,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3C,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5C,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;IAC7C,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAA;IACd,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IACjB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,uCAAuC,GAAG,CAAC,CAAS,EAAU,EAAE;IACpE,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC3C,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAA;IAC5B,IAAI,QAAgB,CAAA;IACpB,IAAI,OAAe,CAAA;IACnB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACvB,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACf,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA;IAC3B,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;QACvC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACzB,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACtD,MAAM,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAC5C,IAAI,QAAQ,GAAG,aAAa,EAAE,CAAC;QAC7B,MAAM,IAAI,qBAAqB,CAAC,4CAA4C,CAAC,GAAG,CAAC,CAAA;IACnF,CAAC;IAED,IAAI,SAAiB,CAAA;IACrB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,GAAG,IAAI,KAAK,CAAA;QACzB,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,KAAK,CAAA;QAChB,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,CAAA;QACxB,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;QACnC,MAAM,GAAG,GAAG,SAAS,GAAG,OAAO,CAAA;QAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;QACjD,SAAS,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAA;IAC5E,CAAC;IAED,IAAI,OAAO,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,IAAI,SAAS,EAAE,CAAA;IACxB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,QAAgB,EAAU,EAAE;IACjE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAC3B,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACpC,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,CAAC,CAAA;IACzC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAuB,EAAE,QAAgB,EAAE,EAAE;IACzE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,uCAAuC,CAAC,OAAO,CAAC,CAAA;YACjE,OAAO,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,UAAU,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAA;IACpE,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"toChainAmount.js","sourceRoot":"","sources":["../../../../../packages/core/chain/amount/toChainAmount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { AddressLookupTableAccount, PublicKey, VersionedMessage } from '@solana/web3.js';
|
|
2
|
+
/**
|
|
3
|
+
* Programs a legitimate Jupiter swap is expected to invoke as a TOP-LEVEL
|
|
4
|
+
* instruction. Captured empirically (2026-07-09) by fetching real `/swap`
|
|
5
|
+
* responses from Jupiter's public API (`lite-api.jup.ag`) and decoding the
|
|
6
|
+
* returned `VersionedTransaction` across four scenarios:
|
|
7
|
+
* - a single-hop SOL -> USDC route
|
|
8
|
+
* - a 3-hop SOL -> BONK route (AlphaQ -> Hadron -> Raydium CLMM)
|
|
9
|
+
* - a Token-2022 output mint (SOL -> PYUSD)
|
|
10
|
+
* - a platform-fee-included swap (feeAccount + platformFeeBps set)
|
|
11
|
+
*
|
|
12
|
+
* Every one of them resolved to exactly this program set. `useSharedAccounts`
|
|
13
|
+
* (Jupiter's default) routes the actual AMM legs through the router via CPI,
|
|
14
|
+
* so the individual AMM programs (Raydium, Whirlpool, etc.) never surface as
|
|
15
|
+
* top-level instructions — only the router itself plus the
|
|
16
|
+
* wrapping/bookkeeping instructions (SOL wrap/unwrap, ATA create, compute
|
|
17
|
+
* budget) do. Token-2022 is allow-listed defensively even though it did not
|
|
18
|
+
* surface in any captured fixture (the wSOL leg always uses the legacy Token
|
|
19
|
+
* program): the SDK's own fee-ATA derivation
|
|
20
|
+
* (`packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts`)
|
|
21
|
+
* explicitly supports Token-2022 mints, so a route with no wSOL leg could
|
|
22
|
+
* plausibly need it.
|
|
23
|
+
*/
|
|
24
|
+
export declare const JUPITER_SWAP_ALLOWED_PROGRAM_IDS: ReadonlySet<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Thrown when a Solana swap message contains a top-level instruction that
|
|
27
|
+
* targets a program outside {@link JUPITER_SWAP_ALLOWED_PROGRAM_IDS}.
|
|
28
|
+
*/
|
|
29
|
+
export declare class UnsafeSolanaSwapInstructionError extends Error {
|
|
30
|
+
readonly instructionIndex: number;
|
|
31
|
+
readonly programId: string;
|
|
32
|
+
constructor(instructionIndex: number, programId: string);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Thrown when a fund-moving instruction (System/Token) in a swap message has
|
|
36
|
+
* a destination or authority that does not belong to the user.
|
|
37
|
+
*
|
|
38
|
+
* Audit finding SOL-01 residual: a program-only allow-list permits injected
|
|
39
|
+
* top-level `SystemProgram.Transfer { from: user, to: attacker }` or
|
|
40
|
+
* `Token.Approve { owner: user, delegate: attacker }` because those programs
|
|
41
|
+
* are allow-listed (needed for SOL wrap/unwrap). This error is thrown when the
|
|
42
|
+
* decoded instruction accounts don't match the user's controlled addresses.
|
|
43
|
+
*/
|
|
44
|
+
export declare class UnsafeSolanaSwapFundMovementError extends Error {
|
|
45
|
+
readonly instructionIndex: number;
|
|
46
|
+
readonly reason: string;
|
|
47
|
+
constructor(instructionIndex: number, reason: string);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fund-safety guard (audit finding SOL-01, vultisig/vultisig-sdk#1056): a
|
|
51
|
+
* compromised Jupiter proxy could inject an arbitrary instruction (e.g. a
|
|
52
|
+
* drain transfer) into the `VersionedTransaction` returned from `/swap`
|
|
53
|
+
* before it reaches MPC signing. Vultisig's signing UI cannot meaningfully
|
|
54
|
+
* render raw Solana instruction bytes for the user to review, so the
|
|
55
|
+
* transaction would be effectively blind-signed.
|
|
56
|
+
*
|
|
57
|
+
* Two-layer defense:
|
|
58
|
+
*
|
|
59
|
+
* 1. **Program allow-list**: every top-level instruction's `programIdIndex`
|
|
60
|
+
* must resolve to a program in {@link JUPITER_SWAP_ALLOWED_PROGRAM_IDS}.
|
|
61
|
+
* Throws {@link UnsafeSolanaSwapInstructionError} on any unrecognized program.
|
|
62
|
+
*
|
|
63
|
+
* 2. **Destination/authority validation for fund-moving programs**: a
|
|
64
|
+
* program-only check is insufficient because `SystemProgram`,
|
|
65
|
+
* `TOKEN_PROGRAM_ID`, and `TOKEN_2022_PROGRAM_ID` are allow-listed (they
|
|
66
|
+
* perform legitimate SOL wrap/unwrap) but also implement drain/seize
|
|
67
|
+
* primitives (`Transfer`, `Approve`, `SetAuthority`). For each instruction
|
|
68
|
+
* targeting those programs, the decoded accounts are validated:
|
|
69
|
+
* - `SystemProgram.Transfer`: destination must be the user's wSOL ATA; any
|
|
70
|
+
* other System discriminant (TransferWithSeed / CreateAccount*) rejected.
|
|
71
|
+
* - `Token.Transfer/TransferChecked`: rejected outright — a top-level token
|
|
72
|
+
* move is never part of a legitimate Jupiter shared-accounts swap (the
|
|
73
|
+
* router moves tokens via CPI), and validating authority==user is
|
|
74
|
+
* meaningless since the authority is definitionally the user for any drain
|
|
75
|
+
* of their own account. The distinguishing account is the destination.
|
|
76
|
+
* - `Token.CloseAccount`: destination must be the user wallet.
|
|
77
|
+
* - `Token.Approve/ApproveChecked/SetAuthority`: rejected outright.
|
|
78
|
+
* Throws {@link UnsafeSolanaSwapFundMovementError} on any violation.
|
|
79
|
+
*
|
|
80
|
+
* Does NOT — and cannot, via static inspection alone — see into CPI (a
|
|
81
|
+
* program invoked from inside another instruction); that's exactly what the
|
|
82
|
+
* allow-listed Jupiter router is trusted to CPI into on the user's behalf.
|
|
83
|
+
*/
|
|
84
|
+
export declare const assertSafeSolanaSwapInstructions: (message: VersionedMessage, addressLookupTableAccounts: AddressLookupTableAccount[] | undefined, userWallet: PublicKey) => void;
|
|
85
|
+
/**
|
|
86
|
+
* Resolve every address-lookup-table referenced by a v0 message. Returns an
|
|
87
|
+
* empty array for legacy messages (which cannot reference LUTs).
|
|
88
|
+
*/
|
|
89
|
+
export declare const resolveSolanaAddressLookupTables: (message: VersionedMessage) => Promise<AddressLookupTableAccount[]>;
|
|
90
|
+
/**
|
|
91
|
+
* Convenience wrapper: deserialize a base64-encoded `VersionedTransaction`,
|
|
92
|
+
* resolve any referenced LUTs, and assert its top-level instructions are
|
|
93
|
+
* all allow-listed and fund-movement-safe. See {@link assertSafeSolanaSwapInstructions}.
|
|
94
|
+
*/
|
|
95
|
+
export declare const assertSafeSolanaSwapTransactionBase64: (txData: string, userWallet: PublicKey) => Promise<void>;
|
|
96
|
+
//# sourceMappingURL=assertSafeSolanaSwapInstructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertSafeSolanaSwapInstructions.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/assertSafeSolanaSwapInstructions.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,yBAAyB,EAEzB,SAAS,EACT,gBAAgB,EAEjB,MAAM,iBAAiB,CAAA;AASxB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gCAAgC,EAAE,WAAW,CAAC,MAAM,CAO/D,CAAA;AAoBF;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,KAAK;aAEvC,gBAAgB,EAAE,MAAM;aACxB,SAAS,EAAE,MAAM;gBADjB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM;CAOpC;AAED;;;;;;;;;GASG;AACH,qBAAa,iCAAkC,SAAQ,KAAK;aAExC,gBAAgB,EAAE,MAAM;aACxB,MAAM,EAAE,MAAM;gBADd,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM;CAKjC;AAgHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,gCAAgC,GAC3C,SAAS,gBAAgB,EACzB,4BAA4B,yBAAyB,EAAE,YAAK,EAC5D,YAAY,SAAS,KACpB,IAuBF,CAAA;AAyBD;;;GAGG;AACH,eAAO,MAAM,gCAAgC,GAC3C,SAAS,gBAAgB,KACxB,OAAO,CAAC,yBAAyB,EAAE,CAarC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,GAAU,QAAQ,MAAM,EAAE,YAAY,SAAS,KAAG,OAAO,CAAC,IAAI,CAI/G,CAAA"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, NATIVE_MINT, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, } from '@solana/spl-token';
|
|
2
|
+
import { VersionedTransaction, } from '@solana/web3.js';
|
|
3
|
+
import { getSolanaClient } from './client.js';
|
|
4
|
+
/** Jupiter v6 aggregator router. Every Jupiter swap routes through this program. */
|
|
5
|
+
const JUPITER_V6_PROGRAM_ID = 'JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4';
|
|
6
|
+
const COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';
|
|
7
|
+
const SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';
|
|
8
|
+
/**
|
|
9
|
+
* Programs a legitimate Jupiter swap is expected to invoke as a TOP-LEVEL
|
|
10
|
+
* instruction. Captured empirically (2026-07-09) by fetching real `/swap`
|
|
11
|
+
* responses from Jupiter's public API (`lite-api.jup.ag`) and decoding the
|
|
12
|
+
* returned `VersionedTransaction` across four scenarios:
|
|
13
|
+
* - a single-hop SOL -> USDC route
|
|
14
|
+
* - a 3-hop SOL -> BONK route (AlphaQ -> Hadron -> Raydium CLMM)
|
|
15
|
+
* - a Token-2022 output mint (SOL -> PYUSD)
|
|
16
|
+
* - a platform-fee-included swap (feeAccount + platformFeeBps set)
|
|
17
|
+
*
|
|
18
|
+
* Every one of them resolved to exactly this program set. `useSharedAccounts`
|
|
19
|
+
* (Jupiter's default) routes the actual AMM legs through the router via CPI,
|
|
20
|
+
* so the individual AMM programs (Raydium, Whirlpool, etc.) never surface as
|
|
21
|
+
* top-level instructions — only the router itself plus the
|
|
22
|
+
* wrapping/bookkeeping instructions (SOL wrap/unwrap, ATA create, compute
|
|
23
|
+
* budget) do. Token-2022 is allow-listed defensively even though it did not
|
|
24
|
+
* surface in any captured fixture (the wSOL leg always uses the legacy Token
|
|
25
|
+
* program): the SDK's own fee-ATA derivation
|
|
26
|
+
* (`packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts`)
|
|
27
|
+
* explicitly supports Token-2022 mints, so a route with no wSOL leg could
|
|
28
|
+
* plausibly need it.
|
|
29
|
+
*/
|
|
30
|
+
export const JUPITER_SWAP_ALLOWED_PROGRAM_IDS = new Set([
|
|
31
|
+
JUPITER_V6_PROGRAM_ID,
|
|
32
|
+
COMPUTE_BUDGET_PROGRAM_ID,
|
|
33
|
+
SYSTEM_PROGRAM_ID,
|
|
34
|
+
TOKEN_PROGRAM_ID.toBase58(),
|
|
35
|
+
TOKEN_2022_PROGRAM_ID.toBase58(),
|
|
36
|
+
ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),
|
|
37
|
+
]);
|
|
38
|
+
/** Programs that can move funds — require destination/authority validation beyond a program-only check. */
|
|
39
|
+
const FUND_MOVING_PROGRAM_IDS = new Set([
|
|
40
|
+
SYSTEM_PROGRAM_ID,
|
|
41
|
+
TOKEN_PROGRAM_ID.toBase58(),
|
|
42
|
+
TOKEN_2022_PROGRAM_ID.toBase58(),
|
|
43
|
+
]);
|
|
44
|
+
// SystemProgram instruction type discriminants (LE uint32 at data[0..4])
|
|
45
|
+
const SYSTEM_TRANSFER = 2;
|
|
46
|
+
// Token/Token-2022 instruction discriminants (uint8 at data[0])
|
|
47
|
+
const TOKEN_TRANSFER = 3;
|
|
48
|
+
const TOKEN_APPROVE = 4;
|
|
49
|
+
const TOKEN_SET_AUTHORITY = 6;
|
|
50
|
+
const TOKEN_CLOSE_ACCOUNT = 9;
|
|
51
|
+
const TOKEN_TRANSFER_CHECKED = 12;
|
|
52
|
+
const TOKEN_APPROVE_CHECKED = 13;
|
|
53
|
+
/**
|
|
54
|
+
* Thrown when a Solana swap message contains a top-level instruction that
|
|
55
|
+
* targets a program outside {@link JUPITER_SWAP_ALLOWED_PROGRAM_IDS}.
|
|
56
|
+
*/
|
|
57
|
+
export class UnsafeSolanaSwapInstructionError extends Error {
|
|
58
|
+
instructionIndex;
|
|
59
|
+
programId;
|
|
60
|
+
constructor(instructionIndex, programId) {
|
|
61
|
+
super(`SOL_SWAP_UNEXPECTED_PROGRAM: instruction ${instructionIndex} targets unrecognized program ${programId}; refusing to sign`);
|
|
62
|
+
this.instructionIndex = instructionIndex;
|
|
63
|
+
this.programId = programId;
|
|
64
|
+
this.name = 'UnsafeSolanaSwapInstructionError';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Thrown when a fund-moving instruction (System/Token) in a swap message has
|
|
69
|
+
* a destination or authority that does not belong to the user.
|
|
70
|
+
*
|
|
71
|
+
* Audit finding SOL-01 residual: a program-only allow-list permits injected
|
|
72
|
+
* top-level `SystemProgram.Transfer { from: user, to: attacker }` or
|
|
73
|
+
* `Token.Approve { owner: user, delegate: attacker }` because those programs
|
|
74
|
+
* are allow-listed (needed for SOL wrap/unwrap). This error is thrown when the
|
|
75
|
+
* decoded instruction accounts don't match the user's controlled addresses.
|
|
76
|
+
*/
|
|
77
|
+
export class UnsafeSolanaSwapFundMovementError extends Error {
|
|
78
|
+
instructionIndex;
|
|
79
|
+
reason;
|
|
80
|
+
constructor(instructionIndex, reason) {
|
|
81
|
+
super(`SOL_SWAP_UNSAFE_FUND_MOVEMENT: instruction ${instructionIndex} — ${reason}`);
|
|
82
|
+
this.instructionIndex = instructionIndex;
|
|
83
|
+
this.reason = reason;
|
|
84
|
+
this.name = 'UnsafeSolanaSwapFundMovementError';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const assertSystemInstruction = (ix, keys, userWallet, index) => {
|
|
88
|
+
if (ix.data.length < 4)
|
|
89
|
+
return;
|
|
90
|
+
const type = new DataView(ix.data.buffer, ix.data.byteOffset, 4).getUint32(0, /* littleEndian */ true);
|
|
91
|
+
// A legitimate top-level Jupiter swap only ever emits SystemProgram.Transfer
|
|
92
|
+
// (the SOL→wSOL wrap). Every OTHER System instruction that moves lamports —
|
|
93
|
+
// TransferWithSeed (11), CreateAccount (0), CreateAccountWithSeed (3) — is
|
|
94
|
+
// rejected outright rather than silently allowed: a program-only allow-list
|
|
95
|
+
// would let a spliced TransferWithSeed to an attacker survive into the signed
|
|
96
|
+
// bytes exactly like the Token.Transfer drain. Mirrors the reject-outright
|
|
97
|
+
// stance the token branch takes for non-wrap fund movers. Non-lamport-moving
|
|
98
|
+
// System instructions don't appear top-level in a swap, so a blanket reject of
|
|
99
|
+
// "not SYSTEM_TRANSFER" is the safe, tight floor (fail-closed on the unknown).
|
|
100
|
+
if (type !== SYSTEM_TRANSFER) {
|
|
101
|
+
throw new UnsafeSolanaSwapFundMovementError(index, `SystemProgram instruction (discriminant ${type}) is not a legitimate top-level Jupiter swap instruction — only SystemProgram.Transfer (SOL wrap) is expected`);
|
|
102
|
+
}
|
|
103
|
+
// Transfer accounts[1] = destination. The only legitimate SOL transfer in
|
|
104
|
+
// a Jupiter swap is wrapping: from: userWallet → to: userWallet's wSOL ATA.
|
|
105
|
+
const destIdx = ix.accountKeyIndexes[1];
|
|
106
|
+
if (destIdx === undefined) {
|
|
107
|
+
throw new UnsafeSolanaSwapFundMovementError(index, 'SystemProgram.Transfer: missing destination account index');
|
|
108
|
+
}
|
|
109
|
+
const dest = keys.get(destIdx);
|
|
110
|
+
if (!dest) {
|
|
111
|
+
throw new UnsafeSolanaSwapFundMovementError(index, `SystemProgram.Transfer: destination index ${destIdx} could not be resolved`);
|
|
112
|
+
}
|
|
113
|
+
const wSolAta = getAssociatedTokenAddressSync(NATIVE_MINT, userWallet);
|
|
114
|
+
if (!dest.equals(wSolAta)) {
|
|
115
|
+
throw new UnsafeSolanaSwapFundMovementError(index, `SystemProgram.Transfer destination ${dest.toBase58()} is not the expected wSOL ATA ${wSolAta.toBase58()} — possible drain injection`);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const assertTokenInstruction = (ix, keys, userWallet, index) => {
|
|
119
|
+
if (ix.data.length === 0)
|
|
120
|
+
return;
|
|
121
|
+
const type = ix.data[0];
|
|
122
|
+
// Reject instructions that can delegate or transfer authority — these are
|
|
123
|
+
// never present as top-level instructions in legitimate Jupiter shared-accounts swaps.
|
|
124
|
+
if (type === TOKEN_APPROVE || type === TOKEN_APPROVE_CHECKED) {
|
|
125
|
+
throw new UnsafeSolanaSwapFundMovementError(index, `Token.${type === TOKEN_APPROVE ? 'Approve' : 'ApproveChecked'} is not a legitimate top-level Jupiter swap instruction — possible authority delegation to attacker`);
|
|
126
|
+
}
|
|
127
|
+
if (type === TOKEN_SET_AUTHORITY) {
|
|
128
|
+
throw new UnsafeSolanaSwapFundMovementError(index, 'Token.SetAuthority is not a legitimate top-level Jupiter swap instruction — possible account seizure');
|
|
129
|
+
}
|
|
130
|
+
// Transfer (type=3) and TransferChecked (type=12): reject outright as
|
|
131
|
+
// top-level instructions. Jupiter shared-accounts routing performs token
|
|
132
|
+
// moves via CPI inside the router — a top-level Token.Transfer with
|
|
133
|
+
// authority==user and destination==attacker would pass an authority check
|
|
134
|
+
// and silently drain the user's tokens. Same rationale as Approve.
|
|
135
|
+
if (type === TOKEN_TRANSFER) {
|
|
136
|
+
throw new UnsafeSolanaSwapFundMovementError(index, 'Token.Transfer is not a legitimate top-level Jupiter swap instruction — possible token drain to attacker');
|
|
137
|
+
}
|
|
138
|
+
if (type === TOKEN_TRANSFER_CHECKED) {
|
|
139
|
+
throw new UnsafeSolanaSwapFundMovementError(index, 'Token.TransferChecked is not a legitimate top-level Jupiter swap instruction — possible token drain to attacker');
|
|
140
|
+
}
|
|
141
|
+
// CloseAccount (type=9): layout [account, destination, authority].
|
|
142
|
+
// accounts[1]=destination must be the user wallet so unwrapped SOL/rent
|
|
143
|
+
// returns to the user and cannot be swept to an attacker address.
|
|
144
|
+
if (type === TOKEN_CLOSE_ACCOUNT) {
|
|
145
|
+
const destIdx = ix.accountKeyIndexes[1];
|
|
146
|
+
if (destIdx === undefined)
|
|
147
|
+
throw new UnsafeSolanaSwapFundMovementError(index, 'Token.CloseAccount: missing destination account index');
|
|
148
|
+
const dest = keys.get(destIdx);
|
|
149
|
+
if (!dest || !dest.equals(userWallet)) {
|
|
150
|
+
throw new UnsafeSolanaSwapFundMovementError(index, `Token.CloseAccount destination ${dest?.toBase58() ?? '<unresolved>'} is not the user wallet ${userWallet.toBase58()} — possible SOL/rent drain`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// SyncNative (17), InitializeAccount (1), and other Token instructions
|
|
154
|
+
// that do not move funds to an arbitrary destination: allowed.
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Fund-safety guard (audit finding SOL-01, vultisig/vultisig-sdk#1056): a
|
|
158
|
+
* compromised Jupiter proxy could inject an arbitrary instruction (e.g. a
|
|
159
|
+
* drain transfer) into the `VersionedTransaction` returned from `/swap`
|
|
160
|
+
* before it reaches MPC signing. Vultisig's signing UI cannot meaningfully
|
|
161
|
+
* render raw Solana instruction bytes for the user to review, so the
|
|
162
|
+
* transaction would be effectively blind-signed.
|
|
163
|
+
*
|
|
164
|
+
* Two-layer defense:
|
|
165
|
+
*
|
|
166
|
+
* 1. **Program allow-list**: every top-level instruction's `programIdIndex`
|
|
167
|
+
* must resolve to a program in {@link JUPITER_SWAP_ALLOWED_PROGRAM_IDS}.
|
|
168
|
+
* Throws {@link UnsafeSolanaSwapInstructionError} on any unrecognized program.
|
|
169
|
+
*
|
|
170
|
+
* 2. **Destination/authority validation for fund-moving programs**: a
|
|
171
|
+
* program-only check is insufficient because `SystemProgram`,
|
|
172
|
+
* `TOKEN_PROGRAM_ID`, and `TOKEN_2022_PROGRAM_ID` are allow-listed (they
|
|
173
|
+
* perform legitimate SOL wrap/unwrap) but also implement drain/seize
|
|
174
|
+
* primitives (`Transfer`, `Approve`, `SetAuthority`). For each instruction
|
|
175
|
+
* targeting those programs, the decoded accounts are validated:
|
|
176
|
+
* - `SystemProgram.Transfer`: destination must be the user's wSOL ATA; any
|
|
177
|
+
* other System discriminant (TransferWithSeed / CreateAccount*) rejected.
|
|
178
|
+
* - `Token.Transfer/TransferChecked`: rejected outright — a top-level token
|
|
179
|
+
* move is never part of a legitimate Jupiter shared-accounts swap (the
|
|
180
|
+
* router moves tokens via CPI), and validating authority==user is
|
|
181
|
+
* meaningless since the authority is definitionally the user for any drain
|
|
182
|
+
* of their own account. The distinguishing account is the destination.
|
|
183
|
+
* - `Token.CloseAccount`: destination must be the user wallet.
|
|
184
|
+
* - `Token.Approve/ApproveChecked/SetAuthority`: rejected outright.
|
|
185
|
+
* Throws {@link UnsafeSolanaSwapFundMovementError} on any violation.
|
|
186
|
+
*
|
|
187
|
+
* Does NOT — and cannot, via static inspection alone — see into CPI (a
|
|
188
|
+
* program invoked from inside another instruction); that's exactly what the
|
|
189
|
+
* allow-listed Jupiter router is trusted to CPI into on the user's behalf.
|
|
190
|
+
*/
|
|
191
|
+
export const assertSafeSolanaSwapInstructions = (message, addressLookupTableAccounts = [], userWallet) => {
|
|
192
|
+
const accountKeys = message.version === 'legacy' ? message.getAccountKeys() : message.getAccountKeys({ addressLookupTableAccounts });
|
|
193
|
+
message.compiledInstructions.forEach((instruction, index) => {
|
|
194
|
+
const programId = accountKeys.get(instruction.programIdIndex);
|
|
195
|
+
if (!programId) {
|
|
196
|
+
throw new UnsafeSolanaSwapInstructionError(index, `<unresolved account index ${instruction.programIdIndex}>`);
|
|
197
|
+
}
|
|
198
|
+
const programIdBase58 = programId.toBase58();
|
|
199
|
+
if (!JUPITER_SWAP_ALLOWED_PROGRAM_IDS.has(programIdBase58)) {
|
|
200
|
+
throw new UnsafeSolanaSwapInstructionError(index, programIdBase58);
|
|
201
|
+
}
|
|
202
|
+
// Layer 2: for fund-moving programs, validate destination/authority
|
|
203
|
+
if (FUND_MOVING_PROGRAM_IDS.has(programIdBase58)) {
|
|
204
|
+
if (programIdBase58 === SYSTEM_PROGRAM_ID) {
|
|
205
|
+
assertSystemInstruction(instruction, accountKeys, userWallet, index);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
assertTokenInstruction(instruction, accountKeys, userWallet, index);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
};
|
|
213
|
+
/** Maximum attempts for a LUT fetch before giving up on that table. */
|
|
214
|
+
const MAX_LUT_FETCH_ATTEMPTS = 3;
|
|
215
|
+
const fetchLutWithRetry = async (client, accountKey) => {
|
|
216
|
+
const errors = [];
|
|
217
|
+
for (let attempt = 0; attempt < MAX_LUT_FETCH_ATTEMPTS; attempt++) {
|
|
218
|
+
try {
|
|
219
|
+
const result = await client.getAddressLookupTable(accountKey);
|
|
220
|
+
return result.value ?? null;
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
errors.push(err);
|
|
224
|
+
if (attempt < MAX_LUT_FETCH_ATTEMPTS - 1) {
|
|
225
|
+
await new Promise(resolve => setTimeout(resolve, 200 * 2 ** attempt));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
console.warn('[assertSafeSolanaSwapInstructions] LUT fetch failed after retries:', errors);
|
|
230
|
+
return null;
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* Resolve every address-lookup-table referenced by a v0 message. Returns an
|
|
234
|
+
* empty array for legacy messages (which cannot reference LUTs).
|
|
235
|
+
*/
|
|
236
|
+
export const resolveSolanaAddressLookupTables = async (message) => {
|
|
237
|
+
if (message.version !== 0) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
const client = getSolanaClient();
|
|
241
|
+
const lutAccounts = [];
|
|
242
|
+
for (const lut of message.addressTableLookups) {
|
|
243
|
+
const lutAccount = await fetchLutWithRetry(client, lut.accountKey);
|
|
244
|
+
if (lutAccount) {
|
|
245
|
+
lutAccounts.push(lutAccount);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return lutAccounts;
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Convenience wrapper: deserialize a base64-encoded `VersionedTransaction`,
|
|
252
|
+
* resolve any referenced LUTs, and assert its top-level instructions are
|
|
253
|
+
* all allow-listed and fund-movement-safe. See {@link assertSafeSolanaSwapInstructions}.
|
|
254
|
+
*/
|
|
255
|
+
export const assertSafeSolanaSwapTransactionBase64 = async (txData, userWallet) => {
|
|
256
|
+
const versionedTx = VersionedTransaction.deserialize(Buffer.from(txData, 'base64'));
|
|
257
|
+
const lutAccounts = await resolveSolanaAddressLookupTables(versionedTx.message);
|
|
258
|
+
assertSafeSolanaSwapInstructions(versionedTx.message, lutAccounts, userWallet);
|
|
259
|
+
};
|
|
260
|
+
//# sourceMappingURL=assertSafeSolanaSwapInstructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertSafeSolanaSwapInstructions.js","sourceRoot":"","sources":["../../../../../../packages/core/chain/chains/solana/assertSafeSolanaSwapInstructions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getJupiterSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/getJupiterSwapQuote.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getJupiterSwapQuote.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/getJupiterSwapQuote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAA;AACrF,OAAO,EAEL,KAAK,sBAAsB,EAG5B,MAAM,kDAAkD,CAAA;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oEAAoE,CAAA;AAE5G,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAUzE,KAAK,KAAK,GAAG,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC,GAAG;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,sBAAsB,CAAA;IACtC,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AA2CD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAAU,iEAOvC,KAAK,KAAG,OAAO,CAAC,gBAAgB,CAsGlC,CAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { PublicKey } from '@solana/web3.js';
|
|
1
2
|
import { Chain } from '@vultisig/core-chain/Chain';
|
|
3
|
+
import { assertSafeSolanaSwapTransactionBase64 } from '@vultisig/core-chain/chains/solana/assertSafeSolanaSwapInstructions';
|
|
2
4
|
import { solanaConfig } from '@vultisig/core-chain/chains/solana/solanaConfig';
|
|
3
5
|
import { getJupiterConfig, jupiterFeeOwnerAddress, normalizeJupiterBaseUrl, } from '@vultisig/core-chain/swap/general/jupiter/config';
|
|
4
6
|
import { assertJupiterPriceImpactWithinCeiling } from '@vultisig/core-chain/swap/general/priceImpactGuard';
|
|
@@ -86,6 +88,12 @@ export const getJupiterSwapQuote = async ({ from, to, amount, affiliateBps = 0,
|
|
|
86
88
|
if (!swapResponse.swapTransaction) {
|
|
87
89
|
throw new Error('Jupiter swap response did not include a serialized transaction.');
|
|
88
90
|
}
|
|
91
|
+
// Fund-safety guard (audit finding SOL-01): the proxy-supplied transaction
|
|
92
|
+
// is validated BEFORE any local mutation (fee-ATA prepend), and regardless
|
|
93
|
+
// of whether a fee is charged on this swap — an unguarded no-fee response
|
|
94
|
+
// was previously forwarded to signing verbatim.
|
|
95
|
+
const userPubkey = new PublicKey(from.address);
|
|
96
|
+
await assertSafeSolanaSwapTransactionBase64(swapResponse.swapTransaction, userPubkey);
|
|
89
97
|
const data = feeAccountInfo
|
|
90
98
|
? await prependJupiterFeeAta({
|
|
91
99
|
txData: swapResponse.swapTransaction,
|
|
@@ -93,6 +101,7 @@ export const getJupiterSwapQuote = async ({ from, to, amount, affiliateBps = 0,
|
|
|
93
101
|
mintPubkey: feeAccountInfo.mintPubkey,
|
|
94
102
|
ownerPubkey: feeAccountInfo.ownerPubkey,
|
|
95
103
|
tokenProgramId: feeAccountInfo.tokenProgramId,
|
|
104
|
+
userWallet: userPubkey,
|
|
96
105
|
})
|
|
97
106
|
: swapResponse.swapTransaction;
|
|
98
107
|
// Network fee is an upper-bound estimate: Solana's per-signature base fee plus
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getJupiterSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/getJupiterSwapQuote.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"getJupiterSwapQuote.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/getJupiterSwapQuote.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,11 +38,12 @@ export declare const deriveJupiterFeeAccount: ({ outputMint, feeOwner, }: {
|
|
|
38
38
|
* keysign path refreshes the blockhash before broadcast (same as every other
|
|
39
39
|
* Solana general-swap route), so we do not refresh it here.
|
|
40
40
|
*/
|
|
41
|
-
export declare const prependJupiterFeeAta: ({ txData, feeAccount, mintPubkey, ownerPubkey, tokenProgramId, }: {
|
|
41
|
+
export declare const prependJupiterFeeAta: ({ txData, feeAccount, mintPubkey, ownerPubkey, tokenProgramId, userWallet, }: {
|
|
42
42
|
txData: string;
|
|
43
43
|
feeAccount: string;
|
|
44
44
|
mintPubkey: PublicKey;
|
|
45
45
|
ownerPubkey: PublicKey;
|
|
46
46
|
tokenProgramId: PublicKey;
|
|
47
|
+
userWallet: PublicKey;
|
|
47
48
|
}) => Promise<string>;
|
|
48
49
|
//# sourceMappingURL=jupiterFeeAta.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jupiterFeeAta.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"jupiterFeeAta.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAA4C,MAAM,iBAAiB,CAAA;AA+BrF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,cAAc,EAAE,SAAS,CAAA;IACzB,UAAU,EAAE,SAAS,CAAA;IACrB,WAAW,EAAE,SAAS,CAAA;CACvB,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,GAAU,2BAG3C;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,KAAG,OAAO,CAAC,iBAAiB,CAa5B,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,GAAU,8EAOxC;IACD,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,SAAS,CAAA;IACrB,WAAW,EAAE,SAAS,CAAA;IACtB,cAAc,EAAE,SAAS,CAAA;IACzB,UAAU,EAAE,SAAS,CAAA;CACtB,KAAG,OAAO,CAAC,MAAM,CAqCjB,CAAA"}
|
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
import { createAssociatedTokenAccountIdempotentInstruction, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, } from '@solana/spl-token';
|
|
2
2
|
import { PublicKey, TransactionMessage, VersionedTransaction } from '@solana/web3.js';
|
|
3
|
+
import { assertSafeSolanaSwapInstructions, resolveSolanaAddressLookupTables, } from '@vultisig/core-chain/chains/solana/assertSafeSolanaSwapInstructions';
|
|
3
4
|
import { getSolanaClient } from '@vultisig/core-chain/chains/solana/client';
|
|
4
|
-
/** Maximum attempts for LUT fetches before giving up. */
|
|
5
|
-
const MAX_LUT_FETCH_ATTEMPTS = 3;
|
|
6
|
-
/**
|
|
7
|
-
* Fetch a LUT account with simple retry (exponential back-off, up to 3 attempts).
|
|
8
|
-
* RPC timeouts are transient; retrying avoids spurious quote failures.
|
|
9
|
-
*/
|
|
10
|
-
const fetchLutWithRetry = async (client, accountKey) => {
|
|
11
|
-
const errors = [];
|
|
12
|
-
for (let attempt = 0; attempt < MAX_LUT_FETCH_ATTEMPTS; attempt++) {
|
|
13
|
-
try {
|
|
14
|
-
const result = await client.getAddressLookupTable(accountKey);
|
|
15
|
-
return result.value ?? null;
|
|
16
|
-
}
|
|
17
|
-
catch (err) {
|
|
18
|
-
errors.push(err);
|
|
19
|
-
if (attempt < MAX_LUT_FETCH_ATTEMPTS - 1) {
|
|
20
|
-
await new Promise(resolve => setTimeout(resolve, 200 * 2 ** attempt));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
console.warn('[jupiterFeeAta] LUT fetch failed after retries:', errors);
|
|
25
|
-
return null;
|
|
26
|
-
};
|
|
27
5
|
/**
|
|
28
6
|
* Resolve the SPL token program (Token vs Token-2022) that owns a mint.
|
|
29
7
|
*
|
|
@@ -80,19 +58,13 @@ export const deriveJupiterFeeAccount = async ({ outputMint, feeOwner, }) => {
|
|
|
80
58
|
* keysign path refreshes the blockhash before broadcast (same as every other
|
|
81
59
|
* Solana general-swap route), so we do not refresh it here.
|
|
82
60
|
*/
|
|
83
|
-
export const prependJupiterFeeAta = async ({ txData, feeAccount, mintPubkey, ownerPubkey, tokenProgramId, }) => {
|
|
84
|
-
const client = getSolanaClient();
|
|
61
|
+
export const prependJupiterFeeAta = async ({ txData, feeAccount, mintPubkey, ownerPubkey, tokenProgramId, userWallet, }) => {
|
|
85
62
|
const versionedTx = VersionedTransaction.deserialize(Buffer.from(txData, 'base64'));
|
|
86
|
-
const lutAccounts =
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (lutAccount) {
|
|
92
|
-
lutAccounts.push(lutAccount);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
63
|
+
const lutAccounts = await resolveSolanaAddressLookupTables(versionedTx.message);
|
|
64
|
+
// Fund-safety guard (audit finding SOL-01): refuse to build a signable
|
|
65
|
+
// transaction out of a proxy-supplied message containing an instruction
|
|
66
|
+
// that targets an unrecognized program or moves funds to an unknown destination.
|
|
67
|
+
assertSafeSolanaSwapInstructions(versionedTx.message, lutAccounts, userWallet);
|
|
96
68
|
let decompiledMessage;
|
|
97
69
|
try {
|
|
98
70
|
decompiledMessage = TransactionMessage.decompile(versionedTx.message, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jupiterFeeAta.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iDAAiD,EACjD,6BAA6B,EAC7B,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"jupiterFeeAta.js","sourceRoot":"","sources":["../../../../../../../../packages/core/chain/swap/general/jupiter/api/jupiterFeeAta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"singleHopSolToUsdc": {
|
|
3
|
+
"description": "Real Jupiter /swap response, SOL -> USDC, single-hop route (GoonFi V2), no affiliate fee. Captured 2026-07-09 from lite-api.jup.ag.",
|
|
4
|
+
"swapTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHCkF1wZu9M3iGFk8IKByXc/pvqHgtN0JrxREMhkTk4gAwLtdJLuXn7rwQpTRDeJyvX+7SSUUYoz8GDyRj/e8oxIup1xSSxoBFn4o7mL2SnSCEX4WGaco7ETXE2mDyoUiskwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwZGb+UhFzL/7K26csOb57yM5bvF9xJrLEObOkAAAAAEedVb8jHAbu50xW7OaBUH/bGy3qP0jlECsc2iVrwTjwbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpjJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+Fm0P/on9df2SnTAmx8pWHneSwmrNt/J3VFLMhqns4zl6PzRPaBBVZATz0rroahO1wI61P8hqEdH/zsFqzD6ggfDS8uoomrC6yt3ekBLwDYKDjFclgjCt2ho4LrkzQY/kB0HBAAFAsBcFQAEAAkDBBcBAAAAAAAHBgABAA0DBgEBAwIAAQwCAAAAAMqaOwAAAAAGAQEBEQUYBgABAgUSBQgFDwAMAQIKCw0SEBEOBgYJJOUXy5d6460qAQAAAJcAZAABAMqaOwAAAAACVKAEAAAAADIAAAYDAQAAAQkBtQ4ft8S/G/nU4iNQ3DOvYX1x0GnpYwrcIoCFMHsZKVED6u/xBhIuhfIxBQ==",
|
|
5
|
+
"lookupTables": [
|
|
6
|
+
{
|
|
7
|
+
"key": "DBmHWCVEGCzZ3zDNr9WzRaMmSqCjcixMh78imXfno9qJ",
|
|
8
|
+
"dataBase64": "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"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"multiHopSolToBonk": {
|
|
13
|
+
"description": "Real Jupiter /swap response, SOL -> BONK, 3-hop route (AlphaQ -> Hadron -> Raydium CLMM). Captured 2026-07-09 from lite-api.jup.ag.",
|
|
14
|
+
"swapTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAHEUF1wZu9M3iGFk8IKByXc/pvqHgtN0JrxREMhkTk4gAwLtdJLuXn7rwQpTRDeJyvX+7SSUUYoz8GDyRj/e8oxItuQ0VdX43P57XTzkf9ylsPMXqstrwAaDQ4Gmo7wOYd+m/z+xilXGrCdj1ZMMeA+lC8FSa7b+m4JQDZcseB/tbPcsbbBaKqZoGun7nO3Cnxmd5z4LpCbn+Nzn5BZlWjhh53BHo4HDkVOPejukK6/oQdRT8m1S5xpmRD9q8e3XSK/ZOHamzEoB95HHSyhWUPJaRVgOsbbmLUEeLgRlnxn0hfnaQGHkjbVw2C3oJDEqFkddTsoDHHgFbgcCH+jiu7tvi9uCzVnFfmeLLtEncPfV+UlQA3Ng5SzEDJrbiX8epqO+nUSIsH/jmbGpFV5YIbaX1DAWwKPE87vKKvtB0BYzBXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBkZv5SEXMv/srbpyw5vnvIzlu8X3EmssQ5s6QAAAAAR51VvyMcBu7nTFbs5oFQf9sbLeo/SOUQKxzaJWvBOPBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4Wawa49CH8pI3BiVI9wxMBK7CqZVpSYbny7RnUgYh04YwtD/6J/XX9kp0wJsfKVh53ksJqzbfyd1RSzIap7OM5ehA857mb0JLReVQ2y6Jw0WM6LwBrm/iPtZlJfqA+F2jOQgLAAUCwFwVAAsACQOUxQAAAAAAAA4GAAEAHwoNAQEKAgABDAIAAAAAZc0dAAAAAA0BAQERDgYABAAkCg0BAQw8DQ8AAQUCBB8kDAwQDCIPIRMDBRIREhERDSAMKg0NGygpHBsPAx4aCScZJh0MIw8lFAkCGBcWDQYVBwgMLsEgmzNB1pyBBQMAAABoAGQAAaIBZAECGmQCAwBlzR0AAAAA1mX01eEAAABkAAANAwEAAAEJA+JPPiqWVx6GdrLaLkhUEAxNJ0886MhL4Nziho/JGqntAzs4OgUVAzkCIXG1VVSqukVs1RwAZXbHZmmuSS48/+Wc3tDKOaOL5J0fBX+AeH13Ant8FkMhDkzdg/WyYdmIopAi24itINNC7hzdg8iuCgJd6jsGLzE2ODwyBTowNzUz",
|
|
15
|
+
"lookupTables": [
|
|
16
|
+
{
|
|
17
|
+
"key": "GERDuMq2KXct84sG9JUxuRguqfcPvn71gYXg2p3LLHv4",
|
|
18
|
+
"dataBase64": "AQAAAP//////////Tn/qFQAAAAAsAX0Oo0JAUwU7u9hg90wy8EvD3Icq35pPTtFwwk7g9D7TAAAF0U7dV2xRAfAz0c+PAbTtiNFClRN62QDsyvzNECm88C1dFDayszz2UE3mD/kwmyZ+HiRSaFEqhQqEj5VQCe6firBohGE5fmecxHsQAJ5Q/BhKWd5hjsxwu62XMez0rr0Gp9UXGHvRZjXa1ARV/cLAwSTGjyFWdaXbustfCAAAANBZxrIpbLxdpNOhsZiqlI+NNMEXSFC5aEaUY/NNyYUABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKnifdf7V3nrnIQ1R4ecfqiv0/Tce/4rnJZqtP1YZwYd9Qbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBqfVFxh70WY12tQEVf3CwMEkxo8hVnWl27rLXwgAAACKsGiEYTl+Z5zEexAAnlD8GEpZ3mGOzHC7rZcx7PSuvdP3YahrkGxbldN4MWR39be66dVFvHtGMWKWCFBdd1zi0FnGsilsvF2k06GxmKqUj400wRdIULloRpRj803JhQCjhhuU6/bi4urDMzVMhG9Wmhi+T5y+Y2g8uR/gUluen0pgU6woqByzcT663mr3chQNNpomoaHFmf63TCfABtHcXlFcakvfPkgHTbCBbiUkXOHzTc2PVcdzFo7igFv306YG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqY34IBHTE7qbMsWk+RJjKo6L6A+NkIfE81hKEbdDAg9HsyE/uov5yH+pHkeBlijDg+AL6n6Yx6A+A7oQac/D9vO4dKtkt0d+tatUvsrlooHzwE4W5xAw8n08Zii/229mbakqWotPKVlShCVQqpP9W5W1rOao65IMk5QuQ2kMIOxzVmDOAC387LbB12VNM2W5SgSQtux+SVL8LsOV6VxzrlgGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAWz+k3naEow/ZyVqLvuPomQ03YtIbeIfOa6DDvYzwHER6wDZ9bKStCFKx9A3tNbwZFC5ZGAN83MFK7XoTy+OmmfXZckvWKuvu53HKLA/oRnPBU8tNuFRyE1WJHDF5d40kwbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpgW5mYww7tyTcWeSfbMQwbmA6aqzKBvo+NOK0CtWXnY0X416QJTc1UhjzzRO/w7a0ZOzsjBuLBW0gPQwlc+tSDA/jXq/H5aqDbAxScSpY4eB8bZmYsGKX2WUYm0of2FkCXb6vX1WNGNEiyFg2PGGJG1p1wcyMdVV5GQYzj5jOra+wJF6H64j7edZttZ8SdL3B5nx2hANN1LaQWlZjDEOG3L0SgJ8EaWkAtH23ts2SKZcXeHN5VdFmZCz8F8TOMaaRxiqg971FLjgOgrcQfx6CjzGmEE5aLPIyNTYsBQDMYaql1cqeBM9dtZC3FLov4yyxWRM/wcGStyJX/QfTnLBAHpwlJHx6/mh3nE583EE55WuEze54pO2bR06h+o7pPOIljJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FnXqo+wYNgpG0xNR12v92LJa9wNrOs2wBLq0S7TqUhBYQbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpQSRuzH14/oHkF3OkaWVBmTeSOgdkR5ffbz61FEJgEMvgBMh865j6XOR/gDgG/Sx5RdKVJJWa7ADe2XgU8494Rt5OJfa+Y/8Z4urDN1eZKXf461NC8mE0yiZFMWM5QzO40403o7pXXJGnvnlHz/cjsSyjIk3opiZcIgbrfN6IvTKj17sSflitwSymj4NDfsLhw/mCDek+WPkXiikY3ar3tOVKcJUog59hwLm4YHmJHBOSFuR6cbYvtzvschaUWHReeVqVqWBsJTs9a/gh1jpcH26v19T+rfsdoamMtwf2lr2hwvQF+WehotZBn1cUcxnxr1hsD7Ym2EF91vaN1uVJjwwU3vyCXsZ2lCUIGLtlQGX0KY0xVtVxtNT4CQwY6ahjBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEByCHzqPCP74jcMUJKdoCujJaBcEzx5fXIjieZt/mCIYkLpkT+H1WqGfEc0tLsFNMjO24KS+ru9ytphY4h4XDW2SlguUO1j09z91muKb3flxWdjrHFRHyvVqBzbvKbZpWh1/5CjwuD/7jGmJL7fBnI2BO+UnTyyopxwrBWt9rr+6EGswFjqR1VMJt7mnyZqwmWSeL2HO0X6nsTET3nEdRCDDX/qQVajlaNqPe8B1YVJ0zxySykH0AAnFFqpBTCfHAGp9UXGHvRZjXa1ARV/cLAwSTGjyFWdaXbustfCAAAAIqwaIRhOX5nnMR7EACeUPwYSlneYY7McLutlzHs9K69n3eU3K0tSKFTjgQLPwQBzSmeWWDwnkEGp6xuvDfjxyAKU+ZVy2o0FnSjd5BsBdg7J/J+O6NK00cIZidJ9RCPKPYtj6Dp2PRgfoYiELQiA7luKRewlbUGx70uGCEc/qmtOs7MBSF72wAoXdKFzhbe+IMzcCzDti5uXZM8MqTQbakG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqQTp4S+8hOgmyTLM6eJkDM4VWQwcYnOwklcIujuFILC8E1w0vPeCfyPTxBzFYK9SZZygfXyPOXGiKqcCiwjWWsEGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAcl6mYUcUcWJZ54WH85lUTOnPhOBcEQBLqW+g9L1pYdBSywZ6MifSDxTU4T24wEjL0xIw9NKrTJUpjPLQ8u7/f+ycNZ/qYxRzwITBRNYliuvNXQr7VnJ2URenA0MhcfNkSB0lqgNHnIF5B2A+DEI1upgTEKh6pUe3SK9VY6vjaP6ulXzm+y8uyLWUVYZbuZPuX41WOS9AYkKG1voO2Vjo00G3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqeBW2Fi6PuSxmLqJ8pyWmt8ZnT2Hvu0MPqI7efOFbLzSUPr7sADe0LWb8HrE0Pymv9j7n6xjCIdBES4gxt+AEGqKsGiEYTl+Z5zEexAAnlD8GEpZ3mGOzHC7rZcx7PSuvQan1RcYe9FmNdrUBFX9wsDBJMaPIVZ1pdu6y18IAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKn/bndFSJO6uyKjwIYkHtxEEjP00iySWhNwCJgg/TDXcCIOd46MkF2UhFGSPCRbTOzt7CZ/lHKUlEnI9H7upOUtgCP2ul1tCx3TKLQBX8gLlSqoYOJS7zoXZ1cwkLXSKoKALysHqYXOTtcN5VadPVQeRMnPau9ZZuqKvTLMQ86rvwabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABot+UwVBitwFpJUBAyyQL/pp08ap3Cn0c8yjfdB3A5Ub15t7JkInz4YIADtTHhVujwtEmiSaOAnLYtg1bw2fOCTya6jZmmB4xgUhOJEAIXvF3FiqFAVQzjppwxtdTXeKPBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmtp/4XKbAX4TEiH63ljXqYZ1VdvawjVv8MzEMNLS4CU29khNDpMF+CHN9eGsqGKsFzGdhMGaV1lv2pS0WiTWIDTi3AeNlyCvpWnylz0yKemtZwZyNTqKvII1TYh+a3ZJuycNZ/qYxRzwITBRNYliuvNXQr7VnJ2URenA0MhcfNkW1lkEO6pSoYG1hEI56NVC0f3tzWgc5+cdB1KdrJbiatoSec7rxtZjLMlus4TIGeql3j2qR0VRREYj+tUqEoyn5MALbVSKt63ESsDp0O4Zhqd/gxOs0hHrLLRxFNGT6nN0Ekbsx9eP6B5BdzpGllQZk3kjoHZEeX328+tRRCYBDLrPYVpHStqZH5R/yyvTsvD7plZT1M/e21LGjvpacz8aIG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqQabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABlVVhPNt938nXlW0PlkP4FNt84NwGCMYFa8xDw7C1IR+JC6ZE/h9VqhnxHNLS7BTTIztuCkvq7vcraYWOIeFw1gw1/6kFWo5Wjaj3vAdWFSdM8ckspB9AAJxRaqQUwnxwoQazAWOpHVUwm3uafJmrCZZJ4vYc7RfqexMRPecR1EIMFN78gl7GdpQlCBi7ZUBl9CmNMVbVcbTU+AkMGOmoY7X1gXnwq4pA59/CTHkMlv6tr4V1NG+IzLHo9aWuM701Kse5TFIPArxcVYB4iLq8neYaebNsaxeNxDL1OsdfQPazIT+6i/nIf6keR4GWKMOD4AvqfpjHoD4DuhBpz8P28wcHLwVKtI2YfaTllp5jLN3zjdZBQTSdpBsLaVuR0Vw6qSpai08pWVKEJVCqk/1blbWs5qjrkgyTlC5DaQwg7HO+odSIcAcxtHTGytCsDiQPTvSBpYeoR8BKR99739rH7esA2fWykrQhSsfQN7TW8GRQuWRgDfNzBSu16E8vjppnFi/3eFNsRwI6+9zrVRS9aJj7kfP2Pe17goz4MBMw/ugG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8Aqfe/+M5aAhquyY9dArS/4pW3De0El7k8OWIo4C4LN4Gg4SKckZcygXbO8q9kvA99xoerlpugG3UwwcwAPdKgwYsE6eEvvIToJskyzOniZAzOFVkMHGJzsJJXCLo7hSCwvP92Pb9zCiPzVevMU1O1jsRQ5aH8LjZ8OMc1IoEqIDXE3jjhi1gkAggIvY3/9xAig22ODxVI4BLpdh9E6RXZR11wNkliWWwCVKBfU6IKPkThyO7kvREIM0oADeKiQ6HvOZspw6zYXxwWsV2kmoV1VemuRxiwvZ/bZlC3LZGZa8DbBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmBbmZjDDu3JNxZ5J9sxDBuYDpqrMoG+j404rQK1ZedjS32CfT8L4fjoeKMGoI5XQPPf8yp+rF9B8G6CEYU5zqq8gMWr/sjAHoEa7xYuQTamhRtNl5PjacztE5LLeSOB+44cx5N+vb6LouF+3xK9zd8Rh2j4r1tNN9x4KoD0+9Ly9VVg81EMx+bqnGccJJPLT4Ou/1n7A8dzrpGatoM5n8w58oI00iPVyCeMBUTn5HpNBfgQ2T3eldGGgBwcKCkHSel1cqeBM9dtZC3FLov4yyxWRM/wcGStyJX/QfTnLBAHoyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZY4NzAA6iLLJk00r/ZKBLXvq/u3TdzQSJl7GYFUfX0RAfXLhI40e5DLIB5Cda7XJV/ech/FILtwoYdwr1lU/iGwramn9QxEFUyYUoVorro2ZIp4kr2GFCNIhhxJRL6oJO6DUzomz8Mw0WPX1/K1gWMKXSWhiMHB6jTBy0NkAqniOj17sSflitwSymj4NDfsLhw/mCDek+WPkXiikY3ar3tOVKcJUog59hwLm4YHmJHBOSFuR6cbYvtzvschaUWHRe16qPsGDYKRtMTUddr/diyWvcDazrNsAS6tEu06lIQWHrANn1spK0IUrH0De01vBkULlkYA3zcwUrtehPL46aZ6kqWotPKVlShCVQqpP9W5W1rOao65IMk5QuQ2kMIOxz8+xmVzUvaXwhlIH1ksism1TR1anjujzrQ24u0lX+tMIG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqebC64dvsHM/0Ac93fBBNPFkmyyl+VUb1+9tPgQ9XLnGBwcvBUq0jZh9pOWWnmMs3fON1kFBNJ2kGwtpW5HRXDrkwZWE7FXShe7TDiBl0FU3jMDsDbBYdiMx/qdXtG8arrMhP7qL+ch/qR5HgZYow4PgC+p+mMegPgO6EGnPw/bz++oACGDNoDECr84+TMvvaLqIzBEFLVhRV+/vut0mUIVbbO8pFVm5Yb3lLwlldmlfIVQvg69J0LipLpbC3cC17OsA2fWykrQhSsfQN7TW8GRQuWRgDfNzBSu16E8vjppnAsULAJI8CXyuTPNJJOSjQPD4jJnPB/x3Mv+qDOJkOLatklUWdLahIw/RTr7PFm8GU8KwWXBChilkCgMGgGUhOwbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpBwcvBUq0jZh9pOWWnmMs3fON1kFBNJ2kGwtpW5HRXDqpKlqLTylZUoQlUKqT/VuVtazmqOuSDJOULkNpDCDsc+QnA94uke5WyyGKr0rvyL0Uu4OfgPL62hxyQqw3NKd1jU3iAk606UPhw52clNR/E5DyWhZALCObTZ8wexScPQGzIT+6i/nIf6keR4GWKMOD4AvqfpjHoD4DuhBpz8P286BWE0GFxKFNMgaxLnjgxXfr4AF28MQbthhfr8AlHlpenJIpQbUirceb5rLz7mfv1/Wrsswgu2ba19e9pGMKCqrrANn1spK0IUrH0De01vBkULlkYA3zcwUrtehPL46aZ1vO5MpKyUUkm30pWphzaZzAY/fmPaeATaJq5Rc8YdBqBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKnOAQ5gr+2yJxe9YxkvVBRaP5ZaM7uC0scCnrLOHiCCZJL+tZp7GQ/TndON6vuK6VkPbJp/AMhxZ0Ez9iFhnkD7fzsHlXV5oiQ5PRgddgvmGgoL/ctOlJTM5Gg43v0YVmmzIT+6i/nIf6keR4GWKMOD4AvqfpjHoD4DuhBpz8P28wbd9uHudY/eGEJdvORszdq2GvxNg7kNJ/69+SjYoYv8uVNxkxOMwTEe+n4nOsVqQrkg2/QDG2SEyXNRr8AXiaapKlqLTylZUoQlUKqT/VuVtazmqOuSDJOULkNpDCDsc6PXuxJ+WK3BLKaPg0N+wuHD+YIN6T5Y+ReKKRjdqve0jJclj04kifG7PRApFI4NgwtaE5na/xCEBI572Nvp+FltZZBDuqUqGBtYRCOejVQtH97c1oHOfnHQdSnayW4mrQw1/6kFWo5Wjaj3vAdWFSdM8ckspB9AAJxRaqQUwnxwiQumRP4fVaoZ8RzS0uwU0yM7bgpL6u73K2mFjiHhcNbdkch1Rzv6nMipSTl8LvSgAglz84eGBtX/V57OgVJsMegwhH7JAO0WMtFd8Uc23Zj9NqbKfHFV9+syUh9Zq52yE+NM3wQTL4lIPx38Daf5aL4JT9Q6OpaBOsGLD8MWRA4Gm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAZOvrbus71CIN/DU1vJr1IDUp5afaVZRi31D3bhucPipDBTe/IJexnaUJQgYu2VAZfQpjTFW1XG01PgJDBjpqGPV/dlamneLjfhE5J96SPaRVtsucf9Be60zqXADirhavmODcwAOoiyyZNNK/2SgS176v7t03c0EiZexmBVH19EQm/e4Gp3M0ZqfpBGSYGpSo8kz0LU+ojjgciIizRm98hIgpNTiF0k3yLVIj4/+w8hu5S7YmsN+7UCvz6E5Z77z3gabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkaY8TqgAI8uLFu1Y7yIsHhCKGa4nvByZOoIF3cEMMij/LM1TWspfFzasgi3Qdz5NkvvYpZspQDUAKVqQEcc6nlKnbns0RkChz8WUyLytCgkQEcrH3RVr+DqDP7Igjrd600+Qv88EC7k/aJ8TBD0TujoEwhYEJ6Szqrlq0CxeDrJfLM1TWspfFzasgi3Qdz5NkvvYpZspQDUAKVqQEcc6nlBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEJLSE1ZXoVnCuH1LZqcNuOl1I4n/dqryBs7QY6OPla7eMrKKeXHy3YcWPZTgkj6c0XVHTeEsBldzqKypeTA/MJBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKlaEl9rD58Zcqol26h5eBCJQkINqhdFTAsvkvDTqqPBjB3z28A9O0YiK2hgoMy1qLiyG20ugHE/sSeC1xz7wAWIKnbns0RkChz8WUyLytCgkQEcrH3RVr+DqDP7Igjrd61BV7BYDzHF/ORKYlgtvPnXjudZQ6CEo5OzUDaNIomTCIMuJdOxrfEwuH6/uNoFKELnvwdrjfrBFYrHQ8vHZ76aBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKmjDONhkYgq1MEsZIxQ6omtBD2pCfYinfNL56bO0eJ+E/D5TnFNm90VyDrFBuKymkIhsRtQKzK0zPflo7hHoPRBS9lJxDYCwz8gd5DtFqNSTKG5l1zxIaKpDP/sffi2is1KwvjQ3Vy8l+MonBl8tQYqVPPZVrnOblEV+WVnqlyz5oyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAFtZZBDuqUqGBtYRCOejVQtH97c1oHOfnHQdSnayW4mrahOfbE8W/kyiBH+t0PMner+alPhtRogdrnhvu4NU7785UpwlSiDn2HAubhgeYkcE5IW5Hpxti+3O+xyFpRYdF6hBrMBY6kdVTCbe5p8masJlkni9hztF+p7ExE95xHUQrvkzdHqn+ZE70kziiXQowZrXdRMc2w4prM+/jYlUbUgBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKngBMh865j6XOR/gDgG/Sx5RdKVJJWa7ADe2XgU8494Rj0LFW/d3IK4lyqlceBwr8TyPZNrQKFLt8xGCdDeQM+fQSRuzH14/oHkF3OkaWVBmTeSOgdkR5ffbz61FEJgEMtBJG7MfXj+geQXc6RpZUGZN5I6B2RHl99vPrUUQmAQy/0QjG4Q6bY99ZZtDZgFfWI8tSFnu6kMfHO5ylsJE6uXDDX/qQVajlaNqPe8B1YVJ0zxySykH0AAnFFqpBTCfHCDhHQpLmdalLQ27LCpmIlCMoqD3cYjOAKWEmfFzWEXy5h1LqYqUNIpYS6eASNgHXj4X1PUs29XDkWfZuhp81h8oQazAWOpHVUwm3uafJmrCZZJ4vYc7RfqexMRPecR1ELuhGx/27tj8cFCV8Cr5WCGM1ZDkornF+rBoLu9NsR4QAwU3vyCXsZ2lCUIGLtlQGX0KY0xVtVxtNT4CQwY6ahj3LlX2RXNtyZkEStLkxUYSRGD+Uw4FVdVET35HIwxKdGj17sSflitwSymj4NDfsLhw/mCDek+WPkXiikY3ar3tFm9ME+1Yw5FKJhETgUZ2vyf/lODGjfcil55QGZeWn4a5UpwlSiDn2HAubhgeYkcE5IW5Hpxti+3O+xyFpRYdF6JC6ZE/h9VqhnxHNLS7BTTIztuCkvq7vcraYWOIeFw1iDkedlBEF5hi0bDgK2cXKrBv+OPXIo9PQY2hDJbKuhUBt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKlJOLTGrAwrt0Mk8J5g/c4WtZjdQENrrTuhk17Brt6Iuga26U78b2CjZrehYGW5ATqzroq1WasbpfmuB0LXI+vKsp3Us/JtqLg1ZtIKNL0TuRMfVWgcFmjO+bkGJU5zcMiMlyWPTiSJ8bs9ECkUjg2DC1oTmdr/EIQEjnvY2+n4WYkLpkT+H1WqGfEc0tLsFNMjO24KS+ru9ytphY4h4XDWY4NzAA6iLLJk00r/ZKBLXvq/u3TdzQSJl7GYFUfX0RAG3fbh12Whk9nL4UbO63msHLSF7V9bN5E6jPWFfv8AqeAEyHzrmPpc5H+AOAb9LHlF0pUklZrsAN7ZeBTzj3hGCAwMknhNG6Lkq5k72WXGEV7sYDpb6ADg9nZ2xmkGb1wxqXtbl1icUONib+eR2ZQll4YPHyoQZI4iR1wVGvQ9qkEkbsx9eP6B5BdzpGllQZk3kjoHZEeX328+tRRCYBDLoQazAWOpHVUwm3uafJmrCZZJ4vYc7RfqexMRPecR1EJtZZBDuqUqGBtYRCOejVQtH97c1oHOfnHQdSnayW4mrQwU3vyCXsZ2lCUIGLtlQGX0KY0xVtVxtNT4CQwY6ahjBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEMNf+pBVqOVo2o97wHVhUnTPHJLKQfQACcUWqkFMJ8cIlDMKn0OhUn9sP2Wk5BZUI1HZ9qJiDn7z4U4IK7w+JAo9e7En5YrcEspo+DQ37C4cP5gg3pPlj5F4opGN2q97TlSnCVKIOfYcC5uGB5iRwTkhbkenG2L7c77HIWlFh0XnA549Ol3xevOkLlQTmeNV2adN8P1gRNgFK6zIPYzsYmFilsT/XYNV5EI9IMon6Z/zcp+aBqGZaY/PKL8TBQj1oJLSE1ZXoVnCuH1LZqcNuOl1I4n/dqryBs7QY6OPla7Q=="
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"key": "8esSdkAjjSktt5iHjbmojPxWaL8sTac3vuPP9d8r8n2A",
|
|
22
|
+
"dataBase64": "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"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"key": "2VuLeMEXPF4RGhw6sDEnYF4JjAfzHqtdPCyRYGjyLp3t",
|
|
26
|
+
"dataBase64": "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"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/core-chain",
|
|
3
|
-
"version": "2.24.
|
|
3
|
+
"version": "2.24.3",
|
|
4
4
|
"description": "Blockchain chain logic shared across Vultisig clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -685,6 +685,11 @@
|
|
|
685
685
|
"import": "./dist/chains/ripple/network/info.js",
|
|
686
686
|
"default": "./dist/chains/ripple/network/info.js"
|
|
687
687
|
},
|
|
688
|
+
"./chains/solana/assertSafeSolanaSwapInstructions": {
|
|
689
|
+
"types": "./dist/chains/solana/assertSafeSolanaSwapInstructions.d.ts",
|
|
690
|
+
"import": "./dist/chains/solana/assertSafeSolanaSwapInstructions.js",
|
|
691
|
+
"default": "./dist/chains/solana/assertSafeSolanaSwapInstructions.js"
|
|
692
|
+
},
|
|
688
693
|
"./chains/solana/client": {
|
|
689
694
|
"types": "./dist/chains/solana/client.d.ts",
|
|
690
695
|
"import": "./dist/chains/solana/client.js",
|
|
@@ -1255,6 +1260,7 @@
|
|
|
1255
1260
|
"import": "./dist/coin/utils/sortCoinsByBalance.js",
|
|
1256
1261
|
"default": "./dist/coin/utils/sortCoinsByBalance.js"
|
|
1257
1262
|
},
|
|
1263
|
+
"./fixtures/jupiter-swap-transactions.json": "./fixtures/jupiter-swap-transactions.json",
|
|
1258
1264
|
"./fixtures/limit-swap-memos.json": "./fixtures/limit-swap-memos.json",
|
|
1259
1265
|
"./package.json": "./package.json",
|
|
1260
1266
|
"./publicKey/address/bittensor": {
|