midnight-wallet-cli 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/wallet.js CHANGED
@@ -1,51 +1,51 @@
1
1
  #!/usr/bin/env node
2
- var P2=Object.defineProperty;var w=($,Z)=>{for(var Q in Z)P2($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:(X)=>Z[Q]=()=>X})};var O=($,Z)=>()=>($&&(Z=$($=0)),Z);function o1($){let Z=$??process.argv.slice(2),Q=[],X={},q=0;while(q<Z.length){let z=Z[q];if(z.startsWith("--")){let Y=z.slice(2),K=Z[q+1];if(K!==void 0&&!K.startsWith("-"))X[Y]=K,q+=2;else X[Y]=!0,q+=1}else if(z.startsWith("-")&&z.length===2){let Y=z.slice(1),K=Z[q+1];if(K!==void 0&&!K.startsWith("-"))X[Y]=K,q+=2;else X[Y]=!0,q+=1}else Q.push(z),q+=1}return{command:Q[0],subcommand:Q[1],positionals:Q.slice(2),flags:X}}function A($,Z){let Q=$.flags[Z];if(Q===void 0||Q===!0)return;return Q}function P($,Z){return Z in $.flags}function n1($,Z,Q){let X=A($,Z);if(X===void 0)throw new Error(`Missing required flag: --${Z} <${Q}>`);return X}var _0="0000000000000000000000000000000000000000000000000000000000000001",a1="0000000000000000000000000000000000000000000000000000000000000000",r0=6,t1=1e6,r1=1000000000000n,s1=5,e1=300000,$3=1e4,A0=120000,Z3=300000,s0=60000,e0=10,D0=3,Q3=600000,R0=15000,X3=115,p=".midnight",z0="wallet.json",q3="config.json",$0=448,x0=384,z3="localnet";function l(){return!("NO_COLOR"in process.env)}function Y0($,Z){if(!l())return $;return`\x1B[38;5;${Z}m${$}\x1B[0m`}function y($){if(!l())return $;return`\x1B[1m${$}\x1B[0m`}function j($){if(!l())return $;return`\x1B[2m${$}\x1B[0m`}function a($){return Y0($,38)}function S($){return Y0($,196)}function i($){return Y0($,40)}function V0($){return Y0($,226)}function H0($){return Y0($,15)}function J0($){return Y0($,245)}function _($,Z=J3){let Q=` ${$} `,X=Z-Q.length;if(X<=0)return y(Q);let q=Math.floor(X/2),z=X-q;return y("═".repeat(q)+Q+"═".repeat(z))}function D($=J3){return j("─".repeat($))}function H($,Z,Q=16){let X=($+":").padEnd(Q);return` ${J0(X)}${Z}`}function F0($){let Z=$<0n,Q=Z?-$:$,X=BigInt(10**r0),q=Q/X,Y=(Q%X).toString().padStart(r0,"0");return`${Z?"-":""}${q}.${Y}`}function E0($){return`${F0($)} NIGHT`}function P0($){let Z=$<0n,Q=Z?-$:$,X=10n**BigInt(Y3),q=Q/X,K=(Q%X).toString().padStart(Y3,"0").replace(/0+$/,"").padEnd(6,"0");return`${Z?"-":""}${q}.${K}`}function N0($){return`${P0($)} DUST`}function E($,Z=!1){let Q=Z&&$.length>20?$.slice(0,10)+"…"+$.slice(-8):$;return a(Q)}function O2($,Z){if(j0($).length<=Z)return[$];let X=$.split(/(\s+)/),q=[],z="",Y=0;for(let K of X){let G=j0(K).length;if(Y+G>Z&&Y>0)q.push(z),z=K.trimStart(),Y=j0(z).length;else z+=K,Y+=G}if(z.length>0)q.push(z);return q}function L2($,Z="light",Q=70){let X=Z==="heavy"?{tl:"╔",tr:"╗",bl:"╚",br:"╝",h:"═",v:"║"}:{tl:"┌",tr:"┐",bl:"└",br:"┘",h:"─",v:"│"},q=Q-4,z=[];for(let J of $){let V=J.split(`
3
- `);for(let B of V)z.push(...O2(B,q))}let Y=Math.max(...z.map((J)=>j0(J).length)),K=Math.max(Y+2,20),G=X.tl+X.h.repeat(K)+X.tr,U=X.bl+X.h.repeat(K)+X.br,W=z.map((J)=>{let V=j0(J).length,B=K-V-2;return`${X.v} ${J}${" ".repeat(Math.max(0,B))} ${X.v}`});return[G,...W,U].join(`
4
- `)}function K3($,Z){let X=$.split(`
5
- `).map((z,Y)=>Y===0?S(y("Error: "))+S(z):S(z));if(Z)X.push(""),X.push(j("Suggestion: ")+Z);let q=L2(X,"heavy");if(l())return q.replace(/[╔╗╚╝═║]/g,(z)=>S(z));return q}function Z0($,Z){let X=[`${i("✓")} ${$}`];if(Z)X.push(H("Transaction",a(Z)));return X.join(`
6
- `)}var J3=60,Y3=15,j0=($)=>$.replace(/\x1b\[[0-9;]*m/g,"");var N=()=>{};function O0($){let Z=($.message??"").toLowerCase();if(Z.includes("operation cancelled")||Z.includes("operation aborted")||Z==="cancelled"||Z==="aborted")return{exitCode:7,errorCode:u.CANCELLED};if(Z.includes("wallet file not found")||Z.includes("wallet")&&Z.includes("not found"))return{exitCode:3,errorCode:u.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:u.INVALID_ARGS};if(Z.includes("proof")&&Z.includes("timeout"))return{exitCode:6,errorCode:u.PROOF_TIMEOUT};if(Z.includes("stale utxo")||Z.includes("error code 115")||Z.includes("errorcode: 115"))return{exitCode:6,errorCode:u.STALE_UTXO};if(Z.includes("no dust")||Z.includes("dust")&&(Z.includes("required")||Z.includes("available")||Z.includes("insufficient")))return{exitCode:5,errorCode:u.DUST_REQUIRED};if(Z.includes("insufficient")||Z.includes("not enough"))return{exitCode:5,errorCode:u.INSUFFICIENT_BALANCE};if(Z.includes("rejected")||Z.includes("transaction failed"))return{exitCode:6,errorCode:u.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:u.NETWORK_ERROR};return{exitCode:1,errorCode:u.UNKNOWN}}var u;var $1=O(()=>{u={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 G3(){let $=process.stderr.write;return process.stderr.write=()=>!0,()=>{process.stderr.write=$}}function Q1($){Z1=$}function L($){let Z=JSON.stringify($)+`
7
- `;if(Z1)Z1(Z);else process.stdout.write(Z)}function U3($,Z,Q){process.stdout.write(JSON.stringify({error:!0,code:Z,message:$.message,exitCode:Q})+`
8
- `)}var Z1=null;var v0;var B3=O(()=>{v0={name:"midnight-wallet-cli",version:"0.1.8",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 W3,Q0,V3;var k0=O(()=>{B3();W3=v0.name,Q0=v0.version,V3=v0.description});async function R($,Z,Q){let X=[];Q1((z)=>X.push(z));let q=process.stderr.write;process.stderr.write=()=>!0;try{Z.flags.json=!0,await $(Z,Q);let z=X.join("").trim();if(!z)return{};return JSON.parse(z)}finally{Q1(null),process.stderr.write=q}}var H3=()=>{};import{HDWallet as T2,Roles as M2}from"@midnight-ntwrk/wallet-sdk-hd";import{createKeystore as I2,PublicKey as _2}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{NetworkId as X1}from"@midnight-ntwrk/wallet-sdk-abstractions";function K0($,Z,Q=0){let X=A2[Z],q=T2.fromSeed($);if(q.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let z=q.hdWallet.selectAccount(0).selectRole(M2.NightExternal).deriveKeyAt(Q);if(z.type==="keyOutOfBounds")throw new Error(`Key index ${Q} out of bounds`);let Y=I2(z.key,X);return _2.fromKeyStore(Y).address}var A2;var b0=O(()=>{A2={preprod:X1.NetworkId.PreProd,preview:X1.NetworkId.Preview,undeployed:X1.NetworkId.Undeployed}});import{execSync as D2}from"child_process";function o($){return j3.includes($)}function x2($){return{...R2[$]}}function F3(){return j3}function P3($){if($.startsWith("mn_addr_preprod1"))return"preprod";if($.startsWith("mn_addr_preview1"))return"preview";if($.startsWith("mn_addr_undeployed1"))return"undeployed";return null}function E2(){try{let $=D2('docker ps --format "{{.Image}}|{{.Ports}}"',{encoding:"utf-8",timeout:5000}),Z={};for(let Q of $.trim().split(`
9
- `)){if(!Q)continue;let[X,q]=Q.split("|"),z=(Y)=>{let K=new RegExp(`0\\.0\\.0\\.0:(\\d+)->${Y}/tcp`),G=q?.match(K);return G?parseInt(G[1],10):void 0};if(X.includes("indexer-standalone")||X.includes("indexer")){let Y=z(8088);if(Y)Z.indexerPort=Y}if(X.includes("midnight-node")){let Y=z(9944);if(Y)Z.nodePort=Y}if(X.includes("proof-server")){let Y=z(6300);if(Y)Z.proofServerPort=Y}}return Z}catch{return{}}}function O3($){let Z=x2($);if($==="undeployed"){let Q=E2();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 R2,j3;var w0=O(()=>{R2={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"}},j3=["preprod","preview","undeployed"]});import*as n from"fs";import*as q1 from"path";import{homedir as N2}from"os";function L3($){return $??q1.join(N2(),p)}function y3($){return q1.join(L3($),q3)}function v2($){let Z=L3($);if(!n.existsSync(Z))n.mkdirSync(Z,{recursive:!0,mode:$0})}function C0($){let Z=y3($);if(!n.existsSync(Z))return{...S0};let Q;try{Q=n.readFileSync(Z,"utf-8")}catch{return{...S0}}let X;try{X=JSON.parse(Q)}catch{return{...S0}}return{network:X.network&&o(X.network)?X.network:S0.network}}function k2($,Z){v2(Z);let Q=y3(Z);n.writeFileSync(Q,JSON.stringify($,null,2)+`
10
- `,{mode:x0})}function T3($,Z){let Q=C0(Z);if($==="network")return Q.network;throw new Error(`Unknown config key: "${$}"
11
- Valid keys: ${z1.join(", ")}`)}function M3($,Z,Q){let X=C0(Q);if($==="network"){if(!o(Z))throw new Error(`Invalid network: "${Z}"
2
+ var D2=Object.defineProperty;var b=($,Z)=>{for(var Q in Z)D2($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:(X)=>Z[Q]=()=>X})};var L=($,Z)=>()=>($&&(Z=$($=0)),Z);function e1($){let Z=$??process.argv.slice(2),Q=[],X={},q=0;while(q<Z.length){let z=Z[q];if(z.startsWith("--")){let Y=z.slice(2),K=Z[q+1];if(K!==void 0&&!K.startsWith("-"))X[Y]=K,q+=2;else X[Y]=!0,q+=1}else if(z.startsWith("-")&&z.length===2){let Y=z.slice(1),K=Z[q+1];if(K!==void 0&&!K.startsWith("-"))X[Y]=K,q+=2;else X[Y]=!0,q+=1}else Q.push(z),q+=1}return{command:Q[0],subcommand:Q[1],positionals:Q.slice(2),flags:X}}function D($,Z){let Q=$.flags[Z];if(Q===void 0||Q===!0)return;return Q}function O($,Z){return Z in $.flags}function $3($,Z,Q){let X=D($,Z);if(X===void 0)throw new Error(`Missing required flag: --${Z} <${Q}>`);return X}var x0="0000000000000000000000000000000000000000000000000000000000000001",Z3="0000000000000000000000000000000000000000000000000000000000000000",e0=6,Q3=1e6,X3=300000000000000n,q3=5,j0=800000000000000n,z3=300000,E0=30000,Y3=1e4,$1=120000,J3=300000,Z1=60000,Q1=10,K3=3,G3=600000,X1=15000,U3=115,f=".midnight",z0="wallet.json",W3="config.json",r=448,N0=384,V3="localnet";function m(){return!("NO_COLOR"in process.env)}function Y0($,Z){if(!m())return $;return`\x1B[38;5;${Z}m${$}\x1B[0m`}function M($){if(!m())return $;return`\x1B[1m${$}\x1B[0m`}function j($){if(!m())return $;return`\x1B[2m${$}\x1B[0m`}function i($){return Y0($,38)}function k($){return Y0($,196)}function g($){return Y0($,40)}function F0($){return Y0($,226)}function P0($){return Y0($,15)}function J0($){return Y0($,245)}function y($,Z=B3){let Q=` ${$} `,X=Z-Q.length;if(X<=0)return M(Q);let q=Math.floor(X/2),z=X-q;return M("═".repeat(q)+Q+"═".repeat(z))}function A($=B3){return j("─".repeat($))}function B($,Z,Q=16){let X=($+":").padEnd(Q);return` ${J0(X)}${Z}`}function L0($){let Z=$<0n,Q=Z?-$:$,X=BigInt(10**e0),q=Q/X,Y=(Q%X).toString().padStart(e0,"0");return`${Z?"-":""}${q}.${Y}`}function v0($){return`${L0($)} NIGHT`}function w0($){let Z=$<0n,Q=Z?-$:$,X=10n**BigInt(H3),q=Q/X,K=(Q%X).toString().padStart(H3,"0").replace(/0+$/,"").padEnd(6,"0");return`${Z?"-":""}${q}.${K}`}function C0($){return`${w0($)} DUST`}function E($,Z=!1){let Q=Z&&$.length>20?$.slice(0,10)+"…"+$.slice(-8):$;return i(Q)}function A2($,Z){if(O0($).length<=Z)return[$];let X=$.split(/(\s+)/),q=[],z="",Y=0;for(let K of X){let W=O0(K).length;if(Y+W>Z&&Y>0)q.push(z),z=K.trimStart(),Y=O0(z).length;else z+=K,Y+=W}if(z.length>0)q.push(z);return q}function R2($,Z="light",Q=70){let X=Z==="heavy"?{tl:"╔",tr:"╗",bl:"╚",br:"╝",h:"═",v:"║"}:{tl:"┌",tr:"┐",bl:"└",br:"┘",h:"─",v:"│"},q=Q-4,z=[];for(let U of $){let H=U.split(`
3
+ `);for(let V of H)z.push(...A2(V,q))}let Y=Math.max(...z.map((U)=>O0(U).length)),K=Math.max(Y+2,20),W=X.tl+X.h.repeat(K)+X.tr,J=X.bl+X.h.repeat(K)+X.br,G=z.map((U)=>{let H=O0(U).length,V=K-H-2;return`${X.v} ${U}${" ".repeat(Math.max(0,V))} ${X.v}`});return[W,...G,J].join(`
4
+ `)}function j3($,Z){let X=$.split(`
5
+ `).map((z,Y)=>Y===0?k(M("Error: "))+k(z):k(z));if(Z)X.push(""),X.push(j("Suggestion: ")+Z);let q=R2(X,"heavy");if(m())return q.replace(/[╔╗╚╝═║]/g,(z)=>k(z));return q}function s($,Z){let X=[`${g("✓")} ${$}`];if(Z)X.push(B("Transaction",i(Z)));return X.join(`
6
+ `)}var B3=60,H3=15,O0=($)=>$.replace(/\x1b\[[0-9;]*m/g,"");var N=()=>{};function T0($){let Z=($.message??"").toLowerCase();if(Z.includes("operation cancelled")||Z.includes("operation aborted")||Z==="cancelled"||Z==="aborted")return{exitCode:7,errorCode:h.CANCELLED};if(Z.includes("wallet file not found")||Z.includes("wallet")&&Z.includes("not found"))return{exitCode:3,errorCode:h.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:h.INVALID_ARGS};if(Z.includes("proof")&&Z.includes("timeout"))return{exitCode:6,errorCode:h.PROOF_TIMEOUT};if(Z.includes("stale utxo")||Z.includes("error code 115")||Z.includes("errorcode: 115"))return{exitCode:6,errorCode:h.STALE_UTXO};if(Z.includes("no dust")||Z.includes("dust")&&(Z.includes("required")||Z.includes("available")||Z.includes("insufficient")))return{exitCode:5,errorCode:h.DUST_REQUIRED};if(Z.includes("insufficient")||Z.includes("not enough"))return{exitCode:5,errorCode:h.INSUFFICIENT_BALANCE};if(Z.includes("rejected")||Z.includes("transaction failed"))return{exitCode:6,errorCode:h.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:h.NETWORK_ERROR};return{exitCode:1,errorCode:h.UNKNOWN}}var h;var q1=L(()=>{h={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 F3(){let $=process.stderr.write;return process.stderr.write=()=>!0,()=>{process.stderr.write=$}}function Y1($){z1=$}function T($){let Z=JSON.stringify($)+`
7
+ `;if(z1)z1(Z);else process.stdout.write(Z)}function P3($,Z,Q){process.stdout.write(JSON.stringify({error:!0,code:Z,message:$.message,exitCode:Q})+`
8
+ `)}var z1=null;var b0;var O3=L(()=>{b0={name:"midnight-wallet-cli",version:"0.1.10",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 L3,e,T3;var k0=L(()=>{O3();L3=b0.name,e=b0.version,T3=b0.description});async function R($,Z,Q){let X=[];Y1((z)=>X.push(z));let q=process.stderr.write;process.stderr.write=()=>!0;try{Z.flags.json=!0,await $(Z,Q);let z=X.join("").trim();if(!z)return{};return JSON.parse(z)}finally{Y1(null),process.stderr.write=q}}var M3=()=>{};import{HDWallet as E2,Roles as N2}from"@midnight-ntwrk/wallet-sdk-hd";import{createKeystore as v2,PublicKey as w2}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{NetworkId as J1}from"@midnight-ntwrk/wallet-sdk-abstractions";function K0($,Z,Q=0){let X=C2[Z],q=E2.fromSeed($);if(q.type!=="seedOk")throw new Error("Invalid seed for HD wallet");let z=q.hdWallet.selectAccount(0).selectRole(N2.NightExternal).deriveKeyAt(Q);if(z.type==="keyOutOfBounds")throw new Error(`Key index ${Q} out of bounds`);let Y=v2(z.key,X);return w2.fromKeyStore(Y).address}var C2;var S0=L(()=>{C2={preprod:J1.NetworkId.PreProd,preview:J1.NetworkId.Preview,undeployed:J1.NetworkId.Undeployed}});import{execSync as b2}from"child_process";function d($){return _3.includes($)}function S2($){return{...k2[$]}}function I3(){return _3}function y3($){if($.startsWith("mn_addr_preprod1"))return"preprod";if($.startsWith("mn_addr_preview1"))return"preview";if($.startsWith("mn_addr_undeployed1"))return"undeployed";return null}function f2(){try{let $=b2('docker ps --format "{{.Image}}|{{.Ports}}"',{encoding:"utf-8",timeout:5000}),Z={};for(let Q of $.trim().split(`
9
+ `)){if(!Q)continue;let[X,q]=Q.split("|"),z=(Y)=>{let K=new RegExp(`0\\.0\\.0\\.0:(\\d+)->${Y}/tcp`),W=q?.match(K);return W?parseInt(W[1],10):void 0};if(X.includes("indexer-standalone")||X.includes("indexer")){let Y=z(8088);if(Y)Z.indexerPort=Y}if(X.includes("midnight-node")){let Y=z(9944);if(Y)Z.nodePort=Y}if(X.includes("proof-server")){let Y=z(6300);if(Y)Z.proofServerPort=Y}}return Z}catch{return{}}}function D3($){let Z=S2($);if($==="undeployed"){let Q=f2();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 k2,_3;var f0=L(()=>{k2={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"}},_3=["preprod","preview","undeployed"]});import*as l from"fs";import*as K1 from"path";import{homedir as h2}from"os";function A3($){return $??K1.join(h2(),f)}function R3($){return K1.join(A3($),W3)}function p2($){let Z=A3($);if(!l.existsSync(Z))l.mkdirSync(Z,{recursive:!0,mode:r})}function p0($){let Z=R3($);if(!l.existsSync(Z))return{...h0};let Q;try{Q=l.readFileSync(Z,"utf-8")}catch{return{...h0}}let X;try{X=JSON.parse(Q)}catch{return{...h0}}return{network:X.network&&d(X.network)?X.network:h0.network}}function u2($,Z){p2(Z);let Q=R3(Z);l.writeFileSync(Q,JSON.stringify($,null,2)+`
10
+ `,{mode:N0})}function x3($,Z){let Q=p0(Z);if($==="network")return Q.network;throw new Error(`Unknown config key: "${$}"
11
+ Valid keys: ${G1.join(", ")}`)}function E3($,Z,Q){let X=p0(Q);if($==="network"){if(!d(Z))throw new Error(`Invalid network: "${Z}"
12
12
  Valid networks: preprod, preview, undeployed`);X.network=Z}else throw new Error(`Unknown config key: "${$}"
13
- Valid keys: ${z1.join(", ")}`);k2(X,Q)}function Y1(){return z1}var S0,z1;var J1=O(()=>{w0();S0={network:"undeployed"},z1=["network"]});function X0($){let Z=A($.args,"network");if(Z!==void 0){if(!o(Z))throw new Error(`Invalid network: "${Z}"
14
- Valid networks: ${F3().join(", ")}`);return Z}if($.walletNetwork&&o($.walletNetwork))return $.walletNetwork;if($.address){let X=P3($.address);if(X)return X}let Q=C0($.configDir);if(Q.network&&o(Q.network))return Q.network;return"undeployed"}function t($){let Z=X0($),Q=O3(Z);return{name:Z,config:Q}}var r=O(()=>{w0();J1()});import*as C from"fs";import*as s from"path";import{homedir as b2}from"os";function I3(){return s.join(b2(),p)}function _3(){return s.join(I3(),z0)}function w2(){let $=I3();if(!C.existsSync($))C.mkdirSync($,{recursive:!0,mode:$0})}function c($){let Z=$?s.resolve($):_3();if(!C.existsSync(Z))throw new Error(`Wallet file not found: ${Z}
15
- Generate a wallet first: midnight generate --network <name>`);let Q;try{Q=C.readFileSync(Z,"utf-8")}catch(q){throw new Error(`Failed to read wallet file: ${Z}
16
- ${q.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 q=["seed","network","address","createdAt"].filter((z)=>!X[z]);throw new Error(`Wallet file is missing required fields (${q.join(", ")}): ${Z}`)}if(!/^[0-9a-fA-F]+$/.test(X.seed))throw new Error(`Invalid seed format in wallet file (expected hex string): ${Z}`);if(!o(X.network))throw new Error(`Invalid network "${X.network}" in wallet file: ${Z}
17
- Valid networks: preprod, preview, undeployed`);return X}function A3($,Z){let Q=Z?s.resolve(Z):_3();if(!Z)w2();else{let X=s.dirname(Q);if(!C.existsSync(X))C.mkdirSync(X,{recursive:!0,mode:$0})}return C.writeFileSync(Q,JSON.stringify($,null,2)+`
18
- `,{mode:x0}),Q}var q0=O(()=>{w0()});var K1={};w(K1,{default:()=>E3});import*as x3 from"fs";import*as f0 from"path";import{homedir as S2}from"os";import{generateMnemonic as C2,mnemonicToSeedSync as D3,validateMnemonic as f2}from"@scure/bip39";import{wordlist as R3}from"@scure/bip39/wordlists/english.js";async function E3($){let Z=X0({args:$}),Q=A($,"output"),X=A($,"seed"),q=A($,"mnemonic");if(X!==void 0&&q!==void 0)throw new Error("Cannot specify both --seed and --mnemonic. Use one or the other.");let z=Q?f0.resolve(Q):f0.join(S2(),p,z0);if(x3.existsSync(z)&&!P($,"force"))throw new Error(`Wallet file already exists: ${z}
19
- 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(q!==void 0){if(!f2(q,R3))throw new Error("Invalid BIP-39 mnemonic. Expected 12 or 24 words from the English wordlist.");K=q,Y=Buffer.from(D3(K).slice(0,32))}else K=C2(R3,256),Y=Buffer.from(D3(K).slice(0,32));let G=K0(Y,Z),U={seed:Y.toString("hex"),network:Z,address:G,createdAt:new Date().toISOString()};if(K)U.mnemonic=K;let W=A3(U,Q);if(P($,"json")){let J={address:G,network:Z,seed:Y.toString("hex"),file:W,createdAt:U.createdAt};if(K)J.mnemonic=K;L(J);return}if(process.stdout.write(G+`
13
+ Valid keys: ${G1.join(", ")}`);u2(X,Q)}function U1(){return G1}var h0,G1;var W1=L(()=>{f0();h0={network:"undeployed"},G1=["network"]});function $0($){let Z=D($.args,"network");if(Z!==void 0){if(!d(Z))throw new Error(`Invalid network: "${Z}"
14
+ Valid networks: ${I3().join(", ")}`);return Z}if($.walletNetwork&&d($.walletNetwork))return $.walletNetwork;if($.address){let X=y3($.address);if(X)return X}let Q=p0($.configDir);if(Q.network&&d(Q.network))return Q.network;return"undeployed"}function o($){let Z=$0($),Q=D3(Z);return{name:Z,config:Q}}var n=L(()=>{f0();W1()});import*as S from"fs";import*as a from"path";import{homedir as c2}from"os";function N3(){return a.join(c2(),f)}function v3(){return a.join(N3(),z0)}function m2(){let $=N3();if(!S.existsSync($))S.mkdirSync($,{recursive:!0,mode:r})}function p($){let Z=$?a.resolve($):v3();if(!S.existsSync(Z))throw new Error(`Wallet file not found: ${Z}
15
+ Generate a wallet first: midnight generate --network <name>`);let Q;try{Q=S.readFileSync(Z,"utf-8")}catch(q){throw new Error(`Failed to read wallet file: ${Z}
16
+ ${q.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 q=["seed","network","address","createdAt"].filter((z)=>!X[z]);throw new Error(`Wallet file is missing required fields (${q.join(", ")}): ${Z}`)}if(!/^[0-9a-fA-F]+$/.test(X.seed))throw new Error(`Invalid seed format in wallet file (expected hex string): ${Z}`);if(!d(X.network))throw new Error(`Invalid network "${X.network}" in wallet file: ${Z}
17
+ Valid networks: preprod, preview, undeployed`);return X}function w3($,Z){let Q=Z?a.resolve(Z):v3();if(!Z)m2();else{let X=a.dirname(Q);if(!S.existsSync(X))S.mkdirSync(X,{recursive:!0,mode:r})}return S.writeFileSync(Q,JSON.stringify($,null,2)+`
18
+ `,{mode:N0}),Q}var Z0=L(()=>{f0()});var V1={};b(V1,{default:()=>S3});import*as k3 from"fs";import*as u0 from"path";import{homedir as g2}from"os";import{generateMnemonic as d2,mnemonicToSeedSync as C3,validateMnemonic as l2}from"@scure/bip39";import{wordlist as b3}from"@scure/bip39/wordlists/english.js";async function S3($){let Z=$0({args:$}),Q=D($,"output"),X=D($,"seed"),q=D($,"mnemonic");if(X!==void 0&&q!==void 0)throw new Error("Cannot specify both --seed and --mnemonic. Use one or the other.");let z=Q?u0.resolve(Q):u0.join(g2(),f,z0);if(k3.existsSync(z)&&!O($,"force"))throw new Error(`Wallet file already exists: ${z}
19
+ Use --force to overwrite, or --output <file> to save to a different path.`);let Y,K;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(q!==void 0){if(!l2(q,b3))throw new Error("Invalid BIP-39 mnemonic. Expected 12 or 24 words from the English wordlist.");K=q,Y=Buffer.from(C3(K).slice(0,32))}else K=d2(b3,256),Y=Buffer.from(C3(K).slice(0,32));let W=K0(Y,Z),J={seed:Y.toString("hex"),network:Z,address:W,createdAt:new Date().toISOString()};if(K)J.mnemonic=K;let G=w3(J,Q);if(O($,"json")){let U={address:W,network:Z,seed:Y.toString("hex"),file:G,createdAt:J.createdAt};if(K)U.mnemonic=K;T(U);return}if(process.stdout.write(W+`
20
20
  `),process.stderr.write(`
21
- `+_("Wallet Generated")+`
21
+ `+y("Wallet Generated")+`
22
22
 
23
- `),process.stderr.write(H("Network",Z)+`
24
- `),process.stderr.write(H("Address",E(G))+`
25
- `),process.stderr.write(H("File",W)+`
23
+ `),process.stderr.write(B("Network",Z)+`
24
+ `),process.stderr.write(B("Address",E(W))+`
25
+ `),process.stderr.write(B("File",G)+`
26
26
  `),process.stderr.write(`
27
- `),K)process.stderr.write(V0(y(" MNEMONIC (save securely!):"))+`
27
+ `),K)process.stderr.write(F0(M(" MNEMONIC (save securely!):"))+`
28
28
  `),process.stderr.write(` ${K}
29
29
 
30
- `);process.stderr.write(V0(y(" SEED (hex):"))+`
30
+ `);process.stderr.write(F0(M(" SEED (hex):"))+`
31
31
  `),process.stderr.write(` ${Y.toString("hex")}
32
32
 
33
- `),process.stderr.write(D()+`
33
+ `),process.stderr.write(A()+`
34
34
  `),process.stderr.write(j(" Next: midnight info | midnight balance")+`
35
35
 
36
- `),process.stderr.write(i("✓")+` Wallet saved
37
- `)}var G1=O(()=>{b0();r();q0();N()});var U1={};w(U1,{default:()=>N3});import*as h0 from"path";import{homedir as h2}from"os";async function N3($){let Z=A($,"wallet"),Q=c(Z),X=Z?h0.resolve(Z):h0.join(h2(),p,z0);if(P($,"json")){L({address:Q.address,network:Q.network,createdAt:Q.createdAt,file:X});return}process.stdout.write(Q.address+`
36
+ `),process.stderr.write(g("✓")+` Wallet saved
37
+ `)}var H1=L(()=>{S0();n();Z0();N()});var B1={};b(B1,{default:()=>f3});import*as c0 from"path";import{homedir as i2}from"os";async function f3($){let Z=D($,"wallet"),Q=p(Z),X=Z?c0.resolve(Z):c0.join(i2(),f,z0);if(O($,"json")){T({address:Q.address,network:Q.network,createdAt:Q.createdAt,file:X});return}process.stdout.write(Q.address+`
38
38
  `),process.stderr.write(`
39
- `+_("Wallet Info")+`
39
+ `+y("Wallet Info")+`
40
40
 
41
- `),process.stderr.write(H("Address",E(Q.address))+`
42
- `),process.stderr.write(H("Network",Q.network)+`
43
- `),process.stderr.write(H("Created",Q.createdAt)+`
44
- `),process.stderr.write(H("File",X)+`
41
+ `),process.stderr.write(B("Address",E(Q.address))+`
42
+ `),process.stderr.write(B("Network",Q.network)+`
43
+ `),process.stderr.write(B("Created",Q.createdAt)+`
44
+ `),process.stderr.write(B("File",X)+`
45
45
  `),process.stderr.write(`
46
- `+D()+`
46
+ `+A()+`
47
47
 
48
- `)}var B1=O(()=>{q0();N();N()});import p2 from"ws";function v3($,Z,Q){return new Promise((X,q)=>{let z=new p2(Z,["graphql-transport-ws"]),Y=new Map,K=0,G=0,U=0,W=!1,J=!1,V,B=()=>{let I=new Map,M=0;for(let k of Y.values())if(!k.spent){M++;let g=I.get(k.tokenType)??0n;I.set(k.tokenType,g+k.value)}return{balances:I,utxoCount:M,txCount:K,highestTxId:G}},F=()=>{clearTimeout(V)},T=()=>{if(!J&&W&&(G===0||U>=G))J=!0,F(),z.send(JSON.stringify({id:"1",type:"complete"})),z.close(),X(B())};z.on("open",()=>{z.send(JSON.stringify({type:"connection_init"}))}),z.on("message",(I)=>{let M=JSON.parse(I.toString());switch(M.type){case"connection_ack":z.send(JSON.stringify({id:"1",type:"subscribe",payload:{query:u2,variables:{address:$}}}));break;case"next":{if(M.payload?.errors){let g=M.payload.errors[0]?.message||"Unknown GraphQL error";if(!J)J=!0,F(),z.close(),q(new Error(`GraphQL error: ${g}`));return}let k=M.payload?.data?.unshieldedTransactions;if(!k)return;if(k.__typename==="UnshieldedTransaction"){K++;let g=k;U=Math.max(U,g.transaction.id);for(let d of g.createdUtxos){let t0=`${d.intentHash}:${d.outputIndex}`;Y.set(t0,{value:BigInt(d.value),tokenType:d.tokenType,spent:!1})}for(let d of g.spentUtxos){let t0=`${d.intentHash}:${d.outputIndex}`,i1=Y.get(t0);if(i1)i1.spent=!0}if(Q)Q(U,G);T()}else if(k.__typename==="UnshieldedTransactionsProgress")G=k.highestTransactionId,W=!0,T();break}case"error":if(!J)J=!0,F(),z.close(),q(new Error(`GraphQL subscription error: ${JSON.stringify(M.payload)}`));break;case"complete":break}}),z.on("error",(I)=>{if(!J)J=!0,F(),q(new Error(`WebSocket connection failed: ${I.message}`))}),z.on("close",()=>{if(!J)J=!0,F(),q(new Error(`Indexer closed the connection before balance sync completed. Indexer: ${Z}`))}),V=setTimeout(()=>{if(!J)J=!0,z.close(),q(new Error(`Balance check timed out after ${s0/1000}s. Indexer: ${Z}`))},s0)})}function L0($){return $===a1}var u2=`
48
+ `)}var j1=L(()=>{Z0();N();N()});import o2 from"ws";function h3($,Z,Q){return new Promise((X,q)=>{let z=new o2(Z,["graphql-transport-ws"]),Y=new Map,K=0,W=0,J=0,G=!1,U=!1,H,V=()=>{let _=new Map,I=0;for(let w of Y.values())if(!w.spent){I++;let c=_.get(w.tokenType)??0n;_.set(w.tokenType,c+w.value)}return{balances:_,utxoCount:I,txCount:K,highestTxId:W}},F=()=>{clearTimeout(H)},P=()=>{if(!U&&G&&(W===0||J>=W))U=!0,F(),z.send(JSON.stringify({id:"1",type:"complete"})),z.close(),X(V())};z.on("open",()=>{z.send(JSON.stringify({type:"connection_init"}))}),z.on("message",(_)=>{let I=JSON.parse(_.toString());switch(I.type){case"connection_ack":z.send(JSON.stringify({id:"1",type:"subscribe",payload:{query:n2,variables:{address:$}}}));break;case"next":{if(I.payload?.errors){let c=I.payload.errors[0]?.message||"Unknown GraphQL error";if(!U)U=!0,F(),z.close(),q(new Error(`GraphQL error: ${c}`));return}let w=I.payload?.data?.unshieldedTransactions;if(!w)return;if(w.__typename==="UnshieldedTransaction"){K++;let c=w;J=Math.max(J,c.transaction.id);for(let C of c.createdUtxos){let Q0=`${C.intentHash}:${C.outputIndex}`;Y.set(Q0,{value:BigInt(C.value),tokenType:C.tokenType,spent:!1})}for(let C of c.spentUtxos){let Q0=`${C.intentHash}:${C.outputIndex}`,X0=Y.get(Q0);if(X0)X0.spent=!0}if(Q)Q(J,W);P()}else if(w.__typename==="UnshieldedTransactionsProgress")W=w.highestTransactionId,G=!0,P();break}case"error":if(!U)U=!0,F(),z.close(),q(new Error(`GraphQL subscription error: ${JSON.stringify(I.payload)}`));break;case"complete":break}}),z.on("error",(_)=>{if(!U)U=!0,F(),q(new Error(`WebSocket connection failed: ${_.message}`))}),z.on("close",()=>{if(!U)U=!0,F(),q(new Error(`Indexer closed the connection before balance sync completed. Indexer: ${Z}`))}),H=setTimeout(()=>{if(!U)U=!0,z.close(),q(new Error(`Balance check timed out after ${Z1/1000}s. Indexer: ${Z}`))},Z1)})}function M0($){return $===Z3}var n2=`
49
49
  subscription UnshieldedTransactions($address: UnshieldedAddress!) {
50
50
  unshieldedTransactions(address: $address) {
51
51
  __typename
@@ -59,138 +59,143 @@ Use --force to overwrite, or --output <file> to save to a different path.`);let
59
59
  }
60
60
  }
61
61
  }
62
- `;var k3=()=>{};function v($){if(!l())return process.stderr.write(`⠋ ${$}`),{update(z){process.stderr.write(`\r⠋ ${z}`)},stop(z){let Y=z??$;process.stderr.write(`\r✓ ${Y}
63
- `)}};let Z=0,Q=$,X=()=>{let z=a(b3[Z]);process.stderr.write(`\r${z} ${Q}\x1B[K`),Z=(Z+1)%b3.length};X();let q=setInterval(X,c2);return{update(z){Q=z},stop(z){clearInterval(q);let Y=z??Q;process.stderr.write(`\r\x1B[32m✓\x1B[0m ${Y}\x1B[K
64
- `)}}}var b3,c2=80;var G0=O(()=>{b3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]});var W1={};w(W1,{default:()=>w3});async function w3($){let Z,Q;if($.subcommand)Z=$.subcommand;else{let G=A($,"wallet"),U=c(G);Z=U.address,Q=U.network}if(!Z)throw new Error("No address provided and no wallet file found.");let{name:X,config:q}=t({args:$,walletNetwork:Q,address:Z}),Y=A($,"indexer-ws")??q.indexerWS,K=v(`Checking balance on ${X}...`);try{let G=await v3(Z,Y,(U,W)=>{if(W>0){let J=Math.round(U/W*100);K.update(`Syncing transactions... ${J}%`)}});if(K.stop(`Synced ${G.txCount} transactions`),P($,"json")){let U={};for(let[W,J]of G.balances){let V=L0(W)?"NIGHT":W;U[V]=L0(W)?F0(J):J.toString()}L({address:Z,network:X,balances:U,utxoCount:G.utxoCount,txCount:G.txCount});return}if(G.balances.size===0)process.stdout.write(`0
65
- `);else for(let[U,W]of G.balances)if(L0(U))process.stdout.write(`NIGHT=${W}
66
- `);else process.stdout.write(`${U}=${W}
62
+ `;var p3=()=>{};function v($){if(!m())return process.stderr.write(`⠋ ${$}`),{update(z){process.stderr.write(`\r⠋ ${z}`)},stop(z){let Y=z??$;process.stderr.write(`\r✓ ${Y}
63
+ `)}};let Z=0,Q=$,X=()=>{let z=i(u3[Z]);process.stderr.write(`\r${z} ${Q}\x1B[K`),Z=(Z+1)%u3.length};X();let q=setInterval(X,a2);return{update(z){Q=z},stop(z){clearInterval(q);let Y=z??Q;process.stderr.write(`\r\x1B[32m✓\x1B[0m ${Y}\x1B[K
64
+ `)}}}var u3,a2=80;var G0=L(()=>{u3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"]});var F1={};b(F1,{default:()=>c3});async function c3($){let Z,Q;if($.subcommand)Z=$.subcommand;else{let W=D($,"wallet"),J=p(W);Z=J.address,Q=J.network}if(!Z)throw new Error("No address provided and no wallet file found.");let{name:X,config:q}=o({args:$,walletNetwork:Q,address:Z}),Y=D($,"indexer-ws")??q.indexerWS,K=v(`Checking balance on ${X}...`);try{let W=await h3(Z,Y,(J,G)=>{if(G>0){let U=Math.round(J/G*100);K.update(`Syncing transactions... ${U}%`)}});if(K.stop(`Synced ${W.txCount} transactions`),O($,"json")){let J={};for(let[G,U]of W.balances){let H=M0(G)?"NIGHT":G;J[H]=M0(G)?L0(U):U.toString()}T({address:Z,network:X,balances:J,utxoCount:W.utxoCount,txCount:W.txCount});return}if(W.balances.size===0)process.stdout.write(`0
65
+ `);else for(let[J,G]of W.balances)if(M0(J))process.stdout.write(`NIGHT=${G}
66
+ `);else process.stdout.write(`${J}=${G}
67
67
  `);if(process.stderr.write(`
68
- `+_("Balance")+`
68
+ `+y("Balance")+`
69
69
 
70
- `),process.stderr.write(H("Address",E(Z))+`
71
- `),process.stderr.write(H("Network",X)+`
72
- `),process.stderr.write(H("UTXOs",G.utxoCount.toString())+`
73
- `),process.stderr.write(H("Transactions",G.txCount.toString())+`
70
+ `),process.stderr.write(B("Address",E(Z))+`
71
+ `),process.stderr.write(B("Network",X)+`
72
+ `),process.stderr.write(B("UTXOs",W.utxoCount.toString())+`
73
+ `),process.stderr.write(B("Transactions",W.txCount.toString())+`
74
74
  `),process.stderr.write(`
75
- `),G.balances.size===0)process.stderr.write(` ${j("No balance found")}
76
- `);else for(let[U,W]of G.balances)if(L0(U))process.stderr.write(H("NIGHT",y(E0(W)))+`
77
- `);else{let J=U.slice(0,8)+"…"+U.slice(-8);process.stderr.write(H(`Token ${J}`,y(W.toString()))+`
75
+ `),W.balances.size===0)process.stderr.write(` ${j("No balance found")}
76
+ `);else for(let[J,G]of W.balances)if(M0(J))process.stderr.write(B("NIGHT",M(v0(G)))+`
77
+ `);else{let U=J.slice(0,8)+"…"+J.slice(-8);process.stderr.write(B(`Token ${U}`,M(G.toString()))+`
78
78
  `)}process.stderr.write(`
79
- `+D()+`
79
+ `+A()+`
80
80
 
81
- `)}catch(G){throw K.stop("Failed"),G}}var V1=O(()=>{q0();r();k3();N();G0()});var H1={};w(H1,{default:()=>S3});async function S3($){let Z=n1($,"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=A($,"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 q=Buffer.from(Z,"hex"),z=X0({args:$}),Y=K0(q,z,X),K=`m/44'/2400'/0'/NightExternal/${X}`;if(P($,"json")){L({address:Y,network:z,index:X,path:K});return}process.stdout.write(Y+`
81
+ `)}catch(W){throw K.stop("Failed"),W}}var P1=L(()=>{Z0();n();p3();N();G0()});var O1={};b(O1,{default:()=>m3});async function m3($){let Z=$3($,"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=D($,"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 q=Buffer.from(Z,"hex"),z=$0({args:$}),Y=K0(q,z,X),K=`m/44'/2400'/0'/NightExternal/${X}`;if(O($,"json")){T({address:Y,network:z,index:X,path:K});return}process.stdout.write(Y+`
82
82
  `),process.stderr.write(`
83
- `),process.stderr.write(H("Network",z)+`
84
- `),process.stderr.write(H("Index",X.toString())+`
85
- `),process.stderr.write(H("Address",E(Y))+`
86
- `),process.stderr.write(H("Path",j(K))+`
87
- `),process.stderr.write(D()+`
83
+ `),process.stderr.write(B("Network",z)+`
84
+ `),process.stderr.write(B("Index",X.toString())+`
85
+ `),process.stderr.write(B("Address",E(Y))+`
86
+ `),process.stderr.write(B("Path",j(K))+`
87
+ `),process.stderr.write(A()+`
88
88
 
89
- `)}var j1=O(()=>{b0();r();N()});var F1={};w(F1,{default:()=>C3});async function C3($){let Z=X0({args:$}),Q=Buffer.from(_0,"hex"),X=K0(Q,Z);if(P($,"json")){L({address:X,network:Z});return}process.stdout.write(X+`
89
+ `)}var L1=L(()=>{S0();n();N()});var T1={};b(T1,{default:()=>g3});async function g3($){let Z=$0({args:$}),Q=Buffer.from(x0,"hex"),X=K0(Q,Z);if(O($,"json")){T({address:X,network:Z});return}process.stdout.write(X+`
90
90
  `),process.stderr.write(`
91
- `),process.stderr.write(H("Network",Z)+`
92
- `),process.stderr.write(H("Address",E(X))+`
93
- `),process.stderr.write(H("Seed",j("0x01 (genesis)"))+`
94
- `),process.stderr.write(D()+`
91
+ `),process.stderr.write(B("Network",Z)+`
92
+ `),process.stderr.write(B("Address",E(X))+`
93
+ `),process.stderr.write(B("Seed",j("0x01 (genesis)"))+`
94
+ `),process.stderr.write(A()+`
95
95
 
96
- `)}var P1=O(()=>{b0();r();N()});var O1={};w(O1,{default:()=>h3});import*as f3 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 z=$.normalizeFullness(X)[Z];return Math.round(Number(Q)/z)}function m2($){return{readTime:y0($,"readTime",1000000000n),computeTime:y0($,"computeTime",1000000000n),blockUsage:y0($,"blockUsage",10000n),bytesWritten:y0($,"bytesWritten",10000n),bytesChurned:y0($,"bytesChurned",1000000n)}}async function h3($){let Z=f3.LedgerParameters.initialParameters(),Q=m2(Z);if(P($,"json")){L(Q);return}for(let[X,q]of Object.entries(Q))process.stdout.write(`${X}=${q}
96
+ `)}var M1=L(()=>{S0();n();N()});var _1={};b(_1,{default:()=>l3});import*as d3 from"@midnight-ntwrk/ledger-v7";function _0($,Z,Q){let X={readTime:0n,computeTime:0n,blockUsage:0n,bytesWritten:0n,bytesChurned:0n};X[Z]=Q;let z=$.normalizeFullness(X)[Z];return Math.round(Number(Q)/z)}function t2($){return{readTime:_0($,"readTime",1000000000n),computeTime:_0($,"computeTime",1000000000n),blockUsage:_0($,"blockUsage",10000n),bytesWritten:_0($,"bytesWritten",10000n),bytesChurned:_0($,"bytesChurned",1000000n)}}async function l3($){let Z=d3.LedgerParameters.initialParameters(),Q=t2(Z);if(O($,"json")){T(Q);return}for(let[X,q]of Object.entries(Q))process.stdout.write(`${X}=${q}
97
97
  `);process.stderr.write(`
98
- `+_("Block Limits")+`
98
+ `+y("Block Limits")+`
99
99
 
100
100
  `),process.stderr.write(j(" Derived from LedgerParameters.initialParameters()")+`
101
101
 
102
- `);for(let[X,q]of Object.entries(Q)){let z=g2[X]??"";process.stderr.write(H(X,`${y(q.toLocaleString())} ${j(z)}`)+`
102
+ `);for(let[X,q]of Object.entries(Q)){let z=r2[X]??"";process.stderr.write(B(X,`${M(q.toLocaleString())} ${j(z)}`)+`
103
103
  `)}process.stderr.write(`
104
- `+D()+`
104
+ `+A()+`
105
105
  `),process.stderr.write(j(" bytesWritten is typically the tightest constraint")+`
106
106
  `),process.stderr.write(j(" for large contract deployments.")+`
107
107
 
108
- `)}var g2;var L1=O(()=>{N();g2={readTime:"picoseconds",computeTime:"picoseconds",blockUsage:"bytes",bytesWritten:"bytes",bytesChurned:"bytes"}});import{HDWallet as d2,Roles as y1}from"@midnight-ntwrk/wallet-sdk-hd";function T1($,Z){let Q=d2.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 p3($){return T1($,y1.Zswap)}function u3($){return T1($,y1.NightExternal)}function c3($){return T1($,y1.Dust)}var m3=()=>{};import{ShieldedWallet as l2}from"@midnight-ntwrk/wallet-sdk-shielded";import{UnshieldedWallet as i2,createKeystore as o2,PublicKey as n2,InMemoryTransactionHistoryStorage as a2}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{DustWallet as t2}from"@midnight-ntwrk/wallet-sdk-dust-wallet";import{WalletFacade as r2}from"@midnight-ntwrk/wallet-sdk-facade";import*as U0 from"@midnight-ntwrk/ledger-v7";import{NetworkId as M1}from"@midnight-ntwrk/wallet-sdk-abstractions";import*as f from"rxjs";function p0($,Z){let Q=s2[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);let X=p3($),q=u3($),z=c3($),Y=U0.ZswapSecretKeys.fromSeed(X),K=U0.DustSecretKey.fromSeed(z),G=o2(q,Q),U={networkId:Q,indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},W={networkId:Q,indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},txHistoryStorage:new a2},J={networkId:Q,costParameters:{additionalFeeOverhead:r1,feeBlocksMargin:s1},indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},V=l2(U).startWithSecretKeys(Y),B=i2(W).startWithPublicKey(n2.fromKeyStore(G)),F=t2(J).startWithSecretKey(K,U0.LedgerParameters.initialParameters().dust);return{facade:new r2(V,B,F),keystore:G,zswapSecretKeys:Y,dustSecretKey:K}}async function T0($,Z){let{facade:Q,zswapSecretKeys:X,dustSecretKey:q}=$;return await Q.start(X,q),f.firstValueFrom(Q.state().pipe(f.tap((z)=>{if(Z){let Y=z.unshielded.progress;if(Y)Z(Number(Y.appliedId),Number(Y.highestTransactionId))}}),f.filter((z)=>z.isSynced),f.timeout(e1)))}async function g3($){return f.firstValueFrom($.facade.state().pipe(f.filter((Z)=>Z.isSynced),f.timeout($3)))}async function u0($){await $.facade.stop()}function c0($){let Z=(X)=>{let q=X?._tag;if(typeof q==="string"&&q.startsWith("Wallet.")){let z=X?.message??"transient error";$?.(q,z);return}Q("Unhandled rejection:",X),process.exit(1)},Q=console.error;return console.error=(...X)=>{let q=X[0];if(typeof q==="object"&&q?._tag?.startsWith("Wallet.")){$?.(q._tag,q?.message??"transient error");return}if(typeof q==="string"&&q.startsWith("Wallet.")){$?.("Wallet.Sync","transient error");return}Q(...X)},process.on("unhandledRejection",Z),()=>{process.removeListener("unhandledRejection",Z),console.error=Q}}var s2;var I1=O(()=>{m3();s2={PreProd:M1.NetworkId.PreProd,Preview:M1.NetworkId.Preview,Undeployed:M1.NetworkId.Undeployed}});import*as A1 from"@midnight-ntwrk/ledger-v7";import{MidnightBech32m as e2,UnshieldedAddress as $$}from"@midnight-ntwrk/wallet-sdk-address-format";import{NetworkId as _1}from"@midnight-ntwrk/wallet-sdk-abstractions";import*as h from"rxjs";function Q$($){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("."),q=Q+(X??"").padEnd(6,"0"),z=BigInt(q);if(z<=0n)throw new Error("Amount too small — minimum is 0.000001 NIGHT");return z}function m0($){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 X$($,Z){let Q=Z$[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);try{e2.parse($).decode($$,Q)}catch(X){throw new Error(`Invalid recipient address: ${X.message}
109
- Expected a bech32m address for network "${Z.networkId}"`)}}function q$($){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 z$($){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`}async function Y$($,Z,Q){let X=new Date(Date.now()+e0*60*1000);await $.facade.dust.waitForSyncedState();let q=await $.facade.dust.createDustGenerationTransaction(new Date,X,Z,$.keystore.getPublicKey(),Q),z=q.intents?.get(1);if(!z)throw new Error("Dust generation intent not found on transaction");let Y=$.keystore.signData(z.signatureData(1)),K=await $.facade.dust.addDustGenerationSignature(q,Y),G=await $.facade.finalizeTransaction(K);return await $.facade.submitTransaction(G)}async function D1($,Z,Q,X){let q=Date.now(),z=q+Q3,Y,K=console.warn,G=console.error,U=(V)=>V.some((B)=>String(B).includes("RPC-CORE")),W=()=>{console.warn=(...V)=>{if(U(V))return;K(...V)},console.error=(...V)=>{if(U(V))return;G(...V)}},J=()=>{console.warn=K,console.error=G};W();try{while(Date.now()<z)try{return await Y$($,Z,Q)}catch(V){if(Y=V,q$(V)&&Date.now()+R0<z){let B=z$(Date.now()-q);X?.(`Waiting for dust generation capacity (${B} elapsed, ~5 min on fresh wallets)...`),await new Promise((F)=>setTimeout(F,R0));continue}throw V}throw Y??new Error("Dust registration timed out")}finally{J()}}async function J$($,Z){let Q=await h.firstValueFrom($.facade.state().pipe(h.filter((q)=>q.isSynced))),X=Q.unshielded.availableCoins.filter((q)=>q.meta?.registeredForDustGeneration!==!0);if(X.length>0){Z?.(`Registering ${X.length} UTXO(s) for dust generation...`);let q=X.map((z)=>({...z.utxo,ctime:new Date(z.meta.ctime)}));await D1($,q,Q.dust.dustAddress,Z)}else if(Q.dust.availableCoins.length>0){Z?.("Dust available");return}else Z?.("UTXOs already registered, waiting for dust generation...");Z?.("Waiting for dust tokens..."),await h.firstValueFrom($.facade.state().pipe(h.throttleTime(5000),h.filter((q)=>q.isSynced),h.filter((q)=>q.dust.walletBalance(new Date)>0n),h.timeout(A0))),Z?.("Dust available")}async function K$($,Z,Q,X,q,z){let Y;for(let K=1;K<=D0;K++)try{if(K>1)await g3($);let G=new Date(Date.now()+e0*60*1000),U=await $.facade.transferTransaction([{type:"unshielded",outputs:[{amount:Q,receiverAddress:Z,type:A1.unshieldedToken().raw}]}],{shieldedSecretKeys:$.zswapSecretKeys,dustSecretKey:$.dustSecretKey},{ttl:G,payFees:!0}),W=await $.facade.signRecipe(U,(B)=>$.keystore.signData(B));X?.();let J=await Promise.race([$.facade.finalizeRecipe(W),new Promise((B,F)=>{setTimeout(()=>F(new Error("ZK proof generation timed out")),Z3)})]);return q?.(),await $.facade.submitTransaction(J)}catch(G){if(Y=G,(G?.code===X3||G?.message?.includes("115")||G?.message?.toLowerCase().includes("stale"))&&K<D0)continue;if((G?.message?.toLowerCase().includes("not enough dust")||G?.message?.toLowerCase().includes("dust generated"))&&K<D0){z?.("Waiting for more dust to accumulate..."),await new Promise((J)=>setTimeout(J,R0));continue}throw G}throw Y??new Error("Transfer failed after retries")}async function g0($){let{seedBuffer:Z,networkConfig:Q,recipientAddress:X,amountNight:q,signal:z,onSync:Y,onDust:K,onProving:G,onSubmitting:U,onSyncWarning:W}=$,J=Q$(q);X$(X,Q);let V=c0(W),B=p0(Z,Q),F=!1,T=async()=>{if(!F){F=!0;try{await u0(B)}catch{}}},I=()=>{T()};z?.addEventListener("abort",I,{once:!0});try{let M=await T0(B,Y);if(z?.aborted)throw new Error("Operation cancelled");let k=M.unshielded.balances[A1.unshieldedToken().raw]??0n;if(k<J){let d=Number(k)/t1;throw new Error(`Insufficient balance: ${d.toFixed(6)} NIGHT available, ${q} NIGHT requested`)}if(z?.aborted)throw new Error("Operation cancelled");if(await J$(B,K),z?.aborted)throw new Error("Operation cancelled");return{txHash:await K$(B,X,J,G,U,K),amountMicroNight:J}}finally{z?.removeEventListener("abort",I),V(),await T()}}var Z$;var d0=O(()=>{I1();Z$={PreProd:_1.NetworkId.PreProd,Preview:_1.NetworkId.Preview,Undeployed:_1.NetworkId.Undeployed}});var R1={};w(R1,{default:()=>d3});async function d3($,Z){let Q=$.subcommand;if(!Q)throw new Error(`Missing amount.
108
+ `)}var r2;var I1=L(()=>{N();r2={readTime:"picoseconds",computeTime:"picoseconds",blockUsage:"bytes",bytesWritten:"bytes",bytesChurned:"bytes"}});import{HDWallet as s2,Roles as y1}from"@midnight-ntwrk/wallet-sdk-hd";function D1($,Z){let Q=s2.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 i3($){return D1($,y1.Zswap)}function o3($){return D1($,y1.NightExternal)}function n3($){return D1($,y1.Dust)}var a3=()=>{};import{ShieldedWallet as e2}from"@midnight-ntwrk/wallet-sdk-shielded";import{UnshieldedWallet as $$,createKeystore as Z$,PublicKey as Q$,InMemoryTransactionHistoryStorage as X$}from"@midnight-ntwrk/wallet-sdk-unshielded-wallet";import{DustWallet as q$}from"@midnight-ntwrk/wallet-sdk-dust-wallet";import{WalletFacade as z$}from"@midnight-ntwrk/wallet-sdk-facade";import*as U0 from"@midnight-ntwrk/ledger-v7";import{NetworkId as A1}from"@midnight-ntwrk/wallet-sdk-abstractions";import*as W0 from"rxjs";function I0($,Z){let Q=Y$[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);let X=i3($),q=o3($),z=n3($),Y=U0.ZswapSecretKeys.fromSeed(X),K=U0.DustSecretKey.fromSeed(z),W=Z$(q,Q),J={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 X$},U={networkId:Q,costParameters:{additionalFeeOverhead:X3,feeBlocksMargin:q3},indexerClientConnection:{indexerHttpUrl:Z.indexer,indexerWsUrl:Z.indexerWS},provingServerUrl:new URL(Z.proofServer),relayURL:new URL(Z.node)},H=e2(J).startWithSecretKeys(Y),V=$$(G).startWithPublicKey(Q$.fromKeyStore(W)),F=q$(U).startWithSecretKey(K,U0.LedgerParameters.initialParameters().dust);return{facade:new z$(H,V,F),keystore:W,zswapSecretKeys:Y,dustSecretKey:K}}function t3($){let Z=$.shielded?.state?.progress?.isStrictlyComplete()??!1,Q=$.unshielded?.progress?.isStrictlyComplete()??!1,X=$.dust?.state?.progress?.isStrictlyComplete()??!1;if(!X)try{let q=$.dust?.state?.progress;if(q&&q.appliedIndex>=q.highestRelevantWalletIndex)X=!0}catch{}return Z&&Q&&X}function J$($){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 y0($,Z,Q,X){let{facade:q,zswapSecretKeys:z,dustSecretKey:Y}=$;return await q.start(z,Y),new Promise((K,W)=>{let J=!1,G=setTimeout(()=>{if(!J)W(new Error("Wallet sync timed out"))},X??z3);$.keepAlive=q.state().subscribe({next:(U)=>{if(J)return;if(Z){let H=U.unshielded.progress;if(H){let V=Number(H.appliedId),F=Number(H.highestTransactionId);Z(Math.min(V,F),F)}}if(Q)try{let H=[];if(!U.shielded?.state?.progress?.isStrictlyComplete())H.push("shielded");if(J$(U))H.push("dust");if(!U.unshielded?.progress?.isStrictlyComplete())H.push("unshielded");if(H.length>0)Q(H.join(", "))}catch{}if(t3(U))J=!0,clearTimeout(G),K(U)},error:(U)=>{if(!J)clearTimeout(G),W(U)}})})}async function R1($){return W0.firstValueFrom($.facade.state().pipe(W0.filter((Z)=>t3(Z)),W0.timeout(Y3)))}async function D0($){$.keepAlive?.unsubscribe(),await Promise.race([$.facade.stop(),new Promise((Z)=>setTimeout(Z,5000))])}function m0($){let Z=(X)=>{let q=X?._tag;if(typeof q==="string"&&q.startsWith("Wallet.")){let z=X?.message??"transient error";$?.(q,z);return}Q("Unhandled rejection:",X),process.exit(1)},Q=console.error;return console.error=(...X)=>{let q=X[0];if(typeof q==="object"&&q?._tag?.startsWith("Wallet.")){$?.(q._tag,q?.message??"transient error");return}if(typeof q==="string"&&q.startsWith("Wallet.")){$?.("Wallet.Sync","transient error");return}Q(...X)},process.on("unhandledRejection",Z),()=>{process.removeListener("unhandledRejection",Z),console.error=Q}}var Y$;var x1=L(()=>{a3();Y$={PreProd:A1.NetworkId.PreProd,Preview:A1.NetworkId.Preview,Undeployed:A1.NetworkId.Undeployed}});import*as v1 from"@midnight-ntwrk/ledger-v7";import{MidnightBech32m as K$,UnshieldedAddress as G$}from"@midnight-ntwrk/wallet-sdk-address-format";import{NetworkId as E1}from"@midnight-ntwrk/wallet-sdk-abstractions";function W$($){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("."),q=Q+(X??"").padEnd(6,"0"),z=BigInt(q);if(z<=0n)throw new Error("Amount too small — minimum is 0.000001 NIGHT");return z}function d0($){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 V$($,Z){let Q=U$[Z.networkId];if(Q===void 0)throw new Error(`Unknown networkId: ${Z.networkId}`);try{K$.parse($).decode(G$,Q)}catch(X){throw new Error(`Invalid recipient address: ${X.message}
109
+ Expected a bech32m address for network "${Z.networkId}"`)}}function H$($){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 r3($){let Z=$?.message?.toLowerCase()??"";return Z.includes("not enough dust")||Z.includes("dust generated")||Z.includes("insufficient funds")||Z.includes("no dust tokens")||H$($)}function g0($){let Z=$<0n?-$:$,Q=Z/1000000000000000n,X=Z%1000000000000000n;return`${$<0n?"-":""}${Q}.${X.toString().padStart(15,"0").slice(0,6)}`}function N1($){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 w1(){let{warn:$,error:Z}=console,Q=(X)=>X.some((q)=>String(q).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 B$($,Z,Q){let X=new Date(Date.now()+Q1*60*1000);await Promise.race([$.facade.dust.waitForSyncedState(),new Promise((J,G)=>setTimeout(()=>G(new Error("Insufficient funds: dust wallet sync timed out")),E0))]);let q=await $.facade.dust.createDustGenerationTransaction(new Date,X,Z,$.keystore.getPublicKey(),Q),z=q.intents?.get(1);if(!z)throw new Error("Dust generation intent not found on transaction");let Y=$.keystore.signData(z.signatureData(1)),K=await $.facade.dust.addDustGenerationSignature(q,Y),W=await $.facade.finalizeTransaction(K);return await $.facade.submitTransaction(W)}async function j$($,Z,Q,X){let q=Date.now(),z=q+G3,Y,K=!1,W=setInterval(()=>{if(K&&X){let J=N1(Date.now()-q);X(`Waiting for dust generation capacity (${J} elapsed, ~5 min on fresh wallets)...`)}},1000);try{while(Date.now()<z)try{return await B$($,Z,Q)}catch(J){if(Y=J,r3(J)&&Date.now()+X1<z){K=!0;let G=N1(Date.now()-q);X?.(`Waiting for dust generation capacity (${G} elapsed, ~5 min on fresh wallets)...`),await new Promise((U)=>setTimeout(U,X1));continue}throw J}throw Y??new Error("Dust registration timed out")}finally{clearInterval(W)}}async function l0($,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 q=X.unshielded.availableCoins.filter((K)=>K.meta?.registeredForDustGeneration!==!0),z;if(q.length>0){Z?.(`Registering ${q.length} UTXO(s) for dust generation...`);let K=q.map((W)=>({...W.utxo,ctime:new Date(W.meta.ctime)}));z=await j$($,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<$1){try{if((await Promise.race([$.facade.waitForSyncedState(),new Promise((W,J)=>setTimeout(()=>J(new Error("Poll sync timed out")),E0))])).dust.walletBalance(new Date)>0n)return Z?.("Dust available"),{alreadyAvailable:!1,txHash:z}}catch{}await new Promise((K)=>setTimeout(K,5000))}throw new Error("Timed out waiting for dust tokens. Try running: midnight dust register")}async function F$($,Z,Q,X,q,z){let Y=Date.now(),K=Y+$1,W,J=0;while(!0)try{if(W)await R1($);let G=new Date(Date.now()+Q1*60*1000),U=await $.facade.transferTransaction([{type:"unshielded",outputs:[{amount:Q,receiverAddress:Z,type:v1.unshieldedToken().raw}]}],{shieldedSecretKeys:$.zswapSecretKeys,dustSecretKey:$.dustSecretKey},{ttl:G,payFees:!0}),H=await $.facade.signRecipe(U,(P)=>$.keystore.signData(P));X?.();let V=await Promise.race([$.facade.finalizeRecipe(H),new Promise((P,_)=>{setTimeout(()=>_(new Error("ZK proof generation timed out")),J3)})]);return q?.(),await $.facade.submitTransaction(V)}catch(G){if(W=G,(G?.code===U3||G?.message?.includes("115")||G?.message?.toLowerCase().includes("stale"))&&++J<K3)continue;if(r3(G)&&Date.now()<K){let H=N1(Date.now()-Y);z?.(`Dust insufficient, re-ensuring (${H} elapsed)...`);try{let V=await R1($),F=V.dust.walletBalance(new Date);if(F>0n&&F<j0)throw new Error(`Insufficient dust for transaction fees.
110
+ Available: ${g0(F)} DUST, need ≥${g0(j0)} DUST.
111
+ Dust regenerates over time from registered NIGHT UTXOs.
112
+ Check status: midnight dust status`);await l0($,z,V)}catch(V){if(String(V?.message).startsWith("Insufficient dust"))throw V;await new Promise((F)=>setTimeout(F,5000))}continue}throw G}}async function i0($){let{seedBuffer:Z,networkConfig:Q,recipientAddress:X,amountNight:q,signal:z,onSync:Y,onSyncDetail:K,onDust:W,onProving:J,onSubmitting:G,onSyncWarning:U}=$,H=W$(q);V$(X,Q);let V=m0(U),F=w1(),P=I0(Z,Q),_=!1,I=async()=>{if(!_){_=!0;try{await D0(P)}catch{}}},w=()=>{I()};z?.addEventListener("abort",w,{once:!0});try{let C;for(let q0=1;q0<=3;q0++)try{C=await y0(P,Y,K,E0);break}catch(s1){if(z?.aborted)throw new Error("Operation cancelled");if(q0<3&&String(s1?.message).includes("timed out")){W?.(`Sync timed out, retrying (attempt ${q0+1}/3)...`),await D0(P).catch(()=>{}),P=I0(Z,Q);continue}throw s1}if(z?.aborted)throw new Error("Operation cancelled");let Q0=C.unshielded.balances[v1.unshieldedToken().raw]??0n;if(Q0<H){let q0=Number(Q0)/Q3;throw new Error(`Insufficient balance: ${q0.toFixed(6)} NIGHT available, ${q} NIGHT requested`)}if(z?.aborted)throw new Error("Operation cancelled");await l0(P,W,C);let X0=C.dust.walletBalance(new Date);if(X0>0n&&X0<j0)throw new Error(`Insufficient dust for transaction fees.
113
+ Available: ${g0(X0)} DUST, need ≥${g0(j0)} DUST.
114
+ Dust regenerates over time from registered NIGHT UTXOs.
115
+ Check status: midnight dust status`);if(z?.aborted)throw new Error("Operation cancelled");return{txHash:await F$(P,X,H,J,G,W),amountMicroNight:H}}finally{z?.removeEventListener("abort",w),F(),V(),await I()}}var U$;var o0=L(()=>{x1();U$={PreProd:E1.NetworkId.PreProd,Preview:E1.NetworkId.Preview,Undeployed:E1.NetworkId.Undeployed}});var C1={};b(C1,{default:()=>s3});async function s3($,Z){let Q=$.subcommand;if(!Q)throw new Error(`Missing amount.
110
116
  Usage: midnight airdrop <amount>
111
- Example: midnight airdrop 1000`);let X=m0(Q),q=A($,"wallet"),z=c(q),{name:Y,config:K}=t({args:$,walletNetwork:z.network,address:z.address});if(Y!=="undeployed")throw new Error(`Airdrop is only available on the "undeployed" network (local devnet).
117
+ Example: midnight airdrop 1000`);let X=d0(Q),q=D($,"wallet"),z=p(q),{name:Y,config:K}=o({args:$,walletNetwork:z.network,address:z.address});if(Y!=="undeployed")throw new Error(`Airdrop is only available on the "undeployed" network (local devnet).
112
118
  Current network: "${Y}"
113
- On preprod/preview, use a faucet or transfer from another wallet.`);let G=z.address,U=Buffer.from(_0,"hex");process.stderr.write(`
114
- `+_("Airdrop")+`
119
+ On preprod/preview, use a faucet or transfer from another wallet.`);let W=z.address,J=Buffer.from(x0,"hex");process.stderr.write(`
120
+ `+y("Airdrop")+`
115
121
 
116
- `),process.stderr.write(H("Network",Y)+`
117
- `),process.stderr.write(H("From",j("genesis (seed 0x01)"))+`
118
- `),process.stderr.write(H("To",E(G,!0))+`
119
- `),process.stderr.write(H("Amount",y(X+" NIGHT"))+`
122
+ `),process.stderr.write(B("Network",Y)+`
123
+ `),process.stderr.write(B("From",j("genesis (seed 0x01)"))+`
124
+ `),process.stderr.write(B("To",E(W,!0))+`
125
+ `),process.stderr.write(B("Amount",M(X+" NIGHT"))+`
120
126
  `),process.stderr.write(`
121
- `);let W=v("Starting genesis wallet...");try{let J=await g0({seedBuffer:U,networkConfig:K,recipientAddress:G,amountNight:X,signal:Z,onSync(V,B){if(B>0){let F=Math.round(V/B*100);W.update(`Syncing genesis wallet... ${F}%`)}},onDust(V){W.update(`Dust: ${V}`)},onProving(){W.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){W.update("Submitting transaction...")},onSyncWarning(V,B){W.update(`Syncing genesis wallet... (${B}, retrying)`)}});if(W.stop("Transaction submitted"),P($,"json")){L({txHash:J.txHash,amount:X,recipient:G,network:Y});return}process.stdout.write(J.txHash+`
127
+ `);let G=v("Starting genesis wallet...");try{let U=await i0({seedBuffer:J,networkConfig:K,recipientAddress:W,amountNight:X,signal:Z,onSync(H,V){if(V>0){let F=Math.round(H/V*100);G.update(`Syncing genesis wallet... ${F}%`)}},onDust(H){G.update(`Dust: ${H}`)},onProving(){G.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){G.update("Submitting transaction...")},onSyncWarning(H,V){G.update(`Syncing genesis wallet... (${V}, retrying)`)}});if(G.stop("Transaction submitted"),O($,"json")){T({txHash:U.txHash,amount:X,recipient:W,network:Y});return}process.stdout.write(U.txHash+`
122
128
  `),process.stderr.write(`
123
- `+Z0(`Airdropped ${X} NIGHT to your wallet`,J.txHash)+`
129
+ `+s(`Airdropped ${X} NIGHT to your wallet`,U.txHash)+`
124
130
  `),process.stderr.write(`
125
- `+D()+`
131
+ `+A()+`
126
132
  `),process.stderr.write(j(" Verify: midnight balance")+`
127
133
  `),process.stderr.write(j(" Register dust: midnight dust register")+`
128
134
  `),process.stderr.write(j(" Note: Dust generation takes a few minutes on a fresh wallet.")+`
129
135
  `),process.stderr.write(j(" It will happen automatically on your first transfer.")+`
130
136
 
131
- `)}catch(J){if(W.stop("Failed"),J instanceof Error&&J.message.toLowerCase().includes("dust"))throw new Error(`${J.message}
137
+ `)}catch(U){if(G.stop("Failed"),U instanceof Error&&U.message.toLowerCase().includes("dust"))throw new Error(`${U.message}
132
138
 
133
139
  On a fresh localnet, the minimum airdrop is ~1 NIGHT.
134
- Try: midnight airdrop 1`);throw J}}var x1=O(()=>{q0();r();d0();N();G0()});var E1={};w(E1,{default:()=>l3});async function l3($,Z){let Q=$.subcommand,X=$.positionals[0];if(!Q)throw new Error(`Missing recipient address.
140
+ Try: midnight airdrop 1`);throw U}}var b1=L(()=>{Z0();n();o0();N();G0()});var k1={};b(k1,{default:()=>e3});async function e3($,Z){let Q=$.subcommand,X=$.positionals[0];if(!Q)throw new Error(`Missing recipient address.
135
141
  Usage: midnight transfer <to> <amount>
136
142
  Example: midnight transfer mn_addr_undeployed1... 100`);if(!X)throw new Error(`Missing amount.
137
143
  Usage: midnight transfer <to> <amount>
138
- Example: midnight transfer mn_addr_undeployed1... 100`);let q=m0(X),z=A($,"wallet"),Y=c(z),K=Buffer.from(Y.seed,"hex"),{name:G,config:U}=t({args:$,walletNetwork:Y.network,address:Y.address});process.stderr.write(`
139
- `+_("Transfer")+`
144
+ Example: midnight transfer mn_addr_undeployed1... 100`);let q=d0(X),z=D($,"wallet"),Y=p(z),K=Buffer.from(Y.seed,"hex"),{name:W,config:J}=o({args:$,walletNetwork:Y.network,address:Y.address});process.stderr.write(`
145
+ `+y("Transfer")+`
140
146
 
141
- `),process.stderr.write(H("Network",G)+`
142
- `),process.stderr.write(H("From",E(Y.address,!0))+`
143
- `),process.stderr.write(H("To",E(Q,!0))+`
144
- `),process.stderr.write(H("Amount",y(q+" NIGHT"))+`
147
+ `),process.stderr.write(B("Network",W)+`
148
+ `),process.stderr.write(B("From",E(Y.address,!0))+`
149
+ `),process.stderr.write(B("To",E(Q,!0))+`
150
+ `),process.stderr.write(B("Amount",M(q+" NIGHT"))+`
145
151
  `),process.stderr.write(`
146
- `);let W=v("Starting wallet...");try{let J=await g0({seedBuffer:K,networkConfig:U,recipientAddress:Q,amountNight:q,signal:Z,onSync(V,B){if(B>0){let F=Math.round(V/B*100);W.update(`Syncing wallet... ${F}%`)}},onDust(V){W.update(`Dust: ${V}`)},onProving(){W.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){W.update("Submitting transaction...")},onSyncWarning(V,B){W.update(`Syncing wallet... (${B}, retrying)`)}});if(W.stop("Transaction submitted"),P($,"json")){L({txHash:J.txHash,amount:q,recipient:Q,network:G});return}process.stdout.write(J.txHash+`
152
+ `);let G=v("Starting wallet...");try{let U=await i0({seedBuffer:K,networkConfig:J,recipientAddress:Q,amountNight:q,signal:Z,onSync(H,V){if(V>0){let F=Math.min(Math.round(H/V*100),100);G.update(F>=100?"Syncing wallet...":`Syncing wallet... ${F}%`)}},onSyncDetail(H){G.update(`Syncing wallet... (waiting: ${H})`)},onDust(H){G.update(`Dust: ${H}`)},onProving(){G.update("Generating ZK proof (this may take a few minutes)...")},onSubmitting(){G.update("Submitting transaction...")},onSyncWarning(H,V){G.update(`Syncing wallet... (${V}, retrying)`)}});if(G.stop("Transaction submitted"),O($,"json")){T({txHash:U.txHash,amount:q,recipient:Q,network:W});return}process.stdout.write(U.txHash+`
147
153
  `),process.stderr.write(`
148
- `+Z0(`Transferred ${q} NIGHT`,J.txHash)+`
154
+ `+s(`Transferred ${q} NIGHT`,U.txHash)+`
149
155
  `),process.stderr.write(`
150
- `+D()+`
156
+ `+A()+`
151
157
  `),process.stderr.write(j(" Verify: midnight balance")+`
152
158
 
153
- `)}catch(J){throw W.stop("Failed"),J}}var N1=O(()=>{q0();r();d0();N();G0()});var v1={};w(v1,{default:()=>o3});import*as i3 from"@midnight-ntwrk/ledger-v7";import*as b from"rxjs";async function o3($,Z){let Q=$.subcommand;if(!Q||Q!=="register"&&Q!=="status")throw new Error(`Missing or invalid subcommand.
159
+ `)}catch(U){throw G.stop("Failed"),U}}var S1=L(()=>{Z0();n();o0();N();G0()});var f1={};b(f1,{default:()=>Z2});import*as $2 from"@midnight-ntwrk/ledger-v7";import*as V0 from"rxjs";async function Z2($,Z){let Q=$.subcommand;if(!Q||Q!=="register"&&Q!=="status")throw new Error(`Missing or invalid subcommand.
154
160
  Usage:
155
161
  midnight dust register Register NIGHT UTXOs for dust generation
156
- midnight dust status Check dust registration status`);let X=A($,"wallet"),q=c(X),z=Buffer.from(q.seed,"hex"),{name:Y,config:K}=t({args:$,walletNetwork:q.network,address:q.address}),G=p0(z,K),U=async()=>{try{await u0(G)}catch{}},W=()=>{U()};Z?.addEventListener("abort",W,{once:!0});let J={},V=c0((F,T)=>{J.current?.(F,T)}),B=P($,"json");try{if(Q==="register")await G$(G,Y,B,Z,J);else await U$(G,Y,B,Z,J)}finally{Z?.removeEventListener("abort",W),V(),await U()}}async function G$($,Z,Q,X,q){process.stderr.write(`
157
- `+_("Dust Register")+`
162
+ midnight dust status Check dust registration status`);let X=D($,"wallet"),q=p(X),z=Buffer.from(q.seed,"hex"),{name:Y,config:K}=o({args:$,walletNetwork:q.network,address:q.address}),W=I0(z,K),J=async()=>{try{await D0(W)}catch{}},G=()=>{J()};Z?.addEventListener("abort",G,{once:!0});let U={},H=m0((P,_)=>{U.current?.(P,_)}),V=w1(),F=O($,"json");try{if(Q==="register")await P$(W,Y,F,Z,U);else await O$(W,Y,F,Z,U)}finally{Z?.removeEventListener("abort",G),V(),H(),await J()}}async function P$($,Z,Q,X,q){process.stderr.write(`
163
+ `+y("Dust Register")+`
158
164
 
159
- `),process.stderr.write(H("Network",Z)+`
165
+ `),process.stderr.write(B("Network",Z)+`
160
166
 
161
- `);let z=v("Syncing wallet...");if(q)q.current=(Y,K)=>z.update(`Syncing wallet... (${K}, retrying)`);try{if(await T0($,(J,V)=>{if(V>0){let B=Math.round(J/V*100);z.update(`Syncing wallet... ${B}%`)}}),X?.aborted)throw new Error("Operation cancelled");z.update("Checking dust status...");let Y=await b.firstValueFrom($.facade.state().pipe(b.filter((J)=>J.isSynced)));if(Y.dust.availableCoins.length>0){let J=Y.dust.walletBalance(new Date);if(z.stop("Dust already available"),Q){L({subcommand:"register",dustBalance:P0(J)});return}process.stdout.write(J.toString()+`
162
- `),process.stderr.write(`
163
- `+Z0(`Dust tokens already available: ${N0(J)}`)+`
167
+ `);let z=v("Syncing wallet...");if(q)q.current=(Y,K)=>z.update(`Syncing wallet... (${K}, retrying)`);try{let Y=await y0($,(G,U)=>{if(U>0){let H=Math.min(Math.round(G/U*100),100);z.update(H>=100?"Syncing wallet...":`Syncing wallet... ${H}%`)}},(G)=>{z.update(`Syncing wallet... (waiting: ${G})`)});if(X?.aborted)throw new Error("Operation cancelled");z.update("Checking dust status...");let K=await l0($,(G)=>{z.update(G)},Y);if(X?.aborted)throw new Error("Operation cancelled");let J=(await V0.firstValueFrom($.facade.state().pipe(V0.filter((G)=>G.isSynced)))).dust.walletBalance(new Date);if(K.alreadyAvailable)z.stop("Dust already available");else z.stop("Dust registration complete");if(Q){let G={subcommand:"register",dustBalance:w0(J)};if(K.txHash)G.txHash=K.txHash;T(G);return}if(process.stdout.write(J.toString()+`
168
+ `),K.alreadyAvailable)process.stderr.write(`
169
+ `+s(`Dust tokens already available: ${C0(J)}`)+`
164
170
 
165
- `);return}let K=Y.unshielded.availableCoins.filter((J)=>J.meta?.registeredForDustGeneration!==!0),G;if(K.length===0)z.update("All UTXOs already registered, waiting for dust generation...");else{z.update(`Registering ${K.length} UTXO(s) for dust generation...`);let J=K.map((V)=>({...V.utxo,ctime:new Date(V.meta.ctime)}));G=await D1($,J,Y.dust.dustAddress,(V)=>{z.update(V)}),z.update(`Registration submitted (${G.slice(0,12)}...), waiting for dust...`)}if(X?.aborted)throw new Error("Operation cancelled");let W=(await b.firstValueFrom($.facade.state().pipe(b.throttleTime(5000),b.filter((J)=>J.isSynced),b.filter((J)=>J.dust.walletBalance(new Date)>0n),b.timeout(A0)))).dust.walletBalance(new Date);if(z.stop("Dust registration complete"),Q){let J={subcommand:"register",dustBalance:P0(W)};if(G)J.txHash=G;L(J);return}process.stdout.write(W.toString()+`
166
- `),process.stderr.write(`
167
- `+Z0(`Dust tokens available: ${N0(W)}`)+`
171
+ `);else process.stderr.write(`
172
+ `+s(`Dust tokens available: ${C0(J)}`)+`
168
173
 
169
- `)}catch(Y){throw z.stop("Failed"),Y}}async function U$($,Z,Q,X,q){process.stderr.write(`
170
- `+_("Dust Status")+`
174
+ `)}catch(Y){throw z.stop("Failed"),Y}}async function O$($,Z,Q,X,q){process.stderr.write(`
175
+ `+y("Dust Status")+`
171
176
 
172
- `),process.stderr.write(H("Network",Z)+`
177
+ `),process.stderr.write(B("Network",Z)+`
173
178
 
174
- `);let z=v("Syncing wallet...");if(q)q.current=(Y,K)=>z.update(`Syncing wallet... (${K}, retrying)`);try{if(await T0($,(B,F)=>{if(F>0){let T=Math.round(B/F*100);z.update(`Syncing wallet... ${T}%`)}}),X?.aborted)throw new Error("Operation cancelled");z.update("Checking dust status...");let Y=await b.firstValueFrom($.facade.state().pipe(b.filter((B)=>B.isSynced))),K=Y.dust.walletBalance(new Date),G=Y.dust.availableCoins.length>0,U=Y.unshielded.availableCoins,W=U.filter((B)=>B.meta?.registeredForDustGeneration!==!0),J=U.length-W.length,V=Y.unshielded.balances[i3.unshieldedToken().raw]??0n;if(z.stop("Done"),Q){L({subcommand:"status",dustBalance:P0(K),registered:J,unregistered:W.length,nightBalance:F0(V),dustAvailable:G});return}process.stdout.write(`dust=${K}
175
- `),process.stdout.write(`registered=${J}
176
- `),process.stdout.write(`unregistered=${W.length}
177
- `),process.stderr.write(H("NIGHT Balance",y(E0(V)))+`
178
- `),process.stderr.write(H("Dust Balance",y(N0(K)))+`
179
- `),process.stderr.write(H("Dust Available",G?"yes":"no")+`
180
- `),process.stderr.write(H("Registered",J.toString()+" UTXO(s)")+`
181
- `),process.stderr.write(H("Unregistered",W.length.toString()+" UTXO(s)")+`
179
+ `);let z=v("Syncing wallet...");if(q)q.current=(Y,K)=>z.update(`Syncing wallet... (${K}, retrying)`);try{if(await y0($,(V,F)=>{if(F>0){let P=Math.min(Math.round(V/F*100),100);z.update(P>=100?"Syncing wallet...":`Syncing wallet... ${P}%`)}},(V)=>{z.update(`Syncing wallet... (waiting: ${V})`)}),X?.aborted)throw new Error("Operation cancelled");z.update("Checking dust status...");let Y=await V0.firstValueFrom($.facade.state().pipe(V0.filter((V)=>V.isSynced))),K=Y.dust.walletBalance(new Date),W=Y.dust.availableCoins.length>0,J=Y.unshielded.availableCoins,G=J.filter((V)=>V.meta?.registeredForDustGeneration!==!0),U=J.length-G.length,H=Y.unshielded.balances[$2.unshieldedToken().raw]??0n;if(z.stop("Done"),Q){T({subcommand:"status",dustBalance:w0(K),registered:U,unregistered:G.length,nightBalance:L0(H),dustAvailable:W});return}process.stdout.write(`dust=${K}
180
+ `),process.stdout.write(`registered=${U}
181
+ `),process.stdout.write(`unregistered=${G.length}
182
+ `),process.stderr.write(B("NIGHT Balance",M(v0(H)))+`
183
+ `),process.stderr.write(B("Dust Balance",M(C0(K)))+`
184
+ `),process.stderr.write(B("Dust Available",W?"yes":"no")+`
185
+ `),process.stderr.write(B("Registered",U.toString()+" UTXO(s)")+`
186
+ `),process.stderr.write(B("Unregistered",G.length.toString()+" UTXO(s)")+`
182
187
  `),process.stderr.write(`
183
- `+D()+`
188
+ `+A()+`
184
189
 
185
- `)}catch(Y){throw z.stop("Failed"),Y}}var k1=O(()=>{q0();r();I1();d0();N();G0()});var b1={};w(b1,{default:()=>n3});async function n3($){let Z=$.subcommand;if(!Z||Z!=="get"&&Z!=="set")throw new Error(`Usage: midnight config <get|set> <key> [value]
186
- Valid keys: ${Y1().join(", ")}`);let Q=$.positionals[0];if(!Q)throw new Error(`Missing config key.
187
- Valid keys: ${Y1().join(", ")}`);if(Z==="get"){let X=T3(Q);if(P($,"json")){L({action:"get",key:Q,value:X});return}process.stdout.write(X+`
190
+ `)}catch(Y){throw z.stop("Failed"),Y}}var h1=L(()=>{Z0();n();x1();o0();N();G0()});var p1={};b(p1,{default:()=>Q2});async function Q2($){let Z=$.subcommand;if(!Z||Z!=="get"&&Z!=="set")throw new Error(`Usage: midnight config <get|set> <key> [value]
191
+ Valid keys: ${U1().join(", ")}`);let Q=$.positionals[0];if(!Q)throw new Error(`Missing config key.
192
+ Valid keys: ${U1().join(", ")}`);if(Z==="get"){let X=x3(Q);if(O($,"json")){T({action:"get",key:Q,value:X});return}process.stdout.write(X+`
188
193
  `)}else{let X=$.positionals[1];if(X===void 0)throw new Error(`Missing value for config set.
189
- Usage: midnight config set ${Q} <value>`);if(M3(Q,X),P($,"json")){L({action:"set",key:Q,value:X});return}process.stderr.write(i("✓")+` ${Q} = ${X}
190
- `)}}var w1=O(()=>{J1()});import{execSync as M0}from"child_process";import{existsSync as a3,mkdirSync as B$,readFileSync as W$,writeFileSync as t3}from"fs";import{homedir as V$}from"os";import{join as C1}from"path";function s3(){try{return M0("docker compose version",{...i0,timeout:1e4}).trim()}catch{try{throw M0("docker --version",{...i0,timeout:5000}),new Error(`Docker Compose v2 is required.
194
+ Usage: midnight config set ${Q} <value>`);if(E3(Q,X),O($,"json")){T({action:"set",key:Q,value:X});return}process.stderr.write(g("✓")+` ${Q} = ${X}
195
+ `)}}var u1=L(()=>{W1()});import{execSync as A0}from"child_process";import{existsSync as X2,mkdirSync as L$,readFileSync as T$,writeFileSync as q2}from"fs";import{homedir as M$}from"os";import{join as m1}from"path";function Y2(){try{return A0("docker compose version",{...a0,timeout:1e4}).trim()}catch{try{throw A0("docker --version",{...a0,timeout:5000}),new Error(`Docker Compose v2 is required.
191
196
  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.
192
- Install Docker from https://docs.docker.com/get-docker/`)}}}function e3(){if(a3(S1)&&a3(l0)&&W$(S1,"utf-8").trim()===r3)return!1;return B$(f1,{recursive:!0,mode:$0}),t3(l0,H$,"utf-8"),t3(S1,r3,"utf-8"),!0}function B0($){return M0(`docker compose -f "${l0}" ${$}`,i0)}function o0(){try{let $=B0("ps --format json");if(!$.trim())return[];let Z=$.trim().split(`
193
- `),Q=[];for(let X of Z){if(!X.trim())continue;try{let q=JSON.parse(X),z=q.Service??"unknown";Q.push({name:z,state:q.State??"unknown",health:q.Health??"",port:j$[z]??""})}catch{}}return Q}catch{return[]}}function $2($=120000,Z=3000){let Q=Date.now()+$;while(Date.now()<Q){let X=o0();if(X.length===3&&X.every((z)=>z.state==="running")){if(X.every((Y)=>Y.health==="healthy"||Y.health===""))return!0}M0(`sleep ${Z/1000}`,{timeout:Z+1000})}return!1}function h1(){return l0}function Z2(){let $=[];for(let Z of F$)try{M0(`docker rm -f "${Z}"`,{...i0,timeout:1e4}),$.push(Z)}catch{}return $}var r3="1.4.0",f1,l0,S1,H$=`services:
197
+ Install Docker from https://docs.docker.com/get-docker/`)}}}function J2(){if(X2(c1)&&X2(n0)&&T$(c1,"utf-8").trim()===z2)return!1;return L$(g1,{recursive:!0,mode:r}),q2(n0,_$,"utf-8"),q2(c1,z2,"utf-8"),!0}function H0($){return A0(`docker compose -f "${n0}" ${$}`,a0)}function t0(){try{let $=H0("ps --format json");if(!$.trim())return[];let Z=$.trim().split(`
198
+ `),Q=[];for(let X of Z){if(!X.trim())continue;try{let q=JSON.parse(X),z=q.Service??"unknown";Q.push({name:z,state:q.State??"unknown",health:q.Health??"",port:I$[z]??""})}catch{}}return Q}catch{return[]}}function K2($=120000,Z=3000){let Q=Date.now()+$;while(Date.now()<Q){let X=t0();if(X.length===3&&X.every((z)=>z.state==="running")){if(X.every((Y)=>Y.health==="healthy"||Y.health===""))return!0}A0(`sleep ${Z/1000}`,{timeout:Z+1000})}return!1}function d1(){return n0}function G2(){let $=[];for(let Z of y$)try{A0(`docker rm -f "${Z}"`,{...a0,timeout:1e4}),$.push(Z)}catch{}return $}var z2="1.4.0",g1,n0,c1,_$=`services:
194
199
  proof-server:
195
200
  image: 'nel349/proof-server:7.0.0'
196
201
  container_name: "proof-server"
@@ -232,34 +237,34 @@ Install Docker from https://docs.docker.com/get-docker/`)}}}function e3(){if(a3(
232
237
  start_period: 5s
233
238
  environment:
234
239
  CFG_PRESET: "dev"
235
- `,i0,j$,F$;var Q2=O(()=>{f1=C1(V$(),p,z3),l0=C1(f1,"compose.yml"),S1=C1(f1,".version"),i0={encoding:"utf-8",timeout:30000};j$={node:"9944",indexer:"8088","proof-server":"6300"};F$=["node","indexer","proof-server"]});var p1={};w(p1,{default:()=>z2});import{spawn as P$}from"child_process";function O$($){return X2.includes($)}function q2($){let Z=[];for(let Q of $){let X=Q.state==="running"?i:S,q=Q.health?` (${Q.health})`:"",z=Q.port?`:${Q.port}`:"";Z.push(` ${Q.name.padEnd(16)}${X(Q.state)}${j(q)}${j(z)}`)}return Z.join(`
236
- `)}async function L$($){if(e3())process.stderr.write(j(` Wrote compose.yml to ${h1()}`)+`
237
- `);let Q=v("Starting local network...");try{if(B0("up -d"),Q.update("Waiting for services to be healthy..."),!$2(120000))Q.stop(V0("Services started but not all healthy yet")),process.stderr.write(`
238
- `+j(" Tip: run ")+y("midnight localnet logs")+j(" to check for errors")+`
239
- `);else Q.stop("Local network is running")}catch(q){if(Q.stop(S("Failed to start local network")),q instanceof Error){if(q.message.includes("is already in use by container"))throw new Error(`Container name conflict — containers with the same names already exist
240
+ `,a0,I$,y$;var U2=L(()=>{g1=m1(M$(),f,V3),n0=m1(g1,"compose.yml"),c1=m1(g1,".version"),a0={encoding:"utf-8",timeout:30000};I$={node:"9944",indexer:"8088","proof-server":"6300"};y$=["node","indexer","proof-server"]});var l1={};b(l1,{default:()=>H2});import{spawn as D$}from"child_process";function A$($){return W2.includes($)}function V2($){let Z=[];for(let Q of $){let X=Q.state==="running"?g:k,q=Q.health?` (${Q.health})`:"",z=Q.port?`:${Q.port}`:"";Z.push(` ${Q.name.padEnd(16)}${X(Q.state)}${j(q)}${j(z)}`)}return Z.join(`
241
+ `)}async function R$($){if(J2())process.stderr.write(j(` Wrote compose.yml to ${d1()}`)+`
242
+ `);let Q=v("Starting local network...");try{if(H0("up -d"),Q.update("Waiting for services to be healthy..."),!K2(120000))Q.stop(F0("Services started but not all healthy yet")),process.stderr.write(`
243
+ `+j(" Tip: run ")+M("midnight localnet logs")+j(" to check for errors")+`
244
+ `);else Q.stop("Local network is running")}catch(q){if(Q.stop(k("Failed to start local network")),q instanceof Error){if(q.message.includes("is already in use by container"))throw new Error(`Container name conflict — containers with the same names already exist
240
245
  `+`(likely from a previous midnight-local-network setup).
241
246
 
242
247
  Run "midnight localnet clean" to remove them, then try again.`);if(q.message.includes("address already in use"))throw new Error(`Port conflict detected — another process is using a required port.
243
- `+"Check ports 9944, 8088, and 6300, then try again.")}throw q}let X=o0();if($){L({subcommand:"up",services:X.map((q)=>({name:q.name,state:q.state,port:q.port,health:q.health}))});return}if(X.length>0)process.stderr.write(`
244
- `+q2(X)+`
248
+ `+"Check ports 9944, 8088, and 6300, then try again.")}throw q}let X=t0();if($){T({subcommand:"up",services:X.map((q)=>({name:q.name,state:q.state,port:q.port,health:q.health}))});return}if(X.length>0)process.stderr.write(`
249
+ `+V2(X)+`
245
250
  `);for(let q of X)process.stdout.write(`${q.name}=${q.state}:${q.port}
246
251
  `);process.stderr.write(`
247
- `+j(" Next: ")+y("midnight generate --network undeployed")+`
248
- `)}async function y$($){let Z=v("Stopping local network...");try{if(B0("stop"),Z.stop("Local network stopped (containers preserved)"),$){L({subcommand:"stop",status:"stopped"});return}}catch(Q){throw Z.stop(S("Failed to stop local network")),Q}}async function T$($){let Z=v("Tearing down local network...");try{if(B0("down --volumes"),Z.stop("Local network removed (containers, networks, volumes)"),$){L({subcommand:"down",status:"removed"});return}}catch(Q){throw Z.stop(S("Failed to tear down local network")),Q}}async function M$($){let Z=o0();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(`
249
- `+_("Localnet Status")+`
252
+ `+j(" Next: ")+M("midnight generate --network undeployed")+`
253
+ `)}async function x$($){let Z=v("Stopping local network...");try{if(H0("stop"),Z.stop("Local network stopped (containers preserved)"),$){T({subcommand:"stop",status:"stopped"});return}}catch(Q){throw Z.stop(k("Failed to stop local network")),Q}}async function E$($){let Z=v("Tearing down local network...");try{if(H0("down --volumes"),Z.stop("Local network removed (containers, networks, volumes)"),$){T({subcommand:"down",status:"removed"});return}}catch(Q){throw Z.stop(k("Failed to tear down local network")),Q}}async function N$($){let Z=t0();if($){T({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(`
254
+ `+y("Localnet Status")+`
250
255
 
251
256
  `),process.stderr.write(j(" No services running.")+`
252
- `),process.stderr.write(j(" Run ")+y("midnight localnet up")+j(" to start.")+`
257
+ `),process.stderr.write(j(" Run ")+M("midnight localnet up")+j(" to start.")+`
253
258
 
254
259
  `);return}process.stderr.write(`
255
- `+_("Localnet Status")+`
260
+ `+y("Localnet Status")+`
256
261
 
257
- `),process.stderr.write(q2(Z)+`
262
+ `),process.stderr.write(V2(Z)+`
258
263
  `),process.stderr.write(`
259
- `+D()+`
264
+ `+A()+`
260
265
 
261
266
  `);for(let Q of Z)process.stdout.write(`${Q.name}=${Q.state}:${Q.port}
262
- `)}async function I$($){let Z=v("Removing conflicting containers...");try{try{B0("down")}catch{}let Q=Z2();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(S("Failed to clean up")),Q}}async function _$(){let $=h1(),Z=P$("docker",["compose","-f",$,"logs","-f"],{stdio:"inherit"});return new Promise((Q,X)=>{Z.on("close",(q)=>{if(q===0||q===130||q===null)Q();else X(new Error(`docker compose logs exited with code ${q}`))}),Z.on("error",X)})}async function z2($){let Z=$.subcommand;if(!Z||!O$(Z))throw new Error(`Usage: midnight localnet <${X2.join("|")}>
267
+ `)}async function v$($){let Z=v("Removing conflicting containers...");try{try{H0("down")}catch{}let Q=G2();if(Q.length>0)Z.stop(`Removed ${Q.length} container${Q.length>1?"s":""}: ${Q.join(", ")}`);else Z.stop("No conflicting containers found");if($){T({subcommand:"clean",status:"cleaned",removed:Q});return}}catch(Q){throw Z.stop(k("Failed to clean up")),Q}}async function w$(){let $=d1(),Z=D$("docker",["compose","-f",$,"logs","-f"],{stdio:"inherit"});return new Promise((Q,X)=>{Z.on("close",(q)=>{if(q===0||q===130||q===null)Q();else X(new Error(`docker compose logs exited with code ${q}`))}),Z.on("error",X)})}async function H2($){let Z=$.subcommand;if(!Z||!A$(Z))throw new Error(`Usage: midnight localnet <${W2.join("|")}>
263
268
 
264
269
  Subcommands:
265
270
  up Start the local network
@@ -269,30 +274,30 @@ Subcommands:
269
274
  logs Stream service logs
270
275
  clean Remove conflicting containers
271
276
 
272
- Example: midnight localnet up`);s3();let Q=P($,"json");switch(process.stderr.write(`
273
- `+_("Localnet")+`
274
-
275
- `),Z){case"up":return L$(Q);case"stop":return y$(Q);case"down":return T$(Q);case"status":return M$(Q);case"logs":return _$();case"clean":return I$(Q)}}var X2;var u1=O(()=>{Q2();N();G0();X2=["up","stop","down","status","logs","clean"]});var v$={};import{Server as A$}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as D$}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema as R$,CallToolRequestSchema as x$}from"@modelcontextprotocol/sdk/types.js";function m($,Z,Q){let X={json:!0},q=[];for(let[z,Y]of Object.entries(Z)){if(Y===void 0||Y===null)continue;if(typeof Y==="boolean"){if(Y)X[z]=!0}else X[z]=String(Y)}return{command:$,subcommand:Q,positionals:q,flags:X}}async function x($){let Z=E$[$];if(!Z)throw new Error(`Unknown command handler: ${$}`);return(await Z()).default}async function N$(){let $=new D$;await c1.connect($)}var E$,Y2,c1;var J2=O(()=>{H3();$1();k0();E$={generate:()=>Promise.resolve().then(() => (G1(),K1)),info:()=>Promise.resolve().then(() => (B1(),U1)),balance:()=>Promise.resolve().then(() => (V1(),W1)),address:()=>Promise.resolve().then(() => (j1(),H1)),"genesis-address":()=>Promise.resolve().then(() => (P1(),F1)),"inspect-cost":()=>Promise.resolve().then(() => (L1(),O1)),airdrop:()=>Promise.resolve().then(() => (x1(),R1)),transfer:()=>Promise.resolve().then(() => (N1(),E1)),dust:()=>Promise.resolve().then(() => (k1(),v1)),config:()=>Promise.resolve().then(() => (w1(),b1)),localnet:()=>Promise.resolve().then(() => (u1(),p1))};Y2=[{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=m("generate",$);if($.force==="true"||$.force===!0)Z.flags.force=!0;let Q=await x("generate");return R(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=m("info",$),Q=await x("info");return R(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=m("balance",$,Z);delete Q.flags.address;let X=await x("balance");return R(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=m("address",$),Q=await x("address");return R(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=m("genesis-address",$),Q=await x("genesis-address");return R(Q,Z)}},{name:"midnight_inspect_cost",description:"Display current block limits derived from LedgerParameters",inputSchema:{type:"object",properties:{}},async handler(){let $=m("inspect-cost",{}),Z=await x("inspect-cost");return R(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=m("airdrop",$,Z);delete Q.flags.amount;let X=await x("airdrop");return R(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=m("transfer",$,Z);X.positionals=[Q],delete X.flags.to,delete X.flags.amount;let q=await x("transfer");return R(q,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=m("dust",$,"register"),Q=await x("dust");return R(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=m("dust",$,"status"),Q=await x("dust");return R(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 x("config");return R(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}},q=await x("config");return R(q,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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(Z,$)}}],c1=new A$({name:"midnight-wallet-cli",version:Q0},{capabilities:{tools:{}}});c1.setRequestHandler(R$,async()=>{return{tools:Y2.map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}});c1.setRequestHandler(x$,async($)=>{let{name:Z,arguments:Q}=$.params,X=Y2.find((q)=>q.name===Z);if(!X)return{content:[{type:"text",text:`Unknown tool: ${Z}`}],isError:!0};try{let q=await X.handler(Q??{});return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){let z=q instanceof Error?q:new Error(String(q)),{errorCode:Y}=O0(z);return{content:[{type:"text",text:JSON.stringify({error:!0,code:Y,message:z.message})}],isError:!0}}});N$().catch(($)=>{process.stderr.write(`MCP server error: ${$.message}
276
- `),process.exit(1)})});function G2($){let Z=Math.max(0,Math.min(1,$)),Q=W0[0].length,X=Math.floor(Z*Q);return W0.map((q)=>q.slice(0,X).padEnd(Q))}function U2($){let Z=Math.max(0,Math.min(1,$)),Q=Math.floor($*100);if(Z>=1)return W0;return W0.map((X,q)=>Array.from(X).map((z,Y)=>{if(z===" ")return" ";if(Z<=0)return a0(q+20,Y,0);let K=((q+20)*131+Y*997)%100/100;return Z>=K?z:a0(q+20,Y,Q)}).join(""))}function a0($,Z,Q){let X=($*131+Z*997+Q*7919)%65537/65537;return K2[Math.floor(X*K2.length)]}function B2($){let Z=Math.max(0,Math.min(1,$)),Q=n0.split(`
277
- `),X=Math.floor($*100);if(Z>=1)return n0;if(Z<=0)return Q.map((q,z)=>Array.from(q).map((Y,K)=>a0(z,K,0)).join("")).join(`
278
- `);return Q.map((q,z)=>Array.from(q).map((Y,K)=>{if(Y===" ")return" ";let G=(z*131+K*997)%100/100;return Z>=G?Y:a0(z,K,X)}).join("")).join(`
279
- `)}var n0,W0,m1,K2;var g1=O(()=>{n0=[" ████████████ "," ███ ███ "," ███ ██ ███ "," ██ ██ "," ██ ██ ██ "," ██ ██ "," ██ ██ ██ "," ██ ██ "," ██ ██ "," ██ ██ "," ██ ██ "," ███ ███ "," ███ ███ "," ████████████ "].join(`
280
- `),W0=["█▄ ▄█ █ █▀▄ █▄ █ █ █▀▀ █ █ ▀█▀","█ █ █ █ █ █ █ ██ █ █ █ █▀█ █ ","▀ ▀ ▀ ▀▀ ▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ "];m1=[["generate","Generate or restore a wallet"],["info","Display wallet metadata"],["balance","Check unshielded balance"],["address","Derive address from seed"],["genesis-address","Show genesis address"],["inspect-cost","Display block limits"],["airdrop","Fund from genesis wallet"],["transfer","Send NIGHT tokens"],["dust","Manage dust (fee tokens)"],["config","Manage CLI config"],["localnet","Manage local network"],["help","Show command usage"]],K2=["░","▒","▓","█","·"," "]});function l1($,Z){return new Promise((Q,X)=>{if(Z?.aborted){Q();return}let q=setTimeout(Q,$);Z?.addEventListener("abort",()=>{clearTimeout(q),Q()},{once:!0})})}async function W2($,Z){let X=n0.split(`
281
- `),q=X.length,z=36,Y=Math.max(q,Z?.length??0),K=3;if(!l()){for(let B=0;B<Y;B++){let F=(B<q?X[B]:"").padEnd(35),T=Z?.[B]??"";process.stderr.write(F+T+`
282
- `)}return}function G(B,F){for(let T=0;T<Y;T++){let I=T<B.length?H0(B[T]):"",M=F[T]??"";if(M)process.stderr.write(I+"\x1B[36G"+M+`\x1B[K
283
- `);else process.stderr.write(I+`\x1B[K
284
- `)}}function U(){process.stderr.write(`\x1B[${Y}A`)}for(let B=0;B<=20;B++){if($?.aborted)break;let F=B/20,I=B2(F).split(`
285
- `);if(B>0)U();G(I,[]),await l1(d1,$)}let W=20;for(let B=0;B<=W;B++){if($?.aborted)break;let F=B/W,T=G2(F);U();let I=new Array(Y).fill(null);for(let M=0;M<T.length;M++)I[M]=y(H0(T[M]));G(X,I),await l1(d1,$)}let J=12;for(let B=0;B<=J;B++){if($?.aborted)break;let F=B/J,T=U2(F);U();let I=new Array(Y).fill(null);for(let M=0;M<T.length;M++)I[M]=y(H0(T[M]));G(X,I),await l1(d1,$)}U();let V=new Array(Y).fill(null);if(Z)for(let B=0;B<Z.length;B++)if(B<3)V[B]=y(H0(Z[B]));else V[B]=Z[B];G(X,V)}var d1=80;var V2=O(()=>{g1()});var j2={};w(j2,{default:()=>H2,COMMAND_SPECS:()=>I0});function k$(){let $=[];for(let Z of W0)$.push(Z);$.push(""),$.push(y("Commands"));for(let[Z,Q]of m1)$.push(`${a(Z.padEnd(18))}${Q}`);return $.push(""),$.push(j("midnight (or mn) help <command>")),$.push(j("--json flag available on all commands")),$.push(j("midnight help --agent")+j(" AI & MCP reference")),$}function b$(){process.stderr.write(`
277
+ Example: midnight localnet up`);Y2();let Q=O($,"json");switch(process.stderr.write(`
278
+ `+y("Localnet")+`
279
+
280
+ `),Z){case"up":return R$(Q);case"stop":return x$(Q);case"down":return E$(Q);case"status":return N$(Q);case"logs":return w$();case"clean":return v$(Q)}}var W2;var i1=L(()=>{U2();N();G0();W2=["up","stop","down","status","logs","clean"]});var p$={};import{Server as C$}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as b$}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema as k$,CallToolRequestSchema as S$}from"@modelcontextprotocol/sdk/types.js";function u($,Z,Q){let X={json:!0},q=[];for(let[z,Y]of Object.entries(Z)){if(Y===void 0||Y===null)continue;if(typeof Y==="boolean"){if(Y)X[z]=!0}else X[z]=String(Y)}return{command:$,subcommand:Q,positionals:q,flags:X}}async function x($){let Z=f$[$];if(!Z)throw new Error(`Unknown command handler: ${$}`);return(await Z()).default}async function h$(){let $=new b$;await o1.connect($)}var f$,B2,o1;var j2=L(()=>{M3();q1();k0();f$={generate:()=>Promise.resolve().then(() => (H1(),V1)),info:()=>Promise.resolve().then(() => (j1(),B1)),balance:()=>Promise.resolve().then(() => (P1(),F1)),address:()=>Promise.resolve().then(() => (L1(),O1)),"genesis-address":()=>Promise.resolve().then(() => (M1(),T1)),"inspect-cost":()=>Promise.resolve().then(() => (I1(),_1)),airdrop:()=>Promise.resolve().then(() => (b1(),C1)),transfer:()=>Promise.resolve().then(() => (S1(),k1)),dust:()=>Promise.resolve().then(() => (h1(),f1)),config:()=>Promise.resolve().then(() => (u1(),p1)),localnet:()=>Promise.resolve().then(() => (i1(),l1))};B2=[{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=u("generate",$);if($.force==="true"||$.force===!0)Z.flags.force=!0;let Q=await x("generate");return R(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=u("info",$),Q=await x("info");return R(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=u("balance",$,Z);delete Q.flags.address;let X=await x("balance");return R(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=u("address",$),Q=await x("address");return R(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=u("genesis-address",$),Q=await x("genesis-address");return R(Q,Z)}},{name:"midnight_inspect_cost",description:"Display current block limits derived from LedgerParameters",inputSchema:{type:"object",properties:{}},async handler(){let $=u("inspect-cost",{}),Z=await x("inspect-cost");return R(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=u("airdrop",$,Z);delete Q.flags.amount;let X=await x("airdrop");return R(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=u("transfer",$,Z);X.positionals=[Q],delete X.flags.to,delete X.flags.amount;let q=await x("transfer");return R(q,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=u("dust",$,"register"),Q=await x("dust");return R(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=u("dust",$,"status"),Q=await x("dust");return R(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 x("config");return R(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}},q=await x("config");return R(q,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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(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 x("localnet");return R(Z,$)}}],o1=new C$({name:"midnight-wallet-cli",version:e},{capabilities:{tools:{}}});o1.setRequestHandler(k$,async()=>{return{tools:B2.map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}});o1.setRequestHandler(S$,async($)=>{let{name:Z,arguments:Q}=$.params,X=B2.find((q)=>q.name===Z);if(!X)return{content:[{type:"text",text:`Unknown tool: ${Z}`}],isError:!0};try{let q=await X.handler(Q??{});return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){let z=q instanceof Error?q:new Error(String(q)),{errorCode:Y}=T0(z);return{content:[{type:"text",text:JSON.stringify({error:!0,code:Y,message:z.message})}],isError:!0}}});h$().catch(($)=>{process.stderr.write(`MCP server error: ${$.message}
281
+ `),process.exit(1)})});function P2($){let Z=Math.max(0,Math.min(1,$)),Q=B0[0].length,X=Math.floor(Z*Q);return B0.map((q)=>q.slice(0,X).padEnd(Q))}function O2($){let Z=Math.max(0,Math.min(1,$)),Q=Math.floor($*100);if(Z>=1)return B0;return B0.map((X,q)=>Array.from(X).map((z,Y)=>{if(z===" ")return" ";if(Z<=0)return s0(q+20,Y,0);let K=((q+20)*131+Y*997)%100/100;return Z>=K?z:s0(q+20,Y,Q)}).join(""))}function s0($,Z,Q){let X=($*131+Z*997+Q*7919)%65537/65537;return F2[Math.floor(X*F2.length)]}function L2($){let Z=Math.max(0,Math.min(1,$)),Q=r0.split(`
282
+ `),X=Math.floor($*100);if(Z>=1)return r0;if(Z<=0)return Q.map((q,z)=>Array.from(q).map((Y,K)=>s0(z,K,0)).join("")).join(`
283
+ `);return Q.map((q,z)=>Array.from(q).map((Y,K)=>{if(Y===" ")return" ";let W=(z*131+K*997)%100/100;return Z>=W?Y:s0(z,K,X)}).join("")).join(`
284
+ `)}var r0,B0,n1,F2;var a1=L(()=>{r0=[" ████████████ "," ███ ███ "," ███ ██ ███ "," ██ ██ "," ██ ██ ██ "," ██ ██ "," ██ ██ ██ "," ██ ██ "," ██ ██ "," ██ ██ "," ██ ██ "," ███ ███ "," ███ ███ "," ████████████ "].join(`
285
+ `),B0=["█▄ ▄█ █ █▀▄ █▄ █ █ █▀▀ █ █ ▀█▀","█ █ █ █ █ █ █ ██ █ █ █ █▀█ █ ","▀ ▀ ▀ ▀▀ ▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ "];n1=[["generate","Generate or restore a wallet"],["info","Display wallet metadata"],["balance","Check unshielded balance"],["address","Derive address from seed"],["genesis-address","Show genesis address"],["inspect-cost","Display block limits"],["airdrop","Fund from genesis wallet"],["transfer","Send NIGHT tokens"],["dust","Manage dust (fee tokens)"],["config","Manage CLI config"],["localnet","Manage local network"],["help","Show command usage"]],F2=["░","▒","▓","█","·"," "]});function r1($,Z){return new Promise((Q,X)=>{if(Z?.aborted){Q();return}let q=setTimeout(Q,$);Z?.addEventListener("abort",()=>{clearTimeout(q),Q()},{once:!0})})}async function T2($,Z){let X=r0.split(`
286
+ `),q=X.length,z=36,Y=Math.max(q,Z?.length??0),K=3;if(!m()){for(let V=0;V<Y;V++){let F=(V<q?X[V]:"").padEnd(35),P=Z?.[V]??"";process.stderr.write(F+P+`
287
+ `)}return}function W(V,F){for(let P=0;P<Y;P++){let _=P<V.length?P0(V[P]):"",I=F[P]??"";if(I)process.stderr.write(_+"\x1B[36G"+I+`\x1B[K
288
+ `);else process.stderr.write(_+`\x1B[K
289
+ `)}}function J(){process.stderr.write(`\x1B[${Y}A`)}for(let V=0;V<=20;V++){if($?.aborted)break;let F=V/20,_=L2(F).split(`
290
+ `);if(V>0)J();W(_,[]),await r1(t1,$)}let G=20;for(let V=0;V<=G;V++){if($?.aborted)break;let F=V/G,P=P2(F);J();let _=new Array(Y).fill(null);for(let I=0;I<P.length;I++)_[I]=M(P0(P[I]));W(X,_),await r1(t1,$)}let U=12;for(let V=0;V<=U;V++){if($?.aborted)break;let F=V/U,P=O2(F);J();let _=new Array(Y).fill(null);for(let I=0;I<P.length;I++)_[I]=M(P0(P[I]));W(X,_),await r1(t1,$)}J();let H=new Array(Y).fill(null);if(Z)for(let V=0;V<Z.length;V++)if(V<3)H[V]=M(P0(Z[V]));else H[V]=Z[V];W(X,H)}var t1=80;var M2=L(()=>{a1()});var I2={};b(I2,{default:()=>_2,COMMAND_SPECS:()=>R0});function u$(){let $=[];for(let Z of B0)$.push(Z);$.push(""),$.push(M("Commands"));for(let[Z,Q]of n1)$.push(`${i(Z.padEnd(18))}${Q}`);return $.push(""),$.push(j("midnight (or mn) help <command>")),$.push(j("--json flag available on all commands")),$.push(j("midnight help --agent")+j(" AI & MCP reference")),$}function c$(){process.stderr.write(`
286
291
  Commands:
287
292
 
288
- `);for(let[$,Z]of m1)process.stderr.write(` ${$.padEnd(18)}${Z}
293
+ `);for(let[$,Z]of n1)process.stderr.write(` ${$.padEnd(18)}${Z}
289
294
  `);process.stderr.write(`
290
295
  Usage: midnight <command> (or: mn <command>)
291
296
  `),process.stderr.write(` --json flag available on all commands
292
297
  `),process.stderr.write(` midnight help --agent AI & MCP reference
293
298
 
294
- `)}function w$($){if(process.stdout.write(`
295
- `+_($.name)+`
299
+ `)}function m$($){if(process.stdout.write(`
300
+ `+y($.name)+`
296
301
 
297
302
  `),process.stdout.write(` ${$.description}
298
303
 
@@ -305,11 +310,11 @@ Commands:
305
310
  `)}if($.examples&&$.examples.length>0){process.stdout.write(J0("Examples:")+`
306
311
  `);for(let Z of $.examples)process.stdout.write(` ${j("$")} ${Z}
307
312
  `);process.stdout.write(`
308
- `)}}function S$(){let $={cli:{name:W3,version:Q0,description:V3,bin:["midnight","mn"]},globalFlags:[{name:"--json",description:"Output structured JSON to stdout (suppresses all stderr)"},{name:"--wallet <file>",description:"Custom wallet file path"},{name:"--network <name>",description:"Override network (preprod, preview, undeployed)"},{name:"--version, -v",description:"Print CLI version"},{name:"--help, -h",description:"Show help"}],commands:I0.map((Z)=>({name:Z.name,description:Z.description,usage:Z.usage,flags:Z.flags,examples:Z.examples,jsonFields:Z.jsonFields}))};L($)}function C$(){let $=`
313
+ `)}}function g$(){let $={cli:{name:L3,version:e,description:T3,bin:["midnight","mn"]},globalFlags:[{name:"--json",description:"Output structured JSON to stdout (suppresses all stderr)"},{name:"--wallet <file>",description:"Custom wallet file path"},{name:"--network <name>",description:"Override network (preprod, preview, undeployed)"},{name:"--version, -v",description:"Print CLI version"},{name:"--help, -h",description:"Show help"}],commands:R0.map((Z)=>({name:Z.name,description:Z.description,usage:Z.usage,flags:Z.flags,examples:Z.examples,jsonFields:Z.jsonFields}))};T($)}function d$(){let $=`
309
314
  MIDNIGHT CLI — AI Agent & MCP Reference
310
315
  ========================================
311
316
 
312
- Version: ${Q0}
317
+ Version: ${e}
313
318
 
314
319
  STRUCTURED JSON OUTPUT
315
320
  ──────────────────────
@@ -332,7 +337,7 @@ for programmatic discovery of CLI capabilities.
332
337
 
333
338
  COMMANDS & JSON SCHEMAS
334
339
  ───────────────────────
335
- ${I0.filter((Z)=>Z.jsonFields).map((Z)=>{let Q=Object.entries(Z.jsonFields).map(([X,q])=>` ${X.padEnd(20)}${q}`).join(`
340
+ ${R0.filter((Z)=>Z.jsonFields).map((Z)=>{let Q=Object.entries(Z.jsonFields).map(([X,q])=>` ${X.padEnd(20)}${q}`).join(`
336
341
  `);return`
337
342
  ${Z.name}
338
343
  ${Z.usage}
@@ -411,10 +416,10 @@ EXAMPLE WORKFLOW
411
416
  # 4. Transfer tokens
412
417
  midnight transfer mn_addr_... 100 --json
413
418
  # → {"txHash":"...","amount":"100","recipient":"mn_addr_...","network":"undeployed"}
414
- `;process.stdout.write($)}async function H2($){if(P($,"agent")){C$();return}if(P($,"json")){S$();return}let Z=$.subcommand;if(Z){let X=I0.find((q)=>q.name===Z);if(!X)throw new Error(`Unknown command: "${Z}"
415
- Available commands: ${I0.map((q)=>q.name).join(", ")}`);w$(X);return}if(!process.stderr.isTTY){b$();return}let Q=k$();await W2(void 0,Q)}var I0;var F2=O(()=>{N();V2();g1();k0();I0=[{name:"generate",description:"Generate a new wallet (random mnemonic, or restore from seed/mnemonic)",usage:'midnight generate [--network <name>] [--seed <hex>] [--mnemonic "..."] [--output <file>] [--force]',flags:["--network <name> Network: preprod, preview, undeployed","--seed <hex> Restore from existing seed (64-char hex)",'--mnemonic "..." Restore from BIP-39 mnemonic (24 words)',"--output <file> Custom output path (default: ~/.midnight/wallet.json)","--force Overwrite existing wallet file"],examples:["midnight generate --network preprod","midnight generate --network preprod --output my-wallet.json","midnight generate --seed 0123456789abcdef..."],jsonFields:{address:"Generated wallet address (bech32m)",network:"Network name",seed:"Hex-encoded 32-byte seed",mnemonic:"BIP-39 mnemonic (24 words, only if generated or provided)",file:"Path where wallet file was saved",createdAt:"ISO 8601 creation timestamp"}},{name:"info",description:"Display wallet address, network, creation date (no secrets shown)",usage:"midnight info [--wallet <file>]",flags:["--wallet <file> Custom wallet file path"],examples:["midnight info","midnight info --wallet my-wallet.json"],jsonFields:{address:"Wallet address (bech32m)",network:"Network name",createdAt:"ISO 8601 creation timestamp",file:"Wallet file path"}},{name:"balance",description:"Check unshielded balance via GraphQL subscription",usage:"midnight balance [address] [--network <name>] [--indexer-ws <url>]",flags:["<address> Address to check (or reads from wallet file)","--network <name> Override network detection","--indexer-ws <url> Custom indexer WebSocket URL"],examples:["midnight balance","midnight balance mn_addr_preprod1...","midnight balance --network preprod"],jsonFields:{address:"Checked address (bech32m)",network:"Network name",balances:"Object mapping token type to balance string",utxoCount:"Number of UTXOs",txCount:"Number of transactions synced"}},{name:"address",description:"Derive and display an unshielded address from a seed",usage:"midnight address --seed <hex> [--network <name>] [--index <n>]",flags:["--seed <hex> Seed to derive from (required, 64-char hex)","--network <name> Network for address prefix (default: resolved)","--index <n> Key derivation index (default: 0)"],examples:["midnight address --seed 0123456789abcdef... --network preprod","midnight address --seed 0123456789abcdef... --index 1"],jsonFields:{address:"Derived address (bech32m)",network:"Network name",index:"Key derivation index",path:"BIP-44 derivation path"}},{name:"genesis-address",description:"Display the genesis wallet address (seed 0x01) for a network",usage:"midnight genesis-address [--network <name>]",flags:["--network <name> Network for address prefix (default: resolved)"],examples:["midnight genesis-address --network undeployed","midnight genesis-address --network preprod"],jsonFields:{address:"Genesis wallet address (bech32m)",network:"Network name"}},{name:"inspect-cost",description:"Display current block limits derived from LedgerParameters",usage:"midnight inspect-cost",examples:["midnight inspect-cost"],jsonFields:{readTime:"Read time limit (picoseconds)",computeTime:"Compute time limit (picoseconds)",blockUsage:"Block usage limit (bytes)",bytesWritten:"Bytes written limit (bytes)",bytesChurned:"Bytes churned limit (bytes)"}},{name:"airdrop",description:"Fund your wallet from the genesis wallet (undeployed network only)",usage:"midnight airdrop <amount> [--wallet <file>]",flags:["<amount> Amount in NIGHT to airdrop","--wallet <file> Custom wallet file path"],examples:["midnight airdrop 1000","midnight airdrop 0.5 --wallet my-wallet.json"],jsonFields:{txHash:"Transaction hash",amount:"Amount airdropped (NIGHT string)",recipient:"Recipient address (bech32m)",network:"Network name"}},{name:"transfer",description:"Send NIGHT tokens to another address",usage:"midnight transfer <to> <amount> [--wallet <file>]",flags:["<to> Recipient bech32m address","<amount> Amount in NIGHT to send","--wallet <file> Custom wallet file path"],examples:["midnight transfer mn_addr_undeployed1... 100","midnight transfer mn_addr_preprod1... 50 --wallet my-wallet.json"],jsonFields:{txHash:"Transaction hash",amount:"Amount transferred (NIGHT string)",recipient:"Recipient address (bech32m)",network:"Network name"}},{name:"dust",description:"Register UTXOs for dust (fee token) generation or check status",usage:"midnight dust <register|status> [--wallet <file>]",flags:["register Register NIGHT UTXOs for dust generation","status Check dust registration status and balance","--wallet <file> Custom wallet file path"],examples:["midnight dust register","midnight dust status"],jsonFields:{subcommand:"register or status",dustBalance:"Dust balance (raw bigint string)",registered:"Number of registered UTXOs (status only)",unregistered:"Number of unregistered UTXOs (status only)",nightBalance:"NIGHT balance (raw bigint string, status only)",dustAvailable:"Whether dust tokens are available (status only)",txHash:"Registration transaction hash (register only, if submitted)"}},{name:"config",description:"Manage persistent config (default network, etc.)",usage:"midnight config <get|set> <key> [value]",flags:["get <key> Read a config value","set <key> <value> Write a config value"],examples:["midnight config get network","midnight config set network preprod"],jsonFields:{action:"get or set",key:"Config key name",value:"Config value"}},{name:"localnet",description:"Manage a local Midnight network via Docker Compose",usage:"midnight localnet <up|stop|down|status|logs|clean>",flags:["up Start the local network (node, indexer, proof server)","stop Stop containers (preserves state for fast restart)","down Remove containers, networks, and volumes (full teardown)","status Show service status and ports","logs Stream service logs (Ctrl+C to stop)","clean Remove conflicting containers from other setups"],examples:["midnight localnet up","midnight localnet stop","midnight localnet status","midnight localnet down","midnight localnet clean"],jsonFields:{subcommand:"up, stop, down, status, or clean",services:"Array of { name, state, port, health? } (up/status only)",status:"Operation result message (stop/down/clean)",removed:"Array of removed container names (clean only)"}},{name:"help",description:"Show usage for all commands or a specific command",usage:"midnight help [command]",examples:["midnight help","midnight help balance"],jsonFields:{cli:"CLI metadata (name, version, description)",globalFlags:"Array of global flag descriptions",commands:"Array of command specs with jsonFields"}}]});N();$1();k0();if(process.argv.includes("--mcp"))await Promise.resolve().then(() => (J2(),v$));else{let Y=function(){q.abort(),setTimeout(()=>process.exit(130),5000).unref()},$=o1(),Z=P($,"json");if(P($,"version")||P($,"v"))process.stdout.write(Q0+`
416
- `),process.exit(0);if(P($,"help")||P($,"h"))$.command="help";let Q=$.command??"help",X;if(Z)X=G3();let q=new AbortController,{signal:z}=q;process.on("SIGINT",Y),process.on("SIGTERM",Y);async function K(){switch(Q){case"help":{let{default:U}=await Promise.resolve().then(() => (F2(),j2));return U($)}case"generate":{let{default:U}=await Promise.resolve().then(() => (G1(),K1));return U($)}case"info":{let{default:U}=await Promise.resolve().then(() => (B1(),U1));return U($)}case"balance":{let{default:U}=await Promise.resolve().then(() => (V1(),W1));return U($)}case"address":{let{default:U}=await Promise.resolve().then(() => (j1(),H1));return U($)}case"genesis-address":{let{default:U}=await Promise.resolve().then(() => (P1(),F1));return U($)}case"inspect-cost":{let{default:U}=await Promise.resolve().then(() => (L1(),O1));return U($)}case"config":{let{default:U}=await Promise.resolve().then(() => (w1(),b1));return U($)}case"airdrop":{let{default:U}=await Promise.resolve().then(() => (x1(),R1));return U($,z)}case"transfer":{let{default:U}=await Promise.resolve().then(() => (N1(),E1));return U($,z)}case"dust":{let{default:U}=await Promise.resolve().then(() => (k1(),v1));return U($,z)}case"localnet":{let{default:U}=await Promise.resolve().then(() => (u1(),p1));return U($)}default:throw new Error(`Unknown command: "${Q}"
417
- Run "midnight help" to see available commands.`)}}let G=new Set(["airdrop","transfer","dust"]);K().then(()=>{if(G.has(Q))process.exit(0)}).catch((U)=>{if(Z){X?.();let{exitCode:W,errorCode:J}=O0(U);U3(U,J,W),process.exit(W)}else{process.stderr.write(`
418
- `+K3(U.message,'Run "midnight help" for usage information.')+`
419
+ `;process.stdout.write($)}async function _2($){if(O($,"agent")){d$();return}if(O($,"json")){g$();return}let Z=$.subcommand;if(Z){let X=R0.find((q)=>q.name===Z);if(!X)throw new Error(`Unknown command: "${Z}"
420
+ Available commands: ${R0.map((q)=>q.name).join(", ")}`);m$(X);return}if(!process.stderr.isTTY){c$();return}let Q=u$();await T2(void 0,Q)}var R0;var y2=L(()=>{N();M2();a1();k0();R0=[{name:"generate",description:"Generate a new wallet (random mnemonic, or restore from seed/mnemonic)",usage:'midnight generate [--network <name>] [--seed <hex>] [--mnemonic "..."] [--output <file>] [--force]',flags:["--network <name> Network: preprod, preview, undeployed","--seed <hex> Restore from existing seed (64-char hex)",'--mnemonic "..." Restore from BIP-39 mnemonic (24 words)',"--output <file> Custom output path (default: ~/.midnight/wallet.json)","--force Overwrite existing wallet file"],examples:["midnight generate --network preprod","midnight generate --network preprod --output my-wallet.json","midnight generate --seed 0123456789abcdef..."],jsonFields:{address:"Generated wallet address (bech32m)",network:"Network name",seed:"Hex-encoded 32-byte seed",mnemonic:"BIP-39 mnemonic (24 words, only if generated or provided)",file:"Path where wallet file was saved",createdAt:"ISO 8601 creation timestamp"}},{name:"info",description:"Display wallet address, network, creation date (no secrets shown)",usage:"midnight info [--wallet <file>]",flags:["--wallet <file> Custom wallet file path"],examples:["midnight info","midnight info --wallet my-wallet.json"],jsonFields:{address:"Wallet address (bech32m)",network:"Network name",createdAt:"ISO 8601 creation timestamp",file:"Wallet file path"}},{name:"balance",description:"Check unshielded balance via GraphQL subscription",usage:"midnight balance [address] [--network <name>] [--indexer-ws <url>]",flags:["<address> Address to check (or reads from wallet file)","--network <name> Override network detection","--indexer-ws <url> Custom indexer WebSocket URL"],examples:["midnight balance","midnight balance mn_addr_preprod1...","midnight balance --network preprod"],jsonFields:{address:"Checked address (bech32m)",network:"Network name",balances:"Object mapping token type to balance string",utxoCount:"Number of UTXOs",txCount:"Number of transactions synced"}},{name:"address",description:"Derive and display an unshielded address from a seed",usage:"midnight address --seed <hex> [--network <name>] [--index <n>]",flags:["--seed <hex> Seed to derive from (required, 64-char hex)","--network <name> Network for address prefix (default: resolved)","--index <n> Key derivation index (default: 0)"],examples:["midnight address --seed 0123456789abcdef... --network preprod","midnight address --seed 0123456789abcdef... --index 1"],jsonFields:{address:"Derived address (bech32m)",network:"Network name",index:"Key derivation index",path:"BIP-44 derivation path"}},{name:"genesis-address",description:"Display the genesis wallet address (seed 0x01) for a network",usage:"midnight genesis-address [--network <name>]",flags:["--network <name> Network for address prefix (default: resolved)"],examples:["midnight genesis-address --network undeployed","midnight genesis-address --network preprod"],jsonFields:{address:"Genesis wallet address (bech32m)",network:"Network name"}},{name:"inspect-cost",description:"Display current block limits derived from LedgerParameters",usage:"midnight inspect-cost",examples:["midnight inspect-cost"],jsonFields:{readTime:"Read time limit (picoseconds)",computeTime:"Compute time limit (picoseconds)",blockUsage:"Block usage limit (bytes)",bytesWritten:"Bytes written limit (bytes)",bytesChurned:"Bytes churned limit (bytes)"}},{name:"airdrop",description:"Fund your wallet from the genesis wallet (undeployed network only)",usage:"midnight airdrop <amount> [--wallet <file>]",flags:["<amount> Amount in NIGHT to airdrop","--wallet <file> Custom wallet file path"],examples:["midnight airdrop 1000","midnight airdrop 0.5 --wallet my-wallet.json"],jsonFields:{txHash:"Transaction hash",amount:"Amount airdropped (NIGHT string)",recipient:"Recipient address (bech32m)",network:"Network name"}},{name:"transfer",description:"Send NIGHT tokens to another address",usage:"midnight transfer <to> <amount> [--wallet <file>]",flags:["<to> Recipient bech32m address","<amount> Amount in NIGHT to send","--wallet <file> Custom wallet file path"],examples:["midnight transfer mn_addr_undeployed1... 100","midnight transfer mn_addr_preprod1... 50 --wallet my-wallet.json"],jsonFields:{txHash:"Transaction hash",amount:"Amount transferred (NIGHT string)",recipient:"Recipient address (bech32m)",network:"Network name"}},{name:"dust",description:"Register UTXOs for dust (fee token) generation or check status",usage:"midnight dust <register|status> [--wallet <file>]",flags:["register Register NIGHT UTXOs for dust generation","status Check dust registration status and balance","--wallet <file> Custom wallet file path"],examples:["midnight dust register","midnight dust status"],jsonFields:{subcommand:"register or status",dustBalance:"Dust balance (raw bigint string)",registered:"Number of registered UTXOs (status only)",unregistered:"Number of unregistered UTXOs (status only)",nightBalance:"NIGHT balance (raw bigint string, status only)",dustAvailable:"Whether dust tokens are available (status only)",txHash:"Registration transaction hash (register only, if submitted)"}},{name:"config",description:"Manage persistent config (default network, etc.)",usage:"midnight config <get|set> <key> [value]",flags:["get <key> Read a config value","set <key> <value> Write a config value"],examples:["midnight config get network","midnight config set network preprod"],jsonFields:{action:"get or set",key:"Config key name",value:"Config value"}},{name:"localnet",description:"Manage a local Midnight network via Docker Compose",usage:"midnight localnet <up|stop|down|status|logs|clean>",flags:["up Start the local network (node, indexer, proof server)","stop Stop containers (preserves state for fast restart)","down Remove containers, networks, and volumes (full teardown)","status Show service status and ports","logs Stream service logs (Ctrl+C to stop)","clean Remove conflicting containers from other setups"],examples:["midnight localnet up","midnight localnet stop","midnight localnet status","midnight localnet down","midnight localnet clean"],jsonFields:{subcommand:"up, stop, down, status, or clean",services:"Array of { name, state, port, health? } (up/status only)",status:"Operation result message (stop/down/clean)",removed:"Array of removed container names (clean only)"}},{name:"help",description:"Show usage for all commands or a specific command",usage:"midnight help [command]",examples:["midnight help","midnight help balance"],jsonFields:{cli:"CLI metadata (name, version, description)",globalFlags:"Array of global flag descriptions",commands:"Array of command specs with jsonFields"}}]});N();q1();k0();if(process.argv.includes("--mcp"))await Promise.resolve().then(() => (j2(),p$));else{let Y=function(){q.abort(),setTimeout(()=>process.exit(130),5000).unref()},$=e1(),Z=O($,"json");if(O($,"version")||O($,"v"))process.stdout.write(e+`
421
+ `),process.exit(0);if(O($,"help")||O($,"h"))$.command="help";let Q=$.command??"help",X;if(Z)X=F3();let q=new AbortController,{signal:z}=q;process.on("SIGINT",Y),process.on("SIGTERM",Y);async function K(){switch(Q){case"help":{let{default:J}=await Promise.resolve().then(() => (y2(),I2));return J($)}case"generate":{let{default:J}=await Promise.resolve().then(() => (H1(),V1));return J($)}case"info":{let{default:J}=await Promise.resolve().then(() => (j1(),B1));return J($)}case"balance":{let{default:J}=await Promise.resolve().then(() => (P1(),F1));return J($)}case"address":{let{default:J}=await Promise.resolve().then(() => (L1(),O1));return J($)}case"genesis-address":{let{default:J}=await Promise.resolve().then(() => (M1(),T1));return J($)}case"inspect-cost":{let{default:J}=await Promise.resolve().then(() => (I1(),_1));return J($)}case"config":{let{default:J}=await Promise.resolve().then(() => (u1(),p1));return J($)}case"airdrop":{let{default:J}=await Promise.resolve().then(() => (b1(),C1));return J($,z)}case"transfer":{let{default:J}=await Promise.resolve().then(() => (S1(),k1));return J($,z)}case"dust":{let{default:J}=await Promise.resolve().then(() => (h1(),f1));return J($,z)}case"localnet":{let{default:J}=await Promise.resolve().then(() => (i1(),l1));return J($)}default:throw new Error(`Unknown command: "${Q}"
422
+ Run "midnight help" to see available commands.`)}}let W=new Set(["airdrop","transfer","dust"]);K().then(()=>{if(W.has(Q))process.exit(0)}).catch((J)=>{if(Z){X?.();let{exitCode:G,errorCode:U}=T0(J);P3(J,U,G),process.exit(G)}else{process.stderr.write(`
423
+ `+j3(J.message,'Run "midnight help" for usage information.')+`
419
424
 
420
- `);let{exitCode:W}=O0(U);process.exit(W)}})}
425
+ `);let{exitCode:G}=T0(J);process.exit(G)}})}