Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x45D857b955396fC407CACb64d44028D49A8FB22c
Balance 2.1274 ETH
Nonce 1
Code Size 7736 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

7736 bytes
0x608060405260043610610186575f3560e01c8063853828b6116100d1578063aafd847a1161007c578063b6b55f2511610057578063b6b55f2514610439578063ba44180714610458578063fbcbc0f11461048b575f80fd5b8063aafd847a146103c5578063ab6ddfa8146103f9578063ad7a672f14610424575f80fd5b8063a8b9d240116100ac578063a8b9d2401461035c578063a913a5f71461037b578063aa5f7e26146103a6575f80fd5b8063853828b61461031457806385a6b3ae1461032857806391b89fba1461033d575f80fd5b806330bb4cff116101315780636a4740021161010c5780636a474002146102cd57806371778e7d146102e15780637c174e87146102f5575f80fd5b806330bb4cff146102715780634e71d92d146102855780636843cd8414610299575f80fd5b806308f2f2331161016157806308f2f2331461021457806327ce0147146102335780632e1a7d4d14610252575f80fd5b806303c833021461019957806304554443146101a15780630758d924146101c9575f80fd5b36610195576101936104d4565b005b5f80fd5b6101936104d4565b3480156101ac575f80fd5b506101b660085481565b6040519081526020015b60405180910390f35b3480156101d4575f80fd5b506101fc7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016101c0565b34801561021f575f80fd5b506101b661022e366004611b07565b610569565b34801561023e575f80fd5b506101b661024d366004611b07565b610745565b34801561025d575f80fd5b5061019361026c366004611b22565b6107b4565b34801561027c575f80fd5b506006546101b6565b348015610290575f80fd5b50610193610a1c565b3480156102a4575f80fd5b506101b66102b3366004611b07565b6001600160a01b03165f9081526004602052604090205490565b3480156102d8575f80fd5b50610193610a85565b3480156102ec575f80fd5b506005546101b6565b348015610300575f80fd5b506101b661030f366004611b22565b610a91565b34801561031f575f80fd5b50610193610c60565b348015610333575f80fd5b506101b660065481565b348015610348575f80fd5b506101b6610357366004611b07565b610e5a565b348015610367575f80fd5b506101b6610376366004611b07565b610e60565b348015610386575f80fd5b506101b6610395366004611b07565b60076020525f908152604090205481565b3480156103b1575f80fd5b506101936103c0366004611b22565b610e8b565b3480156103d0575f80fd5b506101b66103df366004611b07565b6001600160a01b03165f9081526003602052604090205490565b348015610404575f80fd5b506101b6610413366004611b07565b60046020525f908152604090205481565b34801561042f575f80fd5b506101b660055481565b348015610444575f80fd5b50610193610453366004611b22565b611093565b348015610463575f80fd5b506101fc7f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a81565b348015610496575f80fd5b506104aa6104a5366004611b07565b611384565b604080516001600160a01b03909516855260208501939093529183015260608201526080016101c0565b5f6005541180156104e457505f34115b156105675760055461051e9061050b347001000000000000000000000000000000006113c0565b6105159190611b4d565b60015490611461565b60015560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546105639034611461565b6006555b565b5f8061057483610e60565b6040805160028082526060820183529293505f9290916020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106199190611b80565b815f8151811061062b5761062b611b9b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a8160018151811061067f5761067f611b9b565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f906106dd9086908690600401611bf1565b5f60405180830381865afa1580156106f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261071e9190810190611c11565b90508060018151811061073357610733611b9b565b60200260200101519350505050919050565b6001600160a01b0381165f908152600260209081526040808320546004909252822054600154700100000000000000000000000000000000926107a49261079f926107999161079491906113c0565b6114bf565b906114cd565b611507565b6107ae9190611b4d565b92915050565b60025f540361080a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60025f55806108495760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b6044820152606401610801565b335f90815260046020526040902054808211156108a85760405162461bcd60e51b815260206004820152601160248201527f4e6f7420656e6f75676820746f6b656e730000000000000000000000000000006044820152606401610801565b335f908152600760205260409020544210156109065760405162461bcd60e51b815260206004820152601660248201527f4d6179206e6f74207769746864726177206561726c79000000000000000000006044820152606401610801565b60405163a9059cbb60e01b8152336004820152602481018390527f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a6001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610970573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109949190611cca565b506109a8336109a38484611ce9565b611518565b80156109cf576008546109bb9042611cfc565b335f908152600760205260409020556109df565b335f908152600760205260408120555b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505060015f55565b60025f5403610a6d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610801565b60025f81905550610a7e335f611532565b5060015f55565b610a8e3361159e565b50565b6040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b359190611b80565b815f81518110610b4757610b47611b9b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a81600181518110610b9b57610b9b611b9b565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81525f917f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90610bf99087908690600401611bf1565b5f60405180830381865afa158015610c13573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3a9190810190611c11565b905080600181518110610c4f57610c4f611b9b565b602002602001015192505050919050565b60025f5403610cb15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610801565b60025f9081553381526004602052604090205480610d115760405162461bcd60e51b815260206004820152600c60248201527f4e6f74206120686f6c64657200000000000000000000000000000000000000006044820152606401610801565b335f90815260076020526040902054421015610d6f5760405162461bcd60e51b815260206004820152601660248201527f4d6179206e6f74207769746864726177206561726c79000000000000000000006044820152606401610801565b60405163a9059cbb60e01b8152336004820152602481018290527f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a6001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610dd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dfd9190611cca565b50610e08335f611518565b335f8181526007602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490610e4b9084815260200190565b60405180910390a25060015f55565b5f6107ae825b6001600160a01b0381165f908152600360205260408120546107ae90610e8584610745565b906116d5565b60025f5403610edc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610801565b60025f90815533808252600460205260408220549190610efb90611716565b90508015611042576040516370a0823160e01b81523060048201525f907f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a6001600160a01b0316906370a0823190602401602060405180830381865afa158015610f67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8b9190611d0f565b9050610f9782856117a7565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a16906370a0823190602401602060405180830381865afa158015610ffd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110219190611d0f565b61102b9190611ce9565b905061103b336109a38387611cfc565b505061108a565b60405162461bcd60e51b815260206004820152600a60248201527f4e6f2072657761726473000000000000000000000000000000000000000000006044820152606401610801565b505060015f5550565b60025f54036110e45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610801565b60025f55806111235760405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8105b5bdd5b9d60aa1b6044820152606401610801565b335f908152600760205260408120549003611155576008546111459042611cfc565b335f908152600760205260409020555b335f9081526004602081905260408083205490516370a0823160e01b81523092810192909252919081906001600160a01b037f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a16906370a0823190602401602060405180830381865afa1580156111ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f29190611d0f565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690529091507f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a6001600160a01b0316906323b872dd906064016020604051808303815f875af115801561127e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a29190611cca565b506040516370a0823160e01b815230600482015281907f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a6001600160a01b0316906370a0823190602401602060405180830381865afa158015611307573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132b9190611d0f565b6113359190611ce9565b9150611345336109a38486611cfc565b60405184815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2505060015f555050565b805f808061139184610e60565b925061139c84610745565b6001600160a01b0385165f9081526004602052604090205494969395509392915050565b5f825f036113cf57505f6107ae565b5f6113da8385611d26565b9050826113e78583611b4d565b1461145a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610801565b9392505050565b5f8061146d8385611cfc565b90508381101561145a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610801565b5f81818112156107ae575f80fd5b5f806114d98385611d3d565b90505f83121580156114eb5750838112155b806114ff57505f831280156114ff57508381125b61145a575f80fd5b5f80821215611514575f80fd5b5090565b611522828261195d565b61152d826001611532565b505050565b5f8061153d8461159e565b9050801561159557821515846001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161158391815260200190565b60405180910390a360019150506107ae565b505f9392505050565b5f806115a983610e60565b905080156116cd576001600160a01b0383165f908152600360205260409020546115d39082611461565b6001600160a01b0384165f81815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906116219084815260200190565b60405180910390a25f836001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611672576040519150601f19603f3d011682016040523d82523d5f602084013e611677565b606091505b50509050806116c6576001600160a01b0384165f908152600360205260409020546116a290836116d5565b6001600160a01b039094165f90815260036020526040812094909455509192915050565b5092915050565b505f92915050565b5f61145a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506119f1565b5f61172082610e60565b905080156117a2576001600160a01b0382165f9081526003602052604090205461174b908290611cfc565b6001600160a01b0383165f81815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906117999084815260200190565b60405180910390a25b919050565b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118479190611b80565b815f8151811061185957611859611b9b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000003ee4b152824b657644c7a9b50694787e80eb8f4a816001815181106118ad576118ad611b9b565b6001600160a01b0392831660209182029290920101526040517fb6f9de950000000000000000000000000000000000000000000000000000000081527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063b6f9de9590859061192a908690869030904290600401611d64565b5f604051808303818588803b158015611941575f80fd5b505af1158015611953573d5f803e3d5ffd5b5050505050505050565b6001600160a01b0382165f908152600460205260409020805490829055808211156119b6575f61198d83836116d5565b90506119998482611a29565b8060055f8282546119aa9190611cfc565b9091555061152d915050565b8082101561152d575f6119c982846116d5565b90506119d58482611a81565b8060055f8282546119e69190611ce9565b909155505050505050565b5f8184841115611a145760405162461bcd60e51b81526004016108019190611d98565b505f611a208486611ce9565b95945050505050565b611a62611a44610794836001546113c090919063ffffffff16565b6001600160a01b0384165f9081526002602052604090205490611aba565b6001600160a01b039092165f9081526002602052604090209190915550565b611a62611a9c610794836001546113c090919063ffffffff16565b6001600160a01b0384165f90815260026020526040902054906114cd565b5f80611ac68385611de3565b90505f8312158015611ad85750838113155b806114ff57505f831280156114ff575083811361145a575f80fd5b6001600160a01b0381168114610a8e575f80fd5b5f60208284031215611b17575f80fd5b813561145a81611af3565b5f60208284031215611b32575f80fd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b5f82611b6757634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611b90575f80fd5b815161145a81611af3565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602080850194508084015f5b83811015611be65781516001600160a01b031687529582019590820190600101611bc1565b509495945050505050565b828152604060208201525f611c096040830184611baf565b949350505050565b5f6020808385031215611c22575f80fd5b825167ffffffffffffffff80821115611c39575f80fd5b818501915085601f830112611c4c575f80fd5b815181811115611c5e57611c5e611b6c565b8060051b604051601f19603f83011681018181108582111715611c8357611c83611b6c565b604052918252848201925083810185019188831115611ca0575f80fd5b938501935b82851015611cbe57845184529385019392850192611ca5565b98975050505050505050565b5f60208284031215611cda575f80fd5b8151801515811461145a575f80fd5b818103818111156107ae576107ae611b39565b808201808211156107ae576107ae611b39565b5f60208284031215611d1f575f80fd5b5051919050565b80820281158282048414176107ae576107ae611b39565b8082018281125f831280158216821582161715611d5c57611d5c611b39565b505092915050565b848152608060208201525f611d7c6080830186611baf565b6001600160a01b03949094166040830152506060015292915050565b5f6020808352835180828501525f5b81811015611dc357858101830151858201604001528201611da7565b505f604082860101526040601f19601f8301168501019250505092915050565b8181035f8312801583831316838312821617156116c6576116c6611b3956fea26469706673582212203cb3a936574e5fbb741cdd9aef83dbc011031e2ebaa33b5aaa5b91a48e8cb38c64736f6c63430008140033

Verified Source Code Partial Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: Yes (999 runs)
BazedRevenueStaking.sol 515 lines
//SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface DividendPayingContractOptionalInterface {
  function withdrawableDividendOf(address _owner) external view returns(uint256);
  function withdrawnDividendOf(address _owner) external view returns(uint256);
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface DividendPayingContractInterface {
  function dividendOf(address _owner) external view returns(uint256);
  function distributeDividends() external payable;
  function withdrawDividend() external;
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

contract DividendPayingContract is DividendPayingContractInterface, DividendPayingContractOptionalInterface {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
                                                                         
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  
  mapping (address => uint256) public holderBalance;
  uint256 public totalBalance;

  uint256 public totalDividendsDistributed;

  receive() external payable {
    distributeDividends();
  }

  function distributeDividends() public override payable {
    if(totalBalance > 0 && msg.value > 0){
        magnifiedDividendPerShare = magnifiedDividendPerShare.add(
            (msg.value).mul(magnitude) / totalBalance
        );
        emit DividendsDistributed(msg.sender, msg.value);

        totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }

  function withdrawDividend() external virtual override {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);

      emit DividendWithdrawn(user, _withdrawableDividend);
      (bool success,) = user.call{value: _withdrawableDividend}("");

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        return 0;
      }

      return _withdrawableDividend;
    }

    return 0;
  }

  function dividendOf(address _owner) external view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  function withdrawnDividendOf(address _owner) external view override returns(uint256) {
    return withdrawnDividends[_owner];
  }

  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(holderBalance[_owner]).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}


contract DividendTracker is DividendPayingContract {

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() {}

    function getAccount(address _account)
        public view returns (
            address account,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 balance) {
        account = _account;

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        balance = holderBalance[account];
    }
    function setBalance(address payable account, uint256 newBalance) internal {

        _setBalance(account, newBalance);

    	processAccount(account, true);
    }
    
    function processAccount(address payable account, bool automatic) internal returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

    	if(amount > 0) {
            emit Claim(account, amount, automatic);
    		return true;
    	}

    	return false;
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return totalDividendsDistributed;
    }

	function dividendTokenBalanceOf(address account) public view returns (uint256) {
		return holderBalance[account];
	}

    function getNumberOfDividends() external view returns(uint256) {
        return totalBalance;
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract BazedRevenueStaking is ReentrancyGuard, DividendTracker {

    IERC20 public immutable bazedToken;
    IDexRouter public immutable dexRouter;

    mapping (address => uint256) public holderUnlockTime;
    uint256 public lockDuration;

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);

    constructor(address _bazedToken, uint256 _lockTimeInDays) {
        require(_bazedToken != address(0), "cannot be 0 address");
        bazedToken = IERC20(_bazedToken);
        
        lockDuration = _lockTimeInDays * 1 days;

        address _v2Router;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);
    }

    // Stake primary tokens
    function deposit(uint256 _amount) external nonReentrant {
        require(_amount > 0, "Zero Amount");

        if(holderUnlockTime[msg.sender] == 0){
            holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
        }
        uint256 userAmount = holderBalance[msg.sender];

        uint256 amountTransferred = 0;

        uint256 initialBalance = bazedToken.balanceOf(address(this));
        bazedToken.transferFrom(address(msg.sender), address(this), _amount);
        amountTransferred = bazedToken.balanceOf(address(this)) - initialBalance;
    
        setBalance(payable(msg.sender), userAmount + amountTransferred);

        emit Deposit(msg.sender, _amount);
    }

    // Withdraw primary tokens

    function withdraw(uint256 _amount) external nonReentrant {
        require(_amount > 0, "Zero Amount");
        uint256 userAmount = holderBalance[msg.sender];
        require(_amount <= userAmount, "Not enough tokens");
        require(holderUnlockTime[msg.sender] <= block.timestamp, "May not withdraw early");

        bazedToken.transfer(address(msg.sender), _amount);

        setBalance(payable(msg.sender), userAmount - _amount);

        if(userAmount > 0){
            holderUnlockTime[msg.sender] = block.timestamp + lockDuration;
        } else {
            holderUnlockTime[msg.sender] = 0;
        }

        emit Withdraw(msg.sender, _amount);
    }

    function withdrawAll() public nonReentrant {
        uint256 userAmount = holderBalance[msg.sender];
        require(userAmount > 0, "Not a holder");
        require(holderUnlockTime[msg.sender] <= block.timestamp, "May not withdraw early");
        
        bazedToken.transfer(address(msg.sender), userAmount);

        setBalance(payable(msg.sender), 0);
        holderUnlockTime[msg.sender] = 0;

        emit Withdraw(msg.sender, userAmount);
    }

    function claim() external nonReentrant {
        processAccount(payable(msg.sender), false);
    }

    function compound(uint256 minOutput) external nonReentrant {
        uint256 userAmount = holderBalance[msg.sender];
        uint256 amountEthForCompound = _withdrawDividendOfUserForCompound(payable(msg.sender));
        if(amountEthForCompound > 0){
            uint256 initialBalance = bazedToken.balanceOf(address(this));
            buyBackTokens(amountEthForCompound, minOutput);
            uint256 amountTransferred = bazedToken.balanceOf(address(this)) - initialBalance;
            setBalance(payable(msg.sender), userAmount + amountTransferred);
        } else {
            revert("No rewards");
        }
    }

    function _withdrawDividendOfUserForCompound(address payable user) internal returns (uint256 _withdrawableDividend) {
        _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user] + _withdrawableDividend;
            emit DividendWithdrawn(user, _withdrawableDividend);
        }
    }

    function buyBackTokens(uint256 ethAmountInWei, uint256 minOut) internal {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(bazedToken);

        // make the swap
        dexRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmountInWei}(
            minOut,
            path,
            address(this),
            block.timestamp
        );
    }

    // helper views

    function getExpectedCompoundOutputByEthAmount(uint256 rewardAmount) external view returns(uint256) {
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(bazedToken);
        uint256[] memory amounts = dexRouter.getAmountsOut(rewardAmount, path);
        return amounts[1];
    }

    function getExpectedCompoundOutputByWallet(address wallet) external view returns(uint256) {
        uint256 rewardAmount = withdrawableDividendOf(wallet);
        address[] memory path = new address[](2);
        path[0] = dexRouter.WETH();
        path[1] = address(bazedToken);
        uint256[] memory amounts = dexRouter.getAmountsOut(rewardAmount, path);
        return amounts[1];
    }
 }

Read Contract

accumulativeDividendOf 0x27ce0147 → uint256
bazedToken 0xba441807 → address
dexRouter 0x0758d924 → address
dividendOf 0x91b89fba → uint256
dividendTokenBalanceOf 0x6843cd84 → uint256
getAccount 0xfbcbc0f1 → address, uint256, uint256, uint256
getExpectedCompoundOutputByEthAmount 0x7c174e87 → uint256
getExpectedCompoundOutputByWallet 0x08f2f233 → uint256
getNumberOfDividends 0x71778e7d → uint256
getTotalDividendsDistributed 0x30bb4cff → uint256
holderBalance 0xab6ddfa8 → uint256
holderUnlockTime 0xa913a5f7 → uint256
lockDuration 0x04554443 → uint256
totalBalance 0xad7a672f → uint256
totalDividendsDistributed 0x85a6b3ae → uint256
withdrawableDividendOf 0xa8b9d240 → uint256
withdrawnDividendOf 0xaafd847a → uint256

Write Contract 7 functions

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

claim 0x4e71d92d
No parameters
compound 0xaa5f7e26
uint256 minOutput
deposit 0xb6b55f25
uint256 _amount
distributeDividends 0x03c83302
No parameters
withdraw 0x2e1a7d4d
uint256 _amount
withdrawAll 0x853828b6
No parameters
withdrawDividend 0x6a474002
No parameters

Token Balances (1)

View Transfers →
WETH 0

Recent Transactions

No transactions found for this address