@0xobelisk/sui-cli 1.1.13 → 1.2.0-pre.1

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.
@@ -1,264 +0,0 @@
1
- import { DubheCliError } from './errors';
2
- import { delay, getSchemaId } from './utils';
3
- import { DubheConfig } from '@0xobelisk/sui-common';
4
- import { getFullnodeUrl, SuiClient, SuiTransactionBlockResponse } from '@mysten/sui/client';
5
- import sqlite3 from 'sqlite3';
6
- import { Database, open } from 'sqlite';
7
- import chalk from 'chalk';
8
-
9
- let sqliteDB: Database;
10
-
11
- const createDB = async (name: string) => {
12
- sqliteDB = await open({
13
- filename: `./${name}.db`,
14
- driver: sqlite3.Database
15
- });
16
- await createTable(sqliteDB, name);
17
- await createTxsTable(sqliteDB);
18
- return sqliteDB;
19
- };
20
- const createTable = async (sqliteDB: Database, name: string) => {
21
- let sql = `
22
- CREATE TABLE IF NOT EXISTS ${name} (
23
- id INTEGER PRIMARY KEY AUTOINCREMENT,
24
- last_update_checkpoint TEXT,
25
- last_update_digest TEXT,
26
- name TEXT,
27
- key1 TEXT,
28
- key2 TEXT,
29
- value TEXT,
30
- is_removed BOOLEAN DEFAULT FALSE
31
- )`;
32
- await sqliteDB.exec(sql);
33
- };
34
-
35
- const createTxsTable = async (sqliteDB: Database) => {
36
- let sql = `
37
- CREATE TABLE IF NOT EXISTS dapp_transaction (
38
- id INTEGER PRIMARY KEY AUTOINCREMENT,
39
- checkpoint TEXT,
40
- digest TEXT
41
- )
42
- `;
43
- await sqliteDB.exec(sql);
44
- };
45
-
46
- type SetRecord = {
47
- name: string;
48
- key1: string | object;
49
- key2: string | object;
50
- value: string | object;
51
- };
52
-
53
- type RemoveRecord = {
54
- name: string;
55
- key1: string | object;
56
- key2: string | object;
57
- };
58
-
59
- const processSetRecord = async (
60
- sqliteDB: Database,
61
- dbName: string,
62
- checkpoint: string,
63
- digest: string,
64
- event: unknown
65
- ) => {
66
- let res = event as SetRecord;
67
- if ((typeof res.key1 === 'object' && res.key1 !== null) || Array.isArray(res.key1)) {
68
- res.key1 = serializeData(res.key1);
69
- } else if ((typeof res.key2 === 'object' && res.key2 !== null) || Array.isArray(res.key2)) {
70
- res.key2 = serializeData(res.key2);
71
- } else if (typeof res.value === 'object' || Array.isArray(res.value)) {
72
- res.value = serializeData(res.value);
73
- }
74
- await insertData(sqliteDB, dbName, {
75
- checkpoint: checkpoint,
76
- digest: digest,
77
- event: res
78
- });
79
- };
80
-
81
- const processRemoveRecord = async (
82
- sqliteDB: Database,
83
- dbName: string,
84
- checkpoint: string,
85
- digest: string,
86
- event: unknown
87
- ) => {
88
- let res = event as RemoveRecord;
89
- if ((typeof res.key1 === 'object' && res.key1 !== null) || Array.isArray(res.key1)) {
90
- res.key1 = serializeData(res.key1);
91
- } else if ((typeof res.key2 === 'object' && res.key2 !== null) || Array.isArray(res.key2)) {
92
- res.key2 = serializeData(res.key2);
93
- }
94
- await removeData(sqliteDB, dbName, {
95
- checkpoint: checkpoint,
96
- digest: digest,
97
- event: res
98
- });
99
- };
100
-
101
- type SetData = {
102
- checkpoint: string;
103
- digest: string;
104
- event: SetRecord;
105
- };
106
-
107
- type RemoveData = {
108
- checkpoint: string;
109
- digest: string;
110
- event: RemoveRecord;
111
- };
112
-
113
- const serializeData = (data: object): string => {
114
- if (data.hasOwnProperty('fields')) {
115
- // @ts-ignore
116
- return JSON.stringify(data['fields']);
117
- }
118
- return JSON.stringify(data);
119
- };
120
-
121
- async function insertData(sqliteDB: Database, dbName: string, data: SetData) {
122
- const { checkpoint, digest, event } = data;
123
-
124
- let sql = `
125
- INSERT OR REPLACE INTO ${dbName} (id, last_update_checkpoint, last_update_digest, name, key1, key2, value)
126
- VALUES (
127
- (SELECT id FROM ${dbName} WHERE name = ? AND (key1 = ? OR key1 IS NULL) AND (key2 = ? OR key2 IS NULL)),
128
- ?, ?, ?, ?, ?, ?
129
- )
130
- `;
131
-
132
- const values = [
133
- event.name,
134
- event.key1,
135
- event.key2,
136
- checkpoint,
137
- digest,
138
- event.name,
139
- event.key1,
140
- event.key2,
141
- event.value
142
- ];
143
-
144
- await sqliteDB.run(sql, values);
145
- console.log('Insert or update data: ', checkpoint, digest, dbName, data);
146
- }
147
-
148
- async function removeData(sqliteDB: Database, dbName: string, data: RemoveData) {
149
- const { checkpoint, digest, event } = data;
150
-
151
- let sql = `
152
- UPDATE ${dbName}
153
- SET is_removed = TRUE
154
- WHERE name = ? AND (key1 = ? OR key1 IS NULL) AND (key2 = ? OR key2 IS NULL)
155
- `;
156
-
157
- await sqliteDB.run(sql, [event.name, event.key1, event.key2]);
158
- console.log('Remove data: ', checkpoint, digest, dbName, data);
159
- }
160
-
161
- async function insertTx(sqliteDB: Database, checkpoint: string, digest: string) {
162
- let sql = `
163
- INSERT INTO dapp_transaction (checkpoint, digest)
164
- VALUES (?, ?)
165
- `;
166
-
167
- await sqliteDB.run(sql, [checkpoint, digest]);
168
- console.log('Insert transaction: ', checkpoint, digest);
169
- }
170
-
171
- async function getLastDigest(sqliteDB: Database): Promise<string | null> {
172
- const row = await sqliteDB.get(`
173
- SELECT digest FROM dapp_transaction
174
- ORDER BY id DESC
175
- LIMIT 1
176
- `);
177
-
178
- return row ? row.digest : null;
179
- }
180
-
181
- export async function indexerHandler(
182
- dubheConfig: DubheConfig,
183
- network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
184
- db: string,
185
- schemaId: string | undefined
186
- ) {
187
- const path = process.cwd();
188
- const projectPath = `${path}/contracts/${dubheConfig.name}`;
189
-
190
- schemaId = schemaId || (await getSchemaId(projectPath, network));
191
-
192
- console.log('\nšŸš€ Sqlite Started');
193
- console.log(` ā”œā”€ Project: ${projectPath}`);
194
- console.log(` ā”œā”€ Network: ${network}`);
195
- console.log(` ā”œā”€ Database: ${db}`);
196
- console.log(` ā”œā”€ Schema ID: ${schemaId}`);
197
-
198
- if (!schemaId) {
199
- throw new DubheCliError(
200
- `Schema ID not found. Please provide a schema ID with the --schemaId flag.`
201
- );
202
- }
203
- const client = new SuiClient({ url: getFullnodeUrl(network) });
204
-
205
- if (db === 'sqlite') {
206
- sqliteDB = await createDB(dubheConfig.name);
207
- while (true) {
208
- await delay(2000);
209
- const cursor = await getLastDigest(sqliteDB);
210
- const response = await client.queryTransactionBlocks({
211
- filter: {
212
- // Transaction: 'FD43PRNS2PyNcYExFxwuouLqTVvonTd6NtDYMiVB7ZxZ'
213
- // MoveFunction: {
214
- // package: '0x2dd117c4f48a6be9d2dd20eff67903ebf07080c7e259c7c589078fe21bb78471',
215
- // module: 'message_system',
216
- // function: 'send'
217
- // }
218
- ChangedObject: schemaId
219
- },
220
- order: 'ascending',
221
- cursor: cursor,
222
- // limit: 2,
223
- options: {
224
- showEvents: true
225
- }
226
- });
227
- const txs = response.data as SuiTransactionBlockResponse[];
228
- // console.log("New Transactions: ", txs);
229
- for (const tx of txs) {
230
- await insertTx(sqliteDB, tx.checkpoint?.toString() as string, tx.digest);
231
- if (tx.events) {
232
- for (const event of tx.events) {
233
- // @ts-ignore
234
- if (event.parsedJson.hasOwnProperty('value')) {
235
- await processSetRecord(
236
- sqliteDB,
237
- dubheConfig.name,
238
- tx.checkpoint?.toString() as string,
239
- tx.digest,
240
- event.parsedJson
241
- );
242
- } else {
243
- await processRemoveRecord(
244
- sqliteDB,
245
- dubheConfig.name,
246
- tx.checkpoint?.toString() as string,
247
- tx.digest,
248
- event.parsedJson
249
- );
250
- }
251
- }
252
- }
253
- }
254
- }
255
- } else {
256
- throw new DubheCliError(`Database "${db}" not supported. Supported databases: sqlite`);
257
- }
258
- }
259
-
260
- process.on('SIGINT', async () => {
261
- await sqliteDB.close();
262
- console.log(chalk.green('āœ… Sqlite Stopped'));
263
- process.exit();
264
- });