juna
Version:
A cross platform NFT lending client for serious lenders
49 lines (43 loc) • 1.78 kB
text/typescript
import { PortfolioClient } from "..";
import { Currency } from "../types";
import { CollectionRegistry } from "./CollectionRegistry";
type LoanTerm = { currency: Currency; principal: number; durationInDays: number; apr: number };
type CollectionOffers = Record<`0x${string}`, LoanTerm[]>;
export class Loaner {
private readonly portfolioClient: PortfolioClient;
private collectionOffers: CollectionOffers;
constructor(portfolioClient: PortfolioClient) {
this.portfolioClient = portfolioClient;
this.collectionOffers = {};
}
public updateCollectionOffers(collectionAddress: `0x${string}`, loanTerms: LoanTerm[]) {
this.collectionOffers[collectionAddress] = loanTerms;
}
public async publishCollectionOffers(expiryInMinutes: number = 10, logs: boolean = true) {
for (const [collectionAddress, loanTerms] of Object.entries(this.collectionOffers)) {
const collectionName = CollectionRegistry.getCollectionDetails(collectionAddress as `0x${string}`).name;
for (const loanTerm of loanTerms) {
if (logs) {
console.log(
`publishing collection offer on ${collectionName}: principal=${
loanTerm.principal
} ${loanTerm.currency.symbol.toLowerCase()} | duration=${loanTerm.durationInDays} days | apr=${
loanTerm.apr * 100
}%`,
);
}
await this.portfolioClient.createCollectionOffer(
{
collectionAddress: collectionAddress as `0x${string}`,
currency: loanTerm.currency,
principal: loanTerm.principal,
apr: loanTerm.apr,
durationInDays: loanTerm.durationInDays,
expiryInMinutes: expiryInMinutes,
},
logs,
);
}
}
}
}