SushiConfig

0xef394346a53da57524d1fa7e97e4810ebf106b61

Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
2,071 bytes
ABI entries
41
21 read · 8 write
License
none

Contract information

Address
0xef394346a53da57524d1fa7e97e4810ebf106b61
Chain
Robinhood Chain (4663)
Compiler
v0.8.26+commit.8a97fa7a
Optimization
Enabled
Creation tx
0xe8a9642b1c…7571ebb601

Token

Not a token

This contract does not expose ERC-20 metadata.

Read contract (21)

BPS()uint256
EXTENDED_BPS()uint256
MAX_PLATFORM_SHARE_BPS_LIMIT()uint256
MIN_BOOTSTRAP_ETH()uint256
POSITION_1_ALLOCATION_BPS()uint256
POSITION_2_ALLOCATION_BPS()uint256
POSITION_3_ALLOCATION_BPS()uint256
POSITION_4_ALLOCATION_BPS()uint256
POSITION_5_ALLOCATION_BPS()uint256
POSITION_MCAP_MULTIPLIER()uint256
POSITION_OVERLAP_BPS()uint256
RETIREMENT_OFFSET()uint256
calculateFees(uint256)uint256, uint256, uint256
factory()address
isOperational()bool
kitchen()address
maxPlatformShareBps()uint256
owner()address
paused()bool
platformShareBps()uint256
treasury()address

Events (7)

FactoryUpdatedKitchenUpdatedMaxPlatformShareBpsUpdatedOwnershipTransferredPausedUpdatedPlatformShareBpsUpdatedTreasuryUpdated

ABI

[
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_treasury",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "_owner",
        "type": "address"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [],
    "name": "InvalidAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidShare",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "OwnableInvalidOwner",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "OwnableUnauthorizedAccount",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "oldFactory",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newFactory",
        "type": "address"
      }
    ],
    "name": "FactoryUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "oldKitchen",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newKitchen",
        "type": "address"
      }
    ],
    "name": "KitchenUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "oldMax",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "newMax",
        "type": "uint256"
      }
    ],
    "name": "MaxPlatformShareBpsUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "bool",
        "name": "paused",
        "type": "bool"
      }
    ],
    "name": "PausedUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "oldShare",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "newShare",
        "type": "uint256"
      }
    ],
    "name": "PlatformShareBpsUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "oldTreasury",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newTreasury",
        "type": "address"
      }
    ],
    "name": "TreasuryUpdated",
    "type": "event"
  },
  {
    "inputs": [],
    "name": "BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "EXTENDED_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "MAX_PLATFORM_SHARE_BPS_LIMIT",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "MIN_BOOTSTRAP_ETH",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_1_ALLOCATION_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_2_ALLOCATION_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_3_ALLOCATION_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_4_ALLOCATION_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_5_ALLOCATION_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_MCAP_MULTIPLIER",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "POSITION_OVERLAP_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "RETIREMENT_OFFSET",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "calculateFees",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "totalFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "beneficiaryShare",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "platformShare",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "factory",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "isOperational",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "kitchen",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "maxPlatformShareBps",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "paused",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "platformShareBps",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_factory",
        "type": "address"
      }
    ],
    "name": "setFactory",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_kitchen",
        "type": "address"
      }
    ],
    "name": "setKitchen",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_maxShareBps",
        "type": "uint256"
      }
    ],
    "name": "setMaxPlatformShareBps",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bool",
        "name": "_paused",
        "type": "bool"
      }
    ],
    "name": "setPaused",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_shareBps",
        "type": "uint256"
      }
    ],
    "name": "setPlatformShareBps",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_treasury",
        "type": "address"
      }
    ],
    "name": "setTreasury",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "treasury",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]

Source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

/// @title SushiConfig
/// @notice Treasury / fee-split / bootstrap configuration for the Sushi V3
///         launcher. Ported from SteakhouseConfig (DIRECT); pure Solidity, no
///         AMM coupling. Platform takes 20% of collected LP fees by default;
///         creator/beneficiary gets 80%. Cap defaults to the 50% hard limit.
contract SushiConfig is Ownable {
    uint256 public constant BPS = 10000;
    uint256 public constant EXTENDED_BPS = 100000;
    uint256 public constant MAX_PLATFORM_SHARE_BPS_LIMIT = 5000;

    /// @notice Minimum ETH bootstrapped into the pool at launch. Sushi V3 needs a
    ///         bit more than the V4 dust minimum to seed a real concentrated
    ///         position, so this is raised vs. DIRECT's 0.00003 ether.
    uint256 public constant MIN_BOOTSTRAP_ETH = 0.001 ether;
    uint256 public constant POSITION_OVERLAP_BPS = 500;
    uint256 public constant POSITION_1_ALLOCATION_BPS = 75000;
    uint256 public constant POSITION_2_ALLOCATION_BPS = 18750;
    uint256 public constant POSITION_3_ALLOCATION_BPS = 4688;
    uint256 public constant POSITION_4_ALLOCATION_BPS = 1172;
    uint256 public constant POSITION_5_ALLOCATION_BPS = 390;
    uint256 public constant RETIREMENT_OFFSET = 2;
    uint256 public constant POSITION_MCAP_MULTIPLIER = 16;

    address public treasury;
    uint256 public platformShareBps;
    uint256 public maxPlatformShareBps;
    address public factory;
    /// @notice The KitchenSushi controller, authorized to launch on behalf of a
    ///         creator (createLaunchFor). Set once after Kitchen is deployed.
    address public kitchen;
    bool public paused;

    event TreasuryUpdated(address indexed oldTreasury, address indexed newTreasury);
    event PlatformShareBpsUpdated(uint256 oldShare, uint256 newShare);
    event MaxPlatformShareBpsUpdated(uint256 oldMax, uint256 newMax);
    event FactoryUpdated(address indexed oldFactory, address indexed newFactory);
    event KitchenUpdated(address indexed oldKitchen, address indexed newKitchen);
    event PausedUpdated(bool paused);

    error InvalidAddress();
    error InvalidShare();

    constructor(address _treasury, address _owner) Ownable(_owner) {
        if (_treasury == address(0)) revert InvalidAddress();
        treasury = _treasury;
        // Platform takes 20% of collected LP fees; creator/beneficiary gets 80%.
        // Kept lower than the V4 DIRECT stack's 35% because the Sushi V3 pool fee
        // is only 1% (vs the 1.2-10% the V4 pool could charge), so a smaller cut
        // still leaves the creator a fair share. Owner can dial 0..maxPlatformShareBps.
        platformShareBps = 2000;
        maxPlatformShareBps = 5000;
    }

    function setTreasury(address _treasury) external onlyOwner {
        if (_treasury == address(0)) revert InvalidAddress();
        emit TreasuryUpdated(treasury, _treasury);
        treasury = _treasury;
    }

    function setPlatformShareBps(uint256 _shareBps) external onlyOwner {
        if (_shareBps > maxPlatformShareBps) revert InvalidShare();
        emit PlatformShareBpsUpdated(platformShareBps, _shareBps);
        platformShareBps = _shareBps;
    }

    function setMaxPlatformShareBps(uint256 _maxShareBps) external onlyOwner {
        if (_maxShareBps > MAX_PLATFORM_SHARE_BPS_LIMIT) revert InvalidShare();
        emit MaxPlatformShareBpsUpdated(maxPlatformShareBps, _maxShareBps);
        maxPlatformShareBps = _maxShareBps;
    }

    function setFactory(address _factory) external onlyOwner {
        if (_factory == address(0)) revert InvalidAddress();
        emit FactoryUpdated(factory, _factory);
        factory = _factory;
    }

    function setKitchen(address _kitchen) external onlyOwner {
        if (_kitchen == address(0)) revert InvalidAddress();
        emit KitchenUpdated(kitchen, _kitchen);
        kitchen = _kitchen;
    }

    function setPaused(bool _paused) external onlyOwner {
        emit PausedUpdated(_paused);
        paused = _paused;
    }

    function calculateFees(uint256 amount)
        external
        view
        returns (uint256 totalFee, uint256 beneficiaryShare, uint256 platformShare)
    {
        totalFee = amount;
        platformShare = (totalFee * platformShareBps) / BPS;
        beneficiaryShare = totalFee - platformShare;
    }

    function isOperational() external view returns (bool) {
        return !paused;
    }
}
Chain explorer4513msChain node95ms