@render-foundation/utils 0.0.187 → 0.0.188

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.
Files changed (110) hide show
  1. package/package.json +2 -2
  2. package/lib/cjs/backfiller.js +0 -932
  3. package/lib/cjs/backfiller.js.map +0 -1
  4. package/lib/cjs/client/onchain.js +0 -132
  5. package/lib/cjs/client/onchain.js.map +0 -1
  6. package/lib/cjs/client/pg/base.js +0 -198
  7. package/lib/cjs/client/pg/base.js.map +0 -1
  8. package/lib/cjs/client/pg/v1.js +0 -623
  9. package/lib/cjs/client/pg/v1.js.map +0 -1
  10. package/lib/cjs/client/pg/v2Client.js +0 -1587
  11. package/lib/cjs/client/pg/v2Client.js.map +0 -1
  12. package/lib/cjs/client/pg/viewClient.js +0 -107
  13. package/lib/cjs/client/pg/viewClient.js.map +0 -1
  14. package/lib/cjs/client/price.js +0 -63
  15. package/lib/cjs/client/price.js.map +0 -1
  16. package/lib/cjs/client/render.js +0 -173
  17. package/lib/cjs/client/render.js.map +0 -1
  18. package/lib/cjs/client/squads.js +0 -204
  19. package/lib/cjs/client/squads.js.map +0 -1
  20. package/lib/cjs/client/trade.js +0 -235
  21. package/lib/cjs/client/trade.js.map +0 -1
  22. package/lib/cjs/client/wormhole.js +0 -69
  23. package/lib/cjs/client/wormhole.js.map +0 -1
  24. package/lib/cjs/constants.js +0 -48
  25. package/lib/cjs/constants.js.map +0 -1
  26. package/lib/cjs/dbTypes.js +0 -3
  27. package/lib/cjs/dbTypes.js.map +0 -1
  28. package/lib/cjs/dbTypesV2.js +0 -3
  29. package/lib/cjs/dbTypesV2.js.map +0 -1
  30. package/lib/cjs/dbViewTypes.js +0 -3
  31. package/lib/cjs/dbViewTypes.js.map +0 -1
  32. package/lib/cjs/errorReporter.js +0 -126
  33. package/lib/cjs/errorReporter.js.map +0 -1
  34. package/lib/cjs/index.js +0 -44
  35. package/lib/cjs/index.js.map +0 -1
  36. package/lib/cjs/logger.js +0 -21
  37. package/lib/cjs/logger.js.map +0 -1
  38. package/lib/esm/src/backfiller.js +0 -886
  39. package/lib/esm/src/backfiller.js.map +0 -1
  40. package/lib/esm/src/client/onchain.js +0 -122
  41. package/lib/esm/src/client/onchain.js.map +0 -1
  42. package/lib/esm/src/client/pg/base.js +0 -162
  43. package/lib/esm/src/client/pg/base.js.map +0 -1
  44. package/lib/esm/src/client/pg/v1.js +0 -559
  45. package/lib/esm/src/client/pg/v1.js.map +0 -1
  46. package/lib/esm/src/client/pg/v2Client.js +0 -1468
  47. package/lib/esm/src/client/pg/v2Client.js.map +0 -1
  48. package/lib/esm/src/client/pg/viewClient.js +0 -91
  49. package/lib/esm/src/client/pg/viewClient.js.map +0 -1
  50. package/lib/esm/src/client/price.js +0 -41
  51. package/lib/esm/src/client/price.js.map +0 -1
  52. package/lib/esm/src/client/render.js +0 -147
  53. package/lib/esm/src/client/render.js.map +0 -1
  54. package/lib/esm/src/client/squads.js +0 -163
  55. package/lib/esm/src/client/squads.js.map +0 -1
  56. package/lib/esm/src/client/trade.js +0 -219
  57. package/lib/esm/src/client/trade.js.map +0 -1
  58. package/lib/esm/src/client/wormhole.js +0 -33
  59. package/lib/esm/src/client/wormhole.js.map +0 -1
  60. package/lib/esm/src/constants.js +0 -45
  61. package/lib/esm/src/constants.js.map +0 -1
  62. package/lib/esm/src/dbTypes.js +0 -2
  63. package/lib/esm/src/dbTypes.js.map +0 -1
  64. package/lib/esm/src/dbTypesV2.js +0 -2
  65. package/lib/esm/src/dbTypesV2.js.map +0 -1
  66. package/lib/esm/src/dbViewTypes.js +0 -2
  67. package/lib/esm/src/dbViewTypes.js.map +0 -1
  68. package/lib/esm/src/errorReporter.js +0 -117
  69. package/lib/esm/src/errorReporter.js.map +0 -1
  70. package/lib/esm/src/index.js +0 -15
  71. package/lib/esm/src/index.js.map +0 -1
  72. package/lib/esm/src/logger.js +0 -18
  73. package/lib/esm/src/logger.js.map +0 -1
  74. package/lib/esm/tsconfig.esm.tsbuildinfo +0 -1
  75. package/lib/types/src/backfiller.d.ts +0 -64
  76. package/lib/types/src/backfiller.d.ts.map +0 -1
  77. package/lib/types/src/client/onchain.d.ts +0 -24
  78. package/lib/types/src/client/onchain.d.ts.map +0 -1
  79. package/lib/types/src/client/pg/base.d.ts +0 -82
  80. package/lib/types/src/client/pg/base.d.ts.map +0 -1
  81. package/lib/types/src/client/pg/v1.d.ts +0 -137
  82. package/lib/types/src/client/pg/v1.d.ts.map +0 -1
  83. package/lib/types/src/client/pg/v2Client.d.ts +0 -307
  84. package/lib/types/src/client/pg/v2Client.d.ts.map +0 -1
  85. package/lib/types/src/client/pg/viewClient.d.ts +0 -55
  86. package/lib/types/src/client/pg/viewClient.d.ts.map +0 -1
  87. package/lib/types/src/client/price.d.ts +0 -12
  88. package/lib/types/src/client/price.d.ts.map +0 -1
  89. package/lib/types/src/client/render.d.ts +0 -24
  90. package/lib/types/src/client/render.d.ts.map +0 -1
  91. package/lib/types/src/client/squads.d.ts +0 -17
  92. package/lib/types/src/client/squads.d.ts.map +0 -1
  93. package/lib/types/src/client/trade.d.ts +0 -24
  94. package/lib/types/src/client/trade.d.ts.map +0 -1
  95. package/lib/types/src/client/wormhole.d.ts +0 -9
  96. package/lib/types/src/client/wormhole.d.ts.map +0 -1
  97. package/lib/types/src/constants.d.ts +0 -43
  98. package/lib/types/src/constants.d.ts.map +0 -1
  99. package/lib/types/src/dbTypes.d.ts +0 -123
  100. package/lib/types/src/dbTypes.d.ts.map +0 -1
  101. package/lib/types/src/dbTypesV2.d.ts +0 -193
  102. package/lib/types/src/dbTypesV2.d.ts.map +0 -1
  103. package/lib/types/src/dbViewTypes.d.ts +0 -35
  104. package/lib/types/src/dbViewTypes.d.ts.map +0 -1
  105. package/lib/types/src/errorReporter.d.ts +0 -13
  106. package/lib/types/src/errorReporter.d.ts.map +0 -1
  107. package/lib/types/src/index.d.ts +0 -15
  108. package/lib/types/src/index.d.ts.map +0 -1
  109. package/lib/types/src/logger.d.ts +0 -16
  110. package/lib/types/src/logger.d.ts.map +0 -1
@@ -1,1587 +0,0 @@
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.pgClient = exports.batchFinishedAtMedian = exports.GRANT_BURN_TABLE = exports.GRANT_BURN_ID_TABLE = exports.USER_GRANT_SPEND_TABLE = exports.CURRENT_USER_GRANT_SPEND_TABLE = exports.POLYGON_UPGRADE_TABLE = exports.ENTITY_EPOCH_INFO_TABLE = exports.BURN_ADJUSTMENT_TABLE = exports.NETWORK_REVENUE_TABLE = exports.BRIDGE_TRANSFER_TABLE = exports.BURN_TABLE = exports.JOB_TABLE = exports.JOB_ID_TABLE = exports.LIABILITY_TABLE = exports.SOL_TRANSFER_TABLE = exports.ENTITY_TABLE = exports.MANUAL_BURN_TABLE = exports.EPOCH_TABLE = exports.SOL_TX_TABLE = void 0;
39
- const kysely_1 = require("kysely");
40
- const logger_1 = require("../../logger");
41
- const pg_1 = require("pg");
42
- const pg = __importStar(require("pg"));
43
- const base_1 = require("./base");
44
- exports.SOL_TX_TABLE = 'sol_tx';
45
- exports.EPOCH_TABLE = 'epoch';
46
- exports.MANUAL_BURN_TABLE = 'manual_burn';
47
- exports.ENTITY_TABLE = 'entity';
48
- exports.SOL_TRANSFER_TABLE = 'sol_transfer1';
49
- exports.LIABILITY_TABLE = 'liability';
50
- exports.JOB_ID_TABLE = 'job_id';
51
- exports.JOB_TABLE = 'job';
52
- exports.BURN_TABLE = 'burn';
53
- exports.BRIDGE_TRANSFER_TABLE = 'bridge_transfer';
54
- exports.NETWORK_REVENUE_TABLE = 'network_revenue';
55
- exports.BURN_ADJUSTMENT_TABLE = 'burn_adjustment';
56
- exports.ENTITY_EPOCH_INFO_TABLE = 'entity_epoch_info';
57
- exports.POLYGON_UPGRADE_TABLE = 'polygon_upgrade';
58
- exports.CURRENT_USER_GRANT_SPEND_TABLE = 'current_user_grant_spend';
59
- exports.USER_GRANT_SPEND_TABLE = 'user_grant_spend';
60
- exports.GRANT_BURN_ID_TABLE = 'grant_burn_id';
61
- exports.GRANT_BURN_TABLE = 'grant_burn';
62
- BigInt.prototype.toJSON = function () {
63
- return this.toString();
64
- };
65
- const base_2 = require("./base");
66
- const moment_1 = __importDefault(require("moment"));
67
- pg.types.setTypeParser(1114, (str) => moment_1.default.utc(str).toDate());
68
- pg.defaults.parseInputDatesAsUTC = true;
69
- /* ;(Date.prototype as any).toPostgres = function (prepareValue: (v: any) => any) {
70
- return this.toISOString()
71
- }
72
- */
73
- const batchFinishedAtMedian = (jobs) => {
74
- const pricedAt = jobs.length % 2 == 0
75
- ? new Date(Math.trunc((Date.parse(jobs[jobs.length / 2].finishedAt) +
76
- Date.parse(jobs[jobs.length / 2 - 1].finishedAt)) /
77
- 2))
78
- : new Date(Date.parse(jobs[Math.floor(jobs.length / 2)].finishedAt));
79
- return pricedAt;
80
- };
81
- exports.batchFinishedAtMedian = batchFinishedAtMedian;
82
- const pgClient = (config) => {
83
- // Single pg pool that we can also use for ad-hoc performance tests outside Kysely
84
- const pgPool = new pg_1.Pool(config);
85
- pgPool.on('connect', (c) => console.log('new pg socket created'));
86
- pgPool.on('error', (err) => console.log('idle pg client died and was replaced:', err));
87
- const dialect = new kysely_1.PostgresDialect({ pool: pgPool });
88
- // Database interface is passed to Kysely's constructor, and from now on, Kysely
89
- // knows your database structure.
90
- // Dialect is passed to Kysely's constructor, and from now on, Kysely knows how
91
- // to communicate with your database.
92
- const db = new kysely_1.Kysely({
93
- dialect,
94
- });
95
- const getOrInsertEntity = (db, p, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
96
- const res = (yield db
97
- .selectFrom(exports.ENTITY_TABLE)
98
- .select('id')
99
- .where('sol_key', '=', p.solKey)
100
- .executeTakeFirst());
101
- if (res) {
102
- log.debug(`already found entity ${res.id}`);
103
- return res.id;
104
- }
105
- const { id } = (yield db
106
- .insertInto(exports.ENTITY_TABLE)
107
- .values({
108
- sol_key: p.solKey,
109
- })
110
- .onConflict((oc) => oc.column('sol_key').doNothing())
111
- .returning((eb) => ['id as id'])
112
- .executeTakeFirst());
113
- log.debug(`inserted entity ${id}`);
114
- return id;
115
- });
116
- const getOrInsertTx = (db, p, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
117
- const res = yield db
118
- .selectFrom(exports.SOL_TX_TABLE)
119
- .select('id')
120
- .where('sig', '=', p.sig)
121
- .executeTakeFirst();
122
- if (res) {
123
- log.debug(`already found tx ${res.id}`);
124
- return res.id;
125
- }
126
- const { id } = (yield db
127
- .insertInto(exports.SOL_TX_TABLE)
128
- .values({
129
- sig: p.sig,
130
- executed_at: p.executedAt,
131
- })
132
- .onConflict((oc) => oc.column('sig').doNothing())
133
- .returning((eb) => ['id as id'])
134
- .executeTakeFirst());
135
- log.debug(`inserted tx ${id}`);
136
- return id;
137
- });
138
- const getOrInsertEpoch = (db, p, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
139
- const res = yield db
140
- .selectFrom(exports.EPOCH_TABLE)
141
- .select('id')
142
- .where('ui', '=', String(p.uiEpochId))
143
- .where('channel', '=', p.channel)
144
- .executeTakeFirst();
145
- if (res) {
146
- log.debug(`already found epoch ${res.id}`);
147
- return res.id;
148
- }
149
- const { id } = (yield db
150
- .insertInto(exports.EPOCH_TABLE)
151
- .values({
152
- ui: p.uiEpochId,
153
- channel: p.channel,
154
- start_time: p.startTime,
155
- end_time: p.endTime,
156
- saved_at: p.channel == 'node_operator' || p.channel == 'availability'
157
- ? new Date()
158
- : undefined,
159
- })
160
- .onConflict((oc) => oc.columns(['ui', 'channel']).doNothing())
161
- .returning((eb) => ['id as id'])
162
- .executeTakeFirst());
163
- log.debug(`inserted epoch ${id}`);
164
- return id;
165
- });
166
- const getCurrentUserGrantSpend = (db, p, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
167
- var _a;
168
- const res = yield db
169
- .selectFrom(exports.CURRENT_USER_GRANT_SPEND_TABLE)
170
- .selectAll()
171
- .where('user_id', '=', p.userId)
172
- .forUpdate()
173
- .executeTakeFirst();
174
- return res
175
- ? {
176
- id: BigInt(res.id),
177
- user: res.user_id,
178
- renderSpent: BigInt(res.render_spent),
179
- perpetual: (_a = res.perpetual) !== null && _a !== void 0 ? _a : false,
180
- description: res.description,
181
- }
182
- : undefined;
183
- });
184
- const updateTotalRndr = (db, p, totalRndr, savedAt, log) => __awaiter(void 0, void 0, void 0, function* () {
185
- const res = (yield db
186
- .updateTable(exports.EPOCH_TABLE)
187
- .set({
188
- total_rndr: totalRndr,
189
- saved_at: savedAt,
190
- })
191
- .where('channel', '=', p.channel)
192
- .where('ui', '=', String(p.uiEpochId))
193
- .executeTakeFirst());
194
- log.info(`set ${res.numUpdatedRows} rows. channel: ${p.channel}, ui: ${p.uiEpochId} -> totalRndr ${totalRndr} `);
195
- });
196
- const fetchJobs1 = (db, f, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
197
- let q = db.selectFrom('job').selectAll();
198
- //.where('job.burn_id', 'is not', null)
199
- if (f.completedAtAfter) {
200
- q = q.where('completed_at', '>=', f.completedAtAfter);
201
- }
202
- if (f.completedAtBefore) {
203
- q = q.where('completed_at', '<=', f.completedAtBefore);
204
- }
205
- if (f.ids) {
206
- q = q.where('id', 'in', f.ids);
207
- }
208
- else {
209
- if (f.burned == false) {
210
- q = q.where('burn_id', 'is', null);
211
- }
212
- else if (f.burned == true) {
213
- q = q.where('burn_id', 'is not', null);
214
- }
215
- }
216
- q = q.orderBy('completed_at asc');
217
- log.info(`fetchJobs q ${q.compile().sql} ${JSON.stringify(f)}`);
218
- const rows = yield q.execute();
219
- return rows.map((r) => ({
220
- id: Number(r.id),
221
- completedAt: r.completed_at,
222
- rndrUsed: BigInt(r.render_amt),
223
- insertedAt: r.inserted_at,
224
- }));
225
- });
226
- const createBridgeTransfers = (db, bts, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
227
- const sequenceNumbers = [];
228
- const dbEpochIds = [];
229
- for (const bt of bts) {
230
- let { solKey: toSolKey, seq, createdAt, amount, upgradeBracket, priorSupply, points, epochId, } = bt;
231
- let entityId;
232
- if (toSolKey && toSolKey != '') {
233
- entityId = yield getOrInsertEntity(db, { solKey: toSolKey });
234
- }
235
- const dbEpochId = yield getOrInsertEpoch(db, {
236
- channel: 'upgrade',
237
- uiEpochId: epochId,
238
- }, log);
239
- dbEpochIds.push(BigInt(dbEpochId));
240
- const q = db
241
- .insertInto(exports.BRIDGE_TRANSFER_TABLE)
242
- .values({
243
- entity_id: entityId,
244
- sequence: seq,
245
- created_at: createdAt,
246
- amount: amount,
247
- upgrade_bracket: upgradeBracket,
248
- prior_supply: priorSupply,
249
- points: points,
250
- epoch_id: dbEpochId,
251
- })
252
- .onConflict((oc) => oc.column('sequence').doUpdateSet({
253
- created_at: createdAt,
254
- amount: amount,
255
- upgrade_bracket: upgradeBracket,
256
- prior_supply: priorSupply,
257
- points: points,
258
- epoch_id: dbEpochId,
259
- entity_id: entityId,
260
- }))
261
- .returning('sequence');
262
- const c = q.compile();
263
- log.debug(`inserting bridge transfer ${JSON.stringify(bt)} -> ${c.sql} ps ${c.parameters}`);
264
- const { sequence: seqNum } = yield q.executeTakeFirst();
265
- log.debug(`inserted bridge transfer sequence ${seq}`);
266
- sequenceNumbers.push(BigInt(seqNum));
267
- }
268
- return { sequenceNumbers: sequenceNumbers };
269
- });
270
- const createPayments = (db, ps, log = logger_1.consoleLogger) => __awaiter(void 0, void 0, void 0, function* () {
271
- const ids = [];
272
- const epochDbIds = [];
273
- for (const p of ps) {
274
- let liabilityId;
275
- let transferId;
276
- if (p.liability) {
277
- let { id: dbId, solKey, channel, epochId, createdAt, amountDue, deviceId, points, obhUsed, } = p.liability;
278
- try {
279
- let entityId;
280
- if (solKey && solKey != '') {
281
- entityId = yield getOrInsertEntity(db, { solKey });
282
- }
283
- const dbEpochId = yield getOrInsertEpoch(db, {
284
- channel,
285
- uiEpochId: epochId,
286
- }, log);
287
- epochDbIds.push(BigInt(dbEpochId));
288
- log.debug(`inserting liability ${JSON.stringify(p.liability)}`);
289
- const { id } = yield db
290
- .insertInto(exports.LIABILITY_TABLE)
291
- .values({
292
- id: dbId,
293
- entity_id: entityId,
294
- epoch_id: dbEpochId,
295
- channel,
296
- created_at: createdAt !== null && createdAt !== void 0 ? createdAt : new Date(),
297
- amount_due: amountDue,
298
- device_id: deviceId,
299
- points,
300
- obh_used: obhUsed,
301
- })
302
- .returning((eb) => ['id as id'])
303
- .executeTakeFirstOrThrow();
304
- log.debug(`inserted liability ${id}`);
305
- liabilityId = BigInt(id);
306
- }
307
- catch (e) {
308
- throw new Error(`failed inserting solKey ${solKey} epochId ${epochId} ${JSON.stringify(p.liability)}: ${e}`);
309
- }
310
- }
311
- if (p.transfer) {
312
- let { executedAt, symbol, amountPayed, solTx, channel, fromSolKey, toSolKey, id: dbId, } = p.transfer;
313
- if (!fromSolKey || !toSolKey || !solTx) {
314
- log.debug(`skipping transfer. one of undefined: fromKey ${fromSolKey} toKey ${toSolKey} tx ${solTx}`);
315
- continue;
316
- }
317
- log.debug(`inserting transfer ${JSON.stringify(p.transfer)}`);
318
- const fromEntityId = yield getOrInsertEntity(db, { solKey: fromSolKey });
319
- const toEntityId = yield getOrInsertEntity(db, { solKey: toSolKey });
320
- const solTxId = yield getOrInsertTx(db, {
321
- sig: solTx,
322
- executedAt,
323
- }, log);
324
- const { id } = yield db
325
- .insertInto(exports.SOL_TRANSFER_TABLE)
326
- .values({
327
- id: dbId,
328
- sol_tx_id: solTxId,
329
- from_entity_id: fromEntityId,
330
- to_entity_id: toEntityId,
331
- channel,
332
- symbol,
333
- amount_payed: amountPayed,
334
- })
335
- .returning((eb) => ['id as id'])
336
- .executeTakeFirstOrThrow();
337
- transferId = BigInt(id);
338
- }
339
- ids.push({ transferId, liabilityId });
340
- }
341
- return { epochDbIds, inserted: ids };
342
- });
343
- return {
344
- db: {
345
- commit: () => { },
346
- rollback: () => { },
347
- trx: db,
348
- },
349
- startTransaction(log = logger_1.consoleLogger) {
350
- return __awaiter(this, void 0, void 0, function* () {
351
- return (0, base_2.begin)(db, log);
352
- });
353
- },
354
- createPayments(db, ps, log = logger_1.consoleLogger) {
355
- return __awaiter(this, void 0, void 0, function* () {
356
- return createPayments(db.trx, ps, log);
357
- });
358
- },
359
- fetchTransfers(db, f, log = logger_1.consoleLogger) {
360
- return __awaiter(this, void 0, void 0, function* () {
361
- let lastId = undefined;
362
- if (f.cursor) {
363
- lastId = atob(f.cursor);
364
- }
365
- let q = db.trx
366
- .selectFrom(exports.SOL_TRANSFER_TABLE)
367
- .select([
368
- 'sol_transfer1.id',
369
- 'sol_transfer1.channel',
370
- 'sol_transfer1.symbol',
371
- 'sol_transfer1.amount_payed',
372
- ])
373
- .innerJoin('sol_tx', 'sol_tx.id', 'sol_transfer1.sol_tx_id')
374
- .select(['sol_tx.sig', 'sol_tx.executed_at'])
375
- .innerJoin('entity as f', 'f.id', 'sol_transfer1.from_entity_id')
376
- .select(['f.sol_key as from_sol_key'])
377
- .innerJoin('entity as t', 't.id', 'sol_transfer1.to_entity_id')
378
- .select(['t.sol_key as to_sol_key']);
379
- if (f.executedAfter) {
380
- q = q.where('sol_tx.executed_at', '>=', f.executedAfter);
381
- }
382
- if (f.executedBefore) {
383
- q = q.where('sol_tx.executed_at', '<=', f.executedBefore);
384
- }
385
- if (f.channels) {
386
- q = q.where('sol_transfer1.channel', 'in', f.channels);
387
- }
388
- if (lastId) {
389
- q = q.where('sol_transfer1.id', '>', lastId);
390
- }
391
- let limit = 10000;
392
- if (f.limit) {
393
- limit = f.limit;
394
- }
395
- q = q.limit(limit).orderBy(`${exports.SOL_TRANSFER_TABLE}.id`);
396
- const comp = q.compile();
397
- const { rows } = yield (0, base_1.timedQuery)(pgPool, comp.sql, comp.parameters, 'fetchTransfers', log);
398
- const trs = rows.map((r) => ({
399
- id: BigInt(r.id),
400
- channel: r.channel,
401
- symbol: r.symbol,
402
- amountPayed: BigInt(r.amount_payed),
403
- solTx: r.sig,
404
- executedAt: r.executed_at,
405
- fromSolKey: r.from_sol_key,
406
- toSolKey: r.to_sol_key,
407
- }));
408
- return {
409
- transfers: trs,
410
- cursor: trs.length === limit
411
- ? btoa(trs[trs.length - 1].id.toString())
412
- : undefined,
413
- };
414
- });
415
- },
416
- fetchEpochs(db, f, log = logger_1.consoleLogger) {
417
- return __awaiter(this, void 0, void 0, function* () {
418
- let q = db.trx.selectFrom(exports.EPOCH_TABLE).selectAll();
419
- if (f.channels) {
420
- q = q.where('channel', 'in', f.channels);
421
- }
422
- if (f.startTimeAfter) {
423
- q = q.where('epoch.start_time', '>', f.startTimeAfter);
424
- }
425
- if (f.endTimeBefore) {
426
- q = q.where('epoch.end_time', '<', f.endTimeBefore);
427
- }
428
- q = q.orderBy('epoch.start_time');
429
- const comp = q.compile();
430
- const { rows } = yield (0, base_1.timedQuery)(pgPool, comp.sql, comp.parameters, 'fetchEpochs', log);
431
- return rows.map((e) => ({
432
- channel: e.channel,
433
- startTime: e.start_time,
434
- endTime: e.end_time,
435
- ui: Number(e.ui),
436
- totalRndr: Number(e.total_rndr),
437
- }));
438
- });
439
- },
440
- fetchLiabilities(db, f, log = logger_1.consoleLogger) {
441
- var _a;
442
- return __awaiter(this, void 0, void 0, function* () {
443
- let offset = 0;
444
- let orderBy = (_a = f.orderBy) !== null && _a !== void 0 ? _a : 'epoch.ui,liability.id';
445
- if (f.cursor) {
446
- const c = JSON.parse(atob(f.cursor));
447
- if (c.offset) {
448
- offset = c.offset;
449
- }
450
- if (c.orderBy) {
451
- orderBy = c.orderBy;
452
- }
453
- }
454
- let q = db.trx
455
- .selectFrom(exports.LIABILITY_TABLE)
456
- .selectAll()
457
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
458
- .select(['entity.sol_key'])
459
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, 'liability.epoch_id')
460
- .select(['epoch.ui', 'epoch.start_time', 'epoch.end_time']);
461
- if (f.epochEndedAtAfter) {
462
- q = q.where('epoch.end_time', '>=', f.epochEndedAtAfter);
463
- }
464
- if (f.epochEndedAtBefore) {
465
- q = q.where('epoch.end_time', '<=', f.epochEndedAtBefore);
466
- }
467
- if (f.epochId) {
468
- q = q.where('epoch.ui', '=', f.epochId.toString());
469
- }
470
- if (f.channels) {
471
- q = q.where('liability.channel', 'in', f.channels);
472
- }
473
- let limit = 10000;
474
- if (f.limit) {
475
- limit = f.limit;
476
- }
477
- // @ts-ignore
478
- q = q.limit(limit).orderBy(orderBy.split(','));
479
- if (offset) {
480
- q = q.offset(offset);
481
- }
482
- const comp = q.compile();
483
- const { rows } = yield (0, base_1.timedQuery)(pgPool, comp.sql, comp.parameters, 'fetchLiabilities', log);
484
- const ls = [];
485
- for (const l of rows) {
486
- ls.push({
487
- id: BigInt(l.id),
488
- solKey: l.sol_key,
489
- epochId: Number(l.ui),
490
- channel: l.channel,
491
- createdAt: l.created_at,
492
- amountDue: BigInt(l.amount_due),
493
- deviceId: l.device_id,
494
- obhUsed: l.obh_used,
495
- points: l.points ? BigInt(l.points) : undefined,
496
- startTime: l.start_time,
497
- endTime: l.end_time,
498
- ui: Number(l.ui),
499
- });
500
- }
501
- return {
502
- liabilities: ls,
503
- cursor: ls.length == limit
504
- ? btoa(JSON.stringify({ offset: ls.length + offset, orderBy }))
505
- : undefined,
506
- };
507
- });
508
- },
509
- getLiabilitiesAndTransfers(f, log = logger_1.consoleLogger) {
510
- return __awaiter(this, void 0, void 0, function* () {
511
- let lq = db
512
- .selectFrom(exports.LIABILITY_TABLE)
513
- .selectAll()
514
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
515
- .select(['entity.sol_key'])
516
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, 'liability.epoch_id')
517
- .select(['epoch.ui', 'epoch.start_time', 'epoch.end_time'])
518
- .where('entity.sol_key', '=', f.user);
519
- let tq = db
520
- .selectFrom(exports.SOL_TRANSFER_TABLE)
521
- .selectAll()
522
- .innerJoin(exports.SOL_TX_TABLE, 'sol_tx.id', 'sol_transfer1.sol_tx_id')
523
- .select(['sol_tx.sig', 'sol_tx.executed_at'])
524
- .innerJoin(`${exports.ENTITY_TABLE} as t`, `${exports.SOL_TRANSFER_TABLE}.to_entity_id`, 't.id')
525
- .select(['t.sol_key as to_sol_key'])
526
- .innerJoin(`${exports.ENTITY_TABLE} as f`, `${exports.SOL_TRANSFER_TABLE}.from_entity_id`, 'f.id')
527
- .select(['f.sol_key as from_sol_key'])
528
- .where('t.sol_key', '=', f.user);
529
- log.info(`fetch liabilities ${lq.compile().sql} ps ${JSON.stringify(f)}`);
530
- log.info(`fetch transfers ${tq.compile().sql} ps ${JSON.stringify(f)}`);
531
- const lc = lq.compile();
532
- const tc = tq.compile();
533
- const [liabRes, transRes] = yield Promise.all([
534
- (0, base_1.timedQuery)(pgPool, lc.sql, lc.parameters, 'getLiabilitiesAndTransfers->liabilities', log),
535
- (0, base_1.timedQuery)(pgPool, tc.sql, tc.parameters, 'getLiabilitiesAndTransfers->transfers', log),
536
- ]);
537
- const rows = [liabRes.rows, transRes.rows];
538
- const epochs = {};
539
- const liabilities = [];
540
- for (const l of rows[0]) {
541
- epochs[`${l.ui}-${l.channel}`] = {
542
- startTime: l.start_time,
543
- endTime: l.end_time,
544
- channel: l.channel,
545
- ui: Number(l.ui),
546
- };
547
- liabilities.push({
548
- id: BigInt(l.id),
549
- solKey: l.sol_key,
550
- epochId: Number(l.ui),
551
- channel: l.channel,
552
- createdAt: l.created_at,
553
- amountDue: BigInt(l.amount_due),
554
- deviceId: l.device_id,
555
- points: l.points ? BigInt(l.points) : undefined,
556
- });
557
- }
558
- const transfers = rows[1].map((r) => ({
559
- id: BigInt(r.id),
560
- fromSolKey: r.from_sol_key,
561
- toSolKey: r.to_sol_key,
562
- symbol: r.symbol,
563
- channel: r.channel,
564
- solTx: r.sig,
565
- executedAt: r.executed_at,
566
- amountPayed: BigInt(r.amount_payed),
567
- }));
568
- return { transfers, liabilities, epochs: Object.values(epochs) };
569
- });
570
- },
571
- getOutstanding(f, log = logger_1.consoleLogger) {
572
- var _a, _b, _c, _d, _e;
573
- return __awaiter(this, void 0, void 0, function* () {
574
- log.info(`getting outstanding balances for ${(_a = f.channels) !== null && _a !== void 0 ? _a : '(no channels specified)'} epoch: ${(_b = f.startEpochId.id) !== null && _b !== void 0 ? _b : '(no epoch specified)'}`);
575
- let epochUi;
576
- let epochEndTime;
577
- if (f.startEpochId.id) {
578
- if (((_c = f.channels) === null || _c === void 0 ? void 0 : _c.includes('node_operator')) ||
579
- ((_d = f.channels) === null || _d === void 0 ? void 0 : _d.includes('availability')) ||
580
- ((_e = f.channels) === null || _e === void 0 ? void 0 : _e.includes('render_compute_network'))) {
581
- let qb = db
582
- .selectFrom(exports.EPOCH_TABLE)
583
- .selectAll(exports.EPOCH_TABLE)
584
- .where('ui', '=', f.startEpochId.id.toString())
585
- .where('channel', 'in', f.channels);
586
- if (f.startEpochId.savedAtNotNull) {
587
- qb = qb.where('saved_at', 'is not', null);
588
- }
589
- const q = qb
590
- .orderBy('ui', 'desc')
591
- .limit(1);
592
- log.info(`getOutstanding->epoch ${qb.compile().sql} ps ${JSON.stringify(f)}`);
593
- const e = yield q.executeTakeFirstOrThrow();
594
- epochEndTime = e.end_time;
595
- epochUi = e.ui;
596
- }
597
- else {
598
- epochUi = f.startEpochId.id.toString();
599
- }
600
- }
601
- let q = db
602
- .selectFrom((eb) => eb
603
- .selectFrom((eb) => {
604
- let b = eb
605
- .selectFrom(exports.SOL_TRANSFER_TABLE)
606
- .select(({ fn }) => fn.sum(`amount_payed`).as('payed'))
607
- .innerJoin(exports.ENTITY_TABLE, `${exports.SOL_TRANSFER_TABLE}.to_entity_id`, 'entity.id')
608
- .select(['entity.sol_key'])
609
- .groupBy('entity.sol_key');
610
- if (f.banned) {
611
- b = b.where('entity.banned', '=', true);
612
- }
613
- else {
614
- b = b.where('entity.banned', '=', false);
615
- }
616
- if (epochEndTime) {
617
- b = b
618
- .innerJoin(exports.SOL_TX_TABLE, `${exports.SOL_TX_TABLE}.id`, `${exports.SOL_TRANSFER_TABLE}.sol_tx_id`)
619
- .where(`${exports.SOL_TX_TABLE}.executed_at`, '>', epochEndTime);
620
- }
621
- if (f.channels && f.channels.length > 0) {
622
- b = b.where((eb) => eb.or(f.channels.map((c) => eb('sol_transfer1.channel', '=', c))));
623
- }
624
- else {
625
- b = b.where((eb) => eb.or([
626
- eb('sol_transfer1.channel', '=', 'node_operator'),
627
- eb('sol_transfer1.channel', '=', 'availability'),
628
- ]));
629
- }
630
- return b.as('y');
631
- })
632
- .fullJoin((eb) => {
633
- let b = eb
634
- .selectFrom(exports.LIABILITY_TABLE)
635
- .select(({ fn }) => fn.sum(`amount_due`).as('due'))
636
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
637
- .select(['entity.sol_key'])
638
- .groupBy('entity.sol_key');
639
- if (f.banned) {
640
- b = b.where('entity.banned', '=', true);
641
- }
642
- else {
643
- b = b.where('entity.banned', '=', false);
644
- }
645
- if (epochUi) {
646
- b = b
647
- .innerJoin(exports.EPOCH_TABLE, `${exports.LIABILITY_TABLE}.epoch_id`, `${exports.EPOCH_TABLE}.id`)
648
- .where(`${exports.EPOCH_TABLE}.ui`, '>=', epochUi);
649
- }
650
- if (f.channels && f.channels.length > 0) {
651
- b = b.where((eb) => eb.or(f.channels.map((c) => eb('liability.channel', '=', c))));
652
- }
653
- else {
654
- b = b.where((eb) => eb.or([
655
- eb('liability.channel', '=', 'node_operator'),
656
- eb('liability.channel', '=', 'availability'),
657
- ]));
658
- }
659
- return b.as('x');
660
- }, (join) => join.onRef('y.sol_key', '=', 'x.sol_key'))
661
- .select(({ fn }) => [
662
- fn.coalesce('y.sol_key', 'x.sol_key').as('sol_key'),
663
- (0, kysely_1.sql) `${fn.coalesce(`x.due`, (0, kysely_1.sql) `0`)} -
664
- ${fn.coalesce(`y.payed`, (0, kysely_1.sql) `0`)}`.as('out'),
665
- ])
666
- .as('z'))
667
- .selectAll();
668
- if (f.due == 'overpayed') {
669
- q = q.where('out', '<', '0');
670
- }
671
- else if (f.due == 'underpayed') {
672
- q = q.where('out', '>', '0');
673
- }
674
- log.info(`${q.compile().sql} ps ${JSON.stringify(Object.assign(Object.assign({}, f), { epochEndTime,
675
- epochUi }))}`);
676
- const res = yield q.execute();
677
- const out = {};
678
- for (const r of res) {
679
- out[r.sol_key] = BigInt(r.out);
680
- }
681
- return out;
682
- });
683
- },
684
- fetchNodeOperatorEpoch(epochId, log = logger_1.consoleLogger) {
685
- var _a;
686
- return __awaiter(this, void 0, void 0, function* () {
687
- const q = db
688
- .selectFrom(exports.JOB_ID_TABLE)
689
- .innerJoin(exports.EPOCH_TABLE, 'epoch.id', 'job_id.epoch_id')
690
- .leftJoin(exports.MANUAL_BURN_TABLE, 'manual_burn.epoch_id', 'epoch.id')
691
- .where('epoch.ui', '=', epochId.toString())
692
- .where('epoch.channel', '=', 'node_operator')
693
- .select([
694
- 'job_id.id',
695
- 'epoch.total_rndr',
696
- 'epoch.start_time',
697
- 'epoch.end_time',
698
- 'manual_burn.burned',
699
- 'manual_burn.tx_sig',
700
- ])
701
- .orderBy('job_id.id asc');
702
- log.debug(`fetch epoch info q ${q.compile().sql} epochId ${epochId}`);
703
- const res = yield q.execute();
704
- if (res.length == 0) {
705
- throw new Error(`epoch ${epochId} not found`);
706
- }
707
- log.debug(`fetchNodeOperatorEpoch -> fetching liablities`);
708
- const ks = yield db
709
- .selectFrom(exports.LIABILITY_TABLE)
710
- .innerJoin(exports.ENTITY_TABLE, 'liability.entity_id', 'entity.id')
711
- .select(({ fn }) => [
712
- (0, kysely_1.sql) `distinct
713
- (entity.sol_key)`.as('sol_key'),
714
- ])
715
- .innerJoin(exports.EPOCH_TABLE, 'liability.epoch_id', 'epoch.id')
716
- .where('epoch.ui', '=', epochId.toString())
717
- .where('epoch.channel', '=', 'node_operator')
718
- .where('liability.channel', '=', 'node_operator')
719
- .execute();
720
- log.debug(`fetchNodeOperatorEpoch -> fetched liablities`);
721
- const solKeys = ks.reduce((r, k) => {
722
- r[k.sol_key] = {};
723
- return r;
724
- }, {});
725
- return {
726
- jobIds: res.map((r) => Number(r.id)),
727
- totalRndr: BigInt(res[0].total_rndr),
728
- startTime: res[0].start_time,
729
- endTime: res[0].end_time,
730
- burned: BigInt((_a = res[0].burned) !== null && _a !== void 0 ? _a : 0),
731
- burnTx: res[0].tx_sig,
732
- solKeys,
733
- };
734
- });
735
- },
736
- insertEpoch(db, epoch, log = logger_1.consoleLogger) {
737
- return __awaiter(this, void 0, void 0, function* () {
738
- yield getOrInsertEpoch(db.trx, Object.assign(Object.assign({}, epoch), { uiEpochId: epoch.ui }), log);
739
- });
740
- },
741
- getEpoch(f, log = logger_1.consoleLogger) {
742
- var _a;
743
- return __awaiter(this, void 0, void 0, function* () {
744
- const now = new Date(Date.now());
745
- try {
746
- let q = db
747
- .selectFrom(exports.EPOCH_TABLE)
748
- .selectAll()
749
- .where('channel', '=', f.channel);
750
- if (f.epochId) {
751
- q = q.where('ui', '=', f.epochId.toString());
752
- }
753
- else {
754
- q = q.where('end_time', '<=', now);
755
- if (!f.savedAtNotNull) {
756
- q = q.where('saved_at', 'is', null);
757
- }
758
- else {
759
- q = q.where('saved_at', 'is not', null);
760
- }
761
- }
762
- q = q.orderBy('end_time desc').limit(1);
763
- const res = yield q.executeTakeFirstOrThrow();
764
- return {
765
- ui: Number(res.ui),
766
- channel: f.channel,
767
- startTime: res.start_time,
768
- endTime: res.end_time,
769
- savedAt: (_a = res.saved_at) !== null && _a !== void 0 ? _a : undefined,
770
- };
771
- }
772
- catch (e) {
773
- if (e instanceof kysely_1.NoResultError) {
774
- log.info(`no node operator epoch found`);
775
- return undefined;
776
- }
777
- throw e;
778
- }
779
- });
780
- },
781
- getLatestNodeOperatorEpoch(f, log = logger_1.consoleLogger) {
782
- var _a;
783
- return __awaiter(this, void 0, void 0, function* () {
784
- const now = new Date(Date.now());
785
- try {
786
- let q = db
787
- .selectFrom(exports.EPOCH_TABLE)
788
- .selectAll()
789
- .where('channel', '=', 'node_operator')
790
- .where('end_time', '<=', now);
791
- if (!f.latestDistributed) {
792
- q = q.where('saved_at', 'is', null).orderBy('end_time asc');
793
- }
794
- else {
795
- q = q.orderBy('end_time desc');
796
- }
797
- q = q.limit(1);
798
- const res = yield q.executeTakeFirstOrThrow();
799
- return {
800
- epochId: BigInt(res.ui),
801
- startedAt: res.start_time,
802
- endedAt: res.end_time,
803
- savedAt: (_a = res.saved_at) !== null && _a !== void 0 ? _a : undefined,
804
- };
805
- }
806
- catch (e) {
807
- if (e instanceof kysely_1.NoResultError) {
808
- log.info(`no node operator epoch found`);
809
- return undefined;
810
- }
811
- throw e;
812
- }
813
- });
814
- },
815
- insertEpochEntityInfo(db, eeis, log) {
816
- return __awaiter(this, void 0, void 0, function* () {
817
- for (const eei of eeis) {
818
- yield db.trx.insertInto(exports.ENTITY_EPOCH_INFO_TABLE).values(eei).execute();
819
- log.debug(`inserted eei ${JSON.stringify(eei)}`);
820
- }
821
- });
822
- },
823
- saveNodeOperatorEpoch(epochId, liabilities, jobIds, totalRndr, log = logger_1.consoleLogger) {
824
- return __awaiter(this, void 0, void 0, function* () {
825
- yield db
826
- .transaction()
827
- .setIsolationLevel('repeatable read')
828
- .execute((trx) => __awaiter(this, void 0, void 0, function* () {
829
- const { epochDbIds } = yield createPayments(trx, liabilities.map((l) => ({
830
- liability: l,
831
- })), log);
832
- log.info(`inserted liabilities`);
833
- for (const id of jobIds) {
834
- yield trx
835
- .insertInto(exports.JOB_ID_TABLE)
836
- .values({
837
- id: BigInt(id),
838
- epoch_id: epochDbIds[0],
839
- })
840
- .executeTakeFirstOrThrow();
841
- }
842
- const now = new Date();
843
- yield updateTotalRndr(db, { uiEpochId: epochId, channel: 'node_operator' }, totalRndr, now, log);
844
- log.debug(`saved epoch`);
845
- /*const now = new Date(Date.now())
846
- const res = await trx
847
- .updateTable(EPOCH_TABLE)
848
- .set({
849
- saved_at: now,
850
- total_rndr: totalRndr,
851
- })
852
- .where('channel')
853
- .where('ui', '=', epochId.toString())
854
- .where('', '=')
855
- .executeTakeFirstOrThrow()*/
856
- }));
857
- return;
858
- });
859
- },
860
- produceBurnedJobs(jobs, log = logger_1.consoleLogger) {
861
- return __awaiter(this, void 0, void 0, function* () {
862
- yield db.transaction().execute((trx) => __awaiter(this, void 0, void 0, function* () {
863
- var _a;
864
- let num = BigInt(0);
865
- for (const { amount, obhUsed, completedAt, jobId, userId } of jobs) {
866
- const res = yield trx
867
- .insertInto(exports.JOB_TABLE)
868
- .values({
869
- id: jobId,
870
- render_amt: amount,
871
- completed_at: completedAt,
872
- inserted_at: new Date(Date.now()),
873
- obh_used: obhUsed,
874
- user_id: userId,
875
- })
876
- .onConflict((oc) => oc.column('id').doNothing())
877
- .executeTakeFirstOrThrow();
878
- num += (_a = res.numInsertedOrUpdatedRows) !== null && _a !== void 0 ? _a : BigInt(0);
879
- }
880
- log.debug(`inserted ${num} of ${jobs.length} burn jobs`);
881
- }));
882
- });
883
- },
884
- markJobsBurntWithGrant(db, p, log = logger_1.consoleLogger) {
885
- var _a;
886
- return __awaiter(this, void 0, void 0, function* () {
887
- const solTxId = yield getOrInsertTx(db.trx, { sig: p.tx.sig, executedAt: p.tx.executedAt }, log);
888
- const { id } = yield db.trx
889
- .insertInto(exports.GRANT_BURN_TABLE)
890
- .values({
891
- sol_tx_id: solTxId,
892
- burned: p.burned,
893
- tags: (_a = p.tags) === null || _a === void 0 ? void 0 : _a.join(','),
894
- })
895
- .returning((eb) => ['id as id'])
896
- .executeTakeFirstOrThrow();
897
- const jobIdsStr = p.jobsIds.map(String);
898
- const res = yield db.trx
899
- .updateTable(exports.JOB_TABLE)
900
- .where('id', 'in', jobIdsStr)
901
- .set('grant_burn_id', id)
902
- .executeTakeFirstOrThrow();
903
- log.debug(`set grant_burn_id on ${res.numUpdatedRows} jobs`);
904
- for (const [userId, grantSpendDelta] of Object.entries(p.userIdToGrantSpendDelta)) {
905
- yield db.trx
906
- .insertInto(exports.USER_GRANT_SPEND_TABLE)
907
- .values({
908
- user_id: userId,
909
- grant_burn_id: id,
910
- render_spent_delta: -grantSpendDelta,
911
- })
912
- .executeTakeFirstOrThrow();
913
- }
914
- return;
915
- });
916
- },
917
- insertGrantSpend(db, p, log = logger_1.consoleLogger) {
918
- var _a, _b, _c;
919
- return __awaiter(this, void 0, void 0, function* () {
920
- const existing = yield getCurrentUserGrantSpend(db.trx, { userId: p.userId }, log);
921
- const diff = {
922
- render_spent: ((_a = existing === null || existing === void 0 ? void 0 : existing.renderSpent) !== null && _a !== void 0 ? _a : BigInt(0)) + p.renderSpentDelta,
923
- description: p.description ? p.description : existing === null || existing === void 0 ? void 0 : existing.description,
924
- perpetual: p.perpetual ? p.perpetual : (_b = existing === null || existing === void 0 ? void 0 : existing.perpetual) !== null && _b !== void 0 ? _b : false,
925
- updated_at: new Date(),
926
- };
927
- log.debug(`insertGrantSpend currUserGrantSpend: ${JSON.stringify(existing)} delta: ${JSON.stringify(p)}`);
928
- const res = yield db.trx
929
- .insertInto(exports.CURRENT_USER_GRANT_SPEND_TABLE)
930
- .values({
931
- user_id: p.userId,
932
- render_spent: p.renderSpentDelta,
933
- description: p.description,
934
- perpetual: (_c = p.perpetual) !== null && _c !== void 0 ? _c : false,
935
- })
936
- .onConflict((oc) => oc.column('user_id').doUpdateSet(diff))
937
- .returning((eb) => [
938
- 'user_id as user_id',
939
- 'render_spent as render_spent',
940
- 'description as description',
941
- 'perpetual as perpetual',
942
- 'updated_at as updated_at',
943
- ])
944
- .executeTakeFirstOrThrow();
945
- if (res) {
946
- log.debug(`inserted current_user_grant_spend row ${JSON.stringify(res)}`);
947
- }
948
- if (p.renderSpentDelta != BigInt(0)) {
949
- const v = {
950
- user_id: p.userId,
951
- render_spent_delta: p.renderSpentDelta,
952
- grant_burn_id: p.grantBurnId,
953
- };
954
- const res = yield db.trx
955
- .insertInto(exports.USER_GRANT_SPEND_TABLE)
956
- .values(v)
957
- .executeTakeFirstOrThrow();
958
- log.debug(`inserted ${res.numInsertedOrUpdatedRows} user_grant_spend rows ${JSON.stringify(v)}`);
959
- }
960
- });
961
- },
962
- markJobsBurnt(trx, p, log = logger_1.consoleLogger) {
963
- var _a, _b;
964
- return __awaiter(this, void 0, void 0, function* () {
965
- if (!p.buyBurn && !p.grantBurn) {
966
- throw new Error('no buyBurn or grantBurn');
967
- }
968
- const solTxId = yield getOrInsertTx(trx.trx, { sig: p.solTx.sig, executedAt: p.solTx.executedAt }, log);
969
- let buyBurnId;
970
- let grantBurnId;
971
- if (p.buyBurn) {
972
- const { burned, usdcSpent, eurToUsdc, renderToUsdc, quoteAmt, tags, burnAdjustmentId, toBurn, } = p.buyBurn;
973
- let pricedAt = p.buyBurn.pricedAt;
974
- if (!pricedAt) {
975
- const jobs = yield fetchJobs1(trx.trx, { ids: p.jobs.map((j) => String(j.id)) }, log);
976
- pricedAt = (0, exports.batchFinishedAtMedian)(jobs.map((j) => ({
977
- finishedAt: j.completedAt.toISOString(),
978
- jobId: j.id,
979
- rndrUsed: Number(j.rndrUsed.toString()),
980
- })));
981
- }
982
- const { id } = yield trx.trx
983
- .insertInto(exports.BURN_TABLE)
984
- .values({
985
- sol_tx_id: solTxId,
986
- priced_at: pricedAt,
987
- eur_to_usdc: eurToUsdc,
988
- render_to_usdc: renderToUsdc,
989
- usdc_spent: usdcSpent,
990
- quote_amt: quoteAmt,
991
- burned: burned,
992
- tags: tags.join(','),
993
- burn_adjustment_id: burnAdjustmentId,
994
- to_burn: toBurn,
995
- })
996
- //.onConflict((oc) => oc.column('sol_tx').doNothing())
997
- .returning((eb) => ['id as id'])
998
- .executeTakeFirstOrThrow();
999
- buyBurnId = Number(id);
1000
- }
1001
- if (p.grantBurn) {
1002
- const { burned, tags } = p.grantBurn;
1003
- const { id } = yield trx.trx
1004
- .insertInto(exports.GRANT_BURN_TABLE)
1005
- .values({
1006
- sol_tx_id: solTxId,
1007
- burned: burned,
1008
- tags: tags === null || tags === void 0 ? void 0 : tags.join(','),
1009
- })
1010
- .returning((eb) => ['id as id'])
1011
- .executeTakeFirstOrThrow();
1012
- grantBurnId = Number(id);
1013
- }
1014
- for (const job of p.jobs) {
1015
- const res = yield trx.trx
1016
- .updateTable(exports.JOB_TABLE)
1017
- .where('id', '=', String(job.id))
1018
- .set('burn_id', job.buyRenderAmt != undefined ? buyBurnId : null)
1019
- .set('grant_burn_id', job.grantRenderAmt != undefined ? grantBurnId : null)
1020
- .set('buy_render_amt', (_a = job.buyRenderAmt) !== null && _a !== void 0 ? _a : 0)
1021
- .set('grant_render_amt', (_b = job.grantRenderAmt) !== null && _b !== void 0 ? _b : 0)
1022
- .executeTakeFirstOrThrow();
1023
- log.debug(`set grant_burn_id ${grantBurnId} burn_id ${buyBurnId} buy_render_amt ${job.buyRenderAmt} grant_render_amt ${job.grantRenderAmt} on ${res.numUpdatedRows} jobs id ${job.id}`);
1024
- }
1025
- return { grantBurnId, buyBurnId };
1026
- });
1027
- },
1028
- markJobsBurned(trx, p, log = logger_1.consoleLogger) {
1029
- return __awaiter(this, void 0, void 0, function* () {
1030
- let { markedAt, solTx } = p;
1031
- let res = yield trx.trx
1032
- .updateTable(exports.BURN_TABLE)
1033
- .set({ marked_burned_at: markedAt })
1034
- .from(exports.SOL_TX_TABLE)
1035
- .whereRef('burn.sol_tx_id', '=', 'sol_tx.id')
1036
- .where('sol_tx.sig', '=', solTx)
1037
- .executeTakeFirst();
1038
- if (res) {
1039
- log.debug(`buy burn set ${res.numUpdatedRows} ${solTx} -> marked_burned_at ${markedAt.toISOString()}`);
1040
- }
1041
- let res1 = yield trx.trx
1042
- .updateTable(exports.GRANT_BURN_TABLE)
1043
- .set({ marked_burned_at: markedAt })
1044
- .from(exports.SOL_TX_TABLE)
1045
- .whereRef('grant_burn.sol_tx_id', '=', 'sol_tx.id')
1046
- .where('sol_tx.sig', '=', solTx)
1047
- .executeTakeFirst();
1048
- if (res1) {
1049
- log.debug(`grant burn set ${res1.numUpdatedRows} ${solTx} -> marked_burned_at ${markedAt.toISOString()}`);
1050
- }
1051
- });
1052
- },
1053
- consumeAndLockBurnJobs(limit, lowerRndrThreshold, upperRndrThreshold, log = logger_1.consoleLogger) {
1054
- return __awaiter(this, void 0, void 0, function* () {
1055
- const trx = yield (0, base_2.begin)(db, log);
1056
- const q = trx.trx
1057
- .selectFrom(trx.trx
1058
- .selectFrom(exports.JOB_TABLE)
1059
- .select(({ fn, val, ref }) => [
1060
- 'id',
1061
- fn
1062
- .sum('render_amt')
1063
- .over((ob) => ob.orderBy(`completed_at`, `asc`))
1064
- .as('total'),
1065
- ])
1066
- .where('burn_id', 'is', null)
1067
- .where('grant_burn_id', 'is', null)
1068
- .as('t'))
1069
- .select('id')
1070
- .where('total', '>=', lowerRndrThreshold)
1071
- .where('total', '<=', upperRndrThreshold);
1072
- log.debug(`outstanding jobs q: ${q.compile().sql} ${JSON.stringify({
1073
- limit,
1074
- lowerRndrThreshold,
1075
- upperRndrThreshold,
1076
- })}`);
1077
- const idRs = yield q.execute();
1078
- const ids = idRs.map((x) => x.id);
1079
- log.debug(`${ids.length} candidate jobs for burn. locking up to ${limit} jobs`);
1080
- if (ids.length == 0) {
1081
- return { trx, jobs: [] };
1082
- }
1083
- const rows = yield trx.trx
1084
- .selectFrom(exports.JOB_TABLE)
1085
- .selectAll()
1086
- .where('id', 'in', ids)
1087
- .limit(limit)
1088
- .forUpdate()
1089
- .skipLocked()
1090
- .execute();
1091
- log.debug(`locked ${rows.length} jobs`);
1092
- const jobs = [];
1093
- for (const r of rows) {
1094
- jobs.push({
1095
- id: Number(r.id),
1096
- completedAt: r.completed_at,
1097
- userId: r.user_id,
1098
- rndrUsed: BigInt(r.render_amt),
1099
- });
1100
- }
1101
- return { trx, jobs };
1102
- });
1103
- },
1104
- paymentMetrics(log) {
1105
- return __awaiter(this, void 0, void 0, function* () {
1106
- // Get the latest epochs for each channel
1107
- const latestEpochs = yield db
1108
- .selectFrom(exports.EPOCH_TABLE)
1109
- .select(['id', 'ui', 'channel', 'start_time', 'end_time'])
1110
- .where('channel', 'in', [
1111
- 'availability',
1112
- 'node_operator',
1113
- 'render_compute_network',
1114
- ])
1115
- .distinctOn('channel')
1116
- .where('saved_at', 'is not', null)
1117
- .orderBy('channel')
1118
- .orderBy('ui', 'desc')
1119
- .execute();
1120
- // Calculate distributed rewards for each channel
1121
- let availabilityRewards = 0;
1122
- let nodeOperatorRewards = 0;
1123
- let renderComputeNetworkRewards = 0;
1124
- let latestEpochId = 0;
1125
- for (const epoch of latestEpochs) {
1126
- if (!epoch.end_time) {
1127
- log === null || log === void 0 ? void 0 : log.info(`Skipping epoch ${epoch.ui} for channel ${epoch.channel} - no end_time`);
1128
- continue;
1129
- }
1130
- // Get total distributed rewards for this channel after epoch ended
1131
- const transfersResult = yield db
1132
- .selectFrom(exports.SOL_TRANSFER_TABLE)
1133
- .innerJoin('sol_tx', 'sol_tx.id', `${exports.SOL_TRANSFER_TABLE}.sol_tx_id`)
1134
- .select([(eb) => eb.fn.sum('amount_payed').as('total_distributed')])
1135
- .where(`${exports.SOL_TRANSFER_TABLE}.channel`, '=', epoch.channel)
1136
- .where('sol_tx.executed_at', '>', epoch.end_time)
1137
- .executeTakeFirst();
1138
- const totalDistributed = Number((transfersResult === null || transfersResult === void 0 ? void 0 : transfersResult.total_distributed) || 0);
1139
- switch (epoch.channel) {
1140
- case 'availability':
1141
- availabilityRewards = totalDistributed;
1142
- break;
1143
- case 'node_operator':
1144
- nodeOperatorRewards = totalDistributed;
1145
- latestEpochId = Number(epoch.ui);
1146
- break;
1147
- case 'render_compute_network':
1148
- renderComputeNetworkRewards = totalDistributed;
1149
- break;
1150
- }
1151
- log === null || log === void 0 ? void 0 : log.info(`Channel ${epoch.channel}: ${totalDistributed} distributed after epoch ${epoch.ui}`);
1152
- }
1153
- return {
1154
- latestEpochId,
1155
- availabilityRewards,
1156
- nodeOperatorRewards,
1157
- renderComputeNetworkRewards,
1158
- };
1159
- });
1160
- },
1161
- incrBuyBurnMetrics(log = logger_1.consoleLogger) {
1162
- var _a;
1163
- return __awaiter(this, void 0, void 0, function* () {
1164
- const res = yield db
1165
- .selectFrom(exports.JOB_TABLE)
1166
- .select('inserted_at')
1167
- .orderBy('completed_at asc')
1168
- .where('burn_id', 'is', null)
1169
- .execute();
1170
- if (res.length == 0) {
1171
- return { outstandingJobs: 0 };
1172
- }
1173
- return {
1174
- outstandingJobs: res.length,
1175
- oldestJobInsertedAt: (_a = res[0].inserted_at) !== null && _a !== void 0 ? _a : undefined,
1176
- };
1177
- });
1178
- },
1179
- fetchBurns(db, f, log = logger_1.consoleLogger) {
1180
- var _a, _b;
1181
- return __awaiter(this, void 0, void 0, function* () {
1182
- let q = db.trx
1183
- .selectFrom('burn')
1184
- .selectAll('burn')
1185
- .innerJoin('sol_tx', 'sol_tx.id', 'burn.sol_tx_id')
1186
- .select(['sol_tx.executed_at', 'sol_tx.sig']);
1187
- if (!f.inclManual) {
1188
- q = q.where('burn.usdc_spent', '>', String(0));
1189
- }
1190
- if (f.executedAfter) {
1191
- q = q.where('sol_tx.executed_at', '>=', f.executedAfter);
1192
- }
1193
- if (f.executedBefore) {
1194
- q = q.where('sol_tx.executed_at', '<=', f.executedBefore);
1195
- }
1196
- if (f.pricedAtBefore) {
1197
- q = q.where('burn.priced_at', '<=', f.pricedAtBefore);
1198
- }
1199
- if (f.pricedAtAfter) {
1200
- q = q.where('burn.priced_at', '>=', f.pricedAtAfter);
1201
- }
1202
- if (f.orderBy == 'pricedAt') {
1203
- q = q.orderBy(['burn.priced_at']);
1204
- }
1205
- else if (f.orderBy == 'executedAt') {
1206
- q = q.orderBy(['sol_tx.executed_at']);
1207
- }
1208
- log.info(`fetchBurns q ${q.compile().sql} ${JSON.stringify(f)}`);
1209
- const burns = [];
1210
- const burnIdToIdx = {};
1211
- const comp = q.compile();
1212
- const { rows } = yield (0, base_1.timedQuery)(pgPool, comp.sql, comp.parameters, 'fetchBurns', log);
1213
- log.info(`fetchBurns len ${rows.length}`);
1214
- for (const r of rows) {
1215
- burns.push({
1216
- jobs: [],
1217
- id: Number(r.id),
1218
- renderToUsdc: r.render_to_usdc,
1219
- solTx: r.sig,
1220
- executedAt: r.executed_at,
1221
- pricedAt: r.priced_at,
1222
- usdcSpent: BigInt((_a = r.usdc_spent) !== null && _a !== void 0 ? _a : 0),
1223
- quoteAmt: BigInt((_b = r.quote_amt) !== null && _b !== void 0 ? _b : 0),
1224
- burned: BigInt(r.burned),
1225
- eurToUsdc: r.eur_to_usdc,
1226
- markedBurnedAt: r.marked_burned_at,
1227
- tags: r.tags ? r.tags.split(',') : [],
1228
- });
1229
- burnIdToIdx[r.id] = burns.length - 1;
1230
- }
1231
- if (f.inclJobs) {
1232
- const jobRows = yield db.trx
1233
- .selectFrom('job')
1234
- .selectAll('job')
1235
- .where('burn_id', 'in', rows.map((r) => r.id))
1236
- .execute();
1237
- log.info(`fetchBurns jobRows len ${jobRows.length}`);
1238
- for (const r of jobRows) {
1239
- burns[burnIdToIdx[r.burn_id]].jobs.push({
1240
- id: Number(r.id),
1241
- completedAt: r.completed_at,
1242
- rndrUsed: BigInt(r.render_amt),
1243
- obhUsed: r.obh_used ? Number(r.obh_used) : undefined,
1244
- });
1245
- }
1246
- }
1247
- return burns;
1248
- });
1249
- },
1250
- createBridgeTransfers(db, bts, log = logger_1.consoleLogger) {
1251
- return __awaiter(this, void 0, void 0, function* () {
1252
- return createBridgeTransfers(db.trx, bts, log);
1253
- });
1254
- },
1255
- getBridgeTransfers({ solKey, page, }, log = logger_1.consoleLogger) {
1256
- return __awaiter(this, void 0, void 0, function* () {
1257
- let q = db
1258
- .selectFrom(exports.BRIDGE_TRANSFER_TABLE)
1259
- .innerJoin(exports.EPOCH_TABLE, 'epoch.id', 'bridge_transfer.epoch_id')
1260
- .innerJoin(exports.ENTITY_TABLE, 'entity.id', 'bridge_transfer.entity_id')
1261
- .select([
1262
- 'entity.sol_key',
1263
- 'bridge_transfer.sequence',
1264
- 'bridge_transfer.created_at',
1265
- 'bridge_transfer.amount',
1266
- 'bridge_transfer.upgrade_bracket',
1267
- 'bridge_transfer.prior_supply',
1268
- 'bridge_transfer.points',
1269
- 'epoch.ui',
1270
- ]);
1271
- let limit = 10000;
1272
- if (page && page.limit) {
1273
- limit = page.limit;
1274
- }
1275
- q = q.limit(page.limit).orderBy(`${exports.BRIDGE_TRANSFER_TABLE}.id`);
1276
- let offset = 0;
1277
- if (page && page.cursor) {
1278
- offset = Number(atob(page.cursor));
1279
- q = q.offset(offset);
1280
- }
1281
- if (solKey) {
1282
- q = q.where('entity.sol_key', '=', solKey);
1283
- }
1284
- const c = q.compile();
1285
- log.debug(`fetch bridge transfers ${c.sql} params ${c.parameters}`);
1286
- const res = yield q.execute();
1287
- log.info(`bridge transfers ${res.length}`);
1288
- return {
1289
- bts: res.map((row) => {
1290
- return {
1291
- solKey: row.sol_key,
1292
- seq: BigInt(row.sequence),
1293
- createdAt: row.created_at,
1294
- amount: BigInt(row.amount),
1295
- upgradeBracket: row.upgrade_bracket
1296
- ? Number(row.upgrade_bracket)
1297
- : undefined,
1298
- priorSupply: BigInt(row.prior_supply),
1299
- points: row.points ? BigInt(row.points) : undefined,
1300
- epochId: Number(row.ui),
1301
- };
1302
- }),
1303
- cursor: res.length == limit ? btoa(`${res.length + offset}`) : undefined,
1304
- };
1305
- });
1306
- },
1307
- getLiabilitySolKeys(f) {
1308
- return __awaiter(this, void 0, void 0, function* () {
1309
- let q = db
1310
- .selectFrom(exports.LIABILITY_TABLE)
1311
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
1312
- .select(({ fn }) => [
1313
- (0, kysely_1.sql) `distinct
1314
- (entity.sol_key)`.as('sol_key'),
1315
- ])
1316
- .where(`${exports.LIABILITY_TABLE}.channel`, '=', f.channel);
1317
- if (f.epoch) {
1318
- q = q.where('liability.epoch_id', '=', db
1319
- .selectFrom('epoch')
1320
- .select('id')
1321
- .where('channel', '=', f.channel)
1322
- .where('ui', '=', String(f.epoch)));
1323
- }
1324
- const ks = yield q.execute();
1325
- const solKeys = {};
1326
- for (const k of ks) {
1327
- solKeys[k.sol_key] = {};
1328
- }
1329
- return solKeys;
1330
- });
1331
- },
1332
- getTotalBurned(db) {
1333
- var _a, _b;
1334
- return __awaiter(this, void 0, void 0, function* () {
1335
- const total = yield db.trx
1336
- .selectFrom('burn')
1337
- .select(({ fn }) => fn.sum('burned').as('total_burned'))
1338
- .execute();
1339
- return BigInt((_b = (_a = total[0]) === null || _a === void 0 ? void 0 : _a.total_burned) !== null && _b !== void 0 ? _b : 0);
1340
- });
1341
- },
1342
- insertBurn(p, log = logger_1.consoleLogger) {
1343
- return __awaiter(this, void 0, void 0, function* () {
1344
- yield db.transaction().execute((trx) => __awaiter(this, void 0, void 0, function* () {
1345
- var _a;
1346
- const solTxId = yield getOrInsertTx(trx, { sig: p.solTx, executedAt: p.executedAt }, log);
1347
- const { id } = yield trx
1348
- .insertInto(exports.BURN_TABLE)
1349
- .values({
1350
- sol_tx_id: solTxId,
1351
- priced_at: p.pricedAt,
1352
- usdc_spent: p.usdcSpent,
1353
- quote_amt: p.quoteAmt,
1354
- burned: p.burned,
1355
- marked_burned_at: p.markedBurnedAt,
1356
- })
1357
- //.onConflict((oc) => oc.column('sol_tx').doNothing())
1358
- .returning((eb) => ['id as id'])
1359
- .executeTakeFirstOrThrow();
1360
- let num = BigInt(0);
1361
- for (const { rndrUsed, completedAt, id: jobId, insertedAt, userId, } of p.jobs) {
1362
- const res = yield trx
1363
- .insertInto(exports.JOB_TABLE)
1364
- .values({
1365
- id: jobId,
1366
- render_amt: rndrUsed,
1367
- burn_id: id,
1368
- completed_at: completedAt,
1369
- inserted_at: insertedAt !== null && insertedAt !== void 0 ? insertedAt : new Date(),
1370
- user_id: userId,
1371
- })
1372
- .onConflict((oc) => oc.column('id').doNothing())
1373
- .executeTakeFirstOrThrow();
1374
- num += (_a = res.numInsertedOrUpdatedRows) !== null && _a !== void 0 ? _a : BigInt(0);
1375
- }
1376
- log.debug(`burn id ${id} inserted ${num} of ${p.jobs.length} burn jobs`);
1377
- }));
1378
- });
1379
- },
1380
- fetchJobs(db, f, log = logger_1.consoleLogger) {
1381
- return __awaiter(this, void 0, void 0, function* () {
1382
- return yield fetchJobs1(db.trx, f, log);
1383
- });
1384
- },
1385
- fetchLiabilityEpochs(db, log = logger_1.consoleLogger) {
1386
- return __awaiter(this, void 0, void 0, function* () {
1387
- const q = db.trx
1388
- .selectFrom(exports.LIABILITY_TABLE)
1389
- .select(({ fn }) => [
1390
- `${exports.LIABILITY_TABLE}.channel`,
1391
- fn.sum(`${exports.LIABILITY_TABLE}.amount_due`).as('amount_due'),
1392
- ])
1393
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, `${exports.LIABILITY_TABLE}.epoch_id`)
1394
- .select(['ui', 'start_time', 'end_time'])
1395
- .groupBy([
1396
- 'liability.channel',
1397
- 'epoch.ui',
1398
- 'epoch.start_time',
1399
- 'epoch.end_time',
1400
- ])
1401
- .orderBy(['epoch.start_time desc']);
1402
- // Fetch node_operator SOL key metadata separately
1403
- const nodeOpMetadataQuery = db.trx
1404
- .selectFrom(exports.LIABILITY_TABLE)
1405
- .select([`${exports.LIABILITY_TABLE}.obh_used`])
1406
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, `${exports.LIABILITY_TABLE}.epoch_id`)
1407
- .select([`${exports.EPOCH_TABLE}.ui as epoch_ui`])
1408
- .innerJoin('entity', 'entity.id', `${exports.LIABILITY_TABLE}.entity_id`)
1409
- .select(['entity.sol_key'])
1410
- .where(`${exports.LIABILITY_TABLE}.channel`, '=', 'node_operator')
1411
- .where('entity.sol_key', 'is not', null)
1412
- .where(`${exports.LIABILITY_TABLE}.obh_used`, 'is not', null);
1413
- log.debug(`fetchLiabilityEpochs ${q.compile().sql}`);
1414
- log.debug(`nodeOpMetadata ${nodeOpMetadataQuery.compile().sql}`);
1415
- const [rs, nodeOpMetadata] = yield Promise.all([
1416
- q.execute(),
1417
- nodeOpMetadataQuery.execute(),
1418
- ]);
1419
- // Group node operator metadata by epoch
1420
- const metadataByEpoch = {};
1421
- nodeOpMetadata.forEach((row) => {
1422
- const epochId = Number(row.epoch_ui);
1423
- if (!metadataByEpoch[epochId]) {
1424
- metadataByEpoch[epochId] = {};
1425
- }
1426
- if (row.sol_key && row.obh_used !== null) {
1427
- metadataByEpoch[epochId][row.sol_key] = {
1428
- obhUsed: Number(row.obh_used),
1429
- };
1430
- }
1431
- });
1432
- return rs.map((r) => ({
1433
- epochId: Number(r.ui),
1434
- channel: r.channel,
1435
- start: r.start_time,
1436
- end: r.end_time,
1437
- amountDue: Number(r.amount_due),
1438
- metadataBySolKey: r.channel === 'node_operator'
1439
- ? metadataByEpoch[Number(r.ui)] || {}
1440
- : {},
1441
- }));
1442
- });
1443
- },
1444
- getBurnAdjustments(trx, ps, log = logger_1.consoleLogger) {
1445
- return __awaiter(this, void 0, void 0, function* () {
1446
- if (ps.toFill) {
1447
- const q = trx.trx
1448
- .selectFrom(exports.BURN_ADJUSTMENT_TABLE)
1449
- .selectAll(exports.BURN_ADJUSTMENT_TABLE)
1450
- .innerJoin(exports.JOB_TABLE, `${exports.JOB_TABLE}.id`, `${exports.BURN_ADJUSTMENT_TABLE}.job_id`)
1451
- .select([`${exports.JOB_TABLE}.completed_at`, `${exports.JOB_TABLE}.render_amt`])
1452
- .leftJoin(exports.BURN_TABLE, `${exports.BURN_TABLE}.burn_adjustment_id`, `${exports.BURN_ADJUSTMENT_TABLE}.id`)
1453
- .select(({ fn, lit }) => [
1454
- fn
1455
- .sum(fn.coalesce(`${exports.BURN_TABLE}.to_burn`, lit(0)))
1456
- .as('tot_to_burn'),
1457
- fn
1458
- .sum(fn.coalesce(`${exports.BURN_TABLE}.burned`, lit(0)))
1459
- .as('tot_burned'),
1460
- ])
1461
- .groupBy([
1462
- `${exports.BURN_ADJUSTMENT_TABLE}.id`,
1463
- `${exports.JOB_TABLE}.completed_at`,
1464
- `${exports.JOB_TABLE}.render_amt`,
1465
- ])
1466
- .havingRef((0, kysely_1.sql) `SUM(COALESCE("burn"."to_burn", 0)) - SUM(COALESCE("burn"."burned", 0))`, '<', `${exports.BURN_ADJUSTMENT_TABLE}.down_adj_to_burn`);
1467
- log.info(`getBurnAdjustments ${q.compile().sql}`);
1468
- const res = yield q.execute();
1469
- return res.map((r) => ({
1470
- id: Number(r.id),
1471
- createdAt: r.created_at,
1472
- jobId: Number(r.job_id),
1473
- downAdjRndrUsed: Number(r.down_adj_rndr_used),
1474
- downAdjToBurn: Number(r.down_adj_to_burn),
1475
- adjusted: Number(r.tot_to_burn) - Number(r.tot_burned),
1476
- job: {
1477
- id: Number(r.job_id),
1478
- completedAt: r.completed_at,
1479
- rndrUsed: BigInt(r.render_amt),
1480
- },
1481
- }));
1482
- }
1483
- return [];
1484
- });
1485
- },
1486
- insertPolygonUpgrade(db, p, log = logger_1.consoleLogger) {
1487
- return __awaiter(this, void 0, void 0, function* () {
1488
- const solTxId = yield getOrInsertTx(db.trx, {
1489
- sig: p.solTx.sig,
1490
- executedAt: p.solTx.executedAt,
1491
- });
1492
- yield db.trx
1493
- .insertInto(exports.POLYGON_UPGRADE_TABLE)
1494
- .values({
1495
- eth_addr: p.ethAddr,
1496
- sol_addr: p.solAddr,
1497
- amount: p.amount,
1498
- sol_tx_id: solTxId,
1499
- })
1500
- .execute();
1501
- log.info(`insertPolygonUpgrade ${JSON.stringify(p)}`);
1502
- return;
1503
- });
1504
- },
1505
- fetchPolygonUpgrades(db, f, log = logger_1.consoleLogger) {
1506
- return __awaiter(this, void 0, void 0, function* () {
1507
- let query = db.trx
1508
- .selectFrom('polygon_upgrade')
1509
- .selectAll('polygon_upgrade')
1510
- .innerJoin('sol_tx', 'sol_tx.id', 'polygon_upgrade.sol_tx_id')
1511
- .select(['sol_tx.sig', 'sol_tx.executed_at'])
1512
- .orderBy('sol_tx.executed_at', 'desc');
1513
- if (f.executedAfter) {
1514
- query = query.where('sol_tx.executed_at', '>=', f.executedAfter);
1515
- }
1516
- if (f.executedBefore) {
1517
- query = query.where('sol_tx.executed_at', '<=', f.executedBefore);
1518
- }
1519
- const results = yield query.execute();
1520
- log.info(`fetchPolygonUpgrades returned ${results.length} records`);
1521
- return results.map((row) => ({
1522
- ethAddr: row.eth_addr,
1523
- solAddr: row.sol_addr,
1524
- amount: BigInt(row.amount.toString()),
1525
- solTx: {
1526
- sig: row.sig,
1527
- executedAt: row.executed_at,
1528
- },
1529
- }));
1530
- });
1531
- },
1532
- getCurrentUserGrantSpend(db, f, log = logger_1.consoleLogger) {
1533
- return __awaiter(this, void 0, void 0, function* () {
1534
- return yield getCurrentUserGrantSpend(db.trx, f, log);
1535
- });
1536
- },
1537
- deleteAll(log = logger_1.consoleLogger) {
1538
- return __awaiter(this, void 0, void 0, function* () {
1539
- if (config.database.includes('render')) {
1540
- throw new Error('cannot nuke from deployed database. call from tests only');
1541
- }
1542
- const tx = yield (0, base_2.begin)(db, log);
1543
- try {
1544
- const res = yield Promise.all([
1545
- tx.trx
1546
- .deleteFrom(exports.SOL_TX_TABLE)
1547
- .where('id', 'is not', null)
1548
- .executeTakeFirst(),
1549
- tx.trx.deleteFrom(exports.LIABILITY_TABLE).executeTakeFirstOrThrow(),
1550
- tx.trx.deleteFrom(exports.SOL_TRANSFER_TABLE).executeTakeFirstOrThrow(),
1551
- tx.trx
1552
- .deleteFrom(exports.EPOCH_TABLE)
1553
- .where('id', 'is not', null)
1554
- .executeTakeFirst(),
1555
- tx.trx
1556
- .deleteFrom(exports.ENTITY_TABLE)
1557
- .where('id', 'is not', null)
1558
- .executeTakeFirst(),
1559
- tx.trx
1560
- .deleteFrom(exports.MANUAL_BURN_TABLE)
1561
- .where('epoch_id', 'is not', null)
1562
- .executeTakeFirst(),
1563
- tx.trx
1564
- .deleteFrom(exports.JOB_ID_TABLE)
1565
- .where('id', 'is not', null)
1566
- .executeTakeFirst(),
1567
- tx.trx
1568
- .deleteFrom(exports.JOB_TABLE)
1569
- .where('id', 'is not', null)
1570
- .executeTakeFirst(),
1571
- tx.trx
1572
- .deleteFrom(exports.BURN_TABLE)
1573
- .where('id', 'is not', null)
1574
- .executeTakeFirst(),
1575
- ]);
1576
- tx.commit();
1577
- }
1578
- catch (e) {
1579
- log.error(`caught ${e}`);
1580
- tx.rollback();
1581
- }
1582
- });
1583
- },
1584
- };
1585
- };
1586
- exports.pgClient = pgClient;
1587
- //# sourceMappingURL=v2Client.js.map