Skip to main content

Schedule

Schedule

A contract meant to be re-used between tranched pools to determine when payments are due using some period mapper contract that maps timestamps to real world concepts of time (months). This contract allows a user to specify how often interest payments and principal payments should come due by allowing the creator to specify the length of of interest periods and principal periods. Additionally the creator can specify how many of the principal periods are considered "grace periods"

Example: Here's a visualization of a schedule with the following parameters periodMapper = monthly periods periodsInTerm = 12 (1 year) periodsPerInterestPeriod = 3 (quarterly) periodsPerPrincipalPeriod = 6 (halfly) gracePrincipalPeriods = 1

                  +- Stub Period     +- Principal Grace Period

grace periods v v +---+-----------------------+-----------------------+ principal periods |///|=======================| 0 | |///+-----------+-----------+-----------+-----------+ E interest periods |///| 0 | 1 | 2 | 3 | N +---+---+---+---+---+---+---+---+---+---+---+---+---+ D periods |FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC|JAN|FEB| | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| ---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- absolute ...| 25| 26| 27| 28| 29| 30| 31| 32| 33| 34| 35| 36| 37|... periods | | | | | | | | | | | | | | ---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- ^ +- start time When a borrower draws down, a "stub period" is created. This period is the remainder of the period they drew down in, but at the end of this period no payment of any kind should be due. We treat this stub period as an extension to period 0.

At the end of each interest or principal period a payment is expected. For example imagine today is Oct 10th. Your next interest payment will be the beginning of December because the current interest period, period 2, ends in december. Your next principal payment will be due at the end of February because the current principal period, period 0, ends in February. This is also the end of the loan, and so all interest and principal should be due at this time.

Because this contract is meant to be re-used between contracts, the "start time" is not stored on this contract Instead, it's passed in to each function call.

periodMapper

contract IPeriodMapper periodMapper

the payment date schedule

periodsInTerm

uint256 periodsInTerm

the number of periods in the term of the loan

periodsPerInterestPeriod

uint256 periodsPerInterestPeriod

the number of payment periods that need to pass before interest comes due

periodsPerPrincipalPeriod

uint256 periodsPerPrincipalPeriod

the number of payment periods that need to pass before principal comes due

gracePrincipalPeriods

uint256 gracePrincipalPeriods

the number of principal periods where no principal will be due

constructor

constructor(contract IPeriodMapper _periodMapper, uint256 _periodsInTerm, uint256 _periodsPerPrincipalPeriod, uint256 _periodsPerInterestPeriod, uint256 _gracePrincipalPeriods) public

Parameters

NameTypeDescription
_periodMappercontract IPeriodMappercontract that maps timestamps to periods
_periodsInTermuint256the number of periods in the term of the loan
_periodsPerPrincipalPerioduint256the number of payment periods that need to pass before principal comes due
_periodsPerInterestPerioduint256the number of payment periods that need to pass before interest comes due.
_gracePrincipalPeriodsuint256principal periods where principal will not be due

interestPeriodAt

function interestPeriodAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the interest period that timestamp resides in

periodAt

function periodAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the period that timestamp resides in

principalPeriodAt

function principalPeriodAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the principal period that timestamp resides in

withinPrincipalGracePeriodAt

function withinPrincipalGracePeriodAt(uint256 startTime, uint256 timestamp) public view returns (bool)

Returns true if the given timestamp resides in a principal grace period

nextDueTimeAt

function nextDueTimeAt(uint256 startTime, uint256 timestamp) external view returns (uint256)

Returns the next timestamp where either principal or interest will come due following timestamp

previousDueTimeAt

function previousDueTimeAt(uint256 startTime, uint256 timestamp) external view returns (uint256)

Returns the previous timestamp where either principal or timestamp came due

totalPrincipalPeriods

function totalPrincipalPeriods() public view returns (uint256)

Returns the total number of principal periods

totalInterestPeriods

function totalInterestPeriods() public view returns (uint256)

Returns the total number of interest periods

termEndTime

function termEndTime(uint256 startTime) external view returns (uint256)

Returns the timestamp that the term will end

termStartTime

function termStartTime(uint256 startTime) external view returns (uint256)

Returns the timestamp that the term began

previousInterestDueTimeAt

function previousInterestDueTimeAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the previous timestamp where new interest came due

previousPrincipalDueTimeAt

function previousPrincipalDueTimeAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the previous timestamp where new principal came due

nextPrincipalDueTimeAt

function nextPrincipalDueTimeAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the next time principal will come due, or the termEndTime if there are no more due times

nextInterestDueTimeAt

function nextInterestDueTimeAt(uint256 startTime, uint256 timestamp) public view returns (uint256)

Returns the next time interest will come due, or the termEndTime if there are no more due times

periodEndTime

function periodEndTime(uint256 startTime, uint256 period) public view returns (uint256)

Returns the end time of the given period.

_termEndAbsolutePeriod

function _termEndAbsolutePeriod(uint256 startTime) internal view returns (uint256)

Returns the absolute period that the terms will end in, accounting for the stub period

_termStartAbsolutePeriod

function _termStartAbsolutePeriod(uint256 startTime) internal view returns (uint256)

Returns the absolute period that the terms started in, accounting for the stub period

_periodToPrincipalPeriod

function _periodToPrincipalPeriod(uint256 p) internal view returns (uint256)

Convert a period to a principal period

_periodToInterestPeriod

function _periodToInterestPeriod(uint256 p) internal view returns (uint256)

Convert a period to an interest period

_interestPeriodToPeriod

function _interestPeriodToPeriod(uint256 p) internal view returns (uint256)

Convert an interest period to a normal period

_principalPeriodToPeriod

function _principalPeriodToPeriod(uint256 p) internal view returns (uint256)

Convert a principal period to a normal period

_periodToAbsolutePeriod

function _periodToAbsolutePeriod(uint256 startTime, uint256 p) internal view returns (uint256)

Convert a period to an absolute period. An absolute period is relative to the beginning of time rather than being relative to the start time

_startOfPrincipalPeriod

function _startOfPrincipalPeriod(uint256 startTime, uint256 principalPeriod) internal view returns (uint256)

Returns the starting timestamp of a principal period

_startOfInterestPeriod

function _startOfInterestPeriod(uint256 startTime, uint256 interestPeriod) internal view returns (uint256)

Returns the starting timestamp of an interest period