@helium/helium-admin-cli 0.9.19 → 0.9.20

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.
@@ -0,0 +1,256 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { organizationKey } from "@helium/organization-sdk";
3
+ import { init as initProposal } from "@helium/proposal-sdk";
4
+ import { init as initVsr } from "@helium/voter-stake-registry-sdk";
5
+ import { PublicKey } from "@solana/web3.js";
6
+ import b58 from "bs58";
7
+ import os from "os";
8
+ import yargs from "yargs/yargs";
9
+ import { loadKeypair } from "./utils";
10
+ export async function run(args = process.argv) {
11
+ const yarg = yargs(args).options({
12
+ wallet: {
13
+ alias: "k",
14
+ describe: "Anchor wallet keypair",
15
+ default: `${os.homedir()}/.config/solana/id.json`,
16
+ },
17
+ url: {
18
+ alias: "u",
19
+ default: "http://127.0.0.1:8899",
20
+ describe: "The solana url",
21
+ },
22
+ outputPath: {
23
+ type: "string",
24
+ describe: "The path to the output file",
25
+ default: "vote-markers.json",
26
+ },
27
+ });
28
+ const argv = await yarg.argv;
29
+ process.env.ANCHOR_WALLET = argv.wallet;
30
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
31
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
32
+ const provider = anchor.getProvider();
33
+ const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
34
+ const hvsrProgram = await initVsr(provider);
35
+ const proposalProgram = await initProposal(provider);
36
+ let myOrgs = new Set([
37
+ organizationKey("Helium")[0],
38
+ organizationKey("Helium MOBILE")[0],
39
+ organizationKey("Helium IOT")[0],
40
+ ].map(k => k.toBase58()));
41
+ const proposals = (await proposalProgram.account.proposalV0.all()).filter(p => myOrgs.has(p.account.namespace.toBase58()));
42
+ // Track votes in a map: proposalKey -> voter marker id --> VoteMarkerV0
43
+ const votesByProposal = new Map();
44
+ for (const proposal of proposals) {
45
+ votesByProposal.set(proposal.publicKey.toBase58(), new Map());
46
+ }
47
+ // Add position cache
48
+ const positionCache = new Map();
49
+ for (const proposal of proposals) {
50
+ console.log(`Getting vote markers for ${proposal.publicKey.toBase58()}`);
51
+ let signatures = [];
52
+ let lastSig = undefined;
53
+ // // Keep fetching until we get all signatures
54
+ while (true) {
55
+ const sigs = await provider.connection.getSignaturesForAddress(proposal.publicKey, { before: lastSig, limit: 1000 }, "confirmed");
56
+ if (sigs.length === 0)
57
+ break;
58
+ signatures.push(...sigs);
59
+ lastSig = sigs[sigs.length - 1].signature;
60
+ // If we got less than 1000, we've hit the end
61
+ if (sigs.length < 1000)
62
+ break;
63
+ }
64
+ console.log("signatures", signatures.length);
65
+ const hvsrCoder = new anchor.BorshInstructionCoder(hvsrProgram.idl);
66
+ const proposalCoder = new anchor.BorshInstructionCoder(proposalProgram.idl);
67
+ // Process signatures in chunks of 100
68
+ const chunkSize = 100;
69
+ signatures = signatures.reverse();
70
+ for (let i = 0; i < signatures.length; i += chunkSize) {
71
+ const chunk = signatures.slice(i, i + chunkSize);
72
+ const txs = await provider.connection.getTransactions(chunk.map(sig => sig.signature), { maxSupportedTransactionVersion: 0, commitment: "confirmed" });
73
+ for (const tx of txs) {
74
+ if (!tx?.meta || tx.meta.err)
75
+ continue;
76
+ let message = tx.transaction.message;
77
+ let index = -1;
78
+ for (const ix of message.compiledInstructions) {
79
+ index++;
80
+ try {
81
+ // Check if instruction is from VSR program
82
+ if (message.staticAccountKeys[ix.programIdIndex].toBase58() !== hvsrProgram.programId.toBase58())
83
+ continue;
84
+ let decoded = hvsrCoder.decode(Buffer.from(ix.data));
85
+ if (!decoded)
86
+ continue;
87
+ let formatted = hvsrCoder.format(decoded, ix.accountKeyIndexes.map(i => {
88
+ return {
89
+ pubkey: message.staticAccountKeys[i] || PublicKey.default,
90
+ isSigner: false,
91
+ isWritable: false,
92
+ };
93
+ }));
94
+ if (!formatted)
95
+ continue;
96
+ // Handle vote instruction
97
+ if (decoded.name === "voteV0") {
98
+ const voter = formatted.accounts.find((acc) => acc.name === "Voter")?.pubkey;
99
+ const registrar = formatted.accounts.find((acc) => acc.name === "Registrar")?.pubkey;
100
+ const mint = formatted.accounts.find((acc) => acc.name === "Mint")?.pubkey;
101
+ const proposal = formatted.accounts.find((acc) => acc.name === "Proposal")?.pubkey;
102
+ const marker = formatted.accounts.find((acc) => acc.name === "Marker")?.pubkey;
103
+ const innerIxs = tx.meta.innerInstructions?.find((ix) => ix.index === index);
104
+ const innerVoteIx = innerIxs?.instructions.find((ix) => message.staticAccountKeys[ix.programIdIndex]?.toBase58() ===
105
+ proposalProgram.programId.toBase58());
106
+ const innerVoteDecoded = proposalCoder.decode(Buffer.from(b58.decode(innerVoteIx?.data || "")));
107
+ if (!innerVoteDecoded) {
108
+ console.log("innerVoteDecoded missing", index, tx.meta.innerInstructions, innerVoteIx, innerIxs, chunk);
109
+ }
110
+ ;
111
+ // @ts-ignore
112
+ let { weight, choice } = innerVoteDecoded.data.args;
113
+ let propMap = votesByProposal.get(proposal.toBase58());
114
+ let voteMarker = propMap.get(marker.toBase58());
115
+ if (!voteMarker) {
116
+ voteMarker = {
117
+ address: marker,
118
+ voter,
119
+ registrar,
120
+ proposal,
121
+ mint,
122
+ // @ts-ignore
123
+ choices: [choice],
124
+ weight: weight,
125
+ bumpSeed: 0,
126
+ deprecatedRelinquished: false,
127
+ proxyIndex: 0,
128
+ rentRefund: PublicKey.default,
129
+ };
130
+ }
131
+ if (!voteMarker.choices.some((c) => c === choice)) {
132
+ voteMarker.choices.push(choice);
133
+ }
134
+ if (!voteMarker.weight.eq(weight)) {
135
+ voteMarker.weight = weight;
136
+ }
137
+ propMap.set(marker.toBase58(), voteMarker);
138
+ }
139
+ else if (decoded.name === "proxiedVoteV0") {
140
+ const voter = formatted.accounts.find((acc) => acc.name === "Voter")?.pubkey;
141
+ const position = formatted.accounts.find((acc) => acc.name === "Position")?.pubkey;
142
+ const registrar = formatted.accounts.find((acc) => acc.name === "Registrar")?.pubkey;
143
+ const proposal = formatted.accounts.find((acc) => acc.name === "Proposal")?.pubkey;
144
+ const marker = formatted.accounts.find((acc) => acc.name === "Marker")?.pubkey;
145
+ // Use cache for position lookup
146
+ let mint;
147
+ if (position) {
148
+ const positionKey = position.toBase58();
149
+ if (!positionCache.has(positionKey)) {
150
+ const posData = await hvsrProgram.account.positionV0.fetchNullable(position);
151
+ positionCache.set(positionKey, { mint: posData?.mint || PublicKey.default });
152
+ }
153
+ mint = positionCache.get(positionKey).mint;
154
+ }
155
+ else {
156
+ mint = PublicKey.default;
157
+ }
158
+ const innerIxs = tx.meta.innerInstructions?.find((ix) => ix.index === index);
159
+ const innerVoteIx = innerIxs?.instructions.find((ix) => message.staticAccountKeys[ix.programIdIndex]?.toBase58() ===
160
+ proposalProgram.programId.toBase58());
161
+ const innerVoteDecoded = proposalCoder.decode(Buffer.from(b58.decode(innerVoteIx?.data || "")));
162
+ if (!innerVoteDecoded) {
163
+ console.log("innerVoteDecoded missing", index, tx.meta.innerInstructions, innerVoteIx, innerIxs, chunk);
164
+ }
165
+ // @ts-ignore
166
+ let { weight, choice } = innerVoteDecoded.data.args;
167
+ let propMap = votesByProposal.get(proposal.toBase58());
168
+ let voteMarker = propMap.get(marker.toBase58());
169
+ if (!voteMarker) {
170
+ voteMarker = {
171
+ address: marker,
172
+ voter,
173
+ registrar,
174
+ proposal,
175
+ mint,
176
+ // @ts-ignore
177
+ choices: [choice],
178
+ weight,
179
+ bumpSeed: 0,
180
+ deprecatedRelinquished: false,
181
+ proxyIndex: 0,
182
+ rentRefund: PublicKey.default,
183
+ };
184
+ }
185
+ if (!voteMarker.choices.some((c) => c === choice)) {
186
+ voteMarker.choices.push(choice);
187
+ }
188
+ if (!voteMarker.weight.eq(weight)) {
189
+ voteMarker.weight = weight;
190
+ }
191
+ propMap.set(marker.toBase58(), voteMarker);
192
+ }
193
+ else if (decoded.name === "relinquishVoteV1" || decoded.name === "proxiedRelinquishVoteV0") {
194
+ const firstIsSigner = message.isAccountSigner(ix.accountKeyIndexes[0]);
195
+ // HACK: At some point we removed rent refund as first account and made it the last account.
196
+ if (firstIsSigner && decoded.name === "relinquishVoteV1") {
197
+ const len = ix.accountKeyIndexes.length;
198
+ let refund = ix.accountKeyIndexes.shift();
199
+ if (len != 12) { // super legacy
200
+ ix.accountKeyIndexes.push(refund);
201
+ }
202
+ decoded = hvsrCoder.decode(Buffer.from(ix.data));
203
+ formatted = hvsrCoder.format(decoded, ix.accountKeyIndexes.map((i) => {
204
+ return {
205
+ pubkey: message.staticAccountKeys[i] || PublicKey.default,
206
+ isSigner: false,
207
+ isWritable: false,
208
+ };
209
+ }));
210
+ }
211
+ const marker = formatted.accounts.find((acc) => acc.name === "Marker")?.pubkey;
212
+ const proposal = formatted.accounts.find((acc) => acc.name === "Proposal")?.pubkey;
213
+ const propMap = votesByProposal.get(proposal.toBase58());
214
+ let voteMarker = propMap.get(marker.toBase58());
215
+ if (voteMarker) {
216
+ // @ts-ignore
217
+ voteMarker.choices = voteMarker.choices.filter(c => c !== decoded.data.args.choice);
218
+ if (voteMarker.choices.length === 0) {
219
+ propMap.delete(marker.toBase58());
220
+ }
221
+ else {
222
+ propMap.set(marker.toBase58(), voteMarker);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ catch (e) {
228
+ console.log("error", index, tx.transaction.signatures[0]);
229
+ throw e;
230
+ // Skip instructions that can't be decoded
231
+ continue;
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
237
+ let flattened = Array.from(votesByProposal.values()).flatMap((markers) => {
238
+ return Array.from(markers.values()).map(marker => ({
239
+ address: marker.address.toBase58(),
240
+ voter: marker.voter.toBase58(),
241
+ registrar: marker.registrar.toBase58(),
242
+ proposal: marker.proposal.toBase58(),
243
+ mint: marker.mint.toBase58(),
244
+ choices: marker.choices,
245
+ weight: marker.weight.toString(),
246
+ bumpSeed: marker.bumpSeed,
247
+ deprecatedRelinquished: marker.deprecatedRelinquished,
248
+ proxyIndex: marker.proxyIndex,
249
+ rentRefund: marker.rentRefund.toBase58(),
250
+ }));
251
+ });
252
+ // Write results to file
253
+ const fs = require('fs');
254
+ fs.writeFileSync(argv.outputPath, JSON.stringify(flattened, null, 2));
255
+ }
256
+ //# sourceMappingURL=dump-vote-markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump-vote-markers.js","sourceRoot":"","sources":["../../../src/dump-vote-markers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { batchInstructionsToTxsWithPriorityFee, bulkSendTransactions } from "@helium/spl-utils";
3
+ import { init as initVsr, } from "@helium/voter-stake-registry-sdk";
4
+ import { PublicKey } from "@solana/web3.js";
5
+ import BN from "bn.js";
6
+ import os from "os";
7
+ import yargs from "yargs/yargs";
8
+ import { loadKeypair } from "./utils";
9
+ const MOBILE_REGISTRAR = new PublicKey("C4DWaps9bLiqy4e81wJ7VTQ6QR7C4MWvwsei3ZjsaDuW");
10
+ const IOT_REGISTRAR = new PublicKey("7ZZopN1mx6ECcb3YCG8dbxeLpA44xq4gzA1ETEiaLoeL");
11
+ export async function run(args = process.argv) {
12
+ const yarg = yargs(args).options({
13
+ wallet: {
14
+ alias: "k",
15
+ describe: "Anchor wallet keypair",
16
+ default: `${os.homedir()}/.config/solana/id.json`,
17
+ },
18
+ url: {
19
+ alias: "u",
20
+ default: "http://127.0.0.1:8899",
21
+ describe: "The solana url",
22
+ },
23
+ });
24
+ const argv = await yarg.argv;
25
+ process.env.ANCHOR_WALLET = argv.wallet;
26
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
27
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
28
+ const provider = anchor.getProvider();
29
+ const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
30
+ const vsrProgram = await initVsr(provider);
31
+ const positions = await vsrProgram.account.positionV0.all();
32
+ const registrars = new Set([MOBILE_REGISTRAR, IOT_REGISTRAR].map((p) => p.toBase58()));
33
+ const validPositions = positions.filter((p) => registrars.has(p.account.registrar.toBase58()) &&
34
+ (!p.account.lockup.endTs.eq(new BN(1738195200)) ||
35
+ !!p.account.lockup.kind.constant));
36
+ console.log(`Updating ${validPositions.length} positions`);
37
+ const instructions = await Promise.all(validPositions.map((p) => {
38
+ return vsrProgram.methods.tempReleasePositionV0().accountsStrict({
39
+ position: p.publicKey,
40
+ authority: wallet.publicKey,
41
+ }).instruction();
42
+ }));
43
+ console.log(`Constructing ${instructions.length} instructions`);
44
+ const transactions = await batchInstructionsToTxsWithPriorityFee(provider, instructions, {
45
+ useFirstEstimateForAll: true,
46
+ });
47
+ console.log(`Sending ${transactions.length} transactions`);
48
+ await bulkSendTransactions(provider, transactions, console.log, 10, [], 100);
49
+ }
50
+ //# sourceMappingURL=release-iot-mobile-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-iot-mobile-positions.js","sourceRoot":"","sources":["../../../src/release-iot-mobile-positions.ts"],"names":[],"mappings":"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"}