midnight-wallet-cli 0.1.11 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,47 +1,58 @@
1
1
  #!/usr/bin/env node
2
- var a3=Object.defineProperty;var b=($,Z)=>{for(var Q in Z)a3($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:(X)=>Z[Q]=()=>X})};var M=($,Z)=>()=>($&&(Z=$($=0)),Z);function l0($){g0=$}function L($){let Z=JSON.stringify($)+`
3
- `;if(g0)g0(Z);else process.stdout.write(Z)}var g0=null;function _($,Z){let Q=$.flags[Z];if(Q===void 0||Q===!0)return;return Q}function P($,Z){return Z in $.flags}function P1($,Z,Q){let X=_($,Z);if(X===void 0)throw new Error(`Missing required flag: --${Z} <${Q}>`);return X}import{HDWallet as t3,Roles as s3}from"@midnight-ntwrk/wallet-sdk-hd";import{createKeystore as e3,PublicKey as $2}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{NetworkId as d0}from"@midnight-ntwrk/wallet-sdk-abstractions";function Q0($,Z,Q=0){let X=Z2[Z],z=t3.fromSeed($);if(z.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let q=z.hdWallet.selectAccount(0).selectRole(s3.NightExternal).deriveKeyAt(Q);if(q.type==="keyOutOfBounds")throw new Error(`Key index ${Q} out of bounds`);let Y=e3(q.key,X);return $2.fromKeyStore(Y).address}var Z2;var A0=M(()=>{Z2={preprod:d0.NetworkId.PreProd,preview:d0.NetworkId.Preview,undeployed:d0.NetworkId.Undeployed}});import{execSync as Q2}from"child_process";function m($){return M1.includes($)}function z2($){return{...X2[$]}}function O1(){return M1}function _1($){if($.startsWith("mn_addr_preprod1"))return"preprod";if($.startsWith("mn_addr_preview1"))return"preview";if($.startsWith("mn_addr_undeployed1"))return"undeployed";return null}function q2(){try{let $=Q2('docker ps --format "{{.Image}}|{{.Ports}}"',{encoding:"utf-8",timeout:5000}),Z={};for(let Q of $.trim().split(`
4
- `)){if(!Q)continue;let[X,z]=Q.split("|"),q=(Y)=>{let K=new RegExp(`0\\.0\\.0\\.0:(\\d+)->${Y}/tcp`),U=z?.match(K);return U?parseInt(U[1],10):void 0};if(X.includes("indexer-standalone")||X.includes("indexer")){let Y=q(8088);if(Y)Z.indexerPort=Y}if(X.includes("midnight-node")){let Y=q(9944);if(Y)Z.nodePort=Y}if(X.includes("proof-server")){let Y=q(6300);if(Y)Z.proofServerPort=Y}}return Z}catch{return{}}}function A1($){let Z=z2($);if($==="undeployed"){let Q=q2();if(Q.indexerPort)Z.indexer=`http://localhost:${Q.indexerPort}/api/v3/graphql`,Z.indexerWS=`ws://localhost:${Q.indexerPort}/api/v3/graphql/ws`;if(Q.nodePort)Z.node=`ws://localhost:${Q.nodePort}`;if(Q.proofServerPort)Z.proofServer=`http://localhost:${Q.proofServerPort}`}return Z}var X2,M1;var I0=M(()=>{X2={preprod:{indexer:"https://indexer.preprod.midnight.network/api/v3/graphql",indexerWS:"wss://indexer.preprod.midnight.network/api/v3/graphql/ws",node:"wss://rpc.preprod.midnight.network",proofServer:"http://localhost:6300",networkId:"PreProd"},preview:{indexer:"https://indexer.preview.midnight.network/api/v3/graphql",indexerWS:"wss://indexer.preview.midnight.network/api/v3/graphql/ws",node:"wss://rpc.preview.midnight.network",proofServer:"http://localhost:6300",networkId:"Preview"},undeployed:{indexer:"http://localhost:8088/api/v3/graphql",indexerWS:"ws://localhost:8088/api/v3/graphql/ws",node:"ws://localhost:9944",proofServer:"http://localhost:6300",networkId:"Undeployed"}},M1=["preprod","preview","undeployed"]});var R0="0000000000000000000000000000000000000000000000000000000000000001",I1="0000000000000000000000000000000000000000000000000000000000000000",i0=6,R1=1e6,T1=300000000000000n,D1=5,U0=800000000000000n,y1=300000,T0=30000,E1=1e4,o0=120000,x1=300000,n0=60000,a0=10,N1=3,C1=600000,r0=15000,w1=115,h=".midnight",X0="wallet.json",v1="config.json",n=448,D0=384,b1="localnet";import*as u from"fs";import*as t0 from"path";import{homedir as Y2}from"os";function k1($){return $??t0.join(Y2(),h)}function S1($){return t0.join(k1($),v1)}function G2($){let Z=k1($);if(!u.existsSync(Z))u.mkdirSync(Z,{recursive:!0,mode:n})}function E0($){let Z=S1($);if(!u.existsSync(Z))return{...y0};let Q;try{Q=u.readFileSync(Z,"utf-8")}catch{return{...y0}}let X;try{X=JSON.parse(Q)}catch{return{...y0}}return{network:X.network&&m(X.network)?X.network:y0.network}}function J2($,Z){G2(Z);let Q=S1(Z);u.writeFileSync(Q,JSON.stringify($,null,2)+`
5
- `,{mode:D0})}function h1($,Z){let Q=E0(Z);if($==="network")return Q.network;throw new Error(`Unknown config key: "${$}"
6
- Valid keys: ${s0.join(", ")}`)}function f1($,Z,Q){let X=E0(Q);if($==="network"){if(!m(Z))throw new Error(`Invalid network: "${Z}"
7
- Valid networks: preprod, preview, undeployed`);X.network=Z}else throw new Error(`Unknown config key: "${$}"
8
- Valid keys: ${s0.join(", ")}`);J2(X,Q)}function e0(){return s0}var y0,s0;var $1=M(()=>{I0();y0={network:"undeployed"},s0=["network"]});function a($){let Z=_($.args,"network");if(Z!==void 0){if(!m(Z))throw new Error(`Invalid network: "${Z}"
9
- Valid networks: ${O1().join(", ")}`);return Z}if($.walletNetwork&&m($.walletNetwork))return $.walletNetwork;if($.address){let X=_1($.address);if(X)return X}let Q=E0($.configDir);if(Q.network&&m(Q.network))return Q.network;return"undeployed"}function g($){let Z=a($),Q=A1(Z);return{name:Z,config:Q}}var l=M(()=>{I0();$1()});import*as k from"fs";import*as d from"path";import{homedir as K2}from"os";function p1(){return d.join(K2(),h)}function c1(){return d.join(p1(),X0)}function U2(){let $=p1();if(!k.existsSync($))k.mkdirSync($,{recursive:!0,mode:n})}function f($){let Z=$?d.resolve($):c1();if(!k.existsSync(Z))throw new Error(`Wallet file not found: ${Z}
10
- Generate a wallet first: midnight generate --network <name>`);let Q;try{Q=k.readFileSync(Z,"utf-8")}catch(z){throw new Error(`Failed to read wallet file: ${Z}
11
- ${z.message}`)}let X;try{X=JSON.parse(Q)}catch{throw new Error(`Invalid JSON in wallet file: ${Z}`)}if(!X.seed||!X.network||!X.address||!X.createdAt){let z=["seed","network","address","createdAt"].filter((q)=>!X[q]);throw new Error(`Wallet file is missing required fields (${z.join(", ")}): ${Z}`)}if(!/^[0-9a-fA-F]+$/.test(X.seed))throw new Error(`Invalid seed format in wallet file (expected hex string): ${Z}`);if(!m(X.network))throw new Error(`Invalid network "${X.network}" in wallet file: ${Z}
12
- Valid networks: preprod, preview, undeployed`);return X}function m1($,Z){let Q=Z?d.resolve(Z):c1();if(!Z)U2();else{let X=d.dirname(Q);if(!k.existsSync(X))k.mkdirSync(X,{recursive:!0,mode:n})}return k.writeFileSync(Q,JSON.stringify($,null,2)+`
13
- `,{mode:D0}),Q}var r=M(()=>{I0()});function z0(){return!("NO_COLOR"in process.env)}function H0($,Z){if(!z0())return $;return`\x1B[38;5;${Z}m${$}\x1B[0m`}function O($){if(!z0())return $;return`\x1B[1m${$}\x1B[0m`}function V($){if(!z0())return $;return`\x1B[2m${$}\x1B[0m`}function W0($){return H0($,38)}function t($){return H0($,196)}function i($){return H0($,40)}function j0($){return H0($,226)}function u1($){return H0($,245)}function I($,Z=l1){let Q=` ${$} `,X=Z-Q.length;if(X<=0)return O(Q);let z=Math.floor(X/2),q=X-z;return O("═".repeat(z)+Q+"═".repeat(q))}function A($=l1){return V("─".repeat($))}function W($,Z,Q=16){let X=($+":").padEnd(Q);return` ${u1(X)}${Z}`}function B0($){let Z=$<0n,Q=Z?-$:$,X=BigInt(10**i0),z=Q/X,Y=(Q%X).toString().padStart(i0,"0");return`${Z?"-":""}${z}.${Y}`}function x0($){return`${B0($)} NIGHT`}function N0($){let Z=$<0n,Q=Z?-$:$,X=10n**BigInt(g1),z=Q/X,K=(Q%X).toString().padStart(g1,"0").replace(/0+$/,"").padEnd(6,"0");return`${Z?"-":""}${z}.${K}`}function C0($){return`${N0($)} DUST`}function y($,Z=!1){let Q=Z&&$.length>20?$.slice(0,10)+"…"+$.slice(-8):$;return W0(Q)}function s($,Z){let X=[`${i("✓")} ${$}`];if(Z)X.push(W("Transaction",W0(Z)));return X.join(`
14
- `)}var l1=60,g1=15;var w=()=>{};var a1={};b(a1,{default:()=>n1});import*as o1 from"fs";import*as w0 from"path";import{homedir as H2}from"os";import{generateMnemonic as W2,mnemonicToSeedSync as d1,validateMnemonic as j2}from"@scure/bip39";import{wordlist as i1}from"@scure/bip39/wordlists/english.js";async function n1($){let Z=a({args:$}),Q=_($,"output"),X=_($,"seed"),z=_($,"mnemonic");if(X!==void 0&&z!==void 0)throw new Error("Cannot specify both --seed and --mnemonic. Use one or the other.");let q=Q?w0.resolve(Q):w0.join(H2(),h,X0);if(o1.existsSync(q)&&!P($,"force"))throw new Error(`Wallet file already exists: ${q}
15
- Use --force to overwrite, or --output <file> to save to a different path.`);let Y,K;if(X!==void 0){let J=X.replace(/^0x/,"");if(J.length!==64||!/^[0-9a-fA-F]+$/.test(J))throw new Error("Seed must be a 64-character hex string (32 bytes)");Y=Buffer.from(J,"hex")}else if(z!==void 0){if(!j2(z,i1))throw new Error("Invalid BIP-39 mnemonic. Expected 12 or 24 words from the English wordlist.");K=z,Y=Buffer.from(d1(K).slice(0,32))}else K=W2(i1,256),Y=Buffer.from(d1(K).slice(0,32));let U=Q0(Y,Z),H={seed:Y.toString("hex"),network:Z,address:U,createdAt:new Date().toISOString()};if(K)H.mnemonic=K;let G=m1(H,Q);if(P($,"json")){let J={address:U,network:Z,seed:Y.toString("hex"),file:G,createdAt:H.createdAt};if(K)J.mnemonic=K;L(J);return}if(process.stdout.write(U+`
2
+ var U3=Object.defineProperty;var f=($,Z)=>{for(var Q in Z)U3($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:(X)=>Z[Q]=()=>X})};var E=($,Z)=>()=>($&&(Z=$($=0)),Z);function M1($){I1=$}function M($){let Z=JSON.stringify($)+`
3
+ `;if(I1)I1(Z);else process.stdout.write(Z)}var I1=null;function _($,Z){let Q=$.flags[Z];if(Q===void 0||Q===!0)return;return Q}function I($,Z){return Z in $.flags}function u0($){return I($,"verbose")}function B2($,Z,Q){let X=_($,Z);if(X===void 0)throw new Error(`Missing required flag: --${Z} <${Q}>`);return X}function K0($){if(!$||$!==$.trim())return!1;if(/[\/\\]/.test($))return!1;if($.endsWith(".json"))return!1;if($==="."||$==="..")return!1;if(/[\x00-\x1f]/.test($))return!1;return!0}var m0="0000000000000000000000000000000000000000000000000000000000000001",H2="0000000000000000000000000000000000000000000000000000000000000000",_1=6,T1=1e6,W2=300000000000000n,L2=5,_0=800000000000000n,P2=300000,c0=30000,F2=120000,O2=1e4,R1=120000,I2=300000,x1=60000,A1=10,M2=3,_2=600000,E1=15000,T2=115,g=".midnight",g0="wallet.json",R2="config.json",e=448,G0=384,x2="localnet",D1=1,C1="cache",d0="wallets",N1="default",l0="https://midnight-comp-tracker.vercel.app";var D2={};f(D2,{unsetConfigValue:()=>k1,setConfigValue:()=>v1,saveCliConfig:()=>R0,loadCliConfig:()=>l,getValidConfigKeys:()=>o0,getConfigValue:()=>S1});import*as $0 from"fs";import*as y1 from"path";import{homedir as V3}from"os";function B3($){return/^(https?|wss?):\/\/\S+/.test($)}function A2($){return $??y1.join(V3(),g)}function E2($){return y1.join(A2($),R2)}function H3($){let Z=A2($);if(!$0.existsSync(Z))$0.mkdirSync(Z,{recursive:!0,mode:e})}function l($){let Z=E2($);if(!$0.existsSync(Z))return{...T0};let Q;try{Q=$0.readFileSync(Z,"utf-8")}catch{return{...T0}}let X;try{X=JSON.parse(Q)}catch{return{...T0}}let z={network:X.network&&Z0(X.network)?X.network:T0.network};if(X["proof-server"]&&typeof X["proof-server"]==="string")z["proof-server"]=X["proof-server"];if(X.node&&typeof X.node==="string")z.node=X.node;if(X["indexer-ws"]&&typeof X["indexer-ws"]==="string")z["indexer-ws"]=X["indexer-ws"];if(X.wallet&&typeof X.wallet==="string")z.wallet=X.wallet;return z}function R0($,Z){H3(Z);let Q=E2(Z);$0.writeFileSync(Q,JSON.stringify($,null,2)+`
4
+ `,{mode:G0})}function S1($,Z){let Q=l(Z);if($==="network")return Q.network;if($==="wallet")return Q.wallet??"(not set)";if(b1.has($)){let X=Q[$];return typeof X==="string"?X:"(not set)"}throw new Error(`Unknown config key: "${$}"
5
+ Valid keys: ${i0.join(", ")}`)}function v1($,Z,Q){let X=l(Q);if($==="network"){if(!Z0(Z))throw new Error(`Invalid network: "${Z}"
6
+ Valid networks: preprod, preview, undeployed`);X.network=Z}else if($==="wallet"){if(!K0(Z))throw new Error(`Invalid wallet name: "${Z}"
7
+ Wallet name must be a simple name (no path separators, .json suffix, or special characters).`);X.wallet=Z}else if(b1.has($)){if(!B3(Z))throw new Error(`Invalid URL for "${$}": "${Z}"
8
+ Must start with http://, https://, ws://, or wss://`);X[$]=Z}else throw new Error(`Unknown config key: "${$}"
9
+ Valid keys: ${i0.join(", ")}`);R0(X,Q)}function k1($,Z){let Q=l(Z);if($==="network")Q.network=T0.network;else if($==="wallet")delete Q.wallet;else if(b1.has($))delete Q[$];else throw new Error(`Unknown config key: "${$}"
10
+ Valid keys: ${i0.join(", ")}`);R0(Q,Z)}function o0(){return i0}var T0,i0,b1;var L0=E(()=>{Q0();T0={network:"undeployed"},i0=["network","proof-server","node","indexer-ws","wallet"],b1=new Set(["proof-server","node","indexer-ws"])});import{execSync as W3}from"child_process";function Z0($){return C2.includes($)}function w1($){return{...L3[$]}}function n0(){return C2}function P3(){try{let $=W3('docker ps --format "{{.Image}}|{{.Ports}}"',{encoding:"utf-8",timeout:5000}),Z={};for(let Q of $.trim().split(`
11
+ `)){if(!Q)continue;let[X,z]=Q.split("|"),q=(Y)=>{let G=new RegExp(`0\\.0\\.0\\.0:(\\d+)->${Y}/tcp`),K=z?.match(G);return K?parseInt(K[1],10):void 0};if(X.includes("indexer-standalone")||X.includes("indexer")){let Y=q(8088);if(Y)Z.indexerPort=Y}if(X.includes("midnight-node")){let Y=q(9944);if(Y)Z.nodePort=Y}if(X.includes("proof-server")){let Y=q(6300);if(Y)Z.proofServerPort=Y}}return Z}catch{return{}}}function N2($){let Z=w1($);if($==="undeployed"){let Q=P3();if(Q.indexerPort)Z.indexer=`http://localhost:${Q.indexerPort}/api/v3/graphql`,Z.indexerWS=`ws://localhost:${Q.indexerPort}/api/v3/graphql/ws`;if(Q.nodePort)Z.node=`ws://localhost:${Q.nodePort}`;if(Q.proofServerPort)Z.proofServer=`http://localhost:${Q.proofServerPort}`}return Z}function z0($,Z,Q){let X=l(Q);if($.proofServer=Z.proofServer??X["proof-server"]??$.proofServer,$.node=Z.node??X.node??$.node,$.indexerWS=Z.indexerWS??X["indexer-ws"]??$.indexerWS,Z.indexerWS??X["indexer-ws"]){let z=$.indexerWS;$.indexer=z.replace(/^wss:/,"https:").replace(/^ws:/,"http:").replace(/\/ws$/,"")}return $}var L3,C2;var Q0=E(()=>{L0();L3={preprod:{indexer:"https://indexer.preprod.midnight.network/api/v3/graphql",indexerWS:"wss://indexer.preprod.midnight.network/api/v3/graphql/ws",node:"wss://rpc.preprod.midnight.network",proofServer:"http://localhost:6300",networkId:"PreProd"},preview:{indexer:"https://indexer.preview.midnight.network/api/v3/graphql",indexerWS:"wss://indexer.preview.midnight.network/api/v3/graphql/ws",node:"wss://rpc.preview.midnight.network",proofServer:"http://localhost:6300",networkId:"Preview"},undeployed:{indexer:"http://localhost:8088/api/v3/graphql",indexerWS:"ws://localhost:8088/api/v3/graphql/ws",node:"ws://localhost:9944",proofServer:"http://localhost:6300",networkId:"Undeployed"}},C2=["preprod","preview","undeployed"]});import{HDWallet as F3,Roles as O3}from"@midnight-ntwrk/wallet-sdk-hd";import{createKeystore as I3,PublicKey as M3}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{NetworkId as h1}from"@midnight-ntwrk/wallet-sdk-abstractions";function J0($,Z,Q=0){let X=_3[Z],z=F3.fromSeed($);if(z.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let q=z.hdWallet.selectAccount(0).selectRole(O3.NightExternal).deriveKeyAt(Q);if(q.type==="keyOutOfBounds")throw new Error(`Key index ${Q} out of bounds`);let Y=I3(q.key,X);return M3.fromKeyStore(Y).address}function U0($,Z=0){let Q={};for(let X of n0())Q[X]=J0($,X,Z);return Q}var _3;var j0=E(()=>{Q0();_3={preprod:h1.NetworkId.PreProd,preview:h1.NetworkId.Preview,undeployed:h1.NetworkId.Undeployed}});function d($){let Z=_($.args,"network");if(Z!==void 0){if(!Z0(Z))throw new Error(`Invalid network: "${Z}"
12
+ Valid networks: ${n0().join(", ")}`);return Z}let Q=l($.configDir);if(Q.network&&Z0(Q.network))return Q.network;return"undeployed"}function t($){let Z=d($),Q=N2(Z);return{name:Z,config:Q}}var o=E(()=>{Q0();L0()});import*as b from"fs";import*as p from"path";import{homedir as T3}from"os";function f1(){return p.join(T3(),g)}function x0(){return p.join(f1(),d0)}function y2(){return p.join(f1(),g0)}function R3(){let $=f1();if(!b.existsSync($))b.mkdirSync($,{recursive:!0,mode:e})}function x3($){return $.includes("/")||$.includes("\\")||$.endsWith(".json")}function u($){if($!==void 0){if(x3($))return p.resolve($);return p.join(x0(),`${$}.json`)}let Q=l().wallet??N1;return p.join(x0(),`${Q}.json`)}function A0(){return l().wallet??N1}function p1($){if(!K0($))throw new Error(`Invalid wallet name: "${$}"
13
+ Wallet name must be a simple name (no path separators, .json suffix, or special characters).`);let Z=p.join(x0(),`${$}.json`);if(!b.existsSync(Z))throw new Error(`Wallet "${$}" not found.
14
+ Run "midnight wallet list" to see available wallets.`);let Q=l();Q.wallet=$,R0(Q)}function b2(){let $=x0();if(!b.existsSync($))return[];let Z=A0();return b.readdirSync($).filter((X)=>X.endsWith(".json")).sort().map((X)=>{let z=X.replace(/\.json$/,""),q=p.join($,X);try{let Y=JSON.parse(b.readFileSync(q,"utf-8")),G;if(Y.addresses)G=Y.addresses;else if(Y.address&&Y.seed)try{let K=Buffer.from(Y.seed,"hex");G=U0(K)}catch{G={undeployed:Y.address,preprod:"(unknown)",preview:"(unknown)"}}else G={undeployed:"(unknown)",preprod:"(unknown)",preview:"(unknown)"};return{name:z,addresses:G,isActive:z===Z}}catch{return{name:z,addresses:{undeployed:"(invalid)",preprod:"(invalid)",preview:"(invalid)"},isActive:z===Z}}})}function S2($){if(!K0($))throw new Error(`Invalid wallet name: "${$}"
15
+ Wallet name must be a simple name (no path separators, .json suffix, or special characters).`);let Z=x0(),Q=p.join(Z,`${$}.json`);if(!b.existsSync(Q))throw new Error(`Wallet "${$}" not found.
16
+ Run "midnight wallet list" to see available wallets.`);let X=A0();if($===X)throw new Error(`Cannot remove the active wallet "${$}".
17
+ Switch to another wallet first: midnight wallet use <other-wallet>`);if(b.readdirSync(Z).filter((q)=>q.endsWith(".json")).length<=1)throw new Error(`Cannot remove "${$}" — it is the only wallet.
18
+ `+"Create another wallet first: midnight wallet generate <name>");b.unlinkSync(Q)}function m($){let Z=$?p.resolve($):y2();if(!b.existsSync(Z))throw new Error(`Wallet file not found: ${Z}
19
+ Generate a wallet first: midnight wallet generate <name> --network <name>`);let Q;try{Q=b.readFileSync(Z,"utf-8")}catch(q){throw new Error(`Failed to read wallet file: ${Z}
20
+ ${q.message}`)}let X;try{X=JSON.parse(Q)}catch{throw new Error(`Invalid JSON in wallet file: ${Z}`)}if(!X.seed||!X.createdAt){let q=["seed","createdAt"];if(!X.addresses)q.push("address");let Y=q.filter((G)=>!X[G]);if(Y.length>0)throw new Error(`Wallet file is missing required fields (${Y.join(", ")}): ${Z}`)}if(!/^[0-9a-fA-F]+$/.test(X.seed))throw new Error(`Invalid seed format in wallet file (expected hex string): ${Z}`);if(!X.addresses){if(!X.address)throw new Error(`Wallet file is missing required fields (address): ${Z}`);let q=Buffer.from(X.seed,"hex"),Y=U0(q),G={seed:X.seed,addresses:Y,createdAt:X.createdAt};if(X.mnemonic)G.mnemonic=X.mnemonic;let K={...X,addresses:Y};return b.writeFileSync(Z,JSON.stringify(K,null,2)+`
21
+ `,{mode:G0}),G}if(typeof X.addresses!=="object")throw new Error(`Wallet file has invalid addresses field: ${Z}`);let z={seed:X.seed,addresses:X.addresses,createdAt:X.createdAt};if(X.mnemonic)z.mnemonic=X.mnemonic;return z}function t0($,Z){let Q=Z?p.resolve(Z):y2();if(!Z)R3();else{let X=p.dirname(Q);if(!b.existsSync(X))b.mkdirSync(X,{recursive:!0,mode:e})}return b.writeFileSync(Q,JSON.stringify($,null,2)+`
22
+ `,{mode:G0}),Q}var X0=E(()=>{L0();j0()});function P0(){return!("NO_COLOR"in process.env)}function E0($,Z){if(!P0())return $;return`\x1B[38;5;${Z}m${$}\x1B[0m`}function R($){if(!P0())return $;return`\x1B[1m${$}\x1B[0m`}function H($){if(!P0())return $;return`\x1B[2m${$}\x1B[0m`}function r($){return E0($,38)}function a($){return E0($,196)}function S($){return E0($,40)}function q0($){return E0($,226)}function D0($){return E0($,245)}function D($,Z=k2){let Q=` ${$} `,X=Z-Q.length;if(X<=0)return R(Q);let z=Math.floor(X/2),q=X-z;return R("═".repeat(z)+Q+"═".repeat(q))}function C($=k2){return H("─".repeat($))}function L($,Z,Q=16){let X=($+":").padEnd(Q);return` ${D0(X)}${Z}`}function C0($){let Z=$<0n,Q=Z?-$:$,X=BigInt(10**_1),z=Q/X,Y=(Q%X).toString().padStart(_1,"0");return`${Z?"-":""}${z}.${Y}`}function r0($){return`${C0($)} NIGHT`}function a0($){let Z=$<0n,Q=Z?-$:$,X=10n**BigInt(v2),z=Q/X,G=(Q%X).toString().padStart(v2,"0").replace(/0+$/,"").padEnd(6,"0");return`${Z?"-":""}${z}.${G}`}function s0($){return`${a0($)} DUST`}function v($,Z=!1){let Q=Z&&$.length>20?$.slice(0,10)+"…"+$.slice(-8):$;return r(Q)}function V0($,Z){let X=[`${S("✓")} ${$}`];if(Z)X.push(L("Transaction",r(Z)));return X.join(`
23
+ `)}var k2=60,v2=15;var c=()=>{};var u2={};f(u2,{default:()=>p2});import*as f2 from"fs";import*as e0 from"path";import{homedir as A3}from"os";import{generateMnemonic as E3,mnemonicToSeedSync as w2,validateMnemonic as D3}from"@scure/bip39";import{wordlist as h2}from"@scure/bip39/wordlists/english.js";async function p2($){let Z=d({args:$}),Q=_($,"output"),X=_($,"seed"),z=_($,"mnemonic");if(X!==void 0&&z!==void 0)throw new Error("Cannot specify both --seed and --mnemonic. Use one or the other.");let q=Q?e0.resolve(Q):e0.join(A3(),g,g0);if(f2.existsSync(q)&&!I($,"force"))throw new Error(`Wallet file already exists: ${q}
24
+ Use --force to overwrite, or --output <file> to save to a different path.`);let Y,G;if(X!==void 0){let U=X.replace(/^0x/,"");if(U.length!==64||!/^[0-9a-fA-F]+$/.test(U))throw new Error("Seed must be a 64-character hex string (32 bytes)");Y=Buffer.from(U,"hex")}else if(z!==void 0){if(!D3(z,h2))throw new Error("Invalid BIP-39 mnemonic. Expected 12 or 24 words from the English wordlist.");G=z,Y=Buffer.from(w2(G).slice(0,32))}else G=E3(h2,256),Y=Buffer.from(w2(G).slice(0,32));let K=U0(Y),J=K[Z],V={seed:Y.toString("hex"),addresses:K,createdAt:new Date().toISOString()};if(G)V.mnemonic=G;let j=t0(V,Q);if(I($,"json")){let U={addresses:K,activeAddress:J,activeNetwork:Z,seed:Y.toString("hex"),file:j,createdAt:V.createdAt};if(G)U.mnemonic=G;M(U);return}if(process.stdout.write(J+`
16
25
  `),process.stderr.write(`
17
- `+I("Wallet Generated")+`
26
+ `+D("Wallet Generated")+`
18
27
 
19
- `),process.stderr.write(W("Network",Z)+`
20
- `),process.stderr.write(W("Address",y(U))+`
21
- `),process.stderr.write(W("File",G)+`
28
+ `),process.stderr.write(L("Network",Z)+`
29
+ `),process.stderr.write(L("Address",v(J))+`
30
+ `),process.stderr.write(L("File",j)+`
22
31
  `),process.stderr.write(`
23
- `),K)process.stderr.write(j0(O(" MNEMONIC (save securely!):"))+`
24
- `),process.stderr.write(` ${K}
32
+ `),G)process.stderr.write(q0(R(" MNEMONIC (save securely!):"))+`
33
+ `),process.stderr.write(` ${G}
25
34
 
26
- `);process.stderr.write(j0(O(" SEED (hex):"))+`
35
+ `);process.stderr.write(q0(R(" SEED (hex):"))+`
27
36
  `),process.stderr.write(` ${Y.toString("hex")}
28
37
 
29
- `),process.stderr.write(A()+`
30
- `),process.stderr.write(V(" Next: midnight info | midnight balance")+`
38
+ `),process.stderr.write(C()+`
39
+ `),process.stderr.write(H(" Next: midnight info | midnight balance")+`
31
40
 
32
- `),process.stderr.write(i("✓")+` Wallet saved
33
- `)}var r1=M(()=>{A0();l();r();w()});var s1={};b(s1,{default:()=>t1});import*as v0 from"path";import{homedir as B2}from"os";async function t1($){let Z=_($,"wallet"),Q=f(Z),X=Z?v0.resolve(Z):v0.join(B2(),h,X0);if(P($,"json")){L({address:Q.address,network:Q.network,createdAt:Q.createdAt,file:X});return}process.stdout.write(Q.address+`
41
+ `),process.stderr.write(S("✓")+` Wallet saved
42
+ `)}var m2=E(()=>{j0();o();X0();c()});var g2={};f(g2,{default:()=>c2});async function c2($){let Z=u(_($,"wallet")),Q=m(Z),X=d({args:$}),z=Q.addresses[X];if(I($,"json")){M({addresses:Q.addresses,activeNetwork:X,activeAddress:z,createdAt:Q.createdAt,file:Z});return}process.stdout.write(z+`
34
43
  `),process.stderr.write(`
35
- `+I("Wallet Info")+`
44
+ `+D("Wallet Info")+`
36
45
 
37
- `),process.stderr.write(W("Address",y(Q.address))+`
38
- `),process.stderr.write(W("Network",Q.network)+`
39
- `),process.stderr.write(W("Created",Q.createdAt)+`
40
- `),process.stderr.write(W("File",X)+`
46
+ `);for(let[q,Y]of Object.entries(Q.addresses)){let G=q===X,K=G?R(q):q,J=G?" *":"";process.stderr.write(L(K+J,v(Y))+`
47
+ `)}process.stderr.write(`
48
+ `),process.stderr.write(L("Active Network",X)+`
49
+ `),process.stderr.write(L("Created",Q.createdAt)+`
50
+ `),process.stderr.write(L("File",Z)+`
51
+ `),process.stderr.write(H(" * = active network")+`
41
52
  `),process.stderr.write(`
42
- `+A()+`
53
+ `+C()+`
43
54
 
44
- `)}var e1=M(()=>{r();w();w()});import V2 from"ws";function $3($,Z,Q){return new Promise((X,z)=>{let q=new V2(Z,["graphql-transport-ws"]),Y=new Map,K=0,U=0,H=0,G=!1,J=!1,j,B=()=>{let E=new Map,v=0;for(let N of Y.values())if(!N.spent){v++;let c=E.get(N.tokenType)??0n;E.set(N.tokenType,c+N.value)}return{balances:E,utxoCount:v,txCount:K,highestTxId:U}},F=()=>{clearTimeout(j)},R=()=>{if(!J&&G&&(U===0||H>=U))J=!0,F(),q.send(JSON.stringify({id:"1",type:"complete"})),q.close(),X(B())};q.on("open",()=>{q.send(JSON.stringify({type:"connection_init"}))}),q.on("message",(E)=>{let v=JSON.parse(E.toString());switch(v.type){case"connection_ack":q.send(JSON.stringify({id:"1",type:"subscribe",payload:{query:F2,variables:{address:$}}}));break;case"next":{if(v.payload?.errors){let c=v.payload.errors[0]?.message||"Unknown GraphQL error";if(!J)J=!0,F(),q.close(),z(new Error(`GraphQL error: ${c}`));return}let N=v.payload?.data?.unshieldedTransactions;if(!N)return;if(N.__typename==="UnshieldedTransaction"){K++;let c=N;H=Math.max(H,c.transaction.id);for(let C of c.createdUtxos){let e=`${C.intentHash}:${C.outputIndex}`;Y.set(e,{value:BigInt(C.value),tokenType:C.tokenType,spent:!1})}for(let C of c.spentUtxos){let e=`${C.intentHash}:${C.outputIndex}`,$0=Y.get(e);if($0)$0.spent=!0}if(Q)Q(H,U);R()}else if(N.__typename==="UnshieldedTransactionsProgress")U=N.highestTransactionId,G=!0,R();break}case"error":if(!J)J=!0,F(),q.close(),z(new Error(`GraphQL subscription error: ${JSON.stringify(v.payload)}`));break;case"complete":break}}),q.on("error",(E)=>{if(!J)J=!0,F(),z(new Error(`WebSocket connection failed: ${E.message}`))}),q.on("close",()=>{if(!J)J=!0,F(),z(new Error(`Indexer closed the connection before balance sync completed. Indexer: ${Z}`))}),j=setTimeout(()=>{if(!J)J=!0,q.close(),z(new Error(`Balance check timed out after ${n0/1000}s. Indexer: ${Z}`))},n0)})}function V0($){return $===I1}var F2=`
55
+ `)}var d2=E(()=>{X0();o();c();c()});import C3 from"ws";function l2($,Z,Q){return new Promise((X,z)=>{let q=new C3(Z,["graphql-transport-ws"]),Y=new Map,G=0,K=0,J=0,V=!1,j=!1,U,W=()=>{let x=new Map,F=0;for(let O of Y.values())if(!O.spent){F++;let A=x.get(O.tokenType)??0n;x.set(O.tokenType,A+O.value)}return{balances:x,utxoCount:F,txCount:G,highestTxId:K}},B=()=>{clearTimeout(U)},P=()=>{if(!j&&V&&(K===0||J>=K))j=!0,B(),q.send(JSON.stringify({id:"1",type:"complete"})),q.close(),X(W())};q.on("open",()=>{q.send(JSON.stringify({type:"connection_init"}))}),q.on("message",(x)=>{let F=JSON.parse(x.toString());switch(F.type){case"connection_ack":q.send(JSON.stringify({id:"1",type:"subscribe",payload:{query:N3,variables:{address:$}}}));break;case"next":{if(F.payload?.errors){let A=F.payload.errors[0]?.message||"Unknown GraphQL error";if(!j)j=!0,B(),q.close(),z(new Error(`GraphQL error: ${A}`));return}let O=F.payload?.data?.unshieldedTransactions;if(!O)return;if(O.__typename==="UnshieldedTransaction"){G++;let A=O;J=Math.max(J,A.transaction.id);for(let k of A.createdUtxos){let h=`${k.intentHash}:${k.outputIndex}`;Y.set(h,{value:BigInt(k.value),tokenType:k.tokenType,spent:!1})}for(let k of A.spentUtxos){let h=`${k.intentHash}:${k.outputIndex}`,M0=Y.get(h);if(M0)M0.spent=!0}if(Q)Q(J,K);P()}else if(O.__typename==="UnshieldedTransactionsProgress")K=O.highestTransactionId,V=!0,P();break}case"error":if(!j)j=!0,B(),q.close(),z(new Error(`GraphQL subscription error: ${JSON.stringify(F.payload)}`));break;case"complete":break}}),q.on("error",(x)=>{if(!j)j=!0,B(),z(new Error(`WebSocket connection failed: ${x.message}`))}),q.on("close",()=>{if(!j)j=!0,B(),z(new Error(`Indexer closed the connection before balance sync completed. Indexer: ${Z}`))}),U=setTimeout(()=>{if(!j)j=!0,q.close(),z(new Error(`Balance check timed out after ${x1/1000}s. Indexer: ${Z}`))},x1)})}function N0($){return $===H2}var N3=`
45
56
  subscription UnshieldedTransactions($address: UnshieldedAddress!) {
46
57
  unshieldedTransactions(address: $address) {
47
58
  __typename
@@ -55,151 +66,159 @@ Use --force to overwrite, or --output <file> to save to a different path.`);let
55
66
  }
56
67
  }
57
68
  }
58
- `;var Z3=()=>{};function x($){if(!z0())return process.stderr.write(`⠋ ${$}`),{update(q){process.stderr.write(`\r⠋ ${q}`)},stop(q){let Y=q??$;process.stderr.write(`\r✓ ${Y}
59
- `)}};let Z=0,Q=$,X=()=>{let q=W0(Q3[Z]);process.stderr.write(`\r${q} ${Q}\x1B[K`),Z=(Z+1)%Q3.length};X();let z=setInterval(X,L2);return{update(q){Q=q},stop(q){clearInterval(z);let Y=q??Q;process.stderr.write(`\r\x1B[32m✓\x1B[0m ${Y}\x1B[K
60
- `)}}}var Q3,L2=80;var q0=M(()=>{Q3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]});var z3={};b(z3,{default:()=>X3});async function X3($){let Z,Q;if($.subcommand)Z=$.subcommand;else{let U=_($,"wallet"),H=f(U);Z=H.address,Q=H.network}if(!Z)throw new Error("No address provided and no wallet file found.");let{name:X,config:z}=g({args:$,walletNetwork:Q,address:Z}),Y=_($,"indexer-ws")??z.indexerWS,K=x(`Checking balance on ${X}...`);try{let U=await $3(Z,Y,(H,G)=>{if(G>0){let J=Math.round(H/G*100);K.update(`Syncing transactions... ${J}%`)}});if(K.stop(`Synced ${U.txCount} transactions`),P($,"json")){let H={};for(let[G,J]of U.balances){let j=V0(G)?"NIGHT":G;H[j]=V0(G)?B0(J):J.toString()}L({address:Z,network:X,balances:H,utxoCount:U.utxoCount,txCount:U.txCount});return}if(U.balances.size===0)process.stdout.write(`0
61
- `);else for(let[H,G]of U.balances)if(V0(H))process.stdout.write(`NIGHT=${G}
62
- `);else process.stdout.write(`${H}=${G}
69
+ `;var i2=()=>{};function n2($){return $.replace(/\x1b\[[0-9;]*m/g,"")}function w($){let Z=!1;if(!P0()){let G=$;process.stderr.write(`⠋ ${G}`);let K={update(J){G=J,process.stderr.write(`\r⠋ ${G}\x1B[K`)},stop(J){if(Z)return;Z=!0,$1=null,process.stderr.write(`\r✓ ${J??G}\x1B[K
70
+ `)},log(J){process.stderr.write(`\r\x1B[K${J}
71
+ `),process.stderr.write(`⠋ ${G}`)}};return $1=K,K}let Q=0,X=$,z=()=>{let G=r(o2[Q]),J=(process.stderr.columns||80)-4,V=X;if(n2(V).length>J)V=n2(V).slice(0,J);process.stderr.write(`\r${G} ${V}\x1B[K`),Q=(Q+1)%o2.length};z();let q=setInterval(z,y3),Y={update(G){X=G},stop(G){if(Z)return;Z=!0,clearInterval(q),$1=null;let K=G??X;process.stderr.write(`\r\x1B[32m✓\x1B[0m ${K}\x1B[K
72
+ `)},log(G){process.stderr.write(`\r\x1B[K${G}
73
+ `),z()}};return $1=Y,Y}var o2,y3=80,$1=null;var B0=E(()=>{o2=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]});var r2={};f(r2,{default:()=>t2});async function t2($){let{name:Z,config:Q}=t({args:$}),X;if($.subcommand)X=$.subcommand;else X=m(u(_($,"wallet"))).addresses[Z];if(!X)throw new Error("No address provided and no wallet file found.");z0(Q,{proofServer:_($,"proof-server"),node:_($,"node"),indexerWS:_($,"indexer-ws")});let z=w(`Checking balance on ${Z}...`);try{let q=await l2(X,Q.indexerWS,(Y,G)=>{if(G>0){let K=Math.round(Y/G*100);z.update(`Syncing transactions... ${K}%`)}});if(z.stop(`Synced ${q.txCount} transactions`),I($,"json")){let Y={};for(let[G,K]of q.balances){let J=N0(G)?"NIGHT":G;Y[J]=N0(G)?C0(K):K.toString()}M({address:X,network:Z,balances:Y,utxoCount:q.utxoCount,txCount:q.txCount});return}if(q.balances.size===0)process.stdout.write(`0
74
+ `);else for(let[Y,G]of q.balances)if(N0(Y))process.stdout.write(`NIGHT=${G}
75
+ `);else process.stdout.write(`${Y}=${G}
63
76
  `);if(process.stderr.write(`
64
- `+I("Balance")+`
77
+ `+D("Balance")+`
65
78
 
66
- `),process.stderr.write(W("Address",y(Z))+`
67
- `),process.stderr.write(W("Network",X)+`
68
- `),process.stderr.write(W("UTXOs",U.utxoCount.toString())+`
69
- `),process.stderr.write(W("Transactions",U.txCount.toString())+`
79
+ `),process.stderr.write(L("Address",v(X))+`
80
+ `),process.stderr.write(L("Network",Z)+`
81
+ `),process.stderr.write(L("UTXOs",q.utxoCount.toString())+`
82
+ `),process.stderr.write(L("Transactions",q.txCount.toString())+`
70
83
  `),process.stderr.write(`
71
- `),U.balances.size===0)process.stderr.write(` ${V("No balance found")}
72
- `);else for(let[H,G]of U.balances)if(V0(H))process.stderr.write(W("NIGHT",O(x0(G)))+`
73
- `);else{let J=H.slice(0,8)+"…"+H.slice(-8);process.stderr.write(W(`Token ${J}`,O(G.toString()))+`
84
+ `),q.balances.size===0)process.stderr.write(` ${H("No balance found")}
85
+ `);else for(let[Y,G]of q.balances)if(N0(Y))process.stderr.write(L("NIGHT",R(r0(G)))+`
86
+ `);else{let K=Y.slice(0,8)+"…"+Y.slice(-8);process.stderr.write(L(`Token ${K}`,R(G.toString()))+`
74
87
  `)}process.stderr.write(`
75
- `+A()+`
88
+ `+C()+`
76
89
 
77
- `)}catch(U){throw K.stop("Failed"),U}}var q3=M(()=>{r();l();Z3();w();q0()});var G3={};b(G3,{default:()=>Y3});async function Y3($){let Z=P1($,"seed","hex").replace(/^0x/,"");if(Z.length!==64||!/^[0-9a-fA-F]+$/.test(Z))throw new Error("Seed must be a 64-character hex string (32 bytes)");let Q=_($,"index"),X=Q!==void 0?parseInt(Q,10):0;if(isNaN(X)||X<0||!Number.isInteger(Number(Q??"0")))throw new Error("Key index must be a non-negative integer");let z=Buffer.from(Z,"hex"),q=a({args:$}),Y=Q0(z,q,X),K=`m/44'/2400'/0'/NightExternal/${X}`;if(P($,"json")){L({address:Y,network:q,index:X,path:K});return}process.stdout.write(Y+`
90
+ `)}catch(q){throw z.stop("Failed"),q}}var a2=E(()=>{X0();o();Q0();i2();c();B0()});var e2={};f(e2,{default:()=>s2});async function s2($){let Z=B2($,"seed","hex").replace(/^0x/,"");if(Z.length!==64||!/^[0-9a-fA-F]+$/.test(Z))throw new Error("Seed must be a 64-character hex string (32 bytes)");let Q=_($,"index"),X=Q!==void 0?parseInt(Q,10):0;if(isNaN(X)||X<0||!Number.isInteger(Number(Q??"0")))throw new Error("Key index must be a non-negative integer");let z=Buffer.from(Z,"hex"),q=d({args:$}),Y=J0(z,q,X),G=`m/44'/2400'/0'/NightExternal/${X}`;if(I($,"json")){M({address:Y,network:q,index:X,path:G});return}process.stdout.write(Y+`
78
91
  `),process.stderr.write(`
79
- `),process.stderr.write(W("Network",q)+`
80
- `),process.stderr.write(W("Index",X.toString())+`
81
- `),process.stderr.write(W("Address",y(Y))+`
82
- `),process.stderr.write(W("Path",V(K))+`
83
- `),process.stderr.write(A()+`
92
+ `),process.stderr.write(L("Network",q)+`
93
+ `),process.stderr.write(L("Index",X.toString())+`
94
+ `),process.stderr.write(L("Address",v(Y))+`
95
+ `),process.stderr.write(L("Path",H(G))+`
96
+ `),process.stderr.write(C()+`
84
97
 
85
- `)}var J3=M(()=>{A0();l();w()});var U3={};b(U3,{default:()=>K3});async function K3($){let Z=a({args:$}),Q=Buffer.from(R0,"hex"),X=Q0(Q,Z);if(P($,"json")){L({address:X,network:Z});return}process.stdout.write(X+`
98
+ `)}var $$=E(()=>{j0();o();c()});var Q$={};f(Q$,{default:()=>Z$});async function Z$($){let Z=d({args:$}),Q=Buffer.from(m0,"hex"),X=J0(Q,Z);if(I($,"json")){M({address:X,network:Z});return}process.stdout.write(X+`
86
99
  `),process.stderr.write(`
87
- `),process.stderr.write(W("Network",Z)+`
88
- `),process.stderr.write(W("Address",y(X))+`
89
- `),process.stderr.write(W("Seed",V("0x01 (genesis)"))+`
90
- `),process.stderr.write(A()+`
100
+ `),process.stderr.write(L("Network",Z)+`
101
+ `),process.stderr.write(L("Address",v(X))+`
102
+ `),process.stderr.write(L("Seed",H("0x01 (genesis)"))+`
103
+ `),process.stderr.write(C()+`
91
104
 
92
- `)}var H3=M(()=>{A0();l();w()});var B3={};b(B3,{default:()=>j3});import*as W3 from"@midnight-ntwrk/ledger-v7";function F0($,Z,Q){let X={readTime:0n,computeTime:0n,blockUsage:0n,bytesWritten:0n,bytesChurned:0n};X[Z]=Q;let q=$.normalizeFullness(X)[Z];return Math.round(Number(Q)/q)}function P2($){return{readTime:F0($,"readTime",1000000000n),computeTime:F0($,"computeTime",1000000000n),blockUsage:F0($,"blockUsage",10000n),bytesWritten:F0($,"bytesWritten",10000n),bytesChurned:F0($,"bytesChurned",1000000n)}}async function j3($){let Z=W3.LedgerParameters.initialParameters(),Q=P2(Z);if(P($,"json")){L(Q);return}for(let[X,z]of Object.entries(Q))process.stdout.write(`${X}=${z}
105
+ `)}var X$=E(()=>{j0();o();c()});var Y$={};f(Y$,{default:()=>q$});import*as z$ from"@midnight-ntwrk/ledger-v7";function y0($,Z,Q){let X={readTime:0n,computeTime:0n,blockUsage:0n,bytesWritten:0n,bytesChurned:0n};X[Z]=Q;let q=$.normalizeFullness(X)[Z];return Math.round(Number(Q)/q)}function b3($){return{readTime:y0($,"readTime",1000000000n),computeTime:y0($,"computeTime",1000000000n),blockUsage:y0($,"blockUsage",10000n),bytesWritten:y0($,"bytesWritten",10000n),bytesChurned:y0($,"bytesChurned",1000000n)}}async function q$($){let Z=z$.LedgerParameters.initialParameters(),Q=b3(Z);if(I($,"json")){M(Q);return}for(let[X,z]of Object.entries(Q))process.stdout.write(`${X}=${z}
93
106
  `);process.stderr.write(`
94
- `+I("Block Limits")+`
107
+ `+D("Block Limits")+`
95
108
 
96
- `),process.stderr.write(V(" Derived from LedgerParameters.initialParameters()")+`
109
+ `),process.stderr.write(H(" Derived from LedgerParameters.initialParameters()")+`
97
110
 
98
- `);for(let[X,z]of Object.entries(Q)){let q=M2[X]??"";process.stderr.write(W(X,`${O(z.toLocaleString())} ${V(q)}`)+`
111
+ `);for(let[X,z]of Object.entries(Q)){let q=S3[X]??"";process.stderr.write(L(X,`${R(z.toLocaleString())} ${H(q)}`)+`
99
112
  `)}process.stderr.write(`
100
- `+A()+`
101
- `),process.stderr.write(V(" bytesWritten is typically the tightest constraint")+`
102
- `),process.stderr.write(V(" for large contract deployments.")+`
103
-
104
- `)}var M2;var V3=M(()=>{w();M2={readTime:"picoseconds",computeTime:"picoseconds",blockUsage:"bytes",bytesWritten:"bytes",bytesChurned:"bytes"}});import{HDWallet as O2,Roles as Z1}from"@midnight-ntwrk/wallet-sdk-hd";function Q1($,Z){let Q=O2.fromSeed($);if(Q.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let X=Q.hdWallet.selectAccount(0).selectRole(Z).deriveKeyAt(0);if(X.type==="keyOutOfBounds")throw new Error("Key derivation out of bounds");return X.key}function F3($){return Q1($,Z1.Zswap)}function L3($){return Q1($,Z1.NightExternal)}function P3($){return Q1($,Z1.Dust)}var M3=()=>{};import{ShieldedWallet as _2}from"@midnight-ntwrk/wallet-sdk-shielded";import{UnshieldedWallet as A2,createKeystore as I2,PublicKey as R2,InMemoryTransactionHistoryStorage as T2}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{DustWallet as D2}from"@midnight-ntwrk/wallet-sdk-dust-wallet";import{WalletFacade as y2}from"@midnight-ntwrk/wallet-sdk-facade";import*as Y0 from"@midnight-ntwrk/ledger-v7";import{NetworkId as X1}from"@midnight-ntwrk/wallet-sdk-abstractions";import*as G0 from"rxjs";function L0($,Z){let Q=E2[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);let X=F3($),z=L3($),q=P3($),Y=Y0.ZswapSecretKeys.fromSeed(X),K=Y0.DustSecretKey.fromSeed(q),U=I2(z,Q),H={networkId:Q,indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},G={networkId:Q,indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},txHistoryStorage:new T2},J={networkId:Q,costParameters:{additionalFeeOverhead:T1,feeBlocksMargin:D1},indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},j=_2(H).startWithSecretKeys(Y),B=A2(G).startWithPublicKey(R2.fromKeyStore(U)),F=D2(J).startWithSecretKey(K,Y0.LedgerParameters.initialParameters().dust);return{facade:new y2(j,B,F),keystore:U,zswapSecretKeys:Y,dustSecretKey:K}}function O3($){let Z=$.shielded?.state?.progress?.isStrictlyComplete()??!1,Q=$.unshielded?.progress?.isStrictlyComplete()??!1,X=$.dust?.state?.progress?.isStrictlyComplete()??!1;if(!X)try{let z=$.dust?.state?.progress;if(z&&z.appliedIndex>=z.highestRelevantWalletIndex)X=!0}catch{}return Z&&Q&&X}function x2($){if($.dust?.state?.progress?.isStrictlyComplete())return!1;try{let Z=$.dust?.state?.progress;if(Z&&Z.appliedIndex>=Z.highestRelevantWalletIndex)return!1}catch{}return!0}async function P0($,Z,Q,X){let{facade:z,zswapSecretKeys:q,dustSecretKey:Y}=$;return await z.start(q,Y),new Promise((K,U)=>{let H=!1,G=setTimeout(()=>{if(!H)U(new Error("Wallet sync timed out"))},X??y1);$.keepAlive=z.state().subscribe({next:(J)=>{if(H)return;if(Z){let j=J.unshielded.progress;if(j){let B=Number(j.appliedId),F=Number(j.highestTransactionId);Z(Math.min(B,F),F)}}if(Q)try{let j=[];if(!J.shielded?.state?.progress?.isStrictlyComplete())j.push("shielded");if(x2(J))j.push("dust");if(!J.unshielded?.progress?.isStrictlyComplete())j.push("unshielded");if(j.length>0)Q(j.join(", "))}catch{}if(O3(J))H=!0,clearTimeout(G),K(J)},error:(J)=>{if(!H)clearTimeout(G),U(J)}})})}async function z1($){return G0.firstValueFrom($.facade.state().pipe(G0.filter((Z)=>O3(Z)),G0.timeout(E1)))}async function M0($){$.keepAlive?.unsubscribe(),await Promise.race([$.facade.stop(),new Promise((Z)=>setTimeout(Z,5000))])}function b0($){let Z=(X)=>{let z=X?._tag;if(typeof z==="string"&&z.startsWith("Wallet.")){let q=X?.message??"transient error";$?.(z,q);return}Q("Unhandled rejection:",X),process.exit(1)},Q=console.error;return console.error=(...X)=>{let z=X[0];if(typeof z==="object"&&z?._tag?.startsWith("Wallet.")){$?.(z._tag,z?.message??"transient error");return}if(typeof z==="string"&&z.startsWith("Wallet.")){$?.("Wallet.Sync","transient error");return}Q(...X)},process.on("unhandledRejection",Z),()=>{process.removeListener("unhandledRejection",Z),console.error=Q}}var E2;var q1=M(()=>{M3();E2={PreProd:X1.NetworkId.PreProd,Preview:X1.NetworkId.Preview,Undeployed:X1.NetworkId.Undeployed}});import*as J1 from"@midnight-ntwrk/ledger-v7";import{MidnightBech32m as N2,UnshieldedAddress as C2}from"@midnight-ntwrk/wallet-sdk-address-format";import{NetworkId as Y1}from"@midnight-ntwrk/wallet-sdk-abstractions";function v2($){if($<=0)throw new Error("Amount must be greater than 0");if(!Number.isFinite($))throw new Error("Amount must be a finite number");let Z=$.toFixed(6),[Q,X]=Z.split("."),z=Q+(X??"").padEnd(6,"0"),q=BigInt(z);if(q<=0n)throw new Error("Amount too small — minimum is 0.000001 NIGHT");return q}function S0($){let Z=Number($);if(Number.isNaN(Z)||!Number.isFinite(Z))throw new Error(`Invalid amount: "${$}" — must be a positive number`);if(Z<=0)throw new Error(`Invalid amount: "${$}" — must be greater than 0`);return Z}function b2($,Z){let Q=w2[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);try{N2.parse($).decode(C2,Q)}catch(X){throw new Error(`Invalid recipient address: ${X.message}
105
- Expected a bech32m address for network "${Z.networkId}"`)}}function k2($){let Z=$;while(Z){let Q=String(Z?.message??"").toLowerCase();if(Q.includes("submission error"))return!0;if(Q.includes("transaction")&&Q.includes("invalid"))return!0;if(Q.includes("138"))return!0;let X=Z?._tag;if(X==="TransactionInvalidError"||X==="SubmissionError")return!0;Z=Z.cause}return!1}function _3($){let Z=$?.message?.toLowerCase()??"";return Z.includes("not enough dust")||Z.includes("dust generated")||Z.includes("insufficient funds")||Z.includes("no dust tokens")||k2($)}function k0($){let Z=$<0n?-$:$,Q=Z/1000000000000000n,X=Z%1000000000000000n;return`${$<0n?"-":""}${Q}.${X.toString().padStart(15,"0").slice(0,6)}`}function G1($){let Z=Math.round($/1000);if(Z<60)return`${Z}s`;let Q=Math.floor(Z/60),X=Z%60;return`${Q}m ${X}s`}function K1(){let{warn:$,error:Z}=console,Q=(X)=>X.some((z)=>String(z).includes("RPC-CORE"));return console.warn=(...X)=>{if(!Q(X))$(...X)},console.error=(...X)=>{if(!Q(X))Z(...X)},()=>{console.warn=$,console.error=Z}}async function S2($,Z,Q){let X=new Date(Date.now()+a0*60*1000);await Promise.race([$.facade.dust.waitForSyncedState(),new Promise((H,G)=>setTimeout(()=>G(new Error("Insufficient funds: dust wallet sync timed out")),T0))]);let z=await $.facade.dust.createDustGenerationTransaction(new Date,X,Z,$.keystore.getPublicKey(),Q),q=z.intents?.get(1);if(!q)throw new Error("Dust generation intent not found on transaction");let Y=$.keystore.signData(q.signatureData(1)),K=await $.facade.dust.addDustGenerationSignature(z,Y),U=await $.facade.finalizeTransaction(K);return await $.facade.submitTransaction(U)}async function h2($,Z,Q,X){let z=Date.now(),q=z+C1,Y,K=!1,U=setInterval(()=>{if(K&&X){let H=G1(Date.now()-z);X(`Waiting for dust generation capacity (${H} elapsed, ~5 min on fresh wallets)...`)}},1000);try{while(Date.now()<q)try{return await S2($,Z,Q)}catch(H){if(Y=H,_3(H)&&Date.now()+r0<q){K=!0;let G=G1(Date.now()-z);X?.(`Waiting for dust generation capacity (${G} elapsed, ~5 min on fresh wallets)...`),await new Promise((J)=>setTimeout(J,r0));continue}throw H}throw Y??new Error("Dust registration timed out")}finally{clearInterval(U)}}async function h0($,Z,Q){let X=Q??await $.facade.waitForSyncedState();if(X.dust.availableCoins.length>0||X.dust.walletBalance(new Date)>0n)return Z?.("Dust available"),{alreadyAvailable:!0};let z=X.unshielded.availableCoins.filter((K)=>K.meta?.registeredForDustGeneration!==!0),q;if(z.length>0){Z?.(`Registering ${z.length} UTXO(s) for dust generation...`);let K=z.map((U)=>({...U.utxo,ctime:new Date(U.meta.ctime)}));q=await h2($,K,X.dust.dustAddress,Z)}else Z?.("UTXOs already registered, waiting for dust generation...");Z?.("Waiting for dust tokens...");let Y=Date.now();while(Date.now()-Y<o0){try{if((await Promise.race([$.facade.waitForSyncedState(),new Promise((U,H)=>setTimeout(()=>H(new Error("Poll sync timed out")),T0))])).dust.walletBalance(new Date)>0n)return Z?.("Dust available"),{alreadyAvailable:!1,txHash:q}}catch{}await new Promise((K)=>setTimeout(K,5000))}throw new Error("Timed out waiting for dust tokens. Try running: midnight dust register")}async function f2($,Z,Q,X,z,q){let Y=Date.now(),K=Y+o0,U,H=0;while(!0)try{if(U)await z1($);let G=new Date(Date.now()+a0*60*1000),J=await $.facade.transferTransaction([{type:"unshielded",outputs:[{amount:Q,receiverAddress:Z,type:J1.unshieldedToken().raw}]}],{shieldedSecretKeys:$.zswapSecretKeys,dustSecretKey:$.dustSecretKey},{ttl:G,payFees:!0}),j=await $.facade.signRecipe(J,(R)=>$.keystore.signData(R));X?.();let B=await Promise.race([$.facade.finalizeRecipe(j),new Promise((R,E)=>{setTimeout(()=>E(new Error("ZK proof generation timed out")),x1)})]);return z?.(),await $.facade.submitTransaction(B)}catch(G){if(U=G,(G?.code===w1||G?.message?.includes("115")||G?.message?.toLowerCase().includes("stale"))&&++H<N1)continue;if(_3(G)&&Date.now()<K){let j=G1(Date.now()-Y);q?.(`Dust insufficient, re-ensuring (${j} elapsed)...`);try{let B=await z1($),F=B.dust.walletBalance(new Date);if(F>0n&&F<U0)throw new Error(`Insufficient dust for transaction fees.
106
- Available: ${k0(F)} DUST, need ≥${k0(U0)} DUST.
113
+ `+C()+`
114
+ `),process.stderr.write(H(" bytesWritten is typically the tightest constraint")+`
115
+ `),process.stderr.write(H(" for large contract deployments.")+`
116
+
117
+ `)}var S3;var G$=E(()=>{c();S3={readTime:"picoseconds",computeTime:"picoseconds",blockUsage:"bytes",bytesWritten:"bytes",bytesChurned:"bytes"}});import{HDWallet as v3,Roles as u1}from"@midnight-ntwrk/wallet-sdk-hd";function m1($,Z){let Q=v3.fromSeed($);if(Q.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let X=Q.hdWallet.selectAccount(0).selectRole(Z).deriveKeyAt(0);if(X.type==="keyOutOfBounds")throw new Error("Key derivation out of bounds");return X.key}function K$($){return m1($,u1.Zswap)}function J$($){return m1($,u1.NightExternal)}function U$($){return m1($,u1.Dust)}var j$=()=>{};function Z1(){V$=!0}function T($,Z){if(!V$)return;let Q=new Date().toISOString().slice(11,23);process.stderr.write(H(` [${Q}] ${$}: ${Z}`)+`
118
+ `)}var V$=!1;var b0=()=>{};import{ShieldedWallet as B$}from"@midnight-ntwrk/wallet-sdk-shielded";import{UnshieldedWallet as H$,createKeystore as k3,PublicKey as w3,InMemoryTransactionHistoryStorage as h3}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{DustWallet as W$}from"@midnight-ntwrk/wallet-sdk-dust-wallet";import{WalletFacade as L$}from"@midnight-ntwrk/wallet-sdk-facade";import*as F0 from"@midnight-ntwrk/ledger-v7";import{NetworkId as c1}from"@midnight-ntwrk/wallet-sdk-abstractions";import*as s from"rxjs";async function S0($,Z,Q){let X=f3[Z.networkId];if(X===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);T("facade",`Building facade for network ${Z.networkId}`),T("facade",`Node: ${Z.node}`),T("facade",`Indexer: ${Z.indexerWS}`),T("facade",`Proof server: ${Z.proofServer}`);let z=K$($),q=J$($),Y=U$($),G=F0.ZswapSecretKeys.fromSeed(z),K=F0.DustSecretKey.fromSeed(Y),J=k3(q,X),V={networkId:X,indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},costParameters:{additionalFeeOverhead:W2,feeBlocksMargin:L2},txHistoryStorage:new h3,provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},j=()=>L$.init({configuration:V,shielded:(B)=>B$(B).startWithSecretKeys(G),unshielded:(B)=>H$(B).startWithPublicKey(w3.fromKeyStore(J)),dust:(B)=>W$(B).startWithSecretKey(K,F0.LedgerParameters.initialParameters().dust)}),U=!1,W;if(Q){T("facade","Restoring from cache...");try{W=await L$.init({configuration:V,shielded:(B)=>B$(B).restore(Q.shielded),unshielded:(B)=>H$(B).restore(Q.unshielded),dust:(B)=>W$(B).restore(Q.dust)}),U=!0,T("facade","Cache restore successful")}catch(B){T("facade",`Cache restore failed: ${B.message}`),process.stderr.write(` Cache restore failed, building from scratch: ${B.message}
119
+ `),W=await j()}}else T("facade","No cache, building fresh"),W=await j();return{facade:W,keystore:J,zswapSecretKeys:G,dustSecretKey:K,restoredFromCache:U}}function P$($,Z="full"){let Q=$.unshielded?.progress?.isStrictlyComplete()??!1,X=$.dust?.state?.progress?.isStrictlyComplete()??!1;if(!X)try{let q=$.dust?.state?.progress;if(q&&q.highestRelevantWalletIndex>0&&q.appliedIndex>=q.highestRelevantWalletIndex)X=!0}catch{}if(Z==="lite")return Q&&X;return($.shielded?.state?.progress?.isStrictlyComplete()??!1)&&Q&&X}function p3($){if($.dust?.state?.progress?.isStrictlyComplete())return!1;try{let Z=$.dust?.state?.progress;if(Z&&Z.highestRelevantWalletIndex>0&&Z.appliedIndex>=Z.highestRelevantWalletIndex)return!1}catch{}return!0}async function v0($,Z={}){let{onProgress:Q,onSyncDetail:X,timeoutMs:z,syncMode:q="full"}=Z,{facade:Y,zswapSecretKeys:G,dustSecretKey:K}=$;T("sync","Starting facade (connecting to node and indexer)..."),await Y.start(G,K),T("sync","Facade started, subscribing to state...");let J=z??P2;return T("sync",`Sync timeout: ${J/1000}s, mode: ${q}`),new Promise((V,j)=>{let U=!1,W=0,B="",P=null,x=setTimeout(()=>{if(!U){if(T("sync",`Sync timed out after ${J/1000}s (${W} emissions)`),P)try{let F=P.unshielded?.progress;T("sync",` unshielded: applied=${F?.appliedId} highest=${F?.highestTransactionId} complete=${F?.isStrictlyComplete()}`);let O=P.dust?.state?.progress;if(T("sync",` dust: applied=${O?.appliedIndex} highest=${O?.highestRelevantWalletIndex} complete=${O?.isStrictlyComplete?.()} connected=${O?.isConnected}`),q==="full"){let A=P.shielded?.state?.progress;T("sync",` shielded: complete=${A?.isStrictlyComplete()}`)}}catch{}j(new Error("Wallet sync timed out"))}},J);$.keepAlive=Y.state().subscribe({next:(F)=>{if(U)return;if(W++,P=F,Q){let A=F.unshielded.progress;if(A){let k=Number(A.appliedId),h=Number(A.highestTransactionId);Q(Math.min(k,h),h)}}let O=[];try{if(q==="full"&&!F.shielded?.state?.progress?.isStrictlyComplete())O.push("shielded");if(p3(F))O.push("dust");if(!F.unshielded?.progress?.isStrictlyComplete())O.push("unshielded")}catch{}if(O.length>0){X?.(O.join(", "));let A=O.join(",");if(W===1||A!==B||W%100===0)T("sync",`Waiting on: ${O.join(", ")} (emission #${W})`),B=A}if(P$(F,q))U=!0,clearTimeout(x),T("sync",`Sync complete after ${W} emissions`),V(F)},error:(F)=>{if(!U)T("sync",`Sync error: ${F.message}`),clearTimeout(x),j(F)}})})}async function g1($){let Z=(Q)=>{let X=Q.unshielded?.progress?.isStrictlyComplete()??!1,z=Q.dust?.state?.progress?.isStrictlyComplete()??!1;return X&&z};try{return await s.firstValueFrom($.facade.state().pipe(s.filter(Z),s.timeout(15000)))}catch{return await s.firstValueFrom($.facade.state())}}async function d1($,Z="full"){return s.firstValueFrom($.facade.state().pipe(s.filter((Q)=>P$(Q,Z)),s.timeout(O2)))}async function k0($){$.keepAlive?.unsubscribe(),await Promise.race([$.facade.stop(),new Promise((Z)=>setTimeout(Z,5000))])}function Q1($){let Z=(X)=>{let z=X?._tag;if(typeof z==="string"&&z.startsWith("Wallet.")){let q=X?.message??"transient error";$?.(z,q);return}Q("Unhandled rejection:",X),process.exit(1)},Q=console.error;return console.error=(...X)=>{let z=X[0];if(typeof z==="object"&&z?._tag?.startsWith("Wallet.")){$?.(z._tag,z?.message??"transient error");return}if(typeof z==="string"&&z.startsWith("Wallet.")){$?.("Wallet.Sync","transient error");return}Q(...X)},process.on("unhandledRejection",Z),()=>{process.removeListener("unhandledRejection",Z),console.error=Q}}var f3;var l1=E(()=>{j$();b0();f3={PreProd:c1.NetworkId.PreProd,Preview:c1.NetworkId.Preview,Undeployed:c1.NetworkId.Undeployed}});import{existsSync as z1,mkdirSync as u3,writeFileSync as m3,readFileSync as c3,unlinkSync as X1,readdirSync as i1,renameSync as g3}from"node:fs";import{join as H0,dirname as d3}from"node:path";import{homedir as F$}from"node:os";import{randomBytes as l3}from"node:crypto";function o1($,Z,Q){let X=Q??H0(F$(),g,C1),z=$.slice(0,20);return H0(X,Z,`${z}.json`)}function w0($,Z,Q){let X=o1($,Z,Q);if(!z1(X))return null;try{let z=c3(X,"utf-8"),q=JSON.parse(z);if(q.version!==D1)return null;if(q.network!==Z)return null;if(q.address!==$)return null;if(!q.wallets||typeof q.wallets.shielded!=="string"||typeof q.wallets.unshielded!=="string"||typeof q.wallets.dust!=="string")return null;return q.wallets}catch{return null}}async function O0($,Z,Q,X){let[z,q,Y]=await Promise.all([Q.shielded.serializeState(),Q.unshielded.serializeState(),Q.dust.serializeState()]),G={version:D1,network:Z,address:$,timestamp:new Date().toISOString(),wallets:{shielded:z,unshielded:q,dust:Y}},K=o1($,Z,X),J=d3(K);if(!z1(J))u3(J,{recursive:!0,mode:e});let V=K+`.tmp.${l3(4).toString("hex")}`;try{m3(V,JSON.stringify(G),{mode:G0}),g3(V,K)}catch(j){try{X1(V)}catch{}throw j}}function q1($,Z,Q){let X=Q??H0(F$(),g,C1);if($&&Z){let z=o1($,Z,Q);try{X1(z)}catch{}return}if(Z){let z=H0(X,Z);if(!z1(z))return;try{for(let q of i1(z))if(q.endsWith(".json"))X1(H0(z,q))}catch{}return}if(!z1(X))return;try{for(let z of i1(X)){let q=H0(X,z);try{for(let Y of i1(q))if(Y.endsWith(".json"))X1(H0(q,Y))}catch{}}}catch{}}var Y1=()=>{};import*as r1 from"@midnight-ntwrk/ledger-v7";import{MidnightBech32m as i3,UnshieldedAddress as o3}from"@midnight-ntwrk/wallet-sdk-address-format";import{NetworkId as n1}from"@midnight-ntwrk/wallet-sdk-abstractions";function t3($){if($<=0)throw new Error("Amount must be greater than 0");if(!Number.isFinite($))throw new Error("Amount must be a finite number");let Z=$.toFixed(6),[Q,X]=Z.split("."),z=Q+(X??"").padEnd(6,"0"),q=BigInt(z);if(q<=0n)throw new Error("Amount too small — minimum is 0.000001 NIGHT");return q}function K1($){let Z=Number($);if(Number.isNaN(Z)||!Number.isFinite(Z))throw new Error(`Invalid amount: "${$}" — must be a positive number`);if(Z<=0)throw new Error(`Invalid amount: "${$}" — must be greater than 0`);return Z}function r3($,Z){let Q=n3[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);try{return i3.parse($).decode(o3,Q)}catch(X){throw new Error(`Invalid recipient address: ${X.message}
120
+ Expected a bech32m address for network "${Z.networkId}"`)}}function a3($){let Z=$;while(Z){let Q=String(Z?.message??"").toLowerCase();if(Q.includes("submission error"))return!0;if(Q.includes("transaction")&&Q.includes("invalid"))return!0;if(Q.includes("138"))return!0;let X=Z?._tag;if(X==="TransactionInvalidError"||X==="SubmissionError")return!0;Z=Z.cause}return!1}function O$($){let Z=$?.message?.toLowerCase()??"";return Z.includes("not enough dust")||Z.includes("dust generated")||Z.includes("insufficient funds")||Z.includes("no dust tokens")||a3($)}function G1($){let Z=$<0n?-$:$,Q=Z/1000000000000000n,X=Z%1000000000000000n;return`${$<0n?"-":""}${Q}.${X.toString().padStart(15,"0").slice(0,6)}`}function t1($){let Z=Math.round($/1000);if(Z<60)return`${Z}s`;let Q=Math.floor(Z/60),X=Z%60;return`${Q}m ${X}s`}function a1(){let{warn:$,error:Z}=console,Q=(X)=>X.some((z)=>String(z).includes("RPC-CORE"));return console.warn=(...X)=>{if(!Q(X))$(...X)},console.error=(...X)=>{if(!Q(X))Z(...X)},()=>{console.warn=$,console.error=Z}}async function s3($,Z,Q){let X=new Date(Date.now()+A1*60*1000);await Promise.race([$.facade.dust.waitForSyncedState(),new Promise((J,V)=>setTimeout(()=>V(new Error("Insufficient funds: dust wallet sync timed out")),c0))]);let z=await $.facade.dust.createDustGenerationTransaction(new Date,X,Z,$.keystore.getPublicKey(),Q),q=z.intents?.get(1);if(!q)throw new Error("Dust generation intent not found on transaction");let Y=$.keystore.signData(q.signatureData(1)),G=await $.facade.dust.addDustGenerationSignature(z,Y),K=await $.facade.finalizeTransaction(G);return await $.facade.submitTransaction(K)}async function e3($,Z,Q,X){let z=Date.now(),q=z+_2,Y,G=!1,K=setInterval(()=>{if(G&&X){let J=t1(Date.now()-z);X(`Waiting for dust generation capacity (${J} elapsed, ~5 min on fresh wallets)...`)}},1000);try{while(Date.now()<q)try{return await s3($,Z,Q)}catch(J){if(Y=J,O$(J)&&Date.now()+E1<q){G=!0;let V=t1(Date.now()-z);X?.(`Waiting for dust generation capacity (${V} elapsed, ~5 min on fresh wallets)...`),await new Promise((j)=>setTimeout(j,E1));continue}throw J}throw Y??new Error("Dust registration timed out")}finally{clearInterval(K)}}async function J1($,Z,Q){let X=Q??await $.facade.waitForSyncedState();if(X.dust.availableCoins.length>0||X.dust.balance(new Date)>0n)return Z?.("Dust available"),{alreadyAvailable:!0};let z=X.unshielded.availableCoins.filter((G)=>G.meta?.registeredForDustGeneration!==!0),q;if(z.length>0){Z?.(`Registering ${z.length} UTXO(s) for dust generation...`);let G=z.map((K)=>({...K.utxo,ctime:new Date(K.meta.ctime)}));q=await e3($,G,X.dust.address,Z)}else Z?.("UTXOs already registered, waiting for dust generation...");Z?.("Waiting for dust tokens...");let Y=Date.now();while(Date.now()-Y<R1){try{if((await Promise.race([$.facade.waitForSyncedState(),new Promise((K,J)=>setTimeout(()=>J(new Error("Poll sync timed out")),c0))])).dust.balance(new Date)>0n)return Z?.("Dust available"),{alreadyAvailable:!1,txHash:q}}catch{}await new Promise((G)=>setTimeout(G,5000))}throw new Error("Timed out waiting for dust tokens. Try running: midnight dust register")}async function $7($,Z,Q,X,z,q){let Y=Date.now(),G=Y+R1,K,J=0;while(!0)try{if(K)await d1($,"lite");let V=new Date(Date.now()+A1*60*1000);T("transfer","Building transfer transaction...");let j=await $.facade.transferTransaction([{type:"unshielded",outputs:[{amount:Q,receiverAddress:Z,type:r1.unshieldedToken().raw}]}],{shieldedSecretKeys:$.zswapSecretKeys,dustSecretKey:$.dustSecretKey},{ttl:V,payFees:!0});T("transfer","Signing recipe...");let U=await $.facade.signRecipe(j,(P)=>$.keystore.signData(P));T("transfer","Generating ZK proof..."),X?.();let W=await Promise.race([$.facade.finalizeRecipe(U),new Promise((P,x)=>{setTimeout(()=>x(new Error("ZK proof generation timed out")),I2)})]);T("transfer","Submitting transaction to node..."),z?.();let B=await $.facade.submitTransaction(W);return T("transfer",`Transaction submitted: ${B}`),B}catch(V){if(K=V,(V?.code===T2||V?.message?.includes("115")||V?.message?.toLowerCase().includes("stale"))&&++J<M2)continue;if(O$(V)&&Date.now()<G){let U=t1(Date.now()-Y);q?.(`Dust insufficient, re-ensuring (${U} elapsed)...`);try{let W=await d1($,"lite"),B=W.dust.balance(new Date);if(B>0n&&B<_0)throw new Error(`Insufficient dust for transaction fees.
121
+ Available: ${G1(B)} DUST, need ≥${G1(_0)} DUST.
107
122
  Dust regenerates over time from registered NIGHT UTXOs.
108
- Check status: midnight dust status`);await h0($,q,B)}catch(B){if(String(B?.message).startsWith("Insufficient dust"))throw B;await new Promise((F)=>setTimeout(F,5000))}continue}throw G}}async function f0($){let{seedBuffer:Z,networkConfig:Q,recipientAddress:X,amountNight:z,signal:q,onSync:Y,onSyncDetail:K,onDust:U,onProving:H,onSubmitting:G,onSyncWarning:J}=$,j=v2(z);b2(X,Q);let B=b0(J),F=K1(),R=L0(Z,Q),E=!1,v=async()=>{if(!E){E=!0;try{await M0(R)}catch{}}},N=()=>{v()};q?.addEventListener("abort",N,{once:!0});try{let C;for(let Z0=1;Z0<=3;Z0++)try{C=await P0(R,Y,K,T0);break}catch(V1){if(q?.aborted)throw new Error("Operation cancelled");if(Z0<3&&String(V1?.message).includes("timed out")){U?.(`Sync timed out, retrying (attempt ${Z0+1}/3)...`),await M0(R).catch(()=>{}),R=L0(Z,Q);continue}throw V1}if(q?.aborted)throw new Error("Operation cancelled");let e=C.unshielded.balances[J1.unshieldedToken().raw]??0n;if(e<j){let Z0=Number(e)/R1;throw new Error(`Insufficient balance: ${Z0.toFixed(6)} NIGHT available, ${z} NIGHT requested`)}if(q?.aborted)throw new Error("Operation cancelled");await h0(R,U,C);let $0=C.dust.walletBalance(new Date);if($0>0n&&$0<U0)throw new Error(`Insufficient dust for transaction fees.
109
- Available: ${k0($0)} DUST, need ≥${k0(U0)} DUST.
123
+ Check status: midnight dust status`);await J1($,q,W)}catch(W){if(String(W?.message).startsWith("Insufficient dust"))throw W;await new Promise((B)=>setTimeout(B,5000))}continue}throw V}}async function U1($){let{seedBuffer:Z,networkConfig:Q,recipientAddress:X,amountNight:z,signal:q,onSync:Y,onSyncDetail:G,onDust:K,onProving:J,onSubmitting:V,onSyncWarning:j,noCache:U,walletAddress:W,networkName:B}=$,P=t3(z),x=r3(X,Q),F=Q1(j),O=a1(),A=!U&&W&&B,k=A?w0(W,B):null;T("transfer","Building facade...");let h=await S0(Z,Q,k),M0=!1,Y2=async()=>{if(!M0){M0=!0;try{await k0(h)}catch{}}},G2=()=>{Y2()};q?.addEventListener("abort",G2,{once:!0});try{let K2=Q.networkId!=="Undeployed",J2=K2?F2:c0,m7=3,f0;T("transfer",`Sync timeout: ${J2/1000}s (${K2?"remote":"local"} network)`);for(let W0=1;W0<=3;W0++)try{f0=await v0(h,{onProgress:Y,onSyncDetail:G,timeoutMs:J2,syncMode:"lite"});break}catch(U2){if(q?.aborted)throw new Error("Operation cancelled");if(W0<3&&String(U2?.message).includes("timed out")){if(A)try{T("transfer","Saving partial sync progress to cache..."),await O0(W,B,h.facade)}catch{}K?.(`Sync timed out, retrying (attempt ${W0+1}/3)...`),await k0(h).catch(()=>{});let J3=A?w0(W,B):null;h=await S0(Z,Q,J3);continue}throw U2}if(q?.aborted)throw new Error("Operation cancelled");T("transfer","Sync complete, checking balance...");let F1=f0.unshielded.balances[r1.unshieldedToken().raw]??0n;if(T("transfer",`Balance: ${Number(F1)/T1} NIGHT`),F1<P){let W0=Number(F1)/T1;throw new Error(`Insufficient balance: ${W0.toFixed(6)} NIGHT available, ${z} NIGHT requested`)}if(q?.aborted)throw new Error("Operation cancelled");T("transfer","Ensuring dust availability..."),await J1(h,K,f0),T("transfer","Dust available");let O1=f0.dust.balance(new Date);if(O1>0n&&O1<_0)throw new Error(`Insufficient dust for transaction fees.
124
+ Available: ${G1(O1)} DUST, need ≥${G1(_0)} DUST.
110
125
  Dust regenerates over time from registered NIGHT UTXOs.
111
- Check status: midnight dust status`);if(q?.aborted)throw new Error("Operation cancelled");return{txHash:await f2(R,X,j,H,G,U),amountMicroNight:j}}finally{q?.removeEventListener("abort",N),F(),B(),await v()}}var w2;var p0=M(()=>{q1();w2={PreProd:Y1.NetworkId.PreProd,Preview:Y1.NetworkId.Preview,Undeployed:Y1.NetworkId.Undeployed}});var I3={};b(I3,{default:()=>A3});async function A3($,Z){let Q=$.subcommand;if(!Q)throw new Error(`Missing amount.
126
+ Check status: midnight dust status`);if(q?.aborted)throw new Error("Operation cancelled");T("transfer","Building and submitting transaction...");let K3=await $7(h,x,P,J,V,K);if(A)try{await O0(W,B,h.facade)}catch{}return{txHash:K3,amountMicroNight:P}}finally{q?.removeEventListener("abort",G2),O(),F(),await Y2()}}var n3;var j1=E(()=>{l1();Y1();b0();n3={PreProd:n1.NetworkId.PreProd,Preview:n1.NetworkId.Preview,Undeployed:n1.NetworkId.Undeployed}});var M$={};f(M$,{default:()=>I$});async function I$($,Z){let Q=$.subcommand;if(!Q)throw new Error(`Missing amount.
112
127
  Usage: midnight airdrop <amount>
113
- Example: midnight airdrop 1000`);let X=S0(Q),z=_($,"wallet"),q=f(z),{name:Y,config:K}=g({args:$,walletNetwork:q.network,address:q.address});if(Y!=="undeployed")throw new Error(`Airdrop is only available on the "undeployed" network (local devnet).
114
- Current network: "${Y}"
115
- On preprod/preview, use a faucet or transfer from another wallet.`);let U=q.address,H=Buffer.from(R0,"hex");process.stderr.write(`
116
- `+I("Airdrop")+`
117
-
118
- `),process.stderr.write(W("Network",Y)+`
119
- `),process.stderr.write(W("From",V("genesis (seed 0x01)"))+`
120
- `),process.stderr.write(W("To",y(U,!0))+`
121
- `),process.stderr.write(W("Amount",O(X+" NIGHT"))+`
128
+ Example: midnight airdrop 1000`);let X=K1(Q),z=m(u(_($,"wallet"))),{name:q,config:Y}=t({args:$});if(z0(Y,{proofServer:_($,"proof-server"),node:_($,"node"),indexerWS:_($,"indexer-ws")}),q!=="undeployed")throw new Error(`Airdrop is only available on the "undeployed" network (local devnet).
129
+ Current network: "${q}"
130
+ On preprod/preview, use a faucet or transfer from another wallet.`);let G=I($,"no-cache"),K=z.addresses[q],J=Buffer.from(m0,"hex"),V=J0(J,q);process.stderr.write(`
131
+ `+D("Airdrop")+`
132
+
133
+ `),process.stderr.write(L("Network",q)+`
134
+ `),process.stderr.write(L("From",H("genesis (seed 0x01)"))+`
135
+ `),process.stderr.write(L("To",v(K,!0))+`
136
+ `),process.stderr.write(L("Amount",R(X+" NIGHT"))+`
122
137
  `),process.stderr.write(`
123
- `);let G=x("Starting genesis wallet...");try{let J=await f0({seedBuffer:H,networkConfig:K,recipientAddress:U,amountNight:X,signal:Z,onSync(j,B){if(B>0){let F=Math.round(j/B*100);G.update(`Syncing genesis wallet... ${F}%`)}},onDust(j){G.update(`Dust: ${j}`)},onProving(){G.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){G.update("Submitting transaction...")},onSyncWarning(j,B){G.update(`Syncing genesis wallet... (${B}, retrying)`)}});if(G.stop("Transaction submitted"),P($,"json")){L({txHash:J.txHash,amount:X,recipient:U,network:Y});return}process.stdout.write(J.txHash+`
138
+ `);let j=w("Starting genesis wallet...");try{let U=await U1({seedBuffer:J,networkConfig:Y,recipientAddress:K,amountNight:X,signal:Z,noCache:G,walletAddress:V,networkName:q,onSync(W,B){if(B>0){let P=Math.round(W/B*100);j.update(`Syncing genesis wallet... ${P}%`)}},onDust(W){j.update(`Dust: ${W}`)},onProving(){j.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){j.update("Submitting transaction...")},onSyncWarning(W,B){j.update(`Syncing genesis wallet... (${B}, retrying)`)}});if(j.stop("Transaction submitted"),I($,"json")){M({txHash:U.txHash,amount:X,recipient:K,network:q});return}process.stdout.write(U.txHash+`
124
139
  `),process.stderr.write(`
125
- `+s(`Airdropped ${X} NIGHT to your wallet`,J.txHash)+`
140
+ `+V0(`Airdropped ${X} NIGHT to your wallet`,U.txHash)+`
126
141
  `),process.stderr.write(`
127
- `+A()+`
128
- `),process.stderr.write(V(" Verify: midnight balance")+`
129
- `),process.stderr.write(V(" Register dust: midnight dust register")+`
130
- `),process.stderr.write(V(" Note: Dust generation takes a few minutes on a fresh wallet.")+`
131
- `),process.stderr.write(V(" It will happen automatically on your first transfer.")+`
142
+ `+C()+`
143
+ `),process.stderr.write(H(" Verify: midnight balance")+`
144
+ `),process.stderr.write(H(" Register dust: midnight dust register")+`
145
+ `),process.stderr.write(H(" Note: Dust generation takes a few minutes on a fresh wallet.")+`
146
+ `),process.stderr.write(H(" It will happen automatically on your first transfer.")+`
132
147
 
133
- `)}catch(J){if(G.stop("Failed"),J instanceof Error&&J.message.toLowerCase().includes("dust"))throw new Error(`${J.message}
148
+ `)}catch(U){if(j.stop("Failed"),U instanceof Error&&U.message.toLowerCase().includes("dust"))throw new Error(`${U.message}
134
149
 
135
150
  On a fresh localnet, the minimum airdrop is ~1 NIGHT.
136
- Try: midnight airdrop 1`);throw J}}var R3=M(()=>{r();l();p0();w();q0()});var D3={};b(D3,{default:()=>T3});async function T3($,Z){let Q=$.subcommand,X=$.positionals[0];if(!Q)throw new Error(`Missing recipient address.
151
+ Try: midnight airdrop 1`);throw U}}var _$=E(()=>{X0();o();Q0();j0();j1();c();B0()});var R$={};f(R$,{default:()=>T$});async function T$($,Z){let Q=$.subcommand,X=$.positionals[0];if(!Q)throw new Error(`Missing recipient address.
137
152
  Usage: midnight transfer <to> <amount>
138
153
  Example: midnight transfer mn_addr_undeployed1... 100`);if(!X)throw new Error(`Missing amount.
139
154
  Usage: midnight transfer <to> <amount>
140
- Example: midnight transfer mn_addr_undeployed1... 100`);let z=S0(X),q=_($,"wallet"),Y=f(q),K=Buffer.from(Y.seed,"hex"),{name:U,config:H}=g({args:$,walletNetwork:Y.network,address:Y.address});process.stderr.write(`
141
- `+I("Transfer")+`
155
+ Example: midnight transfer mn_addr_undeployed1... 100`);let z=K1(X),q=u(_($,"wallet")),Y=m(q),G=Buffer.from(Y.seed,"hex"),{name:K,config:J}=t({args:$}),V=Y.addresses[K];z0(J,{proofServer:_($,"proof-server"),node:_($,"node"),indexerWS:_($,"indexer-ws")}),process.stderr.write(`
156
+ `+D("Transfer")+`
142
157
 
143
- `),process.stderr.write(W("Network",U)+`
144
- `),process.stderr.write(W("From",y(Y.address,!0))+`
145
- `),process.stderr.write(W("To",y(Q,!0))+`
146
- `),process.stderr.write(W("Amount",O(z+" NIGHT"))+`
158
+ `),process.stderr.write(L("Network",K)+`
159
+ `),process.stderr.write(L("From",v(V,!0))+`
160
+ `),process.stderr.write(L("To",v(Q,!0))+`
161
+ `),process.stderr.write(L("Amount",R(z+" NIGHT"))+`
147
162
  `),process.stderr.write(`
148
- `);let G=x("Starting wallet...");try{let J=await f0({seedBuffer:K,networkConfig:H,recipientAddress:Q,amountNight:z,signal:Z,onSync(j,B){if(B>0){let F=Math.min(Math.round(j/B*100),100);G.update(F>=100?"Syncing wallet...":`Syncing wallet... ${F}%`)}},onSyncDetail(j){G.update(`Syncing wallet... (waiting: ${j})`)},onDust(j){G.update(`Dust: ${j}`)},onProving(){G.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){G.update("Submitting transaction...")},onSyncWarning(j,B){G.update(`Syncing wallet... (${B}, retrying)`)}});if(G.stop("Transaction submitted"),P($,"json")){L({txHash:J.txHash,amount:z,recipient:Q,network:U});return}process.stdout.write(J.txHash+`
163
+ `);let j=I($,"no-cache");if(u0($))Z1();let U=w("Starting wallet...");try{let W=await U1({seedBuffer:G,networkConfig:J,recipientAddress:Q,amountNight:z,signal:Z,noCache:j,walletAddress:V,networkName:K,onSync(B,P){if(P>0){let x=Math.min(Math.round(B/P*100),100);U.update(x>=100?"Syncing wallet...":`Syncing wallet... ${x}%`)}},onSyncDetail(B){U.update(`Syncing wallet... (waiting on: ${B})`)},onDust(B){U.update(`Dust: ${B}`)},onProving(){U.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){U.update("Submitting transaction...")},onSyncWarning(B,P){U.update(`Syncing wallet... (${P}, retrying)`)}});if(U.stop("Transaction submitted"),I($,"json")){M({txHash:W.txHash,amount:z,recipient:Q,network:K});return}process.stdout.write(W.txHash+`
149
164
  `),process.stderr.write(`
150
- `+s(`Transferred ${z} NIGHT`,J.txHash)+`
165
+ `+V0(`Transferred ${z} NIGHT`,W.txHash)+`
151
166
  `),process.stderr.write(`
152
- `+A()+`
153
- `),process.stderr.write(V(" Verify: midnight balance")+`
167
+ `+C()+`
168
+ `),process.stderr.write(H(" Verify: midnight balance")+`
154
169
 
155
- `)}catch(J){throw G.stop("Failed"),J}}var y3=M(()=>{r();l();p0();w();q0()});var N3={};b(N3,{default:()=>x3});import*as E3 from"@midnight-ntwrk/ledger-v7";import*as J0 from"rxjs";async function x3($,Z){let Q=$.subcommand;if(!Q||Q!=="register"&&Q!=="status")throw new Error(`Missing or invalid subcommand.
170
+ `)}catch(W){throw U.stop("Failed"),W}}var x$=E(()=>{b0();X0();o();Q0();j1();c();B0()});var D$={};f(D$,{default:()=>E$});import*as A$ from"@midnight-ntwrk/ledger-v7";async function E$($,Z){let Q=$.subcommand;if(!Q||Q!=="register"&&Q!=="status")throw new Error(`Missing or invalid subcommand.
156
171
  Usage:
157
172
  midnight dust register Register NIGHT UTXOs for dust generation
158
- midnight dust status Check dust registration status`);let X=_($,"wallet"),z=f(X),q=Buffer.from(z.seed,"hex"),{name:Y,config:K}=g({args:$,walletNetwork:z.network,address:z.address}),U=L0(q,K),H=async()=>{try{await M0(U)}catch{}},G=()=>{H()};Z?.addEventListener("abort",G,{once:!0});let J={},j=b0((R,E)=>{J.current?.(R,E)}),B=K1(),F=P($,"json");try{if(Q==="register")await p2(U,Y,F,Z,J);else await c2(U,Y,F,Z,J)}finally{Z?.removeEventListener("abort",G),B(),j(),await H()}}async function p2($,Z,Q,X,z){process.stderr.write(`
159
- `+I("Dust Register")+`
173
+ midnight dust status Check dust registration status`);let X=u(_($,"wallet")),z=m(X),q=Buffer.from(z.seed,"hex"),{name:Y,config:G}=t({args:$}),K=z.addresses[Y];z0(G,{proofServer:_($,"proof-server"),node:_($,"node"),indexerWS:_($,"indexer-ws")});let J=I($,"no-cache");if(u0($))Z1();let V=J?null:w0(K,Y),j=await S0(q,G,V),U=async()=>{try{await k0(j)}catch{}},W=()=>{U()};Z?.addEventListener("abort",W,{once:!0});let B={},P=Q1((O,A)=>{B.current?.(O,A)}),x=a1(),F=I($,"json");try{if(Q==="register")await Z7(j,Y,K,J,F,Z,B);else await Q7(j,Y,K,J,F,Z,B)}finally{Z?.removeEventListener("abort",W),x(),P(),await U()}}async function Z7($,Z,Q,X,z,q,Y){process.stderr.write(`
174
+ `+D("Dust Register")+`
160
175
 
161
- `),process.stderr.write(W("Network",Z)+`
176
+ `),process.stderr.write(L("Network",Z)+`
162
177
 
163
- `);let q=x("Syncing wallet...");if(z)z.current=(Y,K)=>q.update(`Syncing wallet... (${K}, retrying)`);try{let Y=await P0($,(G,J)=>{if(J>0){let j=Math.min(Math.round(G/J*100),100);q.update(j>=100?"Syncing wallet...":`Syncing wallet... ${j}%`)}},(G)=>{q.update(`Syncing wallet... (waiting: ${G})`)});if(X?.aborted)throw new Error("Operation cancelled");q.update("Checking dust status...");let K=await h0($,(G)=>{q.update(G)},Y);if(X?.aborted)throw new Error("Operation cancelled");let H=(await J0.firstValueFrom($.facade.state().pipe(J0.filter((G)=>G.isSynced)))).dust.walletBalance(new Date);if(K.alreadyAvailable)q.stop("Dust already available");else q.stop("Dust registration complete");if(Q){let G={subcommand:"register",dustBalance:N0(H)};if(K.txHash)G.txHash=K.txHash;L(G);return}if(process.stdout.write(H.toString()+`
164
- `),K.alreadyAvailable)process.stderr.write(`
165
- `+s(`Dust tokens already available: ${C0(H)}`)+`
178
+ `);let G=w($.restoredFromCache?"Restoring from cache...":"Syncing wallet...");if(Y)Y.current=(K,J)=>G.update(`Syncing wallet... (${J}, retrying)`);try{let K=await v0($,{syncMode:"lite",onProgress:(U,W)=>{if(W>0){let B=Math.min(Math.round(U/W*100),100);G.update(B>=100?"Syncing wallet...":`Syncing wallet... ${B}%`)}},onSyncDetail:(U)=>{G.update(`Syncing wallet... (waiting on: ${U})`)}});if(q?.aborted)throw new Error("Operation cancelled");G.update("Checking dust status...");let J=await J1($,(U)=>{G.update(U)},K);if(q?.aborted)throw new Error("Operation cancelled");let j=(await g1($)).dust.balance(new Date);if(!X)try{await O0(Q,Z,$.facade)}catch{}if(J.alreadyAvailable)G.stop("Dust already available");else G.stop("Dust registration complete");if(z){let U={subcommand:"register",dustBalance:a0(j)};if(J.txHash)U.txHash=J.txHash;M(U);return}if(process.stdout.write(j.toString()+`
179
+ `),J.alreadyAvailable)process.stderr.write(`
180
+ `+V0(`Dust tokens already available: ${s0(j)}`)+`
166
181
 
167
182
  `);else process.stderr.write(`
168
- `+s(`Dust tokens available: ${C0(H)}`)+`
183
+ `+V0(`Dust tokens available: ${s0(j)}`)+`
169
184
 
170
- `)}catch(Y){throw q.stop("Failed"),Y}}async function c2($,Z,Q,X,z){process.stderr.write(`
171
- `+I("Dust Status")+`
185
+ `)}catch(K){throw G.stop("Failed"),K}}async function Q7($,Z,Q,X,z,q,Y){process.stderr.write(`
186
+ `+D("Dust Status")+`
172
187
 
173
- `),process.stderr.write(W("Network",Z)+`
188
+ `),process.stderr.write(L("Network",Z)+`
174
189
 
175
- `);let q=x("Syncing wallet...");if(z)z.current=(Y,K)=>q.update(`Syncing wallet... (${K}, retrying)`);try{if(await P0($,(B,F)=>{if(F>0){let R=Math.min(Math.round(B/F*100),100);q.update(R>=100?"Syncing wallet...":`Syncing wallet... ${R}%`)}},(B)=>{q.update(`Syncing wallet... (waiting: ${B})`)}),X?.aborted)throw new Error("Operation cancelled");q.update("Checking dust status...");let Y=await J0.firstValueFrom($.facade.state().pipe(J0.filter((B)=>B.isSynced))),K=Y.dust.walletBalance(new Date),U=Y.dust.availableCoins.length>0,H=Y.unshielded.availableCoins,G=H.filter((B)=>B.meta?.registeredForDustGeneration!==!0),J=H.length-G.length,j=Y.unshielded.balances[E3.unshieldedToken().raw]??0n;if(q.stop("Done"),Q){L({subcommand:"status",dustBalance:N0(K),registered:J,unregistered:G.length,nightBalance:B0(j),dustAvailable:U});return}process.stdout.write(`dust=${K}
176
- `),process.stdout.write(`registered=${J}
177
- `),process.stdout.write(`unregistered=${G.length}
178
- `),process.stderr.write(W("NIGHT Balance",O(x0(j)))+`
179
- `),process.stderr.write(W("Dust Balance",O(C0(K)))+`
180
- `),process.stderr.write(W("Dust Available",U?"yes":"no")+`
181
- `),process.stderr.write(W("Registered",J.toString()+" UTXO(s)")+`
182
- `),process.stderr.write(W("Unregistered",G.length.toString()+" UTXO(s)")+`
190
+ `);let G=w($.restoredFromCache?"Restoring from cache...":"Syncing wallet...");if(Y)Y.current=(K,J)=>G.update(`Syncing wallet... (${J}, retrying)`);try{if(await v0($,{syncMode:"lite",onProgress:(P,x)=>{if(x>0){let F=Math.min(Math.round(P/x*100),100);G.update(F>=100?"Syncing wallet...":`Syncing wallet... ${F}%`)}},onSyncDetail:(P)=>{G.update(`Syncing wallet... (waiting on: ${P})`)}}),q?.aborted)throw new Error("Operation cancelled");G.update("Checking dust status...");let K=await g1($);if(!X)try{await O0(Q,Z,$.facade)}catch{}let J=K.dust.balance(new Date),V=K.dust.availableCoins.length>0,j=K.unshielded.availableCoins,U=j.filter((P)=>P.meta?.registeredForDustGeneration!==!0),W=j.length-U.length,B=K.unshielded.balances[A$.unshieldedToken().raw]??0n;if(G.stop("Done"),z){M({subcommand:"status",dustBalance:a0(J),registered:W,unregistered:U.length,nightBalance:C0(B),dustAvailable:V});return}process.stdout.write(`dust=${J}
191
+ `),process.stdout.write(`registered=${W}
192
+ `),process.stdout.write(`unregistered=${U.length}
193
+ `),process.stderr.write(L("NIGHT Balance",R(r0(B)))+`
194
+ `),process.stderr.write(L("Dust Balance",R(s0(J)))+`
195
+ `),process.stderr.write(L("Dust Available",V?"yes":"no")+`
196
+ `),process.stderr.write(L("Registered",W.toString()+" UTXO(s)")+`
197
+ `),process.stderr.write(L("Unregistered",U.length.toString()+" UTXO(s)")+`
183
198
  `),process.stderr.write(`
184
- `+A()+`
185
-
186
- `)}catch(Y){throw q.stop("Failed"),Y}}var C3=M(()=>{r();l();q1();p0();w();q0()});var v3={};b(v3,{default:()=>w3});async function w3($){let Z=$.subcommand;if(!Z||Z!=="get"&&Z!=="set")throw new Error(`Usage: midnight config <get|set> <key> [value]
187
- Valid keys: ${e0().join(", ")}`);let Q=$.positionals[0];if(!Q)throw new Error(`Missing config key.
188
- Valid keys: ${e0().join(", ")}`);if(Z==="get"){let X=h1(Q);if(P($,"json")){L({action:"get",key:Q,value:X});return}process.stdout.write(X+`
199
+ `+C()+`
200
+
201
+ `)}catch(K){throw G.stop("Failed"),K}}var C$=E(()=>{b0();X0();o();Q0();l1();Y1();j1();c();B0()});var y$={};f(y$,{default:()=>N$});async function N$($){if($.subcommand!=="clear")throw new Error("Usage: midnight cache clear [--network <name>] [--wallet <name|file>]");let Q=_($,"wallet"),X=_($,"network"),z=I($,"json");if(Q){let q=u(Q),Y=m(q),{name:G}=t({args:$}),K=Y.addresses[G];if(q1(K,G),z){M({action:"clear",scope:"wallet",wallet:Q,network:G});return}process.stderr.write(S("✓")+` Cache cleared for wallet "${Q}" on ${G}
202
+ `)}else if(X){if(q1(void 0,X),z){M({action:"clear",scope:"network",network:X});return}process.stderr.write(S("✓")+` Cache cleared for network "${X}"
203
+ `)}else{if(q1(),z){M({action:"clear",scope:"all"});return}process.stderr.write(S("✓")+` Cache cleared
204
+ `)}}var b$=E(()=>{Y1();X0();o()});var v$={};f(v$,{default:()=>S$});async function S$($){let Z=$.subcommand;if(!Z||!["get","set","unset"].includes(Z))throw new Error(`Usage: midnight config <get|set|unset> <key> [value]
205
+ Valid keys: ${o0().join(", ")}`);let Q=$.positionals[0];if(!Q)throw new Error(`Missing config key.
206
+ Valid keys: ${o0().join(", ")}`);if(Z==="get"){let X=S1(Q);if(I($,"json")){M({action:"get",key:Q,value:X});return}process.stdout.write(X+`
207
+ `)}else if(Z==="unset"){k1(Q);let X=Q==="network"?"(default)":"(removed)";if(I($,"json")){M({action:"unset",key:Q,value:X});return}process.stderr.write(S("✓")+` ${Q} ${X}
189
208
  `)}else{let X=$.positionals[1];if(X===void 0)throw new Error(`Missing value for config set.
190
- Usage: midnight config set ${Q} <value>`);if(f1(Q,X),P($,"json")){L({action:"set",key:Q,value:X});return}process.stderr.write(i("✓")+` ${Q} = ${X}
191
- `)}}var b3=M(()=>{$1()});import{execSync as O0}from"child_process";import{existsSync as k3,mkdirSync as m2,readFileSync as u2,writeFileSync as S3}from"fs";import{homedir as g2}from"os";import{join as H1}from"path";function f3(){try{return O0("docker compose version",{...m0,timeout:1e4}).trim()}catch{try{throw O0("docker --version",{...m0,timeout:5000}),new Error(`Docker Compose v2 is required.
209
+ Usage: midnight config set ${Q} <value>`);if(v1(Q,X),I($,"json")){M({action:"set",key:Q,value:X});return}process.stderr.write(S("✓")+` ${Q} = ${X}
210
+ `)}}var k$=E(()=>{L0()});import{execSync as h0}from"child_process";import{existsSync as w$,mkdirSync as X7,readFileSync as z7,writeFileSync as h$}from"fs";import{homedir as q7}from"os";import{join as e1}from"path";function p$(){try{return h0("docker compose version",{...B1,timeout:1e4}).trim()}catch{try{throw h0("docker --version",{...B1,timeout:5000}),new Error(`Docker Compose v2 is required.
192
211
  Install it from https://docs.docker.com/compose/install/`)}catch($){if($ instanceof Error&&$.message.includes("Docker Compose v2"))throw $;throw new Error(`Docker is required but was not found.
193
- Install Docker from https://docs.docker.com/get-docker/`)}}}function p3(){if(k3(U1)&&k3(c0)&&u2(U1,"utf-8").trim()===h3)return!1;return m2(W1,{recursive:!0,mode:n}),S3(c0,l2,"utf-8"),S3(U1,h3,"utf-8"),!0}function K0($){return O0(`docker compose -f "${c0}" ${$}`,m0)}function u0(){try{let $=K0("ps --format json");if(!$.trim())return[];let Z=$.trim().split(`
194
- `),Q=[];for(let X of Z){if(!X.trim())continue;try{let z=JSON.parse(X),q=z.Service??"unknown";Q.push({name:q,state:z.State??"unknown",health:z.Health??"",port:d2[q]??""})}catch{}}return Q}catch{return[]}}function c3($=120000,Z=3000){let Q=Date.now()+$;while(Date.now()<Q){let X=u0();if(X.length===3&&X.every((q)=>q.state==="running")){if(X.every((Y)=>Y.health==="healthy"||Y.health===""))return!0}O0(`sleep ${Z/1000}`,{timeout:Z+1000})}return!1}function j1(){return c0}function m3(){let $=[];for(let Z of i2)try{O0(`docker rm -f "${Z}"`,{...m0,timeout:1e4}),$.push(Z)}catch{}return $}var h3="1.4.0",W1,c0,U1,l2=`services:
212
+ Install Docker from https://docs.docker.com/get-docker/`)}}}function u$(){if(w$(s1)&&w$(V1)&&z7(s1,"utf-8").trim()===f$)return!1;return X7($2,{recursive:!0,mode:e}),h$(V1,Y7,"utf-8"),h$(s1,f$,"utf-8"),!0}function I0($){return h0(`docker compose -f "${V1}" ${$}`,B1)}function H1(){try{let $=I0("ps --format json");if(!$.trim())return[];let Z=$.trim().split(`
213
+ `),Q=[];for(let X of Z){if(!X.trim())continue;try{let z=JSON.parse(X),q=z.Service??"unknown";Q.push({name:q,state:z.State??"unknown",health:z.Health??"",port:G7[q]??"",image:z.Image??""})}catch{}}return Q}catch{return[]}}function m$($=120000,Z=3000){let Q=Date.now()+$;while(Date.now()<Q){let X=H1();if(X.length===3&&X.every((q)=>q.state==="running")){if(X.every((Y)=>Y.health==="healthy"||Y.health===""))return!0}h0(`sleep ${Z/1000}`,{timeout:Z+1000})}return!1}function Z2(){return V1}function c$(){let $=[];for(let Z of K7)try{h0(`docker rm -f "${Z}"`,{...B1,timeout:1e4}),$.push(Z)}catch{}return $}var f$="2.0.0",$2,V1,s1,Y7=`services:
195
214
  proof-server:
196
- image: 'nel349/proof-server:7.0.0'
215
+ image: 'midnightntwrk/proof-server:8.0.0-rc.5'
197
216
  container_name: "proof-server"
198
217
  ports:
199
218
  - "6300:6300"
200
219
 
201
220
  indexer:
202
- image: 'midnightntwrk/indexer-standalone:3.0.0'
221
+ image: 'midnightntwrk/indexer-standalone:4.0.0-rc.3'
203
222
  container_name: "indexer"
204
223
  ports:
205
224
  - '8088:8088'
@@ -221,7 +240,7 @@ Install Docker from https://docs.docker.com/get-docker/`)}}}function p3(){if(k3(
221
240
  condition: service_started
222
241
 
223
242
  node:
224
- image: 'midnightntwrk/midnight-node:0.20.1'
243
+ image: 'midnightntwrk/midnight-node:0.22.0-rc.4'
225
244
  container_name: "node"
226
245
  ports:
227
246
  - "9944:9944"
@@ -233,34 +252,34 @@ Install Docker from https://docs.docker.com/get-docker/`)}}}function p3(){if(k3(
233
252
  start_period: 5s
234
253
  environment:
235
254
  CFG_PRESET: "dev"
236
- `,m0,d2,i2;var u3=M(()=>{W1=H1(g2(),h,b1),c0=H1(W1,"compose.yml"),U1=H1(W1,".version"),m0={encoding:"utf-8",timeout:30000};d2={node:"9944",indexer:"8088","proof-server":"6300"};i2=["node","indexer","proof-server"]});var i3={};b(i3,{default:()=>d3});import{spawn as o2}from"child_process";function n2($){return g3.includes($)}function l3($){let Z=[];for(let Q of $){let X=Q.state==="running"?i:t,z=Q.health?` (${Q.health})`:"",q=Q.port?`:${Q.port}`:"";Z.push(` ${Q.name.padEnd(16)}${X(Q.state)}${V(z)}${V(q)}`)}return Z.join(`
237
- `)}async function a2($){if(p3())process.stderr.write(V(` Wrote compose.yml to ${j1()}`)+`
238
- `);let Q=x("Starting local network...");try{if(K0("up -d"),Q.update("Waiting for services to be healthy..."),!c3(120000))Q.stop(j0("Services started but not all healthy yet")),process.stderr.write(`
239
- `+V(" Tip: run ")+O("midnight localnet logs")+V(" to check for errors")+`
240
- `);else Q.stop("Local network is running")}catch(z){if(Q.stop(t("Failed to start local network")),z instanceof Error){if(z.message.includes("is already in use by container"))throw new Error(`Container name conflict — containers with the same names already exist
255
+ `,B1,G7,K7;var g$=E(()=>{$2=e1(q7(),g,x2),V1=e1($2,"compose.yml"),s1=e1($2,".version"),B1={encoding:"utf-8",timeout:30000};G7={node:"9944",indexer:"8088","proof-server":"6300"};K7=["node","indexer","proof-server"]});var o$={};f(o$,{default:()=>i$});import{spawn as J7}from"child_process";function U7($){return d$.includes($)}function l$($){let Z=[];for(let Q of $){let X=Q.state==="running"?S:a,z=Q.health?` (${Q.health})`:"",q=Q.port?`:${Q.port}`:"",Y=Q.image?` ${H(Q.image)}`:"";if(Z.push(` ${Q.name.padEnd(16)}${X(Q.state)}${H(z)}${H(q)}`),Y)Z.push(Y)}return Z.join(`
256
+ `)}async function j7($){if(u$())process.stderr.write(H(` Wrote compose.yml to ${Z2()}`)+`
257
+ `);let Q=w("Starting local network...");try{if(I0("up -d"),Q.update("Waiting for services to be healthy..."),!m$(120000))Q.stop(q0("Services started but not all healthy yet")),process.stderr.write(`
258
+ `+H(" Tip: run ")+R("midnight localnet logs")+H(" to check for errors")+`
259
+ `);else Q.stop("Local network is running")}catch(z){if(Q.stop(a("Failed to start local network")),z instanceof Error){if(z.message.includes("is already in use by container"))throw new Error(`Container name conflict — containers with the same names already exist
241
260
  `+`(likely from a previous midnight-local-network setup).
242
261
 
243
262
  Run "midnight localnet clean" to remove them, then try again.`);if(z.message.includes("address already in use"))throw new Error(`Port conflict detected — another process is using a required port.
244
- `+"Check ports 9944, 8088, and 6300, then try again.")}throw z}let X=u0();if($){L({subcommand:"up",services:X.map((z)=>({name:z.name,state:z.state,port:z.port,health:z.health}))});return}if(X.length>0)process.stderr.write(`
245
- `+l3(X)+`
263
+ `+"Check ports 9944, 8088, and 6300, then try again.")}throw z}let X=H1();if($){M({subcommand:"up",services:X.map((z)=>({name:z.name,state:z.state,port:z.port,health:z.health,image:z.image}))});return}if(X.length>0)process.stderr.write(`
264
+ `+l$(X)+`
246
265
  `);for(let z of X)process.stdout.write(`${z.name}=${z.state}:${z.port}
247
266
  `);process.stderr.write(`
248
- `+V(" Next: ")+O("midnight generate --network undeployed")+`
249
- `)}async function r2($){let Z=x("Stopping local network...");try{if(K0("stop"),Z.stop("Local network stopped (containers preserved)"),$){L({subcommand:"stop",status:"stopped"});return}}catch(Q){throw Z.stop(t("Failed to stop local network")),Q}}async function t2($){let Z=x("Tearing down local network...");try{if(K0("down --volumes"),Z.stop("Local network removed (containers, networks, volumes)"),$){L({subcommand:"down",status:"removed"});return}}catch(Q){throw Z.stop(t("Failed to tear down local network")),Q}}async function s2($){let Z=u0();if($){L({subcommand:"status",services:Z.map((Q)=>({name:Q.name,state:Q.state,port:Q.port,health:Q.health}))});return}if(Z.length===0){process.stderr.write(`
250
- `+I("Localnet Status")+`
267
+ `+H(" Next: ")+R("midnight wallet generate dev --network undeployed")+`
268
+ `)}async function V7($){let Z=w("Stopping local network...");try{if(I0("stop"),Z.stop("Local network stopped (containers preserved)"),$){M({subcommand:"stop",status:"stopped"});return}}catch(Q){throw Z.stop(a("Failed to stop local network")),Q}}async function B7($){let Z=w("Tearing down local network...");try{if(I0("down --volumes"),Z.stop("Local network removed (containers, networks, volumes)"),$){M({subcommand:"down",status:"removed"});return}}catch(Q){throw Z.stop(a("Failed to tear down local network")),Q}}async function H7($){let Z=H1();if($){M({subcommand:"status",services:Z.map((Q)=>({name:Q.name,state:Q.state,port:Q.port,health:Q.health,image:Q.image}))});return}if(Z.length===0){process.stderr.write(`
269
+ `+D("Localnet Status")+`
251
270
 
252
- `),process.stderr.write(V(" No services running.")+`
253
- `),process.stderr.write(V(" Run ")+O("midnight localnet up")+V(" to start.")+`
271
+ `),process.stderr.write(H(" No services running.")+`
272
+ `),process.stderr.write(H(" Run ")+R("midnight localnet up")+H(" to start.")+`
254
273
 
255
274
  `);return}process.stderr.write(`
256
- `+I("Localnet Status")+`
275
+ `+D("Localnet Status")+`
257
276
 
258
- `),process.stderr.write(l3(Z)+`
277
+ `),process.stderr.write(l$(Z)+`
259
278
  `),process.stderr.write(`
260
- `+A()+`
279
+ `+C()+`
261
280
 
262
281
  `);for(let Q of Z)process.stdout.write(`${Q.name}=${Q.state}:${Q.port}
263
- `)}async function e2($){let Z=x("Removing conflicting containers...");try{try{K0("down")}catch{}let Q=m3();if(Q.length>0)Z.stop(`Removed ${Q.length} container${Q.length>1?"s":""}: ${Q.join(", ")}`);else Z.stop("No conflicting containers found");if($){L({subcommand:"clean",status:"cleaned",removed:Q});return}}catch(Q){throw Z.stop(t("Failed to clean up")),Q}}async function $$(){let $=j1(),Z=o2("docker",["compose","-f",$,"logs","-f"],{stdio:"inherit"});return new Promise((Q,X)=>{Z.on("close",(z)=>{if(z===0||z===130||z===null)Q();else X(new Error(`docker compose logs exited with code ${z}`))}),Z.on("error",X)})}async function d3($){let Z=$.subcommand;if(!Z||!n2(Z))throw new Error(`Usage: midnight localnet <${g3.join("|")}>
282
+ `)}async function W7($){let Z=w("Removing conflicting containers...");try{try{I0("down")}catch{}let Q=c$();if(Q.length>0)Z.stop(`Removed ${Q.length} container${Q.length>1?"s":""}: ${Q.join(", ")}`);else Z.stop("No conflicting containers found");if($){M({subcommand:"clean",status:"cleaned",removed:Q});return}}catch(Q){throw Z.stop(a("Failed to clean up")),Q}}async function L7(){let $=Z2(),Z=J7("docker",["compose","-f",$,"logs","-f"],{stdio:"inherit"});return new Promise((Q,X)=>{Z.on("close",(z)=>{if(z===0||z===130||z===null)Q();else X(new Error(`docker compose logs exited with code ${z}`))}),Z.on("error",X)})}async function i$($){let Z=$.subcommand;if(!Z||!U7(Z))throw new Error(`Usage: midnight localnet <${d$.join("|")}>
264
283
 
265
284
  Subcommands:
266
285
  up Start the local network
@@ -270,8 +289,84 @@ Subcommands:
270
289
  logs Stream service logs
271
290
  clean Remove conflicting containers
272
291
 
273
- Example: midnight localnet up`);f3();let Q=P($,"json");switch(process.stderr.write(`
274
- `+I("Localnet")+`
292
+ Example: midnight localnet up`);p$();let Q=I($,"json");switch(process.stderr.write(`
293
+ `+D("Localnet")+`
294
+
295
+ `),Z){case"up":return j7(Q);case"stop":return V7(Q);case"down":return B7(Q);case"status":return H7(Q);case"logs":return L7();case"clean":return W7(Q)}}var d$;var n$=E(()=>{g$();c();B0();d$=["up","stop","down","status","logs","clean"]});var e$={};f(e$,{default:()=>s$});import*as a$ from"fs";import*as Q2 from"path";import{homedir as P7}from"os";import{generateMnemonic as F7,mnemonicToSeedSync as t$,validateMnemonic as O7}from"@scure/bip39";import{wordlist as r$}from"@scure/bip39/wordlists/english.js";async function s$($){let Z=$.subcommand;switch(Z){case"generate":return I7($);case"list":case"ls":return M7($);case"use":return _7($);case"info":return T7($);case"remove":case"rm":return R7($);default:throw new Error(`Unknown wallet subcommand: "${Z??"(none)"}"
296
+ Available: generate, list, use, info, remove
297
+ Run "midnight help wallet" for usage.`)}}async function I7($){let Z=$.positionals[0];if(!Z)throw new Error(`Missing wallet name.
298
+ Usage: midnight wallet generate <name> [--network <name>]`);if(!K0(Z))throw new Error(`Invalid wallet name: "${Z}"
299
+ Wallet name must be a simple name (no path separators, .json suffix, or special characters).`);let Q=d({args:$}),X=_($,"seed"),z=_($,"mnemonic");if(X!==void 0&&z!==void 0)throw new Error("Cannot specify both --seed and --mnemonic. Use one or the other.");let q=Q2.join(P7(),g,d0),Y=Q2.join(q,`${Z}.json`);if(a$.existsSync(Y)&&!I($,"force"))throw new Error(`Wallet "${Z}" already exists: ${Y}
300
+ Use --force to overwrite.`);let G,K;if(X!==void 0){let W=X.replace(/^0x/,"");if(W.length!==64||!/^[0-9a-fA-F]+$/.test(W))throw new Error("Seed must be a 64-character hex string (32 bytes)");G=Buffer.from(W,"hex")}else if(z!==void 0){if(!O7(z,r$))throw new Error("Invalid BIP-39 mnemonic. Expected 12 or 24 words from the English wordlist.");K=z,G=Buffer.from(t$(K).slice(0,32))}else K=F7(r$,256),G=Buffer.from(t$(K).slice(0,32));let J=U0(G),V=J[Q],j={seed:G.toString("hex"),addresses:J,createdAt:new Date().toISOString()};if(K)j.mnemonic=K;let U=t0(j,Y);if(p1(Z),I($,"json")){let W={name:Z,addresses:J,activeAddress:V,activeNetwork:Q,seed:G.toString("hex"),file:U,createdAt:j.createdAt,active:!0};if(K)W.mnemonic=K;M(W);return}if(process.stdout.write(V+`
301
+ `),process.stderr.write(`
302
+ `+D("Wallet Generated")+`
303
+
304
+ `),process.stderr.write(L("Name",Z)+`
305
+ `),process.stderr.write(L("Network",Q)+`
306
+ `),process.stderr.write(L("Address",v(V))+`
307
+ `),process.stderr.write(L("File",U)+`
308
+ `),process.stderr.write(L("Active","yes")+`
309
+ `),process.stderr.write(`
310
+ `),K)process.stderr.write(q0(R(" MNEMONIC (save securely!):"))+`
311
+ `),process.stderr.write(` ${K}
275
312
 
276
- `),Z){case"up":return a2(Q);case"stop":return r2(Q);case"down":return t2(Q);case"status":return s2(Q);case"logs":return $$();case"clean":return e2(Q)}}var g3;var o3=M(()=>{u3();w();q0();g3=["up","stop","down","status","logs","clean"]});import{Server as Z$}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Q$}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema as X$,CallToolRequestSchema as z$}from"@modelcontextprotocol/sdk/types.js";async function T($,Z,Q){let X=[];l0((q)=>X.push(q));let z=process.stderr.write;process.stderr.write=()=>!0;try{Z.flags.json=!0,await $(Z,Q);let q=X.join("").trim();if(!q)return{};return JSON.parse(q)}finally{l0(null),process.stderr.write=z}}var S={INVALID_ARGS:"INVALID_ARGS",WALLET_NOT_FOUND:"WALLET_NOT_FOUND",NETWORK_ERROR:"NETWORK_ERROR",INSUFFICIENT_BALANCE:"INSUFFICIENT_BALANCE",TX_REJECTED:"TX_REJECTED",STALE_UTXO:"STALE_UTXO",PROOF_TIMEOUT:"PROOF_TIMEOUT",DUST_REQUIRED:"DUST_REQUIRED",CANCELLED:"CANCELLED",UNKNOWN:"UNKNOWN"};function F1($){let Z=($.message??"").toLowerCase();if(Z.includes("operation cancelled")||Z.includes("operation aborted")||Z==="cancelled"||Z==="aborted")return{exitCode:7,errorCode:S.CANCELLED};if(Z.includes("wallet file not found")||Z.includes("wallet")&&Z.includes("not found"))return{exitCode:3,errorCode:S.WALLET_NOT_FOUND};if(Z.includes("missing required flag")||Z.includes("missing amount")||Z.includes("missing recipient")||Z.includes("missing config key")||Z.includes("missing or invalid subcommand")||Z.includes("unknown command")||Z.includes("cannot specify both")||Z.includes("invalid bip-39")||Z.includes("seed must be")||Z.includes("key index must be")||Z.includes("usage:"))return{exitCode:2,errorCode:S.INVALID_ARGS};if(Z.includes("proof")&&Z.includes("timeout"))return{exitCode:6,errorCode:S.PROOF_TIMEOUT};if(Z.includes("stale utxo")||Z.includes("error code 115")||Z.includes("errorcode: 115"))return{exitCode:6,errorCode:S.STALE_UTXO};if(Z.includes("no dust")||Z.includes("dust")&&(Z.includes("required")||Z.includes("available")||Z.includes("insufficient")))return{exitCode:5,errorCode:S.DUST_REQUIRED};if(Z.includes("insufficient")||Z.includes("not enough"))return{exitCode:5,errorCode:S.INSUFFICIENT_BALANCE};if(Z.includes("rejected")||Z.includes("transaction failed"))return{exitCode:6,errorCode:S.TX_REJECTED};if(Z.includes("econnrefused")||Z.includes("enotfound")||Z.includes("etimedout")||Z.includes("websocket")||Z.includes("connection refused")||Z.includes("network")&&Z.includes("error"))return{exitCode:4,errorCode:S.NETWORK_ERROR};return{exitCode:1,errorCode:S.UNKNOWN}}var _0={name:"midnight-wallet-cli",version:"0.1.11",type:"module",description:"Git-style CLI wallet for the Midnight blockchain",license:"Apache-2.0",bin:{midnight:"dist/wallet.js",mn:"dist/wallet.js","midnight-wallet-cli":"dist/wallet.js","midnight-wallet-mcp":"dist/mcp-server.js"},files:["dist"],scripts:{wallet:"tsx src/wallet.ts",build:'bun build src/wallet.ts --outfile dist/wallet.js --target node --format esm --packages external --minify --banner "#!/usr/bin/env node" && bun build src/mcp-server.ts --outfile dist/mcp-server.js --target node --format esm --packages external --minify --banner "#!/usr/bin/env node"',mcp:"tsx src/mcp-server.ts",prepublishOnly:"npm run build && npm run test",test:"vitest run","test:watch":"vitest",typecheck:"tsc --noEmit"},dependencies:{"@midnight-ntwrk/ledger-v7":"7.0.0","@midnight-ntwrk/midnight-js-network-id":"3.0.0","@midnight-ntwrk/midnight-js-types":"3.0.0","@midnight-ntwrk/wallet-sdk-abstractions":"1.0.0","@midnight-ntwrk/wallet-sdk-address-format":"3.0.0","@midnight-ntwrk/wallet-sdk-dust-wallet":"1.0.0","@midnight-ntwrk/wallet-sdk-facade":"1.0.0","@midnight-ntwrk/wallet-sdk-hd":"3.0.0","@midnight-ntwrk/wallet-sdk-shielded":"1.0.0","@midnight-ntwrk/wallet-sdk-unshielded-wallet":"1.0.0","@modelcontextprotocol/sdk":"^1.27.1","@scure/bip39":"^2.0.1",rxjs:"^7.8.1",ws:"^8.19.0"},devDependencies:{"@types/node":"^22.19.13","@types/ws":"^8.18.1",tsx:"^4.21.0",typescript:"^5.9.3",vitest:"^3.2.4"}};var V$=_0.name,L1=_0.version,F$=_0.description;function p($,Z,Q){let X={json:!0},z=[];for(let[q,Y]of Object.entries(Z)){if(Y===void 0||Y===null)continue;if(typeof Y==="boolean"){if(Y)X[q]=!0}else X[q]=String(Y)}return{command:$,subcommand:Q,positionals:z,flags:X}}var q$={generate:()=>Promise.resolve().then(() => (r1(),a1)),info:()=>Promise.resolve().then(() => (e1(),s1)),balance:()=>Promise.resolve().then(() => (q3(),z3)),address:()=>Promise.resolve().then(() => (J3(),G3)),"genesis-address":()=>Promise.resolve().then(() => (H3(),U3)),"inspect-cost":()=>Promise.resolve().then(() => (V3(),B3)),airdrop:()=>Promise.resolve().then(() => (R3(),I3)),transfer:()=>Promise.resolve().then(() => (y3(),D3)),dust:()=>Promise.resolve().then(() => (C3(),N3)),config:()=>Promise.resolve().then(() => (b3(),v3)),localnet:()=>Promise.resolve().then(() => (o3(),i3))};async function D($){let Z=q$[$];if(!Z)throw new Error(`Unknown command handler: ${$}`);return(await Z()).default}var n3=[{name:"midnight_generate",description:"Generate a new wallet (random mnemonic, or restore from seed/mnemonic)",inputSchema:{type:"object",properties:{network:{type:"string",description:"Network: preprod, preview, undeployed",enum:["preprod","preview","undeployed"]},seed:{type:"string",description:"Restore from existing seed (64-char hex)"},mnemonic:{type:"string",description:"Restore from BIP-39 mnemonic (24 words)"},output:{type:"string",description:"Custom output path (default: ~/.midnight/wallet.json)"},force:{type:"string",description:'Set to "true" to overwrite existing wallet file'}}},async handler($){let Z=p("generate",$);if($.force==="true"||$.force===!0)Z.flags.force=!0;let Q=await D("generate");return T(Q,Z)}},{name:"midnight_info",description:"Display wallet address, network, creation date (no secrets shown)",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Custom wallet file path"}}},async handler($){let Z=p("info",$),Q=await D("info");return T(Q,Z)}},{name:"midnight_balance",description:"Check unshielded balance via indexer subscription",inputSchema:{type:"object",properties:{address:{type:"string",description:"Address to check (or reads from wallet file)"},wallet:{type:"string",description:"Custom wallet file path"},network:{type:"string",description:"Override network detection",enum:["preprod","preview","undeployed"]},"indexer-ws":{type:"string",description:"Custom indexer WebSocket URL"}}},async handler($){let Z=$.address,Q=p("balance",$,Z);delete Q.flags.address;let X=await D("balance");return T(X,Q)}},{name:"midnight_address",description:"Derive and display an unshielded address from a seed",inputSchema:{type:"object",properties:{seed:{type:"string",description:"Seed to derive from (required, 64-char hex)"},network:{type:"string",description:"Network for address prefix",enum:["preprod","preview","undeployed"]},index:{type:"string",description:"Key derivation index (default: 0)"}},required:["seed"]},async handler($){let Z=p("address",$),Q=await D("address");return T(Q,Z)}},{name:"midnight_genesis_address",description:"Display the genesis wallet address (seed 0x01) for a network",inputSchema:{type:"object",properties:{network:{type:"string",description:"Network for address prefix",enum:["preprod","preview","undeployed"]}}},async handler($){let Z=p("genesis-address",$),Q=await D("genesis-address");return T(Q,Z)}},{name:"midnight_inspect_cost",description:"Display current block limits derived from LedgerParameters",inputSchema:{type:"object",properties:{}},async handler(){let $=p("inspect-cost",{}),Z=await D("inspect-cost");return T(Z,$)}},{name:"midnight_airdrop",description:"Fund your wallet from the genesis wallet (undeployed network only)",inputSchema:{type:"object",properties:{amount:{type:"string",description:"Amount in NIGHT to airdrop"},wallet:{type:"string",description:"Custom wallet file path"}},required:["amount"]},async handler($){let Z=$.amount,Q=p("airdrop",$,Z);delete Q.flags.amount;let X=await D("airdrop");return T(X,Q)}},{name:"midnight_transfer",description:"Send NIGHT tokens to another address",inputSchema:{type:"object",properties:{to:{type:"string",description:"Recipient bech32m address"},amount:{type:"string",description:"Amount in NIGHT to send"},wallet:{type:"string",description:"Custom wallet file path"}},required:["to","amount"]},async handler($){let{to:Z,amount:Q}=$,X=p("transfer",$,Z);X.positionals=[Q],delete X.flags.to,delete X.flags.amount;let z=await D("transfer");return T(z,X)}},{name:"midnight_dust_register",description:"Register NIGHT UTXOs for dust (fee token) generation",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Custom wallet file path"}}},async handler($){let Z=p("dust",$,"register"),Q=await D("dust");return T(Q,Z)}},{name:"midnight_dust_status",description:"Check dust registration status and balance",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Custom wallet file path"}}},async handler($){let Z=p("dust",$,"status"),Q=await D("dust");return T(Q,Z)}},{name:"midnight_config_get",description:"Read a persistent config value",inputSchema:{type:"object",properties:{key:{type:"string",description:'Config key to read (e.g. "network")'}},required:["key"]},async handler($){let Q={command:"config",subcommand:"get",positionals:[$.key],flags:{json:!0}},X=await D("config");return T(X,Q)}},{name:"midnight_config_set",description:"Write a persistent config value",inputSchema:{type:"object",properties:{key:{type:"string",description:'Config key to set (e.g. "network")'},value:{type:"string",description:"Config value to set"}},required:["key","value"]},async handler($){let{key:Z,value:Q}=$,X={command:"config",subcommand:"set",positionals:[Z,Q],flags:{json:!0}},z=await D("config");return T(z,X)}},{name:"midnight_localnet_up",description:"Start a local Midnight network via Docker Compose",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"up",positionals:[],flags:{json:!0}},Z=await D("localnet");return T(Z,$)}},{name:"midnight_localnet_stop",description:"Stop local network containers (preserves state for fast restart)",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"stop",positionals:[],flags:{json:!0}},Z=await D("localnet");return T(Z,$)}},{name:"midnight_localnet_down",description:"Remove local network containers, networks, and volumes (full teardown)",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"down",positionals:[],flags:{json:!0}},Z=await D("localnet");return T(Z,$)}},{name:"midnight_localnet_status",description:"Show local network service status and ports",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"status",positionals:[],flags:{json:!0}},Z=await D("localnet");return T(Z,$)}},{name:"midnight_localnet_clean",description:"Remove conflicting containers from other setups",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"clean",positionals:[],flags:{json:!0}},Z=await D("localnet");return T(Z,$)}}],B1=new Z$({name:"midnight-wallet-cli",version:L1},{capabilities:{tools:{}}});B1.setRequestHandler(X$,async()=>{return{tools:n3.map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}});B1.setRequestHandler(z$,async($)=>{let{name:Z,arguments:Q}=$.params,X=n3.find((z)=>z.name===Z);if(!X)return{content:[{type:"text",text:`Unknown tool: ${Z}`}],isError:!0};try{let z=await X.handler(Q??{});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){let q=z instanceof Error?z:new Error(String(z)),{errorCode:Y}=F1(q);return{content:[{type:"text",text:JSON.stringify({error:!0,code:Y,message:q.message})}],isError:!0}}});async function Y$(){let $=new Q$;await B1.connect($)}Y$().catch(($)=>{process.stderr.write(`MCP server error: ${$.message}
313
+ `);process.stderr.write(q0(R(" SEED (hex):"))+`
314
+ `),process.stderr.write(` ${G.toString("hex")}
315
+
316
+ `),process.stderr.write(C()+`
317
+ `),process.stderr.write(H(" Next: midnight wallet list | midnight balance")+`
318
+
319
+ `),process.stderr.write(S("✓")+` Wallet saved
320
+ `)}async function M7($){let Z=b2();if(I($,"json")){M({wallets:Z});return}if(Z.length===0){process.stderr.write(`
321
+ No wallets found.
322
+ `),process.stderr.write(H(" Create one: midnight wallet generate <name> --network <name>")+`
323
+
324
+ `);return}let Q=d({args:$});process.stderr.write(`
325
+ `+D("Wallets")+`
326
+
327
+ `);for(let X of Z){let z=X.isActive?S(" ●"):" ",q=X.name.padEnd(16),Y=X.isActive?R(r(q)):r(q),G=X.addresses[Q]??"(unknown)",K=G.length>30?G.slice(0,20)+"..."+G.slice(-8):G;process.stderr.write(`${z} ${Y} ${K.padEnd(35)} ${H(Q)}
328
+ `)}process.stderr.write(`
329
+ `+C()+`
330
+ `),process.stderr.write(H(" ● = active wallet")+`
331
+
332
+ `)}async function _7($){let Z=$.positionals[0];if(!Z)throw new Error(`Missing wallet name.
333
+ Usage: midnight wallet use <name>`);if(p1(Z),I($,"json")){M({wallet:Z,active:!0});return}process.stderr.write(S("✓")+` Active wallet set to "${Z}"
334
+ `)}async function T7($){let Z=$.positionals[0]??A0(),Q=u(Z),X=m(Q),z=Z===A0(),q=d({args:$}),Y=X.addresses[q];if(I($,"json")){M({name:Z,addresses:X.addresses,activeAddress:Y,activeNetwork:q,createdAt:X.createdAt,file:Q,active:z});return}process.stdout.write(Y+`
335
+ `),process.stderr.write(`
336
+ `+D("Wallet Info")+`
337
+
338
+ `),process.stderr.write(L("Name",Z)+`
339
+ `);for(let[G,K]of Object.entries(X.addresses)){let J=G===q,V=J?R(G):G,j=J?" *":"";process.stderr.write(L(V+j,v(K))+`
340
+ `)}process.stderr.write(L("Created",X.createdAt)+`
341
+ `),process.stderr.write(L("File",Q)+`
342
+ `),process.stderr.write(L("Active",z?"yes":"no")+`
343
+ `),process.stderr.write(H(" * = active network")+`
344
+ `),process.stderr.write(`
345
+ `+C()+`
346
+
347
+ `)}async function R7($){let Z=$.positionals[0];if(!Z)throw new Error(`Missing wallet name.
348
+ Usage: midnight wallet remove <name>`);if(S2(Z),I($,"json")){M({wallet:Z,removed:!0});return}process.stderr.write(S("✓")+` Wallet "${Z}" removed
349
+ `)}var $3=E(()=>{j0();o();X0();c()});var q3={};f(q3,{default:()=>z3});function z2($){let Z=Date.now()-new Date($).getTime();if(Z<60000)return"just now";if(Z<3600000)return`${Math.floor(Z/60000)}m ago`;if(Z<86400000)return`${Math.floor(Z/3600000)}h ago`;return`${Math.floor(Z/86400000)}d ago`}function X2($){let Z=!1,Q=!1;for(let X of Object.values($)){if(X.status==="down")Z=!0;if(X.status==="degraded")Q=!0}if(Z)return"down";if(Q)return"degraded";return"up"}async function W1($){let Z=`${l0}${$}`,Q=await fetch(Z,{signal:AbortSignal.timeout(1e4)});if(!Q.ok)throw new Error(`Dashboard returned HTTP ${Q.status} for ${$}`);return Q.json()}async function D7($){let Z=_($,"network");if(Z)return Z;try{let{loadCliConfig:Q}=await Promise.resolve().then(() => (L0(),D2)),X=Q();if(X.network&&Z0(X.network))return X.network}catch{}return}async function P1($,Z={}){let Q=new AbortController,X=setTimeout(()=>Q.abort(),E7),z=Date.now();try{return{response:await fetch($,{...Z,signal:Q.signal}),latencyMs:Date.now()-z}}finally{clearTimeout(X)}}async function C7($){let Z=new Date().toISOString();try{let{response:Q,latencyMs:X}=await P1($,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:"{ block { height } }"})});if(!Q.ok){if(Q.status===403)return{status:"degraded",latencyMs:X,lastChecked:Z,notes:"HTTP 403 — likely WAF blocking"};return{status:"down",latencyMs:X,lastChecked:Z,notes:`HTTP ${Q.status}`}}let z=await Q.json();if(!z?.data)return{status:"down",latencyMs:X,lastChecked:Z,notes:"No data field"};let q=z.data?.block?.height;return{status:X>L1?"degraded":"up",latencyMs:X,lastChecked:Z,...q!==void 0?{blockHeight:q}:{},...X>L1?{notes:`Slow (${X}ms)`}:{}}}catch(Q){return{status:"down",latencyMs:0,lastChecked:Z,notes:Q.message}}}async function N7($){let Z=new Date().toISOString(),Q=$.replace(/^wss:/,"https:").replace(/^ws:/,"http:");try{let{response:X,latencyMs:z}=await P1(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"system_health",params:[]})});if(!X.ok){if(X.status===403)return{status:"degraded",latencyMs:z,lastChecked:Z,notes:"HTTP 403 — likely WAF blocking"};return{status:"down",latencyMs:z,lastChecked:Z,notes:`HTTP ${X.status}`}}let Y=(await X.json())?.result;if(!Y)return{status:"down",latencyMs:z,lastChecked:Z,notes:"No result in response"};let G=Y.peers??0,K=Y.isSyncing??!1,J="up",V;if(K)J="degraded",V="Node is syncing";else if(G===0)J="degraded",V="No peers";return{status:J,latencyMs:z,lastChecked:Z,peers:G,isSyncing:K,...V?{notes:V}:{}}}catch(X){return{status:"down",latencyMs:0,lastChecked:Z,notes:X.message}}}async function y7($){let Z=new Date().toISOString();if(!$)return{status:"unknown",latencyMs:0,lastChecked:Z,notes:"No faucet URL"};try{let{response:Q,latencyMs:X}=await P1($);if(!Q.ok)return{status:"down",latencyMs:X,lastChecked:Z,notes:`HTTP ${Q.status}`};return{status:X>Q3?"degraded":"up",latencyMs:X,lastChecked:Z,...X>Q3?{notes:`Slow (${X}ms)`}:{}}}catch(Q){return{status:"down",latencyMs:0,lastChecked:Z,notes:Q.message}}}async function b7($){let Z=new Date().toISOString();if(!$)return{status:"unknown",latencyMs:0,lastChecked:Z,notes:"URL not configured"};try{let{response:Q,latencyMs:X}=await P1($);if(!Q.ok)return{status:"down",latencyMs:X,lastChecked:Z,notes:`HTTP ${Q.status}`};let z=await Q.text();if(!z||z.length===0)return{status:"down",latencyMs:X,lastChecked:Z,notes:"Empty response"};return{status:X>L1?"degraded":"up",latencyMs:X,lastChecked:Z,...X>L1?{notes:`Slow (${X}ms)`}:{}}}catch(Q){return{status:"down",latencyMs:0,lastChecked:Z,notes:Q.message}}}async function X3($){if(!Z0($))return{};let Z=w1($),Q=x7[$];if(!Q)return{};let[X,z,q,Y]=await Promise.all([C7(Z.indexer),N7(Z.node),y7(Q.faucet),b7(Q.explorer)]);return{indexer:X,rpc:z,faucet:q,explorer:Y}}function S7($,Z,Q){process.stderr.write(`
350
+ `+R($)+`
351
+ `),process.stderr.write(H(" "+"─".repeat(62))+`
352
+ `);let X=new Set([...Object.keys(Q),...Z?Object.keys(Z):[]]);for(let z of X){let q=Q[z],Y=Z?.[z],G=(A7[z]??z).padEnd(18);if(q){let K=Z3[q.status]??H("—"),J=q.latencyMs>0?H(` ${q.latencyMs}ms`):"",V=q.notes?H(` — ${q.notes}`):"",j="";if(Y&&Y.status!==q.status&&Y.status!=="unknown")j=H(` (canary: ${Y.status}${Y.lastChecked?" "+z2(Y.lastChecked):""})`);process.stderr.write(` ${D0(G)}${K}${J}${V}${j}
353
+ `)}else if(Y){let K=Z3[Y.status]??H("—"),J=Y.latencyMs>0?H(` ${Y.latencyMs}ms`):"",V=Y.lastChecked?H(` (${z2(Y.lastChecked)})`):"",j=Y.notes?H(` — ${Y.notes}`):"";process.stderr.write(` ${D0(G)}${K}${J}${V}${j}
354
+ `)}}}function v7($,Z){let Q=Z?$.filter((X)=>X.affects.toLowerCase().includes(Z.toLowerCase())):$;if(Q.length===0)return;process.stderr.write(`
355
+ `+D("Known Issues")+`
356
+
357
+ `);for(let X of Q)process.stderr.write(` ${a(X.id.padEnd(28))}${X.summary}
358
+ `),process.stderr.write(` ${" ".repeat(28)}${H(X.status)}
359
+ `)}async function z3($){let Z=I($,"json"),Q=I($,"all"),X=I($,"watch"),z=await D7($)??"preprod",q=w("Checking network status..."),Y=null,G=null,K,J;if(Q)J=["preprod","preview"];else J=[z];let[V,...j]=await Promise.all([Promise.all([W1("/api/status"),W1("/api/issues")]).catch((P)=>{return K=P.message,null}),...J.map((P)=>X3(P))]);if(V)[Y,G]=V;q.stop("Done");let U={};for(let P=0;P<J.length;P++)U[J[P]]=j[P];if(Z){let P={lastUpdated:Y?.lastUpdated??null,dashboard:l0,canaryAvailable:Y!==null,networks:{}};for(let F of J){let O=U[F]??{},A=Y?.networks[F],k={...A,...O};P.networks[F]={overall:X2(k),live:O,canary:A??null}}if(G){let F=Q?void 0:J[0];P.issues=F?G.issues.filter((O)=>O.affects.toLowerCase().includes(F.toLowerCase())):G.issues}if(K)P.canaryError=K;M(P);let x=J.reduce((F,O)=>{let A={...Y?.networks[O]??{},...U[O]??{}},k=X2(A);if(k==="down")return"down";if(k==="degraded"&&F!=="down")return"degraded";return F},"up");if(x==="down")process.exitCode=2;else if(x==="degraded")process.exitCode=1;return}let W=()=>{if(process.stderr.write(`
360
+ `+D("Midnight Network Status")+`
361
+ `),Y?.lastUpdated)process.stderr.write(H(` Canary: ${z2(Y.lastUpdated)}`)+" ");if(process.stderr.write(H("Live: just now")+`
362
+ `),K)process.stderr.write(H(` (Dashboard unreachable: ${K})`)+`
363
+ `);if(J.length===0){process.stderr.write(`
364
+ `+H("No network data available.")+`
365
+
366
+ `);return}for(let P of J)S7(P,Y?.networks[P],U[P]??{});if(G){let P=Q?void 0:J[0];v7(G.issues,P)}process.stderr.write(`
367
+ `+C()+`
368
+ `),process.stderr.write(H(" Dashboard: ")+r(l0)+`
369
+
370
+ `)};if(W(),X){let P=setInterval(async()=>{try{let[x,...F]=await Promise.all([Promise.all([W1("/api/status"),W1("/api/issues")]).catch(()=>null),...J.map((O)=>X3(O))]);if(x)[Y,G]=x;for(let O=0;O<J.length;O++)U[J[O]]=F[O];process.stderr.write("\x1B[2J\x1B[H"),W()}catch{process.stderr.write(H(" Refresh failed — retrying in 30s")+`
371
+ `)}},30000);await new Promise(()=>{process.on("SIGINT",()=>{clearInterval(P),process.exit(0)})})}let B=J.reduce((P,x)=>{let F={...Y?.networks[x]??{},...U[x]??{}},O=X2(F);if(O==="down")return"down";if(O==="degraded"&&P!=="down")return"degraded";return P},"up");if(B==="down")process.exitCode=2;else if(B==="degraded")process.exitCode=1}var x7,A7,Z3,E7=15000,L1=5000,Q3=1e4;var Y3=E(()=>{Q0();c();B0();x7={preprod:{faucet:"https://faucet.preprod.midnight.network/",explorer:"https://preprod.midnightexplorer.com/"},preview:{faucet:"https://faucet.preview.midnight.network/",explorer:null},undeployed:{faucet:"",explorer:""}},A7={indexer:"Indexer",rpc:"RPC Node",faucet:"Faucet",explorer:"Explorer",chain:"Chain",dust:"Dust Generation",wallet:"Wallet Ops",dapp:"DApp Flow"},Z3={up:S("UP"),down:a("DOWN"),degraded:R("\x1B[33mDEGRADED\x1B[0m"),unknown:H("—")}});import{Server as k7}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as w7}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema as h7,CallToolRequestSchema as f7}from"@modelcontextprotocol/sdk/types.js";async function N($,Z,Q){let X=[];M1((q)=>X.push(q));let z=process.stderr.write;process.stderr.write=()=>!0;try{Z.flags.json=!0,await $(Z,Q);let q=X.join("").trim();if(!q)return{};return JSON.parse(q)}finally{M1(null),process.stderr.write=z}}var n={INVALID_ARGS:"INVALID_ARGS",WALLET_NOT_FOUND:"WALLET_NOT_FOUND",NETWORK_ERROR:"NETWORK_ERROR",INSUFFICIENT_BALANCE:"INSUFFICIENT_BALANCE",TX_REJECTED:"TX_REJECTED",STALE_UTXO:"STALE_UTXO",PROOF_TIMEOUT:"PROOF_TIMEOUT",DUST_REQUIRED:"DUST_REQUIRED",CANCELLED:"CANCELLED",UNKNOWN:"UNKNOWN"};function j2($){let Z=($.message??"").toLowerCase();if(Z.includes("operation cancelled")||Z.includes("operation aborted")||Z==="cancelled"||Z==="aborted")return{exitCode:7,errorCode:n.CANCELLED};if(Z.includes("wallet file not found")||Z.includes("wallet")&&Z.includes("not found"))return{exitCode:3,errorCode:n.WALLET_NOT_FOUND};if(Z.includes("missing required flag")||Z.includes("missing amount")||Z.includes("missing recipient")||Z.includes("missing config key")||Z.includes("missing or invalid subcommand")||Z.includes("unknown command")||Z.includes("cannot specify both")||Z.includes("invalid bip-39")||Z.includes("seed must be")||Z.includes("key index must be")||Z.includes("usage:"))return{exitCode:2,errorCode:n.INVALID_ARGS};if(Z.includes("proof")&&Z.includes("timeout"))return{exitCode:6,errorCode:n.PROOF_TIMEOUT};if(Z.includes("stale utxo")||Z.includes("error code 115")||Z.includes("errorcode: 115"))return{exitCode:6,errorCode:n.STALE_UTXO};if(Z.includes("no dust")||Z.includes("dust")&&(Z.includes("required")||Z.includes("available")||Z.includes("insufficient")))return{exitCode:5,errorCode:n.DUST_REQUIRED};if(Z.includes("insufficient")||Z.includes("not enough"))return{exitCode:5,errorCode:n.INSUFFICIENT_BALANCE};if(Z.includes("rejected")||Z.includes("transaction failed"))return{exitCode:6,errorCode:n.TX_REJECTED};if(Z.includes("econnrefused")||Z.includes("enotfound")||Z.includes("etimedout")||Z.includes("websocket")||Z.includes("connection refused")||Z.includes("network")&&Z.includes("error"))return{exitCode:4,errorCode:n.NETWORK_ERROR};return{exitCode:1,errorCode:n.UNKNOWN}}var p0={name:"midnight-wallet-cli",version:"0.2.0",type:"module",description:"Git-style CLI wallet for the Midnight blockchain",license:"Apache-2.0",workspaces:["packages/*"],bin:{midnight:"dist/wallet.js",mn:"dist/wallet.js","midnight-wallet-cli":"dist/wallet.js","midnight-wallet-mcp":"dist/mcp-server.js"},files:["dist"],scripts:{wallet:"tsx src/wallet.ts",build:'bun build src/wallet.ts --outfile dist/wallet.js --target node --format esm --packages external --minify --banner "#!/usr/bin/env node" && bun build src/mcp-server.ts --outfile dist/mcp-server.js --target node --format esm --packages external --minify --banner "#!/usr/bin/env node"',mcp:"tsx src/mcp-server.ts",prepublishOnly:"npm run build && npm run test",test:"vitest run","test:watch":"vitest",typecheck:"tsc --noEmit"},dependencies:{"@midnight-ntwrk/dapp-connector-api":"^4.0.1","@midnight-ntwrk/ledger-v7":"^7.0.2","@midnight-ntwrk/midnight-js-network-id":"3.0.0","@midnight-ntwrk/midnight-js-types":"3.0.0","@midnight-ntwrk/wallet-sdk-abstractions":"^2.0.0","@midnight-ntwrk/wallet-sdk-address-format":"^3.0.1","@midnight-ntwrk/wallet-sdk-dust-wallet":"^2.0.0","@midnight-ntwrk/wallet-sdk-facade":"^2.0.0","@midnight-ntwrk/wallet-sdk-hd":"^3.0.1","@midnight-ntwrk/wallet-sdk-shielded":"^2.0.0","@midnight-ntwrk/wallet-sdk-unshielded-wallet":"^2.0.0","@modelcontextprotocol/sdk":"^1.27.1","@scure/bip39":"^2.0.1",rxjs:"^7.8.1",ws:"^8.19.0"},devDependencies:{"@types/node":"^22.19.13","@types/ws":"^8.18.1",tsx:"^4.21.0",typescript:"^5.9.3",vitest:"^3.2.4"}};var t7=p0.name,V2=p0.version,r7=p0.description;function i($,Z,Q){let X={json:!0},z=[];for(let[q,Y]of Object.entries(Z)){if(Y===void 0||Y===null)continue;if(typeof Y==="boolean"){if(Y)X[q]=!0}else X[q]=String(Y)}return{command:$,subcommand:Q,positionals:z,flags:X}}var p7={generate:()=>Promise.resolve().then(() => (m2(),u2)),info:()=>Promise.resolve().then(() => (d2(),g2)),balance:()=>Promise.resolve().then(() => (a2(),r2)),address:()=>Promise.resolve().then(() => ($$(),e2)),"genesis-address":()=>Promise.resolve().then(() => (X$(),Q$)),"inspect-cost":()=>Promise.resolve().then(() => (G$(),Y$)),airdrop:()=>Promise.resolve().then(() => (_$(),M$)),transfer:()=>Promise.resolve().then(() => (x$(),R$)),dust:()=>Promise.resolve().then(() => (C$(),D$)),cache:()=>Promise.resolve().then(() => (b$(),y$)),config:()=>Promise.resolve().then(() => (k$(),v$)),localnet:()=>Promise.resolve().then(() => (n$(),o$)),wallet:()=>Promise.resolve().then(() => ($3(),e$)),status:()=>Promise.resolve().then(() => (Y3(),q3))};async function y($){let Z=p7[$];if(!Z)throw new Error(`Unknown command handler: ${$}`);return(await Z()).default}var G3=[{name:"midnight_generate",description:"Generate a new wallet (deprecated — use midnight_wallet_generate instead)",inputSchema:{type:"object",properties:{network:{type:"string",description:"Network: preprod, preview, undeployed",enum:["preprod","preview","undeployed"]},seed:{type:"string",description:"Restore from existing seed (64-char hex)"},mnemonic:{type:"string",description:"Restore from BIP-39 mnemonic (24 words)"},output:{type:"string",description:"Custom output path (deprecated — use midnight_wallet_generate instead)"},force:{type:"string",description:'Set to "true" to overwrite existing wallet file'}}},async handler($){let Z=i("generate",$);if($.force==="true"||$.force===!0)Z.flags.force=!0;let Q=await y("generate");return N(Q,Z)}},{name:"midnight_wallet_generate",description:"Create a new named wallet and set it as active",inputSchema:{type:"object",properties:{name:{type:"string",description:'Wallet name (e.g. "alice", "dev")'},network:{type:"string",description:"Network: preprod, preview, undeployed",enum:["preprod","preview","undeployed"]},seed:{type:"string",description:"Restore from existing seed (64-char hex)"},mnemonic:{type:"string",description:"Restore from BIP-39 mnemonic (24 words)"},force:{type:"string",description:'Set to "true" to overwrite existing wallet'}},required:["name"]},async handler($){let Z=$.name,Q=i("wallet",$,"generate");if(Q.positionals=[Z],delete Q.flags.name,$.force==="true"||$.force===!0)Q.flags.force=!0;let X=await y("wallet");return N(X,Q)}},{name:"midnight_wallet_list",description:"List all wallets with name, address, network, and active marker",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"wallet",subcommand:"list",positionals:[],flags:{json:!0}},Z=await y("wallet");return N(Z,$)}},{name:"midnight_wallet_use",description:"Set the active wallet by name",inputSchema:{type:"object",properties:{name:{type:"string",description:"Wallet name to activate"}},required:["name"]},async handler($){let Q={command:"wallet",subcommand:"use",positionals:[$.name],flags:{json:!0}},X=await y("wallet");return N(X,Q)}},{name:"midnight_wallet_info",description:"Show details for a named wallet or the active wallet",inputSchema:{type:"object",properties:{name:{type:"string",description:"Wallet name (default: active wallet)"}}},async handler($){let Z=$.name,Q={command:"wallet",subcommand:"info",positionals:Z?[Z]:[],flags:{json:!0}},X=await y("wallet");return N(X,Q)}},{name:"midnight_wallet_remove",description:"Remove a named wallet (refuses active or last wallet)",inputSchema:{type:"object",properties:{name:{type:"string",description:"Wallet name to remove"}},required:["name"]},async handler($){let Q={command:"wallet",subcommand:"remove",positionals:[$.name],flags:{json:!0}},X=await y("wallet");return N(X,Q)}},{name:"midnight_info",description:"Display wallet address, network, creation date (no secrets shown)",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Wallet name or path"}}},async handler($){let Z=i("info",$),Q=await y("info");return N(Q,Z)}},{name:"midnight_balance",description:"Check unshielded balance via indexer subscription",inputSchema:{type:"object",properties:{address:{type:"string",description:"Address to check (or reads from wallet file)"},wallet:{type:"string",description:"Wallet name or path"},network:{type:"string",description:"Override network detection",enum:["preprod","preview","undeployed"]},"indexer-ws":{type:"string",description:"Custom indexer WebSocket URL"}}},async handler($){let Z=$.address,Q=i("balance",$,Z);delete Q.flags.address;let X=await y("balance");return N(X,Q)}},{name:"midnight_address",description:"Derive and display an unshielded address from a seed",inputSchema:{type:"object",properties:{seed:{type:"string",description:"Seed to derive from (required, 64-char hex)"},network:{type:"string",description:"Network for address prefix",enum:["preprod","preview","undeployed"]},index:{type:"string",description:"Key derivation index (default: 0)"}},required:["seed"]},async handler($){let Z=i("address",$),Q=await y("address");return N(Q,Z)}},{name:"midnight_genesis_address",description:"Display the genesis wallet address (seed 0x01) for a network",inputSchema:{type:"object",properties:{network:{type:"string",description:"Network for address prefix",enum:["preprod","preview","undeployed"]}}},async handler($){let Z=i("genesis-address",$),Q=await y("genesis-address");return N(Q,Z)}},{name:"midnight_inspect_cost",description:"Display current block limits derived from LedgerParameters",inputSchema:{type:"object",properties:{}},async handler(){let $=i("inspect-cost",{}),Z=await y("inspect-cost");return N(Z,$)}},{name:"midnight_airdrop",description:"Fund your wallet from the genesis wallet (undeployed network only)",inputSchema:{type:"object",properties:{amount:{type:"string",description:"Amount in NIGHT to airdrop"},wallet:{type:"string",description:"Wallet name or path"},"no-cache":{type:"string",description:'Set to "true" to bypass wallet state cache'}},required:["amount"]},async handler($){let Z=$.amount,Q=i("airdrop",$,Z);delete Q.flags.amount;let X=await y("airdrop");return N(X,Q)}},{name:"midnight_transfer",description:"Send NIGHT tokens to another address",inputSchema:{type:"object",properties:{to:{type:"string",description:"Recipient bech32m address"},amount:{type:"string",description:"Amount in NIGHT to send"},wallet:{type:"string",description:"Wallet name or path"},"proof-server":{type:"string",description:"Override proof server URL"},node:{type:"string",description:"Override substrate node RPC URL"},"indexer-ws":{type:"string",description:"Override indexer WebSocket URL"},"no-cache":{type:"string",description:'Set to "true" to bypass wallet state cache'}},required:["to","amount"]},async handler($){let{to:Z,amount:Q}=$,X=i("transfer",$,Z);X.positionals=[Q],delete X.flags.to,delete X.flags.amount;let z=await y("transfer");return N(z,X)}},{name:"midnight_dust_register",description:"Register NIGHT UTXOs for dust (fee token) generation",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Wallet name or path"},"proof-server":{type:"string",description:"Override proof server URL"},node:{type:"string",description:"Override substrate node RPC URL"},"indexer-ws":{type:"string",description:"Override indexer WebSocket URL"},"no-cache":{type:"string",description:'Set to "true" to bypass wallet state cache'}}},async handler($){let Z=i("dust",$,"register"),Q=await y("dust");return N(Q,Z)}},{name:"midnight_dust_status",description:"Check dust registration status and balance",inputSchema:{type:"object",properties:{wallet:{type:"string",description:"Wallet name or path"},"proof-server":{type:"string",description:"Override proof server URL"},node:{type:"string",description:"Override substrate node RPC URL"},"indexer-ws":{type:"string",description:"Override indexer WebSocket URL"},"no-cache":{type:"string",description:'Set to "true" to bypass wallet state cache'}}},async handler($){let Z=i("dust",$,"status"),Q=await y("dust");return N(Q,Z)}},{name:"midnight_config_get",description:"Read a persistent config value",inputSchema:{type:"object",properties:{key:{type:"string",description:'Config key to read (e.g. "network")'}},required:["key"]},async handler($){let Q={command:"config",subcommand:"get",positionals:[$.key],flags:{json:!0}},X=await y("config");return N(X,Q)}},{name:"midnight_config_set",description:"Write a persistent config value",inputSchema:{type:"object",properties:{key:{type:"string",description:'Config key to set (e.g. "network")'},value:{type:"string",description:"Config value to set"}},required:["key","value"]},async handler($){let{key:Z,value:Q}=$,X={command:"config",subcommand:"set",positionals:[Z,Q],flags:{json:!0}},z=await y("config");return N(z,X)}},{name:"midnight_cache_clear",description:"Clear cached wallet sync state",inputSchema:{type:"object",properties:{network:{type:"string",description:"Only clear cache for this network",enum:["preprod","preview","undeployed"]},wallet:{type:"string",description:"Only clear cache for this wallet (name or path)"}}},async handler($){let Z=i("cache",$,"clear"),Q=await y("cache");return N(Q,Z)}},{name:"midnight_config_unset",description:"Reset a persistent config value to its default",inputSchema:{type:"object",properties:{key:{type:"string",description:"Config key to reset"}},required:["key"]},async handler($){let Q={command:"config",subcommand:"unset",positionals:[$.key],flags:{json:!0}},X=await y("config");return N(X,Q)}},{name:"midnight_localnet_up",description:"Start a local Midnight network via Docker Compose",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"up",positionals:[],flags:{json:!0}},Z=await y("localnet");return N(Z,$)}},{name:"midnight_localnet_stop",description:"Stop local network containers (preserves state for fast restart)",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"stop",positionals:[],flags:{json:!0}},Z=await y("localnet");return N(Z,$)}},{name:"midnight_localnet_down",description:"Remove local network containers, networks, and volumes (full teardown)",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"down",positionals:[],flags:{json:!0}},Z=await y("localnet");return N(Z,$)}},{name:"midnight_localnet_status",description:"Show local network service status and ports",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"status",positionals:[],flags:{json:!0}},Z=await y("localnet");return N(Z,$)}},{name:"midnight_localnet_clean",description:"Remove conflicting containers from other setups",inputSchema:{type:"object",properties:{}},async handler(){let $={command:"localnet",subcommand:"clean",positionals:[],flags:{json:!0}},Z=await y("localnet");return N(Z,$)}}],q2=new k7({name:"midnight-wallet-cli",version:V2},{capabilities:{tools:{}}});q2.setRequestHandler(h7,async()=>{return{tools:G3.map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}});q2.setRequestHandler(f7,async($)=>{let{name:Z,arguments:Q}=$.params,X=G3.find((z)=>z.name===Z);if(!X)return{content:[{type:"text",text:`Unknown tool: ${Z}`}],isError:!0};try{let z=await X.handler(Q??{});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){let q=z instanceof Error?z:new Error(String(z)),{errorCode:Y}=j2(q);return{content:[{type:"text",text:JSON.stringify({error:!0,code:Y,message:q.message})}],isError:!0}}});async function u7(){let $=new w7;await q2.connect($)}u7().catch(($)=>{process.stderr.write(`MCP server error: ${$.message}
277
372
  `),process.exit(1)});