require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/serialize.utils.cjs`),t=require(`../../constants/protocol.constants.cjs`),n=require(`../../data-structures/AccountActions/AccountActions.cjs`),r=require(`../../types/fee.types.cjs`),i=require(`../web3/getSolanaPriorityFee.cjs`),a=require(`../utils/process.utils.cjs`),o=require(`../../error-handling/retrySolanaError.cjs`);let s=require(`@solana/web3.js`),c=require(`@solana/spl-token`);var l=5e3,u=6e4,d=7,f=async(e,t,n=`confirmed`)=>await a.pollForValue(()=>e.getTransaction(t,{commitment:n,maxSupportedTransactionVersion:0}),{timeoutMs:u,intervalMs:l})??null,p=async(e,n,r,i)=>{try{let{blockhash:a}=await e.getLatestBlockhash(),o=new s.VersionedTransaction(new s.TransactionMessage({payerKey:n,recentBlockhash:a,instructions:[s.ComputeBudgetProgram.setComputeUnitLimit({units:t.MAX_COMPUTE_UNIT_LIMIT}),...r]}).compileToV0Message(i)),{unitsConsumed:c}=(await e.simulateTransaction(o,{sigVerify:!1,replaceRecentBlockhash:!0})).value;if(!c)return t.MAX_COMPUTE_UNIT_LIMIT;let l=Math.ceil(c*(1+t.COMPUTE_UNIT_PADDING_PERCENTAGE));return Math.max(t.MIN_COMPUTE_UNIT_LIMIT,Math.min(l,t.MAX_COMPUTE_UNIT_LIMIT))}catch{return t.MAX_COMPUTE_UNIT_LIMIT}},m=(e,t,n,r)=>{let i=new Set;return t&&i.add(t.toBase58()),n?.forEach(e=>i.add(e.toBase58())),e.forEach(e=>{i.add(e.programId.toBase58()),e.keys.forEach(e=>{i.add(e.pubkey.toBase58())})}),r&&r.forEach(e=>{i.add(e.key.toBase58()),e.state.addresses.forEach(e=>{i.add(e.toBase58())})}),[...i].map(e=>new s.PublicKey(e))},h=t=>{if(!t)throw Error(`Failed to fetch Solana transaction details for signature`);if(t.meta?.err){let n=e.safeJsonStringify(t.meta.err);throw Error(`Solana transaction failed on-chain: ${n}`)}},g=async(e,n,r,a,o)=>{if(r.some(e=>e.programId.equals(s.ComputeBudgetProgram.programId)))return r.map(e=>e.programId.equals(s.ComputeBudgetProgram.programId)&&e.data[0]===2?s.ComputeBudgetProgram.setComputeUnitLimit({units:t.MAX_COMPUTE_UNIT_LIMIT}):e);let c=r.filter(e=>!e.programId.equals(s.ComputeBudgetProgram.programId)),l=await p(e,n,c,a),u=s.ComputeBudgetProgram.setComputeUnitLimit({units:l}),d=e.rpcEndpoint.includes(`helius`)?await i.getSolanaPriorityFee(m(c,n,[s.ComputeBudgetProgram.programId],a),o):0;return[u,s.ComputeBudgetProgram.setComputeUnitPrice({microLamports:d}),...c]},_=async(e,t,n,i,a)=>{if(t.length===0)return``;for(let c=0;c<10;c+=1){let l=c===9;try{let o=await g(e,n.publicKey,t,a,c>=d?r.SolanaPriorityFeeMode.HIGH:r.SolanaPriorityFeeMode.RECOMMENDED),{blockhash:l,lastValidBlockHeight:u}=await e.getLatestBlockhash(),p=new s.VersionedTransaction(new s.TransactionMessage({payerKey:n.publicKey,instructions:o,recentBlockhash:l}).compileToV0Message(a));p.sign(i);let m=await e.sendTransaction(p);return await e.confirmTransaction({signature:m,blockhash:l,lastValidBlockHeight:u},`confirmed`),h(await f(e,m)),m}catch(e){if(o.shouldRetryForSolanaError(e)&&!l)continue;throw e}}return``},v=async(e,t,n,r)=>{if(!n)return null;let i=await(0,c.getAssociatedTokenAddress)(n,r,!0,c.TOKEN_PROGRAM_ID,c.ASSOCIATED_TOKEN_PROGRAM_ID);return await e.getAccountInfo(i)||await _(e,[(0,c.createAssociatedTokenAccountInstruction)(t.publicKey,i,r,n,c.TOKEN_PROGRAM_ID,c.ASSOCIATED_TOKEN_PROGRAM_ID)],t,[t]),i},y=async({connection:e,chainId:t,subAccount:i,payerPublicKey:a,instructions:c,lookupTableAccounts:l})=>{let u=n.AccountActions.getPrivateKeyFromSubAccount(t,i);if(!u)throw Error(`Private key is not available`);for(let t=0;t<10;t+=1){let i=t===9;try{let t=await g(e,a,c,l,i?r.SolanaPriorityFeeMode.HIGH:r.SolanaPriorityFeeMode.RECOMMENDED),{blockhash:o,lastValidBlockHeight:d}=await e.getLatestBlockhash(),p=new s.VersionedTransaction(new s.TransactionMessage({payerKey:a,recentBlockhash:o,instructions:t}).compileToV0Message(l)),m=await n.AccountActions.sendAndSignSolanaTransactionFromPrivateKey(e,u,p,!0);return await e.confirmTransaction({signature:m,blockhash:o,lastValidBlockHeight:d},`confirmed`),h(await f(e,m)),m}catch(e){if(o.shouldRetryForSolanaError(e)&&!i)continue;throw e}}throw Error(`Failed to send proxy v0 transaction due to expired blockheight after all retries`)},b=async(e,t,n,r)=>{let{blockhash:i}=await e.getLatestBlockhash(),a=new s.VersionedTransaction(new s.TransactionMessage({payerKey:t,recentBlockhash:i,instructions:await g(e,t,n,r)}).compileToV0Message(r));return Buffer.from(a.serialize()).toString(`base64`)};exports.ensureAtaExists=v,exports.estimateComputeUnitLimit=p,exports.fetchSolanaTransaction=f,exports.getAccountsFromInstructions=m,exports.sendProxyV0Transaction=y,exports.sendV0Transaction=_,exports.serializeProxyV0Transaction=b;