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.
Files changed (189) hide show
  1. package/README.md +757 -0
  2. package/dist/__mocks__/@sodax/sdk.d.ts +24 -0
  3. package/dist/__mocks__/@sodax/sdk.d.ts.map +1 -0
  4. package/dist/__mocks__/@sodax/sdk.js +24 -0
  5. package/dist/__mocks__/@sodax/sdk.js.map +1 -0
  6. package/dist/__tests__/setup.d.ts +4 -0
  7. package/dist/__tests__/setup.d.ts.map +1 -0
  8. package/dist/__tests__/setup.js +32 -0
  9. package/dist/__tests__/setup.js.map +1 -0
  10. package/dist/index.d.ts +66 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +281 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/policy/policyEngine.d.ts +119 -0
  15. package/dist/policy/policyEngine.d.ts.map +1 -0
  16. package/dist/policy/policyEngine.js +322 -0
  17. package/dist/policy/policyEngine.js.map +1 -0
  18. package/dist/providers/spokeProviderFactory.d.ts +38 -0
  19. package/dist/providers/spokeProviderFactory.d.ts.map +1 -0
  20. package/dist/providers/spokeProviderFactory.js +212 -0
  21. package/dist/providers/spokeProviderFactory.js.map +1 -0
  22. package/dist/sodax/client.d.ts +34 -0
  23. package/dist/sodax/client.d.ts.map +1 -0
  24. package/dist/sodax/client.js +99 -0
  25. package/dist/sodax/client.js.map +1 -0
  26. package/dist/tools/bridge.d.ts +105 -0
  27. package/dist/tools/bridge.d.ts.map +1 -0
  28. package/dist/tools/bridge.js +334 -0
  29. package/dist/tools/bridge.js.map +1 -0
  30. package/dist/tools/discovery.d.ts +141 -0
  31. package/dist/tools/discovery.d.ts.map +1 -0
  32. package/dist/tools/discovery.js +777 -0
  33. package/dist/tools/discovery.js.map +1 -0
  34. package/dist/tools/moneyMarket.d.ts +227 -0
  35. package/dist/tools/moneyMarket.d.ts.map +1 -0
  36. package/dist/tools/moneyMarket.js +867 -0
  37. package/dist/tools/moneyMarket.js.map +1 -0
  38. package/dist/tools/portfolio.d.ts +43 -0
  39. package/dist/tools/portfolio.d.ts.map +1 -0
  40. package/dist/tools/portfolio.js +538 -0
  41. package/dist/tools/portfolio.js.map +1 -0
  42. package/dist/tools/swap.d.ts +71 -0
  43. package/dist/tools/swap.d.ts.map +1 -0
  44. package/dist/tools/swap.js +762 -0
  45. package/dist/tools/swap.js.map +1 -0
  46. package/dist/tools/walletManagement.d.ts +80 -0
  47. package/dist/tools/walletManagement.d.ts.map +1 -0
  48. package/dist/tools/walletManagement.js +289 -0
  49. package/dist/tools/walletManagement.js.map +1 -0
  50. package/dist/types.d.ts +205 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +5 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/utils/errorUtils.d.ts +2 -0
  55. package/dist/utils/errorUtils.d.ts.map +1 -0
  56. package/dist/utils/errorUtils.js +19 -0
  57. package/dist/utils/errorUtils.js.map +1 -0
  58. package/dist/utils/errors.d.ts +144 -0
  59. package/dist/utils/errors.d.ts.map +1 -0
  60. package/dist/utils/errors.js +310 -0
  61. package/dist/utils/errors.js.map +1 -0
  62. package/dist/utils/positionAggregator.d.ts +122 -0
  63. package/dist/utils/positionAggregator.d.ts.map +1 -0
  64. package/dist/utils/positionAggregator.js +377 -0
  65. package/dist/utils/positionAggregator.js.map +1 -0
  66. package/dist/utils/priceService.d.ts +45 -0
  67. package/dist/utils/priceService.d.ts.map +1 -0
  68. package/dist/utils/priceService.js +108 -0
  69. package/dist/utils/priceService.js.map +1 -0
  70. package/dist/utils/sodaxApi.d.ts +92 -0
  71. package/dist/utils/sodaxApi.d.ts.map +1 -0
  72. package/dist/utils/sodaxApi.js +143 -0
  73. package/dist/utils/sodaxApi.js.map +1 -0
  74. package/dist/utils/tokenResolver.d.ts +54 -0
  75. package/dist/utils/tokenResolver.d.ts.map +1 -0
  76. package/dist/utils/tokenResolver.js +252 -0
  77. package/dist/utils/tokenResolver.js.map +1 -0
  78. package/dist/wallet/backendConfig.d.ts +37 -0
  79. package/dist/wallet/backendConfig.d.ts.map +1 -0
  80. package/dist/wallet/backendConfig.js +125 -0
  81. package/dist/wallet/backendConfig.js.map +1 -0
  82. package/dist/wallet/backends/BankrBackend.d.ts +73 -0
  83. package/dist/wallet/backends/BankrBackend.d.ts.map +1 -0
  84. package/dist/wallet/backends/BankrBackend.js +315 -0
  85. package/dist/wallet/backends/BankrBackend.js.map +1 -0
  86. package/dist/wallet/backends/BankrWalletProvider.d.ts +75 -0
  87. package/dist/wallet/backends/BankrWalletProvider.d.ts.map +1 -0
  88. package/dist/wallet/backends/BankrWalletProvider.js +243 -0
  89. package/dist/wallet/backends/BankrWalletProvider.js.map +1 -0
  90. package/dist/wallet/backends/EnvBackend.d.ts +50 -0
  91. package/dist/wallet/backends/EnvBackend.d.ts.map +1 -0
  92. package/dist/wallet/backends/EnvBackend.js +114 -0
  93. package/dist/wallet/backends/EnvBackend.js.map +1 -0
  94. package/dist/wallet/backends/EvmWalletSkillBackend.d.ts +40 -0
  95. package/dist/wallet/backends/EvmWalletSkillBackend.d.ts.map +1 -0
  96. package/dist/wallet/backends/EvmWalletSkillBackend.js +81 -0
  97. package/dist/wallet/backends/EvmWalletSkillBackend.js.map +1 -0
  98. package/dist/wallet/backends/index.d.ts +10 -0
  99. package/dist/wallet/backends/index.d.ts.map +1 -0
  100. package/dist/wallet/backends/index.js +10 -0
  101. package/dist/wallet/backends/index.js.map +1 -0
  102. package/dist/wallet/index.d.ts +9 -0
  103. package/dist/wallet/index.d.ts.map +1 -0
  104. package/dist/wallet/index.js +12 -0
  105. package/dist/wallet/index.js.map +1 -0
  106. package/dist/wallet/providers/AmpedWalletProvider.d.ts +107 -0
  107. package/dist/wallet/providers/AmpedWalletProvider.d.ts.map +1 -0
  108. package/dist/wallet/providers/AmpedWalletProvider.js +208 -0
  109. package/dist/wallet/providers/AmpedWalletProvider.js.map +1 -0
  110. package/dist/wallet/providers/BankrBackend.d.ts +105 -0
  111. package/dist/wallet/providers/BankrBackend.d.ts.map +1 -0
  112. package/dist/wallet/providers/BankrBackend.js +327 -0
  113. package/dist/wallet/providers/BankrBackend.js.map +1 -0
  114. package/dist/wallet/providers/LocalKeyBackend.d.ts +62 -0
  115. package/dist/wallet/providers/LocalKeyBackend.d.ts.map +1 -0
  116. package/dist/wallet/providers/LocalKeyBackend.js +152 -0
  117. package/dist/wallet/providers/LocalKeyBackend.js.map +1 -0
  118. package/dist/wallet/providers/chainConfig.d.ts +209 -0
  119. package/dist/wallet/providers/chainConfig.d.ts.map +1 -0
  120. package/dist/wallet/providers/chainConfig.js +175 -0
  121. package/dist/wallet/providers/chainConfig.js.map +1 -0
  122. package/dist/wallet/providers/index.d.ts +30 -0
  123. package/dist/wallet/providers/index.d.ts.map +1 -0
  124. package/dist/wallet/providers/index.js +32 -0
  125. package/dist/wallet/providers/index.js.map +1 -0
  126. package/dist/wallet/providers/types.d.ts +156 -0
  127. package/dist/wallet/providers/types.d.ts.map +1 -0
  128. package/dist/wallet/providers/types.js +11 -0
  129. package/dist/wallet/providers/types.js.map +1 -0
  130. package/dist/wallet/skillWalletAdapter.d.ts +96 -0
  131. package/dist/wallet/skillWalletAdapter.d.ts.map +1 -0
  132. package/dist/wallet/skillWalletAdapter.js +280 -0
  133. package/dist/wallet/skillWalletAdapter.js.map +1 -0
  134. package/dist/wallet/types.d.ts +134 -0
  135. package/dist/wallet/types.d.ts.map +1 -0
  136. package/dist/wallet/types.js +138 -0
  137. package/dist/wallet/types.js.map +1 -0
  138. package/dist/wallet/walletManager.d.ts +111 -0
  139. package/dist/wallet/walletManager.d.ts.map +1 -0
  140. package/dist/wallet/walletManager.js +476 -0
  141. package/dist/wallet/walletManager.js.map +1 -0
  142. package/dist/wallet/walletRegistry.d.ts +95 -0
  143. package/dist/wallet/walletRegistry.d.ts.map +1 -0
  144. package/dist/wallet/walletRegistry.js +184 -0
  145. package/dist/wallet/walletRegistry.js.map +1 -0
  146. package/index.js +2 -0
  147. package/openclaw.plugin.json +37 -0
  148. package/package.json +69 -0
  149. package/src/__mocks__/@sodax/sdk.ts +28 -0
  150. package/src/__tests__/errors.test.ts +238 -0
  151. package/src/__tests__/policyEngine.test.ts +354 -0
  152. package/src/__tests__/positionAggregator.test.ts +271 -0
  153. package/src/__tests__/setup.ts +35 -0
  154. package/src/__tests__/sodaxApi.test.ts +203 -0
  155. package/src/__tests__/walletRegistry.test.ts +155 -0
  156. package/src/index.ts +376 -0
  157. package/src/policy/policyEngine.ts +389 -0
  158. package/src/providers/spokeProviderFactory.ts +283 -0
  159. package/src/sodax/client.ts +113 -0
  160. package/src/tools/bridge.ts +425 -0
  161. package/src/tools/discovery.ts +989 -0
  162. package/src/tools/moneyMarket.ts +1265 -0
  163. package/src/tools/portfolio.ts +697 -0
  164. package/src/tools/swap.ts +926 -0
  165. package/src/tools/walletManagement.ts +359 -0
  166. package/src/types.ts +228 -0
  167. package/src/utils/errorUtils.ts +16 -0
  168. package/src/utils/errors.ts +396 -0
  169. package/src/utils/positionAggregator.ts +559 -0
  170. package/src/utils/priceService.ts +153 -0
  171. package/src/utils/sodaxApi.ts +261 -0
  172. package/src/utils/tokenResolver.ts +286 -0
  173. package/src/wallet/backendConfig.ts +151 -0
  174. package/src/wallet/backends/BankrBackend.ts +399 -0
  175. package/src/wallet/backends/BankrWalletProvider.ts +329 -0
  176. package/src/wallet/backends/EnvBackend.ts +149 -0
  177. package/src/wallet/backends/EvmWalletSkillBackend.ts +110 -0
  178. package/src/wallet/backends/index.ts +10 -0
  179. package/src/wallet/index.ts +14 -0
  180. package/src/wallet/providers/AmpedWalletProvider.ts +267 -0
  181. package/src/wallet/providers/BankrBackend.ts +407 -0
  182. package/src/wallet/providers/LocalKeyBackend.ts +184 -0
  183. package/src/wallet/providers/chainConfig.ts +194 -0
  184. package/src/wallet/providers/index.ts +62 -0
  185. package/src/wallet/providers/types.ts +186 -0
  186. package/src/wallet/skillWalletAdapter.ts +335 -0
  187. package/src/wallet/types.ts +248 -0
  188. package/src/wallet/walletManager.ts +561 -0
  189. package/src/wallet/walletRegistry.ts +216 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Policy Engine
3
+ *
4
+ * Enforces security policies for DeFi operations including:
5
+ * - Spend limits per transaction and daily
6
+ * - Allowed chain and token allowlists
7
+ * - Blocked recipient addresses
8
+ * - Maximum slippage tolerance
9
+ * - Simulation requirements
10
+ */
11
+ import { normalizeChainId } from '../wallet/types';
12
+ /**
13
+ * Policy Engine class for enforcing security constraints
14
+ */
15
+ export class PolicyEngine {
16
+ config;
17
+ constructor(policyId) {
18
+ this.config = this.loadPolicyConfig(policyId);
19
+ }
20
+ /**
21
+ * Load policy configuration from environment
22
+ *
23
+ * @param policyId - Optional policy profile ID for custom limits
24
+ * @returns The policy configuration
25
+ */
26
+ loadPolicyConfig(policyId) {
27
+ const limitsJson = process.env.AMPED_OC_LIMITS_JSON;
28
+ if (!limitsJson) {
29
+ return {};
30
+ }
31
+ try {
32
+ const allConfigs = JSON.parse(limitsJson);
33
+ // If policyId is specified, use that config; otherwise use 'default' or empty
34
+ const config = policyId
35
+ ? allConfigs[policyId]
36
+ : allConfigs['default'] || allConfigs;
37
+ if (policyId && !config) {
38
+ return allConfigs['default'] || {};
39
+ }
40
+ return config || {};
41
+ }
42
+ catch (_error) {
43
+ return {};
44
+ }
45
+ }
46
+ /**
47
+ * Check if a chain is allowed
48
+ *
49
+ * @param chainId - The chain ID to check
50
+ * @returns Policy check result
51
+ */
52
+ checkChainAllowed(chainId) {
53
+ const { allowedChains } = this.config;
54
+ if (allowedChains && allowedChains.length > 0) {
55
+ const normalizedChain = normalizeChainId(chainId);
56
+ if (!allowedChains.includes(normalizedChain)) {
57
+ return {
58
+ allowed: false,
59
+ reason: `Chain not allowed: ${chainId}. Allowed chains: ${allowedChains.join(', ')}`,
60
+ };
61
+ }
62
+ }
63
+ return { allowed: true };
64
+ }
65
+ /**
66
+ * Check if a token is allowed on a specific chain
67
+ *
68
+ * @param chainId - The chain ID
69
+ * @param token - The token address or symbol
70
+ * @returns Policy check result
71
+ */
72
+ checkTokenAllowed(chainId, token) {
73
+ const { allowedTokensByChain } = this.config;
74
+ if (allowedTokensByChain) {
75
+ const normalizedChainForTokens = normalizeChainId(chainId);
76
+ const allowedTokens = allowedTokensByChain[normalizedChainForTokens];
77
+ if (allowedTokens && allowedTokens.length > 0) {
78
+ if (!allowedTokens.includes(token)) {
79
+ return {
80
+ allowed: false,
81
+ reason: `Token not allowed on ${chainId}: ${token}. Allowed tokens: ${allowedTokens.join(', ')}`,
82
+ };
83
+ }
84
+ }
85
+ }
86
+ return { allowed: true };
87
+ }
88
+ /**
89
+ * Check if a recipient is blocked
90
+ *
91
+ * @param recipient - The recipient address
92
+ * @returns Policy check result
93
+ */
94
+ checkRecipientNotBlocked(recipient) {
95
+ const { blockedRecipients } = this.config;
96
+ if (blockedRecipients && blockedRecipients.length > 0) {
97
+ if (blockedRecipients.includes(recipient.toLowerCase())) {
98
+ return {
99
+ allowed: false,
100
+ reason: `Recipient is blocked: ${recipient}`,
101
+ };
102
+ }
103
+ }
104
+ return { allowed: true };
105
+ }
106
+ /**
107
+ * Check bridge amount against limits
108
+ *
109
+ * @param token - The token address or symbol
110
+ * @param amount - The amount in human-readable units
111
+ * @returns Policy check result
112
+ */
113
+ checkBridgeAmount(token, amount) {
114
+ const { maxBridgeAmountToken } = this.config;
115
+ if (maxBridgeAmountToken) {
116
+ const maxAmount = maxBridgeAmountToken[token];
117
+ if (maxAmount !== undefined) {
118
+ const amountNum = parseFloat(amount);
119
+ if (amountNum > maxAmount) {
120
+ return {
121
+ allowed: false,
122
+ reason: `Bridge amount ${amount} exceeds maximum ${maxAmount} for token ${token}`,
123
+ details: { maxAllowed: maxAmount, requested: amountNum },
124
+ };
125
+ }
126
+ }
127
+ }
128
+ return { allowed: true };
129
+ }
130
+ /**
131
+ * Check a bridge operation against all policies
132
+ *
133
+ * @param operation - The bridge operation to validate
134
+ * @returns Policy check result
135
+ */
136
+ async checkBridge(operation) {
137
+ const { srcChainId, dstChainId, srcToken, dstToken, amount, recipient } = operation;
138
+ // Check source chain
139
+ const srcChainCheck = this.checkChainAllowed(srcChainId);
140
+ if (!srcChainCheck.allowed)
141
+ return srcChainCheck;
142
+ // Check destination chain
143
+ const dstChainCheck = this.checkChainAllowed(dstChainId);
144
+ if (!dstChainCheck.allowed)
145
+ return dstChainCheck;
146
+ // Check source token
147
+ const srcTokenCheck = this.checkTokenAllowed(srcChainId, srcToken);
148
+ if (!srcTokenCheck.allowed)
149
+ return srcTokenCheck;
150
+ // Check destination token
151
+ const dstTokenCheck = this.checkTokenAllowed(dstChainId, dstToken);
152
+ if (!dstTokenCheck.allowed)
153
+ return dstTokenCheck;
154
+ // Check amount limits
155
+ const amountCheck = this.checkBridgeAmount(srcToken, amount);
156
+ if (!amountCheck.allowed)
157
+ return amountCheck;
158
+ // Check recipient if specified
159
+ if (recipient) {
160
+ const recipientCheck = this.checkRecipientNotBlocked(recipient);
161
+ if (!recipientCheck.allowed)
162
+ return recipientCheck;
163
+ }
164
+ return { allowed: true };
165
+ }
166
+ /**
167
+ * Get the current policy configuration
168
+ * @returns The policy configuration
169
+ */
170
+ getConfig() {
171
+ return { ...this.config };
172
+ }
173
+ /**
174
+ * Get available policy IDs from the configuration
175
+ * @returns Array of available policy IDs
176
+ */
177
+ getAvailablePolicies() {
178
+ const limitsJson = process.env.AMPED_OC_LIMITS_JSON;
179
+ if (!limitsJson)
180
+ return [];
181
+ try {
182
+ const allConfigs = JSON.parse(limitsJson);
183
+ return Object.keys(allConfigs);
184
+ }
185
+ catch {
186
+ return [];
187
+ }
188
+ }
189
+ // ============================================================================
190
+ // Swap Policy Checks
191
+ // ============================================================================
192
+ /**
193
+ * Check swap input amount against USD limits
194
+ */
195
+ checkSwapAmount(inputAmount, srcToken) {
196
+ const { maxSwapInputUsd, maxSwapInputToken } = this.config;
197
+ // Check per-token limit if configured
198
+ if (maxSwapInputToken) {
199
+ const maxTokenAmount = maxSwapInputToken[srcToken];
200
+ if (maxTokenAmount !== undefined) {
201
+ const amountNum = parseFloat(inputAmount);
202
+ if (amountNum > maxTokenAmount) {
203
+ return {
204
+ allowed: false,
205
+ reason: `Swap input amount ${inputAmount} exceeds maximum ${maxTokenAmount} for token ${srcToken}`,
206
+ details: { maxAllowed: maxTokenAmount, requested: amountNum },
207
+ };
208
+ }
209
+ }
210
+ }
211
+ // Note: USD limit check would require price oracle integration
212
+ // For now, we skip enforcement without prices
213
+ return { allowed: true };
214
+ }
215
+ /**
216
+ * Check slippage against maximum allowed
217
+ */
218
+ checkSlippage(slippageBps) {
219
+ const { maxSlippageBps } = this.config;
220
+ if (maxSlippageBps !== undefined && slippageBps > maxSlippageBps) {
221
+ return {
222
+ allowed: false,
223
+ reason: `Slippage ${slippageBps} bps exceeds maximum allowed ${maxSlippageBps} bps`,
224
+ details: { maxAllowed: maxSlippageBps, requested: slippageBps },
225
+ };
226
+ }
227
+ return { allowed: true };
228
+ }
229
+ /**
230
+ * Check a swap operation against all policies
231
+ */
232
+ async checkSwap(params) {
233
+ const { srcChainId, dstChainId, srcToken, dstToken, inputAmount, slippageBps } = params;
234
+ // Check source chain
235
+ const srcChainCheck = this.checkChainAllowed(srcChainId);
236
+ if (!srcChainCheck.allowed)
237
+ return srcChainCheck;
238
+ // Check destination chain
239
+ const dstChainCheck = this.checkChainAllowed(dstChainId);
240
+ if (!dstChainCheck.allowed)
241
+ return dstChainCheck;
242
+ // Check source token
243
+ const srcTokenCheck = this.checkTokenAllowed(srcChainId, srcToken);
244
+ if (!srcTokenCheck.allowed)
245
+ return srcTokenCheck;
246
+ // Check destination token
247
+ const dstTokenCheck = this.checkTokenAllowed(dstChainId, dstToken);
248
+ if (!dstTokenCheck.allowed)
249
+ return dstTokenCheck;
250
+ // Check swap amount limits
251
+ const amountCheck = this.checkSwapAmount(inputAmount, srcToken);
252
+ if (!amountCheck.allowed)
253
+ return amountCheck;
254
+ // Check slippage
255
+ const slippageCheck = this.checkSlippage(slippageBps);
256
+ if (!slippageCheck.allowed)
257
+ return slippageCheck;
258
+ return { allowed: true };
259
+ }
260
+ // ============================================================================
261
+ // Money Market Policy Checks
262
+ // ============================================================================
263
+ /**
264
+ * Check borrow amount against limits
265
+ */
266
+ checkBorrowAmount(token, amount, amountUsd) {
267
+ const { maxBorrowUsd, maxBorrowToken } = this.config;
268
+ // Check per-token limit if configured
269
+ if (maxBorrowToken) {
270
+ const maxTokenAmount = maxBorrowToken[token];
271
+ if (maxTokenAmount !== undefined) {
272
+ const amountNum = parseFloat(amount);
273
+ if (amountNum > maxTokenAmount) {
274
+ return {
275
+ allowed: false,
276
+ reason: `Borrow amount ${amount} exceeds maximum ${maxTokenAmount} for token ${token}`,
277
+ details: { maxAllowed: maxTokenAmount, requested: amountNum },
278
+ };
279
+ }
280
+ }
281
+ }
282
+ // Check USD limit if amountUsd is provided
283
+ if (maxBorrowUsd !== undefined && amountUsd !== undefined) {
284
+ if (amountUsd > maxBorrowUsd) {
285
+ return {
286
+ allowed: false,
287
+ reason: `Borrow amount $${amountUsd} exceeds maximum $${maxBorrowUsd}`,
288
+ details: { maxAllowed: maxBorrowUsd, requested: amountUsd },
289
+ };
290
+ }
291
+ }
292
+ return { allowed: true };
293
+ }
294
+ /**
295
+ * Check a money market operation against all policies
296
+ */
297
+ async checkMoneyMarket(params) {
298
+ const { chainId, dstChainId, token, amount, amountUsd, operation } = params;
299
+ // Check source chain
300
+ const chainCheck = this.checkChainAllowed(chainId);
301
+ if (!chainCheck.allowed)
302
+ return chainCheck;
303
+ // Check destination chain if cross-chain operation
304
+ if (dstChainId) {
305
+ const dstChainCheck = this.checkChainAllowed(dstChainId);
306
+ if (!dstChainCheck.allowed)
307
+ return dstChainCheck;
308
+ }
309
+ // Check token
310
+ const tokenCheck = this.checkTokenAllowed(chainId, token);
311
+ if (!tokenCheck.allowed)
312
+ return tokenCheck;
313
+ // Operation-specific checks
314
+ if (operation === 'borrow') {
315
+ const borrowCheck = this.checkBorrowAmount(token, amount, amountUsd);
316
+ if (!borrowCheck.allowed)
317
+ return borrowCheck;
318
+ }
319
+ return { allowed: true };
320
+ }
321
+ }
322
+ //# sourceMappingURL=policyEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyEngine.js","sourceRoot":"","sources":["../../src/policy/policyEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Spoke Provider Factory
3
+ *
4
+ * Creates spoke providers for SODAX operations.
5
+ * Supports both local key signing and Bankr API execution.
6
+ *
7
+ * Flow:
8
+ * 1. Resolve wallet by nickname using WalletManager
9
+ * 2. Check if wallet supports requested chain
10
+ * 3. For local wallets: use SDK's EvmWalletProvider
11
+ * 4. For Bankr wallets: use BankrWalletProvider (submits to Bankr API)
12
+ */
13
+ import { type SpokeProvider } from '@sodax/sdk';
14
+ /**
15
+ * Get a spoke provider for the given wallet and chain
16
+ * Returns cached provider if available, otherwise creates a new one
17
+ *
18
+ * @param walletId - The wallet identifier/nickname
19
+ * @param chainId - The chain identifier
20
+ * @param raw - If true, still creates full provider (raw mode not yet supported)
21
+ * @returns The spoke provider instance
22
+ */
23
+ export declare function getSpokeProvider(walletId: string, chainId: string, raw?: boolean): Promise<SpokeProvider>;
24
+ /**
25
+ * Clear the provider cache
26
+ * Useful for testing or when wallet configuration changes
27
+ */
28
+ export declare function clearProviderCache(): void;
29
+ /**
30
+ * Get cache statistics
31
+ * @returns Object with cache size and keys
32
+ */
33
+ export declare function getCacheStats(): {
34
+ size: number;
35
+ keys: string[];
36
+ };
37
+ export type { SpokeProvider };
38
+ //# sourceMappingURL=spokeProviderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spokeProviderFactory.d.ts","sourceRoot":"","sources":["../../src/providers/spokeProviderFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AA6MpB;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,GAAG,UAAQ,GACV,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAKhE;AAGD,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Spoke Provider Factory
3
+ *
4
+ * Creates spoke providers for SODAX operations.
5
+ * Supports both local key signing and Bankr API execution.
6
+ *
7
+ * Flow:
8
+ * 1. Resolve wallet by nickname using WalletManager
9
+ * 2. Check if wallet supports requested chain
10
+ * 3. For local wallets: use SDK's EvmWalletProvider
11
+ * 4. For Bankr wallets: use BankrWalletProvider (submits to Bankr API)
12
+ */
13
+ // Official SDK wallet provider
14
+ import { EvmWalletProvider } from '@sodax/wallet-sdk-core';
15
+ // Import spoke providers and chain config from SDK
16
+ import { EvmSpokeProvider, SonicSpokeProvider } from '@sodax/sdk';
17
+ // Import chain configuration from types
18
+ import { spokeChainConfig } from '@sodax/types';
19
+ // Import wallet management
20
+ import { getWalletManager, createBankrWalletProvider } from '../wallet';
21
+ import { getWalletAdapter } from '../wallet/skillWalletAdapter';
22
+ import { normalizeChainId, getBankrChainId } from '../wallet/types';
23
+ // Cache for providers: Map<cacheKey, SpokeProvider>
24
+ const providerCache = new Map();
25
+ // Sonic hub chain identifier
26
+ const SONIC_CHAIN_ID = 'sonic';
27
+ // Chain ID mapping for SDK (some chains need specific format)
28
+ const CHAIN_ID_MAP = {
29
+ 'sonic': 'sonic',
30
+ 'ethereum': 'ethereum',
31
+ 'arbitrum': '0xa4b1.arbitrum',
32
+ 'optimism': '0xa.optimism',
33
+ 'base': '0x2105.base',
34
+ 'polygon': '0x89.polygon',
35
+ 'bsc': '0x38.bsc',
36
+ 'avalanche': '0xa86a.avax',
37
+ 'lightlink': 'lightlink',
38
+ 'hyperevm': 'hyper',
39
+ 'hyper': 'hyper',
40
+ };
41
+ /**
42
+ * Get RPC URL for a chain
43
+ */
44
+ async function getRpcUrl(chainId) {
45
+ const skillAdapter = getWalletAdapter();
46
+ return skillAdapter.getRpcUrl(chainId);
47
+ }
48
+ /**
49
+ * Get the SDK chain ID for a given chain
50
+ */
51
+ function getSdkChainId(chainId) {
52
+ return (CHAIN_ID_MAP[chainId] || chainId);
53
+ }
54
+ /**
55
+ * Validate that wallet supports the requested chain
56
+ */
57
+ function validateChainSupport(wallet, chainId) {
58
+ const normalizedForWallet = normalizeChainId(chainId);
59
+ if (!wallet.supportsChain(normalizedForWallet)) {
60
+ throw new Error(`Wallet "${wallet.nickname}" doesn't support chain "${chainId}". ` +
61
+ `Supported chains: ${wallet.supportedChains.join(', ')}. ` +
62
+ `Try a different wallet.`);
63
+ }
64
+ }
65
+ /**
66
+ * Create a spoke provider for local key signing
67
+ */
68
+ async function createLocalSpokeProvider(wallet, chainId, rpcUrl) {
69
+ if (!wallet.getPrivateKey) {
70
+ throw new Error(`Wallet "${wallet.nickname}" does not support local signing`);
71
+ }
72
+ const privateKey = await wallet.getPrivateKey();
73
+ const sdkChainId = getSdkChainId(chainId);
74
+ // Get chain config from SDK
75
+ const chainConfig = spokeChainConfig[sdkChainId];
76
+ if (!chainConfig) {
77
+ throw new Error(`Chain config not found for: ${sdkChainId}. Available: ${Object.keys(spokeChainConfig).join(', ')}`);
78
+ }
79
+ // Create wallet provider using official SDK
80
+ const walletProvider = new EvmWalletProvider({
81
+ privateKey,
82
+ chainId: sdkChainId,
83
+ rpcUrl: rpcUrl,
84
+ });
85
+ // Use SonicSpokeProvider for Sonic hub chain, EvmSpokeProvider for others
86
+ if (chainId === SONIC_CHAIN_ID) {
87
+ console.log('[spokeProviderFactory] Creating SonicSpokeProvider', {
88
+ wallet: wallet.nickname,
89
+ chainId,
90
+ });
91
+ return new SonicSpokeProvider(walletProvider, chainConfig, rpcUrl);
92
+ }
93
+ else {
94
+ console.log('[spokeProviderFactory] Creating EvmSpokeProvider', {
95
+ wallet: wallet.nickname,
96
+ chainId,
97
+ sdkChainId,
98
+ });
99
+ return new EvmSpokeProvider(walletProvider, chainConfig, rpcUrl);
100
+ }
101
+ }
102
+ /**
103
+ * Create a spoke provider for Bankr wallet
104
+ * Uses BankrWalletProvider which submits transactions to Bankr API
105
+ */
106
+ async function createBankrSpokeProvider(wallet, chainId, rpcUrl) {
107
+ const sdkChainId = getSdkChainId(chainId);
108
+ // Normalize chain ID for Bankr lookup (0x2105.base -> base)
109
+ const normalizedChainId = normalizeChainId(chainId);
110
+ const numericChainId = getBankrChainId(normalizedChainId);
111
+ console.log('[spokeProviderFactory] Bankr chain resolution', {
112
+ input: chainId,
113
+ normalized: normalizedChainId,
114
+ numeric: numericChainId,
115
+ });
116
+ // Get chain config from SDK
117
+ const chainConfig = spokeChainConfig[sdkChainId];
118
+ if (!chainConfig) {
119
+ throw new Error(`Chain config not found for: ${sdkChainId}`);
120
+ }
121
+ // Get Bankr API key from environment
122
+ const apiKey = process.env.BANKR_API_KEY;
123
+ if (!apiKey) {
124
+ throw new Error('BANKR_API_KEY environment variable not set');
125
+ }
126
+ // Get the Bankr wallet address (cached after first call)
127
+ const walletAddress = await wallet.getAddress();
128
+ // Create BankrWalletProvider which implements IEvmWalletProvider
129
+ const walletProvider = createBankrWalletProvider({
130
+ apiKey,
131
+ apiUrl: process.env.BANKR_API_URL,
132
+ chainId: numericChainId,
133
+ rpcUrl,
134
+ cachedAddress: walletAddress,
135
+ });
136
+ console.log('[spokeProviderFactory] Creating EvmSpokeProvider with Bankr backend', {
137
+ wallet: wallet.nickname,
138
+ chainId,
139
+ sdkChainId,
140
+ address: walletAddress?.slice(0, 10) + '...',
141
+ });
142
+ // Use standard EvmSpokeProvider with our BankrWalletProvider
143
+ // The SDK doesn't care how transactions are signed - it just calls the interface methods
144
+ return new EvmSpokeProvider(walletProvider, // BankrWalletProvider implements IEvmWalletProvider
145
+ chainConfig, rpcUrl);
146
+ }
147
+ /**
148
+ * Create a spoke provider for the given wallet and chain
149
+ *
150
+ * @param walletId - Wallet nickname (e.g., "main", "bankr", "trading")
151
+ * @param chainId - Chain identifier (e.g., "ethereum", "base")
152
+ */
153
+ async function createSpokeProvider(walletId, chainId) {
154
+ // Get wallet from unified manager
155
+ const walletManager = getWalletManager();
156
+ const wallet = await walletManager.resolve(walletId);
157
+ // Validate chain support
158
+ validateChainSupport(wallet, chainId);
159
+ const rpcUrl = await getRpcUrl(chainId);
160
+ // Route based on wallet type
161
+ if (wallet.type === 'bankr') {
162
+ // Use BankrWalletProvider for Bankr wallets
163
+ return createBankrSpokeProvider(wallet, chainId, rpcUrl);
164
+ }
165
+ // Local key signing (evm-wallet-skill or env)
166
+ return createLocalSpokeProvider(wallet, chainId, rpcUrl);
167
+ }
168
+ /**
169
+ * Get a spoke provider for the given wallet and chain
170
+ * Returns cached provider if available, otherwise creates a new one
171
+ *
172
+ * @param walletId - The wallet identifier/nickname
173
+ * @param chainId - The chain identifier
174
+ * @param raw - If true, still creates full provider (raw mode not yet supported)
175
+ * @returns The spoke provider instance
176
+ */
177
+ export async function getSpokeProvider(walletId, chainId, raw = false) {
178
+ const cacheKey = `${walletId}:${chainId}`;
179
+ // Check cache
180
+ const cached = providerCache.get(cacheKey);
181
+ if (cached) {
182
+ console.log('[spokeProviderFactory] Using cached provider', {
183
+ walletId,
184
+ chainId,
185
+ });
186
+ return cached;
187
+ }
188
+ // Create new provider
189
+ const provider = await createSpokeProvider(walletId, chainId);
190
+ // Cache the provider
191
+ providerCache.set(cacheKey, provider);
192
+ return provider;
193
+ }
194
+ /**
195
+ * Clear the provider cache
196
+ * Useful for testing or when wallet configuration changes
197
+ */
198
+ export function clearProviderCache() {
199
+ providerCache.clear();
200
+ console.log('[spokeProviderFactory] Provider cache cleared');
201
+ }
202
+ /**
203
+ * Get cache statistics
204
+ * @returns Object with cache size and keys
205
+ */
206
+ export function getCacheStats() {
207
+ return {
208
+ size: providerCache.size,
209
+ keys: Array.from(providerCache.keys()),
210
+ };
211
+ }
212
+ //# sourceMappingURL=spokeProviderFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spokeProviderFactory.js","sourceRoot":"","sources":["../../src/providers/spokeProviderFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,+BAA+B;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,mDAAmD;AACnD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAEpB,wCAAwC;AACxC,OAAO,EAAE,gBAAgB,EAAqB,MAAM,cAAc,CAAC;AAEnE,2BAA2B;AAC3B,OAAO,EAAE,gBAAgB,EAAuB,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAmB,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAErF,oDAAoD;AACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEvD,6BAA6B;AAC7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,8DAA8D;AAC9D,MAAM,YAAY,GAAiC;IACjD,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,UAAU;IACtB,UAAU,EAAE,iBAAiB;IAC7B,UAAU,EAAE,cAAc;IAC1B,MAAM,EAAE,aAAa;IACrB,SAAS,EAAE,cAAc;IACzB,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE,aAAa;IAC1B,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,OAAO;IACnB,OAAO,EAAE,OAAO;CACe,CAAC;AAElC;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,OAAO,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,OAAO,CAAiB,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAsB,EAAE,OAAe;IACnE,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,QAAQ,4BAA4B,OAAO,KAAK;YAClE,qBAAqB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC1D,yBAAyB,CAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAAsB,EACtB,OAAe,EACf,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,QAAQ,kCAAkC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,4BAA4B;IAC5B,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,gBAAgB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,4CAA4C;IAC5C,MAAM,cAAc,GAAG,IAAI,iBAAiB,CAAC;QAC3C,UAAU;QACV,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,MAAyB;KAClC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,oDAAoD,EAAE;YAChE,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,IAAI,kBAAkB,CAC3B,cAAc,EACd,WAAkB,EAClB,MAAM,CACP,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE;YAC9D,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,OAAO;YACP,UAAU;SACX,CAAC,CAAC;QAEH,OAAO,IAAI,gBAAgB,CACzB,cAAc,EACd,WAAkB,EAClB,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,wBAAwB,CACrC,MAAsB,EACtB,OAAe,EACf,MAAc;IAEd,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,4DAA4D;IAC5D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE;QAC3D,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,qCAAqC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,yDAAyD;IACzD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAEhD,iEAAiE;IACjE,MAAM,cAAc,GAAG,yBAAyB,CAAC;QAC/C,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACjC,OAAO,EAAE,cAAc;QACvB,MAAM;QACN,aAAa,EAAE,aAAa;KAC7B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,qEAAqE,EAAE;QACjF,MAAM,EAAE,MAAM,CAAC,QAAQ;QACvB,OAAO;QACP,UAAU;QACV,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;KAC7C,CAAC,CAAC;IAEH,6DAA6D;IAC7D,yFAAyF;IACzF,OAAO,IAAI,gBAAgB,CACzB,cAAqB,EAAE,oDAAoD;IAC3E,WAAkB,EAClB,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,OAAe;IAEf,kCAAkC;IAClC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErD,yBAAyB;IACzB,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAExC,6BAA6B;IAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,4CAA4C;QAC5C,OAAO,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,8CAA8C;IAC9C,OAAO,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,OAAe,EACf,GAAG,GAAG,KAAK;IAEX,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;IAE1C,cAAc;IACd,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE;YAC1D,QAAQ;YACR,OAAO;SACR,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE9D,qBAAqB;IACrB,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * SODAX SDK Client Singleton
3
+ *
4
+ * Provides a singleton instance of the SODAX SDK client with lazy initialization.
5
+ * Uses dynamic configuration by default to fetch live token lists and routes.
6
+ */
7
+ import { Sodax } from "@sodax/sdk";
8
+ /**
9
+ * Get the singleton SODAX client instance
10
+ * Initializes on first call if not already initialized
11
+ */
12
+ export declare function getSodaxClientAsync(): Promise<Sodax>;
13
+ /**
14
+ * Synchronous accessor for the SODAX client
15
+ * Throws if the client hasn't been initialized yet
16
+ */
17
+ export declare function getSodaxClient(): Sodax;
18
+ /**
19
+ * Pre-initialize the SODAX client at plugin startup
20
+ */
21
+ export declare function preInitializeSodax(): Promise<void>;
22
+ /**
23
+ * Reset the SODAX client (useful for testing)
24
+ */
25
+ export declare function resetSodaxClient(): void;
26
+ /**
27
+ * SodaxClient class wrapper for backward compatibility
28
+ */
29
+ export declare class SodaxClient {
30
+ private static instance;
31
+ static getClient(): Promise<Sodax>;
32
+ static reset(): void;
33
+ }
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sodax/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AA+CnC;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,KAAK,CAAC,CAK1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAOtC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;WAEhC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC;IAQxC,MAAM,CAAC,KAAK,IAAI,IAAI;CAIrB"}