Skip to content

Commit 75fa0ec

Browse files
authored
Eaglefi (DefiLlama#15380)
1 parent 8bca40b commit 75fa0ec

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

projects/eaglefi/index.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
const { queryKey, getAddresssDataStoreKeys, bytesToStr, bytesToBigInt } = require('../helper/chain/massa.js');
2+
const { sumTokens2 } = require('../helper/unwrapLPs.js');
3+
4+
5+
const registryAddress = "AS1NYihs2Wy4D4P68JGY2hYSDDaqZ5YxhM2nDRsJVFZUykEEdSAW";
6+
7+
8+
async function getAllPoolsAddresses(registryAddress) {
9+
10+
const registryKeys = await getAddresssDataStoreKeys(registryAddress, "", true);
11+
const poolsAddresses = [];
12+
13+
const transform = val => {
14+
const arg = new Uint8Array(val);
15+
16+
const start_offset = 4;
17+
let end_offset = start_offset + 62;
18+
const p = arg.slice(start_offset, end_offset);
19+
let poolAddressPlus = bytesToStr(p);
20+
poolAddressPlus = "AS" + poolAddressPlus.split("AS")[1];
21+
const poolAddress = poolAddressPlus.slice(0, poolAddressPlus.length - 1);
22+
23+
return poolAddress;
24+
}
25+
26+
for (const serializedKey of registryKeys) {
27+
const key = bytesToStr(serializedKey);
28+
29+
if (!key.startsWith("pools")) {
30+
continue;
31+
}
32+
33+
// Query that key to get the pools address
34+
let poolAddress = await queryKey([registryAddress], key, transform);
35+
poolsAddresses.push(poolAddress.toString());
36+
}
37+
38+
39+
return poolsAddresses;
40+
}
41+
42+
43+
async function tvl(
44+
api
45+
) {
46+
const poolsAddresses = await getAllPoolsAddresses(registryAddress);
47+
48+
49+
for (const poolAddress of poolsAddresses) {
50+
const aReserve = await queryKey([poolAddress], "aTokenReserve", val => bytesToBigInt(val));
51+
const bReserve = await queryKey([poolAddress], "bTokenReserve", val => bytesToBigInt(val));
52+
53+
const aToken = await queryKey([poolAddress], "tokenA");
54+
const bToken = await queryKey([poolAddress], "tokenB");
55+
56+
api.add(aToken, aReserve)
57+
api.add(bToken, bReserve)
58+
}
59+
60+
return sumTokens2({ api })
61+
}
62+
63+
module.exports = {
64+
timetravel: false,
65+
massa: { tvl, }
66+
};

projects/helper/chain/massa.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ function strToBytes(str) {
3939
return new Uint8Array(Buffer.from(str, 'utf-8'));
4040
}
4141

42+
function bytesToStr(bytes) {
43+
return u8ArrayToString(bytes).replace(/\0/g, '');
44+
}
45+
4246

4347
/**
4448
* Converts a Uint8Array into an unsigned 64-bit integer (u64) BigInt.
@@ -99,8 +103,27 @@ async function getTokenBalances(tokenAddresses, ownerAddresses) {
99103
return res.map((entry) => bytesToBigInt(entry.candidate_value).toString());
100104
}
101105

106+
function convertUnit8ArrayToNumberArray(unit8Array) {
107+
return Array.from(unit8Array, (byte) => byte)
108+
}
109+
110+
111+
async function getAddresssDataStoreKeys(address, prefix, is_final) {
112+
const res = await request('get_addresses_datastore_keys', [{
113+
address: address,
114+
prefix: convertUnit8ArrayToNumberArray(prefix),
115+
is_final: is_final,
116+
}]);
117+
118+
return res[0].keys;
119+
120+
}
121+
102122
module.exports = {
103123
queryKey,
104124
u8ArrayToString,
105125
getTokenBalances,
126+
getAddresssDataStoreKeys,
127+
bytesToStr,
128+
bytesToBigInt,
106129
};

0 commit comments

Comments
 (0)