@ocap/indexdb-sqlite 1.29.5
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/README.md +84 -0
- package/esm/_virtual/rolldown_runtime.mjs +21 -0
- package/esm/db/base.d.mts +76 -0
- package/esm/db/base.mjs +666 -0
- package/esm/db/index.d.mts +80 -0
- package/esm/db/index.mjs +551 -0
- package/esm/index.d.mts +3 -0
- package/esm/index.mjs +8 -0
- package/esm/interfaces.d.mts +328 -0
- package/esm/interfaces.mjs +1 -0
- package/esm/kysely.d.mts +43 -0
- package/esm/kysely.mjs +62 -0
- package/esm/migrations/001-genesis.d.mts +14 -0
- package/esm/migrations/001-genesis.mjs +107 -0
- package/esm/migrations/index.d.mts +16 -0
- package/esm/migrations/index.mjs +44 -0
- package/esm/package.mjs +70 -0
- package/esm/table/base.d.mts +107 -0
- package/esm/table/base.mjs +262 -0
- package/esm/table/transaction.d.mts +18 -0
- package/esm/table/transaction.mjs +22 -0
- package/lib/_virtual/rolldown_runtime.cjs +43 -0
- package/lib/db/base.cjs +670 -0
- package/lib/db/base.d.cts +76 -0
- package/lib/db/index.cjs +552 -0
- package/lib/db/index.d.cts +80 -0
- package/lib/index.cjs +10 -0
- package/lib/index.d.cts +3 -0
- package/lib/interfaces.cjs +0 -0
- package/lib/interfaces.d.cts +328 -0
- package/lib/kysely.cjs +63 -0
- package/lib/kysely.d.cts +43 -0
- package/lib/migrations/001-genesis.cjs +114 -0
- package/lib/migrations/001-genesis.d.cts +14 -0
- package/lib/migrations/index.cjs +46 -0
- package/lib/migrations/index.d.cts +16 -0
- package/lib/package.cjs +76 -0
- package/lib/table/base.cjs +265 -0
- package/lib/table/base.d.cts +107 -0
- package/lib/table/transaction.cjs +24 -0
- package/lib/table/transaction.d.cts +18 -0
- package/package.json +75 -0
package/lib/index.d.cts
ADDED
|
File without changes
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { Transaction } from "kysely";
|
|
2
|
+
|
|
3
|
+
//#region src/interfaces.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Database schema types for Kysely IndexDB
|
|
7
|
+
* Each table is defined with its column types
|
|
8
|
+
*/
|
|
9
|
+
interface Database {
|
|
10
|
+
tx: TxTable;
|
|
11
|
+
account: AccountTable;
|
|
12
|
+
asset: AssetTable;
|
|
13
|
+
token: TokenTable;
|
|
14
|
+
factory: FactoryTable;
|
|
15
|
+
stake: StakeTable;
|
|
16
|
+
delegation: DelegationTable;
|
|
17
|
+
rollup: RollupTable;
|
|
18
|
+
rollupBlock: RollupBlockTable;
|
|
19
|
+
rollupValidator: RollupValidatorTable;
|
|
20
|
+
tokenDistribution: TokenDistributionTable;
|
|
21
|
+
tokenFactory: TokenFactoryTable;
|
|
22
|
+
balance: BalanceTable;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Transaction table for indexed transactions
|
|
26
|
+
*/
|
|
27
|
+
interface TxTable {
|
|
28
|
+
hash: string;
|
|
29
|
+
code: string | null;
|
|
30
|
+
height: number | null;
|
|
31
|
+
index_: number | null;
|
|
32
|
+
receipts: string | null;
|
|
33
|
+
receiptsVerified: number | null;
|
|
34
|
+
receiver: string | null;
|
|
35
|
+
sender: string | null;
|
|
36
|
+
time: string | null;
|
|
37
|
+
tx: string | null;
|
|
38
|
+
type: string | null;
|
|
39
|
+
finalized: number | null;
|
|
40
|
+
valid: number | null;
|
|
41
|
+
accounts: string | null;
|
|
42
|
+
assets: string | null;
|
|
43
|
+
tokens: string | null;
|
|
44
|
+
tokenSymbols: string | null;
|
|
45
|
+
factories: string | null;
|
|
46
|
+
rollups: string | null;
|
|
47
|
+
stakes: string | null;
|
|
48
|
+
delegations: string | null;
|
|
49
|
+
tokenFactories: string | null;
|
|
50
|
+
genesisTime: string | null;
|
|
51
|
+
renaissanceTime: string | null;
|
|
52
|
+
data: string | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Account table for indexed accounts
|
|
56
|
+
*/
|
|
57
|
+
interface AccountTable {
|
|
58
|
+
address: string;
|
|
59
|
+
balance: string;
|
|
60
|
+
balanceNum: string | null;
|
|
61
|
+
gasBalance: string | null;
|
|
62
|
+
moniker: string | null;
|
|
63
|
+
pk: string | null;
|
|
64
|
+
nonce: number | null;
|
|
65
|
+
numTxs: number | null;
|
|
66
|
+
numAssets: number | null;
|
|
67
|
+
issuer: string | null;
|
|
68
|
+
migratedTo: string | null;
|
|
69
|
+
migratedFrom: string | null;
|
|
70
|
+
stake: string | null;
|
|
71
|
+
tokens: string | null;
|
|
72
|
+
data: string | null;
|
|
73
|
+
genesisTime: string | null;
|
|
74
|
+
renaissanceTime: string | null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Asset table for indexed assets
|
|
78
|
+
*/
|
|
79
|
+
interface AssetTable {
|
|
80
|
+
address: string;
|
|
81
|
+
owner: string | null;
|
|
82
|
+
moniker: string | null;
|
|
83
|
+
readonly: number | null;
|
|
84
|
+
transferrable: number | null;
|
|
85
|
+
issuer: string | null;
|
|
86
|
+
parent: string | null;
|
|
87
|
+
ttl: number | null;
|
|
88
|
+
consumedTime: string | null;
|
|
89
|
+
endpoint: string | null;
|
|
90
|
+
display: string | null;
|
|
91
|
+
tags: string | null;
|
|
92
|
+
stake: string | null;
|
|
93
|
+
data: string | null;
|
|
94
|
+
genesisTime: string | null;
|
|
95
|
+
renaissanceTime: string | null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Token table for indexed tokens
|
|
99
|
+
*/
|
|
100
|
+
interface TokenTable {
|
|
101
|
+
address: string;
|
|
102
|
+
symbol: string | null;
|
|
103
|
+
name: string | null;
|
|
104
|
+
decimal: number | null;
|
|
105
|
+
unit: string | null;
|
|
106
|
+
description: string | null;
|
|
107
|
+
icon: string | null;
|
|
108
|
+
totalSupply: string | null;
|
|
109
|
+
totalSupplyNum: string | null;
|
|
110
|
+
initialSupply: string | null;
|
|
111
|
+
maxTotalSupply: string | null;
|
|
112
|
+
foreignToken: string | null;
|
|
113
|
+
issuer: string | null;
|
|
114
|
+
website: string | null;
|
|
115
|
+
metadata: string | null;
|
|
116
|
+
tokenFactoryAddress: string | null;
|
|
117
|
+
spenders: string | null;
|
|
118
|
+
minters: string | null;
|
|
119
|
+
type: string | null;
|
|
120
|
+
data: string | null;
|
|
121
|
+
genesisTime: string | null;
|
|
122
|
+
renaissanceTime: string | null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Factory table for indexed asset factories
|
|
126
|
+
*/
|
|
127
|
+
interface FactoryTable {
|
|
128
|
+
address: string;
|
|
129
|
+
owner: string | null;
|
|
130
|
+
name: string | null;
|
|
131
|
+
description: string | null;
|
|
132
|
+
settlement: string | null;
|
|
133
|
+
limit_: number | null;
|
|
134
|
+
trustedIssuers: string | null;
|
|
135
|
+
tokens: string | null;
|
|
136
|
+
numMinted: number | null;
|
|
137
|
+
lastSettlement: string | null;
|
|
138
|
+
input: string | null;
|
|
139
|
+
output: string | null;
|
|
140
|
+
display: string | null;
|
|
141
|
+
hooks: string | null;
|
|
142
|
+
data: string | null;
|
|
143
|
+
genesisTime: string | null;
|
|
144
|
+
renaissanceTime: string | null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* TokenFactory table for indexed token factories (bonding curve)
|
|
148
|
+
*/
|
|
149
|
+
interface TokenFactoryTable {
|
|
150
|
+
address: string;
|
|
151
|
+
owner: string | null;
|
|
152
|
+
name: string | null;
|
|
153
|
+
description: string | null;
|
|
154
|
+
moniker: string | null;
|
|
155
|
+
status: string | null;
|
|
156
|
+
curve: string | null;
|
|
157
|
+
tokenAddress: string | null;
|
|
158
|
+
reserveAddress: string | null;
|
|
159
|
+
reserveBalance: string | null;
|
|
160
|
+
reserveBalanceNum: string | null;
|
|
161
|
+
currentSupply: string | null;
|
|
162
|
+
currentSupplyNum: string | null;
|
|
163
|
+
feeRate: string | null;
|
|
164
|
+
token: string | null;
|
|
165
|
+
reserveToken: string | null;
|
|
166
|
+
input: string | null;
|
|
167
|
+
output: string | null;
|
|
168
|
+
data: string | null;
|
|
169
|
+
genesisTime: string | null;
|
|
170
|
+
renaissanceTime: string | null;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Stake table for indexed stakes
|
|
174
|
+
*/
|
|
175
|
+
interface StakeTable {
|
|
176
|
+
address: string;
|
|
177
|
+
sender: string | null;
|
|
178
|
+
receiver: string | null;
|
|
179
|
+
revocable: number | null;
|
|
180
|
+
tokens: string | null;
|
|
181
|
+
revokedTokens: string | null;
|
|
182
|
+
assets: string | null;
|
|
183
|
+
revokedAssets: string | null;
|
|
184
|
+
slashers: string | null;
|
|
185
|
+
nonce: string | null;
|
|
186
|
+
revokeWaitingPeriod: number | null;
|
|
187
|
+
message: string | null;
|
|
188
|
+
data: string | null;
|
|
189
|
+
genesisTime: string | null;
|
|
190
|
+
renaissanceTime: string | null;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Delegation table for indexed delegations
|
|
194
|
+
*/
|
|
195
|
+
interface DelegationTable {
|
|
196
|
+
address: string;
|
|
197
|
+
from_: string | null;
|
|
198
|
+
to_: string | null;
|
|
199
|
+
ops: string | null;
|
|
200
|
+
context: string | null;
|
|
201
|
+
data: string | null;
|
|
202
|
+
genesisTime: string | null;
|
|
203
|
+
renaissanceTime: string | null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Rollup table for indexed rollups
|
|
207
|
+
*/
|
|
208
|
+
interface RollupTable {
|
|
209
|
+
address: string;
|
|
210
|
+
tokenAddress: string | null;
|
|
211
|
+
vaultAddress: string | null;
|
|
212
|
+
contractAddress: string | null;
|
|
213
|
+
paused: number | null;
|
|
214
|
+
closed: number | null;
|
|
215
|
+
seedValidators: string | null;
|
|
216
|
+
validators: string | null;
|
|
217
|
+
blockHash: string | null;
|
|
218
|
+
issuer: string | null;
|
|
219
|
+
foreignToken: string | null;
|
|
220
|
+
minStakeAmount: string | null;
|
|
221
|
+
maxStakeAmount: string | null;
|
|
222
|
+
minSignerCount: number | null;
|
|
223
|
+
maxSignerCount: number | null;
|
|
224
|
+
minBlockSize: number | null;
|
|
225
|
+
maxBlockSize: number | null;
|
|
226
|
+
minBlockInterval: number | null;
|
|
227
|
+
leaveWaitingPeriod: number | null;
|
|
228
|
+
publishWaitingPeriod: number | null;
|
|
229
|
+
publishSlashRate: number | null;
|
|
230
|
+
tokenInfo: string | null;
|
|
231
|
+
depositFeeRate: number | null;
|
|
232
|
+
withdrawFeeRate: number | null;
|
|
233
|
+
proposerFeeShare: number | null;
|
|
234
|
+
publisherFeeShare: number | null;
|
|
235
|
+
minDepositAmount: string | null;
|
|
236
|
+
minWithdrawAmount: string | null;
|
|
237
|
+
totalDepositAmount: string | null;
|
|
238
|
+
totalWithdrawAmount: string | null;
|
|
239
|
+
migrateHistory: string | null;
|
|
240
|
+
vaultHistory: string | null;
|
|
241
|
+
data: string | null;
|
|
242
|
+
genesisTime: string | null;
|
|
243
|
+
renaissanceTime: string | null;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* RollupBlock table for indexed rollup blocks
|
|
247
|
+
*/
|
|
248
|
+
interface RollupBlockTable {
|
|
249
|
+
hash: string;
|
|
250
|
+
rollup: string | null;
|
|
251
|
+
height: string | null;
|
|
252
|
+
merkleRoot: string | null;
|
|
253
|
+
previousHash: string | null;
|
|
254
|
+
txsHash: string | null;
|
|
255
|
+
txs: string | null;
|
|
256
|
+
proposer: string | null;
|
|
257
|
+
signatures: string | null;
|
|
258
|
+
rewardAmount: string | null;
|
|
259
|
+
mintedAmount: string | null;
|
|
260
|
+
burnedAmount: string | null;
|
|
261
|
+
minReward: string | null;
|
|
262
|
+
validators: string | null;
|
|
263
|
+
tokenInfo: string | null;
|
|
264
|
+
governance: number | null;
|
|
265
|
+
data: string | null;
|
|
266
|
+
genesisTime: string | null;
|
|
267
|
+
renaissanceTime: string | null;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* RollupValidator table for indexed validators
|
|
271
|
+
*/
|
|
272
|
+
interface RollupValidatorTable {
|
|
273
|
+
address: string;
|
|
274
|
+
rollup: string | null;
|
|
275
|
+
pk: string | null;
|
|
276
|
+
moniker: string | null;
|
|
277
|
+
endpoint: string | null;
|
|
278
|
+
joinTime: string | null;
|
|
279
|
+
leaveTime: string | null;
|
|
280
|
+
genesisTime: string | null;
|
|
281
|
+
renaissanceTime: string | null;
|
|
282
|
+
totalStake: string | null;
|
|
283
|
+
availableStake: string | null;
|
|
284
|
+
revokedStake: string | null;
|
|
285
|
+
totalGain: string | null;
|
|
286
|
+
proposedBlockCount: number | null;
|
|
287
|
+
verifiedBlockCount: number | null;
|
|
288
|
+
latestBlockHeight: number | null;
|
|
289
|
+
latestBlockHash: string | null;
|
|
290
|
+
data: string | null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* TokenDistribution table for token holder distribution
|
|
294
|
+
*/
|
|
295
|
+
interface TokenDistributionTable {
|
|
296
|
+
tokenAddress: string;
|
|
297
|
+
holders: number | null;
|
|
298
|
+
distribution: string | null;
|
|
299
|
+
stake: string | null;
|
|
300
|
+
gasStake: string | null;
|
|
301
|
+
revokedStake: string | null;
|
|
302
|
+
gas: string | null;
|
|
303
|
+
fee: string | null;
|
|
304
|
+
slashedVault: string | null;
|
|
305
|
+
account: string | null;
|
|
306
|
+
txTime: string | null;
|
|
307
|
+
genesisTime: string | null;
|
|
308
|
+
renaissanceTime: string | null;
|
|
309
|
+
data: string | null;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Balance table for token balances (composite key)
|
|
313
|
+
*/
|
|
314
|
+
interface BalanceTable {
|
|
315
|
+
address: string;
|
|
316
|
+
tokenAddress: string;
|
|
317
|
+
balance: string;
|
|
318
|
+
balanceNum: string | null;
|
|
319
|
+
data: string | null;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* SQLite-specific operation context with optional transaction
|
|
323
|
+
*/
|
|
324
|
+
interface SqliteOperationContext {
|
|
325
|
+
txn?: Transaction<Database>;
|
|
326
|
+
}
|
|
327
|
+
//#endregion
|
|
328
|
+
export { AccountTable, AssetTable, BalanceTable, Database, DelegationTable, FactoryTable, RollupBlockTable, RollupTable, RollupValidatorTable, SqliteOperationContext, StakeTable, TokenDistributionTable, TokenFactoryTable, TokenTable, TxTable };
|
package/lib/kysely.cjs
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
|
|
2
|
+
let kysely = require("kysely");
|
|
3
|
+
|
|
4
|
+
//#region src/kysely.ts
|
|
5
|
+
function isBunRuntime() {
|
|
6
|
+
return typeof globalThis.Bun !== "undefined";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create a Kysely instance with SQLite dialect
|
|
10
|
+
* Automatically uses kysely-bun-sqlite in Bun or better-sqlite3 in Node.js
|
|
11
|
+
*
|
|
12
|
+
* @param config - SQLite configuration
|
|
13
|
+
* @returns Kysely instance configured for the database
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // In-memory database for testing
|
|
18
|
+
* const db = createKysely({ filename: ':memory:' });
|
|
19
|
+
*
|
|
20
|
+
* // File-based database for production
|
|
21
|
+
* const db = createKysely({ filename: './data/index.sqlite' });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function createKysely(config) {
|
|
25
|
+
if (isBunRuntime()) {
|
|
26
|
+
const { BunSqliteDialect } = {}.require("kysely-bun-sqlite");
|
|
27
|
+
const { Database: BunDatabase } = {}.require("bun:sqlite");
|
|
28
|
+
const sqlite$1 = new BunDatabase(config.filename, {
|
|
29
|
+
create: config.create !== false,
|
|
30
|
+
readonly: config.readonly === true
|
|
31
|
+
});
|
|
32
|
+
if (config.walMode !== false && !config.readonly && config.filename !== ":memory:") {
|
|
33
|
+
sqlite$1.exec("PRAGMA journal_mode = WAL");
|
|
34
|
+
sqlite$1.exec("PRAGMA synchronous = NORMAL");
|
|
35
|
+
}
|
|
36
|
+
sqlite$1.exec("PRAGMA foreign_keys = ON");
|
|
37
|
+
sqlite$1.exec("PRAGMA busy_timeout = 5000");
|
|
38
|
+
return new kysely.Kysely({ dialect: new BunSqliteDialect({ database: sqlite$1 }) });
|
|
39
|
+
}
|
|
40
|
+
const sqlite = new (require("better-sqlite3"))(config.filename, {
|
|
41
|
+
readonly: config.readonly === true,
|
|
42
|
+
fileMustExist: config.create === false
|
|
43
|
+
});
|
|
44
|
+
if (config.walMode !== false && !config.readonly && config.filename !== ":memory:") {
|
|
45
|
+
sqlite.pragma("journal_mode = WAL");
|
|
46
|
+
sqlite.pragma("synchronous = NORMAL");
|
|
47
|
+
}
|
|
48
|
+
sqlite.pragma("foreign_keys = ON");
|
|
49
|
+
sqlite.pragma("busy_timeout = 5000");
|
|
50
|
+
return new kysely.Kysely({ dialect: new kysely.SqliteDialect({ database: sqlite }) });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the underlying SQLite database instance from Kysely
|
|
54
|
+
* Useful for executing raw SQL or pragmas
|
|
55
|
+
* Returns either bun:sqlite Database or better-sqlite3 Database depending on runtime
|
|
56
|
+
*/
|
|
57
|
+
function getRawDatabase(db) {
|
|
58
|
+
return db.getExecutor().adapter.db;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
exports.createKysely = createKysely;
|
|
63
|
+
exports.getRawDatabase = getRawDatabase;
|
package/lib/kysely.d.cts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Database } from "./interfaces.cjs";
|
|
2
|
+
import { Kysely } from "kysely";
|
|
3
|
+
|
|
4
|
+
//#region src/kysely.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* SQLite configuration options
|
|
8
|
+
*/
|
|
9
|
+
interface SqliteConfig {
|
|
10
|
+
/** Database file path. Use ':memory:' for in-memory database */
|
|
11
|
+
filename: string;
|
|
12
|
+
/** Open database in readonly mode */
|
|
13
|
+
readonly?: boolean;
|
|
14
|
+
/** Throw error if file doesn't exist (default: false, creates new file) */
|
|
15
|
+
create?: boolean;
|
|
16
|
+
/** Enable WAL mode (default: true) */
|
|
17
|
+
walMode?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a Kysely instance with SQLite dialect
|
|
21
|
+
* Automatically uses kysely-bun-sqlite in Bun or better-sqlite3 in Node.js
|
|
22
|
+
*
|
|
23
|
+
* @param config - SQLite configuration
|
|
24
|
+
* @returns Kysely instance configured for the database
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // In-memory database for testing
|
|
29
|
+
* const db = createKysely({ filename: ':memory:' });
|
|
30
|
+
*
|
|
31
|
+
* // File-based database for production
|
|
32
|
+
* const db = createKysely({ filename: './data/index.sqlite' });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
declare function createKysely(config: SqliteConfig): Kysely<Database>;
|
|
36
|
+
/**
|
|
37
|
+
* Get the underlying SQLite database instance from Kysely
|
|
38
|
+
* Useful for executing raw SQL or pragmas
|
|
39
|
+
* Returns either bun:sqlite Database or better-sqlite3 Database depending on runtime
|
|
40
|
+
*/
|
|
41
|
+
declare function getRawDatabase(db: Kysely<Database>): any;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { SqliteConfig, createKysely, getRawDatabase };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
let kysely = require("kysely");
|
|
3
|
+
|
|
4
|
+
//#region src/migrations/001-genesis.ts
|
|
5
|
+
var _001_genesis_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
6
|
+
down: () => down,
|
|
7
|
+
up: () => up
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Genesis migration - creates all IndexDB tables
|
|
11
|
+
*/
|
|
12
|
+
async function up(db) {
|
|
13
|
+
await db.schema.createTable("tx").ifNotExists().addColumn("hash", "text", (col) => col.primaryKey()).addColumn("code", "text").addColumn("height", "integer").addColumn("index_", "integer").addColumn("receipts", "text").addColumn("receiptsVerified", "integer").addColumn("receiver", "text").addColumn("sender", "text").addColumn("time", "text").addColumn("tx", "text").addColumn("type", "text").addColumn("finalized", "integer").addColumn("valid", "integer").addColumn("accounts", "text").addColumn("assets", "text").addColumn("tokens", "text").addColumn("tokenSymbols", "text").addColumn("factories", "text").addColumn("rollups", "text").addColumn("stakes", "text").addColumn("delegations", "text").addColumn("tokenFactories", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").addColumn("data", "text").execute();
|
|
14
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_sender ON tx(sender)`.execute(db);
|
|
15
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_receiver ON tx(receiver)`.execute(db);
|
|
16
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_type ON tx(type)`.execute(db);
|
|
17
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_time ON tx(time)`.execute(db);
|
|
18
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_height ON tx(height)`.execute(db);
|
|
19
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tx_valid ON tx(valid)`.execute(db);
|
|
20
|
+
await db.schema.createTable("account").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("balance", "text", (col) => col.notNull().defaultTo("0")).addColumn("balanceNum", "text").addColumn("gasBalance", "text").addColumn("moniker", "text").addColumn("pk", "text").addColumn("nonce", "integer").addColumn("numTxs", "integer").addColumn("numAssets", "integer").addColumn("issuer", "text").addColumn("migratedTo", "text").addColumn("migratedFrom", "text").addColumn("stake", "text").addColumn("tokens", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
21
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_account_balance ON account(balanceNum)`.execute(db);
|
|
22
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_account_genesis ON account(genesisTime)`.execute(db);
|
|
23
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_account_renaissance ON account(renaissanceTime)`.execute(db);
|
|
24
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_account_moniker ON account(moniker)`.execute(db);
|
|
25
|
+
await db.schema.createTable("asset").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("owner", "text").addColumn("moniker", "text").addColumn("readonly", "integer").addColumn("transferrable", "integer").addColumn("issuer", "text").addColumn("parent", "text").addColumn("ttl", "integer").addColumn("consumedTime", "text").addColumn("endpoint", "text").addColumn("display", "text").addColumn("tags", "text").addColumn("stake", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
26
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_asset_owner ON asset(owner)`.execute(db);
|
|
27
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_asset_parent ON asset(parent)`.execute(db);
|
|
28
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_asset_genesis ON asset(genesisTime)`.execute(db);
|
|
29
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_asset_renaissance ON asset(renaissanceTime)`.execute(db);
|
|
30
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_asset_consumed ON asset(consumedTime)`.execute(db);
|
|
31
|
+
await db.schema.createTable("token").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("symbol", "text").addColumn("name", "text").addColumn("decimal", "integer").addColumn("unit", "text").addColumn("description", "text").addColumn("icon", "text").addColumn("totalSupply", "text").addColumn("totalSupplyNum", "text").addColumn("initialSupply", "text").addColumn("maxTotalSupply", "text").addColumn("foreignToken", "text").addColumn("issuer", "text").addColumn("website", "text").addColumn("metadata", "text").addColumn("tokenFactoryAddress", "text").addColumn("spenders", "text").addColumn("minters", "text").addColumn("type", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
32
|
+
await kysely.sql`CREATE UNIQUE INDEX IF NOT EXISTS idx_token_symbol ON token(symbol) WHERE symbol IS NOT NULL`.execute(db);
|
|
33
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_token_issuer ON token(issuer)`.execute(db);
|
|
34
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_token_supply ON token(totalSupplyNum)`.execute(db);
|
|
35
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_token_genesis ON token(genesisTime)`.execute(db);
|
|
36
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_token_renaissance ON token(renaissanceTime)`.execute(db);
|
|
37
|
+
await db.schema.createTable("factory").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("owner", "text").addColumn("name", "text").addColumn("description", "text").addColumn("settlement", "text").addColumn("limit_", "integer").addColumn("trustedIssuers", "text").addColumn("tokens", "text").addColumn("numMinted", "integer").addColumn("lastSettlement", "text").addColumn("input", "text").addColumn("output", "text").addColumn("display", "text").addColumn("hooks", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
38
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_owner ON factory(owner)`.execute(db);
|
|
39
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_genesis ON factory(genesisTime)`.execute(db);
|
|
40
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_renaissance ON factory(renaissanceTime)`.execute(db);
|
|
41
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_minted ON factory(numMinted)`.execute(db);
|
|
42
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_limit ON factory(limit_)`.execute(db);
|
|
43
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_factory_name ON factory(name)`.execute(db);
|
|
44
|
+
await db.schema.createTable("tokenFactory").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("owner", "text").addColumn("name", "text").addColumn("description", "text").addColumn("moniker", "text").addColumn("status", "text").addColumn("curve", "text").addColumn("tokenAddress", "text").addColumn("reserveAddress", "text").addColumn("reserveBalance", "text").addColumn("reserveBalanceNum", "text").addColumn("currentSupply", "text").addColumn("currentSupplyNum", "text").addColumn("feeRate", "text").addColumn("token", "text").addColumn("reserveToken", "text").addColumn("input", "text").addColumn("output", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
45
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_owner ON tokenFactory(owner)`.execute(db);
|
|
46
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_token ON tokenFactory(tokenAddress)`.execute(db);
|
|
47
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_reserve ON tokenFactory(reserveAddress)`.execute(db);
|
|
48
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_genesis ON tokenFactory(genesisTime)`.execute(db);
|
|
49
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_renaissance ON tokenFactory(renaissanceTime)`.execute(db);
|
|
50
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_reserve_balance ON tokenFactory(reserveBalanceNum)`.execute(db);
|
|
51
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_tokenfactory_supply ON tokenFactory(currentSupplyNum)`.execute(db);
|
|
52
|
+
await db.schema.createTable("stake").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("sender", "text").addColumn("receiver", "text").addColumn("revocable", "integer").addColumn("tokens", "text").addColumn("revokedTokens", "text").addColumn("assets", "text").addColumn("revokedAssets", "text").addColumn("slashers", "text").addColumn("nonce", "text").addColumn("revokeWaitingPeriod", "integer").addColumn("message", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
53
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_stake_sender ON stake(sender)`.execute(db);
|
|
54
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_stake_receiver ON stake(receiver)`.execute(db);
|
|
55
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_stake_genesis ON stake(genesisTime)`.execute(db);
|
|
56
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_stake_renaissance ON stake(renaissanceTime)`.execute(db);
|
|
57
|
+
await db.schema.createTable("delegation").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("from_", "text").addColumn("to_", "text").addColumn("ops", "text").addColumn("context", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
58
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_delegation_from ON delegation(from_)`.execute(db);
|
|
59
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_delegation_to ON delegation(to_)`.execute(db);
|
|
60
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_delegation_genesis ON delegation(genesisTime)`.execute(db);
|
|
61
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_delegation_renaissance ON delegation(renaissanceTime)`.execute(db);
|
|
62
|
+
await db.schema.createTable("rollup").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("tokenAddress", "text").addColumn("vaultAddress", "text").addColumn("contractAddress", "text").addColumn("paused", "integer").addColumn("closed", "integer").addColumn("seedValidators", "text").addColumn("validators", "text").addColumn("blockHash", "text").addColumn("issuer", "text").addColumn("foreignToken", "text").addColumn("minStakeAmount", "text").addColumn("maxStakeAmount", "text").addColumn("minSignerCount", "integer").addColumn("maxSignerCount", "integer").addColumn("minBlockSize", "integer").addColumn("maxBlockSize", "integer").addColumn("minBlockInterval", "integer").addColumn("leaveWaitingPeriod", "integer").addColumn("publishWaitingPeriod", "integer").addColumn("publishSlashRate", "integer").addColumn("tokenInfo", "text").addColumn("depositFeeRate", "integer").addColumn("withdrawFeeRate", "integer").addColumn("proposerFeeShare", "integer").addColumn("publisherFeeShare", "integer").addColumn("minDepositAmount", "text").addColumn("minWithdrawAmount", "text").addColumn("totalDepositAmount", "text").addColumn("totalWithdrawAmount", "text").addColumn("migrateHistory", "text").addColumn("vaultHistory", "text").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
63
|
+
await kysely.sql`DROP INDEX IF EXISTS idx_rollup_token`.execute(db);
|
|
64
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollup_token ON rollup(tokenAddress) WHERE tokenAddress IS NOT NULL`.execute(db);
|
|
65
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollup_genesis ON rollup(genesisTime)`.execute(db);
|
|
66
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollup_renaissance ON rollup(renaissanceTime)`.execute(db);
|
|
67
|
+
await db.schema.createTable("rollupBlock").ifNotExists().addColumn("hash", "text", (col) => col.primaryKey()).addColumn("rollup", "text").addColumn("height", "text").addColumn("merkleRoot", "text").addColumn("previousHash", "text").addColumn("txsHash", "text").addColumn("txs", "text").addColumn("proposer", "text").addColumn("signatures", "text").addColumn("rewardAmount", "text").addColumn("mintedAmount", "text").addColumn("burnedAmount", "text").addColumn("minReward", "text").addColumn("validators", "text").addColumn("tokenInfo", "text").addColumn("governance", "integer").addColumn("data", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").execute();
|
|
68
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupblock_rollup ON rollupBlock(rollup)`.execute(db);
|
|
69
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupblock_height ON rollupBlock(height)`.execute(db);
|
|
70
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupblock_proposer ON rollupBlock(proposer)`.execute(db);
|
|
71
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupblock_genesis ON rollupBlock(genesisTime)`.execute(db);
|
|
72
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupblock_renaissance ON rollupBlock(renaissanceTime)`.execute(db);
|
|
73
|
+
await db.schema.createTable("rollupValidator").ifNotExists().addColumn("address", "text", (col) => col.primaryKey()).addColumn("rollup", "text").addColumn("pk", "text").addColumn("moniker", "text").addColumn("endpoint", "text").addColumn("joinTime", "text").addColumn("leaveTime", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").addColumn("totalStake", "text").addColumn("availableStake", "text").addColumn("revokedStake", "text").addColumn("totalGain", "text").addColumn("proposedBlockCount", "integer").addColumn("verifiedBlockCount", "integer").addColumn("latestBlockHeight", "integer").addColumn("latestBlockHash", "text").addColumn("data", "text").execute();
|
|
74
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupvalidator_rollup ON rollupValidator(rollup)`.execute(db);
|
|
75
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupvalidator_join ON rollupValidator(joinTime)`.execute(db);
|
|
76
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupvalidator_leave ON rollupValidator(leaveTime)`.execute(db);
|
|
77
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupvalidator_genesis ON rollupValidator(genesisTime)`.execute(db);
|
|
78
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_rollupvalidator_renaissance ON rollupValidator(renaissanceTime)`.execute(db);
|
|
79
|
+
await db.schema.createTable("tokenDistribution").ifNotExists().addColumn("tokenAddress", "text", (col) => col.primaryKey()).addColumn("holders", "integer").addColumn("distribution", "text").addColumn("stake", "text").addColumn("gasStake", "text").addColumn("revokedStake", "text").addColumn("gas", "text").addColumn("fee", "text").addColumn("slashedVault", "text").addColumn("account", "text").addColumn("txTime", "text").addColumn("genesisTime", "text").addColumn("renaissanceTime", "text").addColumn("data", "text").execute();
|
|
80
|
+
await db.schema.createTable("balance").ifNotExists().addColumn("address", "text", (col) => col.notNull()).addColumn("tokenAddress", "text", (col) => col.notNull()).addColumn("balance", "text", (col) => col.notNull().defaultTo("0")).addColumn("balanceNum", "text").addColumn("data", "text").addPrimaryKeyConstraint("balance_pk", ["address", "tokenAddress"]).execute();
|
|
81
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_balance_address ON balance(address)`.execute(db);
|
|
82
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_balance_token ON balance(tokenAddress)`.execute(db);
|
|
83
|
+
await kysely.sql`CREATE INDEX IF NOT EXISTS idx_balance_amount ON balance(balanceNum)`.execute(db);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Rollback migration - drops all tables
|
|
87
|
+
*/
|
|
88
|
+
async function down(db) {
|
|
89
|
+
for (const table of [
|
|
90
|
+
"balance",
|
|
91
|
+
"tokenDistribution",
|
|
92
|
+
"rollupValidator",
|
|
93
|
+
"rollupBlock",
|
|
94
|
+
"rollup",
|
|
95
|
+
"delegation",
|
|
96
|
+
"stake",
|
|
97
|
+
"tokenFactory",
|
|
98
|
+
"factory",
|
|
99
|
+
"token",
|
|
100
|
+
"asset",
|
|
101
|
+
"account",
|
|
102
|
+
"tx"
|
|
103
|
+
]) await db.schema.dropTable(table).ifExists().execute();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
Object.defineProperty(exports, '_001_genesis_exports', {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
get: function () {
|
|
110
|
+
return _001_genesis_exports;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
exports.down = down;
|
|
114
|
+
exports.up = up;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
//#region src/migrations/001-genesis.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Genesis migration - creates all IndexDB tables
|
|
7
|
+
*/
|
|
8
|
+
declare function up(db: Kysely<unknown>): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Rollback migration - drops all tables
|
|
11
|
+
*/
|
|
12
|
+
declare function down(db: Kysely<unknown>): Promise<void>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { down, up };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_migrations_001_genesis = require('./001-genesis.cjs');
|
|
3
|
+
let kysely = require("kysely");
|
|
4
|
+
|
|
5
|
+
//#region src/migrations/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* Custom migration provider that returns migrations in memory
|
|
8
|
+
* This avoids file system operations and works well with Bun
|
|
9
|
+
*/
|
|
10
|
+
var InMemoryMigrationProvider = class {
|
|
11
|
+
async getMigrations() {
|
|
12
|
+
return { "001-genesis": require_migrations_001_genesis._001_genesis_exports };
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Run all pending migrations
|
|
17
|
+
* @param db - Kysely instance
|
|
18
|
+
*/
|
|
19
|
+
async function runMigrations(db) {
|
|
20
|
+
const { error, results } = await new kysely.Migrator({
|
|
21
|
+
db,
|
|
22
|
+
provider: new InMemoryMigrationProvider()
|
|
23
|
+
}).migrateToLatest();
|
|
24
|
+
if (error) throw error;
|
|
25
|
+
for (const result of results ?? []) if (result.status === "Error") throw new Error(`Migration "${result.migrationName}" failed`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Rollback all migrations
|
|
29
|
+
* @param db - Kysely instance
|
|
30
|
+
*/
|
|
31
|
+
async function rollbackMigrations(db) {
|
|
32
|
+
const migrator = new kysely.Migrator({
|
|
33
|
+
db,
|
|
34
|
+
provider: new InMemoryMigrationProvider()
|
|
35
|
+
});
|
|
36
|
+
const { results } = await migrator.getMigrations();
|
|
37
|
+
const executedMigrations = results?.filter((r) => r.executedAt) ?? [];
|
|
38
|
+
for (let i = executedMigrations.length - 1; i >= 0; i--) {
|
|
39
|
+
const { error } = await migrator.migrateDown();
|
|
40
|
+
if (error) throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
exports.rollbackMigrations = rollbackMigrations;
|
|
46
|
+
exports.runMigrations = runMigrations;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Kysely } from "kysely";
|
|
2
|
+
|
|
3
|
+
//#region src/migrations/index.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Run all pending migrations
|
|
7
|
+
* @param db - Kysely instance
|
|
8
|
+
*/
|
|
9
|
+
declare function runMigrations(db: Kysely<unknown>): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Rollback all migrations
|
|
12
|
+
* @param db - Kysely instance
|
|
13
|
+
*/
|
|
14
|
+
declare function rollbackMigrations(db: Kysely<unknown>): Promise<void>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { rollbackMigrations, runMigrations };
|