Skip to main content

CreditDesk

CreditDesk

Deployment on Ethereum mainnet:

https://etherscan.io/address/0xD52dc1615c843c30F2e4668E101c0938e6007220

Main entry point for borrowers and underwriters. Handles key logic for creating CreditLine's, borrowing money, repayment, etc.

SECONDS_PER_DAY

uint256 SECONDS_PER_DAY

config

contract GoldfinchConfig config

Underwriter

struct Underwriter {
uint256 governanceLimit;
address[] creditLines;
}

Borrower

struct Borrower {
address[] creditLines;
}

PaymentApplied

event PaymentApplied(address payer, address creditLine, uint256 interestAmount, uint256 principalAmount, uint256 remainingAmount)

PaymentCollected

event PaymentCollected(address payer, address creditLine, uint256 paymentAmount)

DrawdownMade

event DrawdownMade(address borrower, address creditLine, uint256 drawdownAmount)

CreditLineCreated

event CreditLineCreated(address borrower, address creditLine)

GovernanceUpdatedUnderwriterLimit

event GovernanceUpdatedUnderwriterLimit(address underwriter, uint256 newLimit)

underwriters

mapping(address => struct CreditDesk.Underwriter) underwriters

borrowers

mapping(address => struct CreditDesk.Borrower) borrowers

creditLines

mapping(address => address) creditLines

initialize

function initialize(address owner, contract GoldfinchConfig _config) public

Run only once, on initialization

NameTypeDescription
owneraddressThe address of who should have the "OWNER_ROLE" of this contract
_configcontract GoldfinchConfigThe address of the GoldfinchConfig contract

setUnderwriterGovernanceLimit

function setUnderwriterGovernanceLimit(address underwriterAddress, uint256 limit) external

Sets a particular underwriter's limit of how much credit the DAO will allow them to "create"

NameTypeDescription
underwriterAddressaddressThe address of the underwriter for whom the limit shall change
limituint256What the new limit will be set to Requirements: - the caller must have the `OWNER_ROLE`.

drawdown

function drawdown(address creditLineAddress, uint256 amount) external

Allows a borrower to drawdown on their creditline. `amount` USDC is sent to the borrower, and the credit line accounting is updated.

NameTypeDescription
creditLineAddressaddressThe creditline from which they would like to drawdown
amountuint256The amount, in USDC atomic units, that a borrower wishes to drawdown Requirements: - the caller must be the borrower on the creditLine

pay

function pay(address creditLineAddress, uint256 amount) external

Allows a borrower to repay their loan. Payment is collected immediately (by sending it to the individual CreditLine), but it is not applied unless it is after the nextDueTime, or until we assess the credit line (ie. payment period end). Any amounts over the minimum payment will be applied to outstanding principal (reducing the effective interest rate). If there is still any left over, it will remain in the USDC Balance of the CreditLine, which is held distinct from the Pool amounts, and can not be withdrawn by LP's.

NameTypeDescription
creditLineAddressaddressThe credit line to be paid back
amountuint256The amount, in USDC atomic units, that a borrower wishes to pay

assessCreditLine

function assessCreditLine(address creditLineAddress) public

Assesses a particular creditLine. This will apply payments, which will update accounting and distribute gains or losses back to the pool accordingly. This function is idempotent, and anyone is allowed to call it.

NameTypeDescription
creditLineAddressaddressThe creditline that should be assessed.

applyPayment

function applyPayment(address creditLineAddress, uint256 amount) external

migrateV1CreditLine

function migrateV1CreditLine(address _clToMigrate, address borrower, uint256 termEndTime, uint256 nextDueTime, uint256 interestAccruedAsOf, uint256 lastFullPaymentTime, uint256 totalInterestPaid) public returns (address, address)

getUnderwriterCreditLines

function getUnderwriterCreditLines(address underwriterAddress) public view returns (address[])

Simple getter for the creditlines of a given underwriter

NameTypeDescription
underwriterAddressaddressThe underwriter address you would like to see the credit lines of.

getBorrowerCreditLines

function getBorrowerCreditLines(address borrowerAddress) public view returns (address[])

Simple getter for the creditlines of a given borrower

NameTypeDescription
borrowerAddressaddressThe borrower address you would like to see the credit lines of.

getNextPaymentAmount

function getNextPaymentAmount(address creditLineAddress, uint256 asOf) external view returns (uint256)

This function is only meant to be used by frontends. It returns the total payment due for a given creditLine as of the provided timestamp. Returns 0 if no payment is due (e.g. asOf is before the nextDueTime)

NameTypeDescription
creditLineAddressaddressThe creditLine to calculate the payment for
asOfuint256The timestamp to use for the payment calculation, if it is set to 0, uses the current time

collectPayment

function collectPayment(contract CreditLine cl, uint256 amount) internal

Collects `amount` of payment for a given credit line. This sends money from the payer to the credit line. Note that payment is not applied when calling this function. Only collected (ie. held) for later application.

NameTypeDescription
clcontract CreditLineThe CreditLine the payment will be collected for.
amountuint256The amount, in USDC atomic units, to be collected

_applyPayment

function _applyPayment(contract CreditLine cl, uint256 amount, uint256 timestamp) internal

Applies `amount` of payment for a given credit line. This moves already collected money into the Pool. It also updates all the accounting variables. Note that interest is always paid back first, then principal. Any extra after paying the minimum will go towards existing principal (reducing the effective interest rate). Any extra after the full loan has been paid off will remain in the USDC Balance of the creditLine, where it will be automatically used for the next drawdown.

NameTypeDescription
clcontract CreditLineThe CreditLine the payment will be collected for.
amountuint256The amount, in USDC atomic units, to be applied
timestampuint256The timestamp on which accrual calculations should be based. This allows us to be precise when we assess a Credit Line

handlePayment

function handlePayment(contract CreditLine cl, uint256 paymentAmount, uint256 timestamp) internal returns (uint256, uint256, uint256)

isLate

function isLate(contract CreditLine cl, uint256 timestamp) internal view returns (bool)

getGoldfinchFactory

function getGoldfinchFactory() internal view returns (contract GoldfinchFactory)

updateAndGetInterestAndPrincipalOwedAsOf

function updateAndGetInterestAndPrincipalOwedAsOf(contract CreditLine cl, uint256 timestamp) internal returns (uint256, uint256)

withinCreditLimit

function withinCreditLimit(uint256 amount, uint256 unappliedBalance, contract CreditLine cl) internal view returns (bool)

withinTransactionLimit

function withinTransactionLimit(uint256 amount) internal view returns (bool)

calculateNewTermEndTime

function calculateNewTermEndTime(contract CreditLine cl, uint256 balance) internal view returns (uint256)

calculateNextDueTime

function calculateNextDueTime(contract CreditLine cl) internal view returns (uint256)

currentTime

function currentTime() internal view virtual returns (uint256)

underwriterCanCreateThisCreditLine

function underwriterCanCreateThisCreditLine(uint256 newAmount, struct CreditDesk.Underwriter underwriter) internal view returns (bool)

withinMaxUnderwriterLimit

function withinMaxUnderwriterLimit(uint256 amount) internal view returns (bool)

getCreditCurrentlyExtended

function getCreditCurrentlyExtended(struct CreditDesk.Underwriter underwriter) internal view returns (uint256)

updateCreditLineAccounting

function updateCreditLineAccounting(contract CreditLine cl, uint256 balance, uint256 interestOwed, uint256 principalOwed) internal

getUSDCBalance

function getUSDCBalance(address _address) internal view returns (uint256)

onlyValidCreditLine

modifier onlyValidCreditLine(address clAddress)