@lit-protocol/vincent-ability-aerodrome-swap 0.2.0-alpha1 → 0.2.0-alpha3
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/package.json +5 -5
- package/dist/CHANGELOG.md +0 -19
- package/dist/CONTRIBUTING.md +0 -5
- package/dist/README.md +0 -5
- package/dist/package.json +0 -31
- package/dist/src/generated/vincent-bundled-ability.d.ts +0 -136
- package/dist/src/generated/vincent-bundled-ability.d.ts.map +0 -1
- package/dist/src/generated/vincent-bundled-ability.js +0 -11
- package/dist/src/generated/vincent-bundled-ability.js.map +0 -1
- package/dist/src/index.d.ts +0 -4
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -3
- package/dist/src/index.js.map +0 -1
- package/dist/src/lib/ability-checks/check-erc20-allowance.d.ts +0 -10
- package/dist/src/lib/ability-checks/check-erc20-allowance.d.ts.map +0 -1
- package/dist/src/lib/ability-checks/check-erc20-allowance.js +0 -27
- package/dist/src/lib/ability-checks/check-erc20-allowance.js.map +0 -1
- package/dist/src/lib/ability-checks/check-erc20-balance.d.ts +0 -9
- package/dist/src/lib/ability-checks/check-erc20-balance.d.ts.map +0 -1
- package/dist/src/lib/ability-checks/check-erc20-balance.js +0 -21
- package/dist/src/lib/ability-checks/check-erc20-balance.js.map +0 -1
- package/dist/src/lib/ability-checks/check-native-token-balance.d.ts +0 -7
- package/dist/src/lib/ability-checks/check-native-token-balance.d.ts.map +0 -1
- package/dist/src/lib/ability-checks/check-native-token-balance.js +0 -14
- package/dist/src/lib/ability-checks/check-native-token-balance.js.map +0 -1
- package/dist/src/lib/ability-checks/index.d.ts +0 -4
- package/dist/src/lib/ability-checks/index.d.ts.map +0 -1
- package/dist/src/lib/ability-checks/index.js +0 -4
- package/dist/src/lib/ability-checks/index.js.map +0 -1
- package/dist/src/lib/ability-helpers/find-supported-token-on-base.d.ts +0 -18
- package/dist/src/lib/ability-helpers/find-supported-token-on-base.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/find-supported-token-on-base.js +0 -6
- package/dist/src/lib/ability-helpers/find-supported-token-on-base.js.map +0 -1
- package/dist/src/lib/ability-helpers/get-erc20-allowance.d.ts +0 -8
- package/dist/src/lib/ability-helpers/get-erc20-allowance.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/get-erc20-allowance.js +0 -6
- package/dist/src/lib/ability-helpers/get-erc20-allowance.js.map +0 -1
- package/dist/src/lib/ability-helpers/get-erc20-contract.d.ts +0 -4
- package/dist/src/lib/ability-helpers/get-erc20-contract.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/get-erc20-contract.js +0 -16
- package/dist/src/lib/ability-helpers/get-erc20-contract.js.map +0 -1
- package/dist/src/lib/ability-helpers/index.d.ts +0 -6
- package/dist/src/lib/ability-helpers/index.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/index.js +0 -6
- package/dist/src/lib/ability-helpers/index.js.map +0 -1
- package/dist/src/lib/ability-helpers/send-aerodrome-swap-tx.d.ts +0 -15
- package/dist/src/lib/ability-helpers/send-aerodrome-swap-tx.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/send-aerodrome-swap-tx.js +0 -75
- package/dist/src/lib/ability-helpers/send-aerodrome-swap-tx.js.map +0 -1
- package/dist/src/lib/ability-helpers/send-erc20-approval-tx.d.ts +0 -15
- package/dist/src/lib/ability-helpers/send-erc20-approval-tx.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/send-erc20-approval-tx.js +0 -82
- package/dist/src/lib/ability-helpers/send-erc20-approval-tx.js.map +0 -1
- package/dist/src/lib/ability-helpers/sign-tx.d.ts +0 -3
- package/dist/src/lib/ability-helpers/sign-tx.d.ts.map +0 -1
- package/dist/src/lib/ability-helpers/sign-tx.js +0 -24
- package/dist/src/lib/ability-helpers/sign-tx.js.map +0 -1
- package/dist/src/lib/lit-action.d.ts +0 -2
- package/dist/src/lib/lit-action.d.ts.map +0 -1
- package/dist/src/lib/lit-action.js +0 -14
- package/dist/src/lib/lit-action.js.map +0 -1
- package/dist/src/lib/schemas.d.ts +0 -139
- package/dist/src/lib/schemas.d.ts.map +0 -1
- package/dist/src/lib/schemas.js +0 -125
- package/dist/src/lib/schemas.js.map +0 -1
- package/dist/src/lib/types.d.ts +0 -43
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -6
- package/dist/src/lib/types.js.map +0 -1
- package/dist/src/lib/vincent-ability.d.ts +0 -135
- package/dist/src/lib/vincent-ability.d.ts.map +0 -1
- package/dist/src/lib/vincent-ability.js +0 -355
- package/dist/src/lib/vincent-ability.js.map +0 -1
- package/vendor/sugar-sdk-0.3.0.tgz +0 -0
- /package/{dist/src → src}/generated/lit-action.js +0 -0
- /package/{dist/src → src}/generated/vincent-ability-metadata.json +0 -0
- /package/{dist/src → src}/generated/vincent-bundled-ability.ts +0 -0
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
export declare const bigintReplacer: (key: any, value: any) => any;
|
|
2
|
-
export declare const sugarSdkQuoteBigintReviver: (key: any, value: any) => any;
|
|
3
|
-
export declare const vincentAbility: import("@lit-protocol/vincent-ability-sdk").VincentAbility<import("zod").ZodObject<{
|
|
4
|
-
action: import("zod").ZodEnum<["approve", "swap"]>;
|
|
5
|
-
rpcUrl: import("zod").ZodString;
|
|
6
|
-
tokenInAddress: import("zod").ZodString;
|
|
7
|
-
tokenOutAddress: import("zod").ZodString;
|
|
8
|
-
amountIn: import("zod").ZodString;
|
|
9
|
-
slippage: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNumber>>;
|
|
10
|
-
gasBufferPercentage: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
11
|
-
baseFeePerGasBufferPercentage: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
12
|
-
alchemyGasSponsor: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodBoolean>>;
|
|
13
|
-
alchemyGasSponsorApiKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
14
|
-
alchemyGasSponsorPolicyId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
15
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
16
|
-
action: "approve" | "swap";
|
|
17
|
-
rpcUrl: string;
|
|
18
|
-
tokenInAddress: string;
|
|
19
|
-
tokenOutAddress: string;
|
|
20
|
-
amountIn: string;
|
|
21
|
-
alchemyGasSponsor: boolean;
|
|
22
|
-
slippage?: number | undefined;
|
|
23
|
-
gasBufferPercentage?: number | undefined;
|
|
24
|
-
baseFeePerGasBufferPercentage?: number | undefined;
|
|
25
|
-
alchemyGasSponsorApiKey?: string | undefined;
|
|
26
|
-
alchemyGasSponsorPolicyId?: string | undefined;
|
|
27
|
-
}, {
|
|
28
|
-
action: "approve" | "swap";
|
|
29
|
-
rpcUrl: string;
|
|
30
|
-
tokenInAddress: string;
|
|
31
|
-
tokenOutAddress: string;
|
|
32
|
-
amountIn: string;
|
|
33
|
-
slippage?: number | undefined;
|
|
34
|
-
gasBufferPercentage?: number | undefined;
|
|
35
|
-
baseFeePerGasBufferPercentage?: number | undefined;
|
|
36
|
-
alchemyGasSponsor?: boolean | undefined;
|
|
37
|
-
alchemyGasSponsorApiKey?: string | undefined;
|
|
38
|
-
alchemyGasSponsorPolicyId?: string | undefined;
|
|
39
|
-
}>, string, import("node_modules/@lit-protocol/vincent-ability-sdk/dist/src/lib/abilityCore/helpers").AbilityPolicyMap<readonly [], never>, {}, import("zod").ZodObject<{
|
|
40
|
-
swapTxHash: import("zod").ZodOptional<import("zod").ZodString>;
|
|
41
|
-
swapTxUserOperationHash: import("zod").ZodOptional<import("zod").ZodString>;
|
|
42
|
-
approvalTxHash: import("zod").ZodOptional<import("zod").ZodString>;
|
|
43
|
-
approvalTxUserOperationHash: import("zod").ZodOptional<import("zod").ZodString>;
|
|
44
|
-
currentAllowance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
45
|
-
requiredAllowance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
46
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
47
|
-
currentAllowance?: string | undefined;
|
|
48
|
-
requiredAllowance?: string | undefined;
|
|
49
|
-
swapTxHash?: string | undefined;
|
|
50
|
-
swapTxUserOperationHash?: string | undefined;
|
|
51
|
-
approvalTxHash?: string | undefined;
|
|
52
|
-
approvalTxUserOperationHash?: string | undefined;
|
|
53
|
-
}, {
|
|
54
|
-
currentAllowance?: string | undefined;
|
|
55
|
-
requiredAllowance?: string | undefined;
|
|
56
|
-
swapTxHash?: string | undefined;
|
|
57
|
-
swapTxUserOperationHash?: string | undefined;
|
|
58
|
-
approvalTxHash?: string | undefined;
|
|
59
|
-
approvalTxUserOperationHash?: string | undefined;
|
|
60
|
-
}>, import("zod").ZodObject<{
|
|
61
|
-
reason: import("zod").ZodOptional<import("zod").ZodString>;
|
|
62
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
63
|
-
reason?: string | undefined;
|
|
64
|
-
}, {
|
|
65
|
-
reason?: string | undefined;
|
|
66
|
-
}>, import("zod").ZodObject<{
|
|
67
|
-
nativeTokenBalance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
68
|
-
tokenInAddress: import("zod").ZodOptional<import("zod").ZodString>;
|
|
69
|
-
tokenInBalance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
70
|
-
currentTokenInAllowanceForSpender: import("zod").ZodString;
|
|
71
|
-
spenderAddress: import("zod").ZodString;
|
|
72
|
-
requiredTokenInAllowance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
73
|
-
quote: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
74
|
-
tokenInAmount: import("zod").ZodString;
|
|
75
|
-
tokenOutAmount: import("zod").ZodString;
|
|
76
|
-
priceImpact: import("zod").ZodString;
|
|
77
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
78
|
-
tokenInAmount: string;
|
|
79
|
-
tokenOutAmount: string;
|
|
80
|
-
priceImpact: string;
|
|
81
|
-
}, {
|
|
82
|
-
tokenInAmount: string;
|
|
83
|
-
tokenOutAmount: string;
|
|
84
|
-
priceImpact: string;
|
|
85
|
-
}>>;
|
|
86
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
87
|
-
currentTokenInAllowanceForSpender: string;
|
|
88
|
-
spenderAddress: string;
|
|
89
|
-
tokenInAddress?: string | undefined;
|
|
90
|
-
nativeTokenBalance?: string | undefined;
|
|
91
|
-
tokenInBalance?: string | undefined;
|
|
92
|
-
requiredTokenInAllowance?: string | undefined;
|
|
93
|
-
quote?: {
|
|
94
|
-
tokenInAmount: string;
|
|
95
|
-
tokenOutAmount: string;
|
|
96
|
-
priceImpact: string;
|
|
97
|
-
} | undefined;
|
|
98
|
-
}, {
|
|
99
|
-
currentTokenInAllowanceForSpender: string;
|
|
100
|
-
spenderAddress: string;
|
|
101
|
-
tokenInAddress?: string | undefined;
|
|
102
|
-
nativeTokenBalance?: string | undefined;
|
|
103
|
-
tokenInBalance?: string | undefined;
|
|
104
|
-
requiredTokenInAllowance?: string | undefined;
|
|
105
|
-
quote?: {
|
|
106
|
-
tokenInAmount: string;
|
|
107
|
-
tokenOutAmount: string;
|
|
108
|
-
priceImpact: string;
|
|
109
|
-
} | undefined;
|
|
110
|
-
}>, import("zod").ZodObject<{
|
|
111
|
-
reason: import("zod").ZodString;
|
|
112
|
-
spenderAddress: import("zod").ZodOptional<import("zod").ZodString>;
|
|
113
|
-
tokenAddress: import("zod").ZodOptional<import("zod").ZodString>;
|
|
114
|
-
requiredTokenAmount: import("zod").ZodOptional<import("zod").ZodString>;
|
|
115
|
-
tokenBalance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
116
|
-
currentAllowance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
117
|
-
requiredAllowance: import("zod").ZodOptional<import("zod").ZodString>;
|
|
118
|
-
}, "strip", import("zod").ZodTypeAny, {
|
|
119
|
-
reason: string;
|
|
120
|
-
spenderAddress?: string | undefined;
|
|
121
|
-
tokenAddress?: string | undefined;
|
|
122
|
-
requiredTokenAmount?: string | undefined;
|
|
123
|
-
tokenBalance?: string | undefined;
|
|
124
|
-
currentAllowance?: string | undefined;
|
|
125
|
-
requiredAllowance?: string | undefined;
|
|
126
|
-
}, {
|
|
127
|
-
reason: string;
|
|
128
|
-
spenderAddress?: string | undefined;
|
|
129
|
-
tokenAddress?: string | undefined;
|
|
130
|
-
requiredTokenAmount?: string | undefined;
|
|
131
|
-
tokenBalance?: string | undefined;
|
|
132
|
-
currentAllowance?: string | undefined;
|
|
133
|
-
requiredAllowance?: string | undefined;
|
|
134
|
-
}>>;
|
|
135
|
-
//# sourceMappingURL=vincent-ability.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vincent-ability.d.ts","sourceRoot":"","sources":["../../../src/lib/vincent-ability.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,cAAc,GAAI,KAAK,GAAG,EAAE,OAAO,GAAG,QAElD,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,KAAK,GAAG,EAAE,OAAO,GAAG,QAiB9D,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyZzB,CAAC"}
|
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import { createVincentAbility, supportedPoliciesForAbility, } from '@lit-protocol/vincent-ability-sdk';
|
|
2
|
-
import { base, getCallDataForSwap, getDefaultConfig, getQuoteForSwap } from 'sugar-sdk';
|
|
3
|
-
import { ethers } from 'ethers';
|
|
4
|
-
import { executeFailSchema, executeSuccessSchema, precheckFailSchema, precheckSuccessSchema, abilityParamsSchema, DEFAULT_AERODROME_SWAP_SLIPPAGE, } from './schemas';
|
|
5
|
-
import { AbilityAction } from './types';
|
|
6
|
-
import { checkErc20Allowance, checkErc20Balance, checkNativeTokenBalance } from './ability-checks';
|
|
7
|
-
import { executeSwapParams, getChainConfig, getSwapVars } from 'sugar-sdk/primitives';
|
|
8
|
-
import { findSupportedTokenOnBase } from './ability-helpers/find-supported-token-on-base';
|
|
9
|
-
import { sendAerodromeSwapTx, sendErc20ApprovalTx } from './ability-helpers';
|
|
10
|
-
export const bigintReplacer = (key, value) => {
|
|
11
|
-
return typeof value === 'bigint' ? value.toString() : value;
|
|
12
|
-
};
|
|
13
|
-
export const sugarSdkQuoteBigintReviver = (key, value) => {
|
|
14
|
-
// Convert string values that were BigInts back to BigInt for the
|
|
15
|
-
// Sugar SDK Quote object:
|
|
16
|
-
// sugar-sdk/dist/primitives/externals/app/src/hooks/types.d.ts
|
|
17
|
-
if (typeof value === 'string' &&
|
|
18
|
-
(key === 'amount' ||
|
|
19
|
-
key === 'amountOut' ||
|
|
20
|
-
key === 'priceImpact' ||
|
|
21
|
-
key === 'balance' ||
|
|
22
|
-
key === 'price' ||
|
|
23
|
-
key === 'pool_fee' ||
|
|
24
|
-
key === 'balanceValue')) {
|
|
25
|
-
return BigInt(value);
|
|
26
|
-
}
|
|
27
|
-
return value;
|
|
28
|
-
};
|
|
29
|
-
export const vincentAbility = createVincentAbility({
|
|
30
|
-
packageName: '@lit-protocol/vincent-ability-aerodrome-swap',
|
|
31
|
-
abilityDescription: 'Ability to swap tokens on Aerodrome',
|
|
32
|
-
abilityParamsSchema,
|
|
33
|
-
supportedPolicies: supportedPoliciesForAbility([]),
|
|
34
|
-
precheckSuccessSchema,
|
|
35
|
-
precheckFailSchema,
|
|
36
|
-
executeSuccessSchema,
|
|
37
|
-
executeFailSchema,
|
|
38
|
-
precheck: async ({ abilityParams }, { succeed, fail, delegation: { delegatorPkpInfo } }) => {
|
|
39
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap precheck]', JSON.stringify(abilityParams, bigintReplacer, 2));
|
|
40
|
-
const { action, alchemyGasSponsor, rpcUrl, tokenInAddress, tokenOutAddress, amountIn } = abilityParams;
|
|
41
|
-
const provider = new ethers.providers.StaticJsonRpcProvider(rpcUrl);
|
|
42
|
-
const sugarConfigBaseMainnet = getDefaultConfig({
|
|
43
|
-
chains: [{ chain: base, rpcUrl }],
|
|
44
|
-
});
|
|
45
|
-
const sugarChainConfigBaseMainnet = getChainConfig(sugarConfigBaseMainnet.sugarConfig, base.id);
|
|
46
|
-
// 1. If alchemyGasSponsor is not enabled, we need to check if the delegator has a non-zero amount of native token balance to pay for gas fees
|
|
47
|
-
let checkNativeTokenBalanceResultSuccess;
|
|
48
|
-
if (!alchemyGasSponsor) {
|
|
49
|
-
const checkNativeTokenBalanceResult = await checkNativeTokenBalance({
|
|
50
|
-
provider,
|
|
51
|
-
pkpEthAddress: delegatorPkpInfo.ethAddress,
|
|
52
|
-
});
|
|
53
|
-
if (!checkNativeTokenBalanceResult.success) {
|
|
54
|
-
return fail({
|
|
55
|
-
reason: checkNativeTokenBalanceResult.reason,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
checkNativeTokenBalanceResultSuccess = checkNativeTokenBalanceResult;
|
|
59
|
-
}
|
|
60
|
-
// 2. Validate the input token is supported by Aerodrome on Base Mainnet
|
|
61
|
-
const sugarTokenIn = await findSupportedTokenOnBase({
|
|
62
|
-
config: sugarConfigBaseMainnet,
|
|
63
|
-
chainId: base.id,
|
|
64
|
-
tokenAddress: tokenInAddress,
|
|
65
|
-
});
|
|
66
|
-
if (!sugarTokenIn) {
|
|
67
|
-
return fail({
|
|
68
|
-
reason: `Token with address "${tokenInAddress}" not supported by Aerodrome on Base Mainnet`,
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
const requiredTokenInAmount = ethers.BigNumber.from(amountIn);
|
|
72
|
-
// 3. We retrieve the current allowance of the input token for the spender from the delegator
|
|
73
|
-
const checkErc20AllowanceResult = await checkErc20Allowance({
|
|
74
|
-
provider,
|
|
75
|
-
tokenAddress: sugarTokenIn.address,
|
|
76
|
-
owner: delegatorPkpInfo.ethAddress,
|
|
77
|
-
spender: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
78
|
-
requiredAllowance: requiredTokenInAmount,
|
|
79
|
-
});
|
|
80
|
-
// 4. If the ability action is approve, we return the current allowance since all
|
|
81
|
-
// precheck is concerned with is whether the delegatee can call execute with the approve ability action which just needs to know if
|
|
82
|
-
// the gas for the approval transaction can be paid for (whether by gas sponsorship, or by the delegator).
|
|
83
|
-
// We return the current allowance out of convenience, so the delegatee can know if
|
|
84
|
-
// the current allowance is sufficient without having to call execute.
|
|
85
|
-
if (action === AbilityAction.Approve) {
|
|
86
|
-
return succeed({
|
|
87
|
-
nativeTokenBalance: checkNativeTokenBalanceResultSuccess?.ethBalance.toString(),
|
|
88
|
-
currentTokenInAllowanceForSpender: checkErc20AllowanceResult.currentAllowance.toString(),
|
|
89
|
-
requiredTokenInAllowance: checkErc20AllowanceResult.requiredAllowance.toString(),
|
|
90
|
-
spenderAddress: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
// 5. If the ability action is swap, and the current allowance is insufficient, we return a failure
|
|
94
|
-
// because the swap cannot currently be performed.
|
|
95
|
-
if (action === AbilityAction.Swap && !checkErc20AllowanceResult.success) {
|
|
96
|
-
return fail({
|
|
97
|
-
reason: checkErc20AllowanceResult.reason,
|
|
98
|
-
spenderAddress: checkErc20AllowanceResult.spenderAddress,
|
|
99
|
-
tokenAddress: checkErc20AllowanceResult.tokenAddress,
|
|
100
|
-
requiredAllowance: checkErc20AllowanceResult.requiredAllowance.toString(),
|
|
101
|
-
currentAllowance: checkErc20AllowanceResult.currentAllowance.toString(),
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
// 6. At this point, the ability action is swap, and the current allowance is sufficient.
|
|
105
|
-
// We now need to check if the current delegator balance of tokenIn is sufficient to perform the swap.
|
|
106
|
-
const checkErc20BalanceResult = await checkErc20Balance({
|
|
107
|
-
provider,
|
|
108
|
-
pkpEthAddress: delegatorPkpInfo.ethAddress,
|
|
109
|
-
tokenAddress: sugarTokenIn.address,
|
|
110
|
-
requiredTokenAmount: requiredTokenInAmount,
|
|
111
|
-
});
|
|
112
|
-
if (!checkErc20BalanceResult.success) {
|
|
113
|
-
return fail({
|
|
114
|
-
reason: checkErc20BalanceResult.reason,
|
|
115
|
-
tokenAddress: checkErc20BalanceResult.tokenAddress,
|
|
116
|
-
requiredTokenAmount: checkErc20BalanceResult.requiredTokenAmount.toString(),
|
|
117
|
-
tokenBalance: checkErc20BalanceResult.tokenBalance.toString(),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
// 7. Validate the tokenOut is supported by Aerodrome on Base Mainnet
|
|
121
|
-
const sugarTokenOut = await findSupportedTokenOnBase({
|
|
122
|
-
config: sugarConfigBaseMainnet,
|
|
123
|
-
chainId: base.id,
|
|
124
|
-
tokenAddress: tokenOutAddress,
|
|
125
|
-
});
|
|
126
|
-
if (!sugarTokenOut) {
|
|
127
|
-
return fail({
|
|
128
|
-
reason: `Token with address "${tokenOutAddress}" not supported by Aerodrome on Base Mainnet`,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
// 8. Validate a swap quote can be generated for the desired swap tokens and amounts
|
|
132
|
-
const quote = await getQuoteForSwap({
|
|
133
|
-
config: sugarConfigBaseMainnet,
|
|
134
|
-
fromToken: sugarTokenIn,
|
|
135
|
-
toToken: sugarTokenOut,
|
|
136
|
-
amountIn: requiredTokenInAmount.toBigInt(),
|
|
137
|
-
});
|
|
138
|
-
if (quote === null) {
|
|
139
|
-
return fail({
|
|
140
|
-
reason: 'No Aerodrome swap quote available for the desired swap tokens and amounts',
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
// 9. Return success, we've validated:
|
|
144
|
-
// - Native token balance is non-zero or alchemyGasSponsor is enabled
|
|
145
|
-
// - TokenIn is supported by Aerodrome on Base Mainnet
|
|
146
|
-
// - Current allowance of tokenIn for the spender is sufficient
|
|
147
|
-
// - Delegator's balance of tokenIn is sufficient
|
|
148
|
-
// - TokenOut is supported by Aerodrome on Base Mainnet
|
|
149
|
-
// - Swap quote is available for the desired swap tokens and amounts
|
|
150
|
-
return succeed({
|
|
151
|
-
nativeTokenBalance: checkNativeTokenBalanceResultSuccess?.ethBalance.toString(),
|
|
152
|
-
tokenInAddress: sugarTokenIn.address,
|
|
153
|
-
tokenInBalance: checkErc20BalanceResult.tokenBalance.toString(),
|
|
154
|
-
currentTokenInAllowanceForSpender: checkErc20AllowanceResult.currentAllowance.toString(),
|
|
155
|
-
requiredTokenInAllowance: checkErc20AllowanceResult.requiredAllowance.toString(),
|
|
156
|
-
spenderAddress: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
157
|
-
quote: {
|
|
158
|
-
tokenInAmount: ethers.utils.formatUnits(quote.amount, sugarTokenIn.decimals),
|
|
159
|
-
tokenOutAmount: ethers.utils.formatUnits(quote.amountOut, sugarTokenOut.decimals),
|
|
160
|
-
priceImpact: quote.priceImpact.toString(),
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
},
|
|
164
|
-
execute: async ({ abilityParams }, { succeed, fail, delegation: { delegatorPkpInfo } }) => {
|
|
165
|
-
const { action, alchemyGasSponsor, alchemyGasSponsorApiKey, alchemyGasSponsorPolicyId, rpcUrl, tokenInAddress, tokenOutAddress, amountIn, slippage, gasBufferPercentage, baseFeePerGasBufferPercentage, } = abilityParams;
|
|
166
|
-
const SLIPPAGE = slippage ?? DEFAULT_AERODROME_SWAP_SLIPPAGE;
|
|
167
|
-
const provider = new ethers.providers.StaticJsonRpcProvider(rpcUrl);
|
|
168
|
-
const sugarConfigBaseMainnet = getDefaultConfig({
|
|
169
|
-
chains: [{ chain: base, rpcUrl }],
|
|
170
|
-
});
|
|
171
|
-
const sugarChainConfigBaseMainnet = getChainConfig(sugarConfigBaseMainnet.sugarConfig, base.id);
|
|
172
|
-
// 1. Get the Sugar Token for tokenIn
|
|
173
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting Sugar Token for tokenIn');
|
|
174
|
-
const sugarTokenIn = await findSupportedTokenOnBase({
|
|
175
|
-
config: sugarConfigBaseMainnet,
|
|
176
|
-
chainId: base.id,
|
|
177
|
-
tokenAddress: tokenInAddress,
|
|
178
|
-
});
|
|
179
|
-
if (!sugarTokenIn) {
|
|
180
|
-
return fail({
|
|
181
|
-
reason: `Token with address "${tokenInAddress}" not supported by Aerodrome on Base Mainnet`,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
const requiredTokenInAmount = ethers.BigNumber.from(amountIn);
|
|
185
|
-
// 2. If the ability action is approve, we return success if allowance is sufficient, otherwise we send a new approval transaction
|
|
186
|
-
let approvalTxHash;
|
|
187
|
-
let approvalTxUserOperationHash;
|
|
188
|
-
if (action === AbilityAction.Approve) {
|
|
189
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Checking if allowance is sufficient');
|
|
190
|
-
const checkErc20AllowanceResult = await checkErc20Allowance({
|
|
191
|
-
provider,
|
|
192
|
-
tokenAddress: sugarTokenIn.address,
|
|
193
|
-
owner: delegatorPkpInfo.ethAddress,
|
|
194
|
-
spender: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
195
|
-
requiredAllowance: requiredTokenInAmount,
|
|
196
|
-
});
|
|
197
|
-
if (checkErc20AllowanceResult.success) {
|
|
198
|
-
console.log(`Sufficient allowance already exists for spender ${sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS}, skipping approval transaction. Current allowance: ${ethers.utils.formatUnits(checkErc20AllowanceResult.currentAllowance, sugarTokenIn.decimals)}`);
|
|
199
|
-
// 2.1 Because the ability action is approve, we return success since the current allowance is sufficient,
|
|
200
|
-
// and a new approval transaction is not needed.
|
|
201
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Allowance is sufficient, returning success');
|
|
202
|
-
return succeed({
|
|
203
|
-
currentAllowance: checkErc20AllowanceResult.currentAllowance.toString(),
|
|
204
|
-
requiredAllowance: checkErc20AllowanceResult.requiredAllowance.toString(),
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
if (checkErc20AllowanceResult.reason.includes('insufficient ERC20 allowance for spender')) {
|
|
209
|
-
// 2.2 The current allowance is insufficient, so we need to send a new approval transaction
|
|
210
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Sending new approval transaction');
|
|
211
|
-
const txHash = await sendErc20ApprovalTx({
|
|
212
|
-
rpcUrl,
|
|
213
|
-
chainId: base.id,
|
|
214
|
-
pkpEthAddress: delegatorPkpInfo.ethAddress,
|
|
215
|
-
pkpPublicKey: delegatorPkpInfo.publicKey,
|
|
216
|
-
spenderAddress: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
217
|
-
allowanceAmount: requiredTokenInAmount.toString(),
|
|
218
|
-
erc20TokenAddress: sugarTokenIn.address,
|
|
219
|
-
alchemyGasSponsor,
|
|
220
|
-
alchemyGasSponsorApiKey,
|
|
221
|
-
alchemyGasSponsorPolicyId,
|
|
222
|
-
});
|
|
223
|
-
if (alchemyGasSponsor) {
|
|
224
|
-
approvalTxUserOperationHash = txHash;
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
approvalTxHash = txHash;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
// 2.3 Some error other than insufficient allowance occurred, bail out
|
|
232
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Some error other than insufficient allowance occurred, returning failure');
|
|
233
|
-
return fail({
|
|
234
|
-
reason: checkErc20AllowanceResult.reason,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
// 3. If the ability action is swap, perform the swap
|
|
240
|
-
let swapTxHash;
|
|
241
|
-
let swapTxUserOperationHash;
|
|
242
|
-
if (action === AbilityAction.Swap) {
|
|
243
|
-
// 3.1 Get the Sugar Token for tokenOut
|
|
244
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting Sugar Token for tokenOut');
|
|
245
|
-
const sugarTokenOut = await findSupportedTokenOnBase({
|
|
246
|
-
config: sugarConfigBaseMainnet,
|
|
247
|
-
chainId: base.id,
|
|
248
|
-
tokenAddress: tokenOutAddress,
|
|
249
|
-
});
|
|
250
|
-
if (!sugarTokenOut) {
|
|
251
|
-
return fail({
|
|
252
|
-
reason: `Token with address "${tokenOutAddress}" not supported by Aerodrome on Base Mainnet`,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
// 3.2 Get the swap quote
|
|
256
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting swap quote');
|
|
257
|
-
const quoteResponse = await Lit.Actions.runOnce({ waitForResponse: true, name: 'Aerodrome swap quote' }, async () => {
|
|
258
|
-
try {
|
|
259
|
-
const quote = await getQuoteForSwap({
|
|
260
|
-
config: sugarConfigBaseMainnet,
|
|
261
|
-
fromToken: sugarTokenIn,
|
|
262
|
-
toToken: sugarTokenOut,
|
|
263
|
-
amountIn: requiredTokenInAmount.toBigInt(),
|
|
264
|
-
});
|
|
265
|
-
if (quote === null) {
|
|
266
|
-
return JSON.stringify({
|
|
267
|
-
status: 'error',
|
|
268
|
-
error: 'No Aerodrome swap quote available for the desired swap tokens and amounts',
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
return JSON.stringify({
|
|
272
|
-
status: 'success',
|
|
273
|
-
quote,
|
|
274
|
-
}, bigintReplacer);
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
277
|
-
return JSON.stringify({
|
|
278
|
-
status: 'error',
|
|
279
|
-
error: error instanceof Error ? error.message : String(error),
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
const parsedQuoteResponse = JSON.parse(quoteResponse, sugarSdkQuoteBigintReviver);
|
|
284
|
-
if (parsedQuoteResponse.status === 'error') {
|
|
285
|
-
return fail({
|
|
286
|
-
reason: parsedQuoteResponse.error,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
const { quote } = parsedQuoteResponse;
|
|
290
|
-
// 3.3 Get the Sugar calldata for the swap quote
|
|
291
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting Sugar calldata for swap quote');
|
|
292
|
-
const sugarCallDataForSwap = await getCallDataForSwap({
|
|
293
|
-
config: sugarConfigBaseMainnet,
|
|
294
|
-
fromToken: quote.fromToken,
|
|
295
|
-
toToken: quote.toToken,
|
|
296
|
-
amountIn: requiredTokenInAmount.toBigInt(),
|
|
297
|
-
account: delegatorPkpInfo.ethAddress,
|
|
298
|
-
slippage: SLIPPAGE,
|
|
299
|
-
});
|
|
300
|
-
if (sugarCallDataForSwap === null) {
|
|
301
|
-
return fail({
|
|
302
|
-
reason: 'Unable to generate call data for the Aerodrome swap quote',
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
// 3.4 Get the Sugar swap vars for the swap quote
|
|
306
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting Sugar swap vars for swap quote');
|
|
307
|
-
const { chainId, planner, amount } = getSwapVars(sugarConfigBaseMainnet.sugarConfig, quote, `${Math.ceil(SLIPPAGE * 100)}`, delegatorPkpInfo.ethAddress);
|
|
308
|
-
// 3.5 Get the Sugar execute swap params for the swap quote
|
|
309
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Getting Sugar execute swap params for swap quote');
|
|
310
|
-
const sugarExecuteSwapParams = executeSwapParams({
|
|
311
|
-
config: sugarConfigBaseMainnet.sugarConfig,
|
|
312
|
-
chainId,
|
|
313
|
-
commands: planner.commands,
|
|
314
|
-
inputs: planner.inputs,
|
|
315
|
-
value: amount,
|
|
316
|
-
});
|
|
317
|
-
// 3.6 ABI encode the swap params for ethers calldata
|
|
318
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] ABI encoding swap params for ethers calldata');
|
|
319
|
-
const executeInterface = new ethers.utils.Interface(sugarExecuteSwapParams.abi);
|
|
320
|
-
const encodedCalldataForEthers = executeInterface.encodeFunctionData('execute(bytes,bytes[])', [planner.commands, planner.inputs]);
|
|
321
|
-
// 3.7 Send the swap transaction
|
|
322
|
-
console.log('[@lit-protocol/vincent-ability-aerodrome-swap execute] Sending swap transaction');
|
|
323
|
-
const txHash = await sendAerodromeSwapTx({
|
|
324
|
-
rpcUrl,
|
|
325
|
-
chainId: base.id,
|
|
326
|
-
pkpEthAddress: delegatorPkpInfo.ethAddress,
|
|
327
|
-
pkpPublicKey: delegatorPkpInfo.publicKey,
|
|
328
|
-
to: sugarChainConfigBaseMainnet.UNIVERSAL_ROUTER_ADDRESS,
|
|
329
|
-
value: amount.toString(),
|
|
330
|
-
calldata: encodedCalldataForEthers,
|
|
331
|
-
gasBufferPercentage,
|
|
332
|
-
baseFeePerGasBufferPercentage,
|
|
333
|
-
alchemyGasSponsor,
|
|
334
|
-
alchemyGasSponsorApiKey,
|
|
335
|
-
alchemyGasSponsorPolicyId,
|
|
336
|
-
});
|
|
337
|
-
if (alchemyGasSponsor) {
|
|
338
|
-
swapTxUserOperationHash = txHash;
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
swapTxHash = txHash;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
// 4. If the ability action is:
|
|
345
|
-
// - Approve, we return the approval transaction hash.
|
|
346
|
-
// - Swap, we return the swap transaction hash.
|
|
347
|
-
return succeed({
|
|
348
|
-
approvalTxHash,
|
|
349
|
-
approvalTxUserOperationHash,
|
|
350
|
-
swapTxHash,
|
|
351
|
-
swapTxUserOperationHash,
|
|
352
|
-
});
|
|
353
|
-
},
|
|
354
|
-
});
|
|
355
|
-
//# sourceMappingURL=vincent-ability.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vincent-ability.js","sourceRoot":"","sources":["../../../src/lib/vincent-ability.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|