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,99 @@
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
+ // Singleton instance
9
+ let sodaxClient = null;
10
+ /**
11
+ * HARDCODED PARTNER CONFIGURATION
12
+ * These values are baked in and cannot be overridden.
13
+ *
14
+ * Fee is 0.2% (20 basis points)
15
+ * SDK expects: percentage in bps where 100 = 1%, so 20 = 0.2%
16
+ */
17
+ const PARTNER_FEE = {
18
+ address: "0xd99C871c8130B03C8BB597A74fb5EAA7a46864Bb",
19
+ percentage: 20, // 20 bps = 0.2%
20
+ };
21
+ /**
22
+ * Initialize the SODAX SDK client
23
+ * Always uses dynamic config to fetch live token lists and routes
24
+ */
25
+ async function initializeSodax() {
26
+ // Initialize SODAX with hardcoded partner fee on ALL services
27
+ const sodax = new Sodax({
28
+ swaps: { partnerFee: PARTNER_FEE },
29
+ moneyMarket: { partnerFee: PARTNER_FEE },
30
+ bridge: { partnerFee: PARTNER_FEE },
31
+ });
32
+ // Suppress SDK console output during initialization
33
+ const originalWarn = console.warn;
34
+ const originalLog = console.log;
35
+ console.warn = () => { };
36
+ console.log = () => { };
37
+ try {
38
+ // Initialize with dynamic config
39
+ await sodax.initialize();
40
+ }
41
+ finally {
42
+ // Restore console
43
+ console.warn = originalWarn;
44
+ console.log = originalLog;
45
+ }
46
+ return sodax;
47
+ }
48
+ /**
49
+ * Get the singleton SODAX client instance
50
+ * Initializes on first call if not already initialized
51
+ */
52
+ export async function getSodaxClientAsync() {
53
+ if (!sodaxClient) {
54
+ sodaxClient = await initializeSodax();
55
+ }
56
+ return sodaxClient;
57
+ }
58
+ /**
59
+ * Synchronous accessor for the SODAX client
60
+ * Throws if the client hasn't been initialized yet
61
+ */
62
+ export function getSodaxClient() {
63
+ if (!sodaxClient) {
64
+ throw new Error("SODAX client not initialized. Call getSodaxClientAsync() first.");
65
+ }
66
+ return sodaxClient;
67
+ }
68
+ /**
69
+ * Pre-initialize the SODAX client at plugin startup
70
+ */
71
+ export async function preInitializeSodax() {
72
+ if (!sodaxClient) {
73
+ sodaxClient = await initializeSodax();
74
+ }
75
+ }
76
+ /**
77
+ * Reset the SODAX client (useful for testing)
78
+ */
79
+ export function resetSodaxClient() {
80
+ sodaxClient = null;
81
+ }
82
+ /**
83
+ * SodaxClient class wrapper for backward compatibility
84
+ */
85
+ export class SodaxClient {
86
+ static instance = null;
87
+ static async getClient() {
88
+ if (!SodaxClient.instance) {
89
+ SodaxClient.instance = await initializeSodax();
90
+ sodaxClient = SodaxClient.instance;
91
+ }
92
+ return SodaxClient.instance;
93
+ }
94
+ static reset() {
95
+ SodaxClient.instance = null;
96
+ sodaxClient = null;
97
+ }
98
+ }
99
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sodax/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,qBAAqB;AACrB,IAAI,WAAW,GAAiB,IAAI,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,4CAA6D;IACtE,UAAU,EAAE,EAAE,EAAE,gBAAgB;CACjC,CAAC;AAEF;;;GAGG;AACH,KAAK,UAAU,eAAe;IAC5B,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE;QAClC,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE;QACxC,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE;KAC7B,CAAC,CAAC;IAEV,oDAAoD;IACpD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAEvB,IAAI,CAAC;QACH,iCAAiC;QACjC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,kBAAkB;QAClB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;QAC5B,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,QAAQ,GAAiB,IAAI,CAAC;IAE7C,MAAM,CAAC,KAAK,CAAC,SAAS;QACpB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;YAC/C,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC;QACrC,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,KAAK;QACV,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC5B,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Bridge Tools for Amped DeFi Plugin
3
+ *
4
+ * NOTE: Bridge operations use the swap infrastructure internally.
5
+ * Cross-chain swaps and bridges are functionally equivalent in SODAX -
6
+ * both use the intent-based cross-chain messaging system.
7
+ *
8
+ * Tools:
9
+ * - amped_bridge_discover: Get bridgeable tokens for a route
10
+ * - amped_bridge_quote: Check bridgeability and max amounts
11
+ * - amped_bridge_execute: Execute bridge (delegates to swap)
12
+ *
13
+ * @module tools/bridge
14
+ */
15
+ import { Static } from '@sinclair/typebox';
16
+ import { AgentTools } from '../types';
17
+ /**
18
+ * Schema for amped_bridge_discover tool
19
+ * Discover bridgeable tokens for a given source chain, destination chain, and source token
20
+ */
21
+ declare const BridgeDiscoverSchema: import("@sinclair/typebox").TObject<{
22
+ srcChainId: import("@sinclair/typebox").TString;
23
+ dstChainId: import("@sinclair/typebox").TString;
24
+ srcToken: import("@sinclair/typebox").TString;
25
+ }>;
26
+ /**
27
+ * Schema for amped_bridge_quote tool
28
+ * Check if a bridge route is valid and get maximum bridgeable amount
29
+ */
30
+ declare const BridgeQuoteSchema: import("@sinclair/typebox").TObject<{
31
+ srcChainId: import("@sinclair/typebox").TString;
32
+ dstChainId: import("@sinclair/typebox").TString;
33
+ srcToken: import("@sinclair/typebox").TString;
34
+ dstToken: import("@sinclair/typebox").TString;
35
+ }>;
36
+ /**
37
+ * Schema for amped_bridge_execute tool
38
+ * Execute a bridge operation with full allowance check and approval flow
39
+ */
40
+ declare const BridgeExecuteSchema: import("@sinclair/typebox").TObject<{
41
+ walletId: import("@sinclair/typebox").TString;
42
+ srcChainId: import("@sinclair/typebox").TString;
43
+ dstChainId: import("@sinclair/typebox").TString;
44
+ srcToken: import("@sinclair/typebox").TString;
45
+ dstToken: import("@sinclair/typebox").TString;
46
+ amount: import("@sinclair/typebox").TString;
47
+ recipient: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
48
+ timeoutMs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
49
+ policyId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
50
+ }>;
51
+ type BridgeDiscoverParams = Static<typeof BridgeDiscoverSchema>;
52
+ type BridgeQuoteParams = Static<typeof BridgeQuoteSchema>;
53
+ type BridgeExecuteParams = Static<typeof BridgeExecuteSchema>;
54
+ /**
55
+ * Transaction result type for bridge execute
56
+ */
57
+ interface TransactionResult {
58
+ spokeTxHash: string;
59
+ hubTxHash?: string;
60
+ }
61
+ /**
62
+ * Handler for amped_bridge_discover
63
+ * Retrieves tokens that can be bridged from the source chain to destination chain
64
+ *
65
+ * @param params - Discovery parameters (srcChainId, dstChainId, srcToken)
66
+ * @returns List of bridgeable tokens
67
+ */
68
+ declare function handleBridgeDiscover(params: BridgeDiscoverParams): Promise<{
69
+ bridgeableTokens: string[];
70
+ }>;
71
+ /**
72
+ * Handler for amped_bridge_quote
73
+ * Checks if a bridge route is valid and returns the maximum bridgeable amount
74
+ *
75
+ * @param params - Quote parameters (srcChainId, dstChainId, srcToken, dstToken)
76
+ * @returns Bridgeability status and maximum amount
77
+ */
78
+ declare function handleBridgeQuote(params: BridgeQuoteParams): Promise<{
79
+ isBridgeable: boolean;
80
+ maxBridgeableAmount: string;
81
+ }>;
82
+ /**
83
+ * Handler for amped_bridge_execute
84
+ *
85
+ * NOTE: Bridge operations are implemented via swap infrastructure.
86
+ * Cross-chain swaps and bridges are functionally equivalent in SODAX -
87
+ * both use the intent-based cross-chain messaging system.
88
+ *
89
+ * Flow:
90
+ * 1. Get swap quote for the bridge route
91
+ * 2. Execute swap (handles allowance, approval, and execution)
92
+ *
93
+ * @param params - Execution parameters
94
+ * @returns Transaction result with status and tracking links
95
+ */
96
+ declare function handleBridgeExecute(params: BridgeExecuteParams): Promise<TransactionResult>;
97
+ /**
98
+ * Register all bridge tools with the agent tools registry
99
+ *
100
+ * @param agentTools - The agent tools registry
101
+ */
102
+ export declare function registerBridgeTools(agentTools: AgentTools): void;
103
+ export { BridgeDiscoverSchema, BridgeQuoteSchema, BridgeExecuteSchema };
104
+ export { handleBridgeDiscover, handleBridgeQuote, handleBridgeExecute };
105
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/tools/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAC;AAcvD;;;GAGG;AACH,QAAA,MAAM,oBAAoB;;;;EAUxB,CAAC;AAEH;;;GAGG;AACH,QAAA,MAAM,iBAAiB;;;;;EAarB,CAAC;AAEH;;;GAGG;AACH,QAAA,MAAM,mBAAmB;;;;;;;;;;EAmCvB,CAAC;AAGH,KAAK,oBAAoB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAChE,KAAK,iBAAiB,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC1D,KAAK,mBAAmB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAM9D;;GAEG;AACH,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,iBAAe,oBAAoB,CACjC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+CzC;AAMD;;;;;;GAMG;AACH,iBAAe,iBAAiB,CAC9B,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAAC,CA6EjE;AAMD;;;;;;;;;;;;;GAaG;AACH,iBAAe,mBAAmB,CAChC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAuE5B;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CA2ChE;AAGD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;AAGxE,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Bridge Tools for Amped DeFi Plugin
3
+ *
4
+ * NOTE: Bridge operations use the swap infrastructure internally.
5
+ * Cross-chain swaps and bridges are functionally equivalent in SODAX -
6
+ * both use the intent-based cross-chain messaging system.
7
+ *
8
+ * Tools:
9
+ * - amped_bridge_discover: Get bridgeable tokens for a route
10
+ * - amped_bridge_quote: Check bridgeability and max amounts
11
+ * - amped_bridge_execute: Execute bridge (delegates to swap)
12
+ *
13
+ * @module tools/bridge
14
+ */
15
+ import { Type } from '@sinclair/typebox';
16
+ import { getSodaxClient } from '../sodax/client';
17
+ import { serializeError } from '../utils/errorUtils';
18
+ import { resolveToken } from '../utils/tokenResolver';
19
+ import { toSodaxChainId } from '../wallet/types';
20
+ import { handleSwapQuote, handleSwapExecute } from './swap';
21
+ // ============================================================================
22
+ // TypeBox Schemas
23
+ // ============================================================================
24
+ /**
25
+ * Schema for amped_bridge_discover tool
26
+ * Discover bridgeable tokens for a given source chain, destination chain, and source token
27
+ */
28
+ const BridgeDiscoverSchema = Type.Object({
29
+ srcChainId: Type.String({
30
+ description: 'Source chain ID (e.g., "ethereum", "arbitrum")',
31
+ }),
32
+ dstChainId: Type.String({
33
+ description: 'Destination chain ID (e.g., "sonic", "optimism")',
34
+ }),
35
+ srcToken: Type.String({
36
+ description: 'Source token address or symbol',
37
+ }),
38
+ });
39
+ /**
40
+ * Schema for amped_bridge_quote tool
41
+ * Check if a bridge route is valid and get maximum bridgeable amount
42
+ */
43
+ const BridgeQuoteSchema = Type.Object({
44
+ srcChainId: Type.String({
45
+ description: 'Source chain ID',
46
+ }),
47
+ dstChainId: Type.String({
48
+ description: 'Destination chain ID',
49
+ }),
50
+ srcToken: Type.String({
51
+ description: 'Source token address or symbol',
52
+ }),
53
+ dstToken: Type.String({
54
+ description: 'Destination token address or symbol',
55
+ }),
56
+ });
57
+ /**
58
+ * Schema for amped_bridge_execute tool
59
+ * Execute a bridge operation with full allowance check and approval flow
60
+ */
61
+ const BridgeExecuteSchema = Type.Object({
62
+ walletId: Type.String({
63
+ description: 'Unique identifier for the wallet to use',
64
+ }),
65
+ srcChainId: Type.String({
66
+ description: 'Source chain ID',
67
+ }),
68
+ dstChainId: Type.String({
69
+ description: 'Destination chain ID',
70
+ }),
71
+ srcToken: Type.String({
72
+ description: 'Source token address or symbol to bridge from',
73
+ }),
74
+ dstToken: Type.String({
75
+ description: 'Destination token address or symbol to bridge to',
76
+ }),
77
+ amount: Type.String({
78
+ description: 'Amount to bridge in human-readable units (e.g., "100.5")',
79
+ }),
80
+ recipient: Type.Optional(Type.String({
81
+ description: 'Recipient address on destination chain (defaults to wallet address)',
82
+ })),
83
+ timeoutMs: Type.Optional(Type.Number({
84
+ description: 'Timeout for bridge operation in milliseconds',
85
+ default: 300000, // 5 minutes
86
+ })),
87
+ policyId: Type.Optional(Type.String({
88
+ description: 'Optional policy profile ID for custom limits',
89
+ })),
90
+ });
91
+ /**
92
+ * Handler for amped_bridge_discover
93
+ * Retrieves tokens that can be bridged from the source chain to destination chain
94
+ *
95
+ * @param params - Discovery parameters (srcChainId, dstChainId, srcToken)
96
+ * @returns List of bridgeable tokens
97
+ */
98
+ async function handleBridgeDiscover(params) {
99
+ const { srcChainId, dstChainId, srcToken } = params;
100
+ // Resolve token symbol to address
101
+ const srcTokenAddr = await resolveToken(srcChainId, srcToken);
102
+ console.log('[bridge:discover] Discovering bridgeable tokens', {
103
+ srcChainId,
104
+ dstChainId,
105
+ srcToken,
106
+ });
107
+ try {
108
+ const sodax = getSodaxClient();
109
+ // Get bridgeable tokens from SODAX SDK
110
+ // SDK API: getBridgeableTokens(from: SpokeChainId, to: SpokeChainId, token: string)
111
+ const result = sodax.bridge.getBridgeableTokens(toSodaxChainId(srcChainId), toSodaxChainId(dstChainId), srcTokenAddr);
112
+ // Handle Result type - SDK returns Result<XToken[], unknown>
113
+ if (!result.ok) {
114
+ throw new Error(`Failed to get bridgeable tokens: ${serializeError(result.error) || 'Unknown error'}`);
115
+ }
116
+ const tokens = result.value;
117
+ const bridgeableTokens = tokens.map((t) => t.address || t.symbol || String(t));
118
+ console.log('[bridge:discover] Found bridgeable tokens', {
119
+ count: bridgeableTokens.length,
120
+ tokens: bridgeableTokens,
121
+ });
122
+ return { bridgeableTokens };
123
+ }
124
+ catch (error) {
125
+ const errorMessage = error instanceof Error ? error.message : String(error);
126
+ console.error('[bridge:discover] Failed to discover bridgeable tokens', {
127
+ error: errorMessage,
128
+ srcChainId,
129
+ dstChainId,
130
+ srcToken,
131
+ });
132
+ throw new Error(`Failed to discover bridgeable tokens: ${errorMessage}`);
133
+ }
134
+ }
135
+ // ============================================================================
136
+ // Bridge Quote Tool
137
+ // ============================================================================
138
+ /**
139
+ * Handler for amped_bridge_quote
140
+ * Checks if a bridge route is valid and returns the maximum bridgeable amount
141
+ *
142
+ * @param params - Quote parameters (srcChainId, dstChainId, srcToken, dstToken)
143
+ * @returns Bridgeability status and maximum amount
144
+ */
145
+ async function handleBridgeQuote(params) {
146
+ const { srcChainId, dstChainId, srcToken, dstToken } = params;
147
+ // Resolve token symbols to addresses
148
+ const srcTokenAddr = await resolveToken(srcChainId, srcToken);
149
+ const dstTokenAddr = await resolveToken(dstChainId, dstToken);
150
+ console.log('[bridge:quote] Checking bridge quote', {
151
+ srcChainId,
152
+ dstChainId,
153
+ srcToken,
154
+ dstToken,
155
+ });
156
+ try {
157
+ const sodax = getSodaxClient();
158
+ // Create XToken objects for the SDK
159
+ const fromToken = { chainId: toSodaxChainId(srcChainId), address: srcTokenAddr };
160
+ const toToken = { chainId: toSodaxChainId(dstChainId), address: dstTokenAddr };
161
+ // Check if the route is bridgeable using isBridgeable
162
+ // SDK may have different signature - adapting based on available methods
163
+ let isBridgeable = false;
164
+ try {
165
+ // Try to get bridgeable tokens to check if route exists
166
+ const result = sodax.bridge.getBridgeableTokens(toSodaxChainId(srcChainId), toSodaxChainId(dstChainId), srcTokenAddr);
167
+ if (result.ok && result.value.length > 0) {
168
+ isBridgeable = result.value.some((t) => t.address?.toLowerCase() === dstTokenAddr.toLowerCase() ||
169
+ t === dstTokenAddr);
170
+ }
171
+ }
172
+ catch {
173
+ isBridgeable = false;
174
+ }
175
+ // Get maximum bridgeable amount
176
+ let maxBridgeableAmount = '0';
177
+ if (isBridgeable) {
178
+ try {
179
+ // SDK API: getBridgeableAmount(from: XToken, to: XToken)
180
+ const maxAmountResult = await sodax.bridge.getBridgeableAmount(fromToken, toToken);
181
+ if (maxAmountResult.ok) {
182
+ const val = maxAmountResult.value;
183
+ // BridgeLimit may have different property names depending on SDK version
184
+ maxBridgeableAmount = val?.max?.toString() ||
185
+ val?.maxAmount?.toString() ||
186
+ val?.limit?.toString() ||
187
+ val?.toString() || '0';
188
+ }
189
+ }
190
+ catch (e) {
191
+ console.warn('[bridge:quote] Could not get max bridgeable amount:', e);
192
+ }
193
+ }
194
+ console.log('[bridge:quote] Bridge quote result', {
195
+ isBridgeable,
196
+ maxBridgeableAmount,
197
+ });
198
+ return { isBridgeable, maxBridgeableAmount };
199
+ }
200
+ catch (error) {
201
+ const errorMessage = error instanceof Error ? error.message : String(error);
202
+ console.error('[bridge:quote] Failed to get bridge quote', {
203
+ error: errorMessage,
204
+ srcChainId,
205
+ dstChainId,
206
+ srcToken,
207
+ dstToken,
208
+ });
209
+ throw new Error(`Failed to get bridge quote: ${errorMessage}`);
210
+ }
211
+ }
212
+ // ============================================================================
213
+ // Bridge Execute Tool (Delegates to Swap)
214
+ // ============================================================================
215
+ /**
216
+ * Handler for amped_bridge_execute
217
+ *
218
+ * NOTE: Bridge operations are implemented via swap infrastructure.
219
+ * Cross-chain swaps and bridges are functionally equivalent in SODAX -
220
+ * both use the intent-based cross-chain messaging system.
221
+ *
222
+ * Flow:
223
+ * 1. Get swap quote for the bridge route
224
+ * 2. Execute swap (handles allowance, approval, and execution)
225
+ *
226
+ * @param params - Execution parameters
227
+ * @returns Transaction result with status and tracking links
228
+ */
229
+ async function handleBridgeExecute(params) {
230
+ const { walletId, srcChainId, dstChainId, srcToken, dstToken, amount, recipient, timeoutMs = 300000, policyId, } = params;
231
+ console.log('[bridge:execute] Delegating to swap infrastructure', {
232
+ walletId,
233
+ srcChainId,
234
+ dstChainId,
235
+ srcToken,
236
+ dstToken,
237
+ amount,
238
+ });
239
+ try {
240
+ // Step 1: Get a swap quote for this bridge route
241
+ const quoteResult = await handleSwapQuote({
242
+ walletId,
243
+ srcChainId,
244
+ dstChainId,
245
+ srcToken,
246
+ dstToken,
247
+ amount,
248
+ type: 'exact_input',
249
+ slippageBps: 100, // 1% slippage for bridges
250
+ recipient,
251
+ });
252
+ console.log('[bridge:execute] Got swap quote', quoteResult);
253
+ // Step 2: Execute the swap
254
+ const swapResult = await handleSwapExecute({
255
+ walletId,
256
+ quote: {
257
+ srcChainId,
258
+ dstChainId,
259
+ srcToken: String(quoteResult.srcToken),
260
+ dstToken: String(quoteResult.dstToken),
261
+ inputAmount: String(quoteResult.inputAmount),
262
+ outputAmount: String(quoteResult.outputAmount),
263
+ slippageBps: Number(quoteResult.slippageBps),
264
+ deadline: Number(quoteResult.deadline),
265
+ recipient,
266
+ },
267
+ policyId,
268
+ timeoutMs,
269
+ });
270
+ console.log('[bridge:execute] Swap executed', swapResult);
271
+ // Map swap result to bridge result format
272
+ return {
273
+ spokeTxHash: String(swapResult.initiationTx || swapResult.spokeTxHash || ''),
274
+ hubTxHash: swapResult.hubTxHash ? String(swapResult.hubTxHash) : undefined,
275
+ status: String(swapResult.status),
276
+ message: swapResult.message ? String(swapResult.message) : 'Bridge executed via swap infrastructure',
277
+ sodaxScanUrl: swapResult.sodaxScanUrl ? String(swapResult.sodaxScanUrl) : undefined,
278
+ };
279
+ }
280
+ catch (error) {
281
+ const errorMessage = serializeError(error);
282
+ console.error('[bridge:execute] Bridge via swap failed:', errorMessage);
283
+ throw new Error(`Bridge execution failed: ${errorMessage}`);
284
+ }
285
+ }
286
+ // ============================================================================
287
+ // Tool Registration
288
+ // ============================================================================
289
+ /**
290
+ * Register all bridge tools with the agent tools registry
291
+ *
292
+ * @param agentTools - The agent tools registry
293
+ */
294
+ export function registerBridgeTools(agentTools) {
295
+ // Register bridge discover tool
296
+ agentTools.register({
297
+ name: 'amped_bridge_discover',
298
+ summary: 'Discover bridgeable tokens for a given source chain and token',
299
+ description: 'Retrieves a list of tokens that can be bridged from the specified source chain ' +
300
+ 'to the destination chain, starting from a specific source token. ' +
301
+ 'Use this to find valid bridge routes before requesting a quote.',
302
+ schema: BridgeDiscoverSchema,
303
+ handler: handleBridgeDiscover,
304
+ });
305
+ console.log('[bridge] Registered tool: amped_bridge_discover');
306
+ // Register bridge quote tool
307
+ agentTools.register({
308
+ name: 'amped_bridge_quote',
309
+ summary: 'Check bridgeability and get maximum bridgeable amount',
310
+ description: 'Validates whether a specific bridge route (source chain/token → destination chain/token) ' +
311
+ 'is supported and returns the maximum amount that can be bridged. ' +
312
+ 'Always call this before executing a bridge to verify the route is valid.',
313
+ schema: BridgeQuoteSchema,
314
+ handler: handleBridgeQuote,
315
+ });
316
+ console.log('[bridge] Registered tool: amped_bridge_quote');
317
+ // Register bridge execute tool
318
+ agentTools.register({
319
+ name: 'amped_bridge_execute',
320
+ summary: 'Execute a cross-chain bridge operation',
321
+ description: 'Executes a bridge operation that moves tokens from a source chain to a destination chain. ' +
322
+ 'This tool handles the complete flow: policy validation, allowance checking, ' +
323
+ 'token approval (if needed), and bridge execution. ' +
324
+ 'Returns transaction hashes for both the spoke chain and hub chain.',
325
+ schema: BridgeExecuteSchema,
326
+ handler: handleBridgeExecute,
327
+ });
328
+ console.log('[bridge] Registered tool: amped_bridge_execute');
329
+ }
330
+ // Export schemas for testing and reuse
331
+ export { BridgeDiscoverSchema, BridgeQuoteSchema, BridgeExecuteSchema };
332
+ // Export handlers
333
+ export { handleBridgeDiscover, handleBridgeQuote, handleBridgeExecute };
334
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/tools/bridge.ts"],"names":[],"mappings":"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"}