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,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock for @sodax/sdk
|
|
3
|
+
*/
|
|
4
|
+
export declare class Sodax {
|
|
5
|
+
static initialize: jest.Mock<any, any, any>;
|
|
6
|
+
swaps: {
|
|
7
|
+
getQuote: jest.Mock<any, any, any>;
|
|
8
|
+
executeSwap: jest.Mock<any, any, any>;
|
|
9
|
+
cancelIntent: jest.Mock<any, any, any>;
|
|
10
|
+
};
|
|
11
|
+
bridge: {
|
|
12
|
+
getBridgeableTokens: jest.Mock<any, any, any>;
|
|
13
|
+
bridge: jest.Mock<any, any, any>;
|
|
14
|
+
};
|
|
15
|
+
moneyMarket: {
|
|
16
|
+
supply: jest.Mock<any, any, any>;
|
|
17
|
+
withdraw: jest.Mock<any, any, any>;
|
|
18
|
+
borrow: jest.Mock<any, any, any>;
|
|
19
|
+
repay: jest.Mock<any, any, any>;
|
|
20
|
+
getUserAccountDataOnSpoke: jest.Mock<any, any, any>;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare const Intent: {};
|
|
24
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/__mocks__/@sodax/sdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,KAAK;IAChB,MAAM,CAAC,UAAU,2BAA0C;IAE3D,KAAK;;;;MAIH;IAEF,MAAM;;;MAGJ;IAEF,WAAW;;;;;;MAMT;CACH;AAED,eAAO,MAAM,MAAM,IAAK,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock for @sodax/sdk
|
|
3
|
+
*/
|
|
4
|
+
export class Sodax {
|
|
5
|
+
static initialize = jest.fn().mockResolvedValue(undefined);
|
|
6
|
+
swaps = {
|
|
7
|
+
getQuote: jest.fn(),
|
|
8
|
+
executeSwap: jest.fn(),
|
|
9
|
+
cancelIntent: jest.fn(),
|
|
10
|
+
};
|
|
11
|
+
bridge = {
|
|
12
|
+
getBridgeableTokens: jest.fn(),
|
|
13
|
+
bridge: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
moneyMarket = {
|
|
16
|
+
supply: jest.fn(),
|
|
17
|
+
withdraw: jest.fn(),
|
|
18
|
+
borrow: jest.fn(),
|
|
19
|
+
repay: jest.fn(),
|
|
20
|
+
getUserAccountDataOnSpoke: jest.fn(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export const Intent = {};
|
|
24
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/__mocks__/@sodax/sdk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,KAAK;IAChB,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAE3D,KAAK,GAAG;QACN,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;QACtB,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;KACxB,CAAC;IAEF,MAAM,GAAG;QACP,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;KAClB,CAAC;IAEF,WAAW,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QACjB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,yBAAyB,EAAE,IAAI,CAAC,EAAE,EAAE;KACrC,CAAC;;AAGJ,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jest Test Setup
|
|
3
|
+
*/
|
|
4
|
+
// Mock console methods to reduce noise during tests
|
|
5
|
+
global.console = {
|
|
6
|
+
...console,
|
|
7
|
+
log: jest.fn(),
|
|
8
|
+
debug: jest.fn(),
|
|
9
|
+
info: jest.fn(),
|
|
10
|
+
warn: jest.fn(),
|
|
11
|
+
error: jest.fn(),
|
|
12
|
+
};
|
|
13
|
+
// Set default test environment
|
|
14
|
+
process.env.AMPED_OC_MODE = 'execute';
|
|
15
|
+
process.env.AMPED_OC_WALLETS_JSON = JSON.stringify({
|
|
16
|
+
test: {
|
|
17
|
+
address: '0x1234567890123456789012345678901234567890',
|
|
18
|
+
privateKey: '0xabc123def456',
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
process.env.AMPED_OC_RPC_URLS_JSON = JSON.stringify({
|
|
22
|
+
ethereum: 'https://eth-mainnet.example.com',
|
|
23
|
+
arbitrum: 'https://arb-mainnet.example.com',
|
|
24
|
+
sonic: 'https://rpc.sonic.example.com',
|
|
25
|
+
});
|
|
26
|
+
// Global test timeout
|
|
27
|
+
jest.setTimeout(10000);
|
|
28
|
+
// Clean up after each test
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
jest.clearAllMocks();
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oDAAoD;AACpD,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,OAAO;IACV,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;CACjB,CAAC;AAEF,+BAA+B;AAC/B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;AACtC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC;IACjD,IAAI,EAAE;QACJ,OAAO,EAAE,4CAA4C;QACrD,UAAU,EAAE,gBAAgB;KAC7B;CACF,CAAC,CAAC;AACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC;IAClD,QAAQ,EAAE,iCAAiC;IAC3C,QAAQ,EAAE,iCAAiC;IAC3C,KAAK,EAAE,+BAA+B;CACvC,CAAC,CAAC;AAEH,sBAAsB;AACtB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,2BAA2B;AAC3B,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,CAAC,aAAa,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amped DeFi Plugin
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw plugin for DeFi operations (swaps, bridging, money market)
|
|
5
|
+
* via the SODAX SDK.
|
|
6
|
+
*/
|
|
7
|
+
import { TSchema } from '@sinclair/typebox';
|
|
8
|
+
/**
|
|
9
|
+
* OpenClaw Plugin API (defined locally to avoid SDK dependency)
|
|
10
|
+
*/
|
|
11
|
+
interface OpenClawPluginApi {
|
|
12
|
+
pluginConfig: Record<string, unknown>;
|
|
13
|
+
logger: {
|
|
14
|
+
info: (msg: string) => void;
|
|
15
|
+
warn: (msg: string) => void;
|
|
16
|
+
error: (msg: string) => void;
|
|
17
|
+
debug: (msg: string) => void;
|
|
18
|
+
};
|
|
19
|
+
registerTool: (tool: {
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
parameters: TSchema;
|
|
23
|
+
execute: (toolCallId: string, params: unknown) => Promise<{
|
|
24
|
+
content: Array<{
|
|
25
|
+
type: 'text';
|
|
26
|
+
text: string;
|
|
27
|
+
}>;
|
|
28
|
+
details?: unknown;
|
|
29
|
+
}>;
|
|
30
|
+
}) => void;
|
|
31
|
+
registerService: (service: {
|
|
32
|
+
id: string;
|
|
33
|
+
start: () => void;
|
|
34
|
+
stop: () => Promise<void> | void;
|
|
35
|
+
}) => void;
|
|
36
|
+
on: (event: string, handler: (event: unknown, ctx: unknown) => unknown) => void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* OpenClaw Plugin Definition
|
|
40
|
+
*/
|
|
41
|
+
declare const _default: {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
kind: "tools";
|
|
46
|
+
configSchema: import("@sinclair/typebox").TObject<{
|
|
47
|
+
walletsJson: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
48
|
+
rpcUrlsJson: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
49
|
+
mode: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"execute">, import("@sinclair/typebox").TLiteral<"simulate">]>>;
|
|
50
|
+
dynamicConfig: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
51
|
+
}>;
|
|
52
|
+
register(api: OpenClawPluginApi): void;
|
|
53
|
+
};
|
|
54
|
+
export default _default;
|
|
55
|
+
export * from './types';
|
|
56
|
+
export { getSodaxClient, getSodaxClientAsync, resetSodaxClient } from './sodax/client';
|
|
57
|
+
export { getSpokeProvider, getCacheStats, clearProviderCache } from './providers/spokeProviderFactory';
|
|
58
|
+
export type { SpokeProvider } from './providers/spokeProviderFactory';
|
|
59
|
+
export { EvmSpokeProvider, SonicSpokeProvider } from '@sodax/sdk';
|
|
60
|
+
export { PolicyEngine } from './policy/policyEngine';
|
|
61
|
+
export { WalletRegistry, getWalletRegistry } from './wallet/walletRegistry';
|
|
62
|
+
export { WalletManager, getWalletManager, resetWalletManager } from './wallet/walletManager';
|
|
63
|
+
export type { IWalletBackend, WalletInfo, WalletBackendType } from './wallet/types';
|
|
64
|
+
export declare function activate(): Promise<void>;
|
|
65
|
+
export declare function deactivate(): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,UAAU,iBAAiB;IACzB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,EAAE,CAAC,IAAI,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;YACxD,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,KAAK,IAAI,CAAC;IACX,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,IAAI,CAAC;QAClB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAClC,KAAK,IAAI,CAAC;IACX,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC;CACjF;AA6GD;;GAEG;;;;;;;;;;;;kBAQa,iBAAiB;;AAPjC,wBAiNE;AAGF,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACvG,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,wBAAsB,QAAQ,kBAE7B;AACD,wBAAsB,UAAU,kBAE/B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Amped DeFi Plugin
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw plugin for DeFi operations (swaps, bridging, money market)
|
|
5
|
+
* via the SODAX SDK.
|
|
6
|
+
*/
|
|
7
|
+
import { Type } from '@sinclair/typebox';
|
|
8
|
+
import { getSodaxClientAsync, resetSodaxClient } from './sodax/client';
|
|
9
|
+
import { getCacheStats } from './providers/spokeProviderFactory';
|
|
10
|
+
import { PolicyEngine } from './policy/policyEngine';
|
|
11
|
+
import { getWalletManager } from './wallet/walletManager';
|
|
12
|
+
// Tool schemas and handlers
|
|
13
|
+
import { SwapQuoteSchema, SwapExecuteSchema, SwapStatusSchema, SwapCancelSchema, handleSwapQuote, handleSwapExecute, handleSwapStatus, handleSwapCancel } from './tools/swap';
|
|
14
|
+
import { BridgeDiscoverSchema, BridgeQuoteSchema, BridgeExecuteSchema, handleBridgeDiscover, handleBridgeQuote, handleBridgeExecute } from './tools/bridge';
|
|
15
|
+
import { MmSupplySchema, MmWithdrawSchema, MmBorrowSchema, MmRepaySchema, handleMmSupply, handleMmWithdraw, handleMmBorrow, handleMmRepay } from './tools/moneyMarket';
|
|
16
|
+
import { SupportedChainsSchema, SupportedTokensSchema, WalletAddressSchema, MoneyMarketReservesSchema, MoneyMarketPositionsSchema, CrossChainPositionsSchema, UserIntentsSchema, ListWalletsSchema, handleSupportedChains, handleSupportedTokens, handleWalletAddress, handleMoneyMarketReserves, handleMoneyMarketPositions, handleCrossChainPositions, handleUserIntents, handleListWallets } from './tools/discovery';
|
|
17
|
+
import { AddWalletSchema, RenameWalletSchema, RemoveWalletSchema, SetDefaultWalletSchema, handleAddWallet, handleRenameWallet, handleRemoveWallet, handleSetDefaultWallet } from './tools/walletManagement';
|
|
18
|
+
import { PortfolioSummarySchema, handlePortfolioSummary } from './tools/portfolio';
|
|
19
|
+
/**
|
|
20
|
+
* Plugin configuration schema (matches openclaw.plugin.json)
|
|
21
|
+
*/
|
|
22
|
+
const configSchema = Type.Object({
|
|
23
|
+
walletsJson: Type.Optional(Type.String()),
|
|
24
|
+
rpcUrlsJson: Type.Optional(Type.String()),
|
|
25
|
+
mode: Type.Optional(Type.Union([Type.Literal('execute'), Type.Literal('simulate')])),
|
|
26
|
+
dynamicConfig: Type.Optional(Type.Boolean()),
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Apply plugin config to environment
|
|
30
|
+
*/
|
|
31
|
+
function applyConfig(config) {
|
|
32
|
+
if (config.walletsJson && typeof config.walletsJson === 'string') {
|
|
33
|
+
process.env.AMPED_OC_WALLETS_JSON = config.walletsJson;
|
|
34
|
+
}
|
|
35
|
+
if (config.rpcUrlsJson && typeof config.rpcUrlsJson === 'string') {
|
|
36
|
+
process.env.AMPED_OC_RPC_URLS_JSON = config.rpcUrlsJson;
|
|
37
|
+
}
|
|
38
|
+
if (config.mode && typeof config.mode === 'string') {
|
|
39
|
+
process.env.AMPED_OC_MODE = config.mode;
|
|
40
|
+
}
|
|
41
|
+
if (config.dynamicConfig !== undefined) {
|
|
42
|
+
process.env.AMPED_OC_SODAX_DYNAMIC_CONFIG = config.dynamicConfig ? 'true' : 'false';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate required environment variables
|
|
47
|
+
*/
|
|
48
|
+
function validateEnvironment() {
|
|
49
|
+
const missing = [];
|
|
50
|
+
if (!process.env.AMPED_OC_WALLETS_JSON) {
|
|
51
|
+
missing.push('AMPED_OC_WALLETS_JSON');
|
|
52
|
+
}
|
|
53
|
+
const mode = process.env.AMPED_OC_MODE || 'execute';
|
|
54
|
+
if (mode === 'execute' && !process.env.AMPED_OC_RPC_URLS_JSON) {
|
|
55
|
+
missing.push('AMPED_OC_RPC_URLS_JSON');
|
|
56
|
+
}
|
|
57
|
+
return missing;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Deep-clone an object while converting BigInt values to strings
|
|
61
|
+
* Prevents serialization errors when OpenClaw framework handles the details field
|
|
62
|
+
*/
|
|
63
|
+
function sanitizeBigInt(obj) {
|
|
64
|
+
return JSON.parse(JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? v.toString() : v));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Helper to wrap a handler for OpenClaw's tool format
|
|
68
|
+
*/
|
|
69
|
+
function wrapHandler(handler) {
|
|
70
|
+
return async (_toolCallId, params) => {
|
|
71
|
+
const result = await handler(params);
|
|
72
|
+
// Sanitize BigInt values in details to prevent framework serialization errors
|
|
73
|
+
const sanitizedResult = sanitizeBigInt(result);
|
|
74
|
+
return {
|
|
75
|
+
content: [{ type: 'text', text: JSON.stringify(result, (k, v) => typeof v === 'bigint' ? v.toString() : v, 2) }],
|
|
76
|
+
details: sanitizedResult,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* OpenClaw Plugin Definition
|
|
82
|
+
*/
|
|
83
|
+
export default {
|
|
84
|
+
id: 'amped-defi',
|
|
85
|
+
name: 'Amped DeFi',
|
|
86
|
+
description: 'DeFi operations plugin for swaps, bridging, and money market via SODAX SDK',
|
|
87
|
+
kind: 'tools',
|
|
88
|
+
configSchema,
|
|
89
|
+
register(api) {
|
|
90
|
+
// Apply config from OpenClaw
|
|
91
|
+
const config = api.pluginConfig || {};
|
|
92
|
+
applyConfig(config);
|
|
93
|
+
// Check for missing env vars (silent)
|
|
94
|
+
validateEnvironment();
|
|
95
|
+
// Initialize core components (async, non-blocking, silent)
|
|
96
|
+
(async () => {
|
|
97
|
+
try {
|
|
98
|
+
await getSodaxClientAsync();
|
|
99
|
+
getCacheStats();
|
|
100
|
+
new PolicyEngine();
|
|
101
|
+
getWalletManager();
|
|
102
|
+
}
|
|
103
|
+
catch (_error) {
|
|
104
|
+
// Silent initialization - errors will surface when tools are used
|
|
105
|
+
}
|
|
106
|
+
})();
|
|
107
|
+
// Register Discovery Tools
|
|
108
|
+
api.registerTool({
|
|
109
|
+
name: 'amped_supported_chains',
|
|
110
|
+
description: 'List all blockchain networks supported by the Amped DeFi plugin',
|
|
111
|
+
parameters: SupportedChainsSchema,
|
|
112
|
+
execute: wrapHandler(handleSupportedChains),
|
|
113
|
+
});
|
|
114
|
+
api.registerTool({
|
|
115
|
+
name: 'amped_supported_tokens',
|
|
116
|
+
description: 'List tokens supported on a specific chain for swaps and bridging',
|
|
117
|
+
parameters: SupportedTokensSchema,
|
|
118
|
+
execute: wrapHandler(handleSupportedTokens),
|
|
119
|
+
});
|
|
120
|
+
api.registerTool({
|
|
121
|
+
name: 'amped_wallet_address',
|
|
122
|
+
description: 'Get the wallet address for a specific wallet ID',
|
|
123
|
+
parameters: WalletAddressSchema,
|
|
124
|
+
execute: wrapHandler(handleWalletAddress),
|
|
125
|
+
});
|
|
126
|
+
api.registerTool({
|
|
127
|
+
name: 'amped_money_market_reserves',
|
|
128
|
+
description: 'Get money market reserve info (APY, utilization, liquidity)',
|
|
129
|
+
parameters: MoneyMarketReservesSchema,
|
|
130
|
+
execute: wrapHandler(handleMoneyMarketReserves),
|
|
131
|
+
});
|
|
132
|
+
api.registerTool({
|
|
133
|
+
name: 'amped_money_market_positions',
|
|
134
|
+
description: 'Get user positions in money market on a single chain',
|
|
135
|
+
parameters: MoneyMarketPositionsSchema,
|
|
136
|
+
execute: wrapHandler(handleMoneyMarketPositions),
|
|
137
|
+
});
|
|
138
|
+
api.registerTool({
|
|
139
|
+
name: 'amped_cross_chain_positions',
|
|
140
|
+
description: 'Get aggregated money market positions across all chains',
|
|
141
|
+
parameters: CrossChainPositionsSchema,
|
|
142
|
+
execute: wrapHandler(handleCrossChainPositions),
|
|
143
|
+
});
|
|
144
|
+
api.registerTool({
|
|
145
|
+
name: 'amped_user_intents',
|
|
146
|
+
description: 'Query user intent history from SODAX API',
|
|
147
|
+
parameters: UserIntentsSchema,
|
|
148
|
+
execute: wrapHandler(handleUserIntents),
|
|
149
|
+
});
|
|
150
|
+
api.registerTool({
|
|
151
|
+
name: 'amped_list_wallets',
|
|
152
|
+
description: 'List ALL configured wallets including evm-wallet-skill, Bankr, and env wallets. Shows nicknames, addresses, types, and supported chains. Use this when user asks "what wallets do I have" or "show my wallets".',
|
|
153
|
+
parameters: ListWalletsSchema,
|
|
154
|
+
execute: wrapHandler(handleListWallets),
|
|
155
|
+
});
|
|
156
|
+
api.registerTool({
|
|
157
|
+
name: 'amped_portfolio_summary',
|
|
158
|
+
description: 'Get a comprehensive portfolio summary including wallet balances (native + major tokens) across chains and money market positions. Use when user asks for "portfolio", "balances", or "summary of positions".',
|
|
159
|
+
parameters: PortfolioSummarySchema,
|
|
160
|
+
execute: wrapHandler(handlePortfolioSummary),
|
|
161
|
+
});
|
|
162
|
+
// Register Wallet Management Tools
|
|
163
|
+
api.registerTool({
|
|
164
|
+
name: 'amped_add_wallet',
|
|
165
|
+
description: 'Add a new wallet with a nickname (evm-wallet-skill, bankr, or env)',
|
|
166
|
+
parameters: AddWalletSchema,
|
|
167
|
+
execute: wrapHandler(handleAddWallet),
|
|
168
|
+
});
|
|
169
|
+
api.registerTool({
|
|
170
|
+
name: 'amped_rename_wallet',
|
|
171
|
+
description: 'Rename a wallet to a new nickname',
|
|
172
|
+
parameters: RenameWalletSchema,
|
|
173
|
+
execute: wrapHandler(handleRenameWallet),
|
|
174
|
+
});
|
|
175
|
+
api.registerTool({
|
|
176
|
+
name: 'amped_remove_wallet',
|
|
177
|
+
description: 'Remove a wallet from configuration (does not delete funds)',
|
|
178
|
+
parameters: RemoveWalletSchema,
|
|
179
|
+
execute: wrapHandler(handleRemoveWallet),
|
|
180
|
+
});
|
|
181
|
+
api.registerTool({
|
|
182
|
+
name: 'amped_set_default_wallet',
|
|
183
|
+
description: 'Set which wallet to use by default for operations',
|
|
184
|
+
parameters: SetDefaultWalletSchema,
|
|
185
|
+
execute: wrapHandler(handleSetDefaultWallet),
|
|
186
|
+
});
|
|
187
|
+
// Register Swap Tools
|
|
188
|
+
api.registerTool({
|
|
189
|
+
name: 'amped_swap_quote',
|
|
190
|
+
description: 'Get a quote for swapping tokens (same chain or cross-chain)',
|
|
191
|
+
parameters: SwapQuoteSchema,
|
|
192
|
+
execute: wrapHandler(handleSwapQuote),
|
|
193
|
+
});
|
|
194
|
+
api.registerTool({
|
|
195
|
+
name: 'amped_swap_execute',
|
|
196
|
+
description: 'Execute a token swap using a previously obtained quote',
|
|
197
|
+
parameters: SwapExecuteSchema,
|
|
198
|
+
execute: wrapHandler(handleSwapExecute),
|
|
199
|
+
});
|
|
200
|
+
api.registerTool({
|
|
201
|
+
name: 'amped_swap_status',
|
|
202
|
+
description: 'Check the status of a swap/bridge operation by intent ID',
|
|
203
|
+
parameters: SwapStatusSchema,
|
|
204
|
+
execute: wrapHandler(handleSwapStatus),
|
|
205
|
+
});
|
|
206
|
+
api.registerTool({
|
|
207
|
+
name: 'amped_swap_cancel',
|
|
208
|
+
description: 'Cancel a pending swap/bridge operation',
|
|
209
|
+
parameters: SwapCancelSchema,
|
|
210
|
+
execute: wrapHandler(handleSwapCancel),
|
|
211
|
+
});
|
|
212
|
+
// Register Bridge Tools
|
|
213
|
+
api.registerTool({
|
|
214
|
+
name: 'amped_bridge_discover',
|
|
215
|
+
description: 'Discover available bridge routes between chains',
|
|
216
|
+
parameters: BridgeDiscoverSchema,
|
|
217
|
+
execute: wrapHandler(handleBridgeDiscover),
|
|
218
|
+
});
|
|
219
|
+
api.registerTool({
|
|
220
|
+
name: 'amped_bridge_quote',
|
|
221
|
+
description: 'Get a quote for bridging tokens between chains',
|
|
222
|
+
parameters: BridgeQuoteSchema,
|
|
223
|
+
execute: wrapHandler(handleBridgeQuote),
|
|
224
|
+
});
|
|
225
|
+
api.registerTool({
|
|
226
|
+
name: 'amped_bridge_execute',
|
|
227
|
+
description: 'Execute a bridge transfer using a previously obtained quote',
|
|
228
|
+
parameters: BridgeExecuteSchema,
|
|
229
|
+
execute: wrapHandler(handleBridgeExecute),
|
|
230
|
+
});
|
|
231
|
+
// Register Money Market Tools
|
|
232
|
+
api.registerTool({
|
|
233
|
+
name: 'amped_mm_supply',
|
|
234
|
+
description: 'Supply (deposit) tokens to money market to earn interest',
|
|
235
|
+
parameters: MmSupplySchema,
|
|
236
|
+
execute: wrapHandler(handleMmSupply),
|
|
237
|
+
});
|
|
238
|
+
api.registerTool({
|
|
239
|
+
name: 'amped_mm_withdraw',
|
|
240
|
+
description: 'Withdraw supplied tokens from money market',
|
|
241
|
+
parameters: MmWithdrawSchema,
|
|
242
|
+
execute: wrapHandler(handleMmWithdraw),
|
|
243
|
+
});
|
|
244
|
+
api.registerTool({
|
|
245
|
+
name: 'amped_mm_borrow',
|
|
246
|
+
description: 'Borrow tokens from money market (cross-chain capable)',
|
|
247
|
+
parameters: MmBorrowSchema,
|
|
248
|
+
execute: wrapHandler(handleMmBorrow),
|
|
249
|
+
});
|
|
250
|
+
api.registerTool({
|
|
251
|
+
name: 'amped_mm_repay',
|
|
252
|
+
description: 'Repay borrowed tokens to money market',
|
|
253
|
+
parameters: MmRepaySchema,
|
|
254
|
+
execute: wrapHandler(handleMmRepay),
|
|
255
|
+
});
|
|
256
|
+
// Register cleanup service
|
|
257
|
+
api.registerService({
|
|
258
|
+
id: 'amped-defi',
|
|
259
|
+
start: () => { },
|
|
260
|
+
stop: async () => {
|
|
261
|
+
resetSodaxClient();
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
// Re-export types and utilities for external use
|
|
267
|
+
export * from './types';
|
|
268
|
+
export { getSodaxClient, getSodaxClientAsync, resetSodaxClient } from './sodax/client';
|
|
269
|
+
export { getSpokeProvider, getCacheStats, clearProviderCache } from './providers/spokeProviderFactory';
|
|
270
|
+
export { EvmSpokeProvider, SonicSpokeProvider } from '@sodax/sdk';
|
|
271
|
+
export { PolicyEngine } from './policy/policyEngine';
|
|
272
|
+
export { WalletRegistry, getWalletRegistry } from './wallet/walletRegistry';
|
|
273
|
+
export { WalletManager, getWalletManager, resetWalletManager } from './wallet/walletManager';
|
|
274
|
+
// Legacy exports for backward compatibility
|
|
275
|
+
export async function activate() {
|
|
276
|
+
// Deprecated - use default export
|
|
277
|
+
}
|
|
278
|
+
export async function deactivate() {
|
|
279
|
+
resetSodaxClient();
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 { BridgeOperation, PolicyConfig } from '../types';
|
|
12
|
+
/**
|
|
13
|
+
* Policy check result
|
|
14
|
+
*/
|
|
15
|
+
export interface PolicyCheckResult {
|
|
16
|
+
allowed: boolean;
|
|
17
|
+
reason?: string;
|
|
18
|
+
details?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Policy Engine class for enforcing security constraints
|
|
22
|
+
*/
|
|
23
|
+
export declare class PolicyEngine {
|
|
24
|
+
private config;
|
|
25
|
+
constructor(policyId?: string);
|
|
26
|
+
/**
|
|
27
|
+
* Load policy configuration from environment
|
|
28
|
+
*
|
|
29
|
+
* @param policyId - Optional policy profile ID for custom limits
|
|
30
|
+
* @returns The policy configuration
|
|
31
|
+
*/
|
|
32
|
+
private loadPolicyConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a chain is allowed
|
|
35
|
+
*
|
|
36
|
+
* @param chainId - The chain ID to check
|
|
37
|
+
* @returns Policy check result
|
|
38
|
+
*/
|
|
39
|
+
private checkChainAllowed;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a token is allowed on a specific chain
|
|
42
|
+
*
|
|
43
|
+
* @param chainId - The chain ID
|
|
44
|
+
* @param token - The token address or symbol
|
|
45
|
+
* @returns Policy check result
|
|
46
|
+
*/
|
|
47
|
+
private checkTokenAllowed;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a recipient is blocked
|
|
50
|
+
*
|
|
51
|
+
* @param recipient - The recipient address
|
|
52
|
+
* @returns Policy check result
|
|
53
|
+
*/
|
|
54
|
+
private checkRecipientNotBlocked;
|
|
55
|
+
/**
|
|
56
|
+
* Check bridge amount against limits
|
|
57
|
+
*
|
|
58
|
+
* @param token - The token address or symbol
|
|
59
|
+
* @param amount - The amount in human-readable units
|
|
60
|
+
* @returns Policy check result
|
|
61
|
+
*/
|
|
62
|
+
private checkBridgeAmount;
|
|
63
|
+
/**
|
|
64
|
+
* Check a bridge operation against all policies
|
|
65
|
+
*
|
|
66
|
+
* @param operation - The bridge operation to validate
|
|
67
|
+
* @returns Policy check result
|
|
68
|
+
*/
|
|
69
|
+
checkBridge(operation: BridgeOperation): Promise<PolicyCheckResult>;
|
|
70
|
+
/**
|
|
71
|
+
* Get the current policy configuration
|
|
72
|
+
* @returns The policy configuration
|
|
73
|
+
*/
|
|
74
|
+
getConfig(): PolicyConfig;
|
|
75
|
+
/**
|
|
76
|
+
* Get available policy IDs from the configuration
|
|
77
|
+
* @returns Array of available policy IDs
|
|
78
|
+
*/
|
|
79
|
+
getAvailablePolicies(): string[];
|
|
80
|
+
/**
|
|
81
|
+
* Check swap input amount against USD limits
|
|
82
|
+
*/
|
|
83
|
+
private checkSwapAmount;
|
|
84
|
+
/**
|
|
85
|
+
* Check slippage against maximum allowed
|
|
86
|
+
*/
|
|
87
|
+
private checkSlippage;
|
|
88
|
+
/**
|
|
89
|
+
* Check a swap operation against all policies
|
|
90
|
+
*/
|
|
91
|
+
checkSwap(params: {
|
|
92
|
+
walletId: string;
|
|
93
|
+
srcChainId: string;
|
|
94
|
+
dstChainId: string;
|
|
95
|
+
srcToken: string;
|
|
96
|
+
dstToken: string;
|
|
97
|
+
inputAmount: string;
|
|
98
|
+
slippageBps: number;
|
|
99
|
+
policyId?: string;
|
|
100
|
+
}): Promise<PolicyCheckResult>;
|
|
101
|
+
/**
|
|
102
|
+
* Check borrow amount against limits
|
|
103
|
+
*/
|
|
104
|
+
private checkBorrowAmount;
|
|
105
|
+
/**
|
|
106
|
+
* Check a money market operation against all policies
|
|
107
|
+
*/
|
|
108
|
+
checkMoneyMarket(params: {
|
|
109
|
+
walletId: string;
|
|
110
|
+
chainId: string;
|
|
111
|
+
dstChainId?: string;
|
|
112
|
+
token: string;
|
|
113
|
+
amount: string;
|
|
114
|
+
amountUsd?: number;
|
|
115
|
+
operation: 'supply' | 'withdraw' | 'borrow' | 'repay';
|
|
116
|
+
policyId?: string;
|
|
117
|
+
}): Promise<PolicyCheckResult>;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=policyEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyEngine.d.ts","sourceRoot":"","sources":["../../src/policy/policyEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;gBAEjB,QAAQ,CAAC,EAAE,MAAM;IAI7B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAehC;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;;OAKG;IACG,WAAW,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgCzE;;;OAGG;IACH,SAAS,IAAI,YAAY;IAIzB;;;OAGG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAgBhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;QACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAyB/B"}
|