Skip to content

Commit 8f14f7d

Browse files
authored
Merge pull request #2207 from alex0xhodler/feature/gearbox-on-monad
feat: add Monad chain support to Gearbox protocol adapter
2 parents c582ed8 + e1da180 commit 8f14f7d

File tree

1 file changed

+40
-7
lines changed

1 file changed

+40
-7
lines changed

src/adaptors/gearbox/index.js

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,29 @@ var CHAIN_CONFIGS = {
415415
},
416416
},
417417
},
418+
monad: {
419+
ADDRESS_PROVIDER_V3: null,
420+
GEAR_TOKEN: null,
421+
REWARD_TOKEN: '0x34752948b0dc28969485df2066ffe86d5dc36689'.toLowerCase(), // MON
422+
chainName: 'Monad',
423+
POOLS: {
424+
'0x6b343f7b797f1488aa48c49d540690f2b2c89751': {
425+
symbol: 'dUSDC',
426+
underlying: '0x754704Bc059F8C67012fEd69BC8A327a5aafb603', // USDC
427+
name: 'USDC Pool',
428+
},
429+
'0x34752948b0dc28969485df2066ffe86d5dc36689': {
430+
symbol: 'dMON',
431+
underlying: '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A', // MON
432+
name: 'MON Pool',
433+
},
434+
'0x164a35f31e4e0f6c45d500962a6978d2cbd5a16b': {
435+
symbol: 'dUSDT0',
436+
underlying: '0xe7cd86e13AC4309349F30B3435a9d337750fC82D', // USDT0
437+
name: 'USDT0 Pool',
438+
},
439+
},
440+
},
418441
};
419442

420443
// Legacy constants for backward compatibility
@@ -474,6 +497,7 @@ function getPoolUrl(chain, poolAddress) {
474497
etlk: '42793',
475498
lisk: '1135',
476499
hemi: '43111',
500+
monad: '143',
477501
};
478502

479503
const chainId = chainIds[chain];
@@ -522,6 +546,15 @@ const MERKL_CONFIGS = {
522546
poolId: '0x614eB485DE3c6C49701b40806AC1B985ad6F0A2f',
523547
rewardToken: '0xad11a8BEb98bbf61dbb1aa0F6d6F2ECD87b35afA', // USDC.E
524548
},
549+
monad: {
550+
chainId: 143,
551+
rewardToken: '0x34752948b0dc28969485df2066ffe86d5dc36689', // MON
552+
pools: [
553+
'0x6b343f7b797f1488aa48c49d540690f2b2c89751', // USDC Pool
554+
'0x34752948b0dc28969485df2066ffe86d5dc36689', // MON Pool
555+
'0x164a35f31e4e0f6c45d500962a6978d2cbd5a16b', // USDT0 Pool
556+
],
557+
},
525558
};
526559

527560
// Fetch Merkl rewards data for supported chains
@@ -742,7 +775,7 @@ async function getPlasmaPoolsV3(chain) {
742775

743776
async function getPoolsV3(chain) {
744777
// Handle non-registry chains using the individual pool approach
745-
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') {
778+
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') {
746779
return await getPlasmaPoolsV3(chain);
747780
}
748781

@@ -865,7 +898,7 @@ async function getPoolsV3(chain) {
865898
async function getTokensData(chain, pools) {
866899
// For non-registry chains, we need to use known token addresses for pricing
867900
let tokens;
868-
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') {
901+
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') {
869902
tokens = pools.map((p) => p.underlyingForPrice || p.underlying);
870903
} else {
871904
tokens = pools.map((p) => p.underlying);
@@ -963,15 +996,15 @@ async function getApyV3(pools, tokens, daoFees, chain, merklRewards = {}) {
963996
const underlying = pool.underlying.toLowerCase();
964997
const poolAddr = pool.pool.toLowerCase();
965998
// For non-registry chains, use the underlyingForPrice token for pricing
966-
const priceToken = (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') && pool.underlyingForPrice ?
999+
const priceToken = (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') && pool.underlyingForPrice ?
9671000
pool.underlyingForPrice.toLowerCase() : underlying;
9681001
const underlyingPrice = tokens[priceToken]?.price || 0;
9691002
const daoFee = Number(daoFees[poolAddr] ?? 0);
9701003

9711004
// Calculate TVL and borrowing data using the same logic for all chains
9721005
let totalSupplyUsd, totalBorrowUsd, tvlUsd;
9731006

974-
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') {
1007+
if (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') {
9751008
// Use proper Gearbox calculation for non-registry chains with real borrowing data
9761009
totalSupplyUsd = calculateTvl(
9771010
pool.availableLiquidity,
@@ -1003,7 +1036,7 @@ async function getApyV3(pools, tokens, daoFees, chain, merklRewards = {}) {
10031036
tvlUsd = totalSupplyUsd - totalBorrowUsd;
10041037
}
10051038

1006-
const dieselPrice = (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') ?
1039+
const dieselPrice = (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') ?
10071040
Number(underlyingPrice) / WAD : // For non-registry chains, use simpler calculation
10081041
(Number(underlyingPrice) * Number(pool.dieselRate)) / RAY;
10091042
const supplyInfo = {
@@ -1057,7 +1090,7 @@ async function getApyV3(pools, tokens, daoFees, chain, merklRewards = {}) {
10571090
url: getPoolUrl(chain, pool.pool),
10581091
// daoFee here is taken from last cm connected to this pool. in theory, it can be different for different CMs
10591092
// in practice, it's 25% for v3 cms and 50% for v2 cms
1060-
apyBaseBorrow: (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi') ?
1093+
apyBaseBorrow: (chain === 'plasma' || chain === 'etlk' || chain === 'lisk' || chain === 'hemi' || chain === 'monad') ?
10611094
// For non-registry chains, use base interest rate directly (no DAO fees initially)
10621095
(Number(pool.baseInterestRate) / 1e27) * 100 :
10631096
((daoFee + PERCENTAGE_FACTOR) *
@@ -1071,7 +1104,7 @@ async function getApyV3(pools, tokens, daoFees, chain, merklRewards = {}) {
10711104
});
10721105
}
10731106
async function getApy() {
1074-
const supportedChains = ['ethereum', 'plasma', 'etlk', 'lisk', 'hemi'];
1107+
const supportedChains = ['ethereum', 'plasma', 'etlk', 'lisk', 'hemi', 'monad'];
10751108
const allPools = [];
10761109

10771110
console.log(`🚀 Fetching Gearbox data for chains: ${supportedChains.join(', ')}`);

0 commit comments

Comments
 (0)