Address Details
contract

0xeD4B6274cE0AC794bfb18504B441Ac8602f96dd8

Contract Name
ReferralManager
Creator
0xd3c2ab–ffc681 at 0xa7c62e–277585
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
18139861
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
ReferralManager




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
800
EVM Version
london




Verified at
2023-02-27T14:05:15.524493Z

contracts/core/ReferralManager.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../access/Governable.sol";

contract ReferralManager is Governable {
    struct Tier {
        uint256 referrerRebate;
        uint256 traderRebate;
    }

    uint256 public constant BASIS_POINTS = 10000;

    mapping(bytes32 => address) public codeOwners;
    mapping(address => bytes32) public traderCodes;
    mapping(uint256 => Tier) public tiers;
    mapping(address => uint256) public referrerTiers;
    mapping(address => bool) public isAdmin;

    event CreateCode(address account, bytes32 code);
    event UseCode(address account, bytes32 code);
    event ChangeCodeOwner(address account, address newAccount, bytes32 code);
    event SetTier(uint256 tierNum, uint256 referrerRebate, uint256 traderRebate);
    event SetReferrerTier(address referrer, uint256 tierNum);

    modifier onlyAdmin() {
        require(isAdmin[msg.sender], "ReferralManager: forbidden");
        _;
    }

    constructor() {
        isAdmin[msg.sender] = true;

        setTier(0, 500, 500);
        setTier(1, 1000, 1000);
        setTier(2, 1000, 1500);
    }

    function createCode(bytes32 _code) external {
        require(_code != bytes32(0), "ReferralManager: invalid _code");
        require(codeOwners[_code] == address(0), "ReferralManager: code already exists");

        codeOwners[_code] = msg.sender;
        emit CreateCode(msg.sender, _code);
    }

    function useCode(bytes32 _code) external {
        require(codeOwners[_code] != address(0), "ReferralManager: code does not exist");

        traderCodes[msg.sender] = _code;
        emit UseCode(msg.sender, _code);
    }

    function changeCodeOwner(bytes32 _code, address _newAccount) external {
        require(_code != bytes32(0), "ReferralManager: invalid _code");
        require(msg.sender == codeOwners[_code], "ReferralManager: forbidden");

        codeOwners[_code] = _newAccount;
        emit ChangeCodeOwner(msg.sender, _newAccount, _code);
    }

    function getReferrerInfo(address _account)
        external
        view
        returns (
            address,
            uint256,
            uint256
        )
    {
        bytes32 code = traderCodes[_account];

        if (code == bytes32(0)) {
            return (address(0), 0, 0);
        }

        address referrer = codeOwners[code];

        return (referrer, tiers[referrerTiers[referrer]].referrerRebate, tiers[referrerTiers[referrer]].traderRebate);
    }

    function setReferrerTier(address _referrer, uint256 _tierNum) external onlyAdmin {
        referrerTiers[_referrer] = _tierNum;

        emit SetReferrerTier(_referrer, _tierNum);
    }

    function setTier(
        uint256 _tierNum,
        uint256 _referrerRebate,
        uint256 _traderRebate
    ) public onlyGov {
        require(_referrerRebate + _traderRebate < BASIS_POINTS, "ReferralManager: invalid rebate");

        tiers[_tierNum].referrerRebate = _referrerRebate;
        tiers[_tierNum].traderRebate = _traderRebate;

        emit SetTier(_tierNum, _referrerRebate, _traderRebate);
    }

    function setAdmin(address _admin, bool _isActive) external onlyGov {
        isAdmin[_admin] = _isActive;
    }
}
        

/contracts/access/Governable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Governable {
    address public gov;

    event SetGov(address indexed newGov);

    constructor() {
        gov = msg.sender;
    }

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
        emit SetGov(_gov);
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"ChangeCodeOwner","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"address","name":"newAccount","internalType":"address","indexed":false},{"type":"bytes32","name":"code","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"CreateCode","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bytes32","name":"code","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"event","name":"SetGov","inputs":[{"type":"address","name":"newGov","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetReferrerTier","inputs":[{"type":"address","name":"referrer","internalType":"address","indexed":false},{"type":"uint256","name":"tierNum","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetTier","inputs":[{"type":"uint256","name":"tierNum","internalType":"uint256","indexed":false},{"type":"uint256","name":"referrerRebate","internalType":"uint256","indexed":false},{"type":"uint256","name":"traderRebate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UseCode","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bytes32","name":"code","internalType":"bytes32","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BASIS_POINTS","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeCodeOwner","inputs":[{"type":"bytes32","name":"_code","internalType":"bytes32"},{"type":"address","name":"_newAccount","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"codeOwners","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"createCode","inputs":[{"type":"bytes32","name":"_code","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getReferrerInfo","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"gov","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAdmin","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"referrerTiers","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"bool","name":"_isActive","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGov","inputs":[{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReferrerTier","inputs":[{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_tierNum","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTier","inputs":[{"type":"uint256","name":"_tierNum","internalType":"uint256"},{"type":"uint256","name":"_referrerRebate","internalType":"uint256"},{"type":"uint256","name":"_traderRebate","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"referrerRebate","internalType":"uint256"},{"type":"uint256","name":"traderRebate","internalType":"uint256"}],"name":"tiers","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"traderCodes","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"useCode","inputs":[{"type":"bytes32","name":"_code","internalType":"bytes32"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50600080546001600160a01b0319163390811782558152600560205260408120805460ff19166001179055610048906101f48061006b565b61005660016103e88061006b565b61006660026103e86105dc61006b565b6101a9565b6000546001600160a01b031633146100ca5760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e000000000000000000000060448201526064015b60405180910390fd5b6127106100d78284610182565b106101245760405162461bcd60e51b815260206004820152601f60248201527f526566657272616c4d616e616765723a20696e76616c6964207265626174650060448201526064016100c1565b60008381526003602090815260409182902084815560010183905581518581529081018490529081018290527f4ebd23a492b2bd79586cb57cae40d7793408265f20320f68b478b971e696f4c79060600160405180910390a1505050565b808201808211156101a357634e487b7160e01b600052601160045260246000fd5b92915050565b610acd806101b86000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80634b0bddd211610097578063c8b3c46011610066578063c8b3c4601461025b578063cfad57a214610284578063e1f1c4a714610297578063e9180323146102a057600080fd5b80634b0bddd2146102025780637550f20c14610215578063836a018714610228578063aa03d88a1461023b57600080fd5b80631d2d9651116100d35780631d2d96511461019457806324d7806c146101a957806325e702d2146101dc5780633fb8b323146101ef57600080fd5b8063039af9eb146100fa57806312d43a511461013b5780631582a01814610166575b600080fd5b61012161010836600461095b565b6003602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b60005461014e906001600160a01b031681565b6040516001600160a01b039091168152602001610132565b610186610174366004610990565b60046020526000908152604090205481565b604051908152602001610132565b6101a76101a236600461095b565b6102d8565b005b6101cc6101b7366004610990565b60056020526000908152604090205460ff1681565b6040519015158152602001610132565b6101a76101ea36600461095b565b61039c565b6101a76101fd3660046109b2565b6104bf565b6101a76102103660046109dc565b610577565b6101a7610223366004610a18565b6105fc565b6101a7610236366004610a44565b610723565b610186610249366004610990565b60026020526000908152604090205481565b61014e61026936600461095b565b6001602052600090815260409020546001600160a01b031681565b6101a7610292366004610990565b610835565b61018661271081565b6102b36102ae366004610990565b6108e4565b604080516001600160a01b039094168452602084019290925290820152606001610132565b6000818152600160205260409020546001600160a01b031661034d5760405162461bcd60e51b8152602060048201526024808201527f526566657272616c4d616e616765723a20636f646520646f6573206e6f7420656044820152631e1a5cdd60e21b60648201526084015b60405180910390fd5b33600081815260026020908152604091829020849055815192835282018390527f9345a83f539e7f7d0d41adbdc78e05b745d88b6bc4f4df6bf3517a24c691e21191015b60405180910390a150565b806103e95760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c4d616e616765723a20696e76616c6964205f636f646500006044820152606401610344565b6000818152600160205260409020546001600160a01b03161561045a5760405162461bcd60e51b8152602060048201526024808201527f526566657272616c4d616e616765723a20636f646520616c72656164792065786044820152636973747360e01b6064820152608401610344565b600081815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19163390811790915582519081529081018390527f6a61f1846ea528350a357ab26e3ec024f8f66bc5d09933abe9679d0ebd2ee6e39101610391565b3360009081526005602052604090205460ff1661051e5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e616765723a20666f7262696464656e0000000000006044820152606401610344565b6001600160a01b038216600081815260046020908152604091829020849055815192835282018390527f7696855cdbb94bb5a44cb0a95caff6f29173aa1cbfba193834b12b90827ce2bc91015b60405180910390a15050565b6000546001600160a01b031633146105d15760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b816106495760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c4d616e616765723a20696e76616c6964205f636f646500006044820152606401610344565b6000828152600160205260409020546001600160a01b031633146106af5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e616765723a20666f7262696464656e0000000000006044820152606401610344565b600082815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091558251338152918201529081018390527f937b39f0f387525850b1331d409b6a5e657151ac7efda0b7a5337f5d9e30653a9060600161056b565b6000546001600160a01b0316331461077d5760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b61271061078a8284610a70565b106107d75760405162461bcd60e51b815260206004820152601f60248201527f526566657272616c4d616e616765723a20696e76616c696420726562617465006044820152606401610344565b60008381526003602090815260409182902084815560010183905581518581529081018490529081018290527f4ebd23a492b2bd79586cb57cae40d7793408265f20320f68b478b971e696f4c79060600160405180910390a1505050565b6000546001600160a01b0316331461088f5760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917f91a8c1cc2d4a3bb60738481947a00cbb9899c822916694cf8bb1d68172fdcd5491a250565b6001600160a01b038116600090815260026020526040812054819081908061091757600080600093509350935050610954565b6000908152600160208181526040808420546001600160a01b03168085526004835281852054855260039092529092208054910154919450925090505b9193909250565b60006020828403121561096d57600080fd5b5035919050565b80356001600160a01b038116811461098b57600080fd5b919050565b6000602082840312156109a257600080fd5b6109ab82610974565b9392505050565b600080604083850312156109c557600080fd5b6109ce83610974565b946020939093013593505050565b600080604083850312156109ef57600080fd5b6109f883610974565b915060208301358015158114610a0d57600080fd5b809150509250929050565b60008060408385031215610a2b57600080fd5b82359150610a3b60208401610974565b90509250929050565b600080600060608486031215610a5957600080fd5b505081359360208301359350604090920135919050565b80820180821115610a9157634e487b7160e01b600052601160045260246000fd5b9291505056fea2646970667358221220b422699383d109b3b80d694b744b06c4fa5ddf661c8cd48ab1c1c97999dbb34164736f6c63430008100033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80634b0bddd211610097578063c8b3c46011610066578063c8b3c4601461025b578063cfad57a214610284578063e1f1c4a714610297578063e9180323146102a057600080fd5b80634b0bddd2146102025780637550f20c14610215578063836a018714610228578063aa03d88a1461023b57600080fd5b80631d2d9651116100d35780631d2d96511461019457806324d7806c146101a957806325e702d2146101dc5780633fb8b323146101ef57600080fd5b8063039af9eb146100fa57806312d43a511461013b5780631582a01814610166575b600080fd5b61012161010836600461095b565b6003602052600090815260409020805460019091015482565b604080519283526020830191909152015b60405180910390f35b60005461014e906001600160a01b031681565b6040516001600160a01b039091168152602001610132565b610186610174366004610990565b60046020526000908152604090205481565b604051908152602001610132565b6101a76101a236600461095b565b6102d8565b005b6101cc6101b7366004610990565b60056020526000908152604090205460ff1681565b6040519015158152602001610132565b6101a76101ea36600461095b565b61039c565b6101a76101fd3660046109b2565b6104bf565b6101a76102103660046109dc565b610577565b6101a7610223366004610a18565b6105fc565b6101a7610236366004610a44565b610723565b610186610249366004610990565b60026020526000908152604090205481565b61014e61026936600461095b565b6001602052600090815260409020546001600160a01b031681565b6101a7610292366004610990565b610835565b61018661271081565b6102b36102ae366004610990565b6108e4565b604080516001600160a01b039094168452602084019290925290820152606001610132565b6000818152600160205260409020546001600160a01b031661034d5760405162461bcd60e51b8152602060048201526024808201527f526566657272616c4d616e616765723a20636f646520646f6573206e6f7420656044820152631e1a5cdd60e21b60648201526084015b60405180910390fd5b33600081815260026020908152604091829020849055815192835282018390527f9345a83f539e7f7d0d41adbdc78e05b745d88b6bc4f4df6bf3517a24c691e21191015b60405180910390a150565b806103e95760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c4d616e616765723a20696e76616c6964205f636f646500006044820152606401610344565b6000818152600160205260409020546001600160a01b03161561045a5760405162461bcd60e51b8152602060048201526024808201527f526566657272616c4d616e616765723a20636f646520616c72656164792065786044820152636973747360e01b6064820152608401610344565b600081815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19163390811790915582519081529081018390527f6a61f1846ea528350a357ab26e3ec024f8f66bc5d09933abe9679d0ebd2ee6e39101610391565b3360009081526005602052604090205460ff1661051e5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e616765723a20666f7262696464656e0000000000006044820152606401610344565b6001600160a01b038216600081815260046020908152604091829020849055815192835282018390527f7696855cdbb94bb5a44cb0a95caff6f29173aa1cbfba193834b12b90827ce2bc91015b60405180910390a15050565b6000546001600160a01b031633146105d15760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b816106495760405162461bcd60e51b815260206004820152601e60248201527f526566657272616c4d616e616765723a20696e76616c6964205f636f646500006044820152606401610344565b6000828152600160205260409020546001600160a01b031633146106af5760405162461bcd60e51b815260206004820152601a60248201527f526566657272616c4d616e616765723a20666f7262696464656e0000000000006044820152606401610344565b600082815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385169081179091558251338152918201529081018390527f937b39f0f387525850b1331d409b6a5e657151ac7efda0b7a5337f5d9e30653a9060600161056b565b6000546001600160a01b0316331461077d5760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b61271061078a8284610a70565b106107d75760405162461bcd60e51b815260206004820152601f60248201527f526566657272616c4d616e616765723a20696e76616c696420726562617465006044820152606401610344565b60008381526003602090815260409182902084815560010183905581518581529081018490529081018290527f4ebd23a492b2bd79586cb57cae40d7793408265f20320f68b478b971e696f4c79060600160405180910390a1505050565b6000546001600160a01b0316331461088f5760405162461bcd60e51b815260206004820152601560248201527f476f7665726e61626c653a20666f7262696464656e00000000000000000000006044820152606401610344565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117825560405190917f91a8c1cc2d4a3bb60738481947a00cbb9899c822916694cf8bb1d68172fdcd5491a250565b6001600160a01b038116600090815260026020526040812054819081908061091757600080600093509350935050610954565b6000908152600160208181526040808420546001600160a01b03168085526004835281852054855260039092529092208054910154919450925090505b9193909250565b60006020828403121561096d57600080fd5b5035919050565b80356001600160a01b038116811461098b57600080fd5b919050565b6000602082840312156109a257600080fd5b6109ab82610974565b9392505050565b600080604083850312156109c557600080fd5b6109ce83610974565b946020939093013593505050565b600080604083850312156109ef57600080fd5b6109f883610974565b915060208301358015158114610a0d57600080fd5b809150509250929050565b60008060408385031215610a2b57600080fd5b82359150610a3b60208401610974565b90509250929050565b600080600060608486031215610a5957600080fd5b505081359360208301359350604090920135919050565b80820180821115610a9157634e487b7160e01b600052601160045260246000fd5b9291505056fea2646970667358221220b422699383d109b3b80d694b744b06c4fa5ddf661c8cd48ab1c1c97999dbb34164736f6c63430008100033