@merkl/api 0.11.4 → 0.12.1
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/database/api/.generated/drizzle/schema.d.ts +5 -5
- package/dist/database/api/.generated/drizzle/schema.js +1 -1
- package/dist/database/api/.generated/drizzle/schema.ts +1 -1
- package/dist/database/api/.generated/edge.js +5 -4
- package/dist/database/api/.generated/index-browser.js +2 -1
- package/dist/database/api/.generated/index.d.ts +2 -1
- package/dist/database/api/.generated/index.js +5 -4
- package/dist/database/api/.generated/package.json +1 -1
- package/dist/database/api/.generated/schema.prisma +1 -0
- package/dist/database/api/.generated/wasm.js +2 -1
- package/dist/src/eden/index.d.ts +35 -35
- package/dist/src/entities/opportunity.js +30 -34
- package/dist/src/index.d.ts +7 -7
- package/dist/src/libs/campaigns/campaignTypes/AmbientDynamicData.d.ts +3 -0
- package/dist/src/libs/campaigns/campaignTypes/AmbientDynamicData.js +243 -0
- package/dist/src/libs/campaigns/campaignsDynamicData.js +4 -0
- package/dist/src/libs/campaigns/utils/fetchAmbientInfo.d.ts +12 -0
- package/dist/src/libs/campaigns/utils/fetchAmbientInfo.js +59 -0
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -2
- package/dist/src/modules/v4/campaign/campaign.model.d.ts +2 -0
- package/dist/src/modules/v4/campaign/campaign.model.js +1 -0
- package/dist/src/modules/v4/campaign/campaign.repository.d.ts +1 -1
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +2 -2
- package/dist/src/modules/v4/dynamicData/dynamicData.model.d.ts +2 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.service.js +4 -0
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +3 -3
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +1 -0
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +4 -4
- package/dist/src/modules/v4/opportunity/opportunity.service.js +3 -0
- package/dist/src/modules/v4/opportunity/subservices/getAmbientMetadata.service.d.ts +3 -0
- package/dist/src/modules/v4/opportunity/subservices/getAmbientMetadata.service.js +29 -0
- package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -1
- package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
- package/dist/src/modules/v4/router.d.ts +7 -7
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -0,0 +1,243 @@
|
|
1
|
+
import { AmbientAddresses, AmbientLens, BN2Number, EAprBreakdownType, NETWORK_LABELS, YEAR, } from "@sdk";
|
2
|
+
import moment from "moment";
|
3
|
+
import { log } from "../../../utils/logger";
|
4
|
+
import { Pricer } from "../../../utils/pricer";
|
5
|
+
import { fetchAmbientPotentialPositions } from "../utils/fetchAmbientInfo";
|
6
|
+
var AmbientPositionType;
|
7
|
+
(function (AmbientPositionType) {
|
8
|
+
AmbientPositionType["Concentrated"] = "concentrated";
|
9
|
+
AmbientPositionType["Ambient"] = "ambient";
|
10
|
+
AmbientPositionType["Knockout"] = "knockout";
|
11
|
+
})(AmbientPositionType || (AmbientPositionType = {}));
|
12
|
+
function encodeCall(chainId, holder) {
|
13
|
+
if (holder.positionType === AmbientPositionType.Concentrated) {
|
14
|
+
return [
|
15
|
+
{
|
16
|
+
allowFailure: true,
|
17
|
+
callData: AmbientLens.encodeFunctionData("queryRangeTokens", [
|
18
|
+
holder.owner,
|
19
|
+
holder.base,
|
20
|
+
holder.quote,
|
21
|
+
holder.poolIdx,
|
22
|
+
holder.lowerTick,
|
23
|
+
holder.upperTick,
|
24
|
+
]),
|
25
|
+
target: AmbientAddresses[chainId].CrocQuery,
|
26
|
+
},
|
27
|
+
];
|
28
|
+
}
|
29
|
+
return [
|
30
|
+
{
|
31
|
+
allowFailure: true,
|
32
|
+
callData: AmbientLens.encodeFunctionData("queryAmbientTokens", [
|
33
|
+
holder.owner,
|
34
|
+
holder.base,
|
35
|
+
holder.quote,
|
36
|
+
holder.poolIdx,
|
37
|
+
]),
|
38
|
+
target: AmbientAddresses[chainId].CrocQuery,
|
39
|
+
},
|
40
|
+
];
|
41
|
+
}
|
42
|
+
async function decodeCall(result, holder) {
|
43
|
+
let amount0 = BigInt(0n);
|
44
|
+
let amount1 = BigInt(0n);
|
45
|
+
if (holder.positionType === AmbientPositionType.Concentrated) {
|
46
|
+
const resTok = AmbientLens.decodeFunctionResult("queryRangeTokens", result);
|
47
|
+
amount0 = BigInt(resTok[1]);
|
48
|
+
amount1 = BigInt(resTok[2]);
|
49
|
+
}
|
50
|
+
if (holder.positionType === AmbientPositionType.Ambient) {
|
51
|
+
const resTok = AmbientLens.decodeFunctionResult("queryAmbientTokens", result);
|
52
|
+
amount0 = BigInt(resTok[1]);
|
53
|
+
amount1 = BigInt(resTok[2]);
|
54
|
+
}
|
55
|
+
return { amount0, amount1 };
|
56
|
+
}
|
57
|
+
export async function AmbientDynamicData(chainId, campaigns) {
|
58
|
+
const dynamicData = [];
|
59
|
+
const pricer = await Pricer.load();
|
60
|
+
let calls = [];
|
61
|
+
/** Dedupe pools from campaigns to build pool list */
|
62
|
+
const poolList = [];
|
63
|
+
for (const campaign of campaigns ?? []) {
|
64
|
+
/** Loop through all campaigns to add pools */
|
65
|
+
if (!poolList?.map(p => p.mainParameter.toLowerCase()).includes(campaign.mainParameter.toLowerCase())) {
|
66
|
+
poolList.push({
|
67
|
+
id: campaign.campaignParameters.poolId,
|
68
|
+
mainParameter: campaign.mainParameter, // main parameter containes info of poolAddress + AMM (in case its a priority AMM)
|
69
|
+
baseToken: campaign.campaignParameters.baseToken,
|
70
|
+
quoteToken: campaign.campaignParameters.quoteToken,
|
71
|
+
poolIdx: campaign.campaignParameters.poolIdx,
|
72
|
+
potentialHolders: await fetchAmbientPotentialPositions(campaign.campaignParameters.poolId, campaign.chainId),
|
73
|
+
});
|
74
|
+
}
|
75
|
+
}
|
76
|
+
if (!!poolList) {
|
77
|
+
for (const pool of poolList) {
|
78
|
+
calls.push({
|
79
|
+
allowFailure: true,
|
80
|
+
callData: AmbientLens.encodeFunctionData("queryLiquidity", [pool.baseToken, pool.quoteToken, pool.poolIdx]),
|
81
|
+
target: AmbientAddresses[chainId].CrocQuery,
|
82
|
+
}, {
|
83
|
+
allowFailure: true,
|
84
|
+
callData: AmbientLens.encodeFunctionData("queryCurveTick", [pool.baseToken, pool.quoteToken, pool.poolIdx]),
|
85
|
+
target: AmbientAddresses[chainId].CrocQuery,
|
86
|
+
});
|
87
|
+
calls = calls.concat(...pool.potentialHolders.map(holder => encodeCall(chainId, holder)));
|
88
|
+
}
|
89
|
+
return {
|
90
|
+
cached: false,
|
91
|
+
call: {
|
92
|
+
callData: calls,
|
93
|
+
handler: () => { },
|
94
|
+
reducer: async (result) => {
|
95
|
+
let i = 0;
|
96
|
+
if (!!poolList) {
|
97
|
+
for (const pool of poolList) {
|
98
|
+
// This liquidity call gives the active liquidity on the pool. To get the total liquidity we would need to loop over all positions
|
99
|
+
let poolTotalLiquidity;
|
100
|
+
let activeTick;
|
101
|
+
let poolBalanceToken0 = 0;
|
102
|
+
let poolBalanceToken1 = 0;
|
103
|
+
const d = campaigns?.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())[0];
|
104
|
+
const decimalsBaseToken = d.campaignParameters.decimalsBaseToken;
|
105
|
+
const decimalsQuoteToken = d.campaignParameters.decimalsQuoteToken;
|
106
|
+
const symbolBaseToken = d.campaignParameters.symbolBaseToken;
|
107
|
+
const symbolQuoteToken = d.campaignParameters.symbolQuoteToken;
|
108
|
+
const prevI = i;
|
109
|
+
try {
|
110
|
+
poolTotalLiquidity = BN2Number(AmbientLens.decodeFunctionResult("queryLiquidity", result[i++])[0]);
|
111
|
+
activeTick = Number(AmbientLens.decodeFunctionResult("queryCurveTick", result[i++])[0]);
|
112
|
+
for (let index = 0; index < pool.potentialHolders.length; index++) {
|
113
|
+
// to verify
|
114
|
+
if (calls.length === 0) {
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
const res = await decodeCall(result[i++], pool.potentialHolders[index]);
|
118
|
+
poolBalanceToken0 += BN2Number(res.amount0, decimalsBaseToken);
|
119
|
+
poolBalanceToken1 += BN2Number(res.amount1, decimalsQuoteToken);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
catch (e) {
|
123
|
+
log.warn(`merklDynamic data - failed to decode state of pool ${pool.id} on ${NETWORK_LABELS[chainId]}`);
|
124
|
+
i = prevI + 2 + pool.potentialHolders.length;
|
125
|
+
continue;
|
126
|
+
}
|
127
|
+
const priceToken0 = (await pricer.get({
|
128
|
+
address: d.campaignParameters.baseToken,
|
129
|
+
chainId: chainId,
|
130
|
+
symbol: symbolBaseToken,
|
131
|
+
})) ?? 2800;
|
132
|
+
const priceToken1 = (await pricer.get({
|
133
|
+
address: d.campaignParameters.quoteToken,
|
134
|
+
chainId: chainId,
|
135
|
+
symbol: symbolQuoteToken,
|
136
|
+
}));
|
137
|
+
/** Iterate over distributions to compute APRs */
|
138
|
+
for (const campaign of campaigns.filter(campaign => campaign.mainParameter.toLowerCase() === pool.mainParameter.toLowerCase())) {
|
139
|
+
const c = campaign;
|
140
|
+
const amount = BN2Number(c.amount, c.campaignParameters.decimalsRewardToken);
|
141
|
+
const startTimestamp = BN2Number(c.startTimestamp, 0);
|
142
|
+
const endTimestamp = BN2Number(c.endTimestamp, 0);
|
143
|
+
const isLive = moment().unix() >= startTimestamp && moment().unix() < endTimestamp;
|
144
|
+
const totalWeight = BN2Number(c.campaignParameters.weightFees, 4) +
|
145
|
+
BN2Number(c.campaignParameters.weightToken0, 4) +
|
146
|
+
BN2Number(c.campaignParameters.weightToken1, 4);
|
147
|
+
// Proportions in percentage
|
148
|
+
const propFees = (BN2Number(c.campaignParameters.weightFees, 4) / totalWeight) * 100;
|
149
|
+
const propToken0 = (BN2Number(c.campaignParameters.weightToken0, 4) / totalWeight) * 100;
|
150
|
+
const propToken1 = (BN2Number(c.campaignParameters.weightToken1, 4) / totalWeight) * 100;
|
151
|
+
let distributionMeanAPR = 0;
|
152
|
+
const aprs = {};
|
153
|
+
const aprBreakdowns = [];
|
154
|
+
let priceRewardToken = 0;
|
155
|
+
if (isLive && c.campaignParameters.symbolRewardToken !== "aglaMerkl") {
|
156
|
+
priceRewardToken = (await pricer.get({
|
157
|
+
address: c.rewardToken,
|
158
|
+
chainId: chainId,
|
159
|
+
symbol: c.campaignParameters.symbolRewardToken,
|
160
|
+
}));
|
161
|
+
/** Yearly rewards in $ */
|
162
|
+
const yearlyToken0Rewards = (propToken0 * priceRewardToken * amount * YEAR) / (endTimestamp - startTimestamp);
|
163
|
+
const yearlyToken1Rewards = (propToken1 * priceRewardToken * amount * YEAR) / (endTimestamp - startTimestamp);
|
164
|
+
const yearlyFeeRewards = (propFees * priceRewardToken * amount * YEAR) / (endTimestamp - startTimestamp);
|
165
|
+
let poolAPRkey = "";
|
166
|
+
const tvl = poolBalanceToken0 * priceToken0 + poolBalanceToken1 * priceToken1;
|
167
|
+
distributionMeanAPR = (yearlyToken0Rewards + yearlyToken1Rewards + yearlyFeeRewards) / tvl;
|
168
|
+
distributionMeanAPR =
|
169
|
+
!distributionMeanAPR || Number.isNaN(distributionMeanAPR) ? 0 : distributionMeanAPR;
|
170
|
+
/**
|
171
|
+
* @dev We cannot include a whitelisted distrib apr into the mean APR
|
172
|
+
*/
|
173
|
+
if (c.campaignParameters.whitelist.length === 0) {
|
174
|
+
poolAPRkey = "Average APR (rewards / pool TVL)";
|
175
|
+
if (!aprs[poolAPRkey])
|
176
|
+
aprs[poolAPRkey] = 0;
|
177
|
+
aprs[poolAPRkey] += distributionMeanAPR;
|
178
|
+
// @Hugo wip: new way to structure aprBreakdowns
|
179
|
+
aprBreakdowns.push({
|
180
|
+
address: pool.id,
|
181
|
+
value: distributionMeanAPR,
|
182
|
+
type: EAprBreakdownType.AVERAGE,
|
183
|
+
label: "Average APR (rewards / pool TVL)",
|
184
|
+
});
|
185
|
+
// APR per token
|
186
|
+
poolAPRkey = `APR for holding ${c.campaignParameters.symbolBaseToken} in pool`;
|
187
|
+
if (!aprs[poolAPRkey])
|
188
|
+
aprs[poolAPRkey] = 0;
|
189
|
+
aprs[poolAPRkey] += yearlyToken0Rewards / (poolBalanceToken0 * priceToken0);
|
190
|
+
// @Hugo wip: new way to structure aprBreakdowns
|
191
|
+
aprBreakdowns.push({
|
192
|
+
address: pool.id,
|
193
|
+
value: yearlyToken0Rewards / (poolBalanceToken0 * priceToken0),
|
194
|
+
type: EAprBreakdownType.TOKEN1,
|
195
|
+
label: c.campaignParameters.symbolBaseToken,
|
196
|
+
});
|
197
|
+
poolAPRkey = `APR for holding ${c.campaignParameters.symbolQuoteToken} in pool`;
|
198
|
+
if (!aprs[poolAPRkey])
|
199
|
+
aprs[poolAPRkey] = 0;
|
200
|
+
aprs[poolAPRkey] += yearlyToken1Rewards / (poolBalanceToken1 * priceToken1);
|
201
|
+
// @Hugo wip: new way to structure aprBreakdowns
|
202
|
+
aprBreakdowns.push({
|
203
|
+
address: pool.id,
|
204
|
+
value: yearlyToken1Rewards / (poolBalanceToken1 * priceToken1),
|
205
|
+
type: EAprBreakdownType.TOKEN2,
|
206
|
+
label: c.campaignParameters.symbolQuoteToken,
|
207
|
+
});
|
208
|
+
}
|
209
|
+
else {
|
210
|
+
}
|
211
|
+
}
|
212
|
+
dynamicData.push({
|
213
|
+
...campaign,
|
214
|
+
apr: distributionMeanAPR,
|
215
|
+
aprs,
|
216
|
+
forwarders: [],
|
217
|
+
poolBalanceToken0,
|
218
|
+
poolBalanceToken1,
|
219
|
+
poolTotalLiquidity,
|
220
|
+
tick: activeTick,
|
221
|
+
priceRewardToken: priceRewardToken,
|
222
|
+
tvl: poolBalanceToken0 * priceToken0 + poolBalanceToken1 * priceToken1,
|
223
|
+
});
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
return dynamicData;
|
228
|
+
},
|
229
|
+
},
|
230
|
+
};
|
231
|
+
}
|
232
|
+
// Fallback in case something fails
|
233
|
+
return {
|
234
|
+
cached: false,
|
235
|
+
call: {
|
236
|
+
callData: [],
|
237
|
+
handler: () => { },
|
238
|
+
reducer: async (_result) => {
|
239
|
+
return campaigns;
|
240
|
+
},
|
241
|
+
},
|
242
|
+
};
|
243
|
+
}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { UserService } from "../../modules/v4/user";
|
2
2
|
import { Campaign } from "@sdk";
|
3
3
|
import { AjnaDynamicData } from "./campaignTypes/AjnaDynamicData";
|
4
|
+
import { AmbientDynamicData } from "./campaignTypes/AmbientDynamicData";
|
4
5
|
import { BadgerDynamicData } from "./campaignTypes/BadgerDynamicData";
|
5
6
|
import { CLAMMDynamicData } from "./campaignTypes/CLAMMDynamicData";
|
6
7
|
import { CompoundDynamicData } from "./campaignTypes/CompoundDynamicData";
|
@@ -79,6 +80,9 @@ export async function campaignsDynamicData(chainId, campaigns, type) {
|
|
79
80
|
case Campaign.HYPERDRIVELOGFIXPROCESSOR: {
|
80
81
|
return HyperdriveDynamicData(chainId, campaigns);
|
81
82
|
}
|
83
|
+
case Campaign.AMBIENTPROCESSOR: {
|
84
|
+
return AmbientDynamicData(chainId, campaigns);
|
85
|
+
}
|
82
86
|
}
|
83
87
|
return {
|
84
88
|
cached: false,
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { type ChainId } from "@sdk";
|
2
|
+
export type AmbientHolderType = {
|
3
|
+
owner: string;
|
4
|
+
base: string;
|
5
|
+
quote: string;
|
6
|
+
poolIdx: number;
|
7
|
+
lowerTick: number;
|
8
|
+
upperTick: number;
|
9
|
+
positionType: string;
|
10
|
+
};
|
11
|
+
export declare const holdersQuery: string;
|
12
|
+
export declare function fetchAmbientPotentialPositions(poolId: string, chainId: ChainId): Promise<AmbientHolderType[]>;
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { subgraphAmbientEndpoints, withRetry } from "@sdk";
|
2
|
+
import { gql, request } from "graphql-request";
|
3
|
+
const BATCH_NUMBER = 1000;
|
4
|
+
export const holdersQuery = gql `
|
5
|
+
query LiquidityChanges($poolId: String!, $minId: String!) {
|
6
|
+
liquidityChanges(
|
7
|
+
where: { pool_: { id: $poolId }, id_gt: $minId , positionType_not: "knockout"},
|
8
|
+
first: ${BATCH_NUMBER},
|
9
|
+
orderBy: pool__id
|
10
|
+
) {
|
11
|
+
id
|
12
|
+
user
|
13
|
+
positionType
|
14
|
+
bidTick
|
15
|
+
askTick
|
16
|
+
pool {
|
17
|
+
base
|
18
|
+
quote
|
19
|
+
poolIdx
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
`;
|
24
|
+
export async function fetchAmbientPotentialPositions(poolId, chainId) {
|
25
|
+
let isFullyFetched = false;
|
26
|
+
let holders = [];
|
27
|
+
let minId = "";
|
28
|
+
while (!isFullyFetched) {
|
29
|
+
const data = await withRetry(request, [
|
30
|
+
subgraphAmbientEndpoints[chainId],
|
31
|
+
holdersQuery,
|
32
|
+
{
|
33
|
+
poolId: poolId,
|
34
|
+
minId: minId,
|
35
|
+
},
|
36
|
+
]);
|
37
|
+
const fetchedHolders = data.liquidityChanges?.map(entry => {
|
38
|
+
return {
|
39
|
+
owner: entry.user,
|
40
|
+
base: entry.pool.base,
|
41
|
+
quote: entry.pool.quote,
|
42
|
+
poolIdx: Number(entry.pool.poolIdx),
|
43
|
+
lowerTick: Number(entry.bidTick),
|
44
|
+
upperTick: Number(entry.askTick),
|
45
|
+
positionType: entry.positionType,
|
46
|
+
};
|
47
|
+
});
|
48
|
+
if (fetchedHolders.length < BATCH_NUMBER) {
|
49
|
+
isFullyFetched = true;
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
minId = data.liquidityChanges[fetchedHolders.length - 1].id;
|
53
|
+
}
|
54
|
+
holders = holders.concat(fetchedHolders);
|
55
|
+
}
|
56
|
+
// Only keep unique positions
|
57
|
+
holders = Array.from(new Set(holders.map(h => JSON.stringify(h)))).map(h => JSON.parse(h));
|
58
|
+
return holders;
|
59
|
+
}
|
@@ -112,7 +112,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
112
112
|
body: unknown;
|
113
113
|
params: {};
|
114
114
|
query: {
|
115
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
115
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR" | undefined;
|
116
116
|
items?: number | undefined;
|
117
117
|
subType?: number | undefined;
|
118
118
|
page?: number | undefined;
|
@@ -186,7 +186,7 @@ export declare const CampaignController: Elysia<"/campaigns", false, {
|
|
186
186
|
body: unknown;
|
187
187
|
params: {};
|
188
188
|
query: {
|
189
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
189
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR" | undefined;
|
190
190
|
items?: number | undefined;
|
191
191
|
subType?: number | undefined;
|
192
192
|
page?: number | undefined;
|
@@ -42,6 +42,7 @@ export declare const campaignTypeToEnumMap: {
|
|
42
42
|
readonly ERC20_FIX_APR: any;
|
43
43
|
readonly HYPERDRIVELOGPROCESSOR: any;
|
44
44
|
readonly HYPERDRIVELOGFIXPROCESSOR: any;
|
45
|
+
readonly AMBIENTPROCESSOR: any;
|
45
46
|
};
|
46
47
|
export type ConvertedCampaignType<C extends CampaignType> = (typeof campaignTypeToEnumMap)[C];
|
47
48
|
export declare const CampaignUniqueDto: import("@sinclair/typebox").TObject<{
|
@@ -149,6 +150,7 @@ export declare const GetCampaignQueryDto: import("@sinclair/typebox").TObject<{
|
|
149
150
|
ERC20_FIX_APR: "ERC20_FIX_APR";
|
150
151
|
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
151
152
|
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
153
|
+
AMBIENTPROCESSOR: "AMBIENTPROCESSOR";
|
152
154
|
}>>;
|
153
155
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
154
156
|
campaignId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -29,6 +29,7 @@ export const campaignTypeToEnumMap = {
|
|
29
29
|
ERC20_FIX_APR: CampaignTypeEnum.ERC20_FIX_APR,
|
30
30
|
HYPERDRIVELOGPROCESSOR: CampaignTypeEnum.HYPERDRIVELOGPROCESSOR,
|
31
31
|
HYPERDRIVELOGFIXPROCESSOR: CampaignTypeEnum.HYPERDRIVELOGFIXPROCESSOR,
|
32
|
+
AMBIENTPROCESSOR: CampaignTypeEnum.AMBIENTPROCESSOR,
|
32
33
|
};
|
33
34
|
// ─── DTOs ────────────────────────────────────────────────────────────────────
|
34
35
|
export const CampaignUniqueDto = t.Object({
|
@@ -17,7 +17,7 @@ export declare abstract class CampaignRepository {
|
|
17
17
|
gte: number;
|
18
18
|
} | undefined;
|
19
19
|
subType: number | undefined;
|
20
|
-
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
20
|
+
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR" | undefined;
|
21
21
|
creatorAddress: string | undefined;
|
22
22
|
RewardToken: {
|
23
23
|
address: string | undefined;
|
@@ -62,7 +62,7 @@ export declare const DynamicDataController: Elysia<"/dynamic-data", false, {
|
|
62
62
|
rewardTokenAddress?: string | undefined;
|
63
63
|
distributionChain?: {} | undefined;
|
64
64
|
opportunityIdentifier?: string | undefined;
|
65
|
-
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
|
65
|
+
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR";
|
66
66
|
params: {};
|
67
67
|
computeChainId: number;
|
68
68
|
};
|
@@ -84,7 +84,7 @@ export declare const DynamicDataController: Elysia<"/dynamic-data", false, {
|
|
84
84
|
body: unknown;
|
85
85
|
params: {};
|
86
86
|
query: {
|
87
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
87
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR" | undefined;
|
88
88
|
items?: number | undefined;
|
89
89
|
subType?: number | undefined;
|
90
90
|
page?: number | undefined;
|
@@ -41,6 +41,7 @@ export declare const SimplifiedCampaignDto: import("@sinclair/typebox").TObject<
|
|
41
41
|
ERC20_FIX_APR: "ERC20_FIX_APR";
|
42
42
|
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
43
43
|
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
44
|
+
AMBIENTPROCESSOR: "AMBIENTPROCESSOR";
|
44
45
|
}>;
|
45
46
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
46
47
|
rewardTokenAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -89,6 +90,7 @@ export declare const FilledCampaignDto: import("@sinclair/typebox").TObject<{
|
|
89
90
|
ERC20_FIX_APR: "ERC20_FIX_APR";
|
90
91
|
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
91
92
|
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
93
|
+
AMBIENTPROCESSOR: "AMBIENTPROCESSOR";
|
92
94
|
}>;
|
93
95
|
subType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
94
96
|
rewardTokenAddress: import("@sinclair/typebox").TString;
|
@@ -84,6 +84,10 @@ export class DynamicDataService {
|
|
84
84
|
parsedParams = campaign.params;
|
85
85
|
targetToken = parsedParams.poolAddress;
|
86
86
|
}
|
87
|
+
else if (campaign.type === Campaign[Campaign.AMBIENTPROCESSOR]) {
|
88
|
+
parsedParams = campaign.params;
|
89
|
+
targetToken = parsedParams.poolId;
|
90
|
+
}
|
87
91
|
else {
|
88
92
|
parsedParams = campaign.params;
|
89
93
|
targetToken = parsedParams.targetToken;
|
@@ -21,7 +21,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
21
21
|
depositUrl?: string | undefined;
|
22
22
|
protocols?: string[] | undefined;
|
23
23
|
mainProtocol?: string | undefined;
|
24
|
-
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR";
|
24
|
+
type: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR";
|
25
25
|
tokens: {
|
26
26
|
chainId: number;
|
27
27
|
address: string;
|
@@ -91,7 +91,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
91
91
|
} & {
|
92
92
|
price?: number | null | undefined;
|
93
93
|
})[];
|
94
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
94
|
+
mainProtocol: "morpho" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
95
95
|
depositUrl: any;
|
96
96
|
tags: string[];
|
97
97
|
};
|
@@ -362,7 +362,7 @@ export declare const OpportunityController: Elysia<"/opportunities", false, {
|
|
362
362
|
body: unknown;
|
363
363
|
params: {};
|
364
364
|
query: {
|
365
|
-
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | undefined;
|
365
|
+
type?: "INVALID" | "ERC20" | "CLAMM" | "ERC20_SNAPSHOT" | "JSON_AIRDROP" | "SILO" | "RADIANT" | "MORPHO" | "DOLOMITE" | "BADGER" | "COMPOUND" | "AJNA" | "EULER" | "UNISWAP_V4" | "ION" | "EIGENLAYER" | "ERC20TRANSFERS" | "ERC20LOGPROCESSOR" | "ERC20REBASELOGPROCESSOR" | "VEST" | "ERC20_FIX_APR" | "HYPERDRIVELOGPROCESSOR" | "HYPERDRIVELOGFIXPROCESSOR" | "AMBIENTPROCESSOR" | undefined;
|
366
366
|
items?: number | undefined;
|
367
367
|
subType?: number | undefined;
|
368
368
|
page?: number | undefined;
|
@@ -324,6 +324,7 @@ export declare const CreateOpportunityDto: import("@sinclair/typebox").TObject<{
|
|
324
324
|
ERC20_FIX_APR: "ERC20_FIX_APR";
|
325
325
|
HYPERDRIVELOGPROCESSOR: "HYPERDRIVELOGPROCESSOR";
|
326
326
|
HYPERDRIVELOGFIXPROCESSOR: "HYPERDRIVELOGFIXPROCESSOR";
|
327
|
+
AMBIENTPROCESSOR: "AMBIENTPROCESSOR";
|
327
328
|
}>;
|
328
329
|
identifier: import("@sinclair/typebox").TString;
|
329
330
|
name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
@@ -34,7 +34,7 @@ export declare abstract class OpportunityService {
|
|
34
34
|
name: string;
|
35
35
|
status: "SOON";
|
36
36
|
action: import("../../../../database/api/.generated").$Enums.OpportunityAction;
|
37
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
37
|
+
mainProtocol: "morpho" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
38
38
|
depositUrl: any;
|
39
39
|
tags: string[];
|
40
40
|
}>;
|
@@ -59,7 +59,7 @@ export declare abstract class OpportunityService {
|
|
59
59
|
} & {
|
60
60
|
price?: number | null | undefined;
|
61
61
|
})[];
|
62
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
62
|
+
mainProtocol: "morpho" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
63
63
|
depositUrl: any;
|
64
64
|
tags: string[];
|
65
65
|
}>;
|
@@ -83,7 +83,7 @@ export declare abstract class OpportunityService {
|
|
83
83
|
verified: boolean;
|
84
84
|
isTest: boolean;
|
85
85
|
}[];
|
86
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
86
|
+
mainProtocol: "morpho" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
87
87
|
depositUrl: string | undefined;
|
88
88
|
tags: string[];
|
89
89
|
}>;
|
@@ -111,7 +111,7 @@ export declare abstract class OpportunityService {
|
|
111
111
|
} & {
|
112
112
|
price?: number | null | undefined;
|
113
113
|
})[];
|
114
|
-
mainProtocol: "morpho" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
114
|
+
mainProtocol: "morpho" | "ambient" | "arthswap" | "baseswap" | "camelot" | "crust" | "fenix" | "horiza" | "izumi" | "kim" | "pancakeswap-v3" | "quickswap-algebra" | "quickswap-uni" | "ramses" | "retro" | "stryke" | "stryke-pcs" | "stryke-sushi" | "sushiswap-v3" | "swapr" | "thruster" | "uniswap-v3" | "voltage" | "zero" | "koi" | "supswap-v3" | "zkswap" | "thirdtrade" | "uniswap-v2" | "velodrome" | "aerodrome" | "balancer" | "curve" | "cross_curve" | "curveNPool" | "aura" | "akron" | "beefy" | "dragonswap" | "poolside" | "syncswap-v3" | "neptune" | "zkSwapThreePool" | "syncswap" | "rfx" | "radiant" | "aave" | "euler" | "gearbox" | "compound" | "sturdy" | "frax" | "ionic" | "moonwell" | "fluid" | "silo" | "coumpound" | "dolomite" | "badger" | "ajna" | "layerbank" | "ion" | "venus" | "woofi" | "reactor_fusion" | "eigenlayer" | "vest" | "zerolend" | "hyperdrive" | undefined;
|
115
115
|
depositUrl: any;
|
116
116
|
tags: string[];
|
117
117
|
}>;
|
@@ -11,6 +11,7 @@ import { TokenService } from "../token";
|
|
11
11
|
import { UserService } from "../user";
|
12
12
|
import { OpportunityRepository } from "./opportunity.repository";
|
13
13
|
import { getAjnaMetadata } from "./subservices/getAjnaMetadata.service";
|
14
|
+
import { getAmbientMetadata } from "./subservices/getAmbientMetadata.service";
|
14
15
|
import { getBadgerMetadata } from "./subservices/getBadgerMetadata.service";
|
15
16
|
import { getClammMetadata } from "./subservices/getClammMetadata.service";
|
16
17
|
import { getCompoundMetadata } from "./subservices/getCompoundMetadata.service";
|
@@ -86,6 +87,8 @@ export class OpportunityService {
|
|
86
87
|
case "HYPERDRIVELOGPROCESSOR":
|
87
88
|
case "HYPERDRIVELOGFIXPROCESSOR":
|
88
89
|
return getHyperdriveMetadata(chainId, campaignParams.subCampaignType, campaignParams);
|
90
|
+
case "AMBIENTPROCESSOR":
|
91
|
+
return getAmbientMetadata(chainId, campaignParams);
|
89
92
|
case "INVALID":
|
90
93
|
return {
|
91
94
|
name: "Invalid Campaigns",
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { OpportunityAction } from "../../../../../database/api/.generated";
|
2
|
+
import { almName } from "@sdk";
|
3
|
+
import { getAddress } from "viem";
|
4
|
+
export const getAmbientMetadata = (chainId, params) => {
|
5
|
+
const platform = "Ambient";
|
6
|
+
let whitelistNameString = "";
|
7
|
+
if (params.whitelist.length > 0) {
|
8
|
+
for (const whitelist of params.whitelist) {
|
9
|
+
if (whitelistNameString.length > 0) {
|
10
|
+
whitelistNameString += "or";
|
11
|
+
}
|
12
|
+
const forwarder = params.forwarders.find(x => getAddress(x.sender) === getAddress(whitelist));
|
13
|
+
const forwarderType = forwarder?.type;
|
14
|
+
const forwarderName = !!forwarderType ? almName(forwarderType) : null;
|
15
|
+
if (!!forwarderName) {
|
16
|
+
whitelistNameString += ` ${forwarderName} `;
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
return {
|
21
|
+
name: `Provide liquidity to ${whitelistNameString} ${platform} ${params.baseToken}-${params.quoteToken}`,
|
22
|
+
action: OpportunityAction.POOL,
|
23
|
+
tokens: [
|
24
|
+
{ chainId, address: params.baseToken },
|
25
|
+
{ chainId, address: params.quoteToken },
|
26
|
+
],
|
27
|
+
mainProtocol: "ambient",
|
28
|
+
};
|
29
|
+
};
|
@@ -5,7 +5,7 @@ import type { Resource } from "../prisma";
|
|
5
5
|
* @see {@link Resource}
|
6
6
|
*/
|
7
7
|
export type Protocol = Resource<"Protocol">;
|
8
|
-
declare const protocolTypes: readonly ["arthswap", "baseswap", "camelot", "crust", "fenix", "horiza", "izumi", "kim", "pancakeswap-v3", "quickswap-algebra", "quickswap-uni", "ramses", "retro", "stryke", "stryke-pcs", "stryke-sushi", "sushiswap-v3", "swapr", "thruster", "uniswap-v3", "voltage", "zero", "koi", "supswap-v3", "zkswap", "thirdtrade", "uniswap-v2", "velodrome", "aerodrome", "balancer", "curve", "cross_curve", "curveNPool", "aura", "akron", "beefy", "dragonswap", "poolside", "koi", "syncswap-v3", "neptune", "zkSwapThreePool", "syncswap", "rfx", "radiant", "aave", "euler", "gearbox", "compound", "sturdy", "frax", "ionic", "moonwell", "fluid", "silo", "morpho", "coumpound", "dolomite", "badger", "ajna", "layerbank", "ion", "venus", "woofi", "reactor_fusion", "eigenlayer", "vest", "zerolend", "hyperdrive"];
|
8
|
+
declare const protocolTypes: readonly ["ambient", "arthswap", "baseswap", "camelot", "crust", "fenix", "horiza", "izumi", "kim", "pancakeswap-v3", "quickswap-algebra", "quickswap-uni", "ramses", "retro", "stryke", "stryke-pcs", "stryke-sushi", "sushiswap-v3", "swapr", "thruster", "uniswap-v3", "voltage", "zero", "koi", "supswap-v3", "zkswap", "thirdtrade", "uniswap-v2", "velodrome", "aerodrome", "balancer", "curve", "cross_curve", "curveNPool", "aura", "akron", "beefy", "dragonswap", "poolside", "koi", "syncswap-v3", "neptune", "zkSwapThreePool", "syncswap", "rfx", "radiant", "aave", "euler", "gearbox", "compound", "sturdy", "frax", "ionic", "moonwell", "fluid", "silo", "morpho", "coumpound", "dolomite", "badger", "ajna", "layerbank", "ion", "venus", "woofi", "reactor_fusion", "eigenlayer", "vest", "zerolend", "hyperdrive"];
|
9
9
|
export type ProtocolId = (typeof protocolTypes)[number];
|
10
10
|
export declare const ProtocolResourceDto: import("@sinclair/typebox").TObject<{
|
11
11
|
id: import("@sinclair/typebox").TString;
|