Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

NettedX Blockchain is the smart contract layer of the NettedX settlement system.

The project implements blockchain-based trade netting and settlement using Solidity and Foundry. It includes settlement management, netting, liquidity pool management, ERC-20 test tokens, and other functionalities.
The project implements blockchain-based trade netting and settlement using Solidity and Foundry. It includes settlement management, netting, liquidity buffer management, ERC-20 test tokens, and other functionalities.

## Prerequisites

Expand Down Expand Up @@ -151,7 +151,7 @@ The main contracts are:
```text
Netting
Settlement
LiquidityPool
LiquidityBuffer
MockUSDC
MockBond
```
Expand Down Expand Up @@ -259,7 +259,7 @@ NettedX-Blockchain/
│ ├── core/
│ │ ├── Netting.sol
│ │ ├── Settlement.sol
│ │ └── LiquidityPool.sol
│ │ └── LiquidityBuffer.sol
│ ├── interfaces/
│ └── libraries/
├── test/
Expand Down
18 changes: 9 additions & 9 deletions script/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import {MockBond} from "../src/tokens/MockBond.sol";

import {Settlement} from "../src/core/Settlement.sol";
import {Netting} from "../src/core/Netting.sol";
import {LiquidityPool} from "../src/core/LiquidityPool.sol";
import {LiquidityBuffer} from "../src/core/LiquidityBuffer.sol";

contract Deploy is Script {
function run()
external
returns (MockUSDC usdc, MockBond bond, Settlement settlement, Netting netting, LiquidityPool liquidityPool)
returns (MockUSDC usdc, MockBond bond, Settlement settlement, Netting netting, LiquidityBuffer liquidityBuffer)
{
// =========================================================
// Get deployer private key
Expand Down Expand Up @@ -56,10 +56,10 @@ contract Deploy is Script {
netting = new Netting(deployer, address(usdc), address(bond), address(settlement));

// =========================================================
// 5. Deploy LiquidityPool
// 5. Deploy LiquidityBuffer
// =========================================================

liquidityPool = new LiquidityPool();
liquidityBuffer = new LiquidityBuffer();

// =========================================================
// 6. Initialize Settlement -> Netting
Expand All @@ -68,16 +68,16 @@ contract Deploy is Script {
settlement.setNetting(address(netting));

// =========================================================
// 7. Initialize Settlement -> LiquidityPool
// 7. Initialize Settlement -> LiquidityBuffer
// =========================================================

settlement.setLiquidityPool(address(liquidityPool));
settlement.setLiquidityBuffer(address(liquidityBuffer));

// =========================================================
// 8. Initialize LiquidityPool -> Settlement
// 8. Initialize LiquidityBuffer -> Settlement
// =========================================================

liquidityPool.setSettlement(address(settlement));
liquidityBuffer.setSettlement(address(settlement));

// =========================================================
// Stop deployment
Expand All @@ -97,6 +97,6 @@ contract Deploy is Script {

console2.log("NETTING:", address(netting));

console2.log("LIQUIDITY_POOL:", address(liquidityPool));
console2.log("LIQUIDITY_BUFFER:", address(liquidityBuffer));
}
}
12 changes: 6 additions & 6 deletions src/core/LiquidityPool.sol → src/core/LiquidityBuffer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

import "../interfaces/ILiquidityPool.sol";
import "../interfaces/ILiquidityBuffer.sol";

contract LiquidityPool is ILiquidityPool, Ownable, ReentrancyGuard {
contract LiquidityBuffer is ILiquidityBuffer, Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;

/**
Expand Down Expand Up @@ -39,10 +39,10 @@ contract LiquidityPool is ILiquidityPool, Ownable, ReentrancyGuard {
mapping(address => mapping(address => uint256)) public override debt;

/**
* @notice Create LiquidityPool.
* @notice Create LiquidityBuffer.
*
* Settlement is configured separately because
* LiquidityPool and Settlement may have deployment
* LiquidityBuffer and Settlement may have deployment
* dependencies.
*/
constructor() Ownable(msg.sender) {}
Expand All @@ -69,7 +69,7 @@ contract LiquidityPool is ILiquidityPool, Ownable, ReentrancyGuard {
}

/**
* @notice Deposit tokens into the pool.
* @notice Deposit tokens into the buffer.
*/
function deposit(address asset, uint256 amount) external override nonReentrant {
require(asset != address(0), "Zero asset");
Expand Down Expand Up @@ -109,7 +109,7 @@ contract LiquidityPool is ILiquidityPool, Ownable, ReentrancyGuard {
* This function does NOT transfer tokens to the debtor.
*
* It transfers the required amount directly from the
* LiquidityPool to Settlement.
* LiquidityBuffer to Settlement.
*
* Settlement can then use those funds to complete
* the settlement process.
Expand Down
42 changes: 21 additions & 21 deletions src/core/Settlement.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import "@openzeppelin/contracts/access/Ownable.sol";

import "../interfaces/INetting.sol";
import "../interfaces/ISettlement.sol";
import "../interfaces/ILiquidityPool.sol";
import "../interfaces/ILiquidityBuffer.sol";

import "../libraries/Types.sol";
import "../libraries/Errors.sol";
Expand All @@ -29,11 +29,11 @@ contract Settlement is ISettlement, ReentrancyGuard, Ownable {
address public netting;

/**
* @notice Liquidity Pool contract address.
* @notice Liquidity Buffer contract address.
*
* LiquidityPool is configured after deployment.
* LiquidityBuffer is configured after deployment.
*/
address public liquidityPool;
address public liquidityBuffer;

// =============================================================
// Constructor
Expand Down Expand Up @@ -62,19 +62,19 @@ contract Settlement is ISettlement, ReentrancyGuard, Ownable {
}

/**
* @notice Set Liquidity Pool contract address.
* @notice Set Liquidity Buffer contract address.
* @dev Can only be called once by the owner.
*/
function setLiquidityPool(address liquidityPool_) external onlyOwner {
if (liquidityPool != address(0)) {
revert Errors.LiquidityPoolAlreadySet();
function setLiquidityBuffer(address liquidityBuffer_) external onlyOwner {
if (liquidityBuffer != address(0)) {
revert Errors.LiquidityBufferAlreadySet();
}

if (liquidityPool_ == address(0)) {
if (liquidityBuffer_ == address(0)) {
revert Errors.ZeroAddress();
}

liquidityPool = liquidityPool_;
liquidityBuffer = liquidityBuffer_;
}

// =============================================================
Expand Down Expand Up @@ -111,19 +111,19 @@ contract Settlement is ISettlement, ReentrancyGuard, Ownable {
* ↓
* Payer pays what they have
* ↓
* LiquidityPool provides shortfall
* LiquidityBuffer provides shortfall
* ↓
* Settlement -> Receiver
*
* The LiquidityPool records the shortfall as debt.
* The LiquidityBuffer records the shortfall as debt.
*/
function settle(Types.NetPosition[] calldata positions) external override onlyNetting nonReentrant {
if (positions.length == 0) {
revert Errors.InvalidPosition();
}

if (liquidityPool == address(0)) {
revert Errors.LiquidityPoolNotSet();
if (liquidityBuffer == address(0)) {
revert Errors.LiquidityBufferNotSet();
}

uint256 transferCount = 0;
Expand Down Expand Up @@ -192,13 +192,13 @@ contract Settlement is ISettlement, ReentrancyGuard, Ownable {
uint256 payerAmount = balance < amount ? balance : amount;

// =================================================
// Liquidity Pool covers the shortfall.
// Liquidity Buffer covers the shortfall.
// =================================================

uint256 poolAmount = amount - payerAmount;
uint256 bufferAmount = amount - payerAmount;

if (poolAmount > 0) {
ILiquidityPool(liquidityPool).provideLiquidity(asset, payer, poolAmount);
if (bufferAmount > 0) {
ILiquidityBuffer(liquidityBuffer).provideLiquidity(asset, payer, bufferAmount);
}

// =================================================
Expand All @@ -214,13 +214,13 @@ contract Settlement is ISettlement, ReentrancyGuard, Ownable {
}

// =================================================
// LiquidityPool funds are now sitting in Settlement.
// LiquidityBuffer funds are now sitting in Settlement.
//
// Send them to receiver.
// =================================================

if (poolAmount > 0) {
token.safeTransfer(receiver, poolAmount);
if (bufferAmount > 0) {
token.safeTransfer(receiver, bufferAmount);
}

emit Events.Transferred(INetting(netting).currentWindowId(), asset, payer, receiver, amount);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface ILiquidityPool {
interface ILiquidityBuffer {
/**
* @notice Deposit ERC20 tokens into the liquidity pool.
* @notice Deposit ERC20 tokens into the liquidity buffer.
*/
function deposit(address asset, uint256 amount) external;

Expand Down
4 changes: 2 additions & 2 deletions src/libraries/Errors.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ library Errors {
error InsufficientAllowance();

error InvalidAsset();
error LiquidityPoolAlreadySet();
error LiquidityPoolNotSet();
error LiquidityBufferAlreadySet();
error LiquidityBufferNotSet();
}
Loading
Loading