@helium/helium-admin-cli 0.10.5 → 0.10.6
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/get-merkle-depths.js +114 -0
- package/lib/cjs/get-merkle-depths.js.map +1 -0
- package/lib/esm/src/get-merkle-depths.js +73 -0
- package/lib/esm/src/get-merkle-depths.js.map +1 -0
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/src/get-merkle-depths.d.ts +2 -0
- package/lib/types/src/get-merkle-depths.d.ts.map +1 -0
- package/package.json +13 -13
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.run = void 0;
|
|
39
|
+
const anchor = __importStar(require("@coral-xyz/anchor"));
|
|
40
|
+
const helium_entity_manager_sdk_1 = require("@helium/helium-entity-manager-sdk");
|
|
41
|
+
const mobile_entity_manager_sdk_1 = require("@helium/mobile-entity-manager-sdk");
|
|
42
|
+
const spl_account_compression_1 = require("@solana/spl-account-compression");
|
|
43
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
44
|
+
const os_1 = __importDefault(require("os"));
|
|
45
|
+
function run(args = process.argv) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const yarg = (0, yargs_1.default)(args).options({
|
|
48
|
+
wallet: {
|
|
49
|
+
alias: "k",
|
|
50
|
+
describe: "Anchor wallet keypair",
|
|
51
|
+
default: `${os_1.default.homedir()}/.config/solana/id.json`,
|
|
52
|
+
},
|
|
53
|
+
url: {
|
|
54
|
+
alias: "u",
|
|
55
|
+
default: "http://127.0.0.1:8899",
|
|
56
|
+
describe: "The solana url",
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const argv = yield yarg.argv;
|
|
60
|
+
process.env.ANCHOR_WALLET = argv.wallet;
|
|
61
|
+
process.env.ANCHOR_PROVIDER_URL = argv.url;
|
|
62
|
+
anchor.setProvider(anchor.AnchorProvider.local(argv.url));
|
|
63
|
+
const provider = anchor.getProvider();
|
|
64
|
+
const hemProgram = yield (0, helium_entity_manager_sdk_1.init)(provider);
|
|
65
|
+
const memProgram = yield (0, mobile_entity_manager_sdk_1.init)(provider);
|
|
66
|
+
// Get all MakerV0 accounts
|
|
67
|
+
const makers = yield hemProgram.account.makerV0.all();
|
|
68
|
+
// Get all carriers
|
|
69
|
+
const carriers = yield memProgram.account.carrierV0.all();
|
|
70
|
+
// Get data only config accounts
|
|
71
|
+
const dataOnlyConfigs = yield hemProgram.account.dataOnlyConfigV0.all();
|
|
72
|
+
const merkleDepths = {};
|
|
73
|
+
// Function to calculate merkle tree depth
|
|
74
|
+
const getMerkleTreeDepth = (account) => {
|
|
75
|
+
let offset = 0;
|
|
76
|
+
const buffer = account.data;
|
|
77
|
+
const [versionedHeader, offsetIncr] = spl_account_compression_1.concurrentMerkleTreeHeaderBeet.deserialize(buffer);
|
|
78
|
+
offset = offsetIncr;
|
|
79
|
+
// Only 1 version available
|
|
80
|
+
if (versionedHeader.header.__kind !== "V1") {
|
|
81
|
+
throw Error(`Header has unsupported version: ${versionedHeader.header.__kind}`);
|
|
82
|
+
}
|
|
83
|
+
const header = versionedHeader.header.fields[0];
|
|
84
|
+
const [_, offsetIncr2] = (0, spl_account_compression_1.concurrentMerkleTreeBeetFactory)(header.maxDepth, header.maxBufferSize).deserialize(buffer, offset);
|
|
85
|
+
offset = offsetIncr2;
|
|
86
|
+
return (0, spl_account_compression_1.getCanopyDepth)(buffer.byteLength - offset);
|
|
87
|
+
};
|
|
88
|
+
// Get depths for all maker merkle trees
|
|
89
|
+
for (const maker of makers) {
|
|
90
|
+
const merkleAccount = yield provider.connection.getAccountInfo(maker.account.merkleTree);
|
|
91
|
+
if (merkleAccount) {
|
|
92
|
+
merkleDepths[maker.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Get depths for all carrier merkle trees
|
|
96
|
+
for (const carrier of carriers) {
|
|
97
|
+
const merkleAccount = yield provider.connection.getAccountInfo(carrier.account.merkleTree);
|
|
98
|
+
if (merkleAccount) {
|
|
99
|
+
merkleDepths[carrier.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Get depths for all data only config merkle trees
|
|
103
|
+
for (const config of dataOnlyConfigs) {
|
|
104
|
+
const merkleAccount = yield provider.connection.getAccountInfo(config.account.merkleTree);
|
|
105
|
+
if (merkleAccount) {
|
|
106
|
+
merkleDepths[config.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Output results as JSON
|
|
110
|
+
console.log(JSON.stringify(merkleDepths, null, 2));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
exports.run = run;
|
|
114
|
+
//# sourceMappingURL=get-merkle-depths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-merkle-depths.js","sourceRoot":"","sources":["../../src/get-merkle-depths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA4C;AAG5C,iFAE2C;AAC3C,iFAE2C;AAC3C,6EAAsK;AAEtK,kDAA0B;AAC1B,4CAAoB;AAGpB,SAAsB,GAAG,CAAC,OAAY,OAAO,CAAC,IAAI;;QAChD,MAAM,IAAI,GAAG,IAAA,eAAK,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YAC/B,MAAM,EAAE;gBACN,KAAK,EAAE,GAAG;gBACV,QAAQ,EAAE,uBAAuB;gBACjC,OAAO,EAAE,GAAG,YAAE,CAAC,OAAO,EAAE,yBAAyB;aAClD;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,uBAAuB;gBAChC,QAAQ,EAAE,gBAAgB;aAC3B;SACF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAA2B,CAAC;QAE/D,MAAM,UAAU,GAAG,MAAM,IAAA,gCAAO,EAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,IAAA,gCAAO,EAAC,QAAQ,CAAC,CAAC;QAE3C,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEtD,mBAAmB;QACnB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAE1D,gCAAgC;QAChC,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAExE,MAAM,YAAY,GAA8B,EAAE,CAAC;QAEnD,0CAA0C;QAC1C,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAU,EAAE;YAClE,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAC5B,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,GACjC,wDAA8B,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACrD,MAAM,GAAG,UAAU,CAAC;YAEpB,2BAA2B;YAC3B,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gBAC1C,MAAM,KAAK,CACT,mCAAmC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CACnE,CAAC;aACH;YACD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,IAAA,yDAA+B,EACtD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,aAAa,CACrB,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9B,MAAM,GAAG,WAAW,CAAC;YAErB,OAAO,IAAA,wCAAc,EAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC;QAEF,wCAAwC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACzF,IAAI,aAAa,EAAE;gBACjB,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;aACvF;SACF;QAED,0CAA0C;QAC1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC3F,IAAI,aAAa,EAAE;gBACjB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;aACzF;SACF;QAED,mDAAmD;QACnD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE;YACpC,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1F,IAAI,aAAa,EAAE;gBACjB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;aACxF;SACF;QAED,yBAAyB;QACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;CAAA;AApFD,kBAoFC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as anchor from "@coral-xyz/anchor";
|
|
2
|
+
import { init as initHem } from "@helium/helium-entity-manager-sdk";
|
|
3
|
+
import { init as initMem } from "@helium/mobile-entity-manager-sdk";
|
|
4
|
+
import { concurrentMerkleTreeBeetFactory, concurrentMerkleTreeHeaderBeet, getCanopyDepth } from "@solana/spl-account-compression";
|
|
5
|
+
import yargs from "yargs";
|
|
6
|
+
import os from "os";
|
|
7
|
+
export async function run(args = process.argv) {
|
|
8
|
+
const yarg = yargs(args).options({
|
|
9
|
+
wallet: {
|
|
10
|
+
alias: "k",
|
|
11
|
+
describe: "Anchor wallet keypair",
|
|
12
|
+
default: `${os.homedir()}/.config/solana/id.json`,
|
|
13
|
+
},
|
|
14
|
+
url: {
|
|
15
|
+
alias: "u",
|
|
16
|
+
default: "http://127.0.0.1:8899",
|
|
17
|
+
describe: "The solana url",
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const argv = await yarg.argv;
|
|
21
|
+
process.env.ANCHOR_WALLET = argv.wallet;
|
|
22
|
+
process.env.ANCHOR_PROVIDER_URL = argv.url;
|
|
23
|
+
anchor.setProvider(anchor.AnchorProvider.local(argv.url));
|
|
24
|
+
const provider = anchor.getProvider();
|
|
25
|
+
const hemProgram = await initHem(provider);
|
|
26
|
+
const memProgram = await initMem(provider);
|
|
27
|
+
// Get all MakerV0 accounts
|
|
28
|
+
const makers = await hemProgram.account.makerV0.all();
|
|
29
|
+
// Get all carriers
|
|
30
|
+
const carriers = await memProgram.account.carrierV0.all();
|
|
31
|
+
// Get data only config accounts
|
|
32
|
+
const dataOnlyConfigs = await hemProgram.account.dataOnlyConfigV0.all();
|
|
33
|
+
const merkleDepths = {};
|
|
34
|
+
// Function to calculate merkle tree depth
|
|
35
|
+
const getMerkleTreeDepth = (account) => {
|
|
36
|
+
let offset = 0;
|
|
37
|
+
const buffer = account.data;
|
|
38
|
+
const [versionedHeader, offsetIncr] = concurrentMerkleTreeHeaderBeet.deserialize(buffer);
|
|
39
|
+
offset = offsetIncr;
|
|
40
|
+
// Only 1 version available
|
|
41
|
+
if (versionedHeader.header.__kind !== "V1") {
|
|
42
|
+
throw Error(`Header has unsupported version: ${versionedHeader.header.__kind}`);
|
|
43
|
+
}
|
|
44
|
+
const header = versionedHeader.header.fields[0];
|
|
45
|
+
const [_, offsetIncr2] = concurrentMerkleTreeBeetFactory(header.maxDepth, header.maxBufferSize).deserialize(buffer, offset);
|
|
46
|
+
offset = offsetIncr2;
|
|
47
|
+
return getCanopyDepth(buffer.byteLength - offset);
|
|
48
|
+
};
|
|
49
|
+
// Get depths for all maker merkle trees
|
|
50
|
+
for (const maker of makers) {
|
|
51
|
+
const merkleAccount = await provider.connection.getAccountInfo(maker.account.merkleTree);
|
|
52
|
+
if (merkleAccount) {
|
|
53
|
+
merkleDepths[maker.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Get depths for all carrier merkle trees
|
|
57
|
+
for (const carrier of carriers) {
|
|
58
|
+
const merkleAccount = await provider.connection.getAccountInfo(carrier.account.merkleTree);
|
|
59
|
+
if (merkleAccount) {
|
|
60
|
+
merkleDepths[carrier.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Get depths for all data only config merkle trees
|
|
64
|
+
for (const config of dataOnlyConfigs) {
|
|
65
|
+
const merkleAccount = await provider.connection.getAccountInfo(config.account.merkleTree);
|
|
66
|
+
if (merkleAccount) {
|
|
67
|
+
merkleDepths[config.account.merkleTree.toBase58()] = getMerkleTreeDepth(merkleAccount);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Output results as JSON
|
|
71
|
+
console.log(JSON.stringify(merkleDepths, null, 2));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=get-merkle-depths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-merkle-depths.js","sourceRoot":"","sources":["../../../src/get-merkle-depths.ts"],"names":[],"mappings":"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"}
|