@dfinity/hardware-wallet-cli 0.6.0-next-2025-11-26 → 0.6.0-next-2025-11-28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,12 +21,7 @@ A CLI to interact with the Internet Computer App on Ledger Nano S/X devices.
21
21
  - If you don't have mise install, you can install it with `curl https://mise.run | sh`
22
22
  - Install dependencies with `npm install`.
23
23
 
24
- To execute a command, you can use `npm run execute -- <args>`.
25
-
26
- For example
27
-
28
- - The command `ic-hardware-wallet --network https://nnsdapp.dfinity.network icp balance`.
29
- - Would be `npm run execute -- --network http://127.0.0.1:4943 icp balance` for development.
24
+ To execute a command, you can use `just run <args>`. Example: `just run --help`
30
25
 
31
26
  ## USB connection issues with Ledger Live
32
27
 
package/dist/index.js CHANGED
@@ -100,7 +100,7 @@ Error: ${a}`}}static async _fetchPublicKeyFromDevice(r,a){let n=await r.getAddre
100
100
  Code: ${n.returnCode}
101
101
  Message: ${JSON.stringify(n.errorMessage)}
102
102
  `);if(i?.byteLength!==64)throw new Error(`Signature must be 64 bytes long (is ${i.length})`);return $F(i)})}flagUpcomingStakeNeuron(){this._neuronStakeFlag=!0}async transformRequest(r){let{body:a,...n}=r,i=await this.sign(LF(a));return{...n,body:{content:a,sender_pubkey:this._publicKey.toDer(),sender_sig:i}}}async _executeWithApp(r){let[a,n]=await e._connect();try{let i=await e._fetchPublicKeyFromDevice(a,this.derivePath);if(JSON.stringify(i)!==JSON.stringify(this._publicKey))throw new Error("Found unexpected public key. Are you sure you're using the right wallet?");return await r(a)}finally{n.close()}}};function $F(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}var Yp=vt(Ze());var D6=vt(F6()),gn="2.2.1",Uv="2.4.3",Mv=1e4,k6=[D6.SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE,D6.SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL];var qv=vt(c1()),Lv=vt(xs()),Gn=async({identity:e,minVersion:t})=>{if(!(e instanceof Uo))return;let{major:r,minor:a,patch:n}=await e.getVersion(),i=`${r}.${a}.${n}`;if((0,Yp.smallerVersion)({currentVersion:i,minVersion:t}))throw new Error(`Ledger app version ${i} is too old. Please update to ${t} or newer.`)},Xl=async({identity:e,version:t})=>{if(!(e instanceof Uo))return!1;let{major:r,minor:a,patch:n}=await e.getVersion(),i=`${r}.${a}.${n}`;return(0,Yp.smallerVersion)({currentVersion:i,minVersion:t})},ks=async e=>Xl({identity:e,version:Uv}),$v=e=>e.fullNeuron!==void 0?e.fullNeuron.cachedNeuronStake+e.fullNeuron.maturityE8sEquivalent>BigInt(Mv):!1;async function jv(e){if(e<0||e>255)throw new qv.InvalidArgumentError("Principal path must be between 0 and 255 inclusive.");return Uo.create(`m/44'/223'/0'/0/${e}`)}async function Hv(e,t){let r=new URL(t).host!="ic0.app",a=new Lv.HttpAgent({host:t,identity:e});return r&&await a.fetchRootKey(),a}var lk=e=>e.reduce((t,r)=>`${t}${r.toString(16).padStart(2,"0")}`,""),Gv=e=>lk(Array.from(e)),uk=e=>{let t=[];for(let r=0;r<e.length;r+=2){let a=e.substring(r,r+2),n=parseInt(a,16);t.push(n)}return t},zv=e=>({id:(0,Yp.arrayOfNumberToUint8Array)(uk(e))}),Wv=()=>BigInt(Date.now())*BigInt(1e6);var Xv=vt(Yl()),Zl=vt(Ze());function fr(e){let t=parseInt(e,10);if(isNaN(t))throw new Ya.InvalidArgumentError("Not a number.");return t}function Zv(e){let t=parseInt(e,10);if(isNaN(t))throw new Ya.InvalidArgumentError("Not a number.");if(t<0||t>100)throw new Ya.InvalidArgumentError("Not a percentage. Try a number between 0 and 100.");return t}function Jv(e){if(!["true","false"].includes(e))throw new Ya.InvalidArgumentError("Not a boolean. Try 'true' or 'false'.");return e!=="false"}function Pt(e){try{return BigInt(e)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not a bigint.")}}function Br(e){try{return Yv.Principal.fromText(e)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not a principal.")}}function ss(e){try{return zv(e)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not an SNS neuron id.")}}function Jl(e){try{return Zl.TokenAmountV2.fromUlps({amount:Pt(e),token:Zl.ICPToken})}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not an E8s amount.")}}function U6(e){try{return Kv.AccountIdentifier.fromHex(e)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not an account id.")}}function M6(e){try{return(0,Xv.decodeIcrcAccount)(e)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not an ICRC account.")}}function Qv(e){try{return e.split(",").map(Pt)}catch(t){throw new Ya.InvalidArgumentError(t?.toString()??"Not a list of bigints.")}}var Aw=vt(Yt());var zo=vt(xs()),gi=vt(F6()),uu=vt(Ze()),Go=vt(Yl()),Wn=vt(Cy()),vi=vt(Rs()),YH=vt(Iw()),E4=vt(x6());global.fetch=E4.default;window.fetch=E4.default;var lu=new Ve.Command,Kn=console.log,mu=60,Pw=60*mu,fu=24*Pw,x4=365*fu+6*Pw,N4=Aw.Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai");async function et(){let e=fr(lu.opts().principal);return jv(e)}async function Qe(e){let t=lu.opts().network;return Hv(e,t)}async function WU(e){let t=await et(),a=await gi.SnsGovernanceCanister.create({agent:await Qe(new zo.AnonymousIdentity),canisterId:e}).listNeurons({certified:!0,principal:t.getPrincipal()});a.length>0?a.forEach(n=>{let i=(0,uu.fromNullable)(n.id);Kn(i!==void 0?`Neuron ID: ${Gv(Uint8Array.from(i.id))}`:"Neuron ID: N/A")}):at("No neurons found.")}async function KU({neuronId:e,principal:t,canisterId:r}){let a=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(a),canisterId:r}).addNeuronPermissions({neuronId:e,principal:t,permissions:k6}),at()}async function YU({neuronId:e,principal:t,canisterId:r}){let a=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(a),canisterId:r}).removeNeuronPermissions({neuronId:e,principal:t,permissions:k6}),at()}async function XU({neuronId:e,canisterId:t}){let r=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(r),canisterId:t}).startDissolving(e),at()}async function ZU({neuronId:e,canisterId:t}){let r=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(r),canisterId:t}).stopDissolving(e),at()}async function JU({neuronId:e,canisterId:t,amount:r,to:a}){let n=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(n),canisterId:t}).disburse({neuronId:e,amount:r?.toE8s(),toAccount:a}),at()}async function QU({neuronId:e,canisterId:t,years:r,days:a,minutes:n,seconds:i}){let s=await et(),o=gi.SnsGovernanceCanister.create({agent:await Qe(s),canisterId:t}),d=r*x4+a*fu+n*mu+i;await o.setDissolveTimestamp({neuronId:e,dissolveTimestampSeconds:BigInt(Math.floor(Date.now()/1e3)+d)}),at()}async function eM({neuronId:e,canisterId:t,percentageToStake:r}){let a=await et();await gi.SnsGovernanceCanister.create({agent:await Qe(a),canisterId:t}).stakeMaturity({neuronId:e,percentageToStake:r}),at()}async function tM(e=N4){let r={owner:(await et()).getPrincipal()},n=await Go.IcrcLedgerCanister.create({agent:await Qe(new zo.AnonymousIdentity),canisterId:e??N4}).balance(r);at(`Account ${(0,Go.encodeIcrcAccount)(r)} has balance ${n} e8s`)}async function rM(){let r=(await(await et()).getSupportedTokens()).map(a=>`Token Symbol: ${a.tokenSymbol}, Canister Id: ${a.canisterId}, Decimals: ${a.decimals}`);at(`Supported ledgers: ${r.join(`
103
- `)}`)}async function aM({canisterId:e=N4,amount:t,to:r}){let a=await et(),n=Go.IcrcLedgerCanister.create({agent:await Qe(a),canisterId:e}),s=await Go.IcrcLedgerCanister.create({agent:await Qe(new zo.AnonymousIdentity),canisterId:e}).transactionFee({});await n.transfer({to:{owner:r.owner,subaccount:(0,uu.toNullable)(r.subaccount)},amount:t,fee:s,created_at_time:Wv()}),at()}async function nM(){let e=await et(),t=vi.AccountIdentifier.fromPrincipal({principal:e.getPrincipal()}),a=await vi.LedgerCanister.create({agent:await Qe(new zo.AnonymousIdentity)}).accountBalance({accountIdentifier:t});at(`Account ${t.toHex()} has balance ${a} e8s`)}async function iM(e,t){let r=await et(),n=await vi.LedgerCanister.create({agent:await Qe(r)}).transfer({to:e,amount:t.toE8s(),memo:BigInt(0)});at(`Transaction completed at block height ${n}.`)}async function sM(e){let t=await et(),r=vi.AccountIdentifier.fromPrincipal({principal:t.getPrincipal()}),a=t.getPublicKey();Kn(Wn.default.bold("Principal: ")+t.getPrincipal()),Kn(Wn.default.bold(`Address (${t.derivePath}): `)+r.toHex()),Kn(Wn.default.bold("Public key: ")+a.toHex()),e&&(Kn("Displaying the principal and the address on the device..."),await t.showAddressAndPubKeyOnDevice())}async function oM(e){let t=await et(),r=vi.LedgerCanister.create({agent:await Qe(t)}),a=ot.GovernanceCanister.create({agent:await Qe(new zo.AnonymousIdentity),hardwareWallet:await ks(t)});t.flagUpcomingStakeNeuron();try{let n=await a.stakeNeuron({stake:e.toE8s(),principal:t.getPrincipal(),ledgerCanister:r});at(`Staked neuron with ID: ${n}`)}catch(n){n instanceof ot.InsufficientAmountError?O4(`Cannot stake less than ${n.minimumAmount} e8s`):n instanceof vi.InsufficientFundsError?O4(`Your account has insufficient funds (${n.balance} e8s)`):console.log(n)}}async function dM(e,t,r,a,n){let i=await et(),s=ot.GovernanceCanister.create({agent:await Qe(i)}),o=t*x4+r*fu+a*mu+n;await s.increaseDissolveDelay({neuronId:e,additionalDissolveDelaySeconds:o}),at()}async function pM(e,t,r,a,n){let i=await et();await Gn({identity:i,minVersion:gn});let s=ot.GovernanceCanister.create({agent:await Qe(i)}),o=t*x4+r*fu+a*mu+n;await s.setDissolveDelay({neuronId:e,dissolveDelaySeconds:Math.floor(Date.now()/1e3)+o}),at()}async function cM(e,t,r){let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a),hardwareWallet:await ks(a)}).disburse({neuronId:BigInt(e),toAccountId:t,amount:r}),at()}async function lM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).splitNeuron({neuronId:BigInt(e),amount:t}),at()}async function uM(e,t,r){let a=await et();r!==void 0&&await Gn({identity:a,minVersion:gn});let i=await ot.GovernanceCanister.create({agent:await Qe(a),hardwareWallet:r===void 0&&await Xl({identity:a,version:gn})}).spawnNeuron({neuronId:BigInt(e),newController:t,percentageToSpawn:r});at(`Spawned neuron with ID ${i}`)}async function mM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).stakeMaturity({neuronId:BigInt(e),percentageToStake:t}),at()}async function fM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).autoStakeMaturity({neuronId:BigInt(e),autoStake:t}),at()}async function _M(e){let t=await et();await ot.GovernanceCanister.create({agent:await Qe(t)}).startDissolving(e),at()}async function hM(e){let t=await et();await ot.GovernanceCanister.create({agent:await Qe(t)}).stopDissolving(e),at()}async function gM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await ks(t)}).joinCommunityFund(e),at()}async function vM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await ks(t)}).leaveCommunityFund(e),at()}async function yM(e,t){let r=await et();await ot.GovernanceCanister.create({agent:await Qe(r),hardwareWallet:await ks(r)}).addHotkey({neuronId:BigInt(e),principal:t}),at()}async function wM(e,t){let r=await et();await ot.GovernanceCanister.create({agent:await Qe(r),hardwareWallet:await ks(r)}).removeHotkey({neuronId:BigInt(e),principal:t}),at()}async function bM(e=!1){let t=await et(),a=await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await Xl({identity:t,version:"2.0.0"})}).listNeurons({certified:!0});a.length>0?a.filter(n=>e||$v(n)).forEach(n=>{Kn(`Neuron ID: ${n.neuronId}`)}):at("No neurons found.")}async function NM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).mergeNeurons({targetNeuronId:t,sourceNeuronId:e}),at()}async function OM(e,t,r){if(!Object.values(ot.Vote).includes(r))throw new Error(`Invalid vote value. Valid values are: ${Object.values(ot.Vote).join(", ")}`);let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a)}).registerVote({proposalId:t,neuronId:e,vote:r}),at()}async function EM(e,t,r){if(!Object.values(ot.Topic).includes(t))throw new Error(`Invalid topic value. Valid values are: ${Object.values(ot.Topic).join(", ")}`);let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a)}).setFollowees({neuronId:e,topic:t,followees:r}),at()}async function xM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t)}).setNodeProviderAccount(e.toHex()),at()}async function RM(){let e=await et(),r=e.getPublicKey().toHex(),n=await(await ot.GenesisTokenCanister.create({agent:await Qe(e)})).claimNeurons({hexPubKey:r});at(`Successfully claimed the following neurons: ${n}`)}async function Je(e){try{await e()}catch(t){O4(t)}}function at(e){Kn(e?`${Wn.default.green(Wn.default.bold("OK"))}: ${e}`:`${Wn.default.green(Wn.default.bold("OK"))}`)}function O4(e){let t=e instanceof ot.GovernanceError?e.detail.error_message:e instanceof Error?e.message:e;Kn(`${Wn.default.bold(Wn.default.red("Error:"))} ${t}`)}async function SM(){let e=new Ve.Command("icrc").description("Commands for managing ICRC ledger.").addCommand(new Ve.Command("balance").description("Get the balance of the main account on the ICRC wallet.").option("--canister-id <canister-id>","Canister ID (defaults to ICP Ledger)",Br).action(s=>Je(()=>tM(s.canisterId)))).addCommand(new Ve.Command("supported-tokens").description("Get supported tokens of the ledger device.").action(s=>Je(rM))).addCommand(new Ve.Command("transfer").description("Send tokens from the ICRC wallet to another account.").option("--canister-id <canister-id>","Canister ID (defaults to ICP Ledger)",Br).requiredOption("--to <account-identifier>","ICRC Account",M6).requiredOption("--amount <amount>","Amount to transfer in e8s",Pt).action(({to:s,amount:o,canisterId:d})=>{Je(()=>aM({to:s,amount:o,canisterId:d}))})),t=new Ve.Command("neuron").description("Commands for managing sns neurons.").addCommand(new Ve.Command("list").requiredOption("--canister-id <canister-id>","Canister ID",Br).action(s=>Je(()=>WU(s.canisterId)))).addCommand(new Ve.Command("add-hotkey").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--principal <principal>","Principal",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,principal:o,neuronId:d})=>Je(()=>KU({canisterId:s,principal:o,neuronId:d})))).addCommand(new Ve.Command("remove-hotkey").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--principal <principal>","Principal",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,principal:o,neuronId:d})=>Je(()=>YU({canisterId:s,principal:o,neuronId:d})))).addCommand(new Ve.Command("start-dissolving").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,neuronId:o})=>Je(()=>XU({canisterId:s,neuronId:o})))).addCommand(new Ve.Command("stop-dissolving").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,neuronId:o})=>Je(()=>ZU({canisterId:s,neuronId:o})))).addCommand(new Ve.Command("stake-maturity").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--percentage <percentage>","Percentage of the maturity to stake (defaults to 100)",Zv).action(({canisterId:s,neuronId:o,percentage:d})=>Je(()=>eM({canisterId:s,neuronId:o,percentageToStake:d})))).addCommand(new Ve.Command("disburse").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--to <account-identifier>","ICRC Account (defaults to controller's main account)",M6).option("--amount <amount>","Amount to disburse in e8s (empty to disburse all)",Jl).action(({neuronId:s,to:o,amount:d,canisterId:p})=>{Je(()=>JU({neuronId:s,to:o,amount:d,canisterId:p}))})).addCommand(new Ve.Command("set-dissolve-delay").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>QU({canisterId:s.canisterId,neuronId:s.neuronId,years:s.years||0,days:s.days||0,minutes:s.minutes||0,seconds:s.seconds||0})))),r=new Ve.Command("sns").description("Commands for managing SNS.").addCommand(t),a=new Ve.Command("neuron").description("Commands for managing neurons.").showSuggestionAfterError().addCommand(new Ve.Command("stake").requiredOption("--amount <amount>","Amount to stake in e8s.",Jl).action(s=>Je(()=>oM(s.amount)))).addCommand(new Ve.Command("increase-dissolve-delay").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>dM(s.neuronId,s.years||0,s.days||0,s.minutes||0,s.seconds||0)))).addCommand(new Ve.Command("set-dissolve-delay").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>pM(s.neuronId,s.years||0,s.days||0,s.minutes||0,s.seconds||0)))).addCommand(new Ve.Command("disburse").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--to <account-identifier>").option("--amount <amount>","Amount to disburse in e8s (empty to disburse all)",Pt).action(s=>{Je(()=>cM(s.neuronId,s.to,s.amount))})).addCommand(new Ve.Command("split").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--amount <amount>","Amount split into a new neuron in e8s",Pt).action(s=>{Je(()=>lM(s.neuronId,s.amount))})).addCommand(new Ve.Command("spawn").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--controller <new-controller>","Controller",Br).option("--percentage-to-spawn <percentage>","Percentage of maturity to spawn",fr).action(s=>{Je(()=>uM(s.neuronId,s.controller,s.percentageToSpawn))})).addCommand(new Ve.Command("stake-maturity").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--percentage-to-stake <percentage>","Percentage of maturity to stake",fr).action(s=>{Je(()=>mM(s.neuronId,s.percentageToStake))})).addCommand(new Ve.Command("enable-auto-stake-maturity").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--enable-auto-stake <enable>","Should auto stake maturity be enabled",Jv).action(s=>{Je(()=>fM(s.neuronId,s.enableAutoStake))})).addCommand(new Ve.Command("start-dissolving").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>_M(s.neuronId))})).addCommand(new Ve.Command("stop-dissolving").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>hM(s.neuronId))})).addCommand(new Ve.Command("join-community-fund").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>gM(s.neuronId))})).addCommand(new Ve.Command("leave-community-fund").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>vM(s.neuronId))})).addCommand(new Ve.Command("list").option("--show-zero-stake","Show neurons with zero stake and maturity").action(s=>Je(()=>bM(s.showZeroStake)))).addCommand(new Ve.Command("add-hotkey").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--principal <principal>","Principal",Br).action(s=>Je(()=>yM(s.neuronId,s.principal)))).addCommand(new Ve.Command("merge-neurons").requiredOption("--source-neuron-id <source-neuron-id>","Neuron ID",Pt).requiredOption("--target-neuron-id <target-neuron-id>","Neuron ID",Pt).action(s=>Je(()=>NM(s.sourceNeuronId,s.targetNeuronId)))).addCommand(new Ve.Command("register-vote").description("Vote on a specific proposal.").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--proposal-id <proposal-id>","Proposal ID",Pt).requiredOption("--vote <vote>","Vote (1 for YES, 2 for NO)",fr).action(s=>Je(()=>OM(s.neuronId,s.proposalId,s.vote)))).addCommand(new Ve.Command("set-followees").description("Set followees of a neuron in a specific topic. This will overwrite the existing followees for that topic.").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--topic-id <topic>","Topic ID",fr).requiredOption("--followees <followees>","Comma-separated Neuron IDs",Qv).action(s=>Je(()=>EM(s.neuronId,s.topicId,s.followees)))).addCommand(new Ve.Command("remove-hotkey").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--principal <principal>","Principal",Br).action(s=>Je(()=>wM(s.neuronId,s.principal)))).addCommand(new Ve.Command("claim").description("Claim the caller's GTC neurons.").action(s=>Je(()=>RM()))),n=new Ve.Command("icp").description("Commands for managing ICP.").showSuggestionAfterError().addCommand(new Ve.Command("balance").description("Fetch current balance.").action(()=>{Je(nM)})).addCommand(new Ve.Command("transfer").requiredOption("--to <account-identifier>","Account identifier to transfer to.",U6).requiredOption("--amount <amount>","Amount to transfer in e8s.",Jl).action(s=>Je(()=>iM(s.to,s.amount)))),i=new Ve.Command("node-provider").description("Commands for managing node providers.").showSuggestionAfterError().addCommand(new Ve.Command("set-node-provider-account").requiredOption("--account <account>","Account ID",U6).action(s=>Je(()=>xM(s.account))));lu.description("A CLI for the Ledger hardware wallet.").enablePositionalOptions().showSuggestionAfterError().addOption(new Ve.Option("--network <network>","The IC network to talk to.").default("https://ic0.app").env("IC_NETWORK")).addOption(new Ve.Option("--principal <principal>",`The derivation path to use for the principal.
103
+ `)}`)}async function aM({canisterId:e=N4,amount:t,to:r}){let a=await et(),n=Go.IcrcLedgerCanister.create({agent:await Qe(a),canisterId:e}),s=await Go.IcrcLedgerCanister.create({agent:await Qe(new zo.AnonymousIdentity),canisterId:e}).transactionFee({});await n.transfer({to:{owner:r.owner,subaccount:(0,uu.toNullable)(r.subaccount)},amount:t,fee:s,created_at_time:Wv()}),at()}async function nM(){let e=await et(),t=vi.AccountIdentifier.fromPrincipal({principal:e.getPrincipal()}),a=await vi.LedgerCanister.create({agent:await Qe(new zo.AnonymousIdentity)}).accountBalance({accountIdentifier:t});at(`Account ${t.toHex()} has balance ${a} e8s`)}async function iM(e,t){let r=await et(),n=await vi.LedgerCanister.create({agent:await Qe(r)}).transfer({to:e,amount:t.toE8s(),memo:BigInt(0)});at(`Transaction completed at block height ${n}.`)}async function sM(e){let t=await et(),r=vi.AccountIdentifier.fromPrincipal({principal:t.getPrincipal()}),a=t.getPublicKey();Kn(Wn.default.bold("Principal: ")+t.getPrincipal()),Kn(Wn.default.bold(`Address (${t.derivePath}): `)+r.toHex()),Kn(Wn.default.bold("Public key: ")+a.toHex()),e&&(Kn("Displaying the principal and the address on the device..."),await t.showAddressAndPubKeyOnDevice())}async function oM(e){let t=await et(),r=vi.LedgerCanister.create({agent:await Qe(t)}),a=ot.GovernanceCanister.create({agent:await Qe(new zo.AnonymousIdentity),hardwareWallet:await ks(t)});t.flagUpcomingStakeNeuron();try{let n=await a.stakeNeuron({stake:e.toE8s(),principal:t.getPrincipal(),ledgerCanister:r});at(`Staked neuron with ID: ${n}`)}catch(n){n instanceof ot.InsufficientAmountError?O4(`Cannot stake less than ${n.minimumAmount} e8s`):n instanceof vi.InsufficientFundsError?O4(`Your account has insufficient funds (${n.balance} e8s)`):console.log(n)}}async function dM(e,t,r,a,n){let i=await et(),s=ot.GovernanceCanister.create({agent:await Qe(i)}),o=t*x4+r*fu+a*mu+n;await s.increaseDissolveDelay({neuronId:e,additionalDissolveDelaySeconds:o}),at()}async function pM(e,t,r,a,n){let i=await et();await Gn({identity:i,minVersion:gn});let s=ot.GovernanceCanister.create({agent:await Qe(i)}),o=t*x4+r*fu+a*mu+n;await s.setDissolveDelay({neuronId:e,dissolveDelaySeconds:Math.floor(Date.now()/1e3)+o}),at()}async function cM(e,t,r){let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a),hardwareWallet:await ks(a)}).disburse({neuronId:BigInt(e),toAccountId:t,amount:r}),at()}async function lM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).splitNeuron({neuronId:BigInt(e),amount:t}),at()}async function uM(e,t,r){let a=await et();r!==void 0&&await Gn({identity:a,minVersion:gn});let i=await ot.GovernanceCanister.create({agent:await Qe(a),hardwareWallet:r===void 0&&await Xl({identity:a,version:gn})}).spawnNeuron({neuronId:BigInt(e),newController:t,percentageToSpawn:r});at(`Spawned neuron with ID ${i}`)}async function mM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).stakeMaturity({neuronId:BigInt(e),percentageToStake:t}),at()}async function fM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).autoStakeMaturity({neuronId:BigInt(e),autoStake:t}),at()}async function _M(e){let t=await et();await ot.GovernanceCanister.create({agent:await Qe(t)}).startDissolving(e),at()}async function hM(e){let t=await et();await ot.GovernanceCanister.create({agent:await Qe(t)}).stopDissolving(e),at()}async function gM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await ks(t)}).joinCommunityFund(e),at()}async function vM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await ks(t)}).leaveCommunityFund(e),at()}async function yM(e,t){let r=await et();await ot.GovernanceCanister.create({agent:await Qe(r),hardwareWallet:await ks(r)}).addHotkey({neuronId:BigInt(e),principal:t}),at()}async function wM(e,t){let r=await et();await ot.GovernanceCanister.create({agent:await Qe(r),hardwareWallet:await ks(r)}).removeHotkey({neuronId:BigInt(e),principal:t}),at()}async function bM(e=!1){let t=await et(),a=await ot.GovernanceCanister.create({agent:await Qe(t),hardwareWallet:await Xl({identity:t,version:"2.0.0"})}).listNeurons({certified:!0});a.length>0?a.filter(n=>e||$v(n)).forEach(n=>{Kn(`Neuron ID: ${n.neuronId}`)}):at("No neurons found.")}async function NM(e,t){let r=await et();await Gn({identity:r,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(r)}).mergeNeurons({targetNeuronId:t,sourceNeuronId:e}),at()}async function OM(e,t,r){if(!Object.values(ot.Vote).includes(r))throw new Error(`Invalid vote value. Valid values are: ${Object.values(ot.Vote).join(", ")}`);let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a)}).registerVote({proposalId:t,neuronId:e,vote:r}),at()}async function EM(e,t,r){if(!Object.values(ot.Topic).includes(t))throw new Error(`Invalid topic value. Valid values are: ${Object.values(ot.Topic).join(", ")}`);let a=await et();await ot.GovernanceCanister.create({agent:await Qe(a)}).setFollowees({neuronId:e,topic:t,followees:r}),at()}async function xM(e){let t=await et();await Gn({identity:t,minVersion:gn}),await ot.GovernanceCanister.create({agent:await Qe(t)}).setNodeProviderAccount(e.toHex()),at()}async function RM(){let e=await et(),r=e.getPublicKey().toHex(),n=await(await ot.GenesisTokenCanister.create({agent:await Qe(e)})).claimNeurons({hexPubKey:r});at(`Successfully claimed the following neurons: ${n}`)}async function Je(e){try{await e()}catch(t){O4(t)}}function at(e){Kn(e?`${Wn.default.green(Wn.default.bold("OK"))}: ${e}`:`${Wn.default.green(Wn.default.bold("OK"))}`)}function O4(e){let t=e instanceof ot.GovernanceError?e.detail.error_message:e instanceof Error?e.message:e;Kn(`${Wn.default.bold(Wn.default.red("Error:"))} ${t}`)}async function SM(){let e=new Ve.Command("icrc").description("Commands for managing ICRC ledger.").addCommand(new Ve.Command("balance").description("Get the balance of the main account on the ICRC wallet.").option("--canister-id <canister-id>","Canister ID (defaults to ICP Ledger)",Br).action(s=>Je(()=>tM(s.canisterId)))).addCommand(new Ve.Command("supported-tokens").description("Get supported tokens of the ledger device.").action(s=>Je(rM))).addCommand(new Ve.Command("transfer").description("Send tokens from the ICRC wallet to another account.").requiredOption("--canister-id <canister-id>","ICRC ledger Canister ID",Br).requiredOption("--to <account>","ICRC Account",M6).requiredOption("--amount <amount>","Amount to transfer in ledger's base unit",Pt).action(({to:s,amount:o,canisterId:d})=>{Je(()=>aM({to:s,amount:o,canisterId:d}))})),t=new Ve.Command("neuron").description("Commands for managing sns neurons.").addCommand(new Ve.Command("list").requiredOption("--canister-id <canister-id>","Canister ID",Br).action(s=>Je(()=>WU(s.canisterId)))).addCommand(new Ve.Command("add-hotkey").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--principal <principal>","Principal",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,principal:o,neuronId:d})=>Je(()=>KU({canisterId:s,principal:o,neuronId:d})))).addCommand(new Ve.Command("remove-hotkey").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--principal <principal>","Principal",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,principal:o,neuronId:d})=>Je(()=>YU({canisterId:s,principal:o,neuronId:d})))).addCommand(new Ve.Command("start-dissolving").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,neuronId:o})=>Je(()=>XU({canisterId:s,neuronId:o})))).addCommand(new Ve.Command("stop-dissolving").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).action(({canisterId:s,neuronId:o})=>Je(()=>ZU({canisterId:s,neuronId:o})))).addCommand(new Ve.Command("stake-maturity").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--percentage <percentage>","Percentage of the maturity to stake (defaults to 100)",Zv).action(({canisterId:s,neuronId:o,percentage:d})=>Je(()=>eM({canisterId:s,neuronId:o,percentageToStake:d})))).addCommand(new Ve.Command("disburse").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--to <account-identifier>","ICRC Account (defaults to controller's main account)",M6).option("--amount <amount>","Amount to disburse in e8s (empty to disburse all)",Jl).action(({neuronId:s,to:o,amount:d,canisterId:p})=>{Je(()=>JU({neuronId:s,to:o,amount:d,canisterId:p}))})).addCommand(new Ve.Command("set-dissolve-delay").requiredOption("--canister-id <canister-id>","Canister ID",Br).requiredOption("--neuron-id <neuron-id>","Neuron ID",ss).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>QU({canisterId:s.canisterId,neuronId:s.neuronId,years:s.years||0,days:s.days||0,minutes:s.minutes||0,seconds:s.seconds||0})))),r=new Ve.Command("sns").description("Commands for managing SNS.").addCommand(t),a=new Ve.Command("neuron").description("Commands for managing neurons.").showSuggestionAfterError().addCommand(new Ve.Command("stake").requiredOption("--amount <amount>","Amount to stake in e8s.",Jl).action(s=>Je(()=>oM(s.amount)))).addCommand(new Ve.Command("increase-dissolve-delay").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>dM(s.neuronId,s.years||0,s.days||0,s.minutes||0,s.seconds||0)))).addCommand(new Ve.Command("set-dissolve-delay").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--years <years>","Number of years",fr).option("--days <days>","Number of days",fr).option("--minutes <minutes>","Number of minutes",fr).option("--seconds <seconds>","Number of seconds",fr).action(s=>Je(()=>pM(s.neuronId,s.years||0,s.days||0,s.minutes||0,s.seconds||0)))).addCommand(new Ve.Command("disburse").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--to <account-identifier>").option("--amount <amount>","Amount to disburse in e8s (empty to disburse all)",Pt).action(s=>{Je(()=>cM(s.neuronId,s.to,s.amount))})).addCommand(new Ve.Command("split").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--amount <amount>","Amount split into a new neuron in e8s",Pt).action(s=>{Je(()=>lM(s.neuronId,s.amount))})).addCommand(new Ve.Command("spawn").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--controller <new-controller>","Controller",Br).option("--percentage-to-spawn <percentage>","Percentage of maturity to spawn",fr).action(s=>{Je(()=>uM(s.neuronId,s.controller,s.percentageToSpawn))})).addCommand(new Ve.Command("stake-maturity").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).option("--percentage-to-stake <percentage>","Percentage of maturity to stake",fr).action(s=>{Je(()=>mM(s.neuronId,s.percentageToStake))})).addCommand(new Ve.Command("enable-auto-stake-maturity").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--enable-auto-stake <enable>","Should auto stake maturity be enabled",Jv).action(s=>{Je(()=>fM(s.neuronId,s.enableAutoStake))})).addCommand(new Ve.Command("start-dissolving").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>_M(s.neuronId))})).addCommand(new Ve.Command("stop-dissolving").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>hM(s.neuronId))})).addCommand(new Ve.Command("join-community-fund").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>gM(s.neuronId))})).addCommand(new Ve.Command("leave-community-fund").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).action(s=>{Je(()=>vM(s.neuronId))})).addCommand(new Ve.Command("list").option("--show-zero-stake","Show neurons with zero stake and maturity").action(s=>Je(()=>bM(s.showZeroStake)))).addCommand(new Ve.Command("add-hotkey").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--principal <principal>","Principal",Br).action(s=>Je(()=>yM(s.neuronId,s.principal)))).addCommand(new Ve.Command("merge-neurons").requiredOption("--source-neuron-id <source-neuron-id>","Neuron ID",Pt).requiredOption("--target-neuron-id <target-neuron-id>","Neuron ID",Pt).action(s=>Je(()=>NM(s.sourceNeuronId,s.targetNeuronId)))).addCommand(new Ve.Command("register-vote").description("Vote on a specific proposal.").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--proposal-id <proposal-id>","Proposal ID",Pt).requiredOption("--vote <vote>","Vote (1 for YES, 2 for NO)",fr).action(s=>Je(()=>OM(s.neuronId,s.proposalId,s.vote)))).addCommand(new Ve.Command("set-followees").description("Set followees of a neuron in a specific topic. This will overwrite the existing followees for that topic.").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--topic-id <topic>","Topic ID",fr).requiredOption("--followees <followees>","Comma-separated Neuron IDs",Qv).action(s=>Je(()=>EM(s.neuronId,s.topicId,s.followees)))).addCommand(new Ve.Command("remove-hotkey").requiredOption("--neuron-id <neuron-id>","Neuron ID",Pt).requiredOption("--principal <principal>","Principal",Br).action(s=>Je(()=>wM(s.neuronId,s.principal)))).addCommand(new Ve.Command("claim").description("Claim the caller's GTC neurons.").action(s=>Je(()=>RM()))),n=new Ve.Command("icp").description("Commands for managing ICP.").showSuggestionAfterError().addCommand(new Ve.Command("balance").description("Fetch current balance.").action(()=>{Je(nM)})).addCommand(new Ve.Command("transfer").requiredOption("--to <account-identifier>","Account identifier to transfer to.",U6).requiredOption("--amount <amount>","Amount to transfer in e8s.",Jl).action(s=>Je(()=>iM(s.to,s.amount)))),i=new Ve.Command("node-provider").description("Commands for managing node providers.").showSuggestionAfterError().addCommand(new Ve.Command("set-node-provider-account").requiredOption("--account <account>","Account ID",U6).action(s=>Je(()=>xM(s.account))));lu.description("A CLI for the Ledger hardware wallet.").enablePositionalOptions().showSuggestionAfterError().addOption(new Ve.Option("--network <network>","The IC network to talk to.").default("https://ic0.app").env("IC_NETWORK")).addOption(new Ve.Option("--principal <principal>",`The derivation path to use for the principal.
104
104
  (e.g. --principal 123 will result in a derivation path of m/44'/223'/0'/0/123)
105
105
  Must be >= 0 && <= 255`).default(0)).addCommand(new Ve.Command("info").option("-n --no-show-on-device").description("Show the wallet's principal, address, and balance.").action(s=>{Je(()=>sM(s.showOnDevice))})).addCommand(n).addCommand(a).addCommand(r).addCommand(e).addCommand(i),await lu.parseAsync(process.argv)}SM();
106
106
  /*! Bundled license information:
package/package.json CHANGED
@@ -64,5 +64,5 @@
64
64
  "overrides": {
65
65
  "semver": "^7.5.3"
66
66
  },
67
- "version": "0.6.0-next-2025-11-26"
67
+ "version": "0.6.0-next-2025-11-28"
68
68
  }