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

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 (135) hide show
  1. package/README.md +48 -3
  2. package/dist/balance/index.js.map +1 -1
  3. package/dist/balance/service.d.ts +2 -2
  4. package/dist/balance/service.d.ts.map +1 -1
  5. package/dist/balance/service.js +3 -3
  6. package/dist/balance/service.js.map +1 -1
  7. package/dist/constants/index.js.map +1 -1
  8. package/dist/core/errors/account.js.map +1 -1
  9. package/dist/core/errors/index.js.map +1 -1
  10. package/dist/core/errors/predicates.js.map +1 -1
  11. package/dist/core/errors/rpc.js.map +1 -1
  12. package/dist/core/errors/transaction.js.map +1 -1
  13. package/dist/core/errors/wallet.js.map +1 -1
  14. package/dist/core/index.js.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/internal/index.js.map +1 -1
  17. package/dist/internal/kit-effect.d.ts +2 -2
  18. package/dist/internal/kit-effect.d.ts.map +1 -1
  19. package/dist/internal/kit-effect.js +1 -1
  20. package/dist/internal/kit-effect.js.map +1 -1
  21. package/dist/pda/index.js.map +1 -1
  22. package/dist/pda/service.js +1 -1
  23. package/dist/pda/service.js.map +1 -1
  24. package/dist/pda/types.js.map +1 -1
  25. package/dist/presets/index.js.map +1 -1
  26. package/dist/presets/layers.d.ts +10 -10
  27. package/dist/presets/layers.d.ts.map +1 -1
  28. package/dist/presets/layers.js +8 -8
  29. package/dist/presets/layers.js.map +1 -1
  30. package/dist/program/index.d.ts +1 -0
  31. package/dist/program/index.d.ts.map +1 -1
  32. package/dist/program/index.js +1 -0
  33. package/dist/program/index.js.map +1 -1
  34. package/dist/program/internal/anchor-helpers.d.ts +20 -0
  35. package/dist/program/internal/anchor-helpers.d.ts.map +1 -0
  36. package/dist/program/internal/anchor-helpers.js +64 -0
  37. package/dist/program/internal/anchor-helpers.js.map +1 -0
  38. package/dist/program/reader.d.ts +19 -0
  39. package/dist/program/reader.d.ts.map +1 -0
  40. package/dist/program/reader.js +288 -0
  41. package/dist/program/reader.js.map +1 -0
  42. package/dist/program/service.d.ts +1 -1
  43. package/dist/program/service.d.ts.map +1 -1
  44. package/dist/program/service.js +18 -37
  45. package/dist/program/service.js.map +1 -1
  46. package/dist/program/types.d.ts +48 -13
  47. package/dist/program/types.d.ts.map +1 -1
  48. package/dist/program/types.js +27 -28
  49. package/dist/program/types.js.map +1 -1
  50. package/dist/react-hooks/index.js.map +1 -1
  51. package/dist/react-hooks/internal/error.js.map +1 -1
  52. package/dist/react-hooks/internal/is-dev.js.map +1 -1
  53. package/dist/react-hooks/internal/runtime.js.map +1 -1
  54. package/dist/react-hooks/internal/scoped-run.js.map +1 -1
  55. package/dist/react-hooks/internal/stable.js.map +1 -1
  56. package/dist/react-hooks/primitives/use-effect-memo-factory.js.map +1 -1
  57. package/dist/react-hooks/primitives/use-effect.js.map +1 -1
  58. package/dist/react-hooks/primitives/use-fork-effect.js.map +1 -1
  59. package/dist/react-hooks/primitives/use-stream.js.map +1 -1
  60. package/dist/react-hooks/primitives.js.map +1 -1
  61. package/dist/react-hooks/provider.js.map +1 -1
  62. package/dist/rpc/index.js.map +1 -1
  63. package/dist/rpc/service.d.ts +2 -2
  64. package/dist/rpc/service.d.ts.map +1 -1
  65. package/dist/rpc/service.js +1 -1
  66. package/dist/rpc/service.js.map +1 -1
  67. package/dist/signer/index.js.map +1 -1
  68. package/dist/signer/service.d.ts +1 -1
  69. package/dist/signer/service.d.ts.map +1 -1
  70. package/dist/signer/service.js +2 -2
  71. package/dist/signer/service.js.map +1 -1
  72. package/dist/telemetry/index.js.map +1 -1
  73. package/dist/telemetry/logger.js.map +1 -1
  74. package/dist/telemetry/tracer.d.ts +3 -0
  75. package/dist/telemetry/tracer.d.ts.map +1 -1
  76. package/dist/telemetry/tracer.js +3 -0
  77. package/dist/telemetry/tracer.js.map +1 -1
  78. package/dist/testing-kit/_fixtures/addresses.js.map +1 -1
  79. package/dist/testing-kit/helpers.js.map +1 -1
  80. package/dist/testing-kit/index.js.map +1 -1
  81. package/dist/testing-kit/mock-balance-service.d.ts +2 -2
  82. package/dist/testing-kit/mock-balance-service.d.ts.map +1 -1
  83. package/dist/testing-kit/mock-balance-service.js +1 -1
  84. package/dist/testing-kit/mock-balance-service.js.map +1 -1
  85. package/dist/testing-kit/mock-pda-service.d.ts +2 -2
  86. package/dist/testing-kit/mock-pda-service.d.ts.map +1 -1
  87. package/dist/testing-kit/mock-pda-service.js +1 -1
  88. package/dist/testing-kit/mock-pda-service.js.map +1 -1
  89. package/dist/testing-kit/mock-rpc-service.d.ts +3 -3
  90. package/dist/testing-kit/mock-rpc-service.d.ts.map +1 -1
  91. package/dist/testing-kit/mock-rpc-service.js +2 -2
  92. package/dist/testing-kit/mock-rpc-service.js.map +1 -1
  93. package/dist/testing-kit/mock-signer-service.d.ts +3 -3
  94. package/dist/testing-kit/mock-signer-service.d.ts.map +1 -1
  95. package/dist/testing-kit/mock-signer-service.js +2 -2
  96. package/dist/testing-kit/mock-signer-service.js.map +1 -1
  97. package/dist/testing-kit/mock-token-service.d.ts +3 -3
  98. package/dist/testing-kit/mock-token-service.d.ts.map +1 -1
  99. package/dist/testing-kit/mock-token-service.js +1 -1
  100. package/dist/testing-kit/mock-token-service.js.map +1 -1
  101. package/dist/testing-kit/mock-transaction-service.d.ts +7 -8
  102. package/dist/testing-kit/mock-transaction-service.d.ts.map +1 -1
  103. package/dist/testing-kit/mock-transaction-service.js +1 -1
  104. package/dist/testing-kit/mock-transaction-service.js.map +1 -1
  105. package/dist/testing-kit/test-layer.d.ts +11 -7
  106. package/dist/testing-kit/test-layer.d.ts.map +1 -1
  107. package/dist/testing-kit/test-layer.js +12 -5
  108. package/dist/testing-kit/test-layer.js.map +1 -1
  109. package/dist/token/index.js.map +1 -1
  110. package/dist/token/service.d.ts +2 -2
  111. package/dist/token/service.d.ts.map +1 -1
  112. package/dist/token/service.js +4 -4
  113. package/dist/token/service.js.map +1 -1
  114. package/dist/tx/index.js.map +1 -1
  115. package/dist/tx/service.d.ts +9 -10
  116. package/dist/tx/service.d.ts.map +1 -1
  117. package/dist/tx/service.js +4 -4
  118. package/dist/tx/service.js.map +1 -1
  119. package/dist/tx/types.d.ts +2 -0
  120. package/dist/tx/types.d.ts.map +1 -1
  121. package/dist/tx/types.js.map +1 -1
  122. package/dist/types/index.js.map +1 -1
  123. package/dist/web3.js/_fixtures.js.map +1 -1
  124. package/dist/web3.js/index.js.map +1 -1
  125. package/dist/web3.js/layers.d.ts +9 -9
  126. package/dist/web3.js/layers.d.ts.map +1 -1
  127. package/dist/web3.js/layers.js +1 -1
  128. package/dist/web3.js/layers.js.map +1 -1
  129. package/dist/web3.js/legacy-signer.d.ts +1 -1
  130. package/dist/web3.js/legacy-signer.d.ts.map +1 -1
  131. package/dist/web3.js/legacy-signer.js +3 -3
  132. package/dist/web3.js/legacy-signer.js.map +1 -1
  133. package/dist/web3.js/transaction-bridge.js.map +1 -1
  134. package/dist/web3.js/types.js.map +1 -1
  135. package/package.json +38 -22
@@ -1 +1 @@
1
- {"version":3,"file":"mock-pda-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-pda-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUhD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/F,UAAU,CAAC,EAAE,CACX,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;CAC/C,CAAC;AAgCF,eAAO,MAAM,uBAAuB,GAClC,SAAQ,oBAAyB,KAChC,KAAK,CAAC,KAAK,CAAC,UAAU,CACoD,CAAC"}
1
+ {"version":3,"file":"mock-pda-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-pda-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAU/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/F,UAAU,CAAC,EAAE,CACX,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;CAC/C,CAAC;AAgCF,eAAO,MAAM,uBAAuB,GAClC,SAAQ,oBAAyB,KAChC,KAAK,CAAC,KAAK,CAAC,UAAU,CACoD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { PdaService } from "../pda/index.js";
2
+ import { PdaService } from "#src/pda/index.js";
3
3
  import { TEST_ADDRESS } from "./_fixtures/addresses.js";
4
4
  import { makeMockServiceLayer } from "./helpers.js";
5
5
  const defaultConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"mock-pda-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-pda-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAoBpD,MAAM,aAAa,GAAmC;IACpD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,GAAgC,CAAU,CAAC;IACvF,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;IACjD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAgC,CAAC;CACnE,CAAC;AA0BF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAA+B,EAAE,EACR,EAAE,CAC3B,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"mock-pda-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-pda-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAoBpD,MAAM,aAAa,GAAmC;IACpD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,GAAgC,CAAU,CAAC;IACvF,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;IACjD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAgC,CAAC;CACnE,CAAC;AA0BF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAA+B,EAAE,EACR,EAAE,CAC3B,oBAAoB,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import type { Address, ProgramDerivedAddressBump } from \"@solana/addresses\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport type { PdaSeed, ProgramDerivedAddress } from \"#src/pda/index.js\";\nimport { PdaService } from \"#src/pda/index.js\";\nimport { TEST_ADDRESS } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock PdaService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockPdaServiceConfig = {\n derive?: (\n seeds: readonly PdaSeed[],\n programAddress: Address\n ) => Effect.Effect<ProgramDerivedAddress>;\n deriveAddress?: (seeds: readonly PdaSeed[], programAddress: Address) => Effect.Effect<Address>;\n deriveBump?: (\n seeds: readonly PdaSeed[],\n programAddress: Address\n ) => Effect.Effect<ProgramDerivedAddressBump>;\n};\n\nconst defaultConfig: Required<MockPdaServiceConfig> = {\n derive: () => Effect.succeed([TEST_ADDRESS, 255 as ProgramDerivedAddressBump] as const),\n deriveAddress: () => Effect.succeed(TEST_ADDRESS),\n deriveBump: () => Effect.succeed(255 as ProgramDerivedAddressBump),\n};\n\n/**\n * Creates a mock PdaService 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 = makeMockPdaServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockPdaServiceLayer({\n * derive: () => Effect.succeed([customAddress, 250 as ProgramDerivedAddressBump]),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const pdaService = yield* PdaService;\n * const [pda, bump] = yield* pdaService.derive([seed1, seed2], programId);\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockPdaServiceLayer = (\n config: MockPdaServiceConfig = {}\n): Layer.Layer<PdaService> =>\n makeMockServiceLayer(PdaService, defaultConfig, config, (merged) => merged);\n"]}
@@ -1,9 +1,9 @@
1
1
  import type { Rpc, RpcSubscriptions, SolanaRpcApi, SolanaRpcSubscriptionsApi } from "@solana/kit";
2
2
  import type { Layer } from "effect";
3
3
  import { Effect } from "effect";
4
- import { ConnectionNotFoundError } from "../core/errors/index.js";
5
- import { RpcService } from "../rpc/index.js";
6
- import type { Cluster } from "../types/index.js";
4
+ import { ConnectionNotFoundError } from "#src/core/errors/index.js";
5
+ import { RpcService } from "#src/rpc/index.js";
6
+ import type { Cluster } from "#src/types/index.js";
7
7
  export type MockRpcServiceConfig = {
8
8
  getRpc?: () => Effect.Effect<Rpc<SolanaRpcApi>>;
9
9
  getRpcSubscriptions?: () => Effect.Effect<RpcSubscriptions<SolanaRpcSubscriptionsApi>, ConnectionNotFoundError>;
@@ -1 +1 @@
1
- {"version":3,"file":"mock-rpc-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-rpc-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAElG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAUpD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CACvC,gBAAgB,CAAC,yBAAyB,CAAC,EAC3C,uBAAuB,CACxB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CACzC,CAAC;AAcF,eAAO,MAAM,WAAW,GAAI,YAAW,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAM,KAAG,GAAG,CAAC,YAAY,CAyDhE,CAAC;AAwC1B,eAAO,MAAM,uBAAuB,GAClC,SAAQ,oBAAyB,KAChC,KAAK,CAAC,KAAK,CAAC,UAAU,CACoD,CAAC"}
1
+ {"version":3,"file":"mock-rpc-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-rpc-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAElG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAUnD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CACvC,gBAAgB,CAAC,yBAAyB,CAAC,EAC3C,uBAAuB,CACxB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CACzC,CAAC;AAcF,eAAO,MAAM,WAAW,GAAI,YAAW,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAM,KAAG,GAAG,CAAC,YAAY,CAyDhE,CAAC;AAwC1B,eAAO,MAAM,uBAAuB,GAClC,SAAQ,oBAAyB,KAChC,KAAK,CAAC,KAAK,CAAC,UAAU,CACoD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { createSolanaRpc } from "@solana/kit";
2
2
  import { Effect } from "effect";
3
- import { ConnectionNotFoundError } from "../core/errors/index.js";
4
- import { RpcService } from "../rpc/index.js";
3
+ import { ConnectionNotFoundError } from "#src/core/errors/index.js";
4
+ import { RpcService } from "#src/rpc/index.js";
5
5
  import { TEST_CLUSTER } from "./_fixtures/addresses.js";
6
6
  import { makeMockServiceLayer } from "./helpers.js";
7
7
  const wrapResponse = (value) => ({ context: { slot: 0n }, value });
@@ -1 +1 @@
1
- {"version":3,"file":"mock-rpc-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-rpc-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mock-rpc-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-rpc-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Rpc, RpcSubscriptions, SolanaRpcApi, SolanaRpcSubscriptionsApi } from \"@solana/kit\";\nimport { createSolanaRpc } from \"@solana/kit\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport { ConnectionNotFoundError } from \"#src/core/errors/index.js\";\nimport { RpcService } from \"#src/rpc/index.js\";\nimport type { Cluster } from \"#src/types/index.js\";\nimport { TEST_CLUSTER } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock RpcService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockRpcServiceConfig = {\n getRpc?: () => Effect.Effect<Rpc<SolanaRpcApi>>;\n getRpcSubscriptions?: () => Effect.Effect<\n RpcSubscriptions<SolanaRpcSubscriptionsApi>,\n ConnectionNotFoundError\n >;\n getCluster?: () => Effect.Effect<Cluster>;\n getRpcUrl?: () => Effect.Effect<string>;\n};\n\n/**\n * Wraps a value with the standard RPC response context structure\n */\nconst wrapResponse = <T>(value: T) => ({ context: { slot: 0n }, value });\n\n/**\n * Create a mock RPC client for testing.\n * Provides a full Rpc<SolanaRpcApi> via createSolanaRpc with safe overrides.\n *\n * Uses type assertion because Solana RPC types use many branded types (Lamports, Signature, etc.)\n * that cannot be created from literals. The mock values are structurally correct at runtime.\n */\nexport const makeMockRpc = (overrides: Partial<Rpc<SolanaRpcApi>> = {}): Rpc<SolanaRpcApi> =>\n ({\n ...createSolanaRpc(\"http://localhost\"),\n getAccountInfo: () => ({\n send: () => Promise.resolve(wrapResponse(null)),\n }),\n getBalance: () => ({\n send: () => Promise.resolve(wrapResponse(1000000000n)),\n }),\n getLatestBlockhash: () => ({\n send: () =>\n Promise.resolve(\n wrapResponse({\n blockhash: \"GH7ome3EiwEr7tu9JuTh2dpYWBJK3z69Xm1ZE3MEE6JC\",\n lastValidBlockHeight: 1000n,\n })\n ),\n }),\n getSignatureStatuses: () => ({\n send: () =>\n Promise.resolve(\n wrapResponse([\n {\n confirmationStatus: \"confirmed\",\n confirmations: 10n,\n err: null,\n slot: 1000n,\n status: { Ok: null },\n },\n ])\n ),\n }),\n getTokenAccountBalance: () => ({\n send: () =>\n Promise.resolve(\n wrapResponse({\n amount: \"1000000000\",\n decimals: 9,\n uiAmount: 1.0,\n uiAmountString: \"1.0\",\n })\n ),\n }),\n sendTransaction: () => ({\n send: () => Promise.resolve(\"mock-signature\"),\n }),\n simulateTransaction: () => ({\n send: () =>\n Promise.resolve(\n wrapResponse({\n err: null,\n logs: [] as string[],\n returnData: null,\n })\n ),\n }),\n ...overrides,\n }) as Rpc<SolanaRpcApi>;\n\nconst defaultConfig: Required<MockRpcServiceConfig> = {\n getCluster: () => Effect.succeed(TEST_CLUSTER),\n getRpc: () => Effect.succeed(makeMockRpc()),\n getRpcSubscriptions: () =>\n Effect.fail(\n new ConnectionNotFoundError({\n cluster: TEST_CLUSTER,\n message: \"WebSocket not configured in mock\",\n })\n ),\n getRpcUrl: () => Effect.succeed(\"https://api.devnet.solana.com\"),\n};\n\n/**\n * Creates a mock RpcService 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 = makeMockRpcServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockRpcServiceLayer({\n * getRpc: () => Effect.succeed(myCustomMockRpc),\n * getCluster: () => Effect.succeed(\"mainnet-beta\"),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const rpcService = yield* RpcService;\n * const rpc = yield* rpcService.getRpc();\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockRpcServiceLayer = (\n config: MockRpcServiceConfig = {}\n): Layer.Layer<RpcService> =>\n makeMockServiceLayer(RpcService, defaultConfig, config, (merged) => merged);\n"]}
@@ -1,9 +1,9 @@
1
1
  import type { Address } from "@solana/addresses";
2
2
  import type { Transaction, TransactionWithLifetime } from "@solana/transactions";
3
3
  import { Effect, Layer } from "effect";
4
- import type { SignatureError } from "../core/errors/index.js";
5
- import { WalletNotConnectedError } from "../core/errors/index.js";
6
- import { SignerService } from "../signer/index.js";
4
+ import type { SignatureError } from "#src/core/errors/index.js";
5
+ import { WalletNotConnectedError } from "#src/core/errors/index.js";
6
+ import { SignerService } from "#src/signer/index.js";
7
7
  export type MockSignerServiceConfig = {
8
8
  address?: Address;
9
9
  connected?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"mock-signer-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-signer-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IACnE,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,uBAAuB,EAChE,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,GAAG,uBAAuB,CAAC,CAAC;IAChE,mBAAmB,CAAC,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,uBAAuB,EACpE,GAAG,EAAE,SAAS,CAAC,EAAE,KACd,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,uBAAuB,CAAC,CAAC;IAC3E,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CAC5C,CAAC;AA+BF,eAAO,MAAM,0BAA0B,GACrC,SAAQ,uBAA4B,KACnC,KAAK,CAAC,KAAK,CAAC,aAAa,CAgC3B,CAAC"}
1
+ {"version":3,"file":"mock-signer-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-signer-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AASrD,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IACnE,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,uBAAuB,EAChE,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,GAAG,uBAAuB,CAAC,CAAC;IAChE,mBAAmB,CAAC,EAAE,CAAC,CAAC,SAAS,WAAW,GAAG,uBAAuB,EACpE,GAAG,EAAE,SAAS,CAAC,EAAE,KACd,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,uBAAuB,CAAC,CAAC;IAC3E,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CAC5C,CAAC;AA+BF,eAAO,MAAM,0BAA0B,GACrC,SAAQ,uBAA4B,KACnC,KAAK,CAAC,KAAK,CAAC,aAAa,CAgC3B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Effect, Layer } from "effect";
2
- import { WalletNotConnectedError } from "../core/errors/index.js";
3
- import { SignerService } from "../signer/index.js";
2
+ import { WalletNotConnectedError } from "#src/core/errors/index.js";
3
+ import { SignerService } from "#src/signer/index.js";
4
4
  import { TEST_WALLET } from "./_fixtures/addresses.js";
5
5
  export const makeMockSignerServiceLayer = (config = {}) => {
6
6
  const address = config.address ?? TEST_WALLET;
@@ -1 +1 @@
1
- {"version":3,"file":"mock-signer-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-signer-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAkDvD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,SAAkC,EAAE,EACR,EAAE;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,WAAW,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAE3C,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAC7B,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,sBAAsB,GAAG,CAAkD,EAAK,EAAE,EAAE,CACxF,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,0BAA0B,GAAG,CACjC,GAAiB,EACjB,EAAE,CACF,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC,OAAO,CAClB,aAAa,EACb,aAAa,CAAC,EAAE,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,iBAAiB;QAClD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,kBAAkB;QACrD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,0BAA0B;QAC7E,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE,CAAC,CACH,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"mock-signer-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-signer-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAkDvD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,SAAkC,EAAE,EACR,EAAE;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,WAAW,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAE3C,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAC7B,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,sBAAsB,GAAG,CAAkD,EAAK,EAAE,EAAE,CACxF,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,0BAA0B,GAAG,CACjC,GAAiB,EACjB,EAAE,CACF,SAAS;QACP,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC,OAAO,CAClB,aAAa,EACb,aAAa,CAAC,EAAE,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,iBAAiB;QAClD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,kBAAkB;QACrD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,0BAA0B;QAC7E,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE,CAAC,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Address } from \"@solana/addresses\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport { Effect, Layer } from \"effect\";\nimport type { SignatureError } from \"#src/core/errors/index.js\";\nimport { WalletNotConnectedError } from \"#src/core/errors/index.js\";\nimport { SignerService } from \"#src/signer/index.js\";\nimport { TEST_WALLET } from \"./_fixtures/addresses.js\";\n\n/**\n * Configuration for the mock SignerService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockSignerServiceConfig = {\n address?: Address;\n connected?: boolean;\n getAddress?: () => Effect.Effect<Address, WalletNotConnectedError>;\n signTransaction?: <T extends Transaction & TransactionWithLifetime>(\n tx: T\n ) => Effect.Effect<T, SignatureError | WalletNotConnectedError>;\n signAllTransactions?: <T extends Transaction & TransactionWithLifetime>(\n txs: readonly T[]\n ) => Effect.Effect<readonly T[], SignatureError | WalletNotConnectedError>;\n isConnected?: () => Effect.Effect<boolean>;\n};\n\n/**\n * Creates a mock SignerService layer for testing\n *\n * @param config - Optional configuration to override default mock behaviors\n *\n * @example\n * ```typescript\n * // Basic usage with defaults (connected wallet)\n * const layer = makeMockSignerServiceLayer();\n *\n * // Simulate disconnected wallet\n * const disconnectedLayer = makeMockSignerServiceLayer({\n * connected: false,\n * });\n *\n * // Custom address\n * const customLayer = makeMockSignerServiceLayer({\n * address: \"DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK\" as Address,\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const signer = yield* SignerService;\n * const address = yield* signer.getAddress();\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockSignerServiceLayer = (\n config: MockSignerServiceConfig = {}\n): Layer.Layer<SignerService> => {\n const address = config.address ?? TEST_WALLET;\n const connected = config.connected ?? true;\n\n const defaultGetAddress = () =>\n connected\n ? Effect.succeed(address)\n : Effect.fail(new WalletNotConnectedError({ message: \"Wallet not connected\" }));\n\n const defaultSignTransaction = <T extends Transaction & TransactionWithLifetime>(tx: T) =>\n connected\n ? Effect.succeed(tx)\n : Effect.fail(new WalletNotConnectedError({ message: \"Wallet not connected\" }));\n\n const defaultSignAllTransactions = <T extends Transaction & TransactionWithLifetime>(\n txs: readonly T[]\n ) =>\n connected\n ? Effect.succeed(txs)\n : Effect.fail(new WalletNotConnectedError({ message: \"Wallet not connected\" }));\n\n const defaultIsConnected = () => Effect.succeed(connected);\n\n return Layer.succeed(\n SignerService,\n SignerService.of({\n getAddress: config.getAddress ?? defaultGetAddress,\n isConnected: config.isConnected ?? defaultIsConnected,\n signAllTransactions: config.signAllTransactions ?? defaultSignAllTransactions,\n signTransaction: config.signTransaction ?? defaultSignTransaction,\n })\n );\n};\n"]}
@@ -1,9 +1,9 @@
1
1
  import type { Address, Instruction } from "@solana/kit";
2
2
  import type { Layer } from "effect";
3
3
  import { Effect } from "effect";
4
- import type { AccountNotFoundError, RpcError } from "../core/errors/index.js";
5
- import type { ATAParams, MintAccount, TokenAccount } from "../token/index.js";
6
- import { TokenService } from "../token/index.js";
4
+ import type { AccountNotFoundError, RpcError } from "#src/core/errors/index.js";
5
+ import type { ATAParams, MintAccount, TokenAccount } from "#src/token/index.js";
6
+ import { TokenService } from "#src/token/index.js";
7
7
  export type MockTokenServiceConfig = {
8
8
  getAssociatedTokenAddress?: (params: ATAParams) => Effect.Effect<Address>;
9
9
  getOrCreateATA?: (params: ATAParams & {
@@ -1 +1 @@
1
- {"version":3,"file":"mock-token-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-token-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,MAAM,MAAM,sBAAsB,GAAG;IACnC,yBAAyB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CACxE;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,EACD,QAAQ,CACT,CAAC;IACF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAC3F,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IACzF,eAAe,CAAC,EAAE,CAChB,OAAO,EAAE,OAAO,KACb,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAClE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE;QAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;KACjC,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;CACzE,CAAC;AA6EF,eAAO,MAAM,yBAAyB,GACpC,SAAQ,sBAA2B,KAClC,KAAK,CAAC,KAAK,CAAC,YAAY,CACoD,CAAC"}
1
+ {"version":3,"file":"mock-token-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-token-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAUnD,MAAM,MAAM,sBAAsB,GAAG;IACnC,yBAAyB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CACxE;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,EACD,QAAQ,CACT,CAAC;IACF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAC3F,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IACzF,eAAe,CAAC,EAAE,CAChB,OAAO,EAAE,OAAO,KACb,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAClE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE;QAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;KACjC,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;CACzE,CAAC;AA6EF,eAAO,MAAM,yBAAyB,GACpC,SAAQ,sBAA2B,KAClC,KAAK,CAAC,KAAK,CAAC,YAAY,CACoD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { TokenService } from "../token/index.js";
2
+ import { TokenService } from "#src/token/index.js";
3
3
  import { TEST_ADDRESS_2 } from "./_fixtures/addresses.js";
4
4
  import { makeMockServiceLayer } from "./helpers.js";
5
5
  const defaultConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"mock-token-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-token-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgCpD,MAAM,aAAa,GAAqC;IACtD,yBAAyB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IAC/D,OAAO,EAAE,GAAG,EAAE,CACZ,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACrC,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACnC,MAAM,EAAE,EAAE;SACX;QACD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,EAAE;KACK,CAAC;IACnB,cAAc,EAAE,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,SAAS;KACvB,CAAC;IACJ,eAAe,EAAE,GAAG,EAAE,CACpB,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE;YACJ,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9B,eAAe,EAAE,EAAE;YACnB,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,CAAC;SACT;QACD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,EAAE;KACM,CAAC;IACpB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAClD,sBAAsB,EAAE,GAAG,EAAE,CAC3B,MAAM,CAAC,OAAO,CAAC;QACb,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,IAAI,UAAU,EAAE;QACtB,cAAc,EAAE,cAAc;KAChB,CAAC;IACnB,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;CAC/C,CAAC;AA2BF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAAiC,EAAE,EACR,EAAE,CAC7B,oBAAoB,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"mock-token-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-token-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgCpD,MAAM,aAAa,GAAqC;IACtD,yBAAyB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;IAC/D,OAAO,EAAE,GAAG,EAAE,CACZ,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACrC,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACnC,MAAM,EAAE,EAAE;SACX;QACD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,EAAE;KACK,CAAC;IACnB,cAAc,EAAE,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,SAAS;KACvB,CAAC;IACJ,eAAe,EAAE,GAAG,EAAE,CACpB,MAAM,CAAC,OAAO,CAAC;QACb,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE;YACJ,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9B,eAAe,EAAE,EAAE;YACnB,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC9B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,CAAC;SACT;QACD,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,EAAE;KACM,CAAC;IACpB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IAClD,sBAAsB,EAAE,GAAG,EAAE,CAC3B,MAAM,CAAC,OAAO,CAAC;QACb,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,IAAI,UAAU,EAAE;QACtB,cAAc,EAAE,cAAc;KAChB,CAAC;IACnB,kBAAkB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;CAC/C,CAAC;AA2BF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAAiC,EAAE,EACR,EAAE,CAC7B,oBAAoB,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import type { Address, Instruction } from \"@solana/kit\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport type { AccountNotFoundError, RpcError } from \"#src/core/errors/index.js\";\nimport type { ATAParams, MintAccount, TokenAccount } from \"#src/token/index.js\";\nimport { TokenService } from \"#src/token/index.js\";\nimport { TEST_ADDRESS_2 } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock TokenService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockTokenServiceConfig = {\n getAssociatedTokenAddress?: (params: ATAParams) => Effect.Effect<Address>;\n getOrCreateATA?: (params: ATAParams & { payer: Address }) => Effect.Effect<\n {\n address: Address;\n instruction?: Instruction;\n },\n RpcError\n >;\n getTokenBalance?: (ata: Address) => Effect.Effect<bigint, AccountNotFoundError | RpcError>;\n getMint?: (mint: Address) => Effect.Effect<MintAccount, AccountNotFoundError | RpcError>;\n getTokenAccount?: (\n account: Address\n ) => Effect.Effect<TokenAccount, AccountNotFoundError | RpcError>;\n getTransferInstruction?: (params: {\n readonly source: Address;\n readonly destination: Address;\n readonly authority: Address;\n readonly amount: bigint;\n readonly tokenProgram?: Address;\n }) => Effect.Effect<Instruction>;\n tokenAccountExists?: (ata: Address) => Effect.Effect<boolean, RpcError>;\n};\n\nconst defaultConfig: Required<MockTokenServiceConfig> = {\n getAssociatedTokenAddress: () => Effect.succeed(TEST_ADDRESS_2),\n getMint: () =>\n Effect.succeed({\n address: TEST_ADDRESS_2,\n data: {\n decimals: 0,\n freezeAuthority: { __option: \"None\" },\n isInitialized: true,\n mintAuthority: { __option: \"None\" },\n supply: 0n,\n },\n executable: false,\n lamports: 0n,\n programAddress: TEST_ADDRESS_2,\n space: 0n,\n } as MintAccount),\n getOrCreateATA: () =>\n Effect.succeed({\n address: TEST_ADDRESS_2,\n instruction: undefined, // Account already exists\n }),\n getTokenAccount: () =>\n Effect.succeed({\n address: TEST_ADDRESS_2,\n data: {\n amount: 0n,\n closeAuthority: { __option: \"None\" },\n delegate: { __option: \"None\" },\n delegatedAmount: 0n,\n isNative: { __option: \"None\" },\n mint: TEST_ADDRESS_2,\n owner: TEST_ADDRESS_2,\n state: 1,\n },\n executable: false,\n lamports: 0n,\n programAddress: TEST_ADDRESS_2,\n space: 0n,\n } as TokenAccount),\n getTokenBalance: () => Effect.succeed(1000000000n), // 1 token with 9 decimals\n getTransferInstruction: () =>\n Effect.succeed({\n accounts: [],\n data: new Uint8Array(),\n programAddress: TEST_ADDRESS_2,\n } as Instruction),\n tokenAccountExists: () => Effect.succeed(true),\n};\n\n/**\n * Creates a mock TokenService 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 = makeMockTokenServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockTokenServiceLayer({\n * getTokenBalance: () => Effect.succeed(5000000000n),\n * tokenAccountExists: () => Effect.succeed(false),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const tokenService = yield* TokenService;\n * const balance = yield* tokenService.getTokenBalance(ata);\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockTokenServiceLayer = (\n config: MockTokenServiceConfig = {}\n): Layer.Layer<TokenService> =>\n makeMockServiceLayer(TokenService, defaultConfig, config, (merged) => merged);\n"]}
@@ -1,22 +1,21 @@
1
1
  import type { Instruction } from "@solana/instructions";
2
2
  import type { Signature } from "@solana/keys";
3
- import type { CompilableTransactionMessage } from "@solana/transaction-messages";
4
3
  import type { Transaction, TransactionWithLifetime } from "@solana/transactions";
5
4
  import type { Layer } from "effect";
6
5
  import { Effect } from "effect";
7
- import type { SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError, WalletNotConnectedError } from "../core/errors/index.js";
8
- import type { ConfirmOpts, TransactionBatchItem, TransactionBatchOpts, TransactionReceipt } from "../tx/index.js";
9
- import { TransactionService } from "../tx/index.js";
6
+ import type { SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError, WalletNotConnectedError } from "#src/core/errors/index.js";
7
+ import type { ConfirmOpts, SignableTransactionMessage, TransactionBatchItem, TransactionBatchOpts, TransactionReceipt } from "#src/tx/index.js";
8
+ import { TransactionService } from "#src/tx/index.js";
10
9
  export type MockTransactionServiceConfig = {
11
- build?: (instructions: readonly Instruction[]) => Effect.Effect<CompilableTransactionMessage, TransactionSendError | WalletNotConnectedError>;
12
- signAll?: (txs: readonly CompilableTransactionMessage[]) => Effect.Effect<readonly (Transaction & TransactionWithLifetime)[], TransactionSendError | WalletNotConnectedError>;
13
- sign?: <T extends CompilableTransactionMessage>(tx: T) => Effect.Effect<Transaction & TransactionWithLifetime, TransactionSendError | WalletNotConnectedError>;
10
+ build?: (instructions: readonly Instruction[]) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;
11
+ signAll?: (txs: readonly SignableTransactionMessage[]) => Effect.Effect<readonly (Transaction & TransactionWithLifetime)[], TransactionSendError | WalletNotConnectedError>;
12
+ sign?: <T extends SignableTransactionMessage>(tx: T) => Effect.Effect<Transaction & TransactionWithLifetime, TransactionSendError | WalletNotConnectedError>;
14
13
  sendAll?: (txs: readonly (Transaction & TransactionWithLifetime)[], opts?: TransactionBatchOpts) => Effect.Effect<readonly Signature[], TransactionSendError>;
15
14
  send?: (tx: Transaction & TransactionWithLifetime) => Effect.Effect<Signature, TransactionSendError>;
16
15
  confirm?: (signature: Signature, opts?: ConfirmOpts) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;
17
16
  sendAndConfirm?: (instructions: readonly Instruction[], opts?: ConfirmOpts) => Effect.Effect<TransactionReceipt, TransactionSendError | WalletNotConnectedError | TransactionTimeoutError | TransactionFailedError>;
18
17
  sendAndConfirmBatch?: (items: readonly TransactionBatchItem[], opts?: TransactionBatchOpts) => Effect.Effect<readonly TransactionReceipt[], TransactionSendError | WalletNotConnectedError | TransactionTimeoutError | TransactionFailedError>;
19
- simulate?: <T extends CompilableTransactionMessage>(tx: T) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;
18
+ simulate?: <T extends SignableTransactionMessage>(tx: T) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;
20
19
  };
21
20
  export declare const makeMockTransactionServiceLayer: (config?: MockTransactionServiceConfig) => Layer.Layer<TransactionService>;
22
21
  //# sourceMappingURL=mock-transaction-service.d.ts.map
@@ -1 +1 @@
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,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACjF,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,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAUvD,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,CACN,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,MAAM,CAAC,MAAM,CAAC,4BAA4B,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IACjG,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,4BAA4B,EAAE,KACzC,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,4BAA4B,EAC5C,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,4BAA4B,EAChD,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
+ {"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,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { TransactionService } from "../tx/index.js";
2
+ import { TransactionService } from "#src/tx/index.js";
3
3
  import { TEST_SIGNATURE } from "./_fixtures/addresses.js";
4
4
  import { makeMockServiceLayer } from "./helpers.js";
5
5
  const defaultConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"mock-transaction-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-transaction-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAchC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,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,EAAkC,CAAC;IAC/D,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"}
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,10 +1,12 @@
1
1
  import { Layer } from "effect";
2
- import type { BalanceService } from "../balance/index.js";
3
- import type { PdaService } from "../pda/index.js";
4
- import type { RpcService } from "../rpc/index.js";
5
- import type { SignerService } from "../signer/index.js";
6
- import type { TokenService } from "../token/index.js";
7
- import type { TransactionService } from "../tx/index.js";
2
+ import type { BalanceService } from "#src/balance/index.js";
3
+ import type { PdaService } from "#src/pda/index.js";
4
+ import type { ProgramReaderShape, ProgramWriterShape } from "#src/program/index.js";
5
+ import { ProgramReader, ProgramWriter } from "#src/program/index.js";
6
+ import type { RpcService } from "#src/rpc/index.js";
7
+ import type { SignerService } from "#src/signer/index.js";
8
+ import type { TokenService } from "#src/token/index.js";
9
+ import type { TransactionService } from "#src/tx/index.js";
8
10
  import type { MockBalanceServiceConfig } from "./mock-balance-service.js";
9
11
  import type { MockPdaServiceConfig } from "./mock-pda-service.js";
10
12
  import type { MockRpcServiceConfig } from "./mock-rpc-service.js";
@@ -18,6 +20,8 @@ export type TestLayerConfig = {
18
20
  tokenService?: MockTokenServiceConfig;
19
21
  transactionService?: MockTransactionServiceConfig;
20
22
  pdaService?: MockPdaServiceConfig;
23
+ programReaderService?: ProgramReaderShape;
24
+ programWriterService?: ProgramWriterShape;
21
25
  };
22
- export declare function makeEffectSolanaTestLayer(config?: TestLayerConfig): Layer.Layer<RpcService | SignerService | BalanceService | TokenService | TransactionService | PdaService>;
26
+ export declare function makeEffectSolanaTestLayer(config?: TestLayerConfig): Layer.Layer<RpcService | SignerService | BalanceService | TokenService | TransactionService | PdaService | ProgramReader | ProgramWriter>;
23
27
  //# sourceMappingURL=test-layer.d.ts.map
@@ -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,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,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;CACnC,CAAC;AAsDF,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,eAAoB,GAC3B,KAAK,CAAC,KAAK,CACZ,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,kBAAkB,GAAG,UAAU,CAC7F,CAsCA"}
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,15 +1,16 @@
1
1
  import { Layer } from "effect";
2
- import { BalanceServiceLive } from "../balance/index.js";
3
- import { PdaServiceLive } from "../pda/index.js";
4
- import { TokenServiceLive } from "../token/index.js";
5
- import { TransactionServiceLive } from "../tx/index.js";
2
+ import { BalanceServiceLive } from "#src/balance/index.js";
3
+ import { PdaServiceLive } from "#src/pda/index.js";
4
+ import { ProgramReader, ProgramReaderLive, ProgramWriter, ProgramWriterLive, } from "#src/program/index.js";
5
+ import { TokenServiceLive } from "#src/token/index.js";
6
+ import { TransactionServiceLive } from "#src/tx/index.js";
6
7
  import { makeMockBalanceServiceLayer } from "./mock-balance-service.js";
7
8
  import { makeMockPdaServiceLayer } from "./mock-pda-service.js";
8
9
  import { makeMockRpcServiceLayer } from "./mock-rpc-service.js";
9
10
  import { makeMockSignerServiceLayer } from "./mock-signer-service.js";
10
11
  import { makeMockTokenServiceLayer } from "./mock-token-service.js";
11
12
  import { makeMockTransactionServiceLayer } from "./mock-transaction-service.js";
12
- const applicationServices = Layer.mergeAll(BalanceServiceLive, TokenServiceLive, TransactionServiceLive, PdaServiceLive);
13
+ const applicationServices = Layer.mergeAll(BalanceServiceLive, TokenServiceLive, TransactionServiceLive, PdaServiceLive, ProgramReaderLive, ProgramWriterLive);
13
14
  export function makeEffectSolanaTestLayer(config = {}) {
14
15
  const boundaryLayers = Layer.mergeAll(makeMockRpcServiceLayer(config.rpcService ?? {}), makeMockSignerServiceLayer(config.signerService ?? {}));
15
16
  let serviceMockLayer = Layer.empty;
@@ -25,6 +26,12 @@ export function makeEffectSolanaTestLayer(config = {}) {
25
26
  if (config.pdaService) {
26
27
  serviceMockLayer = Layer.merge(serviceMockLayer, makeMockPdaServiceLayer(config.pdaService));
27
28
  }
29
+ if (config.programReaderService) {
30
+ serviceMockLayer = Layer.merge(serviceMockLayer, Layer.succeed(ProgramReader, ProgramReader.of(config.programReaderService)));
31
+ }
32
+ if (config.programWriterService) {
33
+ serviceMockLayer = Layer.merge(serviceMockLayer, Layer.succeed(ProgramWriter, ProgramWriter.of(config.programWriterService)));
34
+ }
28
35
  const baseLayer = Layer.provideMerge(applicationServices, boundaryLayers);
29
36
  return Layer.merge(baseLayer, serviceMockLayer);
30
37
  }
@@ -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,wBAAwB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,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;AA4DhF,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,CACf,CAAC;AAuCF,MAAM,UAAU,yBAAyB,CACvC,SAA0B,EAAE;IAK5B,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;IAGD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAE1E,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAE7C,CAAC;AACJ,CAAC"}
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 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC","sourcesContent":["/**\n * Token service for SPL token operations.\n *\n * @module\n */\n\nexport * from \"./service.js\";\n"]}
@@ -1,8 +1,8 @@
1
1
  import type { Account, Address, Instruction } from "@solana/kit";
2
2
  import type { Mint, Token as TokenAccountData } from "@solana-program/token";
3
3
  import { Context, Effect, Layer } from "effect";
4
- import { AccountNotFoundError, RpcError } from "../core/errors/index.js";
5
- import { RpcService } from "../rpc/index.js";
4
+ import { AccountNotFoundError, RpcError } from "#src/core/errors/index.js";
5
+ import { RpcService } from "#src/rpc/index.js";
6
6
  export type MintAccount = Account<Mint>;
7
7
  export type TokenAccount = Account<TokenAccountData>;
8
8
  export type ATAParams = {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/token/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ7E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAI9B,QAAQ,CAAC,yBAAyB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAMzF,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAChF;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,EACD,KAAK,GAAG,QAAQ,CACjB,CAAC;IAKF,QAAQ,CAAC,eAAe,EAAE,CACxB,GAAG,EAAE,OAAO,KACT,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAK5D,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAKjG,QAAQ,CAAC,eAAe,EAAE,CACxB,OAAO,EAAE,OAAO,KACb,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAKlE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE;QACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;KACjC,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAKjC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;CACjF,CAAC;;AAEF,qBAAa,YAAa,SAAQ,iBAG/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,8CA0O5B,CAAC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/token/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQ7E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAI9B,QAAQ,CAAC,yBAAyB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAMzF,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAChF;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,EACD,KAAK,GAAG,QAAQ,CACjB,CAAC;IAKF,QAAQ,CAAC,eAAe,EAAE,CACxB,GAAG,EAAE,OAAO,KACT,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAK5D,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAKjG,QAAQ,CAAC,eAAe,EAAE,CACxB,OAAO,EAAE,OAAO,KACb,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,oBAAoB,GAAG,QAAQ,CAAC,CAAC;IAKlE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE;QACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;QAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;KACjC,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAKjC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;CACjF,CAAC;;AAEF,qBAAa,YAAa,SAAQ,iBAG/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,8CA0O5B,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import { createNoopSigner } from "@solana/signers";
2
2
  import { fetchMaybeMint, fetchMaybeToken, findAssociatedTokenPda, getCreateAssociatedTokenIdempotentInstructionAsync, getTransferInstruction, } from "@solana-program/token";
3
3
  import { Context, Effect, Layer } from "effect";
4
- import { TOKEN_PROGRAM_ADDRESS } from "../constants/index.js";
5
- import { AccountNotFoundError, RpcError } from "../core/errors/index.js";
6
- import { RpcService } from "../rpc/index.js";
7
- import { SpanNames } from "../telemetry/index.js";
4
+ import { TOKEN_PROGRAM_ADDRESS } from "#src/constants/index.js";
5
+ import { AccountNotFoundError, RpcError } from "#src/core/errors/index.js";
6
+ import { RpcService } from "#src/rpc/index.js";
7
+ import { SpanNames } from "#src/telemetry/index.js";
8
8
  export class TokenService extends Context.Tag("esolana/TokenService")() {
9
9
  }
10
10
  export const TokenServiceLive = Layer.effect(TokenService, Effect.gen(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/token/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/token/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Account, Address, Instruction } from \"@solana/kit\";\nimport { createNoopSigner } from \"@solana/signers\";\nimport type { Mint, Token as TokenAccountData } from \"@solana-program/token\";\nimport {\n fetchMaybeMint,\n fetchMaybeToken,\n findAssociatedTokenPda,\n getCreateAssociatedTokenIdempotentInstructionAsync,\n getTransferInstruction,\n} from \"@solana-program/token\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { TOKEN_PROGRAM_ADDRESS } from \"#src/constants/index.js\";\nimport { AccountNotFoundError, RpcError } from \"#src/core/errors/index.js\";\nimport { RpcService } from \"#src/rpc/index.js\";\nimport { SpanNames } from \"#src/telemetry/index.js\";\n\nexport type MintAccount = Account<Mint>;\nexport type TokenAccount = Account<TokenAccountData>;\n\nexport type ATAParams = {\n readonly owner: Address;\n readonly mint: Address;\n readonly tokenProgram?: Address;\n};\n\nexport type TokenServiceShape = {\n /**\n * Get the Associated Token Account address for an owner and mint.\n */\n readonly getAssociatedTokenAddress: (params: ATAParams) => Effect.Effect<Address, Error>;\n\n /**\n * Get or create an Associated Token Account.\n * Returns the address and optionally the instruction to create it.\n */\n readonly getOrCreateATA: (params: ATAParams & { payer: Address }) => Effect.Effect<\n {\n address: Address;\n instruction?: Instruction;\n },\n Error | RpcError\n >;\n\n /**\n * Get the token balance for an Associated Token Account.\n */\n readonly getTokenBalance: (\n ata: Address\n ) => Effect.Effect<bigint, AccountNotFoundError | RpcError>;\n\n /**\n * Get the mint account for a token.\n */\n readonly getMint: (mint: Address) => Effect.Effect<MintAccount, AccountNotFoundError | RpcError>;\n\n /**\n * Get a token account by address.\n */\n readonly getTokenAccount: (\n account: Address\n ) => Effect.Effect<TokenAccount, AccountNotFoundError | RpcError>;\n\n /**\n * Build a token transfer instruction.\n */\n readonly getTransferInstruction: (params: {\n readonly source: Address;\n readonly destination: Address;\n readonly authority: Address;\n readonly amount: bigint;\n readonly tokenProgram?: Address;\n }) => Effect.Effect<Instruction>;\n\n /**\n * Check if a token account exists.\n */\n readonly tokenAccountExists: (ata: Address) => Effect.Effect<boolean, RpcError>;\n};\n\nexport class TokenService extends Context.Tag(\"esolana/TokenService\")<\n TokenService,\n TokenServiceShape\n>() {}\n\nexport const TokenServiceLive = Layer.effect(\n TokenService,\n Effect.gen(function* () {\n const rpcService = yield* RpcService;\n\n return TokenService.of({\n getAssociatedTokenAddress: (params) =>\n Effect.gen(function* () {\n const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;\n const pda = yield* Effect.tryPromise({\n catch: (cause) =>\n new Error(`Failed to derive ATA for mint ${params.mint} and owner ${params.owner}`, {\n cause,\n }),\n try: () =>\n findAssociatedTokenPda({\n mint: params.mint,\n owner: params.owner,\n tokenProgram,\n }),\n });\n return pda[0];\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_GET_ATA, {\n attributes: {\n mint: params.mint,\n owner: params.owner,\n },\n })\n ),\n\n getMint: (mint) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const rpcUrl = yield* rpcService.getRpcUrl();\n\n const account = yield* Effect.tryPromise({\n catch: (cause) =>\n new RpcError({\n cause,\n message: `Failed to fetch mint ${mint}`,\n url: rpcUrl,\n }),\n try: () => fetchMaybeMint(rpc, mint),\n });\n\n if (!account.exists) {\n return yield* Effect.fail(\n new AccountNotFoundError({\n address: mint,\n message: `Mint not found: ${mint}`,\n })\n );\n }\n\n return account;\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_GET_MINT, {\n attributes: { mint },\n })\n ),\n\n getOrCreateATA: (params) =>\n Effect.gen(function* () {\n const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;\n const pda = yield* Effect.tryPromise({\n catch: (cause) =>\n new Error(`Failed to derive ATA for mint ${params.mint} and owner ${params.owner}`, {\n cause,\n }),\n try: () =>\n findAssociatedTokenPda({\n mint: params.mint,\n owner: params.owner,\n tokenProgram,\n }),\n });\n const ata = pda[0];\n\n const rpc = yield* rpcService.getRpc();\n const rpcUrl = yield* rpcService.getRpcUrl();\n\n // Check if account exists\n const accountInfo = yield* Effect.tryPromise({\n catch: (cause) =>\n new RpcError({\n cause,\n message: `Failed to get account info for ${ata}`,\n url: rpcUrl,\n }),\n try: () => rpc.getAccountInfo(ata, { encoding: \"base64\" }).send(),\n });\n\n if (accountInfo.value) {\n // Account exists\n return { address: ata };\n }\n\n // Create instruction using idempotent version (safe to call even if exists)\n // Use NoopSigner since we only need the address for instruction creation\n // The actual signing happens later via TransactionService\n const payerSigner = createNoopSigner(params.payer);\n\n const instruction = yield* Effect.tryPromise({\n catch: (cause) =>\n new Error(\n `Failed to create ATA instruction for mint ${params.mint} and owner ${params.owner}`,\n { cause }\n ),\n try: () =>\n getCreateAssociatedTokenIdempotentInstructionAsync({\n ata,\n mint: params.mint,\n owner: params.owner,\n payer: payerSigner,\n tokenProgram,\n }),\n });\n\n return { address: ata, instruction };\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_CREATE_ATA, {\n attributes: {\n mint: params.mint,\n owner: params.owner,\n },\n })\n ),\n\n getTokenAccount: (accountAddress) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const rpcUrl = yield* rpcService.getRpcUrl();\n\n const account = yield* Effect.tryPromise({\n catch: (cause) =>\n new RpcError({\n cause,\n message: `Failed to fetch token account ${accountAddress}`,\n url: rpcUrl,\n }),\n try: () => fetchMaybeToken(rpc, accountAddress),\n });\n\n if (!account.exists) {\n return yield* Effect.fail(\n new AccountNotFoundError({\n address: accountAddress,\n message: `Token account not found: ${accountAddress}`,\n })\n );\n }\n\n return account;\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_GET_ACCOUNT, {\n attributes: { account: accountAddress },\n })\n ),\n\n getTokenBalance: (ata) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const rpcUrl = yield* rpcService.getRpcUrl();\n const response = yield* Effect.tryPromise({\n catch: (cause) =>\n new RpcError({\n cause,\n message: `Failed to get token balance for ${ata}`,\n url: rpcUrl,\n }),\n try: () => rpc.getTokenAccountBalance(ata).send(),\n });\n\n if (!response.value) {\n return yield* Effect.fail(\n new AccountNotFoundError({\n address: ata,\n message: `Token account not found: ${ata}`,\n })\n );\n }\n\n return BigInt(response.value.amount);\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET_TOKEN, {\n attributes: { ata },\n })\n ),\n\n getTransferInstruction: (params) =>\n Effect.sync(() => {\n const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;\n\n return getTransferInstruction(\n {\n amount: params.amount,\n authority: params.authority,\n destination: params.destination,\n source: params.source,\n },\n { programAddress: tokenProgram }\n );\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_TRANSFER, {\n attributes: {\n amount: params.amount.toString(),\n destination: params.destination,\n source: params.source,\n },\n })\n ),\n\n tokenAccountExists: (ata) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const rpcUrl = yield* rpcService.getRpcUrl();\n const response = yield* Effect.tryPromise({\n catch: (cause) =>\n new RpcError({\n cause,\n message: `Failed to check token account ${ata}`,\n url: rpcUrl,\n }),\n try: () => rpc.getAccountInfo(ata, { encoding: \"base64\" }).send(),\n });\n return response.value !== null;\n }).pipe(\n Effect.withSpan(SpanNames.TOKEN_ACCOUNT_EXISTS, {\n attributes: { ata },\n })\n ),\n });\n })\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tx/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tx/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["export * from \"./service.js\";\nexport * from \"./types.js\";\n"]}
@@ -1,17 +1,16 @@
1
1
  import type { Instruction } from "@solana/instructions";
2
2
  import type { Signature } from "@solana/keys";
3
- import type { CompilableTransactionMessage } from "@solana/transaction-messages";
4
3
  import type { Transaction, TransactionWithLifetime } from "@solana/transactions";
5
4
  import { Context, Effect, Layer } from "effect";
6
- import type { WalletNotConnectedError } from "../core/errors/index.js";
7
- import { SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError } from "../core/errors/index.js";
8
- import { RpcService } from "../rpc/index.js";
9
- import { SignerService } from "../signer/index.js";
10
- import type { ComputeBudgetConfig, ConfirmOpts, TransactionBatchItem, TransactionBatchOpts, TransactionBuildOpts, TransactionReceipt } from "./types.js";
5
+ import type { WalletNotConnectedError } from "#src/core/errors/index.js";
6
+ import { SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError } from "#src/core/errors/index.js";
7
+ import { RpcService } from "#src/rpc/index.js";
8
+ import { SignerService } from "#src/signer/index.js";
9
+ import type { ComputeBudgetConfig, ConfirmOpts, SignableTransactionMessage, TransactionBatchItem, TransactionBatchOpts, TransactionBuildOpts, TransactionReceipt } from "./types.js";
11
10
  export type TransactionServiceShape = {
12
- readonly build: (instructions: readonly Instruction[], opts?: TransactionBuildOpts) => Effect.Effect<CompilableTransactionMessage, TransactionSendError | WalletNotConnectedError>;
13
- readonly signAll: (txs: readonly CompilableTransactionMessage[]) => Effect.Effect<readonly (Transaction & TransactionWithLifetime)[], TransactionSendError | WalletNotConnectedError>;
14
- readonly sign: <T extends CompilableTransactionMessage>(tx: T) => Effect.Effect<Transaction & TransactionWithLifetime, TransactionSendError | WalletNotConnectedError>;
11
+ readonly build: (instructions: readonly Instruction[], opts?: TransactionBuildOpts) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;
12
+ readonly signAll: (txs: readonly SignableTransactionMessage[]) => Effect.Effect<readonly (Transaction & TransactionWithLifetime)[], TransactionSendError | WalletNotConnectedError>;
13
+ readonly sign: <T extends SignableTransactionMessage>(tx: T) => Effect.Effect<Transaction & TransactionWithLifetime, TransactionSendError | WalletNotConnectedError>;
15
14
  readonly sendAll: (txs: readonly (Transaction & TransactionWithLifetime)[], opts?: TransactionBatchOpts) => Effect.Effect<readonly Signature[], TransactionSendError>;
16
15
  readonly send: (tx: Transaction & TransactionWithLifetime) => Effect.Effect<Signature, TransactionSendError>;
17
16
  readonly confirm: (signature: Signature, opts?: ConfirmOpts) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;
@@ -19,7 +18,7 @@ export type TransactionServiceShape = {
19
18
  computeBudget?: ComputeBudgetConfig;
20
19
  }) => Effect.Effect<TransactionReceipt, TransactionSendError | WalletNotConnectedError | TransactionTimeoutError | TransactionFailedError>;
21
20
  readonly sendAndConfirmBatch: (items: readonly TransactionBatchItem[], opts?: TransactionBatchOpts) => Effect.Effect<readonly TransactionReceipt[], TransactionSendError | WalletNotConnectedError | TransactionTimeoutError | TransactionFailedError>;
22
- readonly simulate: <T extends CompilableTransactionMessage>(tx: T) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;
21
+ readonly simulate: <T extends SignableTransactionMessage>(tx: T) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;
23
22
  };
24
23
  declare const TransactionService_base: Context.TagClass<TransactionService, "esolana/TransactionService", TransactionServiceShape>;
25
24
  export declare class TransactionService extends TransactionService_base {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,10 @@ import { appendTransactionMessageInstructions, createTransactionMessage, setTran
3
3
  import { compileTransaction, getBase64EncodedWireTransaction, getSignatureFromTransaction, } from "@solana/transactions";
4
4
  import { getSetComputeUnitLimitInstruction, getSetComputeUnitPriceInstruction, } from "@solana-program/compute-budget";
5
5
  import { Context, Duration, Effect, Layer, Schedule } from "effect";
6
- import { SignatureError, SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError, } from "../core/errors/index.js";
7
- import { RpcService } from "../rpc/index.js";
8
- import { SignerService } from "../signer/index.js";
9
- import { SpanNames } from "../telemetry/index.js";
6
+ import { SignatureError, SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError, } from "#src/core/errors/index.js";
7
+ import { RpcService } from "#src/rpc/index.js";
8
+ import { SignerService } from "#src/signer/index.js";
9
+ import { SpanNames } from "#src/telemetry/index.js";
10
10
  export class TransactionService extends Context.Tag("esolana/TransactionService")() {
11
11
  }
12
12
  const hasReachedConfirmation = (status, commitment) => {