wip2
This commit is contained in:
parent
f2f2cc9120
commit
be97e512b9
|
@ -24,7 +24,7 @@ const RoutesModal = ({
|
||||||
inputTokenSymbol,
|
inputTokenSymbol,
|
||||||
outputTokenInfo,
|
outputTokenInfo,
|
||||||
}: RoutesModalProps) => {
|
}: RoutesModalProps) => {
|
||||||
const { mangoTokens } = useJupiterMints()
|
const { jupiterTokens } = useJupiterMints()
|
||||||
|
|
||||||
const handleSelectRoute = (route: RouteInfo) => {
|
const handleSelectRoute = (route: RouteInfo) => {
|
||||||
setSelectedRoute(route)
|
setSelectedRoute(route)
|
||||||
|
@ -79,7 +79,7 @@ const RoutesModal = ({
|
||||||
<span key={index}>
|
<span key={index}>
|
||||||
<span>
|
<span>
|
||||||
{
|
{
|
||||||
mangoTokens.find(
|
jupiterTokens.find(
|
||||||
(item) =>
|
(item) =>
|
||||||
item?.address === r?.outputMint?.toString()
|
item?.address === r?.outputMint?.toString()
|
||||||
)?.symbol
|
)?.symbol
|
||||||
|
|
|
@ -9,9 +9,10 @@ import {
|
||||||
TransactionInstruction,
|
TransactionInstruction,
|
||||||
PublicKey,
|
PublicKey,
|
||||||
VersionedTransaction,
|
VersionedTransaction,
|
||||||
MessageCompiledInstruction,
|
|
||||||
Connection,
|
Connection,
|
||||||
MessageV0,
|
TransactionMessage,
|
||||||
|
AddressLookupTableAccount,
|
||||||
|
MessageAddressTableLookup,
|
||||||
// VersionedMessage,
|
// VersionedMessage,
|
||||||
} from '@solana/web3.js'
|
} from '@solana/web3.js'
|
||||||
import Decimal from 'decimal.js'
|
import Decimal from 'decimal.js'
|
||||||
|
@ -39,7 +40,7 @@ import useJupiterMints from '../../hooks/useJupiterMints'
|
||||||
import { RouteInfo } from 'types/jupiter'
|
import { RouteInfo } from 'types/jupiter'
|
||||||
import useJupiterSwapData from './useJupiterSwapData'
|
import useJupiterSwapData from './useJupiterSwapData'
|
||||||
// import { Transaction } from '@solana/web3.js'
|
// import { Transaction } from '@solana/web3.js'
|
||||||
import { SOUND_SETTINGS_KEY } from 'utils/constants'
|
import { JUPITER_V4_PROGRAM_ID, SOUND_SETTINGS_KEY } from 'utils/constants'
|
||||||
import useLocalStorageState from 'hooks/useLocalStorageState'
|
import useLocalStorageState from 'hooks/useLocalStorageState'
|
||||||
import { Howl } from 'howler'
|
import { Howl } from 'howler'
|
||||||
import { INITIAL_SOUND_SETTINGS } from '@components/settings/SoundSettings'
|
import { INITIAL_SOUND_SETTINGS } from '@components/settings/SoundSettings'
|
||||||
|
@ -54,12 +55,71 @@ type JupiterRouteInfoProps = {
|
||||||
slippage: number
|
slippage: number
|
||||||
}
|
}
|
||||||
|
|
||||||
const parseJupiterRoute = async (
|
const deserializeJupiterIxAndAlt = async (
|
||||||
|
connection: Connection,
|
||||||
|
swapTransaction: string
|
||||||
|
): Promise<[TransactionInstruction[], AddressLookupTableAccount[]]> => {
|
||||||
|
const parsedSwapTransaction = VersionedTransaction.deserialize(
|
||||||
|
Buffer.from(swapTransaction, 'base64')
|
||||||
|
)
|
||||||
|
const message = parsedSwapTransaction.message
|
||||||
|
const lookups = message.addressTableLookups
|
||||||
|
const addressLookupTablesResponses = await Promise.all(
|
||||||
|
message.addressTableLookups.map((alt) =>
|
||||||
|
connection.getAddressLookupTable(alt.accountKey)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
const addressLookupTables: AddressLookupTableAccount[] =
|
||||||
|
addressLookupTablesResponses
|
||||||
|
.map((alt) => alt.value)
|
||||||
|
.filter((x): x is AddressLookupTableAccount => x !== null)
|
||||||
|
const accountKeys = message.staticAccountKeys
|
||||||
|
|
||||||
|
const zippedLookupsAndAddressLookupTables: [
|
||||||
|
MessageAddressTableLookup,
|
||||||
|
AddressLookupTableAccount
|
||||||
|
][] = lookups.map((l, index) => [l, addressLookupTables[index]])
|
||||||
|
|
||||||
|
for (const [lookups, table] of zippedLookupsAndAddressLookupTables) {
|
||||||
|
accountKeys.concat(
|
||||||
|
lookups.writableIndexes.map((_, index) => table.state.addresses[index])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [lookups, table] of zippedLookupsAndAddressLookupTables) {
|
||||||
|
accountKeys.concat(
|
||||||
|
lookups.readonlyIndexes.map((_, index) => table.state.addresses[index])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
console.log('message before decompile', message)
|
||||||
|
|
||||||
|
const decompiledMessage = TransactionMessage.decompile(message, {
|
||||||
|
addressLookupTableAccounts: addressLookupTables,
|
||||||
|
})
|
||||||
|
|
||||||
|
const txInstructions: TransactionInstruction[] =
|
||||||
|
decompiledMessage.instructions.map(
|
||||||
|
(ix) =>
|
||||||
|
new TransactionInstruction({
|
||||||
|
data: ix.data,
|
||||||
|
programId: ix.programId,
|
||||||
|
keys: ix.keys.map((_, index) => ({
|
||||||
|
pubkey: accountKeys[index],
|
||||||
|
isSigner: message.isAccountSigner(index),
|
||||||
|
isWritable: message.isAccountWritable(index),
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
return [txInstructions, addressLookupTables]
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchJupiterTransaction = async (
|
||||||
connection: Connection,
|
connection: Connection,
|
||||||
selectedRoute: RouteInfo,
|
selectedRoute: RouteInfo,
|
||||||
userPublicKey: PublicKey,
|
userPublicKey: PublicKey,
|
||||||
slippage: number
|
slippage: number
|
||||||
): Promise<MessageCompiledInstruction[]> => {
|
): Promise<[TransactionInstruction[], AddressLookupTableAccount[]]> => {
|
||||||
const transactions = await (
|
const transactions = await (
|
||||||
await fetch('https://quote-api.jup.ag/v4/swap', {
|
await fetch('https://quote-api.jup.ag/v4/swap', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
@ -80,31 +140,22 @@ const parseJupiterRoute = async (
|
||||||
).json()
|
).json()
|
||||||
|
|
||||||
const { swapTransaction } = transactions
|
const { swapTransaction } = transactions
|
||||||
const parsedSwapTransaction = VersionedTransaction.deserialize(
|
|
||||||
Buffer.from(swapTransaction, 'base64')
|
const [ixs, alts] = await deserializeJupiterIxAndAlt(
|
||||||
|
connection,
|
||||||
|
swapTransaction
|
||||||
)
|
)
|
||||||
|
|
||||||
console.log('parsedSwapTransaction: ', parsedSwapTransaction)
|
// const isSetupIx = (pk: PublicKey): boolean => { k == ata_program || k == token_program };
|
||||||
|
const isJupiterIx = (pk: PublicKey): boolean =>
|
||||||
|
pk.toString() === JUPITER_V4_PROGRAM_ID
|
||||||
|
|
||||||
for (const alt of parsedSwapTransaction.message.addressTableLookups) {
|
console.log('ixs', ixs)
|
||||||
const lookupTableAccount = await connection.getAddressLookupTable(
|
|
||||||
alt.accountKey
|
|
||||||
)
|
|
||||||
const accountKeys = parsedSwapTransaction.message.staticAccountKeys
|
|
||||||
|
|
||||||
console.log('lookupTableAccount', lookupTableAccount)
|
const filtered_jup_ixs = ixs.filter((ix) => isJupiterIx(ix.programId))
|
||||||
}
|
console.log('filtered_jup_ixs', filtered_jup_ixs)
|
||||||
|
|
||||||
// const instructions = []
|
return [filtered_jup_ixs, alts]
|
||||||
// for (const ix of parsedSwapTransaction.instructions) {
|
|
||||||
// if (
|
|
||||||
// ix.programId.toBase58() === 'JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB'
|
|
||||||
// ) {
|
|
||||||
// instructions.push(ix)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
return parsedSwapTransaction.message.compiledInstructions
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const EMPTY_COINGECKO_PRICES = {
|
const EMPTY_COINGECKO_PRICES = {
|
||||||
|
@ -130,7 +181,7 @@ const SwapReviewRouteInfo = ({
|
||||||
const [feeValue] = useState<number | null>(null)
|
const [feeValue] = useState<number | null>(null)
|
||||||
const [submitting, setSubmitting] = useState(false)
|
const [submitting, setSubmitting] = useState(false)
|
||||||
const [coingeckoPrices, setCoingeckoPrices] = useState(EMPTY_COINGECKO_PRICES)
|
const [coingeckoPrices, setCoingeckoPrices] = useState(EMPTY_COINGECKO_PRICES)
|
||||||
const { mangoTokens } = useJupiterMints()
|
const { jupiterTokens } = useJupiterMints()
|
||||||
const { inputTokenInfo, outputTokenInfo } = useJupiterSwapData()
|
const { inputTokenInfo, outputTokenInfo } = useJupiterSwapData()
|
||||||
const inputBank = mangoStore((s) => s.swap.inputBank)
|
const inputBank = mangoStore((s) => s.swap.inputBank)
|
||||||
const [soundSettings] = useLocalStorageState(
|
const [soundSettings] = useLocalStorageState(
|
||||||
|
@ -189,7 +240,7 @@ const SwapReviewRouteInfo = ({
|
||||||
|
|
||||||
if (!mangoAccount || !group || !inputBank || !outputBank) return
|
if (!mangoAccount || !group || !inputBank || !outputBank) return
|
||||||
|
|
||||||
const ixs = await parseJupiterRoute(
|
const [ixs, alts] = await fetchJupiterTransaction(
|
||||||
connection,
|
connection,
|
||||||
selectedRoute,
|
selectedRoute,
|
||||||
mangoAccount.owner,
|
mangoAccount.owner,
|
||||||
|
@ -205,6 +256,7 @@ const SwapReviewRouteInfo = ({
|
||||||
amountIn: amountIn.toNumber(),
|
amountIn: amountIn.toNumber(),
|
||||||
outputMintPk: outputBank.mint,
|
outputMintPk: outputBank.mint,
|
||||||
userDefinedInstructions: ixs,
|
userDefinedInstructions: ixs,
|
||||||
|
userDefinedAlts: alts,
|
||||||
flashLoanType: { swap: {} },
|
flashLoanType: { swap: {} },
|
||||||
})
|
})
|
||||||
set((s) => {
|
set((s) => {
|
||||||
|
@ -480,7 +532,7 @@ const SwapReviewRouteInfo = ({
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
selectedRoute?.marketInfos.map((info, index) => {
|
selectedRoute?.marketInfos.map((info, index) => {
|
||||||
const feeToken = mangoTokens.find(
|
const feeToken = jupiterTokens.find(
|
||||||
(item) => item?.address === info.lpFee?.mint
|
(item) => item?.address === info.lpFee?.mint
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -7,6 +7,9 @@ export const MANGO_MINT = 'MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac'
|
||||||
export const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
|
export const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
|
||||||
export const OUTPUT_TOKEN_DEFAULT = 'SOL'
|
export const OUTPUT_TOKEN_DEFAULT = 'SOL'
|
||||||
|
|
||||||
|
export const JUPITER_V4_PROGRAM_ID =
|
||||||
|
'JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB'
|
||||||
|
|
||||||
export const IS_ONBOARDED_KEY = 'isOnboarded-0.1'
|
export const IS_ONBOARDED_KEY = 'isOnboarded-0.1'
|
||||||
|
|
||||||
export const SHOW_ZERO_BALANCES_KEY = 'show-zero-balances-0.1'
|
export const SHOW_ZERO_BALANCES_KEY = 'show-zero-balances-0.1'
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
|
|
||||||
"@blockworks-foundation/mango-v4@https://tylersssss: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@github.com/blockworks-foundation/mango-v4.git#main":
|
"@blockworks-foundation/mango-v4@https://tylersssss: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@github.com/blockworks-foundation/mango-v4.git#main":
|
||||||
version "0.0.1-beta.6"
|
version "0.0.1-beta.6"
|
||||||
resolved "https://tylersssss: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@github.com/blockworks-foundation/mango-v4.git#2cd8c048f3eb25b40a4124464a95240f362488b1"
|
resolved "https://tylersssss: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@github.com/blockworks-foundation/mango-v4.git#237ecd3847c4a2adefa93f57800455047bf91698"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@project-serum/anchor" "^0.25.0"
|
"@project-serum/anchor" "^0.25.0"
|
||||||
"@project-serum/serum" "^0.13.65"
|
"@project-serum/serum" "^0.13.65"
|
||||||
|
@ -395,9 +395,9 @@
|
||||||
integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==
|
integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==
|
||||||
|
|
||||||
"@noble/hashes@^1.1.2":
|
"@noble/hashes@^1.1.2":
|
||||||
version "1.1.4"
|
version "1.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.4.tgz#2611ebf5764c1bf754da7c7794de4fb30512336d"
|
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11"
|
||||||
integrity sha512-+PYsVPrTSqtVjatKt2A/Proukn2Yrz61OBThOCKErc5w2/r1Fh37vbDv0Eah7pyNltrmacjwTvdw3JoR+WE4TA==
|
integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==
|
||||||
|
|
||||||
"@noble/secp256k1@^1.6.3":
|
"@noble/secp256k1@^1.6.3":
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
|
|
Loading…
Reference in New Issue