@rhea-finance/cross-chain-aggregation-dex 2.0.1 → 2.0.3

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 (60) hide show
  1. package/README.md +567 -206
  2. package/dist/executors/aptos.d.mts +3 -4
  3. package/dist/executors/aptos.d.ts +3 -4
  4. package/dist/executors/aptos.js +22 -2
  5. package/dist/executors/aptos.js.map +1 -1
  6. package/dist/executors/aptos.mjs +22 -2
  7. package/dist/executors/aptos.mjs.map +1 -1
  8. package/dist/executors/bitcoin.d.mts +3 -4
  9. package/dist/executors/bitcoin.d.ts +3 -4
  10. package/dist/executors/bitcoin.js +22 -2
  11. package/dist/executors/bitcoin.js.map +1 -1
  12. package/dist/executors/bitcoin.mjs +22 -2
  13. package/dist/executors/bitcoin.mjs.map +1 -1
  14. package/dist/executors/evm.d.mts +3 -4
  15. package/dist/executors/evm.d.ts +3 -4
  16. package/dist/executors/evm.js +29 -13
  17. package/dist/executors/evm.js.map +1 -1
  18. package/dist/executors/evm.mjs +29 -13
  19. package/dist/executors/evm.mjs.map +1 -1
  20. package/dist/executors/near.d.mts +3 -4
  21. package/dist/executors/near.d.ts +3 -4
  22. package/dist/executors/near.js +22 -2
  23. package/dist/executors/near.js.map +1 -1
  24. package/dist/executors/near.mjs +22 -2
  25. package/dist/executors/near.mjs.map +1 -1
  26. package/dist/executors/solana.d.mts +3 -4
  27. package/dist/executors/solana.d.ts +3 -4
  28. package/dist/executors/solana.js +22 -2
  29. package/dist/executors/solana.js.map +1 -1
  30. package/dist/executors/solana.mjs +22 -2
  31. package/dist/executors/solana.mjs.map +1 -1
  32. package/dist/executors/sui.d.mts +3 -4
  33. package/dist/executors/sui.d.ts +3 -4
  34. package/dist/executors/sui.js +22 -2
  35. package/dist/executors/sui.js.map +1 -1
  36. package/dist/executors/sui.mjs +22 -2
  37. package/dist/executors/sui.mjs.map +1 -1
  38. package/dist/executors/tron.d.mts +3 -4
  39. package/dist/executors/tron.d.ts +3 -4
  40. package/dist/executors/tron.js +22 -2
  41. package/dist/executors/tron.js.map +1 -1
  42. package/dist/executors/tron.mjs +22 -2
  43. package/dist/executors/tron.mjs.map +1 -1
  44. package/dist/executors/zcash.d.mts +4 -5
  45. package/dist/executors/zcash.d.ts +4 -5
  46. package/dist/executors/zcash.js +24 -10
  47. package/dist/executors/zcash.js.map +1 -1
  48. package/dist/executors/zcash.mjs +24 -10
  49. package/dist/executors/zcash.mjs.map +1 -1
  50. package/dist/index.d.mts +4 -3
  51. package/dist/index.d.ts +4 -3
  52. package/dist/index.js +59 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/index.mjs +59 -25
  55. package/dist/index.mjs.map +1 -1
  56. package/dist/{registry-DRYUqs7T.d.mts → shared-BEZXY_BM.d.mts} +39 -12
  57. package/dist/{registry-DRYUqs7T.d.ts → shared-BEZXY_BM.d.ts} +39 -12
  58. package/package.json +4 -1
  59. package/dist/shared-BdH3hWuP.d.ts +0 -23
  60. package/dist/shared-BqpFeosz.d.mts +0 -23
@@ -1,5 +1,4 @@
1
- import { C as ChainRef, q as ChainExecutor } from '../registry-DRYUqs7T.mjs';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BqpFeosz.mjs';
1
+ import { a4 as ExecutorErrorAdapter, C as ChainRef, a5 as TransactionSubmission, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.mjs';
3
2
 
4
3
  interface AptosWalletAdapter extends ExecutorErrorAdapter {
5
4
  getChain(): ChainRef | Promise<ChainRef>;
@@ -10,9 +9,9 @@ interface AptosWalletAdapter extends ExecutorErrorAdapter {
10
9
  }, options: {
11
10
  signal?: AbortSignal;
12
11
  }): Promise<TransactionSubmission>;
13
- waitForTransaction?(txHash: string, options: {
12
+ waitForTransaction(txHash: string, options: {
14
13
  signal?: AbortSignal;
15
- }): Promise<unknown>;
14
+ }): Promise<TransactionConfirmation>;
16
15
  }
17
16
  declare function createAptosExecutor(adapter: AptosWalletAdapter): ChainExecutor<"aptos-entry-function">;
18
17
 
@@ -1,5 +1,4 @@
1
- import { C as ChainRef, q as ChainExecutor } from '../registry-DRYUqs7T.js';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BdH3hWuP.js';
1
+ import { a4 as ExecutorErrorAdapter, C as ChainRef, a5 as TransactionSubmission, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.js';
3
2
 
4
3
  interface AptosWalletAdapter extends ExecutorErrorAdapter {
5
4
  getChain(): ChainRef | Promise<ChainRef>;
@@ -10,9 +9,9 @@ interface AptosWalletAdapter extends ExecutorErrorAdapter {
10
9
  }, options: {
11
10
  signal?: AbortSignal;
12
11
  }): Promise<TransactionSubmission>;
13
- waitForTransaction?(txHash: string, options: {
12
+ waitForTransaction(txHash: string, options: {
14
13
  signal?: AbortSignal;
15
- }): Promise<unknown>;
14
+ }): Promise<TransactionConfirmation>;
16
15
  }
17
16
  declare function createAptosExecutor(adapter: AptosWalletAdapter): ChainExecutor<"aptos-entry-function">;
18
17
 
@@ -60,6 +60,21 @@ function mapExecutorError(error, adapter, stage, code, message) {
60
60
  }
61
61
  return new SwapSdkError(code, stage, message, { cause: error });
62
62
  }
63
+ function assertTransactionConfirmed(confirmation, options) {
64
+ if (confirmation?.status === "confirmed") {
65
+ return confirmation.raw;
66
+ }
67
+ const status = confirmation && typeof confirmation === "object" && "status" in confirmation ? String(confirmation.status) : "missing";
68
+ throw new SwapSdkError(
69
+ options.code,
70
+ options.stage,
71
+ `${options.message}: wallet confirmation status is ${status}`,
72
+ {
73
+ cause: confirmation && typeof confirmation === "object" && "raw" in confirmation ? confirmation.raw : confirmation,
74
+ details: { confirmationStatus: status }
75
+ }
76
+ );
77
+ }
63
78
  function isUserRejection(error, adapter) {
64
79
  if (adapter.isUserRejection?.(error)) return true;
65
80
  if (typeof error !== "object" || error === null) return false;
@@ -108,7 +123,7 @@ function createAptosExecutor(adapter) {
108
123
  };
109
124
  }
110
125
  async function confirm(adapter, submission, context) {
111
- if (context.waitFor === "submitted" || !adapter.waitForTransaction) {
126
+ if (context.waitFor === "submitted") {
112
127
  return {
113
128
  status: "submitted",
114
129
  txHash: submission.txHash,
@@ -119,10 +134,15 @@ async function confirm(adapter, submission, context) {
119
134
  const confirmation = await adapter.waitForTransaction(submission.txHash, {
120
135
  signal: context.signal
121
136
  });
137
+ const confirmationRaw = assertTransactionConfirmed(confirmation, {
138
+ code: "BROADCAST_FAILED",
139
+ stage: "broadcast",
140
+ message: "Aptos transaction failed"
141
+ });
122
142
  return {
123
143
  status: "source-confirmed",
124
144
  txHash: submission.txHash,
125
- raw: confirmation ?? submission.raw
145
+ raw: confirmationRaw ?? submission.raw
126
146
  };
127
147
  } catch (error) {
128
148
  throw mapExecutorError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/aptos/index.ts"],"names":[],"mappings":"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","file":"aptos.js","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransferSubmission {\n txHash?: string;\n requiresUserAction?: boolean;\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport {\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionSubmission,\n} from \"../shared\";\n\nexport interface AptosWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n signAndSubmitTransaction(\n payload: {\n function: string;\n typeArguments: string[];\n functionArguments: unknown[];\n },\n options: { signal?: AbortSignal }\n ): Promise<TransactionSubmission>;\n waitForTransaction?(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<unknown>;\n}\n\nexport function createAptosExecutor(\n adapter: AptosWalletAdapter\n): ChainExecutor<\"aptos-entry-function\"> {\n return {\n ...exposeExecutorSigner(\"aptos\", adapter),\n kinds: [\"aptos-entry-function\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n },\n\n async execute(execution, context) {\n await requestSignApproval(context, execution.chain, execution.kind, {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.signAndSubmitTransaction(\n {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n },\n { signal: context.signal }\n );\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to sign or submit Aptos transaction\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nasync function confirm(\n adapter: AptosWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\" || !adapter.waitForTransaction) {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmation ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Aptos transaction\"\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/aptos/index.ts"],"names":[],"mappings":"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","file":"aptos.js","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransactionConfirmation {\n status: \"confirmed\" | \"failed\";\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nexport function assertTransactionConfirmed(\n confirmation: TransactionConfirmation,\n options: {\n code: SwapErrorCode;\n stage: SwapErrorStage;\n message: string;\n }\n): unknown {\n if (confirmation?.status === \"confirmed\") {\n return confirmation.raw;\n }\n const status =\n confirmation &&\n typeof confirmation === \"object\" &&\n \"status\" in confirmation\n ? String(confirmation.status)\n : \"missing\";\n throw new SwapSdkError(\n options.code,\n options.stage,\n `${options.message}: wallet confirmation status is ${status}`,\n {\n cause:\n confirmation &&\n typeof confirmation === \"object\" &&\n \"raw\" in confirmation\n ? confirmation.raw\n : confirmation,\n details: { confirmationStatus: status },\n }\n );\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport {\n assertTransactionConfirmed,\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionConfirmation,\n type TransactionSubmission,\n} from \"../shared\";\n\nexport interface AptosWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n signAndSubmitTransaction(\n payload: {\n function: string;\n typeArguments: string[];\n functionArguments: unknown[];\n },\n options: { signal?: AbortSignal }\n ): Promise<TransactionSubmission>;\n waitForTransaction(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<TransactionConfirmation>;\n}\n\nexport function createAptosExecutor(\n adapter: AptosWalletAdapter\n): ChainExecutor<\"aptos-entry-function\"> {\n return {\n ...exposeExecutorSigner(\"aptos\", adapter),\n kinds: [\"aptos-entry-function\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n },\n\n async execute(execution, context) {\n await requestSignApproval(context, execution.chain, execution.kind, {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.signAndSubmitTransaction(\n {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n },\n { signal: context.signal }\n );\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to sign or submit Aptos transaction\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nasync function confirm(\n adapter: AptosWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\") {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n const confirmationRaw = assertTransactionConfirmed(confirmation, {\n code: \"BROADCAST_FAILED\",\n stage: \"broadcast\",\n message: \"Aptos transaction failed\",\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmationRaw ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Aptos transaction\"\n );\n }\n}\n"]}
@@ -58,6 +58,21 @@ function mapExecutorError(error, adapter, stage, code, message) {
58
58
  }
59
59
  return new SwapSdkError(code, stage, message, { cause: error });
60
60
  }
61
+ function assertTransactionConfirmed(confirmation, options) {
62
+ if (confirmation?.status === "confirmed") {
63
+ return confirmation.raw;
64
+ }
65
+ const status = confirmation && typeof confirmation === "object" && "status" in confirmation ? String(confirmation.status) : "missing";
66
+ throw new SwapSdkError(
67
+ options.code,
68
+ options.stage,
69
+ `${options.message}: wallet confirmation status is ${status}`,
70
+ {
71
+ cause: confirmation && typeof confirmation === "object" && "raw" in confirmation ? confirmation.raw : confirmation,
72
+ details: { confirmationStatus: status }
73
+ }
74
+ );
75
+ }
61
76
  function isUserRejection(error, adapter) {
62
77
  if (adapter.isUserRejection?.(error)) return true;
63
78
  if (typeof error !== "object" || error === null) return false;
@@ -106,7 +121,7 @@ function createAptosExecutor(adapter) {
106
121
  };
107
122
  }
108
123
  async function confirm(adapter, submission, context) {
109
- if (context.waitFor === "submitted" || !adapter.waitForTransaction) {
124
+ if (context.waitFor === "submitted") {
110
125
  return {
111
126
  status: "submitted",
112
127
  txHash: submission.txHash,
@@ -117,10 +132,15 @@ async function confirm(adapter, submission, context) {
117
132
  const confirmation = await adapter.waitForTransaction(submission.txHash, {
118
133
  signal: context.signal
119
134
  });
135
+ const confirmationRaw = assertTransactionConfirmed(confirmation, {
136
+ code: "BROADCAST_FAILED",
137
+ stage: "broadcast",
138
+ message: "Aptos transaction failed"
139
+ });
120
140
  return {
121
141
  status: "source-confirmed",
122
142
  txHash: submission.txHash,
123
- raw: confirmation ?? submission.raw
143
+ raw: confirmationRaw ?? submission.raw
124
144
  };
125
145
  } catch (error) {
126
146
  throw mapExecutorError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/aptos/index.ts"],"names":[],"mappings":"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","file":"aptos.mjs","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransferSubmission {\n txHash?: string;\n requiresUserAction?: boolean;\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport {\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionSubmission,\n} from \"../shared\";\n\nexport interface AptosWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n signAndSubmitTransaction(\n payload: {\n function: string;\n typeArguments: string[];\n functionArguments: unknown[];\n },\n options: { signal?: AbortSignal }\n ): Promise<TransactionSubmission>;\n waitForTransaction?(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<unknown>;\n}\n\nexport function createAptosExecutor(\n adapter: AptosWalletAdapter\n): ChainExecutor<\"aptos-entry-function\"> {\n return {\n ...exposeExecutorSigner(\"aptos\", adapter),\n kinds: [\"aptos-entry-function\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n },\n\n async execute(execution, context) {\n await requestSignApproval(context, execution.chain, execution.kind, {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.signAndSubmitTransaction(\n {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n },\n { signal: context.signal }\n );\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to sign or submit Aptos transaction\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nasync function confirm(\n adapter: AptosWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\" || !adapter.waitForTransaction) {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmation ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Aptos transaction\"\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/aptos/index.ts"],"names":[],"mappings":"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","file":"aptos.mjs","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransactionConfirmation {\n status: \"confirmed\" | \"failed\";\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nexport function assertTransactionConfirmed(\n confirmation: TransactionConfirmation,\n options: {\n code: SwapErrorCode;\n stage: SwapErrorStage;\n message: string;\n }\n): unknown {\n if (confirmation?.status === \"confirmed\") {\n return confirmation.raw;\n }\n const status =\n confirmation &&\n typeof confirmation === \"object\" &&\n \"status\" in confirmation\n ? String(confirmation.status)\n : \"missing\";\n throw new SwapSdkError(\n options.code,\n options.stage,\n `${options.message}: wallet confirmation status is ${status}`,\n {\n cause:\n confirmation &&\n typeof confirmation === \"object\" &&\n \"raw\" in confirmation\n ? confirmation.raw\n : confirmation,\n details: { confirmationStatus: status },\n }\n );\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport {\n assertTransactionConfirmed,\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionConfirmation,\n type TransactionSubmission,\n} from \"../shared\";\n\nexport interface AptosWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n signAndSubmitTransaction(\n payload: {\n function: string;\n typeArguments: string[];\n functionArguments: unknown[];\n },\n options: { signal?: AbortSignal }\n ): Promise<TransactionSubmission>;\n waitForTransaction(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<TransactionConfirmation>;\n}\n\nexport function createAptosExecutor(\n adapter: AptosWalletAdapter\n): ChainExecutor<\"aptos-entry-function\"> {\n return {\n ...exposeExecutorSigner(\"aptos\", adapter),\n kinds: [\"aptos-entry-function\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n },\n\n async execute(execution, context) {\n await requestSignApproval(context, execution.chain, execution.kind, {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.signAndSubmitTransaction(\n {\n function: execution.function,\n typeArguments: execution.typeArguments,\n functionArguments: execution.functionArguments,\n },\n { signal: context.signal }\n );\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to sign or submit Aptos transaction\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nasync function confirm(\n adapter: AptosWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\") {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n const confirmationRaw = assertTransactionConfirmed(confirmation, {\n code: \"BROADCAST_FAILED\",\n stage: \"broadcast\",\n message: \"Aptos transaction failed\",\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmationRaw ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Aptos transaction\"\n );\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { C as ChainRef, q as ChainExecutor } from '../registry-DRYUqs7T.mjs';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BqpFeosz.mjs';
1
+ import { a4 as ExecutorErrorAdapter, C as ChainRef, a5 as TransactionSubmission, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.mjs';
3
2
 
4
3
  interface BitcoinWalletAdapter extends ExecutorErrorAdapter {
5
4
  getChain(): ChainRef | Promise<ChainRef>;
@@ -10,9 +9,9 @@ interface BitcoinWalletAdapter extends ExecutorErrorAdapter {
10
9
  feeRate: number;
11
10
  signal?: AbortSignal;
12
11
  }): Promise<TransactionSubmission>;
13
- waitForTransaction?(txHash: string, options: {
12
+ waitForTransaction(txHash: string, options: {
14
13
  signal?: AbortSignal;
15
- }): Promise<unknown>;
14
+ }): Promise<TransactionConfirmation>;
16
15
  }
17
16
  interface BitcoinExecutorOptions {
18
17
  defaultFeeRate?: number;
@@ -1,5 +1,4 @@
1
- import { C as ChainRef, q as ChainExecutor } from '../registry-DRYUqs7T.js';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BdH3hWuP.js';
1
+ import { a4 as ExecutorErrorAdapter, C as ChainRef, a5 as TransactionSubmission, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.js';
3
2
 
4
3
  interface BitcoinWalletAdapter extends ExecutorErrorAdapter {
5
4
  getChain(): ChainRef | Promise<ChainRef>;
@@ -10,9 +9,9 @@ interface BitcoinWalletAdapter extends ExecutorErrorAdapter {
10
9
  feeRate: number;
11
10
  signal?: AbortSignal;
12
11
  }): Promise<TransactionSubmission>;
13
- waitForTransaction?(txHash: string, options: {
12
+ waitForTransaction(txHash: string, options: {
14
13
  signal?: AbortSignal;
15
- }): Promise<unknown>;
14
+ }): Promise<TransactionConfirmation>;
16
15
  }
17
16
  interface BitcoinExecutorOptions {
18
17
  defaultFeeRate?: number;
@@ -60,6 +60,21 @@ function mapExecutorError(error, adapter, stage, code, message) {
60
60
  }
61
61
  return new SwapSdkError(code, stage, message, { cause: error });
62
62
  }
63
+ function assertTransactionConfirmed(confirmation, options) {
64
+ if (confirmation?.status === "confirmed") {
65
+ return confirmation.raw;
66
+ }
67
+ const status = confirmation && typeof confirmation === "object" && "status" in confirmation ? String(confirmation.status) : "missing";
68
+ throw new SwapSdkError(
69
+ options.code,
70
+ options.stage,
71
+ `${options.message}: wallet confirmation status is ${status}`,
72
+ {
73
+ cause: confirmation && typeof confirmation === "object" && "raw" in confirmation ? confirmation.raw : confirmation,
74
+ details: { confirmationStatus: status }
75
+ }
76
+ );
77
+ }
63
78
  function isUserRejection(error, adapter) {
64
79
  if (adapter.isUserRejection?.(error)) return true;
65
80
  if (typeof error !== "object" || error === null) return false;
@@ -121,7 +136,7 @@ function invalid(message) {
121
136
  return new SwapSdkError("INVALID_TRANSACTION", "sign", message);
122
137
  }
123
138
  async function confirm(adapter, submission, context) {
124
- if (context.waitFor === "submitted" || !adapter.waitForTransaction) {
139
+ if (context.waitFor === "submitted") {
125
140
  return {
126
141
  status: "submitted",
127
142
  txHash: submission.txHash,
@@ -132,10 +147,15 @@ async function confirm(adapter, submission, context) {
132
147
  const confirmation = await adapter.waitForTransaction(submission.txHash, {
133
148
  signal: context.signal
134
149
  });
150
+ const confirmationRaw = assertTransactionConfirmed(confirmation, {
151
+ code: "BROADCAST_FAILED",
152
+ stage: "broadcast",
153
+ message: "Bitcoin transaction failed"
154
+ });
135
155
  return {
136
156
  status: "source-confirmed",
137
157
  txHash: submission.txHash,
138
- raw: confirmation ?? submission.raw
158
+ raw: confirmationRaw ?? submission.raw
139
159
  };
140
160
  } catch (error) {
141
161
  throw mapExecutorError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/bitcoin/index.ts"],"names":[],"mappings":";;;AAyCO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EAGtC,YACW,IAAA,EACA,KAAA,EACT,OAAA,EACS,OAAA,GAA+B,EAAC,EACzC;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AALJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AANX,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AASd,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAA,IAAa,KAAA;AAAA,EACnC;AAAA,EAEA,IAAI,KAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AAAA,EAEA,IAAI,OAAA,GAA+C;AACjD,IAAA,OAAO,KAAK,OAAA,CAAQ,OAAA;AAAA,EACtB;AACF,CAAA;;;AC5BO,SAAS,oBAAA,CACd,aACA,OAAA,EAIA;AACA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,GAAI,OAAA,CAAQ,cAAA,GACR,EAAE,cAAA,EAAgB,MAAM,OAAA,CAAQ,cAAA,EAAgB,EAAE,GAClD,EAAC;AAAA,IACL,GAAI,QAAQ,WAAA,GACR;AAAA,MACE,aAAa,CACX,OAAA,EACA,YACG,OAAA,CAAQ,WAAA,CAAa,SAAS,OAAO;AAAA,QAE5C;AAAC,GACP;AACF;AAEO,SAAS,cAAA,CACd,MAAA,EACA,KAAA,GAAwB,MAAA,EAClB;AACN,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACtB,EAAA,MAAM,IAAI,YAAA,CAAa,iBAAA,EAAmB,KAAA,EAAO,uBAAA,EAAyB;AAAA,IACxE,OAAO,MAAA,CAAO;AAAA,GACf,CAAA;AACH;AAEO,SAAS,WAAA,CACd,QAAA,EACA,MAAA,EACA,KAAA,GAAwB,MAAA,EAClB;AACN,EAAA,IAAI,aAAa,MAAA,EAAQ;AACzB,EAAA,MAAM,IAAI,YAAA;AAAA,IACR,gBAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAA,gBAAA,EAAmB,MAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA;AAAA,IACpE,EAAE,OAAA,EAAS,EAAE,QAAA,EAAU,QAAO;AAAE,GAClC;AACF;AAEA,eAAsB,mBAAA,CACpB,OAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,cAAA,CAAe,OAAA,CAAQ,QAAQ,MAAM,CAAA;AACrC,EAAA,MAAM,QAAQ,UAAA,GAAa,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AACnD,EAAA,cAAA,CAAe,OAAA,CAAQ,QAAQ,MAAM,CAAA;AACvC;AAEO,SAAS,gBAAA,CACd,KAAA,EACA,OAAA,EACA,KAAA,EACA,MACA,OAAA,EACc;AACd,EAAA,IAAI,KAAA,YAAiB,cAAc,OAAO,KAAA;AAC1C,EAAA,IAAI,eAAA,CAAgB,KAAA,EAAO,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,IAAI,YAAA,CAAa,eAAA,EAAiB,KAAA,EAAO,2BAAA,EAA6B;AAAA,MAC3E,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAI,aAAa,IAAA,EAAM,KAAA,EAAO,SAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AAChE;AAEA,SAAS,eAAA,CACP,OACA,OAAA,EACS;AACT,EAAA,IAAI,OAAA,CAAQ,eAAA,GAAkB,KAAK,CAAA,EAAG,OAAO,IAAA;AAC7C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,IAAA,GAAO,MAAA,IAAU,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,MAAA;AAC5C,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,iBAAA,EAAmB,OAAO,IAAA;AACxD,EAAA,MAAM,OAAA,GACJ,SAAA,IAAa,KAAA,IAAS,OAAO,KAAA,CAAM,YAAY,QAAA,GAC3C,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY,GAC1B,EAAA;AACN,EAAA,OAAO,2DAAA,CAA4D,KAAK,OAAO,CAAA;AACjF;;;AClFO,SAAS,qBAAA,CACd,OAAA,EACA,OAAA,GAAkC,EAAC,EACA;AACnC,EAAA,OAAO;AAAA,IACL,GAAG,oBAAA,CAAqB,KAAA,EAAO,OAAO,CAAA;AAAA,IACtC,KAAA,EAAO,CAAC,kBAAkB,CAAA;AAAA,IAE1B,MAAM,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS;AACjC,MAAA,cAAA,CAAe,OAAA,CAAQ,QAAQ,MAAM,CAAA;AACrC,MAAA,WAAA,CAAY,SAAA,CAAU,KAAA,EAAO,MAAM,OAAA,CAAQ,UAAU,CAAA;AACrD,MAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,CAAU,SAAA,CAAU,cAAc,CAAA,EAAG;AAChD,QAAA,MAAM,QAAQ,iCAAiC,CAAA;AAAA,MACjD;AACA,MAAA,cAAA,CAAe,WAAW,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,SAAA,EAAW,OAAA,EAAS;AAChC,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,SAAA,EAAW,OAAO,CAAA;AACjD,MAAA,MAAM,mBAAA,CAAoB,OAAA,EAAS,SAAA,CAAU,KAAA,EAAO,UAAU,IAAA,EAAM;AAAA,QAClE,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,gBAAgB,SAAA,CAAU,cAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AACD,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,MAAM,QAAQ,YAAA,CAAa;AAAA,UACtC,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,gBAAgB,SAAA,CAAU,cAAA;AAAA,UAC1B,OAAA;AAAA,UACA,QAAQ,OAAA,CAAQ;AAAA,SACjB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,gBAAA;AAAA,UACJ,KAAA;AAAA,UACA,OAAA;AAAA,UACA,WAAA;AAAA,UACA,kBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AAAA,IAC7C;AAAA,GACF;AACF;AAEA,SAAS,cAAA,CACP,WACA,OAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,OAAA,CAAQ,cAAA;AAC7C,EAAA,IAAI,OAAA,KAAY,UAAa,CAAC,MAAA,CAAO,SAAS,OAAO,CAAA,IAAK,WAAW,CAAA,EAAG;AACtE,IAAA,MAAM,QAAQ,mDAAmD,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,QAAQ,OAAA,EAA+B;AAC9C,EAAA,OAAO,IAAI,YAAA,CAAa,qBAAA,EAAuB,MAAA,EAAQ,OAAO,CAAA;AAChE;AAEA,eAAe,OAAA,CACb,OAAA,EACA,UAAA,EACA,OAAA,EAC+B;AAC/B,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,WAAA,IAAe,CAAC,QAAQ,kBAAA,EAAoB;AAClE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,WAAA;AAAA,MACR,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,GAAI,WAAW,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,UAAA,CAAW,GAAA,EAAI,GAAI;AAAC,KAChE;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,kBAAA,CAAmB,WAAW,MAAA,EAAQ;AAAA,MACvE,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,kBAAA;AAAA,MACR,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,GAAA,EAAK,gBAAgB,UAAA,CAAW;AAAA,KAClC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,gBAAA;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF","file":"bitcoin.js","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransferSubmission {\n txHash?: string;\n requiresUserAction?: boolean;\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import { SwapSdkError } from \"../../core/errors\";\nimport type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport type { SwapExecution } from \"../../types/execution\";\nimport {\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionSubmission,\n} from \"../shared\";\n\ntype BitcoinExecution = Extract<\n SwapExecution,\n { kind: \"bitcoin-transfer\" }\n>;\n\nexport interface BitcoinWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n isAddress(address: string): boolean;\n sendTransfer(input: {\n amount: string;\n depositAddress: string;\n feeRate: number;\n signal?: AbortSignal;\n }): Promise<TransactionSubmission>;\n waitForTransaction?(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<unknown>;\n}\n\nexport interface BitcoinExecutorOptions {\n defaultFeeRate?: number;\n}\n\nexport function createBitcoinExecutor(\n adapter: BitcoinWalletAdapter,\n options: BitcoinExecutorOptions = {}\n): ChainExecutor<\"bitcoin-transfer\"> {\n return {\n ...exposeExecutorSigner(\"btc\", adapter),\n kinds: [\"bitcoin-transfer\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n if (!adapter.isAddress(execution.depositAddress)) {\n throw invalid(\"Invalid Bitcoin deposit address\");\n }\n resolveFeeRate(execution, options);\n },\n\n async execute(execution, context) {\n const feeRate = resolveFeeRate(execution, options);\n await requestSignApproval(context, execution.chain, execution.kind, {\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.sendTransfer({\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n signal: context.signal,\n });\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to broadcast Bitcoin transfer\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nfunction resolveFeeRate(\n execution: BitcoinExecution,\n options: BitcoinExecutorOptions\n): number {\n const feeRate = execution.feeRate ?? options.defaultFeeRate;\n if (feeRate === undefined || !Number.isFinite(feeRate) || feeRate <= 0) {\n throw invalid(\"Bitcoin fee rate is required and must be positive\");\n }\n return feeRate;\n}\n\nfunction invalid(message: string): SwapSdkError {\n return new SwapSdkError(\"INVALID_TRANSACTION\", \"sign\", message);\n}\n\nasync function confirm(\n adapter: BitcoinWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\" || !adapter.waitForTransaction) {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmation ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Bitcoin transfer\"\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/bitcoin/index.ts"],"names":[],"mappings":"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","file":"bitcoin.js","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransactionConfirmation {\n status: \"confirmed\" | \"failed\";\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nexport function assertTransactionConfirmed(\n confirmation: TransactionConfirmation,\n options: {\n code: SwapErrorCode;\n stage: SwapErrorStage;\n message: string;\n }\n): unknown {\n if (confirmation?.status === \"confirmed\") {\n return confirmation.raw;\n }\n const status =\n confirmation &&\n typeof confirmation === \"object\" &&\n \"status\" in confirmation\n ? String(confirmation.status)\n : \"missing\";\n throw new SwapSdkError(\n options.code,\n options.stage,\n `${options.message}: wallet confirmation status is ${status}`,\n {\n cause:\n confirmation &&\n typeof confirmation === \"object\" &&\n \"raw\" in confirmation\n ? confirmation.raw\n : confirmation,\n details: { confirmationStatus: status },\n }\n );\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import { SwapSdkError } from \"../../core/errors\";\nimport type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport type { SwapExecution } from \"../../types/execution\";\nimport {\n assertTransactionConfirmed,\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionConfirmation,\n type TransactionSubmission,\n} from \"../shared\";\n\ntype BitcoinExecution = Extract<\n SwapExecution,\n { kind: \"bitcoin-transfer\" }\n>;\n\nexport interface BitcoinWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n isAddress(address: string): boolean;\n sendTransfer(input: {\n amount: string;\n depositAddress: string;\n feeRate: number;\n signal?: AbortSignal;\n }): Promise<TransactionSubmission>;\n waitForTransaction(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<TransactionConfirmation>;\n}\n\nexport interface BitcoinExecutorOptions {\n defaultFeeRate?: number;\n}\n\nexport function createBitcoinExecutor(\n adapter: BitcoinWalletAdapter,\n options: BitcoinExecutorOptions = {}\n): ChainExecutor<\"bitcoin-transfer\"> {\n return {\n ...exposeExecutorSigner(\"btc\", adapter),\n kinds: [\"bitcoin-transfer\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n if (!adapter.isAddress(execution.depositAddress)) {\n throw invalid(\"Invalid Bitcoin deposit address\");\n }\n resolveFeeRate(execution, options);\n },\n\n async execute(execution, context) {\n const feeRate = resolveFeeRate(execution, options);\n await requestSignApproval(context, execution.chain, execution.kind, {\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.sendTransfer({\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n signal: context.signal,\n });\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to broadcast Bitcoin transfer\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nfunction resolveFeeRate(\n execution: BitcoinExecution,\n options: BitcoinExecutorOptions\n): number {\n const feeRate = execution.feeRate ?? options.defaultFeeRate;\n if (feeRate === undefined || !Number.isFinite(feeRate) || feeRate <= 0) {\n throw invalid(\"Bitcoin fee rate is required and must be positive\");\n }\n return feeRate;\n}\n\nfunction invalid(message: string): SwapSdkError {\n return new SwapSdkError(\"INVALID_TRANSACTION\", \"sign\", message);\n}\n\nasync function confirm(\n adapter: BitcoinWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\") {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n const confirmationRaw = assertTransactionConfirmed(confirmation, {\n code: \"BROADCAST_FAILED\",\n stage: \"broadcast\",\n message: \"Bitcoin transaction failed\",\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmationRaw ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Bitcoin transfer\"\n );\n }\n}\n"]}
@@ -58,6 +58,21 @@ function mapExecutorError(error, adapter, stage, code, message) {
58
58
  }
59
59
  return new SwapSdkError(code, stage, message, { cause: error });
60
60
  }
61
+ function assertTransactionConfirmed(confirmation, options) {
62
+ if (confirmation?.status === "confirmed") {
63
+ return confirmation.raw;
64
+ }
65
+ const status = confirmation && typeof confirmation === "object" && "status" in confirmation ? String(confirmation.status) : "missing";
66
+ throw new SwapSdkError(
67
+ options.code,
68
+ options.stage,
69
+ `${options.message}: wallet confirmation status is ${status}`,
70
+ {
71
+ cause: confirmation && typeof confirmation === "object" && "raw" in confirmation ? confirmation.raw : confirmation,
72
+ details: { confirmationStatus: status }
73
+ }
74
+ );
75
+ }
61
76
  function isUserRejection(error, adapter) {
62
77
  if (adapter.isUserRejection?.(error)) return true;
63
78
  if (typeof error !== "object" || error === null) return false;
@@ -119,7 +134,7 @@ function invalid(message) {
119
134
  return new SwapSdkError("INVALID_TRANSACTION", "sign", message);
120
135
  }
121
136
  async function confirm(adapter, submission, context) {
122
- if (context.waitFor === "submitted" || !adapter.waitForTransaction) {
137
+ if (context.waitFor === "submitted") {
123
138
  return {
124
139
  status: "submitted",
125
140
  txHash: submission.txHash,
@@ -130,10 +145,15 @@ async function confirm(adapter, submission, context) {
130
145
  const confirmation = await adapter.waitForTransaction(submission.txHash, {
131
146
  signal: context.signal
132
147
  });
148
+ const confirmationRaw = assertTransactionConfirmed(confirmation, {
149
+ code: "BROADCAST_FAILED",
150
+ stage: "broadcast",
151
+ message: "Bitcoin transaction failed"
152
+ });
133
153
  return {
134
154
  status: "source-confirmed",
135
155
  txHash: submission.txHash,
136
- raw: confirmation ?? submission.raw
156
+ raw: confirmationRaw ?? submission.raw
137
157
  };
138
158
  } catch (error) {
139
159
  throw mapExecutorError(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/bitcoin/index.ts"],"names":[],"mappings":"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","file":"bitcoin.mjs","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransferSubmission {\n txHash?: string;\n requiresUserAction?: boolean;\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import { SwapSdkError } from \"../../core/errors\";\nimport type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport type { SwapExecution } from \"../../types/execution\";\nimport {\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionSubmission,\n} from \"../shared\";\n\ntype BitcoinExecution = Extract<\n SwapExecution,\n { kind: \"bitcoin-transfer\" }\n>;\n\nexport interface BitcoinWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n isAddress(address: string): boolean;\n sendTransfer(input: {\n amount: string;\n depositAddress: string;\n feeRate: number;\n signal?: AbortSignal;\n }): Promise<TransactionSubmission>;\n waitForTransaction?(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<unknown>;\n}\n\nexport interface BitcoinExecutorOptions {\n defaultFeeRate?: number;\n}\n\nexport function createBitcoinExecutor(\n adapter: BitcoinWalletAdapter,\n options: BitcoinExecutorOptions = {}\n): ChainExecutor<\"bitcoin-transfer\"> {\n return {\n ...exposeExecutorSigner(\"btc\", adapter),\n kinds: [\"bitcoin-transfer\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n if (!adapter.isAddress(execution.depositAddress)) {\n throw invalid(\"Invalid Bitcoin deposit address\");\n }\n resolveFeeRate(execution, options);\n },\n\n async execute(execution, context) {\n const feeRate = resolveFeeRate(execution, options);\n await requestSignApproval(context, execution.chain, execution.kind, {\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.sendTransfer({\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n signal: context.signal,\n });\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to broadcast Bitcoin transfer\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nfunction resolveFeeRate(\n execution: BitcoinExecution,\n options: BitcoinExecutorOptions\n): number {\n const feeRate = execution.feeRate ?? options.defaultFeeRate;\n if (feeRate === undefined || !Number.isFinite(feeRate) || feeRate <= 0) {\n throw invalid(\"Bitcoin fee rate is required and must be positive\");\n }\n return feeRate;\n}\n\nfunction invalid(message: string): SwapSdkError {\n return new SwapSdkError(\"INVALID_TRANSACTION\", \"sign\", message);\n}\n\nasync function confirm(\n adapter: BitcoinWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\" || !adapter.waitForTransaction) {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmation ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Bitcoin transfer\"\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/executors/shared.ts","../../src/executors/bitcoin/index.ts"],"names":[],"mappings":"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","file":"bitcoin.mjs","sourcesContent":["export type SwapErrorCode =\n | \"HTTP_ERROR\"\n | \"API_ERROR\"\n | \"RATE_LIMITED\"\n | \"AUTH_FAILED\"\n | \"REQUEST_ABORTED\"\n | \"REQUEST_TIMEOUT\"\n | \"INVALID_REQUEST\"\n | \"INVALID_API_RESPONSE\"\n | \"QUOTE_EXPIRED\"\n | \"ROUTE_NOT_FOUND\"\n | \"EXECUTOR_NOT_FOUND\"\n | \"UNSUPPORTED_CHAIN\"\n | \"CHAIN_MISMATCH\"\n | \"INVALID_TRANSACTION\"\n | \"USER_REJECTED\"\n | \"INSUFFICIENT_BALANCE\"\n | \"APPROVAL_FAILED\"\n | \"SIGNING_FAILED\"\n | \"BROADCAST_FAILED\"\n | \"ORDER_SUBMIT_FAILED\"\n | \"ORDER_TIMEOUT\"\n | \"REPORT_FAILED\";\n\nexport type SwapErrorStage =\n | \"quote\"\n | \"build\"\n | \"approve\"\n | \"sign\"\n | \"broadcast\"\n | \"submit\"\n | \"report\"\n | \"status\"\n | \"history\";\n\nexport interface SwapSdkErrorOptions {\n retryable?: boolean;\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class SwapSdkError extends Error {\n readonly name = \"SwapSdkError\";\n\n constructor(\n readonly code: SwapErrorCode,\n readonly stage: SwapErrorStage,\n message: string,\n readonly options: SwapSdkErrorOptions = {}\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get retryable(): boolean {\n return this.options.retryable ?? false;\n }\n\n get cause(): unknown {\n return this.options.cause;\n }\n\n get details(): Record<string, unknown> | undefined {\n return this.options.details;\n }\n}\n\nexport function asSwapSdkError(\n error: unknown,\n stage: SwapErrorStage\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n\n const message = error instanceof Error ? error.message : String(error);\n return new SwapSdkError(\"API_ERROR\", stage, message, { cause: error });\n}\n","import {\n SwapSdkError,\n type SwapErrorCode,\n type SwapErrorStage,\n} from \"../core/errors\";\nimport type {\n ChainExecutor,\n ExecutionContext,\n MessageSignOptions,\n} from \"../core/registry\";\nimport type { ChainRef } from \"../types/chain\";\n\nexport interface TransactionSubmission {\n txHash: string;\n raw?: unknown;\n}\n\nexport interface TransactionConfirmation {\n status: \"confirmed\" | \"failed\";\n raw?: unknown;\n}\n\nexport interface ExecutorErrorAdapter {\n isUserRejection?(error: unknown): boolean;\n /** Identity serialized as `mca.signer.identityKey` for MCA quotes. */\n getIdentityKey?(): string | Promise<string>;\n /**\n * Optional offline message signing for flows such as MCA relayer withdraw.\n * Chain transfer executors do not call this during normal swap execution.\n */\n signMessage?(\n message: string,\n options?: MessageSignOptions\n ): Promise<string>;\n}\n\nexport function exposeExecutorSigner(\n signerChain: string,\n adapter: ExecutorErrorAdapter\n): Pick<\n ChainExecutor,\n \"signerChain\" | \"getIdentityKey\" | \"signMessage\"\n> {\n return {\n signerChain,\n ...(adapter.getIdentityKey\n ? { getIdentityKey: () => adapter.getIdentityKey!() }\n : {}),\n ...(adapter.signMessage\n ? {\n signMessage: (\n message: string,\n options?: MessageSignOptions\n ) => adapter.signMessage!(message, options),\n }\n : {}),\n };\n}\n\nexport function throwIfAborted(\n signal: AbortSignal | undefined,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (!signal?.aborted) return;\n throw new SwapSdkError(\"REQUEST_ABORTED\", stage, \"Execution was aborted\", {\n cause: signal.reason,\n });\n}\n\nexport function assertChain(\n expected: ChainRef,\n actual: ChainRef,\n stage: SwapErrorStage = \"sign\"\n): void {\n if (expected === actual) return;\n throw new SwapSdkError(\n \"CHAIN_MISMATCH\",\n stage,\n `Connected chain ${actual} does not match execution chain ${expected}`,\n { details: { expected, actual } }\n );\n}\n\nexport async function requestSignApproval(\n context: ExecutionContext,\n chain: ChainRef,\n kind: string,\n summary: Record<string, unknown>\n): Promise<void> {\n throwIfAborted(context.signal, \"sign\");\n await context.beforeSign?.({ chain, kind, summary });\n throwIfAborted(context.signal, \"sign\");\n}\n\nexport function mapExecutorError(\n error: unknown,\n adapter: ExecutorErrorAdapter,\n stage: SwapErrorStage,\n code: SwapErrorCode,\n message: string\n): SwapSdkError {\n if (error instanceof SwapSdkError) return error;\n if (isUserRejection(error, adapter)) {\n return new SwapSdkError(\"USER_REJECTED\", stage, \"User rejected the request\", {\n cause: error,\n });\n }\n return new SwapSdkError(code, stage, message, { cause: error });\n}\n\nexport function assertTransactionConfirmed(\n confirmation: TransactionConfirmation,\n options: {\n code: SwapErrorCode;\n stage: SwapErrorStage;\n message: string;\n }\n): unknown {\n if (confirmation?.status === \"confirmed\") {\n return confirmation.raw;\n }\n const status =\n confirmation &&\n typeof confirmation === \"object\" &&\n \"status\" in confirmation\n ? String(confirmation.status)\n : \"missing\";\n throw new SwapSdkError(\n options.code,\n options.stage,\n `${options.message}: wallet confirmation status is ${status}`,\n {\n cause:\n confirmation &&\n typeof confirmation === \"object\" &&\n \"raw\" in confirmation\n ? confirmation.raw\n : confirmation,\n details: { confirmationStatus: status },\n }\n );\n}\n\nfunction isUserRejection(\n error: unknown,\n adapter: ExecutorErrorAdapter\n): boolean {\n if (adapter.isUserRejection?.(error)) return true;\n if (typeof error !== \"object\" || error === null) return false;\n const code = \"code\" in error ? error.code : undefined;\n if (code === 4001 || code === \"ACTION_REJECTED\") return true;\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? error.message.toLowerCase()\n : \"\";\n return /user (rejected|denied)|request rejected|cancelled by user/.test(message);\n}\n","import { SwapSdkError } from \"../../core/errors\";\nimport type {\n ChainExecutionResult,\n ChainExecutor,\n ExecutionContext,\n} from \"../../core/registry\";\nimport type { ChainRef } from \"../../types/chain\";\nimport type { SwapExecution } from \"../../types/execution\";\nimport {\n assertTransactionConfirmed,\n assertChain,\n exposeExecutorSigner,\n mapExecutorError,\n requestSignApproval,\n throwIfAborted,\n type ExecutorErrorAdapter,\n type TransactionConfirmation,\n type TransactionSubmission,\n} from \"../shared\";\n\ntype BitcoinExecution = Extract<\n SwapExecution,\n { kind: \"bitcoin-transfer\" }\n>;\n\nexport interface BitcoinWalletAdapter extends ExecutorErrorAdapter {\n getChain(): ChainRef | Promise<ChainRef>;\n isAddress(address: string): boolean;\n sendTransfer(input: {\n amount: string;\n depositAddress: string;\n feeRate: number;\n signal?: AbortSignal;\n }): Promise<TransactionSubmission>;\n waitForTransaction(\n txHash: string,\n options: { signal?: AbortSignal }\n ): Promise<TransactionConfirmation>;\n}\n\nexport interface BitcoinExecutorOptions {\n defaultFeeRate?: number;\n}\n\nexport function createBitcoinExecutor(\n adapter: BitcoinWalletAdapter,\n options: BitcoinExecutorOptions = {}\n): ChainExecutor<\"bitcoin-transfer\"> {\n return {\n ...exposeExecutorSigner(\"btc\", adapter),\n kinds: [\"bitcoin-transfer\"],\n\n async validate(execution, context) {\n throwIfAborted(context.signal, \"sign\");\n assertChain(execution.chain, await adapter.getChain());\n if (!adapter.isAddress(execution.depositAddress)) {\n throw invalid(\"Invalid Bitcoin deposit address\");\n }\n resolveFeeRate(execution, options);\n },\n\n async execute(execution, context) {\n const feeRate = resolveFeeRate(execution, options);\n await requestSignApproval(context, execution.chain, execution.kind, {\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n });\n let submission: TransactionSubmission;\n try {\n submission = await adapter.sendTransfer({\n amount: execution.amount,\n depositAddress: execution.depositAddress,\n feeRate,\n signal: context.signal,\n });\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed to broadcast Bitcoin transfer\"\n );\n }\n return confirm(adapter, submission, context);\n },\n };\n}\n\nfunction resolveFeeRate(\n execution: BitcoinExecution,\n options: BitcoinExecutorOptions\n): number {\n const feeRate = execution.feeRate ?? options.defaultFeeRate;\n if (feeRate === undefined || !Number.isFinite(feeRate) || feeRate <= 0) {\n throw invalid(\"Bitcoin fee rate is required and must be positive\");\n }\n return feeRate;\n}\n\nfunction invalid(message: string): SwapSdkError {\n return new SwapSdkError(\"INVALID_TRANSACTION\", \"sign\", message);\n}\n\nasync function confirm(\n adapter: BitcoinWalletAdapter,\n submission: TransactionSubmission,\n context: ExecutionContext\n): Promise<ChainExecutionResult> {\n if (context.waitFor === \"submitted\") {\n return {\n status: \"submitted\",\n txHash: submission.txHash,\n ...(submission.raw !== undefined ? { raw: submission.raw } : {}),\n };\n }\n try {\n const confirmation = await adapter.waitForTransaction(submission.txHash, {\n signal: context.signal,\n });\n const confirmationRaw = assertTransactionConfirmed(confirmation, {\n code: \"BROADCAST_FAILED\",\n stage: \"broadcast\",\n message: \"Bitcoin transaction failed\",\n });\n return {\n status: \"source-confirmed\",\n txHash: submission.txHash,\n raw: confirmationRaw ?? submission.raw,\n };\n } catch (error) {\n throw mapExecutorError(\n error,\n adapter,\n \"broadcast\",\n \"BROADCAST_FAILED\",\n \"Failed while confirming Bitcoin transfer\"\n );\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { T as EvmTx, V as EvmSigningRequest, U as EvmApproval, q as ChainExecutor } from '../registry-DRYUqs7T.mjs';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BqpFeosz.mjs';
1
+ import { a4 as ExecutorErrorAdapter, V as EvmTx, a5 as TransactionSubmission, Y as EvmSigningRequest, X as EvmApproval, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.mjs';
3
2
 
4
3
  interface EvmWalletAdapter extends ExecutorErrorAdapter {
5
4
  sendTransaction(tx: EvmTx, options: {
@@ -9,9 +8,9 @@ interface EvmWalletAdapter extends ExecutorErrorAdapter {
9
8
  signal?: AbortSignal;
10
9
  }): Promise<string>;
11
10
  isApprovalRequired?(approval: EvmApproval): boolean | Promise<boolean>;
12
- waitForTransaction?(txHash: string, options: {
11
+ waitForTransaction(txHash: string, options: {
13
12
  signal?: AbortSignal;
14
- }): Promise<unknown>;
13
+ }): Promise<TransactionConfirmation>;
15
14
  }
16
15
  declare function createEvmExecutor(adapter: EvmWalletAdapter): ChainExecutor<"evm-transaction" | "evm-signature">;
17
16
 
@@ -1,5 +1,4 @@
1
- import { T as EvmTx, V as EvmSigningRequest, U as EvmApproval, q as ChainExecutor } from '../registry-DRYUqs7T.js';
2
- import { E as ExecutorErrorAdapter, T as TransactionSubmission } from '../shared-BdH3hWuP.js';
1
+ import { a4 as ExecutorErrorAdapter, V as EvmTx, a5 as TransactionSubmission, Y as EvmSigningRequest, X as EvmApproval, T as TransactionConfirmation, q as ChainExecutor } from '../shared-BEZXY_BM.js';
3
2
 
4
3
  interface EvmWalletAdapter extends ExecutorErrorAdapter {
5
4
  sendTransaction(tx: EvmTx, options: {
@@ -9,9 +8,9 @@ interface EvmWalletAdapter extends ExecutorErrorAdapter {
9
8
  signal?: AbortSignal;
10
9
  }): Promise<string>;
11
10
  isApprovalRequired?(approval: EvmApproval): boolean | Promise<boolean>;
12
- waitForTransaction?(txHash: string, options: {
11
+ waitForTransaction(txHash: string, options: {
13
12
  signal?: AbortSignal;
14
- }): Promise<unknown>;
13
+ }): Promise<TransactionConfirmation>;
15
14
  }
16
15
  declare function createEvmExecutor(adapter: EvmWalletAdapter): ChainExecutor<"evm-transaction" | "evm-signature">;
17
16