Sonic Blaze Testnet

Contract

0xacF4E2f7C4b311F916451bAaf3729C61817D3276

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo0 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Is Started217116492025-02-20 8:27:383 days ago1740040058IN
0xacF4E2f7...1817D3276
0 S0.000056261.1

Latest 1 internal transaction

Parent Transaction Hash Block From To
217116492025-02-20 8:27:383 days ago1740040058
0xacF4E2f7...1817D3276
0 S
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x023C86B1...1de29ce00
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Referral

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : Referral.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;

import "./interfaces/IManager.sol";

contract Referral {
    struct ReferralInfo {
        address[] referrals;
        uint256[] timeOfReferrals;
    }

    mapping(address => string) private shortReferralCodes;
    mapping(string => address) private shortCodeOwners;

    mapping(address => bytes32) private bytesReferralCodes;
    mapping(bytes32 => address) private codeOwnersBytes;

    mapping(address => ReferralInfo) private referrals;
    mapping(address => address) private referrers;

    mapping(address => bool) private isAuthorized;
    bool public isStarted = false;

    uint256 private salt;

    IManager private Manager;

    //--------------------------------------------------//

    constructor(address _manager) {
        Manager = IManager(_manager);
    }

    //--------------------------------------------------//

    modifier onlyStaking() {
        address _Staking = Manager.getContract("Staking");
        require(
            msg.sender == _Staking || msg.sender == Manager.owner(),
            "Only Staking can call this function"
        );
        _;
    }

    modifier onlyOwner() {
        require(
            msg.sender == Manager.owner(),
            "Only owner can call this function"
        );
        _;
    }

    //--------------------------------------------------//

    function setManager(address _manager) external onlyOwner {
        Manager = IManager(_manager);
    }

    function setIsStarted(bool _isStarted) external onlyOwner {
        isStarted = _isStarted;
    }

    function setIsAuthorizedBatch(
        address[] memory users,
        bool _isAuthorized
    ) external onlyOwner {
        for (uint256 i = 0; i < users.length; i++) {
            isAuthorized[users[i]] = _isAuthorized;
        }
    }

    function setIsAuthorized(
        address user,
        bool _isAuthorized
    ) external onlyOwner {
        isAuthorized[user] = _isAuthorized;
    }

    //--------------------------------------------------//

    /**
     * @dev generates a referral code for the caller
     */
    function generateReferralCode() external {
        address sender = msg.sender;
        require(isStarted || isAuthorized[sender], "Not authorized");
        require(
            bytesReferralCodes[sender] == 0,
            "Referral code already generated"
        );

        bytes32 referralCode;
        string memory shortCode;

        do {
            salt++;
            referralCode = keccak256(abi.encodePacked(sender, salt));
            shortCode = _toShortCode(referralCode);
        } while (
            codeOwnersBytes[referralCode] != address(0) ||
                shortCodeOwners[shortCode] != address(0)
        );

        shortReferralCodes[sender] = shortCode;
        shortCodeOwners[shortCode] = sender;

        bytesReferralCodes[sender] = referralCode;
        codeOwnersBytes[referralCode] = sender;
    }

    /**
     * @dev uses a referral code to set the referrer of the caller
     * @param code the referral code to be used
     */
    function useReferralCode(string memory code) external {
        address sender = msg.sender;
        address _referrer = shortCodeOwners[code];
        require(_referrer != address(0), "Referral code does not exist");
        require(sender != _referrer, "Cannot use your own referral code");
        require(
            referrers[sender] == address(0),
            "Already used a referral code"
        );
        referrals[_referrer].referrals.push(sender);
        referrals[_referrer].timeOfReferrals.push(block.timestamp);
        referrers[sender] = _referrer;
    }

    //--------------------------------------------------//

    function _toShortCode(
        bytes32 hashCode
    ) private pure returns (string memory) {
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(10);
        for (uint8 i = 0; i < 10; i++) {
            str[i] = alphabet[uint8(hashCode[i]) & 0x0f];
        }

        return string(str);
    }

    //--------------------------------------------------//

    function getUserFromCode(
        string memory code
    ) external view onlyStaking returns (address) {
        return shortCodeOwners[code];
    }

    function getReferrals(
        address user
    ) external view onlyStaking returns (address[] memory) {
        return referrals[user].referrals;
    }

    function getTimeOfReferrals(
        address user
    ) external view onlyStaking returns (uint256[] memory) {
        return referrals[user].timeOfReferrals;
    }

    /**
     * @dev gets the referral code of a user
     * @param user the user to get the referral code of
     */
    function getCodeFromUser(
        address user
    ) external view returns (string memory) {
        return shortReferralCodes[user];
    }

    /**
     * @dev gets the referrer of a user
     * @param user the user to get the referrer of
     */
    function getReferrer(address user) external view returns (address) {
        return referrers[user];
    }

    /**
     * @dev gets the amount of referrals a user has
     * @param user the user to get the amount of referrals of
     */
    function getAmountOfReferrals(
        address user
    ) external view returns (uint256) {
        return referrals[user].referrals.length;
    }

    /**
     * @dev returns either if a user has a referral code or not
     * @param user the user to check
     */
    function getHasAReferralCode(address user) external view returns (bool) {
        return bytesReferralCodes[user] != 0;
    }
}

File 2 of 2 : IManager.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;

interface IManager {
    function getContract(string memory name) external view returns (address);
    function owner() external view returns (address);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"generateReferralCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getAmountOfReferrals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCodeFromUser","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getHasAReferralCode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferrals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getReferrer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTimeOfReferrals","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"getUserFromCode","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"_isAuthorized","type":"bool"}],"name":"setIsAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool","name":"_isAuthorized","type":"bool"}],"name":"setIsAuthorizedBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isStarted","type":"bool"}],"name":"setIsStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"useReferralCode","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80635873a1961161008c5780639cade937116100665780639cade93714610221578063b0a2fc1b14610258578063d0ebdbe714610260578063f9f6864a1461027357600080fd5b80635873a196146101db5780635d23273f146101ee5780636208aebe1461020157600080fd5b806333a8433a116100c857806333a8433a1461015757806341a0894d1461016a5780634a9fefc71461018a578063544736e6146101ce57600080fd5b8063105af005146100ef578063166aa8a8146101045780631e1c154a14610117575b600080fd5b6101026100fd3660046112be565b610293565b005b61010261011236600461138a565b6103db565b6101426101253660046113ac565b6001600160a01b0316600090815260026020526040902054151590565b60405190151581526020015b60405180910390f35b6101026101653660046113c9565b6104cf565b61017d6101783660046113ac565b6106b8565b60405161014e9190611463565b6101b66101983660046113ac565b6001600160a01b039081166000908152600560205260409020541690565b6040516001600160a01b03909116815260200161014e565b6007546101429060ff1681565b6101b66101e93660046113c9565b6108b0565b6101026101fc3660046114af565b610a62565b61021461020f3660046113ac565b610b6e565b60405161014e91906114ff565b61024a61022f3660046113ac565b6001600160a01b031660009081526004602052604090205490565b60405190815260200161014e565b610102610c1a565b61010261026e3660046113ac565b610e54565b6102866102813660046113ac565b610f64565b60405161014e9190611532565b600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030a919061156a565b6001600160a01b0316336001600160a01b0316146103795760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b60648201526084015b60405180910390fd5b60005b82518110156103d657816006600085848151811061039c5761039c611587565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010161037c565b505050565b600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610452919061156a565b6001600160a01b0316336001600160a01b0316146104bc5760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608401610370565b6007805460ff1916911515919091179055565b600033905060006001836040516104e6919061159d565b908152604051908190036020019020546001600160a01b031690508061054e5760405162461bcd60e51b815260206004820152601c60248201527f526566657272616c20636f646520646f6573206e6f74206578697374000000006044820152606401610370565b806001600160a01b0316826001600160a01b0316036105d55760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742075736520796f7572206f776e20726566657272616c20636f6460448201527f65000000000000000000000000000000000000000000000000000000000000006064820152608401610370565b6001600160a01b03828116600090815260056020526040902054161561063d5760405162461bcd60e51b815260206004820152601c60248201527f416c72656164792075736564206120726566657272616c20636f6465000000006044820152606401610370565b6001600160a01b03908116600081815260046020908152604080832080546001818101835582865284862090910180549890971673ffffffffffffffffffffffffffffffffffffffff199889168117909755908101805491820181558452828420429101559382526005905291909120805490921617905550565b600954604051633581777360e01b81526020600482015260076024820152665374616b696e6760c81b60448201526060916000916001600160a01b0390911690633581777390606401602060405180830381865afa15801561071e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610742919061156a565b9050336001600160a01b03821614806107e25750600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cd919061156a565b6001600160a01b0316336001600160a01b0316145b61083a5760405162461bcd60e51b815260206004820152602360248201527f4f6e6c79205374616b696e672063616e2063616c6c20746869732066756e637460448201526234b7b760e91b6064820152608401610370565b6001600160a01b038316600090815260046020908152604091829020805483518184028101840190945280845290918301828280156108a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610884575b505050505091505b50919050565b600954604051633581777360e01b81526020600482015260076024820152665374616b696e6760c81b604482015260009182916001600160a01b0390911690633581777390606401602060405180830381865afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610939919061156a565b9050336001600160a01b03821614806109d95750600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c4919061156a565b6001600160a01b0316336001600160a01b0316145b610a315760405162461bcd60e51b815260206004820152602360248201527f4f6e6c79205374616b696e672063616e2063616c6c20746869732066756e637460448201526234b7b760e91b6064820152608401610370565b600183604051610a41919061159d565b908152604051908190036020019020546001600160a01b0316915050919050565b600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad9919061156a565b6001600160a01b0316336001600160a01b031614610b435760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608401610370565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152602081905260409020805460609190610b95906115b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc1906115b9565b8015610c0e5780601f10610be357610100808354040283529160200191610c0e565b820191906000526020600020905b815481529060010190602001808311610bf157829003601f168201915b50505050509050919050565b600754339060ff1680610c4557506001600160a01b03811660009081526006602052604090205460ff165b610c915760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a65640000000000000000000000000000000000006044820152606401610370565b6001600160a01b03811660009081526002602052604090205415610cf75760405162461bcd60e51b815260206004820152601f60248201527f526566657272616c20636f646520616c72656164792067656e657261746564006044820152606401610370565b600060605b60088054906000610d0c836115ed565b90915550506008546040516bffffffffffffffffffffffff19606086901b1660208201526034810191909152605401604051602081830303815290604052805190602001209150610d5c82611153565b6000838152600360205260409020549091506001600160a01b0316151580610db6575060006001600160a01b0316600182604051610d9a919061159d565b908152604051908190036020019020546001600160a01b031614155b610cfc576001600160a01b0383166000908152602081905260409020610ddc8282611662565b5082600182604051610dee919061159d565b9081526040805160209281900383019020805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b03958616179091559590921660008181526002835283812086905594855260039091529220805490931690911790915550565b600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb919061156a565b6001600160a01b0316336001600160a01b031614610f355760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6044820152603760f91b6064820152608401610370565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600954604051633581777360e01b81526020600482015260076024820152665374616b696e6760c81b60448201526060916000916001600160a01b0390911690633581777390606401602060405180830381865afa158015610fca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fee919061156a565b9050336001600160a01b038216148061108e5750600960009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611055573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611079919061156a565b6001600160a01b0316336001600160a01b0316145b6110e65760405162461bcd60e51b815260206004820152602360248201527f4f6e6c79205374616b696e672063616e2063616c6c20746869732066756e637460448201526234b7b760e91b6064820152608401610370565b6001600160a01b038316600090815260046020908152604091829020600101805483518184028101840190945280845290918301828280156108a257602002820191906000526020600020905b815481526020019060010190808311611133575050505050915050919050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151600a8082528184019093526060926000919060208201818036833701905050905060005b600a8160ff1610156112425782858260ff16602081106111ce576111ce611587565b1a60f81b60f81c600f1660ff16815181106111eb576111eb611587565b602001015160f81c60f81b828260ff168151811061120b5761120b611587565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016111ac565b509392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156112895761128961124a565b604052919050565b6001600160a01b03811681146112a657600080fd5b50565b803580151581146112b957600080fd5b919050565b600080604083850312156112d157600080fd5b823567ffffffffffffffff8111156112e857600080fd5b8301601f810185136112f957600080fd5b803567ffffffffffffffff8111156113135761131361124a565b8060051b61132360208201611260565b9182526020818401810192908101908884111561133f57600080fd5b6020850194505b8385101561136d578435925061135b83611291565b82825260209485019490910190611346565b8096505050505050611381602084016112a9565b90509250929050565b60006020828403121561139c57600080fd5b6113a5826112a9565b9392505050565b6000602082840312156113be57600080fd5b81356113a581611291565b6000602082840312156113db57600080fd5b813567ffffffffffffffff8111156113f257600080fd5b8201601f8101841361140357600080fd5b803567ffffffffffffffff81111561141d5761141d61124a565b611430601f8201601f1916602001611260565b81815285602083850101111561144557600080fd5b81602084016020830137600091810160200191909152949350505050565b602080825282518282018190526000918401906040840190835b818110156114a45783516001600160a01b031683526020938401939092019160010161147d565b509095945050505050565b600080604083850312156114c257600080fd5b82356114cd81611291565b9150611381602084016112a9565b60005b838110156114f65781810151838201526020016114de565b50506000910152565b602081526000825180602084015261151e8160408501602087016114db565b601f01601f19169190910160400192915050565b602080825282518282018190526000918401906040840190835b818110156114a457835183526020938401939092019160010161154c565b60006020828403121561157c57600080fd5b81516113a581611291565b634e487b7160e01b600052603260045260246000fd5b600082516115af8184602087016114db565b9190910192915050565b600181811c908216806115cd57607f821691505b6020821081036108aa57634e487b7160e01b600052602260045260246000fd5b60006001820161160d57634e487b7160e01b600052601160045260246000fd5b5060010190565b601f8211156103d657806000526020600020601f840160051c8101602085101561163b5750805b601f840160051c820191505b8181101561165b5760008155600101611647565b5050505050565b815167ffffffffffffffff81111561167c5761167c61124a565b6116908161168a84546115b9565b84611614565b6020601f8211600181146116c457600083156116ac5750848201515b600019600385901b1c1916600184901b17845561165b565b600084815260208120601f198516915b828110156116f457878501518255602094850194600190920191016116d4565b50848210156117125786840151600019600387901b60f8161c191681555b50505050600190811b0190555056fea26469706673582212207a46551371fd18ab60bb093d1cef09691f1d83232e29e31853d6c84f3c0e25fe64736f6c634300081a0033

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.