@continuumdao/ctm-mpc-defi 0.2.62 → 0.2.63
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/dist/agent/catalog.cjs +328 -78
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +217 -27
- package/dist/agent/catalog.js +324 -79
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aerodrome/SKILL.md +8 -8
- package/dist/agent/skills/railgun/SKILL.md +10 -4
- package/dist/agent/skills/yield-compare/SKILL.md +5 -5
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +476 -282
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +38 -13
- package/dist/protocols/evm/aerodrome/index.js +473 -284
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +54 -6
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.js +54 -6
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +45 -10
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.d.ts +10 -2
- package/dist/protocols/evm/euler-v2/index.js +44 -11
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getAddress, zeroAddress, encodePacked, parseUnits, formatUnits, encodeFunctionData, defineChain, createPublicClient, http, parseGwei, serializeTransaction, keccak256 } from 'viem';
|
|
1
|
+
import { getAddress, zeroAddress, encodePacked, parseUnits, formatUnits, encodeFunctionData, defineChain, createPublicClient, encodeAbiParameters, http, parseGwei, serializeTransaction, keccak256 } from 'viem';
|
|
2
2
|
import { fetchChainFeeParams, gasLimitFromEstimateAndChainConfig, gweiToDecimalString, proposalTxParamsToFeeSnapshot, alignEip1559FeesWithLatestBase, getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk';
|
|
3
3
|
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -20,7 +20,11 @@ var init_expiry = __esm({
|
|
|
20
20
|
});
|
|
21
21
|
function isAerodromeChainSupported(chainId) {
|
|
22
22
|
const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
|
|
23
|
-
return n
|
|
23
|
+
return AERO_CHAIN_IDS.includes(n);
|
|
24
|
+
}
|
|
25
|
+
function aerodromeUnsupportedChainMessage(chainId) {
|
|
26
|
+
const listed = AERO_CHAIN_IDS.map((id) => `${AERO_CHAIN_LABEL[id]} ${id}`).join(", ");
|
|
27
|
+
return `Aero is not deployed on chain ${chainId}. Launch chains: ${listed}.`;
|
|
24
28
|
}
|
|
25
29
|
function aerodromeOnChainDeadlineUnix(expiryDate) {
|
|
26
30
|
if (typeof expiryDate === "number" && Number.isFinite(expiryDate) && expiryDate > 0) {
|
|
@@ -32,7 +36,7 @@ function requireAerodromeRpcUrl(rpcUrl) {
|
|
|
32
36
|
const url = (rpcUrl ?? "").trim();
|
|
33
37
|
if (!url) {
|
|
34
38
|
throw new Error(
|
|
35
|
-
"rpcUrl is required. The MCP server injects it from get_chain_registry rpcGateway \u2014 pass chainId 8453
|
|
39
|
+
"rpcUrl is required. The MCP server injects it from get_chain_registry rpcGateway \u2014 pass an Aero chainId (Base 8453, Ethereum 1, OP 10, Arbitrum 42161, Robinhood 4663, Arc 5042, Ink 57073). Do not pass a public RPC URL."
|
|
36
40
|
);
|
|
37
41
|
}
|
|
38
42
|
return url;
|
|
@@ -48,26 +52,27 @@ function isAerodromeNativeToken(address) {
|
|
|
48
52
|
return false;
|
|
49
53
|
}
|
|
50
54
|
}
|
|
51
|
-
var AERODROME_PROTOCOL_ID, AERODROME_CHAIN_ID, AERODROME_NATIVE_PLACEHOLDER, AERODROME_WETH_BASE, AERODROME_USDC_BASE;
|
|
55
|
+
var AERODROME_PROTOCOL_ID, AERODROME_CHAIN_ID, AERO_CHAIN_IDS, AERO_CHAIN_LABEL, AERODROME_NATIVE_PLACEHOLDER, AERODROME_WETH_BASE, AERODROME_USDC_BASE;
|
|
52
56
|
var init_support = __esm({
|
|
53
57
|
"src/protocols/evm/aerodrome/support.ts"() {
|
|
54
58
|
init_expiry();
|
|
55
59
|
AERODROME_PROTOCOL_ID = "aerodrome";
|
|
56
60
|
AERODROME_CHAIN_ID = 8453;
|
|
61
|
+
AERO_CHAIN_IDS = [8453, 1, 10, 42161, 4663, 5042, 57073];
|
|
62
|
+
AERO_CHAIN_LABEL = {
|
|
63
|
+
1: "Ethereum",
|
|
64
|
+
10: "OP Mainnet",
|
|
65
|
+
42161: "Arbitrum",
|
|
66
|
+
4663: "Robinhood Chain",
|
|
67
|
+
5042: "Arc",
|
|
68
|
+
8453: "Base",
|
|
69
|
+
57073: "Ink"
|
|
70
|
+
};
|
|
57
71
|
AERODROME_NATIVE_PLACEHOLDER = zeroAddress;
|
|
58
72
|
AERODROME_WETH_BASE = "0x4200000000000000000000000000000000000006";
|
|
59
73
|
AERODROME_USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
60
74
|
}
|
|
61
75
|
});
|
|
62
|
-
function asAddr(raw) {
|
|
63
|
-
const s = (raw ?? "").trim();
|
|
64
|
-
if (!s) return null;
|
|
65
|
-
try {
|
|
66
|
-
return getAddress(s.startsWith("0x") ? s : `0x${s}`);
|
|
67
|
-
} catch {
|
|
68
|
-
return null;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
76
|
function parseSugarBaseEnv(text) {
|
|
72
77
|
const out = {};
|
|
73
78
|
for (const line of text.split(/\r?\n/)) {
|
|
@@ -87,77 +92,99 @@ function parseSecurityMdxAddresses(text) {
|
|
|
87
92
|
let m;
|
|
88
93
|
while (m = re.exec(text)) {
|
|
89
94
|
const name = (m[1] ?? "").trim().toLowerCase().replace(/\s+/g, "");
|
|
90
|
-
const
|
|
91
|
-
if (name &&
|
|
95
|
+
const addr2 = m[2];
|
|
96
|
+
if (name && addr2 && !out[name]) out[name] = addr2;
|
|
92
97
|
}
|
|
93
98
|
return out;
|
|
94
99
|
}
|
|
95
|
-
function
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
100
|
+
function addr(raw) {
|
|
101
|
+
return getAddress(raw);
|
|
102
|
+
}
|
|
103
|
+
function aeroUsdcAddress(chainId) {
|
|
104
|
+
const raw = AERO_USDC_BY_CHAIN[chainId];
|
|
105
|
+
return raw ? addr(raw) : null;
|
|
99
106
|
}
|
|
100
|
-
function
|
|
101
|
-
|
|
107
|
+
function aeroWrappedNativeAddress(chainId) {
|
|
108
|
+
const raw = AERO_WETH_BY_CHAIN[chainId];
|
|
109
|
+
return raw ? addr(raw) : null;
|
|
110
|
+
}
|
|
111
|
+
function aeroRowIconAddresses(chainId) {
|
|
112
|
+
const out = [];
|
|
113
|
+
if (chainId === AERODROME_CHAIN_ID) {
|
|
114
|
+
out.push(addr(AERO_LEGACY_TOKEN_BASE), addr(AERO_TOKEN_BASE));
|
|
115
|
+
}
|
|
116
|
+
const receipt = AERO_RECEIPT_BY_CHAIN[chainId];
|
|
117
|
+
if (receipt) out.push(addr(receipt));
|
|
118
|
+
const weth = aeroWrappedNativeAddress(chainId);
|
|
119
|
+
if (weth) out.push(weth);
|
|
120
|
+
const usdc = aeroUsdcAddress(chainId);
|
|
121
|
+
if (usdc) out.push(usdc);
|
|
122
|
+
return out;
|
|
102
123
|
}
|
|
103
|
-
function
|
|
124
|
+
function aeroAddressesForChain(chainId) {
|
|
104
125
|
const fb = AERODROME_BASE_ADDRESSES_FALLBACK;
|
|
105
|
-
const
|
|
126
|
+
const cl = addr(AERO_CL_FACTORY_BY_CHAIN[chainId] ?? AERO_CL_FACTORY_BY_CHAIN[AERODROME_CHAIN_ID]);
|
|
127
|
+
const receipt = addr(AERO_RECEIPT_BY_CHAIN[chainId] ?? AERO_RECEIPT_BY_CHAIN[AERODROME_CHAIN_ID]);
|
|
128
|
+
const weth = aeroWrappedNativeAddress(chainId) ?? addr("0x0000000000000000000000000000000000000000");
|
|
129
|
+
const token = chainId === AERODROME_CHAIN_ID ? addr(AERO_TOKEN_BASE) : receipt;
|
|
106
130
|
return {
|
|
107
|
-
chainId
|
|
108
|
-
aero:
|
|
109
|
-
router:
|
|
110
|
-
poolFactory:
|
|
111
|
-
factoryRegistry:
|
|
112
|
-
voter:
|
|
113
|
-
votingEscrow:
|
|
114
|
-
rewardsDistributor:
|
|
115
|
-
mixedQuoter:
|
|
116
|
-
mixedQuoterV3:
|
|
117
|
-
nfpm:
|
|
118
|
-
clFactory:
|
|
119
|
-
clFactory2:
|
|
120
|
-
clFactory3:
|
|
121
|
-
universalRouter:
|
|
122
|
-
swapRouter:
|
|
123
|
-
swapRouter2:
|
|
124
|
-
swapRouter3:
|
|
125
|
-
pricesOracle:
|
|
126
|
-
slipstreamHelper:
|
|
127
|
-
lpSugar:
|
|
128
|
-
sugarSlipstreamHelper:
|
|
129
|
-
swapper:
|
|
130
|
-
weth
|
|
131
|
+
chainId,
|
|
132
|
+
aero: token,
|
|
133
|
+
router: chainId === AERODROME_CHAIN_ID ? addr(fb.router) : addr(AERO_METAROUTER),
|
|
134
|
+
poolFactory: addr(AERO_VOLATILE_POOL_FACTORY),
|
|
135
|
+
factoryRegistry: addr(AERO_FACTORY_REGISTRY_BY_CHAIN[chainId] ?? AERO_FACTORY_REGISTRY_BY_CHAIN[AERODROME_CHAIN_ID]),
|
|
136
|
+
voter: addr(AERO_LEAF_VOTER),
|
|
137
|
+
votingEscrow: addr("0xBF7977E1521e9a3032bf7243Ee4712f311f13915"),
|
|
138
|
+
rewardsDistributor: addr(fb.rewardsDistributor),
|
|
139
|
+
mixedQuoter: addr(AERO_METAQUOTER),
|
|
140
|
+
mixedQuoterV3: addr(AERO_METAQUOTER),
|
|
141
|
+
nfpm: addr(AERO_NFPM),
|
|
142
|
+
clFactory: cl,
|
|
143
|
+
clFactory2: cl,
|
|
144
|
+
clFactory3: cl,
|
|
145
|
+
universalRouter: addr(fb.universalRouter),
|
|
146
|
+
swapRouter: addr(AERO_SWAP_ROUTER),
|
|
147
|
+
swapRouter2: addr(AERO_SWAP_ROUTER),
|
|
148
|
+
swapRouter3: addr(AERO_SWAP_ROUTER),
|
|
149
|
+
pricesOracle: addr(fb.pricesOracle),
|
|
150
|
+
slipstreamHelper: addr(fb.slipstreamHelper),
|
|
151
|
+
lpSugar: chainId === AERODROME_CHAIN_ID ? addr(fb.lpSugar) : addr("0x0000000000000000000000000000000000000000"),
|
|
152
|
+
sugarSlipstreamHelper: addr(fb.sugarSlipstreamHelper),
|
|
153
|
+
swapper: addr(fb.swapper),
|
|
154
|
+
weth,
|
|
155
|
+
stablePoolFactory: addr(AERO_STABLE_POOL_FACTORY),
|
|
156
|
+
volatilePoolFactory: addr(AERO_VOLATILE_POOL_FACTORY),
|
|
157
|
+
metarouter: addr(AERO_METAROUTER),
|
|
158
|
+
metaquoter: addr(AERO_METAQUOTER),
|
|
159
|
+
receiptToken: receipt
|
|
131
160
|
};
|
|
132
161
|
}
|
|
133
|
-
async function
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (!res.ok) return null;
|
|
137
|
-
return await res.text();
|
|
138
|
-
} catch {
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
async function loadAerodromeAddresses() {
|
|
143
|
-
if (!cache) {
|
|
144
|
-
cache = (async () => {
|
|
145
|
-
const [sugarText, docsText] = await Promise.all([fetchText(SUGAR_ENV_URL), fetchText(SECURITY_MDX_URL)]);
|
|
146
|
-
const sugar = sugarText ? parseSugarBaseEnv(sugarText) : {};
|
|
147
|
-
const docs = docsText ? parseSecurityMdxAddresses(docsText) : {};
|
|
148
|
-
return mergeLoaded(sugar, docs);
|
|
149
|
-
})();
|
|
162
|
+
async function loadAerodromeAddresses(chainId = AERODROME_CHAIN_ID) {
|
|
163
|
+
if (!isAerodromeChainSupported(chainId)) {
|
|
164
|
+
throw new Error(aerodromeUnsupportedChainMessage(chainId));
|
|
150
165
|
}
|
|
151
|
-
|
|
166
|
+
const cached = cache.get(chainId);
|
|
167
|
+
if (cached) return cached;
|
|
168
|
+
const addrs = aeroAddressesForChain(chainId);
|
|
169
|
+
cache.set(chainId, addrs);
|
|
170
|
+
return addrs;
|
|
152
171
|
}
|
|
153
172
|
function resetAerodromeAddressCache() {
|
|
154
|
-
cache =
|
|
173
|
+
cache = /* @__PURE__ */ new Map();
|
|
155
174
|
}
|
|
156
175
|
function aerodromeFallbackAddresses() {
|
|
157
|
-
return
|
|
176
|
+
return aeroAddressesForChain(AERODROME_CHAIN_ID);
|
|
158
177
|
}
|
|
159
178
|
function aerodromeClFactoryList(addrs) {
|
|
160
|
-
|
|
179
|
+
const out = [];
|
|
180
|
+
const seen = /* @__PURE__ */ new Set();
|
|
181
|
+
for (const factory of [addrs.clFactory, addrs.clFactory2, addrs.clFactory3]) {
|
|
182
|
+
const key = factory.toLowerCase();
|
|
183
|
+
if (seen.has(key)) continue;
|
|
184
|
+
seen.add(key);
|
|
185
|
+
out.push(factory);
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
161
188
|
}
|
|
162
189
|
function aerodromeClSwapRouterForFactory(addrs, factory) {
|
|
163
190
|
const f = getAddress(factory).toLowerCase();
|
|
@@ -165,7 +192,7 @@ function aerodromeClSwapRouterForFactory(addrs, factory) {
|
|
|
165
192
|
if (f === addrs.clFactory2.toLowerCase()) return addrs.swapRouter2;
|
|
166
193
|
return addrs.swapRouter;
|
|
167
194
|
}
|
|
168
|
-
var AERODROME_BASE_ADDRESSES_FALLBACK,
|
|
195
|
+
var AERODROME_BASE_ADDRESSES_FALLBACK, AERO_TOKEN_BASE, AERO_LEGACY_TOKEN_BASE, AERO_METAROUTER, AERO_METAQUOTER, AERO_STABLE_POOL_FACTORY, AERO_VOLATILE_POOL_FACTORY, AERO_NFPM, AERO_SWAP_ROUTER, AERO_LEAF_VOTER, AERO_RECEIPT_BY_CHAIN, AERO_FACTORY_REGISTRY_BY_CHAIN, AERO_CL_FACTORY_BY_CHAIN, OP_STACK_WETH, AERO_WETH_BY_CHAIN, AERO_USDC_BY_CHAIN, cache;
|
|
169
196
|
var init_addresses = __esm({
|
|
170
197
|
"src/protocols/evm/aerodrome/addresses.ts"() {
|
|
171
198
|
init_support();
|
|
@@ -199,9 +226,58 @@ var init_addresses = __esm({
|
|
|
199
226
|
swapper: "0x91616a7B9CF6D23f8C17845581051EBdC4BcB916",
|
|
200
227
|
weth: AERODROME_WETH_BASE
|
|
201
228
|
};
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
229
|
+
AERO_TOKEN_BASE = "0x3f5bF3EdAc59d650D8fDf9657a71F2f904A3a4Ee";
|
|
230
|
+
AERO_LEGACY_TOKEN_BASE = "0x940181a94A35A4569E4529A3CDfB74e38FD98631";
|
|
231
|
+
AERO_METAROUTER = "0x0fEf9e88A7b76BCDBF451780C6774FE32965Ee98";
|
|
232
|
+
AERO_METAQUOTER = "0x1dDfeC5058180C207F55BB77D95AcDd0d8227868";
|
|
233
|
+
AERO_STABLE_POOL_FACTORY = "0x78589E876edcEbdce72ee3436ab3c9AD3a7cEF2D";
|
|
234
|
+
AERO_VOLATILE_POOL_FACTORY = "0x8E6a9FCd1d638CC760Ffba397605Fe3355dE76D2";
|
|
235
|
+
AERO_NFPM = "0x4857DB576eE0e45F10525eC59527BfD10beeC60b";
|
|
236
|
+
AERO_SWAP_ROUTER = "0x9Ee35Bf1bd69a03c6F0393582030fCe8Bb93D418";
|
|
237
|
+
AERO_LEAF_VOTER = "0x382409fad8503FbCdbB27A4211551fa03e884078";
|
|
238
|
+
AERO_RECEIPT_BY_CHAIN = {
|
|
239
|
+
8453: "0x6CdDa0E730744DC6fF67654B35350Adad05EceE7",
|
|
240
|
+
10: "0xbdEaeA5205d16f34Cb40038052d91235D87B4C54",
|
|
241
|
+
42161: "0x436a085B2751cB87db270FFa66f8d698F87bEC82",
|
|
242
|
+
1: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
|
|
243
|
+
57073: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
|
|
244
|
+
4663: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
|
|
245
|
+
5042: "0x20077cC0d5E385A0Fe9C91bbC7DC744f51559307"
|
|
246
|
+
};
|
|
247
|
+
AERO_FACTORY_REGISTRY_BY_CHAIN = {
|
|
248
|
+
8453: "0x7b2A2c12dC5Ea2a31455952a05031C3E4BB28F3E",
|
|
249
|
+
10: "0xb6F9705A631CC1C0E8570FFde48882C95E2Df408",
|
|
250
|
+
42161: "0x9E635b2c689fC52201DF7eF1C9FA607c2F58f666",
|
|
251
|
+
1: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
|
|
252
|
+
57073: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
|
|
253
|
+
4663: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
|
|
254
|
+
5042: "0xCe44907DC45D3BFa3f5f6035B0e6E8B22D780A42"
|
|
255
|
+
};
|
|
256
|
+
AERO_CL_FACTORY_BY_CHAIN = {
|
|
257
|
+
8453: "0x9CB220581b91b0C83223012FE69688b92aD07a76",
|
|
258
|
+
10: "0xfeaB42D90055db3a0616249f76B6002D72266778",
|
|
259
|
+
42161: "0x88a60ee77392577c355C0acb2A8d476D5a4EC03a",
|
|
260
|
+
1: "0xF4Fd2E6c5B60c5b365cd1B96DD6245E6D60414c2",
|
|
261
|
+
57073: "0x7660BF2aDefC687C22906112ca323d60A00358cF",
|
|
262
|
+
4663: "0xc63d7338c178e805c544B8f897066bD3BBcBE136",
|
|
263
|
+
5042: "0x7F83235643181E440433400a027618Cd50879751"
|
|
264
|
+
};
|
|
265
|
+
OP_STACK_WETH = "0x4200000000000000000000000000000000000006";
|
|
266
|
+
AERO_WETH_BY_CHAIN = {
|
|
267
|
+
1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
|
268
|
+
10: OP_STACK_WETH,
|
|
269
|
+
42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
|
|
270
|
+
8453: OP_STACK_WETH,
|
|
271
|
+
57073: OP_STACK_WETH,
|
|
272
|
+
4663: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"
|
|
273
|
+
};
|
|
274
|
+
AERO_USDC_BY_CHAIN = {
|
|
275
|
+
1: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
276
|
+
10: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
|
|
277
|
+
42161: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
278
|
+
8453: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
|
|
279
|
+
};
|
|
280
|
+
cache = /* @__PURE__ */ new Map();
|
|
205
281
|
}
|
|
206
282
|
});
|
|
207
283
|
function isCoinbaseB20AssetToken(address) {
|
|
@@ -328,7 +404,7 @@ var init_coinbaseB20 = __esm({
|
|
|
328
404
|
});
|
|
329
405
|
|
|
330
406
|
// src/protocols/evm/aerodrome/abi.ts
|
|
331
|
-
var lpSugarAbi, routerAbi, mixedQuoterAbi, mixedQuoterV3Abi,
|
|
407
|
+
var lpSugarAbi, routerAbi, mixedQuoterAbi, mixedQuoterV3Abi, aeroV2FactoryAbi, aeroPoolAmountOutAbi, aeroMetarouterAbi, clPoolFactoryAbi, clPoolAbi, sugarHelperAbi, nfpmAbi, clSwapRouterAbi, poolClaimFeesAbi, gaugeAbi, clGaugeAbi, aerodromePoolMetaAbi, aerodromeVoterAbi, erc20Abi;
|
|
332
408
|
var init_abi = __esm({
|
|
333
409
|
"src/protocols/evm/aerodrome/abi.ts"() {
|
|
334
410
|
lpSugarAbi = [
|
|
@@ -762,19 +838,42 @@ var init_abi = __esm({
|
|
|
762
838
|
]
|
|
763
839
|
}
|
|
764
840
|
];
|
|
765
|
-
|
|
841
|
+
aeroV2FactoryAbi = [
|
|
766
842
|
{
|
|
767
843
|
type: "function",
|
|
768
844
|
name: "getPool",
|
|
769
845
|
stateMutability: "view",
|
|
770
846
|
inputs: [
|
|
771
847
|
{ name: "tokenA", type: "address" },
|
|
772
|
-
{ name: "tokenB", type: "address" }
|
|
773
|
-
{ name: "stable", type: "bool" }
|
|
848
|
+
{ name: "tokenB", type: "address" }
|
|
774
849
|
],
|
|
775
850
|
outputs: [{ name: "", type: "address" }]
|
|
776
851
|
}
|
|
777
852
|
];
|
|
853
|
+
aeroPoolAmountOutAbi = [
|
|
854
|
+
{
|
|
855
|
+
type: "function",
|
|
856
|
+
name: "getAmountOut",
|
|
857
|
+
stateMutability: "view",
|
|
858
|
+
inputs: [
|
|
859
|
+
{ name: "amountIn", type: "uint256" },
|
|
860
|
+
{ name: "tokenIn", type: "address" }
|
|
861
|
+
],
|
|
862
|
+
outputs: [{ name: "", type: "uint256" }]
|
|
863
|
+
}
|
|
864
|
+
];
|
|
865
|
+
aeroMetarouterAbi = [
|
|
866
|
+
{
|
|
867
|
+
type: "function",
|
|
868
|
+
name: "execute",
|
|
869
|
+
stateMutability: "payable",
|
|
870
|
+
inputs: [
|
|
871
|
+
{ name: "commands", type: "bytes" },
|
|
872
|
+
{ name: "inputs", type: "bytes[]" }
|
|
873
|
+
],
|
|
874
|
+
outputs: []
|
|
875
|
+
}
|
|
876
|
+
];
|
|
778
877
|
clPoolFactoryAbi = [
|
|
779
878
|
{
|
|
780
879
|
type: "function",
|
|
@@ -1355,8 +1454,8 @@ var init_stockTokens = __esm({
|
|
|
1355
1454
|
MAX_OFFICIAL_STOCKS = 40;
|
|
1356
1455
|
}
|
|
1357
1456
|
});
|
|
1358
|
-
function checksum(
|
|
1359
|
-
return getAddress(
|
|
1457
|
+
function checksum(addr2) {
|
|
1458
|
+
return getAddress(addr2);
|
|
1360
1459
|
}
|
|
1361
1460
|
function pairKey(a, b) {
|
|
1362
1461
|
const [x, y] = [a.toLowerCase(), b.toLowerCase()].sort();
|
|
@@ -1398,7 +1497,8 @@ async function tickSpacingsForFactory(rpcUrl, factory) {
|
|
|
1398
1497
|
}
|
|
1399
1498
|
async function aerodromeDiscoverConnectorPools(args) {
|
|
1400
1499
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1401
|
-
const
|
|
1500
|
+
const usdc = aeroUsdcAddress(args.addrs.chainId);
|
|
1501
|
+
const connectors = [args.addrs.weth, ...usdc ? [usdc] : [], args.addrs.aero];
|
|
1402
1502
|
const pairs = connectorPairs(args.tokenIn, args.tokenOut, connectors);
|
|
1403
1503
|
const clFactories = aerodromeClFactoryList(args.addrs);
|
|
1404
1504
|
const spacingsByFactory = await Promise.all(
|
|
@@ -1418,10 +1518,10 @@ async function aerodromeDiscoverConnectorPools(args) {
|
|
|
1418
1518
|
allowFailure: true,
|
|
1419
1519
|
contracts: jobs.map(
|
|
1420
1520
|
(job) => job.kind === "v2" ? {
|
|
1421
|
-
address: args.addrs.
|
|
1422
|
-
abi:
|
|
1521
|
+
address: job.stable ? args.addrs.stablePoolFactory : args.addrs.volatilePoolFactory,
|
|
1522
|
+
abi: aeroV2FactoryAbi,
|
|
1423
1523
|
functionName: "getPool",
|
|
1424
|
-
args: [job.tokenA, job.tokenB
|
|
1524
|
+
args: [job.tokenA, job.tokenB]
|
|
1425
1525
|
} : {
|
|
1426
1526
|
address: job.factory,
|
|
1427
1527
|
abi: clPoolFactoryAbi,
|
|
@@ -1449,7 +1549,7 @@ async function aerodromeDiscoverConnectorPools(args) {
|
|
|
1449
1549
|
type: job.stable ? 0 : -1,
|
|
1450
1550
|
token0: checksum(token0),
|
|
1451
1551
|
token1: checksum(token1),
|
|
1452
|
-
factory: args.addrs.
|
|
1552
|
+
factory: job.stable ? args.addrs.stablePoolFactory : args.addrs.volatilePoolFactory,
|
|
1453
1553
|
poolFee: "0",
|
|
1454
1554
|
kind: job.stable ? "stable" : "volatile"
|
|
1455
1555
|
});
|
|
@@ -1468,11 +1568,11 @@ async function aerodromeDiscoverConnectorPools(args) {
|
|
|
1468
1568
|
return pools;
|
|
1469
1569
|
}
|
|
1470
1570
|
async function aerodromeDiscoverConnectorPoolsLoaded(args) {
|
|
1471
|
-
const addrs = await loadAerodromeAddresses();
|
|
1571
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1472
1572
|
return aerodromeDiscoverConnectorPools({ ...args, addrs });
|
|
1473
1573
|
}
|
|
1474
1574
|
async function aerodromeDiscoverDirectPools(args) {
|
|
1475
|
-
const addrs = await loadAerodromeAddresses();
|
|
1575
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1476
1576
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1477
1577
|
const tokenA = checksum(args.tokenA);
|
|
1478
1578
|
const tokenB = checksum(args.tokenB);
|
|
@@ -1491,10 +1591,10 @@ async function aerodromeDiscoverDirectPools(args) {
|
|
|
1491
1591
|
allowFailure: true,
|
|
1492
1592
|
contracts: jobs.map(
|
|
1493
1593
|
(job) => job.kind === "v2" ? {
|
|
1494
|
-
address: addrs.
|
|
1495
|
-
abi:
|
|
1594
|
+
address: job.stable ? addrs.stablePoolFactory : addrs.volatilePoolFactory,
|
|
1595
|
+
abi: aeroV2FactoryAbi,
|
|
1496
1596
|
functionName: "getPool",
|
|
1497
|
-
args: [tokenA, tokenB
|
|
1597
|
+
args: [tokenA, tokenB]
|
|
1498
1598
|
} : {
|
|
1499
1599
|
address: job.factory,
|
|
1500
1600
|
abi: clPoolFactoryAbi,
|
|
@@ -1522,7 +1622,7 @@ async function aerodromeDiscoverDirectPools(args) {
|
|
|
1522
1622
|
type: job.stable ? 0 : -1,
|
|
1523
1623
|
token0,
|
|
1524
1624
|
token1,
|
|
1525
|
-
factory: addrs.
|
|
1625
|
+
factory: job.stable ? addrs.stablePoolFactory : addrs.volatilePoolFactory,
|
|
1526
1626
|
poolFee: "0",
|
|
1527
1627
|
kind: job.stable ? "stable" : "volatile"
|
|
1528
1628
|
});
|
|
@@ -1546,10 +1646,10 @@ function tokenLabel(raw, resolved, isNative) {
|
|
|
1546
1646
|
}
|
|
1547
1647
|
async function aerodromeDiscoverPoolsSummary(args) {
|
|
1548
1648
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1549
|
-
throw new Error(
|
|
1649
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1550
1650
|
}
|
|
1551
1651
|
const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
|
|
1552
|
-
const addrs = await loadAerodromeAddresses();
|
|
1652
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1553
1653
|
await ensureAerodromeStockTickers([args.token, args.tokenOut ?? ""]);
|
|
1554
1654
|
const isNative = isAerodromeNativeToken(args.token);
|
|
1555
1655
|
const token = resolveAerodromeErc20OrWeth(args.token, addrs.weth);
|
|
@@ -1565,7 +1665,7 @@ async function aerodromeDiscoverPoolsSummary(args) {
|
|
|
1565
1665
|
const inLabel = tokenLabel(args.token, token, isNative);
|
|
1566
1666
|
const outLabel = tokenLabel(counterpartRaw, tokenOut, isNativeOut);
|
|
1567
1667
|
return {
|
|
1568
|
-
chainId:
|
|
1668
|
+
chainId: args.chainId,
|
|
1569
1669
|
token: {
|
|
1570
1670
|
address: isNative ? zeroAddress : token,
|
|
1571
1671
|
symbol: inLabel,
|
|
@@ -1632,7 +1732,8 @@ function isMainPair(token0, token1, aero) {
|
|
|
1632
1732
|
return mains.has(token0.toLowerCase()) && mains.has(token1.toLowerCase());
|
|
1633
1733
|
}
|
|
1634
1734
|
async function fetchSugarYieldPage(args) {
|
|
1635
|
-
const addrs = await loadAerodromeAddresses();
|
|
1735
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1736
|
+
if (addrs.lpSugar === zeroAddress) return [];
|
|
1636
1737
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1637
1738
|
const rows = await client.readContract({
|
|
1638
1739
|
address: addrs.lpSugar,
|
|
@@ -1722,10 +1823,10 @@ function rankAndCap(rows, query) {
|
|
|
1722
1823
|
filtered.sort((a, b) => (b.tvlUsd ?? 0) - (a.tvlUsd ?? 0));
|
|
1723
1824
|
return filtered.slice(0, AERODROME_IMPORTANT_POOL_CAP);
|
|
1724
1825
|
}
|
|
1725
|
-
async function scanSugarTop(rpcUrl) {
|
|
1826
|
+
async function scanSugarTop(chainId, rpcUrl) {
|
|
1726
1827
|
const pages = [];
|
|
1727
1828
|
for (let i = 0; i < SUGAR_SCAN_PAGES; i++) {
|
|
1728
|
-
const page = await fetchSugarYieldPage({ rpcUrl, limit: SUGAR_PAGE, offset: i * SUGAR_PAGE });
|
|
1829
|
+
const page = await fetchSugarYieldPage({ chainId, rpcUrl, limit: SUGAR_PAGE, offset: i * SUGAR_PAGE });
|
|
1729
1830
|
pages.push(page);
|
|
1730
1831
|
if (page.length < SUGAR_PAGE) break;
|
|
1731
1832
|
}
|
|
@@ -1733,24 +1834,25 @@ async function scanSugarTop(rpcUrl) {
|
|
|
1733
1834
|
}
|
|
1734
1835
|
async function aerodromeFetchImportantPoolsSummary(args) {
|
|
1735
1836
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1736
|
-
throw new Error(
|
|
1837
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1737
1838
|
}
|
|
1738
|
-
const addrs = await loadAerodromeAddresses();
|
|
1739
|
-
const scanned = await scanSugarTop(args.rpcUrl);
|
|
1839
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1840
|
+
const scanned = await scanSugarTop(args.chainId, args.rpcUrl);
|
|
1740
1841
|
const aeroUsd = aeroUsdPriceFromRows(scanned, addrs.aero);
|
|
1741
1842
|
const main = scanned.filter((r) => isMainPair(r.token0, r.token1, addrs.aero));
|
|
1742
1843
|
const pools = rankAndCap(main.map((r) => toYieldRow(r, aeroUsd)), args.query);
|
|
1743
1844
|
return {
|
|
1744
|
-
chainId:
|
|
1845
|
+
chainId: args.chainId,
|
|
1745
1846
|
pools,
|
|
1746
|
-
notes: `At most ${AERODROME_IMPORTANT_POOL_CAP} important
|
|
1847
|
+
notes: `At most ${AERODROME_IMPORTANT_POOL_CAP} important pairs (ETH/WETH, USDC, AERO, major stables), TVL-ranked from the Base LpSugar index. feeApr is omitted. emissionsApr uses on-chain AERO/USDC when priced. Other Aero chains have no Sugar index, so this list is empty there \u2014 use ctm_aerodrome_discover_pools for a pair. AERO rewards on those chains are sAERO allocation, not a Sugar emissions APR.`
|
|
1747
1848
|
};
|
|
1748
1849
|
}
|
|
1749
1850
|
async function aerodromeFetchLpYieldsSummary(args) {
|
|
1750
1851
|
return aerodromeFetchImportantPoolsSummary(args);
|
|
1751
1852
|
}
|
|
1752
|
-
async function fetchSugarByAddress(rpcUrl, lp) {
|
|
1753
|
-
const addrs = await loadAerodromeAddresses();
|
|
1853
|
+
async function fetchSugarByAddress(chainId, rpcUrl, lp) {
|
|
1854
|
+
const addrs = await loadAerodromeAddresses(chainId);
|
|
1855
|
+
if (addrs.lpSugar === zeroAddress) return null;
|
|
1754
1856
|
const client = aerodromePublicClient(rpcUrl);
|
|
1755
1857
|
try {
|
|
1756
1858
|
const p = await client.readContract({
|
|
@@ -1778,27 +1880,30 @@ async function fetchSugarByAddress(rpcUrl, lp) {
|
|
|
1778
1880
|
return null;
|
|
1779
1881
|
}
|
|
1780
1882
|
}
|
|
1781
|
-
function resolveYieldToken(
|
|
1782
|
-
if (isAerodromeNativeToken(
|
|
1783
|
-
return getAddress(
|
|
1883
|
+
function resolveYieldToken(addr2, weth) {
|
|
1884
|
+
if (isAerodromeNativeToken(addr2)) return getAddress(weth);
|
|
1885
|
+
return getAddress(addr2);
|
|
1784
1886
|
}
|
|
1785
|
-
async function aeroUsdFromUsdcPool(rpcUrl, aero) {
|
|
1887
|
+
async function aeroUsdFromUsdcPool(chainId, rpcUrl, aero) {
|
|
1888
|
+
const usdc = aeroUsdcAddress(chainId);
|
|
1889
|
+
if (!usdc) return null;
|
|
1786
1890
|
const aeroUsdc = await aerodromeDiscoverDirectPools({
|
|
1891
|
+
chainId,
|
|
1787
1892
|
rpcUrl,
|
|
1788
1893
|
tokenA: getAddress(aero),
|
|
1789
|
-
tokenB:
|
|
1894
|
+
tokenB: usdc
|
|
1790
1895
|
});
|
|
1791
1896
|
const prefer = aeroUsdc.find((p) => p.kind === "volatile") ?? aeroUsdc[0];
|
|
1792
1897
|
if (!prefer) return null;
|
|
1793
|
-
const raw = await fetchSugarByAddress(rpcUrl, prefer.lp);
|
|
1898
|
+
const raw = await fetchSugarByAddress(chainId, rpcUrl, prefer.lp);
|
|
1794
1899
|
return raw ? aeroUsdPriceFromRows([raw], aero) : null;
|
|
1795
1900
|
}
|
|
1796
1901
|
async function aerodromeFetchLpYieldsForPools(args) {
|
|
1797
1902
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1798
|
-
throw new Error(
|
|
1903
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1799
1904
|
}
|
|
1800
|
-
const addrs = await loadAerodromeAddresses();
|
|
1801
|
-
const aeroUsd = await aeroUsdFromUsdcPool(args.rpcUrl, addrs.aero);
|
|
1905
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1906
|
+
const aeroUsd = await aeroUsdFromUsdcPool(args.chainId, args.rpcUrl, addrs.aero);
|
|
1802
1907
|
const seen = /* @__PURE__ */ new Set();
|
|
1803
1908
|
const pools = [];
|
|
1804
1909
|
for (const rawLp of args.lps) {
|
|
@@ -1810,24 +1915,24 @@ async function aerodromeFetchLpYieldsForPools(args) {
|
|
|
1810
1915
|
}
|
|
1811
1916
|
if (lp === zeroAddress || seen.has(lp.toLowerCase())) continue;
|
|
1812
1917
|
seen.add(lp.toLowerCase());
|
|
1813
|
-
const raw = await fetchSugarByAddress(args.rpcUrl, lp);
|
|
1918
|
+
const raw = await fetchSugarByAddress(args.chainId, args.rpcUrl, lp);
|
|
1814
1919
|
if (raw) pools.push(toYieldRow(raw, aeroUsd));
|
|
1815
1920
|
}
|
|
1816
1921
|
return {
|
|
1817
|
-
chainId:
|
|
1922
|
+
chainId: args.chainId,
|
|
1818
1923
|
pools,
|
|
1819
1924
|
notes: "Same Sugar emissions formula as fetch_lp_yields (AERO/USDC priced). feeApr is omitted (Sugar has fee tier, not volume)."
|
|
1820
1925
|
};
|
|
1821
1926
|
}
|
|
1822
1927
|
async function aerodromeFetchLpYieldsForPair(args) {
|
|
1823
1928
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1824
|
-
throw new Error(
|
|
1929
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1825
1930
|
}
|
|
1826
|
-
const addrs = await loadAerodromeAddresses();
|
|
1931
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1827
1932
|
const tokenA = resolveYieldToken(args.tokenA, addrs.weth);
|
|
1828
1933
|
const tokenB = resolveYieldToken(args.tokenB, addrs.weth);
|
|
1829
1934
|
if (tokenA.toLowerCase() === tokenB.toLowerCase()) {
|
|
1830
|
-
return { chainId:
|
|
1935
|
+
return { chainId: args.chainId, pools: [], notes: "Pair tokens must differ." };
|
|
1831
1936
|
}
|
|
1832
1937
|
const discovered = await aerodromeDiscoverDirectPools({ rpcUrl: args.rpcUrl, tokenA, tokenB });
|
|
1833
1938
|
return aerodromeFetchLpYieldsForPools({
|
|
@@ -1837,16 +1942,16 @@ async function aerodromeFetchLpYieldsForPair(args) {
|
|
|
1837
1942
|
});
|
|
1838
1943
|
}
|
|
1839
1944
|
async function aerodromeFetchStockLpYieldsSummary(args) {
|
|
1840
|
-
if (
|
|
1841
|
-
throw new Error(
|
|
1945
|
+
if (args.chainId !== 8453) {
|
|
1946
|
+
throw new Error("Aero stock LP yields are Base (8453) only.");
|
|
1842
1947
|
}
|
|
1843
|
-
const addrs = await loadAerodromeAddresses();
|
|
1844
|
-
const scanned = await scanSugarTop(args.rpcUrl);
|
|
1948
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
1949
|
+
const scanned = await scanSugarTop(args.chainId, args.rpcUrl);
|
|
1845
1950
|
const aeroUsd = aeroUsdPriceFromRows(scanned, addrs.aero);
|
|
1846
1951
|
const stock = scanned.filter((r) => isCoinbaseB20AssetToken(r.token0) || isCoinbaseB20AssetToken(r.token1));
|
|
1847
1952
|
const pools = rankAndCap(stock.map((r) => toYieldRow(r, aeroUsd)), args.query);
|
|
1848
1953
|
return {
|
|
1849
|
-
chainId:
|
|
1954
|
+
chainId: args.chainId,
|
|
1850
1955
|
pools,
|
|
1851
1956
|
notes: "Coinbase B20 stock LP yields only (typically STOCK/USDC Slipstream). Separate from main-pair fetch_lp_yields. HIP-3 / Arcus stock trading is not this list."
|
|
1852
1957
|
};
|
|
@@ -1920,9 +2025,10 @@ async function paginate(pageSize, maxPages, readPage) {
|
|
|
1920
2025
|
}
|
|
1921
2026
|
async function aerodromeFetchListedTokens(args) {
|
|
1922
2027
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1923
|
-
throw new Error(
|
|
2028
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1924
2029
|
}
|
|
1925
|
-
const addrs = await loadAerodromeAddresses();
|
|
2030
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2031
|
+
if (addrs.lpSugar === zeroAddress) return [];
|
|
1926
2032
|
await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
1927
2033
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1928
2034
|
const account = args.account?.trim() ? getAddress(args.account) : zeroAddress;
|
|
@@ -1963,9 +2069,10 @@ async function aerodromeFetchListedTokens(args) {
|
|
|
1963
2069
|
}
|
|
1964
2070
|
async function aerodromeFetchSwapPools(args) {
|
|
1965
2071
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1966
|
-
throw new Error(
|
|
2072
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1967
2073
|
}
|
|
1968
|
-
const addrs = await loadAerodromeAddresses();
|
|
2074
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2075
|
+
if (addrs.lpSugar === zeroAddress) return [];
|
|
1969
2076
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1970
2077
|
const rows = await paginate(
|
|
1971
2078
|
200,
|
|
@@ -1989,9 +2096,10 @@ async function aerodromeFetchSwapPools(args) {
|
|
|
1989
2096
|
}
|
|
1990
2097
|
async function aerodromeFetchPools(args) {
|
|
1991
2098
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
1992
|
-
throw new Error(
|
|
2099
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
1993
2100
|
}
|
|
1994
|
-
const addrs = await loadAerodromeAddresses();
|
|
2101
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2102
|
+
if (addrs.lpSugar === zeroAddress) return [];
|
|
1995
2103
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
1996
2104
|
const limit = BigInt(args.limit ?? 50);
|
|
1997
2105
|
const offset = BigInt(args.offset ?? 0);
|
|
@@ -2020,9 +2128,10 @@ function mapSugarLp(p) {
|
|
|
2020
2128
|
}
|
|
2021
2129
|
async function aerodromeFetchPoolsByAddress(args) {
|
|
2022
2130
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
2023
|
-
throw new Error(
|
|
2131
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
2024
2132
|
}
|
|
2025
|
-
const addrs = await loadAerodromeAddresses();
|
|
2133
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2134
|
+
if (addrs.lpSugar === zeroAddress) return /* @__PURE__ */ new Map();
|
|
2026
2135
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
2027
2136
|
const unique = [];
|
|
2028
2137
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -2110,9 +2219,10 @@ async function aerodromeFetchPoolsByAddress(args) {
|
|
|
2110
2219
|
}
|
|
2111
2220
|
async function aerodromeFetchPositions(args) {
|
|
2112
2221
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
2113
|
-
throw new Error(
|
|
2222
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
2114
2223
|
}
|
|
2115
|
-
const addrs = await loadAerodromeAddresses();
|
|
2224
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2225
|
+
if (addrs.lpSugar === zeroAddress) return [];
|
|
2116
2226
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
2117
2227
|
const account = getAddress(args.account);
|
|
2118
2228
|
const rows = await paginate(
|
|
@@ -2373,6 +2483,25 @@ function mergePools(into, extra) {
|
|
|
2373
2483
|
}
|
|
2374
2484
|
return out;
|
|
2375
2485
|
}
|
|
2486
|
+
async function quoteViaPools(rpcUrl, amountIn, hops) {
|
|
2487
|
+
if (hops.length === 0 || hops.some((h) => h.kind === "cl")) return null;
|
|
2488
|
+
const client = aerodromePublicClient(rpcUrl);
|
|
2489
|
+
let cursor = amountIn;
|
|
2490
|
+
for (const hop of hops) {
|
|
2491
|
+
try {
|
|
2492
|
+
cursor = await client.readContract({
|
|
2493
|
+
address: hop.lp,
|
|
2494
|
+
abi: aeroPoolAmountOutAbi,
|
|
2495
|
+
functionName: "getAmountOut",
|
|
2496
|
+
args: [cursor, hop.from]
|
|
2497
|
+
});
|
|
2498
|
+
} catch {
|
|
2499
|
+
return null;
|
|
2500
|
+
}
|
|
2501
|
+
if (cursor <= 0n) return null;
|
|
2502
|
+
}
|
|
2503
|
+
return cursor;
|
|
2504
|
+
}
|
|
2376
2505
|
async function quoteViaRouter(rpcUrl, router, amountIn, hops) {
|
|
2377
2506
|
if (hops.some((h) => h.kind === "cl")) return null;
|
|
2378
2507
|
const client = aerodromePublicClient(rpcUrl);
|
|
@@ -2408,6 +2537,8 @@ async function quoteViaMixedQuoter(rpcUrl, quoter, amountIn, hops, abi) {
|
|
|
2408
2537
|
}
|
|
2409
2538
|
}
|
|
2410
2539
|
async function quoteAerodromeHopsAmountOut(args) {
|
|
2540
|
+
const viaPools = await quoteViaPools(args.rpcUrl, args.amountIn, args.hops);
|
|
2541
|
+
if (viaPools != null && viaPools > 0n) return { out: viaPools, source: "router" };
|
|
2411
2542
|
const viaRouter = await quoteViaRouter(args.rpcUrl, args.router, args.amountIn, args.hops);
|
|
2412
2543
|
if (viaRouter != null && viaRouter > 0n) return { out: viaRouter, source: "router" };
|
|
2413
2544
|
const viaV3 = await quoteViaMixedQuoter(
|
|
@@ -2446,10 +2577,10 @@ async function throwIfUnissuedStock(args) {
|
|
|
2446
2577
|
}
|
|
2447
2578
|
async function aerodromeQuote(args) {
|
|
2448
2579
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
2449
|
-
throw new Error(
|
|
2580
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
2450
2581
|
}
|
|
2451
2582
|
const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
|
|
2452
|
-
const addrs = await loadAerodromeAddresses();
|
|
2583
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
2453
2584
|
await ensureAerodromeStockTickers([args.tokenIn, args.tokenOut]);
|
|
2454
2585
|
const isNativeIn = isAerodromeNativeToken(args.tokenIn);
|
|
2455
2586
|
const isNativeOut = isAerodromeNativeToken(args.tokenOut);
|
|
@@ -2478,9 +2609,10 @@ async function aerodromeQuote(args) {
|
|
|
2478
2609
|
let pools = await aerodromeDiscoverConnectorPools({ rpcUrl, tokenIn, tokenOut, addrs });
|
|
2479
2610
|
let paths = findAerodromePaths(pools, tokenIn, tokenOut);
|
|
2480
2611
|
if (paths.length === 0) {
|
|
2481
|
-
const sugarPools = await aerodromeFetchSwapPools({ chainId:
|
|
2612
|
+
const sugarPools = await aerodromeFetchSwapPools({ chainId: args.chainId, rpcUrl });
|
|
2482
2613
|
pools = mergePools(pools, sugarPools);
|
|
2483
|
-
const
|
|
2614
|
+
const usdc = aeroUsdcAddress(args.chainId);
|
|
2615
|
+
const connectors = [addrs.weth, ...usdc ? [usdc] : [], addrs.aero];
|
|
2484
2616
|
const relevant = pools.filter((p) => {
|
|
2485
2617
|
const a = p.token0.toLowerCase();
|
|
2486
2618
|
const b = p.token1.toLowerCase();
|
|
@@ -2553,7 +2685,7 @@ async function aerodromeQuote(args) {
|
|
|
2553
2685
|
}
|
|
2554
2686
|
}
|
|
2555
2687
|
return {
|
|
2556
|
-
chainId:
|
|
2688
|
+
chainId: args.chainId,
|
|
2557
2689
|
tokenIn: isNativeIn ? zeroAddress : tokenIn,
|
|
2558
2690
|
tokenOut: isNativeOut ? zeroAddress : tokenOut,
|
|
2559
2691
|
amountInWei: amountIn.toString(),
|
|
@@ -2855,7 +2987,7 @@ async function buildAerodromeMultisignBatch(args) {
|
|
|
2855
2987
|
chainCategory: "evm",
|
|
2856
2988
|
keyGen: args.keyGen,
|
|
2857
2989
|
purposeText: args.purposeText,
|
|
2858
|
-
chainId: AERODROME_CHAIN_ID,
|
|
2990
|
+
chainId: args.chainId ?? AERODROME_CHAIN_ID,
|
|
2859
2991
|
rpcUrl: args.rpcUrl,
|
|
2860
2992
|
executorAddress: executor,
|
|
2861
2993
|
chainDetail: args.chainDetail,
|
|
@@ -2886,8 +3018,76 @@ function applySlippage(amountOut, slippagePercent) {
|
|
|
2886
3018
|
const bps = BigInt(Math.round(slippagePercent * 100));
|
|
2887
3019
|
return amountOut - amountOut * bps / 10000n;
|
|
2888
3020
|
}
|
|
2889
|
-
function
|
|
2890
|
-
|
|
3021
|
+
function encodeAeroV2ExactIn(args) {
|
|
3022
|
+
const commands = [];
|
|
3023
|
+
const inputs = [];
|
|
3024
|
+
const spend = (mode, amount) => encodeAbiParameters(
|
|
3025
|
+
[
|
|
3026
|
+
{ type: "uint8", name: "mode" },
|
|
3027
|
+
{ type: "uint256", name: "value" }
|
|
3028
|
+
],
|
|
3029
|
+
[mode, amount]
|
|
3030
|
+
);
|
|
3031
|
+
if (args.wrapNative) {
|
|
3032
|
+
commands.push(11);
|
|
3033
|
+
inputs.push(spend(0, args.amountIn));
|
|
3034
|
+
}
|
|
3035
|
+
commands.push(8);
|
|
3036
|
+
inputs.push(
|
|
3037
|
+
encodeAbiParameters(
|
|
3038
|
+
[
|
|
3039
|
+
{ type: "address[]", name: "pools" },
|
|
3040
|
+
{ type: "address", name: "tokenIn" },
|
|
3041
|
+
{
|
|
3042
|
+
type: "tuple",
|
|
3043
|
+
name: "amountIn",
|
|
3044
|
+
components: [
|
|
3045
|
+
{ name: "mode", type: "uint8" },
|
|
3046
|
+
{ name: "value", type: "uint256" }
|
|
3047
|
+
]
|
|
3048
|
+
},
|
|
3049
|
+
{ type: "bool", name: "payerIsUser" },
|
|
3050
|
+
{ type: "uint256", name: "minAmountOut" },
|
|
3051
|
+
{ type: "address", name: "recipient" }
|
|
3052
|
+
],
|
|
3053
|
+
[
|
|
3054
|
+
args.pools,
|
|
3055
|
+
args.wrapNative ? args.weth : args.tokenIn,
|
|
3056
|
+
{ mode: 0, value: args.amountIn },
|
|
3057
|
+
!args.wrapNative,
|
|
3058
|
+
args.minOut,
|
|
3059
|
+
args.unwrapNative ? args.router : args.recipient
|
|
3060
|
+
]
|
|
3061
|
+
)
|
|
3062
|
+
);
|
|
3063
|
+
if (args.unwrapNative) {
|
|
3064
|
+
commands.push(12);
|
|
3065
|
+
inputs.push(
|
|
3066
|
+
encodeAbiParameters(
|
|
3067
|
+
[
|
|
3068
|
+
{ type: "address", name: "recipient" },
|
|
3069
|
+
{
|
|
3070
|
+
type: "tuple",
|
|
3071
|
+
name: "spend",
|
|
3072
|
+
components: [
|
|
3073
|
+
{ name: "mode", type: "uint8" },
|
|
3074
|
+
{ name: "value", type: "uint256" }
|
|
3075
|
+
]
|
|
3076
|
+
}
|
|
3077
|
+
],
|
|
3078
|
+
[args.recipient, { mode: 1, value: 1000000n }]
|
|
3079
|
+
)
|
|
3080
|
+
);
|
|
3081
|
+
}
|
|
3082
|
+
const commandsBytes = `0x${commands.map((n) => n.toString(16).padStart(2, "0")).join("")}`;
|
|
3083
|
+
return {
|
|
3084
|
+
data: encodeFunctionData({
|
|
3085
|
+
abi: aeroMetarouterAbi,
|
|
3086
|
+
functionName: "execute",
|
|
3087
|
+
args: [commandsBytes, inputs]
|
|
3088
|
+
}),
|
|
3089
|
+
value: args.wrapNative ? args.amountIn : 0n
|
|
3090
|
+
};
|
|
2891
3091
|
}
|
|
2892
3092
|
async function appendSequentialMixedHops(args) {
|
|
2893
3093
|
let remainingIn = args.amountIn;
|
|
@@ -2950,63 +3150,41 @@ async function appendSequentialMixedHops(args) {
|
|
|
2950
3150
|
rpcUrl: args.rpcUrl,
|
|
2951
3151
|
token: hop.from,
|
|
2952
3152
|
owner: args.executor,
|
|
2953
|
-
spender: args.addrs.
|
|
3153
|
+
spender: args.addrs.metarouter,
|
|
2954
3154
|
amountWei: remainingIn
|
|
2955
3155
|
});
|
|
2956
3156
|
}
|
|
2957
|
-
const
|
|
2958
|
-
|
|
2959
|
-
args.
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
2963
|
-
|
|
2964
|
-
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
functionName: "swapExactTokensForETH",
|
|
2977
|
-
args: [remainingIn, hopOutMin, routes, args.executor, args.deadline]
|
|
2978
|
-
}),
|
|
2979
|
-
value: 0n,
|
|
2980
|
-
kind: "swap",
|
|
2981
|
-
routerSwap: true,
|
|
2982
|
-
fallbackGas: 350000n
|
|
2983
|
-
});
|
|
2984
|
-
} else {
|
|
2985
|
-
args.steps.push({
|
|
2986
|
-
to: args.addrs.router,
|
|
2987
|
-
data: encodeFunctionData({
|
|
2988
|
-
abi: routerAbi,
|
|
2989
|
-
functionName: "swapExactTokensForTokens",
|
|
2990
|
-
args: [remainingIn, hopOutMin, routes, args.executor, args.deadline]
|
|
2991
|
-
}),
|
|
2992
|
-
value: 0n,
|
|
2993
|
-
kind: "swap",
|
|
2994
|
-
routerSwap: true,
|
|
2995
|
-
fallbackGas: 350000n
|
|
2996
|
-
});
|
|
2997
|
-
}
|
|
3157
|
+
const encoded = encodeAeroV2ExactIn({
|
|
3158
|
+
router: args.addrs.metarouter,
|
|
3159
|
+
weth: args.addrs.weth,
|
|
3160
|
+
pools: [hop.lp],
|
|
3161
|
+
tokenIn: hop.from,
|
|
3162
|
+
amountIn: remainingIn,
|
|
3163
|
+
minOut: hopOutMin,
|
|
3164
|
+
recipient: args.executor,
|
|
3165
|
+
wrapNative: payNative,
|
|
3166
|
+
unwrapNative: isLast && args.isNativeOut
|
|
3167
|
+
});
|
|
3168
|
+
args.steps.push({
|
|
3169
|
+
to: args.addrs.metarouter,
|
|
3170
|
+
data: encoded.data,
|
|
3171
|
+
value: encoded.value,
|
|
3172
|
+
kind: "swap",
|
|
3173
|
+
routerSwap: true,
|
|
3174
|
+
fallbackGas: 350000n
|
|
3175
|
+
});
|
|
2998
3176
|
}
|
|
2999
3177
|
remainingIn = hopOutMin;
|
|
3000
3178
|
}
|
|
3001
3179
|
}
|
|
3002
3180
|
async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
|
|
3003
|
-
if (args.chainId
|
|
3004
|
-
throw new Error(
|
|
3181
|
+
if (!isAerodromeChainSupported(args.chainId)) {
|
|
3182
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
3005
3183
|
}
|
|
3006
3184
|
const executor = getAddress(args.executorAddress);
|
|
3007
|
-
const addrs = await loadAerodromeAddresses();
|
|
3185
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3008
3186
|
const quote = args.quoteSnapshot?.hops?.length && args.quoteSnapshot.amountOutWei ? args.quoteSnapshot : await aerodromeQuote({
|
|
3009
|
-
chainId:
|
|
3187
|
+
chainId: args.chainId,
|
|
3010
3188
|
rpcUrl: args.rpcUrl,
|
|
3011
3189
|
tokenIn: args.tokenIn,
|
|
3012
3190
|
tokenOut: args.tokenOut,
|
|
@@ -3019,12 +3197,12 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
|
|
|
3019
3197
|
const hops = quote.hops;
|
|
3020
3198
|
const deadline = aerodromeOnChainDeadlineUnix(args.expiryDate);
|
|
3021
3199
|
const steps = [];
|
|
3022
|
-
const sdkTx = await tryAerodromeSdkUnsignedSwap({
|
|
3200
|
+
const sdkTx = hops.length === 0 ? await tryAerodromeSdkUnsignedSwap({
|
|
3023
3201
|
rpcUrl: args.rpcUrl,
|
|
3024
3202
|
account: executor,
|
|
3025
3203
|
quote,
|
|
3026
3204
|
slippage: args.slippagePercent / 100
|
|
3027
|
-
});
|
|
3205
|
+
}) : null;
|
|
3028
3206
|
if (sdkTx) {
|
|
3029
3207
|
const tokenInAddr = getAddress(isNativeIn ? addrs.weth : quote.tokenIn);
|
|
3030
3208
|
if (!isNativeIn) {
|
|
@@ -3046,57 +3224,35 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
|
|
|
3046
3224
|
fallbackGas: 400000n
|
|
3047
3225
|
});
|
|
3048
3226
|
} else if (hops.length > 0 && hops.every((h) => h.kind !== "cl")) {
|
|
3049
|
-
const routes = routerRoutes(hops);
|
|
3050
3227
|
if (!isNativeIn) {
|
|
3051
3228
|
await pushErc20ApproveIfNeeded({
|
|
3052
3229
|
steps,
|
|
3053
3230
|
rpcUrl: args.rpcUrl,
|
|
3054
3231
|
token: hops[0].from,
|
|
3055
3232
|
owner: executor,
|
|
3056
|
-
spender: addrs.
|
|
3233
|
+
spender: addrs.metarouter,
|
|
3057
3234
|
amountWei: amountIn
|
|
3058
3235
|
});
|
|
3059
3236
|
}
|
|
3060
|
-
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3066
|
-
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
args: [amountIn, amountOutMin, routes, executor, deadline]
|
|
3080
|
-
}),
|
|
3081
|
-
value: 0n,
|
|
3082
|
-
kind: "swap",
|
|
3083
|
-
routerSwap: true,
|
|
3084
|
-
fallbackGas: 350000n
|
|
3085
|
-
});
|
|
3086
|
-
} else {
|
|
3087
|
-
steps.push({
|
|
3088
|
-
to: addrs.router,
|
|
3089
|
-
data: encodeFunctionData({
|
|
3090
|
-
abi: routerAbi,
|
|
3091
|
-
functionName: "swapExactTokensForTokens",
|
|
3092
|
-
args: [amountIn, amountOutMin, routes, executor, deadline]
|
|
3093
|
-
}),
|
|
3094
|
-
value: 0n,
|
|
3095
|
-
kind: "swap",
|
|
3096
|
-
routerSwap: true,
|
|
3097
|
-
fallbackGas: 350000n
|
|
3098
|
-
});
|
|
3099
|
-
}
|
|
3237
|
+
const encoded = encodeAeroV2ExactIn({
|
|
3238
|
+
router: addrs.metarouter,
|
|
3239
|
+
weth: addrs.weth,
|
|
3240
|
+
pools: hops.map((h) => h.lp),
|
|
3241
|
+
tokenIn: hops[0].from,
|
|
3242
|
+
amountIn,
|
|
3243
|
+
minOut: amountOutMin,
|
|
3244
|
+
recipient: executor,
|
|
3245
|
+
wrapNative: isNativeIn,
|
|
3246
|
+
unwrapNative: isNativeOut
|
|
3247
|
+
});
|
|
3248
|
+
steps.push({
|
|
3249
|
+
to: addrs.metarouter,
|
|
3250
|
+
data: encoded.data,
|
|
3251
|
+
value: encoded.value,
|
|
3252
|
+
kind: "swap",
|
|
3253
|
+
routerSwap: true,
|
|
3254
|
+
fallbackGas: 350000n
|
|
3255
|
+
});
|
|
3100
3256
|
} else if (hops.length === 1 && hops[0].kind === "cl") {
|
|
3101
3257
|
const hop = hops[0];
|
|
3102
3258
|
const swapRouter = aerodromeClSwapRouterForFactory(addrs, hop.factory);
|
|
@@ -3155,6 +3311,7 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
|
|
|
3155
3311
|
return buildAerodromeMultisignBatch({
|
|
3156
3312
|
keyGen: args.keyGen,
|
|
3157
3313
|
rpcUrl: args.rpcUrl,
|
|
3314
|
+
chainId: args.chainId,
|
|
3158
3315
|
chainDetail: args.chainDetail,
|
|
3159
3316
|
useCustomGas: args.useCustomGas,
|
|
3160
3317
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3169,14 +3326,14 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
|
|
|
3169
3326
|
name: "ERC20.approve",
|
|
3170
3327
|
note: "Allowance for this swap amount only."
|
|
3171
3328
|
}),
|
|
3172
|
-
evm: { type: "aerodrome_erc20_approve", version: 1, chainId: String(
|
|
3329
|
+
evm: { type: "aerodrome_erc20_approve", version: 1, chainId: String(args.chainId) }
|
|
3173
3330
|
} : {
|
|
3174
3331
|
signatureText: JSON.stringify({
|
|
3175
3332
|
kind: "Aerodrome",
|
|
3176
3333
|
name: "swap",
|
|
3177
3334
|
hops: hops.map((h) => ({ from: h.from, to: h.to, kind: h.kind }))
|
|
3178
3335
|
}),
|
|
3179
|
-
evm: { type: "aerodrome_swap", version: 1, chainId: String(
|
|
3336
|
+
evm: { type: "aerodrome_swap", version: 1, chainId: String(args.chainId) }
|
|
3180
3337
|
}
|
|
3181
3338
|
});
|
|
3182
3339
|
}
|
|
@@ -3218,9 +3375,9 @@ function formatLpHuman(wei, decimals) {
|
|
|
3218
3375
|
}
|
|
3219
3376
|
async function aerodromeQuoteAddLiquidity(args) {
|
|
3220
3377
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
3221
|
-
throw new Error(
|
|
3378
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
3222
3379
|
}
|
|
3223
|
-
const addrs = await loadAerodromeAddresses();
|
|
3380
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3224
3381
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
3225
3382
|
await ensureAerodromeStockTickers([args.tokenA, args.tokenB]);
|
|
3226
3383
|
const isNativeA = isAerodromeNativeToken(args.tokenA);
|
|
@@ -3267,6 +3424,7 @@ async function aerodromeQuoteAddLiquidity(args) {
|
|
|
3267
3424
|
const amountBParsed = rawB ? parseUnits(rawB, decB) : 0n;
|
|
3268
3425
|
if (emptyPool) {
|
|
3269
3426
|
const cl = await quoteClPairRatio({
|
|
3427
|
+
chainId: args.chainId,
|
|
3270
3428
|
rpcUrl: args.rpcUrl,
|
|
3271
3429
|
tokenA,
|
|
3272
3430
|
tokenB,
|
|
@@ -3311,6 +3469,11 @@ async function aerodromeQuoteAddLiquidity(args) {
|
|
|
3311
3469
|
}
|
|
3312
3470
|
const amountADesired = rawA ? amountAParsed : OTHER_SIDE_DESIRED;
|
|
3313
3471
|
const amountBDesired = rawB ? amountBParsed : OTHER_SIDE_DESIRED;
|
|
3472
|
+
if (addrs.router.toLowerCase() === addrs.metarouter.toLowerCase()) {
|
|
3473
|
+
throw new Error(
|
|
3474
|
+
"Aero v2 add-liquidity on this chain uses the Metarouter and is not encoded yet. Base still quotes through the legacy router."
|
|
3475
|
+
);
|
|
3476
|
+
}
|
|
3314
3477
|
const [amountA, amountB, liquidity] = await client.readContract({
|
|
3315
3478
|
address: addrs.router,
|
|
3316
3479
|
abi: routerAbi,
|
|
@@ -3336,6 +3499,7 @@ async function aerodromeQuoteAddLiquidity(args) {
|
|
|
3336
3499
|
}
|
|
3337
3500
|
async function quoteClPairRatio(args) {
|
|
3338
3501
|
const directs = await aerodromeDiscoverDirectPools({
|
|
3502
|
+
chainId: args.chainId,
|
|
3339
3503
|
rpcUrl: args.rpcUrl,
|
|
3340
3504
|
tokenA: args.tokenA,
|
|
3341
3505
|
tokenB: args.tokenB
|
|
@@ -3367,7 +3531,7 @@ async function quoteClPairRatio(args) {
|
|
|
3367
3531
|
if (!best) return null;
|
|
3368
3532
|
const token0 = args.tokenA.toLowerCase() < args.tokenB.toLowerCase() ? args.tokenA : args.tokenB;
|
|
3369
3533
|
const aIs0 = args.tokenA.toLowerCase() === token0.toLowerCase();
|
|
3370
|
-
const addrs = await loadAerodromeAddresses();
|
|
3534
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3371
3535
|
let amount0 = aIs0 ? args.amountAParsed : args.amountBParsed;
|
|
3372
3536
|
let amount1 = aIs0 ? args.amountBParsed : args.amountAParsed;
|
|
3373
3537
|
if (args.rawA && !args.rawB) {
|
|
@@ -3424,7 +3588,7 @@ function minAfterSlippage(amount, slippagePercent) {
|
|
|
3424
3588
|
}
|
|
3425
3589
|
async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
|
|
3426
3590
|
const executor = getAddress(args.executorAddress);
|
|
3427
|
-
const addrs = await loadAerodromeAddresses();
|
|
3591
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3428
3592
|
const quote = await aerodromeQuoteAddLiquidity({
|
|
3429
3593
|
chainId: args.chainId,
|
|
3430
3594
|
rpcUrl: args.rpcUrl,
|
|
@@ -3513,6 +3677,7 @@ async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
|
|
|
3513
3677
|
return buildAerodromeMultisignBatch({
|
|
3514
3678
|
keyGen: args.keyGen,
|
|
3515
3679
|
rpcUrl: args.rpcUrl,
|
|
3680
|
+
chainId: args.chainId,
|
|
3516
3681
|
chainDetail: args.chainDetail,
|
|
3517
3682
|
useCustomGas: args.useCustomGas,
|
|
3518
3683
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3523,13 +3688,13 @@ async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
|
|
|
3523
3688
|
purposeSuffix: "Aerodrome: add basic-pool liquidity.",
|
|
3524
3689
|
meta: () => ({
|
|
3525
3690
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "addLiquidity", stable: args.stable }),
|
|
3526
|
-
evm: { type: "aerodrome_add_liquidity", version: 1, chainId: String(
|
|
3691
|
+
evm: { type: "aerodrome_add_liquidity", version: 1, chainId: String(args.chainId) }
|
|
3527
3692
|
})
|
|
3528
3693
|
});
|
|
3529
3694
|
}
|
|
3530
3695
|
async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
|
|
3531
3696
|
const executor = getAddress(args.executorAddress);
|
|
3532
|
-
const addrs = await loadAerodromeAddresses();
|
|
3697
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3533
3698
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
3534
3699
|
const lp = getAddress(args.lpToken);
|
|
3535
3700
|
const dec = args.lpDecimals ?? Number(await client.readContract({ address: lp, abi: erc20Abi, functionName: "decimals" }));
|
|
@@ -3580,6 +3745,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
|
|
|
3580
3745
|
return buildAerodromeMultisignBatch({
|
|
3581
3746
|
keyGen: args.keyGen,
|
|
3582
3747
|
rpcUrl: args.rpcUrl,
|
|
3748
|
+
chainId: args.chainId,
|
|
3583
3749
|
chainDetail: args.chainDetail,
|
|
3584
3750
|
useCustomGas: args.useCustomGas,
|
|
3585
3751
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3590,7 +3756,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
|
|
|
3590
3756
|
purposeSuffix: "Aerodrome: remove basic-pool liquidity.",
|
|
3591
3757
|
meta: () => ({
|
|
3592
3758
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "removeLiquidity", lp }),
|
|
3593
|
-
evm: { type: "aerodrome_remove_liquidity", version: 1, chainId: String(
|
|
3759
|
+
evm: { type: "aerodrome_remove_liquidity", version: 1, chainId: String(args.chainId) }
|
|
3594
3760
|
})
|
|
3595
3761
|
});
|
|
3596
3762
|
}
|
|
@@ -3603,9 +3769,9 @@ init_stockTokens();
|
|
|
3603
3769
|
init_support();
|
|
3604
3770
|
async function aerodromeQuoteClDeposit(args) {
|
|
3605
3771
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
3606
|
-
throw new Error(
|
|
3772
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
3607
3773
|
}
|
|
3608
|
-
const addrs = await loadAerodromeAddresses();
|
|
3774
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3609
3775
|
const client = aerodromePublicClient(args.rpcUrl);
|
|
3610
3776
|
await ensureAerodromeStockTickers([args.token0, args.token1]);
|
|
3611
3777
|
const token0 = resolveAerodromeErc20OrWeth(args.token0, addrs.weth);
|
|
@@ -3663,7 +3829,7 @@ function minAfterSlippage2(amount, slippagePercent) {
|
|
|
3663
3829
|
}
|
|
3664
3830
|
async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
|
|
3665
3831
|
const executor = getAddress(args.executorAddress);
|
|
3666
|
-
const addrs = await loadAerodromeAddresses();
|
|
3832
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3667
3833
|
const quote = await aerodromeQuoteClDeposit({
|
|
3668
3834
|
chainId: args.chainId,
|
|
3669
3835
|
rpcUrl: args.rpcUrl,
|
|
@@ -3734,6 +3900,7 @@ async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
|
|
|
3734
3900
|
return buildAerodromeMultisignBatch({
|
|
3735
3901
|
keyGen: args.keyGen,
|
|
3736
3902
|
rpcUrl: args.rpcUrl,
|
|
3903
|
+
chainId: args.chainId,
|
|
3737
3904
|
chainDetail: args.chainDetail,
|
|
3738
3905
|
useCustomGas: args.useCustomGas,
|
|
3739
3906
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3744,13 +3911,13 @@ async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
|
|
|
3744
3911
|
purposeSuffix: "Aerodrome Slipstream: mint concentrated position NFT.",
|
|
3745
3912
|
meta: () => ({
|
|
3746
3913
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.mint" }),
|
|
3747
|
-
evm: { type: "aerodrome_cl_mint", version: 1, chainId: String(
|
|
3914
|
+
evm: { type: "aerodrome_cl_mint", version: 1, chainId: String(args.chainId) }
|
|
3748
3915
|
})
|
|
3749
3916
|
});
|
|
3750
3917
|
}
|
|
3751
3918
|
async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
|
|
3752
3919
|
const executor = getAddress(args.executorAddress);
|
|
3753
|
-
const addrs = await loadAerodromeAddresses();
|
|
3920
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3754
3921
|
const amount0 = BigInt(args.amount0Wei);
|
|
3755
3922
|
const amount1 = BigInt(args.amount1Wei);
|
|
3756
3923
|
await ensureAerodromeStockTickers([args.token0, args.token1]);
|
|
@@ -3801,6 +3968,7 @@ async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
|
|
|
3801
3968
|
return buildAerodromeMultisignBatch({
|
|
3802
3969
|
keyGen: args.keyGen,
|
|
3803
3970
|
rpcUrl: args.rpcUrl,
|
|
3971
|
+
chainId: args.chainId,
|
|
3804
3972
|
chainDetail: args.chainDetail,
|
|
3805
3973
|
useCustomGas: args.useCustomGas,
|
|
3806
3974
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3811,13 +3979,13 @@ async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
|
|
|
3811
3979
|
purposeSuffix: "Aerodrome Slipstream: increase liquidity.",
|
|
3812
3980
|
meta: () => ({
|
|
3813
3981
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.increaseLiquidity", tokenId: args.tokenId }),
|
|
3814
|
-
evm: { type: "aerodrome_cl_increase", version: 1, chainId: String(
|
|
3982
|
+
evm: { type: "aerodrome_cl_increase", version: 1, chainId: String(args.chainId) }
|
|
3815
3983
|
})
|
|
3816
3984
|
});
|
|
3817
3985
|
}
|
|
3818
3986
|
async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
|
|
3819
3987
|
const executor = getAddress(args.executorAddress);
|
|
3820
|
-
const addrs = await loadAerodromeAddresses();
|
|
3988
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3821
3989
|
const steps = [
|
|
3822
3990
|
{
|
|
3823
3991
|
to: addrs.nfpm,
|
|
@@ -3842,6 +4010,7 @@ async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
|
|
|
3842
4010
|
return buildAerodromeMultisignBatch({
|
|
3843
4011
|
keyGen: args.keyGen,
|
|
3844
4012
|
rpcUrl: args.rpcUrl,
|
|
4013
|
+
chainId: args.chainId,
|
|
3845
4014
|
chainDetail: args.chainDetail,
|
|
3846
4015
|
useCustomGas: args.useCustomGas,
|
|
3847
4016
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3852,13 +4021,13 @@ async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
|
|
|
3852
4021
|
purposeSuffix: "Aerodrome Slipstream: decrease liquidity.",
|
|
3853
4022
|
meta: () => ({
|
|
3854
4023
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.decreaseLiquidity", tokenId: args.tokenId }),
|
|
3855
|
-
evm: { type: "aerodrome_cl_decrease", version: 1, chainId: String(
|
|
4024
|
+
evm: { type: "aerodrome_cl_decrease", version: 1, chainId: String(args.chainId) }
|
|
3856
4025
|
})
|
|
3857
4026
|
});
|
|
3858
4027
|
}
|
|
3859
4028
|
async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
|
|
3860
4029
|
const executor = getAddress(args.executorAddress);
|
|
3861
|
-
const addrs = await loadAerodromeAddresses();
|
|
4030
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3862
4031
|
const max = 2n ** 128n - 1n;
|
|
3863
4032
|
const steps = [
|
|
3864
4033
|
{
|
|
@@ -3876,6 +4045,7 @@ async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
|
|
|
3876
4045
|
return buildAerodromeMultisignBatch({
|
|
3877
4046
|
keyGen: args.keyGen,
|
|
3878
4047
|
rpcUrl: args.rpcUrl,
|
|
4048
|
+
chainId: args.chainId,
|
|
3879
4049
|
chainDetail: args.chainDetail,
|
|
3880
4050
|
useCustomGas: args.useCustomGas,
|
|
3881
4051
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3886,13 +4056,13 @@ async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
|
|
|
3886
4056
|
purposeSuffix: "Aerodrome Slipstream: collect fees.",
|
|
3887
4057
|
meta: () => ({
|
|
3888
4058
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.collect", tokenId: args.tokenId }),
|
|
3889
|
-
evm: { type: "aerodrome_cl_collect", version: 1, chainId: String(
|
|
4059
|
+
evm: { type: "aerodrome_cl_collect", version: 1, chainId: String(args.chainId) }
|
|
3890
4060
|
})
|
|
3891
4061
|
});
|
|
3892
4062
|
}
|
|
3893
4063
|
async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
|
|
3894
4064
|
const executor = getAddress(args.executorAddress);
|
|
3895
|
-
const addrs = await loadAerodromeAddresses();
|
|
4065
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
3896
4066
|
const steps = [
|
|
3897
4067
|
{
|
|
3898
4068
|
to: addrs.nfpm,
|
|
@@ -3909,6 +4079,7 @@ async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
|
|
|
3909
4079
|
return buildAerodromeMultisignBatch({
|
|
3910
4080
|
keyGen: args.keyGen,
|
|
3911
4081
|
rpcUrl: args.rpcUrl,
|
|
4082
|
+
chainId: args.chainId,
|
|
3912
4083
|
chainDetail: args.chainDetail,
|
|
3913
4084
|
useCustomGas: args.useCustomGas,
|
|
3914
4085
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3919,14 +4090,13 @@ async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
|
|
|
3919
4090
|
purposeSuffix: "Aerodrome Slipstream: burn empty position NFT.",
|
|
3920
4091
|
meta: () => ({
|
|
3921
4092
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.burn", tokenId: args.tokenId }),
|
|
3922
|
-
evm: { type: "aerodrome_cl_burn", version: 1, chainId: String(
|
|
4093
|
+
evm: { type: "aerodrome_cl_burn", version: 1, chainId: String(args.chainId) }
|
|
3923
4094
|
})
|
|
3924
4095
|
});
|
|
3925
4096
|
}
|
|
3926
4097
|
|
|
3927
4098
|
// src/protocols/evm/aerodrome/gaugeMultisign.ts
|
|
3928
4099
|
init_abi();
|
|
3929
|
-
init_support();
|
|
3930
4100
|
async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
|
|
3931
4101
|
const executor = getAddress(args.executorAddress);
|
|
3932
4102
|
const gauge = getAddress(args.gauge);
|
|
@@ -3976,6 +4146,7 @@ async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
|
|
|
3976
4146
|
return buildAerodromeMultisignBatch({
|
|
3977
4147
|
keyGen: args.keyGen,
|
|
3978
4148
|
rpcUrl: args.rpcUrl,
|
|
4149
|
+
chainId: args.chainId,
|
|
3979
4150
|
chainDetail: args.chainDetail,
|
|
3980
4151
|
useCustomGas: args.useCustomGas,
|
|
3981
4152
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -3986,7 +4157,7 @@ async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
|
|
|
3986
4157
|
purposeSuffix: "Aerodrome: stake LP in gauge.",
|
|
3987
4158
|
meta: () => ({
|
|
3988
4159
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.deposit" }),
|
|
3989
|
-
evm: { type: "aerodrome_gauge_stake", version: 1, chainId: String(
|
|
4160
|
+
evm: { type: "aerodrome_gauge_stake", version: 1, chainId: String(args.chainId) }
|
|
3990
4161
|
})
|
|
3991
4162
|
});
|
|
3992
4163
|
}
|
|
@@ -4021,6 +4192,7 @@ async function buildEvmMultisignBodyAerodromeGaugeUnstakeBatch(args) {
|
|
|
4021
4192
|
return buildAerodromeMultisignBatch({
|
|
4022
4193
|
keyGen: args.keyGen,
|
|
4023
4194
|
rpcUrl: args.rpcUrl,
|
|
4195
|
+
chainId: args.chainId,
|
|
4024
4196
|
chainDetail: args.chainDetail,
|
|
4025
4197
|
useCustomGas: args.useCustomGas,
|
|
4026
4198
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -4031,7 +4203,7 @@ async function buildEvmMultisignBodyAerodromeGaugeUnstakeBatch(args) {
|
|
|
4031
4203
|
purposeSuffix: "Aerodrome: unstake LP from gauge.",
|
|
4032
4204
|
meta: () => ({
|
|
4033
4205
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.withdraw" }),
|
|
4034
|
-
evm: { type: "aerodrome_gauge_unstake", version: 1, chainId: String(
|
|
4206
|
+
evm: { type: "aerodrome_gauge_unstake", version: 1, chainId: String(args.chainId) }
|
|
4035
4207
|
})
|
|
4036
4208
|
});
|
|
4037
4209
|
}
|
|
@@ -4050,6 +4222,7 @@ async function buildEvmMultisignBodyAerodromeClaimFeesBatch(args) {
|
|
|
4050
4222
|
return buildAerodromeMultisignBatch({
|
|
4051
4223
|
keyGen: args.keyGen,
|
|
4052
4224
|
rpcUrl: args.rpcUrl,
|
|
4225
|
+
chainId: args.chainId,
|
|
4053
4226
|
chainDetail: args.chainDetail,
|
|
4054
4227
|
useCustomGas: args.useCustomGas,
|
|
4055
4228
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -4060,7 +4233,7 @@ async function buildEvmMultisignBodyAerodromeClaimFeesBatch(args) {
|
|
|
4060
4233
|
purposeSuffix: "Aerodrome: claim basic-pool fees.",
|
|
4061
4234
|
meta: () => ({
|
|
4062
4235
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "pool.claimFees", pool }),
|
|
4063
|
-
evm: { type: "aerodrome_claim_fees", version: 1, chainId: String(
|
|
4236
|
+
evm: { type: "aerodrome_claim_fees", version: 1, chainId: String(args.chainId) }
|
|
4064
4237
|
})
|
|
4065
4238
|
});
|
|
4066
4239
|
}
|
|
@@ -4093,6 +4266,7 @@ async function buildEvmMultisignBodyAerodromeClaimEmissionsBatch(args) {
|
|
|
4093
4266
|
return buildAerodromeMultisignBatch({
|
|
4094
4267
|
keyGen: args.keyGen,
|
|
4095
4268
|
rpcUrl: args.rpcUrl,
|
|
4269
|
+
chainId: args.chainId,
|
|
4096
4270
|
chainDetail: args.chainDetail,
|
|
4097
4271
|
useCustomGas: args.useCustomGas,
|
|
4098
4272
|
customGasChainDetails: args.customGasChainDetails,
|
|
@@ -4103,7 +4277,7 @@ async function buildEvmMultisignBodyAerodromeClaimEmissionsBatch(args) {
|
|
|
4103
4277
|
purposeSuffix: "Aerodrome: claim gauge emissions.",
|
|
4104
4278
|
meta: () => ({
|
|
4105
4279
|
signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.getReward" }),
|
|
4106
|
-
evm: { type: "aerodrome_claim_emissions", version: 1, chainId: String(
|
|
4280
|
+
evm: { type: "aerodrome_claim_emissions", version: 1, chainId: String(args.chainId) }
|
|
4107
4281
|
})
|
|
4108
4282
|
});
|
|
4109
4283
|
}
|
|
@@ -4170,38 +4344,53 @@ function mergeStocksIntoListed(tokens, stocks) {
|
|
|
4170
4344
|
return [...stocksFirst, ...rest];
|
|
4171
4345
|
}
|
|
4172
4346
|
async function aerodromeFetchListedTokensSummary(args) {
|
|
4173
|
-
const includeSugar = args.includeSugarListed !== false;
|
|
4174
|
-
const officialPromise = fetchOfficialBaseTokenizedStocks().catch(() => []);
|
|
4347
|
+
const includeSugar = args.includeSugarListed !== false && args.chainId === 8453;
|
|
4348
|
+
const officialPromise = args.chainId === 8453 ? fetchOfficialBaseTokenizedStocks().catch(() => []) : Promise.resolve([]);
|
|
4175
4349
|
const tokens = includeSugar ? await aerodromeFetchListedTokens(args) : [];
|
|
4176
4350
|
const official = await officialPromise;
|
|
4177
|
-
const stocks = await aerodromeResolveStockTokens({
|
|
4351
|
+
const stocks = args.chainId === 8453 ? await aerodromeResolveStockTokens({
|
|
4178
4352
|
rpcUrl: args.rpcUrl,
|
|
4179
4353
|
official,
|
|
4180
4354
|
knownTokens: tokens
|
|
4181
|
-
});
|
|
4182
|
-
const addrs = await loadAerodromeAddresses();
|
|
4355
|
+
}) : [];
|
|
4356
|
+
const addrs = await loadAerodromeAddresses(args.chainId);
|
|
4357
|
+
const usdc = aeroUsdcAddress(args.chainId);
|
|
4183
4358
|
const core = [
|
|
4184
4359
|
{ address: zeroAddress, symbol: "ETH", decimals: 18, listed: true, emerging: false, accountBalance: "0" },
|
|
4185
|
-
|
|
4186
|
-
|
|
4187
|
-
|
|
4188
|
-
|
|
4189
|
-
|
|
4190
|
-
|
|
4191
|
-
|
|
4192
|
-
|
|
4193
|
-
|
|
4194
|
-
|
|
4195
|
-
|
|
4196
|
-
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4200
|
-
|
|
4201
|
-
|
|
4360
|
+
...addrs.weth === zeroAddress ? [] : [
|
|
4361
|
+
{
|
|
4362
|
+
address: addrs.weth,
|
|
4363
|
+
symbol: "WETH",
|
|
4364
|
+
decimals: 18,
|
|
4365
|
+
listed: true,
|
|
4366
|
+
emerging: false,
|
|
4367
|
+
accountBalance: "0"
|
|
4368
|
+
}
|
|
4369
|
+
],
|
|
4370
|
+
...usdc ? [
|
|
4371
|
+
{
|
|
4372
|
+
address: usdc,
|
|
4373
|
+
symbol: "USDC",
|
|
4374
|
+
decimals: 6,
|
|
4375
|
+
listed: true,
|
|
4376
|
+
emerging: false,
|
|
4377
|
+
accountBalance: "0"
|
|
4378
|
+
}
|
|
4379
|
+
] : [],
|
|
4380
|
+
{ address: addrs.aero, symbol: "AERO", decimals: 18, listed: true, emerging: false, accountBalance: "0" },
|
|
4381
|
+
...addrs.receiptToken.toLowerCase() === addrs.aero.toLowerCase() ? [] : [
|
|
4382
|
+
{
|
|
4383
|
+
address: addrs.receiptToken,
|
|
4384
|
+
symbol: "xAERO",
|
|
4385
|
+
decimals: 18,
|
|
4386
|
+
listed: true,
|
|
4387
|
+
emerging: false,
|
|
4388
|
+
accountBalance: "0"
|
|
4389
|
+
}
|
|
4390
|
+
]
|
|
4202
4391
|
];
|
|
4203
4392
|
return {
|
|
4204
|
-
chainId:
|
|
4393
|
+
chainId: args.chainId,
|
|
4205
4394
|
native: { address: zeroAddress, symbol: "ETH", decimals: 18 },
|
|
4206
4395
|
aero: { address: addrs.aero, symbol: "AERO", decimals: 18 },
|
|
4207
4396
|
stocks,
|
|
@@ -4220,7 +4409,7 @@ async function aerodromeFetchPoolsSummary(args) {
|
|
|
4220
4409
|
const offset = Math.max(0, args.offset ?? 0);
|
|
4221
4410
|
const limit = Math.min(Math.max(args.limit ?? pools.length, 1), pools.length);
|
|
4222
4411
|
return {
|
|
4223
|
-
chainId:
|
|
4412
|
+
chainId: args.chainId,
|
|
4224
4413
|
pools: pools.slice(offset, offset + limit),
|
|
4225
4414
|
notes
|
|
4226
4415
|
};
|
|
@@ -4229,7 +4418,7 @@ async function aerodromeFetchPositionsSummary(args) {
|
|
|
4229
4418
|
const account = (args.account ?? args.executorAddress ?? "").trim();
|
|
4230
4419
|
if (!account) throw new Error("account or executorAddress is required.");
|
|
4231
4420
|
if (!isAerodromeChainSupported(args.chainId)) {
|
|
4232
|
-
throw new Error(
|
|
4421
|
+
throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
|
|
4233
4422
|
}
|
|
4234
4423
|
const positions = await aerodromeFetchPositionsWithPools({
|
|
4235
4424
|
chainId: args.chainId,
|
|
@@ -4237,7 +4426,7 @@ async function aerodromeFetchPositionsSummary(args) {
|
|
|
4237
4426
|
account
|
|
4238
4427
|
});
|
|
4239
4428
|
return {
|
|
4240
|
-
chainId:
|
|
4429
|
+
chainId: args.chainId,
|
|
4241
4430
|
account,
|
|
4242
4431
|
notes: "Dust v2 rows hidden (liquidity < 1e12 and no stake/emissions). Claim fees from the pool (claimFees.pool = lp). Claim emissions from the gauge in AERO (claimEmissions); CL staked also needs tokenId + cl. Skip emissions when claimEmissions is null.",
|
|
4243
4432
|
positions: positions.map((p) => {
|
|
@@ -4274,10 +4463,10 @@ var aerodromeProtocolModule = {
|
|
|
4274
4463
|
id: "aerodrome.quote",
|
|
4275
4464
|
protocolId: AERODROME_PROTOCOL_ID,
|
|
4276
4465
|
chainCategory: "evm",
|
|
4277
|
-
description: "Quote an
|
|
4466
|
+
description: "Quote an Aero swap (protocol id aerodrome) via factory discovery and pool getAmountOut / Metaquoter. Base 8453 by default; also Ethereum, OP Mainnet, Arbitrum, Robinhood, Arc, and Ink. Tickers (AAPLc, USDC, ETH) accepted. Stock tickers are Base only.",
|
|
4278
4467
|
commonParams: [],
|
|
4279
4468
|
params: {
|
|
4280
|
-
chainId: { type: "number", required: true, description:
|
|
4469
|
+
chainId: { type: "number", required: true, description: "Aero chain: 8453 (Base, default), 1, 10, 42161, 4663, 5042, or 57073." },
|
|
4281
4470
|
tokenIn: { type: "address", required: true, description: "Ticker (AAPLc, USDC, ETH, WETH, AERO) or 0x / 0x0 native" },
|
|
4282
4471
|
tokenOut: { type: "address", required: true, description: "Ticker (AAPLc, USDC, ETH, WETH, AERO) or 0x / 0x0 native" },
|
|
4283
4472
|
amountHuman: { type: "string", required: true, description: "Human-readable input amount (B20 stocks are 8 decimals)" }
|
|
@@ -4366,6 +4555,6 @@ var aerodromeProtocolModule = {
|
|
|
4366
4555
|
};
|
|
4367
4556
|
registerProtocolModule(aerodromeProtocolModule);
|
|
4368
4557
|
|
|
4369
|
-
export { COINBASE_B20_ASSET_PREFIX as AERODROME_B20_ASSET_PREFIX, AERODROME_BASE_ADDRESSES_FALLBACK, AERODROME_CHAIN_ID, AERODROME_CL_FACTORY_NEWEST_BIT, AERODROME_CL_FACTORY_OLDEST_BIT, COINBASE_B20_STOCK_DECIMALS as AERODROME_COINBASE_STOCK_DECIMALS, AERODROME_IMPORTANT_POOL_CAP, AERODROME_NATIVE_PLACEHOLDER, AERODROME_PROTOCOL_ID, AERODROME_STABLE_FILLER, AERODROME_USDC_BASE, AERODROME_VOLATILE_FILLER, AERODROME_WETH_BASE, aerodromeClFactoryList, aerodromeClSwapRouterForFactory, aerodromeCoinbaseStockAddresses, coinbaseB20CatalogTokens as aerodromeCoinbaseStockCatalog, aerodromeDiscoverConnectorPools, aerodromeDiscoverConnectorPoolsLoaded, aerodromeDiscoverDirectPools, aerodromeDiscoverPoolsSummary, aerodromeFallbackAddresses, aerodromeFetchImportantPoolsSummary, aerodromeFetchListedTokens, aerodromeFetchListedTokensSummary, aerodromeFetchLpYieldsForPair, aerodromeFetchLpYieldsForPools, aerodromeFetchLpYieldsSummary, aerodromeFetchPools, aerodromeFetchPoolsByAddress, aerodromeFetchPoolsSummary, aerodromeFetchPositions, aerodromeFetchPositionsSummary, aerodromeFetchPositionsWithPools, aerodromeFetchStockLpYieldsSummary, aerodromeFetchSwapPools, aerodromeMixedPathFiller, aerodromeOnChainDeadlineUnix, aerodromePositionKey, aerodromePositionLabel, aerodromeProbeAmountIn, aerodromeProtocolModule, aerodromeQuote, aerodromeQuoteAddLiquidity, aerodromeQuoteClDeposit, aerodromeResolveStockTokens, aerodromeUnissuedStockMessage, assertAerodromeStockIssued, buildAerodromeLiquidityPurposePrefill, buildAerodromeRewardsPurposePrefill, buildAerodromeSwapPurposePrefill, buildEvmMultisignBodyAerodromeAddLiquidityBatch, buildEvmMultisignBodyAerodromeClBurnBatch, buildEvmMultisignBodyAerodromeClCollectBatch, buildEvmMultisignBodyAerodromeClDecreaseBatch, buildEvmMultisignBodyAerodromeClIncreaseBatch, buildEvmMultisignBodyAerodromeClMintBatch, buildEvmMultisignBodyAerodromeClaimEmissionsBatch, buildEvmMultisignBodyAerodromeClaimFeesBatch, buildEvmMultisignBodyAerodromeGaugeStakeBatch, buildEvmMultisignBodyAerodromeGaugeUnstakeBatch, buildEvmMultisignBodyAerodromeRemoveLiquidityBatch, buildEvmMultisignBodyAerodromeSwapBatch, computeAerodromePriceImpactPercent, encodeAerodromeMixedPath, ensureAerodromeStockTickers, fetchOfficialBaseTokenizedStocks, findAerodromePaths, formatAerodromeLpYieldLabel, formatAerodromePriceImpact, isCoinbaseB20AssetToken as isAerodromeB20AssetToken, isAerodromeChainSupported, isAerodromeCoinbaseStockToken, isAerodromeNativeToken, loadAerodromeAddresses, looksLikeCoinbaseStockSymbol, lookupAerodromeKnownToken, parseBaseTokenizedStockDocs, parseSecurityMdxAddresses, parseSugarBaseEnv, quoteAerodromeHopsAmountOut, requireAerodromeRpcUrl, resetAerodromeAddressCache, resolveAerodromeErc20OrWeth, tryAerodromeSdkQuote, tryAerodromeSdkUnsignedSwap };
|
|
4558
|
+
export { COINBASE_B20_ASSET_PREFIX as AERODROME_B20_ASSET_PREFIX, AERODROME_BASE_ADDRESSES_FALLBACK, AERODROME_CHAIN_ID, AERODROME_CL_FACTORY_NEWEST_BIT, AERODROME_CL_FACTORY_OLDEST_BIT, COINBASE_B20_STOCK_DECIMALS as AERODROME_COINBASE_STOCK_DECIMALS, AERODROME_IMPORTANT_POOL_CAP, AERODROME_NATIVE_PLACEHOLDER, AERODROME_PROTOCOL_ID, AERODROME_STABLE_FILLER, AERODROME_USDC_BASE, AERODROME_VOLATILE_FILLER, AERODROME_WETH_BASE, AERO_CHAIN_IDS, AERO_LEAF_VOTER, AERO_LEGACY_TOKEN_BASE, AERO_METAQUOTER, AERO_METAROUTER, AERO_NFPM, AERO_STABLE_POOL_FACTORY, AERO_SWAP_ROUTER, AERO_TOKEN_BASE, AERO_VOLATILE_POOL_FACTORY, aeroAddressesForChain, aeroRowIconAddresses, aeroUsdcAddress, aeroWrappedNativeAddress, aerodromeClFactoryList, aerodromeClSwapRouterForFactory, aerodromeCoinbaseStockAddresses, coinbaseB20CatalogTokens as aerodromeCoinbaseStockCatalog, aerodromeDiscoverConnectorPools, aerodromeDiscoverConnectorPoolsLoaded, aerodromeDiscoverDirectPools, aerodromeDiscoverPoolsSummary, aerodromeFallbackAddresses, aerodromeFetchImportantPoolsSummary, aerodromeFetchListedTokens, aerodromeFetchListedTokensSummary, aerodromeFetchLpYieldsForPair, aerodromeFetchLpYieldsForPools, aerodromeFetchLpYieldsSummary, aerodromeFetchPools, aerodromeFetchPoolsByAddress, aerodromeFetchPoolsSummary, aerodromeFetchPositions, aerodromeFetchPositionsSummary, aerodromeFetchPositionsWithPools, aerodromeFetchStockLpYieldsSummary, aerodromeFetchSwapPools, aerodromeMixedPathFiller, aerodromeOnChainDeadlineUnix, aerodromePositionKey, aerodromePositionLabel, aerodromeProbeAmountIn, aerodromeProtocolModule, aerodromeQuote, aerodromeQuoteAddLiquidity, aerodromeQuoteClDeposit, aerodromeResolveStockTokens, aerodromeUnissuedStockMessage, aerodromeUnsupportedChainMessage, assertAerodromeStockIssued, buildAerodromeLiquidityPurposePrefill, buildAerodromeRewardsPurposePrefill, buildAerodromeSwapPurposePrefill, buildEvmMultisignBodyAerodromeAddLiquidityBatch, buildEvmMultisignBodyAerodromeClBurnBatch, buildEvmMultisignBodyAerodromeClCollectBatch, buildEvmMultisignBodyAerodromeClDecreaseBatch, buildEvmMultisignBodyAerodromeClIncreaseBatch, buildEvmMultisignBodyAerodromeClMintBatch, buildEvmMultisignBodyAerodromeClaimEmissionsBatch, buildEvmMultisignBodyAerodromeClaimFeesBatch, buildEvmMultisignBodyAerodromeGaugeStakeBatch, buildEvmMultisignBodyAerodromeGaugeUnstakeBatch, buildEvmMultisignBodyAerodromeRemoveLiquidityBatch, buildEvmMultisignBodyAerodromeSwapBatch, computeAerodromePriceImpactPercent, encodeAerodromeMixedPath, ensureAerodromeStockTickers, fetchOfficialBaseTokenizedStocks, findAerodromePaths, formatAerodromeLpYieldLabel, formatAerodromePriceImpact, isCoinbaseB20AssetToken as isAerodromeB20AssetToken, isAerodromeChainSupported, isAerodromeCoinbaseStockToken, isAerodromeNativeToken, loadAerodromeAddresses, looksLikeCoinbaseStockSymbol, lookupAerodromeKnownToken, parseBaseTokenizedStockDocs, parseSecurityMdxAddresses, parseSugarBaseEnv, quoteAerodromeHopsAmountOut, requireAerodromeRpcUrl, resetAerodromeAddressCache, resolveAerodromeErc20OrWeth, tryAerodromeSdkQuote, tryAerodromeSdkUnsignedSwap };
|
|
4370
4559
|
//# sourceMappingURL=index.js.map
|
|
4371
4560
|
//# sourceMappingURL=index.js.map
|