diff --git a/src/meta-morpho.ts b/src/meta-morpho.ts index fc96f82..6578d50 100644 --- a/src/meta-morpho.ts +++ b/src/meta-morpho.ts @@ -58,6 +58,7 @@ import { } from "./sdk/metamorpho"; import { TokenManager } from "./sdk/token"; import { toMetaMorphoAssetsUp } from "./utils/metaMorphoUtils"; +import { cloneRate } from "./utils/rate"; export function handleSubmitMarketRemoval( event: SubmitMarketRemovalEvent @@ -184,7 +185,7 @@ export function handleDeposit(event: DepositEvent): void { deposit.shares = event.params.shares; deposit.metaMorpho = mm.id; deposit.metaMorphoPosition = position.id; - deposit.rate = mm.rate; + deposit.rate = cloneRate(mm.rate, event.block.timestamp).id; deposit.save(); } @@ -694,7 +695,7 @@ export function handleTransfer(event: TransferEvent): void { transfer.metaMorphoPositionFrom = fromPosition.id; transfer.metaMorphoPositionTo = toPosition.id; transfer.metaMorpho = mm.id; - transfer.rate = mm.rate; + transfer.rate = cloneRate(mm.rate, event.block.timestamp).id; transfer.save(); } @@ -752,6 +753,6 @@ export function handleWithdraw(event: WithdrawEvent): void { withdraw.shares = event.params.shares; withdraw.metaMorpho = mm.id; withdraw.metaMorphoPosition = position.id; - withdraw.rate = mm.rate; + withdraw.rate = cloneRate(mm.rate, event.block.timestamp).id; withdraw.save(); } diff --git a/src/sdk/manager.ts b/src/sdk/manager.ts index 50f4f77..0da0dc8 100644 --- a/src/sdk/manager.ts +++ b/src/sdk/manager.ts @@ -31,6 +31,7 @@ import { } from "../../generated/schema"; import { getMarket } from "../initializers/markets"; import { getProtocol } from "../initializers/protocol"; +import { cloneRates } from "../utils/rate"; import { AccountManager } from "./account"; import { @@ -229,7 +230,15 @@ export class DataManager { deposit.account = position.account; deposit.market = this._market.id; deposit.position = position.id; - deposit.rates = this._market.rates; + const marketRates = this._market.rates; + if (!marketRates) { + deposit.rates = []; + } else { + deposit.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } deposit.asset = position.asset; deposit.amount = amount; deposit.amountUSD = amountUSD; @@ -269,7 +278,17 @@ export class DataManager { deposit.market = this._market.id; deposit.position = position.id; deposit.asset = position.asset; - deposit.rates = this._market.rates; + + const marketRates = this._market.rates; + if (!marketRates) { + deposit.rates = []; + } else { + deposit.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } + deposit.shares = shares; deposit.amount = amount; deposit.amountUSD = amountUSD; @@ -305,7 +324,17 @@ export class DataManager { withdraw.market = this._market.id; withdraw.position = position.id; withdraw.asset = position.asset; - withdraw.rates = this._market.rates; + + const marketRates = this._market.rates; + if (!marketRates) { + withdraw.rates = []; + } else { + withdraw.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } + withdraw.amount = amount; withdraw.amountUSD = amountUSD; withdraw.isCollateral = true; @@ -349,7 +378,17 @@ export class DataManager { withdraw.market = this._market.id; withdraw.position = position.id; withdraw.asset = this._market.borrowedToken; - withdraw.rates = this._market.rates; + + const marketRates = this._market.rates; + if (!marketRates) { + withdraw.rates = []; + } else { + withdraw.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } + withdraw.amount = amount; withdraw.amountUSD = amountUSD; withdraw.isCollateral = false; @@ -384,7 +423,17 @@ export class DataManager { borrow.market = this._market.id; borrow.position = position.id; borrow.asset = this._market.borrowedToken; - borrow.rates = this._market.rates; + + const marketRates = this._market.rates; + if (!marketRates) { + borrow.rates = []; + } else { + borrow.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } + borrow.amount = amount; borrow.amountUSD = amountUSD; borrow.shares = shares; @@ -424,7 +473,16 @@ export class DataManager { repay.position = position.id; repay.asset = position.asset; - repay.rates = this._market.rates; + const marketRates = this._market.rates; + if (!marketRates) { + repay.rates = []; + } else { + repay.rates = cloneRates( + this._market.rates!, + this._event.block.timestamp + ); + } + repay.amount = amount; repay.shares = shares; repay.amountUSD = amountUSD; diff --git a/src/utils/rate.ts b/src/utils/rate.ts new file mode 100644 index 0000000..a281651 --- /dev/null +++ b/src/utils/rate.ts @@ -0,0 +1,35 @@ +import { BigInt, log } from "@graphprotocol/graph-ts"; + +import { InterestRate } from "../../generated/schema"; + +export function cloneRate(rateId: string, timestamp: BigInt): InterestRate { + const rate = InterestRate.load(rateId); + if (!rate) { + log.critical("InterestRate {} not found", [rateId]); + return new InterestRate(""); + } + + const newRateId = rate.id + "-" + timestamp.toString(); + let newRate = InterestRate.load(newRateId); + if (newRate) { + return newRate as InterestRate; + } + + newRate = new InterestRate(newRateId); + newRate.rate = rate.rate; + newRate.market = rate.market; + newRate.side = rate.side; + newRate.type = rate.type; + newRate.save(); + + return newRate; +} + +export function cloneRates(rateIds: string[], timestamp: BigInt): string[] { + const rates: string[] = []; + for (let i = 0; i < rateIds.length; i++) { + log.info("rateId: {}", [rateIds[i]]); + rates.push(cloneRate(rateIds[i], timestamp).id); + } + return rates; +}