@merkl/api 0.21.15 → 0.21.17
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 +3 -3
- 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 +12 -33
- package/dist/src/index.d.ts +4 -11
- package/dist/src/modules/v4/chain/chain.repository.d.ts +13 -3
- package/dist/src/modules/v4/chain/chain.repository.js +9 -3
- package/dist/src/modules/v4/chain/chain.service.d.ts +13 -1
- package/dist/src/modules/v4/chain/chain.service.js +6 -4
- package/dist/src/modules/v4/merklRoot/merklRoot.controller.d.ts +2 -9
- package/dist/src/modules/v4/merklRoot/merklRoot.service.d.ts +1 -7
- package/dist/src/modules/v4/price/price.controller.d.ts +2 -2
- package/dist/src/modules/v4/price/price.model.d.ts +2 -0
- package/dist/src/modules/v4/programPayload/programPayload.repository.js +1 -1
- package/dist/src/modules/v4/reward/reward.service.js +1 -1
- package/dist/src/modules/v4/router.d.ts +4 -11
- package/dist/src/utils/prices/priceFetcherFactory.js +3 -0
- package/dist/src/utils/prices/services/OnChainCallService.d.ts +8 -0
- package/dist/src/utils/prices/services/OnChainCallService.js +37 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +1 -1
@@ -622,7 +622,8 @@ exports.PriceSourceMethod = exports.$Enums.PriceSourceMethod = {
|
|
622
622
|
ERC4626: 'ERC4626',
|
623
623
|
DEXSCREENER: 'DEXSCREENER',
|
624
624
|
INDEXCOOP: 'INDEXCOOP',
|
625
|
-
DEFILLAMA: 'DEFILLAMA'
|
625
|
+
DEFILLAMA: 'DEFILLAMA',
|
626
|
+
ONCHAIN_CALL: 'ONCHAIN_CALL'
|
626
627
|
};
|
627
628
|
|
628
629
|
exports.LoggedEntityType = exports.$Enums.LoggedEntityType = {
|
package/dist/src/eden/index.d.ts
CHANGED
@@ -3204,7 +3204,7 @@ declare const eden: {
|
|
3204
3204
|
}>>;
|
3205
3205
|
post: (body: {
|
3206
3206
|
symbol: string;
|
3207
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
3207
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
3208
3208
|
args: {};
|
3209
3209
|
}, options: {
|
3210
3210
|
headers: {
|
@@ -3233,7 +3233,7 @@ declare const eden: {
|
|
3233
3233
|
}>>;
|
3234
3234
|
patch: (body: {
|
3235
3235
|
symbol?: string | undefined;
|
3236
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
3236
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
3237
3237
|
args?: {} | undefined;
|
3238
3238
|
}, options: {
|
3239
3239
|
headers: {
|
@@ -3700,15 +3700,8 @@ declare const eden: {
|
|
3700
3700
|
query?: Record<string, unknown> | undefined;
|
3701
3701
|
fetch?: RequestInit | undefined;
|
3702
3702
|
} | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
3703
|
-
|
3704
|
-
|
3705
|
-
live: string;
|
3706
|
-
tree: string;
|
3707
|
-
lastTree: string;
|
3708
|
-
endOfDisputePeriod: number;
|
3709
|
-
disputer: string;
|
3710
|
-
};
|
3711
|
-
};
|
3703
|
+
[x: string]: any;
|
3704
|
+
200: any;
|
3712
3705
|
}>>;
|
3713
3706
|
};
|
3714
3707
|
engine: {
|
@@ -9443,7 +9436,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
9443
9436
|
post: {
|
9444
9437
|
body: {
|
9445
9438
|
symbol: string;
|
9446
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
9439
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
9447
9440
|
args: {};
|
9448
9441
|
};
|
9449
9442
|
params: {};
|
@@ -9464,7 +9457,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
9464
9457
|
patch: {
|
9465
9458
|
body: {
|
9466
9459
|
symbol?: string | undefined;
|
9467
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
9460
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
9468
9461
|
args?: {} | undefined;
|
9469
9462
|
};
|
9470
9463
|
params: {
|
@@ -10052,15 +10045,8 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
10052
10045
|
query: unknown;
|
10053
10046
|
headers: unknown;
|
10054
10047
|
response: {
|
10055
|
-
|
10056
|
-
|
10057
|
-
live: string;
|
10058
|
-
tree: string;
|
10059
|
-
lastTree: string;
|
10060
|
-
endOfDisputePeriod: number;
|
10061
|
-
disputer: string;
|
10062
|
-
};
|
10063
|
-
};
|
10048
|
+
[x: string]: any;
|
10049
|
+
200: any;
|
10064
10050
|
};
|
10065
10051
|
};
|
10066
10052
|
};
|
@@ -15670,7 +15656,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
15670
15656
|
}>>;
|
15671
15657
|
post: (body: {
|
15672
15658
|
symbol: string;
|
15673
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
15659
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
15674
15660
|
args: {};
|
15675
15661
|
}, options: {
|
15676
15662
|
headers: {
|
@@ -15699,7 +15685,7 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
15699
15685
|
}>>;
|
15700
15686
|
patch: (body: {
|
15701
15687
|
symbol?: string | undefined;
|
15702
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
15688
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
15703
15689
|
args?: {} | undefined;
|
15704
15690
|
}, options: {
|
15705
15691
|
headers: {
|
@@ -16166,15 +16152,8 @@ export declare const MerklApi: (domain: string | import("elysia").default<"", fa
|
|
16166
16152
|
query?: Record<string, unknown> | undefined;
|
16167
16153
|
fetch?: RequestInit | undefined;
|
16168
16154
|
} | undefined) => Promise<import("@elysiajs/eden").Treaty.TreatyResponse<{
|
16169
|
-
|
16170
|
-
|
16171
|
-
live: string;
|
16172
|
-
tree: string;
|
16173
|
-
lastTree: string;
|
16174
|
-
endOfDisputePeriod: number;
|
16175
|
-
disputer: string;
|
16176
|
-
};
|
16177
|
-
};
|
16155
|
+
[x: string]: any;
|
16156
|
+
200: any;
|
16178
16157
|
}>>;
|
16179
16158
|
};
|
16180
16159
|
engine: {
|
package/dist/src/index.d.ts
CHANGED
@@ -3854,7 +3854,7 @@ declare const app: Elysia<"", false, {
|
|
3854
3854
|
post: {
|
3855
3855
|
body: {
|
3856
3856
|
symbol: string;
|
3857
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
3857
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
3858
3858
|
args: {};
|
3859
3859
|
};
|
3860
3860
|
params: {};
|
@@ -3875,7 +3875,7 @@ declare const app: Elysia<"", false, {
|
|
3875
3875
|
patch: {
|
3876
3876
|
body: {
|
3877
3877
|
symbol?: string | undefined;
|
3878
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
3878
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
3879
3879
|
args?: {} | undefined;
|
3880
3880
|
};
|
3881
3881
|
params: {
|
@@ -4463,15 +4463,8 @@ declare const app: Elysia<"", false, {
|
|
4463
4463
|
query: unknown;
|
4464
4464
|
headers: unknown;
|
4465
4465
|
response: {
|
4466
|
-
|
4467
|
-
|
4468
|
-
live: string;
|
4469
|
-
tree: string;
|
4470
|
-
lastTree: string;
|
4471
|
-
endOfDisputePeriod: number;
|
4472
|
-
disputer: string;
|
4473
|
-
};
|
4474
|
-
};
|
4466
|
+
[x: string]: any;
|
4467
|
+
200: any;
|
4475
4468
|
};
|
4476
4469
|
};
|
4477
4470
|
};
|
@@ -51,12 +51,22 @@ export declare class ChainRepository {
|
|
51
51
|
id: number;
|
52
52
|
icon: string;
|
53
53
|
})[]>;
|
54
|
+
static findAll(): Promise<({
|
55
|
+
Explorer: {
|
56
|
+
url: string;
|
57
|
+
type: import("@db/api").$Enums.ExplorerType;
|
58
|
+
id: string;
|
59
|
+
chainId: number;
|
60
|
+
}[];
|
61
|
+
} & {
|
62
|
+
name: string;
|
63
|
+
id: number;
|
64
|
+
icon: string;
|
65
|
+
})[]>;
|
54
66
|
static countMany(query: ChainSearchDto): Promise<number>;
|
55
67
|
/** Returns all chainIds in the database
|
56
68
|
*/
|
57
|
-
static
|
58
|
-
id: number;
|
59
|
-
}[]>;
|
69
|
+
static findManyIds(): Promise<number[]>;
|
60
70
|
/**
|
61
71
|
* Creates a new chain
|
62
72
|
* @param template for chain creation
|
@@ -28,6 +28,12 @@ export class ChainRepository {
|
|
28
28
|
...args,
|
29
29
|
});
|
30
30
|
}
|
31
|
+
static async findAll() {
|
32
|
+
return await apiDbClient.chain.findMany({
|
33
|
+
include: { Explorer: { take: 5 } },
|
34
|
+
orderBy: { id: "asc" },
|
35
|
+
});
|
36
|
+
}
|
31
37
|
static async countMany(query) {
|
32
38
|
const args = ChainRepository.transformQueryToPrismaFilters(query);
|
33
39
|
return apiDbClient.chain.count({
|
@@ -36,10 +42,10 @@ export class ChainRepository {
|
|
36
42
|
}
|
37
43
|
/** Returns all chainIds in the database
|
38
44
|
*/
|
39
|
-
static async
|
40
|
-
return apiDbClient.chain.findMany({
|
45
|
+
static async findManyIds() {
|
46
|
+
return (await apiDbClient.chain.findMany({
|
41
47
|
select: { id: true },
|
42
|
-
});
|
48
|
+
})).map(({ id }) => id);
|
43
49
|
}
|
44
50
|
/**
|
45
51
|
* Creates a new chain
|
@@ -12,6 +12,18 @@ export declare abstract class ChainService {
|
|
12
12
|
id: number;
|
13
13
|
icon: string;
|
14
14
|
}) | null>;
|
15
|
+
static findAll(): Promise<({
|
16
|
+
Explorer: {
|
17
|
+
url: string;
|
18
|
+
type: import("@db/api").$Enums.ExplorerType;
|
19
|
+
id: string;
|
20
|
+
chainId: number;
|
21
|
+
}[];
|
22
|
+
} & {
|
23
|
+
name: string;
|
24
|
+
id: number;
|
25
|
+
icon: string;
|
26
|
+
})[]>;
|
15
27
|
static findMany(query: ChainSearchDto): Promise<({
|
16
28
|
Explorer: {
|
17
29
|
url: string;
|
@@ -41,7 +53,7 @@ export declare abstract class ChainService {
|
|
41
53
|
* @warning some chains may not be fully integrated yet
|
42
54
|
* @returns an array of chainId
|
43
55
|
*/
|
44
|
-
static
|
56
|
+
static findManyIds(): Promise<number[]>;
|
45
57
|
/** List all chainIds which have a distribituor (i.e. which is fully integrated)
|
46
58
|
* @returns an array of chainId
|
47
59
|
*/
|
@@ -6,6 +6,9 @@ export class ChainService {
|
|
6
6
|
static async get(chainId) {
|
7
7
|
return ChainRepository.read(chainId);
|
8
8
|
}
|
9
|
+
static async findAll() {
|
10
|
+
return await CacheService.wrap(TTLPresets.MIN_10, ChainRepository.findAll);
|
11
|
+
}
|
9
12
|
static async findMany(query) {
|
10
13
|
// Bypass cache in test mode
|
11
14
|
if (query.test)
|
@@ -22,15 +25,14 @@ export class ChainService {
|
|
22
25
|
* @warning some chains may not be fully integrated yet
|
23
26
|
* @returns an array of chainId
|
24
27
|
*/
|
25
|
-
static async
|
26
|
-
|
27
|
-
return ids.map(({ id }) => id);
|
28
|
+
static async findManyIds() {
|
29
|
+
return ChainRepository.findManyIds();
|
28
30
|
}
|
29
31
|
/** List all chainIds which have a distribituor (i.e. which is fully integrated)
|
30
32
|
* @returns an array of chainId
|
31
33
|
*/
|
32
34
|
static async getSupportedIds() {
|
33
|
-
const ids = await ChainService.
|
35
|
+
const ids = await ChainService.findManyIds();
|
34
36
|
const supportedIds = [];
|
35
37
|
for (const chainId of ids) {
|
36
38
|
try {
|
@@ -43,15 +43,8 @@ export declare const MerklRootController: Elysia<"/roots", false, {
|
|
43
43
|
query: unknown;
|
44
44
|
headers: unknown;
|
45
45
|
response: {
|
46
|
-
|
47
|
-
|
48
|
-
live: string;
|
49
|
-
tree: string;
|
50
|
-
lastTree: string;
|
51
|
-
endOfDisputePeriod: number;
|
52
|
-
disputer: string;
|
53
|
-
};
|
54
|
-
};
|
46
|
+
[x: string]: any;
|
47
|
+
200: any;
|
55
48
|
};
|
56
49
|
};
|
57
50
|
};
|
@@ -19,13 +19,7 @@ export declare class MerklRootService {
|
|
19
19
|
* @param chainIds to fetch roots for
|
20
20
|
* @returns record of chains to object with live and last tree roots
|
21
21
|
*/
|
22
|
-
static fetchAll(chainIds?: ChainId[]): Promise<
|
23
|
-
live: string;
|
24
|
-
tree: string;
|
25
|
-
lastTree: string;
|
26
|
-
endOfDisputePeriod: number;
|
27
|
-
disputer: string;
|
28
|
-
}>>;
|
22
|
+
static fetchAll(chainIds?: ChainId[]): Promise<any>;
|
29
23
|
static create(x: CreateRootModel): Promise<{
|
30
24
|
chainId: number;
|
31
25
|
timestamp: bigint;
|
@@ -105,7 +105,7 @@ export declare const PriceController: Elysia<"/prices", false, {
|
|
105
105
|
post: {
|
106
106
|
body: {
|
107
107
|
symbol: string;
|
108
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
108
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
109
109
|
args: {};
|
110
110
|
};
|
111
111
|
params: {};
|
@@ -126,7 +126,7 @@ export declare const PriceController: Elysia<"/prices", false, {
|
|
126
126
|
patch: {
|
127
127
|
body: {
|
128
128
|
symbol?: string | undefined;
|
129
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
129
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
130
130
|
args?: {} | undefined;
|
131
131
|
};
|
132
132
|
params: {
|
@@ -8,6 +8,7 @@ export declare const CreatePriceSourceDto: import("@sinclair/typebox").TObject<{
|
|
8
8
|
DEXSCREENER: "DEXSCREENER";
|
9
9
|
INDEXCOOP: "INDEXCOOP";
|
10
10
|
DEFILLAMA: "DEFILLAMA";
|
11
|
+
ONCHAIN_CALL: "ONCHAIN_CALL";
|
11
12
|
}>;
|
12
13
|
args: import("@sinclair/typebox").TObject<{}>;
|
13
14
|
}>;
|
@@ -21,6 +22,7 @@ export declare const UpdatePriceSourceDto: import("@sinclair/typebox").TObject<{
|
|
21
22
|
DEXSCREENER: "DEXSCREENER";
|
22
23
|
INDEXCOOP: "INDEXCOOP";
|
23
24
|
DEFILLAMA: "DEFILLAMA";
|
25
|
+
ONCHAIN_CALL: "ONCHAIN_CALL";
|
24
26
|
}>>;
|
25
27
|
args: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{}>>;
|
26
28
|
}>;
|
@@ -706,7 +706,7 @@ const CornInterfaceCampaigns = {
|
|
706
706
|
},
|
707
707
|
[cornCampaigns.Concrete_CornUSDT_Vault_Corn]: {
|
708
708
|
campaignType: Campaign.ERC20,
|
709
|
-
computeChainId: ChainId.
|
709
|
+
computeChainId: ChainId.MAINNET,
|
710
710
|
hooks: [],
|
711
711
|
targetToken: "0x3Eb6464A77D7B619AaAfa7e9FFC0fBe3ed7084B3",
|
712
712
|
whitelist: [],
|
@@ -229,7 +229,7 @@ export class RewardService {
|
|
229
229
|
return rewards;
|
230
230
|
}
|
231
231
|
static async getUserRewardsByChain(user, withToken, chainFilter = [], connectedChainId = null, withTestTokens = false, claimableOnly = false) {
|
232
|
-
const chains = await ChainService.
|
232
|
+
const chains = await ChainService.findAll();
|
233
233
|
let chainIds = !chainFilter || !chainFilter.length
|
234
234
|
? chains.map(({ id }) => id)
|
235
235
|
: chains.map(({ id }) => id).filter(id => chainFilter.includes(id));
|
@@ -3724,7 +3724,7 @@ export declare const v4: Elysia<"/v4", false, {
|
|
3724
3724
|
post: {
|
3725
3725
|
body: {
|
3726
3726
|
symbol: string;
|
3727
|
-
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA";
|
3727
|
+
method: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL";
|
3728
3728
|
args: {};
|
3729
3729
|
};
|
3730
3730
|
params: {};
|
@@ -3745,7 +3745,7 @@ export declare const v4: Elysia<"/v4", false, {
|
|
3745
3745
|
patch: {
|
3746
3746
|
body: {
|
3747
3747
|
symbol?: string | undefined;
|
3748
|
-
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | undefined;
|
3748
|
+
method?: "COINGECKO" | "CONSTANT" | "EQUAL_TO" | "ERC4626" | "DEXSCREENER" | "INDEXCOOP" | "DEFILLAMA" | "ONCHAIN_CALL" | undefined;
|
3749
3749
|
args?: {} | undefined;
|
3750
3750
|
};
|
3751
3751
|
params: {
|
@@ -4333,15 +4333,8 @@ export declare const v4: Elysia<"/v4", false, {
|
|
4333
4333
|
query: unknown;
|
4334
4334
|
headers: unknown;
|
4335
4335
|
response: {
|
4336
|
-
|
4337
|
-
|
4338
|
-
live: string;
|
4339
|
-
tree: string;
|
4340
|
-
lastTree: string;
|
4341
|
-
endOfDisputePeriod: number;
|
4342
|
-
disputer: string;
|
4343
|
-
};
|
4344
|
-
};
|
4336
|
+
[x: string]: any;
|
4337
|
+
200: any;
|
4345
4338
|
};
|
4346
4339
|
};
|
4347
4340
|
};
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { PriceSourceMethod } from "@db/api";
|
2
|
+
import OnChainCall from "./services/OnChainCallService";
|
2
3
|
import CoingeckoService from "./services/coinGeckoService";
|
3
4
|
import DefillamaService from "./services/defillamaService";
|
4
5
|
import DexScreenerService from "./services/dexScreenerService";
|
@@ -22,6 +23,8 @@ export default class PriceFetcherFactory {
|
|
22
23
|
return DexScreenerService.instance;
|
23
24
|
case PriceSourceMethod.INDEXCOOP:
|
24
25
|
return IndexCoop.instance;
|
26
|
+
case PriceSourceMethod.ONCHAIN_CALL:
|
27
|
+
return OnChainCall.instance;
|
25
28
|
default:
|
26
29
|
throw new Error(`Price reader service not found for ${type}`);
|
27
30
|
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { type PriceSource } from "@db/api";
|
2
|
+
import type PriceFetcher from "./priceFetcher";
|
3
|
+
import type { ResponsePriceType } from "./priceFetcher";
|
4
|
+
export default class OnChainCallService implements PriceFetcher {
|
5
|
+
static readonly instance: PriceFetcher;
|
6
|
+
private constructor();
|
7
|
+
getPrice(tokens: PriceSource[]): Promise<ResponsePriceType[]>;
|
8
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import { PriceService } from "@/modules/v4/price/price.service";
|
2
|
+
import { PriceSourceMethod } from "@db/api";
|
3
|
+
import { BN2Number, ChainInteractionService } from "@sdk";
|
4
|
+
import { Contract } from "ethers";
|
5
|
+
import { log } from "../../logger";
|
6
|
+
export default class OnChainCallService {
|
7
|
+
static instance = new OnChainCallService();
|
8
|
+
constructor() { }
|
9
|
+
async getPrice(tokens) {
|
10
|
+
const pricePromises = tokens
|
11
|
+
.filter(tokenPriceSource => tokenPriceSource.method === PriceSourceMethod.ONCHAIN_CALL)
|
12
|
+
.map(async (token) => {
|
13
|
+
const args = token.args;
|
14
|
+
if (!args?.chainId || !args.address || !args.abi || !args.call) {
|
15
|
+
log.warn(`❌ ONCHAIN_CALL price source incorrectly implemented for ${token.symbol}`);
|
16
|
+
return undefined;
|
17
|
+
}
|
18
|
+
try {
|
19
|
+
const multiplicator = BN2Number(new Contract(args.address, args.abi, ChainInteractionService(args.chainId).provider())[args.call], args.decimals ?? 18);
|
20
|
+
const base = await PriceService.fetchPriceBySymbol(args.base);
|
21
|
+
const price = base * multiplicator;
|
22
|
+
// 2 returned tokens as stUSD and STUSD (business requirement)
|
23
|
+
const res = [
|
24
|
+
{ token: token.symbol, rate: price },
|
25
|
+
{ token: token.symbol.toUpperCase(), rate: price },
|
26
|
+
];
|
27
|
+
return res;
|
28
|
+
}
|
29
|
+
catch (error) {
|
30
|
+
log.warn(`❌ ONCHAIN_CALL price source failed for ${token.symbol} with error: ${error}`);
|
31
|
+
return undefined;
|
32
|
+
}
|
33
|
+
});
|
34
|
+
const resolvedPrices = (await Promise.all(pricePromises)).filter(result => !!result);
|
35
|
+
return resolvedPrices.flat();
|
36
|
+
}
|
37
|
+
}
|