ETH Price: $2,162.14 (+0.67%)

Contract Diff Checker

Contract Name:
StashETH

Contract Source Code:

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

interface ISCRYERC20 {
    // event Approval(address indexed owner, address indexed spender, uint value);
    // event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

import './ISCRYERC20.sol';

interface ISCRYERC20Permit is ISCRYERC20 {
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

interface ISCRYFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function lpTokens(address) external view returns (bool);

    function createPair(address tokenA, address tokenB) external returns (address pair, address stashTokenA, address stashTokenB);
    function oldMajor() external view returns (address);
    function tokenFactory() external view returns (address);
    function stashETH() external view returns (address);
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

interface ISCRYPairTransferable {
    function transferFromPool(address to, uint value) external returns (bool);
    // function balanceOf(address owner) external returns (uint);
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

import './ISCRYPairTransferable.sol';

interface IStashETH is ISCRYPairTransferable {
    function deposit() external payable returns (uint256);
    function depositFor(address to) external payable returns (bool);
    function withdraw(uint amount) external returns (bool);
    function withdrawTo(address account, uint amount) external returns (bool);
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

pragma solidity >=0.5.0;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.12;

import './interfaces/ISCRYERC20Permit.sol';
import './interfaces/ISCRYFactory.sol';
import './libraries/SafeMath.sol';

abstract contract SLOWERC20 is ISCRYERC20Permit {
    using SafeMath for uint;

    uint internal _totalSupply;
    mapping(address => uint) public override balanceOf;
    mapping(address => mapping(address => uint)) public override allowance;

    bytes32 public override immutable DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public override constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public override nonces;

    mapping (address => uint) internal lastReceivedBlock;
    uint internal immutable BLOCK_HOLDING_PERIOD;

    constructor(uint blockHoldingPeriod) public {
        uint chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name())),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )  
        );
        BLOCK_HOLDING_PERIOD = blockHoldingPeriod;
    }

    function name() public view override virtual returns (string memory);

    function symbol() external view override virtual returns (string memory);

    function decimals() external view override virtual returns (uint8) {
        return 18;
    }

    function _mint(address to, uint value) internal virtual {
        _totalSupply = _totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        // emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        require(block.number.sub(lastReceivedBlock[from]) >= BLOCK_HOLDING_PERIOD, 'SLOWERC20: BLOCKED');

        balanceOf[from] = balanceOf[from].sub(value);
        _totalSupply = _totalSupply.sub(value);
        // emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        // emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) internal {
        require(block.number.sub(lastReceivedBlock[from]) >= BLOCK_HOLDING_PERIOD, 'SLOWERC20: BLOCKED');
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        // emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external override returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external override returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) public override returns (bool) {
        if (allowance[from][msg.sender] != 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override {
        require(deadline >= block.timestamp, 'SLOWERC20: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'SLOWERC20: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }

    function totalSupply() external view override virtual returns (uint) {
        return _totalSupply;
    }
}

<i class='far fa-question-circle text-muted ms-2' data-bs-trigger='hover' data-bs-toggle='tooltip' data-bs-html='true' data-bs-title='Click on the check box to select individual contract to compare. Only 1 contract can be selected from each side.'></i>

// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.12;

import './SLOWERC20.sol';
import './interfaces/IStashETH.sol';

contract StashETH is IStashETH, SLOWERC20 {
    address immutable private factory;

    // event Deposit(address indexed dst, uint wad);
    // event DepositFor(address indexed src, address indexed dst, uint wad);
    // event Withdrawal(address indexed src, uint wad);
    // event WithdrawalTo(address indexed src, address indexed to, uint wad);    

    constructor(address _factory) public SLOWERC20(5) {
        factory = _factory;
    }

    receive() payable external {
        deposit();
    }

    function name() public view override returns (string memory) {
        return 'ScurrySwap Stash Ether';
    }

    function symbol() external view override returns (string memory) {
        return 'stash-ETH';
    }

    function deposit() public payable override returns (uint256) {
        balanceOf[msg.sender] = balanceOf[msg.sender].add(msg.value);
        // emit Deposit(msg.sender, msg.value);
        return msg.value;
    }

    function depositFor(address to) external payable override returns (bool) {
        balanceOf[to] = balanceOf[to].add(msg.value);
        // emit DepositFor(msg.sender, to, msg.value);
        return true;
    }

    function withdraw(uint wad) external override returns (bool) {
        require(block.number.sub(lastReceivedBlock[msg.sender]) >= BLOCK_HOLDING_PERIOD, 'StashETH: BLOCKED');
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(wad);
        payable(msg.sender).transfer(wad);
        // emit Withdrawal(msg.sender, wad);
        return true;
    }

    function withdrawTo(address account, uint wad) external override returns (bool) {
        require(block.number.sub(lastReceivedBlock[msg.sender]) >= BLOCK_HOLDING_PERIOD, 'StashETH: BLOCKED');
        balanceOf[msg.sender] = balanceOf[msg.sender].sub(wad);
        payable(account).transfer(wad);
        // emit WithdrawalTo(msg.sender, account, wad);
        return true;   
    }

    function totalSupply() external view override returns (uint) {
        return address(this).balance;
    }

    function transferFromPool(address to, uint256 value) external override returns (bool) {
        require(ISCRYFactory(factory).lpTokens(msg.sender), 'StashETH: FORBIDDEN');
        _transfer(msg.sender, to, value);
        if (!ISCRYFactory(factory).lpTokens(to) ) {
            lastReceivedBlock[to] = block.number;
        }
        return true;
    }
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):