@effectstream/midnight-contracts 0.104.0 → 0.200.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.
package/README.md CHANGED
@@ -77,8 +77,8 @@ To deploy against a non-default stack, pass `NetworkUrls`:
77
77
 
78
78
  ```typescript
79
79
  const network: NetworkUrls = {
80
- indexer: "http://localhost:8088/api/v3/graphql",
81
- indexerWS: "ws://localhost:8088/api/v3/graphql/ws",
80
+ indexer: "http://localhost:8088/api/v4/graphql",
81
+ indexerWS: "ws://localhost:8088/api/v4/graphql/ws",
82
82
  node: "http://localhost:9944",
83
83
  proofServer: "http://localhost:6300",
84
84
  };
@@ -127,7 +127,7 @@ Wallet and dust helpers, exported from the package root:
127
127
 
128
128
  - `buildWalletFacade(...)`: builds the wallet facade the deploy and batcher paths run on.
129
129
  - `registerNightForDust(...)`, `getInitialDustState(...)`: register NIGHT to generate dust and read the starting state.
130
- - `waitForDustFunds(wallet, opts)` / `waitForDustFundsWithRetry(...)`: block until a wallet has spendable dust — the step that makes a freshly funded wallet usable.
130
+ - `waitForDustFunds(wallet, opts)` / `waitForDustFundsWithRetry(...)`: block until `dust.availableCoins` contains a spendable coin — a positive aggregate balance alone does not make a freshly funded wallet fee-ready.
131
131
  - `saveDustState(...)` / `loadDustState(...)`: persist and restore dust state across restarts, avoiding a re-sync.
132
132
  - `resolveFacadeDustBalance(...)`: current dust balance for a facade.
133
133
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effectstream/midnight-contracts",
3
- "version": "0.104.0",
3
+ "version": "0.200.1",
4
4
  "license": "(MIT OR Apache-2.0)",
5
5
  "homepage": "https://effectstream.github.io/docs/",
6
6
  "repository": {
@@ -11,6 +11,11 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/effectstream/effectstream/issues"
13
13
  },
14
+ "scripts": {
15
+ "test": "bun test ./test",
16
+ "test:integration:rc-stack": "bun run ./test/integration-rc-stack.ts",
17
+ "typecheck": "tsc -p tsconfig.json"
18
+ },
14
19
  "exports": {
15
20
  ".": "./src/mod.ts",
16
21
  "./read-contract": "./src/read-contract.ts",
@@ -21,29 +26,42 @@
21
26
  "./types": "./src/types.ts"
22
27
  },
23
28
  "dependencies": {
24
- "@effectstream/utils": "0.104.0",
29
+ "@effectstream/utils": "0.200.1",
30
+ "@midnight-ntwrk/compact-js": "2.5.5-rc.7",
31
+ "@midnight-ntwrk/compact-runtime": "0.18.0-rc.1",
32
+ "@midnight-ntwrk/midnight-js-contracts": "5.0.0-beta.6",
33
+ "@midnight-ntwrk/midnight-js-http-client-proof-provider": "5.0.0-beta.6",
34
+ "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "5.0.0-beta.6",
35
+ "@midnight-ntwrk/midnight-js-level-private-state-provider": "5.0.0-beta.6",
36
+ "@midnight-ntwrk/midnight-js-network-id": "5.0.0-beta.6",
37
+ "@midnight-ntwrk/midnight-js-node-zk-config-provider": "5.0.0-beta.6",
38
+ "@midnight-ntwrk/midnight-js-protocol": "5.0.0-beta.6",
39
+ "@midnight-ntwrk/midnight-js-types": "5.0.0-beta.6",
40
+ "@midnight-ntwrk/midnight-js-utils": "5.0.0-beta.6",
41
+ "@midnight-ntwrk/platform-js": "3.0.0",
42
+ "@midnightntwrk/ledger-v9": "1.0.0-rc.3",
43
+ "@midnightntwrk/onchain-runtime-v4": "4.0.0-rc.3",
44
+ "@midnightntwrk/wallet-sdk": "2.0.0-beta.2",
45
+ "@midnightntwrk/wallet-sdk-abstractions": "3.0.0-beta.0",
46
+ "@midnightntwrk/wallet-sdk-address-format": "4.0.0-beta.2",
47
+ "@midnightntwrk/wallet-sdk-capabilities": "4.0.0-beta.2",
48
+ "@midnightntwrk/wallet-sdk-dust-wallet": "5.0.0-beta.2",
49
+ "@midnightntwrk/wallet-sdk-facade": "5.0.0-beta.2",
50
+ "@midnightntwrk/wallet-sdk-hd": "3.1.0-beta.1",
51
+ "@midnightntwrk/wallet-sdk-indexer-client": "1.3.0-beta.1",
52
+ "@midnightntwrk/wallet-sdk-node-client": "2.0.0-beta.2",
53
+ "@midnightntwrk/wallet-sdk-prover-client": "2.0.0-beta.2",
54
+ "@midnightntwrk/wallet-sdk-runtime": "1.0.6-beta.0",
55
+ "@midnightntwrk/wallet-sdk-shielded": "4.0.0-beta.2",
56
+ "@midnightntwrk/wallet-sdk-unshielded-wallet": "4.0.0-beta.2",
57
+ "@midnightntwrk/wallet-sdk-utilities": "1.2.0",
25
58
  "@scure/bip39": "^2.0.1",
59
+ "bn.js": "5.2.3",
26
60
  "dotenv": "^16.4.7",
27
- "rxjs": "^7.8.2",
28
- "@midnightntwrk/wallet-sdk-address-format": "3.1.2",
29
- "@midnight-ntwrk/midnight-js-network-id": "4.1.1",
30
- "@midnight-ntwrk/midnight-js-types": "4.1.1",
31
- "@midnight-ntwrk/midnight-js-utils": "4.1.1",
32
- "@midnight-ntwrk/onchain-runtime-v3": "3.0.0",
33
- "@midnight-ntwrk/midnight-js-contracts": "4.1.1",
34
- "@midnight-ntwrk/midnight-js-indexer-public-data-provider": "4.1.1",
35
- "@midnight-ntwrk/midnight-js-http-client-proof-provider": "4.1.1",
36
- "@midnight-ntwrk/midnight-js-node-zk-config-provider": "4.1.1",
37
- "@midnight-ntwrk/midnight-js-level-private-state-provider": "4.1.1",
38
- "@midnightntwrk/wallet-sdk-abstractions": "2.1.0",
39
- "@midnightntwrk/wallet-sdk-facade": "4.1.0",
40
- "@midnightntwrk/wallet-sdk-hd": "3.0.3",
41
- "@midnightntwrk/wallet-sdk-shielded": "3.0.2",
42
- "@midnightntwrk/wallet-sdk-dust-wallet": "4.2.0",
43
- "@midnightntwrk/wallet-sdk-unshielded-wallet": "3.1.0",
44
- "@midnight-ntwrk/ledger-v8": "8.1.0",
45
- "@midnight-ntwrk/compact-js": "2.5.1",
46
- "@midnightntwrk/wallet-sdk-capabilities": "3.3.1"
61
+ "rxjs": "7.8.2"
62
+ },
63
+ "devDependencies": {
64
+ "typescript": "5.9.3"
47
65
  },
48
66
  "description": "Midnight network contract interfaces for EffectStream"
49
67
  }
@@ -2,7 +2,7 @@ const log = console;
2
2
  import { Buffer } from "node:buffer";
3
3
 
4
4
  import type { NetworkId } from "@midnightntwrk/wallet-sdk-abstractions";
5
- import { shieldedToken } from "@midnight-ntwrk/ledger-v8";
5
+ import { nativeToken } from "@midnightntwrk/ledger-v9";
6
6
  import type { WalletFacade } from "@midnightntwrk/wallet-sdk-facade";
7
7
 
8
8
  import {
@@ -38,7 +38,7 @@ export async function buildWalletAndWaitForFunds(
38
38
  log.info(`Wallet address: ${address}`);
39
39
  log.info(`Dust address: ${result.dustAddress}`);
40
40
 
41
- let balance = initialState.balances[shieldedToken().tag] ?? 0n;
41
+ let balance = initialState.balances[nativeToken().raw] ?? 0n;
42
42
  console.log("initialState", safeStringifyProgress(initialState));
43
43
  const syncTimeoutMs = resolveWalletSyncTimeoutMs();
44
44
  if (balance === 0n) {
@@ -98,4 +98,4 @@ return {
98
98
  left: { bytes: coinBytes },
99
99
  right: { bytes: encBytes.subarray(0, 32) },
100
100
  };
101
- }
101
+ }
@@ -36,7 +36,7 @@ import {
36
36
  Intent,
37
37
  sampleSigningKey,
38
38
  Transaction,
39
- } from "@midnight-ntwrk/ledger-v8";
39
+ } from "@midnightntwrk/ledger-v9";
40
40
 
41
41
  import { CONSTANTS } from "./constants.ts";
42
42
  import type { DeployConfig, WalletResult } from "./types.ts";
@@ -155,7 +155,7 @@ export async function deployMidnightContractPhased(
155
155
  const derivedSigningKey = initResult.private.signingKey;
156
156
  const fullContractState = initResult.public.contractState;
157
157
 
158
- // Convert the compact-runtime contract state to a ledger-v8 contract state,
158
+ // Convert the compact-runtime contract state to a ledger-v9 contract state,
159
159
  // then build a stripped copy that keeps the initial data + maintenance
160
160
  // authority but drops every circuit operation (i.e. no verifier keys).
161
161
  const fullLedgerState = ContractState.deserialize(
@@ -187,7 +187,7 @@ export async function deployMidnightContractPhased(
187
187
  );
188
188
  const signedRecipe = await walletResult.wallet.signRecipe(
189
189
  recipe,
190
- (payload) => walletResult.unshieldedKeystore.signData(payload),
190
+ (payload) => walletResult.unshieldedKeystore.signDataAsync(payload),
191
191
  );
192
192
  const finalizedTx = await walletResult.wallet.finalizeRecipe(signedRecipe);
193
193
  const txId = await walletResult.wallet.submitTransaction(finalizedTx);
package/src/deploy.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // TODO Remove references to "src/managed" as this is not standard.
2
2
 
3
3
  // Single WASM instance for ContractState / ContractMaintenanceAuthority.
4
- import "@midnight-ntwrk/onchain-runtime-v3";
4
+ import "@midnightntwrk/onchain-runtime-v4";
5
5
 
6
6
  import { setNetworkId } from "@midnight-ntwrk/midnight-js-network-id";
7
7
  import { Buffer } from "node:buffer";
@@ -11,7 +11,7 @@ import { getEnv, cwd } from "@effectstream/utils/runtime";
11
11
  import { deployContract } from "@midnight-ntwrk/midnight-js-contracts";
12
12
  import type { PrivateStateId } from "@midnight-ntwrk/midnight-js-types";
13
13
  import { CompiledContract, type Witnesses, type Contract } from "@midnight-ntwrk/compact-js";
14
- import type { SigningKey } from "@midnight-ntwrk/ledger-v8";
14
+ import type { SigningKey } from "@midnightntwrk/ledger-v9";
15
15
  import type { NetworkId } from "@midnightntwrk/wallet-sdk-abstractions";
16
16
  import * as path from "node:path";
17
17
 
@@ -126,15 +126,15 @@ export async function deployMidnightContract(
126
126
 
127
127
  // Merge network URLs with defaults
128
128
  const { id: networkIdOverride, ...endpoints } = networkUrls ?? {};
129
+ const resolvedNetworkId = (networkIdOverride ??
130
+ midnightNetworkConfig.id) as NetworkId.NetworkId;
129
131
  const resolvedNetworkUrls: Required<NetworkUrls> = {
130
- id: 'placeholder-value',
132
+ id: resolvedNetworkId,
131
133
  indexer: endpoints.indexer ?? midnightNetworkConfig.indexer,
132
134
  indexerWS: endpoints.indexerWS ?? midnightNetworkConfig.indexerWS,
133
135
  node: endpoints.node ?? midnightNetworkConfig.node,
134
136
  proofServer: endpoints.proofServer ?? midnightNetworkConfig.proofServer,
135
137
  };
136
- const resolvedNetworkId = (networkIdOverride ??
137
- midnightNetworkConfig.id) as NetworkId.NetworkId;
138
138
 
139
139
  log.info(
140
140
  `Preflight resolved endpoints -> indexerHttp=${resolvedNetworkUrls.indexer}, indexerWs=${resolvedNetworkUrls.indexerWS}, node=${resolvedNetworkUrls.node}, proofServer=${resolvedNetworkUrls.proofServer}, networkId=${resolvedNetworkId}`,
@@ -143,7 +143,7 @@ export async function deployMidnightContract(
143
143
  setNetworkId(resolvedNetworkId);
144
144
 
145
145
  let walletResult: WalletResult | null = opts?.walletResult ?? null;
146
- let providers: ReturnType<typeof configureMidnightNodeProviders> | null = null;
146
+ let providers: Awaited<ReturnType<typeof configureMidnightNodeProviders>> | null = null;
147
147
 
148
148
  try {
149
149
  if (!walletResult) {
@@ -201,7 +201,7 @@ export async function deployMidnightContract(
201
201
  // Use a separate LevelDB directory for deployment to avoid lock conflicts with batcher
202
202
  const deployPrivateStateStoreName = `${privateStateStoreName}-deploy`;
203
203
 
204
- providers = configureMidnightNodeProviders(
204
+ providers = await configureMidnightNodeProviders(
205
205
  wallet,
206
206
  zswapSecretKeys,
207
207
  walletZswapSecretKeys,
@@ -10,9 +10,9 @@
10
10
  // Run: bun run src/get-wallet-info-cli.ts [--seed <hex>] [--balance]
11
11
  import dotenv from "dotenv";
12
12
  import { parseArgs } from "node:util";
13
- import { shieldedToken } from "@midnight-ntwrk/ledger-v8";
13
+ import { nativeToken } from "@midnightntwrk/ledger-v9";
14
14
  import { setNetworkId } from "@midnight-ntwrk/midnight-js-network-id";
15
- import { NetworkId } from "@midnightntwrk/wallet-sdk-abstractions";
15
+ import type { NetworkId } from "@midnightntwrk/wallet-sdk-abstractions";
16
16
  import * as Rx from "rxjs";
17
17
  import type { NetworkUrls } from "./types.ts";
18
18
  import { midnightNetworkConfig } from "./midnight-env.ts";
@@ -48,8 +48,9 @@ async function main() {
48
48
  }
49
49
 
50
50
  const envSeed = getEnv("MIDNIGHT_WALLET_SEED");
51
- const argSeed = parsedArgs.seed;
52
- let seed = argSeed || envSeed;
51
+ const argSeed =
52
+ typeof parsedArgs.seed === "string" ? parsedArgs.seed : undefined;
53
+ let seed: string | undefined = argSeed || envSeed;
53
54
 
54
55
  if (!seed) {
55
56
  log.info("No seed provided. Generating a new random 32-byte hex seed...");
@@ -78,39 +79,19 @@ async function main() {
78
79
  const node = getEnv("MIDNIGHT_NODE_URL") || midnightNetworkConfig.node;
79
80
  const proofServer = getEnv("MIDNIGHT_PROOF_SERVER_URL") || midnightNetworkConfig.proofServer;
80
81
 
82
+ const networkIdRaw = getEnv("MIDNIGHT_NETWORK_ID") || "undeployed";
83
+ // NetworkId intentionally accepts future/custom IDs; preserve the selected
84
+ // identifier instead of coercing supported IDs (for example qanet) to a
85
+ // different network.
86
+ const networkId = networkIdRaw.toLowerCase() as NetworkId.NetworkId;
81
87
  const networkUrls: Required<NetworkUrls> = {
82
- id: "placeholder-value",
88
+ id: networkId,
83
89
  indexer,
84
90
  indexerWS,
85
91
  node,
86
- proofServer
92
+ proofServer,
87
93
  };
88
94
 
89
- const networkIdRaw = getEnv("MIDNIGHT_NETWORK_ID") || "undeployed";
90
-
91
- let networkId: NetworkId.NetworkId;
92
- switch (networkIdRaw.toLowerCase()) {
93
- case "undeployed":
94
- networkId = NetworkId.NetworkId.Undeployed;
95
- break;
96
- case "testnet":
97
- case "testnet-02":
98
- networkId = NetworkId.NetworkId.TestNet;
99
- break;
100
- case "devnet":
101
- case "qanet":
102
- networkId = NetworkId.NetworkId.DevNet;
103
- break;
104
- case "preview":
105
- networkId = "preview" as NetworkId.NetworkId;
106
- log.info(`Using preview network (addresses will have mn_addr_preview prefix)`);
107
- break;
108
- default:
109
- log.warn(`Unknown network ID "${networkIdRaw}", using as-is. Valid values: undeployed, testnet, devnet, preview`);
110
- networkId = networkIdRaw as NetworkId.NetworkId;
111
- }
112
- networkUrls.id = networkId;
113
-
114
95
  log.info(`Using network ID: ${networkId}`);
115
96
  log.info(`Indexer: ${indexer}`);
116
97
  log.info(`Indexer WS: ${indexerWS}`);
@@ -141,7 +122,7 @@ async function main() {
141
122
  let unshieldedBalance = 0n;
142
123
  let dustBalance = 0n;
143
124
 
144
- const tokenId = shieldedToken().tag;
125
+ const tokenId = nativeToken().raw;
145
126
  shieldedBalance = initialState.balances[tokenId] ?? 0n;
146
127
 
147
128
  const syncTimeoutMs = resolveWalletSyncTimeoutMs();
@@ -173,7 +154,10 @@ async function main() {
173
154
  if (dustBalance === 0n) {
174
155
  log.info("Dust balance is 0. Attempting to sync dust wallet...");
175
156
  try {
176
- dustBalance = await waitForDustFunds(walletResult.wallet, { timeoutMs: syncTimeoutMs });
157
+ dustBalance = (await waitForDustFunds(
158
+ walletResult.wallet,
159
+ { timeoutMs: syncTimeoutMs },
160
+ )).balance;
177
161
  } catch(_e) {
178
162
  log.warn("Dust sync timed out or returned no funds.");
179
163
  }
@@ -183,7 +167,10 @@ async function main() {
183
167
  log.info("Dust is 0 but unshielded funds available. Registering for dust generation...");
184
168
  const success = await registerNightForDust(walletResult);
185
169
  if (success) {
186
- dustBalance = await waitForDustFunds(walletResult.wallet, { timeoutMs: 30000 });
170
+ dustBalance = (await waitForDustFunds(
171
+ walletResult.wallet,
172
+ { timeoutMs: 30000 },
173
+ )).balance;
187
174
  }
188
175
  }
189
176
  } catch (_e) {