@waiaas/actions 2.6.0-rc.10
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/LICENSE +21 -0
- package/README.md +158 -0
- package/dist/common/action-api-client.d.ts +14 -0
- package/dist/common/action-api-client.d.ts.map +1 -0
- package/dist/common/action-api-client.js +78 -0
- package/dist/common/action-api-client.js.map +1 -0
- package/dist/common/async-status-tracker.d.ts +62 -0
- package/dist/common/async-status-tracker.d.ts.map +1 -0
- package/dist/common/async-status-tracker.js +30 -0
- package/dist/common/async-status-tracker.js.map +1 -0
- package/dist/common/slippage.d.ts +15 -0
- package/dist/common/slippage.d.ts.map +1 -0
- package/dist/common/slippage.js +26 -0
- package/dist/common/slippage.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/jupiter-swap/config.d.ts +16 -0
- package/dist/providers/jupiter-swap/config.d.ts.map +1 -0
- package/dist/providers/jupiter-swap/config.js +15 -0
- package/dist/providers/jupiter-swap/config.js.map +1 -0
- package/dist/providers/jupiter-swap/index.d.ts +11 -0
- package/dist/providers/jupiter-swap/index.d.ts.map +1 -0
- package/dist/providers/jupiter-swap/index.js +102 -0
- package/dist/providers/jupiter-swap/index.js.map +1 -0
- package/dist/providers/jupiter-swap/jupiter-api-client.d.ts +23 -0
- package/dist/providers/jupiter-swap/jupiter-api-client.d.ts.map +1 -0
- package/dist/providers/jupiter-swap/jupiter-api-client.js +37 -0
- package/dist/providers/jupiter-swap/jupiter-api-client.js.map +1 -0
- package/dist/providers/jupiter-swap/schemas.d.ts +743 -0
- package/dist/providers/jupiter-swap/schemas.d.ts.map +1 -0
- package/dist/providers/jupiter-swap/schemas.js +57 -0
- package/dist/providers/jupiter-swap/schemas.js.map +1 -0
- package/dist/providers/lifi/bridge-status-tracker.d.ts +37 -0
- package/dist/providers/lifi/bridge-status-tracker.d.ts.map +1 -0
- package/dist/providers/lifi/bridge-status-tracker.js +111 -0
- package/dist/providers/lifi/bridge-status-tracker.js.map +1 -0
- package/dist/providers/lifi/config.d.ts +27 -0
- package/dist/providers/lifi/config.d.ts.map +1 -0
- package/dist/providers/lifi/config.js +50 -0
- package/dist/providers/lifi/config.js.map +1 -0
- package/dist/providers/lifi/index.d.ts +16 -0
- package/dist/providers/lifi/index.d.ts.map +1 -0
- package/dist/providers/lifi/index.js +121 -0
- package/dist/providers/lifi/index.js.map +1 -0
- package/dist/providers/lifi/lifi-api-client.d.ts +29 -0
- package/dist/providers/lifi/lifi-api-client.d.ts.map +1 -0
- package/dist/providers/lifi/lifi-api-client.js +42 -0
- package/dist/providers/lifi/lifi-api-client.js.map +1 -0
- package/dist/providers/lifi/schemas.d.ts +713 -0
- package/dist/providers/lifi/schemas.d.ts.map +1 -0
- package/dist/providers/lifi/schemas.js +91 -0
- package/dist/providers/lifi/schemas.js.map +1 -0
- package/dist/providers/zerox-swap/config.d.ts +31 -0
- package/dist/providers/zerox-swap/config.d.ts.map +1 -0
- package/dist/providers/zerox-swap/config.js +70 -0
- package/dist/providers/zerox-swap/config.js.map +1 -0
- package/dist/providers/zerox-swap/index.d.ts +10 -0
- package/dist/providers/zerox-swap/index.d.ts.map +1 -0
- package/dist/providers/zerox-swap/index.js +131 -0
- package/dist/providers/zerox-swap/index.js.map +1 -0
- package/dist/providers/zerox-swap/schemas.d.ts +641 -0
- package/dist/providers/zerox-swap/schemas.d.ts.map +1 -0
- package/dist/providers/zerox-swap/schemas.js +59 -0
- package/dist/providers/zerox-swap/schemas.js.map +1 -0
- package/dist/providers/zerox-swap/zerox-api-client.d.ts +29 -0
- package/dist/providers/zerox-swap/zerox-api-client.d.ts.map +1 -0
- package/dist/providers/zerox-swap/zerox-api-client.js +43 -0
- package/dist/providers/zerox-swap/zerox-api-client.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/providers/lifi/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgDpB,CAAC;AAEjB,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAMxE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAsBrB,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for LI.FI API v1 responses.
|
|
3
|
+
* Runtime validation to detect API drift early.
|
|
4
|
+
*
|
|
5
|
+
* Endpoints:
|
|
6
|
+
* - /quote -> LiFiQuoteResponseSchema
|
|
7
|
+
* - /status -> LiFiStatusResponseSchema
|
|
8
|
+
*
|
|
9
|
+
* See: https://docs.li.fi/li.fi-api/get-a-quote
|
|
10
|
+
* See: https://docs.li.fi/li.fi-api/check-the-status-of-your-cross-chain-transactions
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Quote Response (/quote) (LIFI-01)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export const LiFiQuoteResponseSchema = z.object({
|
|
17
|
+
id: z.string(),
|
|
18
|
+
type: z.string(), // 'lifi' or 'swap'
|
|
19
|
+
tool: z.string(), // e.g., 'stargate', 'across', 'wormhole'
|
|
20
|
+
toolDetails: z.object({
|
|
21
|
+
key: z.string(),
|
|
22
|
+
name: z.string(),
|
|
23
|
+
logoURI: z.string().optional(),
|
|
24
|
+
}).passthrough().optional(),
|
|
25
|
+
action: z.object({
|
|
26
|
+
fromChainId: z.number(),
|
|
27
|
+
toChainId: z.number(),
|
|
28
|
+
fromToken: z.object({
|
|
29
|
+
address: z.string(),
|
|
30
|
+
symbol: z.string(),
|
|
31
|
+
decimals: z.number(),
|
|
32
|
+
chainId: z.number(),
|
|
33
|
+
}).passthrough(),
|
|
34
|
+
toToken: z.object({
|
|
35
|
+
address: z.string(),
|
|
36
|
+
symbol: z.string(),
|
|
37
|
+
decimals: z.number(),
|
|
38
|
+
chainId: z.number(),
|
|
39
|
+
}).passthrough(),
|
|
40
|
+
fromAmount: z.string(),
|
|
41
|
+
slippage: z.number(),
|
|
42
|
+
fromAddress: z.string(),
|
|
43
|
+
toAddress: z.string().optional(),
|
|
44
|
+
}).passthrough(),
|
|
45
|
+
estimate: z.object({
|
|
46
|
+
fromAmount: z.string(),
|
|
47
|
+
toAmount: z.string(),
|
|
48
|
+
toAmountMin: z.string(),
|
|
49
|
+
approvalAddress: z.string().optional(),
|
|
50
|
+
executionDuration: z.number(), // estimated seconds
|
|
51
|
+
feeCosts: z.array(z.unknown()).optional(),
|
|
52
|
+
gasCosts: z.array(z.unknown()).optional(),
|
|
53
|
+
}).passthrough(),
|
|
54
|
+
transactionRequest: z.object({
|
|
55
|
+
data: z.string(), // calldata (hex)
|
|
56
|
+
to: z.string(), // target contract
|
|
57
|
+
value: z.string(), // native value (hex or decimal)
|
|
58
|
+
from: z.string(),
|
|
59
|
+
chainId: z.number(),
|
|
60
|
+
gasLimit: z.string().optional(),
|
|
61
|
+
gasPrice: z.string().optional(),
|
|
62
|
+
}).passthrough(),
|
|
63
|
+
includedSteps: z.array(z.unknown()).optional(),
|
|
64
|
+
}).passthrough();
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Status Response (/status) (LIFI-02)
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
export const LiFiStatusResponseSchema = z.object({
|
|
69
|
+
transactionId: z.string().optional(),
|
|
70
|
+
sending: z.object({
|
|
71
|
+
txHash: z.string(),
|
|
72
|
+
txLink: z.string().optional(),
|
|
73
|
+
chainId: z.number(),
|
|
74
|
+
amount: z.string().optional(),
|
|
75
|
+
token: z.unknown().optional(),
|
|
76
|
+
}).passthrough().optional(),
|
|
77
|
+
receiving: z.object({
|
|
78
|
+
txHash: z.string().optional(),
|
|
79
|
+
txLink: z.string().optional(),
|
|
80
|
+
chainId: z.number().optional(),
|
|
81
|
+
amount: z.string().optional(),
|
|
82
|
+
token: z.unknown().optional(),
|
|
83
|
+
}).passthrough().optional(),
|
|
84
|
+
lifiExplorerLink: z.string().optional(),
|
|
85
|
+
status: z.enum(['PENDING', 'DONE', 'FAILED', 'NOT_FOUND', 'INVALID']),
|
|
86
|
+
substatus: z.string().optional(),
|
|
87
|
+
substatusMessage: z.string().optional(),
|
|
88
|
+
tool: z.string().optional(),
|
|
89
|
+
bridgeExplorerLink: z.string().optional(),
|
|
90
|
+
}).passthrough();
|
|
91
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/providers/lifi/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0x Swap configuration type, defaults, and AllowanceHolder address mapping.
|
|
3
|
+
*
|
|
4
|
+
* Uses 0x Swap API v2 with the AllowanceHolder flow (not Permit2).
|
|
5
|
+
* See: https://0x.org/docs/api#tag/Swap
|
|
6
|
+
*/
|
|
7
|
+
export interface ZeroExSwapConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
apiBaseUrl: string;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
defaultSlippageBps: number;
|
|
12
|
+
maxSlippageBps: number;
|
|
13
|
+
requestTimeoutMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const ZEROX_SWAP_DEFAULTS: ZeroExSwapConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Supported chain IDs for 0x Swap API v2 AllowanceHolder flow.
|
|
18
|
+
* Cancun 19 chains + Mantle = 20 total.
|
|
19
|
+
*/
|
|
20
|
+
export declare const ALLOWANCE_HOLDER_ADDRESSES: ReadonlyMap<number, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Get AllowanceHolder contract address for a given chain ID.
|
|
23
|
+
* @throws Error if chain ID is not supported by 0x Swap API.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAllowanceHolderAddress(chainId: number): string;
|
|
26
|
+
/**
|
|
27
|
+
* Maps WAIaaS network type names to EVM chain IDs.
|
|
28
|
+
* Only includes mainnet networks that are supported by both WAIaaS and 0x API.
|
|
29
|
+
*/
|
|
30
|
+
export declare const CHAIN_ID_MAP: Record<string, number>;
|
|
31
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/providers/zerox-swap/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAOjC,CAAC;AAQF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAqBjE,CAAC;AAEH;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQjE;AAMD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0x Swap configuration type, defaults, and AllowanceHolder address mapping.
|
|
3
|
+
*
|
|
4
|
+
* Uses 0x Swap API v2 with the AllowanceHolder flow (not Permit2).
|
|
5
|
+
* See: https://0x.org/docs/api#tag/Swap
|
|
6
|
+
*/
|
|
7
|
+
export const ZEROX_SWAP_DEFAULTS = {
|
|
8
|
+
enabled: false,
|
|
9
|
+
apiBaseUrl: 'https://api.0x.org',
|
|
10
|
+
apiKey: '',
|
|
11
|
+
defaultSlippageBps: 100, // 1% (ZXSW-06)
|
|
12
|
+
maxSlippageBps: 500, // 5% (ZXSW-06)
|
|
13
|
+
requestTimeoutMs: 10_000, // (ZXSW-10)
|
|
14
|
+
};
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// AllowanceHolder contract address (same on all supported chains) (ZXSW-09)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const ALLOWANCE_HOLDER_ADDRESS = '0x0000000000001fF3684f28c67538d4D072C22734';
|
|
19
|
+
/**
|
|
20
|
+
* Supported chain IDs for 0x Swap API v2 AllowanceHolder flow.
|
|
21
|
+
* Cancun 19 chains + Mantle = 20 total.
|
|
22
|
+
*/
|
|
23
|
+
export const ALLOWANCE_HOLDER_ADDRESSES = new Map([
|
|
24
|
+
[1, ALLOWANCE_HOLDER_ADDRESS], // Ethereum
|
|
25
|
+
[10, ALLOWANCE_HOLDER_ADDRESS], // Optimism
|
|
26
|
+
[56, ALLOWANCE_HOLDER_ADDRESS], // BNB Chain
|
|
27
|
+
[130, ALLOWANCE_HOLDER_ADDRESS], // Unichain
|
|
28
|
+
[137, ALLOWANCE_HOLDER_ADDRESS], // Polygon
|
|
29
|
+
[1329, ALLOWANCE_HOLDER_ADDRESS], // SEI
|
|
30
|
+
[1868, ALLOWANCE_HOLDER_ADDRESS], // Soneium
|
|
31
|
+
[2741, ALLOWANCE_HOLDER_ADDRESS], // Abstract
|
|
32
|
+
[5000, ALLOWANCE_HOLDER_ADDRESS], // Mantle
|
|
33
|
+
[8453, ALLOWANCE_HOLDER_ADDRESS], // Base
|
|
34
|
+
[33139, ALLOWANCE_HOLDER_ADDRESS], // Apechain
|
|
35
|
+
[34443, ALLOWANCE_HOLDER_ADDRESS], // Mode
|
|
36
|
+
[42161, ALLOWANCE_HOLDER_ADDRESS], // Arbitrum
|
|
37
|
+
[42220, ALLOWANCE_HOLDER_ADDRESS], // Celo
|
|
38
|
+
[43114, ALLOWANCE_HOLDER_ADDRESS], // Avalanche
|
|
39
|
+
[57073, ALLOWANCE_HOLDER_ADDRESS], // Ink
|
|
40
|
+
[59144, ALLOWANCE_HOLDER_ADDRESS], // Linea
|
|
41
|
+
[80084, ALLOWANCE_HOLDER_ADDRESS], // Berachain
|
|
42
|
+
[81457, ALLOWANCE_HOLDER_ADDRESS], // Blast
|
|
43
|
+
[534352, ALLOWANCE_HOLDER_ADDRESS], // Scroll
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* Get AllowanceHolder contract address for a given chain ID.
|
|
47
|
+
* @throws Error if chain ID is not supported by 0x Swap API.
|
|
48
|
+
*/
|
|
49
|
+
export function getAllowanceHolderAddress(chainId) {
|
|
50
|
+
const address = ALLOWANCE_HOLDER_ADDRESSES.get(chainId);
|
|
51
|
+
if (!address) {
|
|
52
|
+
throw new Error(`Unsupported chain ID ${chainId} for 0x Swap. Supported: ${[...ALLOWANCE_HOLDER_ADDRESSES.keys()].join(', ')}`);
|
|
53
|
+
}
|
|
54
|
+
return address;
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Network name -> Chain ID mapping (only networks in NETWORK_TYPES)
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Maps WAIaaS network type names to EVM chain IDs.
|
|
61
|
+
* Only includes mainnet networks that are supported by both WAIaaS and 0x API.
|
|
62
|
+
*/
|
|
63
|
+
export const CHAIN_ID_MAP = {
|
|
64
|
+
'ethereum-mainnet': 1,
|
|
65
|
+
'polygon-mainnet': 137,
|
|
66
|
+
'arbitrum-mainnet': 42161,
|
|
67
|
+
'optimism-mainnet': 10,
|
|
68
|
+
'base-mainnet': 8453,
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/providers/zerox-swap/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,CAAC,MAAM,mBAAmB,GAAqB;IACnD,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,oBAAoB;IAChC,MAAM,EAAE,EAAE;IACV,kBAAkB,EAAE,GAAG,EAAI,eAAe;IAC1C,cAAc,EAAE,GAAG,EAAQ,eAAe;IAC1C,gBAAgB,EAAE,MAAM,EAAG,YAAY;CACxC,CAAC;AAEF,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAE9E,MAAM,wBAAwB,GAAG,4CAA4C,CAAC;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAgC,IAAI,GAAG,CAAC;IAC7E,CAAC,CAAC,EAAE,wBAAwB,CAAC,EAAQ,WAAW;IAChD,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAO,WAAW;IAChD,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAO,YAAY;IACjD,CAAC,GAAG,EAAE,wBAAwB,CAAC,EAAM,WAAW;IAChD,CAAC,GAAG,EAAE,wBAAwB,CAAC,EAAM,UAAU;IAC/C,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAK,MAAM;IAC3C,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAK,UAAU;IAC/C,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAK,WAAW;IAChD,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAK,SAAS;IAC9C,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAK,OAAO;IAC5C,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,WAAW;IAChD,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,OAAO;IAC5C,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,WAAW;IAChD,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,OAAO;IAC5C,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,YAAY;IACjD,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,MAAM;IAC3C,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,QAAQ;IAC7C,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,YAAY;IACjD,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAI,QAAQ;IAC7C,CAAC,MAAM,EAAE,wBAAwB,CAAC,EAAG,SAAS;CAC/C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,OAAO,GAAG,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,4BAA4B,CAAC,GAAG,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/G,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,kBAAkB,EAAE,CAAC;IACrB,iBAAiB,EAAE,GAAG;IACtB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,EAAE;IACtB,cAAc,EAAE,IAAI;CACrB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IActionProvider, ActionProviderMetadata, ActionDefinition, ActionContext, ContractCallRequest } from '@waiaas/core';
|
|
2
|
+
import { type ZeroExSwapConfig } from './config.js';
|
|
3
|
+
export declare class ZeroExSwapActionProvider implements IActionProvider {
|
|
4
|
+
readonly metadata: ActionProviderMetadata;
|
|
5
|
+
readonly actions: readonly ActionDefinition[];
|
|
6
|
+
private readonly config;
|
|
7
|
+
constructor(config?: Partial<ZeroExSwapConfig>);
|
|
8
|
+
resolve(actionName: string, params: Record<string, unknown>, context: ActionContext): Promise<ContractCallRequest[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/zerox-swap/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,aAAa,CAAC;AAwCrB,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAyBxC,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,mBAAmB,EAAE,CAAC;CA4ElC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0x Swap Action Provider.
|
|
3
|
+
*
|
|
4
|
+
* Implements IActionProvider to resolve 0x DEX swap requests
|
|
5
|
+
* into ContractCallRequest arrays for the sequential pipeline.
|
|
6
|
+
*
|
|
7
|
+
* ERC-20 sells produce [approve, swap] (2 elements).
|
|
8
|
+
* Native ETH sells produce [swap] (1 element).
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { ChainError } from '@waiaas/core';
|
|
12
|
+
import { ZeroExApiClient } from './zerox-api-client.js';
|
|
13
|
+
import { ZEROX_SWAP_DEFAULTS, getAllowanceHolderAddress, CHAIN_ID_MAP, } from './config.js';
|
|
14
|
+
import { clampSlippageBps, asBps } from '../../common/slippage.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Native ETH placeholder address used by 0x API
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const NATIVE_ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// ERC-20 approve calldata encoder
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* Encode ERC-20 approve(address spender, uint256 amount) calldata.
|
|
24
|
+
* Function selector: 0x095ea7b3
|
|
25
|
+
*/
|
|
26
|
+
function encodeApproveCalldata(spender, amount) {
|
|
27
|
+
const selector = '0x095ea7b3';
|
|
28
|
+
const paddedSpender = spender.slice(2).toLowerCase().padStart(64, '0');
|
|
29
|
+
const paddedAmount = BigInt(amount).toString(16).padStart(64, '0');
|
|
30
|
+
return `${selector}${paddedSpender}${paddedAmount}`;
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Input schema for the swap action
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
const SwapInputSchema = z.object({
|
|
36
|
+
sellToken: z.string().min(1, 'sellToken is required'),
|
|
37
|
+
buyToken: z.string().min(1, 'buyToken is required'),
|
|
38
|
+
sellAmount: z.string().min(1, 'sellAmount is required (in smallest units)'),
|
|
39
|
+
slippageBps: z.number().int().optional(),
|
|
40
|
+
chainId: z.number().int().optional(),
|
|
41
|
+
});
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Provider implementation
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
export class ZeroExSwapActionProvider {
|
|
46
|
+
metadata;
|
|
47
|
+
actions;
|
|
48
|
+
config;
|
|
49
|
+
constructor(config) {
|
|
50
|
+
this.config = { ...ZEROX_SWAP_DEFAULTS, ...config };
|
|
51
|
+
this.metadata = {
|
|
52
|
+
name: 'zerox_swap',
|
|
53
|
+
description: '0x DEX aggregator for EVM token swaps via AllowanceHolder flow',
|
|
54
|
+
version: '1.0.0',
|
|
55
|
+
chains: ['ethereum'],
|
|
56
|
+
mcpExpose: true,
|
|
57
|
+
requiresApiKey: true,
|
|
58
|
+
requiredApis: ['0x'],
|
|
59
|
+
};
|
|
60
|
+
this.actions = [
|
|
61
|
+
{
|
|
62
|
+
name: 'swap',
|
|
63
|
+
description: 'Swap tokens on EVM chains via 0x aggregator with slippage protection and AllowanceHolder approval',
|
|
64
|
+
chain: 'ethereum',
|
|
65
|
+
inputSchema: SwapInputSchema,
|
|
66
|
+
riskLevel: 'medium',
|
|
67
|
+
defaultTier: 'DELAY',
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
async resolve(actionName, params, context) {
|
|
72
|
+
// Validate action name
|
|
73
|
+
if (actionName !== 'swap') {
|
|
74
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', { message: `Unknown action: ${actionName}` });
|
|
75
|
+
}
|
|
76
|
+
// Parse and validate input
|
|
77
|
+
const input = SwapInputSchema.parse(params);
|
|
78
|
+
// SAFE-05: Block same-token swap
|
|
79
|
+
if (input.sellToken.toLowerCase() === input.buyToken.toLowerCase()) {
|
|
80
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', { message: 'Cannot swap a token for itself' });
|
|
81
|
+
}
|
|
82
|
+
// Resolve chainId: explicit input > CHAIN_ID_MAP lookup > default 1 (Ethereum mainnet)
|
|
83
|
+
const chainId = input.chainId ?? CHAIN_ID_MAP['ethereum-mainnet'] ?? 1;
|
|
84
|
+
// ZXSW-06: Clamp slippage -- default 100bps (1%), max 500bps (5%)
|
|
85
|
+
const slippageBps = clampSlippageBps(input.slippageBps ?? 0, asBps(this.config.defaultSlippageBps), asBps(this.config.maxSlippageBps));
|
|
86
|
+
// Create API client with resolved chainId
|
|
87
|
+
const apiClient = new ZeroExApiClient(this.config, chainId);
|
|
88
|
+
// Get quote from 0x API
|
|
89
|
+
const quote = await apiClient.getQuote({
|
|
90
|
+
sellToken: input.sellToken,
|
|
91
|
+
buyToken: input.buyToken,
|
|
92
|
+
sellAmount: input.sellAmount,
|
|
93
|
+
taker: context.walletAddress,
|
|
94
|
+
slippageBps,
|
|
95
|
+
});
|
|
96
|
+
// ZXSW-07: Check liquidity availability
|
|
97
|
+
if (!quote.liquidityAvailable) {
|
|
98
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', {
|
|
99
|
+
message: 'No liquidity available for this swap pair',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// ZXSW-09: Validate AllowanceHolder address
|
|
103
|
+
const expectedAllowanceHolder = getAllowanceHolderAddress(chainId);
|
|
104
|
+
if (quote.transaction.to.toLowerCase() !== expectedAllowanceHolder.toLowerCase()) {
|
|
105
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', {
|
|
106
|
+
message: `AllowanceHolder address mismatch: expected ${expectedAllowanceHolder}, got ${quote.transaction.to}`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Build result array
|
|
110
|
+
const isNativeEthSell = input.sellToken.toLowerCase() === NATIVE_ETH_ADDRESS;
|
|
111
|
+
const swapRequest = {
|
|
112
|
+
type: 'CONTRACT_CALL',
|
|
113
|
+
to: quote.transaction.to,
|
|
114
|
+
calldata: quote.transaction.data,
|
|
115
|
+
value: quote.transaction.value,
|
|
116
|
+
};
|
|
117
|
+
if (isNativeEthSell) {
|
|
118
|
+
// Native ETH sell: single swap element
|
|
119
|
+
return [swapRequest];
|
|
120
|
+
}
|
|
121
|
+
// ERC-20 sell: approve + swap (ZXSW-04)
|
|
122
|
+
const approveRequest = {
|
|
123
|
+
type: 'CONTRACT_CALL',
|
|
124
|
+
to: input.sellToken,
|
|
125
|
+
calldata: encodeApproveCalldata(expectedAllowanceHolder, input.sellAmount),
|
|
126
|
+
value: '0',
|
|
127
|
+
};
|
|
128
|
+
return [approveRequest, swapRequest];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/zerox-swap/index.ts"],"names":[],"mappings":"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"}
|