@merkl/api 0.10.311 → 0.10.313
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/src/eden/index.d.ts +126 -21
- package/dist/src/index.d.ts +46 -13
- package/dist/src/modules/v4/explorer/explorer.controller.js +1 -1
- package/dist/src/modules/v4/reward/reward.controller.d.ts +6 -4
- package/dist/src/modules/v4/reward/reward.controller.js +7 -2
- package/dist/src/modules/v4/reward/reward.repository.d.ts +4 -10
- package/dist/src/modules/v4/reward/reward.repository.js +18 -9
- package/dist/src/modules/v4/reward/reward.service.d.ts +6 -4
- package/dist/src/modules/v4/reward/reward.service.js +26 -32
- package/dist/src/modules/v4/router.d.ts +46 -13
- package/dist/src/modules/v4/status/status.controller.d.ts +40 -9
- package/dist/src/modules/v4/status/status.controller.js +17 -4
- package/dist/src/modules/v4/status/status.model.d.ts +6 -0
- package/dist/src/modules/v4/status/status.model.js +5 -0
- package/dist/src/modules/v4/status/status.repository.d.ts +19 -1
- package/dist/src/modules/v4/status/status.repository.js +25 -0
- package/dist/src/modules/v4/status/status.service.d.ts +21 -1
- package/dist/src/modules/v4/status/status.service.js +16 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +3 -1
@@ -43,9 +43,7 @@ export declare const StatusController: Elysia<"/campaign-status", false, {
|
|
43
43
|
};
|
44
44
|
};
|
45
45
|
};
|
46
|
-
}
|
47
|
-
} & {
|
48
|
-
"campaign-status": {
|
46
|
+
} & {
|
49
47
|
engine: {
|
50
48
|
overlaps: {
|
51
49
|
get: {
|
@@ -64,9 +62,7 @@ export declare const StatusController: Elysia<"/campaign-status", false, {
|
|
64
62
|
};
|
65
63
|
};
|
66
64
|
};
|
67
|
-
}
|
68
|
-
} & {
|
69
|
-
"campaign-status": {
|
65
|
+
} & {
|
70
66
|
index: {
|
71
67
|
get: {
|
72
68
|
body: unknown;
|
@@ -88,9 +84,7 @@ export declare const StatusController: Elysia<"/campaign-status", false, {
|
|
88
84
|
};
|
89
85
|
};
|
90
86
|
};
|
91
|
-
}
|
92
|
-
} & {
|
93
|
-
"campaign-status": {
|
87
|
+
} & {
|
94
88
|
":campaignId": {
|
95
89
|
get: {
|
96
90
|
body: unknown;
|
@@ -118,6 +112,43 @@ export declare const StatusController: Elysia<"/campaign-status", false, {
|
|
118
112
|
};
|
119
113
|
};
|
120
114
|
};
|
115
|
+
} & {
|
116
|
+
delay: {
|
117
|
+
index: {
|
118
|
+
get: {
|
119
|
+
body: unknown;
|
120
|
+
params: {};
|
121
|
+
query: {
|
122
|
+
chainId?: number | undefined;
|
123
|
+
endTimestampLowerBound?: number | undefined;
|
124
|
+
delayLowerBound?: number | undefined;
|
125
|
+
};
|
126
|
+
headers: unknown;
|
127
|
+
response: {
|
128
|
+
200: {
|
129
|
+
delay: number;
|
130
|
+
delayFormatted: string;
|
131
|
+
startTimestamp: bigint;
|
132
|
+
endTimestamp: bigint;
|
133
|
+
computeChainId: number;
|
134
|
+
distributionChainId: number;
|
135
|
+
campaignId: string;
|
136
|
+
Opportunity: {
|
137
|
+
name: string;
|
138
|
+
};
|
139
|
+
CampaignStatus: {
|
140
|
+
error: string;
|
141
|
+
details: import("database/api/.generated/runtime/library").JsonValue;
|
142
|
+
status: import("../../../../database/api/.generated").$Enums.RunStatus;
|
143
|
+
campaignId: string;
|
144
|
+
computedUntil: bigint;
|
145
|
+
processingStarted: bigint;
|
146
|
+
}[];
|
147
|
+
}[];
|
148
|
+
};
|
149
|
+
};
|
150
|
+
};
|
151
|
+
};
|
121
152
|
};
|
122
153
|
}, {
|
123
154
|
derive: {};
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { AuthorizationHeadersDto, EngineGuard } from "../../../guards/Engine.guard";
|
2
|
+
import { throwOnUnsupportedChainId } from "../../../utils/throw";
|
2
3
|
import Elysia from "elysia";
|
3
|
-
import { CampaignUniqueDto, QueryCampaignStatusDto, UpdateCampaignStatusDto } from "./status.model";
|
4
|
+
import { CampaignUniqueDto, DelayDto, QueryCampaignStatusDto, UpdateCampaignStatusDto } from "./status.model";
|
4
5
|
import { StatusService } from "./status.service";
|
5
6
|
export const StatusController = new Elysia({ prefix: "/campaign-status", detail: { tags: ["Status"], hide: true } })
|
6
7
|
// ─── Update a Campaign Status ──────────────────────────────────────
|
@@ -12,15 +13,15 @@ export const StatusController = new Elysia({ prefix: "/campaign-status", detail:
|
|
12
13
|
headers: AuthorizationHeadersDto,
|
13
14
|
body: UpdateCampaignStatusDto,
|
14
15
|
})
|
15
|
-
// ─── Is Safe For Overlaps
|
16
|
+
// ─── Is Safe For Overlaps ───────────────────────────────────────────
|
16
17
|
.get("/engine/overlaps", async ({ query }) => await StatusService.isSafeForOverlaps(query), {
|
17
18
|
beforeHandle: EngineGuard,
|
18
19
|
headers: AuthorizationHeadersDto,
|
19
20
|
query: CampaignUniqueDto,
|
20
21
|
})
|
21
|
-
// ─── Find Many Status
|
22
|
+
// ─── Find Many Status ─────────────────────────────────────────────────
|
22
23
|
.get("/", async ({ query }) => await StatusService.findMany(query), { query: QueryCampaignStatusDto })
|
23
|
-
// ─── Get A Status By Id
|
24
|
+
// ─── Get A Status By Id ───────────────────────────────────────────────
|
24
25
|
// campaignId will be either a rough campaignId in the engine sense, a campaignId in the api db way, or a distributionChain_campaignId
|
25
26
|
.get("/:campaignId", async ({ params }) => {
|
26
27
|
if (!params.campaignId.includes("-") && params.campaignId.startsWith("0x"))
|
@@ -29,4 +30,16 @@ export const StatusController = new Elysia({ prefix: "/campaign-status", detail:
|
|
29
30
|
return await StatusService.findUniqueOrThrow(params.campaignId);
|
30
31
|
const [distributionChain, campaignId] = params.campaignId.split("-");
|
31
32
|
return await StatusService.findUniqueOrThrow({ distributionChain: +distributionChain, campaignId });
|
33
|
+
})
|
34
|
+
// ─── Fetch information about delays ────────────────────────────────────
|
35
|
+
.group("/delay", app => {
|
36
|
+
return app.get("/", async ({ query }) => StatusService.findManyDelay(query), {
|
37
|
+
query: DelayDto,
|
38
|
+
beforeHandle: ({ query }) => {
|
39
|
+
if (!!query.chainId) {
|
40
|
+
throwOnUnsupportedChainId(query.chainId);
|
41
|
+
}
|
42
|
+
},
|
43
|
+
detail: { hide: true },
|
44
|
+
});
|
32
45
|
});
|
@@ -8,6 +8,11 @@ export declare const CampaignUniqueDto: import("@sinclair/typebox").TObject<{
|
|
8
8
|
distributionChain: import("@sinclair/typebox").TNumber;
|
9
9
|
campaignId: import("@sinclair/typebox").TString;
|
10
10
|
}>;
|
11
|
+
export declare const DelayDto: import("@sinclair/typebox").TObject<{
|
12
|
+
endTimestampLowerBound: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
13
|
+
delayLowerBound: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
14
|
+
chainId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
15
|
+
}>;
|
11
16
|
export declare const CampaignStatusResourceDto: import("@sinclair/typebox").TObject<{
|
12
17
|
campaignId: import("@sinclair/typebox").TString;
|
13
18
|
computedUntil: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TBigInt, import("@sinclair/typebox").TString]>;
|
@@ -44,5 +49,6 @@ export declare const QueryCampaignStatusDto: import("@sinclair/typebox").TObject
|
|
44
49
|
SKIPPED: "SKIPPED";
|
45
50
|
}>]>>;
|
46
51
|
}>;
|
52
|
+
export type DelayModel = typeof DelayDto.static;
|
47
53
|
export type UpdateStatusModel = typeof UpdateCampaignStatusDto.static;
|
48
54
|
export type QueryCampaignStatus = typeof QueryCampaignStatusDto.static;
|
@@ -5,6 +5,11 @@ export const CampaignUniqueDto = t.Object({
|
|
5
5
|
distributionChain: t.Numeric(),
|
6
6
|
campaignId: t.String(),
|
7
7
|
});
|
8
|
+
export const DelayDto = t.Object({
|
9
|
+
endTimestampLowerBound: t.Optional(t.Numeric()),
|
10
|
+
delayLowerBound: t.Optional(t.Numeric()),
|
11
|
+
chainId: t.Optional(t.Numeric()),
|
12
|
+
});
|
8
13
|
export const CampaignStatusResourceDto = t.Object({
|
9
14
|
campaignId: t.String(),
|
10
15
|
computedUntil: t.Union([t.BigInt(), t.String()]),
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import type { Prisma, RunStatus } from "../../../../database/api/.generated";
|
2
2
|
import { type CampaignUnique } from "../campaign";
|
3
|
-
import type { QueryCampaignStatus } from "./status.model";
|
3
|
+
import type { DelayModel, QueryCampaignStatus } from "./status.model";
|
4
4
|
export declare class StatusRepository {
|
5
5
|
#private;
|
6
6
|
static findMany(query: QueryCampaignStatus): Promise<{
|
@@ -67,4 +67,22 @@ export declare class StatusRepository {
|
|
67
67
|
computedUntil: bigint;
|
68
68
|
processingStarted: bigint;
|
69
69
|
}>;
|
70
|
+
static findManyDelay(query: DelayModel): Promise<{
|
71
|
+
startTimestamp: bigint;
|
72
|
+
endTimestamp: bigint;
|
73
|
+
computeChainId: number;
|
74
|
+
distributionChainId: number;
|
75
|
+
campaignId: string;
|
76
|
+
Opportunity: {
|
77
|
+
name: string;
|
78
|
+
};
|
79
|
+
CampaignStatus: {
|
80
|
+
error: string;
|
81
|
+
details: Prisma.JsonValue;
|
82
|
+
status: import("../../../../database/api/.generated").$Enums.RunStatus;
|
83
|
+
campaignId: string;
|
84
|
+
computedUntil: bigint;
|
85
|
+
processingStarted: bigint;
|
86
|
+
}[];
|
87
|
+
}[]>;
|
70
88
|
}
|
@@ -79,4 +79,29 @@ export class StatusRepository {
|
|
79
79
|
},
|
80
80
|
});
|
81
81
|
}
|
82
|
+
static async findManyDelay(query) {
|
83
|
+
return await apiDbClient.campaign.findMany({
|
84
|
+
where: {
|
85
|
+
distributionChainId: !!query.chainId ? query.chainId : undefined,
|
86
|
+
endTimestamp: {
|
87
|
+
gte: !!query.endTimestampLowerBound ? query.endTimestampLowerBound : moment().subtract(1, "week").unix(),
|
88
|
+
},
|
89
|
+
},
|
90
|
+
select: {
|
91
|
+
campaignId: true,
|
92
|
+
computeChainId: true,
|
93
|
+
startTimestamp: true,
|
94
|
+
endTimestamp: true,
|
95
|
+
distributionChainId: true,
|
96
|
+
Opportunity: {
|
97
|
+
select: {
|
98
|
+
name: true,
|
99
|
+
},
|
100
|
+
},
|
101
|
+
CampaignStatus: {
|
102
|
+
take: 1,
|
103
|
+
},
|
104
|
+
},
|
105
|
+
});
|
106
|
+
}
|
82
107
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { type CampaignUnique } from "../campaign";
|
2
|
-
import type { QueryCampaignStatus, UpdateStatusModel } from "./status.model";
|
2
|
+
import type { DelayModel, QueryCampaignStatus, UpdateStatusModel } from "./status.model";
|
3
3
|
export declare class StatusService {
|
4
4
|
static findMany(query: QueryCampaignStatus): Promise<{
|
5
5
|
error: string;
|
@@ -35,4 +35,24 @@ export declare class StatusService {
|
|
35
35
|
} | null>;
|
36
36
|
static update(campaignUnique: CampaignUnique, status: UpdateStatusModel): Promise<void>;
|
37
37
|
static isSafeForOverlaps(campaignUnique: CampaignUnique): Promise<boolean>;
|
38
|
+
static findManyDelay(query: DelayModel): Promise<{
|
39
|
+
delay: number;
|
40
|
+
delayFormatted: string;
|
41
|
+
startTimestamp: bigint;
|
42
|
+
endTimestamp: bigint;
|
43
|
+
computeChainId: number;
|
44
|
+
distributionChainId: number;
|
45
|
+
campaignId: string;
|
46
|
+
Opportunity: {
|
47
|
+
name: string;
|
48
|
+
};
|
49
|
+
CampaignStatus: {
|
50
|
+
error: string;
|
51
|
+
details: import("database/api/.generated/runtime/library").JsonValue;
|
52
|
+
status: import("../../../../database/api/.generated").$Enums.RunStatus;
|
53
|
+
campaignId: string;
|
54
|
+
computedUntil: bigint;
|
55
|
+
processingStarted: bigint;
|
56
|
+
}[];
|
57
|
+
}[]>;
|
38
58
|
}
|
@@ -54,4 +54,20 @@ export class StatusService {
|
|
54
54
|
}
|
55
55
|
return true;
|
56
56
|
}
|
57
|
+
static async findManyDelay(query) {
|
58
|
+
const now = moment().unix();
|
59
|
+
return (await StatusRepository.findManyDelay(query))
|
60
|
+
.map(x => {
|
61
|
+
const endTimestamp = Number.parseInt(x.endTimestamp.toString());
|
62
|
+
const delay = Math.min(now, endTimestamp) -
|
63
|
+
Math.min(now, endTimestamp, Number.parseInt((x.CampaignStatus?.[0]?.computedUntil ?? x.startTimestamp).toString()));
|
64
|
+
return {
|
65
|
+
...x,
|
66
|
+
delay: delay,
|
67
|
+
delayFormatted: moment.duration(delay, "seconds").humanize(),
|
68
|
+
};
|
69
|
+
})
|
70
|
+
.sort((a, b) => b.delay - a.delay)
|
71
|
+
.filter(x => x.delay > (query.delayLowerBound ?? 0));
|
72
|
+
}
|
57
73
|
}
|