@eulerxyz/euler-v2-sdk 0.1.3-beta → 0.2.1-beta
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 +24 -25
- package/dist/src/entities/Account.d.ts +50 -49
- package/dist/src/entities/Account.d.ts.map +1 -1
- package/dist/src/entities/Account.js +80 -66
- package/dist/src/entities/Account.js.map +1 -1
- package/dist/src/entities/ERC4626Vault.d.ts +6 -5
- package/dist/src/entities/ERC4626Vault.d.ts.map +1 -1
- package/dist/src/entities/ERC4626Vault.js +13 -6
- package/dist/src/entities/ERC4626Vault.js.map +1 -1
- package/dist/src/entities/EVault.d.ts +30 -15
- package/dist/src/entities/EVault.d.ts.map +1 -1
- package/dist/src/entities/EVault.js +66 -14
- package/dist/src/entities/EVault.js.map +1 -1
- package/dist/src/entities/EulerEarn.d.ts +3 -0
- package/dist/src/entities/EulerEarn.d.ts.map +1 -1
- package/dist/src/entities/EulerEarn.js +12 -3
- package/dist/src/entities/EulerEarn.js.map +1 -1
- package/dist/src/entities/EulerLabels.d.ts +74 -0
- package/dist/src/entities/EulerLabels.d.ts.map +1 -1
- package/dist/src/entities/Portfolio.d.ts +20 -19
- package/dist/src/entities/Portfolio.d.ts.map +1 -1
- package/dist/src/entities/Portfolio.js +34 -17
- package/dist/src/entities/Portfolio.js.map +1 -1
- package/dist/src/entities/Wallet.d.ts +1 -0
- package/dist/src/entities/Wallet.d.ts.map +1 -1
- package/dist/src/entities/Wallet.js +2 -2
- package/dist/src/entities/Wallet.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/keyring/keyringPlugin.d.ts.map +1 -1
- package/dist/src/plugins/keyring/keyringPlugin.js +59 -10
- package/dist/src/plugins/keyring/keyringPlugin.js.map +1 -1
- package/dist/src/plugins/pyth/pythPlugin.d.ts.map +1 -1
- package/dist/src/plugins/pyth/pythPlugin.js +132 -11
- package/dist/src/plugins/pyth/pythPlugin.js.map +1 -1
- package/dist/src/plugins/types.d.ts +4 -7
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/plugins/types.js.map +1 -1
- package/dist/src/sdk/buildSDK.d.ts +10 -4
- package/dist/src/sdk/buildSDK.d.ts.map +1 -1
- package/dist/src/sdk/buildSDK.js +359 -110
- package/dist/src/sdk/buildSDK.js.map +1 -1
- package/dist/src/sdk/config.d.ts +74 -0
- package/dist/src/sdk/config.d.ts.map +1 -0
- package/dist/src/sdk/config.js +187 -0
- package/dist/src/sdk/config.js.map +1 -0
- package/dist/src/sdk/defaultConfig.d.ts +5 -2
- package/dist/src/sdk/defaultConfig.d.ts.map +1 -1
- package/dist/src/sdk/defaultConfig.js +21 -18
- package/dist/src/sdk/defaultConfig.js.map +1 -1
- package/dist/src/sdk/sdk.d.ts +4 -3
- package/dist/src/sdk/sdk.d.ts.map +1 -1
- package/dist/src/sdk/sdk.js +2 -4
- package/dist/src/sdk/sdk.js.map +1 -1
- package/dist/src/services/accountService/accountService.d.ts.map +1 -1
- package/dist/src/services/accountService/accountService.js +10 -7
- package/dist/src/services/accountService/accountService.js.map +1 -1
- package/dist/src/services/accountService/accountServiceConfig.d.ts +1 -1
- package/dist/src/services/accountService/accountServiceConfig.d.ts.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.d.ts +2 -2
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.d.ts.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.js +22 -17
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountInfoConverter.js.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js +16 -17
- package/dist/src/services/accountService/adapters/accountOnchainAdapter/accountOnchainAdapter.js.map +1 -1
- package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.d.ts.map +1 -1
- package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.js +58 -53
- package/dist/src/services/accountService/adapters/accountV3Adapter/accountV3Adapter.js.map +1 -1
- package/dist/src/services/deploymentService/deploymentService.d.ts +1 -0
- package/dist/src/services/deploymentService/deploymentService.d.ts.map +1 -1
- package/dist/src/services/deploymentService/deploymentService.js.map +1 -1
- package/dist/src/services/eulerLabelsService/eulerLabelsService.d.ts +18 -1
- package/dist/src/services/eulerLabelsService/eulerLabelsService.d.ts.map +1 -1
- package/dist/src/services/eulerLabelsService/eulerLabelsService.js +373 -30
- package/dist/src/services/eulerLabelsService/eulerLabelsService.js.map +1 -1
- package/dist/src/services/executionService/encode.d.ts +15 -11
- package/dist/src/services/executionService/encode.d.ts.map +1 -1
- package/dist/src/services/executionService/encode.js +242 -23
- package/dist/src/services/executionService/encode.js.map +1 -1
- package/dist/src/services/executionService/execute.d.ts +2 -1
- package/dist/src/services/executionService/execute.d.ts.map +1 -1
- package/dist/src/services/executionService/execute.js +10 -6
- package/dist/src/services/executionService/execute.js.map +1 -1
- package/dist/src/services/executionService/executionService.d.ts +45 -7
- package/dist/src/services/executionService/executionService.d.ts.map +1 -1
- package/dist/src/services/executionService/executionService.js +325 -20
- package/dist/src/services/executionService/executionService.js.map +1 -1
- package/dist/src/services/executionService/executionServiceTypes.d.ts +109 -1
- package/dist/src/services/executionService/executionServiceTypes.d.ts.map +1 -1
- package/dist/src/services/executionService/executionServiceTypes.js.map +1 -1
- package/dist/src/services/executionService/index.d.ts +1 -1
- package/dist/src/services/executionService/index.d.ts.map +1 -1
- package/dist/src/services/executionService/index.js.map +1 -1
- package/dist/src/services/executionService/simulate.d.ts.map +1 -1
- package/dist/src/services/executionService/simulate.js +3 -2
- package/dist/src/services/executionService/simulate.js.map +1 -1
- package/dist/src/services/intrinsicApyService/adapters/intrinsicApyV3Adapter/intrinsicApyV3AdapterTypes.d.ts +1 -1
- package/dist/src/services/intrinsicApyService/adapters/intrinsicApyV3Adapter/intrinsicApyV3AdapterTypes.d.ts.map +1 -1
- package/dist/src/services/oracleAdapterService/oracleAdapterService.d.ts +5 -0
- package/dist/src/services/oracleAdapterService/oracleAdapterService.d.ts.map +1 -1
- package/dist/src/services/oracleAdapterService/oracleAdapterService.js +38 -11
- package/dist/src/services/oracleAdapterService/oracleAdapterService.js.map +1 -1
- package/dist/src/services/priceService/backendClient.d.ts +7 -11
- package/dist/src/services/priceService/backendClient.d.ts.map +1 -1
- package/dist/src/services/priceService/backendClient.js +7 -14
- package/dist/src/services/priceService/backendClient.js.map +1 -1
- package/dist/src/services/priceService/index.d.ts +2 -2
- package/dist/src/services/priceService/index.d.ts.map +1 -1
- package/dist/src/services/priceService/index.js +1 -1
- package/dist/src/services/priceService/index.js.map +1 -1
- package/dist/src/services/priceService/priceService.d.ts +21 -18
- package/dist/src/services/priceService/priceService.d.ts.map +1 -1
- package/dist/src/services/priceService/priceService.js +61 -101
- package/dist/src/services/priceService/priceService.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts +4 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.d.ts.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js +20 -4
- package/dist/src/services/rewardsService/adapters/rewardsDirectAdapter/rewardsDirectAdapter.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.d.ts.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js +5 -2
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3Adapter.js.map +1 -1
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts +2 -0
- package/dist/src/services/rewardsService/adapters/rewardsV3Adapter/rewardsV3AdapterTypes.d.ts.map +1 -1
- package/dist/src/services/rewardsService/rewardsService.d.ts +6 -1
- package/dist/src/services/rewardsService/rewardsService.d.ts.map +1 -1
- package/dist/src/services/rewardsService/rewardsService.js +128 -3
- package/dist/src/services/rewardsService/rewardsService.js.map +1 -1
- package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts +5 -3
- package/dist/src/services/rewardsService/rewardsServiceTypes.d.ts.map +1 -1
- package/dist/src/services/swapService/swapService.d.ts +4 -6
- package/dist/src/services/swapService/swapService.d.ts.map +1 -1
- package/dist/src/services/swapService/swapService.js +90 -99
- package/dist/src/services/swapService/swapService.js.map +1 -1
- package/dist/src/services/swapService/swapVerification.d.ts +28 -0
- package/dist/src/services/swapService/swapVerification.d.ts.map +1 -0
- package/dist/src/services/swapService/swapVerification.js +138 -0
- package/dist/src/services/swapService/swapVerification.js.map +1 -0
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.d.ts +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.js +6 -13
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/eVaultOnchainAdapter.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js +69 -51
- package/dist/src/services/vaults/eVaultService/adapters/eVaultOnchainAdapter/vaultInfoConverter.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.d.ts +5 -2
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.js +50 -18
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3Adapter.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js +106 -111
- package/dist/src/services/vaults/eVaultService/adapters/eVaultV3Adapter/eVaultV3AdapterConversions.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/eVaultService.d.ts +4 -4
- package/dist/src/services/vaults/eVaultService/eVaultService.d.ts.map +1 -1
- package/dist/src/services/vaults/eVaultService/eVaultService.js +56 -57
- package/dist/src/services/vaults/eVaultService/eVaultService.js.map +1 -1
- package/dist/src/services/vaults/eVaultService/eVaultServiceConfig.d.ts +1 -1
- package/dist/src/services/vaults/eVaultService/eVaultServiceConfig.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.d.ts +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.js +22 -21
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnInfoConverter.js.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js +27 -32
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnOnchainAdapter.js.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.d.ts +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.js +113 -72
- package/dist/src/services/vaults/eulerEarnService/adapters/eulerEarnV3Adapter.js.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/eulerEarnService.d.ts +5 -5
- package/dist/src/services/vaults/eulerEarnService/eulerEarnService.d.ts.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/eulerEarnService.js +30 -28
- package/dist/src/services/vaults/eulerEarnService/eulerEarnService.js.map +1 -1
- package/dist/src/services/vaults/eulerEarnService/eulerEarnServiceConfig.d.ts +1 -1
- package/dist/src/services/vaults/eulerEarnService/eulerEarnServiceConfig.d.ts.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.d.ts +1 -1
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.d.ts.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.js +10 -7
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultInfoConverter.js.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.js +6 -8
- package/dist/src/services/vaults/securitizeVaultService/adapters/securitizeVaultOnchainAdapter.js.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.d.ts +2 -2
- package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.d.ts.map +1 -1
- package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.js +13 -18
- package/dist/src/services/vaults/securitizeVaultService/securitizeVaultService.js.map +1 -1
- package/dist/src/services/vaults/vaultMetaService/adapters/VaultTypeV3Adapter.d.ts +1 -1
- package/dist/src/services/vaults/vaultMetaService/adapters/VaultTypeV3Adapter.d.ts.map +1 -1
- package/dist/src/services/vaults/vaultMetaService/vaultMetaService.d.ts +3 -3
- package/dist/src/services/vaults/vaultMetaService/vaultMetaService.d.ts.map +1 -1
- package/dist/src/services/vaults/vaultMetaService/vaultMetaService.js +31 -32
- package/dist/src/services/vaults/vaultMetaService/vaultMetaService.js.map +1 -1
- package/dist/src/services/walletService/adapters/walletOnchainAdapter.d.ts +5 -1
- package/dist/src/services/walletService/adapters/walletOnchainAdapter.d.ts.map +1 -1
- package/dist/src/services/walletService/adapters/walletOnchainAdapter.js +181 -40
- package/dist/src/services/walletService/adapters/walletOnchainAdapter.js.map +1 -1
- package/dist/src/services/walletService/walletService.d.ts +1 -1
- package/dist/src/services/walletService/walletService.d.ts.map +1 -1
- package/dist/src/services/walletService/walletService.js +4 -3
- package/dist/src/services/walletService/walletService.js.map +1 -1
- package/dist/src/utils/accountComputations.d.ts +14 -13
- package/dist/src/utils/accountComputations.d.ts.map +1 -1
- package/dist/src/utils/accountComputations.js +59 -37
- package/dist/src/utils/accountComputations.js.map +1 -1
- package/dist/src/utils/buildQuery.d.ts +1 -0
- package/dist/src/utils/buildQuery.d.ts.map +1 -1
- package/dist/src/utils/buildQuery.js +1 -1
- package/dist/src/utils/buildQuery.js.map +1 -1
- package/dist/src/utils/entityDiagnostics.d.ts +75 -12
- package/dist/src/utils/entityDiagnostics.d.ts.map +1 -1
- package/dist/src/utils/entityDiagnostics.js +85 -19
- package/dist/src/utils/entityDiagnostics.js.map +1 -1
- package/dist/src/utils/eulerLabels.d.ts +34 -0
- package/dist/src/utils/eulerLabels.d.ts.map +1 -0
- package/dist/src/utils/eulerLabels.js +156 -0
- package/dist/src/utils/eulerLabels.js.map +1 -0
- package/dist/src/utils/healthCheckSets.d.ts +14 -0
- package/dist/src/utils/healthCheckSets.d.ts.map +1 -0
- package/dist/src/utils/healthCheckSets.js +174 -0
- package/dist/src/utils/healthCheckSets.js.map +1 -0
- package/dist/src/utils/normalization.d.ts +10 -4
- package/dist/src/utils/normalization.d.ts.map +1 -1
- package/dist/src/utils/normalization.js +38 -11
- package/dist/src/utils/normalization.js.map +1 -1
- package/dist/src/utils/oracle.d.ts.map +1 -1
- package/dist/src/utils/oracle.js +12 -1
- package/dist/src/utils/oracle.js.map +1 -1
- package/dist/src/utils/parsing.d.ts +2 -2
- package/dist/src/utils/parsing.d.ts.map +1 -1
- package/dist/src/utils/parsing.js +12 -22
- package/dist/src/utils/parsing.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@ import * as encodeHelpers from "./encode.js";
|
|
|
9
9
|
import { isEVCBatchOperation } from "./executionServiceTypes.js";
|
|
10
10
|
import { executeTransactionPlan, } from "./execute.js";
|
|
11
11
|
import { deriveStateOverrides, estimateGasForTransactionPlan, simulateTransactionPlan, } from "./simulate.js";
|
|
12
|
+
import { adjustForInterest, getSwapInputAmount, } from "../swapService/swapVerification.js";
|
|
13
|
+
import { SwapperMode } from "../swapService/swapServiceTypes.js";
|
|
12
14
|
const TOKENS_REQUIRING_ZERO_APPROVAL_RESET = {
|
|
13
15
|
1: [getAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7")],
|
|
14
16
|
};
|
|
@@ -26,6 +28,118 @@ function cloneBatchEntries(entries) {
|
|
|
26
28
|
? { type: "operation", name: entry.name, items: [...entry.items] }
|
|
27
29
|
: entry);
|
|
28
30
|
}
|
|
31
|
+
function hasSuppliedPosition(position) {
|
|
32
|
+
return position.assets > 0n || position.shares > 0n;
|
|
33
|
+
}
|
|
34
|
+
function getStateTransition(item) {
|
|
35
|
+
try {
|
|
36
|
+
const decoded = decodeFunctionData({
|
|
37
|
+
abi: ethereumVaultConnectorAbi,
|
|
38
|
+
data: item.data,
|
|
39
|
+
});
|
|
40
|
+
if (decoded.functionName === "enableCollateral" ||
|
|
41
|
+
decoded.functionName === "disableCollateral" ||
|
|
42
|
+
decoded.functionName === "enableController") {
|
|
43
|
+
const [account, vault] = decoded.args;
|
|
44
|
+
return {
|
|
45
|
+
kind: decoded.functionName === "enableController"
|
|
46
|
+
? "controller"
|
|
47
|
+
: "collateral",
|
|
48
|
+
action: decoded.functionName.startsWith("enable")
|
|
49
|
+
? "enable"
|
|
50
|
+
: "disable",
|
|
51
|
+
account,
|
|
52
|
+
vault,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch { }
|
|
57
|
+
try {
|
|
58
|
+
const decoded = decodeFunctionData({
|
|
59
|
+
abi: eVaultAbi,
|
|
60
|
+
data: item.data,
|
|
61
|
+
});
|
|
62
|
+
if (decoded.functionName === "disableController") {
|
|
63
|
+
return {
|
|
64
|
+
kind: "controller",
|
|
65
|
+
action: "disable",
|
|
66
|
+
account: item.onBehalfOfAccount,
|
|
67
|
+
vault: item.targetContract,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
function stateTransitionKey(transition) {
|
|
75
|
+
return `${transition.kind}:${getAddress(transition.account)}:${getAddress(transition.vault)}`;
|
|
76
|
+
}
|
|
77
|
+
function normalizeEVCStateTransitions(entries) {
|
|
78
|
+
const entryRefs = entries.map((entry) => isEVCBatchOperation(entry)
|
|
79
|
+
? entry.items.map((item) => ({
|
|
80
|
+
item,
|
|
81
|
+
remove: false,
|
|
82
|
+
transition: getStateTransition(item),
|
|
83
|
+
}))
|
|
84
|
+
: [
|
|
85
|
+
{
|
|
86
|
+
item: entry,
|
|
87
|
+
remove: false,
|
|
88
|
+
transition: getStateTransition(entry),
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
const refs = entryRefs.flat();
|
|
92
|
+
const collateralStacks = new Map();
|
|
93
|
+
const controllerLast = new Map();
|
|
94
|
+
for (const ref of refs) {
|
|
95
|
+
const transition = ref.transition;
|
|
96
|
+
if (!transition)
|
|
97
|
+
continue;
|
|
98
|
+
const key = stateTransitionKey(transition);
|
|
99
|
+
if (transition.kind === "collateral") {
|
|
100
|
+
const stack = collateralStacks.get(key) ?? [];
|
|
101
|
+
const previous = stack[stack.length - 1];
|
|
102
|
+
if (previous?.action === transition.action) {
|
|
103
|
+
ref.remove = true;
|
|
104
|
+
}
|
|
105
|
+
else if (previous) {
|
|
106
|
+
previous.ref.remove = true;
|
|
107
|
+
ref.remove = true;
|
|
108
|
+
stack.pop();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
stack.push({ action: transition.action, ref });
|
|
112
|
+
}
|
|
113
|
+
collateralStacks.set(key, stack);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const previous = controllerLast.get(key);
|
|
117
|
+
if (previous?.action === transition.action) {
|
|
118
|
+
ref.remove = true;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
controllerLast.set(key, { action: transition.action });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const result = [];
|
|
125
|
+
entries.forEach((entry, index) => {
|
|
126
|
+
const refsForEntry = entryRefs[index] ?? [];
|
|
127
|
+
if (isEVCBatchOperation(entry)) {
|
|
128
|
+
const items = refsForEntry
|
|
129
|
+
.filter((ref) => !ref.remove)
|
|
130
|
+
.map((ref) => ref.item);
|
|
131
|
+
if (items.length > 0) {
|
|
132
|
+
result.push({ type: "operation", name: entry.name, items });
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const ref = refsForEntry[0];
|
|
137
|
+
if (ref && !ref.remove) {
|
|
138
|
+
result.push(ref.item);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
29
143
|
const WAD = 10n ** 18n;
|
|
30
144
|
// TODO explain how this service is coupled to the concrete abis of ERC4626, permit2 and EVK.
|
|
31
145
|
// this is a helper service, not a generic one.
|
|
@@ -39,6 +153,7 @@ export class ExecutionService {
|
|
|
39
153
|
rewardsService;
|
|
40
154
|
intrinsicApyService;
|
|
41
155
|
eulerLabelsService;
|
|
156
|
+
processPlugins;
|
|
42
157
|
constructor(deploymentService, walletService, providerService, vaultMetaService, priceService, rewardsService, intrinsicApyService, eulerLabelsService) {
|
|
43
158
|
this.deploymentService = deploymentService;
|
|
44
159
|
this.walletService = walletService;
|
|
@@ -73,17 +188,24 @@ export class ExecutionService {
|
|
|
73
188
|
setPlugins(plugins) {
|
|
74
189
|
this.plugins = plugins;
|
|
75
190
|
}
|
|
191
|
+
setPluginProcessor(processPlugins) {
|
|
192
|
+
this.processPlugins = processPlugins;
|
|
193
|
+
}
|
|
76
194
|
/** Derive storage overrides needed to simulate the plan against the current account state. */
|
|
77
195
|
async deriveStateOverrides(chainId, account, transactionPlan, options) {
|
|
78
196
|
return deriveStateOverrides(this.getSimulationContext(), chainId, account, transactionPlan, options);
|
|
79
197
|
}
|
|
80
198
|
/** Simulate the full transaction plan, including approval resolution and plugin-aware batch execution. */
|
|
81
199
|
async simulateTransactionPlan(chainId, account, transactionPlan, options) {
|
|
82
|
-
|
|
200
|
+
const processedPlan = await this.processPlanPlugins(transactionPlan, account, chainId);
|
|
201
|
+
const owner = this.getAccountOwner(account);
|
|
202
|
+
return simulateTransactionPlan(this.getSimulationContext(), chainId, owner, processedPlan, options);
|
|
83
203
|
}
|
|
84
204
|
/** Estimate gas for the full transaction plan after applying the same simulation pipeline used for execution. */
|
|
85
205
|
async estimateGasForTransactionPlan(chainId, account, transactionPlan, options) {
|
|
86
|
-
|
|
206
|
+
const processedPlan = await this.processPlanPlugins(transactionPlan, account, chainId);
|
|
207
|
+
const owner = this.getAccountOwner(account);
|
|
208
|
+
return estimateGasForTransactionPlan(this.getSimulationContext(), chainId, owner, processedPlan, options);
|
|
87
209
|
}
|
|
88
210
|
/** Execute a transaction plan using caller-provided signing and send callbacks. */
|
|
89
211
|
async executeTransactionPlan(args) {
|
|
@@ -93,6 +215,7 @@ export class ExecutionService {
|
|
|
93
215
|
}
|
|
94
216
|
const helperArgs = {
|
|
95
217
|
...args,
|
|
218
|
+
plan: await this.processPlanPlugins(args.plan, args.account, args.chainId),
|
|
96
219
|
executionService: this,
|
|
97
220
|
deploymentService: this.deploymentService,
|
|
98
221
|
providerService,
|
|
@@ -112,6 +235,14 @@ export class ExecutionService {
|
|
|
112
235
|
describeBatch: (batch) => this.describeBatch(batch),
|
|
113
236
|
};
|
|
114
237
|
}
|
|
238
|
+
async processPlanPlugins(plan, account, chainId) {
|
|
239
|
+
return this.processPlugins
|
|
240
|
+
? this.processPlugins(plan, account, chainId)
|
|
241
|
+
: plan;
|
|
242
|
+
}
|
|
243
|
+
getAccountOwner(account) {
|
|
244
|
+
return typeof account === "string" ? account : account.owner;
|
|
245
|
+
}
|
|
115
246
|
getCoreAddresses(chainId) {
|
|
116
247
|
return this.deploymentService.getDeployment(chainId).addresses.coreAddrs;
|
|
117
248
|
}
|
|
@@ -382,6 +513,19 @@ export class ExecutionService {
|
|
|
382
513
|
encodeSwapFromWallet(args) {
|
|
383
514
|
return encodeHelpers.encodeSwapFromWallet(args);
|
|
384
515
|
}
|
|
516
|
+
encodeSwapAndBorrowFromWallet(args) {
|
|
517
|
+
const { evc } = this.getCoreAddresses(args.chainId);
|
|
518
|
+
return encodeHelpers.encodeSwapAndBorrowFromWallet(evc, args);
|
|
519
|
+
}
|
|
520
|
+
encodeSwapAndRepayFromWallet(args) {
|
|
521
|
+
return encodeHelpers.encodeSwapAndRepayFromWallet(args);
|
|
522
|
+
}
|
|
523
|
+
encodeWithdrawAndSwap(args) {
|
|
524
|
+
return encodeHelpers.encodeWithdrawAndSwap(args);
|
|
525
|
+
}
|
|
526
|
+
encodeRedeemAndSwap(args) {
|
|
527
|
+
return encodeHelpers.encodeRedeemAndSwap(args);
|
|
528
|
+
}
|
|
385
529
|
/**
|
|
386
530
|
* Encodes EVC batch items for swapping collateral: withdraw from vaultIn → swap → verify/skim to receiver; optional enable/disable collateral.
|
|
387
531
|
* Swap quote should come from swapService.fetchDepositQuote() or match the same structure (verify type skimMin).
|
|
@@ -514,7 +658,7 @@ export class ExecutionService {
|
|
|
514
658
|
* @param args.spender - Address that will be allowed to transfer the token (e.g. vault or Permit2)
|
|
515
659
|
* @param args.nonce - Unique nonce for this permit (e.g. from Permit2 nonce(owner, token, spender))
|
|
516
660
|
* @param args.sigDeadline - Signature deadline (defaults to now + 1 hour if omitted)
|
|
517
|
-
* @param args.expiration - Permit expiration (defaults to
|
|
661
|
+
* @param args.expiration - Permit expiration (defaults to now + 1 hour if omitted)
|
|
518
662
|
* @returns EIP-712 typed data (domain, types, primaryType, message) for signing
|
|
519
663
|
*/
|
|
520
664
|
getPermit2TypedData(args) {
|
|
@@ -641,7 +785,13 @@ export class ExecutionService {
|
|
|
641
785
|
}
|
|
642
786
|
}
|
|
643
787
|
}
|
|
644
|
-
|
|
788
|
+
const optimizedExecutableItems = executableItems.flatMap((item) => {
|
|
789
|
+
if (item.type !== "evcBatch")
|
|
790
|
+
return [item];
|
|
791
|
+
const items = normalizeEVCStateTransitions(item.items);
|
|
792
|
+
return items.length > 0 ? [{ type: "evcBatch", items }] : [];
|
|
793
|
+
});
|
|
794
|
+
return [...approvalByKey.values(), ...optimizedExecutableItems];
|
|
645
795
|
}
|
|
646
796
|
/**
|
|
647
797
|
* Appends a raw batch item to the last EVC batch in the plan, or creates one.
|
|
@@ -721,11 +871,11 @@ export class ExecutionService {
|
|
|
721
871
|
* @param args.chainId - Chain ID (used to resolve Permit2 address when usePermit2 is true)
|
|
722
872
|
* @param args.wallet - Wallet entity with token balances and allowances (assetForVault, assetForPermit2, etc.)
|
|
723
873
|
* @param args.usePermit2 - If true, prefer Permit2 path (approve Permit2 + sign PermitSingle) when allowance is insufficient (default true)
|
|
724
|
-
* @param args.unlimitedApproval - If true,
|
|
874
|
+
* @param args.unlimitedApproval - If true, direct approvals and Permit2 signed amounts use maxUint256/maxUint160 (default false). Token approvals to Permit2 use maxUint256.
|
|
725
875
|
* @returns The same plan array with requiredApproval[].resolved populated (approve and/or permit2 data to sign)
|
|
726
876
|
*/
|
|
727
877
|
resolveRequiredApprovalsWithWallet(args) {
|
|
728
|
-
const { plan, wallet, chainId, usePermit2 = true, unlimitedApproval =
|
|
878
|
+
const { plan, wallet, chainId, usePermit2 = true, unlimitedApproval = false, } = args;
|
|
729
879
|
const deployment = this.deploymentService.getDeployment(chainId);
|
|
730
880
|
const permit2 = deployment.addresses.coreAddrs.permit2;
|
|
731
881
|
for (const item of plan) {
|
|
@@ -766,7 +916,7 @@ export class ExecutionService {
|
|
|
766
916
|
if (!walletAsset || !allowances) {
|
|
767
917
|
if (usePermit2) {
|
|
768
918
|
// Need approval to permit2 and permit2 signature
|
|
769
|
-
resolvedItems.push(makeApprove(permit2,
|
|
919
|
+
resolvedItems.push(makeApprove(permit2, maxUint256));
|
|
770
920
|
resolvedItems.push(makePermit2(spender, unlimitedApproval ? maxUint160 : amount));
|
|
771
921
|
}
|
|
772
922
|
else {
|
|
@@ -793,7 +943,7 @@ export class ExecutionService {
|
|
|
793
943
|
}
|
|
794
944
|
// If assetForPermit2 is insufficient, we need both approval and permit2 signature
|
|
795
945
|
if (!hasSufficientPermit2Allowance) {
|
|
796
|
-
addApproveWithOptionalReset(permit2,
|
|
946
|
+
addApproveWithOptionalReset(permit2, maxUint256, assetForPermit2);
|
|
797
947
|
resolvedItems.push(makePermit2(spender, unlimitedApproval ? maxUint160 : amount));
|
|
798
948
|
}
|
|
799
949
|
else {
|
|
@@ -863,6 +1013,55 @@ export class ExecutionService {
|
|
|
863
1013
|
});
|
|
864
1014
|
}
|
|
865
1015
|
// ========== Transaction plan functions ==========
|
|
1016
|
+
/**
|
|
1017
|
+
* Builds a cleanup plan matching Lite's stale collateral/controller policy.
|
|
1018
|
+
*
|
|
1019
|
+
* Cleanup is derived from the provided account snapshot:
|
|
1020
|
+
* - no enabled controllers: disable all enabled collaterals
|
|
1021
|
+
* - enabled controllers but no active borrows: disable all collaterals, then controllers
|
|
1022
|
+
* - active borrows: disable only enabled collaterals with no supplied position
|
|
1023
|
+
*
|
|
1024
|
+
* If the sub-account snapshot is unavailable, no cleanup is planned.
|
|
1025
|
+
*/
|
|
1026
|
+
planCleanup(args) {
|
|
1027
|
+
const { account, subAccount } = args;
|
|
1028
|
+
if (typeof account.getSubAccount !== "function")
|
|
1029
|
+
return [];
|
|
1030
|
+
const subAccountSnapshot = account.getSubAccount(subAccount);
|
|
1031
|
+
if (!subAccountSnapshot)
|
|
1032
|
+
return [];
|
|
1033
|
+
const collaterals = subAccountSnapshot.enabledCollaterals ?? [];
|
|
1034
|
+
const controllers = subAccountSnapshot.enabledControllers ?? [];
|
|
1035
|
+
if (collaterals.length === 0 && controllers.length === 0)
|
|
1036
|
+
return [];
|
|
1037
|
+
const items = [];
|
|
1038
|
+
const disableAllCollaterals = () => {
|
|
1039
|
+
for (const collateral of collaterals) {
|
|
1040
|
+
items.push(this.encodeDisableCollateral(account.chainId, subAccount, collateral));
|
|
1041
|
+
}
|
|
1042
|
+
};
|
|
1043
|
+
if (controllers.length === 0) {
|
|
1044
|
+
disableAllCollaterals();
|
|
1045
|
+
return this.convertBatchItemsToPlan(items, "cleanup");
|
|
1046
|
+
}
|
|
1047
|
+
const hasActiveBorrow = subAccountSnapshot.positions.some((position) => position.borrowed > 0n);
|
|
1048
|
+
if (!hasActiveBorrow) {
|
|
1049
|
+
disableAllCollaterals();
|
|
1050
|
+
for (const controller of controllers) {
|
|
1051
|
+
items.push(this.encodeDisableController(controller, subAccount));
|
|
1052
|
+
}
|
|
1053
|
+
return this.convertBatchItemsToPlan(items, "cleanup");
|
|
1054
|
+
}
|
|
1055
|
+
const depositedVaults = new Set(subAccountSnapshot.positions
|
|
1056
|
+
.filter(hasSuppliedPosition)
|
|
1057
|
+
.map((position) => getAddress(position.vaultAddress)));
|
|
1058
|
+
for (const collateral of collaterals) {
|
|
1059
|
+
if (depositedVaults.has(getAddress(collateral)))
|
|
1060
|
+
continue;
|
|
1061
|
+
items.push(this.encodeDisableCollateral(account.chainId, subAccount, collateral));
|
|
1062
|
+
}
|
|
1063
|
+
return this.convertBatchItemsToPlan(items, "cleanup");
|
|
1064
|
+
}
|
|
866
1065
|
/**
|
|
867
1066
|
* Builds a transaction plan for depositing assets into a vault.
|
|
868
1067
|
* Use `maxUint256` for `amount` to deposit all available assets from the wallet.
|
|
@@ -877,7 +1076,7 @@ export class ExecutionService {
|
|
|
877
1076
|
* @returns Array of transaction plan items (required approvals + EVC batch)
|
|
878
1077
|
*/
|
|
879
1078
|
planDeposit(args) {
|
|
880
|
-
const { vault, amount, receiver, account, asset, enableCollateral } = args;
|
|
1079
|
+
const { vault, amount, receiver, account, asset, enableCollateral, wrappedNativeInfo, } = args;
|
|
881
1080
|
const plan = [];
|
|
882
1081
|
// Default: collateral is not enabled when account/position is not available
|
|
883
1082
|
const isCollateralEnabled = account?.isCollateralEnabled(receiver, vault) ?? false;
|
|
@@ -897,6 +1096,7 @@ export class ExecutionService {
|
|
|
897
1096
|
receiver,
|
|
898
1097
|
owner: account.owner,
|
|
899
1098
|
enableCollateral: !isCollateralEnabled && enableCollateral,
|
|
1099
|
+
wrappedNativeInfo,
|
|
900
1100
|
// Permit2 is handled separately in the plan
|
|
901
1101
|
});
|
|
902
1102
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "deposit"));
|
|
@@ -916,7 +1116,7 @@ export class ExecutionService {
|
|
|
916
1116
|
* @returns Array of transaction plan items (required approvals + EVC batch)
|
|
917
1117
|
*/
|
|
918
1118
|
planMint(args) {
|
|
919
|
-
const { vault, shares, receiver, account, asset, enableCollateral, sharesToAssetsExchangeRateWad, } = args;
|
|
1119
|
+
const { vault, shares, receiver, account, asset, enableCollateral, sharesToAssetsExchangeRateWad, wrappedNativeInfo, } = args;
|
|
920
1120
|
const plan = [];
|
|
921
1121
|
// Default: collateral is not enabled when account/position is not available
|
|
922
1122
|
const isCollateralEnabled = account?.isCollateralEnabled(receiver, vault) ?? false;
|
|
@@ -939,6 +1139,7 @@ export class ExecutionService {
|
|
|
939
1139
|
receiver,
|
|
940
1140
|
owner: account.owner,
|
|
941
1141
|
enableCollateral: !isCollateralEnabled && enableCollateral,
|
|
1142
|
+
wrappedNativeInfo,
|
|
942
1143
|
// Permit2 is handled separately in the plan
|
|
943
1144
|
});
|
|
944
1145
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "mint"));
|
|
@@ -1059,6 +1260,7 @@ export class ExecutionService {
|
|
|
1059
1260
|
enableCollateral,
|
|
1060
1261
|
collateralVault: collateral?.vault,
|
|
1061
1262
|
collateralAmount: walletCollateral?.amount,
|
|
1263
|
+
collateralWrappedNativeInfo: walletCollateral?.wrappedNativeInfo,
|
|
1062
1264
|
collateralShareSource: savingsCollateral
|
|
1063
1265
|
? {
|
|
1064
1266
|
from: savingsCollateral.from,
|
|
@@ -1136,15 +1338,16 @@ export class ExecutionService {
|
|
|
1136
1338
|
if (!position) {
|
|
1137
1339
|
throw new Error(`Position not found. Liability vault: ${liabilityVault}, Account: ${receiver}`);
|
|
1138
1340
|
}
|
|
1341
|
+
const isMax = liabilityAmount === maxUint256;
|
|
1342
|
+
const approvalAmount = adjustForInterest(isMax ? position.borrowed : liabilityAmount);
|
|
1139
1343
|
// Add approval requirement (will be resolved later with Wallet data)
|
|
1140
1344
|
plan.push({
|
|
1141
1345
|
type: "requiredApproval",
|
|
1142
1346
|
token: position.asset,
|
|
1143
1347
|
owner: account.owner,
|
|
1144
1348
|
spender: liabilityVault,
|
|
1145
|
-
amount:
|
|
1349
|
+
amount: approvalAmount,
|
|
1146
1350
|
});
|
|
1147
|
-
const isMax = liabilityAmount === maxUint256;
|
|
1148
1351
|
// Build EVC batch items
|
|
1149
1352
|
const batchItems = this.encodeRepayFromWallet({
|
|
1150
1353
|
chainId: account.chainId,
|
|
@@ -1271,7 +1474,7 @@ export class ExecutionService {
|
|
|
1271
1474
|
* @returns Array of transaction plan items (EVC batch: withdraw, swap, verify/repay). Throws if positions not found or liability is zero.
|
|
1272
1475
|
*/
|
|
1273
1476
|
planRepayWithSwap(args) {
|
|
1274
|
-
const { swapQuote, account, cleanupOnMax = false } = args;
|
|
1477
|
+
const { swapQuote, account, cleanupOnMax = false, swapperMode } = args;
|
|
1275
1478
|
const plan = [];
|
|
1276
1479
|
const liabilityPosition = account?.getPosition(swapQuote.accountOut, swapQuote.receiver);
|
|
1277
1480
|
const fromPosition = account?.getPosition(swapQuote.accountIn, swapQuote.vaultIn);
|
|
@@ -1289,6 +1492,7 @@ export class ExecutionService {
|
|
|
1289
1492
|
maxWithdraw,
|
|
1290
1493
|
isMax,
|
|
1291
1494
|
disableControllerOnMax: true,
|
|
1495
|
+
swapperMode,
|
|
1292
1496
|
});
|
|
1293
1497
|
if (cleanupOnMax && isMax) {
|
|
1294
1498
|
this.appendMaxRepayCleanup({
|
|
@@ -1317,7 +1521,7 @@ export class ExecutionService {
|
|
|
1317
1521
|
* @returns Array of transaction plan items (approval to SwapVerifier + EVC batch)
|
|
1318
1522
|
*/
|
|
1319
1523
|
planDepositWithSwapFromWallet(args) {
|
|
1320
|
-
const { swapQuote, amount, tokenIn, account, enableCollateral } = args;
|
|
1524
|
+
const { swapQuote, amount, tokenIn, account, enableCollateral, wrappedNativeInfo, } = args;
|
|
1321
1525
|
const plan = [];
|
|
1322
1526
|
// Approval goes to the transferFromSender contract (which uses permit2 transferFrom internally)
|
|
1323
1527
|
plan.push({
|
|
@@ -1341,6 +1545,7 @@ export class ExecutionService {
|
|
|
1341
1545
|
amount,
|
|
1342
1546
|
sender: account.owner,
|
|
1343
1547
|
enableCollateral: shouldEnableCollateral,
|
|
1548
|
+
wrappedNativeInfo,
|
|
1344
1549
|
});
|
|
1345
1550
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "depositWithSwapFromWallet"));
|
|
1346
1551
|
return plan;
|
|
@@ -1357,7 +1562,7 @@ export class ExecutionService {
|
|
|
1357
1562
|
* @returns Array of transaction plan items (approval to SwapVerifier + EVC batch)
|
|
1358
1563
|
*/
|
|
1359
1564
|
planSwapFromWallet(args) {
|
|
1360
|
-
const { swapQuote, amount, tokenIn, account } = args;
|
|
1565
|
+
const { swapQuote, amount, tokenIn, account, wrappedNativeInfo } = args;
|
|
1361
1566
|
const plan = [];
|
|
1362
1567
|
plan.push({
|
|
1363
1568
|
type: "requiredApproval",
|
|
@@ -1371,10 +1576,102 @@ export class ExecutionService {
|
|
|
1371
1576
|
swapQuote,
|
|
1372
1577
|
amount,
|
|
1373
1578
|
sender: account.owner,
|
|
1579
|
+
wrappedNativeInfo,
|
|
1374
1580
|
});
|
|
1375
1581
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "swapFromWallet"));
|
|
1376
1582
|
return plan;
|
|
1377
1583
|
}
|
|
1584
|
+
planSwapAndBorrowFromWallet(args) {
|
|
1585
|
+
const { swapQuote, amount, tokenIn, account, borrowVault, borrowAmount, borrowAccount = swapQuote.accountOut, receiver = account.owner, collateralVault = swapQuote.receiver, wrappedNativeInfo, } = args;
|
|
1586
|
+
const plan = [];
|
|
1587
|
+
plan.push({
|
|
1588
|
+
type: "requiredApproval",
|
|
1589
|
+
token: tokenIn,
|
|
1590
|
+
owner: account.owner,
|
|
1591
|
+
spender: swapQuote.verify.verifierAddress,
|
|
1592
|
+
amount,
|
|
1593
|
+
});
|
|
1594
|
+
const enableController = !(account?.isControllerEnabled(borrowAccount, borrowVault) ?? false);
|
|
1595
|
+
const enableCollateral = !(account?.isCollateralEnabled(borrowAccount, collateralVault) ?? false);
|
|
1596
|
+
const currentController = account?.getCurrentController(borrowAccount);
|
|
1597
|
+
const batchItems = this.encodeSwapAndBorrowFromWallet({
|
|
1598
|
+
chainId: account.chainId,
|
|
1599
|
+
swapQuote,
|
|
1600
|
+
amount,
|
|
1601
|
+
sender: account.owner,
|
|
1602
|
+
borrowAccount,
|
|
1603
|
+
collateralVault,
|
|
1604
|
+
borrowVault,
|
|
1605
|
+
borrowAmount,
|
|
1606
|
+
receiver,
|
|
1607
|
+
currentController: currentController || undefined,
|
|
1608
|
+
enableController,
|
|
1609
|
+
enableCollateral,
|
|
1610
|
+
wrappedNativeInfo,
|
|
1611
|
+
});
|
|
1612
|
+
plan.push(...this.convertBatchItemsToPlan(batchItems, "swapAndBorrowFromWallet"));
|
|
1613
|
+
return plan;
|
|
1614
|
+
}
|
|
1615
|
+
planSwapAndRepayFromWallet(args) {
|
|
1616
|
+
const { swapQuote, amount, tokenIn, account, liabilityVault = swapQuote.receiver, repayAccount = swapQuote.accountOut, isMax, cleanupOnMax = false, wrappedNativeInfo, } = args;
|
|
1617
|
+
const plan = [];
|
|
1618
|
+
plan.push({
|
|
1619
|
+
type: "requiredApproval",
|
|
1620
|
+
token: tokenIn,
|
|
1621
|
+
owner: account.owner,
|
|
1622
|
+
spender: swapQuote.verify.verifierAddress,
|
|
1623
|
+
amount,
|
|
1624
|
+
});
|
|
1625
|
+
const liabilityPosition = account?.getPosition(repayAccount, liabilityVault);
|
|
1626
|
+
const resolvedIsMax = isMax ??
|
|
1627
|
+
(liabilityPosition !== undefined &&
|
|
1628
|
+
liabilityPosition.borrowed <= BigInt(swapQuote.amountOutMin || 0));
|
|
1629
|
+
const batchItems = this.encodeSwapAndRepayFromWallet({
|
|
1630
|
+
chainId: account.chainId,
|
|
1631
|
+
swapQuote,
|
|
1632
|
+
amount,
|
|
1633
|
+
sender: account.owner,
|
|
1634
|
+
liabilityVault,
|
|
1635
|
+
repayAccount,
|
|
1636
|
+
isMax: resolvedIsMax,
|
|
1637
|
+
disableControllerOnMax: true,
|
|
1638
|
+
wrappedNativeInfo,
|
|
1639
|
+
});
|
|
1640
|
+
if (cleanupOnMax && resolvedIsMax && liabilityPosition) {
|
|
1641
|
+
this.appendMaxRepayCleanup({
|
|
1642
|
+
account,
|
|
1643
|
+
liabilityPosition,
|
|
1644
|
+
receiver: repayAccount,
|
|
1645
|
+
batchItems,
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
plan.push(...this.convertBatchItemsToPlan(batchItems, "swapAndRepayFromWallet"));
|
|
1649
|
+
return plan;
|
|
1650
|
+
}
|
|
1651
|
+
planWithdrawAndSwap(args) {
|
|
1652
|
+
const { account, vault, assets, owner, swapQuote } = args;
|
|
1653
|
+
const batchItems = this.encodeWithdrawAndSwap({
|
|
1654
|
+
chainId: account.chainId,
|
|
1655
|
+
vault,
|
|
1656
|
+
assets,
|
|
1657
|
+
owner,
|
|
1658
|
+
sender: account.owner,
|
|
1659
|
+
swapQuote,
|
|
1660
|
+
});
|
|
1661
|
+
return this.convertBatchItemsToPlan(batchItems, "withdrawAndSwap");
|
|
1662
|
+
}
|
|
1663
|
+
planRedeemAndSwap(args) {
|
|
1664
|
+
const { account, vault, shares, owner, swapQuote } = args;
|
|
1665
|
+
const batchItems = this.encodeRedeemAndSwap({
|
|
1666
|
+
chainId: account.chainId,
|
|
1667
|
+
vault,
|
|
1668
|
+
shares,
|
|
1669
|
+
owner,
|
|
1670
|
+
sender: account.owner,
|
|
1671
|
+
swapQuote,
|
|
1672
|
+
});
|
|
1673
|
+
return this.convertBatchItemsToPlan(batchItems, "redeemAndSwap");
|
|
1674
|
+
}
|
|
1378
1675
|
/**
|
|
1379
1676
|
* Builds a transaction plan for swapping collateral from one vault to another (withdraw → swap → deposit/skim).
|
|
1380
1677
|
*
|
|
@@ -1384,7 +1681,7 @@ export class ExecutionService {
|
|
|
1384
1681
|
* @returns Array of transaction plan items (EVC batch: withdraw, swap, verify/skim, optional enable/disable collateral)
|
|
1385
1682
|
*/
|
|
1386
1683
|
planSwapCollateral(args) {
|
|
1387
|
-
const { swapQuote, account } = args;
|
|
1684
|
+
const { swapQuote, account, swapperMode } = args;
|
|
1388
1685
|
const plan = [];
|
|
1389
1686
|
// Check if source collateral needs to be disabled (when all is swapped)
|
|
1390
1687
|
// Default: when position is not available, assume amounts are zero, so we don't disable collateral
|
|
@@ -1403,6 +1700,7 @@ export class ExecutionService {
|
|
|
1403
1700
|
enableCollateral,
|
|
1404
1701
|
disableCollateralOnMax: true,
|
|
1405
1702
|
isMax,
|
|
1703
|
+
swapperMode,
|
|
1406
1704
|
});
|
|
1407
1705
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "swapCollateral"));
|
|
1408
1706
|
return plan;
|
|
@@ -1416,7 +1714,7 @@ export class ExecutionService {
|
|
|
1416
1714
|
* @returns Array of transaction plan items (EVC batch: enableController, borrow, swap, verify/repay, optional disableController)
|
|
1417
1715
|
*/
|
|
1418
1716
|
planSwapDebt(args) {
|
|
1419
|
-
const { swapQuote, account } = args;
|
|
1717
|
+
const { swapQuote, account, swapperMode } = args;
|
|
1420
1718
|
const plan = [];
|
|
1421
1719
|
const sourcePosition = account?.getPosition(swapQuote.accountIn, swapQuote.vaultIn);
|
|
1422
1720
|
const isMax = sourcePosition
|
|
@@ -1431,6 +1729,7 @@ export class ExecutionService {
|
|
|
1431
1729
|
enableController,
|
|
1432
1730
|
disableControllerOnMax: true,
|
|
1433
1731
|
isMax,
|
|
1732
|
+
swapperMode,
|
|
1434
1733
|
});
|
|
1435
1734
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "swapDebt"));
|
|
1436
1735
|
return plan;
|
|
@@ -1602,7 +1901,7 @@ export class ExecutionService {
|
|
|
1602
1901
|
* @returns Array of transaction plan items (optional approval + EVC batch). Throws if swapQuote.accountIn !== swapQuote.accountOut.
|
|
1603
1902
|
*/
|
|
1604
1903
|
planMultiplyWithSwap(args) {
|
|
1605
|
-
const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, account, swapQuote, } = args;
|
|
1904
|
+
const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, collateralWrappedNativeInfo, account, swapQuote, swapperMode, } = args;
|
|
1606
1905
|
const plan = [];
|
|
1607
1906
|
// 1. Check if collateral approval is needed (only if depositing collateral)
|
|
1608
1907
|
if (!collateralShareSource && collateralAmount > 0n) {
|
|
@@ -1621,13 +1920,14 @@ export class ExecutionService {
|
|
|
1621
1920
|
const receiver = swapQuote.accountIn;
|
|
1622
1921
|
const liabilityVault = swapQuote.vaultIn;
|
|
1623
1922
|
const longVault = swapQuote.receiver;
|
|
1624
|
-
const liabilityAmount =
|
|
1923
|
+
const liabilityAmount = getSwapInputAmount(swapQuote, swapperMode ?? SwapperMode.EXACT_IN);
|
|
1625
1924
|
// 2. Determine if collateral needs to be enabled
|
|
1626
1925
|
const hasCollateralInput = collateralShareSource
|
|
1627
1926
|
? collateralShareSource.shares > 0n
|
|
1628
1927
|
: collateralAmount > 0n;
|
|
1629
1928
|
const enableCollateral = hasCollateralInput &&
|
|
1630
1929
|
!(account?.isCollateralEnabled(receiver, collateralVault) ?? false);
|
|
1930
|
+
const enableCollateralLong = !(account?.isCollateralEnabled(receiver, longVault) ?? false);
|
|
1631
1931
|
const resolvedCollateralShareSource = collateralShareSource
|
|
1632
1932
|
? {
|
|
1633
1933
|
...collateralShareSource,
|
|
@@ -1654,7 +1954,9 @@ export class ExecutionService {
|
|
|
1654
1954
|
currentController: currentController || undefined,
|
|
1655
1955
|
enableController,
|
|
1656
1956
|
collateralShareSource: resolvedCollateralShareSource,
|
|
1957
|
+
collateralWrappedNativeInfo,
|
|
1657
1958
|
swapQuote,
|
|
1959
|
+
enableCollateralLong,
|
|
1658
1960
|
// Permit2 is handled separately in the plan
|
|
1659
1961
|
});
|
|
1660
1962
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "multiplyWithSwap"));
|
|
@@ -1676,7 +1978,7 @@ export class ExecutionService {
|
|
|
1676
1978
|
* @returns Array of transaction plan items (optional approval + EVC batch)
|
|
1677
1979
|
*/
|
|
1678
1980
|
planMultiplySameAsset(args) {
|
|
1679
|
-
const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, liabilityVault, liabilityAmount, longVault, receiver, account, } = args;
|
|
1981
|
+
const { collateralVault, collateralAmount, collateralAsset, collateralShareSource, collateralWrappedNativeInfo, liabilityVault, liabilityAmount, longVault, receiver, account, } = args;
|
|
1680
1982
|
const plan = [];
|
|
1681
1983
|
// 1. Check if collateral approval is needed (only if depositing collateral)
|
|
1682
1984
|
if (!collateralShareSource && collateralAmount > 0n) {
|
|
@@ -1695,6 +1997,7 @@ export class ExecutionService {
|
|
|
1695
1997
|
: collateralAmount > 0n;
|
|
1696
1998
|
const enableCollateral = hasCollateralInput &&
|
|
1697
1999
|
!(account?.isCollateralEnabled(receiver, collateralVault) ?? false);
|
|
2000
|
+
const enableCollateralLong = !(account?.isCollateralEnabled(receiver, longVault) ?? false);
|
|
1698
2001
|
const resolvedCollateralShareSource = collateralShareSource
|
|
1699
2002
|
? {
|
|
1700
2003
|
...collateralShareSource,
|
|
@@ -1721,6 +2024,8 @@ export class ExecutionService {
|
|
|
1721
2024
|
currentController: currentController || undefined,
|
|
1722
2025
|
enableController,
|
|
1723
2026
|
collateralShareSource: resolvedCollateralShareSource,
|
|
2027
|
+
collateralWrappedNativeInfo,
|
|
2028
|
+
enableCollateralLong,
|
|
1724
2029
|
// Permit2 is handled separately in the plan
|
|
1725
2030
|
});
|
|
1726
2031
|
plan.push(...this.convertBatchItemsToPlan(batchItems, "multiplySameAsset"));
|