Simple Request

1. Summary

PWNSimpleLoanSimpleRequest.sol defines Simple Request for the Simple Loan type.

3. Contract details

  • PWNSimpleLoanSimpleRequest.sol is written in Solidity version 0.8.16

Features

  • Make Simple Request

  • Create Simple Loan terms from Simple Request

  • Provides a function to encode Simple Request

Inherited contracts, implemented Interfaces and ERCs

Functions

makeRequest

Overview

Make an on-chain simple loan request.

This function takes one argument supplied by the caller:

  • Request calldatarequest - Request struct with the simple request parameters

Implementation

function makeRequest(Request calldata request) external {
    _makeRequest(getRequestHash(request), request.borrower);
}
createLOANTerms

Overview

Builds simple loan terms from given data.

This function takes three arguments supplied by the loan type:

  • addresscaller - The caller of the createLoan function on the Loan contract

  • bytes calldatafactoryData - Encoded data for the Loan Terms factory

  • bytes calldatasignature - Singed loan factory data

Implementation

function createLOANTerms(
    address caller,
    bytes calldata factoryData,
    bytes calldata signature
) external override onlyActiveLoan returns (PWNLOANTerms.Simple memory loanTerms) {

    Request memory request = abi.decode(factoryData, (Request));
    bytes32 requestHash = getRequestHash(request);

    address lender = caller;
    address borrower = request.borrower;

    // Check that request has been made via on-chain tx, EIP-1271 or signed off-chain
    if (requestsMade[requestHash] == false)
        if (PWNSignatureChecker.isValidSignatureNow(borrower, requestHash, signature) == false)
            revert InvalidSignature();

    // Check valid request
    if (request.expiration != 0 && block.timestamp >= request.expiration)
        revert RequestExpired();

    if (revokedRequestNonce.isNonceRevoked(borrower, request.nonce) == true)
        revert NonceAlreadyRevoked();

    if (request.lender != address(0))
        if (lender != request.lender)
            revert CallerIsNotStatedLender(request.lender);

    if (request.duration < MIN_LOAN_DURATION)
        revert InvalidDuration();

    // Prepare collateral and loan asset
    MultiToken.Asset memory collateral = MultiToken.Asset({
        category: request.collateralCategory,
        assetAddress: request.collateralAddress,
        id: request.collateralId,
        amount: request.collateralAmount
    });
    MultiToken.Asset memory loanAsset = MultiToken.Asset({
        category: MultiToken.Category.ERC20,
        assetAddress: request.loanAssetAddress,
        id: 0,
        amount: request.loanAmount
    });

    // Create loan object
    loanTerms = PWNLOANTerms.Simple({
        lender: lender,
        borrower: borrower,
        expiration: uint40(block.timestamp) + request.duration,
        collateral: collateral,
        asset: loanAsset,
        loanRepayAmount: request.loanAmount + request.loanYield
    });

    revokedRequestNonce.revokeNonce(borrower, request.nonce);
}
encodeLoanTermsFactoryData

Overview

Returns encoded input data for the loan terms factory (inherited by this contract).

This function takes one argument supplied by the caller:

  • Request memoryrequest - Simple request struct to encode

Implementation

function encodeLoanTermsFactoryData(Request memory request) external pure returns (bytes memory) {
    return abi.encode(request);
}

View Functions

getRequestHash

Overview

Returns a simple request hash according to EIP-712.

This function takes one argument supplied by the caller:

  • Request memoryrequest - Simple request struct to get hash of

Implementation

function getRequestHash(Request memory request) public view returns (bytes32) {
    return keccak256(abi.encodePacked(
        hex"1901",
        DOMAIN_SEPARATOR,
        keccak256(abi.encodePacked(
            REQUEST_TYPEHASH,
            abi.encode(request)
        ))
    ));
}

Events

The PWN Simple Loan Simple Request contract inherits events from the Simple Loan Request contract and does not define any additional custom events or errors.

Simple Request Struct

TypeNameComment

MultiToken.Category

collateralCategory

0 -> ERC-20 1 -> ERC-721 2 -> ERC-1155

address

collateralAddress

Address of an asset used as a collateral.

uint256

collateralId

Token id of an asset used as a collateral, in case of ERC20 should be 0.

uint256

collateralAmount

Amount of tokens used as a collateral, in case of ERC721 should be 0.

address

loanAssetAddress

Address of an loaned asset.

uint256

loanAmount

Amount of tokens which is requested as a loan.

uint256

loanYield

Amount of tokens which act as a lenders loan interest. Borrower has to pay back a borrowed amount + yield.

uint32

duration

Loan duration in seconds.

uint40

expiration

Request expiration unix timestamp in seconds.

address

borrower

Address of a borrower. This address has to sign a request for it to be valid.

address

lender

Address of a lender. Only this address can accept a request. If the address is zero address, anybody with a loan asset can accept the request.

uint256

nonce

Additional value to enable identical requests in time. Without it, it would be impossible to make a request, which was once revoked. Nonce can be used to create a group of requests, where accepting one request will make other requests in the group invalid.

Last updated