juna
Version:
A cross platform NFT lending client for serious lenders
68 lines (64 loc) • 2.96 kB
text/typescript
import { LendingPlatform, Loan, LoanStatus, Offer, OfferType } from "../../types";
import { currencyFromAddress } from "../../support/currencies";
import { ArcadeLoan, ArcadeOffer } from "./types";
import { CollectionRegistry } from "../../support/CollectionRegistry";
import { addDaysToDate, calculateDurationInDays } from "../../helpers";
const arcadeStatusMapper = (status: string): LoanStatus => {
switch (status) {
case "Active":
return LoanStatus.ongoing;
case "Repaid":
return LoanStatus.repaid;
default:
return LoanStatus.defaulted;
}
};
export const arcadeLoanMapper = (arcadeLoan: ArcadeLoan): Loan => {
const currency = currencyFromAddress(arcadeLoan.payableCurrency);
const durationInDays = calculateDurationInDays(parseInt(arcadeLoan.durationSecs));
const principal = parseInt(arcadeLoan.principal) / 10 ** currency.decimals;
const apr = (parseInt(arcadeLoan.interestRate) / 1e18 / 10000) * (365 / durationInDays);
// console.log(arcadeLoan);
return {
id: arcadeLoan.loanId,
platform: LendingPlatform.arcade,
borrower: arcadeLoan.borrowerId.toLowerCase() as `0x${string}`,
lender: arcadeLoan.lenderId.toLowerCase() as `0x${string}`,
status: arcadeStatusMapper(arcadeLoan.state),
startDate: new Date(parseInt(arcadeLoan.startDate) * 1e3),
endDate: arcadeLoan.closedAt
? new Date(arcadeLoan.closedAt * 1e3)
: addDaysToDate(new Date(parseInt(arcadeLoan.startDate) * 1e3), durationInDays),
currency: currency,
principal: parseInt(arcadeLoan.principal) / 10 ** currency.decimals,
interestPayment: (principal * apr * durationInDays) / 365,
durationInDays: durationInDays,
apr: apr,
collateral: arcadeLoan.collateral.map((collateral) => ({
collectionAddress: collateral.collectionAddress,
collectionName: CollectionRegistry.getCollectionDetails(collateral.collectionAddress).name,
nftId: parseInt(collateral.tokenId),
})),
};
};
export const arcadeOfferMapper = (arcadeOffer: ArcadeOffer): Offer => {
const currency = currencyFromAddress(arcadeOffer.payableCurrency);
const durationInDays = calculateDurationInDays(arcadeOffer.durationSecs);
return {
id: arcadeOffer.id.toString(),
platform: LendingPlatform.arcade,
lender: arcadeOffer.creatorId,
offerDate: new Date(arcadeOffer.createdAt),
expiryDate: new Date(arcadeOffer.expiresAt),
type: arcadeOffer.collateralId === "-1" ? OfferType.collectionOffer : OfferType.singleItemOffer,
currency: currency,
principal: parseFloat(arcadeOffer.principal) / 10 ** currency.decimals,
durationInDays: durationInDays,
apr: (parseInt(arcadeOffer.interestRate) / 1e18 / 10000) * (365.25 / durationInDays),
collateral: {
collectionAddress: arcadeOffer.collateralAddress,
collectionName: CollectionRegistry.getCollectionDetails(arcadeOffer.collateralAddress).name,
nftId: arcadeOffer.collateralId,
},
};
};