@toon-protocol/connector 2.3.0 → 2.6.0
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 +21 -20
- package/dist/core/connector-node.d.ts +1 -0
- package/dist/core/connector-node.d.ts.map +1 -1
- package/dist/core/connector-node.js +14 -1
- package/dist/core/connector-node.js.map +1 -1
- package/dist/core/packet-handler.d.ts +3 -0
- package/dist/core/packet-handler.d.ts.map +1 -1
- package/dist/core/packet-handler.js +33 -10
- package/dist/core/packet-handler.js.map +1 -1
- package/dist/http/admin-api-inventory.d.ts +29 -0
- package/dist/http/admin-api-inventory.d.ts.map +1 -0
- package/dist/http/admin-api-inventory.js +462 -0
- package/dist/http/admin-api-inventory.js.map +1 -0
- package/dist/http/admin-api.d.ts +20 -0
- package/dist/http/admin-api.d.ts.map +1 -1
- package/dist/http/admin-api.js +61 -1
- package/dist/http/admin-api.js.map +1 -1
- package/dist/http/admin-server.d.ts +2 -0
- package/dist/http/admin-server.d.ts.map +1 -1
- package/dist/http/admin-server.js +2 -1
- package/dist/http/admin-server.js.map +1 -1
- package/dist/observability/metrics-registry.d.ts +39 -0
- package/dist/observability/metrics-registry.d.ts.map +1 -0
- package/dist/observability/metrics-registry.js +151 -0
- package/dist/observability/metrics-registry.js.map +1 -0
- package/dist/settlement/account-manager.d.ts.map +1 -1
- package/dist/settlement/account-manager.js +1 -1
- package/dist/settlement/account-manager.js.map +1 -1
- package/dist/settlement/claim-receiver.d.ts +1 -0
- package/dist/settlement/claim-receiver.d.ts.map +1 -1
- package/dist/settlement/claim-receiver.js +23 -0
- package/dist/settlement/claim-receiver.js.map +1 -1
- package/dist/settlement/settlement-executor.d.ts +3 -0
- package/dist/settlement/settlement-executor.d.ts.map +1 -1
- package/dist/settlement/settlement-executor.js +10 -1
- package/dist/settlement/settlement-executor.js.map +1 -1
- package/dist/transport/managed-anon-client.d.ts.map +1 -1
- package/dist/transport/managed-anon-client.js +3 -2
- package/dist/transport/managed-anon-client.js.map +1 -1
- package/package.json +13 -3
- package/dist/config/aptos-env-validator.d.ts +0 -8
- package/dist/config/aptos-env-validator.d.ts.map +0 -1
- package/dist/config/aptos-env-validator.js +0 -25
- package/dist/config/aptos-env-validator.js.map +0 -1
- package/dist/explorer-ui/assets/EventDetailPanel-CnSaMk3V.js +0 -6
- package/dist/explorer-ui/assets/FilterBar-BEmAzBku.js +0 -26
- package/dist/explorer-ui/assets/chevron-right-BUT9VhYe.js +0 -11
- package/dist/explorer-ui/assets/index-BZ2INVgy.js +0 -360
- package/dist/explorer-ui/assets/index-Cemh6svI.css +0 -1
- package/dist/explorer-ui/index.html +0 -14
- package/dist/explorer-ui/vite.svg +0 -1
- package/dist/security/backends/aws-kms-backend.d.ts +0 -18
- package/dist/security/backends/aws-kms-backend.d.ts.map +0 -1
- package/dist/security/backends/aws-kms-backend.js +0 -130
- package/dist/security/backends/aws-kms-backend.js.map +0 -1
- package/dist/security/backends/azure-kv-backend.d.ts +0 -17
- package/dist/security/backends/azure-kv-backend.d.ts.map +0 -1
- package/dist/security/backends/azure-kv-backend.js +0 -121
- package/dist/security/backends/azure-kv-backend.js.map +0 -1
- package/dist/security/backends/gcp-kms-backend.d.ts +0 -17
- package/dist/security/backends/gcp-kms-backend.d.ts.map +0 -1
- package/dist/security/backends/gcp-kms-backend.js +0 -110
- package/dist/security/backends/gcp-kms-backend.js.map +0 -1
- package/dist/security/backends/hsm-backend.d.ts +0 -18
- package/dist/security/backends/hsm-backend.d.ts.map +0 -1
- package/dist/security/backends/hsm-backend.js +0 -187
- package/dist/security/backends/hsm-backend.js.map +0 -1
- package/dist/settlement/aptos-channel-sdk.d.ts +0 -66
- package/dist/settlement/aptos-channel-sdk.d.ts.map +0 -1
- package/dist/settlement/aptos-channel-sdk.js +0 -274
- package/dist/settlement/aptos-channel-sdk.js.map +0 -1
- package/dist/settlement/aptos-claim-signer.d.ts +0 -57
- package/dist/settlement/aptos-claim-signer.d.ts.map +0 -1
- package/dist/settlement/aptos-claim-signer.js +0 -200
- package/dist/settlement/aptos-claim-signer.js.map +0 -1
- package/dist/settlement/aptos-client.d.ts +0 -99
- package/dist/settlement/aptos-client.d.ts.map +0 -1
- package/dist/settlement/aptos-client.js +0 -474
- package/dist/settlement/aptos-client.js.map +0 -1
- package/dist/settlement/xrp-channel-lifecycle.d.ts +0 -41
- package/dist/settlement/xrp-channel-lifecycle.d.ts.map +0 -1
- package/dist/settlement/xrp-channel-lifecycle.js +0 -142
- package/dist/settlement/xrp-channel-lifecycle.js.map +0 -1
- package/dist/settlement/xrp-channel-manager.d.ts +0 -59
- package/dist/settlement/xrp-channel-manager.d.ts.map +0 -1
- package/dist/settlement/xrp-channel-manager.js +0 -160
- package/dist/settlement/xrp-channel-manager.js.map +0 -1
- package/dist/settlement/xrp-channel-sdk.d.ts +0 -30
- package/dist/settlement/xrp-channel-sdk.d.ts.map +0 -1
- package/dist/settlement/xrp-channel-sdk.js +0 -164
- package/dist/settlement/xrp-channel-sdk.js.map +0 -1
- package/dist/settlement/xrp-claim-signer.d.ts +0 -22
- package/dist/settlement/xrp-claim-signer.d.ts.map +0 -1
- package/dist/settlement/xrp-claim-signer.js +0 -122
- package/dist/settlement/xrp-claim-signer.js.map +0 -1
- package/dist/settlement/xrpl-client.d.ts +0 -104
- package/dist/settlement/xrpl-client.d.ts.map +0 -1
- package/dist/settlement/xrpl-client.js +0 -304
- package/dist/settlement/xrpl-client.js.map +0 -1
- package/dist/test/testnet-config.d.ts +0 -58
- package/dist/test/testnet-config.d.ts.map +0 -1
- package/dist/test/testnet-config.js +0 -89
- package/dist/test/testnet-config.js.map +0 -1
- package/dist/utils/xrp-wss-connection-pool.d.ts +0 -8
- package/dist/utils/xrp-wss-connection-pool.d.ts.map +0 -1
- package/dist/utils/xrp-wss-connection-pool.js +0 -42
- package/dist/utils/xrp-wss-connection-pool.js.map +0 -1
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.XRPChannelLifecycleManager = void 0;
|
|
4
|
-
class XRPChannelLifecycleManager {
|
|
5
|
-
config;
|
|
6
|
-
xrpChannelSDK;
|
|
7
|
-
logger;
|
|
8
|
-
channels;
|
|
9
|
-
idleCheckTimer = null;
|
|
10
|
-
constructor(config, xrpChannelSDK, logger) {
|
|
11
|
-
this.config = config;
|
|
12
|
-
this.xrpChannelSDK = xrpChannelSDK;
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.channels = new Map();
|
|
15
|
-
}
|
|
16
|
-
async start() {
|
|
17
|
-
if (!this.config.enabled) {
|
|
18
|
-
this.logger.info('XRP channel lifecycle manager disabled');
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
this.idleCheckTimer = setInterval(async () => {
|
|
22
|
-
await this.detectIdleChannels();
|
|
23
|
-
await this.detectExpiringChannels();
|
|
24
|
-
}, 3600000);
|
|
25
|
-
this.logger.info('XRP channel lifecycle manager started');
|
|
26
|
-
}
|
|
27
|
-
stop() {
|
|
28
|
-
if (this.idleCheckTimer) {
|
|
29
|
-
clearInterval(this.idleCheckTimer);
|
|
30
|
-
this.idleCheckTimer = null;
|
|
31
|
-
}
|
|
32
|
-
this.logger.info('XRP channel lifecycle manager stopped');
|
|
33
|
-
}
|
|
34
|
-
async getOrCreateChannel(peerId, destination) {
|
|
35
|
-
const existingChannel = this.channels.get(peerId);
|
|
36
|
-
if (existingChannel && existingChannel.status === 'open') {
|
|
37
|
-
this.logger.debug({ peerId, channelId: existingChannel.channelId }, 'Using existing XRP channel');
|
|
38
|
-
return existingChannel.channelId;
|
|
39
|
-
}
|
|
40
|
-
this.logger.info({ peerId, destination, amount: this.config.initialChannelAmount }, 'Creating new XRP channel');
|
|
41
|
-
const channelId = await this.xrpChannelSDK.openChannel(destination, this.config.initialChannelAmount, this.config.defaultSettleDelay, peerId);
|
|
42
|
-
this.channels.set(peerId, {
|
|
43
|
-
channelId,
|
|
44
|
-
peerId,
|
|
45
|
-
destination,
|
|
46
|
-
amount: this.config.initialChannelAmount,
|
|
47
|
-
balance: '0',
|
|
48
|
-
settleDelay: this.config.defaultSettleDelay,
|
|
49
|
-
status: 'open',
|
|
50
|
-
lastActivityAt: Date.now(),
|
|
51
|
-
cancelAfter: this.config.cancelAfter
|
|
52
|
-
? Math.floor(Date.now() / 1000) + this.config.cancelAfter
|
|
53
|
-
: undefined,
|
|
54
|
-
});
|
|
55
|
-
this.logger.info({ peerId, channelId }, 'XRP channel created and tracked');
|
|
56
|
-
return channelId;
|
|
57
|
-
}
|
|
58
|
-
updateChannelActivity(peerId, claimAmount) {
|
|
59
|
-
const channel = this.channels.get(peerId);
|
|
60
|
-
if (!channel) {
|
|
61
|
-
this.logger.warn({ peerId }, 'Cannot update activity: channel not found');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
channel.balance = claimAmount;
|
|
65
|
-
channel.lastActivityAt = Date.now();
|
|
66
|
-
this.logger.debug({ peerId, channelId: channel.channelId, claimAmount }, 'XRP channel activity updated');
|
|
67
|
-
}
|
|
68
|
-
needsFunding(peerId) {
|
|
69
|
-
const channel = this.channels.get(peerId);
|
|
70
|
-
if (!channel || channel.status !== 'open') {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
const amount = BigInt(channel.amount);
|
|
74
|
-
const balance = BigInt(channel.balance);
|
|
75
|
-
const remainingBalance = amount - balance;
|
|
76
|
-
const threshold = (amount * BigInt(Math.floor(this.config.minBalanceThreshold * 100))) / 100n;
|
|
77
|
-
return remainingBalance < threshold;
|
|
78
|
-
}
|
|
79
|
-
async fundChannel(peerId, additionalAmount) {
|
|
80
|
-
const channel = this.channels.get(peerId);
|
|
81
|
-
if (!channel) {
|
|
82
|
-
throw new Error(`Cannot fund channel: peer ${peerId} not found`);
|
|
83
|
-
}
|
|
84
|
-
if (channel.status !== 'open') {
|
|
85
|
-
throw new Error(`Cannot fund channel: channel ${channel.channelId} status is ${channel.status}`);
|
|
86
|
-
}
|
|
87
|
-
this.logger.info({ peerId, channelId: channel.channelId, additionalAmount }, 'Funding XRP channel');
|
|
88
|
-
await this.xrpChannelSDK.fundChannel(channel.channelId, additionalAmount);
|
|
89
|
-
const currentAmount = BigInt(channel.amount);
|
|
90
|
-
const newAmount = currentAmount + BigInt(additionalAmount);
|
|
91
|
-
channel.amount = newAmount.toString();
|
|
92
|
-
this.logger.info({ peerId, channelId: channel.channelId, newAmount: channel.amount }, 'XRP channel funded');
|
|
93
|
-
}
|
|
94
|
-
async closeChannel(peerId, reason) {
|
|
95
|
-
const channel = this.channels.get(peerId);
|
|
96
|
-
if (!channel) {
|
|
97
|
-
this.logger.warn({ peerId }, 'Cannot close channel: not found');
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
if (channel.status !== 'open') {
|
|
101
|
-
this.logger.warn({ peerId, status: channel.status }, 'Cannot close channel: not open');
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
this.logger.info({ peerId, channelId: channel.channelId, reason }, 'Closing XRP channel');
|
|
105
|
-
await this.xrpChannelSDK.closeChannel(channel.channelId, peerId);
|
|
106
|
-
channel.status = 'closing';
|
|
107
|
-
this.logger.info({ peerId, channelId: channel.channelId }, 'XRP channel closed (settling after delay)');
|
|
108
|
-
}
|
|
109
|
-
getChannelForPeer(peerId) {
|
|
110
|
-
return this.channels.get(peerId) ?? null;
|
|
111
|
-
}
|
|
112
|
-
async detectIdleChannels() {
|
|
113
|
-
const now = Date.now();
|
|
114
|
-
const idleThreshold = this.config.idleChannelThreshold * 1000;
|
|
115
|
-
for (const [peerId, channel] of this.channels.entries()) {
|
|
116
|
-
if (channel.status !== 'open') {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
const idleTime = now - channel.lastActivityAt;
|
|
120
|
-
if (idleTime > idleThreshold) {
|
|
121
|
-
this.logger.info({ peerId, channelId: channel.channelId, idleTimeHours: idleTime / 3600000 }, 'Detected idle XRP channel, closing');
|
|
122
|
-
await this.closeChannel(peerId, 'idle');
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
async detectExpiringChannels() {
|
|
127
|
-
const now = Math.floor(Date.now() / 1000);
|
|
128
|
-
const expirationBuffer = 3600;
|
|
129
|
-
for (const [peerId, channel] of this.channels.entries()) {
|
|
130
|
-
if (channel.status !== 'open' || !channel.cancelAfter) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
const timeUntilExpiration = channel.cancelAfter - now;
|
|
134
|
-
if (timeUntilExpiration <= expirationBuffer) {
|
|
135
|
-
this.logger.info({ peerId, channelId: channel.channelId, expiresIn: timeUntilExpiration }, 'XRP channel expiring soon, closing');
|
|
136
|
-
await this.closeChannel(peerId, 'expiration');
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
exports.XRPChannelLifecycleManager = XRPChannelLifecycleManager;
|
|
142
|
-
//# sourceMappingURL=xrp-channel-lifecycle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-channel-lifecycle.js","sourceRoot":"","sources":["../../src/settlement/xrp-channel-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { XRPLClient, XRPLClientConfig } from './xrpl-client';
|
|
2
|
-
import type { Database } from 'better-sqlite3';
|
|
3
|
-
import type { Logger } from 'pino';
|
|
4
|
-
import type { XRPWSSConnectionPool } from '../utils/xrp-wss-connection-pool';
|
|
5
|
-
export interface XRPChannelState {
|
|
6
|
-
channelId: string;
|
|
7
|
-
account: string;
|
|
8
|
-
destination: string;
|
|
9
|
-
amount: string;
|
|
10
|
-
balance: string;
|
|
11
|
-
settleDelay: number;
|
|
12
|
-
publicKey: string;
|
|
13
|
-
cancelAfter?: number;
|
|
14
|
-
expiration?: number;
|
|
15
|
-
status: 'open' | 'closing' | 'closed';
|
|
16
|
-
}
|
|
17
|
-
export interface IPaymentChannelManager {
|
|
18
|
-
createChannel(destination: string, amount: string, settleDelay: number): Promise<string>;
|
|
19
|
-
fundChannel(channelId: string, additionalAmount: string): Promise<void>;
|
|
20
|
-
getChannelState(channelId: string): Promise<XRPChannelState>;
|
|
21
|
-
getChannelsForPeer(peerAddress: string): Promise<string[]>;
|
|
22
|
-
submitClaim(channelId: string, amount: string, signature: string, publicKey: string): Promise<{
|
|
23
|
-
hash: string;
|
|
24
|
-
ledgerIndex: number;
|
|
25
|
-
result: Record<string, unknown>;
|
|
26
|
-
}>;
|
|
27
|
-
closeChannel(channelId: string): Promise<{
|
|
28
|
-
hash: string;
|
|
29
|
-
ledgerIndex: number;
|
|
30
|
-
result: Record<string, unknown>;
|
|
31
|
-
}>;
|
|
32
|
-
}
|
|
33
|
-
export declare class PaymentChannelManager implements IPaymentChannelManager {
|
|
34
|
-
private readonly xrplClient;
|
|
35
|
-
private readonly claimSigner;
|
|
36
|
-
private readonly db;
|
|
37
|
-
private readonly logger;
|
|
38
|
-
constructor(xrplClient: XRPLClient, db: Database, logger: Logger);
|
|
39
|
-
static fromConnectionPool(pool: XRPWSSConnectionPool, config: Omit<XRPLClientConfig, 'wssUrl'> & {
|
|
40
|
-
wssUrl?: string;
|
|
41
|
-
}, db: Database, logger: Logger): PaymentChannelManager;
|
|
42
|
-
createChannel(destination: string, amount: string, settleDelay: number): Promise<string>;
|
|
43
|
-
fundChannel(channelId: string, additionalAmount: string): Promise<void>;
|
|
44
|
-
getChannelState(channelId: string): Promise<XRPChannelState>;
|
|
45
|
-
getChannelsForPeer(peerAddress: string): Promise<string[]>;
|
|
46
|
-
submitClaim(channelId: string, amount: string, signature: string, publicKey: string): Promise<{
|
|
47
|
-
hash: string;
|
|
48
|
-
ledgerIndex: number;
|
|
49
|
-
result: Record<string, unknown>;
|
|
50
|
-
}>;
|
|
51
|
-
closeChannel(channelId: string): Promise<{
|
|
52
|
-
hash: string;
|
|
53
|
-
ledgerIndex: number;
|
|
54
|
-
result: Record<string, unknown>;
|
|
55
|
-
}>;
|
|
56
|
-
private updateChannelBalance;
|
|
57
|
-
private determineChannelStatus;
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=xrp-channel-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-channel-manager.d.ts","sourceRoot":"","sources":["../../src/settlement/xrp-channel-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PaymentChannelManager = void 0;
|
|
4
|
-
const xrpl_client_1 = require("./xrpl-client");
|
|
5
|
-
const xrp_claim_signer_1 = require("./xrp-claim-signer");
|
|
6
|
-
const key_manager_1 = require("../security/key-manager");
|
|
7
|
-
class PaymentChannelManager {
|
|
8
|
-
xrplClient;
|
|
9
|
-
claimSigner;
|
|
10
|
-
db;
|
|
11
|
-
logger;
|
|
12
|
-
constructor(xrplClient, db, logger) {
|
|
13
|
-
this.xrplClient = xrplClient;
|
|
14
|
-
this.db = db;
|
|
15
|
-
this.logger = logger;
|
|
16
|
-
const keyManager = new key_manager_1.KeyManager({
|
|
17
|
-
backend: 'env',
|
|
18
|
-
nodeId: 'xrp-channel-manager',
|
|
19
|
-
}, logger);
|
|
20
|
-
this.claimSigner = new xrp_claim_signer_1.ClaimSigner(db, logger, keyManager, 'xrp');
|
|
21
|
-
this.claimSigner.getPublicKey().then((publicKey) => {
|
|
22
|
-
this.logger.info({ publicKey }, 'ClaimSigner initialized for payment channel claims');
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
static fromConnectionPool(pool, config, db, logger) {
|
|
26
|
-
const poolClient = pool.getClient();
|
|
27
|
-
if (!poolClient) {
|
|
28
|
-
throw new Error('No healthy XRP WebSocket connection available in pool');
|
|
29
|
-
}
|
|
30
|
-
const wssUrl = config.wssUrl || 'wss://xrplcluster.com';
|
|
31
|
-
const xrplConfig = {
|
|
32
|
-
...config,
|
|
33
|
-
wssUrl,
|
|
34
|
-
};
|
|
35
|
-
const xrplClient = new xrpl_client_1.XRPLClient(xrplConfig, logger);
|
|
36
|
-
logger.info({ wssUrl }, 'Creating PaymentChannelManager from connection pool');
|
|
37
|
-
return new PaymentChannelManager(xrplClient, db, logger);
|
|
38
|
-
}
|
|
39
|
-
async createChannel(destination, amount, settleDelay) {
|
|
40
|
-
this.logger.info({ destination, amount, settleDelay }, 'Creating XRP payment channel...');
|
|
41
|
-
if (!destination.startsWith('r')) {
|
|
42
|
-
throw new Error('Invalid destination address format (must be r-address)');
|
|
43
|
-
}
|
|
44
|
-
if (BigInt(amount) <= BigInt(0)) {
|
|
45
|
-
throw new Error('Amount must be positive');
|
|
46
|
-
}
|
|
47
|
-
if (settleDelay < 3600) {
|
|
48
|
-
this.logger.warn({ settleDelay }, 'SettleDelay below 1 hour (3600s) not recommended for production');
|
|
49
|
-
}
|
|
50
|
-
const publicKey = await this.claimSigner.getPublicKey();
|
|
51
|
-
const tx = {
|
|
52
|
-
TransactionType: 'PaymentChannelCreate',
|
|
53
|
-
Account: this.xrplClient['wallet'].address,
|
|
54
|
-
Destination: destination,
|
|
55
|
-
Amount: amount,
|
|
56
|
-
SettleDelay: settleDelay,
|
|
57
|
-
PublicKey: publicKey,
|
|
58
|
-
};
|
|
59
|
-
const result = await this.xrplClient.submitAndWait(tx);
|
|
60
|
-
const channelId = result.hash;
|
|
61
|
-
this.logger.info({ channelId, destination, amount }, 'XRP payment channel created');
|
|
62
|
-
const channelState = await this.getChannelState(channelId);
|
|
63
|
-
this.db
|
|
64
|
-
.prepare(`
|
|
65
|
-
INSERT INTO xrp_channels (
|
|
66
|
-
channel_id, account, destination, amount, balance,
|
|
67
|
-
settle_delay, public_key, status, created_at
|
|
68
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
69
|
-
`)
|
|
70
|
-
.run(channelId, channelState.account, channelState.destination, channelState.amount, channelState.balance, channelState.settleDelay, channelState.publicKey, channelState.status, Date.now());
|
|
71
|
-
this.logger.info({ channelId }, 'Channel metadata stored in database');
|
|
72
|
-
return channelId;
|
|
73
|
-
}
|
|
74
|
-
async fundChannel(channelId, additionalAmount) {
|
|
75
|
-
this.logger.info({ channelId, additionalAmount }, 'Funding XRP payment channel...');
|
|
76
|
-
const currentState = await this.getChannelState(channelId);
|
|
77
|
-
if (currentState.status !== 'open') {
|
|
78
|
-
throw new Error(`Cannot fund channel in status: ${currentState.status} (must be open)`);
|
|
79
|
-
}
|
|
80
|
-
const tx = {
|
|
81
|
-
TransactionType: 'PaymentChannelFund',
|
|
82
|
-
Account: this.xrplClient['wallet'].address,
|
|
83
|
-
Channel: channelId,
|
|
84
|
-
Amount: additionalAmount,
|
|
85
|
-
};
|
|
86
|
-
await this.xrplClient.submitAndWait(tx);
|
|
87
|
-
const newAmount = (BigInt(currentState.amount) + BigInt(additionalAmount)).toString();
|
|
88
|
-
this.db
|
|
89
|
-
.prepare('UPDATE xrp_channels SET amount = ? WHERE channel_id = ?')
|
|
90
|
-
.run(newAmount, channelId);
|
|
91
|
-
this.logger.info({ channelId, newAmount }, 'XRP payment channel funded successfully');
|
|
92
|
-
}
|
|
93
|
-
async getChannelState(channelId) {
|
|
94
|
-
try {
|
|
95
|
-
const ledgerEntry = await this.xrplClient.getLedgerEntry(channelId);
|
|
96
|
-
const entry = ledgerEntry;
|
|
97
|
-
const channelState = {
|
|
98
|
-
channelId: channelId,
|
|
99
|
-
account: entry.Account,
|
|
100
|
-
destination: entry.Destination,
|
|
101
|
-
amount: entry.Amount,
|
|
102
|
-
balance: entry.Balance || '0',
|
|
103
|
-
settleDelay: entry.SettleDelay,
|
|
104
|
-
publicKey: entry.PublicKey,
|
|
105
|
-
cancelAfter: entry.CancelAfter,
|
|
106
|
-
expiration: entry.Expiration,
|
|
107
|
-
status: this.determineChannelStatus(entry),
|
|
108
|
-
};
|
|
109
|
-
return channelState;
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
this.logger.error({ error, channelId }, 'Failed to get channel state');
|
|
113
|
-
throw error;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
async getChannelsForPeer(peerAddress) {
|
|
117
|
-
const rows = this.db
|
|
118
|
-
.prepare('SELECT channel_id FROM xrp_channels WHERE destination = ?')
|
|
119
|
-
.all(peerAddress);
|
|
120
|
-
return rows.map((row) => row.channel_id);
|
|
121
|
-
}
|
|
122
|
-
async submitClaim(channelId, amount, signature, publicKey) {
|
|
123
|
-
this.logger.info({ channelId, amount }, 'Submitting claim via PaymentChannelManager...');
|
|
124
|
-
const result = await this.xrplClient.submitClaim(channelId, amount, signature, publicKey);
|
|
125
|
-
await this.updateChannelBalance(channelId, amount);
|
|
126
|
-
this.logger.info({ channelId, amount }, 'Claim submitted and database updated');
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
async closeChannel(channelId) {
|
|
130
|
-
this.logger.info({ channelId }, 'Closing channel via PaymentChannelManager...');
|
|
131
|
-
const result = await this.xrplClient.closeChannel(channelId);
|
|
132
|
-
this.db
|
|
133
|
-
.prepare('UPDATE xrp_channels SET status = ?, updated_at = ? WHERE channel_id = ?')
|
|
134
|
-
.run('closing', Date.now(), channelId);
|
|
135
|
-
this.logger.info({ channelId }, 'Channel closure initiated and database updated');
|
|
136
|
-
return result;
|
|
137
|
-
}
|
|
138
|
-
async updateChannelBalance(channelId, claimedAmount) {
|
|
139
|
-
this.db
|
|
140
|
-
.prepare('UPDATE xrp_channels SET balance = ?, updated_at = ? WHERE channel_id = ?')
|
|
141
|
-
.run(claimedAmount, Date.now(), channelId);
|
|
142
|
-
this.logger.info({ channelId, balance: claimedAmount }, 'Channel balance updated in database');
|
|
143
|
-
}
|
|
144
|
-
determineChannelStatus(ledgerEntry) {
|
|
145
|
-
if (ledgerEntry.Expiration) {
|
|
146
|
-
const now = Math.floor(Date.now() / 1000);
|
|
147
|
-
const rippleEpoch = 946684800;
|
|
148
|
-
const expirationUnix = ledgerEntry.Expiration + rippleEpoch;
|
|
149
|
-
if (now < expirationUnix + ledgerEntry.SettleDelay) {
|
|
150
|
-
return 'closing';
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
return 'closed';
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return 'open';
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
exports.PaymentChannelManager = PaymentChannelManager;
|
|
160
|
-
//# sourceMappingURL=xrp-channel-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-channel-manager.js","sourceRoot":"","sources":["../../src/settlement/xrp-channel-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Logger } from 'pino';
|
|
2
|
-
import type { XRPLClient } from './xrpl-client';
|
|
3
|
-
import type { ClaimSigner } from './xrp-claim-signer';
|
|
4
|
-
import type { PaymentChannelManager, XRPChannelState } from './xrp-channel-manager';
|
|
5
|
-
import type { XRPClaim } from './types';
|
|
6
|
-
import type { TelemetryEmitter } from '../telemetry/telemetry-emitter';
|
|
7
|
-
export declare class XRPChannelSDK {
|
|
8
|
-
private readonly xrplClient;
|
|
9
|
-
private readonly channelManager;
|
|
10
|
-
private readonly claimSigner;
|
|
11
|
-
private readonly logger;
|
|
12
|
-
private readonly telemetryEmitter?;
|
|
13
|
-
private channelStateCache;
|
|
14
|
-
private refreshIntervalId?;
|
|
15
|
-
constructor(xrplClient: XRPLClient, channelManager: PaymentChannelManager, claimSigner: ClaimSigner, logger: Logger, telemetryEmitter?: TelemetryEmitter | undefined);
|
|
16
|
-
openChannel(destination: string, amount: string, settleDelay: number, peerId?: string): Promise<string>;
|
|
17
|
-
fundChannel(channelId: string, additionalAmount: string): Promise<void>;
|
|
18
|
-
signClaim(channelId: string, amount: string): Promise<XRPClaim>;
|
|
19
|
-
verifyClaim(claim: XRPClaim): Promise<boolean>;
|
|
20
|
-
submitClaim(claim: XRPClaim, peerId?: string): Promise<void>;
|
|
21
|
-
closeChannel(channelId: string, peerId?: string): Promise<void>;
|
|
22
|
-
getChannelState(channelId: string): Promise<XRPChannelState>;
|
|
23
|
-
getMyChannels(): Promise<string[]>;
|
|
24
|
-
startAutoRefresh(): void;
|
|
25
|
-
stopAutoRefresh(): void;
|
|
26
|
-
private refreshChannelState;
|
|
27
|
-
private refreshAllChannels;
|
|
28
|
-
private parseChannelState;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=xrp-channel-sdk.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-channel-sdk.d.ts","sourceRoot":"","sources":["../../src/settlement/xrp-channel-sdk.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AA0BvE,qBAAa,aAAa;IActB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAjBpC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAYxB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,qBAAqB,EACrC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,gBAAgB,YAAA;IAyBhD,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAoCZ,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCvE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+B/D,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB9C,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD5D,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC/D,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAoC5D,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBxC,gBAAgB,IAAI,IAAI;IA2BxB,eAAe,IAAI,IAAI;YAeT,mBAAmB;YAcnB,kBAAkB;IAehC,OAAO,CAAC,iBAAiB;CAc1B"}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.XRPChannelSDK = void 0;
|
|
4
|
-
class XRPChannelSDK {
|
|
5
|
-
xrplClient;
|
|
6
|
-
channelManager;
|
|
7
|
-
claimSigner;
|
|
8
|
-
logger;
|
|
9
|
-
telemetryEmitter;
|
|
10
|
-
channelStateCache;
|
|
11
|
-
refreshIntervalId;
|
|
12
|
-
constructor(xrplClient, channelManager, claimSigner, logger, telemetryEmitter) {
|
|
13
|
-
this.xrplClient = xrplClient;
|
|
14
|
-
this.channelManager = channelManager;
|
|
15
|
-
this.claimSigner = claimSigner;
|
|
16
|
-
this.logger = logger;
|
|
17
|
-
this.telemetryEmitter = telemetryEmitter;
|
|
18
|
-
this.channelStateCache = new Map();
|
|
19
|
-
}
|
|
20
|
-
async openChannel(destination, amount, settleDelay, peerId) {
|
|
21
|
-
this.logger.info({ destination, amount, settleDelay }, 'Opening XRP payment channel...');
|
|
22
|
-
const channelId = await this.channelManager.createChannel(destination, amount, settleDelay);
|
|
23
|
-
const channelState = await this.getChannelState(channelId);
|
|
24
|
-
this.channelStateCache.set(channelId, channelState);
|
|
25
|
-
try {
|
|
26
|
-
this.telemetryEmitter?.emitXRPChannelOpened(channelState, peerId);
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
this.logger.error({ error }, 'Failed to emit XRP_CHANNEL_OPENED telemetry');
|
|
30
|
-
}
|
|
31
|
-
this.logger.info({ channelId }, 'XRP payment channel opened successfully');
|
|
32
|
-
return channelId;
|
|
33
|
-
}
|
|
34
|
-
async fundChannel(channelId, additionalAmount) {
|
|
35
|
-
this.logger.info({ channelId, additionalAmount }, 'Funding XRP payment channel...');
|
|
36
|
-
const tx = {
|
|
37
|
-
TransactionType: 'PaymentChannelFund',
|
|
38
|
-
Account: this.xrplClient.address,
|
|
39
|
-
Channel: channelId,
|
|
40
|
-
Amount: additionalAmount,
|
|
41
|
-
};
|
|
42
|
-
await this.xrplClient.submitAndWait(tx);
|
|
43
|
-
await this.refreshChannelState(channelId);
|
|
44
|
-
this.logger.info({ channelId, additionalAmount }, 'XRP payment channel funded successfully');
|
|
45
|
-
}
|
|
46
|
-
async signClaim(channelId, amount) {
|
|
47
|
-
this.logger.info({ channelId, amount }, 'Signing XRP payment channel claim...');
|
|
48
|
-
const signature = await this.claimSigner.signClaim(channelId, amount);
|
|
49
|
-
const publicKey = await this.claimSigner.getPublicKey();
|
|
50
|
-
return {
|
|
51
|
-
channelId,
|
|
52
|
-
amount,
|
|
53
|
-
signature,
|
|
54
|
-
publicKey,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
async verifyClaim(claim) {
|
|
58
|
-
return this.claimSigner.verifyClaim(claim.channelId, claim.amount, claim.signature, claim.publicKey);
|
|
59
|
-
}
|
|
60
|
-
async submitClaim(claim, peerId) {
|
|
61
|
-
this.logger.info({ claim }, 'Submitting XRP payment channel claim...');
|
|
62
|
-
if (!(await this.verifyClaim(claim))) {
|
|
63
|
-
throw new Error(`Invalid claim signature for channel ${claim.channelId}`);
|
|
64
|
-
}
|
|
65
|
-
const channelStateBefore = this.channelStateCache.get(claim.channelId);
|
|
66
|
-
await this.channelManager.submitClaim(claim.channelId, claim.amount, claim.signature, claim.publicKey);
|
|
67
|
-
await this.refreshChannelState(claim.channelId);
|
|
68
|
-
const remainingBalance = channelStateBefore
|
|
69
|
-
? (BigInt(channelStateBefore.amount) - BigInt(claim.amount)).toString()
|
|
70
|
-
: '0';
|
|
71
|
-
try {
|
|
72
|
-
this.telemetryEmitter?.emitXRPChannelClaimed(claim.channelId, claim.amount, remainingBalance, peerId);
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
this.logger.error({ error }, 'Failed to emit XRP_CHANNEL_CLAIMED telemetry');
|
|
76
|
-
}
|
|
77
|
-
this.logger.info({ channelId: claim.channelId }, 'XRP claim submitted successfully');
|
|
78
|
-
}
|
|
79
|
-
async closeChannel(channelId, peerId) {
|
|
80
|
-
this.logger.info({ channelId }, 'Closing XRP payment channel...');
|
|
81
|
-
const channelStateBefore = this.channelStateCache.get(channelId);
|
|
82
|
-
const finalBalance = channelStateBefore?.balance || '0';
|
|
83
|
-
await this.channelManager.closeChannel(channelId);
|
|
84
|
-
await this.refreshChannelState(channelId);
|
|
85
|
-
try {
|
|
86
|
-
this.telemetryEmitter?.emitXRPChannelClosed(channelId, finalBalance, 'cooperative', peerId);
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
this.logger.error({ error }, 'Failed to emit XRP_CHANNEL_CLOSED telemetry');
|
|
90
|
-
}
|
|
91
|
-
this.logger.info({ channelId }, 'XRP channel close initiated (settling after delay)');
|
|
92
|
-
}
|
|
93
|
-
async getChannelState(channelId) {
|
|
94
|
-
this.logger.debug({ channelId }, 'Querying XRP channel state from ledger...');
|
|
95
|
-
const ledgerEntry = await this.xrplClient.request({
|
|
96
|
-
command: 'ledger_entry',
|
|
97
|
-
payment_channel: channelId,
|
|
98
|
-
});
|
|
99
|
-
const channelState = this.parseChannelState(ledgerEntry.result.node);
|
|
100
|
-
this.channelStateCache.set(channelId, channelState);
|
|
101
|
-
return channelState;
|
|
102
|
-
}
|
|
103
|
-
async getMyChannels() {
|
|
104
|
-
this.logger.debug('Querying all XRP channels for account...');
|
|
105
|
-
const xrplClientWithProps = this.xrplClient;
|
|
106
|
-
const accountChannels = await xrplClientWithProps.request({
|
|
107
|
-
command: 'account_channels',
|
|
108
|
-
account: xrplClientWithProps.address,
|
|
109
|
-
});
|
|
110
|
-
return accountChannels.result.channels.map((c) => c.channel_id);
|
|
111
|
-
}
|
|
112
|
-
startAutoRefresh() {
|
|
113
|
-
if (this.refreshIntervalId) {
|
|
114
|
-
this.logger.warn('Auto-refresh already started');
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
this.logger.info('Starting XRP channel auto-refresh (30s interval)');
|
|
118
|
-
this.refreshIntervalId = setInterval(async () => {
|
|
119
|
-
try {
|
|
120
|
-
await this.refreshAllChannels();
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
this.logger.error({ error }, 'Error during channel auto-refresh');
|
|
124
|
-
}
|
|
125
|
-
}, 30000);
|
|
126
|
-
}
|
|
127
|
-
stopAutoRefresh() {
|
|
128
|
-
if (this.refreshIntervalId) {
|
|
129
|
-
clearInterval(this.refreshIntervalId);
|
|
130
|
-
this.refreshIntervalId = undefined;
|
|
131
|
-
this.logger.info('XRP channel auto-refresh stopped');
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async refreshChannelState(channelId) {
|
|
135
|
-
try {
|
|
136
|
-
const channelState = await this.getChannelState(channelId);
|
|
137
|
-
this.channelStateCache.set(channelId, channelState);
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
this.logger.error({ error, channelId }, 'Failed to refresh channel state');
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
async refreshAllChannels() {
|
|
144
|
-
const channelIds = Array.from(this.channelStateCache.keys());
|
|
145
|
-
this.logger.debug({ count: channelIds.length }, 'Refreshing all XRP channels...');
|
|
146
|
-
await Promise.all(channelIds.map((id) => this.refreshChannelState(id)));
|
|
147
|
-
}
|
|
148
|
-
parseChannelState(node) {
|
|
149
|
-
return {
|
|
150
|
-
channelId: node.ChannelID,
|
|
151
|
-
account: node.Account,
|
|
152
|
-
destination: node.Destination,
|
|
153
|
-
amount: node.Amount,
|
|
154
|
-
balance: node.Balance || '0',
|
|
155
|
-
settleDelay: node.SettleDelay,
|
|
156
|
-
publicKey: node.PublicKey,
|
|
157
|
-
cancelAfter: node.CancelAfter,
|
|
158
|
-
expiration: node.Expiration,
|
|
159
|
-
status: node.Expiration ? 'closing' : 'open',
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
exports.XRPChannelSDK = XRPChannelSDK;
|
|
164
|
-
//# sourceMappingURL=xrp-channel-sdk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-channel-sdk.js","sourceRoot":"","sources":["../../src/settlement/xrp-channel-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Database } from 'better-sqlite3';
|
|
2
|
-
import pino from 'pino';
|
|
3
|
-
import { KeyManager } from '../security/key-manager';
|
|
4
|
-
export interface PaymentChannelClaim {
|
|
5
|
-
channelId: string;
|
|
6
|
-
amount: string;
|
|
7
|
-
signature: string;
|
|
8
|
-
publicKey: string;
|
|
9
|
-
createdAt: string;
|
|
10
|
-
}
|
|
11
|
-
export declare class ClaimSigner {
|
|
12
|
-
private readonly db;
|
|
13
|
-
private readonly keyManager;
|
|
14
|
-
private readonly xrpKeyId;
|
|
15
|
-
private readonly logger;
|
|
16
|
-
constructor(db: Database, logger: pino.Logger, keyManager: KeyManager, xrpKeyId: string);
|
|
17
|
-
getPublicKey(): Promise<string>;
|
|
18
|
-
signClaim(channelId: string, amount: string): Promise<string>;
|
|
19
|
-
verifyClaim(channelId: string, amount: string, signature: string, publicKey: string, channelAmount?: string): Promise<boolean>;
|
|
20
|
-
getLatestClaim(channelId: string): Promise<PaymentChannelClaim | null>;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=xrp-claim-signer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xrp-claim-signer.d.ts","sourceRoot":"","sources":["../../src/settlement/xrp-claim-signer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAmCrD,MAAM,WAAW,mBAAmB;IAKlC,SAAS,EAAE,MAAM,CAAC;IAOlB,MAAM,EAAE,MAAM,CAAC;IAOf,SAAS,EAAE,MAAM,CAAC;IAOlB,SAAS,EAAE,MAAM,CAAC;IAKlB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,qBAAa,WAAW;IAcpB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAbrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAWlB,EAAE,EAAE,QAAQ,EAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM;IAYZ,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB/B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+D7D,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC;IAyEb,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CA+B7E"}
|