@render-foundation/utils 0.0.180 → 0.0.182

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/lib/cjs/backfiller.js +895 -0
  2. package/lib/cjs/backfiller.js.map +1 -0
  3. package/lib/cjs/client/onchain.js +132 -0
  4. package/lib/cjs/client/onchain.js.map +1 -0
  5. package/lib/cjs/client/pg/base.js +198 -0
  6. package/lib/cjs/client/pg/base.js.map +1 -0
  7. package/lib/cjs/client/pg/v1.js +623 -0
  8. package/lib/cjs/client/pg/v1.js.map +1 -0
  9. package/lib/cjs/client/pg/v2Client.js +1584 -0
  10. package/lib/cjs/client/pg/v2Client.js.map +1 -0
  11. package/lib/cjs/client/pg/viewClient.js +107 -0
  12. package/lib/cjs/client/pg/viewClient.js.map +1 -0
  13. package/lib/cjs/client/price.js +63 -0
  14. package/lib/cjs/client/price.js.map +1 -0
  15. package/lib/cjs/client/render.js +173 -0
  16. package/lib/cjs/client/render.js.map +1 -0
  17. package/lib/cjs/client/squads.js +204 -0
  18. package/lib/cjs/client/squads.js.map +1 -0
  19. package/lib/cjs/client/trade.js +235 -0
  20. package/lib/cjs/client/trade.js.map +1 -0
  21. package/lib/cjs/client/wormhole.js +69 -0
  22. package/lib/cjs/client/wormhole.js.map +1 -0
  23. package/lib/cjs/constants.js +46 -0
  24. package/lib/cjs/constants.js.map +1 -0
  25. package/lib/cjs/dbTypes.js +3 -0
  26. package/lib/cjs/dbTypes.js.map +1 -0
  27. package/lib/cjs/dbTypesV2.js +3 -0
  28. package/lib/cjs/dbTypesV2.js.map +1 -0
  29. package/lib/cjs/dbViewTypes.js +3 -0
  30. package/lib/cjs/dbViewTypes.js.map +1 -0
  31. package/lib/cjs/errorReporter.js +126 -0
  32. package/lib/cjs/errorReporter.js.map +1 -0
  33. package/lib/cjs/index.js +44 -0
  34. package/lib/cjs/index.js.map +1 -0
  35. package/lib/cjs/logger.js +21 -0
  36. package/lib/cjs/logger.js.map +1 -0
  37. package/lib/esm/src/backfiller.js +850 -0
  38. package/lib/esm/src/backfiller.js.map +1 -0
  39. package/lib/esm/src/client/onchain.js +122 -0
  40. package/lib/esm/src/client/onchain.js.map +1 -0
  41. package/lib/esm/src/client/pg/base.js +162 -0
  42. package/lib/esm/src/client/pg/base.js.map +1 -0
  43. package/lib/esm/src/client/pg/v1.js +559 -0
  44. package/lib/esm/src/client/pg/v1.js.map +1 -0
  45. package/lib/esm/src/client/pg/v2Client.js +1465 -0
  46. package/lib/esm/src/client/pg/v2Client.js.map +1 -0
  47. package/lib/esm/src/client/pg/viewClient.js +91 -0
  48. package/lib/esm/src/client/pg/viewClient.js.map +1 -0
  49. package/lib/esm/src/client/price.js +41 -0
  50. package/lib/esm/src/client/price.js.map +1 -0
  51. package/lib/esm/src/client/render.js +147 -0
  52. package/lib/esm/src/client/render.js.map +1 -0
  53. package/lib/esm/src/client/squads.js +163 -0
  54. package/lib/esm/src/client/squads.js.map +1 -0
  55. package/lib/esm/src/client/trade.js +219 -0
  56. package/lib/esm/src/client/trade.js.map +1 -0
  57. package/lib/esm/src/client/wormhole.js +33 -0
  58. package/lib/esm/src/client/wormhole.js.map +1 -0
  59. package/lib/esm/src/constants.js +43 -0
  60. package/lib/esm/src/constants.js.map +1 -0
  61. package/lib/esm/src/dbTypes.js +2 -0
  62. package/lib/esm/src/dbTypes.js.map +1 -0
  63. package/lib/esm/src/dbTypesV2.js +2 -0
  64. package/lib/esm/src/dbTypesV2.js.map +1 -0
  65. package/lib/esm/src/dbViewTypes.js +2 -0
  66. package/lib/esm/src/dbViewTypes.js.map +1 -0
  67. package/lib/esm/src/errorReporter.js +117 -0
  68. package/lib/esm/src/errorReporter.js.map +1 -0
  69. package/lib/esm/src/index.js +15 -0
  70. package/lib/esm/src/index.js.map +1 -0
  71. package/lib/esm/src/logger.js +18 -0
  72. package/lib/esm/src/logger.js.map +1 -0
  73. package/lib/esm/tsconfig.esm.tsbuildinfo +1 -1
  74. package/lib/types/src/backfiller.d.ts +62 -0
  75. package/lib/types/src/backfiller.d.ts.map +1 -0
  76. package/lib/types/src/client/onchain.d.ts +24 -0
  77. package/lib/types/src/client/onchain.d.ts.map +1 -0
  78. package/lib/types/src/client/pg/base.d.ts +82 -0
  79. package/lib/types/src/client/pg/base.d.ts.map +1 -0
  80. package/lib/types/src/client/pg/v1.d.ts +137 -0
  81. package/lib/types/src/client/pg/v1.d.ts.map +1 -0
  82. package/lib/types/src/client/pg/v2Client.d.ts +309 -0
  83. package/lib/types/src/client/pg/v2Client.d.ts.map +1 -0
  84. package/lib/types/src/client/pg/viewClient.d.ts +55 -0
  85. package/lib/types/src/client/pg/viewClient.d.ts.map +1 -0
  86. package/lib/types/src/client/price.d.ts +12 -0
  87. package/lib/types/src/client/price.d.ts.map +1 -0
  88. package/lib/types/src/client/render.d.ts +24 -0
  89. package/lib/types/src/client/render.d.ts.map +1 -0
  90. package/lib/types/src/client/squads.d.ts +17 -0
  91. package/lib/types/src/client/squads.d.ts.map +1 -0
  92. package/lib/types/src/client/trade.d.ts +24 -0
  93. package/lib/types/src/client/trade.d.ts.map +1 -0
  94. package/lib/types/src/client/wormhole.d.ts +9 -0
  95. package/lib/types/src/client/wormhole.d.ts.map +1 -0
  96. package/lib/types/src/constants.d.ts +41 -0
  97. package/lib/types/src/constants.d.ts.map +1 -0
  98. package/lib/types/src/dbTypes.d.ts +123 -0
  99. package/lib/types/src/dbTypes.d.ts.map +1 -0
  100. package/lib/types/src/dbTypesV2.d.ts +193 -0
  101. package/lib/types/src/dbTypesV2.d.ts.map +1 -0
  102. package/lib/types/src/dbViewTypes.d.ts +35 -0
  103. package/lib/types/src/dbViewTypes.d.ts.map +1 -0
  104. package/lib/types/src/errorReporter.d.ts +13 -0
  105. package/lib/types/src/errorReporter.d.ts.map +1 -0
  106. package/lib/types/src/index.d.ts +15 -0
  107. package/lib/types/src/index.d.ts.map +1 -0
  108. package/lib/types/src/logger.d.ts +16 -0
  109. package/lib/types/src/logger.d.ts.map +1 -0
  110. package/package.json +1 -1
@@ -0,0 +1,559 @@
1
+ import { Pool } from 'pg';
2
+ import { Kysely, NoResultError, PostgresDialect, sql, } from 'kysely';
3
+ import { consoleLogger } from '../../logger';
4
+ export const transferTypToChan = (t) => {
5
+ if (t == 'open_compute_rewards') {
6
+ return 'open_compute';
7
+ }
8
+ if (t == 'node_operator_rewards') {
9
+ return 'node_operator';
10
+ }
11
+ if (t == 'availability_rewards') {
12
+ return 'availability';
13
+ }
14
+ return 'upgrade';
15
+ };
16
+ const transferFromDB = (o) => {
17
+ return {
18
+ id: o.id,
19
+ solKey: o.sol_key,
20
+ solTx: o.sol_tx,
21
+ sqTx: o.sq_tx,
22
+ createdAt: o.created_at,
23
+ payedAt: o.payed_at,
24
+ amountDue: BigInt(o.amount_due),
25
+ amountPayed: o.amount_payed ? BigInt(o.amount_payed) : undefined,
26
+ channel: transferTypToChan(o.transfer_type),
27
+ operatorRewards: o.transfer_type == 'node_operator_rewards'
28
+ ? {
29
+ epochId: o.epoch_id,
30
+ startTime: o.start_time,
31
+ endTime: o.end_time,
32
+ }
33
+ : undefined,
34
+ computeClientRewards: o.transfer_type == 'open_compute_rewards'
35
+ ? {
36
+ epochId: o.epoch_id,
37
+ deviceId: o.device_id,
38
+ }
39
+ : undefined,
40
+ upgradeRewards: o.transfer_type == 'upgrade_rewards' && !!o.epoch_id
41
+ ? {
42
+ epochId: o.epoch_id,
43
+ epochStartTime: o.epoch_start_time,
44
+ points: BigInt(o.points),
45
+ }
46
+ : undefined,
47
+ availabilityRewards: o.transfer_type == 'availability_rewards'
48
+ ? {
49
+ epochId: o.epoch_id,
50
+ deviceId: o.device_id,
51
+ }
52
+ : undefined,
53
+ };
54
+ };
55
+ export const TRANSFER_TABLE = 'transfer';
56
+ export const NODE_OPERATOR_REWARDS_TRANSFER_TABLE = 'node_operator_rewards_transfer';
57
+ export const OPEN_COMPUTE_REWARDS_TRANSFER_TABLE = 'open_compute_rewards_transfer';
58
+ export const AVAILABILITY_REWARDS_TRANSFER_TABLE = 'availability_rewards_transfer';
59
+ export const UPGRADE_REWARDS_TRANSFER_TABLE = 'upgrade_rewards_transfer';
60
+ export const SQUADS_TX_TABLE = 'squads_tx';
61
+ export const NODE_OPERATOR_EPOCH_TABLE = 'node_operator_epoch';
62
+ export const JOB_ID_TABLE = 'job_id';
63
+ export const JOB_TABLE = 'job';
64
+ export const BURN_TABLE = 'burn';
65
+ export const NETWORK_REVENUE_TABLE = 'network_revenue';
66
+ export const pgClient = (config) => {
67
+ const dialect = new PostgresDialect({
68
+ pool: new Pool({
69
+ ...config,
70
+ port: config.port ?? 5432,
71
+ max: config.max ?? 10,
72
+ }),
73
+ });
74
+ // Database interface is passed to Kysely's constructor, and from now on, Kysely
75
+ // knows your database structure.
76
+ // Dialect is passed to Kysely's constructor, and from now on, Kysely knows how
77
+ // to communicate with your database.
78
+ const db = new Kysely({
79
+ dialect,
80
+ });
81
+ const createTransfers = async (db, transfers, log = consoleLogger) => {
82
+ for (const t of transfers) {
83
+ const { id: transferId } = (await db
84
+ .insertInto(TRANSFER_TABLE)
85
+ .values({
86
+ amount_due: BigInt(t.amountDue),
87
+ amount_payed: t.amountPayed ? BigInt(t.amountPayed) : 0,
88
+ created_at: t.createdAt,
89
+ payed_at: t.payedAt,
90
+ sol_key: t.solKey,
91
+ sol_tx: t.solTx,
92
+ transfer_type: (() => {
93
+ if (t.operatorRewards) {
94
+ return 'node_operator_rewards';
95
+ }
96
+ else if (t.upgradeRewards) {
97
+ return 'upgrade_rewards';
98
+ }
99
+ else if (t.computeClientRewards) {
100
+ return 'open_compute_rewards';
101
+ }
102
+ else if (t.availabilityRewards) {
103
+ return 'availability_rewards';
104
+ }
105
+ throw new Error('wtf');
106
+ })(),
107
+ })
108
+ .returning((eb) => ['id as id'])
109
+ .executeTakeFirst());
110
+ log.info(`inserted transfer ${JSON.stringify(t, (key, value) => typeof value === 'bigint' ? value.toString() : value)}`);
111
+ if (t.operatorRewards) {
112
+ log.info(`inserting operator rewards ${transferId}`);
113
+ const x = (await db
114
+ .insertInto(NODE_OPERATOR_REWARDS_TRANSFER_TABLE)
115
+ .values({
116
+ end_time: t.operatorRewards.endTime,
117
+ start_time: t.operatorRewards.startTime,
118
+ epoch_id: t.operatorRewards.epochId,
119
+ transfer_id: transferId,
120
+ })
121
+ .executeTakeFirst()).insertId;
122
+ }
123
+ else if (t.computeClientRewards) {
124
+ log.info(`inserting compute client rewards ${transferId}`);
125
+ const x = (await db
126
+ .insertInto(OPEN_COMPUTE_REWARDS_TRANSFER_TABLE)
127
+ .values({
128
+ epoch_id: t.computeClientRewards.epochId,
129
+ device_id: t.computeClientRewards.deviceId,
130
+ transfer_id: transferId,
131
+ })
132
+ .executeTakeFirst()).insertId;
133
+ }
134
+ else if (t.upgradeRewards) {
135
+ log.info(`inserting upgrade rewards ${transferId}`);
136
+ const x = (await db
137
+ .insertInto(UPGRADE_REWARDS_TRANSFER_TABLE)
138
+ .values({
139
+ epoch_id: t.upgradeRewards.epochId,
140
+ epoch_start_time: t.upgradeRewards.epochStartTime,
141
+ points: t.upgradeRewards.points,
142
+ transfer_id: transferId,
143
+ })
144
+ .executeTakeFirst()).insertId;
145
+ }
146
+ else if (t.availabilityRewards) {
147
+ log.info(`inserting availability rewards ${transferId}`);
148
+ const x = (await db
149
+ .insertInto(AVAILABILITY_REWARDS_TRANSFER_TABLE)
150
+ .values({
151
+ epoch_id: t.availabilityRewards.epochId,
152
+ device_id: t.availabilityRewards.deviceId,
153
+ transfer_id: transferId,
154
+ })
155
+ .executeTakeFirst()).insertId;
156
+ }
157
+ }
158
+ return;
159
+ };
160
+ return {
161
+ db,
162
+ async fetchBurns(f, log = consoleLogger) {
163
+ throw new Error('not implemented');
164
+ },
165
+ async backfillBurn(p, log) {
166
+ throw new Error('cant backfill into v1');
167
+ },
168
+ async saveNodeOperatorEpoch(epochId, transfers, jobIds, totalRndr, log = consoleLogger) {
169
+ await db.transaction().execute(async (trx) => {
170
+ await createTransfers(trx, transfers, log);
171
+ log.info(`inserted transfers`);
172
+ for (const id of jobIds) {
173
+ await trx
174
+ .insertInto(JOB_ID_TABLE)
175
+ .values({
176
+ id: BigInt(id),
177
+ epoch_id: epochId,
178
+ })
179
+ .executeTakeFirstOrThrow();
180
+ }
181
+ log.info(`inserted jobids`);
182
+ const now = new Date(Date.now());
183
+ const res = await trx
184
+ .updateTable(NODE_OPERATOR_EPOCH_TABLE)
185
+ .set({
186
+ saved_at: now,
187
+ total_rndr: totalRndr,
188
+ })
189
+ .where('id', '=', epochId.toString())
190
+ .executeTakeFirstOrThrow();
191
+ log.info(`saved node operator epoch: ${res.numUpdatedRows}`);
192
+ });
193
+ return;
194
+ },
195
+ async getLatestNodeOperatorEpoch(log = consoleLogger) {
196
+ const now = new Date(Date.now());
197
+ try {
198
+ const res = await db
199
+ .selectFrom(NODE_OPERATOR_EPOCH_TABLE)
200
+ .selectAll()
201
+ .where('end_time', '<=', now)
202
+ .where('saved_at', 'is', null)
203
+ .orderBy('end_time asc')
204
+ .limit(1)
205
+ .executeTakeFirstOrThrow();
206
+ return {
207
+ epochId: BigInt(res.id),
208
+ startedAt: res.start_time,
209
+ endedAt: res.end_time,
210
+ savedAt: res.saved_at ?? undefined,
211
+ };
212
+ }
213
+ catch (e) {
214
+ if (e instanceof NoResultError) {
215
+ log.info(`no node operator epoch found`);
216
+ return undefined;
217
+ }
218
+ throw e;
219
+ }
220
+ },
221
+ async getOutstanding(f, log = consoleLogger) {
222
+ const { typ, nullKey, due } = f;
223
+ //select sol_key, sum(amount_due)-sum(amount_payed) from transfer group by sol_key;
224
+ let q = db
225
+ .selectFrom(TRANSFER_TABLE)
226
+ .select(({ fn, val, ref }) => [
227
+ 'sol_key',
228
+ sql `${fn.sum('amount_due')} -
229
+ ${fn.sum('amount_payed')}`.as('due'),
230
+ ])
231
+ .where('transfer_type', '=', typ)
232
+ .groupBy(['sol_key']);
233
+ if (!nullKey) {
234
+ q = q.where('sol_key', 'is not', null);
235
+ }
236
+ if (due) {
237
+ q = q.having(({ fn, ref }) => sql `${fn.sum('amount_due')} -
238
+ ${fn.sum('amount_payed')}
239
+ >
240
+ 0`);
241
+ }
242
+ const res = await q.execute();
243
+ log.info(`outstanding query ${q.compile().sql} params ${JSON.stringify(f)} ${res.length} rows`);
244
+ const out = {};
245
+ for (const r of res) {
246
+ out[r.sol_key ?? ''] = BigInt(r.due);
247
+ }
248
+ return out;
249
+ },
250
+ async fetchTransfers(f, log = consoleLogger) {
251
+ let base = db
252
+ .selectFrom(TRANSFER_TABLE)
253
+ // @ts-ignore
254
+ .selectAll(TRANSFER_TABLE);
255
+ if (f.typ) {
256
+ base = base.where('transfer.transfer_type', '=', f.typ);
257
+ }
258
+ if (f.solKey) {
259
+ base = base.where('transfer.sol_key', '=', f.solKey);
260
+ }
261
+ if (f.payed != undefined) {
262
+ base = base.where('transfer.payed_at', f.payed ? 'is not' : 'is', null);
263
+ }
264
+ if (f.createdBefore != undefined) {
265
+ base = base.where('transfer.created_at', '<=', f.createdBefore);
266
+ }
267
+ if (f.typ == 'upgrade_rewards') {
268
+ base = base
269
+ .innerJoin(UPGRADE_REWARDS_TRANSFER_TABLE, 'upgrade_rewards_transfer.transfer_id', 'transfer.id')
270
+ .selectAll(UPGRADE_REWARDS_TRANSFER_TABLE);
271
+ if (f.epochId) {
272
+ // @ts-ignore
273
+ base = base.where('upgrade_rewards_transfer.epoch_id', '=', f.epochId);
274
+ }
275
+ }
276
+ if (f.typ == 'open_compute_rewards') {
277
+ base = base
278
+ .innerJoin(OPEN_COMPUTE_REWARDS_TRANSFER_TABLE, 'open_compute_rewards_transfer.transfer_id', 'transfer.id')
279
+ .selectAll(OPEN_COMPUTE_REWARDS_TRANSFER_TABLE);
280
+ if (f.epochId) {
281
+ base = base.where(
282
+ // @ts-ignore
283
+ 'open_compute_rewards_transfer.epoch_id', '=', f.epochId);
284
+ }
285
+ }
286
+ if (f.typ == 'node_operator_rewards') {
287
+ base = base
288
+ .innerJoin(NODE_OPERATOR_REWARDS_TRANSFER_TABLE, 'node_operator_rewards_transfer.transfer_id', 'transfer.id')
289
+ .selectAll(NODE_OPERATOR_REWARDS_TRANSFER_TABLE);
290
+ if (f.epochId) {
291
+ base = base.where(
292
+ // @ts-ignore
293
+ 'node_operator_rewards_transfer.epoch_id', '=', f.epochId);
294
+ }
295
+ }
296
+ if (f.typ == 'availability_rewards') {
297
+ base = base
298
+ .innerJoin(AVAILABILITY_REWARDS_TRANSFER_TABLE, 'availability_rewards_transfer.transfer_id', 'transfer.id')
299
+ .selectAll(AVAILABILITY_REWARDS_TRANSFER_TABLE);
300
+ if (f.epochId) {
301
+ base = base.where(
302
+ // @ts-ignore
303
+ 'availability_rewards_transfer.epoch_id', '=', f.epochId);
304
+ }
305
+ }
306
+ if (f.sort) {
307
+ base = base.orderBy('transfer.sol_key asc');
308
+ }
309
+ const res = await base.execute();
310
+ log.info(`fetched ${base.compile().sql} params ${JSON.stringify(f)} ${res.length} transfers`);
311
+ return res.map((r) => transferFromDB(r));
312
+ },
313
+ async payoutTransfers(idToAmt, payedAt, solTx, log = consoleLogger) {
314
+ const res = await db.transaction().execute(async (tx) => {
315
+ const alreadyUpdatedIds = (await tx
316
+ .selectFrom(TRANSFER_TABLE)
317
+ .select(['id'])
318
+ .where('id', 'in', Object.keys(idToAmt))
319
+ .where('sol_tx', 'is not', null)
320
+ .execute()).map(({ id }) => id);
321
+ for (const [id, amt] of Object.entries(idToAmt)) {
322
+ if (alreadyUpdatedIds.includes(id)) {
323
+ log.info(`transfer ${id} already marked payed out. skipping`);
324
+ continue;
325
+ }
326
+ const res = await tx
327
+ .updateTable(TRANSFER_TABLE)
328
+ .set({
329
+ payed_at: payedAt,
330
+ sol_tx: solTx,
331
+ amount_payed: amt,
332
+ })
333
+ .where('id', '=', id.toString())
334
+ .executeTakeFirstOrThrow();
335
+ log.info(`marked ${res.numUpdatedRows} transfer payed out`);
336
+ }
337
+ });
338
+ },
339
+ async payoutTransfer(id, payedAt, solTx, amtPayed, log = consoleLogger) {
340
+ const res = await db
341
+ .updateTable(TRANSFER_TABLE)
342
+ .set({
343
+ payed_at: payedAt,
344
+ sol_tx: solTx,
345
+ amount_payed: amtPayed,
346
+ })
347
+ .where('id', '=', id.toString())
348
+ .executeTakeFirst();
349
+ log.info(`marked ${res.numUpdatedRows} transfer payed out`);
350
+ return;
351
+ },
352
+ async createTransfers(transfers, log = consoleLogger) {
353
+ await createTransfers(db, transfers, log);
354
+ },
355
+ async fetchInfoForEpoch(epochId) {
356
+ const res = await db
357
+ .selectFrom(JOB_ID_TABLE)
358
+ .innerJoin(NODE_OPERATOR_EPOCH_TABLE, 'node_operator_epoch.id', 'job_id.epoch_id')
359
+ .where('job_id.epoch_id', '=', epochId.toString())
360
+ .select([
361
+ 'job_id.id',
362
+ 'node_operator_epoch.total_rndr',
363
+ 'node_operator_epoch.start_time',
364
+ 'node_operator_epoch.end_time',
365
+ 'node_operator_epoch.burned',
366
+ 'node_operator_epoch.burn_tx',
367
+ ])
368
+ .execute();
369
+ if (res.length == 0) {
370
+ throw new Error(`epoch ${epochId} not found`);
371
+ }
372
+ return {
373
+ jobIds: res.map((r) => Number(r.id)),
374
+ totalRndr: BigInt(res[0].total_rndr),
375
+ startTime: res[0].start_time,
376
+ endTime: res[0].end_time,
377
+ burned: BigInt(res[0].burned),
378
+ burnTx: res[0].burn_tx,
379
+ };
380
+ },
381
+ async updateComputeClientSolKey(deviceId, solKey, log = consoleLogger) {
382
+ const q = db
383
+ .updateTable(`${TRANSFER_TABLE} as t`)
384
+ .set({
385
+ sol_key: solKey,
386
+ })
387
+ .from(`${OPEN_COMPUTE_REWARDS_TRANSFER_TABLE} as o`)
388
+ .whereRef('t.id', '=', 'o.transfer_id')
389
+ .where('t.sol_key', 'is', null)
390
+ .where('o.device_id', '=', deviceId);
391
+ const sql = await q.compile();
392
+ log.info(`sql ${sql.sql} params ${sql.parameters}`);
393
+ const res = await q.executeTakeFirstOrThrow();
394
+ log.info(`updated ${res.numUpdatedRows} device-id sol_keys`);
395
+ },
396
+ async markJobsBurned(p, log = consoleLogger) {
397
+ let { markedAt, solTx } = p;
398
+ let res = await db
399
+ .updateTable(BURN_TABLE)
400
+ .set({ marked_burned_at: markedAt })
401
+ .where('sol_tx', '=', solTx)
402
+ .executeTakeFirstOrThrow();
403
+ log.debug(`set ${res.numUpdatedRows} ${solTx} -> marked_burned_at ${markedAt.toISOString()}`);
404
+ },
405
+ async markJobsBurnt(trx, p, log = consoleLogger) {
406
+ const { id } = await trx
407
+ .insertInto(BURN_TABLE)
408
+ .values({
409
+ sol_tx: p.solTx,
410
+ executed_at: p.executedAt,
411
+ priced_at: p.pricedAt,
412
+ usdc_spent: p.usdcSpent,
413
+ quote_amt: p.quoteAmt,
414
+ burned: p.burned,
415
+ })
416
+ .onConflict((oc) => oc.column('sol_tx').doNothing())
417
+ .returning((eb) => ['id as id'])
418
+ .executeTakeFirstOrThrow();
419
+ const jobIdsStr = p.jobsIds.map(String);
420
+ const res = await trx
421
+ .updateTable(JOB_TABLE)
422
+ .where('id', 'in', jobIdsStr)
423
+ .set('burn_id', id)
424
+ .executeTakeFirstOrThrow();
425
+ log.debug(`set burn_id on ${res.numUpdatedRows} jobs`);
426
+ return;
427
+ },
428
+ async produceBurnedJobs(jobs, log = consoleLogger) {
429
+ await db.transaction().execute(async (trx) => {
430
+ let num = BigInt(0);
431
+ for (const { amount, completedAt, jobId } of jobs) {
432
+ const res = await trx
433
+ .insertInto(JOB_TABLE)
434
+ .values({
435
+ id: jobId,
436
+ render_amt: amount,
437
+ completed_at: completedAt,
438
+ inserted_at: new Date(Date.now()),
439
+ })
440
+ .onConflict((oc) => oc.column('id').doNothing())
441
+ .executeTakeFirstOrThrow();
442
+ num += res.numInsertedOrUpdatedRows ?? BigInt(0);
443
+ }
444
+ log.debug(`inserted ${num} of ${jobs.length} burn jobs`);
445
+ });
446
+ },
447
+ async consumeAndLockBurnJobs(limit, lowerRndrThreshold, upperRndrThreshold, log = consoleLogger) {
448
+ const trx = await begin(db);
449
+ const q = trx.trx
450
+ .selectFrom(trx.trx
451
+ .selectFrom(JOB_TABLE)
452
+ .select(({ fn, val, ref }) => [
453
+ 'id',
454
+ fn
455
+ .sum('render_amt')
456
+ .over((ob) => ob.orderBy(`completed_at`, `asc`))
457
+ .as('total'),
458
+ ])
459
+ .where('burn_id', 'is', null)
460
+ .as('t'))
461
+ .select('id')
462
+ .where('total', '>', lowerRndrThreshold)
463
+ .where('total', '<', upperRndrThreshold);
464
+ log.debug(`outstanding jobs q: ${q.compile().sql} ${JSON.stringify({
465
+ limit,
466
+ lowerRndrThreshold,
467
+ upperRndrThreshold,
468
+ })}`);
469
+ const idRs = await q.execute();
470
+ const ids = idRs.map((x) => x.id);
471
+ log.debug(`${ids.length} candidate jobs for burn. locking up to ${limit} jobs`);
472
+ if (ids.length == 0) {
473
+ return { trx, jobs: [] };
474
+ }
475
+ const rows = await trx.trx
476
+ .selectFrom(JOB_TABLE)
477
+ .selectAll()
478
+ .where('id', 'in', ids)
479
+ .limit(limit)
480
+ .forUpdate()
481
+ .skipLocked()
482
+ .execute();
483
+ log.debug(`locked ${rows.length} jobs`);
484
+ const jobs = [];
485
+ for (const r of rows) {
486
+ jobs.push({
487
+ id: Number(r.id),
488
+ completedAt: r.completed_at,
489
+ rndrUsed: BigInt(r.render_amt),
490
+ });
491
+ }
492
+ return { trx, jobs };
493
+ },
494
+ async incrBuyBurnMetrics(log = consoleLogger) {
495
+ const res = await db
496
+ .selectFrom(JOB_TABLE)
497
+ .select('completed_at')
498
+ .orderBy('completed_at asc')
499
+ .where('burn_id', 'is', null)
500
+ .execute();
501
+ if (res.length == 0) {
502
+ return { outstandingJobs: 0 };
503
+ }
504
+ return {
505
+ outstandingJobs: res.length,
506
+ oldestJobFinishedAt: res[0].completed_at,
507
+ };
508
+ },
509
+ async deleteAll() { },
510
+ };
511
+ };
512
+ async function begin(db) {
513
+ const connection = new Deferred();
514
+ const result = new Deferred();
515
+ // Do NOT await this line.
516
+ db.transaction()
517
+ .execute((trx) => {
518
+ connection.resolve(trx);
519
+ return result.promise;
520
+ })
521
+ .catch((err) => {
522
+ // Don't do anything here. Just swallow the exception.
523
+ });
524
+ const trx = await connection.promise;
525
+ return {
526
+ trx,
527
+ commit() {
528
+ result.resolve(null);
529
+ },
530
+ rollback() {
531
+ result.reject(new Error('rollback'));
532
+ },
533
+ };
534
+ }
535
+ export class Deferred {
536
+ #promise;
537
+ #resolve;
538
+ #reject;
539
+ constructor() {
540
+ this.#promise = new Promise((resolve, reject) => {
541
+ this.#reject = reject;
542
+ this.#resolve = resolve;
543
+ });
544
+ }
545
+ get promise() {
546
+ return this.#promise;
547
+ }
548
+ resolve = (value) => {
549
+ if (this.#resolve) {
550
+ this.#resolve(value);
551
+ }
552
+ };
553
+ reject = (reason) => {
554
+ if (this.#reject) {
555
+ this.#reject(reason);
556
+ }
557
+ };
558
+ }
559
+ //# sourceMappingURL=v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/client/pg/v1.ts"],"names":[],"mappings":"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"}