@helium/helium-admin-cli 0.7.11 → 0.7.12

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,282 @@
1
+ import Address from '@helium/address';
2
+ import { ED25519_KEY_TYPE } from '@helium/address/build/KeyTypes';
3
+ import { init as initHem, makerKey, rewardableEntityConfigKey, makerApprovalKey, } from '@helium/helium-entity-manager-sdk';
4
+ import { init as initHsd, subDaoKey } from '@helium/helium-sub-daos-sdk';
5
+ import { init as initVsr } from '@helium/voter-stake-registry-sdk';
6
+ import { chunks, humanReadable, sendInstructions, truthy, } from '@helium/spl-utils';
7
+ import * as anchor from '@coral-xyz/anchor';
8
+ import { getConcurrentMerkleTreeAccountSize, SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, } from '@solana/spl-account-compression';
9
+ import { Keypair, PublicKey, SystemProgram, } from '@solana/web3.js';
10
+ import fs from 'fs';
11
+ import os from 'os';
12
+ import yargs from 'yargs/yargs';
13
+ import { exists, loadKeypair, sendInstructionsOrSquads, merkleSizes, } from './utils';
14
+ import Squads from '@sqds/sdk';
15
+ export async function run(args = process.argv) {
16
+ const yarg = yargs(args).options({
17
+ wallet: {
18
+ alias: 'k',
19
+ describe: 'Anchor wallet keypair',
20
+ default: `${os.homedir()}/.config/solana/id.json`,
21
+ },
22
+ executeTransaction: {
23
+ type: 'boolean',
24
+ },
25
+ url: {
26
+ alias: 'u',
27
+ default: 'http://127.0.0.1:8899',
28
+ describe: 'The solana url',
29
+ },
30
+ subdaoMint: {
31
+ required: true,
32
+ describe: 'Public Key of the subdao mint',
33
+ type: 'string',
34
+ },
35
+ govProgramId: {
36
+ type: 'string',
37
+ describe: 'Pubkey of the GOV program',
38
+ default: 'hgovkRU6Ghe1Qoyb54HdSLdqN7VtxaifBzRmh9jtd3S',
39
+ },
40
+ fromFile: {
41
+ describe: 'Load makers from a json file and create in bulk',
42
+ required: false,
43
+ type: 'string',
44
+ },
45
+ name: {
46
+ alias: 'n',
47
+ type: 'string',
48
+ required: false,
49
+ describe: 'The name of the maker',
50
+ },
51
+ makerKey: {
52
+ alias: 'm',
53
+ type: 'string',
54
+ describe: '*Helium* Public Key of a maker',
55
+ required: false,
56
+ },
57
+ makerCount: {
58
+ alias: 'c',
59
+ type: 'number',
60
+ describe: 'Estimated number of hotspots this maker will have',
61
+ required: false,
62
+ },
63
+ merkleBasePath: {
64
+ type: 'string',
65
+ describe: 'Base path for merkle keypairs',
66
+ default: `${__dirname}/../keypairs`,
67
+ },
68
+ symbol: {
69
+ alias: 's',
70
+ type: 'string',
71
+ required: true,
72
+ describe: 'The symbol of the entity config',
73
+ },
74
+ multisig: {
75
+ type: 'string',
76
+ describe: 'Address of the squads multisig to be authority. If not provided, your wallet will be the authority',
77
+ },
78
+ authorityIndex: {
79
+ type: 'number',
80
+ describe: 'Authority index for squads. Defaults to 1',
81
+ default: 1,
82
+ },
83
+ });
84
+ const argv = await yarg.argv;
85
+ process.env.ANCHOR_WALLET = argv.wallet;
86
+ process.env.ANCHOR_PROVIDER_URL = argv.url;
87
+ anchor.setProvider(anchor.AnchorProvider.local(argv.url));
88
+ const provider = anchor.getProvider();
89
+ const wallet = new anchor.Wallet(loadKeypair(argv.wallet));
90
+ const name = argv.name;
91
+ const symbol = argv.symbol;
92
+ let makers = [
93
+ {
94
+ name,
95
+ address: argv.makerKey,
96
+ count: argv.makerCount || 300000,
97
+ staked: true,
98
+ },
99
+ ];
100
+ if (argv.fromFile) {
101
+ makers = JSON.parse(fs.readFileSync(argv.fromFile, 'utf-8'));
102
+ // Append a special fallthrough maker for hotspots that don't have a maker
103
+ const solAddr = provider.wallet.publicKey;
104
+ const helAddr = new Address(0, 0, ED25519_KEY_TYPE, solAddr.toBuffer());
105
+ makers.push({
106
+ name: 'Migrated Helium Hotspot',
107
+ address: helAddr.b58,
108
+ count: 50000,
109
+ staked: true,
110
+ });
111
+ }
112
+ const hemProgram = await initHem(provider);
113
+ const hsdProgram = await initHsd(provider);
114
+ const vsrProgram = await initVsr(provider);
115
+ const conn = provider.connection;
116
+ const subdaoMint = new PublicKey(argv.subdaoMint);
117
+ const subdao = (await subDaoKey(subdaoMint))[0];
118
+ const entityConfigKey = (await rewardableEntityConfigKey(subdao, symbol.toUpperCase()))[0];
119
+ const subdaoAcc = await hsdProgram.account.subDaoV0.fetch(subdao);
120
+ const dao = await hsdProgram.account.daoV0.fetch(subdaoAcc.dao);
121
+ let subdaoPayer = provider.wallet.publicKey;
122
+ let daoPayer = provider.wallet.publicKey;
123
+ const squads = Squads.endpoint(process.env.ANCHOR_PROVIDER_URL, wallet, {
124
+ commitmentOrConfig: 'finalized',
125
+ });
126
+ let authority = provider.wallet.publicKey;
127
+ let multisig = argv.multisig ? new PublicKey(argv.multisig) : null;
128
+ if (multisig) {
129
+ authority = squads.getAuthorityPDA(multisig, argv.authorityIndex);
130
+ subdaoPayer = authority;
131
+ daoPayer = authority;
132
+ console.log('SQUAD AUTH', authority.toBase58());
133
+ }
134
+ const createInstructions = [];
135
+ const approveInstructions = [];
136
+ const updateAuthority = dao.authority;
137
+ let totalSol = 0;
138
+ for (const { name, address, count, staked } of makers) {
139
+ const innerCreateInstrs = [];
140
+ const makerAuthority = new PublicKey(Address.fromB58(address).publicKey);
141
+ const [size, buffer, canopy] = merkleSizes.find(([height]) => Math.pow(2, height) > count * 2);
142
+ const space = getConcurrentMerkleTreeAccountSize(size, buffer, canopy);
143
+ const maker = await makerKey(subdaoAcc.dao, name)[0];
144
+ const rent = await provider.connection.getMinimumBalanceForRentExemption(space);
145
+ totalSol += rent;
146
+ let merkle;
147
+ const merklePath = `${argv.merkleBasePath}/merkle-${address}.json`;
148
+ if (fs.existsSync(merklePath)) {
149
+ merkle = loadKeypair(merklePath);
150
+ }
151
+ else {
152
+ merkle = Keypair.generate();
153
+ fs.writeFileSync(merklePath, JSON.stringify(Array.from(merkle.secretKey)));
154
+ }
155
+ if (!(await exists(conn, maker))) {
156
+ console.log(`
157
+ Creating maker with helium addr: ${address}.
158
+ Solana addr: ${makerAuthority.toBase58()}.
159
+ Size: ${size}, buffer: ${buffer}, canopy: ${canopy}.
160
+ Space: ${space} bytes
161
+ Cost: ~${humanReadable(new anchor.BN(rent), 9)} Sol
162
+ `);
163
+ if (space > 10000000) {
164
+ throw new Error(`Space ${space} more than 10mb for tree ${size}, ${buffer}, ${canopy}}`);
165
+ }
166
+ const create = await hemProgram.methods
167
+ .initializeMakerV0({
168
+ name: name,
169
+ metadataUrl: 'todo',
170
+ issuingAuthority: makerAuthority,
171
+ updateAuthority,
172
+ })
173
+ .accounts({
174
+ maker,
175
+ payer: daoPayer,
176
+ dao: subdaoAcc.dao,
177
+ })
178
+ .instruction();
179
+ const setTree = await hemProgram.methods
180
+ .setMakerTreeV0({
181
+ maxDepth: size,
182
+ maxBufferSize: buffer,
183
+ })
184
+ .accounts({
185
+ maker,
186
+ merkleTree: merkle.publicKey,
187
+ payer: daoPayer,
188
+ updateAuthority,
189
+ })
190
+ .instruction();
191
+ if (!(await exists(conn, merkle.publicKey))) {
192
+ await sendInstructions(provider, [
193
+ SystemProgram.createAccount({
194
+ fromPubkey: provider.wallet.publicKey,
195
+ newAccountPubkey: merkle.publicKey,
196
+ lamports: await provider.connection.getMinimumBalanceForRentExemption(space),
197
+ space: space,
198
+ programId: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID,
199
+ }),
200
+ ], [merkle]);
201
+ }
202
+ innerCreateInstrs.push(...[create, setTree].filter(truthy));
203
+ }
204
+ else {
205
+ const makerAcc = await hemProgram.account.makerV0.fetch(maker);
206
+ innerCreateInstrs.push(await hemProgram.methods
207
+ .updateMakerV0({
208
+ issuingAuthority: makerAuthority,
209
+ updateAuthority,
210
+ })
211
+ .accounts({ maker, updateAuthority: makerAcc.updateAuthority })
212
+ .instruction());
213
+ if (makerAcc.merkleTree.equals(SystemProgram.programId)) {
214
+ const setTree = await hemProgram.methods
215
+ .setMakerTreeV0({
216
+ maxDepth: size,
217
+ maxBufferSize: buffer,
218
+ })
219
+ .accounts({
220
+ maker,
221
+ merkleTree: merkle.publicKey,
222
+ payer: daoPayer,
223
+ updateAuthority,
224
+ })
225
+ .instruction();
226
+ if (!(await exists(conn, merkle.publicKey))) {
227
+ await sendInstructions(provider, [
228
+ SystemProgram.createAccount({
229
+ fromPubkey: provider.wallet.publicKey,
230
+ newAccountPubkey: merkle.publicKey,
231
+ lamports: await provider.connection.getMinimumBalanceForRentExemption(space),
232
+ space: space,
233
+ programId: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID,
234
+ }),
235
+ ], [merkle]);
236
+ }
237
+ innerCreateInstrs.push(setTree);
238
+ }
239
+ }
240
+ createInstructions.push(innerCreateInstrs);
241
+ const innerApproveInstrs = [];
242
+ let approve;
243
+ if (staked &&
244
+ !(await exists(conn, makerApprovalKey(entityConfigKey, maker)[0]))) {
245
+ const authority = (await hemProgram.account.rewardableEntityConfigV0.fetch(entityConfigKey)).authority;
246
+ approve = await hemProgram.methods
247
+ .approveMakerV0()
248
+ .accounts({
249
+ maker,
250
+ rewardableEntityConfig: entityConfigKey,
251
+ authority,
252
+ payer: subdaoPayer,
253
+ })
254
+ .instruction();
255
+ innerApproveInstrs.push(approve);
256
+ }
257
+ approveInstructions.push(innerApproveInstrs);
258
+ }
259
+ console.log('Total sol needed: ', humanReadable(new anchor.BN(totalSol), 9));
260
+ if (multisig) {
261
+ // Approve instructions must execute after ALL create instructions
262
+ const instrs = createInstructions.flat().filter(truthy);
263
+ const approveInstrs = approveInstructions.flat().filter(truthy);
264
+ for (const chunk of chunks([...instrs, ...approveInstrs], 3)) {
265
+ await sendInstructionsOrSquads({
266
+ provider,
267
+ instructions: chunk,
268
+ signers: [],
269
+ executeTransaction: argv.executeTransaction,
270
+ squads,
271
+ multisig,
272
+ authorityIndex: argv.authorityIndex,
273
+ });
274
+ }
275
+ }
276
+ else {
277
+ for (const instrs of [...createInstructions, ...approveInstructions]) {
278
+ await sendInstructions(provider, instrs, []);
279
+ }
280
+ }
281
+ }
282
+ //# sourceMappingURL=create-and-approve-makers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-and-approve-makers.js","sourceRoot":"","sources":["../../../src/create-and-approve-makers.ts"],"names":[],"mappings":"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"}