@1sat/wallet-server 0.0.1 → 0.0.3
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/accounts/index.d.ts +4 -7
- package/dist/accounts/index.d.ts.map +1 -1
- package/dist/accounts/index.js +3 -6
- package/dist/accounts/index.js.map +1 -1
- package/dist/accounts/middleware.d.ts +29 -30
- package/dist/accounts/middleware.d.ts.map +1 -1
- package/dist/accounts/middleware.js +303 -121
- package/dist/accounts/middleware.js.map +1 -1
- package/dist/accounts/pricing.d.ts +38 -11
- package/dist/accounts/pricing.d.ts.map +1 -1
- package/dist/accounts/pricing.js +40 -11
- package/dist/accounts/pricing.js.map +1 -1
- package/dist/accounts/queries.d.ts +42 -0
- package/dist/accounts/queries.d.ts.map +1 -0
- package/dist/accounts/queries.js +91 -0
- package/dist/accounts/queries.js.map +1 -0
- package/dist/accounts/types.d.ts +46 -29
- package/dist/accounts/types.d.ts.map +1 -1
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +34 -0
- package/dist/client.js.map +1 -0
- package/dist/createWalletServer.d.ts +12 -3
- package/dist/createWalletServer.d.ts.map +1 -1
- package/dist/createWalletServer.js +84 -46
- package/dist/createWalletServer.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/topUp.d.ts +28 -0
- package/dist/topUp.d.ts.map +1 -0
- package/dist/topUp.js +67 -0
- package/dist/topUp.js.map +1 -0
- package/package.json +57 -46
- package/dist/accounts/metering.d.ts +0 -15
- package/dist/accounts/metering.d.ts.map +0 -1
- package/dist/accounts/metering.js +0 -32
- package/dist/accounts/metering.js.map +0 -1
- package/dist/accounts/migrations.d.ts +0 -18
- package/dist/accounts/migrations.d.ts.map +0 -1
- package/dist/accounts/migrations.js +0 -46
- package/dist/accounts/migrations.js.map +0 -1
- package/dist/accounts/paymentValidation.d.ts +0 -59
- package/dist/accounts/paymentValidation.d.ts.map +0 -1
- package/dist/accounts/paymentValidation.js +0 -112
- package/dist/accounts/paymentValidation.js.map +0 -1
- package/dist/accounts/repo.d.ts +0 -17
- package/dist/accounts/repo.d.ts.map +0 -1
- package/dist/accounts/repo.js +0 -94
- package/dist/accounts/repo.js.map +0 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createAuthMiddleware } from '@bsv/auth-express-middleware';
|
|
2
|
-
import { PrivateKey, ProtoWallet, PublicKey, } from '@bsv/sdk';
|
|
3
2
|
import express from 'express';
|
|
4
|
-
import {
|
|
3
|
+
import { accountsCapacityGate, latestActivePaymentForPayer, nextPaymentDerivation, } from './accounts';
|
|
5
4
|
import { createWalletRpcHandler } from './createWalletRpcHandler';
|
|
6
5
|
import { dispatch } from './dispatch';
|
|
7
6
|
import { bearerResolver } from './resolvers/bearer';
|
|
@@ -17,25 +16,22 @@ export function createWalletServer(config) {
|
|
|
17
16
|
const app = express();
|
|
18
17
|
app.use(express.json({ limit: config.bodyLimit ?? '30mb' }));
|
|
19
18
|
app.use(corsMiddleware);
|
|
20
|
-
const wallet =
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
if (config.accounts?.config.enabled) {
|
|
24
|
-
const deps = {
|
|
19
|
+
const { wallet, serverIdentityKey } = config;
|
|
20
|
+
const accountsDeps = config.accounts
|
|
21
|
+
? {
|
|
25
22
|
config: config.accounts.config,
|
|
26
23
|
walletStorage: config.storage,
|
|
27
|
-
knex: config.accounts.knex,
|
|
28
24
|
wallet,
|
|
29
25
|
serverIdentityKey,
|
|
30
26
|
currentBlock: config.accounts.currentBlock,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
}
|
|
27
|
+
}
|
|
28
|
+
: undefined;
|
|
34
29
|
if (publicPath) {
|
|
35
|
-
mountPublicRoute(app, publicPath, config, wallet,
|
|
30
|
+
mountPublicRoute(app, publicPath, config, wallet, accountsDeps);
|
|
31
|
+
mountStatusRoute(app, publicPath, config, serverIdentityKey, wallet);
|
|
36
32
|
}
|
|
37
33
|
if (internalPath) {
|
|
38
|
-
mountInternalRoute(app, internalPath, config
|
|
34
|
+
mountInternalRoute(app, internalPath, config);
|
|
39
35
|
}
|
|
40
36
|
let server;
|
|
41
37
|
return {
|
|
@@ -61,10 +57,21 @@ export function createWalletServer(config) {
|
|
|
61
57
|
},
|
|
62
58
|
};
|
|
63
59
|
}
|
|
64
|
-
function mountPublicRoute(app, path, config, wallet,
|
|
60
|
+
function mountPublicRoute(app, path, config, wallet, accountsDeps) {
|
|
65
61
|
const authMiddleware = createAuthMiddleware({ wallet });
|
|
66
62
|
app.use(path, authMiddleware);
|
|
67
|
-
|
|
63
|
+
// JSON-RPC endpoint. The capacity gate sits between auth and dispatch:
|
|
64
|
+
// over-capacity billable calls return 507 unless they carry a valid
|
|
65
|
+
// inline self-payment (label + BRC-29 output) that the gate recognises.
|
|
66
|
+
const postHandlers = [];
|
|
67
|
+
if (accountsDeps) {
|
|
68
|
+
postHandlers.push(accountsCapacityGate(accountsDeps));
|
|
69
|
+
}
|
|
70
|
+
postHandlers.push(dispatchHandler(config));
|
|
71
|
+
app.post(path, ...postHandlers);
|
|
72
|
+
}
|
|
73
|
+
function dispatchHandler(config) {
|
|
74
|
+
return async (req, res) => {
|
|
68
75
|
const identityKey = req.auth?.identityKey;
|
|
69
76
|
if (!identityKey || identityKey === 'unknown') {
|
|
70
77
|
return res.status(401).json({
|
|
@@ -81,18 +88,6 @@ function mountPublicRoute(app, path, config, wallet, gate) {
|
|
|
81
88
|
id: body?.id ?? null,
|
|
82
89
|
});
|
|
83
90
|
}
|
|
84
|
-
const id = normalizeJsonRpcId(body.id);
|
|
85
|
-
if (gate) {
|
|
86
|
-
const decision = await gate.check({
|
|
87
|
-
method: body.method,
|
|
88
|
-
identity: { identityKey },
|
|
89
|
-
request: expressToFetchRequest(req),
|
|
90
|
-
id,
|
|
91
|
-
});
|
|
92
|
-
if (decision.type === 'blocked') {
|
|
93
|
-
return relayFetchResponse(res, decision.response);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
91
|
const response = await dispatch({
|
|
97
92
|
storage: config.storage,
|
|
98
93
|
adminIdentityKeys: config.adminIdentityKeys,
|
|
@@ -100,22 +95,74 @@ function mountPublicRoute(app, path, config, wallet, gate) {
|
|
|
100
95
|
}, {
|
|
101
96
|
method: body.method,
|
|
102
97
|
params: Array.isArray(body.params) ? body.params : [],
|
|
103
|
-
id,
|
|
98
|
+
id: normalizeJsonRpcId(body.id),
|
|
104
99
|
identity: { identityKey },
|
|
105
100
|
});
|
|
106
101
|
res.status(200).json(response);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function mountStatusRoute(app, basePath, config, serverIdentityKey, serverWallet) {
|
|
105
|
+
const statusPath = joinPath(basePath, 'account/status');
|
|
106
|
+
app.get(statusPath, async (req, res) => {
|
|
107
|
+
const identityKey = req.auth?.identityKey;
|
|
108
|
+
if (!identityKey || identityKey === 'unknown') {
|
|
109
|
+
return res.status(401).json({ error: 'Unauthenticated' });
|
|
110
|
+
}
|
|
111
|
+
const accounts = config.accounts;
|
|
112
|
+
if (!accounts) {
|
|
113
|
+
return res.status(200).json({
|
|
114
|
+
identityKey,
|
|
115
|
+
serverIdentityKey,
|
|
116
|
+
accountsEnabled: false,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const currentBlock = await accounts.currentBlock();
|
|
120
|
+
const userResult = await config.storage.findOrInsertUser(identityKey);
|
|
121
|
+
const userId = userResult?.user?.userId;
|
|
122
|
+
const usedBytes = userId == null
|
|
123
|
+
? 0
|
|
124
|
+
: await config.storage.measureUsedBytes(userId);
|
|
125
|
+
if (!accounts.config.enabled) {
|
|
126
|
+
return res.status(200).json({
|
|
127
|
+
identityKey,
|
|
128
|
+
serverIdentityKey,
|
|
129
|
+
accountsEnabled: false,
|
|
130
|
+
currentBlock,
|
|
131
|
+
usedBytes,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const currentPayment = await latestActivePaymentForPayer(serverWallet, identityKey, currentBlock);
|
|
135
|
+
const paidBytes = currentPayment?.bytesCovered ?? 0;
|
|
136
|
+
const capacityBytes = accounts.config.baselineBytes + paidBytes;
|
|
137
|
+
const deficitBytes = Math.max(0, usedBytes - capacityBytes);
|
|
138
|
+
const nextPayment = await nextPaymentDerivation(identityKey, serverWallet);
|
|
139
|
+
return res.status(200).json({
|
|
140
|
+
identityKey,
|
|
141
|
+
serverIdentityKey,
|
|
142
|
+
accountsEnabled: true,
|
|
143
|
+
currentBlock,
|
|
144
|
+
usedBytes,
|
|
145
|
+
baselineBytes: accounts.config.baselineBytes,
|
|
146
|
+
paidBytes,
|
|
147
|
+
capacityBytes,
|
|
148
|
+
deficitBytes,
|
|
149
|
+
paidThroughBlock: currentPayment?.paidThroughBlock ?? null,
|
|
150
|
+
pricing: {
|
|
151
|
+
purchaseUnitBytes: accounts.config.purchaseUnitBytes,
|
|
152
|
+
satsPerUnit: accounts.config.satsPerUnit,
|
|
153
|
+
durationBlocks: accounts.config.durationBlocks,
|
|
154
|
+
},
|
|
155
|
+
nextPayment,
|
|
156
|
+
});
|
|
107
157
|
});
|
|
108
158
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
res.send(buf);
|
|
159
|
+
function joinPath(basePath, sub) {
|
|
160
|
+
const trimmedBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;
|
|
161
|
+
const trimmedSub = sub.startsWith('/') ? sub.slice(1) : sub;
|
|
162
|
+
return trimmedBase === '' ? `/${trimmedSub}` : `${trimmedBase}/${trimmedSub}`;
|
|
114
163
|
}
|
|
115
|
-
function mountInternalRoute(app, path, config
|
|
116
|
-
const preDispatch =
|
|
117
|
-
? (ctx) => gate.check(ctx)
|
|
118
|
-
: undefined;
|
|
164
|
+
function mountInternalRoute(app, path, config) {
|
|
165
|
+
const preDispatch = undefined;
|
|
119
166
|
const handler = createWalletRpcHandler({
|
|
120
167
|
storage: config.storage,
|
|
121
168
|
resolveIdentity: bearerResolver({
|
|
@@ -135,15 +182,6 @@ function mountInternalRoute(app, path, config, gate) {
|
|
|
135
182
|
res.send(buf);
|
|
136
183
|
});
|
|
137
184
|
}
|
|
138
|
-
function buildServerWallet(privateKeyHex) {
|
|
139
|
-
const key = PrivateKey.fromHex(privateKeyHex);
|
|
140
|
-
return new ProtoWallet(key);
|
|
141
|
-
}
|
|
142
|
-
function identityKeyFromPrivateKey(privateKeyHex) {
|
|
143
|
-
const key = PrivateKey.fromHex(privateKeyHex);
|
|
144
|
-
const pub = PublicKey.fromPrivateKey(key);
|
|
145
|
-
return pub.toString();
|
|
146
|
-
}
|
|
147
185
|
function corsMiddleware(_req, res, next) {
|
|
148
186
|
res.header('Access-Control-Allow-Origin', '*');
|
|
149
187
|
res.header('Access-Control-Allow-Headers', '*');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createWalletServer.js","sourceRoot":"","sources":["../src/createWalletServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"createWalletServer.js","sourceRoot":"","sources":["../src/createWalletServer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,9 @@ export { createBearerServer } from './createBearerServer';
|
|
|
4
4
|
export type { BearerServerConfig, BearerServerHandle, } from './createBearerServer';
|
|
5
5
|
export { createWalletServer } from './createWalletServer';
|
|
6
6
|
export type { WalletServerConfig, WalletServerHandle, } from './createWalletServer';
|
|
7
|
+
export { WalletServerClient } from './client';
|
|
8
|
+
export { topUpStorage } from './topUp';
|
|
9
|
+
export type { TopUpOptions, TopUpResult } from './topUp';
|
|
7
10
|
export { createWalletMonitor } from './createWalletMonitor';
|
|
8
11
|
export type { WalletMonitorConfig, WalletMonitorHandle, } from './createWalletMonitor';
|
|
9
12
|
export { BILLABLE_METHODS, dispatch, isBillableMethod } from './dispatch';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EACX,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,YAAY,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EACX,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,YAAY,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { createWalletRpcHandler } from './createWalletRpcHandler';
|
|
2
2
|
export { createBearerServer } from './createBearerServer';
|
|
3
3
|
export { createWalletServer } from './createWalletServer';
|
|
4
|
+
export { WalletServerClient } from './client';
|
|
5
|
+
export { topUpStorage } from './topUp';
|
|
4
6
|
export { createWalletMonitor } from './createWalletMonitor';
|
|
5
7
|
export { BILLABLE_METHODS, dispatch, isBillableMethod } from './dispatch';
|
|
6
8
|
export * from './resolvers';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAM3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGzE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAM3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGzE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
|
package/dist/topUp.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-up helper: buys capacity on a remote wallet-server by building a
|
|
3
|
+
* BRC-29 self-payment createAction. The server's accounts gate recognises
|
|
4
|
+
* the self-payment, bypasses the 507, and auto-internalizes the payment
|
|
5
|
+
* into its own wallet as part of processAction post-dispatch — so the
|
|
6
|
+
* client never needs a second HTTP round-trip.
|
|
7
|
+
*
|
|
8
|
+
* Shared by the CLI `1sat remote topup` command and the eventual
|
|
9
|
+
* factory-level auto-retry.
|
|
10
|
+
*/
|
|
11
|
+
import { type WalletInterface } from '@bsv/sdk';
|
|
12
|
+
import type { AccountStatusResponse } from './accounts/types';
|
|
13
|
+
import { WalletServerClient } from './client';
|
|
14
|
+
export interface TopUpOptions {
|
|
15
|
+
/** Buy this many purchase units. Defaults to `ceil(deficit / unitBytes)`. */
|
|
16
|
+
units?: number;
|
|
17
|
+
/** Reuse an existing client. Defaults to a fresh instance from `remoteUrl`. */
|
|
18
|
+
client?: WalletServerClient;
|
|
19
|
+
}
|
|
20
|
+
export interface TopUpResult {
|
|
21
|
+
unitsBought: number;
|
|
22
|
+
satsPaid: number;
|
|
23
|
+
txid: string;
|
|
24
|
+
/** Account status after the payment is recorded. */
|
|
25
|
+
status: AccountStatusResponse;
|
|
26
|
+
}
|
|
27
|
+
export declare function topUpStorage(wallet: WalletInterface, remoteUrl: string, options?: TopUpOptions): Promise<TopUpResult>;
|
|
28
|
+
//# sourceMappingURL=topUp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topUp.d.ts","sourceRoot":"","sources":["../src/topUp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAGN,KAAK,eAAe,EACpB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAK7C,MAAM,WAAW,YAAY;IAC5B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,MAAM,EAAE,qBAAqB,CAAA;CAC7B;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,YAAiB,GACxB,OAAO,CAAC,WAAW,CAAC,CAiEtB"}
|
package/dist/topUp.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-up helper: buys capacity on a remote wallet-server by building a
|
|
3
|
+
* BRC-29 self-payment createAction. The server's accounts gate recognises
|
|
4
|
+
* the self-payment, bypasses the 507, and auto-internalizes the payment
|
|
5
|
+
* into its own wallet as part of processAction post-dispatch — so the
|
|
6
|
+
* client never needs a second HTTP round-trip.
|
|
7
|
+
*
|
|
8
|
+
* Shared by the CLI `1sat remote topup` command and the eventual
|
|
9
|
+
* factory-level auto-retry.
|
|
10
|
+
*/
|
|
11
|
+
import { P2PKH, PublicKey, } from '@bsv/sdk';
|
|
12
|
+
import { WalletServerClient } from './client';
|
|
13
|
+
/** BRC-29 protocol ID for wallet payments (mirrors `@1sat/types`). */
|
|
14
|
+
const BRC29_PROTOCOL_ID = [2, '3241645161d8'];
|
|
15
|
+
export async function topUpStorage(wallet, remoteUrl, options = {}) {
|
|
16
|
+
const client = options.client ?? new WalletServerClient(remoteUrl, wallet);
|
|
17
|
+
const status = await client.accountStatus();
|
|
18
|
+
if (!status.accountsEnabled) {
|
|
19
|
+
throw new Error('remote has accounts metering disabled — no topup possible');
|
|
20
|
+
}
|
|
21
|
+
const units = options.units ??
|
|
22
|
+
Math.ceil(status.deficitBytes / status.pricing.purchaseUnitBytes);
|
|
23
|
+
if (units <= 0) {
|
|
24
|
+
throw new Error(`no topup needed — deficit is ${status.deficitBytes} bytes`);
|
|
25
|
+
}
|
|
26
|
+
const sats = units * status.pricing.satsPerUnit;
|
|
27
|
+
const { derivationPrefix, derivationSuffix } = status.nextPayment;
|
|
28
|
+
const keyID = `${derivationPrefix} ${derivationSuffix}`;
|
|
29
|
+
const { publicKey } = await wallet.getPublicKey({
|
|
30
|
+
protocolID: BRC29_PROTOCOL_ID,
|
|
31
|
+
keyID,
|
|
32
|
+
counterparty: status.serverIdentityKey,
|
|
33
|
+
forSelf: false,
|
|
34
|
+
});
|
|
35
|
+
const address = PublicKey.fromString(publicKey).toAddress();
|
|
36
|
+
const lockingScript = new P2PKH().lock(address).toHex();
|
|
37
|
+
const createResult = await wallet.createAction({
|
|
38
|
+
description: `wallet-server storage payment (${units} unit${units === 1 ? '' : 's'})`,
|
|
39
|
+
labels: [`account-payment:${status.serverIdentityKey}`],
|
|
40
|
+
outputs: [
|
|
41
|
+
{
|
|
42
|
+
lockingScript,
|
|
43
|
+
satoshis: sats,
|
|
44
|
+
outputDescription: 'storage capacity payment',
|
|
45
|
+
customInstructions: JSON.stringify({
|
|
46
|
+
derivationPrefix,
|
|
47
|
+
derivationSuffix,
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
options: {
|
|
52
|
+
randomizeOutputs: false,
|
|
53
|
+
acceptDelayedBroadcast: false,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
if (!createResult.txid) {
|
|
57
|
+
throw new Error('createAction did not return a broadcast txid');
|
|
58
|
+
}
|
|
59
|
+
const newStatus = await client.accountStatus();
|
|
60
|
+
return {
|
|
61
|
+
unitsBought: units,
|
|
62
|
+
satsPaid: sats,
|
|
63
|
+
txid: createResult.txid,
|
|
64
|
+
status: newStatus,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=topUp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topUp.js","sourceRoot":"","sources":["../src/topUp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACN,KAAK,EACL,SAAS,GAET,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAE7C,sEAAsE;AACtE,MAAM,iBAAiB,GAAgB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;AAiB1D,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,MAAuB,EACvB,SAAiB,EACjB,UAAwB,EAAE;IAE1B,MAAM,MAAM,GACX,OAAO,CAAC,MAAM,IAAI,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAE5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;IAC3C,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACd,2DAA2D,CAC3D,CAAA;IACF,CAAC;IAED,MAAM,KAAK,GACV,OAAO,CAAC,KAAK;QACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACd,gCAAgC,MAAM,CAAC,YAAY,QAAQ,CAC3D,CAAA;IACF,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAA;IAC/C,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,WAAW,CAAA;IACjE,MAAM,KAAK,GAAG,GAAG,gBAAgB,IAAI,gBAAgB,EAAE,CAAA;IAEvD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC/C,UAAU,EAAE,iBAAiB;QAC7B,KAAK;QACL,YAAY,EAAE,MAAM,CAAC,iBAAiB;QACtC,OAAO,EAAE,KAAK;KACd,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAA;IAC3D,MAAM,aAAa,GAAG,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;IAEvD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC9C,WAAW,EAAE,kCAAkC,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QACrF,MAAM,EAAE,CAAC,mBAAmB,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACvD,OAAO,EAAE;YACR;gBACC,aAAa;gBACb,QAAQ,EAAE,IAAI;gBACd,iBAAiB,EAAE,0BAA0B;gBAC7C,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC;oBAClC,gBAAgB;oBAChB,gBAAgB;iBAChB,CAAC;aACF;SACD;QACD,OAAO,EAAE;YACR,gBAAgB,EAAE,KAAK;YACvB,sBAAsB,EAAE,KAAK;SAC7B;KACD,CAAC,CAAA;IAEF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;IAE9C,OAAO;QACN,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,MAAM,EAAE,SAAS;KACjB,CAAA;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,48 +1,59 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
2
|
+
"name": "@1sat/wallet-server",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "BRC-100 wallet storage RPC server for 1Sat Ordinals SDK",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"bun": "./src/index.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"test": "bun test"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"1sat",
|
|
26
|
+
"bsv",
|
|
27
|
+
"ordinals",
|
|
28
|
+
"wallet",
|
|
29
|
+
"server",
|
|
30
|
+
"rpc",
|
|
31
|
+
"brc-100"
|
|
32
|
+
],
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@1sat/client": "0.0.21",
|
|
36
|
+
"@1sat/wallet": "0.0.49",
|
|
37
|
+
"express": "^4.21.2"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@bsv/auth-express-middleware": "^2.0.4",
|
|
41
|
+
"@bsv/sdk": "^2.0.13",
|
|
42
|
+
"@bsv/wallet-toolbox": "^2.1.21",
|
|
43
|
+
"knex": "^3.1.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependenciesMeta": {
|
|
46
|
+
"pg": {
|
|
47
|
+
"optional": true
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@bsv/auth-express-middleware": "^2.0.4",
|
|
52
|
+
"@bsv/sdk": "^2.0.13",
|
|
53
|
+
"@bsv/wallet-toolbox": "^2.1.21",
|
|
54
|
+
"@types/bun": "^1.3.10",
|
|
55
|
+
"@types/express": "^4.17.21",
|
|
56
|
+
"knex": "^3.1.0",
|
|
57
|
+
"typescript": "^5.9.3"
|
|
58
|
+
}
|
|
48
59
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex';
|
|
2
|
-
/**
|
|
3
|
-
* Measures the stored-byte footprint of a single wallet-toolbox user.
|
|
4
|
-
*
|
|
5
|
-
* Sums the sizes of data that represent persisted wallet state:
|
|
6
|
-
* - `transactions.rawTx`
|
|
7
|
-
* - `transactions.inputBEEF`
|
|
8
|
-
* - `outputs.lockingScript` (or `outputs.scriptLength` when the blob was pushed to rawTx)
|
|
9
|
-
*
|
|
10
|
-
* These are the fields that actually consume storage per user and that the
|
|
11
|
-
* dispatcher's billable methods grow (`createAction`, `processAction`,
|
|
12
|
-
* `internalizeAction`, `processSyncChunk`, `insertCertificateAuth`).
|
|
13
|
-
*/
|
|
14
|
-
export declare function measureUsedBytes(knex: Knex, userId: number): Promise<number>;
|
|
15
|
-
//# sourceMappingURL=metering.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metering.d.ts","sourceRoot":"","sources":["../../src/accounts/metering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Measures the stored-byte footprint of a single wallet-toolbox user.
|
|
3
|
-
*
|
|
4
|
-
* Sums the sizes of data that represent persisted wallet state:
|
|
5
|
-
* - `transactions.rawTx`
|
|
6
|
-
* - `transactions.inputBEEF`
|
|
7
|
-
* - `outputs.lockingScript` (or `outputs.scriptLength` when the blob was pushed to rawTx)
|
|
8
|
-
*
|
|
9
|
-
* These are the fields that actually consume storage per user and that the
|
|
10
|
-
* dispatcher's billable methods grow (`createAction`, `processAction`,
|
|
11
|
-
* `internalizeAction`, `processSyncChunk`, `insertCertificateAuth`).
|
|
12
|
-
*/
|
|
13
|
-
export async function measureUsedBytes(knex, userId) {
|
|
14
|
-
const [txRow] = await knex('transactions')
|
|
15
|
-
.where({ userId })
|
|
16
|
-
.select(knex.raw('COALESCE(SUM(COALESCE(LENGTH(rawTx), 0) + COALESCE(LENGTH(inputBEEF), 0)), 0) as total'));
|
|
17
|
-
const [outRow] = await knex('outputs')
|
|
18
|
-
.where({ userId })
|
|
19
|
-
.select(knex.raw('COALESCE(SUM(COALESCE(scriptLength, LENGTH(lockingScript), 0)), 0) as total'));
|
|
20
|
-
return asNumber(txRow?.total) + asNumber(outRow?.total);
|
|
21
|
-
}
|
|
22
|
-
function asNumber(v) {
|
|
23
|
-
if (v == null)
|
|
24
|
-
return 0;
|
|
25
|
-
if (typeof v === 'number')
|
|
26
|
-
return v;
|
|
27
|
-
if (typeof v === 'bigint')
|
|
28
|
-
return Number(v);
|
|
29
|
-
const n = Number(v);
|
|
30
|
-
return Number.isFinite(n) ? n : 0;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=metering.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metering.js","sourceRoot":"","sources":["../../src/accounts/metering.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAAU,EACV,MAAc;IAEd,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;SACxC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;SACjB,MAAM,CACN,IAAI,CAAC,GAAG,CACP,wFAAwF,CACxF,CACD,CAAA;IAEF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;SACpC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;SACjB,MAAM,CACN,IAAI,CAAC,GAAG,CACP,6EAA6E,CAC7E,CACD,CAAA;IAEF,OAAO,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC3B,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,CAAC,CAAA;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAA;IACnC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACnB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Knex } from 'knex';
|
|
2
|
-
/**
|
|
3
|
-
* Knex migrations for the accounts layer.
|
|
4
|
-
*
|
|
5
|
-
* Tables are prefixed `wsa_` (wallet-server-accounts) to avoid colliding with
|
|
6
|
-
* wallet-toolbox's own tables (`transactions`, `outputs`, etc.) that live in
|
|
7
|
-
* the same database.
|
|
8
|
-
*/
|
|
9
|
-
export declare const ACCOUNTS_TABLE = "wsa_accounts";
|
|
10
|
-
export declare const PAYMENTS_TABLE = "wsa_payments";
|
|
11
|
-
export declare function up(knex: Knex): Promise<void>;
|
|
12
|
-
export declare function down(knex: Knex): Promise<void>;
|
|
13
|
-
/**
|
|
14
|
-
* Runs migrations against the given knex instance. Idempotent — safe to call on
|
|
15
|
-
* every server start.
|
|
16
|
-
*/
|
|
17
|
-
export declare function runMigrations(knex: Knex): Promise<void>;
|
|
18
|
-
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/accounts/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC;;;;;;GAMG;AAEH,eAAO,MAAM,cAAc,iBAAiB,CAAA;AAC5C,eAAO,MAAM,cAAc,iBAAiB,CAAA;AAE5C,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7D"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Knex migrations for the accounts layer.
|
|
3
|
-
*
|
|
4
|
-
* Tables are prefixed `wsa_` (wallet-server-accounts) to avoid colliding with
|
|
5
|
-
* wallet-toolbox's own tables (`transactions`, `outputs`, etc.) that live in
|
|
6
|
-
* the same database.
|
|
7
|
-
*/
|
|
8
|
-
export const ACCOUNTS_TABLE = 'wsa_accounts';
|
|
9
|
-
export const PAYMENTS_TABLE = 'wsa_payments';
|
|
10
|
-
export async function up(knex) {
|
|
11
|
-
const hasAccounts = await knex.schema.hasTable(ACCOUNTS_TABLE);
|
|
12
|
-
if (!hasAccounts) {
|
|
13
|
-
await knex.schema.createTable(ACCOUNTS_TABLE, (t) => {
|
|
14
|
-
t.string('identity_key', 66).primary();
|
|
15
|
-
t.timestamp('created_at').notNullable().defaultTo(knex.fn.now());
|
|
16
|
-
t.timestamp('updated_at').notNullable().defaultTo(knex.fn.now());
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
const hasPayments = await knex.schema.hasTable(PAYMENTS_TABLE);
|
|
20
|
-
if (!hasPayments) {
|
|
21
|
-
await knex.schema.createTable(PAYMENTS_TABLE, (t) => {
|
|
22
|
-
t.increments('id').primary();
|
|
23
|
-
t.string('identity_key', 66).notNullable();
|
|
24
|
-
t.string('txid', 64).notNullable().unique();
|
|
25
|
-
t.bigInteger('bytes_covered').notNullable();
|
|
26
|
-
t.bigInteger('sats_paid').notNullable();
|
|
27
|
-
t.integer('paid_through_block').notNullable();
|
|
28
|
-
t.timestamp('applied_at').notNullable().defaultTo(knex.fn.now());
|
|
29
|
-
t.index('identity_key');
|
|
30
|
-
t.index('paid_through_block');
|
|
31
|
-
t.foreign('identity_key').references(`${ACCOUNTS_TABLE}.identity_key`);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export async function down(knex) {
|
|
36
|
-
await knex.schema.dropTableIfExists(PAYMENTS_TABLE);
|
|
37
|
-
await knex.schema.dropTableIfExists(ACCOUNTS_TABLE);
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Runs migrations against the given knex instance. Idempotent — safe to call on
|
|
41
|
-
* every server start.
|
|
42
|
-
*/
|
|
43
|
-
export async function runMigrations(knex) {
|
|
44
|
-
await up(knex);
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=migrations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/accounts/migrations.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAA;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAA;AAE5C,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;YACnD,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;YACtC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;YAChE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;YACnD,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;YAC5B,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YAC1C,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAA;YAC3C,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;YACvC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE,CAAA;YAC7C,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;YAEhE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;YACvB,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;YAC7B,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,GAAG,cAAc,eAAe,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACpC,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAA;IACnD,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC7C,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|