@helium/helium-admin-cli 0.11.17 → 0.11.18

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.
Files changed (33) hide show
  1. package/lib/cjs/close-council-fanout.js +142 -0
  2. package/lib/cjs/close-council-fanout.js.map +1 -0
  3. package/lib/cjs/create-council-fanout.js +25 -7
  4. package/lib/cjs/create-council-fanout.js.map +1 -1
  5. package/lib/cjs/mini-fanout-utils.js +57 -0
  6. package/lib/cjs/mini-fanout-utils.js.map +1 -0
  7. package/lib/cjs/reschedule-all-mini-fanouts.js +38 -14
  8. package/lib/cjs/reschedule-all-mini-fanouts.js.map +1 -1
  9. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  10. package/lib/cjs/update-council-fanout.js +177 -0
  11. package/lib/cjs/update-council-fanout.js.map +1 -0
  12. package/lib/cjs/update-data-credits.js +12 -12
  13. package/lib/esm/src/close-council-fanout.js +92 -0
  14. package/lib/esm/src/close-council-fanout.js.map +1 -0
  15. package/lib/esm/src/create-council-fanout.js +25 -7
  16. package/lib/esm/src/create-council-fanout.js.map +1 -1
  17. package/lib/esm/src/mini-fanout-utils.js +40 -0
  18. package/lib/esm/src/mini-fanout-utils.js.map +1 -0
  19. package/lib/esm/src/reschedule-all-mini-fanouts.js +39 -15
  20. package/lib/esm/src/reschedule-all-mini-fanouts.js.map +1 -1
  21. package/lib/esm/src/update-council-fanout.js +126 -0
  22. package/lib/esm/src/update-council-fanout.js.map +1 -0
  23. package/lib/esm/src/update-data-credits.js +18 -18
  24. package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
  25. package/lib/types/src/close-council-fanout.d.ts +2 -0
  26. package/lib/types/src/close-council-fanout.d.ts.map +1 -0
  27. package/lib/types/src/create-council-fanout.d.ts.map +1 -1
  28. package/lib/types/src/mini-fanout-utils.d.ts +25 -0
  29. package/lib/types/src/mini-fanout-utils.d.ts.map +1 -0
  30. package/lib/types/src/reschedule-all-mini-fanouts.d.ts.map +1 -1
  31. package/lib/types/src/update-council-fanout.d.ts +2 -0
  32. package/lib/types/src/update-council-fanout.d.ts.map +1 -0
  33. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-council-fanout.js","sourceRoot":"","sources":["../../src/update-council-fanout.ts"],"names":[],"mappings":"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"}
@@ -56,26 +56,26 @@ function run() {
56
56
  return __awaiter(this, arguments, void 0, function* (args = process.argv) {
57
57
  const yarg = (0, yargs_1.default)(args).options({
58
58
  wallet: {
59
- alias: 'k',
60
- describe: 'Anchor wallet keypair',
59
+ alias: "k",
60
+ describe: "Anchor wallet keypair",
61
61
  default: `${os_1.default.homedir()}/.config/solana/id.json`,
62
62
  },
63
63
  url: {
64
- alias: 'u',
65
- default: 'http://127.0.0.1:8899',
66
- describe: 'The solana url',
64
+ alias: "u",
65
+ default: "http://127.0.0.1:8899",
66
+ describe: "The solana url",
67
67
  },
68
68
  dcMint: {
69
69
  required: true,
70
- type: 'string',
71
- describe: 'Data credits mint address',
70
+ type: "string",
71
+ describe: "Data credits mint address",
72
72
  },
73
73
  newAuthority: {
74
- type: 'string',
74
+ type: "string",
75
75
  },
76
76
  multisig: {
77
- type: 'string',
78
- describe: 'Address of the squads multisig to be authority. If not provided, your wallet will be the authority',
77
+ type: "string",
78
+ describe: "Address of the squads multisig to be authority. If not provided, your wallet will be the authority",
79
79
  },
80
80
  });
81
81
  const argv = yield yarg.argv;
@@ -88,7 +88,7 @@ function run() {
88
88
  const instructions = [];
89
89
  const dataCredits = (0, data_credits_sdk_1.dataCreditsKey)(new web3_js_1.PublicKey(argv.dcMint))[0];
90
90
  const dataCreditsAcc = yield program.account.dataCreditsV0.fetch(dataCredits);
91
- console.log('Data Credits', dataCredits.toBase58());
91
+ console.log("Data Credits", dataCredits.toBase58());
92
92
  console.log(dataCreditsAcc.authority.toBase58());
93
93
  instructions.push(yield program.methods
94
94
  .updateDataCreditsV0({
@@ -111,6 +111,6 @@ function run() {
111
111
  });
112
112
  }
113
113
  function isNull(vehntDelegated) {
114
- return vehntDelegated === null || typeof vehntDelegated == 'undefined';
114
+ return vehntDelegated === null || typeof vehntDelegated == "undefined";
115
115
  }
116
116
  //# sourceMappingURL=update-data-credits.js.map
@@ -0,0 +1,92 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { init as initMfan } from "@helium/mini-fanout-sdk";
3
+ import { init as initTuktuk } from "@helium/tuktuk-sdk";
4
+ import { getAssociatedTokenAddressSync } from "@solana/spl-token";
5
+ import { PublicKey } from "@solana/web3.js";
6
+ import os from "os";
7
+ import yargs from "yargs/yargs";
8
+ import { resolveTaskRentRefund } from "./mini-fanout-utils";
9
+ import { loadKeypair, sendInstructionsOrSquadsV4 } from "./utils";
10
+ // HIP 149 Decision 4: permanently stop and reclaim the Advisory Council
11
+ // compensation fanout created by create-council-fanout.ts. Closing:
12
+ // - sweeps any HNT still sitting in the fanout's own token account to the
13
+ // owner's HNT ATA (creating it if needed);
14
+ // - dequeues whatever distribution task is currently scheduled;
15
+ // - closes the fanout account itself, refunding its rent to `rent_refund`
16
+ // (the address recorded at creation time — see the fanout's own
17
+ // `rentRefund` field, not necessarily the current owner).
18
+ //
19
+ // This is a one-way operation: there is no "un-close". If the intent is only
20
+ // to change members, the schedule, or pause temporarily, use
21
+ // update-council-fanout.ts instead.
22
+ //
23
+ // The fanout's `owner` (the governance multisig vault) must sign this. Pass
24
+ // `--multisig <governance multisig address>` to route it through Squads V4 as
25
+ // a proposal instead of trying to send it directly.
26
+ //
27
+ // This instruction bakes in the fanout's *current* next_task/next_pre_task
28
+ // (has_one-checked on-chain) at build time, which can go stale while a Squads
29
+ // proposal sits waiting for approval -- the cron can self-reschedule to a new
30
+ // next_task in the meantime. That makes execution fail on-chain (has_one
31
+ // mismatch) rather than corrupt anything, but the proposal is then
32
+ // permanently dead and must be rebuilt. Get proposals approved promptly; if
33
+ // one sits for a while, re-run this script and re-propose.
34
+ export async function run(args = process.argv) {
35
+ const yarg = yargs(args).options({
36
+ wallet: {
37
+ alias: "k",
38
+ describe: "Anchor wallet keypair (payer; proposer if using --multisig)",
39
+ default: `${os.homedir()}/.config/solana/id.json`,
40
+ },
41
+ url: {
42
+ alias: "u",
43
+ default: "http://127.0.0.1:8899",
44
+ describe: "The solana url",
45
+ },
46
+ miniFanout: {
47
+ type: "string",
48
+ required: true,
49
+ describe: "Address of the mini fanout to close",
50
+ },
51
+ multisig: {
52
+ type: "string",
53
+ describe: "Address of the squads multisig to propose through. Required in practice, since the fanout owner is the governance multisig and must sign this.",
54
+ },
55
+ });
56
+ const argv = await yarg.argv;
57
+ process.env.ANCHOR_WALLET = argv.wallet;
58
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
59
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
60
+ const provider = anchor.getProvider();
61
+ const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
62
+ const program = await initMfan(provider);
63
+ const tuktukProgram = await initTuktuk(provider);
64
+ const miniFanout = new PublicKey(argv.miniFanout);
65
+ const miniFanoutAcc = await program.account.miniFanoutV0.fetch(miniFanout);
66
+ const taskRentRefund = await resolveTaskRentRefund(tuktukProgram, miniFanoutAcc.nextTask, miniFanout, program.programId, wallet.publicKey);
67
+ const ownerTokenAccount = getAssociatedTokenAddressSync(miniFanoutAcc.mint, miniFanoutAcc.owner, true);
68
+ const closeIx = await program.methods
69
+ .closeMiniFanoutV0()
70
+ .accountsPartial({
71
+ owner: miniFanoutAcc.owner,
72
+ miniFanout,
73
+ mint: miniFanoutAcc.mint,
74
+ rentRefund: miniFanoutAcc.rentRefund,
75
+ taskQueue: miniFanoutAcc.taskQueue,
76
+ tokenAccount: miniFanoutAcc.tokenAccount,
77
+ ownerTokenAccount,
78
+ taskRentRefund,
79
+ })
80
+ .instruction();
81
+ await sendInstructionsOrSquadsV4({
82
+ provider,
83
+ instructions: [closeIx],
84
+ multisig: argv.multisig ? new PublicKey(argv.multisig) : undefined,
85
+ signers: [],
86
+ });
87
+ console.log("Council fanout closed.");
88
+ console.log(` mini fanout: ${miniFanout.toBase58()}`);
89
+ console.log(` HNT swept to: ${ownerTokenAccount.toBase58()}`);
90
+ console.log(` rent refunded: ${miniFanoutAcc.rentRefund.toBase58()}`);
91
+ }
92
+ //# sourceMappingURL=close-council-fanout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-council-fanout.js","sourceRoot":"","sources":["../../../src/close-council-fanout.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import { HNT_MINT, sendInstructionsWithPriorityFee } from "@helium/spl-utils";
5
5
  import { init as initTuktuk, nextAvailableTaskIds, taskKey, } from "@helium/tuktuk-sdk";
6
6
  import { getAssociatedTokenAddressSync } from "@solana/spl-token";
7
7
  import { PublicKey, SystemProgram, } from "@solana/web3.js";
8
+ import * as multisig from "@sqds/multisig";
8
9
  import os from "os";
9
10
  import yargs from "yargs/yargs";
10
11
  import { loadKeypair } from "./utils";
@@ -17,9 +18,11 @@ import { loadKeypair } from "./utils";
17
18
  // patch-time edit that sets INFLATION_START), then set the cron's council_vault to it.
18
19
  //
19
20
  // Operational rules (see HIP 149 Decision 4):
20
- // - `owner` MUST be the governance multisig, never the Receiving Entity. It is the only
21
- // authority that can edit the seated-member set; the community seats/removes members by
22
- // vote and the multisig executes the corresponding update.
21
+ // - `owner` MUST be the governance multisig's vault, never the Receiving Entity. It is the
22
+ // only authority that can edit the seated-member set; the community seats/removes members
23
+ // by vote and the multisig executes the corresponding update. Prefer --multisig over
24
+ // --owner: it derives the vault the same way update-council-fanout.ts and
25
+ // close-council-fanout.ts do, instead of relying on a manually-typed vault address.
23
26
  // - On a seat change, CRANK before updating the member vec, so accrual maps to the set that
24
27
  // was seated when it accrued (a vacant seat's share then redistributes to the seated
25
28
  // members from that point forward, per the HIP).
@@ -39,8 +42,11 @@ export async function run(args = process.argv) {
39
42
  },
40
43
  owner: {
41
44
  type: "string",
42
- required: true,
43
- describe: "Fanout owner = governance multisig (Squads vault). Edits the seated-member set. NEVER the Receiving Entity.",
45
+ describe: "Fanout owner = governance multisig (Squads vault) address directly. Edits the seated-member set. NEVER the Receiving Entity. Prefer --multisig, which derives this the same way update-council-fanout.ts and close-council-fanout.ts do; use --owner only to bypass that derivation.",
46
+ },
47
+ multisig: {
48
+ type: "string",
49
+ describe: "Address of the squads multisig whose vault (index 0) should own the fanout. Derives --owner for you, the same way update-council-fanout.ts and close-council-fanout.ts derive it from --multisig. Exactly one of --owner / --multisig is required.",
44
50
  },
45
51
  members: {
46
52
  type: "string",
@@ -71,7 +77,16 @@ export async function run(args = process.argv) {
71
77
  const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
72
78
  const program = await initMfan(provider);
73
79
  const tuktukProgram = await initTuktuk(provider);
74
- const owner = new PublicKey(argv.owner);
80
+ if (Boolean(argv.owner) === Boolean(argv.multisig)) {
81
+ throw new Error("exactly one of --owner / --multisig is required");
82
+ }
83
+ const owner = argv.multisig
84
+ ? (await multisig.getVaultPda({
85
+ multisigPda: new PublicKey(argv.multisig),
86
+ index: 0,
87
+ programId: multisig.PROGRAM_ID,
88
+ }))[0]
89
+ : new PublicKey(argv.owner); // validated above: exactly one of owner/multisig is set
75
90
  const members = argv.members
76
91
  .split(",")
77
92
  .map((m) => m.trim())
@@ -126,7 +141,10 @@ export async function run(args = process.argv) {
126
141
  });
127
142
  const tokenAccount = getAssociatedTokenAddressSync(HNT_MINT, miniFanout, true);
128
143
  console.log("Council fanout created.");
129
- console.log(` owner (governance multisig): ${owner.toBase58()}`);
144
+ if (argv.multisig) {
145
+ console.log(` multisig: ${argv.multisig}`);
146
+ }
147
+ console.log(` owner (governance multisig vault): ${owner.toBase58()}`);
130
148
  console.log(` mini fanout: ${miniFanout.toBase58()}`);
131
149
  console.log(` schedule: ${argv.schedule}`);
132
150
  console.log(` members (${members.length}):`);
@@ -1 +1 @@
1
- {"version":3,"file":"create-council-fanout.js","sourceRoot":"","sources":["../../../src/create-council-fanout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-council-fanout.js","sourceRoot":"","sources":["../../../src/create-council-fanout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { taskKey, nextAvailableTaskIds } from "@helium/tuktuk-sdk";
2
+ // Shared helpers for admin scripts that create, update, reschedule, or close a
3
+ // mini-fanout (see create-council-fanout.ts, update-council-fanout.ts,
4
+ // close-council-fanout.ts). Kept separate from utils.ts because these only
5
+ // make sense in the context of the mini-fanout program's task-queue plumbing.
6
+ /**
7
+ * Allocate a fresh (task, preTask) id/pubkey pair from the given tuktuk task
8
+ * queue, for scheduling a mini-fanout's next distribution.
9
+ */
10
+ export async function allocateNextTasks(tuktukProgram, taskQueue) {
11
+ const taskQueueAcc = await tuktukProgram.account.taskQueueV0.fetch(taskQueue);
12
+ const [taskId, preTaskId] = nextAvailableTaskIds(taskQueueAcc.taskBitmap, 2);
13
+ return {
14
+ taskId,
15
+ preTaskId,
16
+ task: taskKey(taskQueue, taskId)[0],
17
+ preTask: taskKey(taskQueue, preTaskId)[0],
18
+ };
19
+ }
20
+ /**
21
+ * The tuktuk program's dequeue_task_v0 requires the passed-in rent_refund
22
+ * account to match the task's own `rent_refund` field exactly (it's a
23
+ * `has_one` constraint), which is set at queue time to whoever paid to queue
24
+ * it — not necessarily the wallet running this script. Resolve it from the
25
+ * on-chain task rather than assuming it's the current payer.
26
+ *
27
+ * A mini-fanout with nothing currently scheduled points `next_task` /
28
+ * `next_pre_task` back at itself (or at the program id, legacy); in that case
29
+ * there's nothing to dequeue, so the returned value is unused by the caller
30
+ * and any pubkey is safe to pass through.
31
+ */
32
+ export async function resolveTaskRentRefund(tuktukProgram, taskPubkey, miniFanoutPubkey, miniFanoutProgramId, fallback) {
33
+ if (taskPubkey.equals(miniFanoutPubkey) ||
34
+ taskPubkey.equals(miniFanoutProgramId)) {
35
+ return fallback;
36
+ }
37
+ const task = await tuktukProgram.account.taskV0.fetchNullable(taskPubkey);
38
+ return task ? task.rentRefund : fallback;
39
+ }
40
+ //# sourceMappingURL=mini-fanout-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mini-fanout-utils.js","sourceRoot":"","sources":["../../../src/mini-fanout-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGnE,+EAA+E;AAC/E,uEAAuE;AACvE,2EAA2E;AAC3E,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAkB,EAClB,SAAoB;IAOpB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAChE,SAAS,CACV,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO;QACL,MAAM;QACN,SAAS;QACT,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,aAAkB,EAClB,UAAqB,EACrB,gBAA2B,EAC3B,mBAA8B,EAC9B,QAAmB;IAEnB,IACE,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACnC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,EACtC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,UAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1D,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import * as anchor from "@coral-xyz/anchor";
2
2
  import { TASK_QUEUE_ID } from "@helium/hpl-crons-sdk";
3
3
  import { init as initMfan } from "@helium/mini-fanout-sdk";
4
- import { batchInstructionsToTxsWithPriorityFee, bulkSendTransactions, truthy } from "@helium/spl-utils";
4
+ import { batchInstructionsToTxsWithPriorityFee, bulkSendTransactions } from "@helium/spl-utils";
5
5
  import { init as initTuktuk, nextAvailableTaskIds, taskKey } from "@helium/tuktuk-sdk";
6
+ import { PublicKey } from "@solana/web3.js";
6
7
  import os from "os";
7
8
  import yargs from "yargs/yargs";
8
9
  import { loadKeypair } from "./utils";
@@ -18,6 +19,10 @@ export async function run(args = process.argv) {
18
19
  default: "http://127.0.0.1:8899",
19
20
  describe: "The solana url",
20
21
  },
22
+ miniFanout: {
23
+ type: "string",
24
+ describe: "Reschedule only this mini fanout instead of every mini fanout on the network. Use this to recover a single fanout (e.g. the council fanout) that went idle after running out of lamports, without touching anyone else's.",
25
+ },
21
26
  });
22
27
  const argv = await yarg.argv;
23
28
  process.env.ANCHOR_WALLET = argv.wallet;
@@ -28,28 +33,47 @@ export async function run(args = process.argv) {
28
33
  const program = await initMfan(provider);
29
34
  const tuktukProgram = await initTuktuk(provider);
30
35
  const instructions = [];
31
- const miniFanouts = await program.account.miniFanoutV0.all();
36
+ const allMiniFanouts = await program.account.miniFanoutV0.all();
37
+ const miniFanouts = argv.miniFanout
38
+ ? allMiniFanouts.filter((mf) => mf.publicKey.equals(new PublicKey(argv.miniFanout)))
39
+ : allMiniFanouts;
40
+ if (argv.miniFanout && miniFanouts.length === 0) {
41
+ throw new Error(`No mini fanout found at ${argv.miniFanout}`);
42
+ }
43
+ // scheduleTaskV0 only accepts a fanout whose next_task/next_pre_task are
44
+ // already the "nothing scheduled" sentinel (pointing at the fanout itself,
45
+ // or legacy: at the program id) -- see its on-chain constraint. Anything
46
+ // else means a task is genuinely still live, and dequeuing a live task
47
+ // requires a CPI signature from the mini-fanout program's own
48
+ // queue_authority PDA (see queue_authority_seeds! in state.rs), which only
49
+ // update_mini_fanout_v0 / close_mini_fanout_v0 can produce -- both of which
50
+ // require the owner (governance multisig) to sign. There is no way to
51
+ // dequeue a live task from a bare client instruction, so don't try; skip
52
+ // and say so instead of submitting a transaction guaranteed to fail on a
53
+ // missing signature.
54
+ const isIdleSentinel = (miniFanout, task) => task.equals(program.programId) || task.equals(miniFanout.publicKey);
55
+ const idle = miniFanouts.filter((mf) => {
56
+ const ok = isIdleSentinel(mf, mf.account.nextTask) &&
57
+ isIdleSentinel(mf, mf.account.nextPreTask);
58
+ if (!ok) {
59
+ console.log(`Skipping ${mf.publicKey.toBase58()}: still has a live scheduled task; ` +
60
+ `use update-council-fanout.ts (owner-signed) to reschedule it instead.`);
61
+ }
62
+ return ok;
63
+ });
32
64
  const batchSize = 10;
33
65
  const taskQueue = await tuktukProgram.account.taskQueueV0.fetch(TASK_QUEUE_ID);
34
- const freeTasks = nextAvailableTaskIds(taskQueue.taskBitmap, miniFanouts.length * 2);
35
- for (let i = 0; i < miniFanouts.length; i += batchSize) {
66
+ const freeTasks = nextAvailableTaskIds(taskQueue.taskBitmap, idle.length * 2);
67
+ for (let i = 0; i < idle.length; i += batchSize) {
36
68
  // Log progress every 100 positions
37
69
  if (i > 0 && i % 100 === 0) {
38
70
  console.log(`Processed ${i} mini fanouts`);
39
71
  }
40
- const batch = miniFanouts.slice(i, i + batchSize);
72
+ const batch = idle.slice(i, i + batchSize);
41
73
  await Promise.all(batch.map(async (miniFanout) => {
42
74
  const nextTask = freeTasks.pop();
43
75
  const nextPreTask = freeTasks.pop();
44
- const nextTaskAcc = miniFanout.account.nextTask.equals(program.programId) || miniFanout.account.nextTask.equals(miniFanout.publicKey) ? undefined : await tuktukProgram.account.taskV0.fetchNullable(miniFanout.account.nextTask);
45
- const nextPreTaskAcc = miniFanout.account.nextPreTask.equals(program.programId) || miniFanout.account.nextPreTask.equals(miniFanout.publicKey) ? undefined : await tuktukProgram.account.taskV0.fetchNullable(miniFanout.account.nextPreTask);
46
76
  instructions.push([
47
- nextTaskAcc ? await tuktukProgram.methods.dequeueTaskV0().accounts({
48
- task: miniFanout.account.nextTask,
49
- }).instruction() : undefined,
50
- nextPreTaskAcc ? await tuktukProgram.methods.dequeueTaskV0().accounts({
51
- task: miniFanout.account.nextPreTask,
52
- }).instruction() : undefined,
53
77
  await program.methods.scheduleTaskV0({
54
78
  taskId: nextTask,
55
79
  preTaskId: nextPreTask,
@@ -61,10 +85,10 @@ export async function run(args = process.argv) {
61
85
  preTask: taskKey(TASK_QUEUE_ID, nextPreTask)[0],
62
86
  })
63
87
  .instruction()
64
- ].filter(truthy));
88
+ ]);
65
89
  }));
66
90
  }
67
- console.log(`Finished processing ${miniFanouts.length} mini fanouts`);
91
+ console.log(`Finished processing ${idle.length} mini fanouts (${miniFanouts.length - idle.length} skipped as not idle)`);
68
92
  const transactions = await batchInstructionsToTxsWithPriorityFee(provider, instructions, {
69
93
  useFirstEstimateForAll: true,
70
94
  computeUnitLimit: 1200000,
@@ -1 +1 @@
1
- {"version":3,"file":"reschedule-all-mini-fanouts.js","sourceRoot":"","sources":["../../../src/reschedule-all-mini-fanouts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reschedule-all-mini-fanouts.js","sourceRoot":"","sources":["../../../src/reschedule-all-mini-fanouts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { init as initMfan } from "@helium/mini-fanout-sdk";
3
+ import { init as initTuktuk } from "@helium/tuktuk-sdk";
4
+ import { PublicKey } from "@solana/web3.js";
5
+ import os from "os";
6
+ import yargs from "yargs/yargs";
7
+ import { allocateNextTasks, resolveTaskRentRefund } from "./mini-fanout-utils";
8
+ import { loadKeypair, sendInstructionsOrSquadsV4 } from "./utils";
9
+ // HIP 149 Decision 4: update the Advisory Council compensation fanout created by
10
+ // create-council-fanout.ts. Use this on a seat change (add/remove a member) or to
11
+ // change the distribution schedule.
12
+ //
13
+ // Operational rules (see HIP 149 Decision 4, and the header comment on
14
+ // create-council-fanout.ts):
15
+ // - CRANK before running this on a seat change. `update_mini_fanout_v0` replaces
16
+ // the share vec wholesale, so accrual (total_owed) for members not carried
17
+ // forward is lost. Let the current period's distribution run first so accrual
18
+ // maps to the set that was actually seated when it accrued, then update.
19
+ // - The fanout's `owner` (a governance multisig vault) must sign this. Pass
20
+ // `--multisig <governance multisig address>` to route it through Squads V4
21
+ // as a proposal instead of trying to send it directly.
22
+ // - Omitting --members leaves the current share set untouched (only the
23
+ // schedule changes, if given). Omitting --schedule leaves the cron
24
+ // untouched. Passing neither still re-queues the next distribution task,
25
+ // which is a valid way to force a reschedule on an already-scheduled fanout
26
+ // (an idle/unscheduled one should use reschedule-all-mini-fanouts.ts instead,
27
+ // since that path doesn't need the owner's signature).
28
+ // - This instruction bakes in the fanout's *current* next_task/next_pre_task
29
+ // (has_one-checked on-chain) and a task id claimed from the queue's current
30
+ // bitmap at build time -- both can go stale while a Squads proposal sits
31
+ // waiting for approval (the cron can self-reschedule to a new next_task, or
32
+ // another queue_task_v0 call can claim the same id first). Either makes
33
+ // execution fail on-chain (has_one mismatch or TaskAlreadyExists) rather
34
+ // than corrupt anything, but the proposal is then permanently dead and must
35
+ // be rebuilt from a fresh run of this script. Get proposals approved
36
+ // promptly; if one sits for a while, re-run this script and re-propose
37
+ // rather than trusting a stale one to still execute.
38
+ export async function run(args = process.argv) {
39
+ const yarg = yargs(args).options({
40
+ wallet: {
41
+ alias: "k",
42
+ describe: "Anchor wallet keypair (payer; proposer if using --multisig)",
43
+ default: `${os.homedir()}/.config/solana/id.json`,
44
+ },
45
+ url: {
46
+ alias: "u",
47
+ default: "http://127.0.0.1:8899",
48
+ describe: "The solana url",
49
+ },
50
+ miniFanout: {
51
+ type: "string",
52
+ required: true,
53
+ describe: "Address of the mini fanout to update",
54
+ },
55
+ members: {
56
+ type: "string",
57
+ describe: "Comma-separated seated community-member wallet addresses to replace the current share set with (each gets an equal share). Omit to leave shares unchanged.",
58
+ },
59
+ schedule: {
60
+ type: "string",
61
+ describe: "New cron schedule (sec min hour day month dow) for the distribution crank. Omit to leave the schedule unchanged.",
62
+ },
63
+ multisig: {
64
+ type: "string",
65
+ describe: "Address of the squads multisig to propose through. Required in practice, since the fanout owner is the governance multisig and must sign this update.",
66
+ },
67
+ });
68
+ const argv = await yarg.argv;
69
+ process.env.ANCHOR_WALLET = argv.wallet;
70
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
71
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
72
+ const provider = anchor.getProvider();
73
+ const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
74
+ const program = await initMfan(provider);
75
+ const tuktukProgram = await initTuktuk(provider);
76
+ const miniFanout = new PublicKey(argv.miniFanout);
77
+ const miniFanoutAcc = await program.account.miniFanoutV0.fetch(miniFanout);
78
+ const shares = argv.members
79
+ ? argv.members
80
+ .split(",")
81
+ .map((m) => m.trim())
82
+ .filter(Boolean)
83
+ .map((m) => ({
84
+ wallet: new PublicKey(m),
85
+ share: { share: { amount: 1 } },
86
+ }))
87
+ : null;
88
+ if (argv.members && shares.length === 0) {
89
+ throw new Error("--members was given but resolved to zero wallets");
90
+ }
91
+ const { taskId, preTaskId, task, preTask } = await allocateNextTasks(tuktukProgram, miniFanoutAcc.taskQueue);
92
+ const taskRentRefund = await resolveTaskRentRefund(tuktukProgram, miniFanoutAcc.nextTask, miniFanout, program.programId, wallet.publicKey);
93
+ const updateIx = await program.methods
94
+ .updateMiniFanoutV0({
95
+ newTaskId: taskId,
96
+ newPreTaskId: preTaskId,
97
+ shares,
98
+ schedule: argv.schedule ?? null,
99
+ })
100
+ .accountsPartial({
101
+ owner: miniFanoutAcc.owner,
102
+ payer: wallet.publicKey,
103
+ miniFanout,
104
+ taskQueue: miniFanoutAcc.taskQueue,
105
+ newTask: task,
106
+ newPreTask: preTask,
107
+ taskRentRefund,
108
+ })
109
+ .instruction();
110
+ await sendInstructionsOrSquadsV4({
111
+ provider,
112
+ instructions: [updateIx],
113
+ multisig: argv.multisig ? new PublicKey(argv.multisig) : undefined,
114
+ signers: [],
115
+ });
116
+ console.log("Council fanout updated.");
117
+ console.log(` mini fanout: ${miniFanout.toBase58()}`);
118
+ if (shares) {
119
+ console.log(` members (${shares.length}):`);
120
+ shares.forEach((s) => console.log(` - ${s.wallet.toBase58()}`));
121
+ }
122
+ if (argv.schedule) {
123
+ console.log(` schedule: ${argv.schedule}`);
124
+ }
125
+ }
126
+ //# sourceMappingURL=update-council-fanout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-council-fanout.js","sourceRoot":"","sources":["../../../src/update-council-fanout.ts"],"names":[],"mappings":"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"}
@@ -1,32 +1,32 @@
1
- import * as anchor from '@coral-xyz/anchor';
2
- import { dataCreditsKey, init as initDc } from '@helium/data-credits-sdk';
3
- import { PublicKey } from '@solana/web3.js';
4
- import os from 'os';
5
- import yargs from 'yargs/yargs';
6
- import { loadKeypair, sendInstructionsOrSquadsV4, } from './utils';
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { dataCreditsKey, init as initDc } from "@helium/data-credits-sdk";
3
+ import { PublicKey } from "@solana/web3.js";
4
+ import os from "os";
5
+ import yargs from "yargs/yargs";
6
+ import { loadKeypair, sendInstructionsOrSquadsV4, } from "./utils";
7
7
  export async function run(args = process.argv) {
8
8
  const yarg = yargs(args).options({
9
9
  wallet: {
10
- alias: 'k',
11
- describe: 'Anchor wallet keypair',
10
+ alias: "k",
11
+ describe: "Anchor wallet keypair",
12
12
  default: `${os.homedir()}/.config/solana/id.json`,
13
13
  },
14
14
  url: {
15
- alias: 'u',
16
- default: 'http://127.0.0.1:8899',
17
- describe: 'The solana url',
15
+ alias: "u",
16
+ default: "http://127.0.0.1:8899",
17
+ describe: "The solana url",
18
18
  },
19
19
  dcMint: {
20
20
  required: true,
21
- type: 'string',
22
- describe: 'Data credits mint address',
21
+ type: "string",
22
+ describe: "Data credits mint address",
23
23
  },
24
24
  newAuthority: {
25
- type: 'string',
25
+ type: "string",
26
26
  },
27
27
  multisig: {
28
- type: 'string',
29
- describe: 'Address of the squads multisig to be authority. If not provided, your wallet will be the authority',
28
+ type: "string",
29
+ describe: "Address of the squads multisig to be authority. If not provided, your wallet will be the authority",
30
30
  },
31
31
  });
32
32
  const argv = await yarg.argv;
@@ -39,7 +39,7 @@ export async function run(args = process.argv) {
39
39
  const instructions = [];
40
40
  const dataCredits = dataCreditsKey(new PublicKey(argv.dcMint))[0];
41
41
  const dataCreditsAcc = await program.account.dataCreditsV0.fetch(dataCredits);
42
- console.log('Data Credits', dataCredits.toBase58());
42
+ console.log("Data Credits", dataCredits.toBase58());
43
43
  console.log(dataCreditsAcc.authority.toBase58());
44
44
  instructions.push(await program.methods
45
45
  .updateDataCreditsV0({
@@ -61,6 +61,6 @@ export async function run(args = process.argv) {
61
61
  });
62
62
  }
63
63
  function isNull(vehntDelegated) {
64
- return vehntDelegated === null || typeof vehntDelegated == 'undefined';
64
+ return vehntDelegated === null || typeof vehntDelegated == "undefined";
65
65
  }
66
66
  //# sourceMappingURL=update-data-credits.js.map