ETH Price: $2,428.06 (+3.30%)

Contract

0x0aF70146dB9A670A5355F48a0CC395AE305d7d65
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Enter Staking173391592023-05-25 22:35:35497 days ago1685054135IN
0x0aF70146...E305d7d65
0.001 ETH0.0038591226.6400094
Enter Staking170560842023-04-16 0:59:59537 days ago1681606799IN
0x0aF70146...E305d7d65
0.001 ETH0.0030861622.8141802
Enter Staking170560772023-04-16 0:58:35537 days ago1681606715IN
0x0aF70146...E305d7d65
0.001 ETH0.0033212924.55234967
Enter Staking170560702023-04-16 0:57:11537 days ago1681606631IN
0x0aF70146...E305d7d65
0.001 ETH0.0035612224.5815397
Enter Staking170560612023-04-16 0:55:23537 days ago1681606523IN
0x0aF70146...E305d7d65
0.001 ETH0.0027448724.80144459
Enter Staking170560532023-04-16 0:53:47537 days ago1681606427IN
0x0aF70146...E305d7d65
0.001 ETH0.0036332825.07893131
Enter Staking170560402023-04-16 0:51:11537 days ago1681606271IN
0x0aF70146...E305d7d65
0.001 ETH0.0033270222.96498661
Enter Staking170560042023-04-16 0:43:35537 days ago1681605815IN
0x0aF70146...E305d7d65
0.001 ETH0.0037149225.64030737
Enter Staking170559632023-04-16 0:35:23537 days ago1681605323IN
0x0aF70146...E305d7d65
0.001 ETH0.0033072922.82876095
Enter Staking170549202023-04-15 21:02:35538 days ago1681592555IN
0x0aF70146...E305d7d65
0.001 ETH0.0032823622.65858222
Enter Staking170537832023-04-15 17:10:11538 days ago1681578611IN
0x0aF70146...E305d7d65
0.001 ETH0.0028707325.94429056
Enter Staking170528162023-04-15 13:51:35538 days ago1681566695IN
0x0aF70146...E305d7d65
0.001 ETH0.0035054425.91366262
Enter Staking170499452023-04-15 4:02:47538 days ago1681531367IN
0x0aF70146...E305d7d65
0.001 ETH0.0032206422.23247041
Enter Staking170499012023-04-15 3:53:59538 days ago1681530839IN
0x0aF70146...E305d7d65
0.001 ETH0.0028851326.06877971
Enter Staking170498932023-04-15 3:52:23538 days ago1681530743IN
0x0aF70146...E305d7d65
0.001 ETH0.0034946324.12586314
Enter Staking170498672023-04-15 3:46:47538 days ago1681530407IN
0x0aF70146...E305d7d65
0.001 ETH0.0025132722.71370713
Enter Staking170497292023-04-15 3:19:11538 days ago1681528751IN
0x0aF70146...E305d7d65
0.001 ETH0.0024147721.82354381
Enter Staking170496052023-04-15 2:53:59538 days ago1681527239IN
0x0aF70146...E305d7d65
0.001 ETH0.0024159921.83459416
Enter Staking170494852023-04-15 2:28:23538 days ago1681525703IN
0x0aF70146...E305d7d65
0.001 ETH0.0024620422.25073741
Enter Staking170494322023-04-15 2:17:11538 days ago1681525031IN
0x0aF70146...E305d7d65
0.001 ETH0.0021385721.51956466
Enter Staking170493932023-04-15 2:09:11538 days ago1681524551IN
0x0aF70146...E305d7d65
0.001 ETH0.0033919423.41697716
Enter Staking170493752023-04-15 2:05:35538 days ago1681524335IN
0x0aF70146...E305d7d65
0.001 ETH0.003520621.73882297
0x60a06040170493482023-04-15 2:00:11538 days ago1681524011IN
 Create: YespXStake
0 ETH0.042595420.41712249

Latest 22 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
173391592023-05-25 22:35:35497 days ago1685054135
0x0aF70146...E305d7d65
0.001 ETH
170560842023-04-16 0:59:59537 days ago1681606799
0x0aF70146...E305d7d65
0.001 ETH
170560772023-04-16 0:58:35537 days ago1681606715
0x0aF70146...E305d7d65
0.001 ETH
170560702023-04-16 0:57:11537 days ago1681606631
0x0aF70146...E305d7d65
0.001 ETH
170560612023-04-16 0:55:23537 days ago1681606523
0x0aF70146...E305d7d65
0.001 ETH
170560532023-04-16 0:53:47537 days ago1681606427
0x0aF70146...E305d7d65
0.001 ETH
170560402023-04-16 0:51:11537 days ago1681606271
0x0aF70146...E305d7d65
0.001 ETH
170560042023-04-16 0:43:35537 days ago1681605815
0x0aF70146...E305d7d65
0.001 ETH
170559632023-04-16 0:35:23537 days ago1681605323
0x0aF70146...E305d7d65
0.001 ETH
170549202023-04-15 21:02:35538 days ago1681592555
0x0aF70146...E305d7d65
0.001 ETH
170537832023-04-15 17:10:11538 days ago1681578611
0x0aF70146...E305d7d65
0.001 ETH
170528162023-04-15 13:51:35538 days ago1681566695
0x0aF70146...E305d7d65
0.001 ETH
170499452023-04-15 4:02:47538 days ago1681531367
0x0aF70146...E305d7d65
0.001 ETH
170499012023-04-15 3:53:59538 days ago1681530839
0x0aF70146...E305d7d65
0.001 ETH
170498932023-04-15 3:52:23538 days ago1681530743
0x0aF70146...E305d7d65
0.001 ETH
170498672023-04-15 3:46:47538 days ago1681530407
0x0aF70146...E305d7d65
0.001 ETH
170497292023-04-15 3:19:11538 days ago1681528751
0x0aF70146...E305d7d65
0.001 ETH
170496052023-04-15 2:53:59538 days ago1681527239
0x0aF70146...E305d7d65
0.001 ETH
170494852023-04-15 2:28:23538 days ago1681525703
0x0aF70146...E305d7d65
0.001 ETH
170494322023-04-15 2:17:11538 days ago1681525031
0x0aF70146...E305d7d65
0.001 ETH
170493932023-04-15 2:09:11538 days ago1681524551
0x0aF70146...E305d7d65
0.001 ETH
170493752023-04-15 2:05:35538 days ago1681524335
0x0aF70146...E305d7d65
0.001 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
YespXStake

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : YespXStake.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { AxelarExecutable } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executables/AxelarExecutable.sol';
import { IAxelarGateway } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol';
import { IAxelarGasService } from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol';

error StakeBelowThreshhold();
error WithdrawBeforeLockupEnd();
error WithdrawOverBalance();
error XChainUnderfunded();
error BadDestinationChains();

contract YespXStake is Ownable, AxelarExecutable, ReentrancyGuard {

    event StakingEntered(address indexed user, uint256 amount, uint256 timestamp);
    event StakingExited(address indexed user, uint256 amount, uint256 timestamp);

    mapping(address => uint256) public amountStaked;
    mapping(address => uint256) public stakingEnteredTimestamp;

    IERC20 constant public YESPTOKEN = IERC20(0x46ccA329970B33e1a007DD4ef0594A1cedb3E72a); //YESP token
    IERC20Permit constant public YESPTOKENPERMIT = IERC20Permit(0x46ccA329970B33e1a007DD4ef0594A1cedb3E72a); //YESP token
    IAxelarGasService private constant gasReceiver = IAxelarGasService(0x2d5d7d31F671F86C782533cc367F14109a082712); //Ethereum

    uint256 public lockupTime = 86400;
    enum DiscountTier { NO_TIER, TIER_1, TIER_2, TIER_3 }
    mapping(DiscountTier => uint256) public discountThresholds;

    // Mapping of chain name => recipient address. Verifier is stored as a string for Axelar.
    // Stored chain names are in Title Case - "Polygon" "Ethereum" "Moonbeam" etc.
    mapping(string => string) public stakingVerifier;

    constructor()
    AxelarExecutable(0x4F4495243837681061C4743b74B3eEdf548D56A5) // Ethereum
    {
        discountThresholds[DiscountTier.TIER_1] = 1 * 10**18; // 1 YESP;
        discountThresholds[DiscountTier.TIER_2] = 1 * 10**6 * 10**18; // 10m YESP;
        discountThresholds[DiscountTier.TIER_3] = 5 * 10**6 * 10**18; // 50m YESP;
        stakingVerifier["Polygon"] = "0x1e0A2c2570Ec5490f9a6816AA36f9F1E3f02Dbc2";
    }
    using SafeERC20 for IERC20;

    // If staking is entered with a position already staked, this function will add to the existing amount and 
    // renew the staking period. Tier 1 staking amount is the minimum required.
    function enterStaking(uint256 amount, string[] calldata stakingChains) external payable nonReentrant {
        if (amountStaked[msg.sender] + amount < discountThresholds[DiscountTier.TIER_1])
            revert StakeBelowThreshhold();
        
        amountStaked[msg.sender] += amount;
        stakingEnteredTimestamp[msg.sender] = block.timestamp;

        YESPTOKEN.safeTransferFrom(msg.sender, address(this), amount);

        setRemoteValue(amountStaked[msg.sender], stakingChains, msg.sender);

        emit StakingEntered(msg.sender, amount, block.timestamp);
    }

    // Same as above, but support ERC20Permit.
    function enterStakingWithPermit(uint256 amount, string[] calldata stakingChains, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external payable nonReentrant {
        if (amountStaked[msg.sender] + amount < discountThresholds[DiscountTier.TIER_1])
            revert StakeBelowThreshhold();
        
        amountStaked[msg.sender] += amount;
        stakingEnteredTimestamp[msg.sender] = block.timestamp;

        YESPTOKENPERMIT.permit(msg.sender, address(this), YESPTOKEN.balanceOf(msg.sender), deadline, v, r, s);
        YESPTOKEN.safeTransferFrom(msg.sender, address(this), amount);

        setRemoteValue(amountStaked[msg.sender], stakingChains, msg.sender);

        emit StakingEntered(msg.sender, amount, block.timestamp);
    }

    // Withdraw a certain amount of tokens from the currently staked amount. Must be after lockup period.
    function exitStaking(uint256 amount, string[] calldata stakingChains) external payable nonReentrant {
        if (amount > amountStaked[msg.sender])
            revert WithdrawOverBalance();

        uint256 timeStakingEntered = stakingEnteredTimestamp[msg.sender];
        if (block.timestamp - timeStakingEntered < lockupTime)
            revert WithdrawBeforeLockupEnd();
        
        amountStaked[msg.sender] -= amount;

        YESPTOKEN.safeTransferFrom(address(this), msg.sender, amount);

        setRemoteValue(amountStaked[msg.sender], stakingChains, msg.sender);

        emit StakingExited(msg.sender, amount, block.timestamp);
    }

    //Returns amount, staking entered time
    function getStakingPosition(address user) external view returns (uint256, uint256) {
        return (amountStaked[user], stakingEnteredTimestamp[user]);
    }

    //Returns current unlock time
    function getUnlockTime(address user) external view returns(uint256) {
        return stakingEnteredTimestamp[user] + lockupTime;
    }

    function isUserDiscountElegible(address user) external view returns(bool) {
        return amountStaked[user] >= discountThresholds[DiscountTier.TIER_1];
    }

    function userDiscountTier(address user) external view returns (DiscountTier) {
        if (amountStaked[user] >= discountThresholds[DiscountTier.TIER_3])
            return (DiscountTier.TIER_3);
        if (amountStaked[user] >= discountThresholds[DiscountTier.TIER_2])
            return (DiscountTier.TIER_2);
        if (amountStaked[user] >= discountThresholds[DiscountTier.TIER_1])
            return (DiscountTier.TIER_1);
        return DiscountTier.NO_TIER;
    }

    // Call this function to update the value of this contract along with all its siblings'.
    function setRemoteValue(
        uint256 value_,
        string[] calldata destinationChains,
        address user
    ) internal {
        uint256 len = destinationChains.length;
        uint256[] memory gasArray = divvyGas(msg.value, len);
        bytes memory payload = abi.encode(user, value_);

        if (msg.value == 0)
            revert XChainUnderfunded();
        
        if (msg.value > 0) {
            for (uint i; i<len;) {
                if (emptyString(stakingVerifier[destinationChains[i]]))
                    revert BadDestinationChains();

                gasReceiver.payNativeGasForContractCall{ value: gasArray[i] }(
                    address(this),
                    destinationChains[i],
                    stakingVerifier[destinationChains[i]],
                    payload,
                    user
                );
                gateway.callContract(destinationChains[i], stakingVerifier[destinationChains[i]], payload);
                unchecked{++i;}
            }
        }
    }

    //Admin functions (unstake for user, add a new chain, manually update a staking value, change lockup or thresholds).
    function adminExitStaking(address user) external onlyOwner {
        uint256 amount = amountStaked[user];
        amountStaked[user] -= amount;

        YESPTOKEN.safeTransferFrom(address(this), user, amount);

        emit StakingExited(user, amount, block.timestamp);
    }

    function adminSetRemote(uint256 amount, string[] calldata destinationChains, address user) external payable onlyOwner {
        setRemoteValue(amount, destinationChains, user);
    }

    function adminAddChain(string calldata chainName, string memory verifierContract) external onlyOwner {
        stakingVerifier[chainName] = verifierContract;
    }

    function adminSetLockup(uint256 lockup) external onlyOwner {
        lockupTime = lockup; // in seconds
    }

    function adminSetDiscountThreshold(DiscountTier tier, uint256 threshold) external onlyOwner {
        discountThresholds[tier] = threshold;
    }

    // Divides the gas value among multiple chains for message posting
    function divvyGas(uint256 value, uint256 parts) internal pure returns (uint256[] memory) {
        uint256 baseGas = value/parts;
        uint256 remainder = value%baseGas;
        uint256[] memory gasArray = new uint256[](parts);
        for(uint i; i<parts;) {
            gasArray[i] = baseGas;
            unchecked {++i;}
        }
        gasArray[gasArray.length - 1] += remainder;
        return gasArray;
    }

    function emptyString(string memory _input) internal pure returns (bool){
        return bytes(_input).length == 0;
    }

}

File 2 of 12 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 3 of 12 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 4 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 12 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 6 of 12 : AxelarExecutable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';
import { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';

contract AxelarExecutable is IAxelarExecutable {
    IAxelarGateway public immutable gateway;

    constructor(address gateway_) {
        if (gateway_ == address(0)) revert InvalidAddress();

        gateway = IAxelarGateway(gateway_);
    }

    function execute(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload
    ) external override {
        bytes32 payloadHash = keccak256(payload);
        if (!gateway.validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))
            revert NotApprovedByGateway();
        _execute(sourceChain, sourceAddress, payload);
    }

    function executeWithToken(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload,
        string calldata tokenSymbol,
        uint256 amount
    ) external override {
        bytes32 payloadHash = keccak256(payload);
        if (
            !gateway.validateContractCallAndMint(
                commandId,
                sourceChain,
                sourceAddress,
                payloadHash,
                tokenSymbol,
                amount
            )
        ) revert NotApprovedByGateway();

        _executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount);
    }

    function _execute(
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload
    ) internal virtual {}

    function _executeWithToken(
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload,
        string calldata tokenSymbol,
        uint256 amount
    ) internal virtual {}
}

File 7 of 12 : IAxelarGateway.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IAxelarGateway {
    /**********\
    |* Errors *|
    \**********/

    error NotSelf();
    error NotProxy();
    error InvalidCodeHash();
    error SetupFailed();
    error InvalidAuthModule();
    error InvalidTokenDeployer();
    error InvalidAmount();
    error InvalidChainId();
    error InvalidCommands();
    error TokenDoesNotExist(string symbol);
    error TokenAlreadyExists(string symbol);
    error TokenDeployFailed(string symbol);
    error TokenContractDoesNotExist(address token);
    error BurnFailed(string symbol);
    error MintFailed(string symbol);
    error InvalidSetMintLimitsParams();
    error ExceedMintLimit(string symbol);

    /**********\
    |* Events *|
    \**********/

    event TokenSent(
        address indexed sender,
        string destinationChain,
        string destinationAddress,
        string symbol,
        uint256 amount
    );

    event ContractCall(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload
    );

    event ContractCallWithToken(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload,
        string symbol,
        uint256 amount
    );

    event Executed(bytes32 indexed commandId);

    event TokenDeployed(string symbol, address tokenAddresses);

    event ContractCallApproved(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event ContractCallApprovedWithMint(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event TokenMintLimitUpdated(string symbol, uint256 limit);

    event OperatorshipTransferred(bytes newOperatorsData);

    event Upgraded(address indexed implementation);

    /********************\
    |* Public Functions *|
    \********************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external;

    function callContract(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload
    ) external;

    function callContractWithToken(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external;

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view returns (bool);

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view returns (bool);

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external returns (bool);

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external returns (bool);

    /***********\
    |* Getters *|
    \***********/

    function authModule() external view returns (address);

    function tokenDeployer() external view returns (address);

    function tokenMintLimit(string memory symbol) external view returns (uint256);

    function tokenMintAmount(string memory symbol) external view returns (uint256);

    function allTokensFrozen() external view returns (bool);

    function implementation() external view returns (address);

    function tokenAddresses(string memory symbol) external view returns (address);

    function tokenFrozen(string memory symbol) external view returns (bool);

    function isCommandExecuted(bytes32 commandId) external view returns (bool);

    function adminEpoch() external view returns (uint256);

    function adminThreshold(uint256 epoch) external view returns (uint256);

    function admins(uint256 epoch) external view returns (address[] memory);

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external;

    /**********************\
    |* External Functions *|
    \**********************/

    function setup(bytes calldata params) external;

    function execute(bytes calldata input) external;
}

File 8 of 12 : IAxelarGasService.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// This should be owned by the microservice that is paying for gas.
interface IAxelarGasService {
    error NothingReceived();
    error TransferFailed();
    error InvalidAddress();

    event GasPaidForContractCall(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event GasPaidForContractCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasPaidForContractCall(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasPaidForContractCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event GasAdded(
        bytes32 indexed txHash,
        uint256 indexed logIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payGasForContractCall(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payGasForContractCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payNativeGasForContractCall(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        address refundAddress
    ) external payable;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payNativeGasForContractCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address refundAddress
    ) external payable;

    function addGas(
        bytes32 txHash,
        uint256 txIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    function addNativeGas(
        bytes32 txHash,
        uint256 logIndex,
        address refundAddress
    ) external payable;

    function collectFees(address payable receiver, address[] calldata tokens) external;

    function refund(
        address payable receiver,
        address token,
        uint256 amount
    ) external;
}

File 9 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 10 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 11 of 12 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 12 of 12 : IAxelarExecutable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';

interface IAxelarExecutable {
    error InvalidAddress();
    error NotApprovedByGateway();

    function gateway() external view returns (IAxelarGateway);

    function execute(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload
    ) external;

    function executeWithToken(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes calldata payload,
        string calldata tokenSymbol,
        uint256 amount
    ) external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BadDestinationChains","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotApprovedByGateway","type":"error"},{"inputs":[],"name":"StakeBelowThreshhold","type":"error"},{"inputs":[],"name":"WithdrawBeforeLockupEnd","type":"error"},{"inputs":[],"name":"WithdrawOverBalance","type":"error"},{"inputs":[],"name":"XChainUnderfunded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingExited","type":"event"},{"inputs":[],"name":"YESPTOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YESPTOKENPERMIT","outputs":[{"internalType":"contract IERC20Permit","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"chainName","type":"string"},{"internalType":"string","name":"verifierContract","type":"string"}],"name":"adminAddChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"adminExitStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YespXStake.DiscountTier","name":"tier","type":"uint8"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"adminSetDiscountThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockup","type":"uint256"}],"name":"adminSetLockup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"destinationChains","type":"string[]"},{"internalType":"address","name":"user","type":"address"}],"name":"adminSetRemote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum YespXStake.DiscountTier","name":"","type":"uint8"}],"name":"discountThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"stakingChains","type":"string[]"}],"name":"enterStaking","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"stakingChains","type":"string[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"enterStakingWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"executeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"stakingChains","type":"string[]"}],"name":"exitStaking","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"gateway","outputs":[{"internalType":"contract IAxelarGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakingPosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isUserDiscountElegible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockupTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingEnteredTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"stakingVerifier","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"userDiscountTier","outputs":[{"internalType":"enum YespXStake.DiscountTier","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

60a0604052620151806004553480156200001857600080fd5b50734f4495243837681061c4743b74b3eedf548d56a5620000393362000158565b6001600160a01b038116620000615760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03166080526001805560056020908152670de0b6b3a76400007f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b5569d3c21bcecceda10000007f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a5560036000526a0422ca8b0a00a4250000007fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc0556040805160608101909152602a8082529091620023b09083013960408051662837b63cb3b7b760c91b81526006600782015290519081900360270190208151620001519260200190620001a8565b506200028a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001b6906200024e565b90600052602060002090601f016020900481019282620001da576000855562000225565b82601f10620001f557805160ff191683800117855562000225565b8280016001018555821562000225579182015b828111156200022557825182559160200191906001019062000208565b506200023392915062000237565b5090565b5b8082111562000233576000815560010162000238565b600181811c908216806200026357607f821691505b6020821081036200028457634e487b7160e01b600052602260045260246000fd5b50919050565b6080516120f5620002bb600039600081816101d30152818161073901528181610a28015261120101526120f56000f3fe6080604052600436106101665760003560e01c806353a214f2116100d15780638e8d8b141161008a578063dbed1e8811610064578063dbed1e881461048f578063ef40a670146104af578063f2fde38b146104dc578063f9cb8c85146104fc57600080fd5b80638e8d8b1414610415578063c2edafde1461039c578063d6ed30691461046f57600080fd5b806353a214f21461035a578063715018a61461038757806378a70fa61461039c5780637e9b8b6d146103c45780638946c6d5146103d75780638da5cb5b146103f757600080fd5b80631a98b2e0116101235780631a98b2e0146102555780631d94e780146102755780632647793114610288578063365911d3146102b55780633cbd314d1461030d578063491606581461033a57600080fd5b80630693f8c01461016b5780630d05d69d146101ab578063116191b6146101c1578063118fd76d1461020d57806318d67e021461022f57806319ede22414610242575b600080fd5b34801561017757600080fd5b50610198610186366004611732565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101b757600080fd5b5061019860045481565b3480156101cd57600080fd5b506101f57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101a2565b34801561021957600080fd5b5061022d610228366004611732565b61051c565b005b61022d61023d366004611799565b6105b9565b61022d6102503660046117e5565b6106ee565b34801561026157600080fd5b5061022d610270366004611885565b610708565b61022d610283366004611799565b6107eb565b34801561029457600080fd5b506102a86102a3366004611732565b610927565b6040516101a29190611975565b3480156102c157600080fd5b506102f86102d0366004611732565b6001600160a01b03166000908152600260209081526040808320546003909252909120549091565b604080519283526020830191909152016101a2565b34801561031957600080fd5b506101986103283660046119ac565b60056020526000908152604090205481565b34801561034657600080fd5b5061022d6103553660046119c7565b6109f7565b34801561036657600080fd5b5061037a610375366004611b0e565b610ad1565b6040516101a29190611ba3565b34801561039357600080fd5b5061022d610b76565b3480156103a857600080fd5b506101f57346cca329970b33e1a007dd4ef0594a1cedb3e72a81565b61022d6103d2366004611bb6565b610b8a565b3480156103e357600080fd5b5061022d6103f2366004611c39565b610dbf565b34801561040357600080fd5b506000546001600160a01b03166101f5565b34801561042157600080fd5b5061045f610430366004611732565b6000805160206120a0833981519152546001600160a01b03909116600090815260026020526040902054101590565b60405190151581526020016101a2565b34801561047b57600080fd5b5061022d61048a366004611c63565b610e04565b34801561049b57600080fd5b506101986104aa366004611732565b610e11565b3480156104bb57600080fd5b506101986104ca366004611732565b60026020526000908152604090205481565b3480156104e857600080fd5b5061022d6104f7366004611732565b610e3e565b34801561050857600080fd5b5061022d610517366004611c7c565b610eb7565b610524610ef3565b6001600160a01b038116600090815260026020526040812080549182919061054c8380611cfb565b9091555061057290507346cca329970b33e1a007dd4ef0594a1cedb3e72a308484610f4d565b604080518281524260208201526001600160a01b038416917fd8879585767c560479da918beb9a59c92afb7155b70388e479afcbebdd0db5bd910160405180910390a25050565b6002600154036105e45760405162461bcd60e51b81526004016105db90611d12565b60405180910390fd5b600260018190556000805160206120a083398151915254336000908152602092909252604090912054610618908590611d49565b1015610637576040516362189b0d60e11b815260040160405180910390fd5b3360009081526002602052604081208054859290610656908490611d49565b909155505033600081815260036020526040902042905561068e907346cca329970b33e1a007dd4ef0594a1cedb3e72a903086610f4d565b336000818152600260205260409020546106ab9184908490610fa7565b6040805184815242602082015233917f77ae0f7b3e603c5f451645b747b26f102a73b691c6e66c69628b19a82db6fee5910160405180910390a250506001805550565b6106f6610ef3565b61070284848484610fa7565b50505050565b6000858560405161071a929190611d61565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed99061077e908e908e908e908e908e9089908d908d908d90600401611d9a565b6020604051808303816000875af115801561079d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c19190611df9565b6107de57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60026001540361080d5760405162461bcd60e51b81526004016105db90611d12565b60026001819055336000908152602091909152604090205483111561084557604051632325629560e01b815260040160405180910390fd5b336000908152600360205260409020546004546108628242611cfb565b1015610881576040516331c2570160e21b815260040160405180910390fd5b33600090815260026020526040812080548692906108a0908490611cfb565b909155506108c690507346cca329970b33e1a007dd4ef0594a1cedb3e72a303387610f4d565b336000818152600260205260409020546108e39185908590610fa7565b6040805185815242602082015233917fd8879585767c560479da918beb9a59c92afb7155b70388e479afcbebdd0db5bd910160405180910390a25050600180555050565b7fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc0546001600160a01b03821660009081526002602052604081205490911161097157506003919050565b7f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a546001600160a01b038316600090815260026020526040902054106109b957506002919050565b6000805160206120a0833981519152546001600160a01b038316600090815260026020526040902054106109ef57506001919050565b506000919050565b60008282604051610a09929190611d61565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390610a67908b908b908b908b908b908990600401611e1b565b6020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190611df9565b610ac757604051631403112d60e21b815260040160405180910390fd5b5050505050505050565b805160208183018101805160068252928201919093012091528054610af590611e5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190611e5c565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b610b7e610ef3565b610b8860006112fc565b565b600260015403610bac5760405162461bcd60e51b81526004016105db90611d12565b600260018190556000805160206120a083398151915254336000908152602092909252604090912054610be0908990611d49565b1015610bff576040516362189b0d60e11b815260040160405180910390fd5b3360009081526002602052604081208054899290610c1e908490611d49565b90915550503360008181526003602052604090819020429055516370a0823160e01b8152600481018290527346cca329970b33e1a007dd4ef0594a1cedb3e72a9163d505accf91309084906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190611e96565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610d2057600080fd5b505af1158015610d34573d6000803e3d6000fd5b50610d5b92507346cca329970b33e1a007dd4ef0594a1cedb3e72a9150339050308a610f4d565b33600081815260026020526040902054610d789188908890610fa7565b6040805188815242602082015233917f77ae0f7b3e603c5f451645b747b26f102a73b691c6e66c69628b19a82db6fee5910160405180910390a25050600180555050505050565b610dc7610ef3565b8060056000846003811115610dde57610dde61195f565b6003811115610def57610def61195f565b81526020810191909152604001600020555050565b610e0c610ef3565b600455565b6004546001600160a01b0382166000908152600360205260408120549091610e3891611d49565b92915050565b610e46610ef3565b6001600160a01b038116610eab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105db565b610eb4816112fc565b50565b610ebf610ef3565b8060068484604051610ed2929190611d61565b9081526020016040518091039020908051906020019061070292919061167d565b6000546001600160a01b03163314610b885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105db565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261070290859061134c565b816000610fb43483611423565b604080516001600160a01b03861660208201528082018990528151808203830181526060909101909152909150346000036110025760405163c01d058760e01b815260040160405180910390fd5b34156112f35760005b83811015610ac7576110e6600688888481811061102a5761102a611eaf565b905060200281019061103c9190611ec5565b60405161104a929190611d61565b9081526020016040518091039020805461106390611e5c565b80601f016020809104026020016040519081016040528092919081815260200182805461108f90611e5c565b80156110dc5780601f106110b1576101008083540402835291602001916110dc565b820191906000526020600020905b8154815290600101906020018083116110bf57829003601f168201915b5050505050511590565b15611104576040516304d67e0960e01b815260040160405180910390fd5b732d5d7d31f671f86c782533cc367f14109a0827126001600160a01b0316630c93e3bb84838151811061113957611139611eaf565b6020026020010151308a8a8681811061115457611154611eaf565b90506020028101906111669190611ec5565b60068d8d8981811061117a5761117a611eaf565b905060200281019061118c9190611ec5565b60405161119a929190611d61565b9081526040519081900360200181206001600160e01b031960e088901b1682526111cd949392918a908e90600401611fab565b6000604051808303818588803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631c92115f88888481811061124057611240611eaf565b90506020028101906112529190611ec5565b60068b8b8781811061126657611266611eaf565b90506020028101906112789190611ec5565b604051611286929190611d61565b9081526040519081900360200181206001600160e01b031960e086901b1682526112b6939291889060040161200b565b600060405180830381600087803b1580156112d057600080fd5b505af11580156112e4573d6000803e3d6000fd5b5050505080600101905061100b565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113a1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114fa9092919063ffffffff16565b80519091501561141e57808060200190518101906113bf9190611df9565b61141e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105db565b505050565b60606000611431838561205b565b9050600061143f828661206f565b905060008467ffffffffffffffff81111561145c5761145c611a6b565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50905060005b858110156114b957838282815181106114a6576114a6611eaf565b602090810291909101015260010161148b565b508181600183516114ca9190611cfb565b815181106114da576114da611eaf565b602002602001018181516114ee9190611d49565b90525095945050505050565b60606115098484600085611513565b90505b9392505050565b6060824710156115745760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105db565b6001600160a01b0385163b6115cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105db565b600080866001600160a01b031685876040516115e79190612083565b60006040518083038185875af1925050503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b5091509150611639828286611644565b979650505050505050565b6060831561165357508161150c565b8251156116635782518084602001fd5b8160405162461bcd60e51b81526004016105db9190611ba3565b82805461168990611e5c565b90600052602060002090601f0160209004810192826116ab57600085556116f1565b82601f106116c457805160ff19168380011785556116f1565b828001600101855582156116f1579182015b828111156116f15782518255916020019190600101906116d6565b506116fd929150611701565b5090565b5b808211156116fd5760008155600101611702565b80356001600160a01b038116811461172d57600080fd5b919050565b60006020828403121561174457600080fd5b61150c82611716565b60008083601f84011261175f57600080fd5b50813567ffffffffffffffff81111561177757600080fd5b6020830191508360208260051b850101111561179257600080fd5b9250929050565b6000806000604084860312156117ae57600080fd5b83359250602084013567ffffffffffffffff8111156117cc57600080fd5b6117d88682870161174d565b9497909650939450505050565b600080600080606085870312156117fb57600080fd5b84359350602085013567ffffffffffffffff81111561181957600080fd5b6118258782880161174d565b9094509250611838905060408601611716565b905092959194509250565b60008083601f84011261185557600080fd5b50813567ffffffffffffffff81111561186d57600080fd5b60208301915083602082850101111561179257600080fd5b60008060008060008060008060008060c08b8d0312156118a457600080fd5b8a35995060208b013567ffffffffffffffff808211156118c357600080fd5b6118cf8e838f01611843565b909b50995060408d01359150808211156118e857600080fd5b6118f48e838f01611843565b909950975060608d013591508082111561190d57600080fd5b6119198e838f01611843565b909750955060808d013591508082111561193257600080fd5b5061193f8d828e01611843565b9150809450508092505060a08b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b602081016004831061199757634e487b7160e01b600052602160045260246000fd5b91905290565b80356004811061172d57600080fd5b6000602082840312156119be57600080fd5b61150c8261199d565b60008060008060008060006080888a0312156119e257600080fd5b87359650602088013567ffffffffffffffff80821115611a0157600080fd5b611a0d8b838c01611843565b909850965060408a0135915080821115611a2657600080fd5b611a328b838c01611843565b909650945060608a0135915080821115611a4b57600080fd5b50611a588a828b01611843565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611a9257600080fd5b813567ffffffffffffffff80821115611aad57611aad611a6b565b604051601f8301601f19908116603f01168101908282118183101715611ad557611ad5611a6b565b81604052838152866020858801011115611aee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611b2057600080fd5b813567ffffffffffffffff811115611b3757600080fd5b611b4384828501611a81565b949350505050565b60005b83811015611b66578181015183820152602001611b4e565b838111156107025750506000910152565b60008151808452611b8f816020860160208601611b4b565b601f01601f19169290920160200192915050565b60208152600061150c6020830184611b77565b600080600080600080600060c0888a031215611bd157600080fd5b87359650602088013567ffffffffffffffff811115611bef57600080fd5b611bfb8a828b0161174d565b90975095505060408801359350606088013560ff81168114611c1c57600080fd5b969995985093969295946080840135945060a09093013592915050565b60008060408385031215611c4c57600080fd5b611c558361199d565b946020939093013593505050565b600060208284031215611c7557600080fd5b5035919050565b600080600060408486031215611c9157600080fd5b833567ffffffffffffffff80821115611ca957600080fd5b611cb587838801611843565b90955093506020860135915080821115611cce57600080fd5b50611cdb86828701611a81565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b600082821015611d0d57611d0d611ce5565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611d5c57611d5c611ce5565b500190565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c060208201526000611db460c083018a8c611d71565b8281036040840152611dc781898b611d71565b90508660608401528281036080840152611de2818688611d71565b9150508260a08301529a9950505050505050505050565b600060208284031215611e0b57600080fd5b8151801515811461150c57600080fd5b868152608060208201526000611e35608083018789611d71565b8281036040840152611e48818688611d71565b915050826060830152979650505050505050565b600181811c90821680611e7057607f821691505b602082108103611e9057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611ea857600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611edc57600080fd5b83018035915067ffffffffffffffff821115611ef757600080fd5b60200191503681900382131561179257600080fd5b8054600090600181811c9080831680611f2657607f831692505b60208084108203611f4757634e487b7160e01b600052602260045260246000fd5b83885260208801828015611f625760018114611f7357611f9e565b60ff19871682528282019750611f9e565b60008981526020902060005b87811015611f9857815484820152908601908401611f7f565b83019850505b5050505050505092915050565b600060018060a01b03808916835260a06020840152611fce60a08401888a611d71565b8381036040850152611fe08188611f0c565b90508381036060850152611ff48187611b77565b925050808416608084015250979650505050505050565b60608152600061201f606083018688611d71565b82810360208401526120318186611f0c565b905082810360408401526116398185611b77565b634e487b7160e01b600052601260045260246000fd5b60008261206a5761206a612045565b500490565b60008261207e5761207e612045565b500690565b60008251612095818460208701611b4b565b919091019291505056fe1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017ba264697066735822122067ff1f5ce5f150d5477c5166670901cc3cbba70589796e0f478252d78a65bb7864736f6c634300080e0033307831653041326332353730456335343930663961363831364141333666394631453366303244626332

Deployed Bytecode

0x6080604052600436106101665760003560e01c806353a214f2116100d15780638e8d8b141161008a578063dbed1e8811610064578063dbed1e881461048f578063ef40a670146104af578063f2fde38b146104dc578063f9cb8c85146104fc57600080fd5b80638e8d8b1414610415578063c2edafde1461039c578063d6ed30691461046f57600080fd5b806353a214f21461035a578063715018a61461038757806378a70fa61461039c5780637e9b8b6d146103c45780638946c6d5146103d75780638da5cb5b146103f757600080fd5b80631a98b2e0116101235780631a98b2e0146102555780631d94e780146102755780632647793114610288578063365911d3146102b55780633cbd314d1461030d578063491606581461033a57600080fd5b80630693f8c01461016b5780630d05d69d146101ab578063116191b6146101c1578063118fd76d1461020d57806318d67e021461022f57806319ede22414610242575b600080fd5b34801561017757600080fd5b50610198610186366004611732565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101b757600080fd5b5061019860045481565b3480156101cd57600080fd5b506101f57f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a581565b6040516001600160a01b0390911681526020016101a2565b34801561021957600080fd5b5061022d610228366004611732565b61051c565b005b61022d61023d366004611799565b6105b9565b61022d6102503660046117e5565b6106ee565b34801561026157600080fd5b5061022d610270366004611885565b610708565b61022d610283366004611799565b6107eb565b34801561029457600080fd5b506102a86102a3366004611732565b610927565b6040516101a29190611975565b3480156102c157600080fd5b506102f86102d0366004611732565b6001600160a01b03166000908152600260209081526040808320546003909252909120549091565b604080519283526020830191909152016101a2565b34801561031957600080fd5b506101986103283660046119ac565b60056020526000908152604090205481565b34801561034657600080fd5b5061022d6103553660046119c7565b6109f7565b34801561036657600080fd5b5061037a610375366004611b0e565b610ad1565b6040516101a29190611ba3565b34801561039357600080fd5b5061022d610b76565b3480156103a857600080fd5b506101f57346cca329970b33e1a007dd4ef0594a1cedb3e72a81565b61022d6103d2366004611bb6565b610b8a565b3480156103e357600080fd5b5061022d6103f2366004611c39565b610dbf565b34801561040357600080fd5b506000546001600160a01b03166101f5565b34801561042157600080fd5b5061045f610430366004611732565b6000805160206120a0833981519152546001600160a01b03909116600090815260026020526040902054101590565b60405190151581526020016101a2565b34801561047b57600080fd5b5061022d61048a366004611c63565b610e04565b34801561049b57600080fd5b506101986104aa366004611732565b610e11565b3480156104bb57600080fd5b506101986104ca366004611732565b60026020526000908152604090205481565b3480156104e857600080fd5b5061022d6104f7366004611732565b610e3e565b34801561050857600080fd5b5061022d610517366004611c7c565b610eb7565b610524610ef3565b6001600160a01b038116600090815260026020526040812080549182919061054c8380611cfb565b9091555061057290507346cca329970b33e1a007dd4ef0594a1cedb3e72a308484610f4d565b604080518281524260208201526001600160a01b038416917fd8879585767c560479da918beb9a59c92afb7155b70388e479afcbebdd0db5bd910160405180910390a25050565b6002600154036105e45760405162461bcd60e51b81526004016105db90611d12565b60405180910390fd5b600260018190556000805160206120a083398151915254336000908152602092909252604090912054610618908590611d49565b1015610637576040516362189b0d60e11b815260040160405180910390fd5b3360009081526002602052604081208054859290610656908490611d49565b909155505033600081815260036020526040902042905561068e907346cca329970b33e1a007dd4ef0594a1cedb3e72a903086610f4d565b336000818152600260205260409020546106ab9184908490610fa7565b6040805184815242602082015233917f77ae0f7b3e603c5f451645b747b26f102a73b691c6e66c69628b19a82db6fee5910160405180910390a250506001805550565b6106f6610ef3565b61070284848484610fa7565b50505050565b6000858560405161071a929190611d61565b604051908190038120631876eed960e01b825291506001600160a01b037f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a51690631876eed99061077e908e908e908e908e908e9089908d908d908d90600401611d9a565b6020604051808303816000875af115801561079d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c19190611df9565b6107de57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60026001540361080d5760405162461bcd60e51b81526004016105db90611d12565b60026001819055336000908152602091909152604090205483111561084557604051632325629560e01b815260040160405180910390fd5b336000908152600360205260409020546004546108628242611cfb565b1015610881576040516331c2570160e21b815260040160405180910390fd5b33600090815260026020526040812080548692906108a0908490611cfb565b909155506108c690507346cca329970b33e1a007dd4ef0594a1cedb3e72a303387610f4d565b336000818152600260205260409020546108e39185908590610fa7565b6040805185815242602082015233917fd8879585767c560479da918beb9a59c92afb7155b70388e479afcbebdd0db5bd910160405180910390a25050600180555050565b7fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc0546001600160a01b03821660009081526002602052604081205490911161097157506003919050565b7f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a546001600160a01b038316600090815260026020526040902054106109b957506002919050565b6000805160206120a0833981519152546001600160a01b038316600090815260026020526040902054106109ef57506001919050565b506000919050565b60008282604051610a09929190611d61565b604051908190038120635f6970c360e01b825291506001600160a01b037f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a51690635f6970c390610a67908b908b908b908b908b908990600401611e1b565b6020604051808303816000875af1158015610a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaa9190611df9565b610ac757604051631403112d60e21b815260040160405180910390fd5b5050505050505050565b805160208183018101805160068252928201919093012091528054610af590611e5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2190611e5c565b8015610b6e5780601f10610b4357610100808354040283529160200191610b6e565b820191906000526020600020905b815481529060010190602001808311610b5157829003601f168201915b505050505081565b610b7e610ef3565b610b8860006112fc565b565b600260015403610bac5760405162461bcd60e51b81526004016105db90611d12565b600260018190556000805160206120a083398151915254336000908152602092909252604090912054610be0908990611d49565b1015610bff576040516362189b0d60e11b815260040160405180910390fd5b3360009081526002602052604081208054899290610c1e908490611d49565b90915550503360008181526003602052604090819020429055516370a0823160e01b8152600481018290527346cca329970b33e1a007dd4ef0594a1cedb3e72a9163d505accf91309084906370a0823190602401602060405180830381865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190611e96565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610d2057600080fd5b505af1158015610d34573d6000803e3d6000fd5b50610d5b92507346cca329970b33e1a007dd4ef0594a1cedb3e72a9150339050308a610f4d565b33600081815260026020526040902054610d789188908890610fa7565b6040805188815242602082015233917f77ae0f7b3e603c5f451645b747b26f102a73b691c6e66c69628b19a82db6fee5910160405180910390a25050600180555050505050565b610dc7610ef3565b8060056000846003811115610dde57610dde61195f565b6003811115610def57610def61195f565b81526020810191909152604001600020555050565b610e0c610ef3565b600455565b6004546001600160a01b0382166000908152600360205260408120549091610e3891611d49565b92915050565b610e46610ef3565b6001600160a01b038116610eab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105db565b610eb4816112fc565b50565b610ebf610ef3565b8060068484604051610ed2929190611d61565b9081526020016040518091039020908051906020019061070292919061167d565b6000546001600160a01b03163314610b885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105db565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261070290859061134c565b816000610fb43483611423565b604080516001600160a01b03861660208201528082018990528151808203830181526060909101909152909150346000036110025760405163c01d058760e01b815260040160405180910390fd5b34156112f35760005b83811015610ac7576110e6600688888481811061102a5761102a611eaf565b905060200281019061103c9190611ec5565b60405161104a929190611d61565b9081526020016040518091039020805461106390611e5c565b80601f016020809104026020016040519081016040528092919081815260200182805461108f90611e5c565b80156110dc5780601f106110b1576101008083540402835291602001916110dc565b820191906000526020600020905b8154815290600101906020018083116110bf57829003601f168201915b5050505050511590565b15611104576040516304d67e0960e01b815260040160405180910390fd5b732d5d7d31f671f86c782533cc367f14109a0827126001600160a01b0316630c93e3bb84838151811061113957611139611eaf565b6020026020010151308a8a8681811061115457611154611eaf565b90506020028101906111669190611ec5565b60068d8d8981811061117a5761117a611eaf565b905060200281019061118c9190611ec5565b60405161119a929190611d61565b9081526040519081900360200181206001600160e01b031960e088901b1682526111cd949392918a908e90600401611fab565b6000604051808303818588803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b50505050507f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a56001600160a01b0316631c92115f88888481811061124057611240611eaf565b90506020028101906112529190611ec5565b60068b8b8781811061126657611266611eaf565b90506020028101906112789190611ec5565b604051611286929190611d61565b9081526040519081900360200181206001600160e01b031960e086901b1682526112b6939291889060040161200b565b600060405180830381600087803b1580156112d057600080fd5b505af11580156112e4573d6000803e3d6000fd5b5050505080600101905061100b565b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113a1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166114fa9092919063ffffffff16565b80519091501561141e57808060200190518101906113bf9190611df9565b61141e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105db565b505050565b60606000611431838561205b565b9050600061143f828661206f565b905060008467ffffffffffffffff81111561145c5761145c611a6b565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50905060005b858110156114b957838282815181106114a6576114a6611eaf565b602090810291909101015260010161148b565b508181600183516114ca9190611cfb565b815181106114da576114da611eaf565b602002602001018181516114ee9190611d49565b90525095945050505050565b60606115098484600085611513565b90505b9392505050565b6060824710156115745760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105db565b6001600160a01b0385163b6115cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105db565b600080866001600160a01b031685876040516115e79190612083565b60006040518083038185875af1925050503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b5091509150611639828286611644565b979650505050505050565b6060831561165357508161150c565b8251156116635782518084602001fd5b8160405162461bcd60e51b81526004016105db9190611ba3565b82805461168990611e5c565b90600052602060002090601f0160209004810192826116ab57600085556116f1565b82601f106116c457805160ff19168380011785556116f1565b828001600101855582156116f1579182015b828111156116f15782518255916020019190600101906116d6565b506116fd929150611701565b5090565b5b808211156116fd5760008155600101611702565b80356001600160a01b038116811461172d57600080fd5b919050565b60006020828403121561174457600080fd5b61150c82611716565b60008083601f84011261175f57600080fd5b50813567ffffffffffffffff81111561177757600080fd5b6020830191508360208260051b850101111561179257600080fd5b9250929050565b6000806000604084860312156117ae57600080fd5b83359250602084013567ffffffffffffffff8111156117cc57600080fd5b6117d88682870161174d565b9497909650939450505050565b600080600080606085870312156117fb57600080fd5b84359350602085013567ffffffffffffffff81111561181957600080fd5b6118258782880161174d565b9094509250611838905060408601611716565b905092959194509250565b60008083601f84011261185557600080fd5b50813567ffffffffffffffff81111561186d57600080fd5b60208301915083602082850101111561179257600080fd5b60008060008060008060008060008060c08b8d0312156118a457600080fd5b8a35995060208b013567ffffffffffffffff808211156118c357600080fd5b6118cf8e838f01611843565b909b50995060408d01359150808211156118e857600080fd5b6118f48e838f01611843565b909950975060608d013591508082111561190d57600080fd5b6119198e838f01611843565b909750955060808d013591508082111561193257600080fd5b5061193f8d828e01611843565b9150809450508092505060a08b013590509295989b9194979a5092959850565b634e487b7160e01b600052602160045260246000fd5b602081016004831061199757634e487b7160e01b600052602160045260246000fd5b91905290565b80356004811061172d57600080fd5b6000602082840312156119be57600080fd5b61150c8261199d565b60008060008060008060006080888a0312156119e257600080fd5b87359650602088013567ffffffffffffffff80821115611a0157600080fd5b611a0d8b838c01611843565b909850965060408a0135915080821115611a2657600080fd5b611a328b838c01611843565b909650945060608a0135915080821115611a4b57600080fd5b50611a588a828b01611843565b989b979a50959850939692959293505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611a9257600080fd5b813567ffffffffffffffff80821115611aad57611aad611a6b565b604051601f8301601f19908116603f01168101908282118183101715611ad557611ad5611a6b565b81604052838152866020858801011115611aee57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611b2057600080fd5b813567ffffffffffffffff811115611b3757600080fd5b611b4384828501611a81565b949350505050565b60005b83811015611b66578181015183820152602001611b4e565b838111156107025750506000910152565b60008151808452611b8f816020860160208601611b4b565b601f01601f19169290920160200192915050565b60208152600061150c6020830184611b77565b600080600080600080600060c0888a031215611bd157600080fd5b87359650602088013567ffffffffffffffff811115611bef57600080fd5b611bfb8a828b0161174d565b90975095505060408801359350606088013560ff81168114611c1c57600080fd5b969995985093969295946080840135945060a09093013592915050565b60008060408385031215611c4c57600080fd5b611c558361199d565b946020939093013593505050565b600060208284031215611c7557600080fd5b5035919050565b600080600060408486031215611c9157600080fd5b833567ffffffffffffffff80821115611ca957600080fd5b611cb587838801611843565b90955093506020860135915080821115611cce57600080fd5b50611cdb86828701611a81565b9150509250925092565b634e487b7160e01b600052601160045260246000fd5b600082821015611d0d57611d0d611ce5565b500390565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611d5c57611d5c611ce5565b500190565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c060208201526000611db460c083018a8c611d71565b8281036040840152611dc781898b611d71565b90508660608401528281036080840152611de2818688611d71565b9150508260a08301529a9950505050505050505050565b600060208284031215611e0b57600080fd5b8151801515811461150c57600080fd5b868152608060208201526000611e35608083018789611d71565b8281036040840152611e48818688611d71565b915050826060830152979650505050505050565b600181811c90821680611e7057607f821691505b602082108103611e9057634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611ea857600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611edc57600080fd5b83018035915067ffffffffffffffff821115611ef757600080fd5b60200191503681900382131561179257600080fd5b8054600090600181811c9080831680611f2657607f831692505b60208084108203611f4757634e487b7160e01b600052602260045260246000fd5b83885260208801828015611f625760018114611f7357611f9e565b60ff19871682528282019750611f9e565b60008981526020902060005b87811015611f9857815484820152908601908401611f7f565b83019850505b5050505050505092915050565b600060018060a01b03808916835260a06020840152611fce60a08401888a611d71565b8381036040850152611fe08188611f0c565b90508381036060850152611ff48187611b77565b925050808416608084015250979650505050505050565b60608152600061201f606083018688611d71565b82810360208401526120318186611f0c565b905082810360408401526116398185611b77565b634e487b7160e01b600052601260045260246000fd5b60008261206a5761206a612045565b500490565b60008261207e5761207e612045565b500690565b60008251612095818460208701611b4b565b919091019291505056fe1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017ba264697066735822122067ff1f5ce5f150d5477c5166670901cc3cbba70589796e0f478252d78a65bb7864736f6c634300080e0033

Block Transaction Difficulty 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
Loading...
Loading
[ 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.