{"version":3,"file":"js/api.ce580db1.js","mappings":"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","sources":["webpack://fluxbeam/./src/api/endpoints/automation.ts","webpack://fluxbeam/./src/api/endpoints/fluxbot.ts","webpack://fluxbeam/./src/api/endpoints/orders.ts","webpack://fluxbeam/./src/api/endpoints/tokens.ts","webpack://fluxbeam/./src/api/endpoints/stats.ts","webpack://fluxbeam/./src/api/endpoints/swap.ts","webpack://fluxbeam/./src/api/endpoints/traders.ts","webpack://fluxbeam/./src/api/endpoints/transfer.ts","webpack://fluxbeam/./src/api/endpoints/waitlist.ts","webpack://fluxbeam/./src/api/fluxbeam/constants.ts","webpack://fluxbeam/./src/api/fluxbeam/feeManagerAutomated.ts","webpack://fluxbeam/./src/api/fluxbeam/spl22.ts","webpack://fluxbeam/./src/api/fluxbeam/fluxBeamClient.ts","webpack://fluxbeam/./src/api/jupiter/client.ts","webpack://fluxbeam/./src/api/marshmallow/buffer-layout.ts","webpack://fluxbeam/./src/api/marshmallow/index.ts","webpack://fluxbeam/./src/api/nft_fraction/getParsedNFTAccountsByOwner.ts","webpack://fluxbeam/./src/api/nft_fraction/layouts.ts","webpack://fluxbeam/./src/api/nft_fraction/client.ts","webpack://fluxbeam/./src/api/layouts/serum.ts","webpack://fluxbeam/./src/api/openbook.ts","webpack://fluxbeam/./src/api/rugcheck/client.ts","webpack://fluxbeam/./src/api/token/token.ts","webpack://fluxbeam/./src/api/token2022/confidential_transfer.ts","webpack://fluxbeam/./src/api/token2022/instruction_ext.ts","webpack://fluxbeam/./src/api/token2022/token_2022.ts","webpack://fluxbeam/./src/api/token_locker/tokenLockerClient.ts","webpack://fluxbeam/./src/api/token_migration/layouts.ts","webpack://fluxbeam/./src/api/token_migration/client.ts","webpack://fluxbeam/./src/api/token_swap/instructions.ts","webpack://fluxbeam/./src/api/token_swap/client.ts","webpack://fluxbeam/./src/api/token_swap/constants.ts","webpack://fluxbeam/./src/api/token_swap/create_token_pool.ts","webpack://fluxbeam/./src/api/token_swap/errors.ts","webpack://fluxbeam/./src/api/token_swap/math.ts","webpack://fluxbeam/./src/api/token_swap/layouts.ts","webpack://fluxbeam/./src/api/fluxbot/client.js","webpack://fluxbeam/./src/api/fluxbot/wallet_adapter.js","webpack://fluxbeam/./src/api/nft_fraction/user_assets.js"],"sourcesContent":["import { fetchFluxBotAction } from \"@/api/endpoints/fluxbot\";\nimport { IStrategy } from \"@/shared\";\n\nexport function indexAutomations(wallet: string): Promise {\n\treturn fetchFluxBotAction(wallet, \"auto_index\", {\n\t\tdest: wallet,\n\t});\n}\n\nexport function showAutomations({\n\twallet,\n\tid,\n}: {\n\twallet: string;\n\tid: string;\n}): Promise {\n\treturn fetchFluxBotAction(wallet, \"auto_show\", {\n\t\tdata: id,\n\t});\n}\n\nexport function createAutomation({\n\twallet,\n\tstrategy,\n}: {\n\twallet: string;\n\tstrategy: IStrategy;\n}): Promise {\n\treturn fetchFluxBotAction(wallet, \"auto_create\", {\n\t\twallet,\n\t\tstrategy,\n\t});\n}\n\nexport function closeAutomation({\n\twallet,\n\tid,\n}: {\n\twallet: string;\n\tid: string;\n}): Promise {\n\treturn fetchFluxBotAction(wallet, \"auto_cancel\", {\n\t\tdata: id,\n\t});\n}\n","import { getFluxBotToken } from \"@/shared\";\nimport { useSettingsStore } from \"@/pinia\";\n\nexport async function fetchFluxBotAction(\n\twallet: string,\n\taction: string,\n\tpayload?: any\n): Promise {\n\tconst webSettings = useSettingsStore().settings;\n\n\tconst res = await fetch(\"https://gateway.fluxbeam.xyz/bot/actions\", {\n\t\tmethod: \"POST\",\n\t\tbody: JSON.stringify({\n\t\t\twallet: wallet,\n\t\t\taction: action,\n\t\t\tpayload: payload,\n\t\t\tsettings: {\n\t\t\t\tslippage: webSettings.slippage,\n\t\t\t\tplatforms: 503,\n\t\t\t\tmevProtect: webSettings.validatorTip !== null || webSettings.validatorTip != 0,\n\t\t\t\tvalidatorTip: \t\t\t\t\twebSettings.validatorTip === null\n\t\t\t\t\t? webSettings.validatorLevel\n\t\t\t\t\t: `${webSettings.validatorTip}`,\n\t\t\t\tpriorityFee:\n\t\t\t\t\twebSettings.priorityFeeMax === null\n\t\t\t\t\t\t? webSettings.priorityLevel\n\t\t\t\t\t\t: `${webSettings.priorityFeeMax}`,\n\t\t\t},\n\t\t}),\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: getFluxBotToken(wallet),\n\t\t},\n\t});\n\n\tconst j = await res.json();\n\n\tif (!res.ok) {\n\t\tthrow new Error(j?.error || res.statusText);\n\t}\n\n\treturn j;\n}\n","import { fetchFluxBotAction } from \"@/api/endpoints/fluxbot\";\nimport { SOL_MINT } from \"@/shared\";\n\nexport async function indexTradeOrders(wallet, mint: string): Promise {\n\tconst res = await fetch(`https://gateway.fluxbeam.xyz/orders?trader=${wallet}&mint=${mint}&status=1`)\n\n\tconst j = await res.json();\n\n\tif (!res.ok) {\n\t\tthrow new Error(j?.error || res.statusText);\n\t}\n\n\treturn j;\n}\n\nexport async function createTradeOrders({\n\twallet,\n\tsrc,\n\tdest,\n\tmethod,\n\tprice,\n\tinAmount,\n\tdelta,\n\texpiry,\n}: {\n\twallet: string;\n\tsrc: string;\n\tdest: string;\n\tmethod: number;\n\tprice: number;\n\tinAmount: number;\n\tdelta: number;\n\texpiry: number;\n}): Promise {\n\treturn await fetchFluxBotAction(wallet, \"lo_create\", {\n\t\tsource: src || SOL_MINT,\n\t\tdest: dest,\n\t\tmethod: method,\n\t\tamount: price,\n\t\tinAmount: Math.floor(inAmount),\n\t\tdelta: delta,\n\t\texpiry: expiry,\n\t});\n}\n\nexport async function closeTradeOrder(wallet, id: string): Promise {\n\treturn await fetchFluxBotAction(wallet, \"lo_cancel\", {\n\t\tdata: id,\n\t});\n}\n\nexport async function getTraderOrders({ wallet, status }: any): Promise {\n\tconst params = new URLSearchParams({\n\t\ttrader: wallet,\n\t\tstatus,\n\t});\n\treturn (\n\t\tawait fetch(`https://gateway.fluxbeam.xyz/orders?${params.toString()}`)\n\t).json();\n}","export async function fetchGetNewTokens(): Promise {\n\treturn (await fetch(\"https://data.fluxbeam.xyz/stats/tokens/new\")).json();\n}\n\nexport async function fetchToken(mint: string): Promise {\n\treturn (\n\t\tawait fetch(`https://data.fluxbeam.xyz/tokens/${mint}`)\n\t).json();\n}\n\nexport async function fetchTokenPriceChange(mint: string): Promise {\n\treturn (\n\t\tawait fetch(`https://data.fluxbeam.xyz/tokens/${mint}/stats/change`)\n\t).json();\n}\n\nexport async function fetchWalletHistoryTrades({\n\tmint,\n\twallet,\n\tfrom,\n\tto,\n}: any): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/tokens/${mint}/traders/${wallet}?from=${from}&to=${to}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTokenPNL({ mint, wallet }: any): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/tokens/${mint}/traders/${wallet}/pnl`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTokenMetadata(mint: string): Promise {\n\treturn (await fetch(`https://api.degencdn.com/v1/tokens/${mint}`)).json();\n}\n\nexport async function fetchTokenCandles({\n\tmint,\n\tinterval,\n\tto,\n\tfrom,\n\tcount\n}: any): Promise {\n\tconst params = new URLSearchParams();\n\tparams.set(\"interval\", interval);\n\tparams.set(\"count\", count);\n\n\tif (to)\n\tparams.set(\"to\", to);\n\n\tif (from)\n\tparams.set(\"from\", from);\n\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/tokens/${mint}/candles?${params.toString()}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTokenEvents({\n\tmint,\n\tto,\n\tfrom,\n}: any): Promise {\n\tconst params = new URLSearchParams();\n\n\tif (to)\n\tparams.set(\"to\", to);\n\n\tif (from)\n\tparams.set(\"from\", from);\n\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/tokens/${mint}/events?${params.toString()}`\n\t\t)\n\t).json();\n}\n","export async function fetchTopTraders(from, to, limit = 100): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/stats/traders/top?from=${from}&to=${to}&limit=${limit}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTopTokens({ page, limit }): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://api.fluxbeam.xyz/v1/search/tokens?maxScore=2000&page=${page}&limit=${limit}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTopPositions({ page, limit }): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/stats/positions/top?page=${page}&limit=${limit}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTraderTrades({\n\twallet,\n\tlimit = 100,\n}: any): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/traders/${wallet}/trades?limit=${limit}`\n\t\t)\n\t).json();\n}\n\nexport async function fetchTokenTrades({\n\tmint,\n\tfrom,\n\tto,\n\tlimit = 100,\n\tsignal,\n}: any): Promise {\n\treturn (\n\t\tawait fetch(\n\t\t\t`https://data.fluxbeam.xyz/tokens/${mint}/trades?from=${from}&to=${to}&limit=${limit}`,\n\t\t\t{ signal }\n\t\t)\n\t).json();\n}\n","import { fetchFluxBotAction } from \"@/api/endpoints/fluxbot\";\n\nexport async function createFluxBotSwap({\n\twallet,\n\tinMint,\n\toutMint,\n\tinAmount,\n}: {\n\twallet: string;\n\tinMint: string;\n\toutMint: string;\n\tinAmount: number;\n}): Promise {\n\treturn await fetchFluxBotAction(wallet, \"swap\", {\n\t\tsource: inMint,\n\t\tdest: outMint,\n\t\taToB: true,\n\t\tamount: Number(inAmount),\n\t});\n}\n","export async function fetchGetTraderDetail(trader: string): Promise {\n\treturn (await fetch(`https://data.fluxbeam.xyz/traders/${trader}/detail`)).json();\n}\n\nexport async function fetchGetTraderPnL(trader: string): Promise {\n\treturn (await fetch(`https://data.fluxbeam.xyz/traders/${trader}/tokens/pnl`)).json();\n}\n\nexport async function fetchGetTraderTokens(trader: string): Promise {\n\treturn (await fetch(`https://data.fluxbeam.xyz/traders/${trader}/tokens`)).json();\n}","import {fetchFluxBotAction} from \"@/api/endpoints/fluxbot\";\n\n\nexport async function createFluxBotTransfer({srcWallet, dstWallet, inAmount}: {\n\tsrcWallet: string;\n\tdstWallet: string;\n\tinAmount: number;\n}): Promise {\n\treturn await fetchFluxBotAction(srcWallet,\"transfer\", {\n\t\tsource: srcWallet,\n\t\tdest: dstWallet,\n\t\taToB: true,\n\t\tamount: inAmount\n\t});\n}\n","import {fetchFluxBotAction} from \"@/api/endpoints/fluxbot\";\n\n\nexport async function checkWaitlistStatus({srcWallet}: {\n\tsrcWallet: string;\n}): Promise {\n\treturn await fetchFluxBotAction(srcWallet,\"waitlist\", {});\n}\n","\n\nexport const baseURI = \"https://api.fluxbeam.xyz/v1\"\n// export const baseURI = \"http://localhost:8099/v1\"\n\nexport const VALIDATOR_TIP_ACCOUNTS = [\n\t\"96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5\",\n\t\"HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe\",\n\t\"Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY\",\n\t\"ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49\",\n\t\"DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh\",\n\t\"ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt\",\n\t\"DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL\",\n\t\"3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT\",\n]","import {web3} from \"@project-serum/anchor\";\nimport {createWithdrawWithheldTokensFromMintInstruction, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID} from \"@solana/spl-token\";\n\nexport class FeeManagerAutomated {\n\n\tbaseURI = \"https://api.fluxbeam.xyz/v1\"\n\n\tFEE_ACCOUNTS = [\n\t\tnew web3.PublicKey(\"FEE1M4bRtos7Yi8cni9s6zpxDfZTSsARwrhqMJMLLKhv\"),\n\t\t// new web3.PublicKey(\"FEE2qEfVjE64bdT9SXRa4ALvm4tFcwg7WE8ArQDuTjuD\"),\n\t\t// new web3.PublicKey(\"FEE3veNwA943NP38BB968i3Zo1Mjxtn9bkHN8eK8UKHS\"),\n\t\t// new web3.PublicKey(\"FEE4hmPcfXNTgscRrqpjnQQiNjdQN4XGVVZQqHgFYcNT\"),\n\t\t// new web3.PublicKey(\"FEE5sDtT4N7AsGnsBNxB9EUEMTnRoJqZ56FZubsDKTxm\"),\n\t\t// new web3.PublicKey(\"FEE6Ytka6NhFKNN9mJrGGGomSMs1Dk7GDXEwdjoiwt6t\"),\n\t\t// new web3.PublicKey(\"FEE7HqiD7CCv9bYrWhfFou8naYdhZU78C6KdWV8kLouY\"),\n\t\t// new web3.PublicKey(\"FEE8ZTYvsC3CLe8YnkN4vXikxnUcecmDB5D8ShXAAqPW\"),\n\t\t// new web3.PublicKey(\"FEE9Z48Pdm7Dt1pr5kCZ1gwt6hWX5Kmohk45SBJHXmZX\"),\n\t]\n\n\tasync clusterStatus() {\n\t\tconst resp = await fetch(this.uri(`status`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn await resp.json()\n\t}\n\n\tasync job(pk: string) {\n\t\treturn (await fetch(this.uri(`jobs/${pk}`))).json()\n\t}\n\n\tasync history(mint: web3.PublicKey) {\n\t\treturn (await fetch(this.uri(`history/${mint}`))).json()\n\t}\n\n\tasync restart(pk) {\n\t\treturn (await fetch(this.uri(`jobs/${pk}/restart`), {\n\t\t\tmethod: \"PUT\",\n\t\t})).json()\n\t}\n\n\tasync quote(pk: web3.PublicKey, mint: web3.PublicKey) {\n\t\treturn (await fetch(this.uri(`jobs/quote`), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tpayer: pk,\n\t\t\t\tmint: mint,\n\t\t\t\tpipeline: \"Fee Manager\"\n\t\t\t})\n\t\t})).json()\n\t}\n\n\tasync submit(quote, hash, sig) {\n\t\tconst resp = await fetch(this.uri(`jobs`), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tquote: quote,\n\t\t\t\thash: hash,\n\t\t\t\tsignature: sig\n\t\t\t})\n\t\t})\n\t\treturn resp.json()\n\t}\n\n\turi(endpoint: string) {\n\t\treturn `${this.baseURI}/workflow/${endpoint}`\n\t}\n\n\tfeeAccount(): web3.PublicKey {\n\t\treturn this.FEE_ACCOUNTS[Math.floor(Math.random() * this.FEE_ACCOUNTS.length)];\n\t}\n\n\tbuildFeeTransaction(quoteReq, priorityFee) {\n\t\tconst quote = quoteReq.quote\n\t\tconsole.log(\"buildFeeTransaction\", {quoteReq, quote, priorityFee})\n\t\tconst transaction = new web3.Transaction()\n\t\tconst unitLimit = 160_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\ttransaction.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tweb3.SystemProgram.transfer({fromPubkey: new web3.PublicKey(quote.payer), toPubkey: this.feeAccount(), lamports: quote.fee}),\n\t\t\tnew web3.TransactionInstruction({\n\t\t\t\tkeys: [],\n\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\tdata: Buffer.from(btoa(JSON.stringify(quoteReq)))\n\t\t\t})\n\t\t)\n\n\t\treturn transaction\n\t}\n\n\tbuildClaimTransaction(payer, mint, priorityFee) {\n\t\tconst transaction = new web3.Transaction()\n\t\tconst unitLimit = 160_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\tconst dstAcc = getAssociatedTokenAddressSync(mint, payer, true, TOKEN_2022_PROGRAM_ID)\n\n\t\ttransaction.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tcreateWithdrawWithheldTokensFromMintInstruction(mint, dstAcc, payer, [], TOKEN_2022_PROGRAM_ID),\n\t\t)\n\t\treturn transaction\n\t}\n}","import {web3} from \"@project-serum/anchor\";\nimport {baseURI} from \"@/api/fluxbeam/constants\";\n\nexport class Spl22 {\n\n\tasync search(query: string, page: number = 0) {\n\t\treturn await (await fetch(this.uri(`search?q=${query}&page=${page}`))).json()\n\t}\n\n\tasync pools(page: number, limit = 100) {\n\t\treturn await (await fetch(this.uri(`pools?limit=${limit}&page=${page}`))).json()\n\t}\n\n\tasync pool(pk: web3.PublicKey) {\n\t\treturn (await fetch(this.uri(`pools/${pk}`))).json()\n\t}\n\n\tasync poolByTicker(ticker: string) {\n\t\treturn (await fetch(this.uri(`pool-tickers/${ticker}`))).json()\n\t}\n\n\tasync poolByMint(ticker: string) {\n\t\treturn (await fetch(this.uri(`pool-mints/${ticker}`))).json()\n\t}\n\n\t// async pool(pk: web3.PublicKey) {\n\t// \treturn (await fetch(this.uri(`pools/${pk}`))).json()\n\t// }\n\n\tasync listings(ticker: string) {\n\t\treturn (await fetch(this.uri(`pool-listings/${ticker.toLowerCase()}`))).json()\n\t}\n\n\turi(endpoint: string) {\n\t\treturn `${baseURI}/spl22/${endpoint}`\n\t}\n}","import {Spl22} from \"@/api/fluxbeam/spl22\";\nimport {baseURI} from \"@/api/fluxbeam/constants\";\n\nexport class FluxBeamClient {\n\tpublic spl22 = new Spl22()\n\n\tconstructor() {\n\t\t//\n\t}\n\n\tasync getPriorityFees() {\n\t\tconst resp = await fetch(this.uri(`priority-fees`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn await resp.json()\n\t}\n\n\tasync getJitoTips() {\n\t\tconst resp = await fetch(this.uri(`jito-fees`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn await resp.json()\n\t}\n\n\tasync getTokenIndex(verifiedOnly = true, v2Only = true, page = 0, limit = 100) {\n\t\treturn await (await fetch(this.uri(`tokens?limit=${limit}&page=${page}&verified=${verifiedOnly}&v2=${v2Only}`))).json()\n\t}\n\n\tasync getTokenIndexAll(verifiedOnly = true) {\n\t\tlet page = 0\n\n\t\tlet resp = await (await fetch(this.uri(`tokens?limit=2000&page=${page}&verified=${verifiedOnly}`))).json()\n\t\tlet toks = resp;\n\n\t\tconst MAX_PAGES = 5\n\t\twhile (resp.length === 2000) {\n\t\t\tif (page > MAX_PAGES)\n\t\t\t\tbreak //We only want to load MAX_PAGES to save on load time\n\n\t\t\t// console.debug(\"TOKS LEN\", resp.length, toks.length)\n\t\t\tpage++\n\n\t\t\t//@ts-ignore\n\t\t\tresp = await (await fetch(this.uri(`tokens?limit=2000&page=${page}&verified=${verifiedOnly}`))).json()\n\t\t\t//@ts-ignore\n\t\t\ttoks = toks.concat(resp)\n\t\t\t// console.log(\"RLEN\", resp.length)\n\t\t}\n\n\t\t// console.debug(\"TOKS TOTAL\", toks.length)\n\t\treturn toks\n\t}\n\n\n\tasync getPools(page = 0, limit = 100, verifiedOnly = true) {\n\t\treturn await (await fetch(this.uri(`pools?limit=${limit}&page=${page}&verified=${verifiedOnly}`))).json()\n\t}\n\n\n\tasync searchPools(q: string, page = 0, limit = 100, verifiedOnly = true) {\n\t\treturn await (await fetch(this.uri(`search/pools?limit=${limit}&page=${page}&q=${q}&verified=${verifiedOnly}`))).json()\n\t}\n\n\n\n\tasync findPools(inMint: string, outMint: string) {\n\t\treturn await (await fetch(this.uri(`search/pools/mints?inMint=${inMint}&outMint=${outMint}`))).json()\n\t}\n\n\n\n\tasync getPoolTokensIndex(fromPage: number = 0) {\n\t\tlet page = fromPage\n\t\tlet resp = await this.getPoolTokensIndexPage(page)\n\t\tlet toks = resp;\n\n\t\tconst MAX_PAGES = 5\n\t\twhile (resp.length === 2000) {\n\t\t\tif (page > MAX_PAGES)\n\t\t\t\tbreak //We only want to load MAX_PAGES to save on load time\n\n\t\t\t// console.debug(\"TOKS LEN\", resp.length, toks.length)\n\t\t\tpage++\n\n\t\t\t//@ts-ignore\n\t\t\tresp = await this.getPoolTokensIndexPage(page)\n\t\t\t//@ts-ignore\n\t\t\ttoks = toks.concat(resp)\n\t\t\t// console.log(\"RLEN\", resp.length)\n\t\t}\n\n\t\t// console.debug(\"TOKS TOTAL\", toks.length)\n\t\treturn toks\n\t}\n\n\tasync searchToken(query: string, page: number = 0) {\n\t\tlet uri = `search/tokens?q=${query}&page=${page}&limit=12`\n\t\tif (query == \"\") {\n\t\t\turi += `&maxScore=1000`\n\t\t} else {\n\t\t\turi += `&maxScore=1000000`\n\t\t}\n\t\treturn await (await fetch(this.uri(uri))).json()\n\t}\n\n\tasync getPoolTokensIndexPage(page: number, limit = 2000) {\n\t\treturn await (await fetch(this.uri(`token_pools/details?limit=${limit}&page=${page}`))).json()\n\t}\n\n\tasync getPoolTokenIndex() {\n\t\treturn (await fetch(this.uri(\"token_pools/matrix\"))).json()\n\t}\n\n\tasync uploadTokenMetadata(name: string, symbol: string, description: string, imageData: any, image = \"\") {\n\t\tconst data = new FormData()\n\t\tdata.append('file', imageData)\n\t\tdata.append('name', name)\n\t\tdata.append('symbol', symbol)\n\t\tdata.append('description', description)\n\t\tdata.append('image', image)\n\n\t\tconsole.log(\"uploadTokenMetadata\", data)\n\t\treturn (await fetch(this.uri(\"tools/uploads/metadata\"), {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: data\n\t\t})).json()\n\t}\n\n\t/**\n\t * Notify the fluxbeam API of a new token event\n\t * @param address\n\t * @param signature\n\t */\n\tasync notifyTokenCreate(address: string, signature: string) {\n\t\tconsole.log(\"New token creation event!\", {address, signature})\n\n\t\tconst resp = await fetch(this.uri(\"tokens\"), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t//@ts-ignore\n\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t},\n\t\t\t//@ts-ignore\n\t\t\tbody: JSON.stringify({\n\t\t\t\taddress: address,\n\t\t\t\tsignature: signature\n\t\t\t})\n\t\t})\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\n\t\treturn resp.json()\n\t}\n\n\t/**\n\t * Notify the fluxbeam API that the metadata cid is confirmed\n\t * @param cid\n\t * @param signature\n\t */\n\tasync confirmMetadataPayment(cid: string, signature: string) {\n\t\tconst resp = await fetch(this.uri(\"tools/uploads/metadata/confirm\"), {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t//@ts-ignore\n\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t},\n\t\t\t//@ts-ignore\n\t\t\tbody: JSON.stringify({\n\t\t\t\tcid: cid,\n\t\t\t\tsignature: signature\n\t\t\t})\n\t\t})\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\n\t\treturn resp.json()\n\t}\n\n\n\tasync getWithheldAmounts(mint) {\n\t\tconst resp = await fetch(this.uri(`tokens/${mint}/withheld`))\n\t\tconst j = await resp.json()\n\t\tif (j?.error)\n\t\t\tthrow j.error\n\n\t\treturn j\n\t}\n\n\tasync getTokenAccounts(mint, cursor = \"\", limit = 250) {\n\t\tconst resp = await fetch(this.uri(`tokens/${mint}/holders?cursor=${cursor}&limit=${limit}`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn await resp.json()\n\t}\n\n\tasync getHolderCount(mint: string) {\n\t\tconst resp = await fetch(this.uri(`tokens/${mint}/holders/count`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn resp.json()\n\t}\n\n\tasync getHolders(mint: string, cursor = \"\", limit = 50) {\n\t\tconst resp = await fetch(this.uri(`tokens/${mint}/holders?cursor=${cursor}&limit=${limit}`))\n\t\tif (resp.status != 200)\n\t\t\tthrow resp.statusText\n\n\t\treturn resp.json()\n\t}\n\n\n\turi(endpoint: string) {\n\t\treturn `${baseURI}/${endpoint}`\n\t}\n}","import {web3} from \"@project-serum/anchor\";\nimport {VersionedTransaction} from \"@solana/web3.js\";\n\nexport class JupiterClient {\n\tcontroller\n\tloading = false\n\n\trpcClient\n\n\tconstructor(rpcClient) {\n\t\tthis.rpcClient = rpcClient\n\t}\n\n\tcancelQuote() {\n\t\tif (this.controller)\n\t\t\tthis.controller.abort(\"cancelled quote call\")\n\t}\n\n\tasync quote(inMint: web3.PublicKey, outMint: web3.PublicKey, amount: number, slippage: number): Promise {\n\t\tthis.cancelQuote()\n\t\tthis.loading = true\n\t\tthis.controller = new AbortController()\n\t\tconst resp = await fetch(`https://quote-api.jup.ag/v6/quote?inputMint=${inMint}&outputMint=${outMint}&amount=${amount}&slippageBps=${slippage}&platformFeeBps=25`, {signal: this.controller.signal}).catch()\n\t\tthis.loading = false\n\t\tif (!resp || resp.status != 200)\n\t\t\treturn\n\n\t\treturn await resp.json()\n\t}\n\n\tasync swap(payer: web3.PublicKey, quote: any, priorityFee: number) {\n\t\tconst [feeAccount] = web3.PublicKey.findProgramAddressSync([Buffer.from(\"referral_ata\"), new web3.PublicKey(\"4RNnWnJeyy6myqFW4anPDJtmhnZTdSMDo2HWjfBiDcLc\").toBuffer(), new web3.PublicKey(quote.outputMint).toBuffer()], new web3.PublicKey(\"REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3\"))\n\t\tconst payload = {\n\t\t\tuserPublicKey: payer,\n\t\t\tuseSharedAccounts: false,\n\t\t\tquoteResponse: quote,\n\t\t\twrapAndUnwrapSol: true,\n\t\t\tdynamicComputeUnitLimit: true,\n\t\t\tprioritizationFeeLamports: priorityFee,\n\t\t}\n\n\t\tconst feeAccountInfo = await this.rpcClient.getAccountInfo(feeAccount)\n\t\tif (feeAccountInfo) {\n\t\t\t//@ts-ignore\n\t\t\tpayload.feeAccount = feeAccount\n\t\t}\n\n\n\t\tconst resp = await (await fetch(`https://quote-api.jup.ag/v6/swap`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t})).json()\n\n\t\tconst swapTransactionBuf = Buffer.from(resp.swapTransaction, 'base64');\n\t\treturn VersionedTransaction.deserialize(swapTransactionBuf);\n\t}\n}","import {\n bits as _bits, BitStructure as _BitStructure, blob as _blob, Blob as _Blob, cstr as _cstr, f32 as _f32,\n f32be as _f32be, f64 as _f64, f64be as _f64be, greedy as _greedy, Layout as _Layout, ns64 as _ns64, ns64be as _ns64be,\n nu64 as _nu64, nu64be as _nu64be, offset as _offset, s16 as _s16, s16be as _s16be, s24 as _s24, s24be as _s24be,\n s32 as _s32, s32be as _s32be, s40 as _s40, s40be as _s40be, s48 as _s48, s48be as _s48be, s8 as _s8, seq as _seq,\n struct as _struct, Structure as _Structure, u16 as _u16, u16be as _u16be, u24 as _u24, u24be as _u24be, u32 as _u32,\n u32be as _u32be, u40 as _u40, u40be as _u40be, u48 as _u48, u48be as _u48be, u8 as _u8, UInt as _UInt,\n union as _union, Union as _Union, unionLayoutDiscriminator as _unionLayoutDiscriminator, utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout {\n span: number;\n property?: P;\n decode(b: Buffer, offset?: number): T;\n encode(src: T, b: Buffer, offset?: number): number;\n getSpan(b: Buffer, offset?: number): number;\n replicate(name: AP): Layout;\n}\nexport interface LayoutConstructor {\n new (): Layout; // for class extends syntex\n new (span?: T, property?: P): Layout;\n readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure\n extends Layout {\n span: number;\n decode(b: Buffer, offset?: number): DecodeSchema;\n layoutFor(property: AP): Layout;\n offsetOf(property: AP): number;\n}\ninterface StructureConstructor {\n new (): Structure;\n new (\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n ): Structure;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union extends Layout {\n registry: object;\n decode(b: Buffer, offset?: number): Partial;\n addVariant(\n variant: number,\n layout: Structure> | Layout,\n property?: string,\n ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n new (): Union;\n new (\n discr: Layout,\n defaultLayout: Layout,\n property?: string,\n ): Union;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure = Layout;\ninterface BitStructureConstructor {\n new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt = Layout;\ninterface UIntConstructor {\n new (span?: T, property?: P): UInt;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob

= Layout;\ninterface BlobConstructor {\n new (...params: ConstructorParameters): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as

(elementSpan?: number, property?: P) => Layout;\nexport const u8 = _u8 as

(property?: P) => Layout;\nexport const u16 = _u16 as

(property?: P) => Layout;\nexport const u24 = _u24 as

(property?: P) => Layout;\nexport const u32 = _u32 as

(property?: P) => Layout;\nexport const u40 = _u40 as

(property?: P) => Layout;\nexport const u48 = _u48 as

(property?: P) => Layout;\nexport const nu64 = _nu64 as

(property?: P) => Layout;\nexport const u16be = _u16be as

(property?: P) => Layout;\nexport const u24be = _u24be as

(property?: P) => Layout;\nexport const u32be = _u32be as

(property?: P) => Layout;\nexport const u40be = _u40be as

(property?: P) => Layout;\nexport const u48be = _u48be as

(property?: P) => Layout;\nexport const nu64be = _nu64be as

(property?: P) => Layout;\nexport const s8 = _s8 as

(property?: P) => Layout;\nexport const s16 = _s16 as

(property?: P) => Layout;\nexport const s24 = _s24 as

(property?: P) => Layout;\nexport const s32 = _s32 as

(property?: P) => Layout;\nexport const s40 = _s40 as

(property?: P) => Layout;\nexport const s48 = _s48 as

(property?: P) => Layout;\nexport const ns64 = _ns64 as

(property?: P) => Layout;\nexport const s16be = _s16be as

(property?: P) => Layout;\nexport const s24be = _s24be as

(property?: P) => Layout;\nexport const s32be = _s32be as

(property?: P) => Layout;\nexport const s40be = _s40be as

(property?: P) => Layout;\nexport const s48be = _s48be as

(property?: P) => Layout;\nexport const ns64be = _ns64be as

(property?: P) => Layout;\nexport const f32 = _f32 as

(property?: P) => Layout;\nexport const f32be = _f32be as

(property?: P) => Layout;\nexport const f64 = _f64 as

(property?: P) => Layout;\nexport const f64be = _f64be as

(property?: P) => Layout;\nexport const struct = _struct as (\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n) => T extends Layout[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude, \"\">]: Extract> extends Layout\n ? V\n : any;\n }\n >\n : any;\n\nexport const seq = _seq as unknown as (\n elementLayout: Layout,\n count: number | Layout,\n property?: P,\n) => Layout;\nexport const union = _union as (\n discr: Layout,\n defaultLayout?: any,\n property?: string,\n) => Union;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as

(\n layout: Layout,\n property?: P,\n) => any;\nexport const blob = _blob as unknown as

(length: number | Layout, property?: P) => Blob

;\nexport const cstr = _cstr as

(property?: P) => Layout;\nexport const utf8 = _utf8 as

(maxSpan: number, property?: P) => Layout;\nexport const bits = _bits as unknown as (\n word: Layout,\n msb?: boolean,\n property?: P,\n) => BitStructure; // TODO: not quite sure\nexport const offset = _offset as unknown as (\n layout: Layout,\n offset?: number,\n property?: P,\n) => Layout;\n\nexport type GetStructureSchema = T extends Structure ? S : unknown;\n","import { web3 } from '@project-serum/anchor';\nimport BN, { isBN } from 'bn.js';\n\nimport {\n bits, blob, Blob, Layout, offset as _offset, seq as _seq,\n Structure as _Structure, u32 as _u32, u8 as _u8, UInt, union as _union,\n Union as _Union,\n} from './buffer-layout';\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout

extends Layout {\n blob: Layout;\n signed: boolean;\n\n constructor(span: number, signed: boolean, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n super(span, property);\n this.blob = blob(span);\n this.signed = signed;\n }\n\n /** @override */\n decode(b: Buffer, offset = 0) {\n const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n if (this.signed) {\n return num.fromTwos(this.span * 8).clone();\n }\n return num;\n }\n\n /** @override */\n encode(src: BN, b: Buffer, offset = 0) {\n if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n if (this.signed) {\n src = src.toTwos(this.span * 8);\n }\n return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n }\n}\n\nexport class WideBits

extends Layout, P> {\n _lower: any;\n _upper: any;\n // TODO: unknown\n constructor(property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(8, property);\n this._lower = bits(_u32(), false);\n this._upper = bits(_u32(), false);\n }\n\n addBoolean(property: string) {\n if (this._lower.fields.length < 32) {\n this._lower.addBoolean(property);\n } else {\n this._upper.addBoolean(property);\n }\n }\n\n decode(b: Buffer, offset = 0): Record {\n const lowerDecoded = this._lower.decode(b, offset);\n const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n return { ...lowerDecoded, ...upperDecoded };\n }\n\n encode(src: any /* TEMP */, b: Buffer, offset = 0) {\n return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n }\n}\n\nexport function u8

(property?: P): UInt {\n return new UInt(1, property);\n}\n\nexport function u32

(property?: P): UInt {\n return new UInt(4, property);\n}\n\nexport function u64

(property?: P): BNLayout

{\n return new BNLayout(8, false, property);\n}\n\nexport function u128

(property?: P): BNLayout

{\n return new BNLayout(16, false, property);\n}\n\nexport function i8

(property?: P): BNLayout

{\n return new BNLayout(1, true, property);\n}\n\nexport function i64

(property?: P): BNLayout

{\n return new BNLayout(8, true, property);\n}\n\nexport function i128

(property?: P): BNLayout

{\n return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout extends Layout {\n layout: Layout;\n decoder: (data: T) => U;\n encoder: (src: U) => T;\n\n constructor(layout: Layout, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(layout.span, property);\n this.layout = layout;\n this.decoder = decoder;\n this.encoder = encoder;\n }\n\n decode(b: Buffer, offset?: number): U {\n return this.decoder(this.layout.decode(b, offset));\n }\n\n encode(src: U, b: Buffer, offset?: number): number {\n return this.layout.encode(this.encoder(src), b, offset);\n }\n\n getSpan(b: Buffer, offset?: number): number {\n return this.layout.getSpan(b, offset);\n }\n}\n\nexport function publicKey

(property?: P): Layout {\n return new WrappedLayout(\n blob(32),\n (b: Buffer) => new web3.PublicKey(b),\n (key: web3.PublicKey) => key.toBuffer(),\n property,\n );\n}\n\nexport class OptionLayout extends Layout {\n layout: Layout;\n discriminator: Layout;\n\n constructor(layout: Layout, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(-1, property);\n this.layout = layout;\n this.discriminator = _u8();\n }\n\n encode(src: T | null, b: Buffer, offset = 0): number {\n if (src === null || src === undefined) {\n return this.discriminator.encode(0, b, offset);\n }\n this.discriminator.encode(1, b, offset);\n return this.layout.encode(src, b, offset + 1) + 1;\n }\n\n decode(b: Buffer, offset = 0): T | null {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return null;\n } else if (discriminator === 1) {\n return this.layout.decode(b, offset + 1);\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n\n getSpan(b: Buffer, offset = 0): number {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return 1;\n } else if (discriminator === 1) {\n return this.layout.getSpan(b, offset + 1) + 1;\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n}\n\nexport function option(layout: Layout, property?: P): Layout {\n return new OptionLayout(layout, property);\n}\n\nexport function bool

(property?: P): Layout {\n return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n if (value === 0) {\n return false;\n } else if (value === 1) {\n return true;\n }\n throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n return value ? 1 : 0;\n}\n\nexport function vec(elementLayout: Layout, property?: P): Layout {\n const length = _u32(\"length\");\n const layout: Layout<{ values: T[] }> = struct([\n length,\n seq(elementLayout, _offset(length, -length.span), \"values\"),\n ]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport function tagged(tag: BN, layout: Layout, property?: P): Layout {\n const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }) {\n if (!receivedTag.eq(tag)) {\n throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n }\n return data;\n }\n\n return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8

(property?: P): Layout {\n const length = _u32(\"length\");\n const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ data }) => data,\n (data) => ({ data }),\n property,\n );\n}\n\nexport function str

(property?: P): Layout {\n return new WrappedLayout(\n vecU8(),\n (data) => data.toString(\"utf-8\"),\n (s) => Buffer.from(s, \"utf-8\"),\n property,\n );\n}\n\nexport interface EnumLayout extends Layout {\n registry: Record>;\n}\n\nexport function rustEnum(variants: Layout[], property?: P): EnumLayout {\n const unionLayout = _union(_u8(), property);\n variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array(\n elementLayout: Layout,\n length: number,\n property?: P,\n): Layout {\n const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport class Structure extends _Structure {\n /** @override */\n decode(b: Buffer, offset?: number) {\n return super.decode(b, offset);\n }\n}\n\nexport function struct(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n): T extends Layout[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude, \"\">]: Extract> extends Layout\n ? V\n : any;\n }\n >\n : any {\n //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure> = T extends Structure\n ? S\n : any;\nexport type GetStructureFromLayoutSchema = Structure;\n\nexport class Union extends _Union {\n encodeInstruction(instruction: any): Buffer {\n const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n const b = Buffer.alloc(instructionMaxSpan);\n return b.slice(0, this.encode(instruction, b));\n }\n\n decodeInstruction(instruction: any) {\n return this.decode(instruction);\n }\n}\nexport function union(\n discr: any,\n defaultLayout?: any,\n property?: string,\n): Union {\n return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n decode(b: Buffer, offset: number) {\n const slice = super.decode(b, offset);\n if (!slice.every((v) => v === 0)) {\n throw new Error(\"nonzero padding bytes\");\n }\n return slice;\n }\n}\n\nexport function zeros(length: number) {\n return new Zeros(length);\n}\n\nexport function seq(\n elementLayout: Layout,\n count: number | BN | Layout,\n property?: AnotherP,\n): Layout {\n let parsedCount: number;\n const superCount =\n typeof count === \"number\"\n ? count\n : isBN(count)\n ? count.toNumber()\n : new Proxy(count as unknown as Layout /* pretend to be Layout */, {\n get(target, property) {\n if (!parsedCount) {\n // get count in targetLayout. note that count may be BN\n const countProperty = Reflect.get(target, \"count\");\n\n // let targetLayout's property:count be a number\n parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n // record the count\n Reflect.set(target, \"count\", parsedCount);\n }\n return Reflect.get(target, property);\n },\n set(target, property, value) {\n if (property === \"count\") {\n parsedCount = value;\n }\n return Reflect.set(target, property, value);\n },\n });\n\n // @ts-expect-error force type\n return _seq(elementLayout, superCount, property);\n}\n","import {web3} from \"@project-serum/anchor\";\nimport {Metadata, PROGRAM_ID} from \"@metaplex-foundation/mpl-token-metadata\";\nimport {TOKEN_PROGRAM_ID} from \"@solana/spl-token\";\n\nexport type Options = {\n\tpublicAddress: web3.PublicKey;\n\n\tconnection: web3.Connection;\n};\n\nexport const getParsedNftAccountsByOwner = async ({publicAddress, connection}: Options) => {\n\n\t// Get all accounts owned by user\n\t// and created by SPL Token Program\n\t// this will include all NFTs, Coins, Tokens, etc.\n\tconst {value: splAccounts} = await connection.getParsedTokenAccountsByOwner(\n\t\tnew web3.PublicKey(publicAddress),\n\t\t{\n\t\t\tprogramId: new web3.PublicKey(TOKEN_PROGRAM_ID),\n\t\t},\n\t\t\"confirmed\"\n\t);\n\n\t// We assume NFT is SPL token with decimals === 0 and amount at least 1\n\t// At this point we filter out other SPL tokens, like coins e.g.\n\t// Unfortunately, this method will also remove NFTÑ‹ created before Metaplex NFT Standard\n\t// like Solarians e.g., so you need to check wallets for them in separate call if you wish\n\tconst nftAccounts = splAccounts\n\t\t.filter((t) => {\n\t\t\tconst amount = t.account?.data?.parsed?.info?.tokenAmount?.uiAmount;\n\t\t\tconst decimals = t.account?.data?.parsed?.info?.tokenAmount?.decimals;\n\t\t\treturn decimals === 0 && amount >= 1;\n\t\t})\n\t\t.map((t) => {\n\t\t\tconst address = t.account?.data?.parsed?.info?.mint;\n\t\t\treturn new web3.PublicKey(address);\n\t\t});\n\n\t// if user have tons of NFTs return first N\n\tconst accountsSlice = nftAccounts?.slice(0, 5000);\n\n\t// Get Addresses of Metadata Account assosiated with Mint Token\n\t// This info can be deterministically calculated by Associated Token Program\n\t// available in @solana/web3.js\n\tconst metadataAcountsAddressPromises = await Promise.allSettled(\n\t\taccountsSlice.map(getSolanaMetadataAddress)\n\t);\n\n\tconst metadataAccounts = metadataAcountsAddressPromises\n\t\t.filter(onlySuccessfullPromises)\n\t\t.map((p) => (p as PromiseFulfilledResult).value);\n\n\t// Fetch Found Metadata Account data by chunks\n\tconst metaAccountsRawPromises: PromiseSettledResult<\n\t\t(web3.AccountInfo | null)[]\n\t>[] = await Promise.allSettled(\n\t\tchunks(metadataAccounts, 99).map((chunk) =>\n\t\t\tconnection.getMultipleAccountsInfo(chunk as web3.PublicKey[])\n\t\t)\n\t);\n\n\tconst accountsRawMeta = metaAccountsRawPromises\n\t\t.filter(({status}) => status === \"fulfilled\")\n\t\t.flatMap((p) => (p as PromiseFulfilledResult).value);\n\n\t// There is no reason to continue processing\n\t// if Mints doesn't have associated metadata account. just return []\n\tif (!accountsRawMeta?.length || accountsRawMeta?.length === 0) {\n\t\treturn [];\n\t}\n\n\t// Decode data from Buffer to readable objects\n\tconst accountsDecodedMeta = await Promise.allSettled(\n\t\taccountsRawMeta.map((accountInfo) => {\n\t\t\tconst [metadata] = Metadata.fromAccountInfo(accountInfo as web3.AccountInfo)\n\t\t\t// decodeTokenMetadata((accountInfo as web3.AccountInfo)?.data)\n\t\t\treturn metadata;\n\t\t})\n\t);\n\n\treturn accountsDecodedMeta\n\t\t.filter(onlySuccessfullPromises)\n\t\t.filter(onlyNftsWithMetadata)\n\t\t.map((p) => {\n\t\t\tconst {value} = p as PromiseFulfilledResult;\n\t\t\treturn sanitizeTokenMeta(value);\n\t\t})\n\t\t.map((token) => token);\n};\n\nconst onlySuccessfullPromises = (\n\tresult: PromiseSettledResult\n): boolean => result && result.status === \"fulfilled\";\n\n// Remove any NFT Metadata Account which doesn't have uri field\n// We can assume such NFTs are broken or invalid.\nconst onlyNftsWithMetadata = (t: PromiseSettledResult) => {\n\tconst uri = (\n\t\tt as PromiseFulfilledResult\n\t).value.data?.uri?.replace?.(/\\0/g, \"\");\n\treturn uri !== \"\" && uri !== undefined;\n};\n\nfunction getSolanaMetadataAddress(tokenMint: web3.PublicKey) {\n\tconst metaProgamPublicKey = new web3.PublicKey(PROGRAM_ID);\n\treturn (\n\t\tweb3.PublicKey.findProgramAddressSync(\n\t\t\t[Buffer.from(\"metadata\"), metaProgamPublicKey.toBuffer(), tokenMint.toBuffer()],\n\t\t\tmetaProgamPublicKey\n\t\t)\n\t)[0];\n}\n\nfunction chunks(array: web3.PublicKey[] = [], size = 100) {\n\tconst chunks = []\n\n\tfor (let i = 0; i < array.length; i += size) {\n\t\tchunks.push(array.slice(i, i + size))\n\t}\n\n\treturn chunks\n}\n\nconst sanitizeTokenMeta = (tokenData: Metadata) => ({\n\t...tokenData,\n\tdata: {\n\t\t...tokenData?.data,\n\t\tname: sanitizeMetaStrings(tokenData?.data?.name),\n\t\tsymbol: sanitizeMetaStrings(tokenData?.data?.symbol),\n\t\turi: sanitizeMetaStrings(tokenData?.data?.uri),\n\t},\n});\n\n// Remove all empty space, new line, etc. symbols\n// In some reason such symbols parsed back from Buffer looks weird\n// like \"\\x0000\" instead of usual spaces.\nexport const sanitizeMetaStrings = (metaString: string) =>\n\tmetaString.replace(/\\0/g, \"\");\n","import {blob, GetStructureSchema, publicKey, struct, u64, u8} from \"@/api/marshmallow\";\n\n\nexport const PoolLayout = struct([\n\tblob(8), //Anchor diff\n\tu8('bump'),\n\tpublicKey('nftCollection'),\n\tpublicKey('tokenMint'),\n]);\n\nexport type PoolLayout = typeof PoolLayout;\nexport type Pool = GetStructureSchema;\n\n\nexport const Market = struct([\n\tblob(8), //Anchor diff\n\tu8('bump'),\n\tpublicKey('nftCollection'),\n\tpublicKey('quoteMint'),\n\tpublicKey('swapPool'),\n]);\n\nexport type MarketLayout = typeof Market;\nexport type Market = GetStructureSchema;","import {web3} from \"@project-serum/anchor\";\nimport {Client as TokenSwapClient, PoolMath} from \"@/api/token_swap\";\nimport {CreateMint, Token2022Client} from \"@/api/token2022/token_2022\";\nimport {\n\tASSOCIATED_TOKEN_PROGRAM_ID,\n\tcreateAssociatedTokenAccountInstruction,\n\tExtensionType,\n\tgetAssociatedTokenAddressSync,\n\tTOKEN_2022_PROGRAM_ID,\n\tTOKEN_PROGRAM_ID\n} from \"@solana/spl-token\";\nimport {Metadata, PROGRAM_ID} from \"@metaplex-foundation/mpl-token-metadata\";\nimport {TokenInput} from \"@/api/token_swap/layouts\";\n\nimport {SWAP_PROGRAM_OWNER_FEE_ADDRESS} from \"@/api/token_swap/create_token_pool\";\nimport {METADATA_2022_PROGRAM_ID, SWAP_PROGRAM_ID, WSOL} from \"@/api/token_swap/constants\";\nimport BN from \"bn.js\";\nimport {bool, struct, u64, u8} from \"@/api/marshmallow\";\nimport {sha256} from \"js-sha256\";\nimport {Market, PoolLayout} from \"@/api/nft_fraction/layouts\";\nimport {getParsedNftAccountsByOwner} from \"@/api/nft_fraction/getParsedNFTAccountsByOwner\";\nimport {ComputeBudgetProgram} from \"@solana/web3.js\";\n\nexport default class Client {\n\n\t//TODO Add permissionless fee clear where possible\n\n\tconnection: web3.Connection;\n\n\tprogramID: web3.PublicKey = new web3.PublicKey(\"2TnHAQqFZU1skoFo3Zr5GJ4pKZf2ec2pFKW4ZRX5BPsD\")\n\n\tswapClient: TokenSwapClient;\n\ttoken2022: Token2022Client;\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\n\t\tthis.swapClient = new TokenSwapClient(connection)\n\t\tthis.token2022 = new Token2022Client(connection)\n\t}\n\n\tgetCollectionPoolKey(collection: web3.PublicKey) {\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID)\n\t\treturn collectionPool\n\t}\n\n\tasync getPools() {\n\t\tconst resp = await this.connection.getProgramAccounts(this.programID, {\n\t\t\tcommitment: \"confirmed\",\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tdataSize: 8 + 1 + 32 + 32,\n\t\t\t\t},\n\t\t\t]\n\t\t})\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: PoolLayout.decode(m.account.data)}\n\t\t})\n\t}\n\n\tasync getPool(pool: web3.PublicKey) {\n\t\tconst resp = await this.connection.getAccountInfo(pool, \"confirmed\")\n\t\tif (!resp)\n\t\t\treturn null\n\n\t\treturn PoolLayout.decode(resp.data)\n\t}\n\n\tasync getPoolItems(pool: web3.PublicKey) {\n\t\treturn getParsedNftAccountsByOwner({\n\t\t\tpublicAddress: pool,\n\t\t\tconnection: this.connection\n\t\t})\n\t}\n\n\tasync getAllMarkets() {\n\t\tconst resp = await this.connection.getProgramAccounts(this.programID, {\n\t\t\tcommitment: \"confirmed\",\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tdataSize: 8 + 1 + 32 + 32 + 32,\n\t\t\t\t},\n\t\t\t]\n\t\t})\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: Market.decode(m.account.data)}\n\t\t})\n\t}\n\n\tasync getMarket(nftCollection: web3.PublicKey, quoteMint: web3.PublicKey = WSOL) {\n\t\tconst [market] = web3.PublicKey.findProgramAddressSync([nftCollection.toBuffer(), quoteMint.toBuffer()], this.programID)\n\t\tconst resp = await this.connection.getAccountInfo(market, \"confirmed\")\n\t\tif (!resp)\n\t\t\treturn\n\n\t\treturn Market.decode(resp.data)\n\t}\n\n\tasync getMarkets(nftCollection: web3.PublicKey) {\n\t\tconst resp = await this.connection.getProgramAccounts(this.programID, {\n\t\t\tcommitment: \"confirmed\",\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tdataSize: 8 + 1 + 32 + 32 + 32,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 8 + 1,\n\t\t\t\t\t\tbytes: nftCollection.toString(),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: Market.decode(m.account.data)}\n\t\t})\n\t}\n\n\tasync getCollection(collection: web3.PublicKey) {\n\t\tconst metaPDA = this.token2022.getMetadataPDA(collection, PROGRAM_ID)\n\t\tconst metadata = await Metadata.fromAccountAddress(this.connection, metaPDA, \"confirmed\")\n\n\t\treturn this.sanitizeTokenMeta(metadata)\n\t}\n\n\tasync getToken(collection: web3.PublicKey) {\n\t\tconst metaPDA = this.token2022.getMetadataPDA(collection)\n\t\tconst metadata = await Metadata.fromAccountAddress(this.connection, metaPDA, \"confirmed\")\n\n\t\treturn this.sanitizeTokenMeta(metadata)\n\t}\n\n\t/**\n\t * Sell a NFT for SOL\n\t */\n\tasync sellNFT(payer: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, minimumAmountOut: number): Promise {\n\t\tconst collectionPool = this.getCollectionPoolKey(collection)\n\t\tconst pool = await this.swapClient.getPool(collectionPool)\n\t\tconsole.log(\"sellNFT:Pool\", collectionPool.toString(), pool)\n\n\t\t//Exchange for 10_000 cTOK\n\t\tconst txn = await this.exchangeNFT(payer, collection, nft)\n\n\t\t//Exchange 10_000 cTOK for SOL\n\t\tconst swapTxn = await this.swapClient.createSwapTransaction(\n\t\t\tpayer,\n\t\t\tcollectionPool,\n\t\t\tnew TokenInput(pool.account.mintB, 10_000),\n\t\t\tnew TokenInput(WSOL, minimumAmountOut, TOKEN_PROGRAM_ID),\n\t\t\tpool.account,\n\t\t\t1,\n\t\t\tminimumAmountOut\n\t\t)\n\t\ttxn.add(...swapTxn.instructions)\n\n\t\treturn txn\n\t}\n\n\t/**\n\t * Buy a NFT with SOL\n\t *\n\t * @param payer of the transaction\n\t * @param collection to trade on\n\t * @param nft to purchase\n\t * @param amountIn Amount in SOL to spend on a NFT\n\t */\n\tasync buyNFT(payer: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, amountIn: number): Promise {\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID)\n\t\tconst pool = await this.swapClient.getPool(collectionPool)\n\t\tconsole.log(\"buyNFT:Pool\", collectionPool.toString(), pool)\n\n\t\t//Exchange SOL for 10_000 cTOK\n\t\tconst txn = await this.swapClient.createSwapTransaction(\n\t\t\tpayer,\n\t\t\tcollectionPool,\n\t\t\tnew TokenInput(WSOL, amountIn, TOKEN_PROGRAM_ID),\n\t\t\tnew TokenInput(pool.account.mintB, 10_000),\n\t\t\tpool.account,\n\t\t\tamountIn,\n\t\t\t10_000)\n\n\t\t//Exchange 10_000 cTOK for NFT\n\t\tconst exchangeTxn = await this.exchangeNFT(payer, collection, nft)\n\t\ttxn.add(...exchangeTxn.instructions)\n\n\t\treturn txn\n\t}\n\n\t/**\n\t * Add liquidity to the pool using a NFT\n\t * @param owner\n\t * @param collection\n\t * @param nft\n\t */\n\tasync addLiquidity(owner: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey): Promise {\n\t\tconsole.log(\"addLiquidity\", {\n\t\t\towner: owner.toString(),\n\t\t\tcollection: collection.toString(),\n\t\t\tnft: nft.toString(),\n\t\t})\n\t\t// Exchange NFT for cTOK\n\t\t// const txn = await this.exchangeNFT(owner, collection, nft)\n\t\tconst market = await this.getMarket(collection, WSOL)\n\t\tif (!market)\n\t\t\treturn Promise.reject(\"collection market not found\")\n\n\t\tconsole.log(\"Market\", JSON.parse(JSON.stringify(market)))\n\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID);\n\t\tconst [swapAuthority] = web3.PublicKey.findProgramAddressSync([market?.swapPool!.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst pool = await this.swapClient.getPool(market?.swapPool!)\n\t\tconst poolDetail = await this.swapClient.getPoolDetail(market?.swapPool!, pool.account, owner)\n\n\t\tconst spotPrice = poolDetail?.tokenAccountB.tokenAmount.amount / poolDetail?.tokenAccountA.tokenAmount.amount;\n\t\tconst tokenBAmount = Math.ceil(spotPrice * 100_000)\n\n\t\tconsole.log(\"NFTPool\", {pool: JSON.parse(JSON.stringify(pool)), poolDetail, spotPrice, minOut: tokenBAmount / Math.pow(10, 9)})\n\n\t\tconst minAmountOut = PoolMath.lpTokensReceived(100_000, poolDetail.tokenAccountA.tokenAmount.amount, poolDetail.mintLp.supply)\n\t\tconst slipAmount = new BN(minAmountOut).mul(new BN(1)).div(new BN(10_000))\n\t\tconst minAmountOutSlip = new BN(minAmountOut).sub(slipAmount)\n\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst collectionTokenMint = pool.account.mintA\n\n\t\tconst ownerQuoteAccount = getAssociatedTokenAddressSync(pool.account.mintB, owner, false) //TODO auto detect program_id\n\n\t\tconst ownerTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, owner, false, TOKEN_2022_PROGRAM_ID)\n\t\tconst poolTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, collectionPool, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst ownerPoolAccount = getAssociatedTokenAddressSync(pool.account.tokenPool, owner, false, TOKEN_2022_PROGRAM_ID) //LP Mint\n\n\t\tconst ownerNftAccount = getAssociatedTokenAddressSync(nft, owner, false)\n\t\tconst poolNftAccount = getAssociatedTokenAddressSync(nft, collectionPool, true)\n\n\t\tconst txn = new web3.Transaction()\n\t\ttxn.add(ComputeBudgetProgram.setComputeUnitLimit({units: 250000}))\n\n\t\tif (!await this.accountExists(ownerQuoteAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ownerQuoteAccount, owner, pool.account.mintB))\n\n\t\tif (!await this.accountExists(ownerTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ownerTokenAccount, owner, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\tif (!await this.accountExists(poolTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, poolTokenAccount, collectionPool, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\n\t\ttxn.add(this.createAddLiquidityInstruction({\n\t\t\towner: owner,\n\t\t\tpool: collectionPool,\n\t\t\tnftMint: nft,\n\t\t\tnftMetadata: nftMetadata,\n\t\t\tcollectionTokenMint: collectionTokenMint,\n\t\t\townerTokenAccount: ownerTokenAccount,\n\t\t\townerQuoteAccount: ownerQuoteAccount,\n\t\t\tpoolTokenAccount: poolTokenAccount,\n\t\t\townerNftAccount: ownerNftAccount,\n\t\t\tpoolNftAccount: poolNftAccount,\n\t\t\townerPoolAccount: ownerPoolAccount,\n\t\t\tswapPool: market.swapPool,\n\t\t\tswapAuthority: swapAuthority,\n\t\t\tswapLpMint: pool.account.tokenPool,\n\t\t\tquoteTokenMint: market.quoteMint,\n\t\t\tswapTokenAccountA: pool.account.tokenAccountA,\n\t\t\tswapTokenAccountB: pool.account.tokenAccountB,\n\t\t\tnftTokenProgram: TOKEN_PROGRAM_ID,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tquoteTokenProgram: TOKEN_PROGRAM_ID, //TODO Get correct ID\n\t\t\tswapProgram: SWAP_PROGRAM_ID,\n\t\t\tnftTokenMetadataProgram: PROGRAM_ID,\n\t\t\tassociatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n\t\t\tsystemProgram: web3.SystemProgram.programId,\n\t\t\tpoolTokenAmount: minAmountOut,\n\t\t\tmaximumTokenA: new BN(100_000),\n\t\t\tmaximumTokenB: new BN(tokenBAmount),\n\t\t}))\n\n\t\treturn txn\n\t}\n\n\tcreateAddLiquidityInstruction(args: {\n\t\towner: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tnftMint: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\townerTokenAccount: web3.PublicKey,\n\t\townerQuoteAccount: web3.PublicKey,\n\t\tpoolTokenAccount: web3.PublicKey,\n\t\townerNftAccount: web3.PublicKey,\n\t\tpoolNftAccount: web3.PublicKey,\n\t\townerPoolAccount: web3.PublicKey, //Owner LP Account\n\t\tswapPool: web3.PublicKey,\n\t\tswapAuthority: web3.PublicKey,\n\t\tswapLpMint: web3.PublicKey,\n\t\tquoteTokenMint: web3.PublicKey,\n\t\tswapTokenAccountA: web3.PublicKey,\n\t\tswapTokenAccountB: web3.PublicKey,\n\t\tnftTokenProgram: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tquoteTokenProgram: web3.PublicKey,\n\t\tswapProgram: web3.PublicKey,\n\t\tnftTokenMetadataProgram: web3.PublicKey,\n\t\tassociatedTokenProgram: web3.PublicKey,\n\t\tsystemProgram: web3.PublicKey,\n\t\tpoolTokenAmount: BN,\n\t\tmaximumTokenA: BN,\n\t\tmaximumTokenB: BN,\n\t}): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu64('poolTokenAmount'),\n\t\t\tu64('maximumTokenA'),\n\t\t\tu64('maximumTokenB'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"add_liquidity\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tpoolTokenAmount: args.poolTokenAmount,\n\t\t\tmaximumTokenA: args.maximumTokenA,\n\t\t\tmaximumTokenB: args.maximumTokenB,\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: args.owner, isSigner: true, isWritable: true},\n\t\t\t{pubkey: args.pool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMetadata, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionTokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerQuoteAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerPoolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapPool, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapAuthority, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapLpMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.quoteTokenMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapTokenAccountA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapTokenAccountB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.nftTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.tokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.quoteTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftTokenMetadataProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.associatedTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.systemProgram, isSigner: false, isWritable: false},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Remove liquidity in the form of a NFT from the pool\n\t * @param owner\n\t * @param collection\n\t * @param nft\n\t * @param maximumPoolTokens\n\t */\n\tasync removeLiquidity(owner: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, maximumPoolTokens: number): Promise {\n\t\tconst market = await this.getMarket(collection, WSOL)\n\t\tif (!market)\n\t\t\treturn Promise.reject(\"collection market not found\")\n\n\t\tconsole.log(\"Market\", JSON.parse(JSON.stringify(market)))\n\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID);\n\t\tconst [swapAuthority] = web3.PublicKey.findProgramAddressSync([market?.swapPool!.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst pool = await this.swapClient.getPool(market?.swapPool!)\n\t\tconst poolDetail = await this.swapClient.getPoolDetail(market?.swapPool!, pool.account, owner)\n\n\t\tconst spotPrice = poolDetail?.tokenAccountB.tokenAmount.amount / poolDetail?.tokenAccountA.tokenAmount.amount;\n\t\tconst tokenBAmount = Math.ceil(spotPrice * 100_000)\n\n\t\tconsole.log(\"NFTPool\", {pool: JSON.parse(JSON.stringify(pool)), poolDetail, spotPrice, minOut: tokenBAmount / Math.pow(10, 9)})\n\n\n\t\tconst totalLpSupply = poolDetail.mintLp?.supply; //Total Liq\n\t\tconst yourLpTokens = poolDetail.userLP?.tokenAmount?.amount\n\t\tconst yourShareOfTotalLiquidity = yourLpTokens / totalLpSupply;\n\t\tconst totalTokenAInPool = poolDetail.tokenAccountA.tokenAmount?.amount; // total token A in the pool\n\t\tconst totalTokenBInPool = poolDetail.tokenAccountB.tokenAmount?.amount; // total token B in the pool\n\n\n\t\tconst pctNeeded = 100_000 / totalTokenAInPool;\n\t\tconst poolTokensIn = Math.ceil(totalLpSupply * pctNeeded);\n\t\tconst minTokenBOut = Math.floor(totalTokenBInPool * (poolTokensIn/totalLpSupply));\n\n\n\t\tconsole.log(\"poolDetail\", {\n\t\t\tyourLpTokens,\n\t\t\tyourShareOfTotalLiquidity,\n\t\t\ttotalLpSupply,\n\t\t\ttotalTokenAInPool,\n\t\t\ttotalTokenBInPool,\n\t\t\tpoolTokensIn,\n\t\t\tminTokenBOut,\n\t\t})\n\n\t\t//TODO Fix maths\n\t\t// const minAmountOut = 0\n\t\t// const slipAmount = new BN(minAmountOut).mul(new BN(1)).div(new BN(10_000))\n\t\t// const minAmountOutSlip = new BN(minAmountOut).sub(slipAmount)\n\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst collectionTokenMint = pool.account.mintA\n\n\t\tconst ownerQuoteAccount = getAssociatedTokenAddressSync(pool.account.mintB, owner, false) //TODO auto detect program_id\n\n\t\tconst ownerTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, owner, false, TOKEN_2022_PROGRAM_ID)\n\t\tconst poolTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, collectionPool, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst ownerPoolAccount = getAssociatedTokenAddressSync(pool.account.tokenPool, owner, false, TOKEN_2022_PROGRAM_ID) //LP Mint\n\n\t\tconst ownerNftAccount = getAssociatedTokenAddressSync(nft, owner, false)\n\t\tconst poolNftAccount = getAssociatedTokenAddressSync(nft, collectionPool, true)\n\n\t\tconst txn = new web3.Transaction()\n\t\ttxn.add(ComputeBudgetProgram.setComputeUnitLimit({units: 250000}))\n\n\t\tif (!await this.accountExists(ownerQuoteAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ownerQuoteAccount, owner, pool.account.mintB))\n\n\t\tif (!await this.accountExists(ownerTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ownerTokenAccount, owner, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\tif (!await this.accountExists(poolTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, poolTokenAccount, collectionPool, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\n\t\ttxn.add(this.createRemoveLiquidityInstruction({\n\t\t\towner: owner,\n\t\t\tpool: collectionPool,\n\t\t\tnftMint: nft,\n\t\t\tnftMetadata: nftMetadata,\n\t\t\tcollectionTokenMint: collectionTokenMint,\n\t\t\townerTokenAccount: ownerTokenAccount,\n\t\t\townerQuoteAccount: ownerQuoteAccount,\n\t\t\tpoolTokenAccount: poolTokenAccount,\n\t\t\townerNftAccount: ownerNftAccount,\n\t\t\tpoolNftAccount: poolNftAccount,\n\t\t\townerPoolAccount: ownerPoolAccount,\n\t\t\tfeeAccount: pool.account.feeAccount,\n\t\t\tswapPool: market.swapPool,\n\t\t\tswapAuthority: swapAuthority,\n\t\t\tswapLpMint: pool.account.tokenPool,\n\t\t\tquoteTokenMint: market.quoteMint,\n\t\t\tswapTokenAccountA: pool.account.tokenAccountA,\n\t\t\tswapTokenAccountB: pool.account.tokenAccountB,\n\t\t\tnftTokenProgram: TOKEN_PROGRAM_ID,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tquoteTokenProgram: TOKEN_PROGRAM_ID, //TODO Get correct ID\n\t\t\tswapProgram: SWAP_PROGRAM_ID,\n\t\t\tnftTokenMetadataProgram: PROGRAM_ID,\n\t\t\tassociatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n\t\t\tsystemProgram: web3.SystemProgram.programId,\n\t\t\tpoolTokenAmount: new BN(poolTokensIn),\n\t\t\tminimumTokenA: new BN(100_000),\n\t\t\tminimumTokenB: new BN(minTokenBOut),\n\t\t}))\n\n\t\treturn txn\n\t}\n\n\tcreateRemoveLiquidityInstruction(args: {\n\t\towner: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tnftMint: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\townerTokenAccount: web3.PublicKey,\n\t\townerQuoteAccount: web3.PublicKey,\n\t\tpoolTokenAccount: web3.PublicKey,\n\t\townerNftAccount: web3.PublicKey,\n\t\tpoolNftAccount: web3.PublicKey,\n\t\townerPoolAccount: web3.PublicKey, //Owner LP Account\n\t\tfeeAccount: web3.PublicKey,\n\t\tswapPool: web3.PublicKey,\n\t\tswapAuthority: web3.PublicKey,\n\t\tswapLpMint: web3.PublicKey,\n\t\tquoteTokenMint: web3.PublicKey,\n\t\tswapTokenAccountA: web3.PublicKey,\n\t\tswapTokenAccountB: web3.PublicKey,\n\t\tnftTokenProgram: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tquoteTokenProgram: web3.PublicKey,\n\t\tswapProgram: web3.PublicKey,\n\t\tnftTokenMetadataProgram: web3.PublicKey,\n\t\tassociatedTokenProgram: web3.PublicKey,\n\t\tsystemProgram: web3.PublicKey,\n\t\tpoolTokenAmount: BN,\n\t\tminimumTokenA: BN,\n\t\tminimumTokenB: BN,\n\t}): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu64('poolTokenAmount'),\n\t\t\tu64('minimumTokenA'),\n\t\t\tu64('minimumTokenB'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"remove_liquidity\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tpoolTokenAmount: args.poolTokenAmount,\n\t\t\tminimumTokenA: args.minimumTokenA,\n\t\t\tminimumTokenB: args.minimumTokenB,\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: args.owner, isSigner: true, isWritable: true},\n\t\t\t{pubkey: args.pool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMetadata, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionTokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerQuoteAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerPoolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapPool, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapAuthority, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapLpMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.quoteTokenMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapTokenAccountA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapTokenAccountB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.feeAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.nftTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.tokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.quoteTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftTokenMetadataProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.associatedTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.systemProgram, isSigner: false, isWritable: false},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Exchange NFT for cTokens 1:10,000\n\t * @param payer\n\t * @param collection\n\t * @param nft\n\t * @param aToB\n\t */\n\tasync exchangeNFT(payer: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, aToB: boolean = true): Promise {\n\t\tconst txn = new web3.Transaction()\n\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID)\n\t\tconst pool = await this.getPool(collectionPool)\n\t\tif (!pool) {\n\t\t\treturn Promise.reject(\"collection pool not found\")\n\t\t}\n\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst collectionTokenMint = pool.tokenMint\n\n\n\t\tconst ownerTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, payer, false, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst ownerNftAccount = getAssociatedTokenAddressSync(nft, payer, false)\n\t\tconst poolNftAccount = getAssociatedTokenAddressSync(nft, collectionPool, true)\n\n\n\t\tif (!await this.accountExists(ownerTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(payer, ownerTokenAccount, payer, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\ttxn.add(this.createExchangeNFTInstruction({\n\t\t\tpayer: payer,\n\t\t\tpool: collectionPool,\n\t\t\tnftMint: nft,\n\t\t\tnftMetadata: nftMetadata,\n\t\t\tcollectionTokenMint: collectionTokenMint,\n\t\t\townerTokenAccount: ownerTokenAccount,\n\t\t\townerNftAccount: ownerNftAccount,\n\t\t\tpoolNftAccount: poolNftAccount,\n\t\t\tnftTokenProgram: TOKEN_PROGRAM_ID,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tnftTokenMetadataProgram: PROGRAM_ID,\n\t\t\tassociatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n\t\t\tsystemProgram: web3.SystemProgram.programId,\n\t\t\taToB: aToB,\n\t\t}))\n\n\t\treturn txn\n\t}\n\n\n\t/**\n\t * Exchange NFT for SOL\n\t *\n\t * @param payer\n\t * @param collection\n\t * @param nft\n\t * @param aToB\n\t * @param amount\n\t */\n\tasync exchangeNFTSOL(payer: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, aToB: boolean = true, amount: number): Promise {\n\t\tconst txn = new web3.Transaction()\n\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID)\n\t\tconst pool = await this.getPool(collectionPool)\n\t\tif (!pool) {\n\t\t\treturn Promise.reject(\"collection pool not found\")\n\t\t}\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst collectionTokenMint = pool.tokenMint\n\n\t\tconst pools = await this.swapClient.getSwapPoolsSingle(collectionTokenMint)\n\t\tif (!pools || pools.length < 1) {\n\t\t\treturn Promise.reject(\"collection swap pool not found\")\n\t\t}\n\n\t\tconst swapPool = pools[0]\n\t\tconsole.log(\"Swap pool\", JSON.parse(JSON.stringify(swapPool)))\n\n\t\tconst [swapAuthority] = web3.PublicKey.findProgramAddressSync([swapPool.pubkey.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst swapLpMint = swapPool.account.tokenPool\n\t\tconst quoteTokenMint = swapPool.account.mintB;\n\t\tconst swapFeeAccount = swapPool.account.feeAccount\n\t\tconst swapTokenAccountA = swapPool.account.tokenAccountA\n\t\tconst swapTokenAccountB = swapPool.account.tokenAccountB\n\n\t\tconst ownerTokenAccount = getAssociatedTokenAddressSync(collectionTokenMint, payer, false, TOKEN_2022_PROGRAM_ID)\n\t\tconst ownerSolAccount = getAssociatedTokenAddressSync(swapPool.account.mintB, payer, false, TOKEN_PROGRAM_ID)\n\n\t\tconst ownerNftAccount = getAssociatedTokenAddressSync(nft, payer, false)\n\t\tconst poolNftAccount = getAssociatedTokenAddressSync(nft, collectionPool, true)\n\n\t\tif (!await this.accountExists(ownerSolAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(payer, ownerSolAccount, payer, swapPool.account.mintB, TOKEN_PROGRAM_ID))\n\n\t\ttxn.add(ComputeBudgetProgram.setComputeUnitLimit({units: 250000}))\n\t\ttxn.add(this.createExchangeNFTSOLInstruction({\n\t\t\tpayer: payer,\n\t\t\tpool: collectionPool,\n\t\t\tnftMint: nft,\n\t\t\tnftMetadata: nftMetadata,\n\t\t\tcollectionTokenMint: collectionTokenMint,\n\t\t\townerTokenAccount: ownerTokenAccount,\n\t\t\townerNftAccount: ownerNftAccount,\n\t\t\tpoolNftAccount: poolNftAccount,\n\t\t\tswapPool: swapPool.pubkey,\n\t\t\tswapAuthority: swapAuthority,\n\t\t\tswapLpMint: swapLpMint,\n\t\t\tswapFeeAccount: swapFeeAccount,\n\t\t\tquoteTokenMint: quoteTokenMint,\n\t\t\tswapTokenAccountA: swapTokenAccountA,\n\t\t\tswapTokenAccountB: swapTokenAccountB,\n\t\t\townerSolAccount: ownerSolAccount,\n\t\t\tnftTokenProgram: TOKEN_PROGRAM_ID,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tswapProgram: SWAP_PROGRAM_ID,\n\t\t\tnftTokenMetadataProgram: PROGRAM_ID,\n\t\t\tassociatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n\t\t\tsystemProgram: web3.SystemProgram.programId,\n\t\t\taToB: aToB,\n\t\t\tamountIn: new BN(amount),\n\t\t}))\n\n\t\treturn txn\n\t}\n\n\tasync createMarket(payer: web3.PublicKey, collection: web3.PublicKey, nft: web3.PublicKey, collectionTokenMint: web3.PublicKey, startPrice: number) {\n\t\tconst poolTransaction = new web3.Transaction()\n\n\t\t// const quoteMint = MSOL\n\t\tconst quoteMint = WSOL\n\n\t\tconst ix = await this._createMarket(payer, nft, collection, collectionTokenMint, quoteMint, TOKEN_PROGRAM_ID, new BN(startPrice))\n\t\tpoolTransaction.add(ix.txn)\n\t\treturn {transactions: [poolTransaction], signers: [ix.signers]}\n\t}\n\n\tasync _createMarket(payer: web3.PublicKey, nft: web3.PublicKey, collection: web3.PublicKey, collectionTokenMint: web3.PublicKey, quoteMint: web3.PublicKey, quoteTokenProgram: web3.PublicKey, startPrice: BN): Promise<{ txn: web3.Transaction, signers: web3.Keypair[] }> {\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst [pool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID);\n\t\tconst swapPool = web3.Keypair.generate();\n\t\tconst poolLpMint = web3.Keypair.generate();\n\n\t\tconst [swapAuthority] = web3.PublicKey.findProgramAddressSync([swapPool.publicKey.toBuffer()], SWAP_PROGRAM_ID)\n\n\t\tconst ownerAccountA = getAssociatedTokenAddressSync(collectionTokenMint, payer, false, TOKEN_2022_PROGRAM_ID)\n\t\tconst ownerAccountB = getAssociatedTokenAddressSync(quoteMint, payer, false, TOKEN_PROGRAM_ID)\n\n\t\tconst tokenAccountA = getAssociatedTokenAddressSync(collectionTokenMint, swapAuthority, true, TOKEN_2022_PROGRAM_ID)\n\t\tconst tokenAccountB = getAssociatedTokenAddressSync(quoteMint, swapAuthority, true, TOKEN_PROGRAM_ID)\n\n\t\tconst feeAccount = getAssociatedTokenAddressSync(poolLpMint.publicKey, SWAP_PROGRAM_OWNER_FEE_ADDRESS, false, TOKEN_2022_PROGRAM_ID)\n\t\tconst poolLpAccount = getAssociatedTokenAddressSync(poolLpMint.publicKey, payer, false, TOKEN_2022_PROGRAM_ID)\n\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst [market, bump] = web3.PublicKey.findProgramAddressSync([collection.toBuffer(), quoteMint.toBuffer()], this.programID)\n\n\t\tconst ownerNftAccount = getAssociatedTokenAddressSync(nft, payer, false, TOKEN_PROGRAM_ID)\n\t\tconst poolNftAccount = getAssociatedTokenAddressSync(nft, pool, true, TOKEN_PROGRAM_ID)\n\n\t\t//TODO Remove?\n\t\t// transaction.add(\n\t\t// \tweb3.SystemProgram.createAccount({\n\t\t// \t\tfromPubkey: payer,\n\t\t// \t\tnewAccountPubkey: poolLpMint.publicKey,\n\t\t// \t\tspace: MINT_SIZE,\n\t\t// \t\tlamports: await getMinimumBalanceForRentExemptMint(this.connection),\n\t\t// \t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t// \t}),\n\t\t// \tcreateInitializeMint2Instruction(poolLpMint.publicKey, 2, swapAuthority, null, TOKEN_2022_PROGRAM_ID)\n\t\t// )\n\n\n\t\tif (!await this.accountExists(ownerAccountA))\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, ownerAccountA, payer, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, tokenAccountA, swapAuthority, collectionTokenMint, TOKEN_2022_PROGRAM_ID))\n\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, tokenAccountB, swapAuthority, quoteMint, TOKEN_PROGRAM_ID))\n\n\t\t// transaction.add(createAssociatedTokenAccountInstruction(payer, poolLpAccount, payer, poolLpMint.publicKey, TOKEN_2022_PROGRAM_ID))\n\t\t// transaction.add(createAssociatedTokenAccountInstruction(payer, feeAccount, SWAP_PROGRAM_OWNER_FEE_ADDRESS, poolLpMint.publicKey, TOKEN_2022_PROGRAM_ID))\n\n\t\ttransaction.add(this.createMarketInstruction({\n\t\t\towner: payer,\n\t\t\tpool: pool,\n\t\t\tmarket: market,\n\t\t\tnftMint: nft,\n\t\t\tnftMetadata: nftMetadata,\n\t\t\townerNftAccount: ownerNftAccount,\n\t\t\tpoolNftAccount: poolNftAccount,\n\t\t\tcollectionTokenMint: collectionTokenMint,\n\t\t\tcollection: collection,\n\t\t\tswapPool: swapPool.publicKey,\n\t\t\tswapAuthority: swapAuthority,\n\t\t\tquoteMint: quoteMint,\n\t\t\townerAccountA: ownerAccountA,\n\t\t\townerAccountB: ownerAccountB,\n\t\t\ttokenAccountA: tokenAccountA,\n\t\t\ttokenAccountB: tokenAccountB,\n\t\t\tpoolLpMint: poolLpMint.publicKey,\n\t\t\tfeeAccountOwner: SWAP_PROGRAM_OWNER_FEE_ADDRESS,\n\t\t\tfeeAccount: feeAccount,\n\t\t\tpoolLpAccount: poolLpAccount,\n\t\t\ttokenV1Program: TOKEN_PROGRAM_ID,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tswapProgram: SWAP_PROGRAM_ID,\n\t\t\ttokenMetadataProgram: METADATA_2022_PROGRAM_ID,\n\t\t\tsystemProgram: web3.SystemProgram.programId,\n\t\t\tassociatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n\t\t\tbump,\n\t\t\tstartPrice\n\t\t}))\n\n\t\treturn {\n\t\t\ttxn: transaction,\n\t\t\tsigners: [\n\t\t\t\tswapPool,\n\t\t\t\tpoolLpMint\n\t\t\t]\n\t\t}\n\t}\n\n\tcreateMarketInstruction(args: {\n\t\towner: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tmarket: web3.PublicKey,\n\t\tnftMint: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\townerNftAccount: web3.PublicKey,\n\t\tpoolNftAccount: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\tcollection: web3.PublicKey,\n\t\tswapPool: web3.PublicKey,\n\t\tswapAuthority: web3.PublicKey,\n\t\tquoteMint: web3.PublicKey,\n\t\townerAccountA: web3.PublicKey,\n\t\townerAccountB: web3.PublicKey,\n\t\ttokenAccountA: web3.PublicKey,\n\t\ttokenAccountB: web3.PublicKey,\n\t\tpoolLpMint: web3.PublicKey,\n\t\tfeeAccountOwner: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\tpoolLpAccount: web3.PublicKey,\n\t\ttokenV1Program: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tswapProgram: web3.PublicKey,\n\t\ttokenMetadataProgram: web3.PublicKey,\n\t\tsystemProgram: web3.PublicKey,\n\t\tassociatedTokenProgram: web3.PublicKey,\n\t\tbump: number,\n\t\tstartPrice: BN\n\t}): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('bump'),\n\t\t\tu64('startPrice')\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"create_market\")\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tbump: args.bump,\n\t\t\tstartPrice: args.startPrice,\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys: [\n\t\t\t\t{pubkey: args.owner, isWritable: true, isSigner: true},\n\t\t\t\t{pubkey: args.pool, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.market, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.nftMint, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.nftMetadata, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.ownerNftAccount, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.poolNftAccount, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.collectionTokenMint, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.collection, isWritable: false, isSigner: false},\n\n\t\t\t\t{pubkey: args.swapPool, isWritable: true, isSigner: true},\n\t\t\t\t{pubkey: args.swapAuthority, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.quoteMint, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.ownerAccountA, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.ownerAccountB, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.tokenAccountA, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.tokenAccountB, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.poolLpMint, isWritable: true, isSigner: true},\n\t\t\t\t{pubkey: args.feeAccountOwner, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.feeAccount, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: args.poolLpAccount, isWritable: true, isSigner: false},\n\n\t\t\t\t{pubkey: args.tokenV1Program, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.tokenProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.swapProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.tokenMetadataProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.systemProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: args.associatedTokenProgram, isWritable: false, isSigner: false},\n\t\t\t],\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tasync createLocker(\n\t\tpayer: web3.PublicKey,\n\t\tcollection: web3.PublicKey,\n\t\tnft: web3.PublicKey,\n\t\tmint: web3.Keypair = web3.Keypair.generate()\n\t) {\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst collectionTokenMint = mint.publicKey;\n\n\t\tconst [pool, bump] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID);\n\n\t\tconst nft_locker = getAssociatedTokenAddressSync(nft, pool, true, TOKEN_PROGRAM_ID)\n\n\t\tconst nftMetadata = this.token2022.getMetadataPDA(nft, PROGRAM_ID)\n\t\tconst collectionMetadata = this.token2022.getMetadataPDA(collection, PROGRAM_ID)\n\t\tconst collectionTokenMetadata = this.token2022.getMetadataPDA(collectionTokenMint, METADATA_2022_PROGRAM_ID)\n\n\t\tconst metadataUpdateAuthority = payer\n\n\t\tconst nft_src = getAssociatedTokenAddressSync(nft, payer, false, TOKEN_PROGRAM_ID)\n\t\tconst token_dst = getAssociatedTokenAddressSync(collectionTokenMint, payer, false, TOKEN_2022_PROGRAM_ID)\n\n\t\ttransaction.add(this.createLockerInstruction(\n\t\t\tpool,\n\t\t\tpayer,\n\t\t\tnft,\n\t\t\tnft_src,\n\t\t\tnftMetadata,\n\t\t\ttoken_dst,\n\t\t\tnft_locker,\n\t\t\tcollection,\n\t\t\tcollectionMetadata,\n\t\t\tcollectionTokenMint,\n\t\t\tcollectionTokenMetadata,\n\t\t\tmetadataUpdateAuthority,\n\t\t\tTOKEN_PROGRAM_ID,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tPROGRAM_ID, //NFT Metadata\n\t\t\tMETADATA_2022_PROGRAM_ID, //Collection token metadata\n\t\t\tbump,\n\t\t))\n\n\t\treturn {\n\t\t\ttransactions: [transaction],\n\t\t\tsigners: [[mint]]\n\t\t}\n\t}\n\n\tcreateLockerInstruction(\n\t\tpool: web3.PublicKey,\n\t\tpayer: web3.PublicKey,\n\t\tnft: web3.PublicKey,\n\t\tnftSrc: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\ttokenDst: web3.PublicKey,\n\t\tnftLocker: web3.PublicKey,\n\t\tcollection: web3.PublicKey,\n\t\tcollectionMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\tcollectionTokenMetadata: web3.PublicKey,\n\t\tmetadataUpdateAuthority: web3.PublicKey,\n\t\tnftTokenProgram: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tnftTokenMetadataProgram: web3.PublicKey,\n\t\ttokenMetadataProgram: web3.PublicKey,\n\t\tbump: number\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('bump'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"create_pool\")\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tbump: bump\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys: [\n\t\t\t\t{pubkey: pool, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: payer, isWritable: true, isSigner: true},\n\t\t\t\t{pubkey: collection, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: collectionMetadata, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: collectionTokenMint, isWritable: true, isSigner: true},\n\t\t\t\t{pubkey: collectionTokenMetadata, isWritable: true, isSigner: false},\n\t\t\t\t{pubkey: metadataUpdateAuthority, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: tokenProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: nftTokenMetadataProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: tokenMetadataProgram, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: web3.SystemProgram.programId, isWritable: false, isSigner: false},\n\t\t\t\t{pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false, isSigner: false},\n\t\t\t],\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Create a NFT token mint\n\t * @param payer\n\t * @param collection\n\t * @param tokenMint\n\t * @param decimals\n\t * @param mint_authority\n\t * @param priorityFee\n\t * @param metadataCID\n\t */\n\tasync _getCreateMintTransaction(payer: web3.PublicKey, collection: web3.PublicKey, tokenMint: web3.PublicKey, decimals = 0, mint_authority: web3.PublicKey, priorityFee: number, metadataCID: string): Promise {\n\t\tconst metaPk = this.token2022.getMetadataPDA(collection, PROGRAM_ID) //Get original metadata\n\n\t\tconst collectionInfo = await Metadata.fromAccountAddress(this.connection, metaPk)\n\n\t\tconst mintName = collectionInfo.data.name.trim().split(/\\r|\\r\\n|\\n/)[0]\n\t\tconst mintSymbol = collectionInfo.data.symbol.trim().split(/\\r|\\r\\n|\\n/)[0]\n\t\tconst metadataUri = collectionInfo.data.uri.trim().split(/\\r|\\r\\n|\\n/)[0]\n\n\t\tconst config = new CreateMint(mintName, mintSymbol, metadataUri, BigInt(0), mint_authority, null, decimals, false)\n\t\tconfig.addExtension(ExtensionType.TransferFeeConfig, {\n\t\t\tmaxFee: 0,\n\t\t\tfeeBasisPoints: collectionInfo.data.sellerFeeBasisPoints,\n\t\t\twithdraw_withheld_authority: mint_authority,\n\t\t\ttransfer_fee_config_authority: payer\n\t\t})\n\n\t\treturn await this.token2022.getCreateMintTransaction(payer, tokenMint, config, priorityFee, metadataCID)\n\t}\n\n\tcreateExchangeNFTInstruction(args: {\n\t\tpayer: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tnftMint: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\townerTokenAccount: web3.PublicKey,\n\t\townerNftAccount: web3.PublicKey,\n\t\tpoolNftAccount: web3.PublicKey,\n\t\tnftTokenProgram: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tnftTokenMetadataProgram: web3.PublicKey,\n\t\tassociatedTokenProgram: web3.PublicKey,\n\t\tsystemProgram: web3.PublicKey,\n\t\taToB: boolean\n\t}): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tbool('aToB'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"exchange_nft\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\taToB: args.aToB\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: args.payer, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.pool, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.nftMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMetadata, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionTokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.nftTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.tokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftTokenMetadataProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.associatedTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.systemProgram, isSigner: false, isWritable: false},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\n\t\t//TODO Implement above\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys: [],\n\t\t\tprogramId: this.programID\n\t\t})\n\t}\n\n\tcreateExchangeNFTSOLInstruction(args: {\n\t\tpayer: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tnftMint: web3.PublicKey,\n\t\tnftMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\townerTokenAccount: web3.PublicKey,\n\t\townerNftAccount: web3.PublicKey,\n\t\tpoolNftAccount: web3.PublicKey,\n\t\tswapPool: web3.PublicKey,\n\t\tswapAuthority: web3.PublicKey,\n\t\tswapLpMint: web3.PublicKey,\n\t\tswapFeeAccount: web3.PublicKey,\n\t\tquoteTokenMint: web3.PublicKey,\n\t\tswapTokenAccountA: web3.PublicKey,\n\t\tswapTokenAccountB: web3.PublicKey,\n\t\townerSolAccount: web3.PublicKey,\n\t\tnftTokenProgram: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tswapProgram: web3.PublicKey,\n\t\tnftTokenMetadataProgram: web3.PublicKey,\n\t\tassociatedTokenProgram: web3.PublicKey,\n\t\tsystemProgram: web3.PublicKey,\n\t\tamountIn: BN,\n\t\taToB: boolean\n\t}): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tbool('aToB'),\n\t\t\tu64('amount_in'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"exchange_sol\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\taToB: args.aToB,\n\t\t\tamount_in: args.amountIn\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: args.payer, isSigner: true, isWritable: true},\n\t\t\t{pubkey: args.pool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftMetadata, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionTokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolNftAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapPool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapAuthority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapLpMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.quoteTokenMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapFeeAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapTokenAccountA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.swapTokenAccountB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.ownerSolAccount, isSigner: false, isWritable: true},\n\n\t\t\t{pubkey: args.nftTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.tokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.swapProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.nftTokenMetadataProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.associatedTokenProgram, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.systemProgram, isSigner: false, isWritable: false},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tasync claimRoyalties(\n\t\tpayer: web3.PublicKey,\n\t\tcollection: web3.PublicKey,\n\t) {\n\t\t//Get pool\n\t\tconst [collectionPool] = web3.PublicKey.findProgramAddressSync([collection.toBuffer()], this.programID)\n\t\tconst pool = await this.getPool(collectionPool)\n\t\tif (!pool) {\n\t\t\treturn Promise.reject(\"collection pool not found\")\n\t\t}\n\n\t\t//Get collection metadata\n\t\tconst collectionMetadata = this.token2022.getMetadataPDA(collection, PROGRAM_ID)\n\n\t\tconst metadata = await Metadata.fromAccountAddress(this.connection, collectionMetadata)\n\t\tif (!metadata) {\n\t\t\treturn Promise.reject(\"collection metadata not found\")\n\t\t}\n\n\t\tconst poolTokenAccount = getAssociatedTokenAddressSync(pool.tokenMint, collectionPool, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst creators = metadata?.data?.creators || [];\n\t\tconst creatorAccounts = [];\n\n\t\tfor (let i = 0; i < creators.length; i++) {\n\t\t\tif (!creators[i].verified)\n\t\t\t\tcontinue\n\t\t\tcreatorAccounts.push(creators[i].address)\n\t\t}\n\n\t\tconst txn = new web3.Transaction()\n\n\t\tif (!await this.accountExists(poolTokenAccount))\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(payer, poolTokenAccount, collectionPool, pool.tokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\ttxn.add(this.createClaimRoyaltiesInstruction({\n\t\t\tcollectionMetadata: collectionMetadata,\n\t\t\tcollectionTokenMint: pool.tokenMint,\n\t\t\tpayer: payer,\n\t\t\tpool: collectionPool,\n\t\t\tpoolTokenAccount: poolTokenAccount,\n\t\t\ttokenProgram: TOKEN_2022_PROGRAM_ID,\n\t\t\tcreators: creatorAccounts,\n\t\t}))\n\n\t\treturn {\n\t\t\ttransactions: [txn],\n\t\t\tsigners: []\n\t\t}\n\t}\n\n\n\tcreateClaimRoyaltiesInstruction(args: {\n\t\tpayer: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tcollectionMetadata: web3.PublicKey,\n\t\tcollectionTokenMint: web3.PublicKey,\n\t\tpoolTokenAccount: web3.PublicKey,\n\t\ttokenProgram: web3.PublicKey,\n\t\tcreators: web3.PublicKey[]\n\t}): web3.TransactionInstruction {\n\t\tconst desc = this.ixDescriminator(\"claim_royalties\")\n\t\tconst data = Buffer.concat([desc]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: args.payer, isSigner: true, isWritable: false},\n\t\t\t{pubkey: args.pool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionMetadata, isSigner: false, isWritable: false},\n\t\t\t{pubkey: args.collectionTokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.poolTokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: args.tokenProgram, isSigner: false, isWritable: false},\n\t\t];\n\n\t\tfor (let i = 0; i < args.creators.length; i++)\n\t\t\tkeys.push(...[\n\t\t\t\t{pubkey: args.creators[i], isSigner: false, isWritable: false},\n\t\t\t\t{pubkey: getAssociatedTokenAddressSync(args.collectionTokenMint, args.creators[i], false, args.tokenProgram), isSigner: false, isWritable: true},\n\t\t\t])\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.programID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * Convert to instruction descriminator\n\t * Should be SNAKE_CASE (_)\n\t * @param methodName\n\t */\n\tixDescriminator(methodName: string) {\n\t\treturn Buffer.from(sha256.digest(`global:${methodName}`)).slice(0, 8)\n\t}\n\n\n\tsanitizeTokenMeta(tokenData: Metadata) {\n\t\treturn {\n\t\t\t...tokenData,\n\t\t\tdata: {\n\t\t\t\t...tokenData?.data,\n\t\t\t\tname: this.sanitizeMetaStrings(tokenData?.data?.name || ''),\n\t\t\t\tsymbol: this.sanitizeMetaStrings(tokenData?.data?.symbol || ''),\n\t\t\t\turi: this.sanitizeMetaStrings(tokenData?.data?.uri || ''),\n\t\t\t},\n\t\t}\n\t}\n\n\t/**\n\t * Remove all empty space, new line, etc. symbols\n\t *\n\t * @param metaString\n\t */\n\tsanitizeMetaStrings(metaString: string) {\n\t\treturn metaString.replace(/\\0/g, \"\");\n\t}\n\n\tasync accountExists(account: web3.PublicKey) {\n\t\tconst acc = await this.connection.getAccountInfo(account, \"confirmed\").catch(e => {\n\t\t})\n\t\treturn !!acc;\n\t}\n}","import { blob, GetStructureSchema, publicKey, struct, u64 } from \"../marshmallow\";\n\n/* ================= state layouts ================= */\nexport const MARKET_STATE_LAYOUT_V3 = struct([\n blob(5),\n\n blob(8), // accountFlagsLayout('accountFlags'),\n\n publicKey(\"ownAddress\"),\n\n u64(\"vaultSignerNonce\"),\n\n publicKey(\"baseMint\"),\n publicKey(\"quoteMint\"),\n\n publicKey(\"baseVault\"),\n u64(\"baseDepositsTotal\"),\n u64(\"baseFeesAccrued\"),\n\n publicKey(\"quoteVault\"),\n u64(\"quoteDepositsTotal\"),\n u64(\"quoteFeesAccrued\"),\n\n u64(\"quoteDustThreshold\"),\n\n publicKey(\"requestQueue\"),\n publicKey(\"eventQueue\"),\n\n publicKey(\"bids\"),\n publicKey(\"asks\"),\n\n u64(\"baseLotSize\"),\n u64(\"quoteLotSize\"),\n\n u64(\"feeRateBps\"),\n\n u64(\"referrerRebatesAccrued\"),\n\n blob(7),\n]);\n\nexport type MarketStateLayoutV3 = typeof MARKET_STATE_LAYOUT_V3;\nexport type MarketStateLayout = MarketStateLayoutV3;\n\nexport type MarketStateV3 = GetStructureSchema;\nexport type MarketState = MarketStateV3;\n\n/* ================= index ================= */\n// version => market state layout\nexport const MARKET_VERSION_TO_STATE_LAYOUT: {\n [version: number]: MarketStateLayout;\n} = {\n 3: MARKET_STATE_LAYOUT_V3,\n};\n","import {web3} from \"@project-serum/anchor\";\nimport {MARKET_STATE_LAYOUT_V3} from \"@/api/layouts/serum\";\nimport {OPENBOOK_PROGRAM_ID} from \"@/api/token_swap/constants\";\n\nexport const MARKET_ACCOUNT_FLAGS_B58_ENCODED = \"W723RTUpoZ\";\n\nexport default class Openbook {\n\n\tconnection: web3.Connection\n\n\tprogramID: web3.PublicKey = OPENBOOK_PROGRAM_ID\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\t}\n\n\tasync getMarkets() {\n\t\tconst resp = await this.connection.getProgramAccounts(this.programID, {\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 5,\n\t\t\t\t\t\tbytes: MARKET_ACCOUNT_FLAGS_B58_ENCODED,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\n\t\treturn resp.map((m) => {\n\t\t\treturn MARKET_STATE_LAYOUT_V3.decode(m.account.data)\n\t\t})\n\t}\n}","import {web3} from \"@project-serum/anchor\";\n\nexport class RugCheckClient {\n\n\tbaseURI = \"https://api.rugcheck.xyz/v1\"\n\n\tasync summary(mint: web3.PublicKey): Promise {\n\t\tconst resp = await fetch(`${this.baseURI}/tokens/${mint}/report/summary`)\n\t\tif (!resp)\n\t\t\treturn\n\n\t\treturn await resp.json()\n\t}\n\n\tasync report(mint: web3.PublicKey): Promise {\n\t\tconst resp = await fetch(`${this.baseURI}/tokens/${mint}/report`)\n\t\tif (!resp)\n\t\t\treturn\n\n\t\treturn await resp.json()\n\t}\n\n}","import {web3} from \"@project-serum/anchor\";\nimport {\n\tcreateAssociatedTokenAccountInstruction,\n\tcreateInitializeMintInstruction,\n\tcreateMintToInstruction,\n\tgetAssociatedTokenAddressSync,\n\tMINT_SIZE,\n\tTOKEN_PROGRAM_ID\n} from \"@solana/spl-token\";\nimport {createCreateMetadataAccountV3Instruction, DataV2, PROGRAM_ID} from \"@metaplex-foundation/mpl-token-metadata\";\n\n\nexport class CreateMintV1 {\n\tname: string\n\tsymbol: string\n\tmetadataUri: string\n\tdecimals: number\n\ttotalSupply: bigint\n\n\tmintAuthority: web3.PublicKey\n\tfreezeAuthority: web3.PublicKey | null\n\n\tsellerFeeBasisPoints: number = 0;\n\n\t//Do we mint the total supply to the user\n\tmintTotalSupply: boolean\n\n\tcreators : [] | null = null;\n\n\tconstructor(name: string, symbol: string, metadataUri: string, totalSupply: bigint, mintAuthority: web3.PublicKey, freezeAuthority: web3.PublicKey | null, decimals = 6, mintTotalSupply = true) {\n\t\tthis.name = name\n\t\tthis.symbol = symbol\n\t\tthis.metadataUri = metadataUri\n\t\tthis.totalSupply = totalSupply\n\t\tthis.decimals = decimals\n\t\tthis.mintTotalSupply = mintTotalSupply\n\t\tthis.mintAuthority = mintAuthority\n\t\tthis.freezeAuthority = freezeAuthority\n\t}\n\n\tsetSellerFeeBasisPoints(bp: number) {\n\t\tthis.sellerFeeBasisPoints = bp\n\t}\n\n\tsetCreators(creators: []) {\n\t\tthis.creators = creators\n\t}\n}\n\nexport default class TokenV1Client {\n\n\tFEE_ACCOUNT = new web3.PublicKey(\"FLUXR4McuD2iXyP3wpP4XTjSWmB86ppMiyoA52UA9bKb\")\n\n\tconnection: web3.Connection\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\t}\n\n\tasync getCreateMintTransaction(owner: web3.PublicKey, tokenMint: web3.PublicKey, config: CreateMintV1, priorityFee: number, metadataCID: string) {\n\t\tconst mintLamports = await this.connection.getMinimumBalanceForRentExemption(MINT_SIZE);\n\n\t\tconst ata = getAssociatedTokenAddressSync(tokenMint, owner, true, TOKEN_PROGRAM_ID)\n\n\t\tconst [metadataPDA] = web3.PublicKey.findProgramAddressSync([Buffer.from(\"metadata\"), PROGRAM_ID.toBuffer(), tokenMint.toBuffer()], PROGRAM_ID)\n\n\t\tconst ON_CHAIN_METADATA = {\n\t\t\tname: config.name,\n\t\t\tsymbol: config.symbol,\n\t\t\turi: config.metadataUri,\n\t\t\tsellerFeeBasisPoints: config.sellerFeeBasisPoints,\n\t\t\tuses: null,\n\t\t\tcreators: config.creators,\n\t\t\tcollection: null,\n\t\t} as DataV2;\n\n\n\t\tconst unitLimit = 100_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\t\tconst txn = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: owner,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 100_000_000,\n\t\t\t}),\n\t\t\tnew web3.TransactionInstruction({\n\t\t\t\tkeys: [],\n\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\tdata: Buffer.from(metadataCID)\n\t\t\t}),\n\t\t\tweb3.SystemProgram.createAccount({\n\t\t\t\tfromPubkey: owner,\n\t\t\t\tnewAccountPubkey: tokenMint,\n\t\t\t\tspace: MINT_SIZE,\n\t\t\t\tlamports: mintLamports,\n\t\t\t\tprogramId: TOKEN_PROGRAM_ID,\n\t\t\t}),\n\t\t);\n\n\t\ttxn.add(createInitializeMintInstruction(tokenMint, config.decimals, config.mintAuthority, config.freezeAuthority, TOKEN_PROGRAM_ID),\n\t\t\tcreateCreateMetadataAccountV3Instruction({\n\t\t\t\tmetadata: metadataPDA,\n\t\t\t\tmint: tokenMint,\n\t\t\t\tmintAuthority: config.mintAuthority,\n\t\t\t\tpayer: owner,\n\t\t\t\tupdateAuthority: owner,\n\t\t\t}, {\n\t\t\t\tcreateMetadataAccountArgsV3:\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: ON_CHAIN_METADATA,\n\t\t\t\t\t\tisMutable: true,\n\t\t\t\t\t\tcollectionDetails: null\n\t\t\t\t\t}\n\t\t\t}, PROGRAM_ID),\n\t\t\tcreateAssociatedTokenAccountInstruction(owner, ata, owner, tokenMint, TOKEN_PROGRAM_ID),\n\t\t)\n\n\t\tif (config.mintTotalSupply) {\n\t\t\ttxn.add(createMintToInstruction(tokenMint, ata, owner, config.totalSupply, [], TOKEN_PROGRAM_ID))\n\t\t}\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\n\t/**\n\t * Returns the token mints metadata PDA\n\t * @param mint\n\t * @param metadataProgram\n\t */\n\tgetMetadataPDA(mint: web3.PublicKey, metadataProgram = PROGRAM_ID) {\n\t\t//@ts-ignore\n\t\tconst [metaPDA] = web3.PublicKey.findProgramAddressSync([\"metadata\", metadataProgram.toBuffer(), mint.toBuffer()], metadataProgram)\n\t\treturn metaPDA\n\t}\n}","import {struct} from '@solana/buffer-layout';\nimport {publicKey, bool} from '@solana/buffer-layout-utils';\nimport {PublicKey} from \"@solana/web3.js\";\nimport {ExtensionType, getExtensionData, Mint} from \"@solana/spl-token\";\n\n\n/** TransferHook as stored by the program */\nexport interface ConfidentialTransferMint {\n\tauditorElgamalPubkey: PublicKey;\n\tauthority: PublicKey;\n\tautoApproveNewAccounts: boolean;\n}\n\n/** Buffer layout for de/serializing a confidential transfer extension */\nexport const ConfidentialTransferMintLayout = struct([publicKey('auditorElgamalPubkey'), publicKey('authority'), bool('autoApproveNewAccounts')]);\n\nexport const CONFIDENTIAL_TRANSFER_MINT_SIZE = ConfidentialTransferMintLayout.span;\n\nexport function getConfidentialTransferMint(mint: Mint): ConfidentialTransferMint | null {\n\tconst extensionData = getExtensionData(ExtensionType.ConfidentialTransferMint, mint.tlvData);\n\tif (extensionData !== null) {\n\t\treturn ConfidentialTransferMintLayout.decode(extensionData);\n\t} else {\n\t\treturn null;\n\t}\n}\n","import {struct, u16, u8} from \"@solana/buffer-layout\";\nimport {u64} from \"@solana/buffer-layout-utils\";\nimport {TOKEN_2022_PROGRAM_ID} from \"@solana/spl-token\";\nimport {web3} from \"@project-serum/anchor\";\n\nenum IX {\n\tTransferFeeExtension = 26\n}\n\nenum TIX {\n\tSetTransferFee = 5\n}\n\n// SetTransferFee\nexport interface SetTransferFeeInstructionData {\n\tinstruction: IX.TransferFeeExtension; // TransferFeeExtension\n\ttransferFeeInstruction: TIX.SetTransferFee; //SetTransferFee\n\ttransferFeeBasisPoints: number;\n\tmaximumFee: bigint;\n}\n\nexport const setTransferFeeInstructionData = struct([\n\tu8('instruction'),\n\tu8('transferFeeInstruction'),\n\tu16('transferFeeBasisPoints'),\n\tu64('maximumFee'),\n]);\n\nexport function createSetTransferFeeInstruction(\n\tmint: web3.PublicKey,\n\tauthority: web3.PublicKey,\n\ttransferFeeBasisPoints: number,\n\tmaximumFee: bigint,\n\tsigners: (web3.Signer | web3.PublicKey)[] = [],\n\tprogramId = TOKEN_2022_PROGRAM_ID\n): web3.TransactionInstruction {\n\tif (programId !== TOKEN_2022_PROGRAM_ID) {\n\t\tthrow new Error(\"TokenUnsupportedInstructionError\");\n\t}\n\tconst data = Buffer.alloc(setTransferFeeInstructionData.span);\n\tsetTransferFeeInstructionData.encode(\n\t\t{\n\t\t\tinstruction: IX.TransferFeeExtension,\n\t\t\ttransferFeeInstruction: TIX.SetTransferFee,\n\t\t\ttransferFeeBasisPoints: transferFeeBasisPoints,\n\t\t\tmaximumFee: maximumFee,\n\t\t},\n\t\tdata\n\t);\n\n\tconsole.log(\"DATA\", {\n\t\tdata,\n\t\tdStr: data.toString(\"utf-8\")\n\t})\n\n\tconst keys = addSigners([{pubkey: mint, isSigner: false, isWritable: true}], authority, signers);\n\treturn new web3.TransactionInstruction({keys, programId, data});\n}\n\nexport function addSigners(\n\tkeys: web3.AccountMeta[],\n\townerOrAuthority: web3.PublicKey,\n\tmultiSigners: (web3.Signer | web3.PublicKey)[]\n): web3.AccountMeta[] {\n\tif (multiSigners.length) {\n\t\tkeys.push({pubkey: ownerOrAuthority, isSigner: false, isWritable: false});\n\t\tfor (const signer of multiSigners) {\n\t\t\tkeys.push({\n\t\t\t\tpubkey: signer instanceof web3.PublicKey ? signer : signer.publicKey,\n\t\t\t\tisSigner: true,\n\t\t\t\tisWritable: false,\n\t\t\t});\n\t\t}\n\t} else {\n\t\tkeys.push({pubkey: ownerOrAuthority, isSigner: true, isWritable: false});\n\t}\n\treturn keys;\n}\n\n\n/** A decoded, valid SetTransferFee instruction */\nexport interface DecodedSetTransferFeeInstruction {\n\tprogramId: web3.PublicKey;\n\tkeys: {\n\t\tmint: web3.AccountMeta;\n\t};\n\tdata: {\n\t\tinstruction: IX.TransferFeeExtension;\n\t\ttransferFeeInstruction: TIX.SetTransferFee;\n\t\ttransferFeeBasisPoints: number;\n\t\tmaximumFee: bigint;\n\t};\n}\n\n/**\n * Decode a SetTransferFee instruction and validate it\n *\n * @param instruction Transaction instruction to decode\n * @param programId SPL Token program account\n *\n * @return Decoded, valid instruction\n */\nexport function decodeSetTransferFeeInstruction(\n\tinstruction: web3.TransactionInstruction,\n\tprogramId: web3.PublicKey\n): DecodedSetTransferFeeInstruction {\n\tif (!instruction.programId.equals(programId)) throw new Error(\"TokenInvalidInstructionProgramError\");\n\tif (instruction.data.length !== setTransferFeeInstructionData.span)\n\t\tthrow new Error(\"TokenInvalidInstructionDataError\");\n\n\tconst {\n\t\tkeys: {mint},\n\t\tdata,\n\t} = decodeSetTransferFeeInstructionUnchecked(instruction);\n\tif (\n\t\tdata.instruction !== IX.TransferFeeExtension ||\n\t\tdata.transferFeeInstruction !== TIX.SetTransferFee\n\t)\n\t\tthrow new Error(\"TokenInvalidInstructionTypeError\");\n\tif (!mint) throw new Error(\"TokenInvalidInstructionKeysError\");\n\n\treturn {\n\t\tprogramId,\n\t\tkeys: {\n\t\t\tmint,\n\t\t},\n\t\tdata,\n\t};\n}\n\n/** A decoded, valid SetTransferFee instruction */\nexport interface DecodedSetTransferFeeInstructionUnchecked {\n\tprogramId: web3.PublicKey;\n\tkeys: {\n\t\tmint: web3.AccountMeta;\n\t};\n\tdata: {\n\t\tinstruction: IX.TransferFeeExtension;\n\t\ttransferFeeInstruction: TIX.SetTransferFee;\n\t\ttransferFeeBasisPoints: number;\n\t\tmaximumFee: bigint;\n\t};\n}\n\n/**\n * Decode a SetTransferFee instruction without validating it\n *\n * @param instruction Transaction instruction to decode\n *\n * @return Decoded, non-validated instruction\n */\nexport function decodeSetTransferFeeInstructionUnchecked({programId, keys: [mint], data,}: web3.TransactionInstruction): DecodedSetTransferFeeInstructionUnchecked {\n\tconst {instruction, transferFeeInstruction, transferFeeBasisPoints, maximumFee} = setTransferFeeInstructionData.decode(data);\n\treturn {\n\t\tprogramId,\n\t\tkeys: {\n\t\t\tmint,\n\t\t},\n\t\tdata: {\n\t\t\tinstruction,\n\t\t\ttransferFeeInstruction,\n\t\t\ttransferFeeBasisPoints,\n\t\t\tmaximumFee\n\t\t},\n\t};\n}","import {web3} from \"@project-serum/anchor\"\nimport {\n\tAccountState,\n\tAuthorityType,\n\tcreateAssociatedTokenAccountInstruction,\n\tcreateBurnCheckedInstruction,\n\tcreateEnableRequiredMemoTransfersInstruction,\n\tcreateHarvestWithheldTokensToMintInstruction,\n\tcreateInitializeDefaultAccountStateInstruction,\n\tcreateInitializeImmutableOwnerInstruction,\n\tcreateInitializeInstruction,\n\tcreateInitializeInterestBearingMintInstruction,\n\tcreateInitializeMetadataPointerInstruction,\n\tcreateInitializeMintCloseAuthorityInstruction,\n\tcreateInitializeMintInstruction,\n\tcreateInitializeNonTransferableMintInstruction,\n\tcreateInitializePermanentDelegateInstruction,\n\tcreateInitializeTransferFeeConfigInstruction,\n\tcreateMintToInstruction,\n\tcreateSetAuthorityInstruction,\n\tcreateThawAccountInstruction,\n\tcreateTransferCheckedInstruction,\n\tcreateUpdateAuthorityInstruction,\n\tcreateUpdateFieldInstruction,\n\tcreateUpdateRateInterestBearingMintInstruction,\n\tcreateWithdrawWithheldTokensFromAccountsInstruction,\n\tcreateWithdrawWithheldTokensFromMintInstruction,\n\tExtensionType,\n\tgetAssociatedTokenAddressSync,\n\tgetMintLen,\n\tTOKEN_2022_PROGRAM_ID,\n\tTOKEN_PROGRAM_ID\n} from \"@solana/spl-token\";\n\nimport {createCreateMetadataAccountV3Instruction, createUpdateMetadataAccountV2Instruction, DataV2, Metadata} from \"@metaplex-foundation/mpl-token-metadata\";\nimport {METADATA_2022_PROGRAM_ID} from \"@/api/token_swap/constants\";\nimport {createSetTransferFeeInstruction} from \"./instruction_ext\";\nimport {CreateMintV1} from \"@/api/token/token\";\nimport {UpdateMetadataAccountArgsV2} from \"@metaplex-foundation/mpl-token-metadata/dist/src/generated/types/UpdateMetadataAccountArgsV2\";\nimport {pack} from \"@solana/spl-token-metadata\";\nimport {ComputeBudgetProgram, SystemProgram} from \"@solana/web3.js\";\nimport {SOL_MINT} from \"@/shared\";\n\nexport const TOKEN_METADATA_PROGRAM_ID = METADATA_2022_PROGRAM_ID\n\nexport class CreateMint extends CreateMintV1 {\n\textensions: ExtensionType[] = []\n\textensionConfig = {}\n\n\tmetadata: any\n\n\n\tsetMetadata(meta: any) {\n\t\tthis.metadata = meta\n\t}\n\n\tmetadataLength(): number {\n\t\tif (!this.metadata) {\n\t\t\treturn 0\n\t\t}\n\n\t\treturn pack({\n\t\t\tadditionalMetadata: this.metadata?.additionalMetadata || [],\n\t\t\tmint: web3.PublicKey.default,\n\t\t\tsymbol: this.metadata.symbol,\n\t\t\tname: this.metadata.name,\n\t\t\turi: this.metadata.uri\n\t\t}).length + 4\n\t}\n\n\taddExtension(ext: ExtensionType, config: {} = {}) {\n\t\tthis.extensions.push(ext)\n\t\t//@ts-ignore\n\t\tthis.extensionConfig[ext] = config\n\t}\n}\n\nexport class CreateMetadata {\n\tname = \"\"\n\tsymbol = \"\"\n\turi = \"\"\n\tsellerFeeBasisPoints = 0\n\tmutable = false\n}\n\nexport class Token2022Client {\n\n\n\tFEE_ACCOUNT = new web3.PublicKey(\"FLUXR4McuD2iXyP3wpP4XTjSWmB86ppMiyoA52UA9bKb\")\n\n\tconnection: web3.Connection\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\t}\n\n\tisDevnet() {\n\t\treturn this.connection.rpcEndpoint.indexOf(\"devnet\") > -1;\n\t}\n\n\tmetadataProgram(): web3.PublicKey {\n\t\tif (this.isDevnet())\n\t\t\treturn new web3.PublicKey(\"M1tgEZCz7fHqRAR3G5RLxU6c6ceQiZyFK7tzzy4Rof4\")\n\t\treturn TOKEN_METADATA_PROGRAM_ID\n\t}\n\n\t/**\n\t * Returns all token mints\n\t * WARNING - Heavy RPC Call\n\t */\n\tasync getTokenIndex() {\n\t\treturn this.connection.getParsedProgramAccounts(TOKEN_2022_PROGRAM_ID)\n\t}\n\n\t/**\n\t * Returns the user token accounts\n\t * @param address\n\t */\n\tasync getUserTokenIndex(address: web3.PublicKey) {\n\t\tconst v1 = this.connection.getParsedTokenAccountsByOwner(address, {\n\t\t\tprogramId: TOKEN_PROGRAM_ID\n\t\t}, \"processed\")\n\t\tconst v2 = this.connection.getParsedTokenAccountsByOwner(address, {\n\t\t\tprogramId: TOKEN_2022_PROGRAM_ID\n\t\t}, \"processed\")\n\n\t\tconst resp = await Promise.all([v1, v2]).catch(e => {\n\t\t\tconsole.error(\"Failed to fetch userTokenIndex\", e)\n\t\t})\n\t\tif (!resp)\n\t\t\treturn []\n\n\t\treturn resp[0].value.concat(...resp[1].value)\n\t}\n\n\tasync getTokenPrices(mints: web3.PublicKey[]) {\n\t\tmints.push(new web3.PublicKey(\"So11111111111111111111111111111111111111112\"))\n\n\t\tconst tokenPrices = {};\n\t\tconst chunkSize = 100;\n\t\tfor (let i = 0; i < mints.length; i += chunkSize) {\n\t\t\tconst chunk = mints.slice(i, i + chunkSize);\n\t\t\tconst resp = await fetch(`https://data.fluxbeam.xyz/prices?ids=${chunk}`);\n\t\t\tconst data = await resp.json();\n\n\t\t\tconst keys = Object.keys(data.data)\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\ttokenPrices[keys[i]] = {\n\t\t\t\t\tid: keys[i],\n\t\t\t\t\tprice: data.data[keys[i]]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn tokenPrices\n\t}\n\n\t/**\n\t * Returns a token via mint\n\t * @param mint\n\t */\n\tasync getToken(mint: web3.PublicKey) {\n\t\treturn this.connection.getParsedAccountInfo(mint, {commitment: \"processed\"})\n\t}\n\n\t/**\n\t * Returns a token via mint\n\t * @param owner\n\t * @param mint\n\t * @param program\n\t */\n\tasync getUserTokenAccount(mint: web3.PublicKey, owner: web3.PublicKey, program = TOKEN_2022_PROGRAM_ID) {\n\t\treturn this.connection.getParsedAccountInfo(this.getAssociatedTokenPDA(mint, owner, program), {commitment: \"processed\"})\n\t}\n\n\n\t/**\n\t * Returns the token metadata via mint\n\t * @param mint\n\t * @param metadataProgram\n\t */\n\tasync getTokenMetadata(mint: web3.PublicKey, metadataProgram: web3.PublicKey = this.metadataProgram()) {\n\t\treturn this.getTokenMetadataRaw(this.getMetadataPDA(mint, metadataProgram))\n\t}\n\n\n\t/**\n\t * Returns the token metadata via mint\n\t * @param metadataAddress\n\t */\n\tasync getTokenMetadataRaw(metadataAddress: web3.PublicKey) {\n\t\treturn Metadata.fromAccountAddress(this.connection, metadataAddress, \"confirmed\")\n\t}\n\n\n\t/**\n\t * Returns the balance of a given mint & owner\n\t * @param owner\n\t */\n\tasync getSolBalance(owner: web3.PublicKey) {\n\t\tconst wsol = this.getAssociatedTokenPDA(new web3.PublicKey(SOL_MINT), owner, TOKEN_PROGRAM_ID)\n\t\tconst resp = await this.connection.getMultipleParsedAccounts([owner, wsol], {commitment: \"processed\"})\n\n\t\tlet solBalance = 0\n\t\tif (resp.value[0]) {\n\t\t\tsolBalance += resp.value[0].lamports\n\t\t}\n\n\t\tif (resp.value[1]) {\n\t\t\t// @ts-ignore\n\t\t\tsolBalance += Number(resp.value[1].data?.parsed?.info.tokenAmount.amount)\n\t\t\t// @ts-ignore\n\t\t}\n\n\t\treturn solBalance\n\t}\n\n\n\t/**\n\t * Returns the balance of a given mint & owner\n\t * @param mint\n\t * @param owner\n\t * @param program\n\t */\n\tasync getTokenBalance(mint: web3.PublicKey, owner: web3.PublicKey, program = TOKEN_2022_PROGRAM_ID) {\n\t\treturn this.connection.getParsedAccountInfo(this.getAssociatedTokenPDA(mint, owner, program), {commitment: \"processed\"})\n\t}\n\n\t/**\n\t * Returns the file metadata for given token metadata\n\t * @param metadata\n\t */\n\tasync getTokenFileMetadata(metadata: Metadata) {\n\t\tif (!metadata || !metadata.data.uri.replace(/\\0.*$/g, ''))\n\t\t\treturn\n\n\t\treturn (await fetch(metadata.data.uri)).json()\n\t}\n\n\n\t/**\n\t * Returns the token mints account for a given user\n\t * @param owner\n\t * @param mint\n\t * @param program\n\t * @param allowOwnerOffCurve\n\t */\n\tgetAssociatedTokenPDA(mint: web3.PublicKey, owner: web3.PublicKey, program = TOKEN_2022_PROGRAM_ID, allowOwnerOffCurve = false) {\n\t\treturn getAssociatedTokenAddressSync(mint, owner, allowOwnerOffCurve, program)\n\t}\n\n\n\t/**\n\t * Returns the token mints metadata PDA\n\t * @param mint\n\t * @param metadataProgram\n\t */\n\tgetMetadataPDA(mint: web3.PublicKey, metadataProgram = this.metadataProgram()) {\n\t\t//@ts-ignore\n\t\tconst [metaPDA] = web3.PublicKey.findProgramAddressSync([\"metadata\", metadataProgram.toBuffer(), mint.toBuffer()], metadataProgram)\n\t\treturn metaPDA\n\t}\n\n\tasync getUpdateToken22MetadataTransaction(mint: web3.PublicKey, metadata: any, authority: web3.PublicKey, data: UpdateMetadataAccountArgsV2, priorityFee: number, metadataCID: string) {\n\t\tconsole.log(\"getUpdateToken22MetadataTransaction\", {\n\t\t\tdata,\n\t\t\tmetadata\n\t\t})\n\n\t\tconst transaction = new web3.Transaction()\n\t\tconst unitLimit = 90_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\ttransaction.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: authority,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 100_000_000,\n\t\t\t}),\n\t\t\tnew web3.TransactionInstruction({\n\t\t\t\tkeys: [],\n\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\tdata: Buffer.from(metadataCID)\n\t\t\t}),\n\t\t)\n\n\n\t\tif (data.data.name != metadata.name) {\n\t\t\tconsole.debug(\"getUpdateToken22MetadataTransaction::name - \", data.data.name, metadata.name)\n\t\t\ttransaction.add(createUpdateFieldInstruction({\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t\tmetadata: mint,\n\t\t\t\tupdateAuthority: new web3.PublicKey(metadata.updateAuthority),\n\t\t\t\tfield: \"name\",\n\t\t\t\tvalue: data.data.name\n\t\t\t}))\n\t\t}\n\n\t\tif (data.data.symbol != metadata.symbol) {\n\t\t\tconsole.debug(\"getUpdateToken22MetadataTransaction::symbol - \", data.data.symbol, metadata.symbol)\n\t\t\ttransaction.add(createUpdateFieldInstruction({\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t\tmetadata: mint,\n\t\t\t\tupdateAuthority: new web3.PublicKey(metadata.updateAuthority),\n\t\t\t\tfield: \"symbol\",\n\t\t\t\tvalue: data.data.symbol\n\t\t\t}))\n\t\t}\n\n\t\tif (data.data.uri != metadata.uri) {\n\t\t\tconsole.debug(\"getUpdateToken22MetadataTransaction::uri - \", {\n\t\t\t\tdata: data.data.uri, meta: metadata.uri\n\t\t\t})\n\t\t\ttransaction.add(createUpdateFieldInstruction({\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t\tmetadata: mint,\n\t\t\t\tupdateAuthority: new web3.PublicKey(metadata.updateAuthority),\n\t\t\t\tfield: \"uri\",\n\t\t\t\tvalue: data.data.uri\n\t\t\t}))\n\t\t}\n\n\n\t\tconsole.debug(\"Adjust authority\", data.updateAuthority, metadata.updateAuthority)\n\t\tif (data.updateAuthority != metadata.updateAuthority) {\n\t\t\tconsole.debug(\"getUpdateToken22MetadataTransaction::authority - \", metadata.updateAuthority, data.updateAuthority)\n\t\t\tconst args = {\n\t\t\t\tmetadata: mint,\n\t\t\t\tnewAuthority: null,\n\t\t\t\toldAuthority: new web3.PublicKey(metadata.updateAuthority),\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID\n\t\t\t}\n\n\t\t\tif (data.updateAuthority) {\n\t\t\t\targs.newAuthority = new web3.PublicKey(data.updateAuthority)\n\t\t\t}\n\n\t\t\ttransaction.add(createUpdateAuthorityInstruction(args))\n\t\t}\n\n\t\tconst oldMetadataLength = pack({\n\t\t\tadditionalMetadata: metadata?.additionalMetadata || [],\n\t\t\tmint: web3.PublicKey.default,\n\t\t\tsymbol: metadata.symbol,\n\t\t\tname: metadata.name,\n\t\t\turi: metadata.uri\n\t\t}).length + 4\n\n\t\tconst newMetadataLength = pack({\n\t\t\tadditionalMetadata: [],\n\t\t\tmint: web3.PublicKey.default,\n\t\t\tsymbol: data.data.symbol,\n\t\t\tname: data.data.name,\n\t\t\turi: data.data.uri\n\t\t}).length + 4\n\n\t\tconst mintLamports = await this.connection.getMinimumBalanceForRentExemption(newMetadataLength - oldMetadataLength);\n\t\tif (mintLamports > 0) {\n\t\t\ttransaction.add(SystemProgram.transfer({fromPubkey: authority, toPubkey: new web3.PublicKey(mint), lamports: mintLamports}));\n\t\t}\n\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.feePayer = authority\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\n\t\treturn transaction\n\t}\n\n\tasync getUpdateMetadataTransaction(metadata: web3.PublicKey, authority: web3.PublicKey, data: UpdateMetadataAccountArgsV2, metadataProgram = this.metadataProgram(), priorityFee, metadataCID: string) {\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst unitLimit = 100_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\ttransaction.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: authority,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 20000000,\n\t\t\t}),\n\t\t\tnew web3.TransactionInstruction({\n\t\t\t\tkeys: [],\n\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\tdata: Buffer.from(metadataCID)\n\t\t\t}),\n\t\t\tcreateUpdateMetadataAccountV2Instruction({\n\t\t\t\tmetadata: metadata,\n\t\t\t\tupdateAuthority: authority,\n\t\t\t}, {\n\t\t\t\tupdateMetadataAccountArgsV2: data\n\t\t\t}, metadataProgram))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.feePayer = authority\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\n\t\treturn transaction\n\t}\n\n\n\tasync getBurnTransaction(mint: web3.PublicKey, srcOwner: web3.PublicKey, amount: number, decimals: number, program = TOKEN_2022_PROGRAM_ID) {\n\t\tconst srcAta = this.getAssociatedTokenPDA(mint, srcOwner, program)\n\t\tconst transaction = new web3.Transaction()\n\t\ttransaction.add(createBurnCheckedInstruction(srcAta, mint, srcOwner, amount, decimals, [], program))\n\n\t\t//Add Flux Fee\n\t\ttransaction.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: srcOwner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 100_000, // 0.0001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.feePayer = srcOwner\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\n\t\treturn transaction\n\t}\n\n\tasync getSendTransferTransaction(mint: web3.PublicKey, srcOwner: web3.PublicKey, dstOwner: web3.PublicKey, amount: number, decimals: number, program = TOKEN_2022_PROGRAM_ID, allowOwnerOffCurve = false) {\n\t\tconst srcAta = this.getAssociatedTokenPDA(mint, srcOwner, program, allowOwnerOffCurve)\n\t\tconst dstAta = this.getAssociatedTokenPDA(mint, dstOwner, program, allowOwnerOffCurve)\n\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst dstIfo = await this.connection.getAccountInfo(dstAta, \"confirmed\")\n\t\tif (!dstIfo) {\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(srcOwner, dstAta, dstOwner, mint, program))\n\t\t}\n\n\t\ttransaction.add(createTransferCheckedInstruction(\n\t\t\tsrcAta, //Src Ata\n\t\t\tmint, //Mint\n\t\t\tdstAta,\n\t\t\tsrcOwner,\n\t\t\tamount, //TODO check decimals??\n\t\t\tdecimals,\n\t\t\t[],\n\t\t\tprogram\n\t\t))\n\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.feePayer = srcOwner\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\n\t\treturn transaction\n\t}\n\n\tasync getSendTransferSolTransaction(srcOwner: web3.PublicKey, dstOwner: web3.PublicKey, amount: number, withCU = false) {\n\t\tconst transaction = new web3.Transaction()\n\n\t\ttransaction.add(\n\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: srcOwner,\n\t\t\t\ttoPubkey: dstOwner,\n\t\t\t\tlamports: amount,\n\t\t\t}))\n\n\t\tif (withCU) {\n\t\t\ttransaction.add(web3.ComputeBudgetProgram.setComputeUnitLimit({ units: 450 }))\n\t\t}\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.feePayer = srcOwner\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\n\t\treturn transaction\n\t}\n\n\t/**\n\t * Returns array of transactions needed to claim all withheld tokens for a given mint\n\t *\n\t * @param mint\n\t * @param payer\n\t * @param authority\n\t * @param srcAccounts\n\t */\n\tasync getClaimWitheldTokensTransaction(mint: web3.PublicKey, payer: web3.PublicKey, authority: web3.PublicKey, srcAccounts: web3.PublicKey[]) {\n\t\tconst dstAcc = this.getAssociatedTokenPDA(mint, payer, TOKEN_2022_PROGRAM_ID)\n\t\tconst transactions = []\n\n\t\t//TODO hoist to signing layer\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\tif (!await this.accountExists(dstAcc)) {\n\t\t\tconst transaction = new web3.Transaction().add(\n\t\t\t\tComputeBudgetProgram.setComputeUnitLimit({units: 42_000}),\n\t\t\t\tcreateAssociatedTokenAccountInstruction(\n\t\t\t\t\tpayer,\n\t\t\t\t\tdstAcc,\n\t\t\t\t\tpayer,\n\t\t\t\t\tmint,\n\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t))\n\n\t\t\t//Withdraw from mint account too\n\t\t\ttransaction.add(createWithdrawWithheldTokensFromMintInstruction(mint, dstAcc, payer, [], TOKEN_2022_PROGRAM_ID))\n\n\t\t\t//Add Flux Fee\n\t\t\ttransaction.add(web3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: payer,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 1_000_000, // 0.001\n\t\t\t}))\n\n\t\t\ttransaction.feePayer = payer\n\t\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\t\ttransactions.push(transaction)\n\t\t} else {\n\t\t\t//Withdraw from mint account too\n\t\t\ttransactions.push(new web3.Transaction().add(\n\t\t\t\tComputeBudgetProgram.setComputeUnitLimit({units: 11_000}),\n\t\t\t\tcreateWithdrawWithheldTokensFromMintInstruction(mint, dstAcc, payer, [], TOKEN_2022_PROGRAM_ID)\n\t\t\t))\n\t\t}\n\n\t\tfor (let i = 0; i < srcAccounts.length; i += 29) {\n\t\t\tconst transaction = new web3.Transaction().add(\n\t\t\t\tcreateWithdrawWithheldTokensFromAccountsInstruction(\n\t\t\t\t\tmint,\n\t\t\t\t\tdstAcc,\n\t\t\t\t\tauthority,\n\t\t\t\t\t[],\n\t\t\t\t\tsrcAccounts.slice(i, i + 29),\n\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t//Add Flux Fee\n\t\t\ttransaction.add(web3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: payer,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 1_000_000, // 0.001\n\t\t\t}))\n\n\t\t\ttransaction.feePayer = payer\n\t\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\t\ttransactions.push(transaction)\n\t\t}\n\n\t\treturn transactions\n\t}\n\n\t/**\n\t * Returns transaction to claim withheld tokens from the mint account\n\t *\n\t * @param mint\n\t * @param payer\n\t */\n\tasync getClaimWitheldTokensFromMintTransaction(mint: web3.PublicKey, payer: web3.PublicKey) {\n\t\tconst dstAcc = this.getAssociatedTokenPDA(mint, payer, TOKEN_2022_PROGRAM_ID)\n\t\tconst transaction = new web3.Transaction()\n\n\t\t//TODO hoist to signing layer\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\tif (!await this.accountExists(dstAcc)) {\n\t\t\ttransaction.add(\n\t\t\t\tComputeBudgetProgram.setComputeUnitLimit({units: 43_000}),\n\t\t\t\tcreateAssociatedTokenAccountInstruction(\n\t\t\t\t\tpayer,\n\t\t\t\t\tdstAcc,\n\t\t\t\t\tpayer,\n\t\t\t\t\tmint,\n\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t))\n\t\t} else {\n\t\t\ttransaction.add(ComputeBudgetProgram.setComputeUnitLimit({units: 11_000}))\n\t\t}\n\n\n\t\t//Withdraw from mint account too\n\t\ttransaction.add(createWithdrawWithheldTokensFromMintInstruction(mint, dstAcc, payer, [], TOKEN_2022_PROGRAM_ID))\n\n\t\t//Add Flux Fee\n\t\ttransaction.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: payer,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 1_000_000, // 0.001\n\t\t}))\n\n\t\ttransaction.feePayer = payer\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\treturn transaction\n\t}\n\n\t//Permissionless version\n\t//Harvest tokens to mint\n\tasync getClaimWithheldTokensToMintTransaction(mint: web3.PublicKey, payer: web3.PublicKey, srcAccounts: web3.PublicKey[]) {\n\t\tconst transactions = []\n\n\t\tfor (let i = 0; i < srcAccounts.length; i += 29) {\n\t\t\tconst transaction = new web3.Transaction().add(\n\t\t\t\tcreateHarvestWithheldTokensToMintInstruction(\n\t\t\t\t\tmint,\n\t\t\t\t\tsrcAccounts.slice(i, i + 29),\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t//Add Flux Fee\n\t\t\ttransaction.add(web3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: payer,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 1_000_000, // 0.001\n\t\t\t}))\n\n\t\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\t\ttransaction.feePayer = payer\n\t\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\t\ttransactions.push(transaction)\n\t\t}\n\t\treturn transactions\n\t}\n\n\tasync getCreateMetadataTransaction(owner: web3.PublicKey, tokenMint: web3.PublicKey, config: CreateMetadata, metadataProgram = this.metadataProgram()) {\n\t\tconst txn = new web3.Transaction()\n\n\t\t//Create token metadata\n\t\tconst [metadataPDA] = web3.PublicKey.findProgramAddressSync([Buffer.from(\"metadata\"), metadataProgram.toBuffer(), tokenMint.toBuffer()], metadataProgram)\n\n\t\tconsole.log(\"getCreateMetadataTransaction\", config)\n\t\tconst ON_CHAIN_METADATA = {\n\t\t\tname: config.name,\n\t\t\tsymbol: config.symbol,\n\t\t\turi: config.uri,\n\t\t\tsellerFeeBasisPoints: config.sellerFeeBasisPoints || 0,\n\t\t\tuses: null,\n\t\t\tcreators: null,\n\t\t\tcollection: null,\n\t\t} as DataV2;\n\n\t\tconsole.log(\"Creating metadata acc\", ON_CHAIN_METADATA)\n\t\ttxn.add(\n\t\t\tcreateCreateMetadataAccountV3Instruction({\n\t\t\t\tmetadata: metadataPDA,\n\t\t\t\tmint: tokenMint,\n\t\t\t\tmintAuthority: owner,\n\t\t\t\tpayer: owner,\n\t\t\t\tupdateAuthority: owner,\n\t\t\t}, {\n\t\t\t\tcreateMetadataAccountArgsV3:\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: ON_CHAIN_METADATA,\n\t\t\t\t\t\tisMutable: config.mutable,\n\t\t\t\t\t\tcollectionDetails: null\n\t\t\t\t\t}\n\t\t\t}, metadataProgram),\n\t\t)\n\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 1_000_000, // 0.001\n\t\t}))\n\n\t\tconsole.log(\"Getting blockhash\")\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\tconsole.log(\"Getting blockhash\", bhash)\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\tasync getCreateMintTransaction(owner: web3.PublicKey, tokenMint: web3.PublicKey, config: CreateMint, priorityFee: number, metadataCID: string) {\n\t\tconst mintLen = getMintLen(config.extensions);\n\t\tconst mintLamports = await this.connection.getMinimumBalanceForRentExemption(mintLen + config.metadataLength());\n\n\t\tconst ata = getAssociatedTokenAddressSync(tokenMint, owner, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst ON_CHAIN_METADATA = {\n\t\t\tname: config.name,\n\t\t\tsymbol: config.symbol,\n\t\t\turi: config.metadataUri,\n\t\t\tsellerFeeBasisPoints: 0,\n\t\t\tuses: null,\n\t\t\tcreators: null,\n\t\t\tcollection: null,\n\t\t} as DataV2;\n\n\n\t\tconst unitLimit = 120_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\t\tconst txn = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: unitLimit}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t\tweb3.SystemProgram.createAccount({\n\t\t\t\tfromPubkey: owner,\n\t\t\t\tnewAccountPubkey: tokenMint,\n\t\t\t\tspace: mintLen,\n\t\t\t\tlamports: mintLamports,\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t}),\n\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\tfromPubkey: owner,\n\t\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\t\tlamports: 20000000,\n\t\t\t}),\n\t\t\tnew web3.TransactionInstruction({\n\t\t\t\tkeys: [],\n\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\tdata: Buffer.from(metadataCID)\n\t\t\t}),\n\t\t);\n\n\t\tlet isDefaultFrozen = false;\n\t\tconfig.extensions.forEach((ext) => {\n\t\t\t//@ts-ignore\n\t\t\tconst cfg = config.extensionConfig[ext]\n\t\t\tconsole.log(`${ext}`, cfg)\n\n\t\t\tswitch (ext) {\n\t\t\t\tcase ExtensionType.TransferFeeConfig:\n\t\t\t\t\tON_CHAIN_METADATA.sellerFeeBasisPoints = cfg.feeBasisPoints //Update so it reflects same as royalties\n\t\t\t\t\ttxn.add(createInitializeTransferFeeConfigInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tcfg.transfer_fee_config_authority ? cfg.transfer_fee_config_authority : config.mintAuthority, //Config Auth\n\t\t\t\t\t\tcfg.withdraw_withheld_authority ? cfg.withdraw_withheld_authority : config.mintAuthority, //Withdraw Auth\n\t\t\t\t\t\tcfg.feeBasisPoints,\n\t\t\t\t\t\tcfg.maxFee,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.InterestBearingConfig:\n\t\t\t\t\ttxn.add(createInitializeInterestBearingMintInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\towner, //Rate Auth\n\t\t\t\t\t\tcfg.rate * 100,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.PermanentDelegate:\n\t\t\t\t\ttxn.add(createInitializePermanentDelegateInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tnew web3.PublicKey(cfg.address),\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.NonTransferable:\n\t\t\t\t\ttxn.add(createInitializeNonTransferableMintInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.ImmutableOwner:\n\t\t\t\t\ttxn.add(createInitializeImmutableOwnerInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.MemoTransfer:\n\t\t\t\t\ttxn.add(createEnableRequiredMemoTransfersInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\towner,\n\t\t\t\t\t\t[],\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tif (config.mintTotalSupply)\n\t\t\t\t\t\ttxn.add(new web3.TransactionInstruction({\n\t\t\t\t\t\t\tkeys: [{pubkey: owner, isSigner: true, isWritable: true}],\n\t\t\t\t\t\t\tdata: Buffer.from(\"Mint To Memo\", \"utf-8\"),\n\t\t\t\t\t\t\tprogramId: new web3.PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\"),\n\t\t\t\t\t\t}))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.DefaultAccountState:\n\t\t\t\t\tisDefaultFrozen = cfg.state === AccountState.Frozen;\n\t\t\t\t\ttxn.add(createInitializeDefaultAccountStateInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tcfg.state,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.MintCloseAuthority:\n\t\t\t\t\ttxn.add(createInitializeMintCloseAuthorityInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tconfig.mintAuthority,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tcase ExtensionType.MetadataPointer:\n\t\t\t\t\ttxn.add(createInitializeMetadataPointerInstruction(\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tconfig.mintAuthority,\n\t\t\t\t\t\ttokenMint,\n\t\t\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t\t\t))\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error(\"Unsupported extension\", ext)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t})\n\n\t\t//Init the mint\n\t\ttxn.add(createInitializeMintInstruction(tokenMint, config.decimals, config.mintAuthority, config.freezeAuthority, TOKEN_2022_PROGRAM_ID))\n\n\t\tif (config.metadata) {\n\t\t\ttxn.add(createInitializeInstruction({\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t\tmetadata: tokenMint,\n\t\t\t\tupdateAuthority: config.mintAuthority,\n\t\t\t\tmint: tokenMint,\n\t\t\t\tmintAuthority: config.mintAuthority,\n\t\t\t\tname: config.metadata.name,\n\t\t\t\tsymbol: config.metadata.symbol,\n\t\t\t\turi: config.metadata.uri,\n\t\t\t}))\n\t\t}\n\n\n\t\tif (config.mintTotalSupply) {\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ata, owner, tokenMint, TOKEN_2022_PROGRAM_ID))\n\n\t\t\tif (isDefaultFrozen)\n\t\t\t\ttxn.add(createThawAccountInstruction(ata, tokenMint, owner, [], TOKEN_2022_PROGRAM_ID))\n\n\t\t\ttxn.add(createMintToInstruction(tokenMint, ata, owner, config.totalSupply, [], TOKEN_2022_PROGRAM_ID))\n\t\t}\n\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 1_000_000, // 0.001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\tasync getMintToTransaction(owner: web3.PublicKey, tokenMint: web3.PublicKey, amount: bigint, program = TOKEN_2022_PROGRAM_ID) {\n\t\tconst txn = new web3.Transaction()\n\t\tconst ata = getAssociatedTokenAddressSync(tokenMint, owner, true, program)\n\n\t\tconst dstIfo = await this.connection.getAccountInfo(ata, \"confirmed\")\n\t\tif (!dstIfo) {\n\t\t\ttxn.add(createAssociatedTokenAccountInstruction(owner, ata, owner, tokenMint, program))\n\t\t}\n\n\t\ttxn.add(createMintToInstruction(tokenMint, ata, owner, amount, [], program))\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 100_000, // 0.0001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\tasync getSetAuthorityTransaction(owner: web3.PublicKey, mint: web3.PublicKey, authority: AuthorityType, newAuthority: web3.PublicKey | null, programID = TOKEN_2022_PROGRAM_ID, priorityFee: number = 100_000_000_000) {\n\t\tconst txn = new web3.Transaction()\n\t\ttxn.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: 11_000}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: Math.floor(priorityFee / 10_000)})\n\t\t)\n\t\ttxn.add(createSetAuthorityInstruction(mint, owner, authority, newAuthority, [], programID))\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 100_000, // 0.0001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\n\t\tconsole.log(\"getSetAuthorityTransaction\", txn)\n\t\treturn txn\n\t}\n\n\tasync getRevokeAuthorityTransaction(owner: web3.PublicKey, mint: web3.PublicKey, authority: AuthorityType, programID = TOKEN_2022_PROGRAM_ID, priorityFee: number = 100_000_000_000) {\n\t\treturn this.getSetAuthorityTransaction(owner, mint, authority, null, programID, priorityFee)\n\t}\n\n\tasync getUpdateTransferFeeTransaction(config: web3.PublicKey, owner: web3.PublicKey, transferFeeBasisPoints: number, maximumFee: bigint, priorityFee: number) {\n\t\tconst txn = new web3.Transaction()\n\t\ttxn.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: 11_000}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: Math.floor(priorityFee / 10_000)})\n\t\t)\n\t\ttxn.add(createSetTransferFeeInstruction(config, owner, transferFeeBasisPoints, maximumFee, [], TOKEN_2022_PROGRAM_ID))\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 100_000, // 0.0001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\tasync getUpdateInterestBearingConfigTransaction(config: web3.PublicKey, owner: web3.PublicKey, rate: number, priorityFee: number) {\n\t\tconst txn = new web3.Transaction()\n\t\ttxn.add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitLimit({units: 11_000}),\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: Math.floor(priorityFee / 10_000)})\n\t\t)\n\t\ttxn.add(createUpdateRateInterestBearingMintInstruction(config, owner, rate))\n\n\t\t//Add Flux Fee\n\t\ttxn.add(web3.SystemProgram.transfer({\n\t\t\tfromPubkey: owner,\n\t\t\ttoPubkey: this.FEE_ACCOUNT,\n\t\t\tlamports: 100_000, // 0.0001\n\t\t}))\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttxn.feePayer = owner\n\t\ttxn.recentBlockhash = bhash.blockhash\n\t\treturn txn\n\t}\n\n\tasync accountExists(account: web3.PublicKey) {\n\t\tconst acc = await this.connection.getAccountInfo(account, \"confirmed\").catch(e => {\n\t\t})\n\t\treturn !!acc;\n\t}\n}","import {web3} from \"@project-serum/anchor\";\nimport {Numberu64, Schedule} from \"@bonfida/token-vesting\"\nimport {createAssociatedTokenAccountInstruction, getAssociatedTokenAddress, getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID} from \"@solana/spl-token\";\nimport {PublicKey, SystemProgram, SYSVAR_CLOCK_PUBKEY, TransactionInstruction} from \"@solana/web3.js\";\nimport {createInitInstruction} from \"@bonfida/token-vesting/src/instructions\";\nimport {getContractInfo} from \"@bonfida/token-vesting/src/main\";\nimport {ContractInfo} from \"@bonfida/token-vesting/src/state\";\n\n\nconst PROGRAM_ID = new web3.PublicKey(\"Lock1zcQFoaZmTk59sr9pB5daFE6Cs1K5eWyRLF1eju\")\n\nexport class Seed {\n\tmint;\n\treleaseTime: Numberu64;\n\n\tconstructor(mint: web3.PublicKey, releaseTime: Numberu64) {\n\t\tthis.mint = mint;\n\t\tthis.releaseTime = releaseTime;\n\t}\n\n\tasync toString() {\n\t\tconst encoder = new TextEncoder();\n\t\tconst dataUint8 = encoder.encode(JSON.stringify({\n\t\t\t\"mint\": this.mint.toString(),\n\t\t\t\"time\": this.releaseTime.toString()\n\t\t}));\n\t\tconst hashBuffer = await crypto.subtle.digest('SHA-256', dataUint8);\n\t\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\t\treturn hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n\t}\n}\n\nexport class FluxTokenLockerClient {\n\tconnection: web3.Connection\n\tprogramID: web3.PublicKey = PROGRAM_ID\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\t}\n\n\tsetProgramID(programID: web3.PublicKey) {\n\t\tthis.programID = programID\n\t}\n\n\tasync lockers(mint: web3.PublicKey) {\n\t\tconst resp = await this.connection.getProgramAccounts(this.programID, {\n\t\t\tcommitment: 'processed',\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 32,\n\t\t\t\t\t\tbytes: mint.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 32 + 32 + 1,\n\t\t\t\t\t\tbytes: \"\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: ContractInfo.fromBuffer(m.account.data)}\n\t\t})\n\t}\n\n\tasync locker(locker: web3.PublicKey) {\n\t\treturn await getContractInfo(this.connection, locker);\n\t}\n\n\tasync create(payer: web3.PublicKey, owner: web3.PublicKey, mint: web3.PublicKey, tokenProgram: web3.PublicKey, schedules: Schedule[]): Promise {\n\t\tconst seedWord = await new Seed(mint, schedules[0].releaseTime).toString();\n\t\treturn this._create(Buffer.from(seedWord), payer, owner, mint, tokenProgram, schedules)\n\t}\n\n\tasync unlock(payer: web3.PublicKey, mint: web3.PublicKey, tokenProgram: web3.PublicKey, schedule: Schedule): Promise {\n\t\tconst seedWord = await new Seed(mint, schedule.releaseTime).toString();\n\t\treturn this._unlock(Buffer.from(seedWord), payer, mint, tokenProgram)\n\t}\n\n\n\t/**\n\t * This function can be used to lock tokens\n\t * @param seedWord Seed words used to derive the vesting account\n\t * @param payer The fee payer of the transaction\n\t * @param sourceTokenOwner The owner of the source token account (i.e where locked tokens are originating from)\n\t * @param possibleSourceTokenPubkey The source token account (i.e where locked tokens are originating from), if null it defaults to the ATA\n\t * @param destinationTokenPubkey The destination token account i.e where unlocked tokens will be transfered\n\t * @param mintAddress The mint of the tokens being vested\n\t * @param schedules The array of vesting schedules\n\t * @param tokenProgram The token program for the mint\n\t * @returns An array of `TransactionInstruction`\n\t */\n\tasync _create(\n\t\tseedWord: Buffer | Uint8Array,\n\t\tpayer: PublicKey,\n\t\tsourceTokenOwner: PublicKey,\n\t\tmintAddress: PublicKey,\n\t\ttokenProgram: PublicKey,\n\t\tschedules: Array,\n\t): Promise> {\n\t\tconst sourceTokenPubkey = getAssociatedTokenAddressSync(mintAddress, sourceTokenOwner, true, tokenProgram)\n\t\tconst destinationTokenPubkey = sourceTokenPubkey\n\n\n\t\t// Find the non reversible public key for the vesting contract via the seed\n\t\tseedWord = seedWord.slice(0, 31);\n\t\tconst [vestingAccountKey, bump] = PublicKey.findProgramAddressSync([seedWord], this.programID);\n\n\t\tconst vestingTokenAccountKey = await getAssociatedTokenAddress(\n\t\t\tmintAddress,\n\t\t\tvestingAccountKey,\n\t\t\ttrue,\n\t\t\ttokenProgram\n\t\t);\n\n\t\tseedWord = Buffer.from(seedWord.toString('hex') + bump.toString(16), 'hex');\n\n\t\treturn [\n\t\t\tcreateInitInstruction(\n\t\t\t\tSystemProgram.programId,\n\t\t\t\tthis.programID,\n\t\t\t\tpayer,\n\t\t\t\tvestingAccountKey,\n\t\t\t\t[seedWord],\n\t\t\t\tschedules.length,\n\t\t\t),\n\t\t\tcreateAssociatedTokenAccountInstruction(\n\t\t\t\tpayer,\n\t\t\t\tvestingTokenAccountKey,\n\t\t\t\tvestingAccountKey,\n\t\t\t\tmintAddress,\n\t\t\t\ttokenProgram\n\t\t\t),\n\t\t\tthis.createCreateInstruction(\n\t\t\t\tthis.programID,\n\t\t\t\ttokenProgram,\n\t\t\t\tvestingAccountKey,\n\t\t\t\tvestingTokenAccountKey,\n\t\t\t\tsourceTokenOwner,\n\t\t\t\tsourceTokenPubkey,\n\t\t\t\tdestinationTokenPubkey,\n\t\t\t\tmintAddress,\n\t\t\t\tschedules,\n\t\t\t\t[seedWord],\n\t\t\t),\n\t\t];\n\t}\n\n\n\tcreateCreateInstruction(\n\t\tvestingProgramId: PublicKey,\n\t\ttokenProgramId: PublicKey,\n\t\tvestingAccountKey: PublicKey,\n\t\tvestingTokenAccountKey: PublicKey,\n\t\tsourceTokenAccountOwnerKey: PublicKey,\n\t\tsourceTokenAccountKey: PublicKey,\n\t\tdestinationTokenAccountKey: PublicKey,\n\t\tmintAddress: PublicKey,\n\t\tschedules: Array,\n\t\tseeds: Array,\n\t): TransactionInstruction {\n\t\tconst buffers = [\n\t\t\tBuffer.from(Uint8Array.from([1]).buffer),\n\t\t\tBuffer.concat(seeds),\n\t\t\tmintAddress.toBuffer(),\n\t\t\tdestinationTokenAccountKey.toBuffer(),\n\t\t];\n\n\t\tschedules.forEach(s => {\n\t\t\tbuffers.push(s.toBuffer());\n\t\t});\n\n\t\tconst data = Buffer.concat(buffers);\n\t\tconst keys = [\n\t\t\t{\n\t\t\t\tpubkey: tokenProgramId,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: vestingAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: vestingTokenAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: sourceTokenAccountOwnerKey,\n\t\t\t\tisSigner: true,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: sourceTokenAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: mintAddress,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t];\n\t\treturn new TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: vestingProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\t/**\n\t * This function can be used to unlock vested tokens\n\t * @param seedWord Seed words used to derive the vesting account\n\t * @param payer The payer or owner of the locker - if the owner does not own the dest account then an error is returned\n\t * @param mintAddress The mint of the vested tokens\n\t * @param tokenProgram The token program for the mint\n\t * @returns An array of `TransactionInstruction`\n\t */\n\tasync _unlock(\n\t\tseedWord: Buffer | Uint8Array,\n\t\tpayer: PublicKey,\n\t\tmintAddress: PublicKey,\n\t\ttokenProgram: PublicKey\n\t): Promise> {\n\t\tseedWord = seedWord.slice(0, 31);\n\t\tconst [vestingAccountKey, bump] = PublicKey.findProgramAddressSync([seedWord], this.programID);\n\t\tseedWord = Buffer.from(seedWord.toString('hex') + bump.toString(16), 'hex');\n\n\t\tconst vestingTokenAccountKey = await getAssociatedTokenAddress(\n\t\t\tmintAddress,\n\t\t\tvestingAccountKey,\n\t\t\ttrue,\n\t\t\ttokenProgram\n\t\t);\n\n\t\tconsole.log(\"VestingAccountKey\", vestingAccountKey.toString())\n\t\tconst accInfo = await this.connection.getAccountInfo(vestingAccountKey, \"processed\");\n\t\tif (!accInfo) {\n\t\t\tthrow new Error('Vesting contract account is unavailable');\n\t\t}\n\t\tconst vestingInfo = ContractInfo.fromBuffer(accInfo!.data);\n\t\tif (!vestingInfo) {\n\t\t\tthrow new Error('Vesting contract account is not initialized');\n\t\t}\n\n\t\tconst res = await this.connection.getMultipleAccountsInfo([vestingInfo.destinationAddress, mintAddress], {commitment: \"processed\"})\n\t\tconst [destinationInfo, mintInfo] = res\n\n\t\tconst unlockIx = this.createUnlockInstruction(\n\t\t\tthis.programID,\n\t\t\ttokenProgram,\n\t\t\tSYSVAR_CLOCK_PUBKEY,\n\t\t\tvestingAccountKey,\n\t\t\tvestingTokenAccountKey,\n\t\t\tvestingInfo.destinationAddress,\n\t\t\tmintAddress,\n\t\t\t[seedWord],\n\t\t)\n\n\t\tif (!destinationInfo) {\n\t\t\t//Check if signer is the destination (otherwise below create IX wont work)\n\t\t\tconst ata = getAssociatedTokenAddressSync(mintAddress, payer, false, mintInfo.owner)\n\t\t\tif (ata.toString() != vestingInfo.destinationAddress.toString()) {\n\t\t\t\tthrow new Error(\"Signer does not match destination address\")\n\t\t\t}\n\n\t\t\tconst createIx = createAssociatedTokenAccountInstruction(payer, vestingInfo.destinationAddress, payer, mintAddress, mintInfo.owner)\n\n\t\t\treturn [createIx, unlockIx];\n\t\t}\n\n\t\treturn [unlockIx];\n\t}\n\n\n\tcreateUnlockInstruction(\n\t\tvestingProgramId: PublicKey,\n\t\ttokenProgramId: PublicKey,\n\t\tclockSysvarId: PublicKey,\n\t\tvestingAccountKey: PublicKey,\n\t\tvestingTokenAccountKey: PublicKey,\n\t\tdestinationTokenAccountKey: PublicKey,\n\t\tmintAddress: PublicKey,\n\t\tseeds: Array,\n\t): TransactionInstruction {\n\t\tconst data = Buffer.concat([\n\t\t\tBuffer.from(Uint8Array.from([2]).buffer),\n\t\t\tBuffer.concat(seeds),\n\t\t]);\n\n\t\tconst keys = [\n\t\t\t{\n\t\t\t\tpubkey: tokenProgramId,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: clockSysvarId,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: vestingAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: vestingTokenAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: destinationTokenAccountKey,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpubkey: mintAddress,\n\t\t\t\tisSigner: false,\n\t\t\t\tisWritable: false,\n\t\t\t},\n\t\t];\n\t\treturn new TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: vestingProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\n\tasync lockAuthority(mint: web3.PublicKey, tokenProgram: web3.PublicKey, schedule: Schedule, authorityType: number) {\n\t\tconst seedWord = await new Seed(mint, schedule.releaseTime).toString();\n\t\treturn this._lockAuthority(Buffer.from(seedWord), mint, tokenProgram, authorityType)\n\t}\n\n\tasync unlockAuthority(mint: web3.PublicKey, tokenProgram: web3.PublicKey, schedule: Schedule, authorityType: number) {\n\t\tconst seedWord = await new Seed(mint, schedule.releaseTime).toString();\n\t\treturn this._unlockAuthority(Buffer.from(seedWord), mint, tokenProgram, authorityType)\n\t}\n\n\n\tasync _lockAuthority(\n\t\tseedWord: Buffer | Uint8Array,\n\t\tmintAddress: PublicKey,\n\t\ttokenProgram: PublicKey,\n\t\tauthorityType: number) {\n\n\t}\n\n\tasync _unlockAuthority(\n\t\tseedWord: Buffer | Uint8Array,\n\t\tmintAddress: PublicKey,\n\t\ttokenProgram: PublicKey,\n\t\tauthorityType: number) {\n\n\t}\n}\n","import {blob, GetStructureSchema, publicKey, struct, u64, u8} from \"@/api/marshmallow\";\n\n\nexport const TokenMigrationLayout = struct([\n\tblob(8), //Anchor diff\n\tpublicKey('v1TokenMint'),\n\tpublicKey('v2TokenMint'),\n\tu64('tokenSupply'),\n\tu64('migratedAmount'),\n\tu8('bump'),\n\tpublicKey('authority'),\n]);\n\nexport type TokenMigrationPoolLayout = typeof TokenMigrationLayout;\nexport type TokenMigrationPool = GetStructureSchema;","import {web3} from \"@project-serum/anchor\";\nimport {TokenMigrationLayout} from \"@/api/token_migration/layouts\";\nimport {struct, u64, u8} from \"@/api/marshmallow\";\nimport {createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID} from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport {PROGRAM_ID} from \"@metaplex-foundation/mpl-token-metadata\";\nimport {CreateMint, Token2022Client, TOKEN_METADATA_PROGRAM_ID} from \"@/api/token2022/token_2022\";\nimport {Client as TokenSwapClient} from \"@/api/token_swap\";\nimport {sha256} from \"js-sha256\"\nimport {PoolConfig, PoolFee, TokenInput} from \"@/api/token_swap/layouts\";\n\n/**\n * Client to handle all migration tasks\n */\nexport default class Client {\n\n\tconnection: web3.Connection\n\n\tmigrateProgramID = new web3.PublicKey(\"2LcCb4ZwqF6RfWdRPmPAqrxxyx9zi279i294YPKHDdVx\")\n\n\ttoken2022: Token2022Client;\n\tswapClient: TokenSwapClient;\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\n\t\tthis.token2022 = new Token2022Client(connection)\n\t\tthis.swapClient = new TokenSwapClient(connection)\n\t}\n\n\n\tasync getMigrations() {\n\t\tconst resp = await this.connection.getProgramAccounts(this.migrateProgramID)\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: TokenMigrationLayout.decode(m.account.data)}\n\t\t})\n\t}\n\n\tasync getMigration(address: web3.PublicKey) {\n\t\tconst resp = await this.connection.getAccountInfo(address, \"confirmed\")\n\t\tif (!resp)\n\t\t\treturn resp\n\n\t\treturn TokenMigrationLayout.decode(resp?.data!)\n\t}\n\n\tgetMigrationKey(mintA: web3.PublicKey) {\n\t\t//@ts-ignore - stop bitching about strings\n\t\tconst [migrationAddr] = web3.PublicKey.findProgramAddressSync([\"migration\", mintA.toBuffer()], this.migrateProgramID)\n\t\treturn migrationAddr\n\t}\n\n\tgetMigrationAuthorityKey(migrationAddr: web3.PublicKey) {\n\t\t//@ts-ignore - stop bitching about strings\n\t\tconst [key] = web3.PublicKey.findProgramAddressSync([\"authority\", migrationAddr.toBuffer()], this.migrateProgramID)\n\t\treturn key\n\t}\n\n\tasync createMigration(\n\t\tmintA: web3.PublicKey,\n\t\towner: web3.PublicKey,\n\t\tmintBConfig: CreateMint,\n\t\tpriorityFee: number,\n\t\tmetadataCID: string,\n\t) {\n\t\tconst mintB = web3.Keypair.generate()\n\n\t\t//@ts-ignore - stop bitching about strings\n\t\tconst [migration, bump] = web3.PublicKey.findProgramAddressSync([\"migration\", mintA.toBuffer()], this.migrateProgramID)\n\n\t\tconst transaction = await this.token2022.getCreateMintTransaction(owner, mintB.publicKey, mintBConfig, priorityFee, metadataCID)\n\n\t\t//@ts-ignore\n\t\tconst {pool, txn, signers} = await this._createMigrationPool(\n\t\t\towner,\n\t\t\tmigration,\n\t\t\tnew TokenInput(mintA, 1, TOKEN_PROGRAM_ID),\n\t\t\tnew TokenInput(mintB.publicKey, 1)\n\t\t)\n\t\ttransaction.add(...txn.instructions)\n\n\t\t//Create the migration\n\t\ttransaction.add(this.createMigrationPoolInstruction(\n\t\t\tmigration,\n\t\t\tpool,\n\t\t\tmintA,\n\t\t\tmintB.publicKey,\n\t\t\towner,\n\t\t\tbump\n\t\t))\n\n\t\tsigners.push(mintB)\n\t\treturn {\n\t\t\ttxn: transaction,\n\t\t\tsigners: signers\n\t\t}\n\t}\n\n\tasync _createMigrationPool(owner: web3.PublicKey, migration: web3.PublicKey, tokenA: TokenInput, tokenB: TokenInput) {\n\t\tconst resp = await this.swapClient.createPoolTransactions(\n\t\t\towner,\n\t\t\tmigration,\n\t\t\ttokenA,\n\t\t\ttokenB,\n\t\t\tnew PoolConfig(\n\t\t\t\tnew PoolFee(0, 1000),\n\t\t\t\tnew PoolFee(0, 1000),\n\t\t\t\tnew PoolFee(0, 1000),\n\t\t\t\tnew PoolFee(0, 1000),\n\t\t\t\t1,\n\t\t\t)\n\t\t)\n\t\tif (!resp)\n\t\t\treturn resp\n\n\t\treturn resp[0]\n\t}\n\n\tasync migrateTokens(\n\t\tmintA: web3.PublicKey,\n\t\towner: web3.PublicKey,\n\t\tamountIn: BN\n\t) {\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst migrationKey = this.getMigrationKey(mintA)\n\t\tconst mintAuthority = migrationKey\n\n\t\t//Get migration details\n\t\tconst migration = await this.getMigration(migrationKey)\n\n\t\t//ATA's\n\t\t//@ts-ignore\n\t\tconst mintAAta = getAssociatedTokenAddressSync(migration?.v1TokenMint!, owner, true, TOKEN_PROGRAM_ID)\n\n\t\t//@ts-ignore\n\t\tconst mintBAta = getAssociatedTokenAddressSync(migration?.v2TokenMint!, owner, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst dstIfo = await this.connection.getAccountInfo(mintBAta, \"confirmed\")\n\t\tif (!dstIfo) {\n\t\t\t//@ts-ignore\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(owner, mintBAta, owner, migration?.v2TokenMint!, TOKEN_2022_PROGRAM_ID))\n\t\t}\n\t\ttransaction.add(this.createMigrateTokensInstruction(\n\t\t\tmigrationKey,\n\t\t\t//@ts-ignore\n\t\t\tmigration?.v1TokenMint!,\n\t\t\tmintAAta,\n\t\t\t//@ts-ignore\n\t\t\tmigration?.v2TokenMint!,\n\t\t\tmintBAta,\n\t\t\towner,\n\t\t\tmintAuthority,\n\t\t\tTOKEN_PROGRAM_ID,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tamountIn\n\t\t))\n\n\t\treturn transaction\n\t}\n\n\n\tcreateMigrationPoolInstruction(\n\t\tmigration: web3.PublicKey,\n\t\tpool: web3.PublicKey,\n\t\tv1TokenMint: web3.PublicKey,\n\t\tv2TokenMint: web3.PublicKey,\n\t\towner: web3.PublicKey,\n\t\tbump: number,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('bump'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"create_migration\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tbump: bump\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\n\t\tconst v1TokenMetadata = this.getMetadataPDA(v1TokenMint, PROGRAM_ID) //V1\n\n\t\tconst keys = [\n\t\t\t{pubkey: migration, isSigner: false, isWritable: true},\n\t\t\t{pubkey: pool, isSigner: false, isWritable: false},\n\t\t\t{pubkey: v1TokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v2TokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v1TokenMetadata, isSigner: false, isWritable: true},\n\n\t\t\t{pubkey: owner, isSigner: true, isWritable: true},\n\n\t\t\t{pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false},\n\t\t\t{pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false},\n\n\t\t\t{pubkey: web3.SystemProgram.programId, isSigner: false, isWritable: false},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.migrateProgramID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tcreateMigrateTokensInstruction(\n\t\tmigration: web3.PublicKey,\n\t\tv1TokenMint: web3.PublicKey,\n\t\tv1TokenAccount: web3.PublicKey,\n\t\tv2TokenMint: web3.PublicKey,\n\t\tv2TokenAccount: web3.PublicKey,\n\t\towner: web3.PublicKey,\n\t\tmintAuthority: web3.PublicKey,\n\t\tv1TokenProgramId: web3.PublicKey,\n\t\tv2TokenProgramId: web3.PublicKey,\n\t\tamountIn: BN,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu64('amountIn'),\n\t\t]);\n\n\t\tconst desc = this.ixDescriminator(\"migrate_tokens\")\n\n\t\tconst buffer = Buffer.alloc(desc.length + dataLayout.span);\n\t\tconst len = dataLayout.encode({\n\t\t\tamountIn: amountIn\n\t\t}, buffer);\n\t\tconst data = Buffer.concat([desc, buffer.slice(0, len)]);\n\n\t\tconst keys = [\n\t\t\t{pubkey: migration, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v1TokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v2TokenAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v1TokenMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: v2TokenMint, isSigner: false, isWritable: true},\n\n\t\t\t{pubkey: mintAuthority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: v1TokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: v2TokenProgramId, isSigner: false, isWritable: false},\n\n\t\t\t{pubkey: owner, isSigner: true, isWritable: true},\n\t\t];\n\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: this.migrateProgramID,\n\t\t\tdata,\n\t\t});\n\t}\n\n\n\t/**\n\t * Returns the token mints metadata PDA\n\t * @param mint\n\t * @param metadataProgram\n\t */\n\tgetMetadataPDA(mint: web3.PublicKey, metadataProgram = TOKEN_METADATA_PROGRAM_ID) {\n\t\t//@ts-ignore\n\t\tconst [metaPDA] = web3.PublicKey.findProgramAddressSync([\"metadata\", metadataProgram.toBuffer(), mint.toBuffer()], metadataProgram)\n\t\treturn metaPDA\n\t}\n\n\t/**\n\t * Convert to instruction descriminator\n\t * Should be SNAKE_CASE (_)\n\t * @param methodName\n\t */\n\tixDescriminator(methodName: string) {\n\t\treturn Buffer.from(sha256.digest(`global:${methodName}`)).slice(0, 8)\n\t}\n}","import {struct, u64, u8} from \"@/api/marshmallow\";\nimport {BN, web3} from \"@project-serum/anchor\";\n\nexport default class Instructions {\n\n\tstatic createSwapInstruction(\n\t\ttokenSwap: web3.PublicKey,\n\t\tauthority: web3.PublicKey,\n\t\tuserTransferAuthority: web3.PublicKey,\n\t\tuserSource: web3.PublicKey,\n\t\tpoolSource: web3.PublicKey,\n\t\tpoolDestination: web3.PublicKey,\n\t\tuserDestination: web3.PublicKey,\n\t\tpoolMint: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\thostFeeAccount: web3.PublicKey | null,\n\t\tsourceMint: web3.PublicKey,\n\t\tdestinationMint: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\tsourceTokenProgramId: web3.PublicKey,\n\t\tdestinationTokenProgramId: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\tamountIn: BN,\n\t\tminimumAmountOut: BN,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('amountIn'),\n\t\t\tu64('minimumAmountOut'),\n\t\t]);\n\n\t\tconst data = Buffer.alloc(dataLayout.span);\n\t\tdataLayout.encode(\n\t\t\t{\n\t\t\t\tinstruction: 1, // Swap instruction\n\t\t\t\tamountIn: amountIn,\n\t\t\t\tminimumAmountOut: minimumAmountOut,\n\t\t\t},\n\t\t\tdata,\n\t\t);\n\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwap, isSigner: false, isWritable: false},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: userTransferAuthority, isSigner: true, isWritable: false},\n\t\t\t{pubkey: userSource, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolSource, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolDestination, isSigner: false, isWritable: true},\n\t\t\t{pubkey: userDestination, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: feeAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: sourceMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: destinationMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: sourceTokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: destinationTokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t];\n\t\tif (hostFeeAccount !== null) {\n\t\t\tkeys.push({pubkey: hostFeeAccount, isSigner: false, isWritable: true});\n\t\t}\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tstatic depositAllTokenTypesInstruction(\n\t\ttokenSwap: web3.PublicKey,\n\t\tauthority: web3.PublicKey,\n\t\tuserTransferAuthority: web3.PublicKey,\n\t\tsourceA: web3.PublicKey,\n\t\tsourceB: web3.PublicKey,\n\t\tintoA: web3.PublicKey,\n\t\tintoB: web3.PublicKey,\n\t\tpoolToken: web3.PublicKey,\n\t\tpoolAccount: web3.PublicKey,\n\t\tmintA: web3.PublicKey,\n\t\tmintB: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\ttokenProgramIdA: web3.PublicKey,\n\t\ttokenProgramIdB: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\tpoolTokenAmount: BN,\n\t\tmaximumTokenA: BN,\n\t\tmaximumTokenB: BN,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('poolTokenAmount'),\n\t\t\tu64('maximumTokenA'),\n\t\t\tu64('maximumTokenB'),\n\t\t]);\n\n\t\tconst data = Buffer.alloc(dataLayout.span);\n\t\tdataLayout.encode(\n\t\t\t{\n\t\t\t\tinstruction: 2, // Deposit instruction\n\t\t\t\tpoolTokenAmount: poolTokenAmount,\n\t\t\t\tmaximumTokenA: maximumTokenA,\n\t\t\t\tmaximumTokenB: maximumTokenB,\n\t\t\t},\n\t\t\tdata,\n\t\t);\n\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwap, isSigner: false, isWritable: false},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: userTransferAuthority, isSigner: true, isWritable: false},\n\t\t\t{pubkey: sourceA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: sourceB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: intoA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: intoB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolToken, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: mintA, isSigner: false, isWritable: false},\n\t\t\t{pubkey: mintB, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenProgramIdA, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenProgramIdB, isSigner: false, isWritable: false},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t];\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tstatic withdrawAllTokenTypesInstruction(\n\t\ttokenSwap: web3.PublicKey,\n\t\tauthority: web3.PublicKey,\n\t\tuserTransferAuthority: web3.PublicKey,\n\t\tpoolMint: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\tsourcePoolAccount: web3.PublicKey,\n\t\tfromA: web3.PublicKey,\n\t\tfromB: web3.PublicKey,\n\t\tuserAccountA: web3.PublicKey,\n\t\tuserAccountB: web3.PublicKey,\n\t\tmintA: web3.PublicKey,\n\t\tmintB: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\ttokenProgramIdA: web3.PublicKey,\n\t\ttokenProgramIdB: web3.PublicKey,\n\t\tpoolTokenAmount: number,\n\t\tminimumTokenA: number,\n\t\tminimumTokenB: number,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('poolTokenAmount'),\n\t\t\tu64('minimumTokenA'),\n\t\t\tu64('minimumTokenB'),\n\t\t]);\n\n\t\tconst data = Buffer.alloc(dataLayout.span);\n\t\tdataLayout.encode(\n\t\t\t{\n\t\t\t\tinstruction: 3, // Withdraw instruction\n\t\t\t\tpoolTokenAmount: new BN(poolTokenAmount),\n\t\t\t\tminimumTokenA: new BN(minimumTokenA),\n\t\t\t\tminimumTokenB: new BN(minimumTokenB),\n\t\t\t},\n\t\t\tdata,\n\t\t);\n\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwap, isSigner: false, isWritable: false},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: userTransferAuthority, isSigner: true, isWritable: false},\n\t\t\t{pubkey: poolMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: sourcePoolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: fromA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: fromB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: userAccountA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: userAccountB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: feeAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: mintA, isSigner: false, isWritable: false},\n\t\t\t{pubkey: mintB, isSigner: false, isWritable: false},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenProgramIdA, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenProgramIdB, isSigner: false, isWritable: false},\n\t\t];\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tstatic depositSingleTokenTypeExactAmountInInstruction(\n\t\ttokenSwap: web3.PublicKey,\n\t\tauthority: web3.PublicKey,\n\t\tuserTransferAuthority: web3.PublicKey,\n\t\tsource: web3.PublicKey,\n\t\tintoA: web3.PublicKey,\n\t\tintoB: web3.PublicKey,\n\t\tpoolToken: web3.PublicKey,\n\t\tpoolAccount: web3.PublicKey,\n\t\tsourceMint: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\tsourceTokenProgramId: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\tsourceTokenAmount: BN,\n\t\tminimumPoolTokenAmount: BN,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('sourceTokenAmount'),\n\t\t\tu64('minimumPoolTokenAmount'),\n\t\t]);\n\n\t\tconst data = Buffer.alloc(dataLayout.span);\n\t\tdataLayout.encode(\n\t\t\t{\n\t\t\t\tinstruction: 4, // depositSingleTokenTypeExactAmountIn instruction\n\t\t\t\tsourceTokenAmount: sourceTokenAmount,\n\t\t\t\tminimumPoolTokenAmount: minimumPoolTokenAmount,\n\t\t\t},\n\t\t\tdata,\n\t\t);\n\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwap, isSigner: false, isWritable: false},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: userTransferAuthority, isSigner: true, isWritable: false},\n\t\t\t{pubkey: source, isSigner: false, isWritable: true},\n\t\t\t{pubkey: intoA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: intoB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolToken, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: sourceMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: sourceTokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t];\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n\n\tstatic withdrawSingleTokenTypeExactAmountOutInstruction(\n\t\ttokenSwap: web3.PublicKey,\n\t\tauthority: web3.PublicKey,\n\t\tuserTransferAuthority: web3.PublicKey,\n\t\tpoolMint: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\tsourcePoolAccount: web3.PublicKey,\n\t\tfromA: web3.PublicKey,\n\t\tfromB: web3.PublicKey,\n\t\tuserAccount: web3.PublicKey,\n\t\tdestinationMint: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\tdestinationTokenProgramId: web3.PublicKey,\n\t\tdestinationTokenAmount: BN,\n\t\tmaximumPoolTokenAmount: BN,\n\t): web3.TransactionInstruction {\n\t\tconst dataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('destinationTokenAmount'),\n\t\t\tu64('maximumPoolTokenAmount'),\n\t\t]);\n\n\t\tconst data = Buffer.alloc(dataLayout.span);\n\t\tdataLayout.encode(\n\t\t\t{\n\t\t\t\tinstruction: 5, // withdrawSingleTokenTypeExactAmountOut instruction\n\t\t\t\tdestinationTokenAmount: destinationTokenAmount,\n\t\t\t\tmaximumPoolTokenAmount: maximumPoolTokenAmount,\n\t\t\t},\n\t\t\tdata,\n\t\t);\n\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwap, isSigner: false, isWritable: false},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: userTransferAuthority, isSigner: true, isWritable: false},\n\t\t\t{pubkey: poolMint, isSigner: false, isWritable: true},\n\t\t\t{pubkey: sourcePoolAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: fromA, isSigner: false, isWritable: true},\n\t\t\t{pubkey: fromB, isSigner: false, isWritable: true},\n\t\t\t{pubkey: userAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: feeAccount, isSigner: false, isWritable: true},\n\t\t\t{pubkey: destinationMint, isSigner: false, isWritable: false},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t\t{pubkey: destinationTokenProgramId, isSigner: false, isWritable: false},\n\t\t];\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n}\n","import {BN, web3} from \"@project-serum/anchor\";\nimport {\n\tcreateAssociatedTokenAccountInstruction,\n\tcreateCloseAccountInstruction,\n\tcreateHarvestWithheldTokensToMintInstruction,\n\tcreateSyncNativeInstruction,\n\tcreateTransferCheckedInstruction,\n\tgetAssociatedTokenAddressSync,\n\tTOKEN_2022_PROGRAM_ID\n} from \"@solana/spl-token\";\nimport {PoolConfig, TokenInput, TokenSwapLayout, TokenSwapPool} from \"./layouts\";\nimport {SWAP_PROGRAM_ID, WSOL} from \"./constants\";\nimport {CreateTokenPool} from \"./create_token_pool\";\nimport Instructions from \"./instructions\";\n\nexport default class Client {\n\n\tconnection;\n\n\tpoolTokenProgramId = TOKEN_2022_PROGRAM_ID //The program ID of the token program for the pool tokens\n\n\tconstructor(connection: web3.Connection) {\n\t\tthis.connection = connection\n\t}\n\n\n\tasync getPools() {\n\t\tconst resp = await this.connection.getProgramAccounts(SWAP_PROGRAM_ID)\n\t\treturn resp.map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: TokenSwapLayout.decode(m.account.data)}\n\t\t})\n\t}\n\n\t/**\n\t * @deprecated Use fluxbeam api /pools/search/mints (findPools)\n\t */\n\tasync getSwapPools(tokenA: web3.PublicKey, tokenB: web3.PublicKey) {\n\t\tconst resp = await this.connection.getProgramAccounts(SWAP_PROGRAM_ID, {\n\t\t\tcommitment: 'confirmed',\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenA.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenB.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t\tconst respInverse = await this.connection.getProgramAccounts(SWAP_PROGRAM_ID, {\n\t\t\tcommitment: 'confirmed',\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenB.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenA.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t\treturn resp.concat(respInverse).map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: TokenSwapLayout.decode(m.account.data)}\n\t\t})\n\t}\n\n\n\tasync getSwapPoolsSingle(tokenA: web3.PublicKey) {\n\t\tconst resp = await this.connection.getProgramAccounts(SWAP_PROGRAM_ID, {\n\t\t\tcommitment: 'confirmed',\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenA.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t\tconst respInverse = await this.connection.getProgramAccounts(SWAP_PROGRAM_ID, {\n\t\t\tcommitment: 'confirmed',\n\t\t\tfilters: [\n\t\t\t\t{\n\t\t\t\t\tmemcmp: {\n\t\t\t\t\t\toffset: 1 + 1 + 1 + 32 + 32 + 32 + 32 + 32,\n\t\t\t\t\t\tbytes: tokenA.toString(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t\treturn resp.concat(respInverse).map((m) => {\n\t\t\treturn {pubkey: m.pubkey, account: TokenSwapLayout.decode(m.account.data)}\n\t\t})\n\t}\n\n\n\tasync getPool(pool: web3.PublicKey) {\n\t\tconst resp = await this.connection.getAccountInfo(pool, \"confirmed\")\n\t\treturn {pubkey: pool, owner: resp?.owner, account: TokenSwapLayout.decode(resp!.data)}\n\t}\n\n\tasync getPoolDetail(poolPK: web3.PublicKey, pool: TokenSwapPool, walletPk: web3.PublicKey) {\n\t\tconst resp = await this.connection.getMultipleParsedAccounts([\n\t\t\tnew web3.PublicKey(pool.tokenAccountA),\n\t\t\tnew web3.PublicKey(pool.tokenAccountB),\n\t\t\tgetAssociatedTokenAddressSync(new web3.PublicKey(pool.tokenPool), poolPK, true, TOKEN_2022_PROGRAM_ID),\n\t\t\tgetAssociatedTokenAddressSync(new web3.PublicKey(pool.tokenPool), walletPk, true, TOKEN_2022_PROGRAM_ID),\n\t\t\tnew web3.PublicKey(pool.mintA),\n\t\t\tnew web3.PublicKey(pool.mintB),\n\t\t\tnew web3.PublicKey(pool.tokenPool),\n\t\t])\n\t\t// console.log(\"LP Mint:\", pool.tokenPool.toString())\n\n\t\treturn {\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountA: resp?.value[0]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountB: resp?.value[1]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\ttokenPool: resp?.value[2]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\tuserLP: resp?.value[3]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\tmintA: resp?.value[4]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\tmintB: resp?.value[5]?.data?.parsed?.info,\n\t\t\t//@ts-ignore\n\t\t\tmintProgramA: resp?.value[4]?.owner,\n\t\t\t//@ts-ignore\n\t\t\tmintProgramB: resp?.value[5]?.owner,\n\t\t\t//@ts-ignore\n\t\t\tmintLp: resp?.value[6]?.data?.parsed?.info,\n\t\t\tpoolAddress: poolPK,\n\t\t}\n\t}\n\n\tasync createPoolTransactions(\n\t\tpayer: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\ttokenA: TokenInput,\n\t\ttokenB: TokenInput,\n\t\tconfig: PoolConfig,\n\t) {\n\t\tconst cp = new CreateTokenPool(\n\t\t\tthis.connection,\n\t\t\tpayer,\n\t\t\tfeeAccount,\n\t\t\ttokenA,\n\t\t\ttokenB,\n\t\t\tconfig\n\t\t)\n\n\t\tconst initTxn = await cp.initializeTransaction()\n\t\tconst createTxn = await cp.createTransaction()\n\n\t\t// return [\n\t\t// \t{\n\t\t// \t\ttxn: initTxn.transaction,\n\t\t// \t\tsigners: initTxn.signers\n\t\t// \t}, {\n\t\t// \t\ttxn: createTxn.transaction,\n\t\t// \t\tsigners: createTxn.signers\n\t\t// \t}\n\t\t// ]\n\n\t\tinitTxn.transaction.add(...createTxn.transaction.instructions)\n\t\tinitTxn.signers.push(...createTxn.signers)\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpool: cp.tokenSwapAccount.publicKey,\n\t\t\t\ttxn: initTxn.transaction,\n\t\t\t\tsigners: initTxn.signers\n\t\t\t}\n\t\t]\n\t}\n\n\tasync createSwapTransaction(payer: web3.PublicKey, pool: web3.PublicKey, srcMint: TokenInput, dstMint: TokenInput, route: TokenSwapPool, amountIn: number, minimumAmountOut: number) {\n\t\tconst aToB = srcMint.mint.equals(new web3.PublicKey(route.mintA))\n\n\t\tconsole.log(\"createSwapTransaction\", {\n\t\t\tamountIn,\n\t\t\tminimumAmountOut,\n\t\t\tsrcMint: srcMint.mint.toString(),\n\t\t\tdstMint: dstMint.mint.toString(),\n\t\t\trouteSrc: route.mintA.toString(),\n\t\t\trouteDst: route.mintB.toString(),\n\t\t\taToBo: aToB\n\t\t})\n\t\tconst mintAInfo = await this.connection.getParsedAccountInfo(srcMint.mint)\n\t\tconst mintBInfo = await this.connection.getParsedAccountInfo(dstMint.mint)\n\n\t\tconst transaction = new web3.Transaction()\n\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([pool.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst userSource = getAssociatedTokenAddressSync(srcMint.mint, payer, true, mintAInfo.value?.owner!)\n\t\tconst userDestination = getAssociatedTokenAddressSync(dstMint.mint, payer, true, mintBInfo.value?.owner!)\n\t\tconst userDestinationInfo = await this.connection.getParsedAccountInfo(userDestination)\n\n\t\tconst poolSource = new web3.PublicKey(aToB ? route.tokenAccountA : route.tokenAccountB)\n\t\tconst poolDestination = new web3.PublicKey(aToB ? route.tokenAccountB : route.tokenAccountA)\n\n\n\t\tif (srcMint.mint.equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, Math.ceil(srcMint.amount));\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (!userDestinationInfo.value) {\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userDestination, payer, dstMint.mint, mintBInfo.value?.owner!))\n\t\t}\n\n\t\ttransaction.add(Instructions.createSwapInstruction(\n\t\t\tpool,\n\t\t\tauthority,\n\t\t\tpayer,\n\t\t\tuserSource,\n\t\t\tpoolSource,\n\t\t\tpoolDestination,\n\t\t\tuserDestination,\n\t\t\tnew web3.PublicKey(route.tokenPool),\n\t\t\tnew web3.PublicKey(route.feeAccount),\n\t\t\tnew web3.PublicKey(route.feeAccount), //hostFeeAccount,\n\t\t\tsrcMint.mint,\n\t\t\tdstMint.mint,\n\t\t\tSWAP_PROGRAM_ID,\n\t\t\tmintAInfo.value?.owner!,\n\t\t\tmintBInfo.value?.owner!,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tnew BN(amountIn, 10),\n\t\t\tnew BN(minimumAmountOut, 10),\n\t\t))\n\n\t\tif (dstMint.mint.equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\ttransaction.add(this.getUnwrapSOLInstruction(payer))\n\t\t}\n\n\n\t\tif (this.hasTransferFeeConfig(mintAInfo))\n\t\t\ttransaction.add(createHarvestWithheldTokensToMintInstruction(\n\t\t\t\tsrcMint.mint,\n\t\t\t\t[\n\t\t\t\t\tuserSource,\n\t\t\t\t\tpoolSource\n\t\t\t\t]\n\t\t\t))\n\n\t\tif (this.hasTransferFeeConfig(mintBInfo))\n\t\t\ttransaction.add(createHarvestWithheldTokensToMintInstruction(\n\t\t\t\tdstMint.mint,\n\t\t\t\t[\n\t\t\t\t\tuserDestination,\n\t\t\t\t\tpoolDestination\n\t\t\t\t]\n\t\t\t))\n\n\t\treturn transaction\n\t}\n\n\n\tasync createAddLiquidityTransaction(payer: web3.PublicKey, pool: web3.PublicKey, route: TokenSwapPool, srcMint: TokenInput, dstMint: TokenInput, poolTokenAmount: any, initTokenPrice = false, priorityFee) {\n\t\tconst mintAInfo = await this.connection.getParsedAccountInfo(new web3.PublicKey(route.mintA))\n\t\tconst mintBInfo = await this.connection.getParsedAccountInfo(new web3.PublicKey(route.mintB))\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([pool.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst userAccountA = getAssociatedTokenAddressSync(new web3.PublicKey(route.mintA), payer, true, mintAInfo.value?.owner!)\n\t\tconst userAccountB = getAssociatedTokenAddressSync(new web3.PublicKey(route.mintB), payer, true, mintBInfo.value?.owner!)\n\t\tconst userPoolTokenAccount = getAssociatedTokenAddressSync(new web3.PublicKey(route.tokenPool), payer, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst balanceInfo = await this.connection.getMultipleParsedAccounts([userPoolTokenAccount], {commitment: \"confirmed\"})\n\t\tconst [userPoolTokenAccountInfo] = balanceInfo.value\n\n\n\t\tconst unitLimit = 100_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\tconst transaction = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t)\n\n\t\tif (new web3.PublicKey(route.mintA).equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, srcMint.amount);\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (new web3.PublicKey(route.mintB).equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, dstMint.amount);\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (!userPoolTokenAccountInfo)\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userPoolTokenAccount, payer, new web3.PublicKey(route.tokenPool), TOKEN_2022_PROGRAM_ID))\n\n\t\tconsole.debug(\"depositAllTokenTypesInstruction\", {\n\t\t\tpool,\n\t\t\tmintA: route.mintA,\n\t\t\tmintB: route.mintB,\n\t\t\tpoolTokenAmount: poolTokenAmount,\n\t\t\ttokenAAmount: srcMint.amount,\n\t\t\ttokenBAmount: dstMint.amount,\n\t\t\tsrcMint,\n\t\t\tdstMint,\n\t\t})\n\n\t\tif (initTokenPrice) {\n\t\t\tconst ratio = dstMint.amount / srcMint.amount\n\n\t\t\t//ts-ignore\n\t\t\tpoolTokenAmount = 1_000_000_000\n\n\t\t\tconsole.log(\"initTokenPrice\", {\n\t\t\t\tpoolTokenAmount: poolTokenAmount,\n\t\t\t\ttokenA: route.mintA.toString(),\n\t\t\t\ttokenB: route.mintB.toString(),\n\t\t\t\tratio, //b to a\n\t\t\t\tamountA: srcMint.amount,\n\t\t\t\tamountB: dstMint.amount,\n\t\t\t\teAmountA: srcMint.amount / 2,\n\t\t\t\teAmountB: dstMint.amount / 2,\n\t\t\t\texactAmountInA: srcMint.amountInExact(srcMint.amount / 2),\n\t\t\t\texactAmountInB: dstMint.amountInExact(dstMint.amount / 2)\n\t\t\t})\n\n\n\t\t\t//@ts-ignore\n\t\t\ttransaction.add(createTransferCheckedInstruction(userAccountA, new web3.PublicKey(route.mintA), new web3.PublicKey(route.tokenAccountA), payer, srcMint.amountInExact(srcMint.amount / 2), mintAInfo.value?.data?.parsed?.info.decimals, [], mintAInfo.value?.owner!))\n\n\t\t\t//@ts-ignore\n\t\t\ttransaction.add(createTransferCheckedInstruction(userAccountB, new web3.PublicKey(route.mintB), new web3.PublicKey(route.tokenAccountB), payer, dstMint.amountInExact(dstMint.amount / 2), mintBInfo.value?.data?.parsed?.info.decimals, [], mintBInfo.value?.owner!))\n\n\t\t\t// srcMint.amount -= srcMint.exactAmountIn(srcMint.amount/2)\n\t\t\t// dstMint.amount -= dstMint.exactAmountIn(dstMint.amount/2)\n\t\t\tsrcMint.amount = srcMint.amount / 2\n\t\t\tdstMint.amount = dstMint.amount / 2\n\t\t}\n\n\t\ttransaction.add(Instructions.depositAllTokenTypesInstruction(\n\t\t\tpool,\n\t\t\tauthority,\n\t\t\tpayer,\n\t\t\tuserAccountA,\n\t\t\tuserAccountB,\n\t\t\tnew web3.PublicKey(route.tokenAccountA),\n\t\t\tnew web3.PublicKey(route.tokenAccountB),\n\t\t\tnew web3.PublicKey(route.tokenPool),\n\t\t\tuserPoolTokenAccount,\n\t\t\tnew web3.PublicKey(route.mintA),\n\t\t\tnew web3.PublicKey(route.mintB),\n\t\t\tSWAP_PROGRAM_ID,\n\t\t\tmintAInfo.value?.owner!,\n\t\t\tmintBInfo.value?.owner!,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tnew BN(poolTokenAmount, 10),\n\t\t\tnew BN(srcMint.amount, 10),\n\t\t\tnew BN(dstMint.amount, 10),\n\t\t))\n\n\t\tif (new web3.PublicKey(route.mintB).equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\ttransaction.add(await this.getUnwrapSOLInstruction(payer))\n\t\t}\n\n\t\treturn transaction\n\t}\n\n\tasync createAddSingleSideLiquidityTransaction(payer: web3.PublicKey, pool: web3.PublicKey, route: TokenSwapPool, srcMint: TokenInput, minPoolTokenAmount: BN, priorityFee) {\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([pool.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst userAccount = getAssociatedTokenAddressSync(srcMint.mint, payer, true, srcMint.programID)\n\t\tconst userPoolTokenAccount = getAssociatedTokenAddressSync(new web3.PublicKey(route.tokenPool), payer, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst balanceInfo = await this.connection.getMultipleParsedAccounts([userPoolTokenAccount], {commitment: \"confirmed\"})\n\t\tconst [userPoolTokenAccountInfo] = balanceInfo.value\n\n\n\t\tconst unitLimit = 200_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\tconst transaction = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t)\n\n\t\tif (srcMint.mint.equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, srcMint.amount);\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (!userPoolTokenAccountInfo)\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userPoolTokenAccount, payer, new web3.PublicKey(route.tokenPool), TOKEN_2022_PROGRAM_ID))\n\n\n\t\tconsole.log(\"amountIn\", srcMint.amount)\n\t\tconsole.log(\"amountOut\", minPoolTokenAmount)\n\n\t\ttransaction.add(Instructions.depositSingleTokenTypeExactAmountInInstruction(\n\t\t\tpool,\n\t\t\tauthority,\n\t\t\tpayer,\n\t\t\tuserAccount,\n\t\t\tnew web3.PublicKey(route.tokenAccountA),\n\t\t\tnew web3.PublicKey(route.tokenAccountB),\n\t\t\tnew web3.PublicKey(route.tokenPool),\n\t\t\tuserPoolTokenAccount,\n\t\t\tsrcMint.mint,\n\t\t\tSWAP_PROGRAM_ID,\n\t\t\tsrcMint.programID,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tnew BN(srcMint.amount),\n\t\t\tnew BN(minPoolTokenAmount)\n\t\t))\n\n\t\tif (srcMint.mint.equals(WSOL)) {\n\t\t\t//Do sync native checks\n\t\t\ttransaction.add(this.getUnwrapSOLInstruction(payer))\n\t\t}\n\n\t\treturn transaction\n\t}\n\n\tasync createRemoveLiquidityTransaction(payer: web3.PublicKey, pool: web3.PublicKey, route: TokenSwapPool, poolTokenAmount: number, minimumTokenA: number, minimumTokenB: number, priorityFee: number) {\n\t\tconst mintAInfo = await this.connection.getParsedAccountInfo(new web3.PublicKey(route.mintA))\n\t\tconst mintBInfo = await this.connection.getParsedAccountInfo(new web3.PublicKey(route.mintB))\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([pool.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst userAccountA = getAssociatedTokenAddressSync(new web3.PublicKey(route.mintA), payer, true, mintAInfo.value?.owner!)\n\t\tconst userAccountB = getAssociatedTokenAddressSync(new web3.PublicKey(route.mintB), payer, true, mintBInfo.value?.owner!)\n\t\tconst userPoolTokenAccount = getAssociatedTokenAddressSync(new web3.PublicKey(route.tokenPool), payer, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst balanceInfo = await this.connection.getMultipleParsedAccounts([userAccountA, userAccountB, new web3.PublicKey(route.tokenAccountA), new web3.PublicKey(route.tokenAccountB), userPoolTokenAccount])\n\n\t\tconst [uAInfo, uBInfo, tAInfo, tBInfo, spInfo] = balanceInfo.value\n\n\t\tconsole.log({\n\t\t\t//@ts-ignore\n\t\t\tuserAccountAAmount: uAInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\tuserAccountBAmount: uBInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountAAmount: tAInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountBAmount: tBInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\tsourcePoolAccountAmount: spInfo?.data.parsed.info.tokenAmount.amount,\n\t\t})\n\n\n\t\tconst unitLimit = 200_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\tconst transaction = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t)\n\t\t// deposit_all_token_types deposit_single_token_type_exact_amount_in\n\n\t\t//Create wSOL account\n\t\tif (new web3.PublicKey(route.mintA).equals(WSOL) || new web3.PublicKey(route.mintB).equals(WSOL)) {\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, 0);\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (!uAInfo?.data && !new web3.PublicKey(route.mintA).equals(WSOL)) {\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userAccountA, payer, new web3.PublicKey(route.mintA), mintAInfo.value?.owner!))\n\t\t}\n\n\t\tif (!uBInfo?.data && !new web3.PublicKey(route.mintB).equals(WSOL)) {\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userAccountB, payer, new web3.PublicKey(route.mintB), mintBInfo.value?.owner!))\n\t\t}\n\n\n\t\ttransaction.add(Instructions.withdrawAllTokenTypesInstruction(\n\t\t\tpool,\n\t\t\tauthority,\n\t\t\tpayer,\n\t\t\tnew web3.PublicKey(route.tokenPool),\n\t\t\tnew web3.PublicKey(route.feeAccount),\n\t\t\tuserPoolTokenAccount,\n\t\t\tnew web3.PublicKey(route.tokenAccountA),\n\t\t\tnew web3.PublicKey(route.tokenAccountB),\n\t\t\tuserAccountA,\n\t\t\tuserAccountB,\n\t\t\tnew web3.PublicKey(route.mintA),\n\t\t\tnew web3.PublicKey(route.mintB),\n\t\t\tSWAP_PROGRAM_ID,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tmintAInfo.value?.owner!,\n\t\t\tmintBInfo.value?.owner!,\n\t\t\tpoolTokenAmount,\n\t\t\tminimumTokenA,\n\t\t\tminimumTokenB,\n\t\t))\n\n\t\t//Unwrap sol\n\t\tif (new web3.PublicKey(route.mintA).equals(WSOL) || new web3.PublicKey(route.mintB).equals(WSOL))\n\t\t\ttransaction.add(this.getUnwrapSOLInstruction(payer))\n\n\t\treturn transaction\n\t}\n\n\t//TODO Test\n\tasync createRemoveSingleSideLiquidityTransaction(payer: web3.PublicKey, pool: web3.PublicKey, route: TokenSwapPool, dstMint: TokenInput, poolTokenAmount: number, priorityFee: number) {\n\t\tconst mintInfo = await this.connection.getParsedAccountInfo(dstMint.mint)\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([pool.toBuffer()], SWAP_PROGRAM_ID);\n\n\t\tconst userAccount = getAssociatedTokenAddressSync(dstMint.mint, payer, true, mintInfo.value?.owner!)\n\n\t\tconst userPoolTokenAccount = getAssociatedTokenAddressSync(new web3.PublicKey(route.tokenPool), payer, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst balanceInfo = await this.connection.getMultipleParsedAccounts([userAccount, new web3.PublicKey(route.tokenAccountA), new web3.PublicKey(route.tokenAccountB), userPoolTokenAccount])\n\n\t\tconst [uAInfo, tAInfo, tBInfo, spInfo] = balanceInfo.value\n\n\t\tconsole.log({\n\t\t\t//@ts-ignore\n\t\t\tuserAccountAAmount: uAInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountAAmount: tAInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\ttokenAccountBAmount: tBInfo?.data.parsed.info.tokenAmount.amount,\n\t\t\t//@ts-ignore\n\t\t\tsourcePoolAccountAmount: spInfo?.data.parsed.info.tokenAmount.amount,\n\t\t})\n\n\n\t\tconst unitLimit = 200_000\n\t\tconst unitPrice = Math.floor(priorityFee / unitLimit)\n\n\t\tconst transaction = new web3.Transaction().add(\n\t\t\tweb3.ComputeBudgetProgram.setComputeUnitPrice({microLamports: unitPrice}),\n\t\t)\n\n\t\t//Create wSOL account\n\t\tif (dstMint.mint.equals(WSOL)) {\n\t\t\tconst ixs = await this.getWrapSOLInstructions(payer, 0);\n\t\t\tif (ixs.length > 0)\n\t\t\t\ttransaction.add(...ixs)\n\t\t}\n\n\t\tif (!uAInfo?.data && !dstMint.mint.equals(WSOL)) {\n\t\t\ttransaction.add(createAssociatedTokenAccountInstruction(payer, userAccount, payer, new web3.PublicKey(route.mintB), mintInfo.value?.owner!))\n\t\t}\n\n\t\ttransaction.add(Instructions.withdrawSingleTokenTypeExactAmountOutInstruction(\n\t\t\tpool,\n\t\t\tauthority,\n\t\t\tpayer,\n\t\t\tnew web3.PublicKey(route.tokenPool),\n\t\t\tnew web3.PublicKey(route.feeAccount),\n\t\t\tuserPoolTokenAccount,\n\t\t\tnew web3.PublicKey(route.tokenAccountA),\n\t\t\tnew web3.PublicKey(route.tokenAccountB),\n\t\t\tuserAccount,\n\t\t\tdstMint.mint,\n\t\t\tSWAP_PROGRAM_ID,\n\t\t\tTOKEN_2022_PROGRAM_ID,\n\t\t\tmintInfo.value?.owner!,\n\t\t\tnew BN(dstMint.amount, 10),\n\t\t\tnew BN(poolTokenAmount),\n\t\t))\n\n\t\t//Unwrap sol\n\t\tif (dstMint.mint.equals(WSOL))\n\t\t\ttransaction.add(this.getUnwrapSOLInstruction(payer))\n\n\t\treturn transaction\n\t}\n\n\n\tasync getWrapSOLInstructions(owner: web3.PublicKey, amount: number): Promise {\n\t\tconst ixs: web3.TransactionInstruction[] = []\n\t\tconst ata = getAssociatedTokenAddressSync(WSOL, owner, true)\n\t\tconst ataInfo = await this.connection.getTokenAccountBalance(ata).catch(() => {\n\t\t})\n\n\t\tif (ataInfo) {\n\t\t\tif (Number(ataInfo?.value.amount) >= amount)\n\t\t\t\treturn ixs;\n\t\t}\n\n\t\tif (!ataInfo) {\n\t\t\tixs.push(createAssociatedTokenAccountInstruction(owner, ata, owner, WSOL))\n\t\t}\n\t\tif (amount > 0)\n\t\t\tixs.push(...[\n\t\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\t\tfromPubkey: owner,\n\t\t\t\t\ttoPubkey: ata,\n\t\t\t\t\tlamports: amount - Number(ataInfo?.value.amount || 0),\n\t\t\t\t}),\n\t\t\t\tcreateSyncNativeInstruction(ata)\n\t\t\t])\n\n\t\treturn ixs\n\t}\n\n\tgetUnwrapSOLInstruction(owner: web3.PublicKey): web3.TransactionInstruction {\n\t\tconst ata = getAssociatedTokenAddressSync(WSOL, owner, true)\n\t\treturn createCloseAccountInstruction(ata, owner, owner)\n\t}\n\n\thasTransferFeeConfig(mintInfo: any): boolean {\n\t\tif (!TOKEN_2022_PROGRAM_ID.equals(mintInfo.value?.owner))\n\t\t\treturn false\n\n\t\treturn mintInfo.value?.data.parsed?.info.extensions?.filter((ex: any) => ex.extension === \"transferFeeConfig\").length > 0\n\t}\n}","import {web3} from \"@project-serum/anchor\";\n\n\n\nexport const SWAP_PROGRAM_ID = new web3.PublicKey(\"FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X\") //Fluxbeam SWAP\nexport const OPENBOOK_PROGRAM_ID = new web3.PublicKey(\"3hbVj9SJchvF7avy2g1AzRVama8vxZPbk83kpnbJMTa4\") //Openbook\n\nexport const WSOL = new web3.PublicKey(\"So11111111111111111111111111111111111111112\")\nexport const USDC = new web3.PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\")\nexport const MSOL = new web3.PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\")\nexport const FLUXB = new web3.PublicKey(\"FLUXBmPhT3Fd1EDVFdg46YREqHBeNypn1h4EbnTzWERX\")\n\n\nexport const METADATA_V1_PROGRAM_ID = new web3.PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\")\nexport const METADATA_2022_PROGRAM_ID = new web3.PublicKey(\"META4s4fSmpkTbZoUsgC1oBnWB31vQcmnN8giPw51Zu\")\n// export const METADATA_2022_PROGRAM_ID = new web3.PublicKey(\"M1tgEZCz7fHqRAR3G5RLxU6c6ceQiZyFK7tzzy4Rof4\")\n\n\n\nexport function defaultSOL(addr: string, amount: number) {\n\tconst uiAmount = amount / Math.pow(10, 9)\n\treturn {\n\t\taddress: WSOL,\n\t\tpubkey: WSOL,\n\t\taccount: {\n\t\t\tdata: {\n\t\t\t\tparsed: {\n\t\t\t\t\tinfo: {\n\t\t\t\t\t\tmint: \"So11111111111111111111111111111111111111112\",\n\t\t\t\t\t\towner: addr,\n\t\t\t\t\t\ttokenAmount: {\n\t\t\t\t\t\t\tamount: `${amount}`,\n\t\t\t\t\t\t\tdecimals: 9,\n\t\t\t\t\t\t\tuiAmount: uiAmount,\n\t\t\t\t\t\t\tuiAmountString: `${uiAmount}`\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","import {\n\tcreateAssociatedTokenAccountInstruction,\n\tcreateInitializeMint2Instruction,\n\tcreateSyncNativeInstruction,\n\tcreateTransferCheckedInstruction,\n\tgetAssociatedTokenAddressSync,\n\tgetMinimumBalanceForRentExemptMint,\n\tMINT_SIZE,\n\tTOKEN_2022_PROGRAM_ID\n} from \"@solana/spl-token\";\nimport {BN, web3} from \"@project-serum/anchor\";\nimport {blob, struct, u64, u8} from \"@/api/marshmallow\";\nimport {Numberu64, PoolConfig, TokenInput, TokenSwapLayout} from \"./layouts\";\nimport {SWAP_PROGRAM_ID, WSOL} from \"./constants\";\n\n\n\n\nexport const SWAP_PROGRAM_OWNER_FEE_ADDRESS = new web3.PublicKey(\"beamazjPnFT3JQoe16HjUxkpmHFfsHY6dTqf3VwBXzq\");\nexport const TRADING_FEE_NUMERATOR = 20;\nexport const TRADING_FEE_DENOMINATOR = 10_000;\nexport const OWNER_TRADING_FEE_NUMERATOR = 5;\nexport const OWNER_TRADING_FEE_DENOMINATOR = 10_000;\nexport const OWNER_WITHDRAW_FEE_NUMERATOR = SWAP_PROGRAM_OWNER_FEE_ADDRESS ? 0 : 1;\nexport const OWNER_WITHDRAW_FEE_DENOMINATOR = SWAP_PROGRAM_OWNER_FEE_ADDRESS ? 0 : 10_000;\nexport const HOST_FEE_NUMERATOR = 20;\nexport const HOST_FEE_DENOMINATOR = 10_000;\n\nexport class CreateTokenPool {\n\n\tpoolTokenProgramId = TOKEN_2022_PROGRAM_ID //The program ID of the token program for the pool tokens\n\n\tconnection;\n\tconfig;\n\tpayer;\n\towner;\n\n\ttokenA;\n\ttokenB;\n\n\ttokenSwapAccount = web3.Keypair.generate()\n\ttokenPoolMint = web3.Keypair.generate()\n\n\ttokenAccountPool;\n\tfeeAccountAta;\n\n\t//Filled when init called\n\ttokenAccountA: web3.PublicKey = web3.PublicKey.default\n\ttokenAccountB: web3.PublicKey = web3.PublicKey.default\n\n\n\tauthority: web3.PublicKey\n\n\n\tconstructor(connection: web3.Connection, payer: web3.PublicKey, owner: web3.PublicKey, tokenA: TokenInput, tokenB: TokenInput, config: PoolConfig) {\n\t\tthis.connection = connection\n\t\tthis.payer = payer\n\t\tthis.owner = owner\n\t\tthis.config = config\n\n\t\tthis.tokenA = tokenA\n\t\tthis.tokenB = tokenB\n\n\n\t\t//Create ATAs\n\t\tconst [authority] = web3.PublicKey.findProgramAddressSync([this.tokenSwapAccount.publicKey.toBuffer()], SWAP_PROGRAM_ID);\n\t\tthis.authority = authority\n\n\t\t//LP ATA\n\t\tthis.tokenAccountPool = getAssociatedTokenAddressSync(this.tokenPoolMint.publicKey, this.owner, true, TOKEN_2022_PROGRAM_ID)\n\n\t\tconst ownerKey = SWAP_PROGRAM_OWNER_FEE_ADDRESS || owner;\n\t\tthis.feeAccountAta = getAssociatedTokenAddressSync(this.tokenPoolMint.publicKey, ownerKey, true, TOKEN_2022_PROGRAM_ID)\n\t}\n\n\tasync initializeTransaction() {\n\t\tconst {transaction, signers} = await this.initializeTransactionInstruction()\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\ttransaction.feePayer = this.payer\n\t\treturn {transaction, signers}\n\t}\n\n\tasync createTransaction() {\n\t\tconst {transaction, signers} = await this.createTransactionInstruction()\n\n\t\tconst bhash = await this.connection.getLatestBlockhash(\"confirmed\")\n\t\ttransaction.recentBlockhash = bhash.blockhash\n\t\ttransaction.feePayer = this.payer\n\t\treturn {transaction, signers}\n\t}\n\n\tasync initializeTransactionInstruction() {\n\t\tconst transaction = new web3.Transaction();\n\t\tconst signers = [\n\t\t\tthis.tokenPoolMint,\n\t\t];\n\n\t\t//Create the pool mint\n\t\ttransaction.add(\n\t\t\tweb3.SystemProgram.createAccount({\n\t\t\t\tfromPubkey: this.payer,\n\t\t\t\tnewAccountPubkey: this.tokenPoolMint.publicKey,\n\t\t\t\tspace: MINT_SIZE,\n\t\t\t\tlamports: await getMinimumBalanceForRentExemptMint(this.connection),\n\t\t\t\tprogramId: TOKEN_2022_PROGRAM_ID,\n\t\t\t}),\n\t\t\tcreateInitializeMint2Instruction(this.tokenPoolMint.publicKey, 2, this.authority, null, TOKEN_2022_PROGRAM_ID)\n\t\t)\n\n\n\t\t//Create pool account\n\t\ttransaction.add(\n\t\t\tcreateAssociatedTokenAccountInstruction(\n\t\t\t\tthis.payer,\n\t\t\t\tthis.tokenAccountPool,\n\t\t\t\tthis.owner,\n\t\t\t\tthis.tokenPoolMint.publicKey,\n\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t)\n\t\t)\n\n\t\t//Create fee account\n\t\tconst ownerKey = SWAP_PROGRAM_OWNER_FEE_ADDRESS || this.owner;\n\t\ttransaction.add(\n\t\t\tcreateAssociatedTokenAccountInstruction(\n\t\t\t\tthis.payer,\n\t\t\t\tthis.feeAccountAta,\n\t\t\t\townerKey,\n\t\t\t\tthis.tokenPoolMint.publicKey,\n\t\t\t\tTOKEN_2022_PROGRAM_ID\n\t\t\t),\n\t\t);\n\n\n\t\t//Are the tokens native sol?\n\t\tconst tokenANative = this.tokenA.mint.equals(WSOL);\n\t\tconst tokenBNative = this.tokenB.mint.equals(WSOL);\n\n\n\t\t//Create pool ATAs\n\t\tthis.tokenAccountA = getAssociatedTokenAddressSync(this.tokenA.mint, this.authority, true, this.tokenA.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\")\n\t\tthis.tokenAccountB = getAssociatedTokenAddressSync(this.tokenB.mint, this.authority, true, this.tokenB.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\")\n\n\n\t\tif (tokenANative) {\n\t\t\ttransaction.add(\n\t\t\t\tcreateAssociatedTokenAccountInstruction(this.payer, this.tokenAccountA, this.authority, this.tokenA.mint, this.tokenA.programID),\n\t\t\t\tcreateSyncNativeInstruction(this.tokenAccountA))\n\t\t} else {\n\t\t\ttransaction.add(\n\t\t\t\tcreateAssociatedTokenAccountInstruction(this.payer, this.tokenAccountA, this.authority, this.tokenA.mint, this.tokenA.programID),\n\t\t\t)\n\t\t}\n\n\t\tif (tokenBNative) {\n\t\t\ttransaction.add(\n\t\t\t\tcreateAssociatedTokenAccountInstruction(this.payer, this.tokenAccountB, this.authority, this.tokenB.mint, this.tokenB.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"),\n\t\t\t\tcreateSyncNativeInstruction(this.tokenAccountB))\n\t\t} else {\n\t\t\ttransaction.add(\n\t\t\t\tcreateAssociatedTokenAccountInstruction(this.payer, this.tokenAccountB, this.authority, this.tokenB.mint, this.tokenB.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"),\n\t\t\t)\n\t\t}\n\n\t\treturn {\n\t\t\ttransaction: transaction,\n\t\t\tsigners\n\t\t}\n\t}\n\n\tasync createTransactionInstruction() {\n\t\tconst transaction = new web3.Transaction()\n\n\t\t// Create the pool\n\t\tconst balanceNeeded = await this.getMinBalanceRentForExemptTokenSwap(this.connection);\n\t\ttransaction.add(\n\t\t\tweb3.SystemProgram.createAccount({\n\t\t\t\tfromPubkey: this.payer,\n\t\t\t\tnewAccountPubkey: this.tokenSwapAccount.publicKey,\n\t\t\t\tlamports: balanceNeeded,\n\t\t\t\tspace: TokenSwapLayout.span,\n\t\t\t\tprogramId: SWAP_PROGRAM_ID,\n\t\t\t}),\n\t\t);\n\n\t\t//Transfer initial liquidity\n\t\tconst payerAtaA = getAssociatedTokenAddressSync(this.tokenA.mint, this.payer, true, this.tokenA.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\")\n\t\tconst payerAtaB = getAssociatedTokenAddressSync(this.tokenB.mint, this.payer, true, this.tokenB.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\")\n\n\t\tconst mintAInfo = await this.tokenA.getMintInfo(this.connection)\n\t\tconst mintBInfo = await this.tokenB.getMintInfo(this.connection)\n\n\n\t\tif (this.tokenA.mint.equals(WSOL)) {\n\t\t\ttransaction.add(\n\t\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\t\tfromPubkey: this.payer,\n\t\t\t\t\ttoPubkey: this.tokenAccountA,\n\t\t\t\t\tlamports: this.tokenA.amount,\n\t\t\t\t}),\n\t\t\t\tcreateSyncNativeInstruction(this.tokenAccountA),\n\t\t\t)\n\t\t} else {\n\t\t\ttransaction.add(\n\t\t\t\tcreateTransferCheckedInstruction(payerAtaA, this.tokenA.mint, this.tokenAccountA, this.payer, this.tokenA.amount, mintAInfo.value.decimals, [], this.tokenA.programID))\n\t\t}\n\n\t\tif (this.tokenB.mint.equals(WSOL)) {\n\t\t\ttransaction.add(\n\t\t\t\tweb3.SystemProgram.transfer({\n\t\t\t\t\tfromPubkey: this.payer,\n\t\t\t\t\ttoPubkey: this.tokenAccountB,\n\t\t\t\t\tlamports: this.tokenB.amount,\n\t\t\t\t}),\n\t\t\t\tcreateSyncNativeInstruction(this.tokenAccountB),\n\t\t\t)\n\t\t} else {\n\t\t\ttransaction.add(\n\t\t\t\tcreateTransferCheckedInstruction(payerAtaB, this.tokenB.mint, this.tokenAccountB, this.payer, this.tokenB.amount, mintBInfo.value.decimals, [], this.tokenB.programID || \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"))\n\t\t}\n\n\n\n\t\tconst curveParam = this.config.curveType === 1 ? new Numberu64(1) : undefined\n\t\ttransaction.add(\n\t\t\tthis.createInitSwapInstruction(\n\t\t\t\tthis.tokenSwapAccount,\n\t\t\t\tthis.authority,\n\t\t\t\tthis.tokenAccountA,\n\t\t\t\tthis.tokenAccountB,\n\t\t\t\tthis.tokenPoolMint.publicKey,\n\t\t\t\tthis.feeAccountAta,\n\t\t\t\tthis.tokenAccountPool,\n\t\t\t\tthis.poolTokenProgramId,\n\t\t\t\tSWAP_PROGRAM_ID,\n\t\t\t\tthis.config.tradeFee.denominator ? this.config.tradeFee.numerator : TRADING_FEE_NUMERATOR,\n\t\t\t\tthis.config.tradeFee.denominator || TRADING_FEE_DENOMINATOR,\n\t\t\t\tthis.config.ownerTradeFee.denominator ? this.config.ownerTradeFee.numerator : OWNER_TRADING_FEE_NUMERATOR,\n\t\t\t\tthis.config.ownerTradeFee.denominator || OWNER_TRADING_FEE_DENOMINATOR,\n\t\t\t\tthis.config.ownerWithdrawFee.denominator ? this.config.ownerWithdrawFee.numerator : OWNER_WITHDRAW_FEE_NUMERATOR,\n\t\t\t\tthis.config.ownerWithdrawFee.denominator || OWNER_WITHDRAW_FEE_DENOMINATOR,\n\t\t\t\tthis.config.hostFee.denominator ? this.config.hostFee.numerator : HOST_FEE_NUMERATOR,\n\t\t\t\tthis.config.hostFee.denominator || HOST_FEE_DENOMINATOR,\n\t\t\t\tthis.config.curveType,\n\t\t\t\tcurveParam\n\t\t\t),\n\t\t)\n\n\t\treturn {\n\t\t\ttransaction: transaction,\n\t\t\tsigners: [\n\t\t\t\tthis.tokenSwapAccount,\n\t\t\t]\n\t\t}\n\t}\n\n\tasync getMinBalanceRentForExemptTokenSwap(\n\t\tconnection: web3.Connection,\n\t): Promise {\n\t\treturn await connection.getMinimumBalanceForRentExemption(\n\t\t\tTokenSwapLayout.span,\n\t\t);\n\t}\n\n\n\tcreateInitSwapInstruction(\n\t\ttokenSwapAccount: web3.Keypair,\n\t\tauthority: web3.PublicKey,\n\t\ttokenAccountA: web3.PublicKey,\n\t\ttokenAccountB: web3.PublicKey,\n\t\ttokenPool: web3.PublicKey,\n\t\tfeeAccount: web3.PublicKey,\n\t\ttokenAccountPool: web3.PublicKey,\n\t\tpoolTokenProgramId: web3.PublicKey,\n\t\tswapProgramId: web3.PublicKey,\n\t\ttradeFeeNumerator: number,\n\t\ttradeFeeDenominator: number,\n\t\townerTradeFeeNumerator: number,\n\t\townerTradeFeeDenominator: number,\n\t\townerWithdrawFeeNumerator: number,\n\t\townerWithdrawFeeDenominator: number,\n\t\thostFeeNumerator: number,\n\t\thostFeeDenominator: number,\n\t\tcurveType: number,\n\t\tcurveParameters: Numberu64 = new Numberu64(0),\n\t): web3.TransactionInstruction {\n\t\tconst keys = [\n\t\t\t{pubkey: tokenSwapAccount.publicKey, isSigner: false, isWritable: true},\n\t\t\t{pubkey: authority, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenAccountA, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenAccountB, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenPool, isSigner: false, isWritable: true},\n\t\t\t{pubkey: feeAccount, isSigner: false, isWritable: false},\n\t\t\t{pubkey: tokenAccountPool, isSigner: false, isWritable: true},\n\t\t\t{pubkey: poolTokenProgramId, isSigner: false, isWritable: false},\n\t\t];\n\n\t\tconst commandDataLayout = struct([\n\t\t\tu8('instruction'),\n\t\t\tu64('tradeFeeNumerator'),\n\t\t\tu64('tradeFeeDenominator'),\n\t\t\tu64('ownerTradeFeeNumerator'),\n\t\t\tu64('ownerTradeFeeDenominator'),\n\t\t\tu64('ownerWithdrawFeeNumerator'),\n\t\t\tu64('ownerWithdrawFeeDenominator'),\n\t\t\tu64('hostFeeNumerator'),\n\t\t\tu64('hostFeeDenominator'),\n\t\t\tu8('curveType'),\n\t\t\tblob(32, 'curveParameters'),\n\t\t])\n\n\t\tlet data = Buffer.alloc(1024);\n\n\t\t// package curve parameters\n\t\t// NOTE: currently assume all curves take a single parameter, u64 int\n\t\t// the remaining 24 of the 32 bytes available are filled with 0s\n\t\tconst curveParamsBuffer = Buffer.alloc(32);\n\t\tcurveParameters.toBuffer().copy(curveParamsBuffer);\n\n\t\t{\n\t\t\tconst encodeLength = commandDataLayout.encode(\n\t\t\t\t{\n\t\t\t\t\tinstruction: 0, // InitializeSwap instruction\n\t\t\t\t\ttradeFeeNumerator: new BN(tradeFeeNumerator),\n\t\t\t\t\ttradeFeeDenominator: new BN(tradeFeeDenominator),\n\t\t\t\t\townerTradeFeeNumerator: new BN(ownerTradeFeeNumerator),\n\t\t\t\t\townerTradeFeeDenominator: new BN(ownerTradeFeeDenominator),\n\t\t\t\t\townerWithdrawFeeNumerator: new BN(ownerWithdrawFeeNumerator),\n\t\t\t\t\townerWithdrawFeeDenominator: new BN(ownerWithdrawFeeDenominator),\n\t\t\t\t\thostFeeNumerator: new BN(hostFeeNumerator),\n\t\t\t\t\thostFeeDenominator: new BN(hostFeeDenominator),\n\t\t\t\t\tcurveType,\n\t\t\t\t\tcurveParameters: curveParamsBuffer,\n\t\t\t\t},\n\t\t\t\tdata,\n\t\t\t);\n\t\t\tdata = data.slice(0, encodeLength);\n\t\t}\n\t\treturn new web3.TransactionInstruction({\n\t\t\tkeys,\n\t\t\tprogramId: swapProgramId,\n\t\t\tdata,\n\t\t});\n\t}\n}\n","export const errors = [\n\t{\n\t\t\"code\": 6000,\n\t\t\"name\": \"AlreadyInUse\",\n\t\t\"msg\": \"Error: Swap account already in use\"\n\t},\n\t{\n\t\t\"code\": 6001,\n\t\t\"name\": \"InvalidProgramAddress\",\n\t\t\"msg\": \"Error: Invalid program address generated from bump seed and key\"\n\t},\n\t{\n\t\t\"code\": 6002,\n\t\t\"name\": \"InvalidOwner\",\n\t\t\"msg\": \"Error: The input account owner is not the program address\"\n\t},\n\t{\n\t\t\"code\": 6003,\n\t\t\"name\": \"InvalidOutputOwner\",\n\t\t\"msg\": \"Error: Output pool account owner cannot be the program address\"\n\t},\n\t{\n\t\t\"code\": 6004,\n\t\t\"name\": \"ExpectedMint\",\n\t\t\"msg\": \"Error: Deserialized account is not an SPL Token mint\"\n\t},\n\t{\n\t\t\"code\": 6005,\n\t\t\"name\": \"ExpectedAccount\",\n\t\t\"msg\": \"Error: Deserialized account is not an SPL Token account\"\n\t},\n\t{\n\t\t\"code\": 6006,\n\t\t\"name\": \"EmptySupply\",\n\t\t\"msg\": \"Error: Input token account empty\"\n\t},\n\t{\n\t\t\"code\": 6007,\n\t\t\"name\": \"InvalidSupply\",\n\t\t\"msg\": \"Error: Pool token mint has a non-zero supply\"\n\t},\n\t{\n\t\t\"code\": 6008,\n\t\t\"name\": \"RepeatedMint\",\n\t\t\"msg\": \"Error: Swap input token accounts have the same mint\"\n\t},\n\t{\n\t\t\"code\": 6009,\n\t\t\"name\": \"InvalidDelegate\",\n\t\t\"msg\": \"Error: Token account has a delegate\"\n\t},\n\t{\n\t\t\"code\": 6010,\n\t\t\"name\": \"InvalidInput\",\n\t\t\"msg\": \"Error: InvalidInput\"\n\t},\n\t{\n\t\t\"code\": 6011,\n\t\t\"name\": \"IncorrectSwapAccount\",\n\t\t\"msg\": \"Error: Address of the provided swap token account is incorrect\"\n\t},\n\t{\n\t\t\"code\": 6012,\n\t\t\"name\": \"IncorrectPoolMint\",\n\t\t\"msg\": \"Error: Address of the provided pool token mint is incorrect\"\n\t},\n\t{\n\t\t\"code\": 6013,\n\t\t\"name\": \"InvalidOutput\",\n\t\t\"msg\": \"Error: InvalidOutput\"\n\t},\n\t{\n\t\t\"code\": 6014,\n\t\t\"name\": \"CalculationFailure\",\n\t\t\"msg\": \"Error: CalculationFailure\"\n\t},\n\t{\n\t\t\"code\": 6015,\n\t\t\"name\": \"InvalidInstruction\",\n\t\t\"msg\": \"Error: InvalidInstruction\"\n\t},\n\t{\n\t\t\"code\": 6016,\n\t\t\"name\": \"ExceededSlippage\",\n\t\t\"msg\": \"Error: Swap instruction exceeds desired slippage limit\"\n\t},\n\t{\n\t\t\"code\": 6017,\n\t\t\"name\": \"InvalidCloseAuthority\",\n\t\t\"msg\": \"Error: Token account has a close authority\"\n\t},\n\t{\n\t\t\"code\": 6018,\n\t\t\"name\": \"InvalidFreezeAuthority\",\n\t\t\"msg\": \"Error: Pool token mint has a freeze authority\"\n\t},\n\t{\n\t\t\"code\": 6019,\n\t\t\"name\": \"IncorrectFeeAccount\",\n\t\t\"msg\": \"Error: Pool fee token account incorrect\"\n\t},\n\t{\n\t\t\"code\": 6020,\n\t\t\"name\": \"ZeroTradingTokens\",\n\t\t\"msg\": \"Error: Given pool token amount results in zero trading tokens\"\n\t},\n\t{\n\t\t\"code\": 6021,\n\t\t\"name\": \"FeeCalculationFailure\",\n\t\t\"msg\": \"Error: The fee calculation failed due to overflow, underflow, or unexpected 0\"\n\t},\n\t{\n\t\t\"code\": 6022,\n\t\t\"name\": \"ConversionFailure\",\n\t\t\"msg\": \"Error: Conversion to or from u64 failed.\"\n\t},\n\t{\n\t\t\"code\": 6023,\n\t\t\"name\": \"InvalidFee\",\n\t\t\"msg\": \"Error: The provided fee does not match the program owner's constraints\"\n\t},\n\t{\n\t\t\"code\": 6024,\n\t\t\"name\": \"IncorrectTokenProgramId\",\n\t\t\"msg\": \"Error: The provided token program does not match the token program expected by the swap\"\n\t},\n\t{\n\t\t\"code\": 6025,\n\t\t\"name\": \"UnsupportedCurveType\",\n\t\t\"msg\": \"Error: The provided curve type is not supported by the program owner\"\n\t},\n\t{\n\t\t\"code\": 6026,\n\t\t\"name\": \"InvalidCurve\",\n\t\t\"msg\": \"Error: The provided curve parameters are invalid\"\n\t},\n\t{\n\t\t\"code\": 6027,\n\t\t\"name\": \"UnsupportedCurveOperation\",\n\t\t\"msg\": \"Error: The operation cannot be performed on the given curve\"\n\t},\n\t{\n\t\t\"code\": 6028,\n\t\t\"name\": \"InvalidFeeAccount\",\n\t\t\"msg\": \"Error: The pool fee account is invalid\"\n\t}\n]\n\nexport function parseCustomError(err: string) {\n\ttry {\n\t\tconst search = \"custom program error: \"\n\t\tif (err?.indexOf(search) < 0)\n\t\t\treturn err\n\n\t\tconst cerr = err.slice(err.indexOf(search) + search.length)\n\t\treturn errors[parseInt(cerr)] || err\n\t} catch (e) {\n\t\treturn err\n\t}\n}\n\nexport function parseCustomErrorInt(errCode: number) {\n\treturn errors[errCode]\n}","import {TokenSwapPool} from \"@/api/token_swap/layouts\";\nimport {TransferFee} from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport {web3} from \"@project-serum/anchor\";\n\nexport default {\n\n\texpectedOutput(pool: TokenSwapPool, poolDetail: any, inputMint: web3.PublicKey, inputAmount: BN, aToB: boolean = true): BN {\n\t\tif (!pool)\n\t\t\treturn new BN(0);\n\n\t\t// Ensure inputs are numbers\n\t\tif (inputAmount.isNeg())\n\t\t\treturn new BN(0);\n\n\t\tconst poolAAmount = new BN(poolDetail.tokenAccountA.tokenAmount.amount);\n\t\tconst poolBAmount = new BN(poolDetail.tokenAccountB.tokenAmount.amount);\n\n\t\tconst inputFees = aToB ? this.mintATransferFee(poolDetail) : this.mintBTransferFee(poolDetail)\n\t\tconst tokenAFeeRate = (inputFees?.transferFeeBasisPoints! / 10_000) || 0\n\t\tif (tokenAFeeRate > 0) {\n\t\t\tlet tokenAFee = inputAmount.mul(new BN(tokenAFeeRate))\n\t\t\tconst maxFee = new BN(inputFees?.maximumFee.toString()!)\n\t\t\tif (tokenAFee.gt(maxFee))\n\t\t\t\ttokenAFee = maxFee\n\n\t\t\tinputAmount = inputAmount.sub(tokenAFee)\n\t\t\t// console.log(\"Applying tokenAFeeRate\", {inputAmount, tokenAFeeRate, tokenAFee})\n\t\t}\n\n\n\t\tlet output: BN;\n\t\t//Inverse pool\n\t\tif (poolDetail.tokenAccountA.mint !== inputMint) {\n\t\t\toutput = this.calculateInverseSwapOutput(poolAAmount, poolBAmount, new BN(inputAmount))\n\t\t} else {\n\t\t\toutput = this.calculateSwapOutput(poolAAmount, poolBAmount, new BN(inputAmount))\n\t\t}\n\n\t\t//Pool fees\n\t\tconst poolRate = this.totalPoolFee(pool).mul(output)\n\t\t// console.log(\"Applying pool rate\", this.totalPoolFee, poolRate, output, output - poolRate)\n\t\toutput = output.sub(poolRate)\n\n\t\tconst outputFees = aToB ? this.mintBTransferFee(poolDetail) : this.mintATransferFee(poolDetail)\n\t\tconst tokenBFeeRate = (outputFees?.transferFeeBasisPoints! / 10_000) || 0\n\t\tif (tokenBFeeRate > 0) {\n\t\t\tlet tokenBFee = output.mul(new BN(tokenBFeeRate))\n\t\t\tconst maxFee = new BN(outputFees?.maximumFee.toString()!)\n\t\t\tif (tokenBFee.gt(maxFee))\n\t\t\t\ttokenBFee = maxFee\n\n\t\t\toutput = output.sub(tokenBFee)\n\t\t}\n\n\n\t\t// console.log(\"expectedOutput::details\", {\n\t\t// \tinAmountActual: inputAmount.toString(),\n\t\t// \toutput: output.toString(),\n\t\t// })\n\n\t\t// return output\n\t\treturn output\n\t},\n\n\n\tlpTokensReceived(tokenAAmount: number, poolTokenAAmount: number, poolSupply: number): BN {\n\t\tconsole.log(`lpTokensReceived`, {tokenAAmount, poolTokenAAmount, poolSupply})\n\t\tconst tokenAIn = new BN(tokenAAmount);\n\t\tconst poolTokenA = new BN(poolTokenAAmount);\n\t\tconst poolSup = new BN(poolSupply)\n\n\t\tif (poolSupply <= 0)\n\t\t\treturn new BN(0)\n\n\t\treturn tokenAIn.mul(poolSup).div(poolTokenA);\n\t},\n\n\tmintATransferFee(poolDetail: any): TransferFee | null {\n\t\t//@ts-ignore\n\t\tconst tFee = poolDetail?.mintA?.extensions?.filter(ext => ext.extension === \"transferFeeConfig\")\n\t\tif (!tFee || !tFee.length)\n\t\t\treturn null\n\n\t\treturn tFee[0]?.state?.newerTransferFee;\n\t},\n\n\tmintBTransferFee(poolDetail: any): TransferFee | null {\n\t\t//@ts-ignore\n\t\tconst tFee = poolDetail?.mintB?.extensions?.filter(ext => ext.extension === \"transferFeeConfig\")\n\t\tif (!tFee || !tFee.length)\n\t\t\treturn null\n\n\t\treturn tFee[0]?.state?.newerTransferFee;\n\t},\n\n\n\tpoolTradeFee(pool: TokenSwapPool): BN {\n\t\tif (!pool) return new BN(0)\n\n\t\treturn pool.tradeFeeNumerator.div(pool.tradeFeeDenominator)\n\t},\n\n\tpoolOwnerTradeFee(pool: TokenSwapPool): BN {\n\t\tif (!pool) return new BN(0)\n\n\t\treturn pool.ownerTradeFeeNumerator.div(pool.ownerTradeFeeDenominator)\n\t},\n\n\ttotalPoolFee(pool: TokenSwapPool): BN {\n\t\treturn this.poolTradeFee(pool).add(this.poolOwnerTradeFee(pool))\n\t},\n\n\n\tcalculateSwapOutput(beforeTokenA: BN, beforeTokenB: BN, inputA: BN): BN {\n\t\t// Calculate the amount of tokenB tokens after the trade\n\t\tconst afterTokenB = beforeTokenB.mul(beforeTokenA).div(beforeTokenA.add(inputA))\n\n\t\t// Calculate the amount of tokenB received from the trade\n\t\tconst outputB = beforeTokenB.sub(afterTokenB);\n\t\tconsole.log(\"calculateSwapOutput\", outputB.toString())\n\t\treturn outputB;\n\t},\n\n\tcalculateInverseSwapOutput(beforeTokenA: BN, beforeTokenB: BN, inputB: BN): BN {\n\t\t// Calculate the amount of tokenA after the trade\n\t\tconst afterTokenA = beforeTokenA.mul(beforeTokenB).div(beforeTokenB.add(inputB))\n\n\t\t// Calculate the amount of tokenA received from the trade\n\t\tconst outputA = beforeTokenA.sub(afterTokenA);\n\t\tconsole.log(\"calculateInverseSwapOutput\", outputA.toString())\n\t\treturn outputA;\n\t},\n\n}","import {blob, GetStructureSchema, publicKey, struct, u128, u64, u8} from \"@/api/marshmallow\";\nimport {BN, web3} from \"@project-serum/anchor\";\nimport assert from \"assert\";\nimport {TOKEN_2022_PROGRAM_ID} from \"@solana/spl-token\";\n\nexport class PoolFee {\n\tnumerator: number\n\tdenominator: number\n\n\tconstructor(numerator: number, denominator: number = 1000) {\n\t\tthis.numerator = numerator\n\t\tthis.denominator = denominator\n\t}\n}\n\nexport interface SwapInstruction {\n\tinstruction: number;\n\tamountIn: bigint;\n\tminimumAmountOut: bigint;\n}\n\nexport const TokenSwapLayout = struct([\n\tu8('version'),\n\tu8('isInitialized'),\n\tu8('bumpSeed'),\n\tpublicKey('poolTokenProgramId'),\n\tpublicKey('tokenAccountA'),\n\tpublicKey('tokenAccountB'),\n\tpublicKey('tokenPool'),\n\tpublicKey('mintA'),\n\tpublicKey('mintB'),\n\tpublicKey('feeAccount'),\n\tu64('tradeFeeNumerator'),\n\tu64('tradeFeeDenominator'),\n\tu64('ownerTradeFeeNumerator'),\n\tu64('ownerTradeFeeDenominator'),\n\tu64('ownerWithdrawFeeNumerator'),\n\tu64('ownerWithdrawFeeDenominator'),\n\tu64('hostFeeNumerator'),\n\tu64('hostFeeDenominator'),\n\tu8('curveType'),\n\tblob(32, 'curveParameters'),\n\t// blob(16, 'curveParameters'),\n\t// u128('poolReserve'),\n]);\nexport type TokenSwapPoolLayout = typeof TokenSwapLayout;\nexport type TokenSwapPool = GetStructureSchema;\n\n/**\n * Some amount of tokens\n */\nexport class Numberu64 extends BN {\n\t/**\n\t * Convert to Buffer representation\n\t */\n\ttoBuffer(): Buffer {\n\t\tconst a = super.toArray().reverse();\n\t\tconst b = Buffer.from(a);\n\t\tif (b.length === 8) {\n\t\t\treturn b;\n\t\t}\n\t\tassert(b.length < 8, 'Numberu64 too large');\n\n\t\tconst zeroPad = Buffer.alloc(8);\n\t\tb.copy(zeroPad);\n\t\treturn zeroPad;\n\t}\n\n\t/**\n\t * Construct a Numberu64 from Buffer representation\n\t */\n\tstatic fromBuffer(buffer: Buffer): Numberu64 {\n\t\tassert(buffer.length === 8, `Invalid buffer length: ${buffer.length}`);\n\t\treturn new Numberu64(\n\t\t\t[...buffer]\n\t\t\t\t.reverse()\n\t\t\t\t.map(i => `00${i.toString(16)}`.slice(-2))\n\t\t\t\t.join(''),\n\t\t\t16,\n\t\t);\n\t}\n}\n\nexport class TokenInput {\n\tmint: web3.PublicKey\n\tamount: number\n\tprogramID: web3.PublicKey = TOKEN_2022_PROGRAM_ID\n\n\ttransferFeeConfig: any\n\n\tconstructor(mint: web3.PublicKey, amount: number = 0, programID: web3.PublicKey = TOKEN_2022_PROGRAM_ID, transferFeeConfig: any = null) {\n\t\tthis.mint = mint\n\t\tthis.amount = amount\n\t\tthis.programID = programID\n\t\tthis.transferFeeConfig = transferFeeConfig\n\t}\n\n\tasync getMintInfo(connection: web3.Connection) {\n\t\treturn connection.getTokenSupply(this.mint)\n\t}\n\n\tgetTransferFeePct() {\n\t\tif (!this.transferFeeConfig)\n\t\t\treturn 0\n\n\t\treturn this.transferFeeConfig\n\t}\n\n\tgetSwapFee(amount = this.amount) {\n\t\tif (!this.transferFeeConfig)\n\t\t\treturn 0\n\n\t\tconst feeRate = this.transferFeeConfig?.transferFeeBasisPoints / 10_000 || 0;\n\t\tconst inputAmount = Number(amount)\n\t\treturn Math.min(this.transferFeeConfig?.maximumFee, inputAmount * feeRate)\n\t}\n\n\t//Returns the amount post transfer fees\n\tamountInReal(amount = this.amount) {\n\t\tif (!this.transferFeeConfig)\n\t\t\treturn amount\n\n\t\tconst feeMultiplier = 1 - (this.transferFeeConfig?.transferFeeBasisPoints / 10_000);\n\t\treturn amount * feeMultiplier;\n\t}\n\n\t//Returns the exactAmount in to get the amount defined including the xfer fee\n\tamountInExact(amount = this.amount) {\n\t\tif (!this.transferFeeConfig)\n\t\t\treturn amount\n\n\t\tconst feeMultiplier = 1 - (this.transferFeeConfig?.transferFeeBasisPoints / 10_000);\n\t\treturn amount / feeMultiplier;\n\t}\n}\n\nexport class PoolConfig {\n\ttradeFee: PoolFee\n\townerTradeFee: PoolFee\n\townerWithdrawFee: PoolFee\n\thostFee: PoolFee\n\tcurveType: number\n\n\tconstructor(\n\t\ttradeFee: PoolFee,\n\t\townerTradeFee: PoolFee,\n\t\townerWithdrawFee: PoolFee,\n\t\thostFee: PoolFee,\n\t\tcurveType: number,\n\t) {\n\t\tthis.tradeFee = tradeFee\n\t\tthis.ownerTradeFee = ownerTradeFee\n\t\tthis.ownerWithdrawFee = ownerWithdrawFee\n\t\tthis.hostFee = hostFee\n\t\tthis.curveType = curveType\n\t}\n}","export default class FluxBotClient {\n\n\tbaseURI = \"https://bot-api.fluxbeam.xyz\"\n\t// baseURI = \"http://localhost:8081\"\n\n\tgetPoints(walletAddr) {\n\t\treturn fetch(`${this.baseURI}/users/${walletAddr}/points`).then(r => r.json())\n\t}\n\n\tgetReferrals(walletAddr) {\n\t\treturn fetch(`${this.baseURI}/users/${walletAddr}/referrals`).then(r => r.json())\n\t}\n\n\tgetRank(walletAddr) {\n\t\treturn fetch(`${this.baseURI}/users/${walletAddr}/ranking`).then(r => r.json())\n\t}\n\n\tgetPointsLeaderboard(page = 0) {\n\t\treturn fetch(`${this.baseURI}/leaderboards/points?page=${page}`).then(r => r.json())\n\t}\n\n\tgetReferralLeaderboard(page = 0) {\n\t\treturn fetch(`${this.baseURI}/leaderboards/referrals?page=${page}`).then(r => r.json())\n\t}\n\n\tgetStats() {\n\t\treturn fetch(`${this.baseURI}/stats`).then(r => r.json())\n\t}\n\n}","import {PublicKey} from \"@solana/web3.js\";\nimport {web3} from \"@project-serum/anchor\";\n\nexport default class FluxBotWalletAdapter {\n\n\tversion = \"0.0.1\"\n\n\tname = \"FluxBot\"\n\n\ticon = \"https://api.fluxbeam.xyz/public/logo_sm.png\"\n\n\turl = \"https://t.me/fluxbeam_bot?start=login\"\n\n\t_baseURI = \"https://gateway.fluxbeam.xyz\"\n\n\tauthToken\n\n\tpublicKey\n\n\tconnected = false\n\n\tconnecting = false\n\n\treadyState = \"Loadable\"\n\n\t_listeners = {}\n\n\tconstructor(wallet, token) {\n\t\tthis._connect(wallet,token)\n\t}\n\n\tconnect(openLogin = true) {\n\t\tconst fluxAuth = localStorage.getItem(\"fluxbot:auth\");\n\t\tif (fluxAuth) {\n\t\t\tconst obj = JSON.parse(fluxAuth);\n\t\t\tif (obj.token) {\n\t\t\t\tconst token = obj.token.split(\".\");\n\t\t\t\tconst jwtPayload = JSON.parse(window.atob(token[1]));\n\n\t\t\t\t//Only set if we have valid params\n\t\t\t\tif (Date.now() < jwtPayload.exp * 1000) {\n\t\t\t\t\treturn this._connect(new web3.PublicKey(jwtPayload.wallet), obj.token)\n\t\t\t\t} else {\n\t\t\t\t\tlocalStorage.removeItem(\"fluxbot:auth\")\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//TODO this is fucking annoying\n\t\tif (openLogin)\n\t\t\twindow.open(\"https://t.me/fluxbeam_bot?start=login\");\n\n\t\treturn false\n\t}\n\n\t_connect(wallet, authToken) {\n\t\tthis.publicKey = wallet\n\n\t\tif (!authToken)\n\t\t\treturn false\n\n\t\tthis.authToken = authToken\n\t\tthis.connected = true\n\t\tlocalStorage.setItem(\"walletName\", \"FluxBot\")\n\t\treturn true\n\t}\n\n\tdisconnect(e) {\n\t\t// console.log(\"disconnect\", e)\n\t}\n\n\tautoConnect(e) {\n\t\t// console.log(\"autoConnect\", e)\n\t\treturn this.connect(false)\n\t}\n\n\ton(...args) {\n\t\t// console.log(\"on\", args)\n\t\tthis._listeners[args[0]] = args[1]\n\t}\n\n\toff(...args) {\n\t\t// console.log(\"off\", args)\n\t\tdelete this._listeners[args[0]]\n\t}\n\n\tlogin(opts = {\n\t\twallet: \"\",\n\t\tclientID: \"\",\n\t\tsignature: \"\",\n\t\ttimestamp: \"\",\n\t}) {\n\t\treturn fetch(`${this._baseURI}/bot/auth`,{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(opts)\n\t\t}).then(r => r.json()).then(j => {\n\t\t\tif (j.error) {\n\t\t\t\tthrow new Error(j.error)\n\t\t\t}\n\n\t\t\tlocalStorage.setItem(\"fluxbot:auth\", JSON.stringify({wallet: opts.wallet, token: j.token}))\n\t\t\treturn this._connect(opts.wallet, j.token)\n\t\t})\n\t}\n\n\tasync request(action = \"\", payload = {}, settings = {slippage: 0.25, priorityFee: 0.001, validatorTip: 'market'}) {\n\t\treturn await fetch(`${this._baseURI}/bot/actions`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"Authentication\": `Bearer ${this.authToken}`\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\taction: action,\n\t\t\t\tpayload: payload,\n\t\t\t\tsettings: settings\n\t\t\t})\n\t\t}).then(r => r.json())\n\t}\n\n\n\t_decodeJwt(token) {\n\t\t// Split the token into its parts\n\t\tconst parts = token.split('.');\n\t\tif (parts.length !== 3) {\n\t\t\tthrow new Error('Invalid JWT token');\n\t\t}\n\n\t\t// Decode the payload from Base64URL\n\t\tconst payloadBase64Url = parts[1];\n\t\tconst payloadBase64 = payloadBase64Url.replace(/-/g, '+').replace(/_/g, '/');\n\t\tconst payloadJson = decodeURIComponent(atob(payloadBase64).split('').map(function(c) {\n\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t\t}).join(''));\n\n\t\t// Parse the JSON payload\n\t\tconst payload = JSON.parse(payloadJson);\n\n\t\t// Return the `exp` claim\n\t\treturn payload.exp;\n\t}\n}\n","import {web3} from \"@project-serum/anchor\";\nimport axios from \"axios\";\nimport {Metadata} from \"@metaplex-foundation/mpl-token-metadata\";\nimport {getParsedNftAccountsByOwner} from \"@/api/nft_fraction/getParsedNFTAccountsByOwner\";\n\n/**\n * Utility class helping with Solana NFT data collation for users\n */\nexport class UserAssets {\n\n\tcacheHash = \"0x01\"\n\n\tloadDangerousNFTs = false\n\n\tloadFileMetadata = false\n\n\t//Land owned by user\n\townedLand = [];\n\n\t//NFT assets owned by the user (all excluding land)\n\townedNFT = [];\n\n\tconstructor(url, config) {\n\t\tthis.connection = new web3.Connection(\n\t\t\turl, config,\n\t\t);\n\t}\n\n\tgetOwnedLand() {\n\t\treturn this.ownedLand;\n\t}\n\n\tgetOwnedNFTs() {\n\t\treturn this.ownedNFT;\n\t}\n\n\tgetBalance(tokenAddr) {\n\t\treturn this.connection.getBalance(new web3.PublicKey(tokenAddr), \"confirmed\")\n\t}\n\n\tgetTokenInfo(tokenAddr) {\n\t\treturn this.connection.getParsedAccountInfo(new web3.PublicKey(tokenAddr))\n\t}\n\n\tsetLoadDangerousNFTs(toggle) {\n\t\tthis.loadDangerousNFTs = toggle\n\t}\n\n\tasync getTokenOwner(tokenAddr) {\n\t\tconst largestAccounts = await this.connection.getTokenLargestAccounts(new web3.PublicKey(tokenAddr));\n\t\tconst largestAccountInfo = await this.connection.getParsedAccountInfo(largestAccounts.value[0].address);\n\n\t\treturn largestAccountInfo.value.data.parsed.info.owner\n\t}\n\n\treloadAccountInfo(walletAddr ,cb) {\n\t\tthis.ownedNFT = []\n\t\tthis.ownedLand = []\n\t\tthis._fetchOwnerAccounts(walletAddr, cb)\n\t}\n\n\tgetAccountInfo(walletAddr, cb = null) {\n\t\tif (walletAddr === undefined || walletAddr === \"\") {\n\t\t\tconsole.error(\"UserAssets - Wallet address is undefined or empty\");\n\t\t\treturn;\n\t\t}\n\n\t\t//Return cached accounts if we have them\n\t\tconst nfts = this.getCachedAccounts(walletAddr)\n\t\tif (nfts) {\n\t\t\tconst useCache = (Date.now() - nfts.last_updated) < (1000 * 60 * 5)\n\t\t\t// console.log(\"Last Updated\", nfts.last_updated, {useCache, lastUpdated: Date.now() - nfts.last_updated})\n\t\t\tif (nfts.items.length > 0 && nfts.last_updated && useCache) {\n\t\t\t\tthis._registerNFTAccounts(nfts.items)\n\t\t\t\tif (cb !== null)\n\t\t\t\t\tcb()\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis._fetchOwnerAccounts(walletAddr, cb)\n\t}\n\n\t_fetchOwnerAccounts(walletAddr, cb = null) {\n\t\ttry {\n\t\t\tgetParsedNftAccountsByOwner({\n\t\t\t\tpublicAddress: walletAddr,\n\t\t\t\tconnection: this.connection,\n\t\t\t\tserialization: true,\n\t\t\t}).then(nfts => {\n\t\t\t\tthis._cacheNFTAccounts(walletAddr, nfts)\n\t\t\t\tthis._registerNFTAccounts(nfts)\n\t\t\t}).finally(() => {\n\t\t\t\tif (cb !== null)\n\t\t\t\t\tcb()\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tconsole.log(\"getAccountInfo\", e)\n\t\t}\n\t}\n\n\t_registerNFTAccounts(nfts) {\n\t\tnfts.forEach((nft) => {\n\t\t\t// console.log(`_registerNFTAccounts`, nft)\n\t\t\tconst asset = {\n\t\t\t\tid: nft.mint,\n\t\t\t\tmint: nft.mint,\n\t\t\t\tname: nft.data.name,\n\t\t\t\tsymbol: nft.data.symbol,\n\t\t\t\turi: nft.data.uri,\n\t\t\t\tmetadata: nft.data,\n\t\t\t\tcreators: nft.data.creators,\n\t\t\t\timage: \"\",\n\t\t\t\tauthority: nft.updateAuthority,\n\t\t\t\tcollection: nft.collection ? (nft.collection.verified ? nft.collection.key : '') : '',\n\t\t\t\tsellerFeeBasisPoints: nft.data.sellerFeeBasisPoints\n\t\t\t}\n\n\t\t\tthis._registerNFTAsset(asset)\n\t\t})\n\t}\n\n\tgetAllMetadata(tokens) {\n\t\t// console.log(\"Getting all metadata\", tokens)\n\t\treturn this.connection.getMultipleAccountsInfo(tokens, \"confirmed\")\n\t}\n\n\t/**\n\t * Gets a single tokens metadata\n\t * When using public rpc this should be avoided (use getInfos instead)\n\t * @param token\n\t * @private\n\t */\n\t_getTokenInfo(token) {\n\t\t// console.log(\"Token\", {\n\t\t// \ttokenPK: token.pubkey.toString(),\n\t\t// \townerPK: token.account.owner.toString(),\n\t\t// \tmintPk: token.account.data.parsed.info.mint\n\t\t// })\n\n\t\t//Not an NFT if > 1\n\t\tif (token.account.data.parsed.info.uiAmount > 1)\n\t\t\treturn;\n\n\t\tthis.getMetadata(token.account.data.parsed.info.mint).then(resp => {\n\t\t\tconst nft = resp.data;\n\t\t\t// console.log(\"NFT Item\", nft)\n\t\t\tthis.registerNFTAsset(token, nft)\n\n\t\t}).catch(e => {\n\t\t\tconsole.error(`getLandNFTs ${token.account.data.parsed.info.mint}`, e);\n\t\t});\n\t}\n\n\tgetTokenMint(tokenAccountAddr, cb) {\n\t\tthis.connection.getParsedAccountInfo(new web3.PublicKey(tokenAccountAddr)).then((resp) => {\n\t\t\tcb(resp.value.data.parsed.info.mint)\n\t\t})\n\t}\n\n\tgetTokenMetadata(tokenMintAddr) {\n\t\treturn this.getMetadata(tokenMintAddr)\n\t}\n\n\tregisterNFTAsset(token, nft) {\n\t\tconst asset = {\n\t\t\tid: token.pubkey.toString(),\n\t\t\tmint: token.account.data.parsed.info.mint,\n\t\t\tname: nft.data.name,\n\t\t\tsymbol: nft.data.symbol,\n\t\t\turi: nft.data.uri,\n\t\t\tmetadata: {},\n\t\t\timage: \"\",\n\t\t\tcollection: nft.collection ? nft.collection.key : ''\n\t\t}\n\n\t\treturn this._registerNFTAsset(asset)\n\t}\n\n\t_registerNFTAsset(asset) {\n\t\tif (asset.uri === '') {\n\t\t\tconsole.debug(\"no URI\", asset)\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.isValidUri(asset)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst cache = this.getCached(asset.id);\n\t\tif (cache !== null && this.isLocalCacheValid(cache)) {\n\t\t\t// console.log(\"Using cached metadata\", asset.id)\n\t\t\tthis.loading = false;\n\t\t\tasset.metadata = cache;\n\t\t\tasset.image = cache.image;\n\n\t\t\tthis._registerAsset(asset);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.loadFileMetadata) {\n\t\t\tthis.loading = false;\n\t\t\tasset.image = `https://api.degencdn.com/v1/tokens/${asset.id}/image.jpg`\n\n\t\t\tthis._registerAsset(asset);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.getMetadataFile(asset.uri).then(resp => {\n\t\t\tthis.loading = false;\n\n\t\t\tasset.metadata = resp.data;\n\t\t\tasset.image = resp.data.image;\n\n\t\t\tif (asset.image.substr(-6).indexOf(\".\") === -1 && asset.uri.indexOf(\"ipfs\") === 0) {\n\t\t\t\tconsole.log(\"Ext not detected\", asset.image.substr(-4))\n\t\t\t\tasset.image = asset.image + \".jpg\"\n\t\t\t}\n\n\t\t\tthis.setCache(asset.id, resp.data)\n\t\t\tthis._registerAsset(asset)\n\n\t\t}).catch(e => {\n\t\t\tconsole.error(`getMetadataFile ${asset.uri}`, e);\n\t\t});\n\t}\n\n\t_registerAsset(asset) {\n\t\t// console.log(\"Registering NFT Asset\", asset)\n\n\t\tthis.ownedNFT.push(asset)\n\t\tthis._registerLandTile(asset) //Register as AB Land (validated in func)\n\t}\n\n\n\tisValidUri(asset) {\n\t\t// console.log(\"Asset\", asset)\n\n\t\tconst url = new URL(asset.uri);\n\t\tswitch (url.hostname) {\n\t\t\tcase \"ipfs.io\":\n\t\t\tcase \"ipfs.dweb.link\":\n\t\t\tcase \"arweave.net\":\n\t\t\tcase \"nftstorage.link\":\n\t\t\tcase \"degenfatcats.s3.amazonaws.com\":\n\t\t\tcase \"shdw-drive.genesysgo.net\":\n\t\t\tcase \"testlaunchmynft.mypinata.cloud\":\n\t\t\tcase \"pastebin.com\":\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\t// console.debug(\"Dangerous NFT URI Detected, ignoring\", asset.uri)\n\t\t\t\tasset.isDangerous = true;\n\t\t\t\treturn this.loadDangerousNFTs;\n\t\t}\n\t}\n\n\tisABLand(nft) {\n\t\treturn nft.collection === \"4ssgx1C7UoVSc8cc8AeKYnBg24xWk3j5KdRJ6mJSpkgJ\" || (nft.metadata && nft.metadata.collection && nft.metadata.collection.name === \"AlphaBatem Land\")\n\t\t// return nft.collection === \"4ssgx1C7UoVSc8cc8AeKYnBg24xWk3j5KdRJ6mJSpkgJ\" || nft.authority === \"42GozpYPbQ7oixVZwW84EMHTFA7KwGYEaxRRDGkDRTBF\"\n\t}\n\n\t/**\n\t * Register a AB land tile as owned by the user\n\t *\n\t * @param land\n\t * @private\n\t */\n\t_registerLandTile(land) {\n\t\tif (!this.isABLand(land)) {\n\t\t\t// console.log(\"Not ab land\", land)\n\t\t\treturn\n\t\t}\n\n\t\t// console.log(\"Adding land\", land)\n\t\tthis.ownedLand.push(Object.assign({}, land))\n\t}\n\n\tgetMetadataFile(file) {\n\t\treturn axios.get(file)\n\t}\n\n\tasync getMetadata(acc) { //mint Address : String (Public Key)\n\t\t// console.log(\"Getting metadata\", acc)\n\t\tconst tokenmetaPubkey = await Metadata.getPDA(new web3.PublicKey(acc)); //Promise -> PublicKey (0x1231233434)\n\n\n\t\t// console.log(\"TokenMetaPubkey\", tokenmetaPubkey.toString())\n\t\treturn Metadata.load(this.connection, tokenmetaPubkey); // Promise -> Object(Metadata)\n\t}\n\n\tsetCache(token, data) {\n\t\ttry {\n\t\t\tdata.hash = this.cacheHash\n\t\t\tlocalStorage.setItem(token, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\t//\n\t\t}\n\t}\n\n\t_cacheNFTAccounts(walletAddr, nfts) {\n\t\ttry {\n\t\t\tlocalStorage.setItem(`nft_accounts:${walletAddr}`, JSON.stringify({\n\t\t\t\t\titems: nfts,\n\t\t\t\t\thash: this.cacheHash,\n\t\t\t\t\tlast_updated: Date.now()\n\t\t\t\t}\n\t\t\t));\n\t\t} catch (e) {\n\t\t\t//\n\t\t}\n\t}\n\n\tgetCachedAccounts(walletAddr) {\n\t\tconst data = localStorage.getItem(`nft_accounts:${walletAddr}`)\n\t\tif (data === null)\n\t\t\treturn null;\n\n\t\treturn JSON.parse(data)\n\t}\n\n\t/**\n\t * Returns if data from local cache is valid\n\t * @param data\n\t * @returns {boolean}\n\t */\n\tisLocalCacheValid(data) {\n\t\tif (data === null)\n\t\t\treturn false;\n\n\t\treturn data.hash === this.cacheHash\n\t}\n\n\tgetCached(token) {\n\t\tconst data = localStorage.getItem(token)\n\t\tif (data === null)\n\t\t\treturn null;\n\n\t\treturn JSON.parse(data);\n\t}\n}\n"],"names":["indexAutomations","wallet","fetchFluxBotAction","dest","showAutomations","id","data","createAutomation","strategy","closeAutomation","async","action","payload","webSettings","useSettingsStore","settings","res","fetch","method","body","JSON","stringify","slippage","platforms","mevProtect","validatorTip","validatorLevel","priorityFee","priorityFeeMax","priorityLevel","headers","Authorization","getFluxBotToken","j","json","ok","Error","error","statusText","indexTradeOrders","mint","createTradeOrders","src","price","inAmount","delta","expiry","source","SOL_MINT","amount","Math","floor","closeTradeOrder","getTraderOrders","status","params","URLSearchParams","trader","toString","fetchToken","fetchTokenPriceChange","fetchWalletHistoryTrades","from","to","fetchTokenPNL","fetchTokenMetadata","fetchTokenCandles","interval","count","set","fetchTokenEvents","fetchTopTraders","limit","fetchTopTokens","page","fetchTopPositions","fetchTraderTrades","fetchTokenTrades","signal","createFluxBotSwap","inMint","outMint","aToB","Number","fetchGetTraderDetail","createFluxBotTransfer","srcWallet","dstWallet","checkWaitlistStatus","baseURI","VALIDATOR_TIP_ACCOUNTS","FeeManagerAutomated","constructor","_defineProperty","web3","resp","this","uri","pk","payer","pipeline","quote","hash","sig","signature","endpoint","feeAccount","FEE_ACCOUNTS","random","length","buildFeeTransaction","quoteReq","console","log","transaction","unitLimit","unitPrice","add","units","microLamports","fromPubkey","toPubkey","lamports","fee","keys","programId","Buffer","btoa","buildClaimTransaction","dstAcc","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","createWithdrawWithheldTokensFromMintInstruction","Spl22","query","ticker","toLowerCase","FluxBeamClient","verifiedOnly","v2Only","toks","MAX_PAGES","concat","q","fromPage","getPoolTokensIndexPage","name","symbol","description","imageData","image","FormData","append","address","cid","cursor","JupiterClient","rpcClient","cancelQuote","controller","abort","loading","AbortController","catch","toBuffer","outputMint","userPublicKey","useSharedAccounts","quoteResponse","wrapAndUnwrapSol","dynamicComputeUnitLimit","prioritizationFeeLamports","feeAccountInfo","getAccountInfo","swapTransactionBuf","swapTransaction","VersionedTransaction","Layout","_Layout","Structure","_Structure","UInt","_UInt","u8","_u8","blob","_blob","BNLayout","span","signed","property","super","decode","b","offset","num","BN","fromTwos","clone","encode","toTwos","toArrayLike","u64","WrappedLayout","layout","decoder","encoder","getSpan","publicKey","key","bool","decodeBool","encodeBool","value","struct","fields","decodePrefixes","getParsedNftAccountsByOwner","publicAddress","connection","splAccounts","getParsedTokenAccountsByOwner","TOKEN_PROGRAM_ID","nftAccounts","filter","t","account","parsed","info","tokenAmount","uiAmount","decimals","map","accountsSlice","slice","metadataAcountsAddressPromises","Promise","allSettled","getSolanaMetadataAddress","metadataAccounts","onlySuccessfullPromises","p","metaAccountsRawPromises","chunks","chunk","getMultipleAccountsInfo","accountsRawMeta","flatMap","accountsDecodedMeta","accountInfo","metadata","Metadata","onlyNftsWithMetadata","sanitizeTokenMeta","token","result","replace","undefined","tokenMint","metaProgamPublicKey","PROGRAM_ID","array","size","i","push","tokenData","sanitizeMetaStrings","metaString","PoolLayout","Market","Client","swapClient","TokenSwapClient","token2022","Token2022Client","getCollectionPoolKey","collection","collectionPool","programID","getProgramAccounts","commitment","filters","dataSize","m","pubkey","pool","nftCollection","quoteMint","WSOL","market","memcmp","bytes","metaPDA","getMetadataPDA","nft","minimumAmountOut","getPool","txn","exchangeNFT","swapTxn","createSwapTransaction","TokenInput","mintB","instructions","amountIn","exchangeTxn","owner","getMarket","reject","parse","swapAuthority","swapPool","SWAP_PROGRAM_ID","poolDetail","getPoolDetail","spotPrice","tokenAccountB","tokenAccountA","tokenBAmount","ceil","minOut","pow","minAmountOut","PoolMath","mintLp","supply","slipAmount","mul","div","nftMetadata","sub","collectionTokenMint","mintA","ownerQuoteAccount","ownerTokenAccount","poolTokenAccount","ownerPoolAccount","tokenPool","ownerNftAccount","poolNftAccount","ComputeBudgetProgram","accountExists","createAssociatedTokenAccountInstruction","createAddLiquidityInstruction","nftMint","swapLpMint","quoteTokenMint","swapTokenAccountA","swapTokenAccountB","nftTokenProgram","tokenProgram","quoteTokenProgram","swapProgram","nftTokenMetadataProgram","associatedTokenProgram","ASSOCIATED_TOKEN_PROGRAM_ID","systemProgram","poolTokenAmount","maximumTokenA","maximumTokenB","args","dataLayout","desc","ixDescriminator","buffer","alloc","len","isSigner","isWritable","maximumPoolTokens","totalLpSupply","yourLpTokens","userLP","yourShareOfTotalLiquidity","totalTokenAInPool","totalTokenBInPool","pctNeeded","poolTokensIn","minTokenBOut","createRemoveLiquidityInstruction","minimumTokenA","minimumTokenB","createExchangeNFTInstruction","pools","getSwapPoolsSingle","swapFeeAccount","ownerSolAccount","createExchangeNFTSOLInstruction","startPrice","poolTransaction","ix","_createMarket","transactions","signers","poolLpMint","ownerAccountA","ownerAccountB","SWAP_PROGRAM_OWNER_FEE_ADDRESS","poolLpAccount","bump","createMarketInstruction","feeAccountOwner","tokenV1Program","tokenMetadataProgram","METADATA_2022_PROGRAM_ID","nft_locker","collectionMetadata","collectionTokenMetadata","metadataUpdateAuthority","nft_src","token_dst","createLockerInstruction","nftSrc","tokenDst","nftLocker","mint_authority","metadataCID","metaPk","collectionInfo","mintName","trim","split","mintSymbol","metadataUri","config","CreateMint","BigInt","addExtension","ExtensionType","maxFee","feeBasisPoints","sellerFeeBasisPoints","withdraw_withheld_authority","transfer_fee_config_authority","getCreateMintTransaction","amount_in","creators","creatorAccounts","verified","createClaimRoyaltiesInstruction","methodName","sha256","acc","e","MARKET_STATE_LAYOUT_V3","MARKET_ACCOUNT_FLAGS_B58_ENCODED","Openbook","OPENBOOK_PROGRAM_ID","RugCheckClient","CreateMintV1","totalSupply","mintAuthority","freezeAuthority","mintTotalSupply","setSellerFeeBasisPoints","bp","setCreators","TokenV1Client","mintLamports","getMinimumBalanceForRentExemption","MINT_SIZE","ata","metadataPDA","ON_CHAIN_METADATA","uses","FEE_ACCOUNT","newAccountPubkey","space","createInitializeMintInstruction","createCreateMetadataAccountV3Instruction","updateAuthority","createMetadataAccountArgsV3","isMutable","collectionDetails","createMintToInstruction","bhash","getLatestBlockhash","feePayer","recentBlockhash","blockhash","metadataProgram","ConfidentialTransferMintLayout","getConfidentialTransferMint","extensionData","getExtensionData","tlvData","IX","TIX","setTransferFeeInstructionData","u16","createSetTransferFeeInstruction","authority","transferFeeBasisPoints","maximumFee","instruction","TransferFeeExtension","transferFeeInstruction","SetTransferFee","dStr","addSigners","ownerOrAuthority","multiSigners","signer","TOKEN_METADATA_PROGRAM_ID","setMetadata","meta","metadataLength","pack","additionalMetadata","ext","extensions","extensionConfig","isDevnet","rpcEndpoint","indexOf","getParsedProgramAccounts","v1","v2","all","mints","tokenPrices","chunkSize","Object","getParsedAccountInfo","program","getAssociatedTokenPDA","getTokenMetadataRaw","metadataAddress","wsol","getMultipleParsedAccounts","solBalance","allowOwnerOffCurve","debug","createUpdateFieldInstruction","field","newAuthority","oldAuthority","createUpdateAuthorityInstruction","oldMetadataLength","newMetadataLength","SystemProgram","createUpdateMetadataAccountV2Instruction","updateMetadataAccountArgsV2","srcOwner","srcAta","createBurnCheckedInstruction","dstOwner","dstAta","dstIfo","createTransferCheckedInstruction","withCU","srcAccounts","createWithdrawWithheldTokensFromAccountsInstruction","createHarvestWithheldTokensToMintInstruction","mutable","mintLen","getMintLen","isDefaultFrozen","forEach","cfg","createInitializeTransferFeeConfigInstruction","createInitializeInterestBearingMintInstruction","rate","createInitializePermanentDelegateInstruction","createInitializeNonTransferableMintInstruction","createInitializeImmutableOwnerInstruction","createEnableRequiredMemoTransfersInstruction","state","AccountState","createInitializeDefaultAccountStateInstruction","createInitializeMintCloseAuthorityInstruction","createInitializeMetadataPointerInstruction","createInitializeInstruction","createThawAccountInstruction","createSetAuthorityInstruction","getSetAuthorityTransaction","createUpdateRateInterestBearingMintInstruction","Seed","releaseTime","TextEncoder","dataUint8","hashBuffer","crypto","subtle","digest","hashArray","Array","Uint8Array","padStart","join","FluxTokenLockerClient","setProgramID","ContractInfo","locker","getContractInfo","schedules","seedWord","_create","schedule","_unlock","sourceTokenOwner","mintAddress","sourceTokenPubkey","destinationTokenPubkey","vestingAccountKey","PublicKey","vestingTokenAccountKey","getAssociatedTokenAddress","createInitInstruction","createCreateInstruction","vestingProgramId","tokenProgramId","sourceTokenAccountOwnerKey","sourceTokenAccountKey","destinationTokenAccountKey","seeds","buffers","s","TransactionInstruction","accInfo","vestingInfo","destinationAddress","destinationInfo","mintInfo","unlockIx","createUnlockInstruction","SYSVAR_CLOCK_PUBKEY","createIx","clockSysvarId","authorityType","_lockAuthority","_unlockAuthority","TokenMigrationLayout","migrateProgramID","getMigrationKey","migrationAddr","getMigrationAuthorityKey","mintBConfig","migration","_createMigrationPool","createMigrationPoolInstruction","tokenA","tokenB","createPoolTransactions","PoolConfig","PoolFee","migrationKey","getMigration","mintAAta","v1TokenMint","mintBAta","v2TokenMint","createMigrateTokensInstruction","v1TokenMetadata","v1TokenAccount","v2TokenAccount","v1TokenProgramId","v2TokenProgramId","Instructions","static","tokenSwap","userTransferAuthority","userSource","poolSource","poolDestination","userDestination","poolMint","hostFeeAccount","sourceMint","destinationMint","swapProgramId","sourceTokenProgramId","destinationTokenProgramId","poolTokenProgramId","sourceA","sourceB","intoA","intoB","poolToken","poolAccount","tokenProgramIdA","tokenProgramIdB","sourcePoolAccount","fromA","fromB","userAccountA","userAccountB","sourceTokenAmount","minimumPoolTokenAmount","userAccount","destinationTokenAmount","maximumPoolTokenAmount","TokenSwapLayout","respInverse","poolPK","walletPk","mintProgramA","mintProgramB","poolAddress","cp","CreateTokenPool","initTxn","initializeTransaction","createTxn","createTransaction","tokenSwapAccount","srcMint","dstMint","route","equals","routeSrc","routeDst","aToBo","mintAInfo","mintBInfo","userDestinationInfo","ixs","getWrapSOLInstructions","createSwapInstruction","getUnwrapSOLInstruction","hasTransferFeeConfig","initTokenPrice","userPoolTokenAccount","balanceInfo","userPoolTokenAccountInfo","tokenAAmount","ratio","amountA","amountB","eAmountA","eAmountB","exactAmountInA","amountInExact","exactAmountInB","depositAllTokenTypesInstruction","minPoolTokenAmount","depositSingleTokenTypeExactAmountInInstruction","uAInfo","uBInfo","tAInfo","tBInfo","spInfo","userAccountAAmount","userAccountBAmount","tokenAccountAAmount","tokenAccountBAmount","sourcePoolAccountAmount","withdrawAllTokenTypesInstruction","withdrawSingleTokenTypeExactAmountOutInstruction","ataInfo","getTokenAccountBalance","createSyncNativeInstruction","createCloseAccountInstruction","ex","extension","FLUXB","METADATA_V1_PROGRAM_ID","defaultSOL","addr","uiAmountString","TRADING_FEE_NUMERATOR","TRADING_FEE_DENOMINATOR","OWNER_TRADING_FEE_NUMERATOR","OWNER_TRADING_FEE_DENOMINATOR","OWNER_WITHDRAW_FEE_NUMERATOR","OWNER_WITHDRAW_FEE_DENOMINATOR","HOST_FEE_NUMERATOR","HOST_FEE_DENOMINATOR","tokenAccountPool","tokenPoolMint","ownerKey","feeAccountAta","initializeTransactionInstruction","createTransactionInstruction","getMinimumBalanceForRentExemptMint","createInitializeMint2Instruction","tokenANative","tokenBNative","balanceNeeded","getMinBalanceRentForExemptTokenSwap","payerAtaA","payerAtaB","getMintInfo","curveParam","curveType","Numberu64","createInitSwapInstruction","tradeFee","denominator","numerator","ownerTradeFee","ownerWithdrawFee","hostFee","tradeFeeNumerator","tradeFeeDenominator","ownerTradeFeeNumerator","ownerTradeFeeDenominator","ownerWithdrawFeeNumerator","ownerWithdrawFeeDenominator","hostFeeNumerator","hostFeeDenominator","curveParameters","commandDataLayout","curveParamsBuffer","copy","encodeLength","errors","parseCustomError","err","search","cerr","parseInt","parseCustomErrorInt","errCode","expectedOutput","inputMint","inputAmount","isNeg","poolAAmount","poolBAmount","inputFees","mintATransferFee","mintBTransferFee","tokenAFeeRate","tokenAFee","gt","output","calculateInverseSwapOutput","calculateSwapOutput","poolRate","totalPoolFee","outputFees","tokenBFeeRate","tokenBFee","lpTokensReceived","poolTokenAAmount","poolSupply","tokenAIn","poolTokenA","poolSup","tFee","newerTransferFee","poolTradeFee","poolOwnerTradeFee","beforeTokenA","beforeTokenB","inputA","afterTokenB","outputB","inputB","afterTokenA","outputA","a","toArray","reverse","assert","zeroPad","transferFeeConfig","getTokenSupply","getTransferFeePct","getSwapFee","feeRate","min","amountInReal","feeMultiplier","FluxBotClient","getPoints","walletAddr","then","r","getReferrals","getRank","getPointsLeaderboard","getReferralLeaderboard","getStats","FluxBotWalletAdapter","_connect","connect","openLogin","fluxAuth","localStorage","getItem","obj","jwtPayload","window","atob","Date","now","exp","removeItem","open","authToken","connected","setItem","disconnect","autoConnect","on","_listeners","off","login","opts","clientID","timestamp","_baseURI","_decodeJwt","parts","payloadBase64Url","payloadBase64","payloadJson","decodeURIComponent","c","charCodeAt","UserAssets","url","getOwnedLand","ownedLand","getOwnedNFTs","ownedNFT","getBalance","tokenAddr","getTokenInfo","setLoadDangerousNFTs","toggle","loadDangerousNFTs","largestAccounts","getTokenLargestAccounts","largestAccountInfo","reloadAccountInfo","cb","_fetchOwnerAccounts","nfts","getCachedAccounts","useCache","last_updated","items","_registerNFTAccounts","serialization","_cacheNFTAccounts","finally","asset","_registerNFTAsset","getAllMetadata","tokens","_getTokenInfo","getMetadata","registerNFTAsset","getTokenMint","tokenAccountAddr","getTokenMetadata","tokenMintAddr","isValidUri","cache","getCached","isLocalCacheValid","_registerAsset","loadFileMetadata","getMetadataFile","substr","setCache","_registerLandTile","URL","hostname","isDangerous","isABLand","land","assign","file","axios","tokenmetaPubkey","cacheHash"],"sourceRoot":""}