@helium/distributor-oracle 0.2.20 → 0.2.22-next.33

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.
@@ -1,382 +0,0 @@
1
- import dotenv from "dotenv";
2
- dotenv.config();
3
- // @ts-ignore
4
- import { AnchorProvider, BN, getProvider, setProvider } from "@coral-xyz/anchor";
5
- import { decodeEntityKey, entityCreatorKey, init as initHeliumEntityManager, keyToAssetKey, keyToAssetForAsset, } from "@helium/helium-entity-manager-sdk";
6
- import { daoKey } from "@helium/helium-sub-daos-sdk";
7
- import { init as initLazy, lazyDistributorKey, PROGRAM_ID as LD_PID } from "@helium/lazy-distributor-sdk";
8
- import { init as initRewards, PROGRAM_ID as RO_PID } from "@helium/rewards-oracle-sdk";
9
- import { getAsset, HNT_MINT, IOT_MINT } from "@helium/spl-utils";
10
- import { AccountFetchCache } from "@helium/account-fetch-cache";
11
- import { Keypair, PublicKey, Transaction } from "@solana/web3.js";
12
- import { Op } from "sequelize";
13
- import fs from "fs";
14
- import { Reward } from "./model";
15
- import Fastify from "fastify";
16
- import cors from "@fastify/cors";
17
- import { getLeafAssetId } from "@metaplex-foundation/mpl-bubblegum";
18
- const HNT = process.env.HNT_MINT ? new PublicKey(process.env.HNT_MINT) : HNT_MINT;
19
- const DAO = daoKey(HNT)[0];
20
- const ENTITY_CREATOR = entityCreatorKey(DAO)[0];
21
- export class PgDatabase {
22
- issuanceProgram;
23
- getAssetFn;
24
- constructor(issuanceProgram, getAssetFn = getAsset) {
25
- this.issuanceProgram = issuanceProgram;
26
- this.getAssetFn = getAssetFn;
27
- }
28
- getActiveDevices() {
29
- return Reward.count({
30
- where: {
31
- lastReward: {
32
- [Op.gte]: new Date(Date.now() - 1000 * 60 * 60 * 24 * 30), // Active within the last 30 days
33
- },
34
- },
35
- });
36
- }
37
- async getBulkRewards(entityKeys) {
38
- const rewards = await Reward.findAll({
39
- where: {
40
- address: {
41
- [Op.in]: entityKeys,
42
- },
43
- },
44
- });
45
- return rewards
46
- .map((rew) => [rew.address, rew.rewards])
47
- .reduce((acc, [key, val]) => {
48
- acc[key] = new BN(val).toString();
49
- return acc;
50
- }, {});
51
- }
52
- async getCurrentRewards(assetId) {
53
- const asset = await this.getAssetFn(process.env.ASSET_API_URL ||
54
- this.issuanceProgram.provider.connection.rpcEndpoint, assetId);
55
- if (!asset) {
56
- console.error("No asset found", assetId.toBase58());
57
- return "0";
58
- }
59
- const keyToAssetKey = keyToAssetForAsset(asset, DAO);
60
- const keyToAsset = await this.issuanceProgram.account.keyToAssetV0.fetch(keyToAssetKey);
61
- const entityKey = decodeEntityKey(keyToAsset.entityKey, keyToAsset.keySerialization);
62
- // Verify the creator is our entity creator, otherwise they could just
63
- // pass in any NFT with this ecc compact to collect rewards
64
- if (!asset.creators[0].verified ||
65
- !new PublicKey(asset.creators[0].address).equals(ENTITY_CREATOR)) {
66
- throw new Error("Not a valid rewardable entity");
67
- }
68
- return this.getCurrentRewardsByEntity(entityKey);
69
- }
70
- async getCurrentRewardsByEntity(entityKeyStr) {
71
- const reward = (await Reward.findByPk(entityKeyStr));
72
- return new BN(reward?.rewards).toString() || "0";
73
- }
74
- }
75
- export class OracleServer {
76
- ldProgram;
77
- roProgram;
78
- hemProgram;
79
- oracle;
80
- db;
81
- lazyDistributor;
82
- dao;
83
- app;
84
- port = 8080;
85
- server;
86
- constructor(ldProgram, roProgram, hemProgram, oracle, db, lazyDistributor, dao = DAO) {
87
- this.ldProgram = ldProgram;
88
- this.roProgram = roProgram;
89
- this.hemProgram = hemProgram;
90
- this.oracle = oracle;
91
- this.db = db;
92
- this.lazyDistributor = lazyDistributor;
93
- this.dao = dao;
94
- const server = Fastify({
95
- logger: true,
96
- });
97
- server.register(cors, {
98
- origin: "*",
99
- });
100
- server.get("/health", async () => {
101
- return { ok: true };
102
- });
103
- this.app = server;
104
- this.addRoutes();
105
- }
106
- async start() {
107
- this.server = await this.app.listen({
108
- port: this.port,
109
- host: "0.0.0.0",
110
- });
111
- console.log(`Oracle server listening on port ${this.port}`);
112
- }
113
- async close() {
114
- await this.app.close();
115
- }
116
- addRoutes() {
117
- this.app.get("/active-devices", this.getActiveDevicesHandler.bind(this));
118
- this.app.post("/bulk-rewards", this.getAllRewardsHandler.bind(this));
119
- this.app.get("/", this.getCurrentRewardsHandler.bind(this));
120
- this.app.post("/", this.signTransactionHandler.bind(this));
121
- this.app.post("/bulk-sign", this.signBulkTransactionsHandler.bind(this));
122
- }
123
- async getActiveDevicesHandler(req, res) {
124
- const count = await this.db.getActiveDevices();
125
- res.send({
126
- count,
127
- });
128
- }
129
- async getCurrentRewardsHandler(req, res) {
130
- let assetId = req.query.assetId;
131
- let entityKey = req.query.entityKey;
132
- let keySerialization = req.query.keySerialization;
133
- if (!keySerialization) {
134
- keySerialization = "b58";
135
- }
136
- if (!assetId && !entityKey) {
137
- res.status(400).send({
138
- error: "Must provide either `entityKey` or `assetId` parameter",
139
- });
140
- return;
141
- }
142
- if (entityKey) {
143
- const [key] = await keyToAssetKey(this.dao, entityKey, keySerialization);
144
- console.log(key.toBase58());
145
- const keyToAsset = await this.hemProgram.account.keyToAssetV0.fetch(key);
146
- assetId = keyToAsset.asset.toBase58();
147
- }
148
- let asset;
149
- try {
150
- asset = new PublicKey(assetId);
151
- }
152
- catch (err) {
153
- res.status(400).send({ error: "Invalid asset id" });
154
- return;
155
- }
156
- const currentRewards = await this.db.getCurrentRewards(asset);
157
- res.send({
158
- currentRewards,
159
- });
160
- }
161
- async getAllRewardsHandler(req, res) {
162
- const entityKeys = req.body.entityKeys;
163
- if (!entityKeys) {
164
- res.status(400).send({ error: "No entityKeys field" });
165
- return;
166
- }
167
- const currentRewards = await this.db.getBulkRewards(entityKeys);
168
- res.send({
169
- currentRewards,
170
- });
171
- }
172
- async signTransaction(data) {
173
- const tx = Transaction.from(data);
174
- // validate only interacts with LD and RO programs and only calls setCurrentRewards, distributeRewards
175
- const setRewardIxs = [];
176
- let recipientToLazyDistToMint = {};
177
- const initRecipientTx = this.ldProgram.idl.instructions.find((x) => x.name === "initializeRecipientV0");
178
- const initCompressionRecipientTx = this.ldProgram.idl.instructions.find((x) => x.name === "initializeCompressionRecipientV0");
179
- const lazyDistributorIdxInitRecipient = initRecipientTx.accounts.findIndex((x) => x.name === "lazyDistributor");
180
- const lazyDistributorIdxInitCompressionRecipient = initCompressionRecipientTx.accounts.findIndex((x) => x.name === "lazyDistributor");
181
- const mintIdx = initRecipientTx.accounts.findIndex((x) => x.name === "mint");
182
- const merkleTreeIdxInitCompressionRecipient = initCompressionRecipientTx.accounts.findIndex((x) => x.name === "merkleTree");
183
- const recipientIdxInitRecipient = initRecipientTx.accounts.findIndex((x) => x.name === "recipient");
184
- const recipientIdxInitCompressionRecipient = initCompressionRecipientTx.accounts.findIndex((x) => x.name === "recipient");
185
- for (const ix of tx.instructions) {
186
- if (!(ix.programId.equals(LD_PID) || ix.programId.equals(RO_PID))) {
187
- return {
188
- success: false,
189
- message: "Invalid instructions in transaction",
190
- };
191
- }
192
- let decoded;
193
- if (ix.programId.equals(LD_PID)) {
194
- decoded = this.ldProgram.coder.instruction.decode(ix.data);
195
- }
196
- else {
197
- decoded = this.roProgram.coder.instruction.decode(ix.data);
198
- }
199
- if (!decoded ||
200
- (decoded.name !== "setCurrentRewardsV0" &&
201
- decoded.name !== "distributeRewardsV0" &&
202
- decoded.name !== "distributeCompressionRewardsV0" &&
203
- decoded.name !== "initializeRecipientV0" &&
204
- decoded.name !== "initializeCompressionRecipientV0" &&
205
- decoded.name !== "setCurrentRewardsWrapperV0" &&
206
- decoded.name !== "setCurrentRewardsWrapperV1")) {
207
- return {
208
- success: false,
209
- message: "Invalid instructions in transaction",
210
- };
211
- }
212
- console.log(decoded.name);
213
- if (decoded.name === "setCurrentRewardsV0" ||
214
- decoded.name === "setCurrentRewardsWrapperV0" ||
215
- decoded.name === "setCurrentRewardsWrapperV1")
216
- setRewardIxs.push(ix);
217
- // Since recipient wont exist to fetch to get the mint id, grab it from the init recipient ix
218
- if (decoded.name === "initializeRecipientV0") {
219
- const recipient = ix.keys[recipientIdxInitRecipient].pubkey.toBase58();
220
- recipientToLazyDistToMint[recipient] ||= {};
221
- const lazyDist = ix.keys[lazyDistributorIdxInitRecipient].pubkey.toBase58();
222
- recipientToLazyDistToMint[recipient][lazyDist] =
223
- ix.keys[mintIdx].pubkey;
224
- }
225
- // Since recipient wont exist to fetch to get the asset id, grab it from the init recipient ix
226
- if (decoded.name === "initializeCompressionRecipientV0") {
227
- const recipient = ix.keys[recipientIdxInitCompressionRecipient].pubkey.toBase58();
228
- recipientToLazyDistToMint[recipient] ||= {};
229
- const lazyDist = ix.keys[lazyDistributorIdxInitCompressionRecipient].pubkey.toBase58();
230
- const merkleTree = ix.keys[merkleTreeIdxInitCompressionRecipient].pubkey;
231
- const index = decoded.data.args.index;
232
- recipientToLazyDistToMint[recipient][lazyDist] = await getLeafAssetId(merkleTree, new BN(index));
233
- }
234
- }
235
- const setRewardsIx = this.ldProgram.idl.instructions.find((x) => x.name === "setCurrentRewardsV0");
236
- const payerKeyIdx = setRewardsIx.accounts.findIndex((x) => x.name === "payer");
237
- const oracleKeyIdx = setRewardsIx.accounts.findIndex((x) => x.name === "oracle");
238
- const lazyDistIdx = setRewardsIx.accounts.findIndex((x) => x.name === "lazyDistributor");
239
- const recipientIdx = setRewardsIx.accounts.findIndex((x) => x.name === "recipient");
240
- const setRewardsWrapperIx = this.roProgram.idl.instructions.find((x) => x.name === "setCurrentRewardsWrapperV0" ||
241
- x.name === "setCurrentRewardsWrapperV1");
242
- const wrapperOracleKeyIdx = setRewardsWrapperIx.accounts.findIndex((x) => x.name === "oracle");
243
- const wrapperLazyDistIdx = setRewardsWrapperIx.accounts.findIndex((x) => x.name === "lazyDistributor");
244
- const wrapperRecipientIdx = setRewardsWrapperIx.accounts.findIndex((x) => x.name === "recipient");
245
- const wrapperKeyToAssetIdx = setRewardsWrapperIx.accounts.findIndex((x) => x.name === "keyToAsset");
246
- // validate setRewards value for this oracle is correct
247
- for (const ix of setRewardIxs) {
248
- let recipient, lazyDist, proposedCurrentRewards;
249
- let entityKey;
250
- let keyToAssetK = undefined;
251
- if (ix.keys[wrapperOracleKeyIdx].pubkey.equals(this.oracle.publicKey) &&
252
- ix.programId.equals(RO_PID)) {
253
- let decoded = this.roProgram.coder.instruction.decode(ix.data);
254
- recipient = ix.keys[wrapperRecipientIdx].pubkey;
255
- lazyDist = ix.keys[wrapperLazyDistIdx].pubkey;
256
- keyToAssetK = ix.keys[wrapperKeyToAssetIdx].pubkey;
257
- //@ts-ignore
258
- proposedCurrentRewards = decoded.data.args.currentRewards;
259
- entityKey = (await this.hemProgram.account.keyToAssetV0.fetch(keyToAssetK)).entityKey;
260
- // A sneaky RPC could return incorrect data. Verify that the entity key is correct for the key to asset
261
- if (!keyToAssetKey(this.dao, entityKey)[0].equals(keyToAssetK)) {
262
- return { success: false, message: "RPC lied about the entity key for this asset." };
263
- }
264
- }
265
- else if (ix.keys[oracleKeyIdx].pubkey.equals(this.oracle.publicKey) &&
266
- ix.programId.equals(LD_PID)) {
267
- let decoded = this.ldProgram.coder.instruction.decode(ix.data);
268
- recipient = ix.keys[recipientIdx].pubkey;
269
- lazyDist = ix.keys[lazyDistIdx].pubkey;
270
- //@ts-ignore
271
- proposedCurrentRewards = decoded.data.args.currentRewards;
272
- }
273
- if (!lazyDist || !recipient || !lazyDist.equals(this.lazyDistributor)) {
274
- return { success: false, message: "Invalid lazy distributor" };
275
- }
276
- let mint = (recipientToLazyDistToMint[recipient.toBase58()] || {})[lazyDist.toBase58()];
277
- if (!mint) {
278
- const recipientAcc = await this.ldProgram.account.recipientV0.fetchNullable(recipient);
279
- if (!recipientAcc) {
280
- console.error(recipientToLazyDistToMint);
281
- return { success: false, message: "Recipient doesn't exist" };
282
- }
283
- mint = recipientAcc.asset;
284
- }
285
- let keySerialization = { b58: {} };
286
- if (keyToAssetK) {
287
- const keyToAsset = await this.hemProgram.account.keyToAssetV0.fetch(keyToAssetK);
288
- keySerialization = keyToAsset.keySerialization;
289
- }
290
- // @ts-ignore
291
- const currentRewards = entityKey
292
- ? await this.db.getCurrentRewardsByEntity(decodeEntityKey(entityKey, keySerialization))
293
- : await this.db.getCurrentRewards(mint);
294
- if (proposedCurrentRewards.gt(new BN(currentRewards))) {
295
- return { success: false, message: `Invalid amount, ${proposedCurrentRewards} is greater than actual rewards ${currentRewards}` };
296
- }
297
- }
298
- // validate that this oracle is not the fee payer
299
- if (tx.feePayer?.equals(this.oracle.publicKey)) {
300
- return {
301
- success: false,
302
- message: "Cannot set this oracle as the fee payer",
303
- };
304
- }
305
- tx.partialSign(this.oracle);
306
- const serialized = tx.serialize({
307
- requireAllSignatures: false,
308
- verifySignatures: false,
309
- });
310
- return { success: true, transaction: serialized };
311
- }
312
- async signBulkTransactionsHandler(req, res) {
313
- if (!req.body.transactions) {
314
- res.status(400).send({ error: "No transactions field" });
315
- return;
316
- }
317
- let _this = this;
318
- const results = await Promise.all(req.body.transactions.map(async (txData) => {
319
- try {
320
- return await _this.signTransaction(txData);
321
- }
322
- catch (err) {
323
- console.error(err);
324
- return { success: false, message: err.message };
325
- }
326
- }));
327
- const errIdx = results.findIndex((x) => !x.success);
328
- if (errIdx > -1) {
329
- res
330
- .status(400)
331
- .send({
332
- error: results[errIdx].message
333
- ? `${results[errIdx].message}\n\nTransaction index: ${errIdx}`
334
- : `Error signing transaction index: ${errIdx}`,
335
- });
336
- return;
337
- }
338
- res.send({
339
- success: true,
340
- transactions: results.map((x) => x.transaction),
341
- });
342
- }
343
- async signTransactionHandler(req, res) {
344
- if (!req.body.transaction) {
345
- res.status(400).send({ error: "No transaction field" });
346
- return;
347
- }
348
- const result = await this.signTransaction(req.body.transaction.data);
349
- if (!result.success) {
350
- res
351
- .status(400)
352
- .send({ error: result.message || "Error signing transaction" });
353
- }
354
- res.send({ success: true, transaction: result.transaction });
355
- }
356
- }
357
- (async function () {
358
- if (process.argv.length > 2 && process.argv[2] == "serve") {
359
- // driver code for running server
360
- setProvider(AnchorProvider.env());
361
- const provider = getProvider();
362
- const oracleKeypair = Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs
363
- .readFileSync((process.env.ORACLE_KEYPAIR_PATH || process.env.ANCHOR_WALLET))
364
- .toString())));
365
- const ldProgram = await initLazy(provider);
366
- const roProgram = await initRewards(provider);
367
- const hemProgram = await initHeliumEntityManager(provider);
368
- const DNT = process.env.DNT_MINT
369
- ? new PublicKey(process.env.DNT_MINT)
370
- : IOT_MINT;
371
- const LAZY_DISTRIBUTOR = lazyDistributorKey(DNT)[0];
372
- const server = new OracleServer(ldProgram, roProgram, hemProgram, oracleKeypair, new PgDatabase(hemProgram), LAZY_DISTRIBUTOR);
373
- // For performance
374
- new AccountFetchCache({
375
- connection: provider.connection,
376
- commitment: "confirmed",
377
- extendConnection: true,
378
- });
379
- server.start();
380
- }
381
- })();
382
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"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"}