@prb/effect-solana 1.0.0-beta.4 → 1.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -3
- package/dist/balance/service.d.ts +2 -2
- package/dist/balance/service.d.ts.map +1 -1
- package/dist/balance/service.js +3 -3
- package/dist/balance/service.js.map +1 -1
- package/dist/core/errors/index.d.ts +1 -1
- package/dist/core/errors/index.d.ts.map +1 -1
- package/dist/core/errors/index.js +1 -1
- package/dist/core/errors/index.js.map +1 -1
- package/dist/core/errors/{transaction.d.ts → tx.d.ts} +1 -1
- package/dist/core/errors/tx.d.ts.map +1 -0
- package/dist/core/errors/{transaction.js → tx.js} +1 -1
- package/dist/core/errors/tx.js.map +1 -0
- package/dist/internal/kit-effect.d.ts +2 -2
- package/dist/internal/kit-effect.d.ts.map +1 -1
- package/dist/internal/kit-effect.js +1 -1
- package/dist/internal/kit-effect.js.map +1 -1
- package/dist/pda/service.js +1 -1
- package/dist/pda/service.js.map +1 -1
- package/dist/presets/layers.d.ts +10 -10
- package/dist/presets/layers.d.ts.map +1 -1
- package/dist/presets/layers.js +8 -8
- package/dist/presets/layers.js.map +1 -1
- package/dist/program/index.d.ts +1 -0
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +1 -0
- package/dist/program/index.js.map +1 -1
- package/dist/program/internal/anchor-helpers.d.ts +20 -0
- package/dist/program/internal/anchor-helpers.d.ts.map +1 -0
- package/dist/program/internal/anchor-helpers.js +64 -0
- package/dist/program/internal/anchor-helpers.js.map +1 -0
- package/dist/program/reader.d.ts +19 -0
- package/dist/program/reader.d.ts.map +1 -0
- package/dist/program/reader.js +288 -0
- package/dist/program/reader.js.map +1 -0
- package/dist/program/service.d.ts +1 -1
- package/dist/program/service.d.ts.map +1 -1
- package/dist/program/service.js +18 -37
- package/dist/program/service.js.map +1 -1
- package/dist/program/types.d.ts +48 -13
- package/dist/program/types.d.ts.map +1 -1
- package/dist/program/types.js +27 -28
- package/dist/program/types.js.map +1 -1
- package/dist/rpc/service.d.ts +2 -2
- package/dist/rpc/service.d.ts.map +1 -1
- package/dist/rpc/service.js +1 -1
- package/dist/rpc/service.js.map +1 -1
- package/dist/signer/service.d.ts +1 -1
- package/dist/signer/service.d.ts.map +1 -1
- package/dist/signer/service.js +2 -2
- package/dist/signer/service.js.map +1 -1
- package/dist/telemetry/tracer.d.ts +3 -0
- package/dist/telemetry/tracer.d.ts.map +1 -1
- package/dist/telemetry/tracer.js +3 -0
- package/dist/telemetry/tracer.js.map +1 -1
- package/dist/testing-kit/index.d.ts +2 -2
- package/dist/testing-kit/index.d.ts.map +1 -1
- package/dist/testing-kit/index.js +1 -1
- package/dist/testing-kit/index.js.map +1 -1
- package/dist/testing-kit/mock-balance-service.d.ts +2 -2
- package/dist/testing-kit/mock-balance-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-balance-service.js +1 -1
- package/dist/testing-kit/mock-balance-service.js.map +1 -1
- package/dist/testing-kit/mock-pda-service.d.ts +2 -2
- package/dist/testing-kit/mock-pda-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-pda-service.js +1 -1
- package/dist/testing-kit/mock-pda-service.js.map +1 -1
- package/dist/testing-kit/mock-rpc-service.d.ts +3 -3
- package/dist/testing-kit/mock-rpc-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-rpc-service.js +2 -2
- package/dist/testing-kit/mock-rpc-service.js.map +1 -1
- package/dist/testing-kit/mock-signer-service.d.ts +3 -3
- package/dist/testing-kit/mock-signer-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-signer-service.js +2 -2
- package/dist/testing-kit/mock-signer-service.js.map +1 -1
- package/dist/testing-kit/mock-token-service.d.ts +3 -3
- package/dist/testing-kit/mock-token-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-token-service.js +1 -1
- package/dist/testing-kit/mock-token-service.js.map +1 -1
- package/dist/testing-kit/{mock-transaction-service.d.ts → mock-tx-service.d.ts} +8 -9
- package/dist/testing-kit/mock-tx-service.d.ts.map +1 -0
- package/dist/testing-kit/{mock-transaction-service.js → mock-tx-service.js} +2 -2
- package/dist/testing-kit/mock-tx-service.js.map +1 -0
- package/dist/testing-kit/test-layer.d.ts +12 -8
- package/dist/testing-kit/test-layer.d.ts.map +1 -1
- package/dist/testing-kit/test-layer.js +13 -6
- package/dist/testing-kit/test-layer.js.map +1 -1
- package/dist/token/service.d.ts +2 -2
- package/dist/token/service.d.ts.map +1 -1
- package/dist/token/service.js +4 -4
- package/dist/token/service.js.map +1 -1
- package/dist/tx/service.d.ts +9 -10
- package/dist/tx/service.d.ts.map +1 -1
- package/dist/tx/service.js +4 -4
- package/dist/tx/service.js.map +1 -1
- package/dist/tx/types.d.ts +2 -0
- package/dist/tx/types.d.ts.map +1 -1
- package/dist/tx/types.js.map +1 -1
- package/dist/web3.js/index.d.ts +1 -1
- package/dist/web3.js/index.d.ts.map +1 -1
- package/dist/web3.js/index.js +1 -1
- package/dist/web3.js/index.js.map +1 -1
- package/dist/web3.js/layers.d.ts +9 -9
- package/dist/web3.js/layers.d.ts.map +1 -1
- package/dist/web3.js/layers.js +1 -1
- package/dist/web3.js/layers.js.map +1 -1
- package/dist/web3.js/legacy-signer.d.ts +1 -1
- package/dist/web3.js/legacy-signer.d.ts.map +1 -1
- package/dist/web3.js/legacy-signer.js +4 -4
- package/dist/web3.js/legacy-signer.js.map +1 -1
- package/dist/web3.js/{transaction-bridge.d.ts → tx-bridge.d.ts} +1 -1
- package/dist/web3.js/tx-bridge.d.ts.map +1 -0
- package/dist/web3.js/{transaction-bridge.js → tx-bridge.js} +1 -1
- package/dist/web3.js/tx-bridge.js.map +1 -0
- package/package.json +19 -14
- package/dist/core/errors/transaction.d.ts.map +0 -1
- package/dist/core/errors/transaction.js.map +0 -1
- package/dist/testing-kit/mock-transaction-service.d.ts.map +0 -1
- package/dist/testing-kit/mock-transaction-service.js.map +0 -1
- package/dist/web3.js/transaction-bridge.d.ts.map +0 -1
- package/dist/web3.js/transaction-bridge.js.map +0 -1
|
@@ -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,
|
|
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 "
|
|
8
|
-
import type { ConfirmOpts, TransactionBatchItem, TransactionBatchOpts, TransactionReceipt } from "
|
|
9
|
-
import { TransactionService } from "
|
|
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<
|
|
12
|
-
signAll?: (txs: readonly
|
|
13
|
-
sign?: <T extends
|
|
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
|
|
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
|
-
//# sourceMappingURL=mock-
|
|
21
|
+
//# sourceMappingURL=mock-tx-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-tx-service.d.ts","sourceRoot":"","sources":["../../src/testing-kit/mock-tx-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUtD,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,CACN,YAAY,EAAE,SAAS,WAAW,EAAE,KACjC,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAC/F,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,0BAA0B,EAAE,KACvC,MAAM,CAAC,MAAM,CAChB,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EAClD,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC1C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAChB,WAAW,GAAG,uBAAuB,EACrC,oBAAoB,GAAG,uBAAuB,CAC/C,CAAC;IACF,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,uBAAuB,CAAC,EAAE,EACvD,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CACL,EAAE,EAAE,WAAW,GAAG,uBAAuB,KACtC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CACR,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,GAAG,sBAAsB,CAAC,CAAC;IACzF,cAAc,CAAC,EAAE,CACf,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,IAAI,CAAC,EAAE,WAAW,KACf,MAAM,CAAC,MAAM,CAChB,kBAAkB,EAChB,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,mBAAmB,CAAC,EAAE,CACpB,KAAK,EAAE,SAAS,oBAAoB,EAAE,EACtC,IAAI,CAAC,EAAE,oBAAoB,KACxB,MAAM,CAAC,MAAM,CAChB,SAAS,kBAAkB,EAAE,EAC3B,oBAAoB,GACpB,uBAAuB,GACvB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,0BAA0B,EAC9C,EAAE,EAAE,CAAC,KACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;CAClG,CAAC;AA6DF,eAAO,MAAM,+BAA+B,GAC1C,SAAQ,4BAAiC,KACxC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CACoD,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { TransactionService } from "
|
|
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 = {
|
|
@@ -26,4 +26,4 @@ const defaultConfig = {
|
|
|
26
26
|
simulate: () => Effect.void,
|
|
27
27
|
};
|
|
28
28
|
export const makeMockTransactionServiceLayer = (config = {}) => makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);
|
|
29
|
-
//# sourceMappingURL=mock-
|
|
29
|
+
//# sourceMappingURL=mock-tx-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-tx-service.js","sourceRoot":"","sources":["../../src/testing-kit/mock-tx-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAehC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA4DpD,MAAM,aAAa,GAA2C;IAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAgC,CAAC;IAC7D,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CACrB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS;QACT,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,cAA2B,CAAC;IACvD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,cAA2B,CAAC,CAAC;IAC5E,cAAc,EAAE,GAAG,EAAE,CACnB,MAAM,CAAC,OAAO,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC;IACJ,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACf,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,cAA2B;QACtC,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC,CACJ;IACH,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAA2C,CAAC;IACvE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAA0C,CAAC,CAAC;IAC9F,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;CAC5B,CAAC;AAgCF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,SAAuC,EAAE,EACR,EAAE,CACnC,oBAAoB,CAAC,kBAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import type { Instruction } from \"@solana/instructions\";\nimport type { Signature } from \"@solana/keys\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport type { Layer } from \"effect\";\nimport { Effect } from \"effect\";\nimport type {\n SimulationFailedError,\n TransactionFailedError,\n TransactionSendError,\n TransactionTimeoutError,\n WalletNotConnectedError,\n} from \"#src/core/errors/index.js\";\nimport type {\n ConfirmOpts,\n SignableTransactionMessage,\n TransactionBatchItem,\n TransactionBatchOpts,\n TransactionReceipt,\n} from \"#src/tx/index.js\";\nimport { TransactionService } from \"#src/tx/index.js\";\nimport { TEST_SIGNATURE } from \"./_fixtures/addresses.js\";\nimport { makeMockServiceLayer } from \"./helpers.js\";\n\n/**\n * Configuration for the mock TransactionService\n *\n * All methods are optional - sensible defaults are provided.\n * Override specific methods to customize mock behavior for your tests.\n */\nexport type MockTransactionServiceConfig = {\n build?: (\n instructions: readonly Instruction[]\n ) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;\n signAll?: (\n txs: readonly SignableTransactionMessage[]\n ) => Effect.Effect<\n readonly (Transaction & TransactionWithLifetime)[],\n TransactionSendError | WalletNotConnectedError\n >;\n sign?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<\n Transaction & TransactionWithLifetime,\n TransactionSendError | WalletNotConnectedError\n >;\n sendAll?: (\n txs: readonly (Transaction & TransactionWithLifetime)[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<readonly Signature[], TransactionSendError>;\n send?: (\n tx: Transaction & TransactionWithLifetime\n ) => Effect.Effect<Signature, TransactionSendError>;\n confirm?: (\n signature: Signature,\n opts?: ConfirmOpts\n ) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;\n sendAndConfirm?: (\n instructions: readonly Instruction[],\n opts?: ConfirmOpts\n ) => Effect.Effect<\n TransactionReceipt,\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n sendAndConfirmBatch?: (\n items: readonly TransactionBatchItem[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<\n readonly TransactionReceipt[],\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n simulate?: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;\n};\n\nconst defaultConfig: Required<MockTransactionServiceConfig> = {\n build: () => Effect.succeed({} as SignableTransactionMessage),\n confirm: (signature) =>\n Effect.succeed({\n confirmations: 10n,\n signature,\n slot: 1000n,\n }),\n send: () => Effect.succeed(TEST_SIGNATURE as Signature),\n sendAll: (txs) => Effect.succeed(txs.map(() => TEST_SIGNATURE as Signature)),\n sendAndConfirm: () =>\n Effect.succeed({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }),\n sendAndConfirmBatch: (items) =>\n Effect.succeed(\n items.map(() => ({\n confirmations: 10n,\n signature: TEST_SIGNATURE as Signature,\n slot: 1000n,\n }))\n ),\n sign: () => Effect.succeed({} as Transaction & TransactionWithLifetime),\n signAll: (txs) => Effect.succeed(txs.map(() => ({}) as Transaction & TransactionWithLifetime)),\n simulate: () => Effect.void,\n};\n\n/**\n * Creates a mock TransactionService layer for testing\n *\n * @param config - Optional configuration to override default mock behaviors\n *\n * @example\n * ```typescript\n * // Basic usage with defaults\n * const layer = makeMockTransactionServiceLayer();\n *\n * // Override specific methods\n * const layer = makeMockTransactionServiceLayer({\n * sendAndConfirm: () => Effect.fail(\n * new TransactionFailedError({\n * signature: TEST_SIGNATURE,\n * message: \"Transaction failed\",\n * logs: [],\n * })\n * ),\n * });\n *\n * // Use in tests\n * Effect.gen(function* () {\n * const txService = yield* TransactionService;\n * const receipt = yield* txService.sendAndConfirm(instructions);\n * }).pipe(\n * Effect.provide(layer)\n * );\n * ```\n */\nexport const makeMockTransactionServiceLayer = (\n config: MockTransactionServiceConfig = {}\n): Layer.Layer<TransactionService> =>\n makeMockServiceLayer(TransactionService, defaultConfig, config, (merged) => merged);\n"]}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { Layer } from "effect";
|
|
2
|
-
import type { BalanceService } from "
|
|
3
|
-
import type { PdaService } from "
|
|
4
|
-
import type {
|
|
5
|
-
import
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
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";
|
|
11
13
|
import type { MockSignerServiceConfig } from "./mock-signer-service.js";
|
|
12
14
|
import type { MockTokenServiceConfig } from "./mock-token-service.js";
|
|
13
|
-
import type { MockTransactionServiceConfig } from "./mock-
|
|
15
|
+
import type { MockTransactionServiceConfig } from "./mock-tx-service.js";
|
|
14
16
|
export type TestLayerConfig = {
|
|
15
17
|
rpcService?: MockRpcServiceConfig;
|
|
16
18
|
signerService?: MockSignerServiceConfig;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"test-layer.d.ts","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EACL,aAAa,EAEb,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAqBzE,MAAM,MAAM,eAAe,GAAG;IAI5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,aAAa,CAAC,EAAE,uBAAuB,CAAC;IAKxC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAK1C,YAAY,CAAC,EAAE,sBAAsB,CAAC;IAKtC,kBAAkB,CAAC,EAAE,4BAA4B,CAAC;IAKlD,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAKlC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;IAK1C,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;CAC3C,CAAC;AAwDF,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,eAAoB,GAC3B,KAAK,CAAC,KAAK,CACV,UAAU,GACV,aAAa,GACb,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,aAAa,GACb,aAAa,CAChB,CAyDA"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { Layer } from "effect";
|
|
2
|
-
import { BalanceServiceLive } from "
|
|
3
|
-
import { PdaServiceLive } from "
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
-
import { makeMockTransactionServiceLayer } from "./mock-
|
|
12
|
-
const applicationServices = Layer.mergeAll(BalanceServiceLive, TokenServiceLive, TransactionServiceLive, PdaServiceLive);
|
|
12
|
+
import { makeMockTransactionServiceLayer } from "./mock-tx-service.js";
|
|
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,
|
|
1
|
+
{"version":3,"file":"test-layer.js","sourceRoot":"","sources":["../../src/testing-kit/test-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAsEvE,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;AAuCF,MAAM,UAAU,yBAAyB,CACvC,SAA0B,EAAE;IAY5B,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CACnC,uBAAuB,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAChD,0BAA0B,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CACvD,CAAC;IAGF,IAAI,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;IAEnC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,2BAA2B,CAAC,MAAM,CAAC,cAAc,CAAC,CACnD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,yBAAyB,CAAC,MAAM,CAAC,YAAY,CAAC,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC9B,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,+BAA+B,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAC3D,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAC5B,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC;IAGD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAE1E,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAS7C,CAAC;AACJ,CAAC","sourcesContent":["import { Layer } from \"effect\";\nimport type { BalanceService } from \"#src/balance/index.js\";\nimport { BalanceServiceLive } from \"#src/balance/index.js\";\nimport type { PdaService } from \"#src/pda/index.js\";\nimport { PdaServiceLive } from \"#src/pda/index.js\";\nimport type { ProgramReaderShape, ProgramWriterShape } from \"#src/program/index.js\";\nimport {\n ProgramReader,\n ProgramReaderLive,\n ProgramWriter,\n ProgramWriterLive,\n} from \"#src/program/index.js\";\nimport type { RpcService } from \"#src/rpc/index.js\";\nimport type { SignerService } from \"#src/signer/index.js\";\nimport type { TokenService } from \"#src/token/index.js\";\nimport { TokenServiceLive } from \"#src/token/index.js\";\nimport type { TransactionService } from \"#src/tx/index.js\";\nimport { TransactionServiceLive } from \"#src/tx/index.js\";\nimport type { MockBalanceServiceConfig } from \"./mock-balance-service.js\";\nimport { makeMockBalanceServiceLayer } from \"./mock-balance-service.js\";\nimport type { MockPdaServiceConfig } from \"./mock-pda-service.js\";\nimport { makeMockPdaServiceLayer } from \"./mock-pda-service.js\";\nimport type { MockRpcServiceConfig } from \"./mock-rpc-service.js\";\nimport { makeMockRpcServiceLayer } from \"./mock-rpc-service.js\";\nimport type { MockSignerServiceConfig } from \"./mock-signer-service.js\";\nimport { makeMockSignerServiceLayer } from \"./mock-signer-service.js\";\nimport type { MockTokenServiceConfig } from \"./mock-token-service.js\";\nimport { makeMockTokenServiceLayer } from \"./mock-token-service.js\";\nimport type { MockTransactionServiceConfig } from \"./mock-tx-service.js\";\nimport { makeMockTransactionServiceLayer } from \"./mock-tx-service.js\";\n\n/**\n * Configuration for the test layer composer\n *\n * @example\n * ```typescript\n * const layer = makeEffectSolanaTestLayer({\n * rpcService: {\n * getRpc: () => Effect.succeed(myMockRpc),\n * },\n * signerService: {\n * address: \"DYw8jCTfwHNRJhhmFcbXvVDTqWMEVFBX6ZKUmG5CNSKK\" as Address,\n * },\n * balanceService: {\n * getSolBalance: () => Effect.succeed(5000000000n as Lamports),\n * },\n * });\n * ```\n */\nexport type TestLayerConfig = {\n /**\n * Configuration overrides for the mock RpcService\n */\n rpcService?: MockRpcServiceConfig;\n\n /**\n * Configuration overrides for the mock SignerService\n */\n signerService?: MockSignerServiceConfig;\n\n /**\n * Configuration overrides for the mock BalanceService\n */\n balanceService?: MockBalanceServiceConfig;\n\n /**\n * Configuration overrides for the mock TokenService\n */\n tokenService?: MockTokenServiceConfig;\n\n /**\n * Configuration overrides for the mock TransactionService\n */\n transactionService?: MockTransactionServiceConfig;\n\n /**\n * Configuration overrides for the mock PdaService\n */\n pdaService?: MockPdaServiceConfig;\n\n /**\n * Configuration overrides for ProgramReader.\n */\n programReaderService?: ProgramReaderShape;\n\n /**\n * Configuration overrides for ProgramWriter.\n */\n programWriterService?: ProgramWriterShape;\n};\n\n/**\n * Internal layer combining all application services\n * Requires RpcService and SignerService to be provided\n *\n * Layer composition order matters:\n * 1. Base services (directly client-bound, no service deps)\n * 2. Dependent services (require base services)\n */\nconst applicationServices = Layer.mergeAll(\n BalanceServiceLive,\n TokenServiceLive,\n TransactionServiceLive,\n PdaServiceLive,\n ProgramReaderLive,\n ProgramWriterLive\n);\n\n/**\n * Creates a complete effect-solana test layer with mocked boundaries\n *\n * This layer provides all effect-solana services with mocked RpcService\n * and SignerService boundaries. The mock boundaries use sensible defaults\n * that can be overridden via configuration.\n *\n * Use this for integration-style tests where you want real service implementations\n * with controlled network boundaries.\n *\n * @param config - Optional configuration to customize mock behaviors\n * @returns A Layer providing all effect-solana services\n *\n * @example\n * ```typescript\n * import { describe, expect, it } from \"@effect/vitest\";\n * import { Effect, Layer } from \"effect\";\n * import { BalanceService } from \"@prb/effect-solana\";\n * import { makeEffectSolanaTestLayer } from \"@prb/effect-solana/testing-kit\";\n *\n * describe(\"MyFeature\", () => {\n * const testLayer = makeEffectSolanaTestLayer({\n * balanceService: {\n * getSolBalance: () => Effect.succeed(1000000000n as Lamports),\n * },\n * });\n *\n * it.effect(\"reads balance\", () =>\n * Effect.gen(function* () {\n * const balanceService = yield* BalanceService;\n * const balance = yield* balanceService.getSolBalance(address);\n * expect(balance).toBe(1000000000n);\n * }).pipe(Effect.provide(testLayer))\n * );\n * });\n * ```\n */\nexport function makeEffectSolanaTestLayer(\n config: TestLayerConfig = {}\n): Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n> {\n // Create boundary mocks - use real services if no config provided\n const boundaryLayers = Layer.mergeAll(\n makeMockRpcServiceLayer(config.rpcService ?? {}),\n makeMockSignerServiceLayer(config.signerService ?? {})\n );\n\n // Create service mocks if config is provided, otherwise use real implementations from applicationServices\n let serviceMockLayer = Layer.empty;\n\n if (config.balanceService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockBalanceServiceLayer(config.balanceService)\n );\n }\n if (config.tokenService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTokenServiceLayer(config.tokenService)\n );\n }\n if (config.transactionService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n makeMockTransactionServiceLayer(config.transactionService)\n );\n }\n if (config.pdaService) {\n serviceMockLayer = Layer.merge(serviceMockLayer, makeMockPdaServiceLayer(config.pdaService));\n }\n if (config.programReaderService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramReader, ProgramReader.of(config.programReaderService))\n );\n }\n if (config.programWriterService) {\n serviceMockLayer = Layer.merge(\n serviceMockLayer,\n Layer.succeed(ProgramWriter, ProgramWriter.of(config.programWriterService))\n );\n }\n\n // Provide boundary mocks and service mocks to application services\n const baseLayer = Layer.provideMerge(applicationServices, boundaryLayers);\n\n return Layer.merge(baseLayer, serviceMockLayer) as Layer.Layer<\n | RpcService\n | SignerService\n | BalanceService\n | TokenService\n | TransactionService\n | PdaService\n | ProgramReader\n | ProgramWriter\n >;\n}\n"]}
|
package/dist/token/service.d.ts
CHANGED
|
@@ -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 "
|
|
5
|
-
import { RpcService } from "
|
|
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,
|
|
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"}
|
package/dist/token/service.js
CHANGED
|
@@ -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 "
|
|
5
|
-
import { AccountNotFoundError, RpcError } from "
|
|
6
|
-
import { RpcService } from "
|
|
7
|
-
import { SpanNames } from "
|
|
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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","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
|
+
{"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"]}
|
package/dist/tx/service.d.ts
CHANGED
|
@@ -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 "
|
|
7
|
-
import { SimulationFailedError, TransactionFailedError, TransactionSendError, TransactionTimeoutError } from "
|
|
8
|
-
import { RpcService } from "
|
|
9
|
-
import { SignerService } from "
|
|
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<
|
|
13
|
-
readonly signAll: (txs: readonly
|
|
14
|
-
readonly sign: <T extends
|
|
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
|
|
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 {
|
package/dist/tx/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"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"}
|
package/dist/tx/service.js
CHANGED
|
@@ -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 "
|
|
7
|
-
import { RpcService } from "
|
|
8
|
-
import { SignerService } from "
|
|
9
|
-
import { SpanNames } from "
|
|
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) => {
|
package/dist/tx/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { pipe } from \"@solana/functional\";\nimport type { Instruction } from \"@solana/instructions\";\nimport type { Signature } from \"@solana/keys\";\nimport type { CompilableTransactionMessage } from \"@solana/transaction-messages\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n} from \"@solana/transaction-messages\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport {\n compileTransaction,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n} from \"@solana/transactions\";\nimport {\n getSetComputeUnitLimitInstruction,\n getSetComputeUnitPriceInstruction,\n} from \"@solana-program/compute-budget\";\nimport { Context, Duration, Effect, Layer, Schedule } from \"effect\";\nimport type { WalletNotConnectedError } from \"@/src/core/errors/index.js\";\nimport {\n SignatureError,\n SimulationFailedError,\n TransactionFailedError,\n TransactionSendError,\n TransactionTimeoutError,\n} from \"@/src/core/errors/index.js\";\nimport type { RpcServiceShape } from \"@/src/rpc/index.js\";\nimport { RpcService } from \"@/src/rpc/index.js\";\nimport { SignerService } from \"@/src/signer/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type {\n ComputeBudgetConfig,\n ConfirmOpts,\n TransactionBatchItem,\n TransactionBatchOpts,\n TransactionBuildOpts,\n TransactionReceipt,\n} from \"./types.js\";\n\n/**\n * Shape of the TransactionService for type inference.\n *\n * @category Services\n */\nexport type TransactionServiceShape = {\n /**\n * Build a transaction from instructions.\n */\n readonly build: (\n instructions: readonly Instruction[],\n opts?: TransactionBuildOpts\n ) => Effect.Effect<CompilableTransactionMessage, TransactionSendError | WalletNotConnectedError>;\n\n /**\n * Sign multiple transactions in a batch.\n */\n readonly signAll: (\n txs: readonly CompilableTransactionMessage[]\n ) => Effect.Effect<\n readonly (Transaction & TransactionWithLifetime)[],\n TransactionSendError | WalletNotConnectedError\n >;\n\n /**\n * Sign a transaction.\n */\n readonly sign: <T extends CompilableTransactionMessage>(\n tx: T\n ) => Effect.Effect<\n Transaction & TransactionWithLifetime,\n TransactionSendError | WalletNotConnectedError\n >;\n\n /**\n * Send multiple signed transactions.\n */\n readonly sendAll: (\n txs: readonly (Transaction & TransactionWithLifetime)[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<readonly Signature[], TransactionSendError>;\n\n /**\n * Send a signed transaction.\n */\n readonly send: (\n tx: Transaction & TransactionWithLifetime\n ) => Effect.Effect<Signature, TransactionSendError>;\n\n /**\n * Confirm a transaction by signature.\n */\n readonly confirm: (\n signature: Signature,\n opts?: ConfirmOpts\n ) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;\n\n /**\n * Build, sign, send, and confirm a transaction.\n */\n readonly sendAndConfirm: (\n instructions: readonly Instruction[],\n opts?: ConfirmOpts & { computeBudget?: ComputeBudgetConfig }\n ) => Effect.Effect<\n TransactionReceipt,\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n\n /**\n * Build, sign, send, and confirm a batch of transactions.\n */\n readonly sendAndConfirmBatch: (\n items: readonly TransactionBatchItem[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<\n readonly TransactionReceipt[],\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n\n /**\n * Simulate a transaction.\n */\n readonly simulate: <T extends CompilableTransactionMessage>(\n tx: T\n ) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;\n};\n\n/**\n * Service tag for transaction operations.\n *\n * @category Services\n */\nexport class TransactionService extends Context.Tag(\"esolana/TransactionService\")<\n TransactionService,\n TransactionServiceShape\n>() {}\n\n/**\n * Check if a transaction has reached the desired confirmation level.\n */\nconst hasReachedConfirmation = (\n status: {\n confirmationStatus?: \"processed\" | \"confirmed\" | \"finalized\" | null;\n },\n commitment: \"processed\" | \"confirmed\" | \"finalized\"\n): boolean => {\n if (commitment === \"processed\") {\n return true;\n }\n if (commitment === \"confirmed\") {\n return status.confirmationStatus === \"confirmed\" || status.confirmationStatus === \"finalized\";\n }\n return status.confirmationStatus === \"finalized\";\n};\n\n/**\n * Check signature status and return receipt if confirmed.\n */\nconst checkSignatureStatus = (\n rpc: Effect.Effect.Success<ReturnType<RpcServiceShape[\"getRpc\"]>>,\n signature: Signature,\n commitment: \"processed\" | \"confirmed\" | \"finalized\"\n): Effect.Effect<TransactionReceipt | null, TransactionFailedError> =>\n Effect.gen(function* () {\n const response = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionFailedError({\n cause,\n logs: [],\n message: \"Failed to get signature status\",\n signature,\n }),\n try: () => rpc.getSignatureStatuses([signature]).send(),\n });\n\n const status = response?.value?.[0];\n if (!status) {\n return null;\n }\n\n if (status.err) {\n return yield* Effect.fail(\n new TransactionFailedError({\n logs: [],\n message: \"Transaction failed on-chain\",\n signature,\n })\n );\n }\n\n if (hasReachedConfirmation(status, commitment)) {\n return {\n confirmations: status.confirmations !== null ? BigInt(status.confirmations) : null,\n signature,\n slot: BigInt(status.slot),\n };\n }\n\n return null;\n });\n\nconst buildComputeBudgetInstructions = (config?: ComputeBudgetConfig): readonly Instruction[] => {\n if (!config) {\n return [];\n }\n\n const instructions: Instruction[] = [];\n\n if (config.unitLimit !== undefined) {\n instructions.push(getSetComputeUnitLimitInstruction({ units: config.unitLimit }));\n }\n\n if (config.microLamports !== undefined) {\n instructions.push(getSetComputeUnitPriceInstruction({ microLamports: config.microLamports }));\n }\n\n return instructions;\n};\n\n/**\n * Create a TransactionService layer.\n *\n * @category Layers\n */\nexport const TransactionServiceLive = Layer.effect(\n TransactionService,\n Effect.gen(function* () {\n const rpcService = yield* RpcService;\n const signerService = yield* SignerService;\n\n const service: TransactionServiceShape = {\n build: (instructions, opts) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const address = yield* signerService.getAddress();\n const computeBudgetInstructions = buildComputeBudgetInstructions(opts?.computeBudget);\n\n // Get latest blockhash\n const { value: latestBlockhash } = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionSendError({\n cause,\n message: \"Failed to get latest blockhash\",\n }),\n try: () => rpc.getLatestBlockhash().send(),\n });\n\n // Build transaction message\n const message = pipe(\n createTransactionMessage({ version: 0 }),\n (m) => setTransactionMessageFeePayer(address, m),\n (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n (m) =>\n appendTransactionMessageInstructions(\n [...computeBudgetInstructions, ...instructions],\n m\n )\n );\n\n return message;\n }).pipe(Effect.withSpan(SpanNames.TX_BUILD)),\n\n confirm: (signature, opts) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const commitment = opts?.commitment ?? \"confirmed\";\n const timeout = opts?.timeout ?? 60_000;\n\n // Poll for confirmation with retry logic\n const pollEffect = checkSignatureStatus(rpc, signature, commitment).pipe(\n Effect.flatMap((receipt) =>\n receipt ? Effect.succeed(receipt) : Effect.fail(\"not-confirmed\")\n )\n );\n\n // Retry with spaced intervals until timeout\n const retrySchedule = Schedule.spaced(\"2 seconds\");\n\n return yield* pollEffect.pipe(\n Effect.retry(retrySchedule),\n Effect.timeout(`${timeout} millis`),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new TransactionTimeoutError({\n message: `Transaction confirmation timed out after ${timeout}ms`,\n signature,\n })\n )\n ),\n Effect.catchAll(\n (error): Effect.Effect<never, TransactionFailedError | TransactionTimeoutError> => {\n // Let TransactionFailedError propagate\n if (error instanceof TransactionFailedError) {\n return Effect.fail(error);\n }\n // Convert \"not-confirmed\" string to TransactionTimeoutError\n return Effect.fail(\n new TransactionTimeoutError({\n message: `Transaction confirmation timed out after ${timeout}ms`,\n signature,\n })\n );\n }\n )\n );\n }).pipe(Effect.withSpan(SpanNames.TX_CONFIRM)),\n\n send: (tx) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const signature = getSignatureFromTransaction(tx);\n\n const wireTransaction = getBase64EncodedWireTransaction(tx);\n\n yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionSendError({\n cause,\n message: \"Failed to send transaction\",\n signature,\n }),\n try: () =>\n rpc\n .sendTransaction(wireTransaction, { encoding: \"base64\", skipPreflight: false })\n .send(),\n });\n\n return signature;\n }).pipe(Effect.withSpan(SpanNames.TX_SEND)),\n\n sendAll: (txs, opts) =>\n Effect.gen(function* () {\n const retries = opts?.sendRetries ?? 0;\n const retryDelay = opts?.sendRetryDelay ?? 500;\n\n const sendWithRetry = (tx: Transaction & TransactionWithLifetime) => {\n const sendEffect = service.send(tx);\n\n if (retries <= 0) {\n return sendEffect;\n }\n\n const retrySchedule = pipe(\n Schedule.recurs(retries),\n Schedule.addDelay(() => Duration.millis(retryDelay))\n );\n\n return sendEffect.pipe(Effect.retry(retrySchedule));\n };\n\n return yield* Effect.forEach(\n txs,\n (tx) => sendWithRetry(tx),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SEND)),\n\n sendAndConfirm: (instructions, opts) =>\n Effect.gen(function* () {\n const tx = yield* service.build(instructions, {\n computeBudget: opts?.computeBudget,\n });\n const signed = yield* service.sign(tx);\n const signature = yield* service.send(signed);\n return yield* service.confirm(signature, opts);\n }).pipe(Effect.withSpan(SpanNames.TX_SEND_AND_CONFIRM)),\n\n sendAndConfirmBatch: (items, opts) =>\n Effect.gen(function* () {\n const built = yield* Effect.forEach(\n items,\n (item) => service.build(item.instructions, { computeBudget: item.computeBudget }),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n\n const signed = yield* service.signAll(built);\n const signatures = yield* service.sendAll(signed, opts);\n\n return yield* Effect.forEach(\n signatures,\n (signature) => service.confirm(signature, opts?.confirm),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SEND_AND_CONFIRM)),\n\n sign: (tx) =>\n Effect.gen(function* () {\n const compiled = compileTransaction(tx);\n // Cast to the expected type for signTransaction\n const typed = compiled as unknown as Transaction & TransactionWithLifetime;\n return yield* signerService\n .signTransaction(typed)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n signAll: (txs) =>\n Effect.gen(function* () {\n const compiled = txs.map(\n (tx) => compileTransaction(tx) as Transaction & TransactionWithLifetime\n );\n return (yield* signerService\n .signAllTransactions(compiled)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n )) as readonly (Transaction & TransactionWithLifetime)[];\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n simulate: (tx) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const compiled = compileTransaction(tx);\n // Cast to the expected type for signTransaction\n const typed = compiled as unknown as Transaction & TransactionWithLifetime;\n const signed = yield* signerService\n .signTransaction(typed)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n );\n\n const wireTransaction = getBase64EncodedWireTransaction(signed);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new SimulationFailedError({\n cause,\n message: \"Simulation failed\",\n }),\n try: () => rpc.simulateTransaction(wireTransaction, { encoding: \"base64\" }).send(),\n });\n\n if (result.value.err) {\n return yield* Effect.fail(\n new SimulationFailedError({\n logs: result.value.logs ?? [],\n message: \"Simulation failed with error\",\n })\n );\n }\n }).pipe(Effect.withSpan(SpanNames.TX_SIMULATE)),\n };\n\n return TransactionService.of(service);\n })\n);\n"]}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tx/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { pipe } from \"@solana/functional\";\nimport type { Instruction } from \"@solana/instructions\";\nimport type { Signature } from \"@solana/keys\";\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n} from \"@solana/transaction-messages\";\nimport type { Transaction, TransactionWithLifetime } from \"@solana/transactions\";\nimport {\n compileTransaction,\n getBase64EncodedWireTransaction,\n getSignatureFromTransaction,\n} from \"@solana/transactions\";\nimport {\n getSetComputeUnitLimitInstruction,\n getSetComputeUnitPriceInstruction,\n} from \"@solana-program/compute-budget\";\nimport { Context, Duration, Effect, Layer, Schedule } from \"effect\";\nimport type { WalletNotConnectedError } from \"#src/core/errors/index.js\";\nimport {\n SignatureError,\n SimulationFailedError,\n TransactionFailedError,\n TransactionSendError,\n TransactionTimeoutError,\n} from \"#src/core/errors/index.js\";\nimport type { RpcServiceShape } from \"#src/rpc/index.js\";\nimport { RpcService } from \"#src/rpc/index.js\";\nimport { SignerService } from \"#src/signer/index.js\";\nimport { SpanNames } from \"#src/telemetry/index.js\";\nimport type {\n ComputeBudgetConfig,\n ConfirmOpts,\n SignableTransactionMessage,\n TransactionBatchItem,\n TransactionBatchOpts,\n TransactionBuildOpts,\n TransactionReceipt,\n} from \"./types.js\";\n\n/**\n * Shape of the TransactionService for type inference.\n *\n * @category Services\n */\nexport type TransactionServiceShape = {\n /**\n * Build a transaction from instructions.\n */\n readonly build: (\n instructions: readonly Instruction[],\n opts?: TransactionBuildOpts\n ) => Effect.Effect<SignableTransactionMessage, TransactionSendError | WalletNotConnectedError>;\n\n /**\n * Sign multiple transactions in a batch.\n */\n readonly signAll: (\n txs: readonly SignableTransactionMessage[]\n ) => Effect.Effect<\n readonly (Transaction & TransactionWithLifetime)[],\n TransactionSendError | WalletNotConnectedError\n >;\n\n /**\n * Sign a transaction.\n */\n readonly sign: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<\n Transaction & TransactionWithLifetime,\n TransactionSendError | WalletNotConnectedError\n >;\n\n /**\n * Send multiple signed transactions.\n */\n readonly sendAll: (\n txs: readonly (Transaction & TransactionWithLifetime)[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<readonly Signature[], TransactionSendError>;\n\n /**\n * Send a signed transaction.\n */\n readonly send: (\n tx: Transaction & TransactionWithLifetime\n ) => Effect.Effect<Signature, TransactionSendError>;\n\n /**\n * Confirm a transaction by signature.\n */\n readonly confirm: (\n signature: Signature,\n opts?: ConfirmOpts\n ) => Effect.Effect<TransactionReceipt, TransactionTimeoutError | TransactionFailedError>;\n\n /**\n * Build, sign, send, and confirm a transaction.\n */\n readonly sendAndConfirm: (\n instructions: readonly Instruction[],\n opts?: ConfirmOpts & { computeBudget?: ComputeBudgetConfig }\n ) => Effect.Effect<\n TransactionReceipt,\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n\n /**\n * Build, sign, send, and confirm a batch of transactions.\n */\n readonly sendAndConfirmBatch: (\n items: readonly TransactionBatchItem[],\n opts?: TransactionBatchOpts\n ) => Effect.Effect<\n readonly TransactionReceipt[],\n | TransactionSendError\n | WalletNotConnectedError\n | TransactionTimeoutError\n | TransactionFailedError\n >;\n\n /**\n * Simulate a transaction.\n */\n readonly simulate: <T extends SignableTransactionMessage>(\n tx: T\n ) => Effect.Effect<void, SimulationFailedError | TransactionSendError | WalletNotConnectedError>;\n};\n\n/**\n * Service tag for transaction operations.\n *\n * @category Services\n */\nexport class TransactionService extends Context.Tag(\"esolana/TransactionService\")<\n TransactionService,\n TransactionServiceShape\n>() {}\n\n/**\n * Check if a transaction has reached the desired confirmation level.\n */\nconst hasReachedConfirmation = (\n status: {\n confirmationStatus?: \"processed\" | \"confirmed\" | \"finalized\" | null;\n },\n commitment: \"processed\" | \"confirmed\" | \"finalized\"\n): boolean => {\n if (commitment === \"processed\") {\n return true;\n }\n if (commitment === \"confirmed\") {\n return status.confirmationStatus === \"confirmed\" || status.confirmationStatus === \"finalized\";\n }\n return status.confirmationStatus === \"finalized\";\n};\n\n/**\n * Check signature status and return receipt if confirmed.\n */\nconst checkSignatureStatus = (\n rpc: Effect.Effect.Success<ReturnType<RpcServiceShape[\"getRpc\"]>>,\n signature: Signature,\n commitment: \"processed\" | \"confirmed\" | \"finalized\"\n): Effect.Effect<TransactionReceipt | null, TransactionFailedError> =>\n Effect.gen(function* () {\n const response = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionFailedError({\n cause,\n logs: [],\n message: \"Failed to get signature status\",\n signature,\n }),\n try: () => rpc.getSignatureStatuses([signature]).send(),\n });\n\n const status = response?.value?.[0];\n if (!status) {\n return null;\n }\n\n if (status.err) {\n return yield* Effect.fail(\n new TransactionFailedError({\n logs: [],\n message: \"Transaction failed on-chain\",\n signature,\n })\n );\n }\n\n if (hasReachedConfirmation(status, commitment)) {\n return {\n confirmations: status.confirmations !== null ? BigInt(status.confirmations) : null,\n signature,\n slot: BigInt(status.slot),\n };\n }\n\n return null;\n });\n\nconst buildComputeBudgetInstructions = (config?: ComputeBudgetConfig): readonly Instruction[] => {\n if (!config) {\n return [];\n }\n\n const instructions: Instruction[] = [];\n\n if (config.unitLimit !== undefined) {\n instructions.push(getSetComputeUnitLimitInstruction({ units: config.unitLimit }));\n }\n\n if (config.microLamports !== undefined) {\n instructions.push(getSetComputeUnitPriceInstruction({ microLamports: config.microLamports }));\n }\n\n return instructions;\n};\n\n/**\n * Create a TransactionService layer.\n *\n * @category Layers\n */\nexport const TransactionServiceLive = Layer.effect(\n TransactionService,\n Effect.gen(function* () {\n const rpcService = yield* RpcService;\n const signerService = yield* SignerService;\n\n const service: TransactionServiceShape = {\n build: (instructions, opts) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const address = yield* signerService.getAddress();\n const computeBudgetInstructions = buildComputeBudgetInstructions(opts?.computeBudget);\n\n // Get latest blockhash\n const { value: latestBlockhash } = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionSendError({\n cause,\n message: \"Failed to get latest blockhash\",\n }),\n try: () => rpc.getLatestBlockhash().send(),\n });\n\n // Build transaction message\n const message = pipe(\n createTransactionMessage({ version: 0 }),\n (m) => setTransactionMessageFeePayer(address, m),\n (m) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n (m) =>\n appendTransactionMessageInstructions(\n [...computeBudgetInstructions, ...instructions],\n m\n )\n );\n\n return message;\n }).pipe(Effect.withSpan(SpanNames.TX_BUILD)),\n\n confirm: (signature, opts) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const commitment = opts?.commitment ?? \"confirmed\";\n const timeout = opts?.timeout ?? 60_000;\n\n // Poll for confirmation with retry logic\n const pollEffect = checkSignatureStatus(rpc, signature, commitment).pipe(\n Effect.flatMap((receipt) =>\n receipt ? Effect.succeed(receipt) : Effect.fail(\"not-confirmed\")\n )\n );\n\n // Retry with spaced intervals until timeout\n const retrySchedule = Schedule.spaced(\"2 seconds\");\n\n return yield* pollEffect.pipe(\n Effect.retry(retrySchedule),\n Effect.timeout(`${timeout} millis`),\n Effect.catchTag(\"TimeoutException\", () =>\n Effect.fail(\n new TransactionTimeoutError({\n message: `Transaction confirmation timed out after ${timeout}ms`,\n signature,\n })\n )\n ),\n Effect.catchAll(\n (error): Effect.Effect<never, TransactionFailedError | TransactionTimeoutError> => {\n // Let TransactionFailedError propagate\n if (error instanceof TransactionFailedError) {\n return Effect.fail(error);\n }\n // Convert \"not-confirmed\" string to TransactionTimeoutError\n return Effect.fail(\n new TransactionTimeoutError({\n message: `Transaction confirmation timed out after ${timeout}ms`,\n signature,\n })\n );\n }\n )\n );\n }).pipe(Effect.withSpan(SpanNames.TX_CONFIRM)),\n\n send: (tx) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const signature = getSignatureFromTransaction(tx);\n\n const wireTransaction = getBase64EncodedWireTransaction(tx);\n\n yield* Effect.tryPromise({\n catch: (cause) =>\n new TransactionSendError({\n cause,\n message: \"Failed to send transaction\",\n signature,\n }),\n try: () =>\n rpc\n .sendTransaction(wireTransaction, { encoding: \"base64\", skipPreflight: false })\n .send(),\n });\n\n return signature;\n }).pipe(Effect.withSpan(SpanNames.TX_SEND)),\n\n sendAll: (txs, opts) =>\n Effect.gen(function* () {\n const retries = opts?.sendRetries ?? 0;\n const retryDelay = opts?.sendRetryDelay ?? 500;\n\n const sendWithRetry = (tx: Transaction & TransactionWithLifetime) => {\n const sendEffect = service.send(tx);\n\n if (retries <= 0) {\n return sendEffect;\n }\n\n const retrySchedule = pipe(\n Schedule.recurs(retries),\n Schedule.addDelay(() => Duration.millis(retryDelay))\n );\n\n return sendEffect.pipe(Effect.retry(retrySchedule));\n };\n\n return yield* Effect.forEach(\n txs,\n (tx) => sendWithRetry(tx),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SEND)),\n\n sendAndConfirm: (instructions, opts) =>\n Effect.gen(function* () {\n const tx = yield* service.build(instructions, {\n computeBudget: opts?.computeBudget,\n });\n const signed = yield* service.sign(tx);\n const signature = yield* service.send(signed);\n return yield* service.confirm(signature, opts);\n }).pipe(Effect.withSpan(SpanNames.TX_SEND_AND_CONFIRM)),\n\n sendAndConfirmBatch: (items, opts) =>\n Effect.gen(function* () {\n const built = yield* Effect.forEach(\n items,\n (item) => service.build(item.instructions, { computeBudget: item.computeBudget }),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n\n const signed = yield* service.signAll(built);\n const signatures = yield* service.sendAll(signed, opts);\n\n return yield* Effect.forEach(\n signatures,\n (signature) => service.confirm(signature, opts?.confirm),\n opts?.concurrency ? { concurrency: opts.concurrency } : undefined\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SEND_AND_CONFIRM)),\n\n sign: (tx) =>\n Effect.gen(function* () {\n const compiled = compileTransaction(tx);\n // Cast to the expected type for signTransaction\n const typed = compiled as unknown as Transaction & TransactionWithLifetime;\n return yield* signerService\n .signTransaction(typed)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n );\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n signAll: (txs) =>\n Effect.gen(function* () {\n const compiled = txs.map(\n (tx) => compileTransaction(tx) as Transaction & TransactionWithLifetime\n );\n return (yield* signerService\n .signAllTransactions(compiled)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n )) as readonly (Transaction & TransactionWithLifetime)[];\n }).pipe(Effect.withSpan(SpanNames.TX_SIGN)),\n\n simulate: (tx) =>\n Effect.gen(function* () {\n const rpc = yield* rpcService.getRpc();\n const compiled = compileTransaction(tx);\n // Cast to the expected type for signTransaction\n const typed = compiled as unknown as Transaction & TransactionWithLifetime;\n const signed = yield* signerService\n .signTransaction(typed)\n .pipe(\n Effect.mapError((error) =>\n error instanceof SignatureError\n ? new TransactionSendError({ cause: error, message: error.message })\n : error\n )\n );\n\n const wireTransaction = getBase64EncodedWireTransaction(signed);\n\n const result = yield* Effect.tryPromise({\n catch: (cause) =>\n new SimulationFailedError({\n cause,\n message: \"Simulation failed\",\n }),\n try: () => rpc.simulateTransaction(wireTransaction, { encoding: \"base64\" }).send(),\n });\n\n if (result.value.err) {\n return yield* Effect.fail(\n new SimulationFailedError({\n logs: result.value.logs ?? [],\n message: \"Simulation failed with error\",\n })\n );\n }\n }).pipe(Effect.withSpan(SpanNames.TX_SIMULATE)),\n };\n\n return TransactionService.of(service);\n })\n);\n"]}
|
package/dist/tx/types.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Instruction } from "@solana/instructions";
|
|
2
2
|
import type { Signature } from "@solana/keys";
|
|
3
|
+
import type { TransactionMessage, TransactionMessageWithFeePayer, TransactionMessageWithLifetime } from "@solana/transaction-messages";
|
|
4
|
+
export type SignableTransactionMessage = TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithLifetime;
|
|
3
5
|
export type ConfirmOpts = {
|
|
4
6
|
readonly commitment?: "processed" | "confirmed" | "finalized";
|
|
5
7
|
readonly timeout?: number;
|
package/dist/tx/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tx/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tx/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,8BAA8B,EAC/B,MAAM,8BAA8B,CAAC;AAOtC,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,GACzD,8BAA8B,GAC9B,8BAA8B,CAAC;AAOjC,MAAM,MAAM,WAAW,GAAG;IAKxB,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IAM9D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAOF,MAAM,MAAM,mBAAmB,GAAG;IAIhC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAK5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1C,CAAC;AAOF,MAAM,MAAM,oBAAoB,GAAG;IAIjC,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC;CAC9C,CAAC;AAOF,MAAM,MAAM,oBAAoB,GAAG;IAIjC,QAAQ,CAAC,YAAY,EAAE,SAAS,WAAW,EAAE,CAAC;IAK9C,QAAQ,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC;CAC9C,CAAC;AAOF,MAAM,MAAM,oBAAoB,GAAG;IAKjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAM9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAM9B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAKjC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC,CAAC;AAOF,MAAM,MAAM,kBAAkB,GAAG;IAI/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAK9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAKtB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC"}
|