@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.
- package/dist/dubhe.js +68 -93
- package/dist/dubhe.js.map +1 -1
- package/package.json +10 -7
- package/src/commands/faucet.ts +55 -21
- package/src/commands/generateKey.ts +9 -9
- package/src/commands/index.ts +3 -3
- package/src/commands/localnode.ts +9 -3
- package/src/commands/wait.ts +59 -0
- package/src/utils/callHandler.ts +4 -36
- package/src/utils/checkBalance.ts +3 -18
- package/src/utils/generateAccount.ts +71 -67
- package/src/utils/index.ts +0 -1
- package/src/utils/publishHandler.ts +275 -63
- package/src/utils/queryStorage.ts +4 -18
- package/src/utils/startNode.ts +117 -61
- package/src/utils/storeConfig.ts +12 -24
- package/src/utils/upgradeHandler.ts +9 -19
- package/src/utils/utils.ts +74 -3
- package/src/commands/indexer.ts +0 -56
- package/src/utils/indexerHandler.ts +0 -264
|
@@ -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
|
-
});
|