NAVI Lending Protocol Upgrade Announcement (2025/11/10)

We are excited to announce that NAVI Lending will soon undergo a major upgrade! This update is designed to further enhance capital utilization, security, and flexibility, bringing a smoother and smarter DeFi experience to both ecosystem partners and end users.


Launch Schedule

  • Estimated Time:

    • PST: 2025/11/17 4:00 PM

    • EST: 2025/11/17 7:00 PM

    • SGT: 2025/11/18 08:00 AM

  • Package Id:

    • Waiting for deployment


Guideline Overview

NAVI Lending Core Smart Contract Upgrade

  1. Our package_id will be updated due to a smart contract upgrade; the old package_id will be deprecated immediately.

  2. Breaking Change: For SUI-asset operations: borrow, withdraw, flashloan, liquidation need a new interface immediately after the upgrade.

  3. For Non-SUI-Asset operations, borrow, withdraw, flashloan, liquidation are still functional for 30 days grace period. After 30 days, the legacy interface will be deprecated.

  4. No changes needed: deposit, repay, claim_reward operations work as before

  5. No changes needed: getter&view functions work as before

Upgrade Overview

This NAVI upgrade covers two core areas:

  1. Launch of the Fund Manager Module

    • Supplied SUI assets will be automatically staked via vSUI to increase protocol-wide yields.

  2. Flexible Borrow Fee Structure

    • Allows assigning a special borrowing fee rate for users.


Partner Notice & Action Checklist

  • Interface/Compatibility Changes:

    1. Package Id will be upgraded

    2. Module names and paths remain unchanged.

    3. Function call may introduce extra arguments—please review the updated API documents.

    4. Interface migration requirements:

      • If you withdraw/borrow/liquidate/flashloan with a non-SUI assets (asset id != 0), you can still use the original interface. But it's highly recommended to use the new v2 interface. The legacy interface will be deprecated in the future.

      • If you withdraw/borrow/liquidate/flashloan with SUI asset (asset id = 0), you need to use the new v2 interface.

      • If you deposit/repay/claim_reward, you don't need to change the interface

  • Migration Tips:

    1. Update your packageId in your dependencies. Detailed guides for different user types:

      • For Smart Contract Builders:

        • You will need to update the NAVI lending_core package_id in your Move.toml.

        • If you use GitHub/MVR as a dependency, we will update the link after the upgrade.

        • Use the new interfaces in your smart contract.

      • For Frontend/Backend Builders:

        • Use the new package id in your move call.

        • Use the new interfaces in your move call.

        • If you use the MVR as a reference, we will update the link after the upgrade.

    2. Pause any automated scripts before the maintenance; resume after verifying all integration points with the new contracts.


【For Developers】Major User-facing Interface Changes

Below are all key user entry-points for fund operations. Partners are strongly encouraged to migrate to these new interfaces for the best compatibility and feature support:

Firstly, please import the SuiSystemState to your module:

use sui_system::sui_system::{SuiSystemState};

1. entry_withdraw (incentive_v3 module)

Old (Legacy):

public entry fun entry_withdraw<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
)

New:

public entry fun entry_withdraw_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
)

Key change:

  • Added system_state as a required on-chain argument.


2. entry_borrow (incentive_v3 module)

Old (Legacy):

public entry fun entry_borrow<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
)

New:

public entry fun entry_borrow_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
)

Key change:

  • Added system_state as a required on-chain argument.


3. entry_liquidation (incentive_v3 module)

Old (Legacy):

public entry fun entry_liquidation<DebtCoinType, CollateralCoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    debt_asset: u8,
    debt_pool: &mut Pool<DebtCoinType>,
    debt_coin: Coin<DebtCoinType>,
    collateral_asset: u8,
    collateral_pool: &mut Pool<CollateralCoinType>,
    liquidate_user: address,
    liquidate_amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
)

New:

public entry fun entry_liquidation_v2<DebtCoinType, CollateralCoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    debt_asset: u8,
    debt_pool: &mut Pool<DebtCoinType>,
    debt_coin: Coin<DebtCoinType>,
    collateral_asset: u8,
    collateral_pool: &mut Pool<CollateralCoinType>,
    liquidate_user: address,
    liquidate_amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
)

Key change:

  • Added system_state as a required on-chain argument.


4. withdraw_with_account_cap (incentive_v3 module)

Old (Legacy):

public(friend) fun withdraw_with_account_cap<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    account_cap: &AccountCap
): Balance<CoinType>

New:

public(friend) fun withdraw_with_account_cap_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    account_cap: &AccountCap,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): Balance<CoinType>

Key change:

  • v2 adds both system_state and ctx arguments.


5. withdraw (incentive_v3 module)

Old (Legacy):

public fun withdraw<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
): Balance<CoinType>

New:

public fun withdraw_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): Balance<CoinType>

Key change:

  • v2 adds system_state argument for advanced on-chain support.


6. borrow (incentive_v3 module)

Old (Legacy):

public fun borrow<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
): Balance<CoinType>

New:

public fun borrow_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): Balance<CoinType>

Key change:

  • v2 adds system_state as a required on-chain argument.


7. borrow_with_account_cap (incentive_v3 module)

Old (Legacy):

public fun borrow_with_account_cap<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    account_cap: &AccountCap
): Balance<CoinType>

New:

public fun borrow_with_account_cap_v2<CoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    pool: &mut Pool<CoinType>,
    asset: u8,
    amount: u64,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    account_cap: &AccountCap,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): Balance<CoinType>

Key change:

  • v2 adds both system_state and ctx arguments.


8. liquidation (incentive_v3 module)

Old (Legacy):

public fun liquidation<DebtCoinType, CollateralCoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    debt_asset: u8,
    debt_pool: &mut Pool<DebtCoinType>,
    debt_balance: Balance<DebtCoinType>,
    collateral_asset: u8,
    collateral_pool: &mut Pool<CollateralCoinType>,
    liquidate_user: address,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    ctx: &mut TxContext
): (Balance<CollateralCoinType>, Balance<DebtCoinType>)

New:

public fun liquidation_v2<DebtCoinType, CollateralCoinType>(
    clock: &Clock,
    oracle: &PriceOracle,
    storage: &mut Storage,
    debt_asset: u8,
    debt_pool: &mut Pool<DebtCoinType>,
    debt_balance: Balance<DebtCoinType>,
    collateral_asset: u8,
    collateral_pool: &mut Pool<CollateralCoinType>,
    liquidate_user: address,
    incentive_v2: &mut IncentiveV2,
    incentive_v3: &mut Incentive,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): (Balance<CollateralCoinType>, Balance<DebtCoinType>)

Key change:

  • v2 adds system_state as a required on-chain argument.


9. flash_loan_with_ctx (lending module)

Old (Legacy):

public fun flash_loan_with_ctx<CoinType>(
    config: &FlashLoanConfig,
    pool: &mut Pool<CoinType>,
    amount: u64,
    ctx: &mut TxContext
): (Balance<CoinType>, FlashLoanReceipt<CoinType>)

New:

public fun flash_loan_with_ctx_v2<CoinType>(
    config: &FlashLoanConfig,
    pool: &mut Pool<CoinType>,
    amount: u64,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): (Balance<CoinType>, FlashLoanReceipt<CoinType>)

Key change:

  • v2 adds system_state as a required on-chain argument.


10. flash_loan_with_account_cap (lending module)

Old (Legacy):

public fun flash_loan_with_account_cap<CoinType>(
    config: &FlashLoanConfig,
    pool: &mut Pool<CoinType>,
    amount: u64,
    account_cap: &AccountCap
): (Balance<CoinType>, FlashLoanReceipt<CoinType>)

New:

public fun flash_loan_with_account_cap_v2<CoinType>(
    config: &FlashLoanConfig,
    pool: &mut Pool<CoinType>,
    amount: u64,
    account_cap: &AccountCap,
    system_state: &mut SuiSystemState,
    ctx: &mut TxContext
): (Balance<CoinType>, FlashLoanReceipt<CoinType>)

Key change:

  • v2 adds both system_state and ctx arguments.


Interface Upgrade Summary

  • All major fund operation APIs (withdraw, borrow, liquidation, flash loan) now have corresponding *_v2 entry points.

  • The updated function signatures feature a more complete argument list; all partner integrations should migrate to the new interfaces.

  • Legacy versions WILL NOT support new reward, liquidation, flexible fee, or protected mode features.


FAQ

  • Q1: Is this an upgrade or a brand-new package? A: This is an upgrade to the existing major package. Most module/method addresses will remain—watch for update notices.

  • Q2: Will borrow/liquidation interfaces remain usable? A: The legacy methods will still work for non-SUI asset operations, but migration to the new entry points is strongly recommended to enjoy all new features and maximum flexibility.

  • Q3: How will the staking yield be used? A: The staking yield generated from the fund manager module will be used to incentivize users in the future.

  • Q4: Is the upgrade audited? A: Yes. The upgrade is fully audited by OtterSec and Movebit.


——NAVI Protocol Team

Last updated