@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.
- package/lib/cjs/add-expiration-to-delegations.js +52 -26
- package/lib/cjs/add-expiration-to-delegations.js.map +1 -1
- package/lib/cjs/backfill-vote-markers.js +189 -0
- package/lib/cjs/backfill-vote-markers.js.map +1 -0
- package/lib/cjs/dump-vote-markers.js +304 -0
- package/lib/cjs/dump-vote-markers.js.map +1 -0
- package/lib/cjs/release-iot-mobile-positions.js +91 -0
- package/lib/cjs/release-iot-mobile-positions.js.map +1 -0
- package/lib/esm/src/add-expiration-to-delegations.js +53 -27
- package/lib/esm/src/add-expiration-to-delegations.js.map +1 -1
- package/lib/esm/src/backfill-vote-markers.js +148 -0
- package/lib/esm/src/backfill-vote-markers.js.map +1 -0
- package/lib/esm/src/dump-vote-markers.js +256 -0
- package/lib/esm/src/dump-vote-markers.js.map +1 -0
- package/lib/esm/src/release-iot-mobile-positions.js +50 -0
- package/lib/esm/src/release-iot-mobile-positions.js.map +1 -0
- package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/src/add-expiration-to-delegations.d.ts.map +1 -1
- package/lib/types/src/backfill-vote-markers.d.ts +2 -0
- package/lib/types/src/backfill-vote-markers.d.ts.map +1 -0
- package/lib/types/src/dump-vote-markers.d.ts +2 -0
- package/lib/types/src/dump-vote-markers.d.ts.map +1 -0
- package/lib/types/src/release-iot-mobile-positions.d.ts +2 -0
- package/lib/types/src/release-iot-mobile-positions.d.ts.map +1 -0
- package/package.json +14 -13
|
@@ -83,39 +83,65 @@ function run(args = process.argv) {
|
|
|
83
83
|
const instructions = [];
|
|
84
84
|
const delegations = yield hsdProgram.account.delegatedPositionV0.all();
|
|
85
85
|
const needsMigration = delegations.filter(d => d.account.expirationTs.isZero());
|
|
86
|
-
const positionKeys = needsMigration.map(d => d.account.position);
|
|
87
|
-
const coder =
|
|
86
|
+
const positionKeys = needsMigration.map((d) => d.account.position);
|
|
87
|
+
const coder = vsrProgram.coder.accounts;
|
|
88
88
|
const positionAccs = (yield getMultipleAccounts({
|
|
89
89
|
connection: provider.connection,
|
|
90
90
|
keys: positionKeys,
|
|
91
|
-
})).map(a => coder.decode("
|
|
91
|
+
})).map((a) => a ? coder.decode("PositionV0", a.data) : null);
|
|
92
92
|
const currTs = yield getSolanaUnixTimestamp(provider);
|
|
93
93
|
const currTsBN = new anchor.BN(currTs.toString());
|
|
94
|
-
const proxyEndTs = (_a = proxyConfig.seasons
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
94
|
+
const proxyEndTs = (_a = proxyConfig.seasons
|
|
95
|
+
.reverse()
|
|
96
|
+
.find((s) => currTsBN.gte(s.start))) === null || _a === void 0 ? void 0 : _a.end;
|
|
97
|
+
console.log(`Processing ${needsMigration.length} delegations`);
|
|
98
|
+
// Process in batches of 10
|
|
99
|
+
const batchSize = 10;
|
|
100
|
+
for (let i = 0; i < needsMigration.length; i += batchSize) {
|
|
101
|
+
// Log progress every 100 positions
|
|
102
|
+
if (i > 0 && i % 100 === 0) {
|
|
103
|
+
console.log(`Processed ${i} delegations`);
|
|
104
|
+
}
|
|
105
|
+
const batch = needsMigration.slice(i, i + batchSize);
|
|
106
|
+
const batchPositions = positionAccs.slice(i, i + batchSize);
|
|
107
|
+
yield Promise.all(batch.map((delegation, j) => __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const position = batchPositions[j];
|
|
109
|
+
if (!position) {
|
|
110
|
+
console.log(`Position not found for ${delegation.account.position.toBase58()}`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const subDao = delegation.account.subDao;
|
|
114
|
+
const positionTokenAccount = (yield provider.connection.getTokenLargestAccounts(position.mint)).value[0].address;
|
|
115
|
+
instructions.push(yield hsdProgram.methods
|
|
116
|
+
.extendExpirationTsV0()
|
|
117
|
+
.accountsStrict({
|
|
118
|
+
payer: wallet.publicKey,
|
|
119
|
+
position: delegation.account.position,
|
|
120
|
+
delegatedPosition: delegation.publicKey,
|
|
121
|
+
registrar: registrarK,
|
|
122
|
+
mint: position.mint,
|
|
123
|
+
authority: wallet.publicKey,
|
|
124
|
+
positionTokenAccount,
|
|
125
|
+
dao,
|
|
126
|
+
subDao: delegation.account.subDao,
|
|
127
|
+
oldClosingTimeSubDaoEpochInfo: (0, helium_sub_daos_sdk_1.subDaoEpochInfoKey)(subDao, delegation.account.expirationTs.isZero()
|
|
128
|
+
? position.lockup.endTs
|
|
129
|
+
: (0, bn_js_1.min)(position.lockup.endTs, delegation.account.expirationTs))[0],
|
|
130
|
+
closingTimeSubDaoEpochInfo: (0, helium_sub_daos_sdk_1.subDaoEpochInfoKey)(subDao, (0, bn_js_1.min)(position.lockup.endTs, proxyEndTs))[0],
|
|
131
|
+
genesisEndSubDaoEpochInfo: (0, helium_sub_daos_sdk_1.subDaoEpochInfoKey)(subDao, position.genesisEnd.lt(currTsBN) ?
|
|
132
|
+
(0, bn_js_1.min)(position.lockup.endTs, proxyEndTs) : position.genesisEnd)[0],
|
|
133
|
+
proxyConfig: registrar.proxyConfig,
|
|
134
|
+
systemProgram: web3_js_1.SystemProgram.programId,
|
|
135
|
+
})
|
|
136
|
+
.instruction());
|
|
137
|
+
})));
|
|
113
138
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
139
|
+
console.log(`Finished processing ${needsMigration.length} delegations`);
|
|
140
|
+
const transactions = yield (0, spl_utils_1.batchInstructionsToTxsWithPriorityFee)(provider, instructions, {
|
|
141
|
+
useFirstEstimateForAll: true,
|
|
142
|
+
computeUnitLimit: 400000,
|
|
118
143
|
});
|
|
144
|
+
yield (0, spl_utils_1.bulkSendTransactions)(provider, transactions, console.log, 10, [], 100);
|
|
119
145
|
});
|
|
120
146
|
}
|
|
121
147
|
exports.run = run;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-expiration-to-delegations.js","sourceRoot":"","sources":["../../src/add-expiration-to-delegations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA4C;AAC5C,qEAA0F;AAC1F,yDAA0D;AAC1D,
|
|
1
|
+
{"version":3,"file":"add-expiration-to-delegations.js","sourceRoot":"","sources":["../../src/add-expiration-to-delegations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
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 aws_sdk_1 = __importDefault(require("aws-sdk"));
|
|
40
|
+
const fs_1 = __importDefault(require("fs"));
|
|
41
|
+
const pg = __importStar(require("pg"));
|
|
42
|
+
const sequelize_1 = require("sequelize");
|
|
43
|
+
const yargs_1 = __importDefault(require("yargs/yargs"));
|
|
44
|
+
function run(args = process.argv) {
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const yarg = (0, yargs_1.default)(args).options({
|
|
47
|
+
outputPath: {
|
|
48
|
+
type: "string",
|
|
49
|
+
describe: "The path to the output file",
|
|
50
|
+
default: "vote-markers.json",
|
|
51
|
+
},
|
|
52
|
+
pgUser: {
|
|
53
|
+
default: "postgres",
|
|
54
|
+
},
|
|
55
|
+
pgPassword: {
|
|
56
|
+
type: "string",
|
|
57
|
+
},
|
|
58
|
+
pgDatabase: {
|
|
59
|
+
type: "string",
|
|
60
|
+
},
|
|
61
|
+
pgHost: {
|
|
62
|
+
default: "localhost",
|
|
63
|
+
},
|
|
64
|
+
pgPort: {
|
|
65
|
+
default: "5432",
|
|
66
|
+
},
|
|
67
|
+
awsRegion: {
|
|
68
|
+
default: "us-east-1",
|
|
69
|
+
},
|
|
70
|
+
noSsl: {
|
|
71
|
+
type: "boolean",
|
|
72
|
+
default: false,
|
|
73
|
+
},
|
|
74
|
+
voteMarkerJson: {
|
|
75
|
+
type: "string",
|
|
76
|
+
describe: "The path to the vote marker json file",
|
|
77
|
+
required: true,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
const argv = yield yarg.argv;
|
|
81
|
+
const voteMarkers = JSON.parse(fs_1.default.readFileSync(argv.voteMarkerJson, "utf8"));
|
|
82
|
+
const host = argv.pgHost;
|
|
83
|
+
const port = Number(argv.pgPort);
|
|
84
|
+
const database = new sequelize_1.Sequelize({
|
|
85
|
+
host,
|
|
86
|
+
dialect: "postgres",
|
|
87
|
+
port,
|
|
88
|
+
logging: false,
|
|
89
|
+
dialectModule: pg,
|
|
90
|
+
username: argv.pgUser,
|
|
91
|
+
database: argv.pgDatabase,
|
|
92
|
+
pool: {
|
|
93
|
+
max: 10,
|
|
94
|
+
min: 5,
|
|
95
|
+
acquire: 60000,
|
|
96
|
+
idle: 10000,
|
|
97
|
+
validate: (client) => {
|
|
98
|
+
try {
|
|
99
|
+
client.query("SELECT 1");
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
hooks: {
|
|
108
|
+
beforeConnect: (config) => __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
const isRds = host.includes("rds.amazonaws.com");
|
|
110
|
+
let password = argv.pgPassword;
|
|
111
|
+
if (isRds && !password) {
|
|
112
|
+
const signer = new aws_sdk_1.default.RDS.Signer({
|
|
113
|
+
region: process.env.AWS_REGION,
|
|
114
|
+
hostname: process.env.PGHOST,
|
|
115
|
+
port,
|
|
116
|
+
username: process.env.PGUSER,
|
|
117
|
+
});
|
|
118
|
+
password = yield new Promise((resolve, reject) => signer.getAuthToken({}, (err, token) => {
|
|
119
|
+
if (err) {
|
|
120
|
+
return reject(err);
|
|
121
|
+
}
|
|
122
|
+
resolve(token);
|
|
123
|
+
}));
|
|
124
|
+
config.dialectOptions = {
|
|
125
|
+
ssl: {
|
|
126
|
+
require: false,
|
|
127
|
+
rejectUnauthorized: false,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
config.password = password;
|
|
132
|
+
}),
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
class VoteMarker extends sequelize_1.Model {
|
|
136
|
+
}
|
|
137
|
+
VoteMarker.init({
|
|
138
|
+
address: {
|
|
139
|
+
type: sequelize_1.STRING,
|
|
140
|
+
primaryKey: true,
|
|
141
|
+
},
|
|
142
|
+
voter: {
|
|
143
|
+
type: sequelize_1.STRING,
|
|
144
|
+
primaryKey: true,
|
|
145
|
+
},
|
|
146
|
+
registrar: {
|
|
147
|
+
type: sequelize_1.STRING,
|
|
148
|
+
primaryKey: true,
|
|
149
|
+
},
|
|
150
|
+
proposal: {
|
|
151
|
+
type: sequelize_1.STRING,
|
|
152
|
+
primaryKey: true,
|
|
153
|
+
},
|
|
154
|
+
mint: {
|
|
155
|
+
type: sequelize_1.STRING,
|
|
156
|
+
primaryKey: true,
|
|
157
|
+
},
|
|
158
|
+
choices: {
|
|
159
|
+
type: (0, sequelize_1.ARRAY)(sequelize_1.INTEGER),
|
|
160
|
+
},
|
|
161
|
+
weight: {
|
|
162
|
+
type: sequelize_1.DECIMAL.UNSIGNED,
|
|
163
|
+
},
|
|
164
|
+
bumpSeed: {
|
|
165
|
+
type: sequelize_1.INTEGER,
|
|
166
|
+
},
|
|
167
|
+
deprecatedRelinquished: {
|
|
168
|
+
type: sequelize_1.BOOLEAN,
|
|
169
|
+
},
|
|
170
|
+
proxyIndex: {
|
|
171
|
+
type: sequelize_1.INTEGER,
|
|
172
|
+
},
|
|
173
|
+
rentRefund: {
|
|
174
|
+
type: sequelize_1.STRING,
|
|
175
|
+
},
|
|
176
|
+
}, {
|
|
177
|
+
sequelize: database,
|
|
178
|
+
modelName: "vote_marker",
|
|
179
|
+
tableName: "vote_markers",
|
|
180
|
+
underscored: true,
|
|
181
|
+
updatedAt: false,
|
|
182
|
+
});
|
|
183
|
+
yield VoteMarker.bulkCreate(voteMarkers, {
|
|
184
|
+
ignoreDuplicates: true, // ON CONFLICT DO NOTHING
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
exports.run = run;
|
|
189
|
+
//# sourceMappingURL=backfill-vote-markers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill-vote-markers.js","sourceRoot":"","sources":["../../src/backfill-vote-markers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,304 @@
|
|
|
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 organization_sdk_1 = require("@helium/organization-sdk");
|
|
41
|
+
const proposal_sdk_1 = require("@helium/proposal-sdk");
|
|
42
|
+
const voter_stake_registry_sdk_1 = require("@helium/voter-stake-registry-sdk");
|
|
43
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
44
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
45
|
+
const os_1 = __importDefault(require("os"));
|
|
46
|
+
const yargs_1 = __importDefault(require("yargs/yargs"));
|
|
47
|
+
const utils_1 = require("./utils");
|
|
48
|
+
function run(args = process.argv) {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const yarg = (0, yargs_1.default)(args).options({
|
|
52
|
+
wallet: {
|
|
53
|
+
alias: "k",
|
|
54
|
+
describe: "Anchor wallet keypair",
|
|
55
|
+
default: `${os_1.default.homedir()}/.config/solana/id.json`,
|
|
56
|
+
},
|
|
57
|
+
url: {
|
|
58
|
+
alias: "u",
|
|
59
|
+
default: "http://127.0.0.1:8899",
|
|
60
|
+
describe: "The solana url",
|
|
61
|
+
},
|
|
62
|
+
outputPath: {
|
|
63
|
+
type: "string",
|
|
64
|
+
describe: "The path to the output file",
|
|
65
|
+
default: "vote-markers.json",
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
const argv = yield yarg.argv;
|
|
69
|
+
process.env.ANCHOR_WALLET = argv.wallet;
|
|
70
|
+
process.env.ANCHOR_PROVIDER_URL = argv.url;
|
|
71
|
+
anchor.setProvider(anchor.AnchorProvider.local(argv.url));
|
|
72
|
+
const provider = anchor.getProvider();
|
|
73
|
+
const wallet = new anchor.Wallet((0, utils_1.loadKeypair)(argv.wallet));
|
|
74
|
+
const hvsrProgram = yield (0, voter_stake_registry_sdk_1.init)(provider);
|
|
75
|
+
const proposalProgram = yield (0, proposal_sdk_1.init)(provider);
|
|
76
|
+
let myOrgs = new Set([
|
|
77
|
+
(0, organization_sdk_1.organizationKey)("Helium")[0],
|
|
78
|
+
(0, organization_sdk_1.organizationKey)("Helium MOBILE")[0],
|
|
79
|
+
(0, organization_sdk_1.organizationKey)("Helium IOT")[0],
|
|
80
|
+
].map(k => k.toBase58()));
|
|
81
|
+
const proposals = (yield proposalProgram.account.proposalV0.all()).filter(p => myOrgs.has(p.account.namespace.toBase58()));
|
|
82
|
+
// Track votes in a map: proposalKey -> voter marker id --> VoteMarkerV0
|
|
83
|
+
const votesByProposal = new Map();
|
|
84
|
+
for (const proposal of proposals) {
|
|
85
|
+
votesByProposal.set(proposal.publicKey.toBase58(), new Map());
|
|
86
|
+
}
|
|
87
|
+
// Add position cache
|
|
88
|
+
const positionCache = new Map();
|
|
89
|
+
for (const proposal of proposals) {
|
|
90
|
+
console.log(`Getting vote markers for ${proposal.publicKey.toBase58()}`);
|
|
91
|
+
let signatures = [];
|
|
92
|
+
let lastSig = undefined;
|
|
93
|
+
// // Keep fetching until we get all signatures
|
|
94
|
+
while (true) {
|
|
95
|
+
const sigs = yield provider.connection.getSignaturesForAddress(proposal.publicKey, { before: lastSig, limit: 1000 }, "confirmed");
|
|
96
|
+
if (sigs.length === 0)
|
|
97
|
+
break;
|
|
98
|
+
signatures.push(...sigs);
|
|
99
|
+
lastSig = sigs[sigs.length - 1].signature;
|
|
100
|
+
// If we got less than 1000, we've hit the end
|
|
101
|
+
if (sigs.length < 1000)
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
console.log("signatures", signatures.length);
|
|
105
|
+
const hvsrCoder = new anchor.BorshInstructionCoder(hvsrProgram.idl);
|
|
106
|
+
const proposalCoder = new anchor.BorshInstructionCoder(proposalProgram.idl);
|
|
107
|
+
// Process signatures in chunks of 100
|
|
108
|
+
const chunkSize = 100;
|
|
109
|
+
signatures = signatures.reverse();
|
|
110
|
+
for (let i = 0; i < signatures.length; i += chunkSize) {
|
|
111
|
+
const chunk = signatures.slice(i, i + chunkSize);
|
|
112
|
+
const txs = yield provider.connection.getTransactions(chunk.map(sig => sig.signature), { maxSupportedTransactionVersion: 0, commitment: "confirmed" });
|
|
113
|
+
for (const tx of txs) {
|
|
114
|
+
if (!(tx === null || tx === void 0 ? void 0 : tx.meta) || tx.meta.err)
|
|
115
|
+
continue;
|
|
116
|
+
let message = tx.transaction.message;
|
|
117
|
+
let index = -1;
|
|
118
|
+
for (const ix of message.compiledInstructions) {
|
|
119
|
+
index++;
|
|
120
|
+
try {
|
|
121
|
+
// Check if instruction is from VSR program
|
|
122
|
+
if (message.staticAccountKeys[ix.programIdIndex].toBase58() !== hvsrProgram.programId.toBase58())
|
|
123
|
+
continue;
|
|
124
|
+
let decoded = hvsrCoder.decode(Buffer.from(ix.data));
|
|
125
|
+
if (!decoded)
|
|
126
|
+
continue;
|
|
127
|
+
let formatted = hvsrCoder.format(decoded, ix.accountKeyIndexes.map(i => {
|
|
128
|
+
return {
|
|
129
|
+
pubkey: message.staticAccountKeys[i] || web3_js_1.PublicKey.default,
|
|
130
|
+
isSigner: false,
|
|
131
|
+
isWritable: false,
|
|
132
|
+
};
|
|
133
|
+
}));
|
|
134
|
+
if (!formatted)
|
|
135
|
+
continue;
|
|
136
|
+
// Handle vote instruction
|
|
137
|
+
if (decoded.name === "voteV0") {
|
|
138
|
+
const voter = (_a = formatted.accounts.find((acc) => acc.name === "Voter")) === null || _a === void 0 ? void 0 : _a.pubkey;
|
|
139
|
+
const registrar = (_b = formatted.accounts.find((acc) => acc.name === "Registrar")) === null || _b === void 0 ? void 0 : _b.pubkey;
|
|
140
|
+
const mint = (_c = formatted.accounts.find((acc) => acc.name === "Mint")) === null || _c === void 0 ? void 0 : _c.pubkey;
|
|
141
|
+
const proposal = (_d = formatted.accounts.find((acc) => acc.name === "Proposal")) === null || _d === void 0 ? void 0 : _d.pubkey;
|
|
142
|
+
const marker = (_e = formatted.accounts.find((acc) => acc.name === "Marker")) === null || _e === void 0 ? void 0 : _e.pubkey;
|
|
143
|
+
const innerIxs = (_f = tx.meta.innerInstructions) === null || _f === void 0 ? void 0 : _f.find((ix) => ix.index === index);
|
|
144
|
+
const innerVoteIx = innerIxs === null || innerIxs === void 0 ? void 0 : innerIxs.instructions.find((ix) => {
|
|
145
|
+
var _a;
|
|
146
|
+
return ((_a = message.staticAccountKeys[ix.programIdIndex]) === null || _a === void 0 ? void 0 : _a.toBase58()) ===
|
|
147
|
+
proposalProgram.programId.toBase58();
|
|
148
|
+
});
|
|
149
|
+
const innerVoteDecoded = proposalCoder.decode(Buffer.from(bs58_1.default.decode((innerVoteIx === null || innerVoteIx === void 0 ? void 0 : innerVoteIx.data) || "")));
|
|
150
|
+
if (!innerVoteDecoded) {
|
|
151
|
+
console.log("innerVoteDecoded missing", index, tx.meta.innerInstructions, innerVoteIx, innerIxs, chunk);
|
|
152
|
+
}
|
|
153
|
+
;
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
let { weight, choice } = innerVoteDecoded.data.args;
|
|
156
|
+
let propMap = votesByProposal.get(proposal.toBase58());
|
|
157
|
+
let voteMarker = propMap.get(marker.toBase58());
|
|
158
|
+
if (!voteMarker) {
|
|
159
|
+
voteMarker = {
|
|
160
|
+
address: marker,
|
|
161
|
+
voter,
|
|
162
|
+
registrar,
|
|
163
|
+
proposal,
|
|
164
|
+
mint,
|
|
165
|
+
// @ts-ignore
|
|
166
|
+
choices: [choice],
|
|
167
|
+
weight: weight,
|
|
168
|
+
bumpSeed: 0,
|
|
169
|
+
deprecatedRelinquished: false,
|
|
170
|
+
proxyIndex: 0,
|
|
171
|
+
rentRefund: web3_js_1.PublicKey.default,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
if (!voteMarker.choices.some((c) => c === choice)) {
|
|
175
|
+
voteMarker.choices.push(choice);
|
|
176
|
+
}
|
|
177
|
+
if (!voteMarker.weight.eq(weight)) {
|
|
178
|
+
voteMarker.weight = weight;
|
|
179
|
+
}
|
|
180
|
+
propMap.set(marker.toBase58(), voteMarker);
|
|
181
|
+
}
|
|
182
|
+
else if (decoded.name === "proxiedVoteV0") {
|
|
183
|
+
const voter = (_g = formatted.accounts.find((acc) => acc.name === "Voter")) === null || _g === void 0 ? void 0 : _g.pubkey;
|
|
184
|
+
const position = (_h = formatted.accounts.find((acc) => acc.name === "Position")) === null || _h === void 0 ? void 0 : _h.pubkey;
|
|
185
|
+
const registrar = (_j = formatted.accounts.find((acc) => acc.name === "Registrar")) === null || _j === void 0 ? void 0 : _j.pubkey;
|
|
186
|
+
const proposal = (_k = formatted.accounts.find((acc) => acc.name === "Proposal")) === null || _k === void 0 ? void 0 : _k.pubkey;
|
|
187
|
+
const marker = (_l = formatted.accounts.find((acc) => acc.name === "Marker")) === null || _l === void 0 ? void 0 : _l.pubkey;
|
|
188
|
+
// Use cache for position lookup
|
|
189
|
+
let mint;
|
|
190
|
+
if (position) {
|
|
191
|
+
const positionKey = position.toBase58();
|
|
192
|
+
if (!positionCache.has(positionKey)) {
|
|
193
|
+
const posData = yield hvsrProgram.account.positionV0.fetchNullable(position);
|
|
194
|
+
positionCache.set(positionKey, { mint: (posData === null || posData === void 0 ? void 0 : posData.mint) || web3_js_1.PublicKey.default });
|
|
195
|
+
}
|
|
196
|
+
mint = positionCache.get(positionKey).mint;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
mint = web3_js_1.PublicKey.default;
|
|
200
|
+
}
|
|
201
|
+
const innerIxs = (_m = tx.meta.innerInstructions) === null || _m === void 0 ? void 0 : _m.find((ix) => ix.index === index);
|
|
202
|
+
const innerVoteIx = innerIxs === null || innerIxs === void 0 ? void 0 : innerIxs.instructions.find((ix) => {
|
|
203
|
+
var _a;
|
|
204
|
+
return ((_a = message.staticAccountKeys[ix.programIdIndex]) === null || _a === void 0 ? void 0 : _a.toBase58()) ===
|
|
205
|
+
proposalProgram.programId.toBase58();
|
|
206
|
+
});
|
|
207
|
+
const innerVoteDecoded = proposalCoder.decode(Buffer.from(bs58_1.default.decode((innerVoteIx === null || innerVoteIx === void 0 ? void 0 : innerVoteIx.data) || "")));
|
|
208
|
+
if (!innerVoteDecoded) {
|
|
209
|
+
console.log("innerVoteDecoded missing", index, tx.meta.innerInstructions, innerVoteIx, innerIxs, chunk);
|
|
210
|
+
}
|
|
211
|
+
// @ts-ignore
|
|
212
|
+
let { weight, choice } = innerVoteDecoded.data.args;
|
|
213
|
+
let propMap = votesByProposal.get(proposal.toBase58());
|
|
214
|
+
let voteMarker = propMap.get(marker.toBase58());
|
|
215
|
+
if (!voteMarker) {
|
|
216
|
+
voteMarker = {
|
|
217
|
+
address: marker,
|
|
218
|
+
voter,
|
|
219
|
+
registrar,
|
|
220
|
+
proposal,
|
|
221
|
+
mint,
|
|
222
|
+
// @ts-ignore
|
|
223
|
+
choices: [choice],
|
|
224
|
+
weight,
|
|
225
|
+
bumpSeed: 0,
|
|
226
|
+
deprecatedRelinquished: false,
|
|
227
|
+
proxyIndex: 0,
|
|
228
|
+
rentRefund: web3_js_1.PublicKey.default,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (!voteMarker.choices.some((c) => c === choice)) {
|
|
232
|
+
voteMarker.choices.push(choice);
|
|
233
|
+
}
|
|
234
|
+
if (!voteMarker.weight.eq(weight)) {
|
|
235
|
+
voteMarker.weight = weight;
|
|
236
|
+
}
|
|
237
|
+
propMap.set(marker.toBase58(), voteMarker);
|
|
238
|
+
}
|
|
239
|
+
else if (decoded.name === "relinquishVoteV1" || decoded.name === "proxiedRelinquishVoteV0") {
|
|
240
|
+
const firstIsSigner = message.isAccountSigner(ix.accountKeyIndexes[0]);
|
|
241
|
+
// HACK: At some point we removed rent refund as first account and made it the last account.
|
|
242
|
+
if (firstIsSigner && decoded.name === "relinquishVoteV1") {
|
|
243
|
+
const len = ix.accountKeyIndexes.length;
|
|
244
|
+
let refund = ix.accountKeyIndexes.shift();
|
|
245
|
+
if (len != 12) { // super legacy
|
|
246
|
+
ix.accountKeyIndexes.push(refund);
|
|
247
|
+
}
|
|
248
|
+
decoded = hvsrCoder.decode(Buffer.from(ix.data));
|
|
249
|
+
formatted = hvsrCoder.format(decoded, ix.accountKeyIndexes.map((i) => {
|
|
250
|
+
return {
|
|
251
|
+
pubkey: message.staticAccountKeys[i] || web3_js_1.PublicKey.default,
|
|
252
|
+
isSigner: false,
|
|
253
|
+
isWritable: false,
|
|
254
|
+
};
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
const marker = (_o = formatted.accounts.find((acc) => acc.name === "Marker")) === null || _o === void 0 ? void 0 : _o.pubkey;
|
|
258
|
+
const proposal = (_p = formatted.accounts.find((acc) => acc.name === "Proposal")) === null || _p === void 0 ? void 0 : _p.pubkey;
|
|
259
|
+
const propMap = votesByProposal.get(proposal.toBase58());
|
|
260
|
+
let voteMarker = propMap.get(marker.toBase58());
|
|
261
|
+
if (voteMarker) {
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
voteMarker.choices = voteMarker.choices.filter(c => c !== decoded.data.args.choice);
|
|
264
|
+
if (voteMarker.choices.length === 0) {
|
|
265
|
+
propMap.delete(marker.toBase58());
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
propMap.set(marker.toBase58(), voteMarker);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
console.log("error", index, tx.transaction.signatures[0]);
|
|
275
|
+
throw e;
|
|
276
|
+
// Skip instructions that can't be decoded
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
let flattened = Array.from(votesByProposal.values()).flatMap((markers) => {
|
|
284
|
+
return Array.from(markers.values()).map(marker => ({
|
|
285
|
+
address: marker.address.toBase58(),
|
|
286
|
+
voter: marker.voter.toBase58(),
|
|
287
|
+
registrar: marker.registrar.toBase58(),
|
|
288
|
+
proposal: marker.proposal.toBase58(),
|
|
289
|
+
mint: marker.mint.toBase58(),
|
|
290
|
+
choices: marker.choices,
|
|
291
|
+
weight: marker.weight.toString(),
|
|
292
|
+
bumpSeed: marker.bumpSeed,
|
|
293
|
+
deprecatedRelinquished: marker.deprecatedRelinquished,
|
|
294
|
+
proxyIndex: marker.proxyIndex,
|
|
295
|
+
rentRefund: marker.rentRefund.toBase58(),
|
|
296
|
+
}));
|
|
297
|
+
});
|
|
298
|
+
// Write results to file
|
|
299
|
+
const fs = require('fs');
|
|
300
|
+
fs.writeFileSync(argv.outputPath, JSON.stringify(flattened, null, 2));
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
exports.run = run;
|
|
304
|
+
//# sourceMappingURL=dump-vote-markers.js.map
|