@prb/effect-solana 1.0.0-beta.0

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 (210) hide show
  1. package/README.md +406 -0
  2. package/dist/balance/index.d.ts +2 -0
  3. package/dist/balance/index.d.ts.map +1 -0
  4. package/dist/balance/index.js +2 -0
  5. package/dist/balance/index.js.map +1 -0
  6. package/dist/balance/service.d.ts +21 -0
  7. package/dist/balance/service.d.ts.map +1 -0
  8. package/dist/balance/service.js +62 -0
  9. package/dist/balance/service.js.map +1 -0
  10. package/dist/constants/index.d.ts +11 -0
  11. package/dist/constants/index.d.ts.map +1 -0
  12. package/dist/constants/index.js +14 -0
  13. package/dist/constants/index.js.map +1 -0
  14. package/dist/core/errors/account.d.ts +21 -0
  15. package/dist/core/errors/account.d.ts.map +1 -0
  16. package/dist/core/errors/account.js +14 -0
  17. package/dist/core/errors/account.js.map +1 -0
  18. package/dist/core/errors/index.d.ts +6 -0
  19. package/dist/core/errors/index.d.ts.map +1 -0
  20. package/dist/core/errors/index.js +6 -0
  21. package/dist/core/errors/index.js.map +1 -0
  22. package/dist/core/errors/predicates.d.ts +21 -0
  23. package/dist/core/errors/predicates.d.ts.map +1 -0
  24. package/dist/core/errors/predicates.js +8 -0
  25. package/dist/core/errors/predicates.js.map +1 -0
  26. package/dist/core/errors/rpc.d.ts +20 -0
  27. package/dist/core/errors/rpc.d.ts.map +1 -0
  28. package/dist/core/errors/rpc.js +13 -0
  29. package/dist/core/errors/rpc.js.map +1 -0
  30. package/dist/core/errors/transaction.d.ts +46 -0
  31. package/dist/core/errors/transaction.d.ts.map +1 -0
  32. package/dist/core/errors/transaction.js +30 -0
  33. package/dist/core/errors/transaction.js.map +1 -0
  34. package/dist/core/errors/wallet.d.ts +25 -0
  35. package/dist/core/errors/wallet.d.ts.map +1 -0
  36. package/dist/core/errors/wallet.js +15 -0
  37. package/dist/core/errors/wallet.js.map +1 -0
  38. package/dist/core/index.d.ts +2 -0
  39. package/dist/core/index.d.ts.map +1 -0
  40. package/dist/core/index.js +2 -0
  41. package/dist/core/index.js.map +1 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +13 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/internal/index.d.ts +2 -0
  47. package/dist/internal/index.d.ts.map +1 -0
  48. package/dist/internal/index.js +2 -0
  49. package/dist/internal/index.js.map +1 -0
  50. package/dist/internal/kit-effect.d.ts +11 -0
  51. package/dist/internal/kit-effect.d.ts.map +1 -0
  52. package/dist/internal/kit-effect.js +19 -0
  53. package/dist/internal/kit-effect.js.map +1 -0
  54. package/dist/pda/index.d.ts +2 -0
  55. package/dist/pda/index.d.ts.map +1 -0
  56. package/dist/pda/index.js +2 -0
  57. package/dist/pda/index.js.map +1 -0
  58. package/dist/pda/service.d.ts +15 -0
  59. package/dist/pda/service.d.ts.map +1 -0
  60. package/dist/pda/service.js +34 -0
  61. package/dist/pda/service.js.map +1 -0
  62. package/dist/presets/index.d.ts +2 -0
  63. package/dist/presets/index.d.ts.map +1 -0
  64. package/dist/presets/index.js +2 -0
  65. package/dist/presets/index.js.map +1 -0
  66. package/dist/presets/layers.d.ts +18 -0
  67. package/dist/presets/layers.d.ts.map +1 -0
  68. package/dist/presets/layers.js +40 -0
  69. package/dist/presets/layers.js.map +1 -0
  70. package/dist/react-hooks/index.d.ts +9 -0
  71. package/dist/react-hooks/index.d.ts.map +1 -0
  72. package/dist/react-hooks/index.js +5 -0
  73. package/dist/react-hooks/index.js.map +1 -0
  74. package/dist/react-hooks/internal/error.d.ts +5 -0
  75. package/dist/react-hooks/internal/error.d.ts.map +1 -0
  76. package/dist/react-hooks/internal/error.js +9 -0
  77. package/dist/react-hooks/internal/error.js.map +1 -0
  78. package/dist/react-hooks/internal/is-dev.d.ts +2 -0
  79. package/dist/react-hooks/internal/is-dev.d.ts.map +1 -0
  80. package/dist/react-hooks/internal/is-dev.js +5 -0
  81. package/dist/react-hooks/internal/is-dev.js.map +1 -0
  82. package/dist/react-hooks/internal/runtime.d.ts +21 -0
  83. package/dist/react-hooks/internal/runtime.d.ts.map +1 -0
  84. package/dist/react-hooks/internal/runtime.js +38 -0
  85. package/dist/react-hooks/internal/runtime.js.map +1 -0
  86. package/dist/react-hooks/internal/scoped-run.d.ts +11 -0
  87. package/dist/react-hooks/internal/scoped-run.d.ts.map +1 -0
  88. package/dist/react-hooks/internal/scoped-run.js +21 -0
  89. package/dist/react-hooks/internal/scoped-run.js.map +1 -0
  90. package/dist/react-hooks/internal/stable.d.ts +2 -0
  91. package/dist/react-hooks/internal/stable.d.ts.map +1 -0
  92. package/dist/react-hooks/internal/stable.js +3 -0
  93. package/dist/react-hooks/internal/stable.js.map +1 -0
  94. package/dist/react-hooks/primitives/use-effect-memo-factory.d.ts +11 -0
  95. package/dist/react-hooks/primitives/use-effect-memo-factory.d.ts.map +1 -0
  96. package/dist/react-hooks/primitives/use-effect-memo-factory.js +92 -0
  97. package/dist/react-hooks/primitives/use-effect-memo-factory.js.map +1 -0
  98. package/dist/react-hooks/primitives/use-effect.d.ts +23 -0
  99. package/dist/react-hooks/primitives/use-effect.d.ts.map +1 -0
  100. package/dist/react-hooks/primitives/use-effect.js +93 -0
  101. package/dist/react-hooks/primitives/use-effect.js.map +1 -0
  102. package/dist/react-hooks/primitives/use-fork-effect.d.ts +4 -0
  103. package/dist/react-hooks/primitives/use-fork-effect.d.ts.map +1 -0
  104. package/dist/react-hooks/primitives/use-fork-effect.js +20 -0
  105. package/dist/react-hooks/primitives/use-fork-effect.js.map +1 -0
  106. package/dist/react-hooks/primitives/use-stream.d.ts +26 -0
  107. package/dist/react-hooks/primitives/use-stream.d.ts.map +1 -0
  108. package/dist/react-hooks/primitives/use-stream.js +161 -0
  109. package/dist/react-hooks/primitives/use-stream.js.map +1 -0
  110. package/dist/react-hooks/primitives.d.ts +8 -0
  111. package/dist/react-hooks/primitives.d.ts.map +1 -0
  112. package/dist/react-hooks/primitives.js +6 -0
  113. package/dist/react-hooks/primitives.js.map +1 -0
  114. package/dist/react-hooks/provider.d.ts +19 -0
  115. package/dist/react-hooks/provider.d.ts.map +1 -0
  116. package/dist/react-hooks/provider.js +71 -0
  117. package/dist/react-hooks/provider.js.map +1 -0
  118. package/dist/rpc/index.d.ts +2 -0
  119. package/dist/rpc/index.d.ts.map +1 -0
  120. package/dist/rpc/index.js +2 -0
  121. package/dist/rpc/index.js.map +1 -0
  122. package/dist/rpc/service.d.ts +17 -0
  123. package/dist/rpc/service.d.ts.map +1 -0
  124. package/dist/rpc/service.js +35 -0
  125. package/dist/rpc/service.js.map +1 -0
  126. package/dist/signer/index.d.ts +2 -0
  127. package/dist/signer/index.d.ts.map +1 -0
  128. package/dist/signer/index.js +2 -0
  129. package/dist/signer/index.js.map +1 -0
  130. package/dist/signer/service.d.ts +22 -0
  131. package/dist/signer/service.d.ts.map +1 -0
  132. package/dist/signer/service.js +42 -0
  133. package/dist/signer/service.js.map +1 -0
  134. package/dist/telemetry/index.d.ts +3 -0
  135. package/dist/telemetry/index.d.ts.map +1 -0
  136. package/dist/telemetry/index.js +3 -0
  137. package/dist/telemetry/index.js.map +1 -0
  138. package/dist/telemetry/logger.d.ts +30 -0
  139. package/dist/telemetry/logger.d.ts.map +1 -0
  140. package/dist/telemetry/logger.js +8 -0
  141. package/dist/telemetry/logger.js.map +1 -0
  142. package/dist/telemetry/tracer.d.ts +47 -0
  143. package/dist/telemetry/tracer.d.ts.map +1 -0
  144. package/dist/telemetry/tracer.js +47 -0
  145. package/dist/telemetry/tracer.js.map +1 -0
  146. package/dist/testing-kit/_fixtures/addresses.d.ts +8 -0
  147. package/dist/testing-kit/_fixtures/addresses.d.ts.map +1 -0
  148. package/dist/testing-kit/_fixtures/addresses.js +7 -0
  149. package/dist/testing-kit/_fixtures/addresses.js.map +1 -0
  150. package/dist/testing-kit/helpers.d.ts +9 -0
  151. package/dist/testing-kit/helpers.d.ts.map +1 -0
  152. package/dist/testing-kit/helpers.js +32 -0
  153. package/dist/testing-kit/helpers.js.map +1 -0
  154. package/dist/testing-kit/index.d.ts +17 -0
  155. package/dist/testing-kit/index.d.ts.map +1 -0
  156. package/dist/testing-kit/index.js +10 -0
  157. package/dist/testing-kit/index.js.map +1 -0
  158. package/dist/testing-kit/mock-balance-service.d.ts +18 -0
  159. package/dist/testing-kit/mock-balance-service.d.ts.map +1 -0
  160. package/dist/testing-kit/mock-balance-service.js +10 -0
  161. package/dist/testing-kit/mock-balance-service.js.map +1 -0
  162. package/dist/testing-kit/mock-pda-service.d.ts +12 -0
  163. package/dist/testing-kit/mock-pda-service.d.ts.map +1 -0
  164. package/dist/testing-kit/mock-pda-service.js +11 -0
  165. package/dist/testing-kit/mock-pda-service.js.map +1 -0
  166. package/dist/testing-kit/mock-rpc-service.d.ts +15 -0
  167. package/dist/testing-kit/mock-rpc-service.d.ts.map +1 -0
  168. package/dist/testing-kit/mock-rpc-service.js +63 -0
  169. package/dist/testing-kit/mock-rpc-service.js.map +1 -0
  170. package/dist/testing-kit/mock-signer-service.d.ts +16 -0
  171. package/dist/testing-kit/mock-signer-service.d.ts.map +1 -0
  172. package/dist/testing-kit/mock-signer-service.js +25 -0
  173. package/dist/testing-kit/mock-signer-service.js.map +1 -0
  174. package/dist/testing-kit/mock-token-service.d.ts +28 -0
  175. package/dist/testing-kit/mock-token-service.d.ts.map +1 -0
  176. package/dist/testing-kit/mock-token-service.js +51 -0
  177. package/dist/testing-kit/mock-token-service.js.map +1 -0
  178. package/dist/testing-kit/mock-transaction-service.d.ts +22 -0
  179. package/dist/testing-kit/mock-transaction-service.d.ts.map +1 -0
  180. package/dist/testing-kit/mock-transaction-service.js +29 -0
  181. package/dist/testing-kit/mock-transaction-service.js.map +1 -0
  182. package/dist/testing-kit/test-layer.d.ts +23 -0
  183. package/dist/testing-kit/test-layer.d.ts.map +1 -0
  184. package/dist/testing-kit/test-layer.js +31 -0
  185. package/dist/testing-kit/test-layer.js.map +1 -0
  186. package/dist/token/index.d.ts +2 -0
  187. package/dist/token/index.d.ts.map +1 -0
  188. package/dist/token/index.js +2 -0
  189. package/dist/token/index.js.map +1 -0
  190. package/dist/token/service.d.ts +38 -0
  191. package/dist/token/service.d.ts.map +1 -0
  192. package/dist/token/service.js +158 -0
  193. package/dist/token/service.js.map +1 -0
  194. package/dist/tx/index.d.ts +3 -0
  195. package/dist/tx/index.d.ts.map +1 -0
  196. package/dist/tx/index.js +3 -0
  197. package/dist/tx/index.js.map +1 -0
  198. package/dist/tx/service.d.ts +27 -0
  199. package/dist/tx/service.d.ts.map +1 -0
  200. package/dist/tx/service.js +178 -0
  201. package/dist/tx/service.js.map +1 -0
  202. package/dist/tx/types.d.ts +29 -0
  203. package/dist/tx/types.d.ts.map +1 -0
  204. package/dist/tx/types.js +2 -0
  205. package/dist/tx/types.js.map +1 -0
  206. package/dist/types/index.d.ts +12 -0
  207. package/dist/types/index.d.ts.map +1 -0
  208. package/dist/types/index.js +2 -0
  209. package/dist/types/index.js.map +1 -0
  210. package/package.json +81 -0
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect";
2
+ import { PdaService } from "../pda/index.js";
3
+ import { TEST_ADDRESS } from "./_fixtures/addresses.js";
4
+ import { makeMockServiceLayer } from "./helpers.js";
5
+ const defaultConfig = {
6
+ derive: () => Effect.succeed([TEST_ADDRESS, 255]),
7
+ deriveAddress: () => Effect.succeed(TEST_ADDRESS),
8
+ deriveBump: () => Effect.succeed(255),
9
+ };
10
+ export const makeMockPdaServiceLayer = (config = {}) => makeMockServiceLayer(PdaService, defaultConfig, config, (merged) => merged);
11
+ //# sourceMappingURL=mock-pda-service.js.map
@@ -0,0 +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"}
@@ -0,0 +1,15 @@
1
+ import type { Rpc, RpcSubscriptions, SolanaRpcApi, SolanaRpcSubscriptionsApi } from "@solana/kit";
2
+ import type { Layer } from "effect";
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";
7
+ export type MockRpcServiceConfig = {
8
+ getRpc?: () => Effect.Effect<Rpc<SolanaRpcApi>>;
9
+ getRpcSubscriptions?: () => Effect.Effect<RpcSubscriptions<SolanaRpcSubscriptionsApi>, ConnectionNotFoundError>;
10
+ getCluster?: () => Effect.Effect<Cluster>;
11
+ getRpcUrl?: () => Effect.Effect<string>;
12
+ };
13
+ export declare const makeMockRpc: (overrides?: Partial<Rpc<SolanaRpcApi>>) => Rpc<SolanaRpcApi>;
14
+ export declare const makeMockRpcServiceLayer: (config?: MockRpcServiceConfig) => Layer.Layer<RpcService>;
15
+ //# sourceMappingURL=mock-rpc-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,63 @@
1
+ import { createSolanaRpc } from "@solana/kit";
2
+ import { Effect } from "effect";
3
+ import { ConnectionNotFoundError } from "../core/errors/index.js";
4
+ import { RpcService } from "../rpc/index.js";
5
+ import { TEST_CLUSTER } from "./_fixtures/addresses.js";
6
+ import { makeMockServiceLayer } from "./helpers.js";
7
+ const wrapResponse = (value) => ({ context: { slot: 0n }, value });
8
+ export const makeMockRpc = (overrides = {}) => ({
9
+ ...createSolanaRpc("http://localhost"),
10
+ getAccountInfo: () => ({
11
+ send: () => Promise.resolve(wrapResponse(null)),
12
+ }),
13
+ getBalance: () => ({
14
+ send: () => Promise.resolve(wrapResponse(1000000000n)),
15
+ }),
16
+ getLatestBlockhash: () => ({
17
+ send: () => Promise.resolve(wrapResponse({
18
+ blockhash: "GH7ome3EiwEr7tu9JuTh2dpYWBJK3z69Xm1ZE3MEE6JC",
19
+ lastValidBlockHeight: 1000n,
20
+ })),
21
+ }),
22
+ getSignatureStatuses: () => ({
23
+ send: () => Promise.resolve(wrapResponse([
24
+ {
25
+ confirmationStatus: "confirmed",
26
+ confirmations: 10n,
27
+ err: null,
28
+ slot: 1000n,
29
+ status: { Ok: null },
30
+ },
31
+ ])),
32
+ }),
33
+ getTokenAccountBalance: () => ({
34
+ send: () => Promise.resolve(wrapResponse({
35
+ amount: "1000000000",
36
+ decimals: 9,
37
+ uiAmount: 1.0,
38
+ uiAmountString: "1.0",
39
+ })),
40
+ }),
41
+ sendTransaction: () => ({
42
+ send: () => Promise.resolve("mock-signature"),
43
+ }),
44
+ simulateTransaction: () => ({
45
+ send: () => Promise.resolve(wrapResponse({
46
+ err: null,
47
+ logs: [],
48
+ returnData: null,
49
+ })),
50
+ }),
51
+ ...overrides,
52
+ });
53
+ const defaultConfig = {
54
+ getCluster: () => Effect.succeed(TEST_CLUSTER),
55
+ getRpc: () => Effect.succeed(makeMockRpc()),
56
+ getRpcSubscriptions: () => Effect.fail(new ConnectionNotFoundError({
57
+ cluster: TEST_CLUSTER,
58
+ message: "WebSocket not configured in mock",
59
+ })),
60
+ getRpcUrl: () => Effect.succeed("https://api.devnet.solana.com"),
61
+ };
62
+ export const makeMockRpcServiceLayer = (config = {}) => makeMockServiceLayer(RpcService, defaultConfig, config, (merged) => merged);
63
+ //# sourceMappingURL=mock-rpc-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-rpc-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-rpc-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Address } from "@solana/addresses";
2
+ import type { Transaction, TransactionWithLifetime } from "@solana/transactions";
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";
7
+ export type MockSignerServiceConfig = {
8
+ address?: Address;
9
+ connected?: boolean;
10
+ getAddress?: () => Effect.Effect<Address, WalletNotConnectedError>;
11
+ signTransaction?: <T extends Transaction & TransactionWithLifetime>(tx: T) => Effect.Effect<T, SignatureError | WalletNotConnectedError>;
12
+ signAllTransactions?: <T extends Transaction & TransactionWithLifetime>(txs: readonly T[]) => Effect.Effect<readonly T[], SignatureError | WalletNotConnectedError>;
13
+ isConnected?: () => Effect.Effect<boolean>;
14
+ };
15
+ export declare const makeMockSignerServiceLayer: (config?: MockSignerServiceConfig) => Layer.Layer<SignerService>;
16
+ //# sourceMappingURL=mock-signer-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,25 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { WalletNotConnectedError } from "../core/errors/index.js";
3
+ import { SignerService } from "../signer/index.js";
4
+ import { TEST_WALLET } from "./_fixtures/addresses.js";
5
+ export const makeMockSignerServiceLayer = (config = {}) => {
6
+ const address = config.address ?? TEST_WALLET;
7
+ const connected = config.connected ?? true;
8
+ const defaultGetAddress = () => connected
9
+ ? Effect.succeed(address)
10
+ : Effect.fail(new WalletNotConnectedError({ message: "Wallet not connected" }));
11
+ const defaultSignTransaction = (tx) => connected
12
+ ? Effect.succeed(tx)
13
+ : Effect.fail(new WalletNotConnectedError({ message: "Wallet not connected" }));
14
+ const defaultSignAllTransactions = (txs) => connected
15
+ ? Effect.succeed(txs)
16
+ : Effect.fail(new WalletNotConnectedError({ message: "Wallet not connected" }));
17
+ const defaultIsConnected = () => Effect.succeed(connected);
18
+ return Layer.succeed(SignerService, SignerService.of({
19
+ getAddress: config.getAddress ?? defaultGetAddress,
20
+ isConnected: config.isConnected ?? defaultIsConnected,
21
+ signAllTransactions: config.signAllTransactions ?? defaultSignAllTransactions,
22
+ signTransaction: config.signTransaction ?? defaultSignTransaction,
23
+ }));
24
+ };
25
+ //# sourceMappingURL=mock-signer-service.js.map
@@ -0,0 +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"}
@@ -0,0 +1,28 @@
1
+ import type { Address, Instruction } from "@solana/kit";
2
+ import type { Layer } from "effect";
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";
7
+ export type MockTokenServiceConfig = {
8
+ getAssociatedTokenAddress?: (params: ATAParams) => Effect.Effect<Address>;
9
+ getOrCreateATA?: (params: ATAParams & {
10
+ payer: Address;
11
+ }) => Effect.Effect<{
12
+ address: Address;
13
+ instruction?: Instruction;
14
+ }, RpcError>;
15
+ getTokenBalance?: (ata: Address) => Effect.Effect<bigint, AccountNotFoundError | RpcError>;
16
+ getMint?: (mint: Address) => Effect.Effect<MintAccount, AccountNotFoundError | RpcError>;
17
+ getTokenAccount?: (account: Address) => Effect.Effect<TokenAccount, AccountNotFoundError | RpcError>;
18
+ getTransferInstruction?: (params: {
19
+ readonly source: Address;
20
+ readonly destination: Address;
21
+ readonly authority: Address;
22
+ readonly amount: bigint;
23
+ readonly tokenProgram?: Address;
24
+ }) => Effect.Effect<Instruction>;
25
+ tokenAccountExists?: (ata: Address) => Effect.Effect<boolean, RpcError>;
26
+ };
27
+ export declare const makeMockTokenServiceLayer: (config?: MockTokenServiceConfig) => Layer.Layer<TokenService>;
28
+ //# sourceMappingURL=mock-token-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,51 @@
1
+ import { Effect } from "effect";
2
+ import { TokenService } from "../token/index.js";
3
+ import { TEST_ADDRESS_2 } from "./_fixtures/addresses.js";
4
+ import { makeMockServiceLayer } from "./helpers.js";
5
+ const defaultConfig = {
6
+ getAssociatedTokenAddress: () => Effect.succeed(TEST_ADDRESS_2),
7
+ getMint: () => Effect.succeed({
8
+ address: TEST_ADDRESS_2,
9
+ data: {
10
+ decimals: 0,
11
+ freezeAuthority: { __option: "None" },
12
+ isInitialized: true,
13
+ mintAuthority: { __option: "None" },
14
+ supply: 0n,
15
+ },
16
+ executable: false,
17
+ lamports: 0n,
18
+ programAddress: TEST_ADDRESS_2,
19
+ space: 0n,
20
+ }),
21
+ getOrCreateATA: () => Effect.succeed({
22
+ address: TEST_ADDRESS_2,
23
+ instruction: undefined,
24
+ }),
25
+ getTokenAccount: () => Effect.succeed({
26
+ address: TEST_ADDRESS_2,
27
+ data: {
28
+ amount: 0n,
29
+ closeAuthority: { __option: "None" },
30
+ delegate: { __option: "None" },
31
+ delegatedAmount: 0n,
32
+ isNative: { __option: "None" },
33
+ mint: TEST_ADDRESS_2,
34
+ owner: TEST_ADDRESS_2,
35
+ state: 1,
36
+ },
37
+ executable: false,
38
+ lamports: 0n,
39
+ programAddress: TEST_ADDRESS_2,
40
+ space: 0n,
41
+ }),
42
+ getTokenBalance: () => Effect.succeed(1000000000n),
43
+ getTransferInstruction: () => Effect.succeed({
44
+ accounts: [],
45
+ data: new Uint8Array(),
46
+ programAddress: TEST_ADDRESS_2,
47
+ }),
48
+ tokenAccountExists: () => Effect.succeed(true),
49
+ };
50
+ export const makeMockTokenServiceLayer = (config = {}) => makeMockServiceLayer(TokenService, defaultConfig, config, (merged) => merged);
51
+ //# sourceMappingURL=mock-token-service.js.map
@@ -0,0 +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"}
@@ -0,0 +1,22 @@
1
+ import type { Instruction } from "@solana/instructions";
2
+ import type { Signature } from "@solana/keys";
3
+ import type { CompilableTransactionMessage } from "@solana/transaction-messages";
4
+ import type { Transaction, TransactionWithLifetime } from "@solana/transactions";
5
+ import type { Layer } from "effect";
6
+ 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";
10
+ 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>;
14
+ sendAll?: (txs: readonly (Transaction & TransactionWithLifetime)[], opts?: TransactionBatchOpts) => Effect.Effect<readonly Signature[], TransactionSendError>;
15
+ send?: (tx: Transaction & TransactionWithLifetime) => Effect.Effect<Signature, TransactionSendError>;
16
+ confirm?: (signature: Signature, opts?: ConfirmOpts) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;
17
+ sendAndConfirm?: (instructions: readonly Instruction[], opts?: ConfirmOpts) => Effect.Effect<TransactionReceipt, TransactionSendError | WalletNotConnectedError | TransactionTimeoutError | TransactionFailedError>;
18
+ 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>;
20
+ };
21
+ export declare const makeMockTransactionServiceLayer: (config?: MockTransactionServiceConfig) => Layer.Layer<TransactionService>;
22
+ //# sourceMappingURL=mock-transaction-service.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,29 @@
1
+ import { Effect } from "effect";
2
+ import { TransactionService } from "../tx/index.js";
3
+ import { TEST_SIGNATURE } from "./_fixtures/addresses.js";
4
+ import { makeMockServiceLayer } from "./helpers.js";
5
+ const defaultConfig = {
6
+ build: () => Effect.succeed({}),
7
+ confirm: (signature) => Effect.succeed({
8
+ confirmations: 10n,
9
+ signature,
10
+ slot: 1000n,
11
+ }),
12
+ send: () => Effect.succeed(TEST_SIGNATURE),
13
+ sendAll: (txs) => Effect.succeed(txs.map(() => TEST_SIGNATURE)),
14
+ sendAndConfirm: () => Effect.succeed({
15
+ confirmations: 10n,
16
+ signature: TEST_SIGNATURE,
17
+ slot: 1000n,
18
+ }),
19
+ sendAndConfirmBatch: (items) => Effect.succeed(items.map(() => ({
20
+ confirmations: 10n,
21
+ signature: TEST_SIGNATURE,
22
+ slot: 1000n,
23
+ }))),
24
+ sign: () => Effect.succeed({}),
25
+ signAll: (txs) => Effect.succeed(txs.map(() => ({}))),
26
+ simulate: () => Effect.void,
27
+ };
28
+ export const makeMockTransactionServiceLayer = (config = {}) => makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);
29
+ //# sourceMappingURL=mock-transaction-service.js.map
@@ -0,0 +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"}
@@ -0,0 +1,23 @@
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";
8
+ import type { MockBalanceServiceConfig } from "./mock-balance-service.js";
9
+ import type { MockPdaServiceConfig } from "./mock-pda-service.js";
10
+ import type { MockRpcServiceConfig } from "./mock-rpc-service.js";
11
+ import type { MockSignerServiceConfig } from "./mock-signer-service.js";
12
+ import type { MockTokenServiceConfig } from "./mock-token-service.js";
13
+ import type { MockTransactionServiceConfig } from "./mock-transaction-service.js";
14
+ export type TestLayerConfig = {
15
+ rpcService?: MockRpcServiceConfig;
16
+ signerService?: MockSignerServiceConfig;
17
+ balanceService?: MockBalanceServiceConfig;
18
+ tokenService?: MockTokenServiceConfig;
19
+ transactionService?: MockTransactionServiceConfig;
20
+ pdaService?: MockPdaServiceConfig;
21
+ };
22
+ export declare function makeEffectSolanaTestLayer(config?: TestLayerConfig): Layer.Layer<RpcService | SignerService | BalanceService | TokenService | TransactionService | PdaService>;
23
+ //# sourceMappingURL=test-layer.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,31 @@
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";
6
+ import { makeMockBalanceServiceLayer } from "./mock-balance-service.js";
7
+ import { makeMockPdaServiceLayer } from "./mock-pda-service.js";
8
+ import { makeMockRpcServiceLayer } from "./mock-rpc-service.js";
9
+ import { makeMockSignerServiceLayer } from "./mock-signer-service.js";
10
+ import { makeMockTokenServiceLayer } from "./mock-token-service.js";
11
+ import { makeMockTransactionServiceLayer } from "./mock-transaction-service.js";
12
+ const applicationServices = Layer.mergeAll(BalanceServiceLive, TokenServiceLive, TransactionServiceLive, PdaServiceLive);
13
+ export function makeEffectSolanaTestLayer(config = {}) {
14
+ const boundaryLayers = Layer.mergeAll(makeMockRpcServiceLayer(config.rpcService ?? {}), makeMockSignerServiceLayer(config.signerService ?? {}));
15
+ let serviceMockLayer = Layer.empty;
16
+ if (config.balanceService) {
17
+ serviceMockLayer = Layer.merge(serviceMockLayer, makeMockBalanceServiceLayer(config.balanceService));
18
+ }
19
+ if (config.tokenService) {
20
+ serviceMockLayer = Layer.merge(serviceMockLayer, makeMockTokenServiceLayer(config.tokenService));
21
+ }
22
+ if (config.transactionService) {
23
+ serviceMockLayer = Layer.merge(serviceMockLayer, makeMockTransactionServiceLayer(config.transactionService));
24
+ }
25
+ if (config.pdaService) {
26
+ serviceMockLayer = Layer.merge(serviceMockLayer, makeMockPdaServiceLayer(config.pdaService));
27
+ }
28
+ const baseLayer = Layer.provideMerge(applicationServices, boundaryLayers);
29
+ return Layer.merge(baseLayer, serviceMockLayer);
30
+ }
31
+ //# sourceMappingURL=test-layer.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ export * from "./service.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./service.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/token/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Account, Address, Instruction } from "@solana/kit";
2
+ import type { Mint, Token as TokenAccountData } from "@solana-program/token";
3
+ import { Context, Effect, Layer } from "effect";
4
+ import { AccountNotFoundError, RpcError } from "../core/errors/index.js";
5
+ import { RpcService } from "../rpc/index.js";
6
+ export type MintAccount = Account<Mint>;
7
+ export type TokenAccount = Account<TokenAccountData>;
8
+ export type ATAParams = {
9
+ readonly owner: Address;
10
+ readonly mint: Address;
11
+ readonly tokenProgram?: Address;
12
+ };
13
+ export type TokenServiceShape = {
14
+ readonly getAssociatedTokenAddress: (params: ATAParams) => Effect.Effect<Address>;
15
+ readonly getOrCreateATA: (params: ATAParams & {
16
+ payer: Address;
17
+ }) => Effect.Effect<{
18
+ address: Address;
19
+ instruction?: Instruction;
20
+ }, RpcError>;
21
+ readonly getTokenBalance: (ata: Address) => Effect.Effect<bigint, AccountNotFoundError | RpcError>;
22
+ readonly getMint: (mint: Address) => Effect.Effect<MintAccount, AccountNotFoundError | RpcError>;
23
+ readonly getTokenAccount: (account: Address) => Effect.Effect<TokenAccount, AccountNotFoundError | RpcError>;
24
+ readonly getTransferInstruction: (params: {
25
+ readonly source: Address;
26
+ readonly destination: Address;
27
+ readonly authority: Address;
28
+ readonly amount: bigint;
29
+ readonly tokenProgram?: Address;
30
+ }) => Effect.Effect<Instruction>;
31
+ readonly tokenAccountExists: (ata: Address) => Effect.Effect<boolean, RpcError>;
32
+ };
33
+ declare const TokenService_base: Context.TagClass<TokenService, "esolana/TokenService", TokenServiceShape>;
34
+ export declare class TokenService extends TokenService_base {
35
+ }
36
+ export declare const TokenServiceLive: Layer.Layer<TokenService, never, RpcService>;
37
+ export {};
38
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +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,CAAC,CAAC;IAMlF,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,QAAQ,CACT,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,8CA0N5B,CAAC"}
@@ -0,0 +1,158 @@
1
+ import { createNoopSigner } from "@solana/signers";
2
+ import { fetchMaybeMint, fetchMaybeToken, findAssociatedTokenPda, getCreateAssociatedTokenIdempotentInstructionAsync, getTransferInstruction, } from "@solana-program/token";
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";
8
+ export class TokenService extends Context.Tag("esolana/TokenService")() {
9
+ }
10
+ export const TokenServiceLive = Layer.effect(TokenService, Effect.gen(function* () {
11
+ const rpcService = yield* RpcService;
12
+ return TokenService.of({
13
+ getAssociatedTokenAddress: (params) => Effect.gen(function* () {
14
+ const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;
15
+ const pda = yield* Effect.promise(() => findAssociatedTokenPda({
16
+ mint: params.mint,
17
+ owner: params.owner,
18
+ tokenProgram,
19
+ }));
20
+ return pda[0];
21
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_GET_ATA, {
22
+ attributes: {
23
+ mint: params.mint,
24
+ owner: params.owner,
25
+ },
26
+ })),
27
+ getMint: (mint) => Effect.gen(function* () {
28
+ const rpc = yield* rpcService.getRpc();
29
+ const rpcUrl = yield* rpcService.getRpcUrl();
30
+ const account = yield* Effect.tryPromise({
31
+ catch: (cause) => new RpcError({
32
+ cause,
33
+ message: `Failed to fetch mint ${mint}`,
34
+ url: rpcUrl,
35
+ }),
36
+ try: () => fetchMaybeMint(rpc, mint),
37
+ });
38
+ if (!account.exists) {
39
+ return yield* Effect.fail(new AccountNotFoundError({
40
+ address: mint,
41
+ message: `Mint not found: ${mint}`,
42
+ }));
43
+ }
44
+ return account;
45
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_GET_MINT, {
46
+ attributes: { mint },
47
+ })),
48
+ getOrCreateATA: (params) => Effect.gen(function* () {
49
+ const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;
50
+ const pda = yield* Effect.promise(() => findAssociatedTokenPda({
51
+ mint: params.mint,
52
+ owner: params.owner,
53
+ tokenProgram,
54
+ }));
55
+ const ata = pda[0];
56
+ const rpc = yield* rpcService.getRpc();
57
+ const rpcUrl = yield* rpcService.getRpcUrl();
58
+ const accountInfo = yield* Effect.tryPromise({
59
+ catch: (cause) => new RpcError({
60
+ cause,
61
+ message: `Failed to get account info for ${ata}`,
62
+ url: rpcUrl,
63
+ }),
64
+ try: () => rpc.getAccountInfo(ata, { encoding: "base64" }).send(),
65
+ });
66
+ if (accountInfo.value) {
67
+ return { address: ata };
68
+ }
69
+ const payerSigner = createNoopSigner(params.payer);
70
+ const instruction = yield* Effect.promise(() => getCreateAssociatedTokenIdempotentInstructionAsync({
71
+ ata,
72
+ mint: params.mint,
73
+ owner: params.owner,
74
+ payer: payerSigner,
75
+ tokenProgram,
76
+ }));
77
+ return { address: ata, instruction };
78
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_CREATE_ATA, {
79
+ attributes: {
80
+ mint: params.mint,
81
+ owner: params.owner,
82
+ },
83
+ })),
84
+ getTokenAccount: (accountAddress) => Effect.gen(function* () {
85
+ const rpc = yield* rpcService.getRpc();
86
+ const rpcUrl = yield* rpcService.getRpcUrl();
87
+ const account = yield* Effect.tryPromise({
88
+ catch: (cause) => new RpcError({
89
+ cause,
90
+ message: `Failed to fetch token account ${accountAddress}`,
91
+ url: rpcUrl,
92
+ }),
93
+ try: () => fetchMaybeToken(rpc, accountAddress),
94
+ });
95
+ if (!account.exists) {
96
+ return yield* Effect.fail(new AccountNotFoundError({
97
+ address: accountAddress,
98
+ message: `Token account not found: ${accountAddress}`,
99
+ }));
100
+ }
101
+ return account;
102
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_GET_ACCOUNT, {
103
+ attributes: { account: accountAddress },
104
+ })),
105
+ getTokenBalance: (ata) => Effect.gen(function* () {
106
+ const rpc = yield* rpcService.getRpc();
107
+ const rpcUrl = yield* rpcService.getRpcUrl();
108
+ const response = yield* Effect.tryPromise({
109
+ catch: (cause) => new RpcError({
110
+ cause,
111
+ message: `Failed to get token balance for ${ata}`,
112
+ url: rpcUrl,
113
+ }),
114
+ try: () => rpc.getTokenAccountBalance(ata).send(),
115
+ });
116
+ if (!response.value) {
117
+ return yield* Effect.fail(new AccountNotFoundError({
118
+ address: ata,
119
+ message: `Token account not found: ${ata}`,
120
+ }));
121
+ }
122
+ return BigInt(response.value.amount);
123
+ }).pipe(Effect.withSpan(SpanNames.BALANCE_GET_TOKEN, {
124
+ attributes: { ata },
125
+ })),
126
+ getTransferInstruction: (params) => Effect.sync(() => {
127
+ const tokenProgram = params.tokenProgram ?? TOKEN_PROGRAM_ADDRESS;
128
+ return getTransferInstruction({
129
+ amount: params.amount,
130
+ authority: params.authority,
131
+ destination: params.destination,
132
+ source: params.source,
133
+ }, { programAddress: tokenProgram });
134
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_TRANSFER, {
135
+ attributes: {
136
+ amount: params.amount.toString(),
137
+ destination: params.destination,
138
+ source: params.source,
139
+ },
140
+ })),
141
+ tokenAccountExists: (ata) => Effect.gen(function* () {
142
+ const rpc = yield* rpcService.getRpc();
143
+ const rpcUrl = yield* rpcService.getRpcUrl();
144
+ const response = yield* Effect.tryPromise({
145
+ catch: (cause) => new RpcError({
146
+ cause,
147
+ message: `Failed to check token account ${ata}`,
148
+ url: rpcUrl,
149
+ }),
150
+ try: () => rpc.getAccountInfo(ata, { encoding: "base64" }).send(),
151
+ });
152
+ return response.value !== null;
153
+ }).pipe(Effect.withSpan(SpanNames.TOKEN_ACCOUNT_EXISTS, {
154
+ attributes: { ata },
155
+ })),
156
+ });
157
+ }));
158
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/token/service.ts"],"names":[],"mappings":"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"}