# Initial Liquidity Loan Term

# Read-Only Functions

# ownerOf

function ownerOf(uint256 tokenId) external view returns (address owner)

Retrieves the owner of a given token ID.

# liquidationAmount

function liquidationAmount(uint256 loanID) external view returns (uint256)

Returns the liquidation amount for a specific loan.

# loanAmount

function loanAmount(uint256 loanID) external view returns (uint256)

Returns the original loan amount for a specific loan.

# principalAmountPaid

 function principalAmountPaid(uint256 loanID) external view returns (uint256);

# minimumLoanAmount

function minimumLoanAmount() external view returns (uint256)

Returns the minimum allowed loan amount.

# maximumLoanAmount

function maximumLoanAmount() external view returns (uint256)

Returns the maximum allowed loan amount.

# minimumLoanLengthSeconds

function minimumLoanLengthSeconds() external view returns (uint256)

Returns the minimum duration of a loan in seconds.

# maximumLoanLengthSeconds

function maximumLoanLengthSeconds() external view returns (uint256)

Returns the maximum duration of a loan in seconds.

# getPrincipalDue

function getPrincipalDue(uint256 loanID, uint256 asOf) external view returns (uint256)

Returns the principal amount due for a specific loan as of a given time.

# getPremiumsDue

function getPremiumsDue(uint256 loanID, uint256 asOf) external view returns (uint256)

Returns the premium amount due for a specific loan as of a given time.

# getTotalDue

function getTotalDue(uint256 loanID, uint256 asOf) external view returns (uint256)

Returns the total amount due (both principal and premiums) for a specific loan as of a given time.

# getRemainingLiability

function getRemainingLiability(uint256 loanID) external view returns (uint256)

Returns the remaining liability for a specific loan.

# getPremiumPaymentSchedule

function getPremiumPaymentSchedule(uint256 loanID) external view returns (uint256[] memory, uint256[] memory)

Retrieves the premium payment schedule for a specific loan.

# getPrincipalPaymentSchedule

function getPrincipalPaymentSchedule(uint256 loanID) external view returns (uint256[] memory, uint256[] memory)

Retrieves the principal payment schedule for a specific loan.

# isComplete

function isComplete(uint256 loanID) external view returns (bool)

Checks if a specific loan has been completed or not.

# getOriginationAmounts

function getOriginationAmounts(uint256 loanAmount) external view returns (uint256 loanAmountRounded, uint256 originationFee)

Returns the rounded loan amount and the origination fee for a given loan amount.

# getQuote

function getQuote(uint256 loanAmount) external view returns (uint256 loanAmountRounded, uint256 originationFee, uint256 totalPremium)

Provides a quote for a given loan amount, detailing the rounded loan amount, origination fee, and total premium.

# getDiscountedQuote

function getDiscountedQuote(uint256 loanAmount_, uint256 premiumFeeModifier, uint256 originationFeeModifier) external view returns (uint256 loanAmountRounded, uint256 originationFee, uint256 totalPremium)

Provides a discounted quote for a given loan amount based on provided premium and origination fee modifiers.

# State-Changing Functions

# transferFrom

function transferFrom(
    address from,
    address to,
    uint256 tokenId
) external

Transfers a specific token from one address to another.

# originateLoan

function originateLoan(
    uint256 loanAmount,
    uint256 originationFee,
    uint256 loanLengthSeconds_,

    uint256 premiumFeeModifierNumerator_,
    uint256 originationFeeModifierNumerator_,

    address receiver,
    uint256 tokenId
) external payable

Originate a new loan with the given parameters.

# recordPrincipalRepayment

function recordPrincipalRepayment(uint256 loanID, uint256 amount) external returns (uint256 premiumPaid, uint256 principalPaid, uint256 refundAmount, uint256 remainingLiability)

Records a principal repayment for a specific loan and returns details about the repayment.

# recordPayment

function recordPayment(uint256 loanID, uint256 amount) external returns (uint256 premiumPaid, uint256 principalPaid, uint256 refundAmount, uint256 remainingLiability)

Records a payment for a specific loan and returns details about the payment.

interface IX7InitialLiquidityLoanTerm {

    function ownerOf(uint256 tokenId) external view returns (address owner);
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function originateLoan(
        uint256 loanAmount,
        uint256 originationFee,
        uint256 loanLengthSeconds_,

        uint256 premiumFeeModifierNumerator_,
        uint256 originationFeeModifierNumerator_,

        address receiver,
        uint256 tokenId
    ) external payable;

    function minimumLoanAmount() external view returns (uint256);
    function maximumLoanAmount() external view returns (uint256);
    function minimumLoanLengthSeconds() external view returns (uint256);
    function maximumLoanLengthSeconds() external view returns (uint256);

    function getPrincipalDue(uint256 loanID, uint256 asOf) external view returns (uint256);
    function getPremiumsDue(uint256 loanID, uint256 asOf) external view returns (uint256);
    function getTotalDue(uint256 loanID, uint256 asOf) external view returns (uint256);
    function getRemainingLiability(uint256 loanID) external view returns (uint256);
    function getPremiumPaymentSchedule(uint256 loanID) external view returns (uint256[] memory, uint256[] memory);
    function getPrincipalPaymentSchedule(uint256 loanID) external view returns (uint256[] memory, uint256[] memory);

    function isComplete(uint256 loanID) external view returns (bool);
    function getOriginationAmounts(uint256 loanAmount) external view returns (uint256 loanAmountRounded, uint256 originationFee);
    function getQuote(uint256 loanAmount) external view returns (uint256 loanAmountRounded, uint256 originationFee, uint256 totalPremium);
    function getDiscountedQuote(uint256 loanAmount_, uint256 premiumFeeModifier, uint256 originationFeeModifier) external view returns (uint256 loanAmountRounded, uint256 originationFee, uint256 totalPremium);
    function recordPrincipalRepayment(uint256 loanID, uint256 amount) external returns (uint256 premiumPaid, uint256 principalPaid, uint256 refundAmount, uint256 remainingLiability);
    function recordPayment(uint256 loanID, uint256 amount) external returns (uint256 premiumPaid, uint256 principalPaid, uint256 refundAmount, uint256 remainingLiability);
    function liquidationAmount(uint256 loanID) external view returns (uint256);

    function loanAmount(uint256 loanID) external view returns (uint256);
    function principalAmountPaid(uint256 loanID) external view returns (uint256);

}