PalPool

PalPools are the main component of the Protocol.

Each PalPool is independent and holds its own underlying ERC20 governance token.

Users can deposit the underlying token in the PalPool, receiving an amount of PalToken representing their share in the PalPool, and receive part of the fees of the PalPool.

The main use of the PalPool is to Borrow voting/proposition power. When starting a Borrow, the PalPool will create a PalLoan, by cloning the Delegator contract set in the PalPool, it will transfer the amount of tokens borrowed and the fees paid by the borrower, delegate the PalLoan voting power to the borrower, and issue a PalLoanToken to represent the ownership of the PalLoan.

The Borrow can later be extended, closed (and the unused fees will be returned to the borrower), or killed if all the fees were used. The owner of the Borrow can also change the recipient of his PalLoan voting power.

A Borrow is the data struct listed in the PalPool storage, listing all the data relative to the borrowed voting power. A PalLoan (also referred as Loan) is the contract holding the voting power, and delegating it to the given address.

Each PalLoan is linked to a Borrow, and to a PalLoanToken (ERC 721 token representing ownership of a PalLoan and its Borrow)

Methods :

Events :

Deposit

event Deposit(address user, uint amount, address palPool);

When a user deposits in the Pool.

Withdraw

event Withdraw(address user, uint amount, address palPool);

When a user withdraws from the Pool.

NewLoan

event NewLoan(address borrower, address delegatee, address underlying, uint amount, address palPool, address loanAddress, uint256 palLoanTokenId, uint startBlock);

When a Borrow is started and a PalLoan is created.

ExpandLoan

event ExpandLoan(address borrower, address delegatee, address underlying, address palPool, uint newFeesAmount, address loanAddress, uint256 palLoanTokenId);

When the borrower adds more fees to the PalLoan to extend the duration of the loan.

ChangeLoanDelegatee

event ChangeLoanDelegatee( address borrower, address newDelegatee, address underlying, address palPool, address loanAddress, uint256 palLoanTokenId);

When the borrower change the delegatee (recipient of the voting power) of the PalLoan

CloseLoan

event CloseLoan(address borrower, address delegatee, address underlying, uint amount, address palPool, uint usedFees, address loanAddress, uint256 palLoanTokenId, bool wasKilled);

When the Borrow is either closed or killed (the wasKilled flag is ‘true’ if the Borrow was killed).

Read-only methods :

palLoanToken

function palLoanToken() public view returns(address);

Returns the address of the PalLoanToken contract

underlying

function underlying() public view returns(address);

Returns the underlying governance token held by the Pool

palToken

function palToken() public view returns(address);

Returns the address of the palToken linked to this Pool

totalReserve

function totalReserve() public view returns(uint);

Returns the amount in the Pool’s Reserve (in wei)

totalBorrowed

function totalBorrowed() public view returns(uint);

Returns the current total amount of funds borrowed from the Pool (in wei)

minBorrowLength

function minBorrowLength() public view returns(uint);

Returns the minimum duration of a Borrow (in number of blocks)

killFactor

function killFactor() public view returns(uint);

Returns the health factor value at which a Borrow can be killed (scale 1e18)

killerRatio

function killerRatio() public view returns(uint);

Returns the ratio of fees to reward the killer of a Borrow (scale 1e18)

reserveFactor

function reserveFactor() public view returns(uint);

Returns the factor of fees to set as Reserve (scale 1e18)

accrualBlockNumber

function accrualBlockNumber() public view returns(uint);

Returns the block number for the last interest update for this Pool

borrowIndex

function borrowIndex() public view returns(uint);

Returns the last computed Borrow Index for this Pool (scale 1e18)

controller

function controller() public view returns(address);

Returns the address of the current Controller for this Pool

underlyingBalance

function underlyingBalance() public view returns(uint);

Returns the amount of underlying token in the Pool (in wei)

balanceOf

function balanceOf(address _account) external view returns(uint);

Returns balance of the user in palToken (in wei)

underlyingBalanceOf

function underlyingBalanceOf(address _account) external view returns(uint)

Returns balance of the user in the underlying token (in wei)

isLoanOwner

function isLoanOwner(address _loanAddress, address _user) external view returns(bool)

Returns 'true' if the given user is the owner of the PalLoan

idOfLoan

function idOfLoan(address _loanAddress) external view returns(uint256)

Returns the PalLoanToken Id for the given PalLoan

getLoansPools

function getLoansPools() external view returns(address [] memory);

Returns a list of all the Loans (active or closed)

getLoansByBorrower

function getLoansByBorrower(address _borrower) external view returns(address [] memory);

Returns a list of all the user's Loans (active or closed)

getBorrowData

function getBorrowData(address _loanAddress) external view returns (address _borrower, address _loan, uint _amount, address _underlying, uint _feesAmount, uint _feesUsed, uint _startBlock, bool _closed)

Returns all the data stored for the given Borrow (for the given PalLoan)

Parameters :

Returns :

borrowRatePerBlock

function borrowRatePerBlock() external view returns (uint);

Returns the current Borrow Rate (scale 1e18)

supplyRatePerBlock

function supplyRatePerBlock() external view returns (uint);

Returns the current Supply Rate (scale 1e18)

exchangeRateStored

function exchangeRateStored() external view returns (uint);

Returns the last updated Exchange Rate (scale 1e18)

minBorrowFees

function minBorrowFees(uint _amount) external view returns (uint);

Amount minimum of fees to allow the borrow() method. Calculated on the given amount parameter (in wei). Return the minimum amount of fees (in wei)

isKillable

function isKillable(address _loan) external view returns(bool);

Returns true if the health factor of a Borrow (given by the PalLoan address) is low enough to be killed

State-changing methods :

deposit

function deposit(uint _amount) external returns(uint);

Deposit the underlying token into the Pool, and receive an amount of palToken corresponding to the deposit.

Parameters :

Returns :

The _amount value must be approved for the PalPool before this transaction

withdraw

function withdraw(uint _amount) external returns(uint);

Burn an amount of palToken to withdraw the underlying token of the Pool.

Parameters :

Returns :

borrow

function borrow(address _delegatee, uint _amount, uint _feeAmount) external returns(uint);

Starts a Borrow, creates a PalLoan (and mint the PalLoanToken linked to this PalLoan), and sends the borrowed amount and the fees to the PalLoan, to delegate the voting/proposition power to the delegatee.

A minimum of fees, to cover the Minimum Borrow Length, is required to start the Borrow

Parameters :

Returns :

The _feeAmount value must be approved for the PalPool before this transaction

expandBorrow

function expandBorrow(address _loanPool, uint _feeAmount) external returns(uint);

If the borrower wants to extend his Borrow length, fees can be paid to be added to the Borrow (and transferred to the corresponding PalLoan)

Parameters :

Returns :

The _feeAmount value must be approved for the PalPool before this transaction

closeBorrow

function closeBorrow(address _loanPool) external;

A borrower can close his own Borrows if he wants, recovering the fees not used.

If the borrower tries to close the Borrow before the Minimum Borrow Length, Penalty Fees will be be applied to the fees to return to the users, corresponding to the amount of fees to pay up to the Minimum Borrow Length (applied using the Borrow Rate at the time of closing).

Parameters :

killBorrow

function killBorrow(address _loanPool) external;

If a Borrow used all its fees, it can be killed to stop the delegation, and return the voting power to the Pool.

The Killer cannot be the user owning the Borrow, and the Killer is rewarded a part of the fees of this Borrow.

Parameters :

changeBorrowDelegatee

function changeBorrowDelegatee(address _loanPool, address _newDelegatee) external;

Changes the recipient of voting power for the given PalLoan, updating the data in the Borrow, and triggering a delegation process for the PalLoan to give the voting power to the new delegatee address.

Parameters :

exchangeRateCurrent

function exchangeRateCurrent() external returns (uint);

Updates the Pool state & returns the last updated Exchange Rate

Returns :

_updateInterest

function _updateInterest() external returns (uint);

Update the Pool interests & storage values. This method is called before any deposit/withdraw/borrow/closeBorrow/…, but can also be called to update the Pool state.

Returns :

Last updated