UNPKG

@jup-ag/goosefx-ssl-sdk

Version:

SDK for interacting with GooseFX Single-sided Liquidity pools

1 lines 716 kB
{"version":3,"sources":["../src/layouts/controller.ts","../src/layouts/liquidityAccount.ts","../src/layouts/pair.ts","../src/layouts/ssl.ts","../src/layouts/stakingAccount.ts","../src/public/swap.ts","../src/constants/swap.ts","../src/public/utils.ts","../src/wasm/gfx_ssl_wasm_data.js","../src/wasm/gfx_ssl_wasm.js","../src/public/ssl.ts"],"sourcesContent":["import * as lo from '@solana/buffer-layout';\nimport { PublicKey } from \"@solana/web3.js\";\nimport { publicKey, u64 } from \"@solana/buffer-layout-utils\";\n\nexport interface ControllerLayout {\n sighash: Uint8Array,\n seed: Buffer,\n bump: number,\n admin: PublicKey,\n suspended: number,\n decimals: number,\n mint: PublicKey,\n dailyReward: bigint,\n totalStakingShare: bigint,\n stakingBalance: bigint,\n lastDistributionTime: bigint,\n withdrawFee: number,\n}\n\nexport const CONTROLLER_LAYOUT = lo.struct<ControllerLayout>([\n lo.blob(8, \"sighash\"),\n lo.blob(32, \"seed\"),\n lo.u8(\"bump\"),\n publicKey(\"admin\"),\n lo.u8(\"suspended\"),\n lo.u8(\"decimals\"),\n publicKey(\"mint\"),\n lo.blob(5, \"padding\"),\n u64(\"dailyReward\"),\n u64(\"totalStakingShare\"),\n u64(\"stakingBalance\"),\n u64(\"lastDistributionTime\"),\n lo.u16(\"withdrawFee\"),\n lo.blob(254, \"padding\")\n]);\n\nif (CONTROLLER_LAYOUT.span != 392 + 8) {\n throw new Error(\"CONTROLLER LAYOUT SIZE MISMATCH\");\n}","\nimport * as lo from '@solana/buffer-layout';\nimport { PublicKey } from \"@solana/web3.js\";\nimport { publicKey, u64 } from \"@solana/buffer-layout-utils\";\n\nexport interface LiquidityAccountLayout {\n sighash: Uint8Array,\n mint: PublicKey,\n bump: number,\n share: bigint,\n ptMinted: bigint,\n amountDeposited: bigint,\n}\n\nexport const LIQUIDITY_ACCOUNT_LAYOUT = lo.struct<LiquidityAccountLayout>([\n lo.blob(8, \"sighash\"),\n publicKey(\"mint\"),\n lo.u8(\"bump\"),\n lo.blob(7),\n u64(\"share\"),\n u64(\"ptMinted\"),\n u64(\"amountDeposited\"),\n lo.blob(248, \"padding\")\n]);\n\n\nif (LIQUIDITY_ACCOUNT_LAYOUT.span != 312 + 8) {\n throw new Error(\"LIQUIDITY_ACCOUNT LAYOUT SIZE MISMATCH\");\n}","import * as lo from \"@solana/buffer-layout\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { publicKey, u64, u128, bool } from \"@solana/buffer-layout-utils\";\n\ninterface Oracle {\n elements: Array<{ address: PublicKey; inverse: boolean; }>;\n n: bigint;\n padding: Uint8Array;\n}\n\ninterface OracleComponent {\n address: PublicKey;\n inverse: boolean;\n padding: Uint8Array;\n}\n\nexport const ORACLE_ELEMENT_LAYOUT = lo.struct<OracleComponent>([\n publicKey(\"address\"),\n bool(\"inverse\"),\n]);\n\nexport const ORACLE_LAYOUT = lo.struct<Oracle>([\n lo.seq(ORACLE_ELEMENT_LAYOUT, 4, \"elements\"),\n lo.blob(4, \"padding\"), // padding\n u64(\"n\"),\n lo.blob(8 * 8), // padding\n]);\n\n\nexport interface PairLayout {\n sighash: Uint8Array;\n controller: PublicKey;\n mints: Array<PublicKey>;\n oracles: Array<Oracle>;\n nOracle: bigint;\n fee_collector: PublicKey;\n A: number;\n feeRates: Array<number>;\n maxDelay: bigint;\n confidence: bigint;\n balancer: PublicKey;\n excessiveConfiscateRate: number;\n feeCollector: PublicKey;\n platformFeeRate: Array<number>;\n rebalanceRebates: Array<number>;\n volumes: Array<bigint>;\n enableRebalanceSwap: boolean;\n}\n\nexport const PAIR_LAYOUT = lo.struct<PairLayout>([\n lo.blob(8, \"sighash\"),\n publicKey(\"controller\"),\n lo.seq(publicKey(\"mint\"), 2, \"mints\"),\n lo.blob(8), // padding for alignment\n lo.seq(ORACLE_LAYOUT, 5, \"oracles\"),\n u64(\"nOracle\"),\n lo.u8(\"A\"),\n lo.seq(lo.u8(), 2, \"feeRates\"),\n lo.blob(5), // padding\n u64(\"maxDelay\"),\n u64(\"confidence\"),\n publicKey(\"balancer\"),\n lo.u16(\"excessiveConfiscateRate\"),\n publicKey(\"feeCollector\"),\n lo.seq(lo.u16(), 2, \"platformFeeRate\"),\n lo.blob(18),\n lo.seq(u128(\"volumes\"), 2, \"volumes\"),\n lo.blob(80),\n bool(\"enableRebalanceSwap\"),\n lo.blob(151, \"padding\"),\n]);\n\nif (PAIR_LAYOUT.span != 1528 + 8) {\n throw new Error(\"PAIR LAYOUT SIZE MISMATCH\");\n}\n","import * as lo from \"@solana/buffer-layout\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { publicKey, u64, bool } from \"@solana/buffer-layout-utils\";\n\nexport interface SSLLayout {\n sighash: Uint8Array;\n controller: PublicKey;\n mint: PublicKey;\n decimals: number;\n bump: number;\n ptBump: number;\n suspended: boolean;\n cranker: PublicKey;\n weight: bigint;\n swappedLiabilityNative: bigint;\n totalShare: bigint;\n}\n\nexport const SSL_LAYOUT = lo.struct<SSLLayout>([\n lo.blob(8, \"sighash\"),\n publicKey(\"controller\"),\n publicKey(\"mint\"),\n lo.u8(\"decimals\"),\n lo.u8(\"bump\"),\n lo.u8(\"ptBump\"),\n bool(\"suspended\"),\n publicKey(\"cranker\"),\n lo.blob(4), // padding\n u64(\"weight\"),\n lo.blob(8),\n u64(\"swappedLiabilityNative\"),\n u64(\"totalShare\"),\n\n lo.blob(256, \"padding\"),\n]);\n\nif (SSL_LAYOUT.span != 392 + 8) {\n throw new Error(`SSL LAYOUT SIZE MISMATCH\", ${SSL_LAYOUT.span}, ${SSL_LAYOUT.span - 8}`);\n}\n","import * as lo from '@solana/buffer-layout';\nimport { PublicKey } from \"@solana/web3.js\";\nimport { publicKey, u64 } from \"@solana/buffer-layout-utils\";\n\nexport interface StakingAccountLayout {\n sighash: Uint8Array,\n controller: PublicKey,\n bump: number,\n share: bigint,\n amountStaked: bigint,\n}\n\nexport const STAKING_ACCOUNT_LAYOUT = lo.struct<StakingAccountLayout>([\n lo.blob(8, \"sighash\"),\n publicKey(\"controller\"),\n lo.u8(\"bump\"),\n lo.blob(7),\n u64(\"share\"),\n u64(\"amountStaked\"),\n lo.blob(256, \"padding\")\n]);\n\n\nif (STAKING_ACCOUNT_LAYOUT.span != 312 + 8) {\n throw new Error(\"STAKING_ACCOUNT LAYOUT SIZE MISMATCH\");\n}","import { Program, Provider, Idl, BN } from \"@project-serum/anchor\";\nimport { PAIR_LAYOUT, SSL_LAYOUT } from \"../layouts\";\nimport {\n TOKEN_PROGRAM_ID,\n NATIVE_MINT,\n createAssociatedTokenAccountInstruction,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n ComputeBudgetProgram,\n PublicKey,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\nimport { ADDRESSES } from \"../constants\";\nimport * as SwapIDL from \"../idl/gfx_ssl_idl.json\";\nimport { findAssociatedTokenAddress } from \"./utils\";\nimport wasmData from \"../wasm/gfx_ssl_wasm_data\";\nimport init, * as wasm from \"../wasm/gfx_ssl_wasm\";\nimport { getAccount } from \"@solana/spl-token\";\nimport { SSL } from \"./ssl\";\nimport { parsePriceData, PriceStatus } from \"@pythnetwork/client\";\nexport { default as wasmData } from \"../wasm/gfx_ssl_wasm_data\";\n\nlet wasmInited = false;\n\nexport { wasm };\nexport interface Quote {\n amountIn: bigint;\n fee: bigint;\n amountOut: bigint;\n impact: number;\n swapPrice: number;\n instantPrice: number;\n oraclePrice: number;\n}\n\nexport class SyncSwap {\n constructor(\n public controller: PublicKey = ADDRESSES[\"MAINNET\"].GFX_CONTROLLER,\n public programId: PublicKey = ADDRESSES[\"MAINNET\"].SSL_PROGRAM_ID\n ) {}\n\n public getPairAddress = (tokenA: PublicKey, tokenB: PublicKey) => {\n const addresses = [tokenA.toBuffer(), tokenB.toBuffer()].sort(\n Buffer.compare\n );\n\n const pairArr = PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"GFX-SSL-Pair\", \"utf-8\"),\n this.controller.toBuffer(),\n addresses[0],\n addresses[1],\n ],\n this.programId\n );\n\n return pairArr[0];\n };\n\n getSyncQuoter(tokenIn: PublicKey, tokenOut: PublicKey) {\n const quoter = new SyncQuoter(\n this.programId,\n this.controller,\n tokenIn,\n tokenOut\n );\n\n return quoter;\n }\n}\n\nexport class Swap extends SyncSwap {\n constructor(\n public connection: Connection,\n controller: PublicKey = ADDRESSES[\"MAINNET\"].GFX_CONTROLLER,\n programId: PublicKey = ADDRESSES[\"MAINNET\"].SSL_PROGRAM_ID\n ) {\n super(controller, programId);\n }\n\n public async getWasm() {\n if (!wasmInited) {\n await loadWasm();\n }\n return wasm;\n }\n\n public createAssociatedTokenAccountIx = (\n mint: PublicKey,\n associatedAccount: PublicKey,\n owner: PublicKey\n ) =>\n createAssociatedTokenAccountInstruction(\n owner,\n associatedAccount,\n owner,\n mint\n );\n\n public getQuoter = async (\n tokenIn: PublicKey,\n tokenOut: PublicKey\n ): Promise<Quoter> => {\n let wasm = await this.getWasm();\n return new Quoter(\n this.connection,\n this.programId,\n this.controller,\n tokenIn,\n tokenOut,\n wasm\n );\n };\n\n public getQuote = async (\n tokenIn: PublicKey,\n tokenOut: PublicKey,\n inTokenAmount: bigint\n ): Promise<Quote> => {\n const quoter = await this.getQuoter(tokenIn, tokenOut);\n await quoter.prepare();\n return quoter.quote(inTokenAmount);\n };\n\n public getMinimumQuote = async (\n tokenA: PublicKey,\n tokenB: PublicKey,\n inTokenAmount: bigint,\n slippage: number\n ) => {\n const result = await this.getQuote(tokenA, tokenB, inTokenAmount);\n const minAmountOut =\n //@ts-ignore\n ((result.out as bigint) * (10000n - BigInt(slippage * 10000))) / 10000n;\n return minAmountOut;\n };\n\n public createSwapIx = async (\n tokenA: PublicKey,\n tokenB: PublicKey,\n inTokenAmount: bigint,\n minOut: bigint,\n wallet: PublicKey,\n referrerTokenAccount?: PublicKey // referrerTokenAccount in TokenA\n ): Promise<Array<TransactionInstruction>> => {\n let ixs = [];\n\n const addedComputeBudgetIX: TransactionInstruction =\n ComputeBudgetProgram.requestUnits({\n units: 1000000,\n additionalFee: 0,\n });\n\n ixs.push(addedComputeBudgetIX);\n\n const program = new Program(\n SwapIDL as Idl,\n this.programId.toBase58(),\n new Provider(this.connection, wallet as any, {\n commitment: \"processed\",\n })\n );\n const inst: any = program.instruction;\n const pair = this.getPairAddress(tokenA, tokenB);\n\n const [inTokenAtaUser, outTokenAtaUser] = [\n findAssociatedTokenAddress(wallet, tokenA),\n findAssociatedTokenAddress(wallet, tokenB),\n ];\n\n const sslIn = SSL.findAddress(this.controller, tokenA, this.programId);\n const sslOut = SSL.findAddress(this.controller, tokenB, this.programId);\n\n if (!(await this.connection.getAccountInfo(outTokenAtaUser))) {\n ixs.push(\n this.createAssociatedTokenAccountIx(tokenB, outTokenAtaUser, wallet)\n );\n }\n const pairData = await this.connection.getAccountInfo(pair);\n if (!pairData || !pairData.data)\n throw new Error(\"Token Pair do not exist yet.\");\n\n const tokenAccountB = findAssociatedTokenAddress(wallet, tokenB);\n if (\n tokenB.toBase58() !== NATIVE_MINT.toBase58() &&\n !(await this.connection.getParsedAccountInfo(tokenAccountB)).value\n ) {\n ixs.push(\n this.createAssociatedTokenAccountIx(tokenB, tokenAccountB, wallet)\n );\n }\n\n const decoded = PAIR_LAYOUT.decode(pairData.data);\n const { oracles, nOracle, feeCollector } = decoded;\n\n const n = Number(nOracle.toString());\n const remainingAccounts = [];\n if (referrerTokenAccount !== undefined) {\n remainingAccounts.push({\n isSigner: false,\n isWritable: true,\n pubkey: referrerTokenAccount,\n });\n }\n for (const oracle of oracles.slice(0, n)) {\n for (const elem of oracle.elements.slice(0, Number(oracle.n))) {\n remainingAccounts.push({\n isSigner: false,\n isWritable: false,\n pubkey: elem.address,\n });\n }\n }\n\n const accounts = {\n controller: this.controller,\n pair,\n sslIn: sslIn,\n sslOut: sslOut,\n\n liabilityVaultIn: findAssociatedTokenAddress(sslIn, tokenA),\n liabilityVaultOut: findAssociatedTokenAddress(sslOut, tokenB),\n\n swappedLiabilityVaultIn: findAssociatedTokenAddress(sslIn, tokenB),\n swappedLiabilityVaultOut: findAssociatedTokenAddress(sslOut, tokenA),\n\n userInAta: inTokenAtaUser,\n userOutAta: outTokenAtaUser,\n\n feeCollectorAta: findAssociatedTokenAddress(feeCollector, tokenA),\n\n userWallet: wallet,\n feeCollector: feeCollector,\n\n tokenProgram: TOKEN_PROGRAM_ID,\n };\n\n ixs.push(\n await inst.swap(\n new BN(inTokenAmount.toString()),\n new BN(minOut.toString()),\n { accounts, remainingAccounts }\n )\n );\n\n return ixs;\n };\n}\n\ntype Prepared = {\n pairData: Buffer;\n sslInData: Buffer;\n sslOutData: Buffer;\n liabilityIn: bigint;\n swappedLiabilityIn: bigint;\n liabilityOut: bigint;\n swappedLiabilityOut: bigint;\n registry: wasm.OracleRegistry;\n suspended: boolean;\n publishedSlots: Array<bigint>;\n pythStatus: Array<PriceStatus>;\n maxDelay: bigint;\n};\n\nexport const loadWasm = async () => {\n await init(Buffer.from(wasmData, \"base64\"));\n wasmInited = true;\n};\n\nclass SyncQuoter {\n constructor(\n public programId: PublicKey,\n public controller: PublicKey,\n public tokenIn: PublicKey,\n public tokenOut: PublicKey\n ) {}\n\n public getPairAddress = (tokenA: PublicKey, tokenB: PublicKey) => {\n const addresses = [tokenA.toBuffer(), tokenB.toBuffer()].sort(\n Buffer.compare\n );\n\n const pairArr = PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"GFX-SSL-Pair\", \"utf-8\"),\n this.controller.toBuffer(),\n addresses[0],\n addresses[1],\n ],\n this.programId\n );\n\n return pairArr[0];\n };\n\n getAccounts() {\n const pairAddress = this.getPairAddress(this.tokenIn, this.tokenOut);\n\n const sslIn = SSL.findAddress(\n this.controller,\n this.tokenIn,\n this.programId\n );\n\n const sslOut = SSL.findAddress(\n this.controller,\n this.tokenOut,\n this.programId\n );\n\n const liabilityVaultIn = findAssociatedTokenAddress(sslIn, this.tokenIn);\n\n const swappedLiabilityVaultIn = findAssociatedTokenAddress(\n sslIn,\n this.tokenOut\n );\n\n const liabilityVaultOut = findAssociatedTokenAddress(sslOut, this.tokenOut);\n\n const swappedLiabilityVaultOut = findAssociatedTokenAddress(\n sslOut,\n this.tokenIn\n );\n\n return {\n pairAddress,\n sslIn,\n sslOut,\n liabilityVaultIn,\n liabilityVaultOut,\n swappedLiabilityVaultIn,\n swappedLiabilityVaultOut,\n };\n }\n\n public getQuote(\n inTokenAmount: bigint,\n prepared: Prepared,\n silent: boolean,\n niter: number\n ): Quote {\n const swapWASM = wasm.swap;\n\n if (inTokenAmount === 0n)\n return {\n amountIn: 0n,\n fee: 0n,\n amountOut: 0n,\n impact: 0,\n swapPrice: 0,\n instantPrice: 0,\n oraclePrice: 0,\n };\n\n let out: wasm.SwapResult;\n\n try {\n out = swapWASM(\n prepared.sslInData.slice(),\n prepared.sslOutData.slice(),\n prepared.pairData.slice(),\n prepared.liabilityIn,\n prepared.liabilityOut,\n prepared.swappedLiabilityIn,\n prepared.swappedLiabilityOut,\n prepared.registry,\n inTokenAmount,\n niter\n );\n } catch (e) {\n if (silent) {\n return {\n amountIn: inTokenAmount,\n fee: 0n,\n amountOut: 0n,\n impact: 1,\n swapPrice: 0,\n instantPrice: 0,\n oraclePrice: 0,\n };\n } else {\n throw e;\n }\n }\n\n return {\n amountIn: out.amount_in,\n fee: out.fee_paid,\n amountOut: out.amount_out,\n impact: out.price_impact,\n swapPrice: out.swap_price,\n instantPrice: out.insta_price,\n oraclePrice: out.oracle_price,\n };\n }\n}\nclass Quoter extends SyncQuoter {\n private prepared: Prepared | undefined = undefined;\n\n constructor(\n public connection: Connection,\n programId: PublicKey,\n controller: PublicKey,\n tokenIn: PublicKey,\n tokenOut: PublicKey,\n public wasm: any\n ) {\n super(programId, controller, tokenIn, tokenOut);\n }\n\n async prepare() {\n const pair = this.getPairAddress(this.tokenIn, this.tokenOut);\n const pairData = await this.connection.getAccountInfo(pair);\n if (!pairData) throw \"Cannot get Pair\";\n\n const sslIn = SSL.findAddress(\n this.controller,\n this.tokenIn,\n this.programId\n );\n const sslInData = await this.connection.getAccountInfo(sslIn);\n if (!sslInData) throw \"Cannot get SSL for tokenIn\";\n\n const sslOut = SSL.findAddress(\n this.controller,\n this.tokenOut,\n this.programId\n );\n const sslOutData = await this.connection.getAccountInfo(sslOut);\n if (!sslOutData) throw \"Cannot get SSL for tokenOut\";\n\n const liabilityVaultIn = await getAccount(\n this.connection,\n findAssociatedTokenAddress(sslIn, this.tokenIn)\n );\n\n const swappedLiabilityVaultIn = await getAccount(\n this.connection,\n findAssociatedTokenAddress(sslIn, this.tokenOut)\n );\n\n const liabilityVaultOut = await getAccount(\n this.connection,\n findAssociatedTokenAddress(sslOut, this.tokenOut)\n );\n\n const swappedLiabilityVaultOut = await getAccount(\n this.connection,\n findAssociatedTokenAddress(sslOut, this.tokenIn)\n );\n\n const OracleRegistry = wasm.OracleRegistry;\n const decoded = PAIR_LAYOUT.decode(pairData.data);\n const { maxDelay, oracles, nOracle } = decoded;\n const n = Number(nOracle.toString());\n let publishedSlots = [];\n let pythStatus = [];\n const registry = new OracleRegistry();\n for (const oracle of oracles.slice(0, n)) {\n const n = Number(oracle.n);\n\n for (const elem of oracle.elements.slice(0, n)) {\n const acctInfo = await this.connection.getAccountInfo(elem.address);\n if (acctInfo?.data) {\n registry.add_oracle(elem.address.toBuffer(), acctInfo.data);\n let priceData = parsePriceData(acctInfo.data);\n publishedSlots.push(priceData.aggregate.publishSlot);\n pythStatus.push(priceData.aggregate.status);\n }\n }\n }\n\n this.prepared = {\n pairData: pairData.data,\n sslInData: sslInData.data,\n sslOutData: sslOutData.data,\n liabilityIn: liabilityVaultIn.amount,\n swappedLiabilityIn: swappedLiabilityVaultIn.amount,\n liabilityOut: liabilityVaultOut.amount,\n swappedLiabilityOut: swappedLiabilityVaultOut.amount,\n registry: registry,\n suspended:\n new SSL(sslInData).isSuspended() || new SSL(sslOutData).isSuspended(),\n publishedSlots: publishedSlots.map((val) => BigInt(val)),\n pythStatus,\n maxDelay: maxDelay,\n };\n }\n\n public isSuspended(currentSlot?: bigint): boolean {\n if (this.prepared === undefined) throw \"Run prepare first\";\n let suspended = this.prepared.suspended;\n if (currentSlot !== undefined) {\n for (const pubSlot of this.prepared.publishedSlots) {\n suspended ||= pubSlot + this.prepared.maxDelay <= currentSlot;\n }\n }\n for (const pythStatus of this.prepared.pythStatus) {\n suspended ||= pythStatus !== PriceStatus.Trading;\n }\n return suspended;\n }\n\n public quote(\n inTokenAmount: bigint,\n silent: boolean = true,\n niter: number = 64\n ): Quote {\n const swapWASM = wasm.swap;\n\n if (inTokenAmount === 0n)\n return {\n amountIn: 0n,\n fee: 0n,\n amountOut: 0n,\n impact: 0,\n swapPrice: 0,\n instantPrice: 0,\n oraclePrice: 0,\n };\n\n if (this.prepared === undefined) throw \"Run prepare first\";\n const prepared = this.prepared;\n\n return this.getQuote(inTokenAmount, prepared, silent, niter);\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nexport type Network = \"MAINNET\" | \"DEVNET\";\n\nexport const ADDRESSES = {\n MAINNET: {\n CONTROLLER_PROGRAM_ID: new PublicKey(\"8KJx48PYGHVC9fxzRRtYp4x4CM2HyYCm2EjVuAP4vvrx\"),\n SSL_PROGRAM_ID: new PublicKey(\"7WduLbRfYhTJktjLw5FDEyrqoEv61aTTCuGAetgLjzN5\"),\n GFX_CONTROLLER: new PublicKey(\"8CxKnuJeoeQXFwiG6XiGY2akBjvJA5k3bE52BfnuEmNQ\"),\n },\n DEVNET: {\n CONTROLLER_PROGRAM_ID: new PublicKey(\"3Gwyhoudx8XgYry8dzKQ2GGsofkUdm7VZUvddHxchL3x\"),\n SSL_PROGRAM_ID: new PublicKey(\"JYe7AcuQ7CqhkGvchJGvSKF8ei41FuDKb1h47qkbFNf\"),\n GFX_CONTROLLER: new PublicKey(\"ApkmzBaTPUAeVj3QuqDcz6iLE6xZSLd29nke4McqrKw5\"),\n }\n};\n\n","import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey } from \"@solana/web3.js\";\n\n\nexport function findAssociatedTokenAddress(\n walletAddress: PublicKey,\n tokenMintAddress: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n walletAddress.toBuffer(),\n TOKEN_PROGRAM_ID.toBuffer(),\n tokenMintAddress.toBuffer(),\n ],\n ASSOCIATED_TOKEN_PROGRAM_ID\n )[0];\n};\n","const data = 'AGFzbQEAAAABx4OAgAA6YAAAYAABf2ABfwBgAX8Bf2ABfwF+YAF/AXxgAn9/AGACf38Bf2ADf39/AGADf39/AX9gBH9/f38AYAR/f39/AX9gBX9/f39/AGAFf39/f38Bf2AGf39/f39/AGAGf39/f39/AX9gB39/f39/f38AYAd/f39/f39/AX9gDn9/f39/f39+fn5+f35/AGAHf39/f39/fgBgB39/f39/f34Bf2AJf39/f39/fn5/AGAJf39/f39/fn5+AGAHf39/f39+fwBgCH9/f39/fn5/AX9gBX9/f39+AGAGf39/f35/AX9gC39/f39+fn5+f35/AGAEf39/fgBgBH9/f34Bf2AGf39/fn5/AGADf39+AGADf39+AX9gBX9/fn5/AX9gBX9/fX9/AGAFf398f38AYAJ/fgBgAn9+AX9gA39+fwBgCH9+f35/f39/AGAJf35/fn9/f39/AGADf35+AGAEf35+fwBgBH9+fn4AYAV/fn5+fgBgBH99f38AYAJ/fABgAn98AX9gBH98f38AYAR/fH9/AX9gCX98fHx8fHx8fwBgA35/fwF/YAJ+fgF+YAJ+fgF8YAF8AX9gAXwBfGACfH8BfGACfHwBfAKdjYCAADEDd2JnFV9fd2JpbmRnZW5fc3RyaW5nX25ldwAHA3diZxVfX3diZ19pbnN0cnVjdGlvbl9uZXcAAwN3YmcVX193YmluZGdlbl9udW1iZXJfbmV3ADYDd2JnGl9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmAAIDd2JnFV9fd2JpbmRnZW5fc3RyaW5nX2dldAAGA3diZxdfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZAADA3diZxVfX3diaW5kZ2VuX251bWJlcl9nZXQABgN3YmcQX193YmdfcHVia2V5X25ldwADA3diZxxfX3diZ19kZWJ1Z183MzM5NWNhNTY2OTEyMGFlAAIDd2JnHF9fd2JnX2Vycm9yXzExODliNWRlNmRkMWI4MDgAAgN3YmcbX193YmdfaW5mb18zZjFkODYzNmJhNTgxMjhmAAIDd2JnGl9fd2JnX2xvZ18xOGZmZGZlNWE0MWJkNzgxAAIDd2JnG19fd2JnX3dhcm5fZGZmYTc0Y2FiNzhkMzUzMQACA3diZxpfX3diZ19uZXdfYWJkYTc2ZTg4M2JhOGE1ZgABA3diZxxfX3diZ19zdGFja182NTgyNzlmZTQ0NTQxY2Y2AAYDd2JnHF9fd2JnX2Vycm9yX2Y4NTE2NjdhZjcxYmNmYzYABgN3YmcbX193Ymdfc2VsZl83ZWVkZTFmNDQ4OGJmMzQ2AAEDd2JnHV9fd2JnX2NyeXB0b19jOTA5ZmI0MjhkY2JkZGI2AAMDd2JnH19fd2JnX21zQ3J5cHRvXzUxMWVlZmVmYmZjNzBhZTQAAwN3YmctX193Ymdfc3RhdGljX2FjY2Vzc29yX01PRFVMRV9lZjNhYTJlYjI1MTE1OGE1AAEDd2JnHl9fd2JnX3JlcXVpcmVfOTAwZDVjMzk4NGZlNzcwMwAJA3diZyZfX3diZ19nZXRSYW5kb21WYWx1ZXNfMzA3MDQ5MzQ1ZDBiZDg4YwADA3diZyZfX3diZ19nZXRSYW5kb21WYWx1ZXNfY2QxNzU5MTU1MTFmNzA1ZQAGA3diZyVfX3diZ19yYW5kb21GaWxsU3luY184NWIzZjRjNTJjNTZjMzEzAAgDd2JnGl9fd2JnX25ld19iMzNlMWNlNjM5MDAwNjhmAAEDd2JnFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24AAwN3YmcUX193YmluZGdlbl9pc19vYmplY3QAAwN3YmcbX193YmdfbmV4dF8wYjk1ODUyZGIzYTBmNTY4AAMDd2JnG19fd2JnX25leHRfMzJjZTQ2MDNlMTlhOWFkOAADA3diZxtfX3diZ19kb25lX2IyYjIzYWRjYWZkNmQzNzIAAwN3YmccX193YmdfdmFsdWVfOWJjMzI3MWYyNTU2YTYyMQADA3diZx9fX3diZ19pdGVyYXRvcl83ZTBhYzY5N2ZhYTg3MmYzAAEDd2JnGl9fd2JnX2dldF8wMjk5OWJiMmNhZWVmZjYxAAcDd2JnG19fd2JnX2NhbGxfODc1ZDRlYTlhYmJlYzg4ZgAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzhmZjY5MTE4YWIyMzMxOWIAAwN3YmcaX193Ymdfc2V0XzVlYWNkZjU0YzlhYWZiZGYACAN3YmceX193YmdfaXNBcnJheV9jZjY4MjliMWYyNWJhMGYxAAMDd2JnG19fd2JnX3B1c2hfMDllYmNiYmQ2ZmIyN2FlMQAHA3diZx1fX3diZ192YWx1ZXNfYTI2NzU3NWZhN2I5OTA3NQADA3diZx1fX3diZ19idWZmZXJfOGRhYmMzYTRjY2E3ZTA2NQADA3diZxpfX3diZ19uZXdfODFiZGRkYmUyM2E0Yzk5MAADA3diZxpfX3diZ19zZXRfNTc3OGIxNTJhN2VjMjU4YwAIA3diZx1fX3diZ19sZW5ndGhfNjFmMTk0OWFhN2Y2ZmQzOQADA3diZyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfOGE4NTM3ZjQ2ZTA1NjQ3NAADA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzZiMmIzMmVmNWJmYzlhNTUAAwN3YmcfX193Ymdfc3ViYXJyYXlfMjQ3MDkyZTU5YjU2MzM5YQAJA3diZxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAGA3diZxBfX3diaW5kZ2VuX3Rocm93AAYDd2JnEV9fd2JpbmRnZW5fbWVtb3J5AAEDuYaAgAC3BggICgwbEggIBwYDCAgIBgcHDAoKCg4oBgcICAgGCAYICgYKBgcKCAwHAgwKCAYGBgYICgcIBggICAoJCTIxDwYGDCwGCwgIBgcOBgoKCg4GCQ4xCQYNLwcIGQgnCAcMChUMCQoDDgcHCAgAFwcGBjcZAwYGDggGDBMGBwMOBwYCAwceBgYHBhYIAwoGCgcIAgoKDQcCBgoHBhA1CBwJCQkJCQcUBxgQBgcRCA0HCAoICAYGAzUOBwkHCQcCBwcHBwkHBwcJBwYHBgYHBgcJBhoIDR8zBwcGBzcIIQkGHQgJKQYGCAYGAgcIAgYGAQYGCAYHByAHBwcGBwcGCQcDBgcCCQYHCAgdCgYDKQgIBiUGCAYIBwcGDAcHBgIIBwcGBi4ICAMHBgcGHwYBAwICBwMGBggGBggKCAYIBgYIAioJBwYGBgMHBgYGAwcIBwYHBgYKCgoKCg4KBwcDBwcHBgkMBgICBgcCCAYGAwgGCAgKAggsBgkJCQcHAyYMAwYHBysIBgIGBwYIKwc4AgcICAgGBgYIBwcIBgwGCAgHBwcGBwcHBwcHKioHBgYGCAcHBgMCBgYCCQkICQkCCQgsCQklCQkHLAkJCQcsCwYIKwoABggGBgcGBwYHBwgsBwIIAAYDAgIDNAcHBwcIBwcHBwcHCgcHJCQuLi4uBgYGAgIIAgIDAiQIDAgKBiQEBAUFBQUDBgcHBwYCAwcBBAgBCAIGBwgJAQgPBwwjDQwNDCIGAgICAgoCBwICBgYJBgMDOQYDBgIHCQc3BwcDBwcHAgsHBwMHBgcHAgcHAgMHBgcHAgcHBwcHBgcGBwMHCAcHAiQHBwcHBwYDAgMKBwMDAwYHBgcIBwoIAwcDCQgICAkDAwYDBwcHCAkJBwcDBwcHBwYHBwcHCAcIBwcHBwcGAAAHBwcDAwMDBwYGBgYGBgYGCAgIBgYGCQcHBwcJCQkJBwcHBwcHBwcHAgICAgIGBgMHBwcHBwMDAgYGBgYBBgYGAwMABAgDAwMDAzc3BAMDBAMBBwEEBAQAAwEBAw0LCQcDAwQEAwICAgICAgICAgICAgICAgIGAgACAgICAgICAgICAgICAgIEh4CAgAABcAH2AfYBBYOAgIAAAQASBomAgIAAAX8BQYCAwAALB56QgIAASwZtZW1vcnkCABlfX3diZ19vcmFjbGVyZWdpc3RyeV9mcmVlAOUDEm9yYWNsZXJlZ2lzdHJ5X25ldwDLBBlvcmFjbGVyZWdpc3RyeV9hZGRfb3JhY2xlAJYBFV9fd2JnX3N3YXByZXN1bHRfZnJlZQCvBB5fX3diZ19nZXRfc3dhcHJlc3VsdF9hbW91bnRfaW4AzAQeX193Ymdfc2V0X3N3YXByZXN1bHRfYW1vdW50X2luALsEHV9fd2JnX2dldF9zd2FwcmVzdWx0X2ZlZV9wYWlkALwEHV9fd2JnX3NldF9zd2FwcmVzdWx0X2ZlZV9wYWlkAKUEH19fd2JnX2dldF9zd2FwcmVzdWx0X2Ftb3VudF9vdXQAvQQfX193Ymdfc2V0X3N3YXByZXN1bHRfYW1vdW50X291dACmBCFfX3diZ19nZXRfc3dhcHJlc3VsdF9wcmljZV9pbXBhY3QAvgQhX193Ymdfc2V0X3N3YXByZXN1bHRfcHJpY2VfaW1wYWN0AKcEH19fd2JnX2dldF9zd2FwcmVzdWx0X3N3YXBfcHJpY2UAvwQfX193Ymdfc2V0X3N3YXByZXN1bHRfc3dhcF9wcmljZQCoBCBfX3diZ19nZXRfc3dhcHJlc3VsdF9pbnN0YV9wcmljZQDABCBfX3diZ19zZXRfc3dhcHJlc3VsdF9pbnN0YV9wcmljZQCpBCFfX3diZ19nZXRfc3dhcHJlc3VsdF9vcmFjbGVfcHJpY2UAwQQhX193Ymdfc2V0X3N3YXByZXN1bHRfb3JhY2xlX3ByaWNlAKoEGV9fd2JnX2dldF9zd2FwcmVzdWx0X2l0ZXIAwgQZX193Ymdfc2V0X3N3YXByZXN1bHRfaXRlcgCrBARzd2FwADYWX193YmdfdHJhbnNhY3Rpb25fZnJlZQCxAhd0cmFuc2FjdGlvbl9jb25zdHJ1Y3RvcgClAhN0cmFuc2FjdGlvbl9tZXNzYWdlALEBF3RyYW5zYWN0aW9uX21lc3NhZ2VEYXRhAPcCEnRyYW5zYWN0aW9uX3ZlcmlmeQDzAhd0cmFuc2FjdGlvbl9wYXJ0aWFsU2lnbgDhARR0cmFuc2FjdGlvbl9pc1NpZ25lZAC6AhN0cmFuc2FjdGlvbl90b0J5dGVzAMgDFXRyYW5zYWN0aW9uX2Zyb21CeXRlcwDSAhJfX3diZ19rZXlwYWlyX2ZyZWUAvAMTa2V5cGFpcl9jb25zdHJ1Y3RvcgDbAg9rZXlwYWlyX3RvQnl0ZXMAuQIRa2V5cGFpcl9mcm9tQnl0ZXMAwwIOa2V5cGFpcl9wdWJrZXkA3AIWX193YmdfaW5zdHJ1Y3Rpb25fZnJlZQC0Ax9zeXN0ZW1pbnN0cnVjdGlvbl9jcmVhdGVBY2NvdW50AIsCJ3N5c3RlbWluc3RydWN0aW9uX2NyZWF0ZUFjY291bnRXaXRoU2VlZADWARhzeXN0ZW1pbnN0cnVjdGlvbl9hc3NpZ24ApgIgc3lzdGVtaW5zdHJ1Y3Rpb25fYXNzaWduV2l0aFNlZWQAggIac3lzdGVtaW5zdHJ1Y3Rpb25fdHJhbnNmZXIApAIic3lzdGVtaW5zdHJ1Y3Rpb25fdHJhbnNmZXJXaXRoU2VlZADUARpzeXN0ZW1pbnN0cnVjdGlvbl9hbGxvY2F0ZQC/AiJzeXN0ZW1pbnN0cnVjdGlvbl9hbGxvY2F0ZVdpdGhTZWVkAIACJHN5c3RlbWluc3RydWN0aW9uX2NyZWF0ZU5vbmNlQWNjb3VudAC3AiVzeXN0ZW1pbnN0cnVjdGlvbl9hZHZhbmNlTm9uY2VBY2NvdW50AKcCJnN5c3RlbWluc3RydWN0aW9uX3dpdGhkcmF3Tm9uY2VBY2NvdW50AI4CJ3N5c3RlbWluc3RydWN0aW9uX2F1dGhvcml6ZU5vbmNlQWNjb3VudACQAhJfX3diZ19tZXNzYWdlX2ZyZWUAywIiX193YmdfZ2V0X21lc3NhZ2VfcmVjZW50X2Jsb2NraGFzaADgAiJfX3diZ19zZXRfbWVzc2FnZV9yZWNlbnRfYmxvY2toYXNoAJsCEV9fd2JnX3B1YmtleV9mcmVlALEEEnB1YmtleV9jb25zdHJ1Y3RvcgCVAg9wdWJrZXlfdG9TdHJpbmcA8gIQcHVia2V5X2lzT25DdXJ2ZQCqAw1wdWJrZXlfZXF1YWxzAK8DDnB1YmtleV90b0J5dGVzAMoCFXB1YmtleV9jcmVhdGVXaXRoU2VlZACoARtwdWJrZXlfY3JlYXRlUHJvZ3JhbUFkZHJlc3MA3wEZcHVia2V5X2ZpbmRQcm9ncmFtQWRkcmVzcwCgAxNzb2xhbmFfcHJvZ3JhbV9pbml0AIAEEGhhc2hfY29uc3RydWN0b3IAlgINaGFzaF90b1N0cmluZwD0AgtoYXNoX2VxdWFscwCwAwxoYXNoX3RvQnl0ZXMAkgMXX193YmdfaW5zdHJ1Y3Rpb25zX2ZyZWUA7gIYaW5zdHJ1Y3Rpb25zX2NvbnN0cnVjdG9yAM4EEWluc3RydWN0aW9uc19wdXNoAKoBD19fd2JnX2hhc2hfZnJlZQCyBBFfX3diaW5kZ2VuX21hbGxvYwCSBBJfX3diaW5kZ2VuX3JlYWxsb2MA1AQfX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcgDMBQ9fX3diaW5kZ2VuX2ZyZWUAhQUUX193YmluZGdlbl9leG5fc3RvcmUAoAUJ8IOAgAABAEEBC/UBxgbNAqsBxwacBpsGmgatBKwErQbPBc0F0AXOBcgG4wPqBJAFkwPTBcUD1AWCBeEE7wPuAdQDyQb3BJQDgQWXBJYFjAPiBPAD7wHKBuYD5wHNA84C3gPLBtcFmAXMBtwD2wPjBPID8AGHBKAGnwaeBtUFzQa1BeQCzgaKBo0GiwaMBokGzwbnA+kBzgPkBPMD8gHVA9AG9APRBsUCxAKPBrAGsQaZBY4GkgXuBMoExgXSBsUEmgXEBNMGngT1BN0EhwPZBNsE1wTsBOUE3gTcBN8E2gTUBpgE1QazBtYG1wbZBdsF3QWcBcoF2QaEBZkEmgTcBdoFjQSeBYoEnwW0BN8C2gb9AdsG5APt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