Contract 0x5ceC66F552B1D3406f65Eb1A4a4914f448F98E9c

 

Contract Overview

SpiritSwap: Spirit Maker
Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1281787b1079983e2d628aef8cb57edb340cb0af76f5a2bb2fa0ea41c655b2cdConvert470198342022-09-16 1:37:2415 days 31 mins ago0x0a92a9feaaf31e136a5bb2cfa2deba3e61724c57 IN  SpiritSwap: Spirit Maker0 FTM0.000678998493
0x33355683acb7d4114c26cec41083ce2f65ba625b6af452e7d3a076b9abe78304Convert469710362022-09-15 5:06:4715 days 21 hrs ago0x0a92a9feaaf31e136a5bb2cfa2deba3e61724c57 IN  SpiritSwap: Spirit Maker0 FTM0.00264498975
0x79fb041b43c8a5bb6d021e7f2ff10c1ff5a636ac670c0b785b8d9ee320983f85Convert469707012022-09-15 4:57:3015 days 21 hrs ago0x0a92a9feaaf31e136a5bb2cfa2deba3e61724c57 IN  SpiritSwap: Spirit Maker0 FTM0.001527678
0x4ecfe8b08cc3db6c7c31c0b1e534a3c83feea29b07594de4f878b8d1c9f0b3f5Convert Multiple469527382022-09-14 21:35:1416 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.006029203973
0xe71ed474958c402372caa4e9dd1e3f0cf20a23248565f4cf58230124c6ee3720Convert Multiple469527282022-09-14 21:34:5216 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.0153121067
0xc46aa75283cb86861c92e4ed6781710857a6023afd74d933a7082f67325e2225Convert Multiple469527222022-09-14 21:34:4116 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.048765598983
0x571ac0c226920bacf75aba762f98df363adfa3cba83111e48fc3d034e335e0c4Convert Multiple469527202022-09-14 21:34:3916 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.041525223406
0x9876d88cd233780f641ee4f2f118704f69f1aea97f2a609f2c5b6838b9fc3698Convert Multiple469527072022-09-14 21:34:1516 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.05632237997
0xf298f90a74d192c58fecef4c6c0346373dc40692dad1f650367e6d96297efdd9Convert Multiple469527012022-09-14 21:34:0716 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.05348240843
0x64bf6db0a9bb1dfa417b81804febfb24cdd1c37c3db35a7bd39d17a31aabfb32Convert Multiple469526892022-09-14 21:33:4016 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.001424885603
0xf101b4d99b5858763dfe1640a360b4bef8a9376d7a3b782c49072e8b482786b3Convert Multiple469526862022-09-14 21:33:3616 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.001385307011
0x9a55292b09cb93f6331a6d3d4d7705221fec876692b7a445c4206da333b621feConvert Multiple469526482022-09-14 21:32:2416 days 4 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.00130312114
0x52073e35f5132f3f354b5f80afe54625357b543d38de695dd0981d3f746d30bdConvert Multiple461427672022-09-01 15:55:4929 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.04017207
0xbc259a5fb2820cacf4f4a165212dbc822e2384cfe8b5fc219e5fa69adb79a868Convert Multiple461419112022-09-01 15:38:0729 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.261143428251
0x35acb6f63ef5c406af617cabfc3d3e2fe3b4234d139820e0c9460b10480a8cd8Convert Multiple461411382022-09-01 15:19:5229 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.079109519854
0x05cc033a48a80a91d6e6342d15467ba5192016eb217b3d06311265fc4ca24c46Convert Multiple461410772022-09-01 15:18:3329 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.0387411
0x839265413c68866a4a5d7c13227b07c0ccf1ca8d3819bcea15abb845121868d5Convert Multiple461410062022-09-01 15:17:0829 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.03848661
0xe6bd478310530862688a3a6ef1a189c81f1b7a8c2d5790f4b4cdbb277ec5e7c3Convert Multiple461409542022-09-01 15:16:0929 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.174868353
0x57c1f7c928f47750c31dc08951c165a3a844d32b698711212890b252ca4f8775Convert Multiple461408872022-09-01 15:14:3529 days 10 hrs ago0x461a51ecfd724352d638a215aa02dad5feb366cd IN  SpiritSwap: Spirit Maker0 FTM0.04017207
0xa0849c799abfe971dea7ecb63d450bfbd1cb9314fd6e2a997cf45492a03e1d73Convert Multiple460980342022-09-01 0:02:1330 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.102162920509
0xa70e45e220628e2105dae87398f700f4cf33200fde65c57a0888f3668cfeea50Convert Multiple460980342022-09-01 0:02:1330 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.259673574408
0x5d27860b450abe4a2e9853df8c86145bd492305cdfcc9f72201d7ae81762cd9fConvert Multiple460980322022-09-01 0:02:1130 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.262837255508
0x68a5f0b0adef04b0b12c2dbcc30b2e821dc7aca4925c58760164ec67a5aeede8Convert Multiple460980322022-09-01 0:02:1130 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.032602606431
0xe45b397af92f9ba1e76fa2a907c3820265e120f1f0ca5d0044374ece51ca7ff7Convert Multiple460980322022-09-01 0:02:1130 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.044185913796
0xe08decff5f33abfd8a5d659b84fbf713935a8a908c94b34f9a0ebf913b987dd1Convert Multiple460980302022-09-01 0:02:0930 days 2 hrs ago0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5 IN  SpiritSwap: Spirit Maker0 FTM0.041902312196
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x80371c802f31e9b318da695075e9e883747e7068a89dbd35af538b837c366439155456332021-08-26 5:33:56400 days 20 hrs ago 0x89abcd47da1adcc90aa02b775c5d720cb3b88ca5  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpiritMaker

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 8: BuyBackSpirit.sol
// SPDX-License-Identifier: MIT

// P1 - P3: OK
pragma solidity 0.6.12;
import "./SafeMath.sol";
import "./SafeERC20.sol";

import "./IUniswapV2ERC20.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Factory.sol";

import "./Ownable.sol";

// SpiritMaker is MasterChef's left hand and kinda a wizard. He can cook up Spirit from pretty much anything!
// This contract handles "serving up" rewards for inSpirit holders by trading tokens collected from fees for Spirit.

// T1 - T4: OK
contract SpiritMaker is Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // V1 - V5: OK
    IUniswapV2Factory public immutable factory;
    // 0xEF45d134b73241eDa7703fa787148D9C9F4950b0
    // V1 - V5: OK
    address public immutable dest;
    // 0xD5A2a2d1d35724396bBB547554AD73b52C0f4993   -- Fee Distributor contract for inSPIRIT holders
    // V1 - V5: OK
    address private immutable spirit;
    // 0x5cc61a78f164885776aa610fb0fe1257df78e59b
    // V1 - V5: OK
    address private immutable wftm;
    // 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

    // V1 - V5: OK
    mapping(address => address) internal _bridges;

    // E1: OK
    event LogBridgeSet(address indexed token, address indexed bridge);
    // E1: OK
    event LogConvert(
        address indexed server,
        address indexed token0,
        address indexed token1,
        uint256 amount0,
        uint256 amount1,
        uint256 amountSPIRIT
    );

    constructor(
        address _factory,
        address _dest,
        address _spirit,
        address _wftm
    ) public {
        factory = IUniswapV2Factory(_factory);
        dest = _dest;
        spirit = _spirit;
        wftm = _wftm;
    }

    // F1 - F10: OK
    // C1 - C24: OK
    function bridgeFor(address token) public view returns (address bridge) {
        bridge = _bridges[token];
        if (bridge == address(0)) {
            bridge = wftm;
        }
    }

    // F1 - F10: OK
    // C1 - C24: OK
    function setBridge(address token, address bridge) external onlyOwner {
        // Checks
        require(
            token != spirit && token != wftm && token != bridge,
            "SpiritMaker: Invalid bridge"
        );

        // Effects
        _bridges[token] = bridge;
        emit LogBridgeSet(token, bridge);
    }

    // M1 - M5: OK
    // C1 - C24: OK
    // C6: It's not a fool proof solution, but it prevents flash loans, so here it's ok to use tx.origin
    modifier onlyEOA() {
        // Try to make flash-loan exploit harder to do by only allowing externally owned addresses.
        require(msg.sender == tx.origin, "SpiritMaker: must use EOA");
        _;
    }

    // F1 - F10: OK
    // F3: _convert is separate to save gas by only checking the 'onlyEOA' modifier once in case of convertMultiple
    // F6: There is an exploit to add lots of SPIRIT to the dest, run convert, then remove the SPIRIT again.
    //     As the size of the SpiritDest has grown, this requires large amounts of funds and isn't super profitable anymore
    //     The onlyEOA modifier prevents this being done with a flash loan.
    // C1 - C24: OK
    function convert(address token0, address token1) external onlyEOA {
        _convert(token0, token1);
    }

    // F1 - F10: OK, see convert
    // C1 - C24: OK
    // C3: Loop is under control of the caller
    function convertMultiple(
        address[] calldata token0,
        address[] calldata token1
    ) external onlyEOA {
        // TODO: This can be optimized a fair bit, but this is safer and simpler for now
        uint256 len = token0.length;
        for (uint256 i = 0; i < len; i++) {
            _convert(token0[i], token1[i]);
        }
    }

    // F1 - F10: OK
    // C1- C24: OK
    function _convert(address token0, address token1) internal {
        // Interactions
        // S1 - S4: OK
        IUniswapV2Pair pair = IUniswapV2Pair(factory.getPair(token0, token1));
        require(address(pair) != address(0), "SpiritMaker: Invalid pair");
        // balanceOf: S1 - S4: OK
        // transfer: X1 - X5: OK
        IERC20(address(pair)).safeTransfer(
            address(pair),
            pair.balanceOf(address(this))
        );
        // X1 - X5: OK
        (uint256 amount0, uint256 amount1) = pair.burn(address(this));
        if (token0 != pair.token0()) {
            (amount0, amount1) = (amount1, amount0);
        }
        emit LogConvert(
            msg.sender,
            token0,
            token1,
            amount0,
            amount1,
            _convertStep(token0, token1, amount0, amount1)
        );
    }

    // F1 - F10: OK
    // C1 - C24: OK
    // All safeTransfer, _swap, _toSPIRIT, _convertStep: X1 - X5: OK
    function _convertStep(
        address token0,
        address token1,
        uint256 amount0,
        uint256 amount1
    ) internal returns (uint256 spiritOut) {
        // Interactions
        if (token0 == token1) {
            uint256 amount = amount0.add(amount1);
            if (token0 == spirit) {
                IERC20(spirit).safeTransfer(dest, amount);
                spiritOut = amount;
            } else if (token0 == wftm) {
                spiritOut = _toSPIRIT(wftm, amount);
            } else {
                address bridge = bridgeFor(token0);
                amount = _swap(token0, bridge, amount, address(this));
                spiritOut = _convertStep(bridge, bridge, amount, 0);
            }
        } else if (token0 == spirit) {
            // eg. SPIRIT - ETH
            IERC20(spirit).safeTransfer(dest, amount0);
            spiritOut = _toSPIRIT(token1, amount1).add(amount0);
        } else if (token1 == spirit) {
            // eg. USDT - SPIRIT
            IERC20(spirit).safeTransfer(dest, amount1);
            spiritOut = _toSPIRIT(token0, amount0).add(amount1);
        } else if (token0 == wftm) {
            // eg. ETH - USDC
            spiritOut = _toSPIRIT(
                wftm,
                _swap(token1, wftm, amount1, address(this)).add(amount0)
            );
        } else if (token1 == wftm) {
            // eg. USDT - ETH
            spiritOut = _toSPIRIT(
                wftm,
                _swap(token0, wftm, amount0, address(this)).add(amount1)
            );
        } else {
            // eg. MIC - USDT
            address bridge0 = bridgeFor(token0);
            address bridge1 = bridgeFor(token1);
            if (bridge0 == token1) {
                // eg. MIC - USDT - and bridgeFor(MIC) = USDT
                spiritOut = _convertStep(
                    bridge0,
                    token1,
                    _swap(token0, bridge0, amount0, address(this)),
                    amount1
                );
            } else if (bridge1 == token0) {
                // eg. WBTC - DSD - and bridgeFor(DSD) = WBTC
                spiritOut = _convertStep(
                    token0,
                    bridge1,
                    amount0,
                    _swap(token1, bridge1, amount1, address(this))
                );
            } else {
                spiritOut = _convertStep(
                    bridge0,
                    bridge1, // eg. USDT - DSD - and bridgeFor(DSD) = WBTC
                    _swap(token0, bridge0, amount0, address(this)),
                    _swap(token1, bridge1, amount1, address(this))
                );
            }
        }
    }

    // F1 - F10: OK
    // C1 - C24: OK
    // All safeTransfer, swap: X1 - X5: OK
    function _swap(
        address fromToken,
        address toToken,
        uint256 amountIn,
        address to
    ) internal returns (uint256 amountOut) {
        // Checks
        // X1 - X5: OK
        IUniswapV2Pair pair = IUniswapV2Pair(
            factory.getPair(fromToken, toToken)
        );
        require(address(pair) != address(0), "SpiritMaker: Cannot convert");

        // Interactions
        // X1 - X5: OK
        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
        uint256 amountInWithFee = amountIn.mul(997);
        if (fromToken == pair.token0()) {
            amountOut =
                amountInWithFee.mul(reserve1) /
                reserve0.mul(1000).add(amountInWithFee);
            IERC20(fromToken).safeTransfer(address(pair), amountIn);
            pair.swap(0, amountOut, to, new bytes(0));
            // TODO: Add maximum slippage?
        } else {
            amountOut =
                amountInWithFee.mul(reserve0) /
                reserve1.mul(1000).add(amountInWithFee);
            IERC20(fromToken).safeTransfer(address(pair), amountIn);
            pair.swap(amountOut, 0, to, new bytes(0));
            // TODO: Add maximum slippage?
        }
    }

    // F1 - F10: OK
    // C1 - C24: OK
    function _toSPIRIT(address token, uint256 amountIn)
        internal
        returns (uint256 amountOut)
    {
        // X1 - X5: OK
        amountOut = _swap(token, spirit, amountIn, dest);
    }
}

File 2 of 8: IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    // EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 3 of 8: IUniswapV2ERC20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

File 4 of 8: IUniswapV2Factory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

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

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}

File 5 of 8: IUniswapV2Pair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

File 6 of 8: Ownable.sol
// SPDX-License-Identifier: MIT
// Audit on 5-Jan-2021 by Keno and BoringCrypto

// P1 - P3: OK
pragma solidity 0.6.12;

// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

// T1 - T4: OK
contract OwnableData {
    // V1 - V5: OK
    address public owner;
    // V1 - V5: OK
    address public pendingOwner;
}

// T1 - T4: OK
contract Ownable is OwnableData {
    // E1: OK
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() internal {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function transferOwnership(
        address newOwner,
        bool direct,
        bool renounce
    ) public onlyOwner {
        if (direct) {
            // Checks
            require(
                newOwner != address(0) || renounce,
                "Ownable: zero address"
            );

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    // F1 - F9: OK
    // C1 - C21: OK
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;

        // Checks
        require(
            msg.sender == _pendingOwner,
            "Ownable: caller != pending owner"
        );

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    // M1 - M5: OK
    // C1 - C21: OK
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

File 7 of 8: SafeERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./IERC20.sol";

library SafeERC20 {
    function safeSymbol(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(0x95d89b41)
        );
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeName(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(0x06fdde03)
        );
        return success && data.length > 0 ? abi.decode(data, (string)) : "???";
    }

    function safeDecimals(IERC20 token) public view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(
            abi.encodeWithSelector(0x313ce567)
        );
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(0xa9059cbb, to, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "SafeERC20: Transfer failed"
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(0x23b872dd, from, address(this), amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "SafeERC20: TransferFrom failed"
        );
    }
}

File 8 of 8: SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require((c = a + b) >= b, "SafeMath: Add Overflow");
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require((c = a - b) <= a, "SafeMath: Underflow");
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require(b == 0 || (c = a * b) / b == a, "SafeMath: Mul Overflow");
    }

    function to128(uint256 a) internal pure returns (uint128 c) {
        require(a <= uint128(-1), "SafeMath: uint128 Overflow");
        c = uint128(a);
    }
}

library SafeMath128 {
    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
        require((c = a + b) >= b, "SafeMath: Add Overflow");
    }

    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
        require((c = a - b) <= a, "SafeMath: Underflow");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_dest","type":"address"},{"internalType":"address","name":"_spirit","type":"address"},{"internalType":"address","name":"_wftm","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"bridge","type":"address"}],"name":"LogBridgeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"server","type":"address"},{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSPIRIT","type":"uint256"}],"name":"LogConvert","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"bridgeFor","outputs":[{"internalType":"address","name":"bridge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"name":"convert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"token0","type":"address[]"},{"internalType":"address[]","name":"token1","type":"address[]"}],"name":"convertMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dest","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61010060405234801561001157600080fd5b506040516125453803806125458339818101604052608081101561003457600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050505060805160601c60a05160601c60c05160601c60e05160601c6122b861028d60003980610aa15280610d11528061158d52806115e452806118095280611860528061188952806118cb5280611922528061194b525080610a4a52806114c6528061153f528061164552806116be528061172752806117a05280611b09525080610941528061151d528061169c528061177e5280611b2b525080610de95280610e355280611b5c52506122b86000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80639d22ae8c116100665780639d22ae8c1461023f578063a761a939146102a3578063bd1b820c14610311578063c45a015514610375578063e30c3978146103a95761009e565b8063078dfbe7146100a3578063303e6aa4146100ff5780634e71e0c8146101cd57806384b366dc146101d75780638da5cb5b1461020b575b600080fd5b6100fd600480360360608110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291908035151590602001909291905050506103dd565b005b6101cb6004803603604081101561011557600080fd5b810190808035906020019064010000000081111561013257600080fd5b82018360208201111561014457600080fd5b8035906020019184602083028401116401000000008311171561016657600080fd5b90919293919293908035906020019064010000000081111561018757600080fd5b82018360208201111561019957600080fd5b803590602001918460208302840111640100000000831117156101bb57600080fd5b9091929391929390505050610655565b005b6101d5610778565b005b6101df61093f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610213610963565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102a16004803603604081101561025557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610987565b005b6102e5600480360360208110156102b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c76565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103736004803603604081101561032757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d38565b005b61037d610de7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103b1610e0b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461049e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561060e57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415806104dd5750805b61054f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f776e61626c653a207a65726f2061646472657373000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610650565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5370697269744d616b65723a206d7573742075736520454f410000000000000081525060200191505060405180910390fd5b600084849050905060005b818110156107705761076386868381811061071857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1685858481811061074157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16610e31565b8080600101915050610701565b505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a48576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610af057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015610b2857508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5370697269744d616b65723a20496e76616c696420627269646765000000000081525060200191505060405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f2e103aa707acc565f9a1547341914802b2bfe977fd79c595209f248ae4b0061360405160405180910390a35050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d33577f000000000000000000000000000000000000000000000000000000000000000090505b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5370697269744d616b65723a206d7573742075736520454f410000000000000081525060200191505060405180910390fd5b610de38282610e31565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a4390584846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610ed857600080fd5b505afa158015610eec573d6000803e3d6000fd5b505050506040513d6020811015610f0257600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5370697269744d616b65723a20496e76616c696420706169720000000000000081525060200191505060405180910390fd5b611084818273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561102357600080fd5b505afa158015611037573d6000803e3d6000fd5b505050506040513d602081101561104d57600080fd5b81019080805190602001909291905050508373ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b6000808273ffffffffffffffffffffffffffffffffffffffff166389afcb44306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040805180830381600087803b1580156110ef57600080fd5b505af1158015611103573d6000803e3d6000fd5b505050506040513d604081101561111957600080fd5b810190808051906020019092919080519060200190929190505050915091508273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d60208110156111a857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146111f657808280925081935050505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd06b1d7ed79b664d17472c6f6997b929f1abe463ccccb4e5b6a0038f2f730c15858561126a8b8b8a8a611477565b60405180848152602001838152602001828152602001935050505060405180910390a45050505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106113575780518252602082019150602081019050602083039250611334565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146113b9576040519150601f19603f3d011682016040523d82523d6000602084013e6113be565b606091505b50915091508180156113fe57506000815114806113fd57508080602001905160208110156113eb57600080fd5b81019080805190602001909291905050505b5b611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5361666545524332303a205472616e73666572206661696c656400000000000081525060200191505060405180910390fd5b5050505050565b60008373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116435760006114c28385611a7e90919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141561158b576115837f0000000000000000000000000000000000000000000000000000000000000000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b80915061163d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611610576116097f000000000000000000000000000000000000000000000000000000000000000082611b01565b915061163c565b600061161b87610c76565b905061162987828430611b57565b91506116388182846000611477565b9250505b5b50611a76565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611725576117027f0000000000000000000000000000000000000000000000000000000000000000847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b61171e836117108685611b01565b611a7e90919063ffffffff16565b9050611a75565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611807576117e47f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b611800826117f28786611b01565b611a7e90919063ffffffff16565b9050611a74565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156118c9576118c27f00000000000000000000000000000000000000000000000000000000000000006118bd856118af887f00000000000000000000000000000000000000000000000000000000000000008830611b57565b611a7e90919063ffffffff16565b611b01565b9050611a73565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561198b576119847f000000000000000000000000000000000000000000000000000000000000000061197f84611971897f00000000000000000000000000000000000000000000000000000000000000008930611b57565b611a7e90919063ffffffff16565b611b01565b9050611a72565b600061199686610c76565b905060006119a386610c76565b90508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119f7576119f082876119ea8a868a30611b57565b87611477565b9250611a6f565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a4957611a42878287611a3d8a868a30611b57565b611477565b9250611a6e565b611a6b8282611a5a8a868a30611b57565b611a668a868a30611b57565b611477565b92505b5b50505b5b5b5b5b949350505050565b6000818284019150811015611afb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d6174683a20416464204f766572666c6f770000000000000000000081525060200191505060405180910390fd5b92915050565b6000611b4f837f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000611b57565b905092915050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a4390587876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5370697269744d616b65723a2043616e6e6f7420636f6e76657274000000000081525060200191505060405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d2857600080fd5b505afa158015611d3c573d6000803e3d6000fd5b505050506040513d6060811015611d5257600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000611db36103e5886121ed90919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611dfb57600080fd5b505afa158015611e0f573d6000803e3d6000fd5b505050506040513d6020811015611e2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141561202757611e9081611e826103e8866121ed90919063ffffffff16565b611a7e90919063ffffffff16565b611ea383836121ed90919063ffffffff16565b81611eaa57fe5b049450611ed884888b73ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff1663022c0d9f60008789600067ffffffffffffffff81118015611f1057600080fd5b506040519080825280601f01601f191660200182016040528015611f435781602001600182028036833780820191505090505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611fbb578082015181840152602081019050611fa0565b50505050905090810190601f168015611fe85780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b505050506121e1565b61204e816120406103e8856121ed90919063ffffffff16565b611a7e90919063ffffffff16565b61206184836121ed90919063ffffffff16565b8161206857fe5b04945061209684888b73ffffffffffffffffffffffffffffffffffffffff166112949092919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff1663022c0d9f86600089600067ffffffffffffffff811180156120ce57600080fd5b506040519080825280601f01601f1916602001820160405280156121015781602001600182028036833780820191505090505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561217957808201518184015260208101905061215e565b50505050905090810190601f1680156121a65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050505b50505050949350505050565b60008082148061220a575082828385029250828161220757fe5b04145b61227c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d6174683a204d756c204f766572666c6f770000000000000000000081525060200191505060405180910390fd5b9291505056fea2646970667358221220d8e8c842c9d8e2f353b9141879df19a157f1142c1515f55aeb570cff7230d24964736f6c634300060c0033000000000000000000000000ef45d134b73241eda7703fa787148d9c9f4950b000000000000000000000000018cef75c2b032d7060e9cf96f29adf74a9a17ce60000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ef45d134b73241eda7703fa787148d9c9f4950b000000000000000000000000018cef75c2b032d7060e9cf96f29adf74a9a17ce60000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0xef45d134b73241eda7703fa787148d9c9f4950b0
Arg [1] : _dest (address): 0x18cef75c2b032d7060e9cf96f29adf74a9a17ce6
Arg [2] : _spirit (address): 0x5cc61a78f164885776aa610fb0fe1257df78e59b
Arg [3] : _wftm (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ef45d134b73241eda7703fa787148d9c9f4950b0
Arg [1] : 00000000000000000000000018cef75c2b032d7060e9cf96f29adf74a9a17ce6
Arg [2] : 0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b
Arg [3] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

507:8676:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;782:515:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3449:358:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1346:377:5;;;:::i;:::-;;754:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;344:20:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2048:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1808:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3229:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;634:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;391:27:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;782:515;1826:5;;;;;;;;;;1812:19;;:10;:19;;;1804:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;921:6:::1;917:373;;;1013:1;993:22;;:8;:22;;;;:34;;;;1019:8;993:34;967:117;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;1158:8;1130:37;;1151:5;::::0;::::1;;;;;;;;1130:37;;;;;;;;;;;;1190:8;1182:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;917:373;;;1270:8;1255:12;;:23;;;;;;;;;;;;;;;;;;917:373;782:515:::0;;;:::o;3449:358:0:-;2691:9;2677:23;;:10;:23;;;2669:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3671:11:::1;3685:6;;:13;;3671:27;;3714:9;3709:91;3733:3;3729:1;:7;3709:91;;;3758:30;3767:6;;3774:1;3767:9;;;;;;;;;;;;;;;3778:6;;3785:1;3778:9;;;;;;;;;;;;;;;3758:8;:30::i;:::-;3738:3;;;;;;;3709:91;;;;2741:1;3449:358:::0;;;;:::o;1346:377:5:-;1390:21;1414:12;;;;;;;;;;;1390:36;;1494:13;1480:27;;:10;:27;;;1458:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1633:13;1605:42;;1626:5;;;;;;;;;;1605:42;;;;;;;;;;;;1666:13;1658:5;;:21;;;;;;;;;;;;;;;;;;1713:1;1690:12;;:25;;;;;;;;;;;;;;;;;;1346:377;:::o;754:29:0:-;;;:::o;344:20:5:-;;;;;;;;;;;;:::o;2048:335:0:-;1826:5:5;;;;;;;;;;1812:19;;:10;:19;;;1804:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2178:6:0::1;2169:15;;:5;:15;;;;:32;;;;;2197:4;2188:13;;:5;:13;;;;2169:32;:51;;;;;2214:6;2205:15;;:5;:15;;;;2169:51;2147:128;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;2326:6;2308:8;:15;2317:5;2308:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;2368:6;2348:27;;2361:5;2348:27;;;;;;;;;;;;2048:335:::0;;:::o;1808:190::-;1863:14;1899:8;:15;1908:5;1899:15;;;;;;;;;;;;;;;;;;;;;;;;;1890:24;;1947:1;1929:20;;:6;:20;;;1925:66;;;1975:4;1966:13;;1925:66;1808:190;;;:::o;3229:109::-;2691:9;2677:23;;:10;:23;;;2669:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3306:24:::1;3315:6;3323;3306:8;:24::i;:::-;3229:109:::0;;:::o;634:42::-;;;:::o;391:27:5:-;;;;;;;;;;;;;:::o;3856:879:0:-;3975:19;4012:7;:15;;;4028:6;4036;4012:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3975:69;;4088:1;4063:27;;4071:4;4063:27;;;;4055:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4200:117;4257:4;4277;:14;;;4300:4;4277:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4215:4;4200:34;;;;:117;;;;;:::i;:::-;4353:15;4370;4389:4;:9;;;4407:4;4389:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4352:61;;;;4438:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4428:23;;:6;:23;;;4424:95;;4490:7;4499;4468:39;;;;;;;;4424:95;4605:6;4534:193;;4584:6;4534:193;;4559:10;4534:193;;;4626:7;4648;4670:46;4683:6;4691;4699:7;4708;4670:12;:46::i;:::-;4534:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:879;;;;;:::o;1002:397:6:-;1121:12;1135:17;1164:5;1156:19;;1213:10;1225:2;1229:6;1190:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1120:127;;;;1280:7;:57;;;;;1307:1;1292:4;:11;:16;:44;;;;1323:4;1312:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1292:44;1280:57;1258:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:397;;;;;:::o;4855:2729:0:-;5004:17;5073:6;5063:16;;:6;:16;;;5059:2518;;;5096:14;5113:20;5125:7;5113;:11;;:20;;;;:::i;:::-;5096:37;;5162:6;5152:16;;:6;:16;;;5148:448;;;5189:41;5217:4;5223:6;5196;5189:27;;;;:41;;;;;:::i;:::-;5261:6;5249:18;;5148:448;;;5303:4;5293:14;;:6;:14;;;5289:307;;;5340:23;5350:4;5356:6;5340:9;:23::i;:::-;5328:35;;5289:307;;;5404:14;5421:17;5431:6;5421:9;:17::i;:::-;5404:34;;5466:44;5472:6;5480;5488;5504:4;5466:5;:44::i;:::-;5457:53;;5541:39;5554:6;5562;5570;5578:1;5541:12;:39::i;:::-;5529:51;;5289:307;;5148:448;5059:2518;;;;5627:6;5617:16;;:6;:16;;;5613:1964;;;5683:42;5711:4;5717:7;5690:6;5683:27;;;;:42;;;;;:::i;:::-;5752:39;5783:7;5752:26;5762:6;5770:7;5752:9;:26::i;:::-;:30;;:39;;;;:::i;:::-;5740:51;;5613:1964;;;5823:6;5813:16;;:6;:16;;;5809:1768;;;5880:42;5908:4;5914:7;5887:6;5880:27;;;;:42;;;;;:::i;:::-;5949:39;5980:7;5949:26;5959:6;5967:7;5949:9;:26::i;:::-;:30;;:39;;;;:::i;:::-;5937:51;;5809:1768;;;6020:4;6010:14;;:6;:14;;;6006:1571;;;6084:122;6112:4;6135:56;6183:7;6135:43;6141:6;6149:4;6155:7;6172:4;6135:5;:43::i;:::-;:47;;:56;;;;:::i;:::-;6084:9;:122::i;:::-;6072:134;;6006:1571;;;6238:4;6228:14;;:6;:14;;;6224:1353;;;6302:122;6330:4;6353:56;6401:7;6353:43;6359:6;6367:4;6373:7;6390:4;6353:5;:43::i;:::-;:47;;:56;;;;:::i;:::-;6302:9;:122::i;:::-;6290:134;;6224:1353;;;6488:15;6506:17;6516:6;6506:9;:17::i;:::-;6488:35;;6538:15;6556:17;6566:6;6556:9;:17::i;:::-;6538:35;;6603:6;6592:17;;:7;:17;;;6588:978;;;6705:189;6740:7;6770:6;6799:46;6805:6;6813:7;6822;6839:4;6799:5;:46::i;:::-;6868:7;6705:12;:189::i;:::-;6693:201;;6588:978;;;6931:6;6920:17;;:7;:17;;;6916:650;;;7033:189;7068:6;7097:7;7127;7157:46;7163:6;7171:7;7180;7197:4;7157:5;:46::i;:::-;7033:12;:189::i;:::-;7021:201;;6916:650;;;7275:275;7310:7;7340;7416:46;7422:6;7430:7;7439;7456:4;7416:5;:46::i;:::-;7485;7491:6;7499:7;7508;7525:4;7485:5;:46::i;:::-;7275:12;:275::i;:::-;7263:287;;6916:650;6588:978;6224:1353;;;6006:1571;5809:1768;5613:1964;5059:2518;4855:2729;;;;;;:::o;211:139:7:-;269:9;314:1;308;304;:5;300:9;;;299:16;;291:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;211:139;;;;:::o;8977:203:0:-;9065:17;9136:36;9142:5;9149:6;9157:8;9167:4;9136:5;:36::i;:::-;9124:48;;8977:203;;;;:::o;7678:1249::-;7820:17;7893:19;7944:7;:15;;;7960:9;7971:7;7944:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7893:97;;8034:1;8009:27;;8017:4;8009:27;;;;8001:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8131:16;8149;8171:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8130:59;;;;;;;;;8200:23;8226:17;8239:3;8226:8;:12;;:17;;;;:::i;:::-;8200:43;;8271:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8258:26;;:9;:26;;;8254:666;;;8379:39;8402:15;8379:18;8392:4;8379:8;:12;;:18;;;;:::i;:::-;:22;;:39;;;;:::i;:::-;8330:29;8350:8;8330:15;:19;;:29;;;;:::i;:::-;:88;;;;;;8301:117;;8433:55;8472:4;8479:8;8440:9;8433:30;;;;:55;;;;;:::i;:::-;8503:4;:9;;;8513:1;8516:9;8527:2;8541:1;8531:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8503:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8254:666;;;8699:39;8722:15;8699:18;8712:4;8699:8;:12;;:18;;;;:::i;:::-;:22;;:39;;;;:::i;:::-;8650:29;8670:8;8650:15;:19;;:29;;;;:::i;:::-;:88;;;;;;8621:117;;8753:55;8792:4;8799:8;8760:9;8753:30;;;;:55;;;;;:::i;:::-;8823:4;:9;;;8833;8844:1;8847:2;8861:1;8851:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8823:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8254:666;7678:1249;;;;;;;;;;:::o;502:153:7:-;560:9;595:1;590;:6;:30;;;;619:1;614;609;605;:5;601:9;;;600:15;;;;;;:20;590:30;582:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;502:153;;;;:::o

Swarm Source

ipfs://d8e8c842c9d8e2f353b9141879df19a157f1142c1515f55aeb570cff7230d249
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.