@waiaas/actions 2.6.0-rc.8 → 2.6.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 +51 -3
- 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/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/jito-staking/config.d.ts +41 -0
- package/dist/providers/jito-staking/config.d.ts.map +1 -0
- package/dist/providers/jito-staking/config.js +50 -0
- package/dist/providers/jito-staking/config.js.map +1 -0
- package/dist/providers/jito-staking/epoch-tracker.d.ts +22 -0
- package/dist/providers/jito-staking/epoch-tracker.d.ts.map +1 -0
- package/dist/providers/jito-staking/epoch-tracker.js +48 -0
- package/dist/providers/jito-staking/epoch-tracker.js.map +1 -0
- package/dist/providers/jito-staking/index.d.ts +12 -0
- package/dist/providers/jito-staking/index.d.ts.map +1 -0
- package/dist/providers/jito-staking/index.js +89 -0
- package/dist/providers/jito-staking/index.js.map +1 -0
- package/dist/providers/jito-staking/jito-stake-pool.d.ts +100 -0
- package/dist/providers/jito-staking/jito-stake-pool.d.ts.map +1 -0
- package/dist/providers/jito-staking/jito-stake-pool.js +355 -0
- package/dist/providers/jito-staking/jito-stake-pool.js.map +1 -0
- package/dist/providers/lido-staking/config.d.ts +29 -0
- package/dist/providers/lido-staking/config.d.ts.map +1 -0
- package/dist/providers/lido-staking/config.js +40 -0
- package/dist/providers/lido-staking/config.js.map +1 -0
- package/dist/providers/lido-staking/index.d.ts +12 -0
- package/dist/providers/lido-staking/index.d.ts.map +1 -0
- package/dist/providers/lido-staking/index.js +129 -0
- package/dist/providers/lido-staking/index.js.map +1 -0
- package/dist/providers/lido-staking/lido-contract.d.ts +43 -0
- package/dist/providers/lido-staking/lido-contract.d.ts.map +1 -0
- package/dist/providers/lido-staking/lido-contract.js +83 -0
- package/dist/providers/lido-staking/lido-contract.js.map +1 -0
- package/dist/providers/lido-staking/withdrawal-tracker.d.ts +21 -0
- package/dist/providers/lido-staking/withdrawal-tracker.d.ts.map +1 -0
- package/dist/providers/lido-staking/withdrawal-tracker.js +46 -0
- package/dist/providers/lido-staking/withdrawal-tracker.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/package.json +2 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lido Staking Action Provider.
|
|
3
|
+
*
|
|
4
|
+
* Implements IActionProvider to resolve Lido liquid staking requests
|
|
5
|
+
* into ContractCallRequest arrays for the sequential pipeline.
|
|
6
|
+
*
|
|
7
|
+
* Actions:
|
|
8
|
+
* - stake: ETH -> stETH via Lido submit() (single element)
|
|
9
|
+
* - unstake: stETH -> ETH via WithdrawalQueue (2 elements: approve + requestWithdrawals)
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { ChainError } from '@waiaas/core';
|
|
13
|
+
import { LIDO_STAKING_DEFAULTS } from './config.js';
|
|
14
|
+
import { encodeSubmitCalldata, encodeRequestWithdrawalsCalldata, encodeApproveCalldata, } from './lido-contract.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Input schemas (Zod SSoT)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
const LidoStakeInputSchema = z.object({
|
|
19
|
+
amount: z.string().min(1, 'amount is required (ETH, e.g. "1.0")'),
|
|
20
|
+
});
|
|
21
|
+
const LidoUnstakeInputSchema = z.object({
|
|
22
|
+
amount: z.string().min(1, 'amount is required (stETH, e.g. "1.0")'),
|
|
23
|
+
});
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Amount parsing helper
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Parse a human-readable ETH/stETH amount string to wei (bigint).
|
|
29
|
+
* Handles decimal amounts like "1.5" -> 1500000000000000000n.
|
|
30
|
+
*
|
|
31
|
+
* @throws ChainError if amount is zero or negative
|
|
32
|
+
*/
|
|
33
|
+
function parseEthAmount(amount) {
|
|
34
|
+
const parts = amount.split('.');
|
|
35
|
+
const whole = BigInt(parts[0] || '0');
|
|
36
|
+
const decimals = (parts[1] || '').padEnd(18, '0').slice(0, 18);
|
|
37
|
+
const result = whole * 10n ** 18n + BigInt(decimals);
|
|
38
|
+
if (result <= 0n) {
|
|
39
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', {
|
|
40
|
+
message: 'Amount must be greater than 0',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Provider implementation
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
export class LidoStakingActionProvider {
|
|
49
|
+
metadata;
|
|
50
|
+
actions;
|
|
51
|
+
config;
|
|
52
|
+
constructor(config) {
|
|
53
|
+
this.config = { ...LIDO_STAKING_DEFAULTS, ...config };
|
|
54
|
+
this.metadata = {
|
|
55
|
+
name: 'lido_staking',
|
|
56
|
+
description: 'Lido liquid staking protocol for ETH to stETH conversion with withdrawal support',
|
|
57
|
+
version: '1.0.0',
|
|
58
|
+
chains: ['ethereum'],
|
|
59
|
+
mcpExpose: true,
|
|
60
|
+
requiresApiKey: false,
|
|
61
|
+
requiredApis: [],
|
|
62
|
+
};
|
|
63
|
+
this.actions = [
|
|
64
|
+
{
|
|
65
|
+
name: 'stake',
|
|
66
|
+
description: 'Stake ETH to receive stETH via Lido protocol (submit). Immediate, no lock-up.',
|
|
67
|
+
chain: 'ethereum',
|
|
68
|
+
inputSchema: LidoStakeInputSchema,
|
|
69
|
+
riskLevel: 'medium',
|
|
70
|
+
defaultTier: 'DELAY',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'unstake',
|
|
74
|
+
description: 'Request stETH to ETH withdrawal via Lido Withdrawal Queue. Takes 1-5 days to finalize.',
|
|
75
|
+
chain: 'ethereum',
|
|
76
|
+
inputSchema: LidoUnstakeInputSchema,
|
|
77
|
+
riskLevel: 'medium',
|
|
78
|
+
defaultTier: 'DELAY',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
async resolve(actionName, params, context) {
|
|
83
|
+
if (actionName === 'stake') {
|
|
84
|
+
return this.resolveStake(params);
|
|
85
|
+
}
|
|
86
|
+
if (actionName === 'unstake') {
|
|
87
|
+
return this.resolveUnstake(params, context);
|
|
88
|
+
}
|
|
89
|
+
throw new ChainError('INVALID_INSTRUCTION', 'ethereum', {
|
|
90
|
+
message: `Unknown action: ${actionName}`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// -------------------------------------------------------------------------
|
|
94
|
+
// Stake: ETH -> stETH via submit()
|
|
95
|
+
// -------------------------------------------------------------------------
|
|
96
|
+
resolveStake(params) {
|
|
97
|
+
const input = LidoStakeInputSchema.parse(params);
|
|
98
|
+
const amountWei = parseEthAmount(input.amount);
|
|
99
|
+
return {
|
|
100
|
+
type: 'CONTRACT_CALL',
|
|
101
|
+
to: this.config.stethAddress,
|
|
102
|
+
calldata: encodeSubmitCalldata(), // submit(address(0)) referral
|
|
103
|
+
value: amountWei.toString(), // ETH value sent with tx
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// -------------------------------------------------------------------------
|
|
107
|
+
// Unstake: stETH -> ETH via WithdrawalQueue (approve + requestWithdrawals)
|
|
108
|
+
// -------------------------------------------------------------------------
|
|
109
|
+
resolveUnstake(params, context) {
|
|
110
|
+
const input = LidoUnstakeInputSchema.parse(params);
|
|
111
|
+
const amountWei = parseEthAmount(input.amount);
|
|
112
|
+
// Step 1: Approve stETH to WithdrawalQueue
|
|
113
|
+
const approveRequest = {
|
|
114
|
+
type: 'CONTRACT_CALL',
|
|
115
|
+
to: this.config.stethAddress,
|
|
116
|
+
calldata: encodeApproveCalldata(this.config.withdrawalQueueAddress, amountWei),
|
|
117
|
+
value: '0',
|
|
118
|
+
};
|
|
119
|
+
// Step 2: Request withdrawal from WithdrawalQueue
|
|
120
|
+
const withdrawRequest = {
|
|
121
|
+
type: 'CONTRACT_CALL',
|
|
122
|
+
to: this.config.withdrawalQueueAddress,
|
|
123
|
+
calldata: encodeRequestWithdrawalsCalldata([amountWei], context.walletAddress),
|
|
124
|
+
value: '0',
|
|
125
|
+
};
|
|
126
|
+
return [approveRequest, withdrawRequest];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/lido-staking/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lido contract ABI encoding helpers.
|
|
3
|
+
*
|
|
4
|
+
* Manual ABI encoding (no viem dependency) for:
|
|
5
|
+
* - stETH submit(address _referral)
|
|
6
|
+
* - WithdrawalQueue requestWithdrawals(uint256[] _amounts, address _owner)
|
|
7
|
+
* - ERC-20 approve(address spender, uint256 amount)
|
|
8
|
+
*
|
|
9
|
+
* Function selectors are hardcoded hex constants derived from keccak256 of function signatures.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Encode Lido stETH submit(address _referral) calldata.
|
|
13
|
+
* ETH value is sent as transaction value, not encoded in calldata.
|
|
14
|
+
*
|
|
15
|
+
* @param referral - Referral address (defaults to zero address)
|
|
16
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
17
|
+
*/
|
|
18
|
+
export declare function encodeSubmitCalldata(referral?: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Encode Lido WithdrawalQueue requestWithdrawals(uint256[], address) calldata.
|
|
21
|
+
*
|
|
22
|
+
* ABI layout:
|
|
23
|
+
* selector (4 bytes)
|
|
24
|
+
* offset to amounts array (32 bytes) = 0x40 (64 decimal)
|
|
25
|
+
* owner address (32 bytes)
|
|
26
|
+
* array length (32 bytes)
|
|
27
|
+
* array element 0 (32 bytes)
|
|
28
|
+
* ... array element N (32 bytes)
|
|
29
|
+
*
|
|
30
|
+
* @param amounts - Array of stETH withdrawal amounts in wei
|
|
31
|
+
* @param owner - Address to receive the withdrawal NFT
|
|
32
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
33
|
+
*/
|
|
34
|
+
export declare function encodeRequestWithdrawalsCalldata(amounts: bigint[], owner: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Encode ERC-20 approve(address spender, uint256 amount) calldata.
|
|
37
|
+
*
|
|
38
|
+
* @param spender - Spender address to approve
|
|
39
|
+
* @param amount - Amount to approve in wei
|
|
40
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
41
|
+
*/
|
|
42
|
+
export declare function encodeApproveCalldata(spender: string, amount: bigint): string;
|
|
43
|
+
//# sourceMappingURL=lido-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lido-contract.d.ts","sourceRoot":"","sources":["../../../src/providers/lido-staking/lido-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,GAAE,MAAqD,GAC9D,MAAM,CAIR;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,CAUR;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lido contract ABI encoding helpers.
|
|
3
|
+
*
|
|
4
|
+
* Manual ABI encoding (no viem dependency) for:
|
|
5
|
+
* - stETH submit(address _referral)
|
|
6
|
+
* - WithdrawalQueue requestWithdrawals(uint256[] _amounts, address _owner)
|
|
7
|
+
* - ERC-20 approve(address spender, uint256 amount)
|
|
8
|
+
*
|
|
9
|
+
* Function selectors are hardcoded hex constants derived from keccak256 of function signatures.
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Utility: pad a hex value to 32 bytes (64 hex chars)
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
function padHex(value, length = 64) {
|
|
15
|
+
return value.padStart(length, '0');
|
|
16
|
+
}
|
|
17
|
+
function addressToHex(address) {
|
|
18
|
+
return padHex(address.slice(2).toLowerCase());
|
|
19
|
+
}
|
|
20
|
+
function uint256ToHex(value) {
|
|
21
|
+
if (value < 0n)
|
|
22
|
+
throw new Error('uint256 cannot be negative');
|
|
23
|
+
return padHex(value.toString(16));
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// submit(address _referral) -- function selector 0xa1903eab
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Encode Lido stETH submit(address _referral) calldata.
|
|
30
|
+
* ETH value is sent as transaction value, not encoded in calldata.
|
|
31
|
+
*
|
|
32
|
+
* @param referral - Referral address (defaults to zero address)
|
|
33
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
34
|
+
*/
|
|
35
|
+
export function encodeSubmitCalldata(referral = '0x0000000000000000000000000000000000000000') {
|
|
36
|
+
const selector = '0xa1903eab';
|
|
37
|
+
const paddedReferral = addressToHex(referral);
|
|
38
|
+
return `${selector}${paddedReferral}`;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// requestWithdrawals(uint256[] _amounts, address _owner) -- 0xd669a4e2
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Encode Lido WithdrawalQueue requestWithdrawals(uint256[], address) calldata.
|
|
45
|
+
*
|
|
46
|
+
* ABI layout:
|
|
47
|
+
* selector (4 bytes)
|
|
48
|
+
* offset to amounts array (32 bytes) = 0x40 (64 decimal)
|
|
49
|
+
* owner address (32 bytes)
|
|
50
|
+
* array length (32 bytes)
|
|
51
|
+
* array element 0 (32 bytes)
|
|
52
|
+
* ... array element N (32 bytes)
|
|
53
|
+
*
|
|
54
|
+
* @param amounts - Array of stETH withdrawal amounts in wei
|
|
55
|
+
* @param owner - Address to receive the withdrawal NFT
|
|
56
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
57
|
+
*/
|
|
58
|
+
export function encodeRequestWithdrawalsCalldata(amounts, owner) {
|
|
59
|
+
const selector = '0xd669a4e2';
|
|
60
|
+
// offset to dynamic array = 0x40 (2 * 32 bytes: offset slot + owner slot)
|
|
61
|
+
const offsetHex = uint256ToHex(64n);
|
|
62
|
+
const ownerHex = addressToHex(owner);
|
|
63
|
+
const lengthHex = uint256ToHex(BigInt(amounts.length));
|
|
64
|
+
const elementsHex = amounts.map((a) => uint256ToHex(a)).join('');
|
|
65
|
+
return `${selector}${offsetHex}${ownerHex}${lengthHex}${elementsHex}`;
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// approve(address spender, uint256 amount) -- 0x095ea7b3
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
/**
|
|
71
|
+
* Encode ERC-20 approve(address spender, uint256 amount) calldata.
|
|
72
|
+
*
|
|
73
|
+
* @param spender - Spender address to approve
|
|
74
|
+
* @param amount - Amount to approve in wei
|
|
75
|
+
* @returns ABI-encoded calldata with 0x prefix
|
|
76
|
+
*/
|
|
77
|
+
export function encodeApproveCalldata(spender, amount) {
|
|
78
|
+
const selector = '0x095ea7b3';
|
|
79
|
+
const paddedSpender = addressToHex(spender);
|
|
80
|
+
const paddedAmount = uint256ToHex(amount);
|
|
81
|
+
return `${selector}${paddedSpender}${paddedAmount}`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=lido-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lido-contract.js","sourceRoot":"","sources":["../../../src/providers/lido-staking/lido-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,SAAS,MAAM,CAAC,KAAa,EAAE,SAAiB,EAAE;IAChD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,4CAA4C;IAE/D,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC9B,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,GAAG,QAAQ,GAAG,cAAc,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAiB,EACjB,KAAa;IAEb,MAAM,QAAQ,GAAG,YAAY,CAAC;IAE9B,0EAA0E;IAC1E,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,EAAE,CAAC;AACxE,CAAC;AAED,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,MAAc;IACnE,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC9B,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,YAAY,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LidoWithdrawalTracker - IAsyncStatusTracker for Lido withdrawal queue.
|
|
3
|
+
*
|
|
4
|
+
* Tracks Lido unstake requests via metadata-based polling (v1 implementation).
|
|
5
|
+
* Active polling: 30s x 480 = 4 hours, then TIMEOUT (terminal).
|
|
6
|
+
*
|
|
7
|
+
* Lido withdrawals typically take 1-5 days. This tracker monitors metadata
|
|
8
|
+
* state (set by external claim detection or manual status update) and emits
|
|
9
|
+
* STAKING_UNSTAKE_COMPLETED or STAKING_UNSTAKE_TIMEOUT notifications.
|
|
10
|
+
*
|
|
11
|
+
* @see packages/actions/src/common/async-status-tracker.ts
|
|
12
|
+
*/
|
|
13
|
+
import type { IAsyncStatusTracker, AsyncTrackingResult } from '../../common/async-status-tracker.js';
|
|
14
|
+
export declare class LidoWithdrawalTracker implements IAsyncStatusTracker {
|
|
15
|
+
readonly name = "lido-withdrawal";
|
|
16
|
+
readonly maxAttempts = 480;
|
|
17
|
+
readonly pollIntervalMs = 30000;
|
|
18
|
+
readonly timeoutTransition: "TIMEOUT";
|
|
19
|
+
checkStatus(_txId: string, metadata: Record<string, unknown>): Promise<AsyncTrackingResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=withdrawal-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withdrawal-tracker.d.ts","sourceRoot":"","sources":["../../../src/providers/lido-staking/withdrawal-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAKrG,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,WAAW,OAAO;IAC3B,QAAQ,CAAC,cAAc,SAAU;IACjC,QAAQ,CAAC,iBAAiB,EAAG,SAAS,CAAU;IAE1C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA2BlG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LidoWithdrawalTracker - IAsyncStatusTracker for Lido withdrawal queue.
|
|
3
|
+
*
|
|
4
|
+
* Tracks Lido unstake requests via metadata-based polling (v1 implementation).
|
|
5
|
+
* Active polling: 30s x 480 = 4 hours, then TIMEOUT (terminal).
|
|
6
|
+
*
|
|
7
|
+
* Lido withdrawals typically take 1-5 days. This tracker monitors metadata
|
|
8
|
+
* state (set by external claim detection or manual status update) and emits
|
|
9
|
+
* STAKING_UNSTAKE_COMPLETED or STAKING_UNSTAKE_TIMEOUT notifications.
|
|
10
|
+
*
|
|
11
|
+
* @see packages/actions/src/common/async-status-tracker.ts
|
|
12
|
+
*/
|
|
13
|
+
/** Days after which a Lido withdrawal is considered overdue for timeout hint. */
|
|
14
|
+
const LIDO_EXPECTED_DAYS = 5;
|
|
15
|
+
export class LidoWithdrawalTracker {
|
|
16
|
+
name = 'lido-withdrawal';
|
|
17
|
+
maxAttempts = 480; // 480 x 30s = 4 hours active polling
|
|
18
|
+
pollIntervalMs = 30_000; // 30 seconds
|
|
19
|
+
timeoutTransition = 'TIMEOUT';
|
|
20
|
+
async checkStatus(_txId, metadata) {
|
|
21
|
+
// If metadata.status is already 'claimable', withdrawal is complete
|
|
22
|
+
if (metadata.status === 'claimable') {
|
|
23
|
+
return {
|
|
24
|
+
state: 'COMPLETED',
|
|
25
|
+
details: {
|
|
26
|
+
completedAt: Date.now(),
|
|
27
|
+
protocol: 'lido',
|
|
28
|
+
notificationEvent: 'STAKING_UNSTAKE_COMPLETED',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Calculate estimated days remaining based on withdrawal request time
|
|
33
|
+
const requestedAt = metadata.withdrawalRequestedAt;
|
|
34
|
+
const estimatedDaysRemaining = requestedAt
|
|
35
|
+
? Math.max(0, LIDO_EXPECTED_DAYS - (Date.now() - requestedAt) / (1000 * 60 * 60 * 24))
|
|
36
|
+
: LIDO_EXPECTED_DAYS;
|
|
37
|
+
return {
|
|
38
|
+
state: 'PENDING',
|
|
39
|
+
details: {
|
|
40
|
+
estimatedDaysRemaining: Math.round(estimatedDaysRemaining * 10) / 10,
|
|
41
|
+
protocol: 'lido',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=withdrawal-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withdrawal-tracker.js","sourceRoot":"","sources":["../../../src/providers/lido-staking/withdrawal-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,OAAO,qBAAqB;IACvB,IAAI,GAAG,iBAAiB,CAAC;IACzB,WAAW,GAAG,GAAG,CAAC,CAAU,qCAAqC;IACjE,cAAc,GAAG,MAAM,CAAC,CAAI,aAAa;IACzC,iBAAiB,GAAG,SAAkB,CAAC;IAEhD,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,QAAiC;QAChE,oEAAoE;QACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACpC,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE;oBACP,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;oBACvB,QAAQ,EAAE,MAAM;oBAChB,iBAAiB,EAAE,2BAA2B;iBAC/C;aACF,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAA2C,CAAC;QACzE,MAAM,sBAAsB,GAAG,WAAW;YACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtF,CAAC,CAAC,kBAAkB,CAAC;QAEvB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;gBACP,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,GAAG,EAAE;gBACpE,QAAQ,EAAE,MAAM;aACjB;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LI.FI Bridge Status Trackers — two-phase polling implementation.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1: BridgeStatusTracker (active) — 30s x 240 = 2 hours
|
|
5
|
+
* Phase 2: BridgeMonitoringTracker (reduced) — 5min x 264 = 22 hours
|
|
6
|
+
*
|
|
7
|
+
* When active phase times out (240 attempts), timeoutTransition='BRIDGE_MONITORING'
|
|
8
|
+
* causes AsyncPollingService to transition the TX to the reduced-frequency phase.
|
|
9
|
+
*
|
|
10
|
+
* When the reduced phase also times out (264 attempts), timeoutTransition='TIMEOUT'
|
|
11
|
+
* marks the TX as terminal timeout — manual verification required.
|
|
12
|
+
*
|
|
13
|
+
* Total monitoring: 2h active + 22h reduced = 24 hours maximum.
|
|
14
|
+
*
|
|
15
|
+
* @see internal/objectives/m28-03-lifi-crosschain-bridge.md (DEFI-04)
|
|
16
|
+
*/
|
|
17
|
+
import type { IAsyncStatusTracker, AsyncTrackingResult } from '../../common/async-status-tracker.js';
|
|
18
|
+
import type { LiFiConfig } from './config.js';
|
|
19
|
+
export declare class BridgeStatusTracker implements IAsyncStatusTracker {
|
|
20
|
+
readonly name = "bridge";
|
|
21
|
+
readonly maxAttempts = 240;
|
|
22
|
+
readonly pollIntervalMs = 30000;
|
|
23
|
+
readonly timeoutTransition: "BRIDGE_MONITORING";
|
|
24
|
+
private readonly apiClient;
|
|
25
|
+
constructor(config: LiFiConfig);
|
|
26
|
+
checkStatus(_txId: string, metadata: Record<string, unknown>): Promise<AsyncTrackingResult>;
|
|
27
|
+
}
|
|
28
|
+
export declare class BridgeMonitoringTracker implements IAsyncStatusTracker {
|
|
29
|
+
readonly name = "bridge-monitoring";
|
|
30
|
+
readonly maxAttempts = 264;
|
|
31
|
+
readonly pollIntervalMs = 300000;
|
|
32
|
+
readonly timeoutTransition: "TIMEOUT";
|
|
33
|
+
private readonly apiClient;
|
|
34
|
+
constructor(config: LiFiConfig);
|
|
35
|
+
checkStatus(_txId: string, metadata: Record<string, unknown>): Promise<AsyncTrackingResult>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=bridge-status-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-status-tracker.d.ts","sourceRoot":"","sources":["../../../src/providers/lifi/bridge-status-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwE9C,qBAAa,mBAAoB,YAAW,mBAAmB;IAC7D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,OAAO;IAC3B,QAAQ,CAAC,cAAc,SAAU;IACjC,QAAQ,CAAC,iBAAiB,EAAG,mBAAmB,CAAU;IAE1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAE9B,MAAM,EAAE,UAAU;IAIxB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAelG;AAMD,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,OAAO;IAC3B,QAAQ,CAAC,cAAc,UAAW;IAClC,QAAQ,CAAC,iBAAiB,EAAG,SAAS,CAAU;IAEhD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;gBAE9B,MAAM,EAAE,UAAU;IAIxB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAelG"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { LiFiApiClient } from './lifi-api-client.js';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Shared status mapping
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Map LI.FI status response to AsyncTrackingResult.
|
|
7
|
+
* Shared by both BridgeStatusTracker and BridgeMonitoringTracker.
|
|
8
|
+
*/
|
|
9
|
+
function mapLiFiStatus(response) {
|
|
10
|
+
switch (response.status) {
|
|
11
|
+
case 'DONE':
|
|
12
|
+
return {
|
|
13
|
+
state: 'COMPLETED',
|
|
14
|
+
details: {
|
|
15
|
+
destTxHash: response.receiving?.txHash ?? null,
|
|
16
|
+
destChainId: response.receiving?.chainId ?? null,
|
|
17
|
+
lifiExplorerLink: response.lifiExplorerLink ?? null,
|
|
18
|
+
tool: response.tool ?? null,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
case 'FAILED': {
|
|
22
|
+
// Check for refund via substatus
|
|
23
|
+
const isRefunded = response.substatus === 'REFUNDED' ||
|
|
24
|
+
response.substatusMessage?.toLowerCase().includes('refund');
|
|
25
|
+
if (isRefunded) {
|
|
26
|
+
return {
|
|
27
|
+
state: 'COMPLETED', // Treated as terminal (not PENDING)
|
|
28
|
+
details: {
|
|
29
|
+
refunded: true,
|
|
30
|
+
substatusMessage: response.substatusMessage ?? 'Refunded',
|
|
31
|
+
lifiExplorerLink: response.lifiExplorerLink ?? null,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
state: 'FAILED',
|
|
37
|
+
details: {
|
|
38
|
+
substatusMessage: response.substatusMessage ?? 'Bridge transfer failed',
|
|
39
|
+
substatus: response.substatus ?? null,
|
|
40
|
+
lifiExplorerLink: response.lifiExplorerLink ?? null,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
case 'NOT_FOUND':
|
|
45
|
+
case 'INVALID':
|
|
46
|
+
// Not yet tracked by LI.FI — keep polling
|
|
47
|
+
return { state: 'PENDING' };
|
|
48
|
+
case 'PENDING':
|
|
49
|
+
default:
|
|
50
|
+
return {
|
|
51
|
+
state: 'PENDING',
|
|
52
|
+
details: {
|
|
53
|
+
substatus: response.substatus ?? null,
|
|
54
|
+
substatusMessage: response.substatusMessage ?? null,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Phase 1: Active tracker (30s x 240 = 2 hours)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
export class BridgeStatusTracker {
|
|
63
|
+
name = 'bridge';
|
|
64
|
+
maxAttempts = 240; // 240 x 30s = 2 hours
|
|
65
|
+
pollIntervalMs = 30_000; // 30 seconds
|
|
66
|
+
timeoutTransition = 'BRIDGE_MONITORING';
|
|
67
|
+
apiClient;
|
|
68
|
+
constructor(config) {
|
|
69
|
+
this.apiClient = new LiFiApiClient(config);
|
|
70
|
+
}
|
|
71
|
+
async checkStatus(_txId, metadata) {
|
|
72
|
+
const txHash = metadata.txHash;
|
|
73
|
+
if (!txHash) {
|
|
74
|
+
return { state: 'PENDING', details: { error: 'No txHash in metadata' } };
|
|
75
|
+
}
|
|
76
|
+
const response = await this.apiClient.getStatus({
|
|
77
|
+
txHash,
|
|
78
|
+
bridge: metadata.bridge,
|
|
79
|
+
fromChain: metadata.fromChainId,
|
|
80
|
+
toChain: metadata.toChainId,
|
|
81
|
+
});
|
|
82
|
+
return mapLiFiStatus(response);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Phase 2: Reduced-frequency tracker (5min x 264 = 22 hours)
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
export class BridgeMonitoringTracker {
|
|
89
|
+
name = 'bridge-monitoring';
|
|
90
|
+
maxAttempts = 264; // 264 x 5min = 22 hours
|
|
91
|
+
pollIntervalMs = 300_000; // 5 minutes
|
|
92
|
+
timeoutTransition = 'TIMEOUT';
|
|
93
|
+
apiClient;
|
|
94
|
+
constructor(config) {
|
|
95
|
+
this.apiClient = new LiFiApiClient(config);
|
|
96
|
+
}
|
|
97
|
+
async checkStatus(_txId, metadata) {
|
|
98
|
+
const txHash = metadata.txHash;
|
|
99
|
+
if (!txHash) {
|
|
100
|
+
return { state: 'PENDING', details: { error: 'No txHash in metadata' } };
|
|
101
|
+
}
|
|
102
|
+
const response = await this.apiClient.getStatus({
|
|
103
|
+
txHash,
|
|
104
|
+
bridge: metadata.bridge,
|
|
105
|
+
fromChain: metadata.fromChainId,
|
|
106
|
+
toChain: metadata.toChainId,
|
|
107
|
+
});
|
|
108
|
+
return mapLiFiStatus(response);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=bridge-status-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-status-tracker.js","sourceRoot":"","sources":["../../../src/providers/lifi/bridge-status-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LI.FI cross-chain bridge configuration type, defaults, and chain ID mapping.
|
|
3
|
+
*
|
|
4
|
+
* Uses LI.FI API v1 for cross-chain bridge and swap aggregation.
|
|
5
|
+
* See: https://docs.li.fi/li.fi-api/get-a-quote
|
|
6
|
+
*/
|
|
7
|
+
export interface LiFiConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
apiBaseUrl: string;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
defaultSlippagePct: number;
|
|
12
|
+
maxSlippagePct: number;
|
|
13
|
+
requestTimeoutMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare const LIFI_DEFAULTS: LiFiConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Maps WAIaaS chain/network names to LI.FI chain IDs.
|
|
18
|
+
* LI.FI uses numeric chain IDs for EVM and special numeric IDs for non-EVM.
|
|
19
|
+
* See: https://docs.li.fi/list-chains-bridges-dexs-solvers
|
|
20
|
+
*/
|
|
21
|
+
export declare const LIFI_CHAIN_MAP: ReadonlyMap<string, number>;
|
|
22
|
+
/**
|
|
23
|
+
* Get LI.FI chain ID for a WAIaaS chain name.
|
|
24
|
+
* @throws Error if chain is not supported by LI.FI integration.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getLiFiChainId(chain: string): number;
|
|
27
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/providers/lifi/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,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,aAAa,EAAE,UAO3B,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAerD,CAAC;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LI.FI cross-chain bridge configuration type, defaults, and chain ID mapping.
|
|
3
|
+
*
|
|
4
|
+
* Uses LI.FI API v1 for cross-chain bridge and swap aggregation.
|
|
5
|
+
* See: https://docs.li.fi/li.fi-api/get-a-quote
|
|
6
|
+
*/
|
|
7
|
+
export const LIFI_DEFAULTS = {
|
|
8
|
+
enabled: false,
|
|
9
|
+
apiBaseUrl: 'https://li.quest/v1',
|
|
10
|
+
apiKey: '',
|
|
11
|
+
defaultSlippagePct: 0.03, // 3% (cross-chain needs higher slippage)
|
|
12
|
+
maxSlippagePct: 0.05, // 5%
|
|
13
|
+
requestTimeoutMs: 15_000, // LI.FI route computation is slower than single-chain
|
|
14
|
+
};
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Chain ID mapping: WAIaaS chain names -> LI.FI chain IDs
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Maps WAIaaS chain/network names to LI.FI chain IDs.
|
|
20
|
+
* LI.FI uses numeric chain IDs for EVM and special numeric IDs for non-EVM.
|
|
21
|
+
* See: https://docs.li.fi/list-chains-bridges-dexs-solvers
|
|
22
|
+
*/
|
|
23
|
+
export const LIFI_CHAIN_MAP = new Map([
|
|
24
|
+
// Solana
|
|
25
|
+
['solana', 1151111081099710],
|
|
26
|
+
['solana-mainnet', 1151111081099710],
|
|
27
|
+
// EVM
|
|
28
|
+
['ethereum', 1],
|
|
29
|
+
['ethereum-mainnet', 1],
|
|
30
|
+
['polygon', 137],
|
|
31
|
+
['polygon-mainnet', 137],
|
|
32
|
+
['arbitrum', 42161],
|
|
33
|
+
['arbitrum-mainnet', 42161],
|
|
34
|
+
['optimism', 10],
|
|
35
|
+
['optimism-mainnet', 10],
|
|
36
|
+
['base', 8453],
|
|
37
|
+
['base-mainnet', 8453],
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Get LI.FI chain ID for a WAIaaS chain name.
|
|
41
|
+
* @throws Error if chain is not supported by LI.FI integration.
|
|
42
|
+
*/
|
|
43
|
+
export function getLiFiChainId(chain) {
|
|
44
|
+
const id = LIFI_CHAIN_MAP.get(chain.toLowerCase());
|
|
45
|
+
if (id === undefined) {
|
|
46
|
+
throw new Error(`Unsupported chain '${chain}' for LI.FI. Supported: ${[...LIFI_CHAIN_MAP.keys()].filter((k) => !k.includes('-')).join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
return id;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/providers/lifi/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,qBAAqB;IACjC,MAAM,EAAE,EAAE;IACV,kBAAkB,EAAE,IAAI,EAAM,yCAAyC;IACvE,cAAc,EAAE,IAAI,EAAU,KAAK;IACnC,gBAAgB,EAAE,MAAM,EAAM,sDAAsD;CACrF,CAAC;AAEF,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgC,IAAI,GAAG,CAAC;IACjE,SAAS;IACT,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC5B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACpC,MAAM;IACN,CAAC,UAAU,EAAE,CAAC,CAAC;IACf,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACvB,CAAC,SAAS,EAAE,GAAG,CAAC;IAChB,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,kBAAkB,EAAE,KAAK,CAAC;IAC3B,CAAC,UAAU,EAAE,EAAE,CAAC;IAChB,CAAC,kBAAkB,EAAE,EAAE,CAAC;IACxB,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,cAAc,EAAE,IAAI,CAAC;CACvB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,2BAA2B,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9H,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IActionProvider, ActionProviderMetadata, ActionDefinition, ActionContext, ContractCallRequest } from '@waiaas/core';
|
|
2
|
+
import { type LiFiConfig } from './config.js';
|
|
3
|
+
export declare class LiFiActionProvider implements IActionProvider {
|
|
4
|
+
readonly metadata: ActionProviderMetadata;
|
|
5
|
+
readonly actions: readonly ActionDefinition[];
|
|
6
|
+
private readonly config;
|
|
7
|
+
constructor(config?: Partial<LiFiConfig>);
|
|
8
|
+
resolve(actionName: string, params: Record<string, unknown>, context: ActionContext): Promise<ContractCallRequest[]>;
|
|
9
|
+
/**
|
|
10
|
+
* Clamp slippage to [defaultSlippagePct, maxSlippagePct].
|
|
11
|
+
* Input is decimal (0.03 = 3%). If not provided or <= 0, use default.
|
|
12
|
+
* If > max, clamp to max.
|
|
13
|
+
*/
|
|
14
|
+
private clampSlippage;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lifi/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,KAAK,UAAU,EAAiC,MAAM,aAAa,CAAC;AAoB7E,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAiClC,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;IAoDjC;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAItB"}
|