Smart Contract Architecture

Pencil Finance is built with modular, secure, and upgradeable smart contracts to manage decentralized investment, token issuance, repayment, and interest distribution within student loan bundles. Below is a breakdown of the core contract system.

📦 BundleManager Contract

Purpose: Handles creation and configuration of loan bundles by lending partners.

Functions:

  • createBundle(...): Initializes a new bundle with parameters (loan amount, tranche ratios, interest rates, lock-up period).

  • updateBundleMetadata(...): Allows lending company to update documents, announcements.

  • setStatus(...): Changes bundle status (e.g., Upcoming → Raising → Sold Out→ Staking → Redemption).

  • uploadReport(...): Uploads repayment or performance updates for investors.

💰 SeniorPool Contract

Purpose: Manages deposits and redemptions for Senior Tranche (Grow Token) investors.

Functions:

  • deposit(amount): Accepts USDC, mints Grow Tokens.

  • redeem(tokenAmount): Burns Grow Tokens and returns USDC, subject to withdrawal logic.

  • queueWithdrawal(amount): Enters a withdrawal queue if liquidity is locked.

  • processWithdrawalQueue(): Automatically fulfills withdrawals when capital is available.

  • calculateInterest(...): Computes interest at maturity based on bundle terms.

🧩 JuniorPool Contract

Purpose: Manages capital raised through Junior Tranche (NFT).

Functions:

  • mintNFT(investor, amount, rate): Mints an ERC-721 NFT representing ownership in the Junior Pool.

  • claimInterest(nftId): Withdraws available interest tied to the NFT.

  • redeemNFT(nftId): Withdraws final interest + principal at maturity.

  • calculateShare(nftId): Calculates proportional ownership and payouts for NFT holders.

🔁 RepaymentVault Contract (MVP: no defaults)

Purpose: Handles fund flows from lending companies and allocates repayments to tranches.

Functions:

  • depositRepayment(bundleId, amount): Lending company repays capital + interest into the vault.

  • allocateFunds(): Automatically distributes funds across Senior/Junior pools based on:

    • Repayment ratio

    • Outstanding principal

    • Priority rules (e.g., first pay Senior interest, then Junior)

  • markOverdue(bundleId, amount): Tracks overdue loans if repayment is delayed.

🧠 Governance Contract - PEN DAO (Pending)

Purpose: Enables decentralized protocol governance using the PEN token.

Functions:

  • propose(change): Create a new governance proposal.

  • vote(proposalId, support): Cast votes using PEN tokens.

  • execute(proposalId): Executes passed governance changes (e.g., fee updates, emission adjustments).

  • delegate(address): Delegate voting power to another wallet.

🔒 AccessControl & Security Modules (Pending)

Modules & Patterns:

  • Role-based permissions for lending companies, DAO, and protocol operators.

  • OpenZeppelin libraries for ERC-20, ERC-721, SafeMath, Pausable, and Ownable.

  • Upgradable Proxies via UUPS pattern (if needed for flexibility).

  • Auditing hooks and emergency pause functions to manage platform risk.

🛡️ Security & Best Practices (Pending)

  • External audits before mainnet deployment.

  • Formal verification of interest calculations, queue processing.

  • Testnet simulations for bundle lifecycle and edge cases (e.g., partial repayments, investor overflows).

  • Bug bounty program planned at mainnet launch to incentivize white-hat contributions.

Last updated