@no-witness-labs/midday-sdk 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +145 -78
  2. package/dist/Client.d.ts +464 -72
  3. package/dist/Client.d.ts.map +1 -1
  4. package/dist/Client.js +526 -143
  5. package/dist/Client.js.map +1 -1
  6. package/dist/Config.d.ts +83 -1
  7. package/dist/Config.d.ts.map +1 -1
  8. package/dist/Config.js +72 -15
  9. package/dist/Config.js.map +1 -1
  10. package/dist/Providers.d.ts +99 -9
  11. package/dist/Providers.d.ts.map +1 -1
  12. package/dist/Providers.js +142 -39
  13. package/dist/Providers.js.map +1 -1
  14. package/dist/Wallet.d.ts +88 -1
  15. package/dist/Wallet.d.ts.map +1 -1
  16. package/dist/Wallet.js +162 -51
  17. package/dist/Wallet.js.map +1 -1
  18. package/dist/devnet/Cluster.d.ts +282 -0
  19. package/dist/devnet/Cluster.d.ts.map +1 -0
  20. package/dist/devnet/Cluster.js +487 -0
  21. package/dist/devnet/Cluster.js.map +1 -0
  22. package/dist/devnet/Config.d.ts +119 -0
  23. package/dist/devnet/Config.d.ts.map +1 -0
  24. package/dist/devnet/Config.js +75 -0
  25. package/dist/devnet/Config.js.map +1 -0
  26. package/dist/devnet/Container.d.ts +180 -0
  27. package/dist/devnet/Container.d.ts.map +1 -0
  28. package/dist/devnet/Container.js +390 -0
  29. package/dist/devnet/Container.js.map +1 -0
  30. package/dist/devnet/Health.d.ts +129 -0
  31. package/dist/devnet/Health.d.ts.map +1 -0
  32. package/dist/devnet/Health.js +304 -0
  33. package/dist/devnet/Health.js.map +1 -0
  34. package/dist/devnet/Images.d.ts +43 -0
  35. package/dist/devnet/Images.d.ts.map +1 -0
  36. package/dist/devnet/Images.js +96 -0
  37. package/dist/devnet/Images.js.map +1 -0
  38. package/dist/devnet/errors.d.ts +65 -0
  39. package/dist/devnet/errors.d.ts.map +1 -0
  40. package/dist/devnet/errors.js +40 -0
  41. package/dist/devnet/errors.js.map +1 -0
  42. package/dist/devnet/index.d.ts +72 -0
  43. package/dist/devnet/index.d.ts.map +1 -0
  44. package/dist/devnet/index.js +73 -0
  45. package/dist/devnet/index.js.map +1 -0
  46. package/dist/index.d.ts +63 -7
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +68 -4
  49. package/dist/index.js.map +1 -1
  50. package/dist/providers/HttpZkConfigProvider.d.ts +229 -0
  51. package/dist/providers/HttpZkConfigProvider.d.ts.map +1 -0
  52. package/dist/providers/HttpZkConfigProvider.js +275 -0
  53. package/dist/providers/HttpZkConfigProvider.js.map +1 -0
  54. package/dist/providers/IndexedDBPrivateStateProvider.d.ts +270 -0
  55. package/dist/providers/IndexedDBPrivateStateProvider.d.ts.map +1 -0
  56. package/dist/providers/IndexedDBPrivateStateProvider.js +513 -0
  57. package/dist/providers/IndexedDBPrivateStateProvider.js.map +1 -0
  58. package/dist/providers/errors.d.ts +50 -0
  59. package/dist/providers/errors.d.ts.map +1 -0
  60. package/dist/providers/errors.js +32 -0
  61. package/dist/providers/errors.js.map +1 -0
  62. package/dist/sdk/Type.d.ts +91 -0
  63. package/dist/sdk/Type.d.ts.map +1 -0
  64. package/dist/sdk/Type.js +8 -0
  65. package/dist/sdk/Type.js.map +1 -0
  66. package/dist/utils/address.d.ts +56 -0
  67. package/dist/utils/address.d.ts.map +1 -0
  68. package/dist/utils/address.js +135 -0
  69. package/dist/utils/address.js.map +1 -0
  70. package/dist/utils/coin.d.ts +55 -0
  71. package/dist/utils/coin.d.ts.map +1 -0
  72. package/dist/utils/coin.js +84 -0
  73. package/dist/utils/coin.js.map +1 -0
  74. package/dist/utils/effect-runtime.d.ts +66 -0
  75. package/dist/utils/effect-runtime.d.ts.map +1 -0
  76. package/dist/utils/effect-runtime.js +147 -0
  77. package/dist/utils/effect-runtime.js.map +1 -0
  78. package/dist/utils/hex.d.ts +62 -0
  79. package/dist/utils/hex.d.ts.map +1 -0
  80. package/dist/utils/hex.js +93 -0
  81. package/dist/utils/hex.js.map +1 -0
  82. package/dist/wallet/connector.d.ts +191 -0
  83. package/dist/wallet/connector.d.ts.map +1 -0
  84. package/dist/wallet/connector.js +183 -0
  85. package/dist/wallet/connector.js.map +1 -0
  86. package/dist/wallet/errors.d.ts +22 -0
  87. package/dist/wallet/errors.d.ts.map +1 -0
  88. package/dist/wallet/errors.js +16 -0
  89. package/dist/wallet/errors.js.map +1 -0
  90. package/dist/wallet/provider.d.ts +102 -0
  91. package/dist/wallet/provider.d.ts.map +1 -0
  92. package/dist/wallet/provider.js +139 -0
  93. package/dist/wallet/provider.js.map +1 -0
  94. package/package.json +23 -8
package/dist/Wallet.d.ts CHANGED
@@ -3,24 +3,111 @@
3
3
  *
4
4
  * Handles the three-layer wallet system: shielded, dust, and unshielded wallets.
5
5
  *
6
+ * ## API Design
7
+ *
8
+ * - **Promise API**: `await Wallet.init(seed, config)`
9
+ * - **Effect API**: `yield* Wallet.effect.init(seed, config)`
10
+ * - **Effect DI**: `yield* WalletService` with `WalletLive` layer
11
+ *
6
12
  * @since 0.1.0
7
13
  * @module
8
14
  */
15
+ import { Context, Effect, Layer } from 'effect';
9
16
  import * as ledger from '@midnight-ntwrk/ledger-v6';
10
17
  import { WalletFacade } from '@midnight-ntwrk/wallet-sdk-facade';
11
18
  import { createKeystore } from '@midnight-ntwrk/wallet-sdk-unshielded-wallet';
12
19
  import type { NetworkConfig } from './Config.js';
20
+ import { WalletError } from './wallet/errors.js';
21
+ /**
22
+ * Wallet context containing all wallet components.
23
+ *
24
+ * @since 0.2.0
25
+ * @category model
26
+ */
13
27
  export interface WalletContext {
14
28
  wallet: WalletFacade;
15
29
  shieldedSecretKeys: ledger.ZswapSecretKeys;
16
30
  dustSecretKey: ledger.DustSecretKey;
17
31
  unshieldedKeystore: ReturnType<typeof createKeystore>;
18
32
  }
33
+ declare function initEffect(seed: string, networkConfig: NetworkConfig): Effect.Effect<WalletContext, WalletError>;
34
+ declare function waitForSyncEffect(walletContext: WalletContext): Effect.Effect<void, WalletError>;
35
+ declare function deriveAddressEffect(seed: string, networkId: string): Effect.Effect<string, WalletError>;
36
+ /**
37
+ * Initialize wallet from seed.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const walletContext = await Wallet.init(seed, networkConfig);
42
+ * ```
43
+ *
44
+ * @since 0.2.0
45
+ * @category constructors
46
+ */
19
47
  export declare function init(seed: string, networkConfig: NetworkConfig): Promise<WalletContext>;
48
+ /**
49
+ * Wait for wallet to sync with the network.
50
+ *
51
+ * @since 0.2.0
52
+ * @category operations
53
+ */
20
54
  export declare function waitForSync(walletContext: WalletContext): Promise<void>;
21
55
  /**
22
56
  * Derive wallet address from seed without starting wallet connection.
23
- * Useful for displaying addresses or checking balances via indexer.
57
+ *
58
+ * @since 0.2.0
59
+ * @category utilities
24
60
  */
25
61
  export declare function deriveAddress(seed: string, networkId: string): string;
62
+ /**
63
+ * Raw Effect APIs for advanced users.
64
+ *
65
+ * @since 0.2.0
66
+ * @category effect
67
+ */
68
+ export declare const effect: {
69
+ init: typeof initEffect;
70
+ waitForSync: typeof waitForSyncEffect;
71
+ deriveAddress: typeof deriveAddressEffect;
72
+ };
73
+ /**
74
+ * Service interface for Wallet operations.
75
+ *
76
+ * @since 0.2.0
77
+ * @category service
78
+ */
79
+ export interface WalletServiceImpl {
80
+ readonly init: (seed: string, networkConfig: NetworkConfig) => Effect.Effect<WalletContext, WalletError>;
81
+ readonly waitForSync: (walletContext: WalletContext) => Effect.Effect<void, WalletError>;
82
+ readonly deriveAddress: (seed: string, networkId: string) => Effect.Effect<string, WalletError>;
83
+ }
84
+ declare const WalletService_base: Context.TagClass<WalletService, "WalletService", WalletServiceImpl>;
85
+ /**
86
+ * Context.Tag for WalletService dependency injection.
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * const program = Effect.gen(function* () {
91
+ * const walletService = yield* WalletService;
92
+ * const wallet = yield* walletService.init(seed, config);
93
+ * yield* walletService.waitForSync(wallet);
94
+ * return wallet;
95
+ * });
96
+ *
97
+ * Effect.runPromise(program.pipe(Effect.provide(WalletLive)));
98
+ * ```
99
+ *
100
+ * @since 0.2.0
101
+ * @category service
102
+ */
103
+ export declare class WalletService extends WalletService_base {
104
+ }
105
+ /**
106
+ * Live Layer for WalletService.
107
+ *
108
+ * @since 0.2.0
109
+ * @category layer
110
+ */
111
+ export declare const WalletLive: Layer.Layer<WalletService>;
112
+ export {};
26
113
  //# sourceMappingURL=Wallet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Wallet.d.ts","sourceRoot":"","sources":["../src/Wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAIjE,OAAO,EACL,cAAc,EAIf,MAAM,8CAA8C,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC;IACpC,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;CACvD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CA+C7F;AAED,wBAAsB,WAAW,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgBrE"}
1
+ {"version":3,"file":"Wallet.d.ts","sourceRoot":"","sources":["../src/Wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAIjE,OAAO,EACL,cAAc,EAIf,MAAM,8CAA8C,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC;IACpC,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;CACvD;AAMD,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAwDzG;AAED,iBAAS,iBAAiB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CASzF;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAyBhG;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAE7F;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM;;;;CAIlB,CAAC;AAMF;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACzG,QAAQ,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACzF,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACjG;;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,aAAc,SAAQ,kBAAgE;CAAG;AAMtG;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAIhD,CAAC"}
package/dist/Wallet.js CHANGED
@@ -3,9 +3,16 @@
3
3
  *
4
4
  * Handles the three-layer wallet system: shielded, dust, and unshielded wallets.
5
5
  *
6
+ * ## API Design
7
+ *
8
+ * - **Promise API**: `await Wallet.init(seed, config)`
9
+ * - **Effect API**: `yield* Wallet.effect.init(seed, config)`
10
+ * - **Effect DI**: `yield* WalletService` with `WalletLive` layer
11
+ *
6
12
  * @since 0.1.0
7
13
  * @module
8
14
  */
15
+ import { Context, Effect, Layer } from 'effect';
9
16
  import * as Rx from 'rxjs';
10
17
  import * as ledger from '@midnight-ntwrk/ledger-v6';
11
18
  import { WalletFacade } from '@midnight-ntwrk/wallet-sdk-facade';
@@ -13,65 +20,169 @@ import { HDWallet, Roles } from '@midnight-ntwrk/wallet-sdk-hd';
13
20
  import { ShieldedWallet } from '@midnight-ntwrk/wallet-sdk-shielded';
14
21
  import { DustWallet } from '@midnight-ntwrk/wallet-sdk-dust-wallet';
15
22
  import { createKeystore, PublicKey as UnshieldedPublicKey, UnshieldedWallet, InMemoryTransactionHistoryStorage, } from '@midnight-ntwrk/wallet-sdk-unshielded-wallet';
16
- export async function init(seed, networkConfig) {
17
- const seedBuffer = Buffer.from(seed, 'hex');
18
- const configuration = {
19
- networkId: networkConfig.networkId,
20
- costParameters: {
21
- additionalFeeOverhead: 300000000000000000n,
22
- feeBlocksMargin: 5,
23
+ import { WalletError } from './wallet/errors.js';
24
+ import { hexToBytes } from './utils/hex.js';
25
+ import { runEffect, runEffectPromise } from './utils/effect-runtime.js';
26
+ // =============================================================================
27
+ // Internal Effect Implementations
28
+ // =============================================================================
29
+ function initEffect(seed, networkConfig) {
30
+ return Effect.tryPromise({
31
+ try: async () => {
32
+ const seedBytes = hexToBytes(seed);
33
+ const configuration = {
34
+ networkId: networkConfig.networkId,
35
+ costParameters: {
36
+ additionalFeeOverhead: 300000000000000000n,
37
+ feeBlocksMargin: 5,
38
+ },
39
+ relayURL: new URL(networkConfig.node),
40
+ provingServerUrl: new URL(networkConfig.proofServer),
41
+ indexerClientConnection: {
42
+ indexerHttpUrl: networkConfig.indexer,
43
+ indexerWsUrl: networkConfig.indexerWS,
44
+ },
45
+ indexerUrl: networkConfig.indexerWS,
46
+ };
47
+ const hdWallet = HDWallet.fromSeed(seedBytes);
48
+ if (hdWallet.type !== 'seedOk')
49
+ throw new Error('Failed to initialize HDWallet');
50
+ const derivationResult = hdWallet.hdWallet
51
+ .selectAccount(0)
52
+ .selectRoles([Roles.Zswap, Roles.NightExternal, Roles.Dust])
53
+ .deriveKeysAt(0);
54
+ if (derivationResult.type !== 'keysDerived')
55
+ throw new Error('Failed to derive keys');
56
+ hdWallet.hdWallet.clear();
57
+ const shieldedSecretKeys = ledger.ZswapSecretKeys.fromSeed(derivationResult.keys[Roles.Zswap]);
58
+ const dustSecretKey = ledger.DustSecretKey.fromSeed(derivationResult.keys[Roles.Dust]);
59
+ const unshieldedKeystore = createKeystore(derivationResult.keys[Roles.NightExternal], configuration.networkId);
60
+ const shieldedWallet = ShieldedWallet(configuration).startWithSecretKeys(shieldedSecretKeys);
61
+ const dustWallet = DustWallet(configuration).startWithSecretKey(dustSecretKey, ledger.LedgerParameters.initialParameters().dust);
62
+ const unshieldedWallet = UnshieldedWallet({
63
+ ...configuration,
64
+ txHistoryStorage: new InMemoryTransactionHistoryStorage(),
65
+ }).startWithPublicKey(UnshieldedPublicKey.fromKeyStore(unshieldedKeystore));
66
+ const wallet = new WalletFacade(shieldedWallet, unshieldedWallet, dustWallet);
67
+ await wallet.start(shieldedSecretKeys, dustSecretKey);
68
+ return { wallet, shieldedSecretKeys, dustSecretKey, unshieldedKeystore };
23
69
  },
24
- relayURL: new URL(networkConfig.node),
25
- provingServerUrl: new URL(networkConfig.proofServer),
26
- indexerClientConnection: {
27
- indexerHttpUrl: networkConfig.indexer,
28
- indexerWsUrl: networkConfig.indexerWS,
70
+ catch: (cause) => new WalletError({
71
+ cause,
72
+ message: `Failed to initialize wallet: ${cause instanceof Error ? cause.message : String(cause)}`,
73
+ }),
74
+ });
75
+ }
76
+ function waitForSyncEffect(walletContext) {
77
+ return Effect.tryPromise({
78
+ try: () => Rx.firstValueFrom(walletContext.wallet.state().pipe(Rx.filter((s) => s.isSynced))),
79
+ catch: (cause) => new WalletError({
80
+ cause,
81
+ message: `Failed to sync wallet: ${cause instanceof Error ? cause.message : String(cause)}`,
82
+ }),
83
+ }).pipe(Effect.asVoid);
84
+ }
85
+ function deriveAddressEffect(seed, networkId) {
86
+ return Effect.try({
87
+ try: () => {
88
+ const seedBytes = hexToBytes(seed);
89
+ const hdWallet = HDWallet.fromSeed(seedBytes);
90
+ if (hdWallet.type !== 'seedOk')
91
+ throw new Error('Failed to initialize HDWallet');
92
+ const derivationResult = hdWallet.hdWallet
93
+ .selectAccount(0)
94
+ .selectRoles([Roles.NightExternal])
95
+ .deriveKeysAt(0);
96
+ if (derivationResult.type !== 'keysDerived')
97
+ throw new Error('Failed to derive keys');
98
+ hdWallet.hdWallet.clear();
99
+ const unshieldedKeystore = createKeystore(derivationResult.keys[Roles.NightExternal], networkId);
100
+ return unshieldedKeystore.getBech32Address().asString();
29
101
  },
30
- indexerUrl: networkConfig.indexerWS,
31
- };
32
- const hdWallet = HDWallet.fromSeed(Uint8Array.from(seedBuffer));
33
- if (hdWallet.type !== 'seedOk')
34
- throw new Error('Failed to initialize HDWallet');
35
- const derivationResult = hdWallet.hdWallet
36
- .selectAccount(0)
37
- .selectRoles([Roles.Zswap, Roles.NightExternal, Roles.Dust])
38
- .deriveKeysAt(0);
39
- if (derivationResult.type !== 'keysDerived')
40
- throw new Error('Failed to derive keys');
41
- hdWallet.hdWallet.clear();
42
- const shieldedSecretKeys = ledger.ZswapSecretKeys.fromSeed(derivationResult.keys[Roles.Zswap]);
43
- const dustSecretKey = ledger.DustSecretKey.fromSeed(derivationResult.keys[Roles.Dust]);
44
- const unshieldedKeystore = createKeystore(derivationResult.keys[Roles.NightExternal], configuration.networkId);
45
- const shieldedWallet = ShieldedWallet(configuration).startWithSecretKeys(shieldedSecretKeys);
46
- const dustWallet = DustWallet(configuration).startWithSecretKey(dustSecretKey, ledger.LedgerParameters.initialParameters().dust);
47
- const unshieldedWallet = UnshieldedWallet({
48
- ...configuration,
49
- txHistoryStorage: new InMemoryTransactionHistoryStorage(),
50
- }).startWithPublicKey(UnshieldedPublicKey.fromKeyStore(unshieldedKeystore));
51
- const wallet = new WalletFacade(shieldedWallet, unshieldedWallet, dustWallet);
52
- await wallet.start(shieldedSecretKeys, dustSecretKey);
53
- return { wallet, shieldedSecretKeys, dustSecretKey, unshieldedKeystore };
102
+ catch: (cause) => new WalletError({
103
+ cause,
104
+ message: `Failed to derive address: ${cause instanceof Error ? cause.message : String(cause)}`,
105
+ }),
106
+ });
107
+ }
108
+ // =============================================================================
109
+ // Promise API
110
+ // =============================================================================
111
+ /**
112
+ * Initialize wallet from seed.
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * const walletContext = await Wallet.init(seed, networkConfig);
117
+ * ```
118
+ *
119
+ * @since 0.2.0
120
+ * @category constructors
121
+ */
122
+ export async function init(seed, networkConfig) {
123
+ return runEffectPromise(initEffect(seed, networkConfig));
54
124
  }
125
+ /**
126
+ * Wait for wallet to sync with the network.
127
+ *
128
+ * @since 0.2.0
129
+ * @category operations
130
+ */
55
131
  export async function waitForSync(walletContext) {
56
- await Rx.firstValueFrom(walletContext.wallet.state().pipe(Rx.filter((s) => s.isSynced)));
132
+ return runEffectPromise(waitForSyncEffect(walletContext));
57
133
  }
58
134
  /**
59
135
  * Derive wallet address from seed without starting wallet connection.
60
- * Useful for displaying addresses or checking balances via indexer.
136
+ *
137
+ * @since 0.2.0
138
+ * @category utilities
61
139
  */
62
140
  export function deriveAddress(seed, networkId) {
63
- const seedBuffer = Buffer.from(seed, 'hex');
64
- const hdWallet = HDWallet.fromSeed(Uint8Array.from(seedBuffer));
65
- if (hdWallet.type !== 'seedOk')
66
- throw new Error('Failed to initialize HDWallet');
67
- const derivationResult = hdWallet.hdWallet
68
- .selectAccount(0)
69
- .selectRoles([Roles.NightExternal])
70
- .deriveKeysAt(0);
71
- if (derivationResult.type !== 'keysDerived')
72
- throw new Error('Failed to derive keys');
73
- hdWallet.hdWallet.clear();
74
- const unshieldedKeystore = createKeystore(derivationResult.keys[Roles.NightExternal], networkId);
75
- return unshieldedKeystore.getBech32Address().asString();
141
+ return runEffect(deriveAddressEffect(seed, networkId));
76
142
  }
143
+ /**
144
+ * Raw Effect APIs for advanced users.
145
+ *
146
+ * @since 0.2.0
147
+ * @category effect
148
+ */
149
+ export const effect = {
150
+ init: initEffect,
151
+ waitForSync: waitForSyncEffect,
152
+ deriveAddress: deriveAddressEffect,
153
+ };
154
+ /**
155
+ * Context.Tag for WalletService dependency injection.
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * const program = Effect.gen(function* () {
160
+ * const walletService = yield* WalletService;
161
+ * const wallet = yield* walletService.init(seed, config);
162
+ * yield* walletService.waitForSync(wallet);
163
+ * return wallet;
164
+ * });
165
+ *
166
+ * Effect.runPromise(program.pipe(Effect.provide(WalletLive)));
167
+ * ```
168
+ *
169
+ * @since 0.2.0
170
+ * @category service
171
+ */
172
+ export class WalletService extends Context.Tag('WalletService')() {
173
+ }
174
+ // =============================================================================
175
+ // Effect DI - Live Layer
176
+ // =============================================================================
177
+ /**
178
+ * Live Layer for WalletService.
179
+ *
180
+ * @since 0.2.0
181
+ * @category layer
182
+ */
183
+ export const WalletLive = Layer.succeed(WalletService, {
184
+ init: initEffect,
185
+ waitForSync: waitForSyncEffect,
186
+ deriveAddress: deriveAddressEffect,
187
+ });
77
188
  //# sourceMappingURL=Wallet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Wallet.js","sourceRoot":"","sources":["../src/Wallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Wallet.js","sourceRoot":"","sources":["../src/Wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * DevNet cluster orchestration.
3
+ *
4
+ * Manages the lifecycle of a complete Midnight development environment
5
+ * consisting of a node, indexer, and proof server.
6
+ *
7
+ * ## API Design
8
+ *
9
+ * This module uses an **instance-based pattern**:
10
+ *
11
+ * - **Stateful**: A Cluster holds references to Docker containers
12
+ * - **Instance methods**: `cluster.start()`, `cluster.stop()`, etc.
13
+ * - **Effect-first**: Internal implementation uses Effect
14
+ * - **Promise wrapper**: `.effect` namespace exposes raw Effects
15
+ *
16
+ * ### Usage Patterns
17
+ *
18
+ * ```typescript
19
+ * // Promise user (majority)
20
+ * const cluster = await Cluster.make();
21
+ * await cluster.start(); // instance method
22
+ * const config = cluster.networkConfig; // accessor
23
+ * await cluster.stop();
24
+ *
25
+ * // Effect user (composable)
26
+ * const cluster = yield* Cluster.effect.make();
27
+ * yield* cluster.effect.start(); // raw Effect access
28
+ *
29
+ * // Effect DI user (dependency injection)
30
+ * const cluster = yield* ClusterService;
31
+ * yield* cluster.effect.start();
32
+ * // provide with: Effect.provide(Cluster.Live) or Cluster.layer({ ... })
33
+ * ```
34
+ *
35
+ * @since 0.2.0
36
+ * @module
37
+ */
38
+ import { Context, Effect, Layer } from 'effect';
39
+ import type { NetworkConfig } from '../Config.js';
40
+ import type { DevNetConfig, ResolvedDevNetConfig } from './Config.js';
41
+ import * as Container from './Container.js';
42
+ import { ClusterError } from './errors.js';
43
+ /**
44
+ * Raw cluster data (containers and config).
45
+ *
46
+ * @since 0.2.0
47
+ * @category model
48
+ */
49
+ export interface ClusterData {
50
+ /** The Midnight node container */
51
+ readonly node: Container.Container;
52
+ /** The indexer container */
53
+ readonly indexer: Container.Container;
54
+ /** The proof server container */
55
+ readonly proofServer: Container.Container;
56
+ /** The resolved configuration */
57
+ readonly config: ResolvedDevNetConfig;
58
+ }
59
+ /**
60
+ * A DevNet cluster instance with lifecycle methods.
61
+ *
62
+ * @since 0.2.0
63
+ * @category model
64
+ */
65
+ export interface Cluster {
66
+ /** The Midnight node container */
67
+ readonly node: Container.Container;
68
+ /** The indexer container */
69
+ readonly indexer: Container.Container;
70
+ /** The proof server container */
71
+ readonly proofServer: Container.Container;
72
+ /** The resolved configuration */
73
+ readonly config: ResolvedDevNetConfig;
74
+ /** Network configuration for use with midday-sdk client */
75
+ readonly networkConfig: NetworkConfig;
76
+ /** Start the cluster */
77
+ readonly start: () => Promise<void>;
78
+ /** Stop the cluster */
79
+ readonly stop: () => Promise<void>;
80
+ /** Remove the cluster */
81
+ readonly remove: () => Promise<void>;
82
+ /** Check if the cluster is running */
83
+ readonly isRunning: () => Promise<boolean>;
84
+ readonly effect: {
85
+ /** Start the cluster (raw Effect) */
86
+ readonly start: () => Effect.Effect<void, ClusterError>;
87
+ /** Stop the cluster (raw Effect) */
88
+ readonly stop: () => Effect.Effect<void, ClusterError>;
89
+ /** Remove the cluster (raw Effect) */
90
+ readonly remove: () => Effect.Effect<void, ClusterError>;
91
+ };
92
+ }
93
+ declare const ClusterService_base: Context.TagClass<ClusterService, "ClusterService", Cluster>;
94
+ /**
95
+ * Context.Tag for ClusterService dependency injection.
96
+ *
97
+ * Yields a Cluster instance directly. Use `Cluster.layer()` to provide
98
+ * with custom configuration.
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * import { Effect } from 'effect';
103
+ * import { Cluster, ClusterService } from '@no-witness-labs/midday-sdk/devnet';
104
+ *
105
+ * const program = Effect.gen(function* () {
106
+ * const cluster = yield* ClusterService;
107
+ * yield* cluster.effect.start();
108
+ * return cluster.networkConfig;
109
+ * });
110
+ *
111
+ * // With default config
112
+ * await Effect.runPromise(program.pipe(Effect.provide(Cluster.Live)));
113
+ *
114
+ * // With custom config
115
+ * await Effect.runPromise(program.pipe(
116
+ * Effect.provide(Cluster.layer({ clusterName: 'my-devnet' }))
117
+ * ));
118
+ * ```
119
+ *
120
+ * @since 0.2.0
121
+ * @category service
122
+ */
123
+ export declare class ClusterService extends ClusterService_base {
124
+ }
125
+ /**
126
+ * Create a new DevNet cluster instance.
127
+ *
128
+ * Returns a cluster with bound lifecycle methods.
129
+ * This creates the containers but does not start them.
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * import { Cluster } from '@no-witness-labs/midday-sdk/devnet';
134
+ *
135
+ * const cluster = await Cluster.make();
136
+ * await cluster.start();
137
+ *
138
+ * // Access network config directly
139
+ * const client = await Midday.Client.create({
140
+ * networkConfig: cluster.networkConfig,
141
+ * seed: 'your-wallet-seed',
142
+ * });
143
+ *
144
+ * // ... run tests ...
145
+ *
146
+ * await cluster.remove();
147
+ * ```
148
+ *
149
+ * @since 0.2.0
150
+ * @category constructors
151
+ */
152
+ export declare const make: (config?: DevNetConfig) => Promise<Cluster>;
153
+ /**
154
+ * Get the network configuration for use with midday-sdk client.
155
+ *
156
+ * @deprecated Prefer using `cluster.networkConfig` property instead.
157
+ *
158
+ * @since 0.2.0
159
+ * @category utilities
160
+ */
161
+ export declare const toNetworkConfig: (cluster: Cluster | ClusterData) => NetworkConfig;
162
+ /**
163
+ * Helper function to run code with an automatically managed cluster.
164
+ * The cluster is created, started, and cleaned up automatically.
165
+ *
166
+ * @example
167
+ * ```typescript
168
+ * import { Cluster } from '@no-witness-labs/midday-sdk/devnet';
169
+ *
170
+ * await Cluster.withCluster(async (cluster) => {
171
+ * // Use cluster.networkConfig directly
172
+ * const config = cluster.networkConfig;
173
+ * // Your code here - cluster will be cleaned up automatically
174
+ * return config;
175
+ * });
176
+ * ```
177
+ *
178
+ * @since 0.2.0
179
+ * @category utilities
180
+ */
181
+ export declare const withCluster: <T>(fn: (cluster: Cluster) => Promise<T>, config?: DevNetConfig) => Promise<T>;
182
+ /**
183
+ * Effect API for advanced users who want full composability,
184
+ * type-safe errors, retries, and other Effect benefits.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * import { Effect } from 'effect';
189
+ * import { Cluster } from '@no-witness-labs/midday-sdk/devnet';
190
+ *
191
+ * const program = Effect.gen(function* () {
192
+ * const cluster = yield* Cluster.effect.make();
193
+ * yield* cluster.effect.start(); // Use instance method
194
+ * return cluster;
195
+ * }).pipe(
196
+ * Effect.retry({ times: 3 }),
197
+ * Effect.timeout('5 minutes')
198
+ * );
199
+ *
200
+ * await Effect.runPromise(program);
201
+ * ```
202
+ *
203
+ * @since 0.2.0
204
+ * @category effect
205
+ */
206
+ export declare const effect: {
207
+ /**
208
+ * Create a cluster instance (returns raw Effect).
209
+ *
210
+ * The returned cluster has an `.effect` namespace for lifecycle methods.
211
+ *
212
+ * @since 0.2.0
213
+ */
214
+ readonly make: (config?: DevNetConfig) => Effect.Effect<Cluster, ClusterError, never>;
215
+ /**
216
+ * Run code with an automatically managed cluster (returns raw Effect).
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * import { Effect } from 'effect';
221
+ * import { Cluster } from '@no-witness-labs/midday-sdk/devnet';
222
+ *
223
+ * const program = Cluster.effect.withCluster((cluster) =>
224
+ * Effect.gen(function* () {
225
+ * const config = cluster.networkConfig;
226
+ * return config;
227
+ * })
228
+ * );
229
+ *
230
+ * await Effect.runPromise(program);
231
+ * ```
232
+ *
233
+ * @since 0.2.0
234
+ */
235
+ readonly withCluster: <A, E, R>(fn: (cluster: Cluster) => Effect.Effect<A, E, R>, config?: DevNetConfig) => Effect.Effect<A, E | ClusterError, R>;
236
+ };
237
+ /**
238
+ * Create a Layer that provides ClusterService with custom configuration.
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * import { Effect } from 'effect';
243
+ * import { Cluster, ClusterService } from '@no-witness-labs/midday-sdk/devnet';
244
+ *
245
+ * const program = Effect.gen(function* () {
246
+ * const cluster = yield* ClusterService;
247
+ * yield* cluster.effect.start();
248
+ * return cluster;
249
+ * });
250
+ *
251
+ * await Effect.runPromise(program.pipe(
252
+ * Effect.provide(Cluster.layer({ clusterName: 'my-devnet' }))
253
+ * ));
254
+ * ```
255
+ *
256
+ * @since 0.2.0
257
+ * @category layer
258
+ */
259
+ export declare const layer: (config?: DevNetConfig) => Layer.Layer<ClusterService, ClusterError>;
260
+ /**
261
+ * Live Layer for ClusterService with default configuration.
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * import { Effect } from 'effect';
266
+ * import { Cluster, ClusterService } from '@no-witness-labs/midday-sdk/devnet';
267
+ *
268
+ * const program = Effect.gen(function* () {
269
+ * const cluster = yield* ClusterService;
270
+ * yield* cluster.effect.start();
271
+ * return cluster;
272
+ * });
273
+ *
274
+ * await Effect.runPromise(program.pipe(Effect.provide(Cluster.Live)));
275
+ * ```
276
+ *
277
+ * @since 0.2.0
278
+ * @category layer
279
+ */
280
+ export declare const Live: Layer.Layer<ClusterService, ClusterError>;
281
+ export {};
282
+ //# sourceMappingURL=Cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cluster.d.ts","sourceRoot":"","sources":["../../src/devnet/Cluster.ts"],"names":[],"mappings":"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"}