midnight-wallet-cli 0.1.8 → 0.1.9

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