@arkade-os/swap 0.0.7 → 0.0.9
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 +276 -12
- package/dist/{chunk-ZDTRQZE2.js → chunk-2FEMUOIH.js} +83 -57
- package/dist/{chunk-WGRU2DBF.js → chunk-6ZUS47GA.js} +15 -1
- package/dist/index.cjs +1155 -443
- package/dist/index.d.cts +293 -1140
- package/dist/index.d.ts +293 -1140
- package/dist/index.js +761 -87
- package/dist/nostr.cjs +1 -0
- package/dist/nostr.d.cts +1 -1
- package/dist/nostr.d.ts +1 -1
- package/dist/nostr.js +1 -1
- package/dist/repositories/realm/index.cjs +49 -5
- package/dist/repositories/realm/index.d.cts +28 -6
- package/dist/repositories/realm/index.d.ts +28 -6
- package/dist/repositories/realm/index.js +50 -6
- package/dist/repositories/sqlite/index.cjs +45 -4
- package/dist/repositories/sqlite/index.d.cts +20 -7
- package/dist/repositories/sqlite/index.d.ts +20 -7
- package/dist/repositories/sqlite/index.js +46 -5
- package/dist/repository-DEHLtD9l.d.cts +1862 -0
- package/dist/repository-DIAr5XYk.d.ts +1862 -0
- package/dist/{rfq-DfT9dAss.d.cts → rfq-hbzhTWHT.d.cts} +71 -3
- package/dist/{rfq-DfT9dAss.d.ts → rfq-hbzhTWHT.d.ts} +71 -3
- package/package.json +3 -2
- package/dist/repository-BwnZ8N62.d.cts +0 -236
- package/dist/repository-BwnZ8N62.d.ts +0 -236
package/dist/nostr.cjs
CHANGED
|
@@ -62,6 +62,7 @@ var import_sdk3 = require("@arkade-os/sdk");
|
|
|
62
62
|
|
|
63
63
|
// src/claimPacket.ts
|
|
64
64
|
var import_base2 = require("@scure/base");
|
|
65
|
+
var import_aes = require("@noble/ciphers/aes.js");
|
|
65
66
|
var import_secp256k1 = require("@noble/curves/secp256k1.js");
|
|
66
67
|
var import_hkdf = require("@noble/hashes/hkdf.js");
|
|
67
68
|
var import_sha22 = require("@noble/hashes/sha2.js");
|
package/dist/nostr.d.cts
CHANGED
package/dist/nostr.d.ts
CHANGED
package/dist/nostr.js
CHANGED
|
@@ -33,6 +33,7 @@ var marketsCacheKey = (network, registry) => `arkade-intents-markets-${network}-
|
|
|
33
33
|
|
|
34
34
|
// src/repositories/realm/repository.ts
|
|
35
35
|
var SWAPS = "ArkadeAssetSwap";
|
|
36
|
+
var RFQ_SWAPS = "ArkadeRfqSwap";
|
|
36
37
|
var SCANNED = "ArkadeAssetSwapScannedTxid";
|
|
37
38
|
var MARKETS = "ArkadeAssetSwapMarketsCache";
|
|
38
39
|
var RealmAssetSwapRepository = class {
|
|
@@ -40,7 +41,7 @@ var RealmAssetSwapRepository = class {
|
|
|
40
41
|
this.realm = realm;
|
|
41
42
|
}
|
|
42
43
|
realm;
|
|
43
|
-
version =
|
|
44
|
+
version = 4;
|
|
44
45
|
async saveSwap(swap) {
|
|
45
46
|
this.realm.write(() => {
|
|
46
47
|
this.realm.create(
|
|
@@ -60,6 +61,38 @@ var RealmAssetSwapRepository = class {
|
|
|
60
61
|
(o) => JSON.parse(o.data)
|
|
61
62
|
);
|
|
62
63
|
}
|
|
64
|
+
async saveRfqSwap(record) {
|
|
65
|
+
this.realm.write(() => {
|
|
66
|
+
this.realm.create(
|
|
67
|
+
RFQ_SWAPS,
|
|
68
|
+
{
|
|
69
|
+
rfqId: record.rfqId,
|
|
70
|
+
state: record.state,
|
|
71
|
+
updatedAt: record.updatedAt,
|
|
72
|
+
data: JSON.stringify(record)
|
|
73
|
+
},
|
|
74
|
+
"modified"
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async getRfqSwap(rfqId) {
|
|
79
|
+
const [found] = [
|
|
80
|
+
...this.realm.objects(RFQ_SWAPS).filtered("rfqId == $0", rfqId)
|
|
81
|
+
];
|
|
82
|
+
return found ? JSON.parse(found.data) : void 0;
|
|
83
|
+
}
|
|
84
|
+
async getAllRfqSwaps() {
|
|
85
|
+
return [...this.realm.objects(RFQ_SWAPS)].map(
|
|
86
|
+
(o) => JSON.parse(o.data)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
async removeRfqSwap(rfqId) {
|
|
90
|
+
this.realm.write(() => {
|
|
91
|
+
this.realm.delete(
|
|
92
|
+
this.realm.objects(RFQ_SWAPS).filtered("rfqId == $0", rfqId)
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
63
96
|
async getScannedTxids() {
|
|
64
97
|
return new Set([...this.realm.objects(SCANNED)].map((o) => o.txid));
|
|
65
98
|
}
|
|
@@ -83,12 +116,12 @@ var RealmAssetSwapRepository = class {
|
|
|
83
116
|
);
|
|
84
117
|
});
|
|
85
118
|
}
|
|
86
|
-
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
119
|
+
/** Every schema in one write: clearing swaps but keeping scanned txids would
|
|
120
|
+
* leave the restore scan permanently skipping those funding txs, so a
|
|
121
|
+
* partial clear must not be observable. */
|
|
89
122
|
async clear() {
|
|
90
123
|
this.realm.write(() => {
|
|
91
|
-
for (const name of [SWAPS, SCANNED, MARKETS]) {
|
|
124
|
+
for (const name of [SWAPS, RFQ_SWAPS, SCANNED, MARKETS]) {
|
|
92
125
|
this.realm.delete(this.realm.objects(name));
|
|
93
126
|
}
|
|
94
127
|
});
|
|
@@ -123,7 +156,18 @@ var ArkadeAssetSwapMarketsCacheSchema = {
|
|
|
123
156
|
data: "string"
|
|
124
157
|
}
|
|
125
158
|
};
|
|
159
|
+
var ArkadeRfqSwapSchema = {
|
|
160
|
+
name: "ArkadeRfqSwap",
|
|
161
|
+
primaryKey: "rfqId",
|
|
162
|
+
properties: {
|
|
163
|
+
rfqId: "string",
|
|
164
|
+
state: "string",
|
|
165
|
+
updatedAt: "int",
|
|
166
|
+
data: "string"
|
|
167
|
+
}
|
|
168
|
+
};
|
|
126
169
|
var AssetSwapRealmSchemas = [
|
|
170
|
+
ArkadeRfqSwapSchema,
|
|
127
171
|
ArkadeAssetSwapSchema,
|
|
128
172
|
ArkadeAssetSwapScannedTxidSchema,
|
|
129
173
|
ArkadeAssetSwapMarketsCacheSchema
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { RealmLike } from '@arkade-os/sdk/repositories/realm';
|
|
2
|
-
import { A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry } from '../../repository-
|
|
2
|
+
import { A as AssetSwapRepository, a as AssetSwap, R as RfqSwapRecord, M as MarketsCacheEntry } from '../../repository-DEHLtD9l.cjs';
|
|
3
3
|
import '@arkade-os/solver-discovery';
|
|
4
4
|
import '@arkade-os/sdk';
|
|
5
|
+
import '../../rfq-hbzhTWHT.cjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Realm backend for React Native.
|
|
@@ -15,24 +16,31 @@ import '@arkade-os/sdk';
|
|
|
15
16
|
* record can be dropped. That holds for JSON-safe values: a consumer-added
|
|
16
17
|
* `Date` comes back a string and a `bigint` throws on save, unlike the
|
|
17
18
|
* IndexedDB backend's structured clone. `AssetSwap` itself is JSON-safe by
|
|
18
|
-
* design
|
|
19
|
+
* design, and so is `RfqSwapRecord` — including its corridor `profile`, which is
|
|
20
|
+
* plain JSON by the handler contract (see `rfqCorridor.ts`). Whole-record
|
|
21
|
+
* storage is what keeps a nested `profile.hashlock` from being lost the way a
|
|
22
|
+
* field-mapped backend could lose it.
|
|
19
23
|
*
|
|
20
24
|
* Realm creates the schemas on open, so there is nothing to initialise. The
|
|
21
25
|
* consumer owns the Realm lifecycle — `[Symbol.asyncDispose]` is a no-op.
|
|
22
26
|
*/
|
|
23
27
|
declare class RealmAssetSwapRepository implements AssetSwapRepository {
|
|
24
28
|
private readonly realm;
|
|
25
|
-
readonly version:
|
|
29
|
+
readonly version: 4;
|
|
26
30
|
constructor(realm: RealmLike);
|
|
27
31
|
saveSwap(swap: AssetSwap): Promise<void>;
|
|
28
32
|
getAllSwaps(): Promise<AssetSwap[]>;
|
|
33
|
+
saveRfqSwap(record: RfqSwapRecord): Promise<void>;
|
|
34
|
+
getRfqSwap(rfqId: string): Promise<RfqSwapRecord | undefined>;
|
|
35
|
+
getAllRfqSwaps(): Promise<RfqSwapRecord[]>;
|
|
36
|
+
removeRfqSwap(rfqId: string): Promise<void>;
|
|
29
37
|
getScannedTxids(): Promise<Set<string>>;
|
|
30
38
|
markTxidsScanned(txids: Iterable<string>): Promise<void>;
|
|
31
39
|
getCachedMarkets(network: string, registry: string): Promise<MarketsCacheEntry | undefined>;
|
|
32
40
|
saveCachedMarkets(network: string, registry: string, entry: MarketsCacheEntry): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
41
|
+
/** Every schema in one write: clearing swaps but keeping scanned txids would
|
|
42
|
+
* leave the restore scan permanently skipping those funding txs, so a
|
|
43
|
+
* partial clear must not be observable. */
|
|
36
44
|
clear(): Promise<void>;
|
|
37
45
|
[Symbol.asyncDispose](): Promise<void>;
|
|
38
46
|
}
|
|
@@ -50,6 +58,11 @@ declare class RealmAssetSwapRepository implements AssetSwapRepository {
|
|
|
50
58
|
* objects conforming to Realm's ObjectSchema shape. They are new, so a consumer
|
|
51
59
|
* adds them to its Realm config and bumps its own `schemaVersion`; no migration
|
|
52
60
|
* helper ships here.
|
|
61
|
+
*
|
|
62
|
+
* `ArkadeRfqSwap` arrived after the first three. A consumer already shipping
|
|
63
|
+
* those has to add it and bump `schemaVersion` again — Realm creates schemas on
|
|
64
|
+
* open, so a config that lists three while the code reads four fails on the
|
|
65
|
+
* fourth `realm.objects(…)` rather than at open.
|
|
53
66
|
*/
|
|
54
67
|
declare const ArkadeAssetSwapSchema: {
|
|
55
68
|
name: string;
|
|
@@ -98,6 +111,15 @@ declare const AssetSwapRealmSchemas: ({
|
|
|
98
111
|
key: string;
|
|
99
112
|
data: string;
|
|
100
113
|
};
|
|
114
|
+
} | {
|
|
115
|
+
name: string;
|
|
116
|
+
primaryKey: string;
|
|
117
|
+
properties: {
|
|
118
|
+
rfqId: string;
|
|
119
|
+
state: string;
|
|
120
|
+
updatedAt: string;
|
|
121
|
+
data: string;
|
|
122
|
+
};
|
|
101
123
|
})[];
|
|
102
124
|
|
|
103
125
|
export { ArkadeAssetSwapMarketsCacheSchema, ArkadeAssetSwapScannedTxidSchema, ArkadeAssetSwapSchema, AssetSwapRealmSchemas, RealmAssetSwapRepository };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { RealmLike } from '@arkade-os/sdk/repositories/realm';
|
|
2
|
-
import { A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry } from '../../repository-
|
|
2
|
+
import { A as AssetSwapRepository, a as AssetSwap, R as RfqSwapRecord, M as MarketsCacheEntry } from '../../repository-DIAr5XYk.js';
|
|
3
3
|
import '@arkade-os/solver-discovery';
|
|
4
4
|
import '@arkade-os/sdk';
|
|
5
|
+
import '../../rfq-hbzhTWHT.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Realm backend for React Native.
|
|
@@ -15,24 +16,31 @@ import '@arkade-os/sdk';
|
|
|
15
16
|
* record can be dropped. That holds for JSON-safe values: a consumer-added
|
|
16
17
|
* `Date` comes back a string and a `bigint` throws on save, unlike the
|
|
17
18
|
* IndexedDB backend's structured clone. `AssetSwap` itself is JSON-safe by
|
|
18
|
-
* design
|
|
19
|
+
* design, and so is `RfqSwapRecord` — including its corridor `profile`, which is
|
|
20
|
+
* plain JSON by the handler contract (see `rfqCorridor.ts`). Whole-record
|
|
21
|
+
* storage is what keeps a nested `profile.hashlock` from being lost the way a
|
|
22
|
+
* field-mapped backend could lose it.
|
|
19
23
|
*
|
|
20
24
|
* Realm creates the schemas on open, so there is nothing to initialise. The
|
|
21
25
|
* consumer owns the Realm lifecycle — `[Symbol.asyncDispose]` is a no-op.
|
|
22
26
|
*/
|
|
23
27
|
declare class RealmAssetSwapRepository implements AssetSwapRepository {
|
|
24
28
|
private readonly realm;
|
|
25
|
-
readonly version:
|
|
29
|
+
readonly version: 4;
|
|
26
30
|
constructor(realm: RealmLike);
|
|
27
31
|
saveSwap(swap: AssetSwap): Promise<void>;
|
|
28
32
|
getAllSwaps(): Promise<AssetSwap[]>;
|
|
33
|
+
saveRfqSwap(record: RfqSwapRecord): Promise<void>;
|
|
34
|
+
getRfqSwap(rfqId: string): Promise<RfqSwapRecord | undefined>;
|
|
35
|
+
getAllRfqSwaps(): Promise<RfqSwapRecord[]>;
|
|
36
|
+
removeRfqSwap(rfqId: string): Promise<void>;
|
|
29
37
|
getScannedTxids(): Promise<Set<string>>;
|
|
30
38
|
markTxidsScanned(txids: Iterable<string>): Promise<void>;
|
|
31
39
|
getCachedMarkets(network: string, registry: string): Promise<MarketsCacheEntry | undefined>;
|
|
32
40
|
saveCachedMarkets(network: string, registry: string, entry: MarketsCacheEntry): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
41
|
+
/** Every schema in one write: clearing swaps but keeping scanned txids would
|
|
42
|
+
* leave the restore scan permanently skipping those funding txs, so a
|
|
43
|
+
* partial clear must not be observable. */
|
|
36
44
|
clear(): Promise<void>;
|
|
37
45
|
[Symbol.asyncDispose](): Promise<void>;
|
|
38
46
|
}
|
|
@@ -50,6 +58,11 @@ declare class RealmAssetSwapRepository implements AssetSwapRepository {
|
|
|
50
58
|
* objects conforming to Realm's ObjectSchema shape. They are new, so a consumer
|
|
51
59
|
* adds them to its Realm config and bumps its own `schemaVersion`; no migration
|
|
52
60
|
* helper ships here.
|
|
61
|
+
*
|
|
62
|
+
* `ArkadeRfqSwap` arrived after the first three. A consumer already shipping
|
|
63
|
+
* those has to add it and bump `schemaVersion` again — Realm creates schemas on
|
|
64
|
+
* open, so a config that lists three while the code reads four fails on the
|
|
65
|
+
* fourth `realm.objects(…)` rather than at open.
|
|
53
66
|
*/
|
|
54
67
|
declare const ArkadeAssetSwapSchema: {
|
|
55
68
|
name: string;
|
|
@@ -98,6 +111,15 @@ declare const AssetSwapRealmSchemas: ({
|
|
|
98
111
|
key: string;
|
|
99
112
|
data: string;
|
|
100
113
|
};
|
|
114
|
+
} | {
|
|
115
|
+
name: string;
|
|
116
|
+
primaryKey: string;
|
|
117
|
+
properties: {
|
|
118
|
+
rfqId: string;
|
|
119
|
+
state: string;
|
|
120
|
+
updatedAt: string;
|
|
121
|
+
data: string;
|
|
122
|
+
};
|
|
101
123
|
})[];
|
|
102
124
|
|
|
103
125
|
export { ArkadeAssetSwapMarketsCacheSchema, ArkadeAssetSwapScannedTxidSchema, ArkadeAssetSwapSchema, AssetSwapRealmSchemas, RealmAssetSwapRepository };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
marketsCacheKey
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-6ZUS47GA.js";
|
|
4
4
|
|
|
5
5
|
// src/repositories/realm/repository.ts
|
|
6
6
|
var SWAPS = "ArkadeAssetSwap";
|
|
7
|
+
var RFQ_SWAPS = "ArkadeRfqSwap";
|
|
7
8
|
var SCANNED = "ArkadeAssetSwapScannedTxid";
|
|
8
9
|
var MARKETS = "ArkadeAssetSwapMarketsCache";
|
|
9
10
|
var RealmAssetSwapRepository = class {
|
|
@@ -11,7 +12,7 @@ var RealmAssetSwapRepository = class {
|
|
|
11
12
|
this.realm = realm;
|
|
12
13
|
}
|
|
13
14
|
realm;
|
|
14
|
-
version =
|
|
15
|
+
version = 4;
|
|
15
16
|
async saveSwap(swap) {
|
|
16
17
|
this.realm.write(() => {
|
|
17
18
|
this.realm.create(
|
|
@@ -31,6 +32,38 @@ var RealmAssetSwapRepository = class {
|
|
|
31
32
|
(o) => JSON.parse(o.data)
|
|
32
33
|
);
|
|
33
34
|
}
|
|
35
|
+
async saveRfqSwap(record) {
|
|
36
|
+
this.realm.write(() => {
|
|
37
|
+
this.realm.create(
|
|
38
|
+
RFQ_SWAPS,
|
|
39
|
+
{
|
|
40
|
+
rfqId: record.rfqId,
|
|
41
|
+
state: record.state,
|
|
42
|
+
updatedAt: record.updatedAt,
|
|
43
|
+
data: JSON.stringify(record)
|
|
44
|
+
},
|
|
45
|
+
"modified"
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async getRfqSwap(rfqId) {
|
|
50
|
+
const [found] = [
|
|
51
|
+
...this.realm.objects(RFQ_SWAPS).filtered("rfqId == $0", rfqId)
|
|
52
|
+
];
|
|
53
|
+
return found ? JSON.parse(found.data) : void 0;
|
|
54
|
+
}
|
|
55
|
+
async getAllRfqSwaps() {
|
|
56
|
+
return [...this.realm.objects(RFQ_SWAPS)].map(
|
|
57
|
+
(o) => JSON.parse(o.data)
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
async removeRfqSwap(rfqId) {
|
|
61
|
+
this.realm.write(() => {
|
|
62
|
+
this.realm.delete(
|
|
63
|
+
this.realm.objects(RFQ_SWAPS).filtered("rfqId == $0", rfqId)
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
34
67
|
async getScannedTxids() {
|
|
35
68
|
return new Set([...this.realm.objects(SCANNED)].map((o) => o.txid));
|
|
36
69
|
}
|
|
@@ -54,12 +87,12 @@ var RealmAssetSwapRepository = class {
|
|
|
54
87
|
);
|
|
55
88
|
});
|
|
56
89
|
}
|
|
57
|
-
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
90
|
+
/** Every schema in one write: clearing swaps but keeping scanned txids would
|
|
91
|
+
* leave the restore scan permanently skipping those funding txs, so a
|
|
92
|
+
* partial clear must not be observable. */
|
|
60
93
|
async clear() {
|
|
61
94
|
this.realm.write(() => {
|
|
62
|
-
for (const name of [SWAPS, SCANNED, MARKETS]) {
|
|
95
|
+
for (const name of [SWAPS, RFQ_SWAPS, SCANNED, MARKETS]) {
|
|
63
96
|
this.realm.delete(this.realm.objects(name));
|
|
64
97
|
}
|
|
65
98
|
});
|
|
@@ -94,7 +127,18 @@ var ArkadeAssetSwapMarketsCacheSchema = {
|
|
|
94
127
|
data: "string"
|
|
95
128
|
}
|
|
96
129
|
};
|
|
130
|
+
var ArkadeRfqSwapSchema = {
|
|
131
|
+
name: "ArkadeRfqSwap",
|
|
132
|
+
primaryKey: "rfqId",
|
|
133
|
+
properties: {
|
|
134
|
+
rfqId: "string",
|
|
135
|
+
state: "string",
|
|
136
|
+
updatedAt: "int",
|
|
137
|
+
data: "string"
|
|
138
|
+
}
|
|
139
|
+
};
|
|
97
140
|
var AssetSwapRealmSchemas = [
|
|
141
|
+
ArkadeRfqSwapSchema,
|
|
98
142
|
ArkadeAssetSwapSchema,
|
|
99
143
|
ArkadeAssetSwapScannedTxidSchema,
|
|
100
144
|
ArkadeAssetSwapMarketsCacheSchema
|
|
@@ -38,14 +38,16 @@ var SQLiteAssetSwapRepository = class {
|
|
|
38
38
|
this.db = db;
|
|
39
39
|
this.prefix = (0, import_sqlite.sanitizeTablePrefix)(options?.prefix ?? DEFAULT_PREFIX);
|
|
40
40
|
this.swaps = `${this.prefix}asset_swaps`;
|
|
41
|
+
this.rfqSwaps = `${this.prefix}rfq_swaps`;
|
|
41
42
|
this.scanned = `${this.prefix}asset_swap_scanned_txids`;
|
|
42
43
|
this.markets = `${this.prefix}asset_swap_markets`;
|
|
43
44
|
}
|
|
44
45
|
db;
|
|
45
|
-
version =
|
|
46
|
+
version = 4;
|
|
46
47
|
initPromise = null;
|
|
47
48
|
prefix;
|
|
48
49
|
swaps;
|
|
50
|
+
rfqSwaps;
|
|
49
51
|
scanned;
|
|
50
52
|
markets;
|
|
51
53
|
/** A rejected init is not cached. The DDL runs in a transaction on a shared
|
|
@@ -77,6 +79,15 @@ var SQLiteAssetSwapRepository = class {
|
|
|
77
79
|
await this.db.run(
|
|
78
80
|
`CREATE INDEX IF NOT EXISTS idx_${this.prefix}asset_swaps_created_at ON ${this.swaps} (created_at)`
|
|
79
81
|
);
|
|
82
|
+
await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.rfqSwaps} (
|
|
83
|
+
rfq_id TEXT PRIMARY KEY,
|
|
84
|
+
state TEXT NOT NULL,
|
|
85
|
+
updated_at INTEGER NOT NULL,
|
|
86
|
+
data TEXT NOT NULL
|
|
87
|
+
)`);
|
|
88
|
+
await this.db.run(
|
|
89
|
+
`CREATE INDEX IF NOT EXISTS idx_${this.prefix}rfq_swaps_state ON ${this.rfqSwaps} (state)`
|
|
90
|
+
);
|
|
80
91
|
await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.scanned} (txid TEXT PRIMARY KEY)`);
|
|
81
92
|
await this.db.run(
|
|
82
93
|
`CREATE TABLE IF NOT EXISTS ${this.markets} (cache_key TEXT PRIMARY KEY, data TEXT NOT NULL)`
|
|
@@ -107,6 +118,35 @@ var SQLiteAssetSwapRepository = class {
|
|
|
107
118
|
const rows = await this.db.all(`SELECT data FROM ${this.swaps}`);
|
|
108
119
|
return rows.map((r) => JSON.parse(r.data));
|
|
109
120
|
}
|
|
121
|
+
async saveRfqSwap(record) {
|
|
122
|
+
await this.ensureInit();
|
|
123
|
+
await this.withTx(async () => {
|
|
124
|
+
await this.db.run(
|
|
125
|
+
`INSERT OR REPLACE INTO ${this.rfqSwaps} (rfq_id, state, updated_at, data)
|
|
126
|
+
VALUES (?, ?, ?, ?)`,
|
|
127
|
+
[record.rfqId, record.state, record.updatedAt, JSON.stringify(record)]
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
async getRfqSwap(rfqId) {
|
|
132
|
+
await this.ensureInit();
|
|
133
|
+
const row = await this.db.get(
|
|
134
|
+
`SELECT data FROM ${this.rfqSwaps} WHERE rfq_id = ?`,
|
|
135
|
+
[rfqId]
|
|
136
|
+
);
|
|
137
|
+
return row ? JSON.parse(row.data) : void 0;
|
|
138
|
+
}
|
|
139
|
+
async getAllRfqSwaps() {
|
|
140
|
+
await this.ensureInit();
|
|
141
|
+
const rows = await this.db.all(`SELECT data FROM ${this.rfqSwaps}`);
|
|
142
|
+
return rows.map((r) => JSON.parse(r.data));
|
|
143
|
+
}
|
|
144
|
+
async removeRfqSwap(rfqId) {
|
|
145
|
+
await this.ensureInit();
|
|
146
|
+
await this.withTx(async () => {
|
|
147
|
+
await this.db.run(`DELETE FROM ${this.rfqSwaps} WHERE rfq_id = ?`, [rfqId]);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
110
150
|
async getScannedTxids() {
|
|
111
151
|
await this.ensureInit();
|
|
112
152
|
const rows = await this.db.all(`SELECT txid FROM ${this.scanned}`);
|
|
@@ -143,13 +183,14 @@ var SQLiteAssetSwapRepository = class {
|
|
|
143
183
|
);
|
|
144
184
|
});
|
|
145
185
|
}
|
|
146
|
-
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
186
|
+
/** Every table in one transaction: clearing swaps but keeping scanned txids
|
|
187
|
+
* would leave the restore scan permanently skipping those funding txs, so a
|
|
188
|
+
* partial clear must not be observable. */
|
|
149
189
|
async clear() {
|
|
150
190
|
await this.ensureInit();
|
|
151
191
|
await this.withTx(async () => {
|
|
152
192
|
await this.db.run(`DELETE FROM ${this.swaps}`);
|
|
193
|
+
await this.db.run(`DELETE FROM ${this.rfqSwaps}`);
|
|
153
194
|
await this.db.run(`DELETE FROM ${this.scanned}`);
|
|
154
195
|
await this.db.run(`DELETE FROM ${this.markets}`);
|
|
155
196
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SQLExecutor } from '@arkade-os/sdk/repositories/sqlite';
|
|
2
|
-
import { A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry } from '../../repository-
|
|
2
|
+
import { A as AssetSwapRepository, a as AssetSwap, R as RfqSwapRecord, M as MarketsCacheEntry } from '../../repository-DEHLtD9l.cjs';
|
|
3
3
|
import '@arkade-os/solver-discovery';
|
|
4
4
|
import '@arkade-os/sdk';
|
|
5
|
+
import '../../rfq-hbzhTWHT.cjs';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* SQLite backend over the SDK's `SQLExecutor`, so any driver plugs in
|
|
@@ -11,19 +12,27 @@ import '@arkade-os/sdk';
|
|
|
11
12
|
* and `created_at` are mapped out for querying only, so no field of a record
|
|
12
13
|
* can be dropped. That holds for JSON-safe values: a consumer-added `Date`
|
|
13
14
|
* comes back a string and a `bigint` throws on save, unlike the IndexedDB
|
|
14
|
-
* backend's structured clone. `AssetSwap` itself is JSON-safe by design
|
|
15
|
+
* backend's structured clone. `AssetSwap` itself is JSON-safe by design, and so
|
|
16
|
+
* is `RfqSwapRecord` — including its corridor `profile`, which is plain JSON by
|
|
17
|
+
* the handler contract (see `rfqCorridor.ts`). Whole-record storage is what
|
|
18
|
+
* keeps a nested `profile.hashlock` from being lost the way a field-mapped
|
|
19
|
+
* backend could lose it.
|
|
15
20
|
*
|
|
16
|
-
* Tables are created lazily on first operation
|
|
21
|
+
* Tables are created lazily on first operation, and `CREATE TABLE IF NOT
|
|
22
|
+
* EXISTS` runs on every init — so the `rfq_swaps` table appears for an existing
|
|
23
|
+
* database on its next operation, with no migration and no version to bump.
|
|
24
|
+
* The consumer owns the
|
|
17
25
|
* `SQLExecutor` lifecycle — `[Symbol.asyncDispose]` is a no-op — and must pass
|
|
18
26
|
* the **same executor instance** to every repository on the database: the
|
|
19
27
|
* write chain is keyed by that object, and a per-repository literal splits it.
|
|
20
28
|
*/
|
|
21
29
|
declare class SQLiteAssetSwapRepository implements AssetSwapRepository {
|
|
22
30
|
private readonly db;
|
|
23
|
-
readonly version:
|
|
31
|
+
readonly version: 4;
|
|
24
32
|
private initPromise;
|
|
25
33
|
private readonly prefix;
|
|
26
34
|
private readonly swaps;
|
|
35
|
+
private readonly rfqSwaps;
|
|
27
36
|
private readonly scanned;
|
|
28
37
|
private readonly markets;
|
|
29
38
|
constructor(db: SQLExecutor, options?: {
|
|
@@ -49,13 +58,17 @@ declare class SQLiteAssetSwapRepository implements AssetSwapRepository {
|
|
|
49
58
|
private withTx;
|
|
50
59
|
saveSwap(swap: AssetSwap): Promise<void>;
|
|
51
60
|
getAllSwaps(): Promise<AssetSwap[]>;
|
|
61
|
+
saveRfqSwap(record: RfqSwapRecord): Promise<void>;
|
|
62
|
+
getRfqSwap(rfqId: string): Promise<RfqSwapRecord | undefined>;
|
|
63
|
+
getAllRfqSwaps(): Promise<RfqSwapRecord[]>;
|
|
64
|
+
removeRfqSwap(rfqId: string): Promise<void>;
|
|
52
65
|
getScannedTxids(): Promise<Set<string>>;
|
|
53
66
|
markTxidsScanned(txids: Iterable<string>): Promise<void>;
|
|
54
67
|
getCachedMarkets(network: string, registry: string): Promise<MarketsCacheEntry | undefined>;
|
|
55
68
|
saveCachedMarkets(network: string, registry: string, entry: MarketsCacheEntry): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
69
|
+
/** Every table in one transaction: clearing swaps but keeping scanned txids
|
|
70
|
+
* would leave the restore scan permanently skipping those funding txs, so a
|
|
71
|
+
* partial clear must not be observable. */
|
|
59
72
|
clear(): Promise<void>;
|
|
60
73
|
[Symbol.asyncDispose](): Promise<void>;
|
|
61
74
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SQLExecutor } from '@arkade-os/sdk/repositories/sqlite';
|
|
2
|
-
import { A as AssetSwapRepository, a as AssetSwap, M as MarketsCacheEntry } from '../../repository-
|
|
2
|
+
import { A as AssetSwapRepository, a as AssetSwap, R as RfqSwapRecord, M as MarketsCacheEntry } from '../../repository-DIAr5XYk.js';
|
|
3
3
|
import '@arkade-os/solver-discovery';
|
|
4
4
|
import '@arkade-os/sdk';
|
|
5
|
+
import '../../rfq-hbzhTWHT.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* SQLite backend over the SDK's `SQLExecutor`, so any driver plugs in
|
|
@@ -11,19 +12,27 @@ import '@arkade-os/sdk';
|
|
|
11
12
|
* and `created_at` are mapped out for querying only, so no field of a record
|
|
12
13
|
* can be dropped. That holds for JSON-safe values: a consumer-added `Date`
|
|
13
14
|
* comes back a string and a `bigint` throws on save, unlike the IndexedDB
|
|
14
|
-
* backend's structured clone. `AssetSwap` itself is JSON-safe by design
|
|
15
|
+
* backend's structured clone. `AssetSwap` itself is JSON-safe by design, and so
|
|
16
|
+
* is `RfqSwapRecord` — including its corridor `profile`, which is plain JSON by
|
|
17
|
+
* the handler contract (see `rfqCorridor.ts`). Whole-record storage is what
|
|
18
|
+
* keeps a nested `profile.hashlock` from being lost the way a field-mapped
|
|
19
|
+
* backend could lose it.
|
|
15
20
|
*
|
|
16
|
-
* Tables are created lazily on first operation
|
|
21
|
+
* Tables are created lazily on first operation, and `CREATE TABLE IF NOT
|
|
22
|
+
* EXISTS` runs on every init — so the `rfq_swaps` table appears for an existing
|
|
23
|
+
* database on its next operation, with no migration and no version to bump.
|
|
24
|
+
* The consumer owns the
|
|
17
25
|
* `SQLExecutor` lifecycle — `[Symbol.asyncDispose]` is a no-op — and must pass
|
|
18
26
|
* the **same executor instance** to every repository on the database: the
|
|
19
27
|
* write chain is keyed by that object, and a per-repository literal splits it.
|
|
20
28
|
*/
|
|
21
29
|
declare class SQLiteAssetSwapRepository implements AssetSwapRepository {
|
|
22
30
|
private readonly db;
|
|
23
|
-
readonly version:
|
|
31
|
+
readonly version: 4;
|
|
24
32
|
private initPromise;
|
|
25
33
|
private readonly prefix;
|
|
26
34
|
private readonly swaps;
|
|
35
|
+
private readonly rfqSwaps;
|
|
27
36
|
private readonly scanned;
|
|
28
37
|
private readonly markets;
|
|
29
38
|
constructor(db: SQLExecutor, options?: {
|
|
@@ -49,13 +58,17 @@ declare class SQLiteAssetSwapRepository implements AssetSwapRepository {
|
|
|
49
58
|
private withTx;
|
|
50
59
|
saveSwap(swap: AssetSwap): Promise<void>;
|
|
51
60
|
getAllSwaps(): Promise<AssetSwap[]>;
|
|
61
|
+
saveRfqSwap(record: RfqSwapRecord): Promise<void>;
|
|
62
|
+
getRfqSwap(rfqId: string): Promise<RfqSwapRecord | undefined>;
|
|
63
|
+
getAllRfqSwaps(): Promise<RfqSwapRecord[]>;
|
|
64
|
+
removeRfqSwap(rfqId: string): Promise<void>;
|
|
52
65
|
getScannedTxids(): Promise<Set<string>>;
|
|
53
66
|
markTxidsScanned(txids: Iterable<string>): Promise<void>;
|
|
54
67
|
getCachedMarkets(network: string, registry: string): Promise<MarketsCacheEntry | undefined>;
|
|
55
68
|
saveCachedMarkets(network: string, registry: string, entry: MarketsCacheEntry): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
69
|
+
/** Every table in one transaction: clearing swaps but keeping scanned txids
|
|
70
|
+
* would leave the restore scan permanently skipping those funding txs, so a
|
|
71
|
+
* partial clear must not be observable. */
|
|
59
72
|
clear(): Promise<void>;
|
|
60
73
|
[Symbol.asyncDispose](): Promise<void>;
|
|
61
74
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
marketsCacheKey
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-6ZUS47GA.js";
|
|
4
4
|
|
|
5
5
|
// src/repositories/sqlite/repository.ts
|
|
6
6
|
import {
|
|
@@ -14,14 +14,16 @@ var SQLiteAssetSwapRepository = class {
|
|
|
14
14
|
this.db = db;
|
|
15
15
|
this.prefix = sanitizeTablePrefix(options?.prefix ?? DEFAULT_PREFIX);
|
|
16
16
|
this.swaps = `${this.prefix}asset_swaps`;
|
|
17
|
+
this.rfqSwaps = `${this.prefix}rfq_swaps`;
|
|
17
18
|
this.scanned = `${this.prefix}asset_swap_scanned_txids`;
|
|
18
19
|
this.markets = `${this.prefix}asset_swap_markets`;
|
|
19
20
|
}
|
|
20
21
|
db;
|
|
21
|
-
version =
|
|
22
|
+
version = 4;
|
|
22
23
|
initPromise = null;
|
|
23
24
|
prefix;
|
|
24
25
|
swaps;
|
|
26
|
+
rfqSwaps;
|
|
25
27
|
scanned;
|
|
26
28
|
markets;
|
|
27
29
|
/** A rejected init is not cached. The DDL runs in a transaction on a shared
|
|
@@ -53,6 +55,15 @@ var SQLiteAssetSwapRepository = class {
|
|
|
53
55
|
await this.db.run(
|
|
54
56
|
`CREATE INDEX IF NOT EXISTS idx_${this.prefix}asset_swaps_created_at ON ${this.swaps} (created_at)`
|
|
55
57
|
);
|
|
58
|
+
await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.rfqSwaps} (
|
|
59
|
+
rfq_id TEXT PRIMARY KEY,
|
|
60
|
+
state TEXT NOT NULL,
|
|
61
|
+
updated_at INTEGER NOT NULL,
|
|
62
|
+
data TEXT NOT NULL
|
|
63
|
+
)`);
|
|
64
|
+
await this.db.run(
|
|
65
|
+
`CREATE INDEX IF NOT EXISTS idx_${this.prefix}rfq_swaps_state ON ${this.rfqSwaps} (state)`
|
|
66
|
+
);
|
|
56
67
|
await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.scanned} (txid TEXT PRIMARY KEY)`);
|
|
57
68
|
await this.db.run(
|
|
58
69
|
`CREATE TABLE IF NOT EXISTS ${this.markets} (cache_key TEXT PRIMARY KEY, data TEXT NOT NULL)`
|
|
@@ -83,6 +94,35 @@ var SQLiteAssetSwapRepository = class {
|
|
|
83
94
|
const rows = await this.db.all(`SELECT data FROM ${this.swaps}`);
|
|
84
95
|
return rows.map((r) => JSON.parse(r.data));
|
|
85
96
|
}
|
|
97
|
+
async saveRfqSwap(record) {
|
|
98
|
+
await this.ensureInit();
|
|
99
|
+
await this.withTx(async () => {
|
|
100
|
+
await this.db.run(
|
|
101
|
+
`INSERT OR REPLACE INTO ${this.rfqSwaps} (rfq_id, state, updated_at, data)
|
|
102
|
+
VALUES (?, ?, ?, ?)`,
|
|
103
|
+
[record.rfqId, record.state, record.updatedAt, JSON.stringify(record)]
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async getRfqSwap(rfqId) {
|
|
108
|
+
await this.ensureInit();
|
|
109
|
+
const row = await this.db.get(
|
|
110
|
+
`SELECT data FROM ${this.rfqSwaps} WHERE rfq_id = ?`,
|
|
111
|
+
[rfqId]
|
|
112
|
+
);
|
|
113
|
+
return row ? JSON.parse(row.data) : void 0;
|
|
114
|
+
}
|
|
115
|
+
async getAllRfqSwaps() {
|
|
116
|
+
await this.ensureInit();
|
|
117
|
+
const rows = await this.db.all(`SELECT data FROM ${this.rfqSwaps}`);
|
|
118
|
+
return rows.map((r) => JSON.parse(r.data));
|
|
119
|
+
}
|
|
120
|
+
async removeRfqSwap(rfqId) {
|
|
121
|
+
await this.ensureInit();
|
|
122
|
+
await this.withTx(async () => {
|
|
123
|
+
await this.db.run(`DELETE FROM ${this.rfqSwaps} WHERE rfq_id = ?`, [rfqId]);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
86
126
|
async getScannedTxids() {
|
|
87
127
|
await this.ensureInit();
|
|
88
128
|
const rows = await this.db.all(`SELECT txid FROM ${this.scanned}`);
|
|
@@ -119,13 +159,14 @@ var SQLiteAssetSwapRepository = class {
|
|
|
119
159
|
);
|
|
120
160
|
});
|
|
121
161
|
}
|
|
122
|
-
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
162
|
+
/** Every table in one transaction: clearing swaps but keeping scanned txids
|
|
163
|
+
* would leave the restore scan permanently skipping those funding txs, so a
|
|
164
|
+
* partial clear must not be observable. */
|
|
125
165
|
async clear() {
|
|
126
166
|
await this.ensureInit();
|
|
127
167
|
await this.withTx(async () => {
|
|
128
168
|
await this.db.run(`DELETE FROM ${this.swaps}`);
|
|
169
|
+
await this.db.run(`DELETE FROM ${this.rfqSwaps}`);
|
|
129
170
|
await this.db.run(`DELETE FROM ${this.scanned}`);
|
|
130
171
|
await this.db.run(`DELETE FROM ${this.markets}`);
|
|
131
172
|
});
|