@seedprotocol/sdk 0.4.21 → 0.4.22

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 (174) hide show
  1. package/dist/{ArweaveClient-DxpJnJXU.js → ArweaveClient-B-vm2Xae.js} +3 -3
  2. package/dist/{ArweaveClient-DxpJnJXU.js.map → ArweaveClient-B-vm2Xae.js.map} +1 -1
  3. package/dist/{ArweaveClient-Cz9ZLiEV.js → ArweaveClient-C-eLH0zU.js} +3 -3
  4. package/dist/{ArweaveClient-Cz9ZLiEV.js.map → ArweaveClient-C-eLH0zU.js.map} +1 -1
  5. package/dist/{Db-CXwQVLZv.js → Db-B7whB3oJ.js} +107 -6
  6. package/dist/Db-B7whB3oJ.js.map +1 -0
  7. package/dist/{Db-DkTBncAM.js → Db-nir1xVHg.js} +4 -4
  8. package/dist/{Db-DkTBncAM.js.map → Db-nir1xVHg.js.map} +1 -1
  9. package/dist/{EasClient-DjpbHjU9.js → EasClient-BH_feMaX.js} +2 -2
  10. package/dist/{EasClient-JYkmHxu1.js.map → EasClient-BH_feMaX.js.map} +1 -1
  11. package/dist/{EasClient-JYkmHxu1.js → EasClient-CFguAKBp.js} +2 -2
  12. package/dist/{EasClient-DjpbHjU9.js.map → EasClient-CFguAKBp.js.map} +1 -1
  13. package/dist/{FileManager-CKyoLrBP.js → FileManager-BR3jtuSl.js} +2 -2
  14. package/dist/{FileManager-CKyoLrBP.js.map → FileManager-BR3jtuSl.js.map} +1 -1
  15. package/dist/{FileManager-DHnyb040.js → FileManager-C2uXql_C.js} +18 -2
  16. package/dist/FileManager-C2uXql_C.js.map +1 -0
  17. package/dist/{ModelProperty-DWtv9fQr.js → ModelProperty-CIeLasI4.js} +24 -24
  18. package/dist/{ModelProperty-DWtv9fQr.js.map → ModelProperty-CIeLasI4.js.map} +1 -1
  19. package/dist/{PathResolver-Ce4K9acQ.js → PathResolver-CZoSnHBU.js} +2 -2
  20. package/dist/{PathResolver-Ce4K9acQ.js.map → PathResolver-CZoSnHBU.js.map} +1 -1
  21. package/dist/{PathResolver-pmw--Ea2.js → PathResolver-DnrG1hUX.js} +2 -2
  22. package/dist/{PathResolver-pmw--Ea2.js.map → PathResolver-DnrG1hUX.js.map} +1 -1
  23. package/dist/{QueryClient-OUjfvY3g.js → QueryClient-DJOrJZRR.js} +3 -2
  24. package/dist/QueryClient-DJOrJZRR.js.map +1 -0
  25. package/dist/{QueryClient-unspcsWa.js → QueryClient-PqOg8mcw.js} +7 -3
  26. package/dist/QueryClient-PqOg8mcw.js.map +1 -0
  27. package/dist/{Schema-CqqcEexA.js → Schema-B3YQHTtu.js} +38 -38
  28. package/dist/{Schema-CqqcEexA.js.map → Schema-B3YQHTtu.js.map} +1 -1
  29. package/dist/{SchemaValidationService-Cb-b4kpD.js → SchemaValidationService-C4DIwn8Z.js} +2 -2
  30. package/dist/{SchemaValidationService-Cb-b4kpD.js.map → SchemaValidationService-C4DIwn8Z.js.map} +1 -1
  31. package/dist/{backfillMetadataPropertyIds-CRyRez3h.js → backfillMetadataPropertyIds-CBlRaU_M.js} +2 -2
  32. package/dist/{backfillMetadataPropertyIds-CRyRez3h.js.map → backfillMetadataPropertyIds-CBlRaU_M.js.map} +1 -1
  33. package/dist/cjs/{ModelProperty-sNx_ZQZX.js → ModelProperty-tfM38NL4.js} +17 -17
  34. package/dist/cjs/{ModelProperty-sNx_ZQZX.js.map → ModelProperty-tfM38NL4.js.map} +1 -1
  35. package/dist/cjs/{Schema-B4RRA-0g.js → Schema-44NqLqMV.js} +20 -20
  36. package/dist/cjs/{Schema-B4RRA-0g.js.map → Schema-44NqLqMV.js.map} +1 -1
  37. package/dist/cjs/{SchemaValidationService-DCflhpcI.js → SchemaValidationService-Cq_YBzFN.js} +2 -2
  38. package/dist/cjs/{SchemaValidationService-DCflhpcI.js.map → SchemaValidationService-Cq_YBzFN.js.map} +1 -1
  39. package/dist/cjs/{backfillMetadataPropertyIds-DhAXAuSf.js → backfillMetadataPropertyIds-D1nLJAhB.js} +2 -2
  40. package/dist/cjs/{backfillMetadataPropertyIds-DhAXAuSf.js.map → backfillMetadataPropertyIds-D1nLJAhB.js.map} +1 -1
  41. package/dist/cjs/{getItem-lyM2x5pT.js → getItem-BRoq91YU.js} +2 -2
  42. package/dist/cjs/{getItem-lyM2x5pT.js.map → getItem-BRoq91YU.js.map} +1 -1
  43. package/dist/cjs/{getPublishPayload-DP2fm4q8.js → getPublishPayload-ddl-1x6R.js} +11 -11
  44. package/dist/cjs/{getPublishPayload-DP2fm4q8.js.map → getPublishPayload-ddl-1x6R.js.map} +1 -1
  45. package/dist/cjs/{getPublishUploads-DdVy-5fK.js → getPublishUploads-BljRx4o4.js} +39 -6
  46. package/dist/cjs/getPublishUploads-BljRx4o4.js.map +1 -0
  47. package/dist/cjs/{getSegmentedItemProperties-DtHofn5i.js → getSegmentedItemProperties-iK5kepzl.js} +3 -3
  48. package/dist/cjs/{getSegmentedItemProperties-DtHofn5i.js.map → getSegmentedItemProperties-iK5kepzl.js.map} +1 -1
  49. package/dist/cjs/{index-D1qR8xnb.js → index-C6rrqy3z.js} +1980 -1113
  50. package/dist/cjs/index-C6rrqy3z.js.map +1 -0
  51. package/dist/cjs/{index-DTkoTvcq.js → index-DqSDhOp3.js} +3 -3
  52. package/dist/cjs/index-DqSDhOp3.js.map +1 -0
  53. package/dist/cjs/{ownership-DanM_n8E.js → ownership-CXlKAj4o.js} +2 -2
  54. package/dist/cjs/{ownership-DanM_n8E.js.map → ownership-CXlKAj4o.js.map} +1 -1
  55. package/dist/cjs/{property-BQokoaRe.js → property-2D7P6a2q.js} +4 -4
  56. package/dist/cjs/{property-BQokoaRe.js.map → property-2D7P6a2q.js.map} +1 -1
  57. package/dist/cjs/syncDbWithEas-DcKL-_Pb.js +610 -0
  58. package/dist/cjs/syncDbWithEas-DcKL-_Pb.js.map +1 -0
  59. package/dist/db/drizzle/drizzle/0013_eas_sync_processes.sql +12 -0
  60. package/dist/db/drizzle/drizzle/meta/0013_snapshot.json +1262 -0
  61. package/dist/db/drizzle/drizzle/meta/_journal.json +7 -0
  62. package/dist/{getItem-VI3QqdZH.js → getItem-CV3yTCRt.js} +2 -2
  63. package/dist/{getItem-VI3QqdZH.js.map → getItem-CV3yTCRt.js.map} +1 -1
  64. package/dist/{getPublishPayload-DpYwi-rd.js → getPublishPayload-Ddc_LGPs.js} +14 -14
  65. package/dist/{getPublishPayload-DpYwi-rd.js.map → getPublishPayload-Ddc_LGPs.js.map} +1 -1
  66. package/dist/{getPublishUploads-DS2dQ4Ho.js → getPublishUploads-Cf2J-5FR.js} +39 -6
  67. package/dist/getPublishUploads-Cf2J-5FR.js.map +1 -0
  68. package/dist/{getSegmentedItemProperties-Bz5B4DSA.js → getSegmentedItemProperties-B2mzArFD.js} +3 -3
  69. package/dist/{getSegmentedItemProperties-Bz5B4DSA.js.map → getSegmentedItemProperties-B2mzArFD.js.map} +1 -1
  70. package/dist/{index-Cqf_DxkJ.js → index-3Ekqb4QB.js} +3 -3
  71. package/dist/index-3Ekqb4QB.js.map +1 -0
  72. package/dist/{index-DdzhrbkF.js → index-BRo7D3s1.js} +3 -2
  73. package/dist/index-BRo7D3s1.js.map +1 -0
  74. package/dist/{index-BrD_NNaX.js → index-DUMXLKJr.js} +1991 -1125
  75. package/dist/index-DUMXLKJr.js.map +1 -0
  76. package/dist/main.cjs +1 -1
  77. package/dist/main.js +16 -41
  78. package/dist/main.js.map +1 -1
  79. package/dist/node.js +10 -10
  80. package/dist/{ownership-BK6suksO.js → ownership-TR-mIjJh.js} +2 -2
  81. package/dist/{ownership-BK6suksO.js.map → ownership-TR-mIjJh.js.map} +1 -1
  82. package/dist/{property-C63Ddzap.js → property-BSNWvgei.js} +6 -6
  83. package/dist/{property-C63Ddzap.js.map → property-BSNWvgei.js.map} +1 -1
  84. package/dist/{queries-BGuWjEqt.js → queries-0FZBThGQ.js} +2 -2
  85. package/dist/{queries-BGuWjEqt.js.map → queries-0FZBThGQ.js.map} +1 -1
  86. package/dist/seedSchema/EasSyncProcessSchema.ts +17 -0
  87. package/dist/seedSchema/index.ts +1 -0
  88. package/dist/src/Item/Item.d.ts +18 -0
  89. package/dist/src/Item/Item.d.ts.map +1 -1
  90. package/dist/src/ItemProperty/ItemProperty.d.ts.map +1 -1
  91. package/dist/src/ItemProperty/service/actors/hydrateFromDb.d.ts.map +1 -1
  92. package/dist/src/ItemProperty/service/actors/loadOrCreateProperty.d.ts.map +1 -1
  93. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveImage.d.ts.map +1 -1
  94. package/dist/src/ItemProperty/service/propertyMachine.d.ts +4 -1
  95. package/dist/src/ItemProperty/service/propertyMachine.d.ts.map +1 -1
  96. package/dist/src/Model/service/modelMachine.d.ts +20 -20
  97. package/dist/src/ModelProperty/service/modelPropertyMachine.d.ts +2 -2
  98. package/dist/src/Schema/service/addModelsMachine.d.ts +1 -1
  99. package/dist/src/Schema/service/schemaMachine.d.ts +55 -55
  100. package/dist/src/browser/db/drizzleFiles.d.ts +3 -2
  101. package/dist/src/browser/db/drizzleFiles.d.ts.map +1 -1
  102. package/dist/src/browser/helpers/QueryClient.d.ts.map +1 -1
  103. package/dist/src/client/ClientManager.d.ts.map +1 -1
  104. package/dist/src/client/actors/addModelsToDb.d.ts.map +1 -1
  105. package/dist/src/client/actors/platformClassesInit.d.ts.map +1 -1
  106. package/dist/src/client/clientManagerMachine.d.ts.map +1 -1
  107. package/dist/src/client/constants.d.ts +1 -0
  108. package/dist/src/client/constants.d.ts.map +1 -1
  109. package/dist/src/db/read/getPublishPendingDiff.d.ts.map +1 -1
  110. package/dist/src/db/read/getPublishUploads.d.ts.map +1 -1
  111. package/dist/src/db/write/applyPropertyAttestationUidsFromPublish.d.ts.map +1 -1
  112. package/dist/src/db/write/easSyncProcess.d.ts +12 -0
  113. package/dist/src/db/write/easSyncProcess.d.ts.map +1 -0
  114. package/dist/src/db/write/updateItemPropertyValue.d.ts.map +1 -1
  115. package/dist/src/events/files/download.d.ts +5 -1
  116. package/dist/src/events/files/download.d.ts.map +1 -1
  117. package/dist/src/events/item/easSyncManager.d.ts +71 -0
  118. package/dist/src/events/item/easSyncManager.d.ts.map +1 -0
  119. package/dist/src/events/item/index.d.ts.map +1 -1
  120. package/dist/src/events/item/mergeEasSyncOptions.d.ts +7 -0
  121. package/dist/src/events/item/mergeEasSyncOptions.d.ts.map +1 -0
  122. package/dist/src/events/item/syncDbWithEas.d.ts +0 -3
  123. package/dist/src/events/item/syncDbWithEas.d.ts.map +1 -1
  124. package/dist/src/helpers/ArweaveClient/BaseArweaveClient.d.ts +17 -0
  125. package/dist/src/helpers/ArweaveClient/BaseArweaveClient.d.ts.map +1 -1
  126. package/dist/src/helpers/ArweaveClient/arweaveL1UploadApi.d.ts +6 -0
  127. package/dist/src/helpers/ArweaveClient/arweaveL1UploadApi.d.ts.map +1 -1
  128. package/dist/src/helpers/ArweaveClient/selectReadGateway.d.ts +16 -0
  129. package/dist/src/helpers/ArweaveClient/selectReadGateway.d.ts.map +1 -0
  130. package/dist/src/helpers/FileManager/BaseFileManager.d.ts +1 -0
  131. package/dist/src/helpers/FileManager/BaseFileManager.d.ts.map +1 -1
  132. package/dist/src/helpers/compareMetadataRowsLatestFirst.d.ts +16 -0
  133. package/dist/src/helpers/compareMetadataRowsLatestFirst.d.ts.map +1 -0
  134. package/dist/src/helpers/constants.d.ts +20 -5
  135. package/dist/src/helpers/constants.d.ts.map +1 -1
  136. package/dist/src/helpers/environment.d.ts +5 -0
  137. package/dist/src/helpers/environment.d.ts.map +1 -1
  138. package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts.map +1 -1
  139. package/dist/src/helpers/index.d.ts +1 -0
  140. package/dist/src/helpers/index.d.ts.map +1 -1
  141. package/dist/src/helpers/readHtmlBodyForStorageSeed.d.ts +8 -0
  142. package/dist/src/helpers/readHtmlBodyForStorageSeed.d.ts.map +1 -0
  143. package/dist/src/index.d.ts +7 -3
  144. package/dist/src/index.d.ts.map +1 -1
  145. package/dist/src/interfaces/IQueryClient.d.ts +4 -0
  146. package/dist/src/interfaces/IQueryClient.d.ts.map +1 -1
  147. package/dist/src/node/helpers/QueryClient.d.ts.map +1 -1
  148. package/dist/src/seedSchema/EasSyncProcessSchema.d.ts +190 -0
  149. package/dist/src/seedSchema/EasSyncProcessSchema.d.ts.map +1 -0
  150. package/dist/src/seedSchema/index.d.ts +1 -0
  151. package/dist/src/seedSchema/index.d.ts.map +1 -1
  152. package/dist/src/services/write/writeProcessMachine.d.ts +1 -1
  153. package/dist/src/types/fileManager.d.ts +5 -0
  154. package/dist/src/types/fileManager.d.ts.map +1 -1
  155. package/dist/src/types/index.d.ts +3 -2
  156. package/dist/src/types/index.d.ts.map +1 -1
  157. package/dist/src/types/machines.d.ts +1 -1
  158. package/dist/src/types/machines.d.ts.map +1 -1
  159. package/dist/syncDbWithEas-CaytdS8D.js +583 -0
  160. package/dist/syncDbWithEas-CaytdS8D.js.map +1 -0
  161. package/dist/updateSeedRevokedAt-CfUXirik.js +22 -0
  162. package/dist/updateSeedRevokedAt-CfUXirik.js.map +1 -0
  163. package/package.json +1 -1
  164. package/dist/Db-CXwQVLZv.js.map +0 -1
  165. package/dist/FileManager-DHnyb040.js.map +0 -1
  166. package/dist/QueryClient-OUjfvY3g.js.map +0 -1
  167. package/dist/QueryClient-unspcsWa.js.map +0 -1
  168. package/dist/cjs/getPublishUploads-DdVy-5fK.js.map +0 -1
  169. package/dist/cjs/index-D1qR8xnb.js.map +0 -1
  170. package/dist/cjs/index-DTkoTvcq.js.map +0 -1
  171. package/dist/getPublishUploads-DS2dQ4Ho.js.map +0 -1
  172. package/dist/index-BrD_NNaX.js.map +0 -1
  173. package/dist/index-Cqf_DxkJ.js.map +0 -1
  174. package/dist/index-DdzhrbkF.js.map +0 -1
@@ -0,0 +1,610 @@
1
+ 'use strict';
2
+
3
+ var lodashEs = require('lodash-es');
4
+ var main_cjs = require('./index-C6rrqy3z.js');
5
+ var drizzleOrm = require('drizzle-orm');
6
+ var pluralize = require('pluralize');
7
+ require('immer');
8
+ require('reflect-metadata');
9
+ require('xstate');
10
+ require('drizzle-orm/sqlite-core');
11
+ require('nanoid');
12
+ require('nanoid-dictionary');
13
+ require('debug');
14
+ require('ethers');
15
+ require('@sinclair/typebox');
16
+ require('drizzle-orm/casing');
17
+ require('rxjs');
18
+ require('eventemitter3');
19
+ require('arweave');
20
+ require('js-sha3');
21
+ require('fs/promises');
22
+ require('fs');
23
+ require('path');
24
+ require('@libsql/client');
25
+ require('drizzle-orm/libsql');
26
+ require('drizzle-kit/api');
27
+ require('js-yaml');
28
+ require('ts-import');
29
+ require('glob');
30
+ require('rimraf');
31
+ require('child_process');
32
+ require('url');
33
+ require('graphql-request');
34
+
35
+ // Dynamic import to break circular dependency: Model -> BaseItem -> ... -> getModelSchemas -> Model
36
+ // import { Model } from '@/Model/Model'
37
+ const schemaStringToModelRecord = new Map();
38
+ const getModelSchemas = async () => {
39
+ // Dynamic import to break circular dependency
40
+ const modelMod = await Promise.resolve().then(function () { return require('./index-C6rrqy3z.js'); }).then(function (n) { return n.Model$1; });
41
+ const { Model } = modelMod;
42
+ const allModels = await Model.all();
43
+ const modelRecords = [];
44
+ const appDb = main_cjs.BaseDb.getAppDb();
45
+ for (const model of allModels) {
46
+ const modelName = model.modelName;
47
+ if (!modelName)
48
+ continue;
49
+ const foundModelQuery = await appDb
50
+ .select({
51
+ id: main_cjs.models.id,
52
+ name: main_cjs.models.name,
53
+ uid: main_cjs.modelUids.uid,
54
+ })
55
+ .from(main_cjs.models)
56
+ .leftJoin(main_cjs.modelUids, drizzleOrm.eq(main_cjs.models.id, main_cjs.modelUids.modelId))
57
+ .where(drizzleOrm.eq(main_cjs.models.name, modelName))
58
+ .limit(1);
59
+ if (!foundModelQuery[0]) {
60
+ console.error(`[item/events] [syncDbWithEas] model ${modelName} not found in SDK DB`);
61
+ continue;
62
+ }
63
+ const foundModel = {
64
+ id: foundModelQuery[0].id,
65
+ name: foundModelQuery[0].name,
66
+ uid: foundModelQuery[0].uid,
67
+ tableName: pluralize(foundModelQuery[0].name).toLowerCase(),
68
+ };
69
+ modelRecords.push(foundModel);
70
+ if (modelName === 'Seed') {
71
+ continue;
72
+ }
73
+ const schemaString = `bytes32 ${main_cjs.toSnakeCase(modelName)}`;
74
+ schemaStringToModelRecord.set(schemaString, foundModel);
75
+ }
76
+ return {
77
+ schemaStringToModelRecord,
78
+ modelRecords,
79
+ };
80
+ };
81
+
82
+ const createSeeds = async (newSeeds) => {
83
+ const appDb = main_cjs.BaseDb.getAppDb();
84
+ const results = await appDb
85
+ .insert(main_cjs.seeds)
86
+ .values(newSeeds)
87
+ .returning({ uid: main_cjs.seeds.uid });
88
+ const newUids = results.reduce((acc, result) => {
89
+ if (result.uid) {
90
+ acc.push(result.uid);
91
+ }
92
+ return acc;
93
+ }, []);
94
+ return newUids;
95
+ };
96
+
97
+ /**
98
+ * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.
99
+ */
100
+ const updateSeedRevokedAt = async ({ seedLocalId, revokedAt, }) => {
101
+ if (!seedLocalId) {
102
+ return;
103
+ }
104
+ const appDb = main_cjs.BaseDb.getAppDb();
105
+ await appDb
106
+ .update(main_cjs.seeds)
107
+ .set({
108
+ revokedAt,
109
+ updatedAt: Date.now(),
110
+ })
111
+ .where(drizzleOrm.eq(main_cjs.seeds.localId, seedLocalId));
112
+ };
113
+
114
+ const relationValuesToExclude = [
115
+ '0x0000000000000000000000000000000000000000000000000000000000000020',
116
+ ];
117
+ const seedUidToLocalId = new Map();
118
+ const seedUidToModelType = new Map();
119
+ const relatedSeedUids = new Set();
120
+ const versionUidToLocalId = new Map();
121
+ const versionUidToSeedUid = new Map();
122
+ const propertyUidToLocalId = new Map();
123
+ const saveEasSeedsToDb = async ({ itemSeeds }) => {
124
+ const appDb = main_cjs.BaseDb.getAppDb();
125
+ const seedUids = itemSeeds.map((seed) => seed.id);
126
+ const existingSeedRecordsRows = await appDb
127
+ .select()
128
+ .from(main_cjs.seeds)
129
+ .where(drizzleOrm.inArray(main_cjs.seeds.uid, seedUids));
130
+ const existingSeedUids = new Set();
131
+ if (existingSeedRecordsRows && existingSeedRecordsRows.length > 0) {
132
+ for (const row of existingSeedRecordsRows) {
133
+ if (row.uid) {
134
+ existingSeedUids.add(row.uid);
135
+ if (row.localId) {
136
+ seedUidToLocalId.set(row.uid, row.localId);
137
+ }
138
+ if (row.type) {
139
+ seedUidToModelType.set(row.uid, row.type);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ const newSeeds = itemSeeds.filter((seed) => !existingSeedUids.has(seed.id));
145
+ // Update existing seeds when attestations are revoked on EAS
146
+ const seedByUid = new Map(itemSeeds.map((s) => [s.id, s]));
147
+ for (const row of existingSeedRecordsRows) {
148
+ if (!row.uid || !row.localId)
149
+ continue;
150
+ const attestation = seedByUid.get(row.uid);
151
+ if (!attestation?.revoked)
152
+ continue;
153
+ if (row.revokedAt != null)
154
+ continue;
155
+ const revokedAt = attestation.revocationTime > 0
156
+ ? attestation.revocationTime
157
+ : Math.floor(Date.now() / 1000);
158
+ await updateSeedRevokedAt({ seedLocalId: row.localId, revokedAt });
159
+ }
160
+ if (newSeeds.length === 0) {
161
+ return { seedUidToLocalId, seedUids };
162
+ }
163
+ const newSeedsData = [];
164
+ for (let i = 0; i < newSeeds.length; i++) {
165
+ const seed = newSeeds[i];
166
+ seedUidToModelType.set(seed.id, seed.schema.schemaNames[0].name);
167
+ const seedLocalId = main_cjs.generateId();
168
+ seedUidToLocalId.set(seed.id, seedLocalId);
169
+ const attestationRaw = main_cjs.escapeSqliteString(JSON.stringify(seed));
170
+ const revokedAt = seed.revoked && seed.revocationTime != null && seed.revocationTime > 0
171
+ ? seed.revocationTime
172
+ : seed.revoked
173
+ ? Math.floor(Date.now() / 1000)
174
+ : undefined;
175
+ newSeedsData.push({
176
+ localId: seedLocalId,
177
+ uid: seed.id,
178
+ schemaUid: seed.schemaId,
179
+ type: seed.schema.schemaNames[0].name,
180
+ publisher: seed.attester,
181
+ createdAt: Date.now(),
182
+ attestationCreatedAt: seed.timeCreated * 1000,
183
+ attestationRaw,
184
+ ...(revokedAt !== undefined && { revokedAt }),
185
+ });
186
+ seedUidToLocalId.set(seed.id, seedLocalId);
187
+ }
188
+ const newSeedUids = await createSeeds(newSeedsData);
189
+ return { seedUids: newSeedUids };
190
+ };
191
+ const saveEasVersionsToDb = async ({ itemVersions }) => {
192
+ const versionUids = itemVersions.map((version) => version.id);
193
+ const appDb = main_cjs.BaseDb.getAppDb();
194
+ const existingVersionRecordsRows = await appDb
195
+ .select()
196
+ .from(main_cjs.versions)
197
+ .where(drizzleOrm.inArray(main_cjs.versions.uid, versionUids));
198
+ const existingVersionUids = new Set();
199
+ if (existingVersionRecordsRows && existingVersionRecordsRows.length > 0) {
200
+ for (const row of existingVersionRecordsRows) {
201
+ if (row.uid) {
202
+ existingVersionUids.add(row.uid);
203
+ if (row.localId) {
204
+ versionUidToLocalId.set(row.uid, row.localId);
205
+ }
206
+ if (row.seedUid) {
207
+ versionUidToSeedUid.set(row.uid, row.seedUid);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ const newVersions = itemVersions.filter((version) => !existingVersionUids.has(version.id));
213
+ if (newVersions.length === 0) {
214
+ return { versionUidToLocalId, versionUids };
215
+ }
216
+ let insertVersionsQuery = `INSERT INTO versions (local_id, uid, seed_uid, seed_local_id, seed_type, created_at,
217
+ attestation_created_at,
218
+ attestation_raw, publisher)
219
+ VALUES `;
220
+ for (let i = 0; i < newVersions.length; i++) {
221
+ const version = newVersions[i];
222
+ versionUidToSeedUid.set(version.id, version.refUID);
223
+ const versionLocalId = main_cjs.generateId();
224
+ versionUidToLocalId.set(version.id, versionLocalId);
225
+ const seedUid = versionUidToSeedUid.get(version.id);
226
+ const seedLocalId = seedUidToLocalId.get(seedUid);
227
+ const seedType = seedUidToModelType.get(seedUid);
228
+ const attestationRaw = main_cjs.escapeSqliteString(JSON.stringify(version));
229
+ const publisher = main_cjs.escapeSqliteString(version.attester ?? '');
230
+ const valuesString = `('${versionLocalId}', '${version.id}', '${seedUid}', '${seedLocalId}', '${seedType}', ${Date.now()}, ${version.timeCreated * 1000}, '${attestationRaw}', '${publisher}')`;
231
+ if (i < newVersions.length - 1) {
232
+ insertVersionsQuery += valuesString + ', ';
233
+ }
234
+ if (i === newVersions.length - 1) {
235
+ insertVersionsQuery += valuesString + ';';
236
+ }
237
+ versionUidToLocalId.set(version.id, versionLocalId);
238
+ }
239
+ await appDb.run(drizzleOrm.sql.raw(insertVersionsQuery));
240
+ return { versionUids };
241
+ };
242
+ const createMetadataRecordsForStorageTransactionId = async (storageTransactionIdProperty, modelSchema) => {
243
+ // Early return if modelSchema is not provided
244
+ if (!modelSchema) {
245
+ console.warn('[item/events] [syncDbWithEas] modelSchema is undefined for storageTransactionIdProperty: ', storageTransactionIdProperty.id);
246
+ return;
247
+ }
248
+ // Validate and parse decodedDataJson
249
+ if (!storageTransactionIdProperty.decodedDataJson || storageTransactionIdProperty.decodedDataJson.trim() === '') {
250
+ console.warn('[item/events] [syncDbWithEas] empty decodedDataJson for storageTransactionIdProperty: ', storageTransactionIdProperty.id);
251
+ return;
252
+ }
253
+ let parsedData;
254
+ try {
255
+ parsedData = JSON.parse(storageTransactionIdProperty.decodedDataJson);
256
+ }
257
+ catch (error) {
258
+ console.warn('[item/events] [syncDbWithEas] failed to parse decodedDataJson for storageTransactionIdProperty: ', storageTransactionIdProperty.id, error);
259
+ return;
260
+ }
261
+ if (!Array.isArray(parsedData) || parsedData.length === 0 || !parsedData[0]?.value) {
262
+ console.warn('[item/events] [syncDbWithEas] invalid decodedDataJson structure for storageTransactionIdProperty: ', storageTransactionIdProperty.id);
263
+ return;
264
+ }
265
+ const attestationData = parsedData[0].value;
266
+ lodashEs.camelCase(attestationData.name);
267
+ const propertyValue = attestationData.value;
268
+ const itemStorageProperties = new Map();
269
+ for (const [_propertyName, propertyDef] of Object.entries(modelSchema)) {
270
+ if (propertyDef?.storageType && propertyDef.storageType === 'ItemStorage') {
271
+ itemStorageProperties.set(_propertyName, propertyDef);
272
+ }
273
+ }
274
+ if (itemStorageProperties.size === 0) {
275
+ return;
276
+ }
277
+ const appDb = main_cjs.BaseDb.getAppDb();
278
+ for (const [_propertyName, propertyDef] of itemStorageProperties.entries()) {
279
+ const existingMetadataRecordRows = await appDb
280
+ .select()
281
+ .from(main_cjs.metadata)
282
+ .where(drizzleOrm.and(drizzleOrm.eq(main_cjs.metadata.propertyName, _propertyName), drizzleOrm.eq(main_cjs.metadata.propertyValue, propertyValue), drizzleOrm.eq(main_cjs.metadata.versionUid, storageTransactionIdProperty.refUID)));
283
+ if (existingMetadataRecordRows && existingMetadataRecordRows.length > 0) {
284
+ continue;
285
+ }
286
+ const seedUid = versionUidToSeedUid.get(storageTransactionIdProperty.refUID);
287
+ const seedLocalId = seedUidToLocalId.get(seedUid);
288
+ const versionUid = storageTransactionIdProperty.refUID;
289
+ const versionLocalId = versionUidToLocalId.get(versionUid);
290
+ const modelType = seedUidToModelType.get(seedUid);
291
+ const propertyId = modelType != null
292
+ ? await main_cjs.getPropertyIdForModelAndName(modelType, _propertyName)
293
+ : null;
294
+ const propertyLocalId = main_cjs.generateId();
295
+ await appDb.insert(main_cjs.metadata).values({
296
+ localId: propertyLocalId,
297
+ propertyId: propertyId ?? undefined,
298
+ propertyName: _propertyName,
299
+ propertyValue,
300
+ localStorageDir: propertyDef.localStorageDir,
301
+ seedLocalId,
302
+ seedUid,
303
+ versionLocalId,
304
+ versionUid,
305
+ refValueType: 'file',
306
+ refResolvedValue: `${propertyValue}${propertyDef.filenameSuffix}`,
307
+ modelType: seedUidToModelType.get(seedUid),
308
+ createdAt: Date.now(),
309
+ updatedAt: Date.now(),
310
+ });
311
+ }
312
+ };
313
+ /** Serialize property saves: concurrent `runSyncFromEas` used to hit `isSavingToDb` and return `{}` with no insert. */
314
+ let saveEasPropertiesDbChain = Promise.resolve();
315
+ const saveEasPropertiesToDbBody = async ({ itemProperties, itemSeeds, }) => {
316
+ const propertyUids = itemProperties.map((property) => property.id);
317
+ // Dynamic import to break circular dependency
318
+ const modelMod = await Promise.resolve().then(function () { return require('./index-C6rrqy3z.js'); }).then(function (n) { return n.Model$1; });
319
+ const { Model } = modelMod;
320
+ const allModels = await Model.all();
321
+ const models = Object.fromEntries(allModels.map(m => [m.modelName, m]));
322
+ const appDb = main_cjs.BaseDb.getAppDb();
323
+ const existingMetadataRecordsRows = await appDb
324
+ .select()
325
+ .from(main_cjs.metadata)
326
+ .where(drizzleOrm.inArray(main_cjs.metadata.uid, propertyUids));
327
+ const existingPropertyRecordsUids = new Set();
328
+ if (existingMetadataRecordsRows && existingMetadataRecordsRows.length > 0) {
329
+ for (const row of existingMetadataRecordsRows) {
330
+ if (row.uid) {
331
+ existingPropertyRecordsUids.add(row.uid);
332
+ if (row.localId) {
333
+ propertyUidToLocalId.set(row.uid, row.localId);
334
+ }
335
+ }
336
+ }
337
+ }
338
+ const newProperties = itemProperties.filter((property) => !existingPropertyRecordsUids.has(property.id));
339
+ if (newProperties.length === 0) {
340
+ return { propertyUidToLocalId, propertyUids };
341
+ }
342
+ let insertPropertiesQuery = `INSERT INTO metadata (local_id, uid, schema_uid, property_id, property_name, property_value,
343
+ eas_data_type, version_uid, version_local_id, seed_uid,
344
+ seed_local_id, model_type, ref_value_type, ref_seed_type,
345
+ ref_schema_uid,
346
+ created_at, attestation_created_at, attestation_raw,
347
+ local_storage_dir, ref_resolved_value, publisher)
348
+ VALUES `;
349
+ for (let i = 0; i < newProperties.length; i++) {
350
+ const property = newProperties[i];
351
+ const propertyLocalId = main_cjs.generateId();
352
+ // Validate and parse decodedDataJson
353
+ if (!property.decodedDataJson || property.decodedDataJson.trim() === '') {
354
+ console.warn('[item/events] [syncDbWithEas] empty decodedDataJson for property: ', property.id);
355
+ continue;
356
+ }
357
+ let parsedData;
358
+ try {
359
+ parsedData = JSON.parse(property.decodedDataJson);
360
+ }
361
+ catch (error) {
362
+ console.warn('[item/events] [syncDbWithEas] failed to parse decodedDataJson for property: ', property.id, error);
363
+ continue;
364
+ }
365
+ if (!Array.isArray(parsedData) || parsedData.length === 0 || !parsedData[0]?.value) {
366
+ console.warn('[item/events] [syncDbWithEas] invalid decodedDataJson structure for property: ', property.id);
367
+ continue;
368
+ }
369
+ const metadata = parsedData[0].value;
370
+ let propertyNameSnake = metadata.name;
371
+ if (!propertyNameSnake) {
372
+ console.warn('[item/events] [syncDbWithEas] no propertyName found for property: ', property);
373
+ continue;
374
+ }
375
+ let isRelation = false;
376
+ let refValueType;
377
+ let refSeedType;
378
+ let refSchemaUid;
379
+ let isList = false;
380
+ const schemaUid = property.schemaId;
381
+ main_cjs.setSchemaUidForSchemaDefinition({
382
+ text: propertyNameSnake,
383
+ schemaUid,
384
+ });
385
+ if ((propertyNameSnake.endsWith('_id') ||
386
+ propertyNameSnake.endsWith('_ids')) &&
387
+ propertyNameSnake !== 'storage_transaction_id' &&
388
+ propertyNameSnake !== 'storage_provider_transaction_id') {
389
+ isRelation = true;
390
+ if (Array.isArray(metadata.value)) {
391
+ isList = true;
392
+ refValueType = 'list';
393
+ const result = main_cjs.parseEasRelationPropertyName(propertyNameSnake);
394
+ if (result) {
395
+ propertyNameSnake = result.propertyName;
396
+ refSeedType = result.modelName;
397
+ }
398
+ metadata.value.forEach((value) => {
399
+ relatedSeedUids.add(value);
400
+ });
401
+ }
402
+ if (!isList) {
403
+ if (relationValuesToExclude.includes(metadata.value)) {
404
+ continue;
405
+ }
406
+ relatedSeedUids.add(metadata.value);
407
+ }
408
+ }
409
+ let propertyValue = metadata.value;
410
+ if (typeof propertyValue !== 'string') {
411
+ propertyValue = JSON.stringify(propertyValue);
412
+ }
413
+ if (isRelation && !isList) {
414
+ const relatedSeed = itemSeeds.find((seed) => seed.id === metadata.value);
415
+ if (relatedSeed && relatedSeed.schema && relatedSeed.schema.schemaNames) {
416
+ refSeedType = relatedSeed.schema.schemaNames[0].name;
417
+ refSchemaUid = relatedSeed.schemaId;
418
+ }
419
+ }
420
+ if (isRelation && isList) {
421
+ const relatedSeeds = itemSeeds.filter((seed) => metadata.value.includes(seed.id));
422
+ if (relatedSeeds && relatedSeeds.length > 0) {
423
+ refSeedType = relatedSeeds[0].schema.schemaNames[0].name;
424
+ refSchemaUid = relatedSeeds[0].schemaId;
425
+ }
426
+ }
427
+ const propertyName = lodashEs.camelCase(propertyNameSnake);
428
+ propertyValue = main_cjs.escapeSqliteString(propertyValue);
429
+ const easDataType = metadata.type;
430
+ const versionUid = property.refUID;
431
+ const versionLocalId = versionUidToLocalId.get(versionUid);
432
+ const attestationCreatedAt = property.timeCreated * 1000;
433
+ const attestationRaw = main_cjs.escapeSqliteString(JSON.stringify(property));
434
+ const seedUid = versionUidToSeedUid.get(versionUid);
435
+ const seedLocalId = seedUidToLocalId.get(seedUid);
436
+ const modelType = seedUidToModelType.get(seedUid);
437
+ const modelName = lodashEs.startCase(modelType);
438
+ const model = models[modelName];
439
+ const modelSchema = model?.properties ? main_cjs.modelPropertiesToObject(model.properties) : undefined;
440
+ if (propertyNameSnake === 'storage_transaction_id') {
441
+ await createMetadataRecordsForStorageTransactionId(property, modelSchema);
442
+ }
443
+ const propertyId = modelType != null
444
+ ? await main_cjs.getPropertyIdForModelAndName(modelType, propertyName)
445
+ : null;
446
+ const propertyIdSql = propertyId != null ? String(propertyId) : 'NULL';
447
+ const publisher = main_cjs.escapeSqliteString(property.attester ?? '');
448
+ const valuesString = `('${propertyLocalId}', '${property.id}',
449
+ '${property.schemaId}', ${propertyIdSql}, '${propertyName}',
450
+ '${propertyValue}', '${easDataType}', '${versionUid}',
451
+ '${versionLocalId}', '${seedUid}', '${seedLocalId}',
452
+ '${modelType}', ${refValueType ? `'${refValueType}'` : 'NULL'},
453
+ ${refSeedType ? `'${refSeedType}'` : 'NULL'},
454
+ ${refSchemaUid ? `'${refSchemaUid}'` : 'NULL'},
455
+ ${Date.now()}, ${attestationCreatedAt}, '${attestationRaw}',
456
+ ${'NULL'},
457
+ ${'NULL'},
458
+ '${publisher}')`;
459
+ if (i < newProperties.length - 1) {
460
+ insertPropertiesQuery += valuesString + ', ';
461
+ }
462
+ if (i === newProperties.length - 1) {
463
+ insertPropertiesQuery += valuesString + ';';
464
+ }
465
+ propertyUidToLocalId.set(property.id, propertyLocalId);
466
+ }
467
+ if (insertPropertiesQuery.endsWith('VALUES ')) {
468
+ return { propertyUids };
469
+ }
470
+ if (insertPropertiesQuery.endsWith(', ')) {
471
+ insertPropertiesQuery = insertPropertiesQuery.slice(0, -2) + ';';
472
+ }
473
+ await appDb.run(drizzleOrm.sql.raw(insertPropertiesQuery));
474
+ return { propertyUids };
475
+ };
476
+ const saveEasPropertiesToDb = (params) => {
477
+ const next = saveEasPropertiesDbChain.then(() => saveEasPropertiesToDbBody(params));
478
+ saveEasPropertiesDbChain = next.then(() => undefined, () => undefined);
479
+ return next;
480
+ };
481
+ const getRelatedSeedsAndVersions = async () => {
482
+ main_cjs.BaseQueryClient.getQueryClient();
483
+ const easClient = main_cjs.BaseEasClient.getEasClient();
484
+ const { itemSeeds } = await easClient.request(main_cjs.GET_SEEDS, {
485
+ where: {
486
+ id: {
487
+ in: Array.from(relatedSeedUids),
488
+ },
489
+ },
490
+ });
491
+ await saveEasSeedsToDb({ itemSeeds });
492
+ const { itemVersions } = await easClient.request(main_cjs.GET_VERSIONS, {
493
+ where: {
494
+ refUID: {
495
+ in: Array.from(relatedSeedUids),
496
+ },
497
+ },
498
+ });
499
+ await saveEasVersionsToDb({ itemVersions });
500
+ const relatedVersionUids = itemVersions.map((v) => v.id);
501
+ const { itemProperties } = await easClient.request(main_cjs.GET_PROPERTIES, {
502
+ where: {
503
+ refUID: {
504
+ in: relatedVersionUids,
505
+ },
506
+ },
507
+ });
508
+ await saveEasPropertiesToDb({
509
+ itemProperties,
510
+ itemSeeds,
511
+ });
512
+ };
513
+ /**
514
+ * Core sync logic: fetches item attestations from EAS for configured models and given addresses,
515
+ * then saves seeds, versions, and properties to the local DB.
516
+ * Uses owned + watched addresses from DB when addresses are not provided.
517
+ */
518
+ const runSyncFromEas = async (options) => {
519
+ let addresses = options?.addresses ?? (await main_cjs.getAllAddressesFromDb());
520
+ const additionalGetter = main_cjs.getGetAdditionalSyncAddresses();
521
+ if (additionalGetter) {
522
+ const additional = await additionalGetter();
523
+ if (additional?.length) {
524
+ const seen = new Set(addresses.map((a) => a.toLowerCase()));
525
+ for (const addr of additional) {
526
+ if (addr && !seen.has(addr.toLowerCase())) {
527
+ seen.add(addr.toLowerCase());
528
+ addresses = [...addresses, addr];
529
+ }
530
+ }
531
+ }
532
+ }
533
+ if (!addresses || addresses.length === 0) {
534
+ return;
535
+ }
536
+ const appDb = main_cjs.BaseDb.getAppDb();
537
+ const { schemaStringToModelRecord } = await getModelSchemas();
538
+ const modelSchemas = await main_cjs.getModelSchemasFromEas();
539
+ const schemaUids = [];
540
+ for (const modelSchema of modelSchemas) {
541
+ const foundModel = schemaStringToModelRecord.get(modelSchema.schema);
542
+ if (!foundModel) {
543
+ // Skip schemas that don't have a corresponding model in the user's config
544
+ // This can happen with "bytes32 image" if there's no Image model defined
545
+ console.warn(`[item/events] [syncDbWithEas] Model not found for schema ${modelSchema.schema}, skipping`);
546
+ continue;
547
+ }
548
+ try {
549
+ await appDb
550
+ .insert(main_cjs.modelUids)
551
+ .values({
552
+ modelId: foundModel.id,
553
+ uid: modelSchema.id,
554
+ })
555
+ .onConflictDoNothing();
556
+ }
557
+ catch (err) {
558
+ // Model may have been deleted by test teardown or another process; skip to avoid unhandled rejection
559
+ const e = err;
560
+ const code = e?.code ?? e?.rawCode ?? e?.cause?.code ?? e?.cause?.rawCode;
561
+ if (code === 'SQLITE_CONSTRAINT_FOREIGNKEY' || code === 787) {
562
+ continue;
563
+ }
564
+ throw err;
565
+ }
566
+ schemaUids.push(modelSchema.id);
567
+ }
568
+ // If no schemas were found, skip the rest of the sync process
569
+ // This can happen when models exist but don't have schemas registered in EAS yet
570
+ if (schemaUids.length === 0) {
571
+ return;
572
+ }
573
+ const itemSeeds = await main_cjs.getSeedsFromSchemaUids({
574
+ schemaUids,
575
+ addresses,
576
+ excludeRevoked: false,
577
+ });
578
+ const { seedUids } = await saveEasSeedsToDb({
579
+ itemSeeds,
580
+ });
581
+ const itemVersions = await main_cjs.getItemVersionsFromEas({
582
+ seedUids,
583
+ excludeRevoked: false,
584
+ });
585
+ const { versionUids } = await saveEasVersionsToDb({
586
+ itemVersions,
587
+ });
588
+ const rawProperties = await main_cjs.getItemPropertiesFromEas({
589
+ versionUids,
590
+ excludeRevoked: false,
591
+ });
592
+ const itemProperties = main_cjs.pickLatestPropertyAttestationsByRefAndSchema(rawProperties);
593
+ await saveEasPropertiesToDb({
594
+ itemProperties,
595
+ itemSeeds,
596
+ });
597
+ await getRelatedSeedsAndVersions();
598
+ main_cjs.scheduleBulkFilesDownloadFromEasSync(addresses);
599
+ try {
600
+ const itemMod = await Promise.resolve().then(function () { return require('./index-C6rrqy3z.js'); }).then(function (n) { return n.Item$1; });
601
+ await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync();
602
+ }
603
+ catch (err) {
604
+ console.warn('[item/events] [syncDbWithEas] rehydrateCachedItemsFromDbAfterEasSync:', err);
605
+ }
606
+ main_cjs.eventEmitter.emit(main_cjs.EAS_SEED_DATA_SYNCED_TO_DB_EVENT);
607
+ };
608
+
609
+ exports.runSyncFromEas = runSyncFromEas;
610
+ //# sourceMappingURL=syncDbWithEas-DcKL-_Pb.js.map