@effectstream/midnight-contracts 0.104.1 → 0.200.2
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 +3 -3
- package/package.json +40 -22
- package/src/build-wallet.ts +3 -3
- package/src/deploy-phased.ts +3 -3
- package/src/deploy.ts +7 -7
- package/src/get-wallet-info-cli.ts +21 -34
- package/src/get-wallet-info.ts +232 -85
- package/src/midnight-env.ts +17 -19
- package/src/mod.ts +4 -0
- package/src/providers.ts +27 -12
- package/src/types.ts +6 -5
- package/test/integration-rc-stack.ts +223 -0
- package/test/migration.test.ts +219 -0
- package/test/migration.typecheck.ts +27 -0
- package/tsconfig.json +8 -0
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/
|
|
81
|
-
indexerWS: "ws://localhost:8088/api/
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.200.2",
|
|
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.
|
|
29
|
+
"@effectstream/utils": "0.200.2",
|
|
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": "
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"
|
|
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
|
}
|
package/src/build-wallet.ts
CHANGED
|
@@ -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 {
|
|
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[
|
|
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
|
+
}
|
package/src/deploy-phased.ts
CHANGED
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
Intent,
|
|
37
37
|
sampleSigningKey,
|
|
38
38
|
Transaction,
|
|
39
|
-
} from "@
|
|
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-
|
|
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.
|
|
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 "@
|
|
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 "@
|
|
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:
|
|
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
|
|
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 {
|
|
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 =
|
|
52
|
-
|
|
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:
|
|
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 =
|
|
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(
|
|
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(
|
|
170
|
+
dustBalance = (await waitForDustFunds(
|
|
171
|
+
walletResult.wallet,
|
|
172
|
+
{ timeoutMs: 30000 },
|
|
173
|
+
)).balance;
|
|
187
174
|
}
|
|
188
175
|
}
|
|
189
176
|
} catch (_e) {
|