@helium/helium-admin-cli 0.10.15 → 0.10.17
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-staked-wallets.js +119 -0
- package/lib/cjs/get-staked-wallets.js.map +1 -0
- package/lib/esm/src/get-staked-wallets.js +78 -0
- package/lib/esm/src/get-staked-wallets.js.map +1 -0
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/src/get-staked-wallets.d.ts +2 -0
- package/lib/types/src/get-staked-wallets.d.ts.map +1 -0
- package/package.json +13 -13
|
@@ -0,0 +1,119 @@
|
|
|
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 voter_stake_registry_sdk_1 = require("@helium/voter-stake-registry-sdk");
|
|
41
|
+
const os_1 = __importDefault(require("os"));
|
|
42
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
43
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
44
|
+
const fs_1 = __importDefault(require("fs"));
|
|
45
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
46
|
+
function run(args = process.argv) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
const yarg = (0, yargs_1.default)(args).options({
|
|
49
|
+
wallet: {
|
|
50
|
+
alias: "k",
|
|
51
|
+
describe: "Anchor wallet keypair",
|
|
52
|
+
default: `${os_1.default.homedir()}/.config/solana/id.json`,
|
|
53
|
+
},
|
|
54
|
+
url: {
|
|
55
|
+
alias: "u",
|
|
56
|
+
default: "http://127.0.0.1:8899",
|
|
57
|
+
describe: "The solana url",
|
|
58
|
+
},
|
|
59
|
+
output: {
|
|
60
|
+
alias: "o",
|
|
61
|
+
describe: "Output file path for staked wallets",
|
|
62
|
+
type: "string",
|
|
63
|
+
demandOption: true,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const argv = yield yarg.argv;
|
|
67
|
+
process.env.ANCHOR_WALLET = argv.wallet;
|
|
68
|
+
process.env.ANCHOR_PROVIDER_URL = argv.url;
|
|
69
|
+
anchor.setProvider(anchor.AnchorProvider.local(argv.url));
|
|
70
|
+
const provider = anchor.getProvider();
|
|
71
|
+
const connection = new web3_js_1.Connection(argv.url);
|
|
72
|
+
console.log("Initializing VSR program...");
|
|
73
|
+
const vsrProgram = yield (0, voter_stake_registry_sdk_1.init)(provider);
|
|
74
|
+
console.log("Fetching all positions...");
|
|
75
|
+
const positions = yield vsrProgram.account.positionV0.all();
|
|
76
|
+
console.log(`Found ${positions.length} total positions`);
|
|
77
|
+
// Get unique mints from positions
|
|
78
|
+
const mints = [...new Set(positions.filter(p => p.account.lockup.kind.constant || p.account.lockup.endTs.gte(new anchor.BN(Date.now() / 1000))).map(p => p.account.mint.toString()))];
|
|
79
|
+
console.log(`Found ${mints.length} unique mints to process`);
|
|
80
|
+
// Get token accounts for each mint and extract owner addresses
|
|
81
|
+
const stakedWallets = new Set();
|
|
82
|
+
const batchSize = 10;
|
|
83
|
+
// Process mints in batches of batchSize
|
|
84
|
+
for (let i = 0; i < mints.length; i += batchSize) {
|
|
85
|
+
const mintBatch = mints.slice(i, i + batchSize);
|
|
86
|
+
const tokenAccountsPromises = mintBatch.map(mint => connection.getTokenLargestAccounts(new web3_js_1.PublicKey(mint)));
|
|
87
|
+
const tokenAccountsResults = yield Promise.all(tokenAccountsPromises);
|
|
88
|
+
// Collect all token account addresses
|
|
89
|
+
const tokenAccountAddresses = [];
|
|
90
|
+
tokenAccountsResults.forEach(result => {
|
|
91
|
+
result.value.forEach(account => {
|
|
92
|
+
tokenAccountAddresses.push(account.address);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
// Fetch all token accounts in one batch
|
|
96
|
+
const tokenAccountsInfo = yield connection.getMultipleAccountsInfo(tokenAccountAddresses);
|
|
97
|
+
// Parse token accounts and extract owners
|
|
98
|
+
tokenAccountsInfo.forEach((accountInfo, index) => {
|
|
99
|
+
if (accountInfo) {
|
|
100
|
+
try {
|
|
101
|
+
const tokenAccount = spl_token_1.AccountLayout.decode(accountInfo.data);
|
|
102
|
+
stakedWallets.add(tokenAccount.owner.toString());
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
console.error(`Failed to parse token account at index ${index}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
console.log(`Processed ${i / batchSize} of ${mints.length / batchSize} batches`);
|
|
110
|
+
}
|
|
111
|
+
// Convert Set to Array and write to file
|
|
112
|
+
const stakedWalletsArray = Array.from(stakedWallets);
|
|
113
|
+
console.log(`\nWriting ${stakedWalletsArray.length} unique staked wallets to ${argv.output}`);
|
|
114
|
+
fs_1.default.writeFileSync(argv.output, JSON.stringify(stakedWalletsArray, null, 2));
|
|
115
|
+
console.log("Done!");
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
exports.run = run;
|
|
119
|
+
//# sourceMappingURL=get-staked-wallets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-staked-wallets.js","sourceRoot":"","sources":["../../src/get-staked-wallets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as anchor from "@coral-xyz/anchor";
|
|
2
|
+
import { init as initVsr } from "@helium/voter-stake-registry-sdk";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import yargs from "yargs";
|
|
5
|
+
import { Connection, PublicKey } from "@solana/web3.js";
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import { AccountLayout } from "@solana/spl-token";
|
|
8
|
+
export async function run(args = process.argv) {
|
|
9
|
+
const yarg = yargs(args).options({
|
|
10
|
+
wallet: {
|
|
11
|
+
alias: "k",
|
|
12
|
+
describe: "Anchor wallet keypair",
|
|
13
|
+
default: `${os.homedir()}/.config/solana/id.json`,
|
|
14
|
+
},
|
|
15
|
+
url: {
|
|
16
|
+
alias: "u",
|
|
17
|
+
default: "http://127.0.0.1:8899",
|
|
18
|
+
describe: "The solana url",
|
|
19
|
+
},
|
|
20
|
+
output: {
|
|
21
|
+
alias: "o",
|
|
22
|
+
describe: "Output file path for staked wallets",
|
|
23
|
+
type: "string",
|
|
24
|
+
demandOption: true,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const argv = await yarg.argv;
|
|
28
|
+
process.env.ANCHOR_WALLET = argv.wallet;
|
|
29
|
+
process.env.ANCHOR_PROVIDER_URL = argv.url;
|
|
30
|
+
anchor.setProvider(anchor.AnchorProvider.local(argv.url));
|
|
31
|
+
const provider = anchor.getProvider();
|
|
32
|
+
const connection = new Connection(argv.url);
|
|
33
|
+
console.log("Initializing VSR program...");
|
|
34
|
+
const vsrProgram = await initVsr(provider);
|
|
35
|
+
console.log("Fetching all positions...");
|
|
36
|
+
const positions = await vsrProgram.account.positionV0.all();
|
|
37
|
+
console.log(`Found ${positions.length} total positions`);
|
|
38
|
+
// Get unique mints from positions
|
|
39
|
+
const mints = [...new Set(positions.filter(p => p.account.lockup.kind.constant || p.account.lockup.endTs.gte(new anchor.BN(Date.now() / 1000))).map(p => p.account.mint.toString()))];
|
|
40
|
+
console.log(`Found ${mints.length} unique mints to process`);
|
|
41
|
+
// Get token accounts for each mint and extract owner addresses
|
|
42
|
+
const stakedWallets = new Set();
|
|
43
|
+
const batchSize = 10;
|
|
44
|
+
// Process mints in batches of batchSize
|
|
45
|
+
for (let i = 0; i < mints.length; i += batchSize) {
|
|
46
|
+
const mintBatch = mints.slice(i, i + batchSize);
|
|
47
|
+
const tokenAccountsPromises = mintBatch.map(mint => connection.getTokenLargestAccounts(new PublicKey(mint)));
|
|
48
|
+
const tokenAccountsResults = await Promise.all(tokenAccountsPromises);
|
|
49
|
+
// Collect all token account addresses
|
|
50
|
+
const tokenAccountAddresses = [];
|
|
51
|
+
tokenAccountsResults.forEach(result => {
|
|
52
|
+
result.value.forEach(account => {
|
|
53
|
+
tokenAccountAddresses.push(account.address);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// Fetch all token accounts in one batch
|
|
57
|
+
const tokenAccountsInfo = await connection.getMultipleAccountsInfo(tokenAccountAddresses);
|
|
58
|
+
// Parse token accounts and extract owners
|
|
59
|
+
tokenAccountsInfo.forEach((accountInfo, index) => {
|
|
60
|
+
if (accountInfo) {
|
|
61
|
+
try {
|
|
62
|
+
const tokenAccount = AccountLayout.decode(accountInfo.data);
|
|
63
|
+
stakedWallets.add(tokenAccount.owner.toString());
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
console.error(`Failed to parse token account at index ${index}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
console.log(`Processed ${i / batchSize} of ${mints.length / batchSize} batches`);
|
|
71
|
+
}
|
|
72
|
+
// Convert Set to Array and write to file
|
|
73
|
+
const stakedWalletsArray = Array.from(stakedWallets);
|
|
74
|
+
console.log(`\nWriting ${stakedWalletsArray.length} unique staked wallets to ${argv.output}`);
|
|
75
|
+
fs.writeFileSync(argv.output, JSON.stringify(stakedWalletsArray, null, 2));
|
|
76
|
+
console.log("Done!");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=get-staked-wallets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-staked-wallets.js","sourceRoot":"","sources":["../../../src/get-staked-wallets.ts"],"names":[],"mappings":"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"}
|