@arkade-os/sdk 0.5.2 → 0.5.4
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 +36 -34
- package/dist/adapters/expo.cjs +9 -5
- package/dist/adapters/expo.d.cts +11 -7
- package/dist/adapters/expo.d.ts +11 -7
- package/dist/adapters/expo.js +3 -3
- package/dist/{asyncStorageTaskQueue-DIn7bTqN.d.ts → asyncStorageTaskQueue-DHMIxY04.d.ts} +2 -2
- package/dist/{asyncStorageTaskQueue-BtEc3Qca.d.cts → asyncStorageTaskQueue-DTBa8EH7.d.cts} +2 -2
- package/dist/{chunk-LWRMSC4M.js → chunk-6CUP6ZIF.js} +4 -4
- package/dist/{chunk-LWRMSC4M.js.map → chunk-6CUP6ZIF.js.map} +1 -1
- package/dist/{chunk-HKG26NUT.js → chunk-AG4TFD6F.js} +140 -59
- package/dist/chunk-AG4TFD6F.js.map +1 -0
- package/dist/{chunk-PVFQFQBY.cjs → chunk-B6VNKGIH.cjs} +10 -10
- package/dist/chunk-B6VNKGIH.cjs.map +1 -0
- package/dist/{chunk-U5XG7SWA.js → chunk-BTRCN4JJ.js} +22 -19
- package/dist/chunk-BTRCN4JJ.js.map +1 -0
- package/dist/{chunk-TAIWH3HG.cjs → chunk-DNITZVNG.cjs} +28 -47
- package/dist/chunk-DNITZVNG.cjs.map +1 -0
- package/dist/{chunk-OM6FJ76H.cjs → chunk-E6OOJEHL.cjs} +49 -49
- package/dist/{chunk-OM6FJ76H.cjs.map → chunk-E6OOJEHL.cjs.map} +1 -1
- package/dist/{chunk-2OCYL6BJ.cjs → chunk-F3FAE7VJ.cjs} +850 -652
- package/dist/chunk-F3FAE7VJ.cjs.map +1 -0
- package/dist/{chunk-GGKR4O5X.cjs → chunk-GHUUT54D.cjs} +143 -58
- package/dist/chunk-GHUUT54D.cjs.map +1 -0
- package/dist/{chunk-MOBDJ7U2.js → chunk-MWVAWFX6.js} +4 -4
- package/dist/chunk-MWVAWFX6.js.map +1 -0
- package/dist/{chunk-2QRUQXLS.js → chunk-TUOLZBNC.js} +19 -39
- package/dist/chunk-TUOLZBNC.js.map +1 -0
- package/dist/{chunk-64R7CRKN.cjs → chunk-WXNSISXK.cjs} +37 -34
- package/dist/chunk-WXNSISXK.cjs.map +1 -0
- package/dist/{chunk-AJWXVQYG.js → chunk-ZJHLLDBP.js} +372 -177
- package/dist/chunk-ZJHLLDBP.js.map +1 -0
- package/dist/contracts/handlers/index.cjs +9 -9
- package/dist/contracts/handlers/index.d.cts +3 -3
- package/dist/contracts/handlers/index.d.ts +3 -3
- package/dist/contracts/handlers/index.js +2 -2
- package/dist/{delegate-CaL8EN4Q.d.cts → delegate-f4_t864Z.d.cts} +1 -1
- package/dist/{delegate-Jd4zs88Q.d.ts → delegate-xrSBNybC.d.ts} +1 -1
- package/dist/{index-D-xqVzf8.d.ts → index-BJDz15ms.d.ts} +5 -5
- package/dist/{index-BwdGzNSn.d.cts → index-BjiVGtp8.d.cts} +5 -5
- package/dist/{index-DdKxfC29.d.cts → index-DRwe0UDN.d.cts} +194 -114
- package/dist/{index-DdKxfC29.d.ts → index-DRwe0UDN.d.ts} +194 -114
- package/dist/index.cjs +333 -313
- package/dist/index.d.cts +80 -45
- package/dist/index.d.ts +80 -45
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +65 -36
- package/dist/repositories/realm/index.cjs.map +1 -1
- package/dist/repositories/realm/index.d.cts +7 -3
- package/dist/repositories/realm/index.d.ts +7 -3
- package/dist/repositories/realm/index.js +35 -6
- package/dist/repositories/realm/index.js.map +1 -1
- package/dist/repositories/sqlite/index.cjs +176 -110
- package/dist/repositories/sqlite/index.cjs.map +1 -1
- package/dist/repositories/sqlite/index.d.cts +23 -13
- package/dist/repositories/sqlite/index.d.ts +23 -13
- package/dist/repositories/sqlite/index.js +148 -83
- package/dist/repositories/sqlite/index.js.map +1 -1
- package/dist/{taskRunner-ZyGGjtIq.d.ts → taskRunner-BPPU-YHG.d.cts} +4 -4
- package/dist/{taskRunner-67YSEpsz.d.cts → taskRunner-CDlNeth0.d.ts} +4 -4
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.cjs.map +1 -1
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +7 -7
- package/dist/wallet/expo/background.js.map +1 -1
- package/dist/wallet/expo/index.cjs +18 -15
- package/dist/wallet/expo/index.cjs.map +1 -1
- package/dist/wallet/expo/index.d.cts +7 -6
- package/dist/wallet/expo/index.d.ts +7 -6
- package/dist/wallet/expo/index.js +9 -6
- package/dist/wallet/expo/index.js.map +1 -1
- package/dist/{wallet-bFS7VybL.d.ts → wallet-Oc3Wd5gv.d.ts} +27 -19
- package/dist/{wallet-B8LW7cV1.d.cts → wallet-jVBDQl6R.d.cts} +27 -19
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-2OCYL6BJ.cjs.map +0 -1
- package/dist/chunk-2QRUQXLS.js.map +0 -1
- package/dist/chunk-64R7CRKN.cjs.map +0 -1
- package/dist/chunk-AJWXVQYG.js.map +0 -1
- package/dist/chunk-GGKR4O5X.cjs.map +0 -1
- package/dist/chunk-HKG26NUT.js.map +0 -1
- package/dist/chunk-MOBDJ7U2.js.map +0 -1
- package/dist/chunk-PVFQFQBY.cjs.map +0 -1
- package/dist/chunk-TAIWH3HG.cjs.map +0 -1
- package/dist/chunk-U5XG7SWA.js.map +0 -1
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../../chunk-
|
|
5
|
-
require('../../chunk-
|
|
6
|
-
var
|
|
3
|
+
var chunkF3FAE7VJ_cjs = require('../../chunk-F3FAE7VJ.cjs');
|
|
4
|
+
require('../../chunk-WXNSISXK.cjs');
|
|
5
|
+
require('../../chunk-E6OOJEHL.cjs');
|
|
6
|
+
var chunkGHUUT54D_cjs = require('../../chunk-GHUUT54D.cjs');
|
|
7
7
|
|
|
8
8
|
// src/repositories/realm/walletRepository.ts
|
|
9
9
|
var RealmWalletRepository = class {
|
|
10
|
-
|
|
10
|
+
/** persistentWalletState is the caller's backing-store assertion, not adapter detection. */
|
|
11
|
+
constructor(realm, options) {
|
|
11
12
|
this.realm = realm;
|
|
13
|
+
if (options?.persistentWalletState === true) {
|
|
14
|
+
this.atomicWalletState = { ...this.atomicWalletState, persistent: true };
|
|
15
|
+
}
|
|
12
16
|
}
|
|
13
17
|
realm;
|
|
14
18
|
version = 2;
|
|
@@ -35,7 +39,7 @@ var RealmWalletRepository = class {
|
|
|
35
39
|
await this.ensureInit();
|
|
36
40
|
this.realm.write(() => {
|
|
37
41
|
for (const vtxo of vtxos) {
|
|
38
|
-
const s =
|
|
42
|
+
const s = chunkF3FAE7VJ_cjs.serializeVtxo(vtxo);
|
|
39
43
|
this.realm.create(
|
|
40
44
|
"ArkVtxo",
|
|
41
45
|
{
|
|
@@ -50,7 +54,7 @@ var RealmWalletRepository = class {
|
|
|
50
54
|
intentCb: s.intentTapLeafScript.cb,
|
|
51
55
|
intentS: s.intentTapLeafScript.s,
|
|
52
56
|
statusJson: JSON.stringify(s.status),
|
|
53
|
-
createdAt:
|
|
57
|
+
createdAt: chunkF3FAE7VJ_cjs.createdAtToIso(s.createdAt),
|
|
54
58
|
isUnrolled: s.isUnrolled ?? false,
|
|
55
59
|
isSpent: s.isSpent === void 0 ? null : s.isSpent,
|
|
56
60
|
isSwept: s.isSwept === void 0 ? null : s.isSwept,
|
|
@@ -74,7 +78,7 @@ var RealmWalletRepository = class {
|
|
|
74
78
|
return this.deleteWhere("ArkVtxo", "address", address);
|
|
75
79
|
}
|
|
76
80
|
async getVtxosForScriptPage(script, page, options) {
|
|
77
|
-
|
|
81
|
+
chunkF3FAE7VJ_cjs.assertPageRequest(page);
|
|
78
82
|
await this.ensureInit();
|
|
79
83
|
let results = this.realm.objects("ArkVtxo").filtered("script == $0", script);
|
|
80
84
|
if (options?.unspentOnly) {
|
|
@@ -101,15 +105,15 @@ var RealmWalletRepository = class {
|
|
|
101
105
|
rows.push({ address: row.address, vtxo: vtxoObjectToDomain(row) });
|
|
102
106
|
if (rows.length > page.limit) break;
|
|
103
107
|
}
|
|
104
|
-
const result =
|
|
108
|
+
const result = chunkF3FAE7VJ_cjs.pageResult(rows, page.limit, (row) => ({
|
|
105
109
|
address: row.address,
|
|
106
110
|
txid: row.vtxo.txid,
|
|
107
111
|
vout: row.vtxo.vout
|
|
108
112
|
}));
|
|
109
|
-
return options?.unspentOnly ? { ...result, items: result.items.filter((row) => !
|
|
113
|
+
return options?.unspentOnly ? { ...result, items: result.items.filter((row) => !chunkGHUUT54D_cjs.isVtxoSpent(row.vtxo)) } : result;
|
|
110
114
|
}
|
|
111
115
|
async saveVtxosForScript(key, vtxos) {
|
|
112
|
-
return this.saveVtxos(
|
|
116
|
+
return this.saveVtxos(chunkF3FAE7VJ_cjs.checkSaveVtxosForScript("RealmWalletRepository", key, vtxos), vtxos);
|
|
113
117
|
}
|
|
114
118
|
async deleteVtxosForScript(script) {
|
|
115
119
|
return this.deleteWhere("ArkVtxo", "script", script);
|
|
@@ -119,7 +123,7 @@ var RealmWalletRepository = class {
|
|
|
119
123
|
return this.pageByAddress("ArkUtxo", address, page, utxoObjectToDomain);
|
|
120
124
|
}
|
|
121
125
|
async pageByAddress(schema, address, page, deserialize) {
|
|
122
|
-
|
|
126
|
+
chunkF3FAE7VJ_cjs.assertPageRequest(page);
|
|
123
127
|
await this.ensureInit();
|
|
124
128
|
let results = this.realm.objects(schema).filtered("address == $0", address);
|
|
125
129
|
if (page.after) {
|
|
@@ -137,18 +141,18 @@ var RealmWalletRepository = class {
|
|
|
137
141
|
rows.push({ key: { txid: row.txid, vout: row.vout }, item: deserialize(row) });
|
|
138
142
|
if (rows.length > page.limit) break;
|
|
139
143
|
}
|
|
140
|
-
const result =
|
|
144
|
+
const result = chunkF3FAE7VJ_cjs.pageResult(rows, page.limit, (row) => row.key);
|
|
141
145
|
return { items: result.items.map((row) => row.item), nextCursor: result.nextCursor };
|
|
142
146
|
}
|
|
143
147
|
async saveUtxos(addressOrBatch, utxos) {
|
|
144
148
|
await this.ensureInit();
|
|
145
|
-
const rows =
|
|
149
|
+
const rows = chunkF3FAE7VJ_cjs.utxoEntries(addressOrBatch, utxos).flatMap(
|
|
146
150
|
([address, list]) => list.map((utxo) => ({ address, utxo }))
|
|
147
151
|
);
|
|
148
152
|
if (rows.length === 0) return;
|
|
149
153
|
this.realm.write(() => {
|
|
150
154
|
for (const { address, utxo } of rows) {
|
|
151
|
-
const s =
|
|
155
|
+
const s = chunkF3FAE7VJ_cjs.serializeUtxo(utxo);
|
|
152
156
|
this.realm.create(
|
|
153
157
|
"ArkUtxo",
|
|
154
158
|
{
|
|
@@ -175,8 +179,8 @@ var RealmWalletRepository = class {
|
|
|
175
179
|
}
|
|
176
180
|
// ── Transaction history ────────────────────────────────────────────
|
|
177
181
|
async getTransactionHistoryPage(filter, page) {
|
|
178
|
-
|
|
179
|
-
|
|
182
|
+
chunkF3FAE7VJ_cjs.assertPageRequest(page);
|
|
183
|
+
chunkF3FAE7VJ_cjs.assertHistoryPageFilter(filter);
|
|
180
184
|
let results = this.realm.objects("ArkTransaction").filtered("address == $0", filter.address);
|
|
181
185
|
results = results.filtered(
|
|
182
186
|
"createdAt >= $0",
|
|
@@ -190,12 +194,12 @@ var RealmWalletRepository = class {
|
|
|
190
194
|
["arkTxid", false]
|
|
191
195
|
])) {
|
|
192
196
|
const tx = txObjectToDomain(row);
|
|
193
|
-
if (page.after !== void 0 &&
|
|
197
|
+
if (page.after !== void 0 && chunkF3FAE7VJ_cjs.compareHistoryCursors({ createdAt: tx.createdAt, key: tx.key }, page.after) <= 0)
|
|
194
198
|
continue;
|
|
195
199
|
rows.push(tx);
|
|
196
200
|
if (rows.length > page.limit) break;
|
|
197
201
|
}
|
|
198
|
-
return
|
|
202
|
+
return chunkF3FAE7VJ_cjs.pageResult(rows, page.limit, (tx) => ({ createdAt: tx.createdAt, key: tx.key }));
|
|
199
203
|
}
|
|
200
204
|
async saveTransactions(address, txs) {
|
|
201
205
|
await this.ensureInit();
|
|
@@ -213,7 +217,7 @@ var RealmWalletRepository = class {
|
|
|
213
217
|
amount: tx.amount,
|
|
214
218
|
settled: tx.settled,
|
|
215
219
|
createdAt: tx.createdAt,
|
|
216
|
-
assetsJson: tx.assets ? JSON.stringify(
|
|
220
|
+
assetsJson: tx.assets ? JSON.stringify(chunkF3FAE7VJ_cjs.serializeAssets(tx.assets)) : null
|
|
217
221
|
},
|
|
218
222
|
"modified"
|
|
219
223
|
);
|
|
@@ -231,6 +235,31 @@ var RealmWalletRepository = class {
|
|
|
231
235
|
});
|
|
232
236
|
}
|
|
233
237
|
// ── Wallet state ───────────────────────────────────────────────────
|
|
238
|
+
atomicWalletState = {
|
|
239
|
+
version: 1,
|
|
240
|
+
update: async (updater) => {
|
|
241
|
+
await this.ensureInit();
|
|
242
|
+
this.realm.write(() => {
|
|
243
|
+
const row = [
|
|
244
|
+
...this.realm.objects("ArkWalletState").filtered("key == $0", "state")
|
|
245
|
+
][0];
|
|
246
|
+
const current = row ? {
|
|
247
|
+
settings: row.settingsJson ? JSON.parse(row.settingsJson) : void 0,
|
|
248
|
+
lastSyncTime: row.lastSyncTime ?? void 0
|
|
249
|
+
} : {};
|
|
250
|
+
const state = chunkF3FAE7VJ_cjs.applyWalletStateUpdate(current, updater);
|
|
251
|
+
this.realm.create(
|
|
252
|
+
"ArkWalletState",
|
|
253
|
+
{
|
|
254
|
+
key: "state",
|
|
255
|
+
lastSyncTime: state.lastSyncTime,
|
|
256
|
+
settingsJson: state.settings ? JSON.stringify(state.settings) : null
|
|
257
|
+
},
|
|
258
|
+
"modified"
|
|
259
|
+
);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
};
|
|
234
263
|
async getWalletState() {
|
|
235
264
|
await this.ensureInit();
|
|
236
265
|
const results = this.realm.objects("ArkWalletState").filtered("key == $0", "state");
|
|
@@ -290,9 +319,9 @@ function vtxoObjectToDomain(obj) {
|
|
|
290
319
|
// Post-migration every row has `script`, but the backfill is
|
|
291
320
|
// idempotent: derive from `address` if the legacy column is still
|
|
292
321
|
// null (e.g. the migration hasn't run yet on this handle).
|
|
293
|
-
script: obj.script ??
|
|
322
|
+
script: obj.script ?? chunkF3FAE7VJ_cjs.scriptFromArkAddress(obj.address)
|
|
294
323
|
};
|
|
295
|
-
return
|
|
324
|
+
return chunkF3FAE7VJ_cjs.deserializeVtxo(serialized);
|
|
296
325
|
}
|
|
297
326
|
function utxoObjectToDomain(obj) {
|
|
298
327
|
const serialized = {
|
|
@@ -311,7 +340,7 @@ function utxoObjectToDomain(obj) {
|
|
|
311
340
|
status: JSON.parse(obj.statusJson),
|
|
312
341
|
extraWitness: obj.extraWitnessJson ? JSON.parse(obj.extraWitnessJson) : void 0
|
|
313
342
|
};
|
|
314
|
-
return
|
|
343
|
+
return chunkF3FAE7VJ_cjs.deserializeUtxo(serialized);
|
|
315
344
|
}
|
|
316
345
|
function txObjectToDomain(obj) {
|
|
317
346
|
const tx = {
|
|
@@ -326,7 +355,7 @@ function txObjectToDomain(obj) {
|
|
|
326
355
|
createdAt: obj.createdAt
|
|
327
356
|
};
|
|
328
357
|
if (obj.assetsJson) {
|
|
329
|
-
tx.assets =
|
|
358
|
+
tx.assets = chunkF3FAE7VJ_cjs.deserializeAssets(JSON.parse(obj.assetsJson));
|
|
330
359
|
}
|
|
331
360
|
return tx;
|
|
332
361
|
}
|
|
@@ -352,9 +381,9 @@ var RealmContractRepository = class {
|
|
|
352
381
|
}
|
|
353
382
|
// ── Contract management ────────────────────────────────────────────
|
|
354
383
|
async getContractsPage(filter, page) {
|
|
355
|
-
|
|
356
|
-
if (
|
|
357
|
-
const toPage = (rows) =>
|
|
384
|
+
chunkF3FAE7VJ_cjs.assertPageRequest(page);
|
|
385
|
+
if (chunkF3FAE7VJ_cjs.contractFilterMatchesNothing(filter)) return { items: [] };
|
|
386
|
+
const toPage = (rows) => chunkF3FAE7VJ_cjs.pageResult(rows.map(contractObjectToDomain), page.limit, (contract) => contract.script);
|
|
358
387
|
if (filter?.watch === void 0 || filter.script !== void 0) {
|
|
359
388
|
return toPage(this.readRows(filter, page));
|
|
360
389
|
}
|
|
@@ -512,7 +541,7 @@ var RealmIntentRepository = class {
|
|
|
512
541
|
const clashes = [
|
|
513
542
|
...this.realm.objects("ArkIntent").filtered("intentId == $0", intent.intentId)
|
|
514
543
|
].map(toIntent);
|
|
515
|
-
|
|
544
|
+
chunkF3FAE7VJ_cjs.assertIntentIdUnique(intent, clashes);
|
|
516
545
|
}
|
|
517
546
|
this.realm.create(
|
|
518
547
|
"ArkIntent",
|
|
@@ -540,22 +569,22 @@ var RealmIntentRepository = class {
|
|
|
540
569
|
});
|
|
541
570
|
}
|
|
542
571
|
async getIntentsPage(filter, page) {
|
|
543
|
-
|
|
572
|
+
chunkF3FAE7VJ_cjs.assertPageRequest(page);
|
|
544
573
|
let results = this.realm.objects("ArkIntent");
|
|
545
574
|
if (page.after !== void 0) results = results.filtered("intentTxId > $0", page.after);
|
|
546
575
|
const rows = [];
|
|
547
576
|
for (const row of results.sorted("intentTxId")) {
|
|
548
577
|
const intent = toIntent(row);
|
|
549
|
-
if (filter && !
|
|
578
|
+
if (filter && !chunkF3FAE7VJ_cjs.intentMatchesFilter(intent, filter)) continue;
|
|
550
579
|
rows.push(intent);
|
|
551
580
|
if (rows.length > page.limit) break;
|
|
552
581
|
}
|
|
553
|
-
return
|
|
582
|
+
return chunkF3FAE7VJ_cjs.pageResult(rows, page.limit, (intent) => intent.intentTxId);
|
|
554
583
|
}
|
|
555
584
|
async getLockedVtxoOutpoints() {
|
|
556
585
|
const out = [];
|
|
557
586
|
for (const o of [...this.realm.objects("ArkIntent")].map(toIntent))
|
|
558
|
-
if (!
|
|
587
|
+
if (!chunkF3FAE7VJ_cjs.isTerminalIntentState(o.state)) out.push(...o.intentVtxos);
|
|
559
588
|
return out;
|
|
560
589
|
}
|
|
561
590
|
async [Symbol.asyncDispose]() {
|
|
@@ -597,7 +626,7 @@ var RealmVirtualTxRepository = class {
|
|
|
597
626
|
txid: t.txid,
|
|
598
627
|
psbt: t.psbt ?? prev?.psbt ?? null,
|
|
599
628
|
expiresAt: t.expiresAt ?? prev?.expiresAt ?? null,
|
|
600
|
-
type:
|
|
629
|
+
type: chunkF3FAE7VJ_cjs.mergeChainedTxType(t.type, prev?.type)
|
|
601
630
|
},
|
|
602
631
|
"modified"
|
|
603
632
|
);
|
|
@@ -842,9 +871,9 @@ function runArkRealmMigrations(oldRealm, newRealm) {
|
|
|
842
871
|
for (let i = 0; i < newVtxos.length; i++) {
|
|
843
872
|
const newVtxo = newVtxos[i];
|
|
844
873
|
if (!newVtxo.script) {
|
|
845
|
-
newVtxo.script =
|
|
874
|
+
newVtxo.script = chunkF3FAE7VJ_cjs.scriptFromArkAddress(newVtxo.address);
|
|
846
875
|
}
|
|
847
|
-
const facts =
|
|
876
|
+
const facts = chunkF3FAE7VJ_cjs.legacyVtxoFacts(legacyByPk.get(newVtxo.pk));
|
|
848
877
|
if (facts) {
|
|
849
878
|
if (newVtxo.isSpent == null) newVtxo.isSpent = facts.isSpent;
|
|
850
879
|
if (newVtxo.isSwept == null) newVtxo.isSwept = facts.isSwept;
|
|
@@ -874,7 +903,7 @@ function runArkRealmMigrations(oldRealm, newRealm) {
|
|
|
874
903
|
|
|
875
904
|
Object.defineProperty(exports, "ChainedTxType", {
|
|
876
905
|
enumerable: true,
|
|
877
|
-
get: function () { return
|
|
906
|
+
get: function () { return chunkF3FAE7VJ_cjs.ChainedTxType; }
|
|
878
907
|
});
|
|
879
908
|
exports.ARK_REALM_SCHEMA_VERSION = ARK_REALM_SCHEMA_VERSION;
|
|
880
909
|
exports.ArkExperimentalRealmSchemas = ArkExperimentalRealmSchemas;
|