@prb/effect-solana 1.0.0-beta.5 → 1.0.0-beta.6

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 (37) hide show
  1. package/dist/core/errors/index.d.ts +1 -1
  2. package/dist/core/errors/index.d.ts.map +1 -1
  3. package/dist/core/errors/index.js +1 -1
  4. package/dist/core/errors/index.js.map +1 -1
  5. package/dist/core/errors/{transaction.d.ts → tx.d.ts} +1 -1
  6. package/dist/core/errors/tx.d.ts.map +1 -0
  7. package/dist/core/errors/{transaction.js → tx.js} +1 -1
  8. package/dist/core/errors/tx.js.map +1 -0
  9. package/dist/testing-kit/index.d.ts +2 -2
  10. package/dist/testing-kit/index.d.ts.map +1 -1
  11. package/dist/testing-kit/index.js +1 -1
  12. package/dist/testing-kit/index.js.map +1 -1
  13. package/dist/testing-kit/{mock-transaction-service.d.ts → mock-tx-service.d.ts} +1 -1
  14. package/dist/testing-kit/mock-tx-service.d.ts.map +1 -0
  15. package/dist/testing-kit/{mock-transaction-service.js → mock-tx-service.js} +1 -1
  16. package/dist/testing-kit/mock-tx-service.js.map +1 -0
  17. package/dist/testing-kit/test-layer.d.ts +1 -1
  18. package/dist/testing-kit/test-layer.d.ts.map +1 -1
  19. package/dist/testing-kit/test-layer.js +1 -1
  20. package/dist/testing-kit/test-layer.js.map +1 -1
  21. package/dist/web3.js/index.d.ts +1 -1
  22. package/dist/web3.js/index.d.ts.map +1 -1
  23. package/dist/web3.js/index.js +1 -1
  24. package/dist/web3.js/index.js.map +1 -1
  25. package/dist/web3.js/legacy-signer.js +1 -1
  26. package/dist/web3.js/legacy-signer.js.map +1 -1
  27. package/dist/web3.js/{transaction-bridge.d.ts → tx-bridge.d.ts} +1 -1
  28. package/dist/web3.js/tx-bridge.d.ts.map +1 -0
  29. package/dist/web3.js/{transaction-bridge.js → tx-bridge.js} +1 -1
  30. package/dist/web3.js/tx-bridge.js.map +1 -0
  31. package/package.json +1 -1
  32. package/dist/core/errors/transaction.d.ts.map +0 -1
  33. package/dist/core/errors/transaction.js.map +0 -1
  34. package/dist/testing-kit/mock-transaction-service.d.ts.map +0 -1
  35. package/dist/testing-kit/mock-transaction-service.js.map +0 -1
  36. package/dist/web3.js/transaction-bridge.d.ts.map +0 -1
  37. package/dist/web3.js/transaction-bridge.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  export * from "./account.js";
2
2
  export * from "./predicates.js";
3
3
  export * from "./rpc.js";
4
- export * from "./transaction.js";
4
+ export * from "./tx.js";
5
5
  export * from "./wallet.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export * from "./account.js";
2
2
  export * from "./predicates.js";
3
3
  export * from "./rpc.js";
4
- export * from "./transaction.js";
4
+ export * from "./tx.js";
5
5
  export * from "./wallet.js";
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./account.js\";\nexport * from \"./predicates.js\";\nexport * from \"./rpc.js\";\nexport * from \"./transaction.js\";\nexport * from \"./wallet.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./account.js\";\nexport * from \"./predicates.js\";\nexport * from \"./rpc.js\";\nexport * from \"./tx.js\";\nexport * from \"./wallet.js\";\n"]}
@@ -62,4 +62,4 @@ export declare const catchUserRejectionWith: {
62
62
  <A, E, R, A2, E2, R2>(effect: Effect.Effect<A, E, R>, fallback: Effect.Effect<A2, E2, R2>): Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2>;
63
63
  };
64
64
  export {};
65
- //# sourceMappingURL=transaction.d.ts.map
65
+ //# sourceMappingURL=tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx.d.ts","sourceRoot":"","sources":["../../../src/core/errors/tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;AASxC,qBAAa,iBAAkB,SAAQ,sBAKtC;CAAG;;;;;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAOzC;CAAG;;;;;;;;;AAEJ,qBAAa,sBAAuB,SAAQ,2BAQ3C;CAAG;;;;;;;AAEJ,qBAAa,uBAAwB,SAAQ,4BAM5C;CAAG;;;;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAM1C;CAAG;;;;;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAO1C;CAAG;AASJ,eAAO,MAAM,yBAAyB,gDAAwD,CAAC;AAM/F,eAAO,MAAM,mBAAmB,gDAA4B,CAAC;AAiE7D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBjE;AAoBD,eAAO,MAAM,kBAAkB,EAAE;IAC/B,CAAC,EAAE,EACD,QAAQ,EAAE,EAAE,GACX,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,EAAE,GACX,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;CAY5D,CAAC;AAcF,eAAO,MAAM,sBAAsB,EAAE;IACnC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAClC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAClC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAYtE,CAAC"}
@@ -86,4 +86,4 @@ export function isLikelyUserRejectedError(error) {
86
86
  }
87
87
  export const catchUserRejection = dual(2, (effect, fallback) => Effect.catchIf(effect, isUserRejectedError, () => Effect.succeed(fallback)));
88
88
  export const catchUserRejectionWith = dual(2, (effect, fallback) => Effect.catchIf(effect, isUserRejectedError, () => fallback));
89
- //# sourceMappingURL=transaction.js.map
89
+ //# sourceMappingURL=tx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx.js","sourceRoot":"","sources":["../../../src/core/errors/tx.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Schema } from \"effect\";\nimport { dual } from \"effect/Function\";\n\nimport { hasTaggedErrorShape, isTaggedError } from \"./predicates.js\";\n\n// =============================================================================\n// Error Classes\n// =============================================================================\n\nexport class UserRejectedError extends Schema.TaggedError<UserRejectedError>()(\n \"UserRejectedError\",\n {\n message: Schema.String,\n }\n) {}\n\nexport class TransactionSendError extends Schema.TaggedError<TransactionSendError>()(\n \"TransactionSendError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n signature: Schema.optional(Schema.String),\n }\n) {}\n\nexport class TransactionFailedError extends Schema.TaggedError<TransactionFailedError>()(\n \"TransactionFailedError\",\n {\n cause: Schema.optional(Schema.Unknown),\n logs: Schema.optional(Schema.Array(Schema.String)),\n message: Schema.String,\n signature: Schema.String,\n }\n) {}\n\nexport class TransactionTimeoutError extends Schema.TaggedError<TransactionTimeoutError>()(\n \"TransactionTimeoutError\",\n {\n message: Schema.String,\n signature: Schema.String,\n }\n) {}\n\nexport class BlockhashExpiredError extends Schema.TaggedError<BlockhashExpiredError>()(\n \"BlockhashExpiredError\",\n {\n blockhash: Schema.String,\n message: Schema.String,\n }\n) {}\n\nexport class SimulationFailedError extends Schema.TaggedError<SimulationFailedError>()(\n \"SimulationFailedError\",\n {\n cause: Schema.optional(Schema.Unknown),\n logs: Schema.optional(Schema.Array(Schema.String)),\n message: Schema.String,\n }\n) {}\n\n// =============================================================================\n// User Rejection Detection\n// =============================================================================\n\n/**\n * Strict _tag guard for UserRejectedError.\n */\nexport const isTaggedUserRejectedError = isTaggedError<UserRejectedError>(\"UserRejectedError\");\n\n/**\n * Type guard for UserRejectedError.\n * Works with both instanceof and _tag (for serialized errors).\n */\nexport const isUserRejectedError = isTaggedUserRejectedError;\n\n/**\n * EIP-1193 / Phantom / Solflare standard error code for user rejection.\n * Both Phantom and Solflare use 4001 following Ethereum's standard.\n */\nconst USER_REJECTION_CODE = 4001;\n\n/**\n * Fallback message fragments if code is not available.\n */\nconst USER_REJECTION_MESSAGES = [\"user rejected\", \"rejected the request\"];\n\nfunction isRejectionCode(code: unknown): boolean {\n return code === USER_REJECTION_CODE || code === `${USER_REJECTION_CODE}`;\n}\n\nfunction hasRejectionMessage(message: string): boolean {\n const lower = message.toLowerCase();\n return USER_REJECTION_MESSAGES.some((m) => lower.includes(m));\n}\n\nfunction checkCause(cause: unknown, depth: number): boolean {\n if (!cause || depth > 3) {\n return false;\n }\n\n // Check for code 4001 (standard rejection code)\n if (typeof cause === \"object\" && \"code\" in cause && isRejectionCode(cause.code)) {\n return true;\n }\n\n // Check message\n if (typeof cause === \"string\") {\n return hasRejectionMessage(cause);\n }\n\n if (cause instanceof Error) {\n if (isRejectionCode((cause as { code?: unknown }).code)) {\n return true;\n }\n if (hasRejectionMessage(cause.message)) {\n return true;\n }\n return checkCause((cause as { cause?: unknown }).cause, depth + 1);\n }\n\n if (typeof cause === \"object\" && \"message\" in cause && typeof cause.message === \"string\") {\n return hasRejectionMessage(cause.message);\n }\n\n return false;\n}\n\n/**\n * Lenient user rejection check for Solana wallet errors.\n *\n * Solana wallets (Phantom, Solflare) use EIP-1193 error code 4001 for user rejection,\n * same as EVM wallets. The error gets wrapped in SignatureError by @prb/effect-solana.\n *\n * Detects:\n * - Tagged UserRejectedError\n * - Tagged WalletNotConnectedError (user didn't connect)\n * - SignatureError with code 4001 or rejection message in cause\n */\nexport function isLikelyUserRejectedError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n // Tagged UserRejectedError\n if (isUserRejectedError(error)) {\n return true;\n }\n\n // Tagged WalletNotConnectedError - treat as user cancellation\n if (hasTaggedErrorShape(error) && error._tag === \"WalletNotConnectedError\") {\n return true;\n }\n\n // SignatureError - check cause for code 4001 or rejection message\n if (hasTaggedErrorShape(error) && error._tag === \"SignatureError\") {\n return checkCause((error as { cause?: unknown }).cause, 0);\n }\n\n return false;\n}\n\n// =============================================================================\n// Effect Operators\n// =============================================================================\n\n/**\n * Catch UserRejectedError and return a fallback value.\n * Useful for treating rejection as \"cancelled\" rather than \"failed\".\n *\n * @example\n * ```ts\n * const result = await Effect.runPromise(\n * sendTransaction(tx).pipe(catchUserRejection(null))\n * );\n * if (result === null) {\n * // User cancelled - reset to idle\n * }\n * ```\n */\nexport const catchUserRejection: {\n <A2>(\n fallback: A2\n ): <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ) => Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R>;\n <A, E, R, A2>(\n effect: Effect.Effect<A, E, R>,\n fallback: A2\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R>;\n} = dual(\n 2,\n <A, E, R, A2>(\n effect: Effect.Effect<A, E, R>,\n fallback: A2\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R> =>\n Effect.catchIf(effect, isUserRejectedError, () => Effect.succeed(fallback)) as Effect.Effect<\n A | A2,\n Exclude<E, UserRejectedError>,\n R\n >\n);\n\n/**\n * Catch UserRejectedError and run a fallback effect.\n *\n * @example\n * ```ts\n * const result = await Effect.runPromise(\n * sendTransaction(tx).pipe(\n * catchUserRejectionWith(Effect.succeed({ cancelled: true }))\n * )\n * );\n * ```\n */\nexport const catchUserRejectionWith: {\n <A2, E2, R2>(\n fallback: Effect.Effect<A2, E2, R2>\n ): <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ) => Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2>;\n <A, E, R, A2, E2, R2>(\n effect: Effect.Effect<A, E, R>,\n fallback: Effect.Effect<A2, E2, R2>\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2>;\n} = dual(\n 2,\n <A, E, R, A2, E2, R2>(\n effect: Effect.Effect<A, E, R>,\n fallback: Effect.Effect<A2, E2, R2>\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2> =>\n Effect.catchIf(effect, isUserRejectedError, () => fallback) as Effect.Effect<\n A | A2,\n Exclude<E, UserRejectedError> | E2,\n R | R2\n >\n);\n"]}
@@ -10,8 +10,8 @@ export type { MockSignerServiceConfig } from "./mock-signer-service.js";
10
10
  export { makeMockSignerServiceLayer } from "./mock-signer-service.js";
11
11
  export type { MockTokenServiceConfig } from "./mock-token-service.js";
12
12
  export { makeMockTokenServiceLayer } from "./mock-token-service.js";
13
- export type { MockTransactionServiceConfig } from "./mock-transaction-service.js";
14
- export { makeMockTransactionServiceLayer } from "./mock-transaction-service.js";
13
+ export type { MockTransactionServiceConfig } from "./mock-tx-service.js";
14
+ export { makeMockTransactionServiceLayer } from "./mock-tx-service.js";
15
15
  export type { TestLayerConfig } from "./test-layer.js";
16
16
  export { makeEffectSolanaTestLayer } from "./test-layer.js";
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing-kit/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClG,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAGhF,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing-kit/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClG,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,YAAY,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAGvE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -5,6 +5,6 @@ export { makeMockPdaServiceLayer } from "./mock-pda-service.js";
5
5
  export { makeMockRpc, makeMockRpcServiceLayer } from "./mock-rpc-service.js";
6
6
  export { makeMockSignerServiceLayer } from "./mock-signer-service.js";
7
7
  export { makeMockTokenServiceLayer } from "./mock-token-service.js";
8
- export { makeMockTransactionServiceLayer } from "./mock-transaction-service.js";
8
+ export { makeMockTransactionServiceLayer } from "./mock-tx-service.js";
9
9
  export { makeEffectSolanaTestLayer } from "./test-layer.js";
10
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing-kit/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAIhF,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["/**\n * Testing Kit for effect-solana\n *\n * This module exports mock builders and test utilities for downstream\n * consumers to easily test code that depends on effect-solana services.\n *\n * @example\n * ```typescript\n * import { makeEffectSolanaTestLayer } from \"@prb/effect-solana/testing-kit\";\n *\n * const testLayer = makeEffectSolanaTestLayer({\n * balanceService: {\n * getSolBalance: () => Effect.succeed(1000000000n as Lamports),\n * },\n * });\n * ```\n */\n\n// Fixtures\nexport {\n TEST_ADDRESS,\n TEST_ADDRESS_2,\n TEST_CLUSTER,\n TEST_MINT,\n TEST_SIGNATURE,\n TEST_WALLET,\n} from \"./_fixtures/addresses.js\";\n\n// Test helpers\nexport { assertLeft, assertRight, expectTaggedFailure, makeMockServiceLayer } from \"./helpers.js\";\nexport type { MockBalanceServiceConfig } from \"./mock-balance-service.js\";\nexport { makeMockBalanceServiceLayer } from \"./mock-balance-service.js\";\nexport type { MockPdaServiceConfig } from \"./mock-pda-service.js\";\nexport { makeMockPdaServiceLayer } from \"./mock-pda-service.js\";\n// Mock layer builders\nexport type { MockRpcServiceConfig } from \"./mock-rpc-service.js\";\nexport { makeMockRpc, makeMockRpcServiceLayer } from \"./mock-rpc-service.js\";\nexport type { MockSignerServiceConfig } from \"./mock-signer-service.js\";\nexport { makeMockSignerServiceLayer } from \"./mock-signer-service.js\";\nexport type { MockTokenServiceConfig } from \"./mock-token-service.js\";\nexport { makeMockTokenServiceLayer } from \"./mock-token-service.js\";\nexport type { MockTransactionServiceConfig } from \"./mock-transaction-service.js\";\nexport { makeMockTransactionServiceLayer } from \"./mock-transaction-service.js\";\n\n// Test layer composer\nexport type { TestLayerConfig } from \"./test-layer.js\";\nexport { makeEffectSolanaTestLayer } from \"./test-layer.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing-kit/index.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,cAAc,EACd,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAIvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["/**\n * Testing Kit for effect-solana\n *\n * This module exports mock builders and test utilities for downstream\n * consumers to easily test code that depends on effect-solana services.\n *\n * @example\n * ```typescript\n * import { makeEffectSolanaTestLayer } from \"@prb/effect-solana/testing-kit\";\n *\n * const testLayer = makeEffectSolanaTestLayer({\n * balanceService: {\n * getSolBalance: () => Effect.succeed(1000000000n as Lamports),\n * },\n * });\n * ```\n */\n\n// Fixtures\nexport {\n TEST_ADDRESS,\n TEST_ADDRESS_2,\n TEST_CLUSTER,\n TEST_MINT,\n TEST_SIGNATURE,\n TEST_WALLET,\n} from \"./_fixtures/addresses.js\";\n\n// Test helpers\nexport { assertLeft, assertRight, expectTaggedFailure, makeMockServiceLayer } from \"./helpers.js\";\nexport type { MockBalanceServiceConfig } from \"./mock-balance-service.js\";\nexport { makeMockBalanceServiceLayer } from \"./mock-balance-service.js\";\nexport type { MockPdaServiceConfig } from \"./mock-pda-service.js\";\nexport { makeMockPdaServiceLayer } from \"./mock-pda-service.js\";\n// Mock layer builders\nexport type { MockRpcServiceConfig } from \"./mock-rpc-service.js\";\nexport { makeMockRpc, makeMockRpcServiceLayer } from \"./mock-rpc-service.js\";\nexport type { MockSignerServiceConfig } from \"./mock-signer-service.js\";\nexport { makeMockSignerServiceLayer } from \"./mock-signer-service.js\";\nexport type { MockTokenServiceConfig } from \"./mock-token-service.js\";\nexport { makeMockTokenServiceLayer } from \"./mock-token-service.js\";\nexport type { MockTransactionServiceConfig } from \"./mock-tx-service.js\";\nexport { makeMockTransactionServiceLayer } from \"./mock-tx-service.js\";\n\n// Test layer composer\nexport type { TestLayerConfig } from \"./test-layer.js\";\nexport { makeEffectSolanaTestLayer } from \"./test-layer.js\";\n"]}
@@ -18,4 +18,4 @@ export type MockTransactionServiceConfig = {
18
18
  simulate?: <T extends SignableTransactionMessage>(tx: T) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;
19
19
  };
20
20
  export declare const makeMockTransactionServiceLayer: (config?: MockTransactionServiceConfig) => Layer.Layer<TransactionService>;
21
- //# sourceMappingURL=mock-transaction-service.d.ts.map
21
+ //# sourceMappingURL=mock-tx-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-tx-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-tx-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,CACN,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC/F,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,0BAA0B,EAAE,KACvC,MAAM,CAAC,MAAM,CAChB,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EAClD,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC1C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAChB,WAAW,GAAG,uBAAuB,EACrC,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EACvD,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CACL,EAAE,EAAE,WAAW,GAAG,uBAAuB,KACtC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CACR,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,sBAAsB,CAAC,CAAC;IACzF,cAAc,CAAC,EAAE,CACf,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAChB,kBAAkB,EAChB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,mBAAmB,CAAC,EAAE,CACpB,KAAK,EAAE,SAAS,oBAAoB,EAAE,EACtC,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAChB,SAAS,kBAAkB,EAAE,EAC3B,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC9C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;CAClG,CAAC;AA6DF,eAAO,MAAM,+BAA+B,GAC1C,SAAQ,4BAAiC,KACxC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CACoD,CAAC"}
@@ -26,4 +26,4 @@ const defaultConfig = {
26
26
  simulate: () => Effect.void,
27
27
  };
28
28
  export const makeMockTransactionServiceLayer = (config = {}) => makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);
29
- //# sourceMappingURL=mock-transaction-service.js.map
29
+ //# sourceMappingURL=mock-tx-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-tx-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-tx-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA4DpD,MAAM,aAAa,GAA2C;IAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAgC,CAAC;IAC7D,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CACrB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS;QACT,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAA2B,CAAC;IACvD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,cAA2B,CAAC,CAAC;IAC5E,cAAc,EAAE,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC,CACJ;IACH,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAA2C,CAAC;IACvE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAA0C,CAAC,CAAC;IAC9F,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;CAC5B,CAAC;AAgCF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,SAAuC,EAAE,EACR,EAAE,CACnC,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import type { Instruction } from \"@solana/instructions\";\nimport type { Signature } from \"@solana/keys\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport type {\n SimulationFailedError,\n TransactionFailedError,\n TransactionSendError,\n TransactionTimeoutError,\n WalletNotConnectedError,\n} from \"#src/core/errors/index.js\";\nimport type {\n ConfirmOpts,\n SignableTransactionMessage,\n TransactionBatchItem,\n TransactionBatchOpts,\n TransactionReceipt,\n} from \"#src/tx/index.js\";\nimport { TransactionService } from \"#src/tx/index.js\";\nimport { TEST_SIGNATURE } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock TransactionService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockTransactionServiceConfig = {\n build?: (\n instructions: readonly Instruction[]\n ) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;\n signAll?: (\n txs: readonly SignableTransactionMessage[]\n ) => Effect.Effect<\n readonly (Transaction & TransactionWithLifetime)[],\n TransactionSendError | WalletNotConnectedError\n >;\n sign?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<\n Transaction & TransactionWithLifetime,\n TransactionSendError | WalletNotConnectedError\n >;\n sendAll?: (\n txs: readonly (Transaction & TransactionWithLifetime)[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<readonly Signature[], TransactionSendError>;\n send?: (\n tx: Transaction & TransactionWithLifetime\n ) => Effect.Effect<Signature, TransactionSendError>;\n confirm?: (\n signature: Signature,\n opts?: ConfirmOpts\n ) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;\n sendAndConfirm?: (\n instructions: readonly Instruction[],\n opts?: ConfirmOpts\n ) => Effect.Effect<\n TransactionReceipt,\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n sendAndConfirmBatch?: (\n items: readonly TransactionBatchItem[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<\n readonly TransactionReceipt[],\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n simulate?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;\n};\n\nconst defaultConfig: Required<MockTransactionServiceConfig> = {\n build: () => Effect.succeed({} as SignableTransactionMessage),\n confirm: (signature) =>\n Effect.succeed({\n confirmations: 10n,\n signature,\n slot: 1000n,\n }),\n send: () => Effect.succeed(TEST_SIGNATURE as Signature),\n sendAll: (txs) => Effect.succeed(txs.map(() => TEST_SIGNATURE as Signature)),\n sendAndConfirm: () =>\n Effect.succeed({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }),\n sendAndConfirmBatch: (items) =>\n Effect.succeed(\n items.map(() => ({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }))\n ),\n sign: () => Effect.succeed({} as Transaction & TransactionWithLifetime),\n signAll: (txs) => Effect.succeed(txs.map(() => ({}) as Transaction & TransactionWithLifetime)),\n simulate: () => Effect.void,\n};\n\n/**\n * Creates a mock TransactionService layer for testing\n *\n * @param config - Optional configuration to override default mock behaviors\n *\n * @example\n * ```typescript\n * // Basic usage with defaults\n * const layer = makeMockTransactionServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockTransactionServiceLayer({\n * sendAndConfirm: () => Effect.fail(\n * new TransactionFailedError({\n * signature: TEST_SIGNATURE,\n * message: \"Transaction failed\",\n * logs: [],\n * })\n * ),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const txService = yield* TransactionService;\n * const receipt = yield* txService.sendAndConfirm(instructions);\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockTransactionServiceLayer = (\n config: MockTransactionServiceConfig = {}\n): Layer.Layer<TransactionService> =>\n makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);\n"]}
@@ -12,7 +12,7 @@ import type { MockPdaServiceConfig } from "./mock-pda-service.js";
12
12
  import type { MockRpcServiceConfig } from "./mock-rpc-service.js";
13
13
  import type { MockSignerServiceConfig } from "./mock-signer-service.js";
14
14
  import type { MockTokenServiceConfig } from "./mock-token-service.js";
15
- import type { MockTransactionServiceConfig } from "./mock-transaction-service.js";
15
+ import type { MockTransactionServiceConfig } from "./mock-tx-service.js";
16
16
  export type TestLayerConfig = {
17
17
  rpcService?: MockRpcServiceConfig;
18
18
  signerService?: MockSignerServiceConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"test-layer.d.ts","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EACL,aAAa,EAEb,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAqBlF,MAAM,MAAM,eAAe,GAAG;IAI5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IAKxC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAK1C,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAKtC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC;IAKlD,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAK1C,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;CAC3C,CAAC;AAwDF,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,eAAoB,GAC3B,KAAK,CAAC,KAAK,CACV,UAAU,GACV,aAAa,GACb,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,aAAa,GACb,aAAa,CAChB,CAyDA"}
1
+ {"version":3,"file":"test-layer.d.ts","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EACL,aAAa,EAEb,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAqBzE,MAAM,MAAM,eAAe,GAAG;IAI5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IAKxC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAK1C,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAKtC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC;IAKlD,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAK1C,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;CAC3C,CAAC;AAwDF,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,eAAoB,GAC3B,KAAK,CAAC,KAAK,CACV,UAAU,GACV,aAAa,GACb,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,aAAa,GACb,aAAa,CAChB,CAyDA"}
@@ -9,7 +9,7 @@ import { makeMockPdaServiceLayer } from "./mock-pda-service.js";
9
9
  import { makeMockRpcServiceLayer } from "./mock-rpc-service.js";
10
10
  import { makeMockSignerServiceLayer } from "./mock-signer-service.js";
11
11
  import { makeMockTokenServiceLayer } from "./mock-token-service.js";
12
- import { makeMockTransactionServiceLayer } from "./mock-transaction-service.js";
12
+ import { makeMockTransactionServiceLayer } from "./mock-tx-service.js";
13
13
  const applicationServices = Layer.mergeAll(BalanceServiceLive, TokenServiceLive, TransactionServiceLive, PdaServiceLive, ProgramReaderLive, ProgramWriterLive);
14
14
  export function makeEffectSolanaTestLayer(config = {}) {
15
15
  const boundaryLayers = Layer.mergeAll(makeMockRpcServiceLayer(config.rpcService ?? {}), makeMockSignerServiceLayer(config.signerService ?? {}));
@@ -1 +1 @@
1
- {"version":3,"file":"test-layer.js","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAsEhF,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;AAuCF,MAAM,UAAU,yBAAyB,CACvC,SAA0B,EAAE;IAY5B,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CACnC,uBAAuB,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAChD,0BAA0B,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CACvD,CAAC;IAGF,IAAI,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;IAEnC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,2BAA2B,CAAC,MAAM,CAAC,cAAc,CAAC,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,yBAAyB,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,+BAA+B,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAC3D,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAE1E,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAS7C,CAAC;AACJ,CAAC","sourcesContent":["import { Layer } from \"effect\";\nimport type { BalanceService } from \"#src/balance/index.js\";\nimport { BalanceServiceLive } from \"#src/balance/index.js\";\nimport type { PdaService } from \"#src/pda/index.js\";\nimport { PdaServiceLive } from \"#src/pda/index.js\";\nimport type { ProgramReaderShape, ProgramWriterShape } from \"#src/program/index.js\";\nimport {\n ProgramReader,\n ProgramReaderLive,\n ProgramWriter,\n ProgramWriterLive,\n} from \"#src/program/index.js\";\nimport type { RpcService } from \"#src/rpc/index.js\";\nimport type { SignerService } from \"#src/signer/index.js\";\nimport type { TokenService } from \"#src/token/index.js\";\nimport { TokenServiceLive } from \"#src/token/index.js\";\nimport type { TransactionService } from \"#src/tx/index.js\";\nimport { TransactionServiceLive } from \"#src/tx/index.js\";\nimport type { MockBalanceServiceConfig } from \"./mock-balance-service.js\";\nimport { makeMockBalanceServiceLayer } from \"./mock-balance-service.js\";\nimport type { MockPdaServiceConfig } from \"./mock-pda-service.js\";\nimport { makeMockPdaServiceLayer } from \"./mock-pda-service.js\";\nimport type { MockRpcServiceConfig } from \"./mock-rpc-service.js\";\nimport { makeMockRpcServiceLayer } from \"./mock-rpc-service.js\";\nimport type { MockSignerServiceConfig } from \"./mock-signer-service.js\";\nimport { makeMockSignerServiceLayer } from \"./mock-signer-service.js\";\nimport type { MockTokenServiceConfig } from \"./mock-token-service.js\";\nimport { makeMockTokenServiceLayer } from \"./mock-token-service.js\";\nimport type { MockTransactionServiceConfig } from \"./mock-transaction-service.js\";\nimport { makeMockTransactionServiceLayer } from \"./mock-transaction-service.js\";\n\n/**\n * Configuration for the test layer composer\n *\n * @example\n * ```typescript\n * const layer = makeEffectSolanaTestLayer({\n * rpcService: {\n * getRpc: () => Effect.succeed(myMockRpc),\n * },\n * signerService: {\n * address: \"DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK\" as Address,\n * },\n * balanceService: {\n * getSolBalance: () => Effect.succeed(5000000000n as Lamports),\n * },\n * });\n * ```\n */\nexport type TestLayerConfig = {\n /**\n * Configuration overrides for the mock RpcService\n */\n rpcService?: MockRpcServiceConfig;\n\n /**\n * Configuration overrides for the mock SignerService\n */\n signerService?: MockSignerServiceConfig;\n\n /**\n * Configuration overrides for the mock BalanceService\n */\n balanceService?: MockBalanceServiceConfig;\n\n /**\n * Configuration overrides for the mock TokenService\n */\n tokenService?: MockTokenServiceConfig;\n\n /**\n * Configuration overrides for the mock TransactionService\n */\n transactionService?: MockTransactionServiceConfig;\n\n /**\n * Configuration overrides for the mock PdaService\n */\n pdaService?: MockPdaServiceConfig;\n\n /**\n * Configuration overrides for ProgramReader.\n */\n programReaderService?: ProgramReaderShape;\n\n /**\n * Configuration overrides for ProgramWriter.\n */\n programWriterService?: ProgramWriterShape;\n};\n\n/**\n * Internal layer combining all application services\n * Requires RpcService and SignerService to be provided\n *\n * Layer composition order matters:\n * 1. Base services (directly client-bound, no service deps)\n * 2. Dependent services (require base services)\n */\nconst applicationServices = Layer.mergeAll(\n BalanceServiceLive,\n TokenServiceLive,\n TransactionServiceLive,\n PdaServiceLive,\n ProgramReaderLive,\n ProgramWriterLive\n);\n\n/**\n * Creates a complete effect-solana test layer with mocked boundaries\n *\n * This layer provides all effect-solana services with mocked RpcService\n * and SignerService boundaries. The mock boundaries use sensible defaults\n * that can be overridden via configuration.\n *\n * Use this for integration-style tests where you want real service implementations\n * with controlled network boundaries.\n *\n * @param config - Optional configuration to customize mock behaviors\n * @returns A Layer providing all effect-solana services\n *\n * @example\n * ```typescript\n * import { describe, expect, it } from \"@effect/vitest\";\n * import { Effect, Layer } from \"effect\";\n * import { BalanceService } from \"@prb/effect-solana\";\n * import { makeEffectSolanaTestLayer } from \"@prb/effect-solana/testing-kit\";\n *\n * describe(\"MyFeature\", () => {\n * const testLayer = makeEffectSolanaTestLayer({\n * balanceService: {\n * getSolBalance: () => Effect.succeed(1000000000n as Lamports),\n * },\n * });\n *\n * it.effect(\"reads balance\", () =>\n * Effect.gen(function* () {\n * const balanceService = yield* BalanceService;\n * const balance = yield* balanceService.getSolBalance(address);\n * expect(balance).toBe(1000000000n);\n * }).pipe(Effect.provide(testLayer))\n * );\n * });\n * ```\n */\nexport function makeEffectSolanaTestLayer(\n config: TestLayerConfig = {}\n): Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n> {\n // Create boundary mocks - use real services if no config provided\n const boundaryLayers = Layer.mergeAll(\n makeMockRpcServiceLayer(config.rpcService ?? {}),\n makeMockSignerServiceLayer(config.signerService ?? {})\n );\n\n // Create service mocks if config is provided, otherwise use real implementations from applicationServices\n let serviceMockLayer = Layer.empty;\n\n if (config.balanceService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockBalanceServiceLayer(config.balanceService)\n );\n }\n if (config.tokenService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTokenServiceLayer(config.tokenService)\n );\n }\n if (config.transactionService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTransactionServiceLayer(config.transactionService)\n );\n }\n if (config.pdaService) {\n serviceMockLayer = Layer.merge(serviceMockLayer, makeMockPdaServiceLayer(config.pdaService));\n }\n if (config.programReaderService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramReader, ProgramReader.of(config.programReaderService))\n );\n }\n if (config.programWriterService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramWriter, ProgramWriter.of(config.programWriterService))\n );\n }\n\n // Provide boundary mocks and service mocks to application services\n const baseLayer = Layer.provideMerge(applicationServices, boundaryLayers);\n\n return Layer.merge(baseLayer, serviceMockLayer) as Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n >;\n}\n"]}
1
+ {"version":3,"file":"test-layer.js","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAsEvE,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;AAuCF,MAAM,UAAU,yBAAyB,CACvC,SAA0B,EAAE;IAY5B,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CACnC,uBAAuB,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAChD,0BAA0B,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CACvD,CAAC;IAGF,IAAI,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;IAEnC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,2BAA2B,CAAC,MAAM,CAAC,cAAc,CAAC,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,yBAAyB,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,+BAA+B,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAC3D,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAE1E,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAS7C,CAAC;AACJ,CAAC","sourcesContent":["import { Layer } from \"effect\";\nimport type { BalanceService } from \"#src/balance/index.js\";\nimport { BalanceServiceLive } from \"#src/balance/index.js\";\nimport type { PdaService } from \"#src/pda/index.js\";\nimport { PdaServiceLive } from \"#src/pda/index.js\";\nimport type { ProgramReaderShape, ProgramWriterShape } from \"#src/program/index.js\";\nimport {\n ProgramReader,\n ProgramReaderLive,\n ProgramWriter,\n ProgramWriterLive,\n} from \"#src/program/index.js\";\nimport type { RpcService } from \"#src/rpc/index.js\";\nimport type { SignerService } from \"#src/signer/index.js\";\nimport type { TokenService } from \"#src/token/index.js\";\nimport { TokenServiceLive } from \"#src/token/index.js\";\nimport type { TransactionService } from \"#src/tx/index.js\";\nimport { TransactionServiceLive } from \"#src/tx/index.js\";\nimport type { MockBalanceServiceConfig } from \"./mock-balance-service.js\";\nimport { makeMockBalanceServiceLayer } from \"./mock-balance-service.js\";\nimport type { MockPdaServiceConfig } from \"./mock-pda-service.js\";\nimport { makeMockPdaServiceLayer } from \"./mock-pda-service.js\";\nimport type { MockRpcServiceConfig } from \"./mock-rpc-service.js\";\nimport { makeMockRpcServiceLayer } from \"./mock-rpc-service.js\";\nimport type { MockSignerServiceConfig } from \"./mock-signer-service.js\";\nimport { makeMockSignerServiceLayer } from \"./mock-signer-service.js\";\nimport type { MockTokenServiceConfig } from \"./mock-token-service.js\";\nimport { makeMockTokenServiceLayer } from \"./mock-token-service.js\";\nimport type { MockTransactionServiceConfig } from \"./mock-tx-service.js\";\nimport { makeMockTransactionServiceLayer } from \"./mock-tx-service.js\";\n\n/**\n * Configuration for the test layer composer\n *\n * @example\n * ```typescript\n * const layer = makeEffectSolanaTestLayer({\n * rpcService: {\n * getRpc: () => Effect.succeed(myMockRpc),\n * },\n * signerService: {\n * address: \"DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK\" as Address,\n * },\n * balanceService: {\n * getSolBalance: () => Effect.succeed(5000000000n as Lamports),\n * },\n * });\n * ```\n */\nexport type TestLayerConfig = {\n /**\n * Configuration overrides for the mock RpcService\n */\n rpcService?: MockRpcServiceConfig;\n\n /**\n * Configuration overrides for the mock SignerService\n */\n signerService?: MockSignerServiceConfig;\n\n /**\n * Configuration overrides for the mock BalanceService\n */\n balanceService?: MockBalanceServiceConfig;\n\n /**\n * Configuration overrides for the mock TokenService\n */\n tokenService?: MockTokenServiceConfig;\n\n /**\n * Configuration overrides for the mock TransactionService\n */\n transactionService?: MockTransactionServiceConfig;\n\n /**\n * Configuration overrides for the mock PdaService\n */\n pdaService?: MockPdaServiceConfig;\n\n /**\n * Configuration overrides for ProgramReader.\n */\n programReaderService?: ProgramReaderShape;\n\n /**\n * Configuration overrides for ProgramWriter.\n */\n programWriterService?: ProgramWriterShape;\n};\n\n/**\n * Internal layer combining all application services\n * Requires RpcService and SignerService to be provided\n *\n * Layer composition order matters:\n * 1. Base services (directly client-bound, no service deps)\n * 2. Dependent services (require base services)\n */\nconst applicationServices = Layer.mergeAll(\n BalanceServiceLive,\n TokenServiceLive,\n TransactionServiceLive,\n PdaServiceLive,\n ProgramReaderLive,\n ProgramWriterLive\n);\n\n/**\n * Creates a complete effect-solana test layer with mocked boundaries\n *\n * This layer provides all effect-solana services with mocked RpcService\n * and SignerService boundaries. The mock boundaries use sensible defaults\n * that can be overridden via configuration.\n *\n * Use this for integration-style tests where you want real service implementations\n * with controlled network boundaries.\n *\n * @param config - Optional configuration to customize mock behaviors\n * @returns A Layer providing all effect-solana services\n *\n * @example\n * ```typescript\n * import { describe, expect, it } from \"@effect/vitest\";\n * import { Effect, Layer } from \"effect\";\n * import { BalanceService } from \"@prb/effect-solana\";\n * import { makeEffectSolanaTestLayer } from \"@prb/effect-solana/testing-kit\";\n *\n * describe(\"MyFeature\", () => {\n * const testLayer = makeEffectSolanaTestLayer({\n * balanceService: {\n * getSolBalance: () => Effect.succeed(1000000000n as Lamports),\n * },\n * });\n *\n * it.effect(\"reads balance\", () =>\n * Effect.gen(function* () {\n * const balanceService = yield* BalanceService;\n * const balance = yield* balanceService.getSolBalance(address);\n * expect(balance).toBe(1000000000n);\n * }).pipe(Effect.provide(testLayer))\n * );\n * });\n * ```\n */\nexport function makeEffectSolanaTestLayer(\n config: TestLayerConfig = {}\n): Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n> {\n // Create boundary mocks - use real services if no config provided\n const boundaryLayers = Layer.mergeAll(\n makeMockRpcServiceLayer(config.rpcService ?? {}),\n makeMockSignerServiceLayer(config.signerService ?? {})\n );\n\n // Create service mocks if config is provided, otherwise use real implementations from applicationServices\n let serviceMockLayer = Layer.empty;\n\n if (config.balanceService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockBalanceServiceLayer(config.balanceService)\n );\n }\n if (config.tokenService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTokenServiceLayer(config.tokenService)\n );\n }\n if (config.transactionService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTransactionServiceLayer(config.transactionService)\n );\n }\n if (config.pdaService) {\n serviceMockLayer = Layer.merge(serviceMockLayer, makeMockPdaServiceLayer(config.pdaService));\n }\n if (config.programReaderService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramReader, ProgramReader.of(config.programReaderService))\n );\n }\n if (config.programWriterService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramWriter, ProgramWriter.of(config.programWriterService))\n );\n }\n\n // Provide boundary mocks and service mocks to application services\n const baseLayer = Layer.provideMerge(applicationServices, boundaryLayers);\n\n return Layer.merge(baseLayer, serviceMockLayer) as Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n >;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export * from "./layers.js";
2
2
  export * from "./legacy-signer.js";
3
- export * from "./transaction-bridge.js";
3
+ export * from "./tx-bridge.js";
4
4
  export * from "./types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web3.js/index.ts"],"names":[],"mappings":"AA2BA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web3.js/index.ts"],"names":[],"mappings":"AA2BA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export * from "./layers.js";
2
2
  export * from "./legacy-signer.js";
3
- export * from "./transaction-bridge.js";
3
+ export * from "./tx-bridge.js";
4
4
  export * from "./types.js";
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web3.js/index.ts"],"names":[],"mappings":"AA2BA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC","sourcesContent":["/**\n * Legacy @solana/web3.js compatibility layer.\n *\n * This module provides utilities for bridging between legacy @solana/web3.js v1.x\n * wallet adapters and the modern @solana/kit v2.x types used by @prb/effect-solana.\n *\n * @module @prb/effect-solana/compat\n *\n * @remarks\n * Requires `@solana/web3.js` v1.95.0+ to be installed as a peer dependency.\n *\n * @example\n * ```typescript\n * import { makeSolanaLayerWithLegacyAdapter } from \"@prb/effect-solana/compat\";\n *\n * const layer = makeSolanaLayerWithLegacyAdapter(\n * { cluster: \"devnet\" },\n * () => ({\n * publicKey: walletProvider?.publicKey ?? null,\n * connected: !!walletProvider?.publicKey,\n * signTransaction: walletProvider.signTransaction.bind(walletProvider),\n * signAllTransactions: walletProvider.signAllTransactions.bind(walletProvider),\n * })\n * );\n * ```\n */\n\nexport * from \"./layers.js\";\nexport * from \"./legacy-signer.js\";\nexport * from \"./transaction-bridge.js\";\nexport * from \"./types.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web3.js/index.ts"],"names":[],"mappings":"AA2BA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC","sourcesContent":["/**\n * Legacy @solana/web3.js compatibility layer.\n *\n * This module provides utilities for bridging between legacy @solana/web3.js v1.x\n * wallet adapters and the modern @solana/kit v2.x types used by @prb/effect-solana.\n *\n * @module @prb/effect-solana/compat\n *\n * @remarks\n * Requires `@solana/web3.js` v1.95.0+ to be installed as a peer dependency.\n *\n * @example\n * ```typescript\n * import { makeSolanaLayerWithLegacyAdapter } from \"@prb/effect-solana/compat\";\n *\n * const layer = makeSolanaLayerWithLegacyAdapter(\n * { cluster: \"devnet\" },\n * () => ({\n * publicKey: walletProvider?.publicKey ?? null,\n * connected: !!walletProvider?.publicKey,\n * signTransaction: walletProvider.signTransaction.bind(walletProvider),\n * signAllTransactions: walletProvider.signAllTransactions.bind(walletProvider),\n * })\n * );\n * ```\n */\n\nexport * from \"./layers.js\";\nexport * from \"./legacy-signer.js\";\nexport * from \"./tx-bridge.js\";\nexport * from \"./types.js\";\n"]}
@@ -2,7 +2,7 @@ import { Effect, Layer } from "effect";
2
2
  import { SignatureError, WalletNotConnectedError } from "#src/core/errors/index.js";
3
3
  import { SignerService } from "#src/signer/index.js";
4
4
  import { SpanNames } from "#src/telemetry/index.js";
5
- import { fromWeb3Transaction, toWeb3Transaction } from "./transaction-bridge.js";
5
+ import { fromWeb3Transaction, toWeb3Transaction } from "./tx-bridge.js";
6
6
  import { publicKeyToAddress } from "./types.js";
7
7
  export function makeSignerServiceFromLegacyAdapter(getAdapter) {
8
8
  return Layer.succeed(SignerService, SignerService.of({
@@ -1 +1 @@
1
- {"version":3,"file":"legacy-signer.js","sourceRoot":"","sources":["../../src/web3.js/legacy-signer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Layer } from \"effect\";\nimport { SignatureError, WalletNotConnectedError } from \"#src/core/errors/index.js\";\nimport { SignerService } from \"#src/signer/index.js\";\nimport { SpanNames } from \"#src/telemetry/index.js\";\nimport { fromWeb3Transaction, toWeb3Transaction } from \"./transaction-bridge.js\";\nimport type { LegacyWalletAdapter } from \"./types.js\";\nimport { publicKeyToAddress } from \"./types.js\";\n\n/**\n * Create a SignerService layer from a legacy wallet adapter.\n *\n * This factory bridges the gap between legacy @solana/web3.js wallet adapters\n * (like @reown/appkit-adapter-solana) and the modern @solana/kit types used\n * by @prb/effect-solana.\n *\n * @param getAdapter - Function that returns the current wallet adapter\n * @returns A Layer providing SignerService\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { makeSignerServiceFromLegacyAdapter } from \"@prb/effect-solana/compat\";\n *\n * const signerLayer = makeSignerServiceFromLegacyAdapter(() => ({\n * publicKey: walletProvider?.publicKey ?? null,\n * connected: !!walletProvider?.publicKey,\n * signTransaction: walletProvider.signTransaction.bind(walletProvider),\n * signAllTransactions: walletProvider.signAllTransactions.bind(walletProvider),\n * }));\n * ```\n */\nexport function makeSignerServiceFromLegacyAdapter(\n getAdapter: () => LegacyWalletAdapter\n): Layer.Layer<SignerService> {\n return Layer.succeed(\n SignerService,\n SignerService.of({\n getAddress: () =>\n Effect.gen(function* () {\n const adapter = getAdapter();\n if (!(adapter.connected && adapter.publicKey)) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Runtime validation before type assertion\n if (\n typeof adapter.publicKey !== \"object\" ||\n adapter.publicKey === null ||\n typeof (adapter.publicKey as { toBase58?: unknown }).toBase58 !== \"function\"\n ) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n message: \"Invalid publicKey: missing toBase58 method\",\n })\n );\n }\n\n return publicKeyToAddress(adapter.publicKey as { toBase58(): string });\n }).pipe(Effect.withSpan(SpanNames.SIGNER_GET_ADDRESS)),\n\n isConnected: () => Effect.sync(() => getAdapter().connected),\n\n signAllTransactions: (txs) =>\n Effect.gen(function* () {\n // Early return for empty arrays\n if (txs.length === 0) {\n return [] as typeof txs;\n }\n\n const adapter = getAdapter();\n if (!adapter.connected) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Convert all kit → web3.js\n const legacyTxs = yield* Effect.all(\n txs.map((tx) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message:\n cause instanceof Error ? cause.message : \"Failed to convert transaction\",\n }),\n try: () => toWeb3Transaction(tx),\n })\n )\n );\n\n // Sign all with legacy adapter\n const signedAll = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to sign transactions\",\n }),\n try: () => adapter.signAllTransactions(legacyTxs),\n });\n\n // Convert all web3.js → kit\n // Cast is necessary because we can't preserve the generic T through web3.js conversion\n return signedAll.map((signed) =>\n fromWeb3Transaction(signed as Parameters<typeof fromWeb3Transaction>[0])\n ) as typeof txs;\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n signTransaction: (tx) =>\n Effect.gen(function* () {\n const adapter = getAdapter();\n if (!adapter.connected) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Convert kit → web3.js\n const legacyTx = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to convert transaction\",\n }),\n try: () => toWeb3Transaction(tx),\n });\n\n // Sign with legacy adapter\n const signed = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to sign transaction\",\n }),\n try: () => adapter.signTransaction(legacyTx),\n });\n\n // Convert web3.js → kit\n // Cast is necessary because we can't preserve the generic T through web3.js conversion\n return fromWeb3Transaction(\n signed as Parameters<typeof fromWeb3Transaction>[0]\n ) as typeof tx;\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n })\n );\n}\n"]}
1
+ {"version":3,"file":"legacy-signer.js","sourceRoot":"","sources":["../../src/web3.js/legacy-signer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Layer } from \"effect\";\nimport { SignatureError, WalletNotConnectedError } from \"#src/core/errors/index.js\";\nimport { SignerService } from \"#src/signer/index.js\";\nimport { SpanNames } from \"#src/telemetry/index.js\";\nimport { fromWeb3Transaction, toWeb3Transaction } from \"./tx-bridge.js\";\nimport type { LegacyWalletAdapter } from \"./types.js\";\nimport { publicKeyToAddress } from \"./types.js\";\n\n/**\n * Create a SignerService layer from a legacy wallet adapter.\n *\n * This factory bridges the gap between legacy @solana/web3.js wallet adapters\n * (like @reown/appkit-adapter-solana) and the modern @solana/kit types used\n * by @prb/effect-solana.\n *\n * @param getAdapter - Function that returns the current wallet adapter\n * @returns A Layer providing SignerService\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { makeSignerServiceFromLegacyAdapter } from \"@prb/effect-solana/compat\";\n *\n * const signerLayer = makeSignerServiceFromLegacyAdapter(() => ({\n * publicKey: walletProvider?.publicKey ?? null,\n * connected: !!walletProvider?.publicKey,\n * signTransaction: walletProvider.signTransaction.bind(walletProvider),\n * signAllTransactions: walletProvider.signAllTransactions.bind(walletProvider),\n * }));\n * ```\n */\nexport function makeSignerServiceFromLegacyAdapter(\n getAdapter: () => LegacyWalletAdapter\n): Layer.Layer<SignerService> {\n return Layer.succeed(\n SignerService,\n SignerService.of({\n getAddress: () =>\n Effect.gen(function* () {\n const adapter = getAdapter();\n if (!(adapter.connected && adapter.publicKey)) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Runtime validation before type assertion\n if (\n typeof adapter.publicKey !== \"object\" ||\n adapter.publicKey === null ||\n typeof (adapter.publicKey as { toBase58?: unknown }).toBase58 !== \"function\"\n ) {\n return yield* Effect.fail(\n new WalletNotConnectedError({\n message: \"Invalid publicKey: missing toBase58 method\",\n })\n );\n }\n\n return publicKeyToAddress(adapter.publicKey as { toBase58(): string });\n }).pipe(Effect.withSpan(SpanNames.SIGNER_GET_ADDRESS)),\n\n isConnected: () => Effect.sync(() => getAdapter().connected),\n\n signAllTransactions: (txs) =>\n Effect.gen(function* () {\n // Early return for empty arrays\n if (txs.length === 0) {\n return [] as typeof txs;\n }\n\n const adapter = getAdapter();\n if (!adapter.connected) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Convert all kit → web3.js\n const legacyTxs = yield* Effect.all(\n txs.map((tx) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message:\n cause instanceof Error ? cause.message : \"Failed to convert transaction\",\n }),\n try: () => toWeb3Transaction(tx),\n })\n )\n );\n\n // Sign all with legacy adapter\n const signedAll = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to sign transactions\",\n }),\n try: () => adapter.signAllTransactions(legacyTxs),\n });\n\n // Convert all web3.js → kit\n // Cast is necessary because we can't preserve the generic T through web3.js conversion\n return signedAll.map((signed) =>\n fromWeb3Transaction(signed as Parameters<typeof fromWeb3Transaction>[0])\n ) as typeof txs;\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n signTransaction: (tx) =>\n Effect.gen(function* () {\n const adapter = getAdapter();\n if (!adapter.connected) {\n return yield* Effect.fail(\n new WalletNotConnectedError({ message: \"Wallet not connected\" })\n );\n }\n\n // Convert kit → web3.js\n const legacyTx = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to convert transaction\",\n }),\n try: () => toWeb3Transaction(tx),\n });\n\n // Sign with legacy adapter\n const signed = yield* Effect.tryPromise({\n catch: (cause) =>\n new SignatureError({\n cause,\n message: cause instanceof Error ? cause.message : \"Failed to sign transaction\",\n }),\n try: () => adapter.signTransaction(legacyTx),\n });\n\n // Convert web3.js → kit\n // Cast is necessary because we can't preserve the generic T through web3.js conversion\n return fromWeb3Transaction(\n signed as Parameters<typeof fromWeb3Transaction>[0]\n ) as typeof tx;\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n })\n );\n}\n"]}
@@ -6,4 +6,4 @@ export declare function fromWeb3Transaction(tx: {
6
6
  verifySignatures: boolean;
7
7
  }): Uint8Array;
8
8
  }): Transaction & TransactionWithLifetime;
9
- //# sourceMappingURL=transaction-bridge.d.ts.map
9
+ //# sourceMappingURL=tx-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-bridge.d.ts","sourceRoot":"","sources":["../../src/web3.js/tx-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AA0DjF,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,WAAW,GAAG,uBAAuB,GACxC,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAsBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE;IACtC,SAAS,CAAC,IAAI,EAAE;QAAE,oBAAoB,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,CAAC;CAC3F,GAAG,WAAW,GAAG,uBAAuB,CAQxC"}
@@ -44,4 +44,4 @@ export function fromWeb3Transaction(tx) {
44
44
  throw new Error("Failed to decode transaction from web3.js format", { cause: error });
45
45
  }
46
46
  }
47
- //# sourceMappingURL=transaction-bridge.js.map
47
+ //# sourceMappingURL=tx-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-bridge.js","sourceRoot":"","sources":["../../src/web3.js/tx-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,IAAI,QAAQ,GAAoD,IAAI,CAAC;AACrE,IAAI,QAAQ,GAAoD,IAAI,CAAC;AAErE,SAAS,UAAU;IACjB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAUD,SAAS,kBAAkB,CAAC,SAAqB;IAE/C,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,aAAa,GAAG,CAAC,GAAG,cAAc,GAAG,EAAE,CAAC;IAE9C,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAsBD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAyC;IAEzC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,iBAAuD,CAAC;IAC5D,IAAI,oBAAiE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnD,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC;QAC3C,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wFAAwF,EACxF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAEvC,OAAO,kBAAkB,CAAC,SAAS,CAAC;QAClC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,SAAS,CAAC;QAC7C,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAsBD,MAAM,UAAU,mBAAmB,CAAC,EAEnC;IACC,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpF,IAAI,CAAC;QACH,OAAO,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAA0C,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC","sourcesContent":["import type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport { getTransactionDecoder, getTransactionEncoder } from \"@solana/transactions\";\n\n// Lazy initialization for encoder/decoder\nlet _encoder: ReturnType<typeof getTransactionEncoder> | null = null;\nlet _decoder: ReturnType<typeof getTransactionDecoder> | null = null;\n\nfunction getEncoder() {\n if (_encoder === null) {\n _encoder = getTransactionEncoder();\n }\n return _encoder;\n}\n\nfunction getDecoder() {\n if (_decoder === null) {\n _decoder = getTransactionDecoder();\n }\n return _decoder;\n}\n\n/**\n * Detect if a serialized transaction contains a versioned message.\n *\n * Wire format: [signature_count (compact-u16)] [signatures (64 bytes each)] [message]\n * Versioned messages have bit 7 set (0x80) in the first message byte.\n *\n * @internal\n */\nfunction isVersionedMessage(wireBytes: Uint8Array): boolean {\n // First byte is signature count (compact-u16, but < 128 signatures = 1 byte)\n const signatureCount = wireBytes[0] ?? 0;\n // Message starts after: 1 byte count + (signatureCount * 64 bytes)\n const messageOffset = 1 + signatureCount * 64;\n // biome-ignore lint/suspicious/noBitwiseOperators: Checking version bit\n return ((wireBytes[messageOffset] ?? 0) & 0x80) !== 0;\n}\n\n/**\n * Convert a @solana/kit transaction to a @solana/web3.js Transaction or VersionedTransaction.\n *\n * Uses wire-format bytes as the interchange format. Dynamically imports @solana/web3.js\n * for tree-shaking when legacy compatibility is not needed.\n *\n * @param tx - Transaction from @solana/kit\n * @returns Promise of Transaction or VersionedTransaction from @solana/web3.js\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { toWeb3Transaction } from \"@prb/effect-solana/compat\";\n *\n * const kitTx: Transaction & TransactionWithLifetime = /* ... *\\/;\n * const legacyTx = await toWeb3Transaction(kitTx);\n * // => Transaction or VersionedTransaction instance\n * ```\n */\nexport async function toWeb3Transaction(\n tx: Transaction & TransactionWithLifetime\n): Promise<unknown> {\n const wire = getEncoder().encode(tx);\n\n let LegacyTransaction: { from(bytes: Uint8Array): unknown };\n let VersionedTransaction: { deserialize(bytes: Uint8Array): unknown };\n\n try {\n const web3Module = await import(\"@solana/web3.js\");\n LegacyTransaction = web3Module.Transaction;\n VersionedTransaction = web3Module.VersionedTransaction;\n } catch (error) {\n throw new Error(\n \"@solana/web3.js is required for legacy compatibility. Install it as a peer dependency.\",\n { cause: error }\n );\n }\n\n // Convert ReadonlyUint8Array to Uint8Array for web3.js compatibility\n const wireBytes = new Uint8Array(wire);\n\n return isVersionedMessage(wireBytes)\n ? VersionedTransaction.deserialize(wireBytes)\n : LegacyTransaction.from(wireBytes);\n}\n\n/**\n * Convert a @solana/web3.js Transaction or VersionedTransaction to a @solana/kit transaction.\n *\n * Uses wire-format bytes as the interchange format.\n *\n * @param tx - Transaction or VersionedTransaction from @solana/web3.js\n * @returns Transaction from @solana/kit\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { fromWeb3Transaction } from \"@prb/effect-solana/compat\";\n * import { Transaction } from \"@solana/web3.js\";\n *\n * const legacyTx = new Transaction();\n * const kitTx = fromWeb3Transaction(legacyTx);\n * // => Transaction & TransactionWithLifetime\n * ```\n */\nexport function fromWeb3Transaction(tx: {\n serialize(opts: { requireAllSignatures: boolean; verifySignatures: boolean }): Uint8Array;\n}): Transaction & TransactionWithLifetime {\n const wire = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n\n try {\n return getDecoder().decode(wire) as Transaction & TransactionWithLifetime;\n } catch (error) {\n throw new Error(\"Failed to decode transaction from web3.js format\", { cause: error });\n }\n}\n"]}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "sideEffects": false,
8
8
  "type": "module",
9
9
  "types": "./dist/index.d.ts",
10
- "version": "1.0.0-beta.5",
10
+ "version": "1.0.0-beta.6",
11
11
  "scripts": {
12
12
  "build": "just build",
13
13
  "prepack": "bun install --frozen-lockfile && just build"
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/core/errors/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;AASxC,qBAAa,iBAAkB,SAAQ,sBAKtC;CAAG;;;;;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAOzC;CAAG;;;;;;;;;AAEJ,qBAAa,sBAAuB,SAAQ,2BAQ3C;CAAG;;;;;;;AAEJ,qBAAa,uBAAwB,SAAQ,4BAM5C;CAAG;;;;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAM1C;CAAG;;;;;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAO1C;CAAG;AASJ,eAAO,MAAM,yBAAyB,gDAAwD,CAAC;AAM/F,eAAO,MAAM,mBAAmB,gDAA4B,CAAC;AAiE7D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqBjE;AAoBD,eAAO,MAAM,kBAAkB,EAAE;IAC/B,CAAC,EAAE,EACD,QAAQ,EAAE,EAAE,GACX,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,EAAE,GACX,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;CAY5D,CAAC;AAcF,eAAO,MAAM,sBAAsB,EAAE;IACnC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAClC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAClC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;CAYtE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/core/errors/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrE,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,WAAW,EAAwB,CAClF,sBAAsB,EACtB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CACF;CAAG;AAEJ,MAAM,OAAO,sBAAuB,SAAQ,MAAM,CAAC,WAAW,EAA0B,CACtF,wBAAwB,EACxB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CACF;CAAG;AAEJ,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,WAAW,EAA2B,CACxF,yBAAyB,EACzB;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM;CACzB,CACF;CAAG;AAEJ,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CACpF,uBAAuB,EACvB;IACE,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CACpF,uBAAuB,EACvB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AASJ,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAoB,mBAAmB,CAAC,CAAC;AAM/F,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAM7D,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAKjC,MAAM,uBAAuB,GAAG,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;AAE1E,SAAS,eAAe,CAAC,IAAa;IACpC,OAAO,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa;IAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,eAAe,CAAE,KAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,UAAU,CAAE,KAA6B,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzF,OAAO,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAaD,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAClE,OAAO,UAAU,CAAE,KAA6B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAoBD,MAAM,CAAC,MAAM,kBAAkB,GAU3B,IAAI,CACN,CAAC,EACD,CACE,MAA8B,EAC9B,QAAY,EAC6C,EAAE,CAC3D,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAIzE,CACJ,CAAC;AAcF,MAAM,CAAC,MAAM,sBAAsB,GAU/B,IAAI,CACN,CAAC,EACD,CACE,MAA8B,EAC9B,QAAmC,EACgC,EAAE,CACrE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAIzD,CACJ,CAAC","sourcesContent":["import { Effect, Schema } from \"effect\";\nimport { dual } from \"effect/Function\";\n\nimport { hasTaggedErrorShape, isTaggedError } from \"./predicates.js\";\n\n// =============================================================================\n// Error Classes\n// =============================================================================\n\nexport class UserRejectedError extends Schema.TaggedError<UserRejectedError>()(\n \"UserRejectedError\",\n {\n message: Schema.String,\n }\n) {}\n\nexport class TransactionSendError extends Schema.TaggedError<TransactionSendError>()(\n \"TransactionSendError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n signature: Schema.optional(Schema.String),\n }\n) {}\n\nexport class TransactionFailedError extends Schema.TaggedError<TransactionFailedError>()(\n \"TransactionFailedError\",\n {\n cause: Schema.optional(Schema.Unknown),\n logs: Schema.optional(Schema.Array(Schema.String)),\n message: Schema.String,\n signature: Schema.String,\n }\n) {}\n\nexport class TransactionTimeoutError extends Schema.TaggedError<TransactionTimeoutError>()(\n \"TransactionTimeoutError\",\n {\n message: Schema.String,\n signature: Schema.String,\n }\n) {}\n\nexport class BlockhashExpiredError extends Schema.TaggedError<BlockhashExpiredError>()(\n \"BlockhashExpiredError\",\n {\n blockhash: Schema.String,\n message: Schema.String,\n }\n) {}\n\nexport class SimulationFailedError extends Schema.TaggedError<SimulationFailedError>()(\n \"SimulationFailedError\",\n {\n cause: Schema.optional(Schema.Unknown),\n logs: Schema.optional(Schema.Array(Schema.String)),\n message: Schema.String,\n }\n) {}\n\n// =============================================================================\n// User Rejection Detection\n// =============================================================================\n\n/**\n * Strict _tag guard for UserRejectedError.\n */\nexport const isTaggedUserRejectedError = isTaggedError<UserRejectedError>(\"UserRejectedError\");\n\n/**\n * Type guard for UserRejectedError.\n * Works with both instanceof and _tag (for serialized errors).\n */\nexport const isUserRejectedError = isTaggedUserRejectedError;\n\n/**\n * EIP-1193 / Phantom / Solflare standard error code for user rejection.\n * Both Phantom and Solflare use 4001 following Ethereum's standard.\n */\nconst USER_REJECTION_CODE = 4001;\n\n/**\n * Fallback message fragments if code is not available.\n */\nconst USER_REJECTION_MESSAGES = [\"user rejected\", \"rejected the request\"];\n\nfunction isRejectionCode(code: unknown): boolean {\n return code === USER_REJECTION_CODE || code === `${USER_REJECTION_CODE}`;\n}\n\nfunction hasRejectionMessage(message: string): boolean {\n const lower = message.toLowerCase();\n return USER_REJECTION_MESSAGES.some((m) => lower.includes(m));\n}\n\nfunction checkCause(cause: unknown, depth: number): boolean {\n if (!cause || depth > 3) {\n return false;\n }\n\n // Check for code 4001 (standard rejection code)\n if (typeof cause === \"object\" && \"code\" in cause && isRejectionCode(cause.code)) {\n return true;\n }\n\n // Check message\n if (typeof cause === \"string\") {\n return hasRejectionMessage(cause);\n }\n\n if (cause instanceof Error) {\n if (isRejectionCode((cause as { code?: unknown }).code)) {\n return true;\n }\n if (hasRejectionMessage(cause.message)) {\n return true;\n }\n return checkCause((cause as { cause?: unknown }).cause, depth + 1);\n }\n\n if (typeof cause === \"object\" && \"message\" in cause && typeof cause.message === \"string\") {\n return hasRejectionMessage(cause.message);\n }\n\n return false;\n}\n\n/**\n * Lenient user rejection check for Solana wallet errors.\n *\n * Solana wallets (Phantom, Solflare) use EIP-1193 error code 4001 for user rejection,\n * same as EVM wallets. The error gets wrapped in SignatureError by @prb/effect-solana.\n *\n * Detects:\n * - Tagged UserRejectedError\n * - Tagged WalletNotConnectedError (user didn't connect)\n * - SignatureError with code 4001 or rejection message in cause\n */\nexport function isLikelyUserRejectedError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n // Tagged UserRejectedError\n if (isUserRejectedError(error)) {\n return true;\n }\n\n // Tagged WalletNotConnectedError - treat as user cancellation\n if (hasTaggedErrorShape(error) && error._tag === \"WalletNotConnectedError\") {\n return true;\n }\n\n // SignatureError - check cause for code 4001 or rejection message\n if (hasTaggedErrorShape(error) && error._tag === \"SignatureError\") {\n return checkCause((error as { cause?: unknown }).cause, 0);\n }\n\n return false;\n}\n\n// =============================================================================\n// Effect Operators\n// =============================================================================\n\n/**\n * Catch UserRejectedError and return a fallback value.\n * Useful for treating rejection as \"cancelled\" rather than \"failed\".\n *\n * @example\n * ```ts\n * const result = await Effect.runPromise(\n * sendTransaction(tx).pipe(catchUserRejection(null))\n * );\n * if (result === null) {\n * // User cancelled - reset to idle\n * }\n * ```\n */\nexport const catchUserRejection: {\n <A2>(\n fallback: A2\n ): <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ) => Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R>;\n <A, E, R, A2>(\n effect: Effect.Effect<A, E, R>,\n fallback: A2\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R>;\n} = dual(\n 2,\n <A, E, R, A2>(\n effect: Effect.Effect<A, E, R>,\n fallback: A2\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError>, R> =>\n Effect.catchIf(effect, isUserRejectedError, () => Effect.succeed(fallback)) as Effect.Effect<\n A | A2,\n Exclude<E, UserRejectedError>,\n R\n >\n);\n\n/**\n * Catch UserRejectedError and run a fallback effect.\n *\n * @example\n * ```ts\n * const result = await Effect.runPromise(\n * sendTransaction(tx).pipe(\n * catchUserRejectionWith(Effect.succeed({ cancelled: true }))\n * )\n * );\n * ```\n */\nexport const catchUserRejectionWith: {\n <A2, E2, R2>(\n fallback: Effect.Effect<A2, E2, R2>\n ): <A, E, R>(\n effect: Effect.Effect<A, E, R>\n ) => Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2>;\n <A, E, R, A2, E2, R2>(\n effect: Effect.Effect<A, E, R>,\n fallback: Effect.Effect<A2, E2, R2>\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2>;\n} = dual(\n 2,\n <A, E, R, A2, E2, R2>(\n effect: Effect.Effect<A, E, R>,\n fallback: Effect.Effect<A2, E2, R2>\n ): Effect.Effect<A | A2, Exclude<E, UserRejectedError> | E2, R | R2> =>\n Effect.catchIf(effect, isUserRejectedError, () => fallback) as Effect.Effect<\n A | A2,\n Exclude<E, UserRejectedError> | E2,\n R | R2\n >\n);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-transaction-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-transaction-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,CACN,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC/F,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,0BAA0B,EAAE,KACvC,MAAM,CAAC,MAAM,CAChB,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EAClD,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC1C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAChB,WAAW,GAAG,uBAAuB,EACrC,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EACvD,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CACL,EAAE,EAAE,WAAW,GAAG,uBAAuB,KACtC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CACR,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,sBAAsB,CAAC,CAAC;IACzF,cAAc,CAAC,EAAE,CACf,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAChB,kBAAkB,EAChB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,mBAAmB,CAAC,EAAE,CACpB,KAAK,EAAE,SAAS,oBAAoB,EAAE,EACtC,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAChB,SAAS,kBAAkB,EAAE,EAC3B,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC9C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;CAClG,CAAC;AA6DF,eAAO,MAAM,+BAA+B,GAC1C,SAAQ,4BAAiC,KACxC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CACoD,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-transaction-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-transaction-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA4DpD,MAAM,aAAa,GAA2C;IAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAgC,CAAC;IAC7D,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CACrB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS;QACT,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAA2B,CAAC;IACvD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,cAA2B,CAAC,CAAC;IAC5E,cAAc,EAAE,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC,CACJ;IACH,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAA2C,CAAC;IACvE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAA0C,CAAC,CAAC;IAC9F,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;CAC5B,CAAC;AAgCF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,SAAuC,EAAE,EACR,EAAE,CACnC,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import type { Instruction } from \"@solana/instructions\";\nimport type { Signature } from \"@solana/keys\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport type {\n SimulationFailedError,\n TransactionFailedError,\n TransactionSendError,\n TransactionTimeoutError,\n WalletNotConnectedError,\n} from \"#src/core/errors/index.js\";\nimport type {\n ConfirmOpts,\n SignableTransactionMessage,\n TransactionBatchItem,\n TransactionBatchOpts,\n TransactionReceipt,\n} from \"#src/tx/index.js\";\nimport { TransactionService } from \"#src/tx/index.js\";\nimport { TEST_SIGNATURE } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock TransactionService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockTransactionServiceConfig = {\n build?: (\n instructions: readonly Instruction[]\n ) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;\n signAll?: (\n txs: readonly SignableTransactionMessage[]\n ) => Effect.Effect<\n readonly (Transaction & TransactionWithLifetime)[],\n TransactionSendError | WalletNotConnectedError\n >;\n sign?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<\n Transaction & TransactionWithLifetime,\n TransactionSendError | WalletNotConnectedError\n >;\n sendAll?: (\n txs: readonly (Transaction & TransactionWithLifetime)[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<readonly Signature[], TransactionSendError>;\n send?: (\n tx: Transaction & TransactionWithLifetime\n ) => Effect.Effect<Signature, TransactionSendError>;\n confirm?: (\n signature: Signature,\n opts?: ConfirmOpts\n ) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;\n sendAndConfirm?: (\n instructions: readonly Instruction[],\n opts?: ConfirmOpts\n ) => Effect.Effect<\n TransactionReceipt,\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n sendAndConfirmBatch?: (\n items: readonly TransactionBatchItem[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<\n readonly TransactionReceipt[],\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n simulate?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;\n};\n\nconst defaultConfig: Required<MockTransactionServiceConfig> = {\n build: () => Effect.succeed({} as SignableTransactionMessage),\n confirm: (signature) =>\n Effect.succeed({\n confirmations: 10n,\n signature,\n slot: 1000n,\n }),\n send: () => Effect.succeed(TEST_SIGNATURE as Signature),\n sendAll: (txs) => Effect.succeed(txs.map(() => TEST_SIGNATURE as Signature)),\n sendAndConfirm: () =>\n Effect.succeed({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }),\n sendAndConfirmBatch: (items) =>\n Effect.succeed(\n items.map(() => ({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }))\n ),\n sign: () => Effect.succeed({} as Transaction & TransactionWithLifetime),\n signAll: (txs) => Effect.succeed(txs.map(() => ({}) as Transaction & TransactionWithLifetime)),\n simulate: () => Effect.void,\n};\n\n/**\n * Creates a mock TransactionService layer for testing\n *\n * @param config - Optional configuration to override default mock behaviors\n *\n * @example\n * ```typescript\n * // Basic usage with defaults\n * const layer = makeMockTransactionServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockTransactionServiceLayer({\n * sendAndConfirm: () => Effect.fail(\n * new TransactionFailedError({\n * signature: TEST_SIGNATURE,\n * message: \"Transaction failed\",\n * logs: [],\n * })\n * ),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const txService = yield* TransactionService;\n * const receipt = yield* txService.sendAndConfirm(instructions);\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockTransactionServiceLayer = (\n config: MockTransactionServiceConfig = {}\n): Layer.Layer<TransactionService> =>\n makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction-bridge.d.ts","sourceRoot":"","sources":["../../src/web3.js/transaction-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AA0DjF,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,WAAW,GAAG,uBAAuB,GACxC,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAsBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE;IACtC,SAAS,CAAC,IAAI,EAAE;QAAE,oBAAoB,EAAE,OAAO,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,CAAC;CAC3F,GAAG,WAAW,GAAG,uBAAuB,CAQxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transaction-bridge.js","sourceRoot":"","sources":["../../src/web3.js/transaction-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGpF,IAAI,QAAQ,GAAoD,IAAI,CAAC;AACrE,IAAI,QAAQ,GAAoD,IAAI,CAAC;AAErE,SAAS,UAAU;IACjB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAUD,SAAS,kBAAkB,CAAC,SAAqB;IAE/C,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,aAAa,GAAG,CAAC,GAAG,cAAc,GAAG,EAAE,CAAC;IAE9C,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAsBD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAyC;IAEzC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,iBAAuD,CAAC;IAC5D,IAAI,oBAAiE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnD,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC;QAC3C,oBAAoB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wFAAwF,EACxF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAEvC,OAAO,kBAAkB,CAAC,SAAS,CAAC;QAClC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,SAAS,CAAC;QAC7C,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAsBD,MAAM,UAAU,mBAAmB,CAAC,EAEnC;IACC,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpF,IAAI,CAAC;QACH,OAAO,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAA0C,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC","sourcesContent":["import type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport { getTransactionDecoder, getTransactionEncoder } from \"@solana/transactions\";\n\n// Lazy initialization for encoder/decoder\nlet _encoder: ReturnType<typeof getTransactionEncoder> | null = null;\nlet _decoder: ReturnType<typeof getTransactionDecoder> | null = null;\n\nfunction getEncoder() {\n if (_encoder === null) {\n _encoder = getTransactionEncoder();\n }\n return _encoder;\n}\n\nfunction getDecoder() {\n if (_decoder === null) {\n _decoder = getTransactionDecoder();\n }\n return _decoder;\n}\n\n/**\n * Detect if a serialized transaction contains a versioned message.\n *\n * Wire format: [signature_count (compact-u16)] [signatures (64 bytes each)] [message]\n * Versioned messages have bit 7 set (0x80) in the first message byte.\n *\n * @internal\n */\nfunction isVersionedMessage(wireBytes: Uint8Array): boolean {\n // First byte is signature count (compact-u16, but < 128 signatures = 1 byte)\n const signatureCount = wireBytes[0] ?? 0;\n // Message starts after: 1 byte count + (signatureCount * 64 bytes)\n const messageOffset = 1 + signatureCount * 64;\n // biome-ignore lint/suspicious/noBitwiseOperators: Checking version bit\n return ((wireBytes[messageOffset] ?? 0) & 0x80) !== 0;\n}\n\n/**\n * Convert a @solana/kit transaction to a @solana/web3.js Transaction or VersionedTransaction.\n *\n * Uses wire-format bytes as the interchange format. Dynamically imports @solana/web3.js\n * for tree-shaking when legacy compatibility is not needed.\n *\n * @param tx - Transaction from @solana/kit\n * @returns Promise of Transaction or VersionedTransaction from @solana/web3.js\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { toWeb3Transaction } from \"@prb/effect-solana/compat\";\n *\n * const kitTx: Transaction & TransactionWithLifetime = /* ... *\\/;\n * const legacyTx = await toWeb3Transaction(kitTx);\n * // => Transaction or VersionedTransaction instance\n * ```\n */\nexport async function toWeb3Transaction(\n tx: Transaction & TransactionWithLifetime\n): Promise<unknown> {\n const wire = getEncoder().encode(tx);\n\n let LegacyTransaction: { from(bytes: Uint8Array): unknown };\n let VersionedTransaction: { deserialize(bytes: Uint8Array): unknown };\n\n try {\n const web3Module = await import(\"@solana/web3.js\");\n LegacyTransaction = web3Module.Transaction;\n VersionedTransaction = web3Module.VersionedTransaction;\n } catch (error) {\n throw new Error(\n \"@solana/web3.js is required for legacy compatibility. Install it as a peer dependency.\",\n { cause: error }\n );\n }\n\n // Convert ReadonlyUint8Array to Uint8Array for web3.js compatibility\n const wireBytes = new Uint8Array(wire);\n\n return isVersionedMessage(wireBytes)\n ? VersionedTransaction.deserialize(wireBytes)\n : LegacyTransaction.from(wireBytes);\n}\n\n/**\n * Convert a @solana/web3.js Transaction or VersionedTransaction to a @solana/kit transaction.\n *\n * Uses wire-format bytes as the interchange format.\n *\n * @param tx - Transaction or VersionedTransaction from @solana/web3.js\n * @returns Transaction from @solana/kit\n *\n * @category Compatibility\n *\n * @example\n * ```typescript\n * import { fromWeb3Transaction } from \"@prb/effect-solana/compat\";\n * import { Transaction } from \"@solana/web3.js\";\n *\n * const legacyTx = new Transaction();\n * const kitTx = fromWeb3Transaction(legacyTx);\n * // => Transaction & TransactionWithLifetime\n * ```\n */\nexport function fromWeb3Transaction(tx: {\n serialize(opts: { requireAllSignatures: boolean; verifySignatures: boolean }): Uint8Array;\n}): Transaction & TransactionWithLifetime {\n const wire = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n\n try {\n return getDecoder().decode(wire) as Transaction & TransactionWithLifetime;\n } catch (error) {\n throw new Error(\"Failed to decode transaction from web3.js format\", { cause: error });\n }\n}\n"]}