@lifi/sdk-provider-solana 4.0.0-beta.6 → 4.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/cjs/SolanaProvider.js.map +1 -1
  2. package/dist/cjs/actions/getSolanaBalance.js.map +1 -1
  3. package/dist/cjs/actions/sendAndConfirmBundle.js.map +1 -1
  4. package/dist/cjs/actions/sendAndConfirmTransaction.js.map +1 -1
  5. package/dist/cjs/core/SolanaStepExecutor.js.map +1 -1
  6. package/dist/cjs/core/tasks/SolanaJitoWaitForTransactionTask.js.map +1 -1
  7. package/dist/cjs/core/tasks/SolanaSignAndExecuteTask.js.map +1 -1
  8. package/dist/cjs/core/tasks/SolanaWaitForTransactionTask.js.map +1 -1
  9. package/dist/cjs/errors/parseSolanaErrors.js.map +1 -1
  10. package/dist/cjs/rpc/registry.js.map +1 -1
  11. package/dist/cjs/rpc/utils.js.map +1 -1
  12. package/dist/cjs/utils/KeypairWallet.unit.helpers.js.map +1 -1
  13. package/dist/cjs/version.d.ts +1 -1
  14. package/dist/cjs/version.js +1 -1
  15. package/dist/cjs/version.js.map +1 -1
  16. package/dist/esm/SolanaProvider.js.map +1 -1
  17. package/dist/esm/actions/getSolanaBalance.js.map +1 -1
  18. package/dist/esm/actions/sendAndConfirmBundle.js.map +1 -1
  19. package/dist/esm/actions/sendAndConfirmTransaction.js.map +1 -1
  20. package/dist/esm/core/SolanaStepExecutor.js.map +1 -1
  21. package/dist/esm/core/tasks/SolanaJitoWaitForTransactionTask.js.map +1 -1
  22. package/dist/esm/core/tasks/SolanaSignAndExecuteTask.js.map +1 -1
  23. package/dist/esm/core/tasks/SolanaWaitForTransactionTask.js.map +1 -1
  24. package/dist/esm/errors/parseSolanaErrors.js.map +1 -1
  25. package/dist/esm/rpc/registry.js.map +1 -1
  26. package/dist/esm/rpc/utils.js.map +1 -1
  27. package/dist/esm/utils/KeypairWallet.unit.helpers.js.map +1 -1
  28. package/dist/esm/version.d.ts +1 -1
  29. package/dist/esm/version.js +1 -1
  30. package/dist/esm/version.js.map +1 -1
  31. package/package.json +2 -2
  32. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaProvider.js","names":["ChainType","resolveSolanaAddress","getSolanaBalance","ProviderError","LiFiErrorCode","SolanaStepExecutor"],"sources":["../../src/SolanaProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { isAddress } from '@solana/kit'\nimport { getSolanaBalance } from './actions/getSolanaBalance.js'\nimport { resolveSolanaAddress } from './actions/resolveSolanaAddress.js'\nimport { SolanaStepExecutor } from './core/SolanaStepExecutor.js'\nimport type { SolanaProviderOptions, SolanaSDKProvider } from './types.js'\n\nexport function SolanaProvider(\n options?: SolanaProviderOptions\n): SolanaSDKProvider {\n const _options: SolanaProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.SVM\n },\n isAddress,\n resolveAddress: resolveSolanaAddress,\n getBalance: getSolanaBalance,\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<SolanaStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ConfigError,\n 'SolanaProvider requires a getWallet function'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new SolanaStepExecutor({\n wallet,\n routeId: options.routeId,\n skipSimulation: _options.skipSimulation,\n executionOptions: {\n ...options.executionOptions,\n },\n })\n\n return executor\n },\n setOptions(options: SolanaProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,eACd,SACmB;CACnB,MAAM,WAAkC,WAAW,EAAE;AACrD,QAAO;EACL,IAAI,OAAO;AACT,UAAOA,UAAAA,UAAU;;EAEnB,WAAA,YAAA;EACA,gBAAgBC,qCAAAA;EAChB,YAAYC,iCAAAA;EACZ,MAAM,gBACJ,SAC6B;AAC7B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,aACd,+CACD;AAcH,UATiB,IAAIC,gCAAAA,mBAAmB;IACtC,QAHa,MAAM,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,gBAAgB,SAAS;IACzB,kBAAkB,EAChB,GAAG,QAAQ,kBACZ;IACF,CAAC;;EAIJ,WAAW,SAAgC;AACzC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
1
+ {"version":3,"file":"SolanaProvider.js","names":["ChainType","resolveSolanaAddress","getSolanaBalance","ProviderError","LiFiErrorCode","SolanaStepExecutor"],"sources":["../../src/SolanaProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { isAddress } from '@solana/kit'\nimport { getSolanaBalance } from './actions/getSolanaBalance.js'\nimport { resolveSolanaAddress } from './actions/resolveSolanaAddress.js'\nimport { SolanaStepExecutor } from './core/SolanaStepExecutor.js'\nimport type { SolanaProviderOptions, SolanaSDKProvider } from './types.js'\n\nexport function SolanaProvider(\n options?: SolanaProviderOptions\n): SolanaSDKProvider {\n const _options: SolanaProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.SVM\n },\n isAddress,\n resolveAddress: resolveSolanaAddress,\n getBalance: getSolanaBalance,\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<SolanaStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ConfigError,\n 'SolanaProvider requires a getWallet function'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new SolanaStepExecutor({\n wallet,\n routeId: options.routeId,\n skipSimulation: _options.skipSimulation,\n executionOptions: {\n ...options.executionOptions,\n },\n })\n\n return executor\n },\n setOptions(options: SolanaProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,eACd,SACmB;CACnB,MAAM,WAAkC,WAAW,EAAE;AACrD,QAAO;EACL,IAAI,OAAO;AACT,UAAOA,UAAAA,UAAU;;EAEnB,WAAA,YAAA;EACA,gBAAgBC,qCAAAA;EAChB,YAAYC,iCAAAA;EACZ,MAAM,gBACJ,SAC6B;AAC7B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,aACd,+CACD;AAcH,UAAO,IATcC,gCAAAA,mBAAmB;IACtC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,gBAAgB,SAAS;IACzB,kBAAkB,EAChB,GAAG,QAAQ,kBACZ;IACF,CAEc;;EAEjB,WAAW,SAAgC;AACzC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getSolanaBalance.js","names":["callSolanaRpcsWithRetry"],"sources":["../../../src/actions/getSolanaBalance.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport {\n type ChainId,\n type Token,\n type TokenAmount,\n withDedupe,\n} from '@lifi/sdk'\nimport { address, type JsonParsedTokenAccount } from '@solana/kit'\n\nimport { callSolanaRpcsWithRetry } from '../rpc/utils.js'\n\nconst SolSystemProgram = '11111111111111111111111111111111'\nconst TokenProgramId = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst Token2022ProgramId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\n\nexport const getSolanaBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[]\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n return getSolanaBalanceDefault(client, chainId, tokens, walletAddress)\n}\n\nconst getSolanaBalanceDefault = async (\n client: SDKClient,\n _chainId: ChainId,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n // Convert addresses to Solana Kit's address type\n const accountAddress = address(walletAddress)\n const tokenProgramAddress = address(TokenProgramId)\n const token2022ProgramAddress = address(Token2022ProgramId)\n\n // Use Solana Kit's RPC API with the retry wrapper\n const [slot, balance, tokenAccountsByOwner, token2022AccountsByOwner] =\n await Promise.allSettled([\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getSlot({ commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getSlot` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getBalance(accountAddress, { commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getBalance` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: tokenProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${TokenProgramId}`,\n }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: token2022ProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${Token2022ProgramId}`,\n }\n ),\n ])\n const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n\n const nativeBalanceOk = balance.status === 'fulfilled'\n const solBalance = nativeBalanceOk ? BigInt(balance.value.value) : 0n\n const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled'\n const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled'\n\n const walletTokenAmounts = [\n ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),\n ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),\n ].reduce(\n (tokenAmounts: Record<string, bigint>, value) => {\n const tokenAccount: JsonParsedTokenAccount =\n value.account.data.parsed.info\n const amount = BigInt(tokenAccount.tokenAmount.amount)\n if (amount > 0n) {\n tokenAmounts[tokenAccount.mint] = amount\n }\n return tokenAmounts\n },\n {} as Record<string, bigint>\n )\n\n // We can only confidently report 0n for an SPL mint when both Token and\n // Token2022 program queries succeeded — otherwise the mint may live in the\n // program whose query failed (e.g. PYUSD on Token2022).\n const splZeroIsKnown = tokenProgramOk && token2022ProgramOk\n\n const tokenAmounts: TokenAmount[] = tokens.map((token) => {\n const isNative = token.address === SolSystemProgram\n if (isNative) {\n if (!nativeBalanceOk) {\n return { ...token, blockNumber }\n }\n return { ...token, amount: solBalance, blockNumber }\n }\n const found = walletTokenAmounts[token.address]\n if (found !== undefined) {\n return { ...token, amount: found, blockNumber }\n }\n if (splZeroIsKnown) {\n return { ...token, amount: 0n, blockNumber }\n }\n return { ...token, blockNumber }\n })\n return tokenAmounts\n}\n"],"mappings":";;;;;AAWA,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAE3B,MAAa,mBAAmB,OAC9B,QACA,eACA,WAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;AAIlE,QAAO,wBAAwB,QAAQ,SAAS,QAAQ,cAAc;;AAGxE,MAAM,0BAA0B,OAC9B,QACA,UACA,QACA,kBAC2B;CAE3B,MAAM,kBAAA,GAAA,YAAA,SAAyB,cAAc;CAC7C,MAAM,uBAAA,GAAA,YAAA,SAA8B,eAAe;CACnD,MAAM,2BAAA,GAAA,YAAA,SAAkC,mBAAmB;CAG3D,MAAM,CAAC,MAAM,SAAS,sBAAsB,4BAC1C,MAAM,QAAQ,WAAW;kCAGnBA,kBAAAA,wBAAwB,SAAS,QAC/B,IAAI,QAAQ,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CAChD,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,WAAW,CAClD;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IAAI,WAAW,gBAAgB,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CACnE,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,cAAc,CACrD;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,qBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,kBAChE,CACF;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,yBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,sBAChE,CACF;EACF,CAAC;CACJ,MAAM,cAAc,KAAK,WAAW,cAAc,OAAO,KAAK,MAAM,GAAG;CACvE,MAAM,kBAAkB,QAAQ,WAAW;CAC3C,MAAM,aAAa,kBAAkB,OAAO,QAAQ,MAAM,MAAM,GAAG;CACnE,MAAM,iBAAiB,qBAAqB,WAAW;CACvD,MAAM,qBAAqB,yBAAyB,WAAW;CAE/D,MAAM,qBAAqB,CACzB,GAAI,iBAAiB,qBAAqB,MAAM,QAAQ,EAAE,EAC1D,GAAI,qBAAqB,yBAAyB,MAAM,QAAQ,EAAE,CACnE,CAAC,QACC,cAAsC,UAAU;EAC/C,MAAM,eACJ,MAAM,QAAQ,KAAK,OAAO;EAC5B,MAAM,SAAS,OAAO,aAAa,YAAY,OAAO;AACtD,MAAI,SAAS,GACX,cAAa,aAAa,QAAQ;AAEpC,SAAO;IAET,EAAE,CACH;CAKD,MAAM,iBAAiB,kBAAkB;AAmBzC,QAjBoC,OAAO,KAAK,UAAU;AAExD,MADiB,MAAM,YAAY,kBACrB;AACZ,OAAI,CAAC,gBACH,QAAO;IAAE,GAAG;IAAO;IAAa;AAElC,UAAO;IAAE,GAAG;IAAO,QAAQ;IAAY;IAAa;;EAEtD,MAAM,QAAQ,mBAAmB,MAAM;AACvC,MAAI,UAAU,KAAA,EACZ,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAO;GAAa;AAEjD,MAAI,eACF,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAI;GAAa;AAE9C,SAAO;GAAE,GAAG;GAAO;GAAa;GAChC"}
1
+ {"version":3,"file":"getSolanaBalance.js","names":["callSolanaRpcsWithRetry"],"sources":["../../../src/actions/getSolanaBalance.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport {\n type ChainId,\n type Token,\n type TokenAmount,\n withDedupe,\n} from '@lifi/sdk'\nimport { address, type JsonParsedTokenAccount } from '@solana/kit'\n\nimport { callSolanaRpcsWithRetry } from '../rpc/utils.js'\n\nconst SolSystemProgram = '11111111111111111111111111111111'\nconst TokenProgramId = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst Token2022ProgramId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\n\nexport const getSolanaBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[]\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n return getSolanaBalanceDefault(client, chainId, tokens, walletAddress)\n}\n\nconst getSolanaBalanceDefault = async (\n client: SDKClient,\n _chainId: ChainId,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n // Convert addresses to Solana Kit's address type\n const accountAddress = address(walletAddress)\n const tokenProgramAddress = address(TokenProgramId)\n const token2022ProgramAddress = address(Token2022ProgramId)\n\n // Use Solana Kit's RPC API with the retry wrapper\n const [slot, balance, tokenAccountsByOwner, token2022AccountsByOwner] =\n await Promise.allSettled([\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getSlot({ commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getSlot` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getBalance(accountAddress, { commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getBalance` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: tokenProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${TokenProgramId}`,\n }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: token2022ProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${Token2022ProgramId}`,\n }\n ),\n ])\n const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n\n const nativeBalanceOk = balance.status === 'fulfilled'\n const solBalance = nativeBalanceOk ? BigInt(balance.value.value) : 0n\n const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled'\n const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled'\n\n const walletTokenAmounts = [\n ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),\n ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),\n ].reduce(\n (tokenAmounts: Record<string, bigint>, value) => {\n const tokenAccount: JsonParsedTokenAccount =\n value.account.data.parsed.info\n const amount = BigInt(tokenAccount.tokenAmount.amount)\n if (amount > 0n) {\n tokenAmounts[tokenAccount.mint] = amount\n }\n return tokenAmounts\n },\n {} as Record<string, bigint>\n )\n\n // We can only confidently report 0n for an SPL mint when both Token and\n // Token2022 program queries succeeded — otherwise the mint may live in the\n // program whose query failed (e.g. PYUSD on Token2022).\n const splZeroIsKnown = tokenProgramOk && token2022ProgramOk\n\n const tokenAmounts: TokenAmount[] = tokens.map((token) => {\n const isNative = token.address === SolSystemProgram\n if (isNative) {\n if (!nativeBalanceOk) {\n return { ...token, blockNumber }\n }\n return { ...token, amount: solBalance, blockNumber }\n }\n const found = walletTokenAmounts[token.address]\n if (found !== undefined) {\n return { ...token, amount: found, blockNumber }\n }\n if (splZeroIsKnown) {\n return { ...token, amount: 0n, blockNumber }\n }\n return { ...token, blockNumber }\n })\n return tokenAmounts\n}\n"],"mappings":";;;;;AAWA,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAE3B,MAAa,mBAAmB,OAC9B,QACA,eACA,WAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;AAIlE,QAAO,wBAAwB,QAAQ,SAAS,QAAQ,cAAc;;AAGxE,MAAM,0BAA0B,OAC9B,QACA,UACA,QACA,kBAC2B;CAE3B,MAAM,kBAAA,GAAA,YAAA,SAAyB,cAAc;CAC7C,MAAM,uBAAA,GAAA,YAAA,SAA8B,eAAe;CACnD,MAAM,2BAAA,GAAA,YAAA,SAAkC,mBAAmB;CAG3D,MAAM,CAAC,MAAM,SAAS,sBAAsB,4BAC1C,MAAM,QAAQ,WAAW;kCAGnBA,kBAAAA,wBAAwB,SAAS,QAC/B,IAAI,QAAQ,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CAChD,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,WAAW,CAClD;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IAAI,WAAW,gBAAgB,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CACnE,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,cAAc,CACrD;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,qBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,kBAChE,CACF;kCAGGA,kBAAAA,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,yBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,sBAChE,CACF;EACF,CAAC;CACJ,MAAM,cAAc,KAAK,WAAW,cAAc,OAAO,KAAK,MAAM,GAAG;CACvE,MAAM,kBAAkB,QAAQ,WAAW;CAC3C,MAAM,aAAa,kBAAkB,OAAO,QAAQ,MAAM,MAAM,GAAG;CACnE,MAAM,iBAAiB,qBAAqB,WAAW;CACvD,MAAM,qBAAqB,yBAAyB,WAAW;CAE/D,MAAM,qBAAqB,CACzB,GAAI,iBAAiB,qBAAqB,MAAM,QAAQ,EAAE,EAC1D,GAAI,qBAAqB,yBAAyB,MAAM,QAAQ,EAAE,CACnE,CAAC,QACC,cAAsC,UAAU;EAC/C,MAAM,eACJ,MAAM,QAAQ,KAAK,OAAO;EAC5B,MAAM,SAAS,OAAO,aAAa,YAAY,OAAO;AACtD,MAAI,SAAS,GACX,cAAa,aAAa,QAAQ;AAEpC,SAAO;IAET,EAAE,CACH;CAKD,MAAM,iBAAiB,kBAAkB;AAmBzC,QAjBoC,OAAO,KAAK,UAAU;AAExD,MADiB,MAAM,YAAY,kBACrB;AACZ,OAAI,CAAC,gBACH,QAAO;IAAE,GAAG;IAAO;IAAa;AAElC,UAAO;IAAE,GAAG;IAAO,QAAQ;IAAY;IAAa;;EAEtD,MAAM,QAAQ,mBAAmB,MAAM;AACvC,MAAI,UAAU,KAAA,EACZ,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAO;GAAa;AAEjD,MAAI,eACF,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAI;GAAa;AAE9C,SAAO;GAAE,GAAG;GAAO;GAAa;GAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmBundle.js","names":["getJitoRpcs"],"sources":["../../../src/actions/sendAndConfirmBundle.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n type Signature,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\n\nimport { getJitoRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\nexport type BundleResult = {\n bundleId: string\n txSignatures: Signature[]\n signatureResults: (SignatureStatus | null)[]\n}\n\n/**\n * Send and confirm a bundle of transactions using Jito.\n * Automatically selects a Jito-enabled RPC connection and polls for confirmation\n * across multiple Jito RPCs in parallel.\n * @param client - The SDK client.\n * @param signedTransactions - Array of signed transactions to bundle.\n * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.\n */\nexport async function sendAndConfirmBundle(\n client: SDKClient,\n signedTransactions: Transaction[]\n): Promise<BundleResult> {\n const jitoRpcs = await getJitoRpcs(client)\n\n if (jitoRpcs.length === 0) {\n throw new Error(\n 'No Jito-enabled RPC connection available for bundle submission'\n )\n }\n\n // Serialize transactions to base64\n const serializedTransactions = signedTransactions.map((tx) =>\n getBase64EncodedWireTransaction(tx)\n )\n\n const abortController = new AbortController()\n\n const confirmPromises = jitoRpcs.map(async (jitoRpc) => {\n try {\n // Send bundle to Jito\n let bundleId: string\n try {\n bundleId = await jitoRpc.sendBundle(serializedTransactions).send()\n } catch (_) {\n return null\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n jitoRpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let currentBlockHeight = initialBlockHeight\n\n while (\n currentBlockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await jitoRpc\n .getBundleStatuses([bundleId])\n .send()\n\n const bundleStatus = statusResponse.value[0]\n\n // Check if bundle is confirmed or finalized\n if (\n bundleStatus &&\n (bundleStatus.confirmation_status === 'confirmed' ||\n bundleStatus.confirmation_status === 'finalized')\n ) {\n // Bundle confirmed! Extract transaction signatures from bundle status\n const txSignatures = bundleStatus.transactions\n\n // Fetch individual signature results from Jito RPC\n const sigResponse = await jitoRpc\n .getSignatureStatuses(txSignatures)\n .send()\n\n if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {\n // Keep polling if can't find signature results\n await sleep(400)\n continue\n }\n\n // Immediately abort all other connections when we find a result\n abortController.abort()\n return {\n bundleId,\n txSignatures,\n signatureResults: sigResponse.value,\n }\n }\n\n await sleep(400)\n if (!abortController.signal.aborted) {\n currentBlockHeight = await jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n\n return null\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n // Wait for first successful confirmation\n const result = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n if (!result) {\n throw new Error('Failed to send and confirm bundle')\n }\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;;AAiCA,eAAsB,qBACpB,QACA,oBACuB;CACvB,MAAM,WAAW,MAAMA,qBAAAA,YAAY,OAAO;AAE1C,KAAI,SAAS,WAAW,EACtB,OAAM,IAAI,MACR,iEACD;CAIH,MAAM,yBAAyB,mBAAmB,KAAK,QAAA,GAAA,YAAA,iCACrB,GAAG,CACpC;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,SAAS,IAAI,OAAO,YAAY;AACtD,MAAI;GAEF,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,QAAQ,WAAW,uBAAuB,CAAC,MAAM;YAC3D,GAAG;AACV,WAAO;;GAGT,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,QACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,QACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,qBAAqB;AAEzB,UACE,qBAAqB,gBAAgB,wBACrC,CAAC,gBAAgB,OAAO,SACxB;IAKA,MAAM,gBAJiB,MAAM,QAC1B,kBAAkB,CAAC,SAAS,CAAC,CAC7B,MAAM,EAE2B,MAAM;AAG1C,QACE,iBACC,aAAa,wBAAwB,eACpC,aAAa,wBAAwB,cACvC;KAEA,MAAM,eAAe,aAAa;KAGlC,MAAM,cAAc,MAAM,QACvB,qBAAqB,aAAa,CAClC,MAAM;AAET,SAAI,CAAC,aAAa,SAAS,CAAC,MAAM,QAAQ,YAAY,MAAM,EAAE;AAE5D,aAAA,GAAA,UAAA,OAAY,IAAI;AAChB;;AAIF,qBAAgB,OAAO;AACvB,YAAO;MACL;MACA;MACA,kBAAkB,YAAY;MAC/B;;AAGH,WAAA,GAAA,UAAA,OAAY,IAAI;AAChB,QAAI,CAAC,gBAAgB,OAAO,QAC1B,sBAAqB,MAAM,QACxB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAIb,UAAO;WACA,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAGF,MAAM,SAAS,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAEnE,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAO"}
1
+ {"version":3,"file":"sendAndConfirmBundle.js","names":["getJitoRpcs"],"sources":["../../../src/actions/sendAndConfirmBundle.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n type Signature,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\n\nimport { getJitoRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\nexport type BundleResult = {\n bundleId: string\n txSignatures: Signature[]\n signatureResults: (SignatureStatus | null)[]\n}\n\n/**\n * Send and confirm a bundle of transactions using Jito.\n * Automatically selects a Jito-enabled RPC connection and polls for confirmation\n * across multiple Jito RPCs in parallel.\n * @param client - The SDK client.\n * @param signedTransactions - Array of signed transactions to bundle.\n * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.\n */\nexport async function sendAndConfirmBundle(\n client: SDKClient,\n signedTransactions: Transaction[]\n): Promise<BundleResult> {\n const jitoRpcs = await getJitoRpcs(client)\n\n if (jitoRpcs.length === 0) {\n throw new Error(\n 'No Jito-enabled RPC connection available for bundle submission'\n )\n }\n\n // Serialize transactions to base64\n const serializedTransactions = signedTransactions.map((tx) =>\n getBase64EncodedWireTransaction(tx)\n )\n\n const abortController = new AbortController()\n\n const confirmPromises = jitoRpcs.map(async (jitoRpc) => {\n try {\n // Send bundle to Jito\n let bundleId: string\n try {\n bundleId = await jitoRpc.sendBundle(serializedTransactions).send()\n } catch (_) {\n return null\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n jitoRpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let currentBlockHeight = initialBlockHeight\n\n while (\n currentBlockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await jitoRpc\n .getBundleStatuses([bundleId])\n .send()\n\n const bundleStatus = statusResponse.value[0]\n\n // Check if bundle is confirmed or finalized\n if (\n bundleStatus &&\n (bundleStatus.confirmation_status === 'confirmed' ||\n bundleStatus.confirmation_status === 'finalized')\n ) {\n // Bundle confirmed! Extract transaction signatures from bundle status\n const txSignatures = bundleStatus.transactions\n\n // Fetch individual signature results from Jito RPC\n const sigResponse = await jitoRpc\n .getSignatureStatuses(txSignatures)\n .send()\n\n if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {\n // Keep polling if can't find signature results\n await sleep(400)\n continue\n }\n\n // Immediately abort all other connections when we find a result\n abortController.abort()\n return {\n bundleId,\n txSignatures,\n signatureResults: sigResponse.value,\n }\n }\n\n await sleep(400)\n if (!abortController.signal.aborted) {\n currentBlockHeight = await jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n\n return null\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n // Wait for first successful confirmation\n const result = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n if (!result) {\n throw new Error('Failed to send and confirm bundle')\n }\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;;AAiCA,eAAsB,qBACpB,QACA,oBACuB;CACvB,MAAM,WAAW,MAAMA,qBAAAA,YAAY,OAAO;AAE1C,KAAI,SAAS,WAAW,EACtB,OAAM,IAAI,MACR,iEACD;CAIH,MAAM,yBAAyB,mBAAmB,KAAK,QAAA,GAAA,YAAA,iCACrB,GAAG,CACpC;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,SAAS,IAAI,OAAO,YAAY;AACtD,MAAI;GAEF,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,QAAQ,WAAW,uBAAuB,CAAC,MAAM;YAC3D,GAAG;AACV,WAAO;;GAGT,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,QACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,QACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,qBAAqB;AAEzB,UACE,qBAAqB,gBAAgB,wBACrC,CAAC,gBAAgB,OAAO,SACxB;IAKA,MAAM,gBAAe,MAJQ,QAC1B,kBAAkB,CAAC,SAAS,CAAC,CAC7B,MAAM,EAE2B,MAAM;AAG1C,QACE,iBACC,aAAa,wBAAwB,eACpC,aAAa,wBAAwB,cACvC;KAEA,MAAM,eAAe,aAAa;KAGlC,MAAM,cAAc,MAAM,QACvB,qBAAqB,aAAa,CAClC,MAAM;AAET,SAAI,CAAC,aAAa,SAAS,CAAC,MAAM,QAAQ,YAAY,MAAM,EAAE;AAE5D,aAAA,GAAA,UAAA,OAAY,IAAI;AAChB;;AAIF,qBAAgB,OAAO;AACvB,YAAO;MACL;MACA;MACA,kBAAkB,YAAY;MAC/B;;AAGH,WAAA,GAAA,UAAA,OAAY,IAAI;AAChB,QAAI,CAAC,gBAAgB,OAAO,QAC1B,sBAAqB,MAAM,QACxB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAIb,UAAO;WACA,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAGF,MAAM,SAAS,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAEnE,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmTransaction.js","names":["getSolanaRpcs"],"sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\nimport { getSolanaRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\ntype ConfirmedTransactionResult = {\n signatureResult: SignatureStatus | null\n txSignature: string\n}\n\n/**\n * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation\n * as soon as any of them confirm the transaction.\n * @param client - The SDK client.\n * @param signedTransaction - The signed transaction to send.\n * @returns - The confirmation result of the transaction.\n */\nexport async function sendAndConfirmTransaction(\n client: SDKClient,\n signedTransaction: Transaction\n): Promise<ConfirmedTransactionResult> {\n const solanaRpcs = await getSolanaRpcs(client)\n\n const signedTxSerialized = getBase64EncodedWireTransaction(signedTransaction)\n // Create transaction hash (signature)\n const txSignature = getSignatureFromTransaction(signedTransaction)\n\n if (!txSignature) {\n throw new Error('Transaction signature is missing.')\n }\n\n const rawTransactionOptions = {\n // We can skip preflight check after the first transaction has been sent\n // https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight\n skipPreflight: true,\n // Setting max retries to 0 as we are handling retries manually\n maxRetries: BigInt(0),\n // https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level\n preflightCommitment: 'confirmed' as Commitment,\n encoding: 'base64' as const,\n }\n\n const abortController = new AbortController()\n\n const confirmPromises = solanaRpcs.map(async (rpc) => {\n try {\n // Send initial transaction for this RPC\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue with confirmation even if initial send fails\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n rpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let signatureResult: SignatureStatus | null = null\n let blockHeight = initialBlockHeight\n const pollingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await rpc\n .getSignatureStatuses([txSignature])\n .send()\n\n const status = statusResponse.value[0]\n if (\n status &&\n (status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized')\n ) {\n signatureResult = status\n // Immediately abort all other RPCs when we find a result\n abortController.abort()\n return status\n }\n\n await sleep(400)\n }\n return null\n })()\n\n const sendingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted &&\n !signatureResult\n ) {\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue trying even if individual sends fail\n }\n\n await sleep(1000)\n if (!abortController.signal.aborted) {\n blockHeight = await rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n return null\n })()\n\n // Wait for polling to find the result\n const result = await Promise.race([pollingPromise, sendingPromise])\n return result\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n const signatureResult = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n return { signatureResult, txSignature }\n}\n"],"mappings":";;;;;;;;;;;;AA8BA,eAAsB,0BACpB,QACA,mBACqC;CACrC,MAAM,aAAa,MAAMA,qBAAAA,cAAc,OAAO;CAE9C,MAAM,sBAAA,GAAA,YAAA,iCAAqD,kBAAkB;CAE7E,MAAM,eAAA,GAAA,YAAA,6BAA0C,kBAAkB;AAElE,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,oCAAoC;CAGtD,MAAM,wBAAwB;EAG5B,eAAe;EAEf,YAAY,OAAO,EAAE;EAErB,qBAAqB;EACrB,UAAU;EACX;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,WAAW,IAAI,OAAO,QAAQ;AACpD,MAAI;AAEF,OAAI;AACF,UAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;YACF,GAAG;GAIZ,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,IACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,IACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,kBAA0C;GAC9C,IAAI,cAAc;GAClB,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,SACxB;KAKA,MAAM,UAJiB,MAAM,IAC1B,qBAAqB,CAAC,YAAY,CAAC,CACnC,MAAM,EAEqB,MAAM;AACpC,SACE,WACC,OAAO,uBAAuB,eAC7B,OAAO,uBAAuB,cAChC;AACA,wBAAkB;AAElB,sBAAgB,OAAO;AACvB,aAAO;;AAGT,YAAA,GAAA,UAAA,OAAY,IAAI;;AAElB,WAAO;OACL;GAEJ,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,WACxB,CAAC,iBACD;AACA,SAAI;AACF,YAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;cACF,GAAG;AAIZ,YAAA,GAAA,UAAA,OAAY,IAAK;AACjB,SAAI,CAAC,gBAAgB,OAAO,QAC1B,eAAc,MAAM,IACjB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAGb,WAAO;OACL;AAIJ,UADe,MAAM,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAAC;WAE5D,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAE5E,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,QAAO;EAAE;EAAiB;EAAa"}
1
+ {"version":3,"file":"sendAndConfirmTransaction.js","names":["getSolanaRpcs"],"sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\nimport { getSolanaRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\ntype ConfirmedTransactionResult = {\n signatureResult: SignatureStatus | null\n txSignature: string\n}\n\n/**\n * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation\n * as soon as any of them confirm the transaction.\n * @param client - The SDK client.\n * @param signedTransaction - The signed transaction to send.\n * @returns - The confirmation result of the transaction.\n */\nexport async function sendAndConfirmTransaction(\n client: SDKClient,\n signedTransaction: Transaction\n): Promise<ConfirmedTransactionResult> {\n const solanaRpcs = await getSolanaRpcs(client)\n\n const signedTxSerialized = getBase64EncodedWireTransaction(signedTransaction)\n // Create transaction hash (signature)\n const txSignature = getSignatureFromTransaction(signedTransaction)\n\n if (!txSignature) {\n throw new Error('Transaction signature is missing.')\n }\n\n const rawTransactionOptions = {\n // We can skip preflight check after the first transaction has been sent\n // https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight\n skipPreflight: true,\n // Setting max retries to 0 as we are handling retries manually\n maxRetries: BigInt(0),\n // https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level\n preflightCommitment: 'confirmed' as Commitment,\n encoding: 'base64' as const,\n }\n\n const abortController = new AbortController()\n\n const confirmPromises = solanaRpcs.map(async (rpc) => {\n try {\n // Send initial transaction for this RPC\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue with confirmation even if initial send fails\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n rpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let signatureResult: SignatureStatus | null = null\n let blockHeight = initialBlockHeight\n const pollingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await rpc\n .getSignatureStatuses([txSignature])\n .send()\n\n const status = statusResponse.value[0]\n if (\n status &&\n (status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized')\n ) {\n signatureResult = status\n // Immediately abort all other RPCs when we find a result\n abortController.abort()\n return status\n }\n\n await sleep(400)\n }\n return null\n })()\n\n const sendingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted &&\n !signatureResult\n ) {\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue trying even if individual sends fail\n }\n\n await sleep(1000)\n if (!abortController.signal.aborted) {\n blockHeight = await rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n return null\n })()\n\n // Wait for polling to find the result\n const result = await Promise.race([pollingPromise, sendingPromise])\n return result\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n const signatureResult = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n return { signatureResult, txSignature }\n}\n"],"mappings":";;;;;;;;;;;;AA8BA,eAAsB,0BACpB,QACA,mBACqC;CACrC,MAAM,aAAa,MAAMA,qBAAAA,cAAc,OAAO;CAE9C,MAAM,sBAAA,GAAA,YAAA,iCAAqD,kBAAkB;CAE7E,MAAM,eAAA,GAAA,YAAA,6BAA0C,kBAAkB;AAElE,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,oCAAoC;CAGtD,MAAM,wBAAwB;EAG5B,eAAe;EAEf,YAAY,OAAO,EAAE;EAErB,qBAAqB;EACrB,UAAU;EACX;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,WAAW,IAAI,OAAO,QAAQ;AACpD,MAAI;AAEF,OAAI;AACF,UAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;YACF,GAAG;GAIZ,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,IACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,IACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,kBAA0C;GAC9C,IAAI,cAAc;GAClB,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,SACxB;KAKA,MAAM,UAAS,MAJc,IAC1B,qBAAqB,CAAC,YAAY,CAAC,CACnC,MAAM,EAEqB,MAAM;AACpC,SACE,WACC,OAAO,uBAAuB,eAC7B,OAAO,uBAAuB,cAChC;AACA,wBAAkB;AAElB,sBAAgB,OAAO;AACvB,aAAO;;AAGT,YAAA,GAAA,UAAA,OAAY,IAAI;;AAElB,WAAO;OACL;GAEJ,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,WACxB,CAAC,iBACD;AACA,SAAI;AACF,YAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;cACF,GAAG;AAIZ,YAAA,GAAA,UAAA,OAAY,IAAK;AACjB,SAAI,CAAC,gBAAgB,OAAO,QAC1B,eAAc,MAAM,IACjB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAGb,WAAO;OACL;AAIJ,UAAO,MADc,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAAC;WAE5D,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAE5E,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,QAAO;EAAE;EAAiB;EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaStepExecutor.js","names":["BaseStepExecutor","TransactionError","LiFiErrorCode","parseSolanaErrors","CheckBalanceTask","PrepareTransactionTask","SolanaSignAndExecuteTask","SolanaWaitForTransactionTask","WaitForTransactionStatusTask","TaskPipeline"],"sources":["../../../src/core/SolanaStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Wallet, WalletAccount } from '@wallet-standard/base'\nimport { parseSolanaErrors } from '../errors/parseSolanaErrors.js'\nimport type {\n SolanaStepExecutorContext,\n SolanaStepExecutorOptions,\n} from '../types.js'\nimport { SolanaSignAndExecuteTask } from './tasks/SolanaSignAndExecuteTask.js'\nimport { SolanaWaitForTransactionTask } from './tasks/SolanaWaitForTransactionTask.js'\n\nexport class SolanaStepExecutor extends BaseStepExecutor {\n private wallet: Wallet\n private skipSimulation: boolean\n\n constructor(options: SolanaStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n this.skipSimulation = options.skipSimulation ?? false\n }\n\n getWalletAccount = (step: LiFiStepExtended): WalletAccount => {\n const account = this.wallet.accounts.find(\n (account) => account.address === step.action.fromAddress\n )\n\n if (!account) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n\n return account\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseSolanaErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<SolanaStepExecutorContext> => {\n const { step } = baseContext\n\n const walletAccount = this.getWalletAccount(step)\n\n return {\n ...baseContext,\n wallet: this.wallet,\n walletAccount,\n skipSimulation: this.skipSimulation,\n }\n }\n\n override createPipeline = (\n context: SolanaStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const tasks = [\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new SolanaSignAndExecuteTask(),\n new SolanaWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;AAsBA,IAAa,qBAAb,cAAwCA,UAAAA,iBAAiB;CACvD;CACA;CAEA,YAAY,SAAoC;AAC9C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;AACtB,OAAK,iBAAiB,QAAQ,kBAAkB;;CAGlD,oBAAoB,SAA0C;EAC5D,MAAM,UAAU,KAAK,OAAO,SAAS,MAClC,YAAY,QAAQ,YAAY,KAAK,OAAO,YAC9C;AAED,MAAI,CAAC,QACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,oHACD;AAGH,SAAO;;CAGT,eACE,OACA,MACA,WACsBC,iCAAAA,kBAAkB,OAAO,MAAM,OAAO;CAE9D,gBAAyB,OACvB,gBACuC;EACvC,MAAM,EAAE,SAAS;EAEjB,MAAM,gBAAgB,KAAK,iBAAiB,KAAK;AAEjD,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACtB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,QAAQ;GACZ,IAAIC,UAAAA,kBAAkB;GACtB,IAAIC,UAAAA,wBAAwB;GAC5B,IAAIC,4CAAAA,0BAA0B;GAC9B,IAAIC,gDAAAA,8BAA8B;GAClC,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,WACJ,oBAAoB,UAAU,oBAAoB,WAAW,SACzDA,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAEvB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,eAAe,CAEX"}
1
+ {"version":3,"file":"SolanaStepExecutor.js","names":["BaseStepExecutor","TransactionError","LiFiErrorCode","parseSolanaErrors","CheckBalanceTask","PrepareTransactionTask","SolanaSignAndExecuteTask","SolanaWaitForTransactionTask","WaitForTransactionStatusTask","TaskPipeline"],"sources":["../../../src/core/SolanaStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Wallet, WalletAccount } from '@wallet-standard/base'\nimport { parseSolanaErrors } from '../errors/parseSolanaErrors.js'\nimport type {\n SolanaStepExecutorContext,\n SolanaStepExecutorOptions,\n} from '../types.js'\nimport { SolanaSignAndExecuteTask } from './tasks/SolanaSignAndExecuteTask.js'\nimport { SolanaWaitForTransactionTask } from './tasks/SolanaWaitForTransactionTask.js'\n\nexport class SolanaStepExecutor extends BaseStepExecutor {\n private wallet: Wallet\n private skipSimulation: boolean\n\n constructor(options: SolanaStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n this.skipSimulation = options.skipSimulation ?? false\n }\n\n getWalletAccount = (step: LiFiStepExtended): WalletAccount => {\n const account = this.wallet.accounts.find(\n (account) => account.address === step.action.fromAddress\n )\n\n if (!account) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n\n return account\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseSolanaErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<SolanaStepExecutorContext> => {\n const { step } = baseContext\n\n const walletAccount = this.getWalletAccount(step)\n\n return {\n ...baseContext,\n wallet: this.wallet,\n walletAccount,\n skipSimulation: this.skipSimulation,\n }\n }\n\n override createPipeline = (\n context: SolanaStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const tasks = [\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new SolanaSignAndExecuteTask(),\n new SolanaWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;AAsBA,IAAa,qBAAb,cAAwCA,UAAAA,iBAAiB;CACvD;CACA;CAEA,YAAY,SAAoC;AAC9C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;AACtB,OAAK,iBAAiB,QAAQ,kBAAkB;;CAGlD,oBAAoB,SAA0C;EAC5D,MAAM,UAAU,KAAK,OAAO,SAAS,MAClC,YAAY,QAAQ,YAAY,KAAK,OAAO,YAC9C;AAED,MAAI,CAAC,QACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,oHACD;AAGH,SAAO;;CAGT,eACE,OACA,MACA,WACsBC,iCAAAA,kBAAkB,OAAO,MAAM,OAAO;CAE9D,gBAAyB,OACvB,gBACuC;EACvC,MAAM,EAAE,SAAS;EAEjB,MAAM,gBAAgB,KAAK,iBAAiB,KAAK;AAEjD,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACtB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,QAAQ;GACZ,IAAIC,UAAAA,kBAAkB;GACtB,IAAIC,UAAAA,wBAAwB;GAC5B,IAAIC,4CAAAA,0BAA0B;GAC9B,IAAIC,gDAAAA,8BAA8B;GAClC,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,WACJ,oBAAoB,UAAU,oBAAoB,WAAW,SACzDA,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAEvB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,eAEG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaJitoWaitForTransactionTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","sendAndConfirmBundle"],"sources":["../../../../src/core/tasks/SolanaJitoWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { sendAndConfirmBundle } from '../../actions/sendAndConfirmBundle.js'\nimport type { SolanaStepExecutorContext } from '../../types.js'\n\nexport class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransactions: contextSignedTransactions,\n } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n // Use Jito bundle for transaction submission\n const bundleResult = await sendAndConfirmBundle(client, signedTransactions)\n\n const allConfirmed = bundleResult.signatureResults.every(\n (result) => result !== null\n )\n\n if (!allConfirmed) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Bundle confirmation failed: Not all transactions were confirmed.'\n )\n }\n\n // Check for errors in any of the transactions\n const failedResult = bundleResult.signatureResults.find(\n (result) => result?.err\n )\n if (failedResult?.err) {\n const reason =\n typeof failedResult.err === 'object'\n ? JSON.stringify(failedResult.err)\n : String(failedResult.err)\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction failed: ${reason}`\n )\n }\n\n const confirmedTransaction = {\n txSignature: bundleResult.txSignatures[0],\n bundleId: bundleResult.bundleId,\n }\n\n // Transaction has been confirmed and we can update the action\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash: confirmedTransaction.txSignature,\n txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,\n })\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;AASA,IAAa,mCAAb,cAAsDA,UAAAA,sBAAsB;CAC1E,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,oBAAoB,8BAClB;EAEJ,MAAM,qBAAqB,6BAA6B,EAAE;EAE1D,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAIH,MAAM,eAAe,MAAMC,qCAAAA,qBAAqB,QAAQ,mBAAmB;AAM3E,MAAI,CAJiB,aAAa,iBAAiB,OAChD,WAAW,WAAW,KACxB,CAGC,OAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,mEACD;EAIH,MAAM,eAAe,aAAa,iBAAiB,MAChD,WAAW,QAAQ,IACrB;AACD,MAAI,cAAc,KAAK;GACrB,MAAM,SACJ,OAAO,aAAa,QAAQ,WACxB,KAAK,UAAU,aAAa,IAAI,GAChC,OAAO,aAAa,IAAI;AAC9B,SAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,mBACd,uBAAuB,SACxB;;EAGH,MAAM,uBAAuB;GAC3B,aAAa,aAAa,aAAa;GACvC,UAAU,aAAa;GACxB;AAGD,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD,QAAQ,qBAAqB;GAC7B,QAAQ,GAAG,UAAU,SAAS,kBAAkB,GAAG,KAAK,qBAAqB;GAC9E,CAAC;AAEF,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
1
+ {"version":3,"file":"SolanaJitoWaitForTransactionTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","sendAndConfirmBundle"],"sources":["../../../../src/core/tasks/SolanaJitoWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { sendAndConfirmBundle } from '../../actions/sendAndConfirmBundle.js'\nimport type { SolanaStepExecutorContext } from '../../types.js'\n\nexport class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransactions: contextSignedTransactions,\n } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n // Use Jito bundle for transaction submission\n const bundleResult = await sendAndConfirmBundle(client, signedTransactions)\n\n const allConfirmed = bundleResult.signatureResults.every(\n (result) => result !== null\n )\n\n if (!allConfirmed) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Bundle confirmation failed: Not all transactions were confirmed.'\n )\n }\n\n // Check for errors in any of the transactions\n const failedResult = bundleResult.signatureResults.find(\n (result) => result?.err\n )\n if (failedResult?.err) {\n const reason =\n typeof failedResult.err === 'object'\n ? JSON.stringify(failedResult.err)\n : String(failedResult.err)\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction failed: ${reason}`\n )\n }\n\n const confirmedTransaction = {\n txSignature: bundleResult.txSignatures[0],\n bundleId: bundleResult.bundleId,\n }\n\n // Transaction has been confirmed and we can update the action\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash: confirmedTransaction.txSignature,\n txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,\n })\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;AASA,IAAa,mCAAb,cAAsDA,UAAAA,sBAAsB;CAC1E,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,oBAAoB,8BAClB;EAEJ,MAAM,qBAAqB,6BAA6B,EAAE;EAE1D,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAIH,MAAM,eAAe,MAAMC,qCAAAA,qBAAqB,QAAQ,mBAAmB;AAM3E,MAAI,CAJiB,aAAa,iBAAiB,OAChD,WAAW,WAAW,KAGR,CACf,OAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,mEACD;EAIH,MAAM,eAAe,aAAa,iBAAiB,MAChD,WAAW,QAAQ,IACrB;AACD,MAAI,cAAc,KAAK;GACrB,MAAM,SACJ,OAAO,aAAa,QAAQ,WACxB,KAAK,UAAU,aAAa,IAAI,GAChC,OAAO,aAAa,IAAI;AAC9B,SAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,mBACd,uBAAuB,SACxB;;EAGH,MAAM,uBAAuB;GAC3B,aAAa,aAAa,aAAa;GACvC,UAAU,aAAa;GACxB;AAGD,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD,QAAQ,qBAAqB;GAC7B,QAAQ,GAAG,UAAU,SAAS,kBAAkB,GAAG,KAAK,qBAAqB;GAC9E,CAAC;AAEF,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaSignAndExecuteTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","base64ToUint8Array","getWalletFeature","SolanaSignTransaction"],"sources":["../../../../src/core/tasks/SolanaSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n getTransactionRequestData,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n withTimeout,\n} from '@lifi/sdk'\nimport { getTransactionCodec } from '@solana/kit'\nimport { SolanaSignTransaction } from '@solana/wallet-standard-features'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { base64ToUint8Array } from '../../utils/base64ToUint8Array.js'\nimport { getWalletFeature } from '../../utils/getWalletFeature.js'\n\nexport class SolanaSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n walletAccount,\n statusManager,\n executionOptions,\n isBridgeExecution,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const transactionRequestData = await getTransactionRequestData(\n step,\n executionOptions\n )\n\n // Handle both single transaction (string) and multiple transactions (array)\n const transactionDataArray = Array.isArray(transactionRequestData)\n ? transactionRequestData\n : [transactionRequestData]\n\n const transactionBytesArray = transactionDataArray.map((data) =>\n base64ToUint8Array(data)\n )\n\n const signedTransactionOutputs = await withTimeout(\n async () => {\n const { signTransaction } = getWalletFeature(\n wallet,\n SolanaSignTransaction\n )\n // Spread the inputs to sign all transactions at once\n return signTransaction(\n ...transactionBytesArray.map((transaction) => ({\n account: walletAccount,\n transaction,\n }))\n )\n },\n {\n // https://solana.com/docs/advanced/confirmation#transaction-expiration\n // Use 2 minutes to account for fluctuations\n timeout: 120_000,\n errorInstance: new TransactionError(\n LiFiErrorCode.TransactionExpired,\n 'Transaction has expired: blockhash is no longer recent enough.'\n ),\n }\n )\n\n if (signedTransactionOutputs.length === 0) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'No signed transaction returned from signer.'\n )\n }\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n const transactionCodec = getTransactionCodec()\n\n // Decode all signed transactions\n const signedTransactions = signedTransactionOutputs.map((output) =>\n transactionCodec.decode(output.signedTransaction)\n )\n\n return {\n status: 'COMPLETED',\n context: { signedTransactions },\n }\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAa,2BAAb,cAA8CA,UAAAA,sBAAsB;CAClE,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,MACA,QACA,eACA,eACA,kBACA,sBACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAGH,MAAM,yBAAyB,OAAA,GAAA,UAAA,2BAC7B,MACA,iBACD;EAOD,MAAM,yBAJuB,MAAM,QAAQ,uBAAuB,GAC9D,yBACA,CAAC,uBAAuB,EAEuB,KAAK,SACtDC,iCAAAA,mBAAmB,KAAK,CACzB;EAED,MAAM,2BAA2B,OAAA,GAAA,UAAA,aAC/B,YAAY;GACV,MAAM,EAAE,oBAAoBC,+BAAAA,iBAC1B,QACAC,iCAAAA,sBACD;AAED,UAAO,gBACL,GAAG,sBAAsB,KAAK,iBAAiB;IAC7C,SAAS;IACT;IACD,EAAE,CACJ;KAEH;GAGE,SAAS;GACT,eAAe,IAAIJ,UAAAA,iBACjBC,UAAAA,cAAc,oBACd,iEACD;GACF,CACF;AAED,MAAI,yBAAyB,WAAW,EACtC,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,8CACD;AAGH,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,MAAM,oBAAA,GAAA,YAAA,sBAAwC;AAO9C,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,oBANc,yBAAyB,KAAK,WACvD,iBAAiB,OAAO,OAAO,kBAAkB,CAClD,EAIgC;GAChC"}
1
+ {"version":3,"file":"SolanaSignAndExecuteTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","base64ToUint8Array","getWalletFeature","SolanaSignTransaction"],"sources":["../../../../src/core/tasks/SolanaSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n getTransactionRequestData,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n withTimeout,\n} from '@lifi/sdk'\nimport { getTransactionCodec } from '@solana/kit'\nimport { SolanaSignTransaction } from '@solana/wallet-standard-features'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { base64ToUint8Array } from '../../utils/base64ToUint8Array.js'\nimport { getWalletFeature } from '../../utils/getWalletFeature.js'\n\nexport class SolanaSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n walletAccount,\n statusManager,\n executionOptions,\n isBridgeExecution,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const transactionRequestData = await getTransactionRequestData(\n step,\n executionOptions\n )\n\n // Handle both single transaction (string) and multiple transactions (array)\n const transactionDataArray = Array.isArray(transactionRequestData)\n ? transactionRequestData\n : [transactionRequestData]\n\n const transactionBytesArray = transactionDataArray.map((data) =>\n base64ToUint8Array(data)\n )\n\n const signedTransactionOutputs = await withTimeout(\n async () => {\n const { signTransaction } = getWalletFeature(\n wallet,\n SolanaSignTransaction\n )\n // Spread the inputs to sign all transactions at once\n return signTransaction(\n ...transactionBytesArray.map((transaction) => ({\n account: walletAccount,\n transaction,\n }))\n )\n },\n {\n // https://solana.com/docs/advanced/confirmation#transaction-expiration\n // Use 2 minutes to account for fluctuations\n timeout: 120_000,\n errorInstance: new TransactionError(\n LiFiErrorCode.TransactionExpired,\n 'Transaction has expired: blockhash is no longer recent enough.'\n ),\n }\n )\n\n if (signedTransactionOutputs.length === 0) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'No signed transaction returned from signer.'\n )\n }\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n const transactionCodec = getTransactionCodec()\n\n // Decode all signed transactions\n const signedTransactions = signedTransactionOutputs.map((output) =>\n transactionCodec.decode(output.signedTransaction)\n )\n\n return {\n status: 'COMPLETED',\n context: { signedTransactions },\n }\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAa,2BAAb,cAA8CA,UAAAA,sBAAsB;CAClE,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,MACA,QACA,eACA,eACA,kBACA,sBACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAGH,MAAM,yBAAyB,OAAA,GAAA,UAAA,2BAC7B,MACA,iBACD;EAOD,MAAM,yBAJuB,MAAM,QAAQ,uBAAuB,GAC9D,yBACA,CAAC,uBAAuB,EAEuB,KAAK,SACtDC,iCAAAA,mBAAmB,KAAK,CACzB;EAED,MAAM,2BAA2B,OAAA,GAAA,UAAA,aAC/B,YAAY;GACV,MAAM,EAAE,oBAAoBC,+BAAAA,iBAC1B,QACAC,iCAAAA,sBACD;AAED,UAAO,gBACL,GAAG,sBAAsB,KAAK,iBAAiB;IAC7C,SAAS;IACT;IACD,EAAE,CACJ;KAEH;GAGE,SAAS;GACT,eAAe,IAAIJ,UAAAA,iBACjBC,UAAAA,cAAc,oBACd,iEACD;GACF,CACF;AAED,MAAI,yBAAyB,WAAW,EACtC,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,8CACD;AAGH,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,MAAM,oBAAA,GAAA,YAAA,sBAAwC;AAO9C,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,oBANc,yBAAyB,KAAK,WACvD,iBAAiB,OAAO,OAAO,kBAAkB,CAKpB,EAAE;GAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaWaitForTransactionTask.js","names":["BaseStepExecutionTask","shouldUseJitoBundle","SolanaJitoWaitForTransactionTask","SolanaStandardWaitForTransactionTask"],"sources":["../../../../src/core/tasks/SolanaWaitForTransactionTask.ts"],"sourcesContent":["import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { shouldUseJitoBundle } from '../../utils/shouldUseJitoBundle.js'\nimport { SolanaJitoWaitForTransactionTask } from './SolanaJitoWaitForTransactionTask.js'\nimport { SolanaStandardWaitForTransactionTask } from './SolanaStandardWaitForTransactionTask.js'\n\nexport class SolanaWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const { client, signedTransactions: contextSignedTransactions } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const useJitoBundle = shouldUseJitoBundle(\n client.config.routeOptions,\n signedTransactions\n )\n\n if (useJitoBundle) {\n return new SolanaJitoWaitForTransactionTask().run(context)\n }\n return new SolanaStandardWaitForTransactionTask().run(context)\n }\n}\n"],"mappings":";;;;;;AAMA,IAAa,+BAAb,cAAkDA,UAAAA,sBAAsB;CACtE,MAAM,IAAI,SAAyD;EACjE,MAAM,EAAE,QAAQ,oBAAoB,8BAA8B;EAElE,MAAM,qBAAqB,6BAA6B,EAAE;AAO1D,MALsBC,kCAAAA,oBACpB,OAAO,OAAO,cACd,mBACD,CAGC,QAAO,IAAIC,oDAAAA,kCAAkC,CAAC,IAAI,QAAQ;AAE5D,SAAO,IAAIC,wDAAAA,sCAAsC,CAAC,IAAI,QAAQ"}
1
+ {"version":3,"file":"SolanaWaitForTransactionTask.js","names":["BaseStepExecutionTask","shouldUseJitoBundle","SolanaJitoWaitForTransactionTask","SolanaStandardWaitForTransactionTask"],"sources":["../../../../src/core/tasks/SolanaWaitForTransactionTask.ts"],"sourcesContent":["import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { shouldUseJitoBundle } from '../../utils/shouldUseJitoBundle.js'\nimport { SolanaJitoWaitForTransactionTask } from './SolanaJitoWaitForTransactionTask.js'\nimport { SolanaStandardWaitForTransactionTask } from './SolanaStandardWaitForTransactionTask.js'\n\nexport class SolanaWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const { client, signedTransactions: contextSignedTransactions } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const useJitoBundle = shouldUseJitoBundle(\n client.config.routeOptions,\n signedTransactions\n )\n\n if (useJitoBundle) {\n return new SolanaJitoWaitForTransactionTask().run(context)\n }\n return new SolanaStandardWaitForTransactionTask().run(context)\n }\n}\n"],"mappings":";;;;;;AAMA,IAAa,+BAAb,cAAkDA,UAAAA,sBAAsB;CACtE,MAAM,IAAI,SAAyD;EACjE,MAAM,EAAE,QAAQ,oBAAoB,8BAA8B;EAElE,MAAM,qBAAqB,6BAA6B,EAAE;AAO1D,MALsBC,kCAAAA,oBACpB,OAAO,OAAO,cACd,mBAGe,CACf,QAAO,IAAIC,oDAAAA,kCAAkC,CAAC,IAAI,QAAQ;AAE5D,SAAO,IAAIC,wDAAAA,sCAAsC,CAAC,IAAI,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseSolanaErrors.js","names":["SDKError","TransactionError","LiFiErrorCode","BaseError","UnknownError","ErrorMessage"],"sources":["../../../src/errors/parseSolanaErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\n\nexport const parseSolanaErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: any) => {\n if (e.name === 'WalletSignTransactionError') {\n return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)\n }\n\n if (e.name === 'SendTransactionError') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, e.message, e)\n }\n\n if (e.name === 'TransactionExpiredBlockheightExceededError') {\n return new TransactionError(LiFiErrorCode.TransactionExpired, e.message, e)\n }\n\n if (e.message?.includes('simulate')) {\n return new TransactionError(\n LiFiErrorCode.TransactionSimulationFailed,\n e.message,\n e\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(e.message || ErrorMessage.UnknownError, e)\n}\n"],"mappings":";;;AAWA,MAAa,oBAAoB,OAC/B,GACA,MACA,WACsB;AACtB,KAAI,aAAaA,UAAAA,UAAU;AACzB,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAIA,UAAAA,SAFO,qBAAqB,EAAE,EAEV,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAAW;AACvC,KAAI,EAAE,SAAS,6BACb,QAAO,IAAIC,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,uBACb,QAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,6CACb,QAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,oBAAoB,EAAE,SAAS,EAAE;AAG7E,KAAI,EAAE,SAAS,SAAS,WAAW,CACjC,QAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,6BACd,EAAE,SACF,EACD;AAGH,KAAI,aAAaC,UAAAA,UACf,QAAO;AAGT,QAAO,IAAIC,UAAAA,aAAa,EAAE,WAAWC,UAAAA,aAAa,cAAc,EAAE"}
1
+ {"version":3,"file":"parseSolanaErrors.js","names":["SDKError","TransactionError","LiFiErrorCode","BaseError","UnknownError","ErrorMessage"],"sources":["../../../src/errors/parseSolanaErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\n\nexport const parseSolanaErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: any) => {\n if (e.name === 'WalletSignTransactionError') {\n return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)\n }\n\n if (e.name === 'SendTransactionError') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, e.message, e)\n }\n\n if (e.name === 'TransactionExpiredBlockheightExceededError') {\n return new TransactionError(LiFiErrorCode.TransactionExpired, e.message, e)\n }\n\n if (e.message?.includes('simulate')) {\n return new TransactionError(\n LiFiErrorCode.TransactionSimulationFailed,\n e.message,\n e\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(e.message || ErrorMessage.UnknownError, e)\n}\n"],"mappings":";;;AAWA,MAAa,oBAAoB,OAC/B,GACA,MACA,WACsB;AACtB,KAAI,aAAaA,UAAAA,UAAU;AACzB,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAIA,UAAAA,SAFO,qBAAqB,EAEV,EAAE,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAAW;AACvC,KAAI,EAAE,SAAS,6BACb,QAAO,IAAIC,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,uBACb,QAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,6CACb,QAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,oBAAoB,EAAE,SAAS,EAAE;AAG7E,KAAI,EAAE,SAAS,SAAS,WAAW,CACjC,QAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,6BACd,EAAE,SACF,EACD;AAGH,KAAI,aAAaC,UAAAA,UACf,QAAO;AAGT,QAAO,IAAIC,UAAAA,aAAa,EAAE,WAAWC,UAAAA,aAAa,cAAc,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":["LruMap","createJitoRpc","ChainId"],"sources":["../../../src/rpc/registry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { createSolanaRpc } from '@solana/kit'\nimport { createJitoRpc } from './jito/createJitoRpc.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\nconst solanaRpcs = new LruMap<SolanaRpcType>(12)\nconst jitoRpcs = new LruMap<JitoRpcType>(12)\n\n/**\n * Checks if an RPC URL supports Jito methods by calling getTipAccounts.\n */\nexport const isJitoRpc = async (rpcUrl: string): Promise<boolean> => {\n try {\n const rpc = createJitoRpc(rpcUrl)\n await rpc.getTipAccounts().send()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Initializes Solana RPCs for all available RPC URLs if they haven't been cached yet.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureSolanaRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!solanaRpcs.has(rpcUrl)) {\n solanaRpcs.set(rpcUrl, createSolanaRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Detects and caches Jito-capable RPCs by checking if they support the getTipAccounts method.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureJitoRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!jitoRpcs.has(rpcUrl) && (await isJitoRpc(rpcUrl))) {\n jitoRpcs.set(rpcUrl, createJitoRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Wrapper around getting the Solana RPCs\n * @returns - Solana RPCs\n */\nexport const getSolanaRpcs = async (\n client: SDKClient\n): Promise<SolanaRpcType[]> => {\n await ensureSolanaRpcs(client)\n return Array.from(solanaRpcs.values())\n}\n\n/**\n * Wrapper around getting the Jito RPCs\n * @returns - Jito RPCs\n */\nexport const getJitoRpcs = async (\n client: SDKClient\n): Promise<JitoRpcType[]> => {\n await ensureJitoRpcs(client)\n return Array.from(jitoRpcs.values())\n}\n"],"mappings":";;;;;AAKA,MAAM,aAAa,IAAIA,UAAAA,OAAsB,GAAG;AAChD,MAAM,WAAW,IAAIA,UAAAA,OAAoB,GAAG;;;;AAK5C,MAAa,YAAY,OAAO,WAAqC;AACnE,KAAI;AAEF,QADYC,+BAAAA,cAAc,OAAO,CACvB,gBAAgB,CAAC,MAAM;AACjC,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,MAAM,mBAAmB,OAAO,WAAqC;CACnE,MAAM,UAAU,MAAM,OAAO,oBAAoBC,UAAAA,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,WAAW,IAAI,OAAO,CACzB,YAAW,IAAI,SAAA,GAAA,YAAA,iBAAwB,OAAO,CAAC;;;;;;AASrD,MAAM,iBAAiB,OAAO,WAAqC;CACjE,MAAM,UAAU,MAAM,OAAO,oBAAoBA,UAAAA,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,SAAS,IAAI,OAAO,IAAK,MAAM,UAAU,OAAO,CACnD,UAAS,IAAI,QAAQD,+BAAAA,cAAc,OAAO,CAAC;;;;;;AASjD,MAAa,gBAAgB,OAC3B,WAC6B;AAC7B,OAAM,iBAAiB,OAAO;AAC9B,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC;;;;;;AAOxC,MAAa,cAAc,OACzB,WAC2B;AAC3B,OAAM,eAAe,OAAO;AAC5B,QAAO,MAAM,KAAK,SAAS,QAAQ,CAAC"}
1
+ {"version":3,"file":"registry.js","names":["LruMap","createJitoRpc","ChainId"],"sources":["../../../src/rpc/registry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { createSolanaRpc } from '@solana/kit'\nimport { createJitoRpc } from './jito/createJitoRpc.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\nconst solanaRpcs = new LruMap<SolanaRpcType>(12)\nconst jitoRpcs = new LruMap<JitoRpcType>(12)\n\n/**\n * Checks if an RPC URL supports Jito methods by calling getTipAccounts.\n */\nexport const isJitoRpc = async (rpcUrl: string): Promise<boolean> => {\n try {\n const rpc = createJitoRpc(rpcUrl)\n await rpc.getTipAccounts().send()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Initializes Solana RPCs for all available RPC URLs if they haven't been cached yet.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureSolanaRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!solanaRpcs.has(rpcUrl)) {\n solanaRpcs.set(rpcUrl, createSolanaRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Detects and caches Jito-capable RPCs by checking if they support the getTipAccounts method.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureJitoRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!jitoRpcs.has(rpcUrl) && (await isJitoRpc(rpcUrl))) {\n jitoRpcs.set(rpcUrl, createJitoRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Wrapper around getting the Solana RPCs\n * @returns - Solana RPCs\n */\nexport const getSolanaRpcs = async (\n client: SDKClient\n): Promise<SolanaRpcType[]> => {\n await ensureSolanaRpcs(client)\n return Array.from(solanaRpcs.values())\n}\n\n/**\n * Wrapper around getting the Jito RPCs\n * @returns - Jito RPCs\n */\nexport const getJitoRpcs = async (\n client: SDKClient\n): Promise<JitoRpcType[]> => {\n await ensureJitoRpcs(client)\n return Array.from(jitoRpcs.values())\n}\n"],"mappings":";;;;;AAKA,MAAM,aAAa,IAAIA,UAAAA,OAAsB,GAAG;AAChD,MAAM,WAAW,IAAIA,UAAAA,OAAoB,GAAG;;;;AAK5C,MAAa,YAAY,OAAO,WAAqC;AACnE,KAAI;AAEF,QADYC,+BAAAA,cAAc,OACjB,CAAC,gBAAgB,CAAC,MAAM;AACjC,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,MAAM,mBAAmB,OAAO,WAAqC;CACnE,MAAM,UAAU,MAAM,OAAO,oBAAoBC,UAAAA,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,WAAW,IAAI,OAAO,CACzB,YAAW,IAAI,SAAA,GAAA,YAAA,iBAAwB,OAAO,CAAC;;;;;;AASrD,MAAM,iBAAiB,OAAO,WAAqC;CACjE,MAAM,UAAU,MAAM,OAAO,oBAAoBA,UAAAA,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,SAAS,IAAI,OAAO,IAAK,MAAM,UAAU,OAAO,CACnD,UAAS,IAAI,QAAQD,+BAAAA,cAAc,OAAO,CAAC;;;;;;AASjD,MAAa,gBAAgB,OAC3B,WAC6B;AAC7B,OAAM,iBAAiB,OAAO;AAC9B,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC;;;;;;AAOxC,MAAa,cAAc,OACzB,WAC2B;AAC3B,OAAM,eAAe,OAAO;AAC5B,QAAO,MAAM,KAAK,SAAS,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["getSolanaRpcs","getJitoRpcs"],"sources":["../../../src/rpc/utils.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport { getJitoRpcs, getSolanaRpcs } from './registry.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\ntype RetryFn<Rpc> = <R>(\n client: SDKClient,\n fn: (rpc: Rpc) => Promise<R>\n) => Promise<R>\n\n/**\n * Calls a function on RPC instances with retry logic.\n * Tries each RPC in sequence until one succeeds.\n *\n * @typeParam T - The type of the RPC instance.\n * @typeParam R - The return type of the function.\n * @param rpcs - An array of RPC instances to try.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no RPCs are available.\n * @throws {AggregateError} If all RPCs fail, containing all individual errors.\n *\n * @example\n * ```ts\n * const rpcs = await getSolanaRpcs(client)\n * const result = await callWithRetry(rpcs, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport async function callWithRetry<T, R>(\n rpcs: T[],\n fn: (rpc: T) => Promise<R>\n): Promise<R> {\n if (rpcs.length === 0) {\n throw new Error('No RPCs available')\n }\n\n const errors: Error[] = []\n for (const rpc of rpcs) {\n try {\n return await fn(rpc)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${rpcs.length} RPCs failed`)\n}\n\n/**\n * Creates a retry function for a specific RPC type.\n * @internal\n */\nconst createRetryFn =\n <T>(getRpcs: (client: SDKClient) => Promise<T[]>) =>\n async <R>(client: SDKClient, fn: (rpc: T) => Promise<R>): Promise<R> => {\n const rpcs = await getRpcs(client)\n return callWithRetry(rpcs, fn)\n }\n\n/**\n * Calls a function on Solana RPC instances with retry logic.\n * Automatically fetches available Solana RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Solana RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const balance = await callSolanaRpcsWithRetry(client, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport const callSolanaRpcsWithRetry: RetryFn<SolanaRpcType> =\n createRetryFn(getSolanaRpcs)\n\n/**\n * Calls a function on Jito RPC instances with retry logic.\n * Automatically fetches available Jito RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Jito RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const tipAccounts = await callJitoRpcsWithRetry(client, (rpc) =>\n * rpc.getTipAccounts().send()\n * )\n * ```\n */\nexport const callJitoRpcsWithRetry: RetryFn<JitoRpcType> =\n createRetryFn(getJitoRpcs)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,cACpB,MACA,IACY;AACZ,KAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,oBAAoB;CAGtC,MAAM,SAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,KAAI;AACF,SAAO,MAAM,GAAG,IAAI;UACb,OAAO;AACd,SAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;AAI1E,OAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,cAAc;;;;;;AAOpE,MAAM,iBACA,YACJ,OAAU,QAAmB,OAA2C;AAEtE,QAAO,cADM,MAAM,QAAQ,OAAO,EACP,GAAG;;;;;;;;;;;;;;;;;;;;AAqBlC,MAAa,0BACX,cAAcA,qBAAAA,cAAc;;;;;;;;;;;;;;;;;;;AAoB9B,MAAa,wBACX,cAAcC,qBAAAA,YAAY"}
1
+ {"version":3,"file":"utils.js","names":["getSolanaRpcs","getJitoRpcs"],"sources":["../../../src/rpc/utils.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport { getJitoRpcs, getSolanaRpcs } from './registry.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\ntype RetryFn<Rpc> = <R>(\n client: SDKClient,\n fn: (rpc: Rpc) => Promise<R>\n) => Promise<R>\n\n/**\n * Calls a function on RPC instances with retry logic.\n * Tries each RPC in sequence until one succeeds.\n *\n * @typeParam T - The type of the RPC instance.\n * @typeParam R - The return type of the function.\n * @param rpcs - An array of RPC instances to try.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no RPCs are available.\n * @throws {AggregateError} If all RPCs fail, containing all individual errors.\n *\n * @example\n * ```ts\n * const rpcs = await getSolanaRpcs(client)\n * const result = await callWithRetry(rpcs, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport async function callWithRetry<T, R>(\n rpcs: T[],\n fn: (rpc: T) => Promise<R>\n): Promise<R> {\n if (rpcs.length === 0) {\n throw new Error('No RPCs available')\n }\n\n const errors: Error[] = []\n for (const rpc of rpcs) {\n try {\n return await fn(rpc)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${rpcs.length} RPCs failed`)\n}\n\n/**\n * Creates a retry function for a specific RPC type.\n * @internal\n */\nconst createRetryFn =\n <T>(getRpcs: (client: SDKClient) => Promise<T[]>) =>\n async <R>(client: SDKClient, fn: (rpc: T) => Promise<R>): Promise<R> => {\n const rpcs = await getRpcs(client)\n return callWithRetry(rpcs, fn)\n }\n\n/**\n * Calls a function on Solana RPC instances with retry logic.\n * Automatically fetches available Solana RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Solana RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const balance = await callSolanaRpcsWithRetry(client, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport const callSolanaRpcsWithRetry: RetryFn<SolanaRpcType> =\n createRetryFn(getSolanaRpcs)\n\n/**\n * Calls a function on Jito RPC instances with retry logic.\n * Automatically fetches available Jito RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Jito RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const tipAccounts = await callJitoRpcsWithRetry(client, (rpc) =>\n * rpc.getTipAccounts().send()\n * )\n * ```\n */\nexport const callJitoRpcsWithRetry: RetryFn<JitoRpcType> =\n createRetryFn(getJitoRpcs)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,cACpB,MACA,IACY;AACZ,KAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,oBAAoB;CAGtC,MAAM,SAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,KAAI;AACF,SAAO,MAAM,GAAG,IAAI;UACb,OAAO;AACd,SAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;AAI1E,OAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,cAAc;;;;;;AAOpE,MAAM,iBACA,YACJ,OAAU,QAAmB,OAA2C;AAEtE,QAAO,cAAc,MADF,QAAQ,OAAO,EACP,GAAG;;;;;;;;;;;;;;;;;;;;AAqBlC,MAAa,0BACX,cAAcA,qBAAAA,cAAc;;;;;;;;;;;;;;;;;;;AAoB9B,MAAa,wBACX,cAAcC,qBAAAA,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"KeypairWallet.unit.helpers.js","names":[],"sources":["../../../src/utils/KeypairWallet.unit.helpers.ts"],"sourcesContent":["import { getBase58Codec } from '@solana/kit'\n\nconst nativeCrypto = globalThis.crypto\n\n// Helper to generate a valid test keypair\nexport const generateTestKeypair = async (): Promise<{\n secretKey: string\n publicKey: Uint8Array\n}> => {\n if (!nativeCrypto?.subtle) {\n throw new Error('SubtleCrypto is not available in this environment')\n }\n\n const base58Codec = getBase58Codec()\n const keyPair = await nativeCrypto.subtle.generateKey(\n { name: 'Ed25519' },\n true,\n ['sign', 'verify']\n )\n\n const privateKeyPkcs8 = new Uint8Array(\n await nativeCrypto.subtle.exportKey('pkcs8', keyPair.privateKey)\n )\n const privateKeyBytes = privateKeyPkcs8.slice(-32)\n const publicKey = new Uint8Array(\n await nativeCrypto.subtle.exportKey('raw', keyPair.publicKey)\n )\n const secretKey = new Uint8Array([...privateKeyBytes, ...publicKey])\n\n return {\n secretKey: base58Codec.decode(secretKey),\n publicKey,\n }\n}\n"],"mappings":";;;AAEA,MAAM,eAAe,WAAW;AAGhC,MAAa,sBAAsB,YAG7B;AACJ,KAAI,CAAC,cAAc,OACjB,OAAM,IAAI,MAAM,oDAAoD;CAGtE,MAAM,eAAA,GAAA,YAAA,iBAA8B;CACpC,MAAM,UAAU,MAAM,aAAa,OAAO,YACxC,EAAE,MAAM,WAAW,EACnB,MACA,CAAC,QAAQ,SAAS,CACnB;CAKD,MAAM,kBAHkB,IAAI,WAC1B,MAAM,aAAa,OAAO,UAAU,SAAS,QAAQ,WAAW,CACjE,CACuC,MAAM,IAAI;CAClD,MAAM,YAAY,IAAI,WACpB,MAAM,aAAa,OAAO,UAAU,OAAO,QAAQ,UAAU,CAC9D;CACD,MAAM,YAAY,IAAI,WAAW,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEpE,QAAO;EACL,WAAW,YAAY,OAAO,UAAU;EACxC;EACD"}
1
+ {"version":3,"file":"KeypairWallet.unit.helpers.js","names":[],"sources":["../../../src/utils/KeypairWallet.unit.helpers.ts"],"sourcesContent":["import { getBase58Codec } from '@solana/kit'\n\nconst nativeCrypto = globalThis.crypto\n\n// Helper to generate a valid test keypair\nexport const generateTestKeypair = async (): Promise<{\n secretKey: string\n publicKey: Uint8Array\n}> => {\n if (!nativeCrypto?.subtle) {\n throw new Error('SubtleCrypto is not available in this environment')\n }\n\n const base58Codec = getBase58Codec()\n const keyPair = await nativeCrypto.subtle.generateKey(\n { name: 'Ed25519' },\n true,\n ['sign', 'verify']\n )\n\n const privateKeyPkcs8 = new Uint8Array(\n await nativeCrypto.subtle.exportKey('pkcs8', keyPair.privateKey)\n )\n const privateKeyBytes = privateKeyPkcs8.slice(-32)\n const publicKey = new Uint8Array(\n await nativeCrypto.subtle.exportKey('raw', keyPair.publicKey)\n )\n const secretKey = new Uint8Array([...privateKeyBytes, ...publicKey])\n\n return {\n secretKey: base58Codec.decode(secretKey),\n publicKey,\n }\n}\n"],"mappings":";;;AAEA,MAAM,eAAe,WAAW;AAGhC,MAAa,sBAAsB,YAG7B;AACJ,KAAI,CAAC,cAAc,OACjB,OAAM,IAAI,MAAM,oDAAoD;CAGtE,MAAM,eAAA,GAAA,YAAA,iBAA8B;CACpC,MAAM,UAAU,MAAM,aAAa,OAAO,YACxC,EAAE,MAAM,WAAW,EACnB,MACA,CAAC,QAAQ,SAAS,CACnB;CAKD,MAAM,kBAAkB,IAHI,WAC1B,MAAM,aAAa,OAAO,UAAU,SAAS,QAAQ,WAAW,CAE3B,CAAC,MAAM,IAAI;CAClD,MAAM,YAAY,IAAI,WACpB,MAAM,aAAa,OAAO,UAAU,OAAO,QAAQ,UAAU,CAC9D;CACD,MAAM,YAAY,IAAI,WAAW,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEpE,QAAO;EACL,WAAW,YAAY,OAAO,UAAU;EACxC;EACD"}
@@ -1,6 +1,6 @@
1
1
  //#region src/version.d.ts
2
2
  declare const name = "@lifi/sdk-provider-solana";
3
- declare const version = "4.0.0-beta.6";
3
+ declare const version = "4.0.0-beta.8";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/version.ts
3
3
  const name = "@lifi/sdk-provider-solana";
4
- const version = "4.0.0-beta.6";
4
+ const version = "4.0.0-beta.8";
5
5
  //#endregion
6
6
  exports.name = name;
7
7
  exports.version = version;
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-solana'\nexport const version = '4.0.0-beta.6'\n"],"mappings":";;AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-solana'\nexport const version = '4.0.0-beta.8'\n"],"mappings":";;AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaProvider.js","names":[],"sources":["../../src/SolanaProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { isAddress } from '@solana/kit'\nimport { getSolanaBalance } from './actions/getSolanaBalance.js'\nimport { resolveSolanaAddress } from './actions/resolveSolanaAddress.js'\nimport { SolanaStepExecutor } from './core/SolanaStepExecutor.js'\nimport type { SolanaProviderOptions, SolanaSDKProvider } from './types.js'\n\nexport function SolanaProvider(\n options?: SolanaProviderOptions\n): SolanaSDKProvider {\n const _options: SolanaProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.SVM\n },\n isAddress,\n resolveAddress: resolveSolanaAddress,\n getBalance: getSolanaBalance,\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<SolanaStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ConfigError,\n 'SolanaProvider requires a getWallet function'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new SolanaStepExecutor({\n wallet,\n routeId: options.routeId,\n skipSimulation: _options.skipSimulation,\n executionOptions: {\n ...options.executionOptions,\n },\n })\n\n return executor\n },\n setOptions(options: SolanaProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;AAYA,SAAgB,eACd,SACmB;CACnB,MAAM,WAAkC,WAAW,EAAE;AACrD,QAAO;EACL,IAAI,OAAO;AACT,UAAO,UAAU;;EAEnB;EACA,gBAAgB;EAChB,YAAY;EACZ,MAAM,gBACJ,SAC6B;AAC7B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAI,cACR,cAAc,aACd,+CACD;AAcH,UATiB,IAAI,mBAAmB;IACtC,QAHa,MAAM,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,gBAAgB,SAAS;IACzB,kBAAkB,EAChB,GAAG,QAAQ,kBACZ;IACF,CAAC;;EAIJ,WAAW,SAAgC;AACzC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
1
+ {"version":3,"file":"SolanaProvider.js","names":[],"sources":["../../src/SolanaProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { isAddress } from '@solana/kit'\nimport { getSolanaBalance } from './actions/getSolanaBalance.js'\nimport { resolveSolanaAddress } from './actions/resolveSolanaAddress.js'\nimport { SolanaStepExecutor } from './core/SolanaStepExecutor.js'\nimport type { SolanaProviderOptions, SolanaSDKProvider } from './types.js'\n\nexport function SolanaProvider(\n options?: SolanaProviderOptions\n): SolanaSDKProvider {\n const _options: SolanaProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.SVM\n },\n isAddress,\n resolveAddress: resolveSolanaAddress,\n getBalance: getSolanaBalance,\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<SolanaStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ConfigError,\n 'SolanaProvider requires a getWallet function'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new SolanaStepExecutor({\n wallet,\n routeId: options.routeId,\n skipSimulation: _options.skipSimulation,\n executionOptions: {\n ...options.executionOptions,\n },\n })\n\n return executor\n },\n setOptions(options: SolanaProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;AAYA,SAAgB,eACd,SACmB;CACnB,MAAM,WAAkC,WAAW,EAAE;AACrD,QAAO;EACL,IAAI,OAAO;AACT,UAAO,UAAU;;EAEnB;EACA,gBAAgB;EAChB,YAAY;EACZ,MAAM,gBACJ,SAC6B;AAC7B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAI,cACR,cAAc,aACd,+CACD;AAcH,UAAO,IATc,mBAAmB;IACtC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,gBAAgB,SAAS;IACzB,kBAAkB,EAChB,GAAG,QAAQ,kBACZ;IACF,CAEc;;EAEjB,WAAW,SAAgC;AACzC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getSolanaBalance.js","names":[],"sources":["../../../src/actions/getSolanaBalance.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport {\n type ChainId,\n type Token,\n type TokenAmount,\n withDedupe,\n} from '@lifi/sdk'\nimport { address, type JsonParsedTokenAccount } from '@solana/kit'\n\nimport { callSolanaRpcsWithRetry } from '../rpc/utils.js'\n\nconst SolSystemProgram = '11111111111111111111111111111111'\nconst TokenProgramId = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst Token2022ProgramId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\n\nexport const getSolanaBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[]\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n return getSolanaBalanceDefault(client, chainId, tokens, walletAddress)\n}\n\nconst getSolanaBalanceDefault = async (\n client: SDKClient,\n _chainId: ChainId,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n // Convert addresses to Solana Kit's address type\n const accountAddress = address(walletAddress)\n const tokenProgramAddress = address(TokenProgramId)\n const token2022ProgramAddress = address(Token2022ProgramId)\n\n // Use Solana Kit's RPC API with the retry wrapper\n const [slot, balance, tokenAccountsByOwner, token2022AccountsByOwner] =\n await Promise.allSettled([\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getSlot({ commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getSlot` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getBalance(accountAddress, { commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getBalance` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: tokenProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${TokenProgramId}`,\n }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: token2022ProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${Token2022ProgramId}`,\n }\n ),\n ])\n const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n\n const nativeBalanceOk = balance.status === 'fulfilled'\n const solBalance = nativeBalanceOk ? BigInt(balance.value.value) : 0n\n const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled'\n const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled'\n\n const walletTokenAmounts = [\n ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),\n ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),\n ].reduce(\n (tokenAmounts: Record<string, bigint>, value) => {\n const tokenAccount: JsonParsedTokenAccount =\n value.account.data.parsed.info\n const amount = BigInt(tokenAccount.tokenAmount.amount)\n if (amount > 0n) {\n tokenAmounts[tokenAccount.mint] = amount\n }\n return tokenAmounts\n },\n {} as Record<string, bigint>\n )\n\n // We can only confidently report 0n for an SPL mint when both Token and\n // Token2022 program queries succeeded — otherwise the mint may live in the\n // program whose query failed (e.g. PYUSD on Token2022).\n const splZeroIsKnown = tokenProgramOk && token2022ProgramOk\n\n const tokenAmounts: TokenAmount[] = tokens.map((token) => {\n const isNative = token.address === SolSystemProgram\n if (isNative) {\n if (!nativeBalanceOk) {\n return { ...token, blockNumber }\n }\n return { ...token, amount: solBalance, blockNumber }\n }\n const found = walletTokenAmounts[token.address]\n if (found !== undefined) {\n return { ...token, amount: found, blockNumber }\n }\n if (splZeroIsKnown) {\n return { ...token, amount: 0n, blockNumber }\n }\n return { ...token, blockNumber }\n })\n return tokenAmounts\n}\n"],"mappings":";;;;AAWA,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAE3B,MAAa,mBAAmB,OAC9B,QACA,eACA,WAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;AAIlE,QAAO,wBAAwB,QAAQ,SAAS,QAAQ,cAAc;;AAGxE,MAAM,0BAA0B,OAC9B,QACA,UACA,QACA,kBAC2B;CAE3B,MAAM,iBAAiB,QAAQ,cAAc;CAC7C,MAAM,sBAAsB,QAAQ,eAAe;CACnD,MAAM,0BAA0B,QAAQ,mBAAmB;CAG3D,MAAM,CAAC,MAAM,SAAS,sBAAsB,4BAC1C,MAAM,QAAQ,WAAW;EACvB,iBAEI,wBAAwB,SAAS,QAC/B,IAAI,QAAQ,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CAChD,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,WAAW,CAClD;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IAAI,WAAW,gBAAgB,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CACnE,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,cAAc,CACrD;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,qBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,kBAChE,CACF;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,yBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,sBAChE,CACF;EACF,CAAC;CACJ,MAAM,cAAc,KAAK,WAAW,cAAc,OAAO,KAAK,MAAM,GAAG;CACvE,MAAM,kBAAkB,QAAQ,WAAW;CAC3C,MAAM,aAAa,kBAAkB,OAAO,QAAQ,MAAM,MAAM,GAAG;CACnE,MAAM,iBAAiB,qBAAqB,WAAW;CACvD,MAAM,qBAAqB,yBAAyB,WAAW;CAE/D,MAAM,qBAAqB,CACzB,GAAI,iBAAiB,qBAAqB,MAAM,QAAQ,EAAE,EAC1D,GAAI,qBAAqB,yBAAyB,MAAM,QAAQ,EAAE,CACnE,CAAC,QACC,cAAsC,UAAU;EAC/C,MAAM,eACJ,MAAM,QAAQ,KAAK,OAAO;EAC5B,MAAM,SAAS,OAAO,aAAa,YAAY,OAAO;AACtD,MAAI,SAAS,GACX,cAAa,aAAa,QAAQ;AAEpC,SAAO;IAET,EAAE,CACH;CAKD,MAAM,iBAAiB,kBAAkB;AAmBzC,QAjBoC,OAAO,KAAK,UAAU;AAExD,MADiB,MAAM,YAAY,kBACrB;AACZ,OAAI,CAAC,gBACH,QAAO;IAAE,GAAG;IAAO;IAAa;AAElC,UAAO;IAAE,GAAG;IAAO,QAAQ;IAAY;IAAa;;EAEtD,MAAM,QAAQ,mBAAmB,MAAM;AACvC,MAAI,UAAU,KAAA,EACZ,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAO;GAAa;AAEjD,MAAI,eACF,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAI;GAAa;AAE9C,SAAO;GAAE,GAAG;GAAO;GAAa;GAChC"}
1
+ {"version":3,"file":"getSolanaBalance.js","names":[],"sources":["../../../src/actions/getSolanaBalance.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport {\n type ChainId,\n type Token,\n type TokenAmount,\n withDedupe,\n} from '@lifi/sdk'\nimport { address, type JsonParsedTokenAccount } from '@solana/kit'\n\nimport { callSolanaRpcsWithRetry } from '../rpc/utils.js'\n\nconst SolSystemProgram = '11111111111111111111111111111111'\nconst TokenProgramId = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst Token2022ProgramId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\n\nexport const getSolanaBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[]\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n return getSolanaBalanceDefault(client, chainId, tokens, walletAddress)\n}\n\nconst getSolanaBalanceDefault = async (\n client: SDKClient,\n _chainId: ChainId,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n // Convert addresses to Solana Kit's address type\n const accountAddress = address(walletAddress)\n const tokenProgramAddress = address(TokenProgramId)\n const token2022ProgramAddress = address(Token2022ProgramId)\n\n // Use Solana Kit's RPC API with the retry wrapper\n const [slot, balance, tokenAccountsByOwner, token2022AccountsByOwner] =\n await Promise.allSettled([\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getSlot({ commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getSlot` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc.getBalance(accountAddress, { commitment: 'confirmed' }).send()\n ),\n { id: `${getSolanaBalanceDefault.name}.getBalance` }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: tokenProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${TokenProgramId}`,\n }\n ),\n withDedupe(\n () =>\n callSolanaRpcsWithRetry(client, (rpc) =>\n rpc\n .getTokenAccountsByOwner(\n accountAddress,\n {\n programId: token2022ProgramAddress,\n },\n {\n commitment: 'confirmed',\n encoding: 'jsonParsed',\n }\n )\n .send()\n ),\n {\n id: `${getSolanaBalanceDefault.name}.getTokenAccountsByOwner.${Token2022ProgramId}`,\n }\n ),\n ])\n const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n\n const nativeBalanceOk = balance.status === 'fulfilled'\n const solBalance = nativeBalanceOk ? BigInt(balance.value.value) : 0n\n const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled'\n const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled'\n\n const walletTokenAmounts = [\n ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),\n ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),\n ].reduce(\n (tokenAmounts: Record<string, bigint>, value) => {\n const tokenAccount: JsonParsedTokenAccount =\n value.account.data.parsed.info\n const amount = BigInt(tokenAccount.tokenAmount.amount)\n if (amount > 0n) {\n tokenAmounts[tokenAccount.mint] = amount\n }\n return tokenAmounts\n },\n {} as Record<string, bigint>\n )\n\n // We can only confidently report 0n for an SPL mint when both Token and\n // Token2022 program queries succeeded — otherwise the mint may live in the\n // program whose query failed (e.g. PYUSD on Token2022).\n const splZeroIsKnown = tokenProgramOk && token2022ProgramOk\n\n const tokenAmounts: TokenAmount[] = tokens.map((token) => {\n const isNative = token.address === SolSystemProgram\n if (isNative) {\n if (!nativeBalanceOk) {\n return { ...token, blockNumber }\n }\n return { ...token, amount: solBalance, blockNumber }\n }\n const found = walletTokenAmounts[token.address]\n if (found !== undefined) {\n return { ...token, amount: found, blockNumber }\n }\n if (splZeroIsKnown) {\n return { ...token, amount: 0n, blockNumber }\n }\n return { ...token, blockNumber }\n })\n return tokenAmounts\n}\n"],"mappings":";;;;AAWA,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAE3B,MAAa,mBAAmB,OAC9B,QACA,eACA,WAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;AAIlE,QAAO,wBAAwB,QAAQ,SAAS,QAAQ,cAAc;;AAGxE,MAAM,0BAA0B,OAC9B,QACA,UACA,QACA,kBAC2B;CAE3B,MAAM,iBAAiB,QAAQ,cAAc;CAC7C,MAAM,sBAAsB,QAAQ,eAAe;CACnD,MAAM,0BAA0B,QAAQ,mBAAmB;CAG3D,MAAM,CAAC,MAAM,SAAS,sBAAsB,4BAC1C,MAAM,QAAQ,WAAW;EACvB,iBAEI,wBAAwB,SAAS,QAC/B,IAAI,QAAQ,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CAChD,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,WAAW,CAClD;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IAAI,WAAW,gBAAgB,EAAE,YAAY,aAAa,CAAC,CAAC,MAAM,CACnE,EACH,EAAE,IAAI,GAAG,wBAAwB,KAAK,cAAc,CACrD;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,qBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,kBAChE,CACF;EACD,iBAEI,wBAAwB,SAAS,QAC/B,IACG,wBACC,gBACA,EACE,WAAW,yBACZ,EACD;GACE,YAAY;GACZ,UAAU;GACX,CACF,CACA,MAAM,CACV,EACH,EACE,IAAI,GAAG,wBAAwB,KAAK,2BAA2B,sBAChE,CACF;EACF,CAAC;CACJ,MAAM,cAAc,KAAK,WAAW,cAAc,OAAO,KAAK,MAAM,GAAG;CACvE,MAAM,kBAAkB,QAAQ,WAAW;CAC3C,MAAM,aAAa,kBAAkB,OAAO,QAAQ,MAAM,MAAM,GAAG;CACnE,MAAM,iBAAiB,qBAAqB,WAAW;CACvD,MAAM,qBAAqB,yBAAyB,WAAW;CAE/D,MAAM,qBAAqB,CACzB,GAAI,iBAAiB,qBAAqB,MAAM,QAAQ,EAAE,EAC1D,GAAI,qBAAqB,yBAAyB,MAAM,QAAQ,EAAE,CACnE,CAAC,QACC,cAAsC,UAAU;EAC/C,MAAM,eACJ,MAAM,QAAQ,KAAK,OAAO;EAC5B,MAAM,SAAS,OAAO,aAAa,YAAY,OAAO;AACtD,MAAI,SAAS,GACX,cAAa,aAAa,QAAQ;AAEpC,SAAO;IAET,EAAE,CACH;CAKD,MAAM,iBAAiB,kBAAkB;AAmBzC,QAjBoC,OAAO,KAAK,UAAU;AAExD,MADiB,MAAM,YAAY,kBACrB;AACZ,OAAI,CAAC,gBACH,QAAO;IAAE,GAAG;IAAO;IAAa;AAElC,UAAO;IAAE,GAAG;IAAO,QAAQ;IAAY;IAAa;;EAEtD,MAAM,QAAQ,mBAAmB,MAAM;AACvC,MAAI,UAAU,KAAA,EACZ,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAO;GAAa;AAEjD,MAAI,eACF,QAAO;GAAE,GAAG;GAAO,QAAQ;GAAI;GAAa;AAE9C,SAAO;GAAE,GAAG;GAAO;GAAa;GAEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmBundle.js","names":[],"sources":["../../../src/actions/sendAndConfirmBundle.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n type Signature,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\n\nimport { getJitoRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\nexport type BundleResult = {\n bundleId: string\n txSignatures: Signature[]\n signatureResults: (SignatureStatus | null)[]\n}\n\n/**\n * Send and confirm a bundle of transactions using Jito.\n * Automatically selects a Jito-enabled RPC connection and polls for confirmation\n * across multiple Jito RPCs in parallel.\n * @param client - The SDK client.\n * @param signedTransactions - Array of signed transactions to bundle.\n * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.\n */\nexport async function sendAndConfirmBundle(\n client: SDKClient,\n signedTransactions: Transaction[]\n): Promise<BundleResult> {\n const jitoRpcs = await getJitoRpcs(client)\n\n if (jitoRpcs.length === 0) {\n throw new Error(\n 'No Jito-enabled RPC connection available for bundle submission'\n )\n }\n\n // Serialize transactions to base64\n const serializedTransactions = signedTransactions.map((tx) =>\n getBase64EncodedWireTransaction(tx)\n )\n\n const abortController = new AbortController()\n\n const confirmPromises = jitoRpcs.map(async (jitoRpc) => {\n try {\n // Send bundle to Jito\n let bundleId: string\n try {\n bundleId = await jitoRpc.sendBundle(serializedTransactions).send()\n } catch (_) {\n return null\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n jitoRpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let currentBlockHeight = initialBlockHeight\n\n while (\n currentBlockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await jitoRpc\n .getBundleStatuses([bundleId])\n .send()\n\n const bundleStatus = statusResponse.value[0]\n\n // Check if bundle is confirmed or finalized\n if (\n bundleStatus &&\n (bundleStatus.confirmation_status === 'confirmed' ||\n bundleStatus.confirmation_status === 'finalized')\n ) {\n // Bundle confirmed! Extract transaction signatures from bundle status\n const txSignatures = bundleStatus.transactions\n\n // Fetch individual signature results from Jito RPC\n const sigResponse = await jitoRpc\n .getSignatureStatuses(txSignatures)\n .send()\n\n if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {\n // Keep polling if can't find signature results\n await sleep(400)\n continue\n }\n\n // Immediately abort all other connections when we find a result\n abortController.abort()\n return {\n bundleId,\n txSignatures,\n signatureResults: sigResponse.value,\n }\n }\n\n await sleep(400)\n if (!abortController.signal.aborted) {\n currentBlockHeight = await jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n\n return null\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n // Wait for first successful confirmation\n const result = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n if (!result) {\n throw new Error('Failed to send and confirm bundle')\n }\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;AAiCA,eAAsB,qBACpB,QACA,oBACuB;CACvB,MAAM,WAAW,MAAM,YAAY,OAAO;AAE1C,KAAI,SAAS,WAAW,EACtB,OAAM,IAAI,MACR,iEACD;CAIH,MAAM,yBAAyB,mBAAmB,KAAK,OACrD,gCAAgC,GAAG,CACpC;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,SAAS,IAAI,OAAO,YAAY;AACtD,MAAI;GAEF,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,QAAQ,WAAW,uBAAuB,CAAC,MAAM;YAC3D,GAAG;AACV,WAAO;;GAGT,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,QACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,QACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,qBAAqB;AAEzB,UACE,qBAAqB,gBAAgB,wBACrC,CAAC,gBAAgB,OAAO,SACxB;IAKA,MAAM,gBAJiB,MAAM,QAC1B,kBAAkB,CAAC,SAAS,CAAC,CAC7B,MAAM,EAE2B,MAAM;AAG1C,QACE,iBACC,aAAa,wBAAwB,eACpC,aAAa,wBAAwB,cACvC;KAEA,MAAM,eAAe,aAAa;KAGlC,MAAM,cAAc,MAAM,QACvB,qBAAqB,aAAa,CAClC,MAAM;AAET,SAAI,CAAC,aAAa,SAAS,CAAC,MAAM,QAAQ,YAAY,MAAM,EAAE;AAE5D,YAAM,MAAM,IAAI;AAChB;;AAIF,qBAAgB,OAAO;AACvB,YAAO;MACL;MACA;MACA,kBAAkB,YAAY;MAC/B;;AAGH,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,gBAAgB,OAAO,QAC1B,sBAAqB,MAAM,QACxB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAIb,UAAO;WACA,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAGF,MAAM,SAAS,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAEnE,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAO"}
1
+ {"version":3,"file":"sendAndConfirmBundle.js","names":[],"sources":["../../../src/actions/sendAndConfirmBundle.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n type Signature,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\n\nimport { getJitoRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\nexport type BundleResult = {\n bundleId: string\n txSignatures: Signature[]\n signatureResults: (SignatureStatus | null)[]\n}\n\n/**\n * Send and confirm a bundle of transactions using Jito.\n * Automatically selects a Jito-enabled RPC connection and polls for confirmation\n * across multiple Jito RPCs in parallel.\n * @param client - The SDK client.\n * @param signedTransactions - Array of signed transactions to bundle.\n * @returns BundleResult containing Bundle ID, transaction signatures, and confirmation results.\n */\nexport async function sendAndConfirmBundle(\n client: SDKClient,\n signedTransactions: Transaction[]\n): Promise<BundleResult> {\n const jitoRpcs = await getJitoRpcs(client)\n\n if (jitoRpcs.length === 0) {\n throw new Error(\n 'No Jito-enabled RPC connection available for bundle submission'\n )\n }\n\n // Serialize transactions to base64\n const serializedTransactions = signedTransactions.map((tx) =>\n getBase64EncodedWireTransaction(tx)\n )\n\n const abortController = new AbortController()\n\n const confirmPromises = jitoRpcs.map(async (jitoRpc) => {\n try {\n // Send bundle to Jito\n let bundleId: string\n try {\n bundleId = await jitoRpc.sendBundle(serializedTransactions).send()\n } catch (_) {\n return null\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n jitoRpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let currentBlockHeight = initialBlockHeight\n\n while (\n currentBlockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await jitoRpc\n .getBundleStatuses([bundleId])\n .send()\n\n const bundleStatus = statusResponse.value[0]\n\n // Check if bundle is confirmed or finalized\n if (\n bundleStatus &&\n (bundleStatus.confirmation_status === 'confirmed' ||\n bundleStatus.confirmation_status === 'finalized')\n ) {\n // Bundle confirmed! Extract transaction signatures from bundle status\n const txSignatures = bundleStatus.transactions\n\n // Fetch individual signature results from Jito RPC\n const sigResponse = await jitoRpc\n .getSignatureStatuses(txSignatures)\n .send()\n\n if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {\n // Keep polling if can't find signature results\n await sleep(400)\n continue\n }\n\n // Immediately abort all other connections when we find a result\n abortController.abort()\n return {\n bundleId,\n txSignatures,\n signatureResults: sigResponse.value,\n }\n }\n\n await sleep(400)\n if (!abortController.signal.aborted) {\n currentBlockHeight = await jitoRpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n\n return null\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n // Wait for first successful confirmation\n const result = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n if (!result) {\n throw new Error('Failed to send and confirm bundle')\n }\n\n return result\n}\n"],"mappings":";;;;;;;;;;;;AAiCA,eAAsB,qBACpB,QACA,oBACuB;CACvB,MAAM,WAAW,MAAM,YAAY,OAAO;AAE1C,KAAI,SAAS,WAAW,EACtB,OAAM,IAAI,MACR,iEACD;CAIH,MAAM,yBAAyB,mBAAmB,KAAK,OACrD,gCAAgC,GAAG,CACpC;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,SAAS,IAAI,OAAO,YAAY;AACtD,MAAI;GAEF,IAAI;AACJ,OAAI;AACF,eAAW,MAAM,QAAQ,WAAW,uBAAuB,CAAC,MAAM;YAC3D,GAAG;AACV,WAAO;;GAGT,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,QACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,QACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,qBAAqB;AAEzB,UACE,qBAAqB,gBAAgB,wBACrC,CAAC,gBAAgB,OAAO,SACxB;IAKA,MAAM,gBAAe,MAJQ,QAC1B,kBAAkB,CAAC,SAAS,CAAC,CAC7B,MAAM,EAE2B,MAAM;AAG1C,QACE,iBACC,aAAa,wBAAwB,eACpC,aAAa,wBAAwB,cACvC;KAEA,MAAM,eAAe,aAAa;KAGlC,MAAM,cAAc,MAAM,QACvB,qBAAqB,aAAa,CAClC,MAAM;AAET,SAAI,CAAC,aAAa,SAAS,CAAC,MAAM,QAAQ,YAAY,MAAM,EAAE;AAE5D,YAAM,MAAM,IAAI;AAChB;;AAIF,qBAAgB,OAAO;AACvB,YAAO;MACL;MACA;MACA,kBAAkB,YAAY;MAC/B;;AAGH,UAAM,MAAM,IAAI;AAChB,QAAI,CAAC,gBAAgB,OAAO,QAC1B,sBAAqB,MAAM,QACxB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAIb,UAAO;WACA,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAGF,MAAM,SAAS,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAEnE,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendAndConfirmTransaction.js","names":[],"sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\nimport { getSolanaRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\ntype ConfirmedTransactionResult = {\n signatureResult: SignatureStatus | null\n txSignature: string\n}\n\n/**\n * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation\n * as soon as any of them confirm the transaction.\n * @param client - The SDK client.\n * @param signedTransaction - The signed transaction to send.\n * @returns - The confirmation result of the transaction.\n */\nexport async function sendAndConfirmTransaction(\n client: SDKClient,\n signedTransaction: Transaction\n): Promise<ConfirmedTransactionResult> {\n const solanaRpcs = await getSolanaRpcs(client)\n\n const signedTxSerialized = getBase64EncodedWireTransaction(signedTransaction)\n // Create transaction hash (signature)\n const txSignature = getSignatureFromTransaction(signedTransaction)\n\n if (!txSignature) {\n throw new Error('Transaction signature is missing.')\n }\n\n const rawTransactionOptions = {\n // We can skip preflight check after the first transaction has been sent\n // https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight\n skipPreflight: true,\n // Setting max retries to 0 as we are handling retries manually\n maxRetries: BigInt(0),\n // https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level\n preflightCommitment: 'confirmed' as Commitment,\n encoding: 'base64' as const,\n }\n\n const abortController = new AbortController()\n\n const confirmPromises = solanaRpcs.map(async (rpc) => {\n try {\n // Send initial transaction for this RPC\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue with confirmation even if initial send fails\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n rpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let signatureResult: SignatureStatus | null = null\n let blockHeight = initialBlockHeight\n const pollingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await rpc\n .getSignatureStatuses([txSignature])\n .send()\n\n const status = statusResponse.value[0]\n if (\n status &&\n (status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized')\n ) {\n signatureResult = status\n // Immediately abort all other RPCs when we find a result\n abortController.abort()\n return status\n }\n\n await sleep(400)\n }\n return null\n })()\n\n const sendingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted &&\n !signatureResult\n ) {\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue trying even if individual sends fail\n }\n\n await sleep(1000)\n if (!abortController.signal.aborted) {\n blockHeight = await rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n return null\n })()\n\n // Wait for polling to find the result\n const result = await Promise.race([pollingPromise, sendingPromise])\n return result\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n const signatureResult = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n return { signatureResult, txSignature }\n}\n"],"mappings":";;;;;;;;;;;AA8BA,eAAsB,0BACpB,QACA,mBACqC;CACrC,MAAM,aAAa,MAAM,cAAc,OAAO;CAE9C,MAAM,qBAAqB,gCAAgC,kBAAkB;CAE7E,MAAM,cAAc,4BAA4B,kBAAkB;AAElE,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,oCAAoC;CAGtD,MAAM,wBAAwB;EAG5B,eAAe;EAEf,YAAY,OAAO,EAAE;EAErB,qBAAqB;EACrB,UAAU;EACX;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,WAAW,IAAI,OAAO,QAAQ;AACpD,MAAI;AAEF,OAAI;AACF,UAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;YACF,GAAG;GAIZ,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,IACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,IACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,kBAA0C;GAC9C,IAAI,cAAc;GAClB,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,SACxB;KAKA,MAAM,UAJiB,MAAM,IAC1B,qBAAqB,CAAC,YAAY,CAAC,CACnC,MAAM,EAEqB,MAAM;AACpC,SACE,WACC,OAAO,uBAAuB,eAC7B,OAAO,uBAAuB,cAChC;AACA,wBAAkB;AAElB,sBAAgB,OAAO;AACvB,aAAO;;AAGT,WAAM,MAAM,IAAI;;AAElB,WAAO;OACL;GAEJ,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,WACxB,CAAC,iBACD;AACA,SAAI;AACF,YAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;cACF,GAAG;AAIZ,WAAM,MAAM,IAAK;AACjB,SAAI,CAAC,gBAAgB,OAAO,QAC1B,eAAc,MAAM,IACjB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAGb,WAAO;OACL;AAIJ,UADe,MAAM,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAAC;WAE5D,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAE5E,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,QAAO;EAAE;EAAiB;EAAa"}
1
+ {"version":3,"file":"sendAndConfirmTransaction.js","names":[],"sources":["../../../src/actions/sendAndConfirmTransaction.ts"],"sourcesContent":["import { type SDKClient, sleep } from '@lifi/sdk'\nimport {\n type Commitment,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n type Transaction,\n type TransactionError,\n} from '@solana/kit'\nimport { getSolanaRpcs } from '../rpc/registry.js'\n\ntype SignatureStatus = {\n slot: bigint\n confirmations: bigint | null\n err: TransactionError | null\n confirmationStatus: Commitment | null\n status: Readonly<{ Err: TransactionError }> | Readonly<{ Ok: null }>\n}\n\ntype ConfirmedTransactionResult = {\n signatureResult: SignatureStatus | null\n txSignature: string\n}\n\n/**\n * Sends a Solana transaction to multiple RPC endpoints and returns the confirmation\n * as soon as any of them confirm the transaction.\n * @param client - The SDK client.\n * @param signedTransaction - The signed transaction to send.\n * @returns - The confirmation result of the transaction.\n */\nexport async function sendAndConfirmTransaction(\n client: SDKClient,\n signedTransaction: Transaction\n): Promise<ConfirmedTransactionResult> {\n const solanaRpcs = await getSolanaRpcs(client)\n\n const signedTxSerialized = getBase64EncodedWireTransaction(signedTransaction)\n // Create transaction hash (signature)\n const txSignature = getSignatureFromTransaction(signedTransaction)\n\n if (!txSignature) {\n throw new Error('Transaction signature is missing.')\n }\n\n const rawTransactionOptions = {\n // We can skip preflight check after the first transaction has been sent\n // https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight\n skipPreflight: true,\n // Setting max retries to 0 as we are handling retries manually\n maxRetries: BigInt(0),\n // https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level\n preflightCommitment: 'confirmed' as Commitment,\n encoding: 'base64' as const,\n }\n\n const abortController = new AbortController()\n\n const confirmPromises = solanaRpcs.map(async (rpc) => {\n try {\n // Send initial transaction for this RPC\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue with confirmation even if initial send fails\n }\n\n const [{ value: blockhashResult }, initialBlockHeight] =\n await Promise.all([\n rpc\n .getLatestBlockhash({\n commitment: 'confirmed',\n })\n .send(),\n rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send(),\n ])\n\n let signatureResult: SignatureStatus | null = null\n let blockHeight = initialBlockHeight\n const pollingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted\n ) {\n const statusResponse = await rpc\n .getSignatureStatuses([txSignature])\n .send()\n\n const status = statusResponse.value[0]\n if (\n status &&\n (status.confirmationStatus === 'confirmed' ||\n status.confirmationStatus === 'finalized')\n ) {\n signatureResult = status\n // Immediately abort all other RPCs when we find a result\n abortController.abort()\n return status\n }\n\n await sleep(400)\n }\n return null\n })()\n\n const sendingPromise = (async () => {\n while (\n blockHeight < blockhashResult.lastValidBlockHeight &&\n !abortController.signal.aborted &&\n !signatureResult\n ) {\n try {\n await rpc\n .sendTransaction(signedTxSerialized, rawTransactionOptions)\n .send()\n } catch (_) {\n // Continue trying even if individual sends fail\n }\n\n await sleep(1000)\n if (!abortController.signal.aborted) {\n blockHeight = await rpc\n .getBlockHeight({\n commitment: 'confirmed',\n })\n .send()\n }\n }\n return null\n })()\n\n // Wait for polling to find the result\n const result = await Promise.race([pollingPromise, sendingPromise])\n return result\n } catch (error) {\n if (abortController.signal.aborted) {\n return null // Don't treat abortion as an error\n }\n throw error\n }\n })\n\n const signatureResult = await Promise.any(confirmPromises).catch(() => null)\n\n if (!abortController.signal.aborted) {\n abortController.abort()\n }\n\n return { signatureResult, txSignature }\n}\n"],"mappings":";;;;;;;;;;;AA8BA,eAAsB,0BACpB,QACA,mBACqC;CACrC,MAAM,aAAa,MAAM,cAAc,OAAO;CAE9C,MAAM,qBAAqB,gCAAgC,kBAAkB;CAE7E,MAAM,cAAc,4BAA4B,kBAAkB;AAElE,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,oCAAoC;CAGtD,MAAM,wBAAwB;EAG5B,eAAe;EAEf,YAAY,OAAO,EAAE;EAErB,qBAAqB;EACrB,UAAU;EACX;CAED,MAAM,kBAAkB,IAAI,iBAAiB;CAE7C,MAAM,kBAAkB,WAAW,IAAI,OAAO,QAAQ;AACpD,MAAI;AAEF,OAAI;AACF,UAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;YACF,GAAG;GAIZ,MAAM,CAAC,EAAE,OAAO,mBAAmB,sBACjC,MAAM,QAAQ,IAAI,CAChB,IACG,mBAAmB,EAClB,YAAY,aACb,CAAC,CACD,MAAM,EACT,IACG,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM,CACV,CAAC;GAEJ,IAAI,kBAA0C;GAC9C,IAAI,cAAc;GAClB,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,SACxB;KAKA,MAAM,UAAS,MAJc,IAC1B,qBAAqB,CAAC,YAAY,CAAC,CACnC,MAAM,EAEqB,MAAM;AACpC,SACE,WACC,OAAO,uBAAuB,eAC7B,OAAO,uBAAuB,cAChC;AACA,wBAAkB;AAElB,sBAAgB,OAAO;AACvB,aAAO;;AAGT,WAAM,MAAM,IAAI;;AAElB,WAAO;OACL;GAEJ,MAAM,kBAAkB,YAAY;AAClC,WACE,cAAc,gBAAgB,wBAC9B,CAAC,gBAAgB,OAAO,WACxB,CAAC,iBACD;AACA,SAAI;AACF,YAAM,IACH,gBAAgB,oBAAoB,sBAAsB,CAC1D,MAAM;cACF,GAAG;AAIZ,WAAM,MAAM,IAAK;AACjB,SAAI,CAAC,gBAAgB,OAAO,QAC1B,eAAc,MAAM,IACjB,eAAe,EACd,YAAY,aACb,CAAC,CACD,MAAM;;AAGb,WAAO;OACL;AAIJ,UAAO,MADc,QAAQ,KAAK,CAAC,gBAAgB,eAAe,CAAC;WAE5D,OAAO;AACd,OAAI,gBAAgB,OAAO,QACzB,QAAO;AAET,SAAM;;GAER;CAEF,MAAM,kBAAkB,MAAM,QAAQ,IAAI,gBAAgB,CAAC,YAAY,KAAK;AAE5E,KAAI,CAAC,gBAAgB,OAAO,QAC1B,iBAAgB,OAAO;AAGzB,QAAO;EAAE;EAAiB;EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaStepExecutor.js","names":[],"sources":["../../../src/core/SolanaStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Wallet, WalletAccount } from '@wallet-standard/base'\nimport { parseSolanaErrors } from '../errors/parseSolanaErrors.js'\nimport type {\n SolanaStepExecutorContext,\n SolanaStepExecutorOptions,\n} from '../types.js'\nimport { SolanaSignAndExecuteTask } from './tasks/SolanaSignAndExecuteTask.js'\nimport { SolanaWaitForTransactionTask } from './tasks/SolanaWaitForTransactionTask.js'\n\nexport class SolanaStepExecutor extends BaseStepExecutor {\n private wallet: Wallet\n private skipSimulation: boolean\n\n constructor(options: SolanaStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n this.skipSimulation = options.skipSimulation ?? false\n }\n\n getWalletAccount = (step: LiFiStepExtended): WalletAccount => {\n const account = this.wallet.accounts.find(\n (account) => account.address === step.action.fromAddress\n )\n\n if (!account) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n\n return account\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseSolanaErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<SolanaStepExecutorContext> => {\n const { step } = baseContext\n\n const walletAccount = this.getWalletAccount(step)\n\n return {\n ...baseContext,\n wallet: this.wallet,\n walletAccount,\n skipSimulation: this.skipSimulation,\n }\n }\n\n override createPipeline = (\n context: SolanaStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const tasks = [\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new SolanaSignAndExecuteTask(),\n new SolanaWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;AAsBA,IAAa,qBAAb,cAAwC,iBAAiB;CACvD;CACA;CAEA,YAAY,SAAoC;AAC9C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;AACtB,OAAK,iBAAiB,QAAQ,kBAAkB;;CAGlD,oBAAoB,SAA0C;EAC5D,MAAM,UAAU,KAAK,OAAO,SAAS,MAClC,YAAY,QAAQ,YAAY,KAAK,OAAO,YAC9C;AAED,MAAI,CAAC,QACH,OAAM,IAAI,iBACR,cAAc,8BACd,oHACD;AAGH,SAAO;;CAGT,eACE,OACA,MACA,WACsB,kBAAkB,OAAO,MAAM,OAAO;CAE9D,gBAAyB,OACvB,gBACuC;EACvC,MAAM,EAAE,SAAS;EAEjB,MAAM,gBAAgB,KAAK,iBAAiB,KAAK;AAEjD,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACtB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,QAAQ;GACZ,IAAI,kBAAkB;GACtB,IAAI,wBAAwB;GAC5B,IAAI,0BAA0B;GAC9B,IAAI,8BAA8B;GAClC,IAAI,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,WACJ,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAEvB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAI,aAFQ,MAAM,MAAM,eAAe,CAEX"}
1
+ {"version":3,"file":"SolanaStepExecutor.js","names":[],"sources":["../../../src/core/SolanaStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Wallet, WalletAccount } from '@wallet-standard/base'\nimport { parseSolanaErrors } from '../errors/parseSolanaErrors.js'\nimport type {\n SolanaStepExecutorContext,\n SolanaStepExecutorOptions,\n} from '../types.js'\nimport { SolanaSignAndExecuteTask } from './tasks/SolanaSignAndExecuteTask.js'\nimport { SolanaWaitForTransactionTask } from './tasks/SolanaWaitForTransactionTask.js'\n\nexport class SolanaStepExecutor extends BaseStepExecutor {\n private wallet: Wallet\n private skipSimulation: boolean\n\n constructor(options: SolanaStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n this.skipSimulation = options.skipSimulation ?? false\n }\n\n getWalletAccount = (step: LiFiStepExtended): WalletAccount => {\n const account = this.wallet.accounts.find(\n (account) => account.address === step.action.fromAddress\n )\n\n if (!account) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n\n return account\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseSolanaErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<SolanaStepExecutorContext> => {\n const { step } = baseContext\n\n const walletAccount = this.getWalletAccount(step)\n\n return {\n ...baseContext,\n wallet: this.wallet,\n walletAccount,\n skipSimulation: this.skipSimulation,\n }\n }\n\n override createPipeline = (\n context: SolanaStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const tasks = [\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new SolanaSignAndExecuteTask(),\n new SolanaWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;AAsBA,IAAa,qBAAb,cAAwC,iBAAiB;CACvD;CACA;CAEA,YAAY,SAAoC;AAC9C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;AACtB,OAAK,iBAAiB,QAAQ,kBAAkB;;CAGlD,oBAAoB,SAA0C;EAC5D,MAAM,UAAU,KAAK,OAAO,SAAS,MAClC,YAAY,QAAQ,YAAY,KAAK,OAAO,YAC9C;AAED,MAAI,CAAC,QACH,OAAM,IAAI,iBACR,cAAc,8BACd,oHACD;AAGH,SAAO;;CAGT,eACE,OACA,MACA,WACsB,kBAAkB,OAAO,MAAM,OAAO;CAE9D,gBAAyB,OACvB,gBACuC;EACvC,MAAM,EAAE,SAAS;EAEjB,MAAM,gBAAgB,KAAK,iBAAiB,KAAK;AAEjD,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb;GACA,gBAAgB,KAAK;GACtB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,QAAQ;GACZ,IAAI,kBAAkB;GACtB,IAAI,wBAAwB;GAC5B,IAAI,0BAA0B;GAC9B,IAAI,8BAA8B;GAClC,IAAI,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,WACJ,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAEvB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAI,aAFQ,MAAM,MAAM,eAEG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaJitoWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaJitoWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { sendAndConfirmBundle } from '../../actions/sendAndConfirmBundle.js'\nimport type { SolanaStepExecutorContext } from '../../types.js'\n\nexport class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransactions: contextSignedTransactions,\n } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n // Use Jito bundle for transaction submission\n const bundleResult = await sendAndConfirmBundle(client, signedTransactions)\n\n const allConfirmed = bundleResult.signatureResults.every(\n (result) => result !== null\n )\n\n if (!allConfirmed) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Bundle confirmation failed: Not all transactions were confirmed.'\n )\n }\n\n // Check for errors in any of the transactions\n const failedResult = bundleResult.signatureResults.find(\n (result) => result?.err\n )\n if (failedResult?.err) {\n const reason =\n typeof failedResult.err === 'object'\n ? JSON.stringify(failedResult.err)\n : String(failedResult.err)\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction failed: ${reason}`\n )\n }\n\n const confirmedTransaction = {\n txSignature: bundleResult.txSignatures[0],\n bundleId: bundleResult.bundleId,\n }\n\n // Transaction has been confirmed and we can update the action\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash: confirmedTransaction.txSignature,\n txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,\n })\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;AASA,IAAa,mCAAb,cAAsD,sBAAsB;CAC1E,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,oBAAoB,8BAClB;EAEJ,MAAM,qBAAqB,6BAA6B,EAAE;EAE1D,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAIH,MAAM,eAAe,MAAM,qBAAqB,QAAQ,mBAAmB;AAM3E,MAAI,CAJiB,aAAa,iBAAiB,OAChD,WAAW,WAAW,KACxB,CAGC,OAAM,IAAI,iBACR,cAAc,mBACd,mEACD;EAIH,MAAM,eAAe,aAAa,iBAAiB,MAChD,WAAW,QAAQ,IACrB;AACD,MAAI,cAAc,KAAK;GACrB,MAAM,SACJ,OAAO,aAAa,QAAQ,WACxB,KAAK,UAAU,aAAa,IAAI,GAChC,OAAO,aAAa,IAAI;AAC9B,SAAM,IAAI,iBACR,cAAc,mBACd,uBAAuB,SACxB;;EAGH,MAAM,uBAAuB;GAC3B,aAAa,aAAa,aAAa;GACvC,UAAU,aAAa;GACxB;AAGD,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD,QAAQ,qBAAqB;GAC7B,QAAQ,GAAG,UAAU,SAAS,kBAAkB,GAAG,KAAK,qBAAqB;GAC9E,CAAC;AAEF,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
1
+ {"version":3,"file":"SolanaJitoWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaJitoWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { sendAndConfirmBundle } from '../../actions/sendAndConfirmBundle.js'\nimport type { SolanaStepExecutorContext } from '../../types.js'\n\nexport class SolanaJitoWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransactions: contextSignedTransactions,\n } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n // Use Jito bundle for transaction submission\n const bundleResult = await sendAndConfirmBundle(client, signedTransactions)\n\n const allConfirmed = bundleResult.signatureResults.every(\n (result) => result !== null\n )\n\n if (!allConfirmed) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Bundle confirmation failed: Not all transactions were confirmed.'\n )\n }\n\n // Check for errors in any of the transactions\n const failedResult = bundleResult.signatureResults.find(\n (result) => result?.err\n )\n if (failedResult?.err) {\n const reason =\n typeof failedResult.err === 'object'\n ? JSON.stringify(failedResult.err)\n : String(failedResult.err)\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction failed: ${reason}`\n )\n }\n\n const confirmedTransaction = {\n txSignature: bundleResult.txSignatures[0],\n bundleId: bundleResult.bundleId,\n }\n\n // Transaction has been confirmed and we can update the action\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash: confirmedTransaction.txSignature,\n txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,\n })\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;AASA,IAAa,mCAAb,cAAsD,sBAAsB;CAC1E,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,oBAAoB,8BAClB;EAEJ,MAAM,qBAAqB,6BAA6B,EAAE;EAE1D,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAIH,MAAM,eAAe,MAAM,qBAAqB,QAAQ,mBAAmB;AAM3E,MAAI,CAJiB,aAAa,iBAAiB,OAChD,WAAW,WAAW,KAGR,CACf,OAAM,IAAI,iBACR,cAAc,mBACd,mEACD;EAIH,MAAM,eAAe,aAAa,iBAAiB,MAChD,WAAW,QAAQ,IACrB;AACD,MAAI,cAAc,KAAK;GACrB,MAAM,SACJ,OAAO,aAAa,QAAQ,WACxB,KAAK,UAAU,aAAa,IAAI,GAChC,OAAO,aAAa,IAAI;AAC9B,SAAM,IAAI,iBACR,cAAc,mBACd,uBAAuB,SACxB;;EAGH,MAAM,uBAAuB;GAC3B,aAAa,aAAa,aAAa;GACvC,UAAU,aAAa;GACxB;AAGD,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD,QAAQ,qBAAqB;GAC7B,QAAQ,GAAG,UAAU,SAAS,kBAAkB,GAAG,KAAK,qBAAqB;GAC9E,CAAC;AAEF,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaSignAndExecuteTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n getTransactionRequestData,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n withTimeout,\n} from '@lifi/sdk'\nimport { getTransactionCodec } from '@solana/kit'\nimport { SolanaSignTransaction } from '@solana/wallet-standard-features'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { base64ToUint8Array } from '../../utils/base64ToUint8Array.js'\nimport { getWalletFeature } from '../../utils/getWalletFeature.js'\n\nexport class SolanaSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n walletAccount,\n statusManager,\n executionOptions,\n isBridgeExecution,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const transactionRequestData = await getTransactionRequestData(\n step,\n executionOptions\n )\n\n // Handle both single transaction (string) and multiple transactions (array)\n const transactionDataArray = Array.isArray(transactionRequestData)\n ? transactionRequestData\n : [transactionRequestData]\n\n const transactionBytesArray = transactionDataArray.map((data) =>\n base64ToUint8Array(data)\n )\n\n const signedTransactionOutputs = await withTimeout(\n async () => {\n const { signTransaction } = getWalletFeature(\n wallet,\n SolanaSignTransaction\n )\n // Spread the inputs to sign all transactions at once\n return signTransaction(\n ...transactionBytesArray.map((transaction) => ({\n account: walletAccount,\n transaction,\n }))\n )\n },\n {\n // https://solana.com/docs/advanced/confirmation#transaction-expiration\n // Use 2 minutes to account for fluctuations\n timeout: 120_000,\n errorInstance: new TransactionError(\n LiFiErrorCode.TransactionExpired,\n 'Transaction has expired: blockhash is no longer recent enough.'\n ),\n }\n )\n\n if (signedTransactionOutputs.length === 0) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'No signed transaction returned from signer.'\n )\n }\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n const transactionCodec = getTransactionCodec()\n\n // Decode all signed transactions\n const signedTransactions = signedTransactionOutputs.map((output) =>\n transactionCodec.decode(output.signedTransaction)\n )\n\n return {\n status: 'COMPLETED',\n context: { signedTransactions },\n }\n }\n}\n"],"mappings":";;;;;;AAcA,IAAa,2BAAb,cAA8C,sBAAsB;CAClE,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,MACA,QACA,eACA,eACA,kBACA,sBACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAGH,MAAM,yBAAyB,MAAM,0BACnC,MACA,iBACD;EAOD,MAAM,yBAJuB,MAAM,QAAQ,uBAAuB,GAC9D,yBACA,CAAC,uBAAuB,EAEuB,KAAK,SACtD,mBAAmB,KAAK,CACzB;EAED,MAAM,2BAA2B,MAAM,YACrC,YAAY;GACV,MAAM,EAAE,oBAAoB,iBAC1B,QACA,sBACD;AAED,UAAO,gBACL,GAAG,sBAAsB,KAAK,iBAAiB;IAC7C,SAAS;IACT;IACD,EAAE,CACJ;KAEH;GAGE,SAAS;GACT,eAAe,IAAI,iBACjB,cAAc,oBACd,iEACD;GACF,CACF;AAED,MAAI,yBAAyB,WAAW,EACtC,OAAM,IAAI,iBACR,cAAc,uBACd,8CACD;AAGH,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,MAAM,mBAAmB,qBAAqB;AAO9C,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,oBANc,yBAAyB,KAAK,WACvD,iBAAiB,OAAO,OAAO,kBAAkB,CAClD,EAIgC;GAChC"}
1
+ {"version":3,"file":"SolanaSignAndExecuteTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n getTransactionRequestData,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n withTimeout,\n} from '@lifi/sdk'\nimport { getTransactionCodec } from '@solana/kit'\nimport { SolanaSignTransaction } from '@solana/wallet-standard-features'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { base64ToUint8Array } from '../../utils/base64ToUint8Array.js'\nimport { getWalletFeature } from '../../utils/getWalletFeature.js'\n\nexport class SolanaSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n walletAccount,\n statusManager,\n executionOptions,\n isBridgeExecution,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const transactionRequestData = await getTransactionRequestData(\n step,\n executionOptions\n )\n\n // Handle both single transaction (string) and multiple transactions (array)\n const transactionDataArray = Array.isArray(transactionRequestData)\n ? transactionRequestData\n : [transactionRequestData]\n\n const transactionBytesArray = transactionDataArray.map((data) =>\n base64ToUint8Array(data)\n )\n\n const signedTransactionOutputs = await withTimeout(\n async () => {\n const { signTransaction } = getWalletFeature(\n wallet,\n SolanaSignTransaction\n )\n // Spread the inputs to sign all transactions at once\n return signTransaction(\n ...transactionBytesArray.map((transaction) => ({\n account: walletAccount,\n transaction,\n }))\n )\n },\n {\n // https://solana.com/docs/advanced/confirmation#transaction-expiration\n // Use 2 minutes to account for fluctuations\n timeout: 120_000,\n errorInstance: new TransactionError(\n LiFiErrorCode.TransactionExpired,\n 'Transaction has expired: blockhash is no longer recent enough.'\n ),\n }\n )\n\n if (signedTransactionOutputs.length === 0) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'No signed transaction returned from signer.'\n )\n }\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n const transactionCodec = getTransactionCodec()\n\n // Decode all signed transactions\n const signedTransactions = signedTransactionOutputs.map((output) =>\n transactionCodec.decode(output.signedTransaction)\n )\n\n return {\n status: 'COMPLETED',\n context: { signedTransactions },\n }\n }\n}\n"],"mappings":";;;;;;AAcA,IAAa,2BAAb,cAA8C,sBAAsB;CAClE,MAAM,IAAI,SAAyD;EACjE,MAAM,EACJ,MACA,QACA,eACA,eACA,kBACA,sBACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAGH,MAAM,yBAAyB,MAAM,0BACnC,MACA,iBACD;EAOD,MAAM,yBAJuB,MAAM,QAAQ,uBAAuB,GAC9D,yBACA,CAAC,uBAAuB,EAEuB,KAAK,SACtD,mBAAmB,KAAK,CACzB;EAED,MAAM,2BAA2B,MAAM,YACrC,YAAY;GACV,MAAM,EAAE,oBAAoB,iBAC1B,QACA,sBACD;AAED,UAAO,gBACL,GAAG,sBAAsB,KAAK,iBAAiB;IAC7C,SAAS;IACT;IACD,EAAE,CACJ;KAEH;GAGE,SAAS;GACT,eAAe,IAAI,iBACjB,cAAc,oBACd,iEACD;GACF,CACF;AAED,MAAI,yBAAyB,WAAW,EACtC,OAAM,IAAI,iBACR,cAAc,uBACd,8CACD;AAGH,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,MAAM,mBAAmB,qBAAqB;AAO9C,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,oBANc,yBAAyB,KAAK,WACvD,iBAAiB,OAAO,OAAO,kBAAkB,CAKpB,EAAE;GAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SolanaWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaWaitForTransactionTask.ts"],"sourcesContent":["import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { shouldUseJitoBundle } from '../../utils/shouldUseJitoBundle.js'\nimport { SolanaJitoWaitForTransactionTask } from './SolanaJitoWaitForTransactionTask.js'\nimport { SolanaStandardWaitForTransactionTask } from './SolanaStandardWaitForTransactionTask.js'\n\nexport class SolanaWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const { client, signedTransactions: contextSignedTransactions } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const useJitoBundle = shouldUseJitoBundle(\n client.config.routeOptions,\n signedTransactions\n )\n\n if (useJitoBundle) {\n return new SolanaJitoWaitForTransactionTask().run(context)\n }\n return new SolanaStandardWaitForTransactionTask().run(context)\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,+BAAb,cAAkD,sBAAsB;CACtE,MAAM,IAAI,SAAyD;EACjE,MAAM,EAAE,QAAQ,oBAAoB,8BAA8B;EAElE,MAAM,qBAAqB,6BAA6B,EAAE;AAO1D,MALsB,oBACpB,OAAO,OAAO,cACd,mBACD,CAGC,QAAO,IAAI,kCAAkC,CAAC,IAAI,QAAQ;AAE5D,SAAO,IAAI,sCAAsC,CAAC,IAAI,QAAQ"}
1
+ {"version":3,"file":"SolanaWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/SolanaWaitForTransactionTask.ts"],"sourcesContent":["import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk'\nimport type { SolanaStepExecutorContext } from '../../types.js'\nimport { shouldUseJitoBundle } from '../../utils/shouldUseJitoBundle.js'\nimport { SolanaJitoWaitForTransactionTask } from './SolanaJitoWaitForTransactionTask.js'\nimport { SolanaStandardWaitForTransactionTask } from './SolanaStandardWaitForTransactionTask.js'\n\nexport class SolanaWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: SolanaStepExecutorContext): Promise<TaskResult> {\n const { client, signedTransactions: contextSignedTransactions } = context\n\n const signedTransactions = contextSignedTransactions ?? []\n\n const useJitoBundle = shouldUseJitoBundle(\n client.config.routeOptions,\n signedTransactions\n )\n\n if (useJitoBundle) {\n return new SolanaJitoWaitForTransactionTask().run(context)\n }\n return new SolanaStandardWaitForTransactionTask().run(context)\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,+BAAb,cAAkD,sBAAsB;CACtE,MAAM,IAAI,SAAyD;EACjE,MAAM,EAAE,QAAQ,oBAAoB,8BAA8B;EAElE,MAAM,qBAAqB,6BAA6B,EAAE;AAO1D,MALsB,oBACpB,OAAO,OAAO,cACd,mBAGe,CACf,QAAO,IAAI,kCAAkC,CAAC,IAAI,QAAQ;AAE5D,SAAO,IAAI,sCAAsC,CAAC,IAAI,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"parseSolanaErrors.js","names":[],"sources":["../../../src/errors/parseSolanaErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\n\nexport const parseSolanaErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: any) => {\n if (e.name === 'WalletSignTransactionError') {\n return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)\n }\n\n if (e.name === 'SendTransactionError') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, e.message, e)\n }\n\n if (e.name === 'TransactionExpiredBlockheightExceededError') {\n return new TransactionError(LiFiErrorCode.TransactionExpired, e.message, e)\n }\n\n if (e.message?.includes('simulate')) {\n return new TransactionError(\n LiFiErrorCode.TransactionSimulationFailed,\n e.message,\n e\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(e.message || ErrorMessage.UnknownError, e)\n}\n"],"mappings":";;AAWA,MAAa,oBAAoB,OAC/B,GACA,MACA,WACsB;AACtB,KAAI,aAAa,UAAU;AACzB,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAI,SAFO,qBAAqB,EAAE,EAEV,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAAW;AACvC,KAAI,EAAE,SAAS,6BACb,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,uBACb,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,6CACb,QAAO,IAAI,iBAAiB,cAAc,oBAAoB,EAAE,SAAS,EAAE;AAG7E,KAAI,EAAE,SAAS,SAAS,WAAW,CACjC,QAAO,IAAI,iBACT,cAAc,6BACd,EAAE,SACF,EACD;AAGH,KAAI,aAAa,UACf,QAAO;AAGT,QAAO,IAAI,aAAa,EAAE,WAAW,aAAa,cAAc,EAAE"}
1
+ {"version":3,"file":"parseSolanaErrors.js","names":[],"sources":["../../../src/errors/parseSolanaErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\n\nexport const parseSolanaErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: any) => {\n if (e.name === 'WalletSignTransactionError') {\n return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)\n }\n\n if (e.name === 'SendTransactionError') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, e.message, e)\n }\n\n if (e.name === 'TransactionExpiredBlockheightExceededError') {\n return new TransactionError(LiFiErrorCode.TransactionExpired, e.message, e)\n }\n\n if (e.message?.includes('simulate')) {\n return new TransactionError(\n LiFiErrorCode.TransactionSimulationFailed,\n e.message,\n e\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(e.message || ErrorMessage.UnknownError, e)\n}\n"],"mappings":";;AAWA,MAAa,oBAAoB,OAC/B,GACA,MACA,WACsB;AACtB,KAAI,aAAa,UAAU;AACzB,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAI,SAFO,qBAAqB,EAEV,EAAE,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAAW;AACvC,KAAI,EAAE,SAAS,6BACb,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,uBACb,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,EAAE,SAAS,EAAE;AAG5E,KAAI,EAAE,SAAS,6CACb,QAAO,IAAI,iBAAiB,cAAc,oBAAoB,EAAE,SAAS,EAAE;AAG7E,KAAI,EAAE,SAAS,SAAS,WAAW,CACjC,QAAO,IAAI,iBACT,cAAc,6BACd,EAAE,SACF,EACD;AAGH,KAAI,aAAa,UACf,QAAO;AAGT,QAAO,IAAI,aAAa,EAAE,WAAW,aAAa,cAAc,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../../src/rpc/registry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { createSolanaRpc } from '@solana/kit'\nimport { createJitoRpc } from './jito/createJitoRpc.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\nconst solanaRpcs = new LruMap<SolanaRpcType>(12)\nconst jitoRpcs = new LruMap<JitoRpcType>(12)\n\n/**\n * Checks if an RPC URL supports Jito methods by calling getTipAccounts.\n */\nexport const isJitoRpc = async (rpcUrl: string): Promise<boolean> => {\n try {\n const rpc = createJitoRpc(rpcUrl)\n await rpc.getTipAccounts().send()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Initializes Solana RPCs for all available RPC URLs if they haven't been cached yet.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureSolanaRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!solanaRpcs.has(rpcUrl)) {\n solanaRpcs.set(rpcUrl, createSolanaRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Detects and caches Jito-capable RPCs by checking if they support the getTipAccounts method.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureJitoRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!jitoRpcs.has(rpcUrl) && (await isJitoRpc(rpcUrl))) {\n jitoRpcs.set(rpcUrl, createJitoRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Wrapper around getting the Solana RPCs\n * @returns - Solana RPCs\n */\nexport const getSolanaRpcs = async (\n client: SDKClient\n): Promise<SolanaRpcType[]> => {\n await ensureSolanaRpcs(client)\n return Array.from(solanaRpcs.values())\n}\n\n/**\n * Wrapper around getting the Jito RPCs\n * @returns - Jito RPCs\n */\nexport const getJitoRpcs = async (\n client: SDKClient\n): Promise<JitoRpcType[]> => {\n await ensureJitoRpcs(client)\n return Array.from(jitoRpcs.values())\n}\n"],"mappings":";;;;AAKA,MAAM,aAAa,IAAI,OAAsB,GAAG;AAChD,MAAM,WAAW,IAAI,OAAoB,GAAG;;;;AAK5C,MAAa,YAAY,OAAO,WAAqC;AACnE,KAAI;AAEF,QADY,cAAc,OAAO,CACvB,gBAAgB,CAAC,MAAM;AACjC,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,MAAM,mBAAmB,OAAO,WAAqC;CACnE,MAAM,UAAU,MAAM,OAAO,oBAAoB,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,WAAW,IAAI,OAAO,CACzB,YAAW,IAAI,QAAQ,gBAAgB,OAAO,CAAC;;;;;;AASrD,MAAM,iBAAiB,OAAO,WAAqC;CACjE,MAAM,UAAU,MAAM,OAAO,oBAAoB,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,SAAS,IAAI,OAAO,IAAK,MAAM,UAAU,OAAO,CACnD,UAAS,IAAI,QAAQ,cAAc,OAAO,CAAC;;;;;;AASjD,MAAa,gBAAgB,OAC3B,WAC6B;AAC7B,OAAM,iBAAiB,OAAO;AAC9B,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC;;;;;;AAOxC,MAAa,cAAc,OACzB,WAC2B;AAC3B,OAAM,eAAe,OAAO;AAC5B,QAAO,MAAM,KAAK,SAAS,QAAQ,CAAC"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../../src/rpc/registry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { createSolanaRpc } from '@solana/kit'\nimport { createJitoRpc } from './jito/createJitoRpc.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\nconst solanaRpcs = new LruMap<SolanaRpcType>(12)\nconst jitoRpcs = new LruMap<JitoRpcType>(12)\n\n/**\n * Checks if an RPC URL supports Jito methods by calling getTipAccounts.\n */\nexport const isJitoRpc = async (rpcUrl: string): Promise<boolean> => {\n try {\n const rpc = createJitoRpc(rpcUrl)\n await rpc.getTipAccounts().send()\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Initializes Solana RPCs for all available RPC URLs if they haven't been cached yet.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureSolanaRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!solanaRpcs.has(rpcUrl)) {\n solanaRpcs.set(rpcUrl, createSolanaRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Detects and caches Jito-capable RPCs by checking if they support the getTipAccounts method.\n * @param client - The SDK client used to fetch RPC URLs.\n */\nconst ensureJitoRpcs = async (client: SDKClient): Promise<void> => {\n const rpcUrls = await client.getRpcUrlsByChainId(ChainId.SOL)\n for (const rpcUrl of rpcUrls) {\n if (!jitoRpcs.has(rpcUrl) && (await isJitoRpc(rpcUrl))) {\n jitoRpcs.set(rpcUrl, createJitoRpc(rpcUrl))\n }\n }\n}\n\n/**\n * Wrapper around getting the Solana RPCs\n * @returns - Solana RPCs\n */\nexport const getSolanaRpcs = async (\n client: SDKClient\n): Promise<SolanaRpcType[]> => {\n await ensureSolanaRpcs(client)\n return Array.from(solanaRpcs.values())\n}\n\n/**\n * Wrapper around getting the Jito RPCs\n * @returns - Jito RPCs\n */\nexport const getJitoRpcs = async (\n client: SDKClient\n): Promise<JitoRpcType[]> => {\n await ensureJitoRpcs(client)\n return Array.from(jitoRpcs.values())\n}\n"],"mappings":";;;;AAKA,MAAM,aAAa,IAAI,OAAsB,GAAG;AAChD,MAAM,WAAW,IAAI,OAAoB,GAAG;;;;AAK5C,MAAa,YAAY,OAAO,WAAqC;AACnE,KAAI;AAEF,QADY,cAAc,OACjB,CAAC,gBAAgB,CAAC,MAAM;AACjC,SAAO;SACD;AACN,SAAO;;;;;;;AAQX,MAAM,mBAAmB,OAAO,WAAqC;CACnE,MAAM,UAAU,MAAM,OAAO,oBAAoB,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,WAAW,IAAI,OAAO,CACzB,YAAW,IAAI,QAAQ,gBAAgB,OAAO,CAAC;;;;;;AASrD,MAAM,iBAAiB,OAAO,WAAqC;CACjE,MAAM,UAAU,MAAM,OAAO,oBAAoB,QAAQ,IAAI;AAC7D,MAAK,MAAM,UAAU,QACnB,KAAI,CAAC,SAAS,IAAI,OAAO,IAAK,MAAM,UAAU,OAAO,CACnD,UAAS,IAAI,QAAQ,cAAc,OAAO,CAAC;;;;;;AASjD,MAAa,gBAAgB,OAC3B,WAC6B;AAC7B,OAAM,iBAAiB,OAAO;AAC9B,QAAO,MAAM,KAAK,WAAW,QAAQ,CAAC;;;;;;AAOxC,MAAa,cAAc,OACzB,WAC2B;AAC3B,OAAM,eAAe,OAAO;AAC5B,QAAO,MAAM,KAAK,SAAS,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../src/rpc/utils.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport { getJitoRpcs, getSolanaRpcs } from './registry.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\ntype RetryFn<Rpc> = <R>(\n client: SDKClient,\n fn: (rpc: Rpc) => Promise<R>\n) => Promise<R>\n\n/**\n * Calls a function on RPC instances with retry logic.\n * Tries each RPC in sequence until one succeeds.\n *\n * @typeParam T - The type of the RPC instance.\n * @typeParam R - The return type of the function.\n * @param rpcs - An array of RPC instances to try.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no RPCs are available.\n * @throws {AggregateError} If all RPCs fail, containing all individual errors.\n *\n * @example\n * ```ts\n * const rpcs = await getSolanaRpcs(client)\n * const result = await callWithRetry(rpcs, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport async function callWithRetry<T, R>(\n rpcs: T[],\n fn: (rpc: T) => Promise<R>\n): Promise<R> {\n if (rpcs.length === 0) {\n throw new Error('No RPCs available')\n }\n\n const errors: Error[] = []\n for (const rpc of rpcs) {\n try {\n return await fn(rpc)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${rpcs.length} RPCs failed`)\n}\n\n/**\n * Creates a retry function for a specific RPC type.\n * @internal\n */\nconst createRetryFn =\n <T>(getRpcs: (client: SDKClient) => Promise<T[]>) =>\n async <R>(client: SDKClient, fn: (rpc: T) => Promise<R>): Promise<R> => {\n const rpcs = await getRpcs(client)\n return callWithRetry(rpcs, fn)\n }\n\n/**\n * Calls a function on Solana RPC instances with retry logic.\n * Automatically fetches available Solana RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Solana RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const balance = await callSolanaRpcsWithRetry(client, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport const callSolanaRpcsWithRetry: RetryFn<SolanaRpcType> =\n createRetryFn(getSolanaRpcs)\n\n/**\n * Calls a function on Jito RPC instances with retry logic.\n * Automatically fetches available Jito RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Jito RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const tipAccounts = await callJitoRpcsWithRetry(client, (rpc) =>\n * rpc.getTipAccounts().send()\n * )\n * ```\n */\nexport const callJitoRpcsWithRetry: RetryFn<JitoRpcType> =\n createRetryFn(getJitoRpcs)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,cACpB,MACA,IACY;AACZ,KAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,oBAAoB;CAGtC,MAAM,SAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,KAAI;AACF,SAAO,MAAM,GAAG,IAAI;UACb,OAAO;AACd,SAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;AAI1E,OAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,cAAc;;;;;;AAOpE,MAAM,iBACA,YACJ,OAAU,QAAmB,OAA2C;AAEtE,QAAO,cADM,MAAM,QAAQ,OAAO,EACP,GAAG;;;;;;;;;;;;;;;;;;;;AAqBlC,MAAa,0BACX,cAAc,cAAc;;;;;;;;;;;;;;;;;;;AAoB9B,MAAa,wBACX,cAAc,YAAY"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../src/rpc/utils.ts"],"sourcesContent":["import type { SDKClient } from '@lifi/sdk'\nimport { getJitoRpcs, getSolanaRpcs } from './registry.js'\nimport type { JitoRpcType, SolanaRpcType } from './types.js'\n\ntype RetryFn<Rpc> = <R>(\n client: SDKClient,\n fn: (rpc: Rpc) => Promise<R>\n) => Promise<R>\n\n/**\n * Calls a function on RPC instances with retry logic.\n * Tries each RPC in sequence until one succeeds.\n *\n * @typeParam T - The type of the RPC instance.\n * @typeParam R - The return type of the function.\n * @param rpcs - An array of RPC instances to try.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no RPCs are available.\n * @throws {AggregateError} If all RPCs fail, containing all individual errors.\n *\n * @example\n * ```ts\n * const rpcs = await getSolanaRpcs(client)\n * const result = await callWithRetry(rpcs, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport async function callWithRetry<T, R>(\n rpcs: T[],\n fn: (rpc: T) => Promise<R>\n): Promise<R> {\n if (rpcs.length === 0) {\n throw new Error('No RPCs available')\n }\n\n const errors: Error[] = []\n for (const rpc of rpcs) {\n try {\n return await fn(rpc)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${rpcs.length} RPCs failed`)\n}\n\n/**\n * Creates a retry function for a specific RPC type.\n * @internal\n */\nconst createRetryFn =\n <T>(getRpcs: (client: SDKClient) => Promise<T[]>) =>\n async <R>(client: SDKClient, fn: (rpc: T) => Promise<R>): Promise<R> => {\n const rpcs = await getRpcs(client)\n return callWithRetry(rpcs, fn)\n }\n\n/**\n * Calls a function on Solana RPC instances with retry logic.\n * Automatically fetches available Solana RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Solana RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const balance = await callSolanaRpcsWithRetry(client, (rpc) =>\n * rpc.getBalance(address).send()\n * )\n * ```\n */\nexport const callSolanaRpcsWithRetry: RetryFn<SolanaRpcType> =\n createRetryFn(getSolanaRpcs)\n\n/**\n * Calls a function on Jito RPC instances with retry logic.\n * Automatically fetches available Jito RPCs and tries each in sequence.\n *\n * @typeParam R - The return type of the function.\n * @param client - The SDK client used to fetch RPC URLs.\n * @param fn - The async function to execute on each RPC until one succeeds.\n * @returns The result from the first successful RPC call.\n * @throws {Error} If no Jito RPCs are available.\n * @throws {AggregateError} If all RPCs fail.\n *\n * @example\n * ```ts\n * const tipAccounts = await callJitoRpcsWithRetry(client, (rpc) =>\n * rpc.getTipAccounts().send()\n * )\n * ```\n */\nexport const callJitoRpcsWithRetry: RetryFn<JitoRpcType> =\n createRetryFn(getJitoRpcs)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,cACpB,MACA,IACY;AACZ,KAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,oBAAoB;CAGtC,MAAM,SAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,KAChB,KAAI;AACF,SAAO,MAAM,GAAG,IAAI;UACb,OAAO;AACd,SAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;AAI1E,OAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,cAAc;;;;;;AAOpE,MAAM,iBACA,YACJ,OAAU,QAAmB,OAA2C;AAEtE,QAAO,cAAc,MADF,QAAQ,OAAO,EACP,GAAG;;;;;;;;;;;;;;;;;;;;AAqBlC,MAAa,0BACX,cAAc,cAAc;;;;;;;;;;;;;;;;;;;AAoB9B,MAAa,wBACX,cAAc,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"KeypairWallet.unit.helpers.js","names":[],"sources":["../../../src/utils/KeypairWallet.unit.helpers.ts"],"sourcesContent":["import { getBase58Codec } from '@solana/kit'\n\nconst nativeCrypto = globalThis.crypto\n\n// Helper to generate a valid test keypair\nexport const generateTestKeypair = async (): Promise<{\n secretKey: string\n publicKey: Uint8Array\n}> => {\n if (!nativeCrypto?.subtle) {\n throw new Error('SubtleCrypto is not available in this environment')\n }\n\n const base58Codec = getBase58Codec()\n const keyPair = await nativeCrypto.subtle.generateKey(\n { name: 'Ed25519' },\n true,\n ['sign', 'verify']\n )\n\n const privateKeyPkcs8 = new Uint8Array(\n await nativeCrypto.subtle.exportKey('pkcs8', keyPair.privateKey)\n )\n const privateKeyBytes = privateKeyPkcs8.slice(-32)\n const publicKey = new Uint8Array(\n await nativeCrypto.subtle.exportKey('raw', keyPair.publicKey)\n )\n const secretKey = new Uint8Array([...privateKeyBytes, ...publicKey])\n\n return {\n secretKey: base58Codec.decode(secretKey),\n publicKey,\n }\n}\n"],"mappings":";;AAEA,MAAM,eAAe,WAAW;AAGhC,MAAa,sBAAsB,YAG7B;AACJ,KAAI,CAAC,cAAc,OACjB,OAAM,IAAI,MAAM,oDAAoD;CAGtE,MAAM,cAAc,gBAAgB;CACpC,MAAM,UAAU,MAAM,aAAa,OAAO,YACxC,EAAE,MAAM,WAAW,EACnB,MACA,CAAC,QAAQ,SAAS,CACnB;CAKD,MAAM,kBAHkB,IAAI,WAC1B,MAAM,aAAa,OAAO,UAAU,SAAS,QAAQ,WAAW,CACjE,CACuC,MAAM,IAAI;CAClD,MAAM,YAAY,IAAI,WACpB,MAAM,aAAa,OAAO,UAAU,OAAO,QAAQ,UAAU,CAC9D;CACD,MAAM,YAAY,IAAI,WAAW,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEpE,QAAO;EACL,WAAW,YAAY,OAAO,UAAU;EACxC;EACD"}
1
+ {"version":3,"file":"KeypairWallet.unit.helpers.js","names":[],"sources":["../../../src/utils/KeypairWallet.unit.helpers.ts"],"sourcesContent":["import { getBase58Codec } from '@solana/kit'\n\nconst nativeCrypto = globalThis.crypto\n\n// Helper to generate a valid test keypair\nexport const generateTestKeypair = async (): Promise<{\n secretKey: string\n publicKey: Uint8Array\n}> => {\n if (!nativeCrypto?.subtle) {\n throw new Error('SubtleCrypto is not available in this environment')\n }\n\n const base58Codec = getBase58Codec()\n const keyPair = await nativeCrypto.subtle.generateKey(\n { name: 'Ed25519' },\n true,\n ['sign', 'verify']\n )\n\n const privateKeyPkcs8 = new Uint8Array(\n await nativeCrypto.subtle.exportKey('pkcs8', keyPair.privateKey)\n )\n const privateKeyBytes = privateKeyPkcs8.slice(-32)\n const publicKey = new Uint8Array(\n await nativeCrypto.subtle.exportKey('raw', keyPair.publicKey)\n )\n const secretKey = new Uint8Array([...privateKeyBytes, ...publicKey])\n\n return {\n secretKey: base58Codec.decode(secretKey),\n publicKey,\n }\n}\n"],"mappings":";;AAEA,MAAM,eAAe,WAAW;AAGhC,MAAa,sBAAsB,YAG7B;AACJ,KAAI,CAAC,cAAc,OACjB,OAAM,IAAI,MAAM,oDAAoD;CAGtE,MAAM,cAAc,gBAAgB;CACpC,MAAM,UAAU,MAAM,aAAa,OAAO,YACxC,EAAE,MAAM,WAAW,EACnB,MACA,CAAC,QAAQ,SAAS,CACnB;CAKD,MAAM,kBAAkB,IAHI,WAC1B,MAAM,aAAa,OAAO,UAAU,SAAS,QAAQ,WAAW,CAE3B,CAAC,MAAM,IAAI;CAClD,MAAM,YAAY,IAAI,WACpB,MAAM,aAAa,OAAO,UAAU,OAAO,QAAQ,UAAU,CAC9D;CACD,MAAM,YAAY,IAAI,WAAW,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAEpE,QAAO;EACL,WAAW,YAAY,OAAO,UAAU;EACxC;EACD"}
@@ -1,6 +1,6 @@
1
1
  //#region src/version.d.ts
2
2
  declare const name = "@lifi/sdk-provider-solana";
3
- declare const version = "4.0.0-beta.6";
3
+ declare const version = "4.0.0-beta.8";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -1,6 +1,6 @@
1
1
  //#region src/version.ts
2
2
  const name = "@lifi/sdk-provider-solana";
3
- const version = "4.0.0-beta.6";
3
+ const version = "4.0.0-beta.8";
4
4
  //#endregion
5
5
  export { name, version };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-solana'\nexport const version = '4.0.0-beta.6'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-solana'\nexport const version = '4.0.0-beta.8'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/sdk-provider-solana",
3
- "version": "4.0.0-beta.6",
3
+ "version": "4.0.0-beta.8",
4
4
  "description": "LI.FI Solana SDK Provider for Any-to-Any Cross-Chain-Swap",
5
5
  "homepage": "https://github.com/lifinance/sdk",
6
6
  "bugs": {
@@ -31,7 +31,7 @@
31
31
  "@solana/kit": "^6.8.0",
32
32
  "@solana/wallet-standard-features": "^1.3.0",
33
33
  "@wallet-standard/base": "^1.1.0",
34
- "@lifi/sdk": "4.0.0-beta.6"
34
+ "@lifi/sdk": "4.0.0-beta.8"
35
35
  },
36
36
  "publishConfig": {
37
37
  "access": "public"
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/sdk-provider-solana'
2
- export const version = '4.0.0-beta.6'
2
+ export const version = '4.0.0-beta.8'