@helium/helium-admin-cli 0.7.11 → 0.7.13
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/lib/cjs/create-and-approve-makers.js +323 -0
- package/lib/cjs/create-and-approve-makers.js.map +1 -0
- package/lib/cjs/create-maker.js +122 -213
- package/lib/cjs/create-maker.js.map +1 -1
- package/lib/esm/src/create-and-approve-makers.js +282 -0
- package/lib/esm/src/create-and-approve-makers.js.map +1 -0
- package/lib/esm/src/create-maker.js +131 -222
- package/lib/esm/src/create-maker.js.map +1 -1
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/src/create-and-approve-makers.d.ts +2 -0
- package/lib/types/src/create-and-approve-makers.d.ts.map +1 -0
- package/lib/types/src/create-maker.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -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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"}
|