@render-foundation/utils 0.0.186 → 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 +1 -1
  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 -1586
  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 -1467
  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,1586 +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;
573
- return __awaiter(this, void 0, void 0, function* () {
574
- let epochUi;
575
- let epochEndTime;
576
- if (f.startEpochId.id) {
577
- if (((_a = f.channels) === null || _a === void 0 ? void 0 : _a.includes('node_operator')) ||
578
- ((_b = f.channels) === null || _b === void 0 ? void 0 : _b.includes('availability')) ||
579
- ((_c = f.channels) === null || _c === void 0 ? void 0 : _c.includes('render_compute_network'))) {
580
- let qb = db
581
- .selectFrom(exports.EPOCH_TABLE)
582
- .selectAll(exports.EPOCH_TABLE)
583
- .where('ui', '=', f.startEpochId.id.toString())
584
- .where('channel', 'in', f.channels);
585
- if (f.startEpochId.savedAtNotNull) {
586
- qb = qb.where('saved_at', 'is not', null);
587
- }
588
- const q = qb
589
- .orderBy('ui', 'desc')
590
- .limit(1);
591
- log.info(`getOutstanding->epoch ${qb.compile().sql} ps ${JSON.stringify(f)}`);
592
- const e = yield q.executeTakeFirstOrThrow();
593
- epochEndTime = e.end_time;
594
- epochUi = e.ui;
595
- }
596
- else {
597
- epochUi = f.startEpochId.id.toString();
598
- }
599
- }
600
- let q = db
601
- .selectFrom((eb) => eb
602
- .selectFrom((eb) => {
603
- let b = eb
604
- .selectFrom(exports.SOL_TRANSFER_TABLE)
605
- .select(({ fn }) => fn.sum(`amount_payed`).as('payed'))
606
- .innerJoin(exports.ENTITY_TABLE, `${exports.SOL_TRANSFER_TABLE}.to_entity_id`, 'entity.id')
607
- .select(['entity.sol_key'])
608
- .groupBy('entity.sol_key');
609
- if (f.banned) {
610
- b = b.where('entity.banned', '=', true);
611
- }
612
- else {
613
- b = b.where('entity.banned', '=', false);
614
- }
615
- if (epochEndTime) {
616
- b = b
617
- .innerJoin(exports.SOL_TX_TABLE, `${exports.SOL_TX_TABLE}.id`, `${exports.SOL_TRANSFER_TABLE}.sol_tx_id`)
618
- .where(`${exports.SOL_TX_TABLE}.executed_at`, '>', epochEndTime);
619
- }
620
- if (f.channels && f.channels.length > 0) {
621
- b = b.where((eb) => eb.or(f.channels.map((c) => eb('sol_transfer1.channel', '=', c))));
622
- }
623
- else {
624
- b = b.where((eb) => eb.or([
625
- eb('sol_transfer1.channel', '=', 'node_operator'),
626
- eb('sol_transfer1.channel', '=', 'availability'),
627
- ]));
628
- }
629
- return b.as('y');
630
- })
631
- .fullJoin((eb) => {
632
- let b = eb
633
- .selectFrom(exports.LIABILITY_TABLE)
634
- .select(({ fn }) => fn.sum(`amount_due`).as('due'))
635
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
636
- .select(['entity.sol_key'])
637
- .groupBy('entity.sol_key');
638
- if (f.banned) {
639
- b = b.where('entity.banned', '=', true);
640
- }
641
- else {
642
- b = b.where('entity.banned', '=', false);
643
- }
644
- if (epochUi) {
645
- b = b
646
- .innerJoin(exports.EPOCH_TABLE, `${exports.LIABILITY_TABLE}.epoch_id`, `${exports.EPOCH_TABLE}.id`)
647
- .where(`${exports.EPOCH_TABLE}.ui`, '>=', epochUi);
648
- }
649
- if (f.channels && f.channels.length > 0) {
650
- b = b.where((eb) => eb.or(f.channels.map((c) => eb('liability.channel', '=', c))));
651
- }
652
- else {
653
- b = b.where((eb) => eb.or([
654
- eb('liability.channel', '=', 'node_operator'),
655
- eb('liability.channel', '=', 'availability'),
656
- ]));
657
- }
658
- return b.as('x');
659
- }, (join) => join.onRef('y.sol_key', '=', 'x.sol_key'))
660
- .select(({ fn }) => [
661
- fn.coalesce('y.sol_key', 'x.sol_key').as('sol_key'),
662
- (0, kysely_1.sql) `${fn.coalesce(`x.due`, (0, kysely_1.sql) `0`)} -
663
- ${fn.coalesce(`y.payed`, (0, kysely_1.sql) `0`)}`.as('out'),
664
- ])
665
- .as('z'))
666
- .selectAll();
667
- if (f.due == 'overpayed') {
668
- q = q.where('out', '<', '0');
669
- }
670
- else if (f.due == 'underpayed') {
671
- q = q.where('out', '>', '0');
672
- }
673
- log.info(`${q.compile().sql} ps ${JSON.stringify(Object.assign(Object.assign({}, f), { epochEndTime,
674
- epochUi }))}`);
675
- const res = yield q.execute();
676
- const out = {};
677
- for (const r of res) {
678
- out[r.sol_key] = BigInt(r.out);
679
- }
680
- return out;
681
- });
682
- },
683
- fetchNodeOperatorEpoch(epochId, log = logger_1.consoleLogger) {
684
- var _a;
685
- return __awaiter(this, void 0, void 0, function* () {
686
- const q = db
687
- .selectFrom(exports.JOB_ID_TABLE)
688
- .innerJoin(exports.EPOCH_TABLE, 'epoch.id', 'job_id.epoch_id')
689
- .leftJoin(exports.MANUAL_BURN_TABLE, 'manual_burn.epoch_id', 'epoch.id')
690
- .where('epoch.ui', '=', epochId.toString())
691
- .where('epoch.channel', '=', 'node_operator')
692
- .select([
693
- 'job_id.id',
694
- 'epoch.total_rndr',
695
- 'epoch.start_time',
696
- 'epoch.end_time',
697
- 'manual_burn.burned',
698
- 'manual_burn.tx_sig',
699
- ])
700
- .orderBy('job_id.id asc');
701
- log.debug(`fetch epoch info q ${q.compile().sql} epochId ${epochId}`);
702
- const res = yield q.execute();
703
- if (res.length == 0) {
704
- throw new Error(`epoch ${epochId} not found`);
705
- }
706
- log.debug(`fetchNodeOperatorEpoch -> fetching liablities`);
707
- const ks = yield db
708
- .selectFrom(exports.LIABILITY_TABLE)
709
- .innerJoin(exports.ENTITY_TABLE, 'liability.entity_id', 'entity.id')
710
- .select(({ fn }) => [
711
- (0, kysely_1.sql) `distinct
712
- (entity.sol_key)`.as('sol_key'),
713
- ])
714
- .innerJoin(exports.EPOCH_TABLE, 'liability.epoch_id', 'epoch.id')
715
- .where('epoch.ui', '=', epochId.toString())
716
- .where('epoch.channel', '=', 'node_operator')
717
- .where('liability.channel', '=', 'node_operator')
718
- .execute();
719
- log.debug(`fetchNodeOperatorEpoch -> fetched liablities`);
720
- const solKeys = ks.reduce((r, k) => {
721
- r[k.sol_key] = {};
722
- return r;
723
- }, {});
724
- return {
725
- jobIds: res.map((r) => Number(r.id)),
726
- totalRndr: BigInt(res[0].total_rndr),
727
- startTime: res[0].start_time,
728
- endTime: res[0].end_time,
729
- burned: BigInt((_a = res[0].burned) !== null && _a !== void 0 ? _a : 0),
730
- burnTx: res[0].tx_sig,
731
- solKeys,
732
- };
733
- });
734
- },
735
- insertEpoch(db, epoch, log = logger_1.consoleLogger) {
736
- return __awaiter(this, void 0, void 0, function* () {
737
- yield getOrInsertEpoch(db.trx, Object.assign(Object.assign({}, epoch), { uiEpochId: epoch.ui }), log);
738
- });
739
- },
740
- getEpoch(f, log = logger_1.consoleLogger) {
741
- var _a;
742
- return __awaiter(this, void 0, void 0, function* () {
743
- const now = new Date(Date.now());
744
- try {
745
- let q = db
746
- .selectFrom(exports.EPOCH_TABLE)
747
- .selectAll()
748
- .where('channel', '=', f.channel);
749
- if (f.epochId) {
750
- q = q.where('ui', '=', f.epochId.toString());
751
- }
752
- else {
753
- q = q.where('end_time', '<=', now);
754
- if (!f.savedAtNotNull) {
755
- q = q.where('saved_at', 'is', null);
756
- }
757
- else {
758
- q = q.where('saved_at', 'is not', null);
759
- }
760
- }
761
- q = q.orderBy('end_time desc').limit(1);
762
- const res = yield q.executeTakeFirstOrThrow();
763
- return {
764
- ui: Number(res.ui),
765
- channel: f.channel,
766
- startTime: res.start_time,
767
- endTime: res.end_time,
768
- savedAt: (_a = res.saved_at) !== null && _a !== void 0 ? _a : undefined,
769
- };
770
- }
771
- catch (e) {
772
- if (e instanceof kysely_1.NoResultError) {
773
- log.info(`no node operator epoch found`);
774
- return undefined;
775
- }
776
- throw e;
777
- }
778
- });
779
- },
780
- getLatestNodeOperatorEpoch(f, log = logger_1.consoleLogger) {
781
- var _a;
782
- return __awaiter(this, void 0, void 0, function* () {
783
- const now = new Date(Date.now());
784
- try {
785
- let q = db
786
- .selectFrom(exports.EPOCH_TABLE)
787
- .selectAll()
788
- .where('channel', '=', 'node_operator')
789
- .where('end_time', '<=', now);
790
- if (!f.latestDistributed) {
791
- q = q.where('saved_at', 'is', null).orderBy('end_time asc');
792
- }
793
- else {
794
- q = q.orderBy('end_time desc');
795
- }
796
- q = q.limit(1);
797
- const res = yield q.executeTakeFirstOrThrow();
798
- return {
799
- epochId: BigInt(res.ui),
800
- startedAt: res.start_time,
801
- endedAt: res.end_time,
802
- savedAt: (_a = res.saved_at) !== null && _a !== void 0 ? _a : undefined,
803
- };
804
- }
805
- catch (e) {
806
- if (e instanceof kysely_1.NoResultError) {
807
- log.info(`no node operator epoch found`);
808
- return undefined;
809
- }
810
- throw e;
811
- }
812
- });
813
- },
814
- insertEpochEntityInfo(db, eeis, log) {
815
- return __awaiter(this, void 0, void 0, function* () {
816
- for (const eei of eeis) {
817
- yield db.trx.insertInto(exports.ENTITY_EPOCH_INFO_TABLE).values(eei).execute();
818
- log.debug(`inserted eei ${JSON.stringify(eei)}`);
819
- }
820
- });
821
- },
822
- saveNodeOperatorEpoch(epochId, liabilities, jobIds, totalRndr, log = logger_1.consoleLogger) {
823
- return __awaiter(this, void 0, void 0, function* () {
824
- yield db
825
- .transaction()
826
- .setIsolationLevel('repeatable read')
827
- .execute((trx) => __awaiter(this, void 0, void 0, function* () {
828
- const { epochDbIds } = yield createPayments(trx, liabilities.map((l) => ({
829
- liability: l,
830
- })), log);
831
- log.info(`inserted liabilities`);
832
- for (const id of jobIds) {
833
- yield trx
834
- .insertInto(exports.JOB_ID_TABLE)
835
- .values({
836
- id: BigInt(id),
837
- epoch_id: epochDbIds[0],
838
- })
839
- .executeTakeFirstOrThrow();
840
- }
841
- const now = new Date();
842
- yield updateTotalRndr(db, { uiEpochId: epochId, channel: 'node_operator' }, totalRndr, now, log);
843
- log.debug(`saved epoch`);
844
- /*const now = new Date(Date.now())
845
- const res = await trx
846
- .updateTable(EPOCH_TABLE)
847
- .set({
848
- saved_at: now,
849
- total_rndr: totalRndr,
850
- })
851
- .where('channel')
852
- .where('ui', '=', epochId.toString())
853
- .where('', '=')
854
- .executeTakeFirstOrThrow()*/
855
- }));
856
- return;
857
- });
858
- },
859
- produceBurnedJobs(jobs, log = logger_1.consoleLogger) {
860
- return __awaiter(this, void 0, void 0, function* () {
861
- yield db.transaction().execute((trx) => __awaiter(this, void 0, void 0, function* () {
862
- var _a;
863
- let num = BigInt(0);
864
- for (const { amount, obhUsed, completedAt, jobId, userId } of jobs) {
865
- const res = yield trx
866
- .insertInto(exports.JOB_TABLE)
867
- .values({
868
- id: jobId,
869
- render_amt: amount,
870
- completed_at: completedAt,
871
- inserted_at: new Date(Date.now()),
872
- obh_used: obhUsed,
873
- user_id: userId,
874
- })
875
- .onConflict((oc) => oc.column('id').doNothing())
876
- .executeTakeFirstOrThrow();
877
- num += (_a = res.numInsertedOrUpdatedRows) !== null && _a !== void 0 ? _a : BigInt(0);
878
- }
879
- log.debug(`inserted ${num} of ${jobs.length} burn jobs`);
880
- }));
881
- });
882
- },
883
- markJobsBurntWithGrant(db, p, log = logger_1.consoleLogger) {
884
- var _a;
885
- return __awaiter(this, void 0, void 0, function* () {
886
- const solTxId = yield getOrInsertTx(db.trx, { sig: p.tx.sig, executedAt: p.tx.executedAt }, log);
887
- const { id } = yield db.trx
888
- .insertInto(exports.GRANT_BURN_TABLE)
889
- .values({
890
- sol_tx_id: solTxId,
891
- burned: p.burned,
892
- tags: (_a = p.tags) === null || _a === void 0 ? void 0 : _a.join(','),
893
- })
894
- .returning((eb) => ['id as id'])
895
- .executeTakeFirstOrThrow();
896
- const jobIdsStr = p.jobsIds.map(String);
897
- const res = yield db.trx
898
- .updateTable(exports.JOB_TABLE)
899
- .where('id', 'in', jobIdsStr)
900
- .set('grant_burn_id', id)
901
- .executeTakeFirstOrThrow();
902
- log.debug(`set grant_burn_id on ${res.numUpdatedRows} jobs`);
903
- for (const [userId, grantSpendDelta] of Object.entries(p.userIdToGrantSpendDelta)) {
904
- yield db.trx
905
- .insertInto(exports.USER_GRANT_SPEND_TABLE)
906
- .values({
907
- user_id: userId,
908
- grant_burn_id: id,
909
- render_spent_delta: -grantSpendDelta,
910
- })
911
- .executeTakeFirstOrThrow();
912
- }
913
- return;
914
- });
915
- },
916
- insertGrantSpend(db, p, log = logger_1.consoleLogger) {
917
- var _a, _b, _c;
918
- return __awaiter(this, void 0, void 0, function* () {
919
- const existing = yield getCurrentUserGrantSpend(db.trx, { userId: p.userId }, log);
920
- const diff = {
921
- render_spent: ((_a = existing === null || existing === void 0 ? void 0 : existing.renderSpent) !== null && _a !== void 0 ? _a : BigInt(0)) + p.renderSpentDelta,
922
- description: p.description ? p.description : existing === null || existing === void 0 ? void 0 : existing.description,
923
- perpetual: p.perpetual ? p.perpetual : (_b = existing === null || existing === void 0 ? void 0 : existing.perpetual) !== null && _b !== void 0 ? _b : false,
924
- updated_at: new Date(),
925
- };
926
- log.debug(`insertGrantSpend currUserGrantSpend: ${JSON.stringify(existing)} delta: ${JSON.stringify(p)}`);
927
- const res = yield db.trx
928
- .insertInto(exports.CURRENT_USER_GRANT_SPEND_TABLE)
929
- .values({
930
- user_id: p.userId,
931
- render_spent: p.renderSpentDelta,
932
- description: p.description,
933
- perpetual: (_c = p.perpetual) !== null && _c !== void 0 ? _c : false,
934
- })
935
- .onConflict((oc) => oc.column('user_id').doUpdateSet(diff))
936
- .returning((eb) => [
937
- 'user_id as user_id',
938
- 'render_spent as render_spent',
939
- 'description as description',
940
- 'perpetual as perpetual',
941
- 'updated_at as updated_at',
942
- ])
943
- .executeTakeFirstOrThrow();
944
- if (res) {
945
- log.debug(`inserted current_user_grant_spend row ${JSON.stringify(res)}`);
946
- }
947
- if (p.renderSpentDelta != BigInt(0)) {
948
- const v = {
949
- user_id: p.userId,
950
- render_spent_delta: p.renderSpentDelta,
951
- grant_burn_id: p.grantBurnId,
952
- };
953
- const res = yield db.trx
954
- .insertInto(exports.USER_GRANT_SPEND_TABLE)
955
- .values(v)
956
- .executeTakeFirstOrThrow();
957
- log.debug(`inserted ${res.numInsertedOrUpdatedRows} user_grant_spend rows ${JSON.stringify(v)}`);
958
- }
959
- });
960
- },
961
- markJobsBurnt(trx, p, log = logger_1.consoleLogger) {
962
- var _a, _b;
963
- return __awaiter(this, void 0, void 0, function* () {
964
- if (!p.buyBurn && !p.grantBurn) {
965
- throw new Error('no buyBurn or grantBurn');
966
- }
967
- const solTxId = yield getOrInsertTx(trx.trx, { sig: p.solTx.sig, executedAt: p.solTx.executedAt }, log);
968
- let buyBurnId;
969
- let grantBurnId;
970
- if (p.buyBurn) {
971
- const { burned, usdcSpent, eurToUsdc, renderToUsdc, quoteAmt, tags, burnAdjustmentId, toBurn, } = p.buyBurn;
972
- let pricedAt = p.buyBurn.pricedAt;
973
- if (!pricedAt) {
974
- const jobs = yield fetchJobs1(trx.trx, { ids: p.jobs.map((j) => String(j.id)) }, log);
975
- pricedAt = (0, exports.batchFinishedAtMedian)(jobs.map((j) => ({
976
- finishedAt: j.completedAt.toISOString(),
977
- jobId: j.id,
978
- rndrUsed: Number(j.rndrUsed.toString()),
979
- })));
980
- }
981
- const { id } = yield trx.trx
982
- .insertInto(exports.BURN_TABLE)
983
- .values({
984
- sol_tx_id: solTxId,
985
- priced_at: pricedAt,
986
- eur_to_usdc: eurToUsdc,
987
- render_to_usdc: renderToUsdc,
988
- usdc_spent: usdcSpent,
989
- quote_amt: quoteAmt,
990
- burned: burned,
991
- tags: tags.join(','),
992
- burn_adjustment_id: burnAdjustmentId,
993
- to_burn: toBurn,
994
- })
995
- //.onConflict((oc) => oc.column('sol_tx').doNothing())
996
- .returning((eb) => ['id as id'])
997
- .executeTakeFirstOrThrow();
998
- buyBurnId = Number(id);
999
- }
1000
- if (p.grantBurn) {
1001
- const { burned, tags } = p.grantBurn;
1002
- const { id } = yield trx.trx
1003
- .insertInto(exports.GRANT_BURN_TABLE)
1004
- .values({
1005
- sol_tx_id: solTxId,
1006
- burned: burned,
1007
- tags: tags === null || tags === void 0 ? void 0 : tags.join(','),
1008
- })
1009
- .returning((eb) => ['id as id'])
1010
- .executeTakeFirstOrThrow();
1011
- grantBurnId = Number(id);
1012
- }
1013
- for (const job of p.jobs) {
1014
- const res = yield trx.trx
1015
- .updateTable(exports.JOB_TABLE)
1016
- .where('id', '=', String(job.id))
1017
- .set('burn_id', job.buyRenderAmt != undefined ? buyBurnId : null)
1018
- .set('grant_burn_id', job.grantRenderAmt != undefined ? grantBurnId : null)
1019
- .set('buy_render_amt', (_a = job.buyRenderAmt) !== null && _a !== void 0 ? _a : 0)
1020
- .set('grant_render_amt', (_b = job.grantRenderAmt) !== null && _b !== void 0 ? _b : 0)
1021
- .executeTakeFirstOrThrow();
1022
- 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}`);
1023
- }
1024
- return { grantBurnId, buyBurnId };
1025
- });
1026
- },
1027
- markJobsBurned(trx, p, log = logger_1.consoleLogger) {
1028
- return __awaiter(this, void 0, void 0, function* () {
1029
- let { markedAt, solTx } = p;
1030
- let res = yield trx.trx
1031
- .updateTable(exports.BURN_TABLE)
1032
- .set({ marked_burned_at: markedAt })
1033
- .from(exports.SOL_TX_TABLE)
1034
- .whereRef('burn.sol_tx_id', '=', 'sol_tx.id')
1035
- .where('sol_tx.sig', '=', solTx)
1036
- .executeTakeFirst();
1037
- if (res) {
1038
- log.debug(`buy burn set ${res.numUpdatedRows} ${solTx} -> marked_burned_at ${markedAt.toISOString()}`);
1039
- }
1040
- let res1 = yield trx.trx
1041
- .updateTable(exports.GRANT_BURN_TABLE)
1042
- .set({ marked_burned_at: markedAt })
1043
- .from(exports.SOL_TX_TABLE)
1044
- .whereRef('grant_burn.sol_tx_id', '=', 'sol_tx.id')
1045
- .where('sol_tx.sig', '=', solTx)
1046
- .executeTakeFirst();
1047
- if (res1) {
1048
- log.debug(`grant burn set ${res1.numUpdatedRows} ${solTx} -> marked_burned_at ${markedAt.toISOString()}`);
1049
- }
1050
- });
1051
- },
1052
- consumeAndLockBurnJobs(limit, lowerRndrThreshold, upperRndrThreshold, log = logger_1.consoleLogger) {
1053
- return __awaiter(this, void 0, void 0, function* () {
1054
- const trx = yield (0, base_2.begin)(db, log);
1055
- const q = trx.trx
1056
- .selectFrom(trx.trx
1057
- .selectFrom(exports.JOB_TABLE)
1058
- .select(({ fn, val, ref }) => [
1059
- 'id',
1060
- fn
1061
- .sum('render_amt')
1062
- .over((ob) => ob.orderBy(`completed_at`, `asc`))
1063
- .as('total'),
1064
- ])
1065
- .where('burn_id', 'is', null)
1066
- .where('grant_burn_id', 'is', null)
1067
- .as('t'))
1068
- .select('id')
1069
- .where('total', '>=', lowerRndrThreshold)
1070
- .where('total', '<=', upperRndrThreshold);
1071
- log.debug(`outstanding jobs q: ${q.compile().sql} ${JSON.stringify({
1072
- limit,
1073
- lowerRndrThreshold,
1074
- upperRndrThreshold,
1075
- })}`);
1076
- const idRs = yield q.execute();
1077
- const ids = idRs.map((x) => x.id);
1078
- log.debug(`${ids.length} candidate jobs for burn. locking up to ${limit} jobs`);
1079
- if (ids.length == 0) {
1080
- return { trx, jobs: [] };
1081
- }
1082
- const rows = yield trx.trx
1083
- .selectFrom(exports.JOB_TABLE)
1084
- .selectAll()
1085
- .where('id', 'in', ids)
1086
- .limit(limit)
1087
- .forUpdate()
1088
- .skipLocked()
1089
- .execute();
1090
- log.debug(`locked ${rows.length} jobs`);
1091
- const jobs = [];
1092
- for (const r of rows) {
1093
- jobs.push({
1094
- id: Number(r.id),
1095
- completedAt: r.completed_at,
1096
- userId: r.user_id,
1097
- rndrUsed: BigInt(r.render_amt),
1098
- });
1099
- }
1100
- return { trx, jobs };
1101
- });
1102
- },
1103
- paymentMetrics(log) {
1104
- return __awaiter(this, void 0, void 0, function* () {
1105
- // Get the latest epochs for each channel
1106
- const latestEpochs = yield db
1107
- .selectFrom(exports.EPOCH_TABLE)
1108
- .select(['id', 'ui', 'channel', 'start_time', 'end_time'])
1109
- .where('channel', 'in', [
1110
- 'availability',
1111
- 'node_operator',
1112
- 'render_compute_network',
1113
- ])
1114
- .distinctOn('channel')
1115
- .where('saved_at', 'is not', null)
1116
- .orderBy('channel')
1117
- .orderBy('ui', 'desc')
1118
- .execute();
1119
- // Calculate distributed rewards for each channel
1120
- let availabilityRewards = 0;
1121
- let nodeOperatorRewards = 0;
1122
- let renderComputeNetworkRewards = 0;
1123
- let latestEpochId = 0;
1124
- for (const epoch of latestEpochs) {
1125
- if (!epoch.end_time) {
1126
- log === null || log === void 0 ? void 0 : log.info(`Skipping epoch ${epoch.ui} for channel ${epoch.channel} - no end_time`);
1127
- continue;
1128
- }
1129
- // Get total distributed rewards for this channel after epoch ended
1130
- const transfersResult = yield db
1131
- .selectFrom(exports.SOL_TRANSFER_TABLE)
1132
- .innerJoin('sol_tx', 'sol_tx.id', `${exports.SOL_TRANSFER_TABLE}.sol_tx_id`)
1133
- .select([(eb) => eb.fn.sum('amount_payed').as('total_distributed')])
1134
- .where(`${exports.SOL_TRANSFER_TABLE}.channel`, '=', epoch.channel)
1135
- .where('sol_tx.executed_at', '>', epoch.end_time)
1136
- .executeTakeFirst();
1137
- const totalDistributed = Number((transfersResult === null || transfersResult === void 0 ? void 0 : transfersResult.total_distributed) || 0);
1138
- switch (epoch.channel) {
1139
- case 'availability':
1140
- availabilityRewards = totalDistributed;
1141
- break;
1142
- case 'node_operator':
1143
- nodeOperatorRewards = totalDistributed;
1144
- latestEpochId = Number(epoch.ui);
1145
- break;
1146
- case 'render_compute_network':
1147
- renderComputeNetworkRewards = totalDistributed;
1148
- break;
1149
- }
1150
- log === null || log === void 0 ? void 0 : log.info(`Channel ${epoch.channel}: ${totalDistributed} distributed after epoch ${epoch.ui}`);
1151
- }
1152
- return {
1153
- latestEpochId,
1154
- availabilityRewards,
1155
- nodeOperatorRewards,
1156
- renderComputeNetworkRewards,
1157
- };
1158
- });
1159
- },
1160
- incrBuyBurnMetrics(log = logger_1.consoleLogger) {
1161
- var _a;
1162
- return __awaiter(this, void 0, void 0, function* () {
1163
- const res = yield db
1164
- .selectFrom(exports.JOB_TABLE)
1165
- .select('inserted_at')
1166
- .orderBy('completed_at asc')
1167
- .where('burn_id', 'is', null)
1168
- .execute();
1169
- if (res.length == 0) {
1170
- return { outstandingJobs: 0 };
1171
- }
1172
- return {
1173
- outstandingJobs: res.length,
1174
- oldestJobInsertedAt: (_a = res[0].inserted_at) !== null && _a !== void 0 ? _a : undefined,
1175
- };
1176
- });
1177
- },
1178
- fetchBurns(db, f, log = logger_1.consoleLogger) {
1179
- var _a, _b;
1180
- return __awaiter(this, void 0, void 0, function* () {
1181
- let q = db.trx
1182
- .selectFrom('burn')
1183
- .selectAll('burn')
1184
- .innerJoin('sol_tx', 'sol_tx.id', 'burn.sol_tx_id')
1185
- .select(['sol_tx.executed_at', 'sol_tx.sig']);
1186
- if (!f.inclManual) {
1187
- q = q.where('burn.usdc_spent', '>', String(0));
1188
- }
1189
- if (f.executedAfter) {
1190
- q = q.where('sol_tx.executed_at', '>=', f.executedAfter);
1191
- }
1192
- if (f.executedBefore) {
1193
- q = q.where('sol_tx.executed_at', '<=', f.executedBefore);
1194
- }
1195
- if (f.pricedAtBefore) {
1196
- q = q.where('burn.priced_at', '<=', f.pricedAtBefore);
1197
- }
1198
- if (f.pricedAtAfter) {
1199
- q = q.where('burn.priced_at', '>=', f.pricedAtAfter);
1200
- }
1201
- if (f.orderBy == 'pricedAt') {
1202
- q = q.orderBy(['burn.priced_at']);
1203
- }
1204
- else if (f.orderBy == 'executedAt') {
1205
- q = q.orderBy(['sol_tx.executed_at']);
1206
- }
1207
- log.info(`fetchBurns q ${q.compile().sql} ${JSON.stringify(f)}`);
1208
- const burns = [];
1209
- const burnIdToIdx = {};
1210
- const comp = q.compile();
1211
- const { rows } = yield (0, base_1.timedQuery)(pgPool, comp.sql, comp.parameters, 'fetchBurns', log);
1212
- log.info(`fetchBurns len ${rows.length}`);
1213
- for (const r of rows) {
1214
- burns.push({
1215
- jobs: [],
1216
- id: Number(r.id),
1217
- renderToUsdc: r.render_to_usdc,
1218
- solTx: r.sig,
1219
- executedAt: r.executed_at,
1220
- pricedAt: r.priced_at,
1221
- usdcSpent: BigInt((_a = r.usdc_spent) !== null && _a !== void 0 ? _a : 0),
1222
- quoteAmt: BigInt((_b = r.quote_amt) !== null && _b !== void 0 ? _b : 0),
1223
- burned: BigInt(r.burned),
1224
- eurToUsdc: r.eur_to_usdc,
1225
- markedBurnedAt: r.marked_burned_at,
1226
- tags: r.tags ? r.tags.split(',') : [],
1227
- });
1228
- burnIdToIdx[r.id] = burns.length - 1;
1229
- }
1230
- if (f.inclJobs) {
1231
- const jobRows = yield db.trx
1232
- .selectFrom('job')
1233
- .selectAll('job')
1234
- .where('burn_id', 'in', rows.map((r) => r.id))
1235
- .execute();
1236
- log.info(`fetchBurns jobRows len ${jobRows.length}`);
1237
- for (const r of jobRows) {
1238
- burns[burnIdToIdx[r.burn_id]].jobs.push({
1239
- id: Number(r.id),
1240
- completedAt: r.completed_at,
1241
- rndrUsed: BigInt(r.render_amt),
1242
- obhUsed: r.obh_used ? Number(r.obh_used) : undefined,
1243
- });
1244
- }
1245
- }
1246
- return burns;
1247
- });
1248
- },
1249
- createBridgeTransfers(db, bts, log = logger_1.consoleLogger) {
1250
- return __awaiter(this, void 0, void 0, function* () {
1251
- return createBridgeTransfers(db.trx, bts, log);
1252
- });
1253
- },
1254
- getBridgeTransfers({ solKey, page, }, log = logger_1.consoleLogger) {
1255
- return __awaiter(this, void 0, void 0, function* () {
1256
- let q = db
1257
- .selectFrom(exports.BRIDGE_TRANSFER_TABLE)
1258
- .innerJoin(exports.EPOCH_TABLE, 'epoch.id', 'bridge_transfer.epoch_id')
1259
- .innerJoin(exports.ENTITY_TABLE, 'entity.id', 'bridge_transfer.entity_id')
1260
- .select([
1261
- 'entity.sol_key',
1262
- 'bridge_transfer.sequence',
1263
- 'bridge_transfer.created_at',
1264
- 'bridge_transfer.amount',
1265
- 'bridge_transfer.upgrade_bracket',
1266
- 'bridge_transfer.prior_supply',
1267
- 'bridge_transfer.points',
1268
- 'epoch.ui',
1269
- ]);
1270
- let limit = 10000;
1271
- if (page && page.limit) {
1272
- limit = page.limit;
1273
- }
1274
- q = q.limit(page.limit).orderBy(`${exports.BRIDGE_TRANSFER_TABLE}.id`);
1275
- let offset = 0;
1276
- if (page && page.cursor) {
1277
- offset = Number(atob(page.cursor));
1278
- q = q.offset(offset);
1279
- }
1280
- if (solKey) {
1281
- q = q.where('entity.sol_key', '=', solKey);
1282
- }
1283
- const c = q.compile();
1284
- log.debug(`fetch bridge transfers ${c.sql} params ${c.parameters}`);
1285
- const res = yield q.execute();
1286
- log.info(`bridge transfers ${res.length}`);
1287
- return {
1288
- bts: res.map((row) => {
1289
- return {
1290
- solKey: row.sol_key,
1291
- seq: BigInt(row.sequence),
1292
- createdAt: row.created_at,
1293
- amount: BigInt(row.amount),
1294
- upgradeBracket: row.upgrade_bracket
1295
- ? Number(row.upgrade_bracket)
1296
- : undefined,
1297
- priorSupply: BigInt(row.prior_supply),
1298
- points: row.points ? BigInt(row.points) : undefined,
1299
- epochId: Number(row.ui),
1300
- };
1301
- }),
1302
- cursor: res.length == limit ? btoa(`${res.length + offset}`) : undefined,
1303
- };
1304
- });
1305
- },
1306
- getLiabilitySolKeys(f) {
1307
- return __awaiter(this, void 0, void 0, function* () {
1308
- let q = db
1309
- .selectFrom(exports.LIABILITY_TABLE)
1310
- .innerJoin(exports.ENTITY_TABLE, `${exports.LIABILITY_TABLE}.entity_id`, 'entity.id')
1311
- .select(({ fn }) => [
1312
- (0, kysely_1.sql) `distinct
1313
- (entity.sol_key)`.as('sol_key'),
1314
- ])
1315
- .where(`${exports.LIABILITY_TABLE}.channel`, '=', f.channel);
1316
- if (f.epoch) {
1317
- q = q.where('liability.epoch_id', '=', db
1318
- .selectFrom('epoch')
1319
- .select('id')
1320
- .where('channel', '=', f.channel)
1321
- .where('ui', '=', String(f.epoch)));
1322
- }
1323
- const ks = yield q.execute();
1324
- const solKeys = {};
1325
- for (const k of ks) {
1326
- solKeys[k.sol_key] = {};
1327
- }
1328
- return solKeys;
1329
- });
1330
- },
1331
- getTotalBurned(db) {
1332
- var _a, _b;
1333
- return __awaiter(this, void 0, void 0, function* () {
1334
- const total = yield db.trx
1335
- .selectFrom('burn')
1336
- .select(({ fn }) => fn.sum('burned').as('total_burned'))
1337
- .execute();
1338
- return BigInt((_b = (_a = total[0]) === null || _a === void 0 ? void 0 : _a.total_burned) !== null && _b !== void 0 ? _b : 0);
1339
- });
1340
- },
1341
- insertBurn(p, log = logger_1.consoleLogger) {
1342
- return __awaiter(this, void 0, void 0, function* () {
1343
- yield db.transaction().execute((trx) => __awaiter(this, void 0, void 0, function* () {
1344
- var _a;
1345
- const solTxId = yield getOrInsertTx(trx, { sig: p.solTx, executedAt: p.executedAt }, log);
1346
- const { id } = yield trx
1347
- .insertInto(exports.BURN_TABLE)
1348
- .values({
1349
- sol_tx_id: solTxId,
1350
- priced_at: p.pricedAt,
1351
- usdc_spent: p.usdcSpent,
1352
- quote_amt: p.quoteAmt,
1353
- burned: p.burned,
1354
- marked_burned_at: p.markedBurnedAt,
1355
- })
1356
- //.onConflict((oc) => oc.column('sol_tx').doNothing())
1357
- .returning((eb) => ['id as id'])
1358
- .executeTakeFirstOrThrow();
1359
- let num = BigInt(0);
1360
- for (const { rndrUsed, completedAt, id: jobId, insertedAt, userId, } of p.jobs) {
1361
- const res = yield trx
1362
- .insertInto(exports.JOB_TABLE)
1363
- .values({
1364
- id: jobId,
1365
- render_amt: rndrUsed,
1366
- burn_id: id,
1367
- completed_at: completedAt,
1368
- inserted_at: insertedAt !== null && insertedAt !== void 0 ? insertedAt : new Date(),
1369
- user_id: userId,
1370
- })
1371
- .onConflict((oc) => oc.column('id').doNothing())
1372
- .executeTakeFirstOrThrow();
1373
- num += (_a = res.numInsertedOrUpdatedRows) !== null && _a !== void 0 ? _a : BigInt(0);
1374
- }
1375
- log.debug(`burn id ${id} inserted ${num} of ${p.jobs.length} burn jobs`);
1376
- }));
1377
- });
1378
- },
1379
- fetchJobs(db, f, log = logger_1.consoleLogger) {
1380
- return __awaiter(this, void 0, void 0, function* () {
1381
- return yield fetchJobs1(db.trx, f, log);
1382
- });
1383
- },
1384
- fetchLiabilityEpochs(db, log = logger_1.consoleLogger) {
1385
- return __awaiter(this, void 0, void 0, function* () {
1386
- const q = db.trx
1387
- .selectFrom(exports.LIABILITY_TABLE)
1388
- .select(({ fn }) => [
1389
- `${exports.LIABILITY_TABLE}.channel`,
1390
- fn.sum(`${exports.LIABILITY_TABLE}.amount_due`).as('amount_due'),
1391
- ])
1392
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, `${exports.LIABILITY_TABLE}.epoch_id`)
1393
- .select(['ui', 'start_time', 'end_time'])
1394
- .groupBy([
1395
- 'liability.channel',
1396
- 'epoch.ui',
1397
- 'epoch.start_time',
1398
- 'epoch.end_time',
1399
- ])
1400
- .orderBy(['epoch.start_time desc']);
1401
- // Fetch node_operator SOL key metadata separately
1402
- const nodeOpMetadataQuery = db.trx
1403
- .selectFrom(exports.LIABILITY_TABLE)
1404
- .select([`${exports.LIABILITY_TABLE}.obh_used`])
1405
- .innerJoin(exports.EPOCH_TABLE, `${exports.EPOCH_TABLE}.id`, `${exports.LIABILITY_TABLE}.epoch_id`)
1406
- .select([`${exports.EPOCH_TABLE}.ui as epoch_ui`])
1407
- .innerJoin('entity', 'entity.id', `${exports.LIABILITY_TABLE}.entity_id`)
1408
- .select(['entity.sol_key'])
1409
- .where(`${exports.LIABILITY_TABLE}.channel`, '=', 'node_operator')
1410
- .where('entity.sol_key', 'is not', null)
1411
- .where(`${exports.LIABILITY_TABLE}.obh_used`, 'is not', null);
1412
- log.debug(`fetchLiabilityEpochs ${q.compile().sql}`);
1413
- log.debug(`nodeOpMetadata ${nodeOpMetadataQuery.compile().sql}`);
1414
- const [rs, nodeOpMetadata] = yield Promise.all([
1415
- q.execute(),
1416
- nodeOpMetadataQuery.execute(),
1417
- ]);
1418
- // Group node operator metadata by epoch
1419
- const metadataByEpoch = {};
1420
- nodeOpMetadata.forEach((row) => {
1421
- const epochId = Number(row.epoch_ui);
1422
- if (!metadataByEpoch[epochId]) {
1423
- metadataByEpoch[epochId] = {};
1424
- }
1425
- if (row.sol_key && row.obh_used !== null) {
1426
- metadataByEpoch[epochId][row.sol_key] = {
1427
- obhUsed: Number(row.obh_used),
1428
- };
1429
- }
1430
- });
1431
- return rs.map((r) => ({
1432
- epochId: Number(r.ui),
1433
- channel: r.channel,
1434
- start: r.start_time,
1435
- end: r.end_time,
1436
- amountDue: Number(r.amount_due),
1437
- metadataBySolKey: r.channel === 'node_operator'
1438
- ? metadataByEpoch[Number(r.ui)] || {}
1439
- : {},
1440
- }));
1441
- });
1442
- },
1443
- getBurnAdjustments(trx, ps, log = logger_1.consoleLogger) {
1444
- return __awaiter(this, void 0, void 0, function* () {
1445
- if (ps.toFill) {
1446
- const q = trx.trx
1447
- .selectFrom(exports.BURN_ADJUSTMENT_TABLE)
1448
- .selectAll(exports.BURN_ADJUSTMENT_TABLE)
1449
- .innerJoin(exports.JOB_TABLE, `${exports.JOB_TABLE}.id`, `${exports.BURN_ADJUSTMENT_TABLE}.job_id`)
1450
- .select([`${exports.JOB_TABLE}.completed_at`, `${exports.JOB_TABLE}.render_amt`])
1451
- .leftJoin(exports.BURN_TABLE, `${exports.BURN_TABLE}.burn_adjustment_id`, `${exports.BURN_ADJUSTMENT_TABLE}.id`)
1452
- .select(({ fn, lit }) => [
1453
- fn
1454
- .sum(fn.coalesce(`${exports.BURN_TABLE}.to_burn`, lit(0)))
1455
- .as('tot_to_burn'),
1456
- fn
1457
- .sum(fn.coalesce(`${exports.BURN_TABLE}.burned`, lit(0)))
1458
- .as('tot_burned'),
1459
- ])
1460
- .groupBy([
1461
- `${exports.BURN_ADJUSTMENT_TABLE}.id`,
1462
- `${exports.JOB_TABLE}.completed_at`,
1463
- `${exports.JOB_TABLE}.render_amt`,
1464
- ])
1465
- .havingRef((0, kysely_1.sql) `SUM(COALESCE("burn"."to_burn", 0)) - SUM(COALESCE("burn"."burned", 0))`, '<', `${exports.BURN_ADJUSTMENT_TABLE}.down_adj_to_burn`);
1466
- log.info(`getBurnAdjustments ${q.compile().sql}`);
1467
- const res = yield q.execute();
1468
- return res.map((r) => ({
1469
- id: Number(r.id),
1470
- createdAt: r.created_at,
1471
- jobId: Number(r.job_id),
1472
- downAdjRndrUsed: Number(r.down_adj_rndr_used),
1473
- downAdjToBurn: Number(r.down_adj_to_burn),
1474
- adjusted: Number(r.tot_to_burn) - Number(r.tot_burned),
1475
- job: {
1476
- id: Number(r.job_id),
1477
- completedAt: r.completed_at,
1478
- rndrUsed: BigInt(r.render_amt),
1479
- },
1480
- }));
1481
- }
1482
- return [];
1483
- });
1484
- },
1485
- insertPolygonUpgrade(db, p, log = logger_1.consoleLogger) {
1486
- return __awaiter(this, void 0, void 0, function* () {
1487
- const solTxId = yield getOrInsertTx(db.trx, {
1488
- sig: p.solTx.sig,
1489
- executedAt: p.solTx.executedAt,
1490
- });
1491
- yield db.trx
1492
- .insertInto(exports.POLYGON_UPGRADE_TABLE)
1493
- .values({
1494
- eth_addr: p.ethAddr,
1495
- sol_addr: p.solAddr,
1496
- amount: p.amount,
1497
- sol_tx_id: solTxId,
1498
- })
1499
- .execute();
1500
- log.info(`insertPolygonUpgrade ${JSON.stringify(p)}`);
1501
- return;
1502
- });
1503
- },
1504
- fetchPolygonUpgrades(db, f, log = logger_1.consoleLogger) {
1505
- return __awaiter(this, void 0, void 0, function* () {
1506
- let query = db.trx
1507
- .selectFrom('polygon_upgrade')
1508
- .selectAll('polygon_upgrade')
1509
- .innerJoin('sol_tx', 'sol_tx.id', 'polygon_upgrade.sol_tx_id')
1510
- .select(['sol_tx.sig', 'sol_tx.executed_at'])
1511
- .orderBy('sol_tx.executed_at', 'desc');
1512
- if (f.executedAfter) {
1513
- query = query.where('sol_tx.executed_at', '>=', f.executedAfter);
1514
- }
1515
- if (f.executedBefore) {
1516
- query = query.where('sol_tx.executed_at', '<=', f.executedBefore);
1517
- }
1518
- const results = yield query.execute();
1519
- log.info(`fetchPolygonUpgrades returned ${results.length} records`);
1520
- return results.map((row) => ({
1521
- ethAddr: row.eth_addr,
1522
- solAddr: row.sol_addr,
1523
- amount: BigInt(row.amount.toString()),
1524
- solTx: {
1525
- sig: row.sig,
1526
- executedAt: row.executed_at,
1527
- },
1528
- }));
1529
- });
1530
- },
1531
- getCurrentUserGrantSpend(db, f, log = logger_1.consoleLogger) {
1532
- return __awaiter(this, void 0, void 0, function* () {
1533
- return yield getCurrentUserGrantSpend(db.trx, f, log);
1534
- });
1535
- },
1536
- deleteAll(log = logger_1.consoleLogger) {
1537
- return __awaiter(this, void 0, void 0, function* () {
1538
- if (config.database.includes('render')) {
1539
- throw new Error('cannot nuke from deployed database. call from tests only');
1540
- }
1541
- const tx = yield (0, base_2.begin)(db, log);
1542
- try {
1543
- const res = yield Promise.all([
1544
- tx.trx
1545
- .deleteFrom(exports.SOL_TX_TABLE)
1546
- .where('id', 'is not', null)
1547
- .executeTakeFirst(),
1548
- tx.trx.deleteFrom(exports.LIABILITY_TABLE).executeTakeFirstOrThrow(),
1549
- tx.trx.deleteFrom(exports.SOL_TRANSFER_TABLE).executeTakeFirstOrThrow(),
1550
- tx.trx
1551
- .deleteFrom(exports.EPOCH_TABLE)
1552
- .where('id', 'is not', null)
1553
- .executeTakeFirst(),
1554
- tx.trx
1555
- .deleteFrom(exports.ENTITY_TABLE)
1556
- .where('id', 'is not', null)
1557
- .executeTakeFirst(),
1558
- tx.trx
1559
- .deleteFrom(exports.MANUAL_BURN_TABLE)
1560
- .where('epoch_id', 'is not', null)
1561
- .executeTakeFirst(),
1562
- tx.trx
1563
- .deleteFrom(exports.JOB_ID_TABLE)
1564
- .where('id', 'is not', null)
1565
- .executeTakeFirst(),
1566
- tx.trx
1567
- .deleteFrom(exports.JOB_TABLE)
1568
- .where('id', 'is not', null)
1569
- .executeTakeFirst(),
1570
- tx.trx
1571
- .deleteFrom(exports.BURN_TABLE)
1572
- .where('id', 'is not', null)
1573
- .executeTakeFirst(),
1574
- ]);
1575
- tx.commit();
1576
- }
1577
- catch (e) {
1578
- log.error(`caught ${e}`);
1579
- tx.rollback();
1580
- }
1581
- });
1582
- },
1583
- };
1584
- };
1585
- exports.pgClient = pgClient;
1586
- //# sourceMappingURL=v2Client.js.map