@shogun-sdk/intents-sdk 1.2.5 → 1.2.6-test
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/README.md +3 -19
- package/dist/esm/chains.js +3 -0
- package/dist/esm/chains.js.map +1 -1
- package/dist/esm/constants.js +9 -0
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/core/evm/chain-provider.js +2 -1
- package/dist/esm/core/evm/chain-provider.js.map +1 -1
- package/dist/esm/core/evm/cross-chain-limit-order.js +1 -1
- package/dist/esm/core/evm/cross-chain-limit-order.js.map +1 -1
- package/dist/esm/core/evm/permit2-signature-transfer.js +15 -0
- package/dist/esm/core/evm/permit2-signature-transfer.js.map +1 -0
- package/dist/esm/core/evm/single-chain-dca-order.js +1 -1
- package/dist/esm/core/evm/single-chain-dca-order.js.map +1 -1
- package/dist/esm/core/evm/single-chain-limit-order.js +1 -1
- package/dist/esm/core/evm/single-chain-limit-order.js.map +1 -1
- package/dist/esm/core/solana/dca/single-chain-dca-order.js +3 -2
- package/dist/esm/core/solana/dca/single-chain-dca-order.js.map +1 -1
- package/dist/esm/core/solana/dca/single-chain-limit-order.js +3 -2
- package/dist/esm/core/solana/dca/single-chain-limit-order.js.map +1 -1
- package/dist/esm/core/solana/utils.js +14 -4
- package/dist/esm/core/solana/utils.js.map +1 -1
- package/dist/esm/core/sui/single-chain-dca-order.js +2 -1
- package/dist/esm/core/sui/single-chain-dca-order.js.map +1 -1
- package/dist/esm/core/sui/single-chain-limit-order.js +2 -1
- package/dist/esm/core/sui/single-chain-limit-order.js.map +1 -1
- package/dist/esm/index.js +6 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/token-list.js +2 -0
- package/dist/esm/types/token-list.js.map +1 -0
- package/dist/esm/utils/defillama.js +1 -0
- package/dist/esm/utils/defillama.js.map +1 -1
- package/dist/esm/utils/quote/aggregator.js +158 -42
- package/dist/esm/utils/quote/aggregator.js.map +1 -1
- package/dist/esm/utils/quote/paraswap.js +1 -0
- package/dist/esm/utils/quote/paraswap.js.map +1 -1
- package/dist/esm/utils/quote/pumpfun/estimations.js +169 -0
- package/dist/esm/utils/quote/pumpfun/estimations.js.map +1 -0
- package/dist/esm/utils/quote/pumpfun/estimations_amm.js +130 -0
- package/dist/esm/utils/quote/pumpfun/estimations_amm.js.map +1 -0
- package/dist/esm/utils/quote/pumpfun/index.js +198 -0
- package/dist/esm/utils/quote/pumpfun/index.js.map +1 -0
- package/dist/esm/utils/quote/pumpfun/models.js +70 -0
- package/dist/esm/utils/quote/pumpfun/models.js.map +1 -0
- package/dist/esm/utils/quote/pumpfun/utils.js +269 -0
- package/dist/esm/utils/quote/pumpfun/utils.js.map +1 -0
- package/dist/esm/utils/quote/raydium.js +336 -0
- package/dist/esm/utils/quote/raydium.js.map +1 -0
- package/dist/esm/utils/quote/stablecoins-tokens.js +1 -0
- package/dist/esm/utils/quote/stablecoins-tokens.js.map +1 -1
- package/dist/esm/utils/quote/utils.js +8 -0
- package/dist/esm/utils/quote/utils.js.map +1 -0
- package/dist/esm/utils/tokens/index.js +37 -0
- package/dist/esm/utils/tokens/index.js.map +1 -0
- package/dist/types/chains.d.ts +4 -2
- package/dist/types/chains.d.ts.map +1 -1
- package/dist/types/constants.d.ts +2 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/core/evm/chain-provider.d.ts.map +1 -1
- package/dist/types/core/evm/permit2-signature-transfer.d.ts +3 -0
- package/dist/types/core/evm/permit2-signature-transfer.d.ts.map +1 -0
- package/dist/types/core/solana/dca/single-chain-dca-order.d.ts +1 -2
- package/dist/types/core/solana/dca/single-chain-dca-order.d.ts.map +1 -1
- package/dist/types/core/solana/dca/single-chain-limit-order.d.ts +1 -2
- package/dist/types/core/solana/dca/single-chain-limit-order.d.ts.map +1 -1
- package/dist/types/core/solana/utils.d.ts +2 -0
- package/dist/types/core/solana/utils.d.ts.map +1 -1
- package/dist/types/core/sui/single-chain-dca-order.d.ts.map +1 -1
- package/dist/types/core/sui/single-chain-limit-order.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/token-list.d.ts +30 -0
- package/dist/types/types/token-list.d.ts.map +1 -0
- package/dist/types/utils/defillama.d.ts +1 -0
- package/dist/types/utils/defillama.d.ts.map +1 -1
- package/dist/types/utils/quote/aggregator.d.ts +42 -5
- package/dist/types/utils/quote/aggregator.d.ts.map +1 -1
- package/dist/types/utils/quote/paraswap.d.ts.map +1 -1
- package/dist/types/utils/quote/pumpfun/estimations.d.ts +30 -0
- package/dist/types/utils/quote/pumpfun/estimations.d.ts.map +1 -0
- package/dist/types/utils/quote/pumpfun/estimations_amm.d.ts +49 -0
- package/dist/types/utils/quote/pumpfun/estimations_amm.d.ts.map +1 -0
- package/dist/types/utils/quote/pumpfun/index.d.ts +10 -0
- package/dist/types/utils/quote/pumpfun/index.d.ts.map +1 -0
- package/dist/types/utils/quote/pumpfun/models.d.ts +94 -0
- package/dist/types/utils/quote/pumpfun/models.d.ts.map +1 -0
- package/dist/types/utils/quote/pumpfun/utils.d.ts +50 -0
- package/dist/types/utils/quote/pumpfun/utils.d.ts.map +1 -0
- package/dist/types/utils/quote/raydium.d.ts +98 -0
- package/dist/types/utils/quote/raydium.d.ts.map +1 -0
- package/dist/types/utils/quote/stablecoins-tokens.d.ts.map +1 -1
- package/dist/types/utils/quote/utils.d.ts +5 -0
- package/dist/types/utils/quote/utils.d.ts.map +1 -0
- package/dist/types/utils/tokens/index.d.ts +20 -0
- package/dist/types/utils/tokens/index.d.ts.map +1 -0
- package/package.json +20 -18
- package/src/chains.ts +3 -0
- package/src/constants.ts +12 -2
- package/src/core/evm/chain-provider.ts +2 -1
- package/src/core/evm/cross-chain-limit-order.ts +1 -1
- package/src/core/evm/permit2-signature-transfer.ts +15 -0
- package/src/core/evm/single-chain-dca-order.ts +1 -1
- package/src/core/evm/single-chain-limit-order.ts +1 -1
- package/src/core/solana/dca/single-chain-dca-order.ts +3 -3
- package/src/core/solana/dca/single-chain-limit-order.ts +3 -2
- package/src/core/solana/utils.ts +24 -12
- package/src/core/sui/single-chain-dca-order.ts +2 -2
- package/src/core/sui/single-chain-limit-order.ts +2 -2
- package/src/index.ts +14 -4
- package/src/types/token-list.ts +35 -0
- package/src/utils/defillama.ts +1 -0
- package/src/utils/quote/aggregator.ts +210 -55
- package/src/utils/quote/paraswap.ts +1 -0
- package/src/utils/quote/pumpfun/estimations.ts +206 -0
- package/src/utils/quote/pumpfun/estimations_amm.ts +165 -0
- package/src/utils/quote/pumpfun/index.ts +266 -0
- package/src/utils/quote/pumpfun/models.ts +163 -0
- package/src/utils/quote/pumpfun/utils.ts +343 -0
- package/src/utils/quote/raydium.ts +506 -0
- package/src/utils/quote/stablecoins-tokens.ts +1 -0
- package/src/utils/quote/utils.ts +8 -0
- package/src/utils/tokens/index.ts +38 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { address, fetchEncodedAccount, fetchEncodedAccounts, getAddressEncoder, getProgramDerivedAddress, unwrapOption, } from '@solana/kit';
|
|
2
|
+
import { getDefaultSolanaRPC } from '../../../core/solana/client.js';
|
|
3
|
+
import { getBondingCurveDecoder, getGlobalAccountDecoder, getGlobalConfigDecoder, getPumpPoolDataDecoder, } from './models.js';
|
|
4
|
+
import { getTokenDecoder } from '@solana-program/token';
|
|
5
|
+
import { ONE_DAY_MS, TEN_MINUTES_MS, TWO_SECONDS_MS } from '../utils.js';
|
|
6
|
+
export const PUMP_FUN_PROGRAM_ADDRESS = address('6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P');
|
|
7
|
+
export const PUMP_FUN_AMM_PROGRAM_ADDRESS = address('pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA');
|
|
8
|
+
export const WRAPPED_NATIVE_TOKEN_PUBKEY = address('So11111111111111111111111111111111111111112');
|
|
9
|
+
export const GLOBAL_CONFIG_AMM = address('ADyA8hdefvWN2dbGGWFotbzWxrAvLW83WG6QCVXvJKqw');
|
|
10
|
+
export const ANCHOR_DISCRIMINATOR_SIZE = 8;
|
|
11
|
+
let globalAccountCache = null;
|
|
12
|
+
let globalConfigCache = null;
|
|
13
|
+
const migratedPoolCache = new Map();
|
|
14
|
+
const poolTokensInfoCache = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Finds the PDA for a PumpFun bonding curve
|
|
17
|
+
*/
|
|
18
|
+
async function findBondingCurvePda(tokenMint) {
|
|
19
|
+
const [pda] = await getProgramDerivedAddress({
|
|
20
|
+
programAddress: PUMP_FUN_PROGRAM_ADDRESS,
|
|
21
|
+
seeds: [new TextEncoder().encode('bonding-curve'), getAddressEncoder().encode(tokenMint)],
|
|
22
|
+
});
|
|
23
|
+
return pda;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Finds the PDA for the PumpFun global account
|
|
27
|
+
*/
|
|
28
|
+
async function findGlobalAccountPda() {
|
|
29
|
+
const [pda] = await getProgramDerivedAddress({
|
|
30
|
+
programAddress: PUMP_FUN_PROGRAM_ADDRESS,
|
|
31
|
+
seeds: [new TextEncoder().encode('global')],
|
|
32
|
+
});
|
|
33
|
+
return pda;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Finds the PDA for pool authority in the AMM program
|
|
37
|
+
*/
|
|
38
|
+
async function findPoolAuthorityPdaAmm(mint) {
|
|
39
|
+
const [pda] = await getProgramDerivedAddress({
|
|
40
|
+
programAddress: PUMP_FUN_PROGRAM_ADDRESS,
|
|
41
|
+
seeds: [new TextEncoder().encode('pool-authority'), getAddressEncoder().encode(mint)],
|
|
42
|
+
});
|
|
43
|
+
return pda;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Finds the PDA for a pool in the AMM program
|
|
47
|
+
*/
|
|
48
|
+
async function findPoolPdaAmm(poolAuthority, baseMint, quoteMint) {
|
|
49
|
+
const [pda] = await getProgramDerivedAddress({
|
|
50
|
+
programAddress: PUMP_FUN_AMM_PROGRAM_ADDRESS,
|
|
51
|
+
seeds: [
|
|
52
|
+
new TextEncoder().encode('pool'),
|
|
53
|
+
new Uint8Array([0, 0]), // Pool type bytes
|
|
54
|
+
getAddressEncoder().encode(poolAuthority),
|
|
55
|
+
getAddressEncoder().encode(baseMint),
|
|
56
|
+
getAddressEncoder().encode(quoteMint),
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
return pda;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Fetches and deserializes a PumpFun bonding curve account
|
|
63
|
+
*
|
|
64
|
+
* @param tokenMint - The token mint address
|
|
65
|
+
* @param options - Optional RPC configuration
|
|
66
|
+
* @returns Tuple of [BondingCurve data, PDA address]
|
|
67
|
+
* @throws Error if account doesn't exist or deserialization fails
|
|
68
|
+
*/
|
|
69
|
+
export async function getPumpFunBondingCurve(tokenMint) {
|
|
70
|
+
const rpc = getDefaultSolanaRPC();
|
|
71
|
+
try {
|
|
72
|
+
// Derive the PDA for the bonding curve
|
|
73
|
+
const pda = await findBondingCurvePda(tokenMint);
|
|
74
|
+
// Fetch the account data
|
|
75
|
+
const encodedAccount = await fetchEncodedAccount(rpc, pda);
|
|
76
|
+
if (!encodedAccount.exists) {
|
|
77
|
+
throw new Error(`Bonding curve account not found for token mint: ${tokenMint}`);
|
|
78
|
+
}
|
|
79
|
+
// Anchor accounts have an 8-byte discriminator prefix
|
|
80
|
+
const dataWithoutDiscriminator = encodedAccount.data.slice(8);
|
|
81
|
+
try {
|
|
82
|
+
const decoder = getBondingCurveDecoder();
|
|
83
|
+
const bondingCurve = decoder.decode(dataWithoutDiscriminator);
|
|
84
|
+
return [bondingCurve, pda];
|
|
85
|
+
}
|
|
86
|
+
catch (decodingError) {
|
|
87
|
+
throw new Error(`Failed to deserialize bonding curve: ${decodingError instanceof Error ? decodingError.message : String(decodingError)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new Error(`Failed to fetch bonding curve account: ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Fetches and deserializes the PumpFun global account
|
|
96
|
+
*
|
|
97
|
+
* @returns Tuple of [GlobalAccount data, PDA address]
|
|
98
|
+
* @throws {Error} if account doesn't exist
|
|
99
|
+
* @throws {Error} if deserialization fails
|
|
100
|
+
*/
|
|
101
|
+
export async function getPumpFunGlobalAccount() {
|
|
102
|
+
// Return cached value if valid
|
|
103
|
+
if (globalAccountCache && Date.now() < globalAccountCache.expiresAt) {
|
|
104
|
+
return globalAccountCache.data;
|
|
105
|
+
}
|
|
106
|
+
const rpc = getDefaultSolanaRPC();
|
|
107
|
+
const pda = await findGlobalAccountPda();
|
|
108
|
+
const encodedAccount = await fetchEncodedAccount(rpc, pda);
|
|
109
|
+
if (!encodedAccount.exists) {
|
|
110
|
+
throw new Error(`GlobalAccount not found: ${pda}`);
|
|
111
|
+
}
|
|
112
|
+
// Validate minimum size
|
|
113
|
+
if (encodedAccount.data.length < ANCHOR_DISCRIMINATOR_SIZE) {
|
|
114
|
+
throw new Error(`GlobalAccount deserialization failed: Account data too small: ${encodedAccount.data.length} bytes`);
|
|
115
|
+
}
|
|
116
|
+
// Skip Anchor's 8-byte discriminator
|
|
117
|
+
const dataWithoutDiscriminator = encodedAccount.data.slice(ANCHOR_DISCRIMINATOR_SIZE);
|
|
118
|
+
try {
|
|
119
|
+
const decoder = getGlobalAccountDecoder();
|
|
120
|
+
const globalAccount = decoder.decode(dataWithoutDiscriminator);
|
|
121
|
+
// Update cache
|
|
122
|
+
globalAccountCache = {
|
|
123
|
+
data: [globalAccount, pda],
|
|
124
|
+
expiresAt: Date.now() + TEN_MINUTES_MS,
|
|
125
|
+
};
|
|
126
|
+
return [globalAccount, pda];
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw new Error(`GlobalAccount deserialization failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Fetches and deserializes the PumpFun global config account
|
|
134
|
+
*
|
|
135
|
+
* @returns Tuple of [GlobalConfig data, PDA address]
|
|
136
|
+
* @throws {Error} if account doesn't exist
|
|
137
|
+
* @throws {Error} if deserialization fails
|
|
138
|
+
*/
|
|
139
|
+
export async function getPumpFunGlobalConfig() {
|
|
140
|
+
// Return cached value if valid
|
|
141
|
+
if (globalConfigCache && Date.now() < globalConfigCache.expiresAt) {
|
|
142
|
+
return globalConfigCache.data;
|
|
143
|
+
}
|
|
144
|
+
const rpc = getDefaultSolanaRPC();
|
|
145
|
+
const encodedAccount = await fetchEncodedAccount(rpc, GLOBAL_CONFIG_AMM);
|
|
146
|
+
if (!encodedAccount.exists) {
|
|
147
|
+
throw new Error(`GlobalConfig account not found: ${GLOBAL_CONFIG_AMM}`);
|
|
148
|
+
}
|
|
149
|
+
// Validate minimum size
|
|
150
|
+
if (encodedAccount.data.length < ANCHOR_DISCRIMINATOR_SIZE) {
|
|
151
|
+
throw new Error(`GlobalConfig deserialization failed: Account data too small: ${encodedAccount.data.length} bytes`);
|
|
152
|
+
}
|
|
153
|
+
// Skip Anchor's 8-byte discriminator
|
|
154
|
+
const dataWithoutDiscriminator = encodedAccount.data.slice(ANCHOR_DISCRIMINATOR_SIZE);
|
|
155
|
+
try {
|
|
156
|
+
const decoder = getGlobalConfigDecoder();
|
|
157
|
+
const globalConfig = decoder.decode(dataWithoutDiscriminator);
|
|
158
|
+
// Update cache
|
|
159
|
+
globalConfigCache = {
|
|
160
|
+
data: [globalConfig, GLOBAL_CONFIG_AMM],
|
|
161
|
+
expiresAt: Date.now() + TEN_MINUTES_MS,
|
|
162
|
+
};
|
|
163
|
+
return [globalConfig, GLOBAL_CONFIG_AMM];
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw new Error(`GlobalConfig deserialization failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Fetches the migrated AMM pool for a token
|
|
171
|
+
*
|
|
172
|
+
* @param baseMint - The token mint address (NOT WSOL)
|
|
173
|
+
* @returns Tuple of [PumpPoolData, pool PDA address]
|
|
174
|
+
* @throws Error if pool doesn't exist or deserialization fails
|
|
175
|
+
*/
|
|
176
|
+
export async function getPumpFunMigratedPool(baseMint) {
|
|
177
|
+
// 2s in-memory cache
|
|
178
|
+
const cacheKey = String(baseMint);
|
|
179
|
+
const cached = migratedPoolCache.get(cacheKey);
|
|
180
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
181
|
+
return cached.data;
|
|
182
|
+
}
|
|
183
|
+
const rpc = getDefaultSolanaRPC();
|
|
184
|
+
try {
|
|
185
|
+
const poolAuthorityPda = await findPoolAuthorityPdaAmm(baseMint);
|
|
186
|
+
const poolPda = await findPoolPdaAmm(poolAuthorityPda, baseMint, WRAPPED_NATIVE_TOKEN_PUBKEY);
|
|
187
|
+
const encodedAccount = await fetchEncodedAccount(rpc, poolPda);
|
|
188
|
+
if (!encodedAccount.exists) {
|
|
189
|
+
throw new Error(`Migrated pool not found for token mint: ${baseMint}`);
|
|
190
|
+
}
|
|
191
|
+
const dataWithoutDiscriminator = encodedAccount.data.slice(ANCHOR_DISCRIMINATOR_SIZE);
|
|
192
|
+
try {
|
|
193
|
+
const decoder = getPumpPoolDataDecoder();
|
|
194
|
+
const poolData = decoder.decode(dataWithoutDiscriminator);
|
|
195
|
+
// Update short-lived cache
|
|
196
|
+
migratedPoolCache.set(cacheKey, {
|
|
197
|
+
data: [poolData, poolPda],
|
|
198
|
+
expiresAt: Date.now() + ONE_DAY_MS,
|
|
199
|
+
});
|
|
200
|
+
return [poolData, poolPda];
|
|
201
|
+
}
|
|
202
|
+
catch (decodingError) {
|
|
203
|
+
throw new Error(`Failed to deserialize pool data: ${decodingError instanceof Error ? decodingError.message : String(decodingError)}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
throw new Error(`Failed to fetch migrated pool: ${error instanceof Error ? error.message : String(error)}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Fetches and deserializes token account information for pool base and quote tokens
|
|
212
|
+
*
|
|
213
|
+
* @param poolBaseTokenAccount - Base token account public key
|
|
214
|
+
* @param poolQuoteTokenAccount - Quote token account public key
|
|
215
|
+
* @returns Tuple containing [baseTokenAccount, quoteTokenAccount]
|
|
216
|
+
* @throws Error if accounts don't exist or deserialization fails
|
|
217
|
+
*/
|
|
218
|
+
export async function getPoolTokensInfo(poolBaseTokenAccount, poolQuoteTokenAccount) {
|
|
219
|
+
// 2s in-memory cache
|
|
220
|
+
const cacheKey = `${poolBaseTokenAccount}-${poolQuoteTokenAccount}`;
|
|
221
|
+
const cached = poolTokensInfoCache.get(cacheKey);
|
|
222
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
223
|
+
return cached.data;
|
|
224
|
+
}
|
|
225
|
+
const rpc = getDefaultSolanaRPC();
|
|
226
|
+
const accountsInfo = await fetchEncodedAccounts(rpc, [poolBaseTokenAccount, poolQuoteTokenAccount]);
|
|
227
|
+
// Validate base token account exists
|
|
228
|
+
const baseAccountInfo = accountsInfo[0];
|
|
229
|
+
if (!baseAccountInfo || !baseAccountInfo.exists) {
|
|
230
|
+
throw new Error(`Base token account not found: ${poolBaseTokenAccount}`);
|
|
231
|
+
}
|
|
232
|
+
// Validate quote token account exists
|
|
233
|
+
const quoteAccountInfo = accountsInfo[1];
|
|
234
|
+
if (!quoteAccountInfo || !quoteAccountInfo.exists) {
|
|
235
|
+
throw new Error(`Quote token account not found: ${poolQuoteTokenAccount}`);
|
|
236
|
+
}
|
|
237
|
+
const tokenDecoder = getTokenDecoder();
|
|
238
|
+
// Deserialize base token account
|
|
239
|
+
const baseDecoded = tokenDecoder.decode(baseAccountInfo.data);
|
|
240
|
+
const baseTokenAccount = {
|
|
241
|
+
mint: baseDecoded.mint,
|
|
242
|
+
owner: baseDecoded.owner,
|
|
243
|
+
amount: baseDecoded.amount,
|
|
244
|
+
delegate: unwrapOption(baseDecoded.delegate),
|
|
245
|
+
state: baseDecoded.state,
|
|
246
|
+
isNative: unwrapOption(baseDecoded.isNative),
|
|
247
|
+
delegatedAmount: baseDecoded.delegatedAmount,
|
|
248
|
+
closeAuthority: unwrapOption(baseDecoded.closeAuthority),
|
|
249
|
+
};
|
|
250
|
+
// Deserialize quote token account
|
|
251
|
+
const quoteDecoded = tokenDecoder.decode(quoteAccountInfo.data);
|
|
252
|
+
const quoteTokenAccount = {
|
|
253
|
+
mint: quoteDecoded.mint,
|
|
254
|
+
owner: quoteDecoded.owner,
|
|
255
|
+
amount: quoteDecoded.amount,
|
|
256
|
+
delegate: unwrapOption(quoteDecoded.delegate),
|
|
257
|
+
state: quoteDecoded.state,
|
|
258
|
+
isNative: unwrapOption(quoteDecoded.isNative),
|
|
259
|
+
delegatedAmount: quoteDecoded.delegatedAmount,
|
|
260
|
+
closeAuthority: unwrapOption(quoteDecoded.closeAuthority),
|
|
261
|
+
};
|
|
262
|
+
// Update short-lived cache
|
|
263
|
+
poolTokensInfoCache.set(cacheKey, {
|
|
264
|
+
data: [baseTokenAccount, quoteTokenAccount],
|
|
265
|
+
expiresAt: Date.now() + TWO_SECONDS_MS,
|
|
266
|
+
});
|
|
267
|
+
return [baseTokenAccount, quoteTokenAccount];
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/utils/quote/pumpfun/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { NATIVE_SOLANA_TOKEN_ADDRESS, WRAPPED_SOL_MINT_ADDRESS } from '../../constants.js';
|
|
2
|
+
import { API_URLS, getPdaLaunchpadPoolId, Raydium, LAUNCHPAD_PROGRAM, PlatformConfig, Curve, } from '@raydium-io/raydium-sdk-v2';
|
|
3
|
+
import {} from './aggregator.js';
|
|
4
|
+
import { Connection, clusterApiUrl, PublicKey } from '@solana/web3.js'; // Used this package for raydium-sdk-v2 compatibility
|
|
5
|
+
import BN from 'bn.js';
|
|
6
|
+
import { Decimal } from 'decimal.js';
|
|
7
|
+
import { JupiterQuoteProvider } from './jupiter.js';
|
|
8
|
+
import { TWO_SECONDS_MS, TEN_MINUTES_MS } from './utils.js';
|
|
9
|
+
const launchpadPoolCache = new Map();
|
|
10
|
+
const launchpadPoolInfoCache = new Map();
|
|
11
|
+
const platformConfigCache = new Map();
|
|
12
|
+
const mintInfoCache = new Map();
|
|
13
|
+
// Local implementation of compareAddresses function
|
|
14
|
+
const compareAddresses = (firstAddress, secondAddress) => {
|
|
15
|
+
return !!firstAddress && !!secondAddress && firstAddress.toLowerCase() === secondAddress.toLowerCase();
|
|
16
|
+
};
|
|
17
|
+
const LAUNCHPAD_WHITELISTED_QUOTE_TOKENS = [
|
|
18
|
+
new PublicKey('So11111111111111111111111111111111111111112'), // WSOL
|
|
19
|
+
new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'), // USDC
|
|
20
|
+
new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB'), // USDT
|
|
21
|
+
new PublicKey('USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB'), // USD1
|
|
22
|
+
];
|
|
23
|
+
let raydium;
|
|
24
|
+
export const initSdk = async () => {
|
|
25
|
+
if (raydium)
|
|
26
|
+
return raydium;
|
|
27
|
+
raydium = await Raydium.load({
|
|
28
|
+
connection: new Connection(clusterApiUrl('mainnet-beta')),
|
|
29
|
+
disableFeatureCheck: true,
|
|
30
|
+
disableLoadToken: true,
|
|
31
|
+
});
|
|
32
|
+
return raydium;
|
|
33
|
+
};
|
|
34
|
+
// Using API_URLS from Raydium SDK v2
|
|
35
|
+
export class RaydiumQuoteProvider {
|
|
36
|
+
/**
|
|
37
|
+
* Get priority fee recommendations from Raydium API
|
|
38
|
+
* @returns Priority fee data with different tiers (vh, h, m)
|
|
39
|
+
*/
|
|
40
|
+
async getPriorityFee() {
|
|
41
|
+
const url = new URL(API_URLS.PRIORITY_FEE, API_URLS.BASE_HOST);
|
|
42
|
+
const response = await fetch(url);
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`Failed to fetch priority fee from Raydium API: ${response.status} ${response.statusText}`);
|
|
45
|
+
}
|
|
46
|
+
const data = await response.json();
|
|
47
|
+
if (!data.success) {
|
|
48
|
+
throw new Error('Raydium API returned unsuccessful response for priority fee');
|
|
49
|
+
}
|
|
50
|
+
return data.data.default;
|
|
51
|
+
}
|
|
52
|
+
async getQuote(raydiumParams) {
|
|
53
|
+
const params = { ...raydiumParams };
|
|
54
|
+
// Handle native SOL token mapping for Solana
|
|
55
|
+
if (compareAddresses(params.inputMint, NATIVE_SOLANA_TOKEN_ADDRESS)) {
|
|
56
|
+
params.inputMint = WRAPPED_SOL_MINT_ADDRESS;
|
|
57
|
+
}
|
|
58
|
+
if (compareAddresses(params.outputMint, NATIVE_SOLANA_TOKEN_ADDRESS)) {
|
|
59
|
+
params.outputMint = WRAPPED_SOL_MINT_ADDRESS;
|
|
60
|
+
}
|
|
61
|
+
const url = new URL('/compute/swap-base-in', API_URLS.SWAP_HOST);
|
|
62
|
+
url.searchParams.set('inputMint', params.inputMint);
|
|
63
|
+
url.searchParams.set('outputMint', params.outputMint);
|
|
64
|
+
url.searchParams.set('amount', params.amount);
|
|
65
|
+
url.searchParams.set('slippageBps', params.slippageBps.toString());
|
|
66
|
+
url.searchParams.set('txVersion', 'V0');
|
|
67
|
+
const response = await fetch(url);
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`Failed to fetch quote from Raydium API: ${response.status} ${response.statusText}`);
|
|
70
|
+
}
|
|
71
|
+
const data = await response.json();
|
|
72
|
+
if (!data.success) {
|
|
73
|
+
throw new Error('Raydium API returned unsuccessful response');
|
|
74
|
+
}
|
|
75
|
+
return data;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get transaction data for executing a swap
|
|
79
|
+
* @param params - Transaction parameters
|
|
80
|
+
* @returns Serialized transaction data
|
|
81
|
+
*/
|
|
82
|
+
async getSwapTransaction(params) {
|
|
83
|
+
const url = new URL('/transaction/swap-base-in', API_URLS.SWAP_HOST);
|
|
84
|
+
const response = await fetch(url, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: {
|
|
87
|
+
'Content-Type': 'application/json',
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
computeUnitPriceMicroLamports: params.computeUnitPriceMicroLamports || '0',
|
|
91
|
+
swapResponse: params.swapResponse,
|
|
92
|
+
txVersion: params.txVersion,
|
|
93
|
+
wallet: params.wallet,
|
|
94
|
+
wrapSol: params.wrapSol || false,
|
|
95
|
+
unwrapSol: params.unwrapSol || false,
|
|
96
|
+
inputAccount: params.inputAccount,
|
|
97
|
+
outputAccount: params.outputAccount,
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
throw new Error(`Failed to get swap transaction from Raydium API: ${response.status} ${response.statusText}`);
|
|
102
|
+
}
|
|
103
|
+
const data = await response.json();
|
|
104
|
+
if (!data.success) {
|
|
105
|
+
throw new Error('Raydium API returned unsuccessful response for swap transaction');
|
|
106
|
+
}
|
|
107
|
+
return data;
|
|
108
|
+
}
|
|
109
|
+
async getQuotePrebonded(raydiumParams) {
|
|
110
|
+
// First, get the Raydium quote token
|
|
111
|
+
let raydiumSdk = await initSdk();
|
|
112
|
+
let inputMintPk = new PublicKey(raydiumParams.inputMint);
|
|
113
|
+
let outputMintPk = new PublicKey(raydiumParams.outputMint);
|
|
114
|
+
// Check if either input or output mint is in the launchpad whitelisted tokens
|
|
115
|
+
let poolInfo, inputPoolInfo, outputPoolInfo, quoteToken, isInputPrebonded, inputQuoteToken, outputQuoteToken;
|
|
116
|
+
try {
|
|
117
|
+
[inputPoolInfo, inputQuoteToken] = await this.checkPreboundedTokensSwapLaunchpad(raydiumSdk, inputMintPk);
|
|
118
|
+
if (inputPoolInfo && inputQuoteToken) {
|
|
119
|
+
isInputPrebonded = true;
|
|
120
|
+
poolInfo = inputPoolInfo;
|
|
121
|
+
quoteToken = inputQuoteToken;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (e) { }
|
|
125
|
+
try {
|
|
126
|
+
[outputPoolInfo, outputQuoteToken] = await this.checkPreboundedTokensSwapLaunchpad(raydiumSdk, outputMintPk);
|
|
127
|
+
if (outputPoolInfo && outputQuoteToken) {
|
|
128
|
+
isInputPrebonded = false;
|
|
129
|
+
poolInfo = outputPoolInfo;
|
|
130
|
+
quoteToken = outputQuoteToken;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (e) { }
|
|
134
|
+
if (inputPoolInfo && outputPoolInfo) {
|
|
135
|
+
// Both input and output are prebonded, which is not supported
|
|
136
|
+
throw new Error('Both input and output tokens are prebonded, which is not supported');
|
|
137
|
+
}
|
|
138
|
+
else if (!quoteToken || !poolInfo) {
|
|
139
|
+
// Neither input nor output is prebonded, fallback to regular Raydium quote
|
|
140
|
+
throw new Error('Neither input nor output tokens are prebonded');
|
|
141
|
+
}
|
|
142
|
+
let quoteIsInput = quoteToken.equals(inputMintPk);
|
|
143
|
+
let quoteIsOutput = quoteToken.equals(outputMintPk);
|
|
144
|
+
if (isInputPrebonded) {
|
|
145
|
+
// We have to estimate prebonded first and then swap from quote token to output token (if needed)
|
|
146
|
+
let { expectedAmountOut, minimumAmountOut } = await this.estimatePrebondedToQuote(raydiumSdk, inputMintPk, poolInfo, 'sell', new BN(raydiumParams.amount), new BN(raydiumParams.slippageBps));
|
|
147
|
+
// Then, if output token is not quote token, we have to swap from quote token to output token
|
|
148
|
+
if (!quoteIsOutput) {
|
|
149
|
+
let jupiterQuoteRequest = {
|
|
150
|
+
amount: BigInt(expectedAmountOut.toString()),
|
|
151
|
+
tokenIn: quoteToken.toString(),
|
|
152
|
+
tokenOut: raydiumParams.outputMint,
|
|
153
|
+
swapMode: 'ExactIn',
|
|
154
|
+
slippageBps: raydiumParams.slippageBps, // Use full slippage for simplicity
|
|
155
|
+
};
|
|
156
|
+
const jupiterQuoter = new JupiterQuoteProvider();
|
|
157
|
+
const jupiterQuote = await jupiterQuoter.getQuote(jupiterQuoteRequest);
|
|
158
|
+
if (!jupiterQuote.quote) {
|
|
159
|
+
throw new Error('Jupiter quote failed');
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
amountIn: BigInt(raydiumParams.amount),
|
|
163
|
+
amountOut: BigInt(jupiterQuote.quote.outAmount),
|
|
164
|
+
amountOutMin: BigInt(jupiterQuote.quote.otherAmountThreshold),
|
|
165
|
+
slippage: raydiumParams.slippageBps / 100,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return {
|
|
170
|
+
amountIn: BigInt(raydiumParams.amount),
|
|
171
|
+
amountOut: BigInt(expectedAmountOut.toString()),
|
|
172
|
+
amountOutMin: BigInt(minimumAmountOut.toString()),
|
|
173
|
+
slippage: raydiumParams.slippageBps / 100,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// We have to swap from input token to quote token and then estimate prebonded
|
|
179
|
+
let amountOutFromInput = new BN(raydiumParams.amount);
|
|
180
|
+
if (!quoteIsInput) {
|
|
181
|
+
let jupiterQuoteRequest = {
|
|
182
|
+
amount: BigInt(raydiumParams.amount),
|
|
183
|
+
tokenIn: raydiumParams.inputMint,
|
|
184
|
+
tokenOut: quoteToken.toString(),
|
|
185
|
+
swapMode: 'ExactIn',
|
|
186
|
+
slippageBps: raydiumParams.slippageBps, // Use full slippage for simplicity
|
|
187
|
+
};
|
|
188
|
+
const jupiterQuoter = new JupiterQuoteProvider();
|
|
189
|
+
const jupiterQuote = await jupiterQuoter.getQuote(jupiterQuoteRequest);
|
|
190
|
+
if (!jupiterQuote.quote) {
|
|
191
|
+
throw new Error('Jupiter quote failed');
|
|
192
|
+
}
|
|
193
|
+
// Calculate minimum amount with slippage applied
|
|
194
|
+
amountOutFromInput = new BN(jupiterQuote.quote.outAmount);
|
|
195
|
+
}
|
|
196
|
+
// Now estimate prebonded
|
|
197
|
+
let { expectedAmountOut, minimumAmountOut } = await this.estimatePrebondedToQuote(raydiumSdk, outputMintPk, poolInfo, 'buy', amountOutFromInput, new BN(raydiumParams.slippageBps));
|
|
198
|
+
return {
|
|
199
|
+
amountIn: BigInt(raydiumParams.amount),
|
|
200
|
+
amountOut: BigInt(expectedAmountOut.toString()),
|
|
201
|
+
amountOutMin: BigInt(minimumAmountOut.toString()),
|
|
202
|
+
slippage: raydiumParams.slippageBps / 100,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async checkPreboundedTokensSwapLaunchpad(raydiumSdk, raydiumMint) {
|
|
207
|
+
// Try cache first
|
|
208
|
+
const cacheKey = raydiumMint.toBase58();
|
|
209
|
+
const cached = launchpadPoolCache.get(cacheKey);
|
|
210
|
+
if (cached && Date.now() < cached.expiresAt) {
|
|
211
|
+
return cached.data;
|
|
212
|
+
}
|
|
213
|
+
// Check if either input or output mint is in the launchpad whitelisted tokens
|
|
214
|
+
// Check for input mint
|
|
215
|
+
for (const quoteToken of LAUNCHPAD_WHITELISTED_QUOTE_TOKENS) {
|
|
216
|
+
try {
|
|
217
|
+
const poolId = getPdaLaunchpadPoolId(LAUNCHPAD_PROGRAM, raydiumMint, quoteToken).publicKey;
|
|
218
|
+
const poolCacheKey = poolId.toBase58();
|
|
219
|
+
const cachedPoolInfo = launchpadPoolInfoCache.get(poolCacheKey);
|
|
220
|
+
const poolInfo = cachedPoolInfo && Date.now() < cachedPoolInfo.expiresAt
|
|
221
|
+
? cachedPoolInfo.data
|
|
222
|
+
: await raydiumSdk.launchpad.getRpcPoolInfo({ poolId });
|
|
223
|
+
launchpadPoolInfoCache.set(poolCacheKey, {
|
|
224
|
+
data: poolInfo,
|
|
225
|
+
expiresAt: Date.now() + TWO_SECONDS_MS,
|
|
226
|
+
});
|
|
227
|
+
// Cache positive result for a short period
|
|
228
|
+
launchpadPoolCache.set(cacheKey, {
|
|
229
|
+
data: [poolInfo, quoteToken],
|
|
230
|
+
expiresAt: Date.now() + TWO_SECONDS_MS,
|
|
231
|
+
});
|
|
232
|
+
return [poolInfo, quoteToken];
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
// Ignore and continue trying with next quote token
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
throw new Error('No launchpad pool found for the given token pair');
|
|
239
|
+
}
|
|
240
|
+
async estimatePrebondedToQuote(raydiumSdk, raydiumMint, poolInfo, trade_type, amount, slippage) {
|
|
241
|
+
const epochInfo = await raydiumSdk.connection.getEpochInfo();
|
|
242
|
+
const slot = await raydiumSdk.connection.getSlot();
|
|
243
|
+
const platformCacheKey = poolInfo.platformId.toBase58();
|
|
244
|
+
let platformInfoEntry = platformConfigCache.get(platformCacheKey);
|
|
245
|
+
if (!platformInfoEntry || Date.now() > platformInfoEntry.expiresAt) {
|
|
246
|
+
const accountInfo = await raydiumSdk.connection.getAccountInfo(poolInfo.platformId);
|
|
247
|
+
if (!accountInfo) {
|
|
248
|
+
throw new Error('Platform account not found');
|
|
249
|
+
}
|
|
250
|
+
platformInfoEntry = {
|
|
251
|
+
data: PlatformConfig.decode(accountInfo.data),
|
|
252
|
+
expiresAt: Date.now() + TEN_MINUTES_MS,
|
|
253
|
+
};
|
|
254
|
+
platformConfigCache.set(platformCacheKey, platformInfoEntry);
|
|
255
|
+
}
|
|
256
|
+
const platformInfo = platformInfoEntry.data;
|
|
257
|
+
const mintCacheKey = raydiumMint.toBase58();
|
|
258
|
+
let mintInfo = mintInfoCache.get(mintCacheKey);
|
|
259
|
+
if (!mintInfo) {
|
|
260
|
+
mintInfo = await raydiumSdk.token.getTokenInfo(raydiumMint);
|
|
261
|
+
mintInfoCache.set(mintCacheKey, mintInfo);
|
|
262
|
+
}
|
|
263
|
+
const shareFeeRate = new BN(0);
|
|
264
|
+
let expectedAmountOut;
|
|
265
|
+
let minimumAmountOut;
|
|
266
|
+
if (trade_type === 'buy') {
|
|
267
|
+
const res = Curve.buyExactIn({
|
|
268
|
+
poolInfo,
|
|
269
|
+
amountB: amount,
|
|
270
|
+
protocolFeeRate: poolInfo.configInfo.tradeFeeRate,
|
|
271
|
+
platformFeeRate: platformInfo.feeRate,
|
|
272
|
+
curveType: poolInfo.configInfo.curveType,
|
|
273
|
+
shareFeeRate,
|
|
274
|
+
creatorFeeRate: platformInfo.creatorFeeRate,
|
|
275
|
+
transferFeeConfigA: mintInfo.extensions.feeConfig
|
|
276
|
+
? {
|
|
277
|
+
transferFeeConfigAuthority: PublicKey.default,
|
|
278
|
+
withdrawWithheldAuthority: PublicKey.default,
|
|
279
|
+
withheldAmount: BigInt(0),
|
|
280
|
+
olderTransferFee: {
|
|
281
|
+
epoch: BigInt(mintInfo.extensions.feeConfig.olderTransferFee.epoch ?? epochInfo?.epoch ?? 0),
|
|
282
|
+
maximumFee: BigInt(mintInfo.extensions.feeConfig.olderTransferFee.maximumFee),
|
|
283
|
+
transferFeeBasisPoints: mintInfo.extensions.feeConfig.olderTransferFee.transferFeeBasisPoints,
|
|
284
|
+
},
|
|
285
|
+
newerTransferFee: {
|
|
286
|
+
epoch: BigInt(mintInfo.extensions.feeConfig.newerTransferFee.epoch ?? epochInfo?.epoch ?? 0),
|
|
287
|
+
maximumFee: BigInt(mintInfo.extensions.feeConfig.newerTransferFee.maximumFee),
|
|
288
|
+
transferFeeBasisPoints: mintInfo.extensions.feeConfig.newerTransferFee.transferFeeBasisPoints,
|
|
289
|
+
},
|
|
290
|
+
}
|
|
291
|
+
: undefined,
|
|
292
|
+
slot,
|
|
293
|
+
});
|
|
294
|
+
expectedAmountOut = new BN(res.amountA.amount.sub(res.amountA.fee ?? new BN(0)).toString());
|
|
295
|
+
minimumAmountOut = new BN(new Decimal(res.amountA.amount.sub(res.amountA.fee ?? new BN(0)).toString())
|
|
296
|
+
.mul((10000 - slippage.toNumber()) / 10000)
|
|
297
|
+
.toFixed(0));
|
|
298
|
+
}
|
|
299
|
+
else if (trade_type === 'sell') {
|
|
300
|
+
const res = Curve.sellExactIn({
|
|
301
|
+
poolInfo,
|
|
302
|
+
amountA: amount,
|
|
303
|
+
protocolFeeRate: poolInfo.configInfo.tradeFeeRate,
|
|
304
|
+
platformFeeRate: platformInfo.feeRate,
|
|
305
|
+
curveType: poolInfo.configInfo.curveType,
|
|
306
|
+
shareFeeRate,
|
|
307
|
+
creatorFeeRate: platformInfo.creatorFeeRate,
|
|
308
|
+
slot,
|
|
309
|
+
transferFeeConfigA: mintInfo.extensions.feeConfig
|
|
310
|
+
? {
|
|
311
|
+
transferFeeConfigAuthority: PublicKey.default,
|
|
312
|
+
withdrawWithheldAuthority: PublicKey.default,
|
|
313
|
+
withheldAmount: BigInt(0),
|
|
314
|
+
olderTransferFee: {
|
|
315
|
+
epoch: BigInt(mintInfo.extensions.feeConfig.olderTransferFee.epoch ?? epochInfo?.epoch ?? 0),
|
|
316
|
+
maximumFee: BigInt(mintInfo.extensions.feeConfig.olderTransferFee.maximumFee),
|
|
317
|
+
transferFeeBasisPoints: mintInfo.extensions.feeConfig.olderTransferFee.transferFeeBasisPoints,
|
|
318
|
+
},
|
|
319
|
+
newerTransferFee: {
|
|
320
|
+
epoch: BigInt(mintInfo.extensions.feeConfig.newerTransferFee.epoch ?? epochInfo?.epoch ?? 0),
|
|
321
|
+
maximumFee: BigInt(mintInfo.extensions.feeConfig.newerTransferFee.maximumFee),
|
|
322
|
+
transferFeeBasisPoints: mintInfo.extensions.feeConfig.newerTransferFee.transferFeeBasisPoints,
|
|
323
|
+
},
|
|
324
|
+
}
|
|
325
|
+
: undefined,
|
|
326
|
+
});
|
|
327
|
+
expectedAmountOut = new BN(res.amountB);
|
|
328
|
+
minimumAmountOut = new BN(new Decimal(res.amountB.toString()).mul((10000 - slippage.toNumber()) / 10000).toFixed(0));
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
throw new Error('Invalid trade type. Must be "buy" or "sell".');
|
|
332
|
+
}
|
|
333
|
+
return { expectedAmountOut, minimumAmountOut };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=raydium.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raydium.js","sourceRoot":"","sources":["../../../../src/utils/quote/raydium.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export const CROSS_CHAIN_TOKENS = {
|
|
|
7
7
|
[ChainID.Hyperliquid]: '0xb8ce59fc3717ada4c02eadf9682a9e934f625ebb', // USDT on Hyperliquid (No USDC on Hyperliquid)
|
|
8
8
|
[ChainID.Sui]: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC', // USDC on Sui
|
|
9
9
|
[ChainID.Optimism]: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', // USDC on Optimism
|
|
10
|
+
[ChainID.BSC]: '0x55d398326f99059ff775485246999027b3197955',
|
|
10
11
|
},
|
|
11
12
|
// Add more tokens as needed
|
|
12
13
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stablecoins-tokens.js","sourceRoot":"","sources":["../../../../src/utils/quote/stablecoins-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAW1C,MAAM,CAAC,MAAM,kBAAkB,GAA4C;IACzE,IAAI,EAAE;QACJ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,8CAA8C,EAAE,iBAAiB;QACnF,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAA4C,EAAE,eAAe;QAC7E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAA4C,EAAE,mBAAmB;QACrF,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,4CAA4C,EAAE,+CAA+C;QACpH,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,gFAAgF,EAAE,cAAc;QAC/G,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAA4C,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"stablecoins-tokens.js","sourceRoot":"","sources":["../../../../src/utils/quote/stablecoins-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAW1C,MAAM,CAAC,MAAM,kBAAkB,GAA4C;IACzE,IAAI,EAAE;QACJ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,8CAA8C,EAAE,iBAAiB;QACnF,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,4CAA4C,EAAE,eAAe;QAC7E,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAA4C,EAAE,mBAAmB;QACrF,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,4CAA4C,EAAE,+CAA+C;QACpH,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,gFAAgF,EAAE,cAAc;QAC/G,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,4CAA4C,EAAE,mBAAmB;QACrF,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,4CAA4C;KAC5D;IACD,4BAA4B;CAC7B,CAAC"}
|