@render-foundation/utils 0.0.16 → 0.0.17

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 (56) hide show
  1. package/lib/cjs/dbTypes.js +3 -0
  2. package/lib/cjs/dbTypes.js.map +1 -0
  3. package/lib/cjs/errorReporter.js +77 -0
  4. package/lib/cjs/errorReporter.js.map +1 -0
  5. package/lib/cjs/index.js +24 -0
  6. package/lib/cjs/index.js.map +1 -0
  7. package/lib/cjs/logger.js +18 -0
  8. package/lib/cjs/logger.js.map +1 -0
  9. package/lib/cjs/pgClient.js +429 -0
  10. package/lib/cjs/pgClient.js.map +1 -0
  11. package/lib/cjs/priceClient.js +33 -0
  12. package/lib/cjs/priceClient.js.map +1 -0
  13. package/lib/cjs/renderClient.js +74 -0
  14. package/lib/cjs/renderClient.js.map +1 -0
  15. package/lib/cjs/squadsV3.js +63 -0
  16. package/lib/cjs/squadsV3.js.map +1 -0
  17. package/lib/cjs/wormhole.js +68 -0
  18. package/lib/cjs/wormhole.js.map +1 -0
  19. package/lib/esm/src/dbTypes.js +2 -0
  20. package/lib/esm/src/dbTypes.js.map +1 -0
  21. package/lib/esm/src/errorReporter.js +68 -0
  22. package/lib/esm/src/errorReporter.js.map +1 -0
  23. package/lib/esm/src/index.js +8 -0
  24. package/lib/esm/src/index.js.map +1 -0
  25. package/lib/esm/src/logger.js +15 -0
  26. package/lib/esm/src/logger.js.map +1 -0
  27. package/lib/esm/src/pgClient.js +390 -0
  28. package/lib/esm/src/pgClient.js.map +1 -0
  29. package/lib/esm/src/priceClient.js +15 -0
  30. package/lib/esm/src/priceClient.js.map +1 -0
  31. package/lib/esm/src/renderClient.js +57 -0
  32. package/lib/esm/src/renderClient.js.map +1 -0
  33. package/lib/esm/src/squadsV3.js +47 -0
  34. package/lib/esm/src/squadsV3.js.map +1 -0
  35. package/lib/esm/src/wormhole.js +32 -0
  36. package/lib/esm/src/wormhole.js.map +1 -0
  37. package/lib/esm/tsconfig.esm.tsbuildinfo +1 -0
  38. package/lib/types/src/dbTypes.d.ts +62 -0
  39. package/lib/types/src/dbTypes.d.ts.map +1 -0
  40. package/lib/types/src/errorReporter.d.ts +12 -0
  41. package/lib/types/src/errorReporter.d.ts.map +1 -0
  42. package/lib/types/src/index.d.ts +8 -0
  43. package/lib/types/src/index.d.ts.map +1 -0
  44. package/lib/types/src/logger.d.ts +14 -0
  45. package/lib/types/src/logger.d.ts.map +1 -0
  46. package/lib/types/src/pgClient.d.ts +77 -0
  47. package/lib/types/src/pgClient.d.ts.map +1 -0
  48. package/lib/types/src/priceClient.d.ts +5 -0
  49. package/lib/types/src/priceClient.d.ts.map +1 -0
  50. package/lib/types/src/renderClient.d.ts +10 -0
  51. package/lib/types/src/renderClient.d.ts.map +1 -0
  52. package/lib/types/src/squadsV3.d.ts +8 -0
  53. package/lib/types/src/squadsV3.d.ts.map +1 -0
  54. package/lib/types/src/wormhole.d.ts +9 -0
  55. package/lib/types/src/wormhole.d.ts.map +1 -0
  56. package/package.json +3 -1
@@ -0,0 +1,390 @@
1
+ import { Pool } from "pg";
2
+ import { Kysely, NoResultError, PostgresDialect, sql, } from "kysely";
3
+ import { consoleLogger } from "./logger";
4
+ const transferFromDB = (o) => {
5
+ return {
6
+ id: o.id,
7
+ solKey: o.sol_key,
8
+ solTx: o.sol_tx,
9
+ sqTx: o.sq_tx,
10
+ txStatus: o.txStatus,
11
+ createdAt: o.created_at,
12
+ payedAt: o.payed_at,
13
+ amountDue: BigInt(o.amount_due),
14
+ amountPayed: o.amount_payed ? BigInt(o.amount_payed) : undefined,
15
+ operatorRewards: o.transfer_type == "node_operator_rewards"
16
+ ? {
17
+ epochId: o.epoch_id,
18
+ startTime: o.start_time,
19
+ endTime: o.end_time,
20
+ }
21
+ : undefined,
22
+ computeClientRewards: o.transfer_type == "open_compute_rewards"
23
+ ? {
24
+ epochId: o.epoch_id,
25
+ deviceId: o.device_id,
26
+ }
27
+ : undefined,
28
+ upgradeRewards: o.transfer_type == "upgrade_rewards" && !!o.epoch_id
29
+ ? {
30
+ epochId: o.epoch_id,
31
+ epochStartTime: o.epoch_start_time,
32
+ points: BigInt(o.points),
33
+ }
34
+ : undefined,
35
+ };
36
+ };
37
+ export const pgClient = (config, log = consoleLogger) => {
38
+ const dialect = new PostgresDialect({
39
+ pool: new Pool({
40
+ ...config,
41
+ port: config.port ?? 5432,
42
+ max: config.max ?? 10,
43
+ }),
44
+ });
45
+ // Database interface is passed to Kysely's constructor, and from now on, Kysely
46
+ // knows your database structure.
47
+ // Dialect is passed to Kysely's constructor, and from now on, Kysely knows how
48
+ // to communicate with your database.
49
+ const db = new Kysely({
50
+ dialect,
51
+ });
52
+ const TRANSFER = "transfer";
53
+ const NODE_OPERATOR_REWARDS_TRANSFER = "node_operator_rewards_transfer";
54
+ const COMPUTE_CLIENT_REWARDS_TRANSFER = "open_compute_rewards_transfer";
55
+ const UPGRADE_REWARDS_TRANSFER = "upgrade_rewards_transfer";
56
+ const SQUADS_TX = "squads_tx";
57
+ const NODE_OPERATOR_EPOCH = "node_operator_epoch";
58
+ const JOB_ID = "job_id";
59
+ const createTransfers = async (db, transfers) => {
60
+ for (const t of transfers) {
61
+ const { id: transferId } = (await db
62
+ .insertInto(TRANSFER)
63
+ .values({
64
+ amount_due: BigInt(t.amountDue),
65
+ amount_payed: t.amountPayed ? BigInt(t.amountPayed) : 0,
66
+ created_at: t.createdAt,
67
+ payed_at: t.payedAt,
68
+ sol_key: t.solKey,
69
+ sol_tx: t.solTx,
70
+ transfer_type: (() => {
71
+ if (t.operatorRewards) {
72
+ return "node_operator_rewards";
73
+ }
74
+ else if (t.upgradeRewards) {
75
+ return "upgrade_rewards";
76
+ }
77
+ else if (t.computeClientRewards) {
78
+ return "open_compute_rewards";
79
+ }
80
+ throw new Error("wtf");
81
+ })(),
82
+ })
83
+ .returning((eb) => ["id as id"])
84
+ .executeTakeFirst());
85
+ log.info(`inserted transfer ${JSON.stringify(t, (key, value) => typeof value === "bigint" ? value.toString() : value)}`);
86
+ if (t.operatorRewards) {
87
+ log.info(`inserting operator rewards ${transferId}`);
88
+ const x = (await db
89
+ .insertInto(NODE_OPERATOR_REWARDS_TRANSFER)
90
+ .values({
91
+ end_time: t.operatorRewards.endTime,
92
+ start_time: t.operatorRewards.startTime,
93
+ epoch_id: t.operatorRewards.epochId,
94
+ transfer_id: transferId,
95
+ })
96
+ .executeTakeFirst()).insertId;
97
+ }
98
+ else if (t.computeClientRewards) {
99
+ log.info(`inserting compute client rewards ${transferId}`);
100
+ const x = (await db
101
+ .insertInto(COMPUTE_CLIENT_REWARDS_TRANSFER)
102
+ .values({
103
+ device_id: t.computeClientRewards.deviceId,
104
+ transfer_id: transferId,
105
+ })
106
+ .executeTakeFirst()).insertId;
107
+ }
108
+ else if (t.upgradeRewards) {
109
+ log.info(`inserting upgrade rewards ${transferId}`);
110
+ const x = (await db
111
+ .insertInto(UPGRADE_REWARDS_TRANSFER)
112
+ .values({
113
+ epoch_id: t.upgradeRewards.epochId,
114
+ epoch_start_time: t.upgradeRewards.epochStartTime,
115
+ points: t.upgradeRewards.points,
116
+ transfer_id: transferId,
117
+ })
118
+ .executeTakeFirst()).insertId;
119
+ }
120
+ }
121
+ return;
122
+ };
123
+ return {
124
+ async updateBurned(epochId, burned, description) {
125
+ const res = await db
126
+ .updateTable(NODE_OPERATOR_EPOCH)
127
+ .set({
128
+ burned,
129
+ description
130
+ })
131
+ .where("id", "=", epochId.toString())
132
+ .executeTakeFirstOrThrow();
133
+ log.info(`saved node operator epoch: ${res.numUpdatedRows}`);
134
+ },
135
+ async saveNodeOperatorEpoch(epochId, transfers, jobIds, totalRndr) {
136
+ await db.transaction().execute(async (trx) => {
137
+ await createTransfers(trx, transfers);
138
+ log.info(`inserted transfers`);
139
+ for (const id of jobIds) {
140
+ await trx
141
+ .insertInto(JOB_ID)
142
+ .values({
143
+ id: BigInt(id),
144
+ epoch_id: epochId,
145
+ })
146
+ .executeTakeFirstOrThrow();
147
+ }
148
+ log.info(`inserted jobids`);
149
+ const now = new Date(Date.now());
150
+ const res = await trx
151
+ .updateTable(NODE_OPERATOR_EPOCH)
152
+ .set({
153
+ saved_at: now,
154
+ total_rndr: totalRndr,
155
+ })
156
+ .where("id", "=", epochId.toString())
157
+ .executeTakeFirstOrThrow();
158
+ log.info(`saved node operator epoch: ${res.numUpdatedRows}`);
159
+ });
160
+ return;
161
+ },
162
+ async getLatestNodeOperatorEpoch() {
163
+ const now = new Date(Date.now());
164
+ try {
165
+ const res = await db
166
+ .selectFrom(NODE_OPERATOR_EPOCH)
167
+ .selectAll()
168
+ .where("end_time", "<=", now)
169
+ .orderBy("end_time desc")
170
+ .limit(1)
171
+ .executeTakeFirstOrThrow();
172
+ return {
173
+ epochId: BigInt(res.id),
174
+ startedAt: res.start_time,
175
+ endedAt: res.end_time,
176
+ savedAt: res.saved_at ?? undefined,
177
+ };
178
+ }
179
+ catch (e) {
180
+ if (e instanceof NoResultError) {
181
+ log.info(`no node operator epoch found`);
182
+ return undefined;
183
+ }
184
+ throw e;
185
+ }
186
+ },
187
+ async getOutstanding(f) {
188
+ //select sol_key, sum(amount_due)-sum(amount_payed) from transfer group by sol_key;
189
+ const res = await db
190
+ .selectFrom(TRANSFER)
191
+ .select(({ fn, val, ref }) => [
192
+ "sol_key",
193
+ sql `${fn.sum("amount_due")} - ${fn.sum("amount_payed")}`.as("due"),
194
+ ])
195
+ .where("transfer_type", "=", f.typ)
196
+ .groupBy(["sol_key"])
197
+ .execute();
198
+ const out = {};
199
+ for (const r of res) {
200
+ out[r.sol_key] = BigInt(r.due);
201
+ }
202
+ return out;
203
+ },
204
+ async updateSqTx(tx, status) {
205
+ const res = await db
206
+ .updateTable(SQUADS_TX)
207
+ .set({ tx_status: status })
208
+ .where("sq_tx", "=", tx)
209
+ .execute();
210
+ log.info(`updated ${tx} -> ${status}`);
211
+ },
212
+ async setSqTx(transferIds, sqTx) {
213
+ const { id } = (await db
214
+ .insertInto(SQUADS_TX)
215
+ .values({ sq_tx: sqTx, tx_status: "created" })
216
+ .returning((eb) => ["id as id"])
217
+ .executeTakeFirst());
218
+ const res = await db
219
+ .updateTable(TRANSFER)
220
+ .set({ sq_tx_id: id })
221
+ .where("id", "in", transferIds.map((id) => id.toString()))
222
+ .execute();
223
+ log.info(`set sqTx ${sqTx} on ${transferIds.length} transfers`);
224
+ },
225
+ /*
226
+ [
227
+ 'transfer.id',
228
+ 'transfer.sol_key',
229
+ 'transfer.transfer_type',
230
+ 'transfer.transfer_type',
231
+ 'squads_tx.tx_status', 'squads_tx.sq_tx']
232
+ */
233
+ async fetchTransfers(f) {
234
+ let base = db
235
+ .selectFrom(TRANSFER)
236
+ // @ts-ignore
237
+ .selectAll(TRANSFER)
238
+ .leftJoin(SQUADS_TX, "squads_tx.id", "transfer.sq_tx_id")
239
+ .select(["squads_tx.tx_status", "squads_tx.sq_tx"])
240
+ .where("transfer_type", "=", f.typ);
241
+ if (f.status) {
242
+ if (f.status == "notx") {
243
+ base = base.where("squads_tx.tx_status", "is", null);
244
+ }
245
+ else {
246
+ base = base.where("squads_tx.tx_status", "=", f.status);
247
+ }
248
+ }
249
+ if (f.payed != undefined) {
250
+ base = base.where("payed_at", f.payed ? "is not" : "is", null);
251
+ }
252
+ if (f.typ == "upgrade_rewards") {
253
+ base = base.innerJoin(UPGRADE_REWARDS_TRANSFER, "upgrade_rewards_transfer.transfer_id", "transfer.id");
254
+ if (f.epochId) {
255
+ // @ts-ignore
256
+ base = base.where("upgrade_rewards_transfer.epoch_id", "=", f.epochId);
257
+ }
258
+ }
259
+ if (f.typ == "node_operator_rewards") {
260
+ base = base.innerJoin(NODE_OPERATOR_REWARDS_TRANSFER, "node_operator_rewards_transfer.transfer_id", "transfer.id");
261
+ if (f.epochId) {
262
+ // @ts-ignore
263
+ base = base.where("node_operator_rewards_transfer.epoch_id", "=", f.epochId);
264
+ }
265
+ }
266
+ if (f.sort) {
267
+ base = base.orderBy("transfer.sol_key asc");
268
+ }
269
+ const res = await base.execute();
270
+ log.info(`fetched ${base.compile().sql} ${res.length} transfers`);
271
+ return res.map((r) => transferFromDB(r));
272
+ },
273
+ async payoutTransfersSquads(ts, payedAt, solTx, sqTx) {
274
+ const { id: sqTxId } = (await db
275
+ .insertInto(SQUADS_TX)
276
+ .values({ sq_tx: sqTx, tx_status: "executed" })
277
+ .returning((eb) => ["id as id"])
278
+ .executeTakeFirstOrThrow());
279
+ let numUpdated = BigInt(0);
280
+ for (const [id, amtPayed] of Object.entries(ts)) {
281
+ const res = await db
282
+ .updateTable(TRANSFER)
283
+ .set({
284
+ payed_at: payedAt,
285
+ sol_tx: solTx,
286
+ amount_payed: amtPayed,
287
+ sq_tx_id: sqTxId,
288
+ })
289
+ .where("id", "=", id)
290
+ .executeTakeFirstOrThrow();
291
+ numUpdated += res.numUpdatedRows;
292
+ }
293
+ log.info(`marked ${numUpdated} transfers payed out`);
294
+ return;
295
+ },
296
+ async payoutTransfers(idToAmt, payedAt, solTx) {
297
+ const res = await db.transaction().execute(async (tx) => {
298
+ for (const [id, amt] of Object.entries(idToAmt)) {
299
+ const res = await tx
300
+ .updateTable(TRANSFER)
301
+ .set({
302
+ payed_at: payedAt,
303
+ sol_tx: solTx,
304
+ amount_payed: amt,
305
+ })
306
+ .where("id", "=", id.toString())
307
+ .executeTakeFirstOrThrow();
308
+ log.info(`marked ${res.numUpdatedRows} transfer payed out`);
309
+ }
310
+ });
311
+ },
312
+ async payoutTransfer(id, payedAt, solTx, amtPayed) {
313
+ const res = await db
314
+ .updateTable(TRANSFER)
315
+ .set({
316
+ payed_at: payedAt,
317
+ sol_tx: solTx,
318
+ amount_payed: amtPayed,
319
+ })
320
+ .where("id", "=", id.toString())
321
+ .executeTakeFirst();
322
+ log.info(`marked ${res.numUpdatedRows} transfer payed out`);
323
+ return;
324
+ },
325
+ async payoutTransferSq(id, payedAt, solTx, amtPayed, sqTx) {
326
+ const { id: sqTxId } = (await db
327
+ .insertInto(SQUADS_TX)
328
+ .values({ sq_tx: sqTx, tx_status: "executed" })
329
+ .onConflict((oc) => oc.column("sq_tx").doNothing())
330
+ .returning((eb) => ["id as id"])
331
+ .executeTakeFirst());
332
+ const res = await db
333
+ .updateTable(TRANSFER)
334
+ .set({
335
+ payed_at: payedAt,
336
+ sol_tx: solTx,
337
+ amount_payed: amtPayed,
338
+ sq_tx_id: sqTxId,
339
+ })
340
+ .where("id", "=", id.toString())
341
+ .executeTakeFirst();
342
+ log.info(`marked ${res.numUpdatedRows} transfer payed out`);
343
+ return;
344
+ },
345
+ async createTransfers(transfers) {
346
+ await createTransfers(db, transfers);
347
+ },
348
+ async fetchInfoForEpoch(epochId) {
349
+ const res = await db
350
+ .selectFrom(JOB_ID)
351
+ .innerJoin(NODE_OPERATOR_EPOCH, "node_operator_epoch.id", "job_id.epoch_id")
352
+ .where("job_id.epoch_id", "=", epochId.toString())
353
+ .selectAll()
354
+ .execute();
355
+ const out = [];
356
+ let totalRndr = BigInt(0);
357
+ for (const r of res) {
358
+ totalRndr = BigInt(r.total_rndr);
359
+ out.push(Number(r.id));
360
+ }
361
+ return { jobIds: out, totalRndr };
362
+ },
363
+ async fetchTransfersByWallet(f) {
364
+ let base = db
365
+ .selectFrom(TRANSFER)
366
+ .selectAll(TRANSFER)
367
+ .where("sol_key", "=", f.address);
368
+ if (f.payed != undefined) {
369
+ base = base.where("payed_at", f.payed ? "is not" : "is", null);
370
+ }
371
+ const res = await base.execute();
372
+ if (f.typ === "node_operator_rewards") {
373
+ base = base.innerJoin(NODE_OPERATOR_REWARDS_TRANSFER, "node_operator_rewards_transfer.transfer_id", "transfer.id");
374
+ if (f.epochId) {
375
+ // @ts-ignore
376
+ base = base.where("node_operator_rewards_transfer.epoch_id", "=", BigInt(f.epochId));
377
+ }
378
+ }
379
+ if (f.typ === "open_compute_rewards") {
380
+ base = base.innerJoin(COMPUTE_CLIENT_REWARDS_TRANSFER, "open_compute_rewards_transfer.transfer_id", "transfer.id");
381
+ if (f.epochId) {
382
+ // @ts-ignore
383
+ base = base.where("open_compute_rewards_transfer.epoch_id", "=", BigInt(f.epochId));
384
+ }
385
+ }
386
+ return res.map((r) => transferFromDB(r));
387
+ },
388
+ };
389
+ };
390
+ //# sourceMappingURL=pgClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pgClient.js","sourceRoot":"","sources":["../../../src/pgClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { CoinGeckoClient } from "coingecko-api-v3";
2
+ import dateFormat from "dateformat";
3
+ export const coinGeckoClient = () => {
4
+ const client = new CoinGeckoClient({
5
+ timeout: 10000,
6
+ autoRetry: true,
7
+ });
8
+ return {
9
+ async getRenderPriceAtDate(d) {
10
+ const res = await client.coinIdHistory({ id: 'render-token', date: dateFormat(d, 'dd-mm-yyyy') });
11
+ return res.market_data.current_price['usd'];
12
+ }
13
+ };
14
+ };
15
+ //# sourceMappingURL=priceClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priceClient.js","sourceRoot":"","sources":["../../../src/priceClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,UAAU,MAAM,YAAY,CAAC;AAMpC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAgB,EAAE;IAE/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,oBAAoB,CAAC,CAAO;YAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,EAAC,CAAC,CAAA;YAC/F,OAAO,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC7C,CAAC;KACF,CAAA;AAEH,CAAC,CAAA"}
@@ -0,0 +1,57 @@
1
+ import { consoleLogger } from "./logger";
2
+ export const renderClient = (authToken, log = consoleLogger) => {
3
+ const host = `rndr.x.io`;
4
+ return {
5
+ async fetchNodeOperatorRewards(startTime, endTime) {
6
+ const startTimeStr = startTime.toISOString().split('T')[0];
7
+ const endTimeStr = endTime.toISOString().split('T')[0];
8
+ const url = `https://${host}/api/v3/services/solana/payments?finished_after=${startTimeStr}&finished_before=${endTimeStr}`;
9
+ log.info(`fetching ${url}`);
10
+ const res = await fetch(url, { headers: {
11
+ Authorization: `${authToken}`,
12
+ Accept: 'application/vnd.api+json'
13
+ } }).then(async (res) => {
14
+ if (res.status != 200) {
15
+ throw new Error(`failed fetching node operator rewards. code: ${res.status} body: ${JSON.stringify(await res.text())}`);
16
+ }
17
+ return (await res.json());
18
+ });
19
+ const solKeyToDue = {};
20
+ for (const r of res.data.attributes.paymentsOwed) {
21
+ const [addr, amt] = Object.entries(r)[0];
22
+ solKeyToDue[addr] = amt;
23
+ }
24
+ return { solKeyToDue, jobIds: res.meta.jobIds };
25
+ },
26
+ async markJobsPayed(ids, finishedAfter, finishedBefore, totalDistributed) {
27
+ const payload = {
28
+ data: {
29
+ attributes: {
30
+ finished_after: finishedAfter.toISOString().split('T')[0],
31
+ finished_before: finishedBefore.toISOString().split('T')[0],
32
+ job_ids: ids,
33
+ total_distributed: totalDistributed
34
+ },
35
+ type: 'solana_payments'
36
+ }
37
+ };
38
+ const res = await fetch(`https://${host}/api/v3/services/solana/payments`, {
39
+ method: 'POST',
40
+ headers: {
41
+ 'Authorization': `Bearer ${authToken}`,
42
+ 'Content-Type': `application/vnd.api+json`,
43
+ 'Accept': `application/vnd.api+json`
44
+ },
45
+ body: JSON.stringify(payload)
46
+ }).then(async (res) => {
47
+ if (res.status != 201) {
48
+ throw new Error(`failed posting node operator rewards. code: ${res.status} body: ${JSON.stringify(await res.text())}`);
49
+ }
50
+ return (await res.text());
51
+ });
52
+ log.info(`markJobsPayed ${res}`);
53
+ return;
54
+ }
55
+ };
56
+ };
57
+ //# sourceMappingURL=renderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderClient.js","sourceRoot":"","sources":["../../../src/renderClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAe,MAAM,UAAU,CAAC;AA0BrD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAE,MAAoB,aAAa,EAAgB,EAAE;IACjG,MAAM,IAAI,GAAG,WAAW,CAAA;IACxB,OAAO;QACL,KAAK,CAAC,wBAAwB,CAAC,SAAe,EAAE,OAAa;YAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,GAAG,GAAG,WAAW,IAAI,mDAAmD,YAAY,oBAAoB,UAAU,EAAE,CAAA;YAC1H,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,EACH,EAAC,OAAO,EAAE;oBACR,aAAa,EAAE,GAAG,SAAS,EAAE;oBAC7B,MAAM,EAAE,0BAA0B;iBACnC,EAAC,CACH,CAAC,IAAI,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;gBACjB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;oBACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,CAAC,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;iBACxH;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAA;YACtC,CAAC,CAAC,CAAA;YACF,MAAM,WAAW,GAA2B,EAAE,CAAA;YAC9C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;gBAChD,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACxC,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;aACxB;YACD,OAAO,EAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAC,CAAA;QAC/C,CAAC;QACD,KAAK,CAAC,aAAa,CACjB,GAAa,EACb,aAAmB,EACnB,cAAoB,EACpB,gBAAwB;YAExB,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE;oBACJ,UAAU,EAAE;wBACV,cAAc,EAAE,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzD,eAAe,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC3D,OAAO,EAAE,GAAG;wBACZ,iBAAiB,EAAE,gBAAgB;qBACpC;oBACD,IAAI,EAAE,iBAAiB;iBACxB;aACF,CAAA;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,WAAW,IAAI,kCAAkC,EACjD;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,SAAS,EAAE;oBACtC,cAAc,EAAE,0BAA0B;oBAC1C,QAAQ,EAAE,0BAA0B;iBACrC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CACF,CAAC,IAAI,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;gBACjB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;oBACrB,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,CAAC,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;iBACvH;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;YACF,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;KAEF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { DEFAULT_MULTISIG_PROGRAM_ID, getAuthorityPDA, getTxPDA } from "@sqds/sdk";
2
+ import BN from "bn.js";
3
+ import { Transaction } from "@solana/web3.js";
4
+ import { sendAndConfirmWithRetry } from "@render-foundation/spl-utils";
5
+ import { consoleLogger } from "./logger";
6
+ export const executeSqV3Transaction = async (connection, squadsMsKey, clients, instrs, log = consoleLogger) => {
7
+ const msAuthorityK = getAuthorityPDA(squadsMsKey, new BN(1), DEFAULT_MULTISIG_PROGRAM_ID)[0];
8
+ let txPDA;
9
+ const primClient = clients[0];
10
+ const txIdx = await primClient.getNextTransactionIndex(squadsMsKey);
11
+ txPDA = getTxPDA(squadsMsKey, new BN(txIdx), DEFAULT_MULTISIG_PROGRAM_ID)[0];
12
+ let createTx = new Transaction()
13
+ .add(await primClient.buildCreateTransaction(squadsMsKey, 1, txIdx));
14
+ let instrIdx = 1;
15
+ for (const i of instrs) {
16
+ createTx.add(await primClient.buildAddInstruction(squadsMsKey, txPDA, i, instrIdx));
17
+ instrIdx += 1;
18
+ }
19
+ createTx.add(await primClient.buildActivateTransaction(squadsMsKey, txPDA));
20
+ for (const c of clients) {
21
+ createTx.add(await c.buildApproveTransaction(squadsMsKey, txPDA));
22
+ }
23
+ createTx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
24
+ createTx.feePayer = primClient.wallet.publicKey;
25
+ for (const c of clients) {
26
+ createTx = await c.wallet.signTransaction(createTx);
27
+ }
28
+ //createTx.sign(sharedMsKp, authorityKp)
29
+ await sendAndConfirmWithRetry(connection, createTx.serialize(), {
30
+ skipPreflight: true,
31
+ maxRetries: 10,
32
+ }, 'finalized');
33
+ log.info(`created tx ${txPDA}`);
34
+ log.info(`executing tx ${txPDA}`);
35
+ let execTx = new Transaction().add(await primClient.buildExecuteTransaction(txPDA, primClient.wallet.publicKey));
36
+ execTx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
37
+ execTx.feePayer = primClient.wallet.publicKey;
38
+ execTx = await primClient.wallet.signTransaction(execTx);
39
+ //execTx.sign(args.solFeePayerKp)
40
+ const { txid } = await sendAndConfirmWithRetry(connection, execTx.serialize(), {
41
+ skipPreflight: true,
42
+ maxRetries: 10,
43
+ }, 'confirmed');
44
+ log.info(`executed ${txid}`);
45
+ return { txSig: txid, txPDA };
46
+ };
47
+ //# sourceMappingURL=squadsV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"squadsV3.js","sourceRoot":"","sources":["../../../src/squadsV3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { CONTRACTS } from "@certusone/wormhole-sdk";
3
+ import { consoleLogger } from "./logger";
4
+ export const fetchEthInfo = async (seq, wormEnv = 'MAINNET', ethChainId = 2, retries = 3, log = consoleLogger) => {
5
+ const hexEmitter = Buffer.alloc(32)
6
+ .fill(Uint8Array.from(anchor.utils.bytes.hex.decode(CONTRACTS[wormEnv].ethereum.token_bridge)), 12)
7
+ .toString('hex');
8
+ const url = `https://api${wormEnv.toLowerCase() == 'mainnet' ? '' : `.${wormEnv.toString().toLowerCase()}`}.wormholescan.io/api/v1/global-tx/${ethChainId}/${hexEmitter}/${seq}`;
9
+ const recur = async (currRetry = 0) => {
10
+ if (currRetry == retries) {
11
+ return Promise.reject(new Error(`wormapi exceeded max retries ${retries} fetching ${url}`));
12
+ }
13
+ try {
14
+ const res = await fetch(url).then(async (res) => {
15
+ if (res.status != 200) {
16
+ throw new Error(`status code ${res.status} fetching ${url}. body: ${JSON.stringify(await res.json())}`);
17
+ }
18
+ return (await res.json());
19
+ }, err => {
20
+ throw new Error(`exception fetching wormapi: ${JSON.stringify(err)}`);
21
+ });
22
+ return [seq, res];
23
+ }
24
+ catch (e) {
25
+ // @ts-ignore
26
+ log.error(`wormapi err ${e.message}`);
27
+ return recur(currRetry + 1);
28
+ }
29
+ };
30
+ return (await recur());
31
+ };
32
+ //# sourceMappingURL=wormhole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wormhole.js","sourceRoot":"","sources":["../../../src/wormhole.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAC,aAAa,EAAe,MAAM,UAAU,CAAC;AAIrD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAW,EACX,UAAiC,SAAS,EAC1C,aAAqB,CAAC,EACtB,OAAO,GAAG,CAAC,EACX,MAAoB,aAAa,EACL,EAAE;IAE9B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;SAChC,IAAI,CACH,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAC3C,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC1C,EACD,EAAE,CACH;SACA,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClB,MAAM,GAAG,GAAG,cAAc,OAAO,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE,qCAAqC,UAAU,IAAI,UAAU,IAAI,GAAG,EAAE,CAAA;IAEhL,MAAM,KAAK,GAAG,KAAK,EAAE,SAAS,GAAG,CAAC,EAA8B,EAAE;QAChE,IAAI,SAAS,IAAI,OAAO,EAAE;YACxB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,OAAO,aAAa,GAAG,EAAE,CAAC,CAAC,CAAA;SAC5F;QACD,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAC/B,KAAK,EAAC,GAAG,EAAC,EAAE;gBACV,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;oBACrB,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,aAAa,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;iBACxG;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAA;YACtC,CAAC,EACD,GAAG,CAAC,EAAE;gBACJ,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvE,CAAC,CACF,CAAA;YACD,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;SAClB;QAAC,OAAO,CAAC,EAAE;YACV,aAAa;YACb,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACrC,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;SAC5B;IACH,CAAC,CAAA;IAED,OAAO,CAAC,MAAM,KAAK,EAAE,CAAC,CAAA;AACxB,CAAC,CAAA"}