Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x11220097980b4D42b23B97af64842e8cE95b70ac
Balance 0 ETH
Nonce 1
Code Size 4326 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

4326 bytes
0x60806040526004361015610011575f80fd5b5f3560e01c8063020d4386146107015780630222a34a14610a77578063049878f31461094b57806313af4035146108d75780632270419e146108a9578063305933e11461088257806336c021c31461084b5780633c5f2001146108135780634c42e2d9146107da57806352981457146107a757806361301ef21461078a578063626cecf314610746578063684da413146107015780637118c6d7146106d45780637bdce1ae146106925780637c34ca911461064057806385486249146103735780638da5cb5b1461061b5780638ded7c45146105b6578063b1b3b6361461051e578063c1a54bed146103f0578063c8fd0654146103d5578063cebb2c591461039d578063d7ba206214610373578063e89ba6f014610349578063efc81a8c14610239578063f3c358ee146102015763fbfc20fa1461014d575f80fd5b346101fd5760203660031901126101fd576004355f52600860205260405f20805467ffffffffffffffff81116101e95761018c60208260051b01610ba4565b9181835260208301905f5260205f205f915b8383106101b757604051806101b38782610b36565b0390f35b600260206001926101c6610b84565b6001600160a01b038654168152848601548382015281520192019201919061019e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b346101fd5760203660031901126101fd576001600160a01b03610222610ab3565b165f526004602052602060405f2054604051908152f35b346101fd575f3660031901126101fd57335f52600460205261025f60405f205415610ca9565b335f52600660205260405f205461027860648210610cdd565b6002545f198114610335576001019081600255335f5260046020528160405f2055335f52600560205260405f20905f526020528060405f2055335f52600660205260405f20908154600181018091116103355760209255805f526001825260405f206001600160a01b0333166001600160601b0360a01b825416179055805f52600382524360405f20556040518181527f748fd6a01f0f0df2e8354235caf8fdf83654b5a47b2358be7e7bffb16b726ceb833392a2604051908152f35b634e487b7160e01b5f52601160045260245ffd5b346101fd5760203660031901126101fd576004355f526003602052602060405f2054604051908152f35b346101fd5760203660031901126101fd576004355f52600a602052602060405f2054604051908152f35b346101fd5760203660031901126101fd576001600160a01b036103be610ab3565b165f526006602052602060405f2054604051908152f35b346101fd575f3660031901126101fd57602060405160648152f35b346101fd576103fe36610ac9565b91906104156001600160a01b035f54163314610d1c565b815f52600960205260405f206001600160a01b0382165f526020528260405f2054106104f457815f52600a6020528260405f2054106104c957604092825f526009602052835f206001600160a01b0383165f52602052835f20610479828254610e55565b9055825f52600a602052610491845f20918254610e55565b9055815f5260096020526001600160a01b03835f2091165f52602052815f2054905f52600a602052815f205482519182526020820152f35b60405162461bcd60e51b815260206004820152600360248201526249545360e81b6044820152606490fd5b60405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606490fd5b346101fd5760203660031901126101fd576004355f52600760205260405f20805467ffffffffffffffff81116101e95761055d60208260051b01610ba4565b9181835260208301905f5260205f205f915b83831061058457604051806101b38782610b36565b60026020600192610593610b84565b6001600160a01b038654168152848601548382015281520192019201919061056f565b346101fd5760406105c636610ac9565b6105db6001600160a01b035f54163314610d1c565b825f526009602052835f206001600160a01b0383165f52602052835f20610603828254610d0f565b9055825f52600a602052610491845f20918254610d0f565b346101fd575f3660031901126101fd5760206001600160a01b035f5416604051908152f35b346101fd5761064e36610af3565b905f52600760205260405f209081548110156101fd5761066d91610b09565b508054600190910154604080516001600160a01b039093168352602083019190915290f35b346101fd5760206106ca6106a536610ac9565b916106bb6001600160a01b035f54163314610d1c565b5f526007845260405f20610f4f565b6040519015158152f35b346101fd576106e236610af3565b905f52600860205260405f209081548110156101fd5761066d91610b09565b346101fd5760403660031901126101fd5761071a610a9d565b6004355f5260096020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b346101fd5760403660031901126101fd576001600160a01b03610767610ab3565b165f52600560205260405f206024355f52602052602060405f2054604051908152f35b346101fd575f3660031901126101fd576020600254604051908152f35b346101fd5760203660031901126101fd576004355f52600160205260206001600160a01b0360405f205416604051908152f35b346101fd576108116107eb36610ac9565b916108016001600160a01b035f54163314610d1c565b5f52600760205260405f20610e62565b005b346101fd5760206106ca61082636610ac9565b9161083c6001600160a01b035f54163314610d1c565b5f526008845260405f20610f4f565b346101fd5761081161085c36610ac9565b916108726001600160a01b035f54163314610d1c565b5f52600860205260405f20610e62565b346101fd5760403660031901126101fd5760206106ca6108a0610ab3565b60243590610dfe565b346101fd5760403660031901126101fd5760206108cf6108c7610a9d565b600435610d4d565b604051908152f35b346101fd5760203660031901126101fd577fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6040610913610ab3565b5f546001600160a01b038082169261092c843314610d1c565b1680916001600160601b0360a01b16175f5582519182526020820152a1005b346101fd5760203660031901126101fd5760043580151580610a6b575b15610a4057805f5260016020526001600160a01b0360405f20541615610a155761099b6109958233610dfe565b15610ca9565b335f52600660205260405f20546109b460648210610cdd565b335f52600560205260405f20905f526020528060405f2055335f52600660205260405f208054906001820180921161033557556040519081527f2da5c788c7d6057f6fb69078319d8082cfdae75253679e8d00c4c9baafaca9f660203392a2005b60405162461bcd60e51b81526020600482015260036024820152624e464d60e81b6044820152606490fd5b60405162461bcd60e51b8152602060048201526003602482015262464e4560e81b6044820152606490fd5b50600254811115610968565b346101fd5760403660031901126101fd5760206108cf610a95610a9d565b600435610bde565b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b60609060031901126101fd57600435906024356001600160a01b03811681036101fd579060443590565b60409060031901126101fd576004359060243590565b8054821015610b22575f5260205f209060011b01905f90565b634e487b7160e01b5f52603260045260245ffd5b60206040818301928281528451809452019201905f5b818110610b595750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101610b4c565b604051906040820182811067ffffffffffffffff8211176101e957604052565b6040519190601f01601f1916820167ffffffffffffffff8111838210176101e957604052565b8051821015610b225760209160051b010190565b5f52600860205260405f20805467ffffffffffffffff81116101e957610c0960208260051b01610ba4565b9181835260208301905f5260205f205f915b838310610c7757505050505f5b8151811015610c70576001600160a01b03610c438284610bca565b5151166001600160a01b03841614610c5d57600101610c28565b60209250610c6a91610bca565b51015190565b5050505f90565b60026020600192610c86610b84565b6001600160a01b0386541681528486015483820152815201920192019190610c1b565b15610cb057565b60405162461bcd60e51b815260206004820152600560248201526411561254d560da1b6044820152606490fd5b15610ce457565b60405162461bcd60e51b815260206004820152600360248201526226a32960e91b6044820152606490fd5b9190820180921161033557565b15610d2357565b60405162461bcd60e51b81526020600482015260026024820152614e4f60f01b6044820152606490fd5b5f52600760205260405f20805467ffffffffffffffff81116101e957610d7860208260051b01610ba4565b9181835260208301905f5260205f205f915b838310610dcc57505050505f5b8151811015610c70576001600160a01b03610db28284610bca565b5151166001600160a01b03841614610c5d57600101610d97565b60026020600192610ddb610b84565b6001600160a01b0386541681528486015483820152815201920192019190610d8a565b6001600160a01b031690815f52600660205260405f2054915f5b838110610e2757505050505f90565b815f52600560205260405f20815f5260205260405f20548314610e4c57600101610e18565b50505050600190565b9190820391821161033557565b91906001925f5b8154811015610f46576001600160a01b03610e848284610b09565b5054166001600160a01b03841614610e9e57600101610e69565b90919293506001610eb05f9284610b09565b5001610ebd858254610d0f565b90555b610ec957505050565b6001600160a01b03610ed9610b84565b92168252602082019283528054680100000000000000008110156101e957610f0691600182018155610b09565b929092610f33576001600160a01b03806001935116166001600160601b0360a01b84541617835551910155565b634e487b7160e01b5f525f60045260245ffd5b50909192610ec0565b90915f5b82548110156110a8576001600160a01b03610f6e8285610b09565b5054166001600160a01b03851614610f8857600101610f53565b919250806001610f988486610b09565b5001541061107d57610fb96001610faf8486610b09565b5001918254610e55565b90556001610fc78284610b09565b50015415610fd7575b5050600190565b81545f198101919082116103355761103b6001918261100b6001600160a01b036110018789610b09565b5054169587610b09565b500154936001600160a01b036110218388610b09565b5091166001600160601b0360a01b82541617905584610b09565b50015580548015611069575f1901906110548282610b09565b610f33576001815f8093550155555f80610fd0565b634e487b7160e01b5f52603160045260245ffd5b60405162461bcd60e51b815260206004820152600360248201526213915560ea1b6044820152606490fd5b505050505f9056fea2646970667358221220855625cec150bd61a628dbfee621d7d97c8017764bb4d2a03a3439ff19be4dd764736f6c634300081c0033

Verified Source Code Full Match

Compiler: v0.8.28+commit.7893614a EVM: cancun Optimization: Yes (260 runs)
SteleFundInfo.sol 151 lines
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.28;

import './base/Token.sol';
import './interfaces/ISteleFundInfo.sol';

contract SteleFundInfo is Token, ISteleFundInfo {
  address public override owner;
  mapping(uint256 => address) public override manager;                    // manager[fundId]
  uint256 public override fundIdCount = 0;

  // Maximum funds per investor to prevent DoS attacks
  uint256 public constant MAX_FUNDS_PER_INVESTOR = 100;

  // Fund creation block mapping
  mapping(uint256 => uint256) public fundCreationBlock;                   // fundCreationBlock[fundId]

  // fundId
  mapping(address => uint256) public override managingFund;               // managingFund[manager]
  mapping(address => mapping(uint256 => uint256)) public investingFunds;  // investingFunds[investor][index]
  mapping(address => uint256) public investingFundCount;

  // Token
  mapping(uint256 => IToken.Token[]) public fundTokens;                        // fundTokens[fundId]
  mapping(uint256 => IToken.Token[]) public feeTokens;                         // feeTokens[fundId]

  // Investor Shares
  mapping(uint256 => mapping(address => uint256)) public investorShares;  // investorShares[fundId][investor]
  mapping(uint256 => uint256) public fundShares;                     // fundShares[fundId]

  modifier onlyOwner() {
    require(msg.sender == owner, 'NO');
    _;
  }

  constructor() {
    owner = msg.sender;
    emit InfoCreated();
  }

  function setOwner(address newOwner) external override onlyOwner {
    address oldOwner = owner;
    owner = newOwner;
    emit OwnerChanged(oldOwner, newOwner);
  }

  function getFundTokens(uint256 fundId) external override view returns (IToken.Token[] memory) {
    return fundTokens[fundId];
  }

  function getInvestorShare(uint256 fundId, address investor) external override view returns (uint256) {
    return investorShares[fundId][investor];
  }

  function getFundShare(uint256 fundId) external override view returns (uint256) {
    return fundShares[fundId];
  }
  
  function getFeeTokens(uint256 fundId) external override view returns (IToken.Token[] memory) {
    return feeTokens[fundId];
  }

  function getFundTokenAmount(uint256 fundId, address token) public override view returns (uint256) {
    IToken.Token[] memory tokens = fundTokens[fundId];
    for (uint256 i=0; i<tokens.length; i++) {
      if (tokens[i].token == token) {
        return tokens[i].amount;
      }
    }
    return 0;
  }

  function getFeeTokenAmount(uint256 fundId, address token) public override view returns (uint256) {
    IToken.Token[] memory tokens = feeTokens[fundId];
    for (uint256 i=0; i<tokens.length; i++) {
      if (tokens[i].token == token) {
        return tokens[i].amount;
      }
    }
    return 0;
  }
  
  function create() external override returns (uint256 fundId) {
    require(managingFund[msg.sender] == 0, 'EXIST');
    uint256 fundCount = investingFundCount[msg.sender];
    require(fundCount < MAX_FUNDS_PER_INVESTOR, 'MFR'); // Max Funds Reached
    fundId = ++fundIdCount;
    managingFund[msg.sender] = fundId;
    investingFunds[msg.sender][fundCount] = fundId;
    investingFundCount[msg.sender] += 1;
    manager[fundId] = msg.sender;
    fundCreationBlock[fundId] = block.number; // Store fund creation block
    emit Create(fundId, msg.sender);
  }

  function isJoined(address investor, uint256 fundId) public override view returns (bool) {
    uint256 fundCount = investingFundCount[investor];
    for (uint256 i=0; i<fundCount; i++) {
      if (fundId == investingFunds[investor][i]) {
        return true;
      }
    }
    return false;
  }

  function join(uint256 fundId) external override {
    require(fundId > 0 && fundId <= fundIdCount, 'FNE'); // Fund Not Exists
    require(manager[fundId] != address(0), 'NFM'); // No Fund Manager
    require(!isJoined(msg.sender, fundId), 'EXIST');
    uint256 fundCount = investingFundCount[msg.sender];
    require(fundCount < MAX_FUNDS_PER_INVESTOR, 'MFR'); // Max Funds Reached
    investingFunds[msg.sender][fundCount] = fundId;
    investingFundCount[msg.sender] += 1;
    emit Join(fundId, msg.sender);
  }

  function increaseShare(uint256 fundId, address investor, uint256 amount) external override onlyOwner returns (uint256, uint256) {
    investorShares[fundId][investor] += amount;
    fundShares[fundId] += amount;
    uint256 investorShare = investorShares[fundId][investor];
    uint256 fundShare = fundShares[fundId];
    return (investorShare, fundShare);
  }

  function decreaseShare(uint256 fundId, address investor, uint256 amount) external override onlyOwner returns (uint256, uint256) {
    require(investorShares[fundId][investor] >= amount, "IS");
    require(fundShares[fundId] >= amount, "ITS");

    investorShares[fundId][investor] -= amount;
    fundShares[fundId] -= amount;
    uint256 investorShare = investorShares[fundId][investor];
    uint256 fundShare = fundShares[fundId];
    return (investorShare, fundShare);
  }

  function increaseFundToken(uint256 fundId, address token, uint256 amount) external override onlyOwner {
    increaseToken(fundTokens[fundId], token, amount);
  }

  function decreaseFundToken(uint256 fundId, address token, uint256 amount) external override onlyOwner returns (bool) {
    return decreaseToken(fundTokens[fundId], token, amount);
  }

  function increaseFeeToken(uint256 fundId, address token, uint256 amount) external override onlyOwner {
    increaseToken(feeTokens[fundId], token, amount);
  }

  function decreaseFeeToken(uint256 fundId, address token, uint256 amount) external override onlyOwner returns (bool) {
    return decreaseToken(feeTokens[fundId], token, amount);
  }
}
ISteleFundInfo.sol 36 lines
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.28;

import './IToken.sol';

interface ISteleFundInfo is IToken {
  event InfoCreated();
  event OwnerChanged(address owner, address newOwner);
  event Create(uint256 fundId, address indexed manager);
  event Join(uint256 fundId, address indexed investor);
 
  function owner() external view returns (address _owner);
  function manager(uint256 fundId) external view returns (address _manager);
  function managingFund(address _manager) external view returns (uint256 fundId);
  function fundIdCount() external view returns (uint256 fundCount);
  function fundCreationBlock(uint256 fundId) external view returns (uint256 creationBlock);

  function setOwner(address newOwner) external;
  function create() external returns (uint256 fundId);
  function isJoined(address investor, uint256 fundId) external view returns (bool);
  function join(uint256 fundId) external;

  function getFundTokens(uint256 fundId) external view returns (Token[] memory);
  function getFeeTokens(uint256 fundId) external view returns (Token[] memory);
  function getFundTokenAmount(uint256 fundId, address token) external view returns (uint256);
  function getFeeTokenAmount(uint256 fundId, address token) external view returns (uint256);
  function getFundShare(uint256 fundId) external view returns (uint256);
  function getInvestorShare(uint256 fundId, address investor) external view returns (uint256);

  function increaseFundToken(uint256 fundId, address token, uint256 amount) external;
  function decreaseFundToken(uint256 fundId, address token, uint256 amount) external returns (bool);
  function increaseShare(uint256 fundId, address investor, uint256 amount) external returns (uint256, uint256);
  function decreaseShare(uint256 fundId, address investor, uint256 amount) external returns (uint256, uint256);
  function increaseFeeToken(uint256 fundId, address token, uint256 amount) external;
  function decreaseFeeToken(uint256 fundId, address token, uint256 amount) external returns (bool);
}
Token.sol 40 lines
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.28;

import '../interfaces/IToken.sol';

abstract contract Token {

  function increaseToken(IToken.Token[] storage tokens, address token, uint256 amount) internal {
    bool isNewToken = true;
    for (uint256 i=0; i<tokens.length; i++) {
      if (tokens[i].token == token) {
        isNewToken = false;
        tokens[i].amount += amount;
        break;
      }
    }
    if (isNewToken) {
      tokens.push(IToken.Token(token, amount));
    }
  }

  function decreaseToken(IToken.Token[] storage tokens, address token, uint256 amount) internal returns (bool) {
    for (uint256 i=0; i<tokens.length; i++) {
      if (tokens[i].token == token) {
        require(tokens[i].amount >= amount, 'NET');
        tokens[i].amount -= amount;
        if (tokens[i].amount == 0) {
          uint256 lastIndex = tokens.length-1;
          address lastToken = tokens[lastIndex].token;
          uint256 lastTokenAmount = tokens[lastIndex].amount;
          tokens[i].token = lastToken;
          tokens[i].amount = lastTokenAmount;
          tokens.pop();
        }
        return true;
      }
    }
    return false;
  }
}
IToken.sol 9 lines
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.28;

interface IToken {
  struct Token {
    address token;
    uint256 amount;
  }
}

Read Contract

MAX_FUNDS_PER_INVESTOR 0xc8fd0654 → uint256
feeTokens 0x7118c6d7 → address, uint256
fundCreationBlock 0xe89ba6f0 → uint256
fundIdCount 0x61301ef2 → uint256
fundShares 0xd7ba2062 → uint256
fundTokens 0x7c34ca91 → address, uint256
getFeeTokenAmount 0x0222a34a → uint256
getFeeTokens 0xfbfc20fa → tuple[]
getFundShare 0x85486249 → uint256
getFundTokenAmount 0x2270419e → uint256
getFundTokens 0xb1b3b636 → tuple[]
getInvestorShare 0x020d4386 → uint256
investingFundCount 0xcebb2c59 → uint256
investingFunds 0x626cecf3 → uint256
investorShares 0x684da413 → uint256
isJoined 0x305933e1 → bool
manager 0x52981457 → address
managingFund 0xf3c358ee → uint256
owner 0x8da5cb5b → address

Write Contract 9 functions

These functions modify contract state and require a wallet transaction to execute.

create 0xefc81a8c
No parameters
returns: uint256
decreaseFeeToken 0x3c5f2001
uint256 fundId
address token
uint256 amount
returns: bool
decreaseFundToken 0x7bdce1ae
uint256 fundId
address token
uint256 amount
returns: bool
decreaseShare 0xc1a54bed
uint256 fundId
address investor
uint256 amount
returns: uint256, uint256
increaseFeeToken 0x36c021c3
uint256 fundId
address token
uint256 amount
increaseFundToken 0x4c42e2d9
uint256 fundId
address token
uint256 amount
increaseShare 0x8ded7c45
uint256 fundId
address investor
uint256 amount
returns: uint256, uint256
join 0x049878f3
uint256 fundId
setOwner 0x13af4035
address newOwner

Recent Transactions

No transactions found for this address