amped-defi 1.0.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 +757 -0
- package/dist/__mocks__/@sodax/sdk.d.ts +24 -0
- package/dist/__mocks__/@sodax/sdk.d.ts.map +1 -0
- package/dist/__mocks__/@sodax/sdk.js +24 -0
- package/dist/__mocks__/@sodax/sdk.js.map +1 -0
- package/dist/__tests__/setup.d.ts +4 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +32 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +281 -0
- package/dist/index.js.map +1 -0
- package/dist/policy/policyEngine.d.ts +119 -0
- package/dist/policy/policyEngine.d.ts.map +1 -0
- package/dist/policy/policyEngine.js +322 -0
- package/dist/policy/policyEngine.js.map +1 -0
- package/dist/providers/spokeProviderFactory.d.ts +38 -0
- package/dist/providers/spokeProviderFactory.d.ts.map +1 -0
- package/dist/providers/spokeProviderFactory.js +212 -0
- package/dist/providers/spokeProviderFactory.js.map +1 -0
- package/dist/sodax/client.d.ts +34 -0
- package/dist/sodax/client.d.ts.map +1 -0
- package/dist/sodax/client.js +99 -0
- package/dist/sodax/client.js.map +1 -0
- package/dist/tools/bridge.d.ts +105 -0
- package/dist/tools/bridge.d.ts.map +1 -0
- package/dist/tools/bridge.js +334 -0
- package/dist/tools/bridge.js.map +1 -0
- package/dist/tools/discovery.d.ts +141 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +777 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/moneyMarket.d.ts +227 -0
- package/dist/tools/moneyMarket.d.ts.map +1 -0
- package/dist/tools/moneyMarket.js +867 -0
- package/dist/tools/moneyMarket.js.map +1 -0
- package/dist/tools/portfolio.d.ts +43 -0
- package/dist/tools/portfolio.d.ts.map +1 -0
- package/dist/tools/portfolio.js +538 -0
- package/dist/tools/portfolio.js.map +1 -0
- package/dist/tools/swap.d.ts +71 -0
- package/dist/tools/swap.d.ts.map +1 -0
- package/dist/tools/swap.js +762 -0
- package/dist/tools/swap.js.map +1 -0
- package/dist/tools/walletManagement.d.ts +80 -0
- package/dist/tools/walletManagement.d.ts.map +1 -0
- package/dist/tools/walletManagement.js +289 -0
- package/dist/tools/walletManagement.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +2 -0
- package/dist/utils/errorUtils.d.ts.map +1 -0
- package/dist/utils/errorUtils.js +19 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +144 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +310 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/positionAggregator.d.ts +122 -0
- package/dist/utils/positionAggregator.d.ts.map +1 -0
- package/dist/utils/positionAggregator.js +377 -0
- package/dist/utils/positionAggregator.js.map +1 -0
- package/dist/utils/priceService.d.ts +45 -0
- package/dist/utils/priceService.d.ts.map +1 -0
- package/dist/utils/priceService.js +108 -0
- package/dist/utils/priceService.js.map +1 -0
- package/dist/utils/sodaxApi.d.ts +92 -0
- package/dist/utils/sodaxApi.d.ts.map +1 -0
- package/dist/utils/sodaxApi.js +143 -0
- package/dist/utils/sodaxApi.js.map +1 -0
- package/dist/utils/tokenResolver.d.ts +54 -0
- package/dist/utils/tokenResolver.d.ts.map +1 -0
- package/dist/utils/tokenResolver.js +252 -0
- package/dist/utils/tokenResolver.js.map +1 -0
- package/dist/wallet/backendConfig.d.ts +37 -0
- package/dist/wallet/backendConfig.d.ts.map +1 -0
- package/dist/wallet/backendConfig.js +125 -0
- package/dist/wallet/backendConfig.js.map +1 -0
- package/dist/wallet/backends/BankrBackend.d.ts +73 -0
- package/dist/wallet/backends/BankrBackend.d.ts.map +1 -0
- package/dist/wallet/backends/BankrBackend.js +315 -0
- package/dist/wallet/backends/BankrBackend.js.map +1 -0
- package/dist/wallet/backends/BankrWalletProvider.d.ts +75 -0
- package/dist/wallet/backends/BankrWalletProvider.d.ts.map +1 -0
- package/dist/wallet/backends/BankrWalletProvider.js +243 -0
- package/dist/wallet/backends/BankrWalletProvider.js.map +1 -0
- package/dist/wallet/backends/EnvBackend.d.ts +50 -0
- package/dist/wallet/backends/EnvBackend.d.ts.map +1 -0
- package/dist/wallet/backends/EnvBackend.js +114 -0
- package/dist/wallet/backends/EnvBackend.js.map +1 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.d.ts +40 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.d.ts.map +1 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.js +81 -0
- package/dist/wallet/backends/EvmWalletSkillBackend.js.map +1 -0
- package/dist/wallet/backends/index.d.ts +10 -0
- package/dist/wallet/backends/index.d.ts.map +1 -0
- package/dist/wallet/backends/index.js +10 -0
- package/dist/wallet/backends/index.js.map +1 -0
- package/dist/wallet/index.d.ts +9 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +12 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/providers/AmpedWalletProvider.d.ts +107 -0
- package/dist/wallet/providers/AmpedWalletProvider.d.ts.map +1 -0
- package/dist/wallet/providers/AmpedWalletProvider.js +208 -0
- package/dist/wallet/providers/AmpedWalletProvider.js.map +1 -0
- package/dist/wallet/providers/BankrBackend.d.ts +105 -0
- package/dist/wallet/providers/BankrBackend.d.ts.map +1 -0
- package/dist/wallet/providers/BankrBackend.js +327 -0
- package/dist/wallet/providers/BankrBackend.js.map +1 -0
- package/dist/wallet/providers/LocalKeyBackend.d.ts +62 -0
- package/dist/wallet/providers/LocalKeyBackend.d.ts.map +1 -0
- package/dist/wallet/providers/LocalKeyBackend.js +152 -0
- package/dist/wallet/providers/LocalKeyBackend.js.map +1 -0
- package/dist/wallet/providers/chainConfig.d.ts +209 -0
- package/dist/wallet/providers/chainConfig.d.ts.map +1 -0
- package/dist/wallet/providers/chainConfig.js +175 -0
- package/dist/wallet/providers/chainConfig.js.map +1 -0
- package/dist/wallet/providers/index.d.ts +30 -0
- package/dist/wallet/providers/index.d.ts.map +1 -0
- package/dist/wallet/providers/index.js +32 -0
- package/dist/wallet/providers/index.js.map +1 -0
- package/dist/wallet/providers/types.d.ts +156 -0
- package/dist/wallet/providers/types.d.ts.map +1 -0
- package/dist/wallet/providers/types.js +11 -0
- package/dist/wallet/providers/types.js.map +1 -0
- package/dist/wallet/skillWalletAdapter.d.ts +96 -0
- package/dist/wallet/skillWalletAdapter.d.ts.map +1 -0
- package/dist/wallet/skillWalletAdapter.js +280 -0
- package/dist/wallet/skillWalletAdapter.js.map +1 -0
- package/dist/wallet/types.d.ts +134 -0
- package/dist/wallet/types.d.ts.map +1 -0
- package/dist/wallet/types.js +138 -0
- package/dist/wallet/types.js.map +1 -0
- package/dist/wallet/walletManager.d.ts +111 -0
- package/dist/wallet/walletManager.d.ts.map +1 -0
- package/dist/wallet/walletManager.js +476 -0
- package/dist/wallet/walletManager.js.map +1 -0
- package/dist/wallet/walletRegistry.d.ts +95 -0
- package/dist/wallet/walletRegistry.d.ts.map +1 -0
- package/dist/wallet/walletRegistry.js +184 -0
- package/dist/wallet/walletRegistry.js.map +1 -0
- package/index.js +2 -0
- package/openclaw.plugin.json +37 -0
- package/package.json +69 -0
- package/src/__mocks__/@sodax/sdk.ts +28 -0
- package/src/__tests__/errors.test.ts +238 -0
- package/src/__tests__/policyEngine.test.ts +354 -0
- package/src/__tests__/positionAggregator.test.ts +271 -0
- package/src/__tests__/setup.ts +35 -0
- package/src/__tests__/sodaxApi.test.ts +203 -0
- package/src/__tests__/walletRegistry.test.ts +155 -0
- package/src/index.ts +376 -0
- package/src/policy/policyEngine.ts +389 -0
- package/src/providers/spokeProviderFactory.ts +283 -0
- package/src/sodax/client.ts +113 -0
- package/src/tools/bridge.ts +425 -0
- package/src/tools/discovery.ts +989 -0
- package/src/tools/moneyMarket.ts +1265 -0
- package/src/tools/portfolio.ts +697 -0
- package/src/tools/swap.ts +926 -0
- package/src/tools/walletManagement.ts +359 -0
- package/src/types.ts +228 -0
- package/src/utils/errorUtils.ts +16 -0
- package/src/utils/errors.ts +396 -0
- package/src/utils/positionAggregator.ts +559 -0
- package/src/utils/priceService.ts +153 -0
- package/src/utils/sodaxApi.ts +261 -0
- package/src/utils/tokenResolver.ts +286 -0
- package/src/wallet/backendConfig.ts +151 -0
- package/src/wallet/backends/BankrBackend.ts +399 -0
- package/src/wallet/backends/BankrWalletProvider.ts +329 -0
- package/src/wallet/backends/EnvBackend.ts +149 -0
- package/src/wallet/backends/EvmWalletSkillBackend.ts +110 -0
- package/src/wallet/backends/index.ts +10 -0
- package/src/wallet/index.ts +14 -0
- package/src/wallet/providers/AmpedWalletProvider.ts +267 -0
- package/src/wallet/providers/BankrBackend.ts +407 -0
- package/src/wallet/providers/LocalKeyBackend.ts +184 -0
- package/src/wallet/providers/chainConfig.ts +194 -0
- package/src/wallet/providers/index.ts +62 -0
- package/src/wallet/providers/types.ts +186 -0
- package/src/wallet/skillWalletAdapter.ts +335 -0
- package/src/wallet/types.ts +248 -0
- package/src/wallet/walletManager.ts +561 -0
- package/src/wallet/walletRegistry.ts +216 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bankr Backend - Transaction Execution Layer
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: This backend is for EXECUTION ONLY, not routing.
|
|
5
|
+
*
|
|
6
|
+
* Architecture:
|
|
7
|
+
* SODAX SDK (routing) → BankrBackend (execution) → Blockchain
|
|
8
|
+
*
|
|
9
|
+
* What Bankr DOES:
|
|
10
|
+
* ✓ Signs the pre-computed transaction from SODAX
|
|
11
|
+
* ✓ Submits to blockchain via Bankr API
|
|
12
|
+
* ✓ Returns transaction hash
|
|
13
|
+
*
|
|
14
|
+
* What Bankr does NOT do:
|
|
15
|
+
* ✗ NO routing decisions
|
|
16
|
+
* ✗ NO DeFi protocol selection
|
|
17
|
+
* ✗ NO swap optimization
|
|
18
|
+
* ✗ NO interpretation of intent
|
|
19
|
+
*
|
|
20
|
+
* The SODAX SDK always handles routing logic. Bankr receives the exact
|
|
21
|
+
* transaction data (to, data, value, chainId) and submits it verbatim.
|
|
22
|
+
*
|
|
23
|
+
* @see SKILL.md "Transaction Execution Architecture" section
|
|
24
|
+
*/
|
|
25
|
+
import { resolveChainId } from './chainConfig';
|
|
26
|
+
/**
|
|
27
|
+
* Serialize error objects for readable error messages
|
|
28
|
+
*/
|
|
29
|
+
function serializeError(error) {
|
|
30
|
+
if (error instanceof Error)
|
|
31
|
+
return error.message;
|
|
32
|
+
if (typeof error === 'string')
|
|
33
|
+
return error;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.stringify(error, (k, v) => typeof v === 'bigint' ? v.toString() : v, 2);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return String(error);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Chain ID to chain name mapping for Bankr prompts
|
|
43
|
+
*/
|
|
44
|
+
const CHAIN_NAMES = {
|
|
45
|
+
1: 'ethereum',
|
|
46
|
+
8453: 'base',
|
|
47
|
+
137: 'polygon',
|
|
48
|
+
42161: 'arbitrum',
|
|
49
|
+
10: 'optimism',
|
|
50
|
+
1890: 'lightlink',
|
|
51
|
+
146: 'sonic',
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Bankr execution backend
|
|
55
|
+
*
|
|
56
|
+
* Delegates transaction execution to Bankr's Agent API.
|
|
57
|
+
* The agent never has direct access to private keys.
|
|
58
|
+
*/
|
|
59
|
+
export class BankrBackend {
|
|
60
|
+
type = 'bankr';
|
|
61
|
+
apiUrl;
|
|
62
|
+
apiKey;
|
|
63
|
+
userAddress;
|
|
64
|
+
chainId;
|
|
65
|
+
policy;
|
|
66
|
+
// Polling configuration
|
|
67
|
+
pollIntervalMs = 2000;
|
|
68
|
+
maxPollAttempts = 150; // 5 minutes max
|
|
69
|
+
constructor(config) {
|
|
70
|
+
this.apiUrl = config.bankrApiUrl || 'https://api.bankr.bot';
|
|
71
|
+
this.apiKey = config.bankrApiKey;
|
|
72
|
+
this.userAddress = config.userAddress;
|
|
73
|
+
this.chainId = resolveChainId(config.chainId);
|
|
74
|
+
this.policy = config.policy;
|
|
75
|
+
console.log(`[BankrBackend] Initialized for chain ${this.chainId}`);
|
|
76
|
+
console.log(`[BankrBackend] User address: ${this.userAddress}`);
|
|
77
|
+
console.log(`[BankrBackend] API URL: ${this.apiUrl}`);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the wallet address (Bankr-provisioned)
|
|
81
|
+
*/
|
|
82
|
+
async getAddress() {
|
|
83
|
+
return this.userAddress;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Send a transaction via Bankr Agent API
|
|
87
|
+
*
|
|
88
|
+
* Formats the transaction as a natural language prompt and submits
|
|
89
|
+
* to Bankr's async job system.
|
|
90
|
+
*/
|
|
91
|
+
async sendTransaction(tx) {
|
|
92
|
+
console.log(`[BankrBackend] Sending transaction via Bankr API`);
|
|
93
|
+
console.log(`[BankrBackend] To: ${tx.to}`);
|
|
94
|
+
console.log(`[BankrBackend] Value: ${tx.value || 0n}`);
|
|
95
|
+
console.log(`[BankrBackend] Data: ${tx.data ? tx.data.slice(0, 20) + '...' : '0x'}`);
|
|
96
|
+
// Validate against policy
|
|
97
|
+
if (this.policy) {
|
|
98
|
+
await this.validatePolicy(tx);
|
|
99
|
+
}
|
|
100
|
+
// Format transaction as JSON for Bankr prompt
|
|
101
|
+
const txJson = JSON.stringify({
|
|
102
|
+
to: tx.to,
|
|
103
|
+
data: tx.data || '0x',
|
|
104
|
+
value: (tx.value || 0n).toString(),
|
|
105
|
+
chainId: this.chainId,
|
|
106
|
+
});
|
|
107
|
+
// Create natural language prompt for Bankr
|
|
108
|
+
const prompt = `Submit this transaction: ${txJson}`;
|
|
109
|
+
console.log(`[BankrBackend] Submitting prompt to Bankr API`);
|
|
110
|
+
// Submit job to Bankr
|
|
111
|
+
const jobId = await this.submitJob(prompt);
|
|
112
|
+
console.log(`[BankrBackend] Job submitted: ${jobId}`);
|
|
113
|
+
// Poll for completion
|
|
114
|
+
const result = await this.pollJobUntilComplete(jobId);
|
|
115
|
+
// Extract transaction hash from response
|
|
116
|
+
const txHash = this.extractTransactionHash(result);
|
|
117
|
+
if (!txHash) {
|
|
118
|
+
throw new Error(`[BankrBackend] Transaction failed: ${serializeError(result.response || result.error) || 'Unknown error'}`);
|
|
119
|
+
}
|
|
120
|
+
console.log(`[BankrBackend] Transaction hash: ${txHash}`);
|
|
121
|
+
return txHash;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Wait for transaction confirmation
|
|
125
|
+
*
|
|
126
|
+
* Note: With Bankr, the transaction is already confirmed when we get
|
|
127
|
+
* the response. This method exists for interface compatibility but
|
|
128
|
+
* returns a minimal receipt.
|
|
129
|
+
*/
|
|
130
|
+
async waitForTransaction(txHash) {
|
|
131
|
+
console.log(`[BankrBackend] waitForTransaction called for: ${txHash}`);
|
|
132
|
+
// Bankr transactions are confirmed when the job completes
|
|
133
|
+
// We return a minimal receipt since we don't have full details
|
|
134
|
+
return {
|
|
135
|
+
transactionHash: txHash,
|
|
136
|
+
blockNumber: 0n, // Unknown - would need to query chain
|
|
137
|
+
blockHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
138
|
+
from: this.userAddress,
|
|
139
|
+
to: null,
|
|
140
|
+
gasUsed: 0n,
|
|
141
|
+
status: 'success',
|
|
142
|
+
logs: [],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if backend is ready
|
|
147
|
+
*
|
|
148
|
+
* Verifies Bankr API connectivity with a simple balance query.
|
|
149
|
+
*/
|
|
150
|
+
async isReady() {
|
|
151
|
+
if (!this.apiUrl || !this.apiKey || !this.userAddress) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
// Test API connectivity with a simple query
|
|
156
|
+
const response = await fetch(`${this.apiUrl}/agent/prompt`, {
|
|
157
|
+
method: 'POST',
|
|
158
|
+
headers: {
|
|
159
|
+
'X-API-Key': this.apiKey,
|
|
160
|
+
'Content-Type': 'application/json',
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify({ prompt: 'ping' }),
|
|
163
|
+
});
|
|
164
|
+
// Even a 4xx error means API is reachable
|
|
165
|
+
return response.status !== 503 && response.status !== 502;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error('[BankrBackend] Connectivity check failed:', error);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get the chain ID
|
|
174
|
+
*/
|
|
175
|
+
getChainId() {
|
|
176
|
+
return this.chainId;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Submit a job to Bankr Agent API
|
|
180
|
+
*/
|
|
181
|
+
async submitJob(prompt) {
|
|
182
|
+
const response = await fetch(`${this.apiUrl}/agent/prompt`, {
|
|
183
|
+
method: 'POST',
|
|
184
|
+
headers: {
|
|
185
|
+
'X-API-Key': this.apiKey,
|
|
186
|
+
'Content-Type': 'application/json',
|
|
187
|
+
},
|
|
188
|
+
body: JSON.stringify({ prompt }),
|
|
189
|
+
});
|
|
190
|
+
if (!response.ok) {
|
|
191
|
+
const error = await response.text();
|
|
192
|
+
throw new Error(`[BankrBackend] Failed to submit job: ${response.status} ${error}`);
|
|
193
|
+
}
|
|
194
|
+
const data = await response.json();
|
|
195
|
+
if (!data.success || !data.jobId) {
|
|
196
|
+
throw new Error(`[BankrBackend] Invalid job submission response: ${JSON.stringify(data)}`);
|
|
197
|
+
}
|
|
198
|
+
return data.jobId;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Poll for job completion
|
|
202
|
+
*/
|
|
203
|
+
async pollJobUntilComplete(jobId) {
|
|
204
|
+
let lastStatus = '';
|
|
205
|
+
for (let attempt = 0; attempt < this.maxPollAttempts; attempt++) {
|
|
206
|
+
await this.sleep(this.pollIntervalMs);
|
|
207
|
+
const result = await this.getJobStatus(jobId);
|
|
208
|
+
// Log status changes
|
|
209
|
+
if (result.status !== lastStatus) {
|
|
210
|
+
console.log(`[BankrBackend] Job ${jobId} status: ${result.status}`);
|
|
211
|
+
lastStatus = result.status;
|
|
212
|
+
}
|
|
213
|
+
// Log status updates
|
|
214
|
+
if (result.statusUpdates && result.statusUpdates.length > 0) {
|
|
215
|
+
const lastUpdate = result.statusUpdates[result.statusUpdates.length - 1];
|
|
216
|
+
console.log(`[BankrBackend] Progress: ${lastUpdate.message}`);
|
|
217
|
+
}
|
|
218
|
+
// Check for terminal states
|
|
219
|
+
switch (result.status) {
|
|
220
|
+
case 'completed':
|
|
221
|
+
return result;
|
|
222
|
+
case 'failed':
|
|
223
|
+
throw new Error(`[BankrBackend] Job failed: ${serializeError(result.error) || 'Unknown error'}`);
|
|
224
|
+
case 'cancelled':
|
|
225
|
+
throw new Error(`[BankrBackend] Job was cancelled`);
|
|
226
|
+
case 'pending':
|
|
227
|
+
case 'processing':
|
|
228
|
+
// Continue polling
|
|
229
|
+
break;
|
|
230
|
+
default:
|
|
231
|
+
console.warn(`[BankrBackend] Unknown status: ${result.status}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
throw new Error(`[BankrBackend] Job ${jobId} timed out after ${this.maxPollAttempts * this.pollIntervalMs / 1000} seconds`);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get job status from Bankr API
|
|
238
|
+
*/
|
|
239
|
+
async getJobStatus(jobId) {
|
|
240
|
+
const response = await fetch(`${this.apiUrl}/agent/job/${jobId}`, {
|
|
241
|
+
method: 'GET',
|
|
242
|
+
headers: {
|
|
243
|
+
'X-API-Key': this.apiKey,
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
if (!response.ok) {
|
|
247
|
+
const error = await response.text();
|
|
248
|
+
throw new Error(`[BankrBackend] Failed to get job status: ${response.status} ${error}`);
|
|
249
|
+
}
|
|
250
|
+
return await response.json();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Extract transaction hash from Bankr response
|
|
254
|
+
*
|
|
255
|
+
* The response may contain the tx hash in various formats:
|
|
256
|
+
* - In richData array
|
|
257
|
+
* - In the response text (e.g., "Transaction hash: 0x...")
|
|
258
|
+
*/
|
|
259
|
+
extractTransactionHash(result) {
|
|
260
|
+
// Check richData for transaction info
|
|
261
|
+
if (result.richData) {
|
|
262
|
+
for (const item of result.richData) {
|
|
263
|
+
if (item.transactionHash) {
|
|
264
|
+
return item.transactionHash;
|
|
265
|
+
}
|
|
266
|
+
if (item.txHash) {
|
|
267
|
+
return item.txHash;
|
|
268
|
+
}
|
|
269
|
+
if (item.hash) {
|
|
270
|
+
return item.hash;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Try to extract from response text
|
|
275
|
+
if (result.response) {
|
|
276
|
+
// Look for hex transaction hash pattern (0x followed by 64 hex chars)
|
|
277
|
+
const hashMatch = result.response.match(/0x[a-fA-F0-9]{64}/);
|
|
278
|
+
if (hashMatch) {
|
|
279
|
+
return hashMatch[0];
|
|
280
|
+
}
|
|
281
|
+
// Check if response indicates failure
|
|
282
|
+
if (result.response.toLowerCase().includes('reverted') ||
|
|
283
|
+
result.response.toLowerCase().includes('failed') ||
|
|
284
|
+
result.response.toLowerCase().includes('insufficient')) {
|
|
285
|
+
console.error(`[BankrBackend] Transaction failed: ${result.response}`);
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Validate transaction against policy
|
|
293
|
+
*/
|
|
294
|
+
async validatePolicy(tx) {
|
|
295
|
+
if (!this.policy)
|
|
296
|
+
return;
|
|
297
|
+
// Check max value per transaction
|
|
298
|
+
if (this.policy.maxValuePerTx && tx.value && tx.value > this.policy.maxValuePerTx) {
|
|
299
|
+
throw new Error(`Transaction value ${tx.value} exceeds max allowed ${this.policy.maxValuePerTx}`);
|
|
300
|
+
}
|
|
301
|
+
// Check allowed contracts
|
|
302
|
+
if (this.policy.allowedContracts && this.policy.allowedContracts.length > 0) {
|
|
303
|
+
if (!this.policy.allowedContracts.includes(tx.to)) {
|
|
304
|
+
throw new Error(`Contract ${tx.to} is not in the allowed contracts list`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Sleep helper
|
|
310
|
+
*/
|
|
311
|
+
sleep(ms) {
|
|
312
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Create a BankrBackend from configuration
|
|
317
|
+
*/
|
|
318
|
+
export async function createBankrBackend(config) {
|
|
319
|
+
const backend = new BankrBackend(config);
|
|
320
|
+
// Verify connectivity
|
|
321
|
+
const ready = await backend.isReady();
|
|
322
|
+
if (!ready) {
|
|
323
|
+
console.warn('[BankrBackend] Backend created but connectivity check failed');
|
|
324
|
+
}
|
|
325
|
+
return backend;
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=BankrBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BankrBackend.js","sourceRoot":"","sources":["../../../src/wallet/providers/BankrBackend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Key Backend
|
|
3
|
+
*
|
|
4
|
+
* Wallet backend implementation using local private keys.
|
|
5
|
+
* Compatible with evm-wallet-skill's key storage.
|
|
6
|
+
*
|
|
7
|
+
* Uses viem for transaction signing and submission.
|
|
8
|
+
*/
|
|
9
|
+
import { createPublicClient, createWalletClient, type Hash, type Address } from 'viem';
|
|
10
|
+
import type { IWalletBackend, LocalKeyBackendConfig, TransactionRequest, TransactionReceipt } from './types';
|
|
11
|
+
/**
|
|
12
|
+
* Local private key wallet backend
|
|
13
|
+
*
|
|
14
|
+
* Signs transactions locally using the provided private key.
|
|
15
|
+
* This is the standard backend for self-custody wallets.
|
|
16
|
+
*/
|
|
17
|
+
export declare class LocalKeyBackend implements IWalletBackend {
|
|
18
|
+
readonly type: "localKey";
|
|
19
|
+
private readonly account;
|
|
20
|
+
private readonly walletClient;
|
|
21
|
+
private readonly _publicClient;
|
|
22
|
+
private readonly chainId;
|
|
23
|
+
private readonly chain;
|
|
24
|
+
constructor(config: LocalKeyBackendConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Get the wallet address
|
|
27
|
+
*/
|
|
28
|
+
getAddress(): Promise<Address>;
|
|
29
|
+
/**
|
|
30
|
+
* Send a transaction
|
|
31
|
+
*
|
|
32
|
+
* Signs locally and submits via RPC.
|
|
33
|
+
*/
|
|
34
|
+
sendTransaction(tx: TransactionRequest): Promise<Hash>;
|
|
35
|
+
/**
|
|
36
|
+
* Wait for transaction confirmation
|
|
37
|
+
*/
|
|
38
|
+
waitForTransaction(txHash: Hash): Promise<TransactionReceipt>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if backend is ready
|
|
41
|
+
*
|
|
42
|
+
* For local key backend, we verify RPC connectivity.
|
|
43
|
+
*/
|
|
44
|
+
isReady(): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Get the chain ID
|
|
47
|
+
*/
|
|
48
|
+
getChainId(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Get the public client (for external use)
|
|
51
|
+
*/
|
|
52
|
+
getPublicClient(): ReturnType<typeof createPublicClient>;
|
|
53
|
+
/**
|
|
54
|
+
* Get the wallet client (for advanced use cases)
|
|
55
|
+
*/
|
|
56
|
+
getWalletClient(): ReturnType<typeof createWalletClient>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a LocalKeyBackend from configuration
|
|
60
|
+
*/
|
|
61
|
+
export declare function createLocalKeyBackend(config: LocalKeyBackendConfig): Promise<LocalKeyBackend>;
|
|
62
|
+
//# sourceMappingURL=LocalKeyBackend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalKeyBackend.d.ts","sourceRoot":"","sources":["../../../src/wallet/providers/LocalKeyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,KAAK,IAAI,EACT,KAAK,OAAO,EAEb,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAGjB;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwC;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAElB,MAAM,EAAE,qBAAqB;IA2BzC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC;;;;OAIG;IACG,eAAe,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5D;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBnE;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAUjC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,eAAe,IAAI,UAAU,CAAC,OAAO,kBAAkB,CAAC;IAIxD;;OAEG;IACH,eAAe,IAAI,UAAU,CAAC,OAAO,kBAAkB,CAAC;CAGzD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAUnG"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Key Backend
|
|
3
|
+
*
|
|
4
|
+
* Wallet backend implementation using local private keys.
|
|
5
|
+
* Compatible with evm-wallet-skill's key storage.
|
|
6
|
+
*
|
|
7
|
+
* Uses viem for transaction signing and submission.
|
|
8
|
+
*/
|
|
9
|
+
import { createPublicClient, createWalletClient, http, } from 'viem';
|
|
10
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
11
|
+
import { getViemChain, getDefaultRpcUrl, resolveChainId } from './chainConfig';
|
|
12
|
+
/**
|
|
13
|
+
* Local private key wallet backend
|
|
14
|
+
*
|
|
15
|
+
* Signs transactions locally using the provided private key.
|
|
16
|
+
* This is the standard backend for self-custody wallets.
|
|
17
|
+
*/
|
|
18
|
+
export class LocalKeyBackend {
|
|
19
|
+
type = 'localKey';
|
|
20
|
+
account;
|
|
21
|
+
walletClient;
|
|
22
|
+
_publicClient;
|
|
23
|
+
chainId;
|
|
24
|
+
chain;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
// Resolve chain configuration
|
|
27
|
+
this.chainId = resolveChainId(config.chainId);
|
|
28
|
+
this.chain = getViemChain(this.chainId);
|
|
29
|
+
// Get RPC URL (custom or default)
|
|
30
|
+
const rpcUrl = config.rpcUrl || getDefaultRpcUrl(this.chainId);
|
|
31
|
+
// Create account from private key
|
|
32
|
+
this.account = privateKeyToAccount(config.privateKey);
|
|
33
|
+
// Create viem clients
|
|
34
|
+
this._publicClient = createPublicClient({
|
|
35
|
+
chain: this.chain,
|
|
36
|
+
transport: http(rpcUrl),
|
|
37
|
+
});
|
|
38
|
+
this.walletClient = createWalletClient({
|
|
39
|
+
account: this.account,
|
|
40
|
+
chain: this.chain,
|
|
41
|
+
transport: http(rpcUrl),
|
|
42
|
+
});
|
|
43
|
+
console.log(`[LocalKeyBackend] Initialized for chain ${this.chain.name} (${this.chainId})`);
|
|
44
|
+
console.log(`[LocalKeyBackend] Address: ${this.account.address}`);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the wallet address
|
|
48
|
+
*/
|
|
49
|
+
async getAddress() {
|
|
50
|
+
return this.account.address;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Send a transaction
|
|
54
|
+
*
|
|
55
|
+
* Signs locally and submits via RPC.
|
|
56
|
+
*/
|
|
57
|
+
async sendTransaction(tx) {
|
|
58
|
+
console.log(`[LocalKeyBackend] Sending transaction to ${tx.to}`);
|
|
59
|
+
// Build transaction params
|
|
60
|
+
const txParams = {
|
|
61
|
+
account: this.account,
|
|
62
|
+
chain: this.chain,
|
|
63
|
+
to: tx.to,
|
|
64
|
+
value: tx.value || 0n,
|
|
65
|
+
data: tx.data,
|
|
66
|
+
};
|
|
67
|
+
// Add optional gas parameters
|
|
68
|
+
if (tx.gasLimit)
|
|
69
|
+
txParams.gas = tx.gasLimit;
|
|
70
|
+
if (tx.gasPrice)
|
|
71
|
+
txParams.gasPrice = tx.gasPrice;
|
|
72
|
+
if (tx.maxFeePerGas)
|
|
73
|
+
txParams.maxFeePerGas = tx.maxFeePerGas;
|
|
74
|
+
if (tx.maxPriorityFeePerGas)
|
|
75
|
+
txParams.maxPriorityFeePerGas = tx.maxPriorityFeePerGas;
|
|
76
|
+
if (tx.nonce !== undefined)
|
|
77
|
+
txParams.nonce = tx.nonce;
|
|
78
|
+
const hash = await this.walletClient.sendTransaction(txParams);
|
|
79
|
+
console.log(`[LocalKeyBackend] Transaction sent: ${hash}`);
|
|
80
|
+
return hash;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Wait for transaction confirmation
|
|
84
|
+
*/
|
|
85
|
+
async waitForTransaction(txHash) {
|
|
86
|
+
console.log(`[LocalKeyBackend] Waiting for transaction: ${txHash}`);
|
|
87
|
+
const receipt = await this._publicClient.waitForTransactionReceipt({
|
|
88
|
+
hash: txHash,
|
|
89
|
+
});
|
|
90
|
+
console.log(`[LocalKeyBackend] Transaction confirmed in block ${receipt.blockNumber}`);
|
|
91
|
+
return {
|
|
92
|
+
transactionHash: receipt.transactionHash,
|
|
93
|
+
blockNumber: receipt.blockNumber,
|
|
94
|
+
blockHash: receipt.blockHash,
|
|
95
|
+
from: receipt.from,
|
|
96
|
+
to: receipt.to,
|
|
97
|
+
gasUsed: receipt.gasUsed,
|
|
98
|
+
status: receipt.status === 'success' ? 'success' : 'reverted',
|
|
99
|
+
logs: receipt.logs.map((log) => ({
|
|
100
|
+
address: log.address,
|
|
101
|
+
topics: [...(log.topics || [])],
|
|
102
|
+
data: log.data,
|
|
103
|
+
})),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if backend is ready
|
|
108
|
+
*
|
|
109
|
+
* For local key backend, we verify RPC connectivity.
|
|
110
|
+
*/
|
|
111
|
+
async isReady() {
|
|
112
|
+
try {
|
|
113
|
+
await this._publicClient.getChainId();
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error('[LocalKeyBackend] RPC connectivity check failed:', error);
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the chain ID
|
|
123
|
+
*/
|
|
124
|
+
getChainId() {
|
|
125
|
+
return this.chainId;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the public client (for external use)
|
|
129
|
+
*/
|
|
130
|
+
getPublicClient() {
|
|
131
|
+
return this._publicClient;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get the wallet client (for advanced use cases)
|
|
135
|
+
*/
|
|
136
|
+
getWalletClient() {
|
|
137
|
+
return this.walletClient;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create a LocalKeyBackend from configuration
|
|
142
|
+
*/
|
|
143
|
+
export async function createLocalKeyBackend(config) {
|
|
144
|
+
const backend = new LocalKeyBackend(config);
|
|
145
|
+
// Verify connectivity
|
|
146
|
+
const ready = await backend.isReady();
|
|
147
|
+
if (!ready) {
|
|
148
|
+
console.warn('[LocalKeyBackend] Backend created but RPC connectivity check failed');
|
|
149
|
+
}
|
|
150
|
+
return backend;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=LocalKeyBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalKeyBackend.js","sourceRoot":"","sources":["../../../src/wallet/providers/LocalKeyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,IAAI,GAIL,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;AAO5E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,UAAmB,CAAC;IAEnB,OAAO,CAAoB;IAC3B,YAAY,CAAwC;IACpD,aAAa,CAAwC;IACrD,OAAO,CAAS;IAChB,KAAK,CAAQ;IAE9B,YAAY,MAA6B;QACvC,8BAA8B;QAC9B,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExC,kCAAkC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/D,kCAAkC;QAClC,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEtD,sBAAsB;QACtB,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,EAAsB;QAC1C,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,MAAM,QAAQ,GAAQ;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;YACrB,IAAI,EAAE,EAAE,CAAC,IAAI;SACd,CAAC;QAEF,8BAA8B;QAC9B,IAAI,EAAE,CAAC,QAAQ;YAAE,QAAQ,CAAC,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC;QAC5C,IAAI,EAAE,CAAC,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;QACjD,IAAI,EAAE,CAAC,YAAY;YAAE,QAAQ,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;QAC7D,IAAI,EAAE,CAAC,oBAAoB;YAAE,QAAQ,CAAC,oBAAoB,GAAG,EAAE,CAAC,oBAAoB,CAAC;QACrF,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QAEtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,MAAY;QACnC,OAAO,CAAC,GAAG,CAAC,8CAA8C,MAAM,EAAE,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;YACjE,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oDAAoD,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvF,OAAO;YACL,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;YAC7D,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAoB;gBAClD,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAA6B;IACvE,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAE5C,sBAAsB;IACtB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|