Address Contract Verified
Address
0x11220097980b4D42b23B97af64842e8cE95b70ac
Balance
0 ETH
Nonce
1
Code Size
4326 bytes
Creator
0x545597d9...5e7e at tx 0x19e0f61f...fd7f9a
Indexed Transactions
0
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