ETH Price: $3,361.21 (-2.16%)

Contract

0x3fBcD724Be54F0A66232C3c87141c7A00E12cba8
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Multi Path Swap123161582021-04-26 13:14:241310 days ago1619442864IN
Atomic Blue: Proxy
0 ETH0.0193916257
Multi Path Swap123159992021-04-26 12:46:331310 days ago1619441193IN
Atomic Blue: Proxy
0 ETH0.0181035954.5
Multi Path Swap123159892021-04-26 12:44:071310 days ago1619441047IN
Atomic Blue: Proxy
0 ETH0.0183106942
Multi Path Swap123159842021-04-26 12:43:211310 days ago1619441001IN
Atomic Blue: Proxy
0 ETH0.0170797260
Swap123158962021-04-26 12:23:141310 days ago1619439794IN
Atomic Blue: Proxy
0 ETH0.007489250
Multi Path Swap123158832021-04-26 12:19:141310 days ago1619439554IN
Atomic Blue: Proxy
0 ETH0.0102502841
Multi Path Swap123158182021-04-26 12:06:401310 days ago1619438800IN
Atomic Blue: Proxy
0 ETH0.0167389852.3
Multi Path Swap123157592021-04-26 11:54:591310 days ago1619438099IN
Atomic Blue: Proxy
0 ETH0.0190631745
Multi Path Swap123155382021-04-26 11:05:291310 days ago1619435129IN
Atomic Blue: Proxy
0 ETH0.0103111443
Multi Path Swap ...123155092021-04-26 11:00:391310 days ago1619434839IN
Atomic Blue: Proxy
0 ETH0.0162225261
Multi Path Swap123154952021-04-26 10:58:211310 days ago1619434701IN
Atomic Blue: Proxy
0 ETH0.0137044644
Multi Path Swap123154912021-04-26 10:57:171310 days ago1619434637IN
Atomic Blue: Proxy
0 ETH0.0121829647
Multi Path Swap123154762021-04-26 10:53:431310 days ago1619434423IN
Atomic Blue: Proxy
0 ETH0.0182396745
Multi Path Swap123154062021-04-26 10:36:301310 days ago1619433390IN
Atomic Blue: Proxy
0 ETH0.0283274688
Multi Path Swap123154042021-04-26 10:36:061310 days ago1619433366IN
Atomic Blue: Proxy
0 ETH0.0209196778
Multi Path Swap123153972021-04-26 10:35:051310 days ago1619433305IN
Atomic Blue: Proxy
0 ETH0.0199015588
Multi Path Swap123151612021-04-26 9:42:281310 days ago1619430148IN
Atomic Blue: Proxy
0 ETH0.0125780257.9
Multi Path Swap123151232021-04-26 9:32:531310 days ago1619429573IN
Atomic Blue: Proxy
0 ETH0.0322301358
Swap123151022021-04-26 9:28:141310 days ago1619429294IN
Atomic Blue: Proxy
0 ETH0.0126459756
Multi Path Swap123150412021-04-26 9:14:031310 days ago1619428443IN
Atomic Blue: Proxy
0 ETH0.0216691757
Multi Path Swap123149992021-04-26 9:07:051310 days ago1619428025IN
Atomic Blue: Proxy
0 ETH0.0160459755
Multi Path Swap123149882021-04-26 9:04:101310 days ago1619427850IN
Atomic Blue: Proxy
0 ETH0.0206787688
Multi Path Swap123149182021-04-26 8:48:251310 days ago1619426905IN
Atomic Blue: Proxy
0 ETH0.0151152550
Multi Path Swap123149142021-04-26 8:47:191310 days ago1619426839IN
Atomic Blue: Proxy
0 ETH0.0226833757
Multi Path Swap123147722021-04-26 8:15:011310 days ago1619424901IN
Atomic Blue: Proxy
0 ETH0.0198814257.1
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
123144422021-04-26 6:56:321310 days ago1619420192
Atomic Blue: Proxy
4.1 ETH
123142372021-04-26 6:12:451310 days ago1619417565
Atomic Blue: Proxy
4 ETH
122917242021-04-22 18:52:561314 days ago1619117576
Atomic Blue: Proxy
1.29 ETH
122814662021-04-21 4:34:501315 days ago1618979690
Atomic Blue: Proxy
0.4 ETH
122791752021-04-20 20:16:361316 days ago1618949796
Atomic Blue: Proxy
8 ETH
122612752021-04-18 2:00:151319 days ago1618711215
Atomic Blue: Proxy
45 ETH
122565902021-04-17 8:43:071319 days ago1618648987
Atomic Blue: Proxy
3 ETH
122565882021-04-17 8:43:001319 days ago1618648980
Atomic Blue: Proxy
3 ETH
122565832021-04-17 8:41:251319 days ago1618648885
Atomic Blue: Proxy
4 ETH
122551872021-04-17 3:32:451320 days ago1618630365
Atomic Blue: Proxy
25 ETH
122494702021-04-16 6:29:311320 days ago1618554571
Atomic Blue: Proxy
1 ETH
122494552021-04-16 6:26:471320 days ago1618554407
Atomic Blue: Proxy
5.9 ETH
122260832021-04-12 15:39:081324 days ago1618241948
Atomic Blue: Proxy
5 ETH
122219082021-04-12 0:09:001325 days ago1618186140
Atomic Blue: Proxy
100 ETH
122192932021-04-11 14:56:431325 days ago1618153003
Atomic Blue: Proxy
20.01784532 ETH
122179682021-04-11 10:03:161325 days ago1618135396
Atomic Blue: Proxy
9.4 ETH
122177512021-04-11 9:15:521325 days ago1618132552
Atomic Blue: Proxy
0.01 ETH
122177492021-04-11 9:15:371325 days ago1618132537
Atomic Blue: Proxy
0.01 ETH
122177492021-04-11 9:15:371325 days ago1618132537
Atomic Blue: Proxy
0.01 ETH
122177492021-04-11 9:15:371325 days ago1618132537
Atomic Blue: Proxy
0.01 ETH
122177452021-04-11 9:14:271325 days ago1618132467
Atomic Blue: Proxy
0.01 ETH
122177442021-04-11 9:14:221325 days ago1618132462
Atomic Blue: Proxy
0.01 ETH
122177392021-04-11 9:13:121325 days ago1618132392
Atomic Blue: Proxy
0.01 ETH
122177322021-04-11 9:11:231325 days ago1618132283
Atomic Blue: Proxy
0.01 ETH
122177302021-04-11 9:10:331325 days ago1618132233
Atomic Blue: Proxy
0.01 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AtomicTokenProxy

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-12
*/

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

contract AtomicTypes{
    struct SwapParams{
        Token sellToken; 
        uint256 input;
        Token buyToken;
        uint minOutput;
    }
    
    struct DistributionParams{
        IAtomicExchange[] exchangeModules;
        bytes[] exchangeData;
        uint256[] chunks;
    }
    
    event Trade(
        address indexed sellToken,
        uint256 sellAmount,
        address indexed buyToken,
        uint256 buyAmount,
        address indexed trader,
        address receiver
    );
}

contract AtomicUtils{    
    // ETH and its wrappers
    address constant WETHAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IWETH constant WETH = IWETH(WETHAddress);
    Token constant ETH = Token(address(0));
    address constant EEEAddress = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    Token constant EEE = Token(EEEAddress);
    
    // Universal function to query this contracts balance, supporting  and Token
    function balanceOf(Token token) internal view returns(uint balance){
        if(isETH(token)){
            return address(this).balance;
        }else{
            return token.balanceOf(address(this));
        }
    }
    
    // Universal send function, supporting ETH and Token
    function send(Token token, address payable recipient, uint amount) internal {
        if(isETH(token)){
            require(
                recipient.send(amount),
                "Sending of ETH failed."
            );
        }else{
            Token(token).transfer(recipient, amount);
            require(
                validateOptionalERC20Return(),
                "ERC20 token transfer failed."
            );
        }
    }
    
    // Universal function to claim tokens from msg.sender
    function claimTokenFromSenderTo(Token _token, uint _amount, address _receiver) internal {
        if (isETH(_token)) {
            require(msg.value == _amount);
            // dont forward ETH
        }else{
            require(msg.value  == 0);
            _token.transferFrom(msg.sender, _receiver, _amount);
        }
    }
    
    // Token approval function supporting non-compliant tokens
    function approve(Token _token, address _spender, uint _amount) internal {
        if (!isETH(_token)) {
            _token.approve(_spender, _amount);
            require(
                validateOptionalERC20Return(),
                "ERC20 approval failed."
            );
        }
    }
    
    // Validate return data of non-compliant erc20s
    function validateOptionalERC20Return() pure internal returns (bool){
        uint256 success = 0;

        assembly {
            switch returndatasize()             // Check the number of bytes the token contract returned
            case 0 {                            // Nothing returned, but contract did not throw > assume our transfer succeeded
                success := 1
            }
            case 32 {                           // 32 bytes returned, result is the returned bool
                returndatacopy(0, 0, 32)
                success := mload(0)
            }
        }

        return success != 0;
    }

    function isETH(Token token) pure internal  returns (bool){
        if(
            address(token) == address(0)
            || address(token) == EEEAddress
        ){
            return true;
        }else{
            return false;
        }
    }

    function isWETH(Token token) pure internal  returns (bool){
        if(address(token) == WETHAddress){
            return true;
        }else{
            return false;
        }
    }
    
    // Source: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol
    function sliceBytes(
        bytes memory _bytes,
        uint256 _start,
        uint256 _length
    )
    internal
    pure
    returns (bytes memory)
    {
        require(_bytes.length >= (_start + _length), "Read out of bounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
                tempBytes := mload(0x40)

            // The first word of the slice result is potentially a partial
            // word read from the original array. To read it, we calculate
            // the length of that partial word and start copying that many
            // bytes into the array. The first word we copy will start with
            // data we don't care about, but the last `lengthmod` bytes will
            // land at the beginning of the contents of the new array. When
            // we're done copying, we overwrite the full first word with
            // the actual length of the slice.
                let lengthmod := and(_length, 31)

            // The multiplication in the next line is necessary
            // because when slicing multiples of 32 bytes (lengthmod == 0)
            // the following copy loop was copying the origin's length
            // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                // The multiplication in the next line has the same exact purpose
                // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

            //update free-memory pointer
            //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }
}

contract AtomicModuleRegistry {
    address moduleRegistrar;
    mapping(address => bool) public isModule;
    
    constructor () public {
        moduleRegistrar = msg.sender;
    }

    modifier onlyRegistrar() {
        require(moduleRegistrar == msg.sender, "caller is not moduleRegistrar");
        _;
    }
    
    function setNewRegistrar(address newRegistrar) public virtual onlyRegistrar {
        moduleRegistrar = newRegistrar;
    }
    
    function registerModule(address module, bool status) public virtual onlyRegistrar {
        isModule[module] = status;
    }
}

abstract contract IAtomicExchange is AtomicTypes{
    function swap(
        SwapParams memory _swap,
        bytes memory data
    )  external payable virtual returns(
        uint output
    );
}

contract AtomicBlue is AtomicUtils, AtomicTypes, AtomicModuleRegistry{
    // IMPORTANT NOTICE:
    // NEVER set a token allowance to this contract, as everybody can do arbitrary calls from it.
    // When swapping tokens always go through AtomicTokenProxy.
    // This contract assumes token to swap has already been transfered to it when being called. Ether can be sent directly with the call.

    // perform a distributed swap and transfer outcome to _receipient
    function swapAndSend(
        SwapParams memory _swap,
        
        DistributionParams memory _distribution,
        
        address payable _receipient
    ) public payable returns (uint _output){
        // execute swaps on behalf of trader
        _output = doDistributedSwap(_swap, _distribution);

        // check if output of swap is sufficient        
        require(_output >= _swap.minOutput, "Slippage limit exceeded.");
        
        // send swap output to receipient
        send(_swap.buyToken, _receipient, _output);
        
        emit Trade(
            address(_swap.sellToken),
            _swap.input,
            address(_swap.buyToken),
            _output,
            msg.sender,
            _receipient
        );
    }
    
    function multiPathSwapAndSend(
        SwapParams memory _swap,
        
        Token[] calldata _path,
        
        DistributionParams[] memory _distribution,
        
        address payable _receipient
    ) public payable returns (uint _output){
        // verify path
        require(
            _path[0] == _swap.sellToken
            && _path[_path.length - 1] == _swap.buyToken
            && _path.length >= 2
        );
        
        // execute swaps on behalf of trader
        _output = _swap.input;
        for(uint i = 1; i < _path.length; i++){
            _output = doDistributedSwap(SwapParams({
                sellToken : _path[i - 1],
                input     : _output,      // output of last swap is input for this one
                buyToken  : _path[i],
                minOutput : 0            // we check the total outcome in the end
            }), _distribution[i - 1]);
        }

        // check if output of swap is sufficient        
        require(_output >= _swap.minOutput, "Slippage limit exceeded.");
        
        // send swap output to sender
        send(_swap.buyToken, _receipient, _output);
        
        emit Trade(
            address(_swap.sellToken),
            _swap.input,
            address(_swap.buyToken),
            _output,
            msg.sender,
            _receipient
        );
    }
    
    
    // internal function to perform a distributed swap
    function doDistributedSwap(
        SwapParams memory _swap,
        
        DistributionParams memory _distribution
    ) internal returns(uint){
        
        // count totalChunks
        uint totalChunks = 0;
        for(uint i = 0; i < _distribution.chunks.length; i++){
            totalChunks += _distribution.chunks[i];   
        }
        
        // route trades to the different exchanges
        for(uint i = 0; i < _distribution.exchangeModules.length; i++){
            IAtomicExchange exchange = _distribution.exchangeModules[i];
            
            uint thisInput = _swap.input * _distribution.chunks[i] / totalChunks;
            
            if(address(exchange) == address(0)){
                // trade is not using an exchange module but a direct call
                (address target, uint value, bytes memory callData) = abi.decode(_distribution.exchangeData[i], (address, uint, bytes));
                
                (bool success, bytes memory data) = address(target).call.value(value)(callData);
            
                require(success, "Exchange call reverted.");
            }else{
                // delegate call to the exchange module
                require(isModule[address(exchange)], "unknown exchangeModule");
                (bool success, bytes memory data) = address(exchange).delegatecall(
                    abi.encodePacked(// This encodes the function to call and the parameters we are passing to the settlement function
                        exchange.swap.selector, 
                        abi.encode(
                            SwapParams({
                                sellToken : _swap.sellToken,
                                input     : thisInput,
                                buyToken  : _swap.buyToken,
                                minOutput : 1 // we are checking the combined output in the end
                            }),
                            _distribution.exchangeData[i]
                        )
                    )
                );
            
                require(success, "Exchange module reverted.");
            }
        }
        
        return balanceOf(_swap.buyToken);
    }
    
    // perform a distributed swap
    function swap(
        SwapParams memory _swap,
        DistributionParams memory _distribution
    ) public payable returns (uint _output){
        return swapAndSend(_swap, _distribution, msg.sender);
    }
    
    // perform a multi-path distributed swap
    function multiPathSwap(
        SwapParams memory _swap,
        Token[] calldata _path,
        DistributionParams[] memory _distribution
    ) public payable returns (uint _output){
        return multiPathSwapAndSend(_swap, _path, _distribution, msg.sender);
    }

    // allow ETH receivals
    receive() external payable {}
}

contract AtomicTokenProxy is AtomicUtils, AtomicTypes{
    AtomicBlue constant atomic = AtomicBlue(0xAc7E32eB5ceC7eB7B6B43A305B64d1d3487b97A0);

    // perform a distributed swap and transfer outcome to _receipient
    function swapAndSend(
        SwapParams calldata _swap,
        
        DistributionParams calldata _distribution,
        
        address payable _receipient
    ) public payable returns (uint _output){
        // deposit tokens to executor
        claimTokenFromSenderTo(_swap.sellToken, _swap.input, address(atomic));
        
        // execute swaps on behalf of sender
        _output = atomic.swapAndSend.value(msg.value)(_swap, _distribution, _receipient);
    }
    
    // perform a multi-path distributed swap and transfer outcome to _receipient
    function multiPathSwapAndSend(
        SwapParams calldata _swap,
        
        Token[] calldata _path,
        
        DistributionParams[] calldata _distribution,
        
        address payable _receipient
    ) public payable returns (uint _output){
        // deposit tokens to executor
        claimTokenFromSenderTo(_swap.sellToken, _swap.input, address(atomic));
        
        // execute swaps on behalf of sender
        _output = atomic.multiPathSwapAndSend.value(msg.value)(
            _swap,
            _path,
            _distribution,
            _receipient
        );
    }
    
    // perform a distributed swap
    function swap(
        SwapParams calldata _swap,
        DistributionParams calldata _distribution
    ) public payable returns (uint _output){
        return swapAndSend(_swap, _distribution, msg.sender);
    }
    
    // perform a distributed swap and burn optimal gastoken amount afterwards
    function swapWithGasTokens(
        SwapParams calldata _swap,
        DistributionParams calldata _distribution,
        IGasToken _gasToken,
        uint _gasQtyPerToken
    ) public payable returns (uint _output){
        uint startGas = gasleft();
        _output = swapAndSend(_swap, _distribution, msg.sender);
        _gasToken.freeFromUpTo(msg.sender, (startGas - gasleft() + 25000) / _gasQtyPerToken);
    }
    
    // perform a multi-path distributed swap
    function multiPathSwap(
        SwapParams calldata _swap,
        Token[] calldata _path,
        DistributionParams[] calldata _distribution
    ) public payable returns (uint _output){
        return multiPathSwapAndSend(_swap, _path, _distribution, msg.sender);
    }
    
    // perform a multi-path distributed swap and burn optimal gastoken amount afterwards
    function multiPathSwapWithGasTokens(
        SwapParams calldata _swap,
        Token[] calldata _path,
        DistributionParams[] calldata _distribution,
        IGasToken _gasToken,
        uint _gasQtyPerToken
    ) public payable returns (uint _output){
        uint startGas = gasleft();
        _output = multiPathSwapAndSend(_swap, _path, _distribution, msg.sender);
        _gasToken.freeFromUpTo(msg.sender, (startGas - gasleft() + 25000) / _gasQtyPerToken);
    }
    
    // perform a distributed swap, send outcome to _receipient and burn optimal gastoken amount afterwards
    function swapAndSendWithGasTokens(
        SwapParams calldata _swap,
        DistributionParams calldata _distribution,
        address payable _receipient,
        IGasToken _gasToken,
        uint _gasQtyPerToken
    ) public payable returns (uint _output){
        uint startGas = gasleft();
        _output = swapAndSend(_swap, _distribution, _receipient);
        _gasToken.freeFromUpTo(msg.sender, (startGas - gasleft() + 25000) / _gasQtyPerToken);
    }
    
    // perform a multi-path distributed swap, send outcome to _receipient and burn optimal gastoken amount afterwards
    function multiPathSwapAndSendWithGasTokens(
        SwapParams calldata _swap,
        Token[] calldata _path,
        DistributionParams[] calldata _distribution,
        address payable _receipient,
        IGasToken _gasToken,
        uint _gasQtyPerToken
    ) public payable returns (uint _output){
        uint startGas = gasleft();
        _output = multiPathSwapAndSend(_swap, _path, _distribution, _receipient);
        _gasToken.freeFromUpTo(msg.sender, (startGas - gasleft() + 25000) / _gasQtyPerToken);
    }
}

// Interfaces

contract Token {
    function totalSupply() view public returns (uint256 supply) {}

    function balanceOf(address _owner) view public returns (uint256 balance) {}

    function transfer(address _to, uint256 _value) public {}

    function transferFrom(address _from, address _to, uint256 _value)  public {}

    function approve(address _spender, uint256 _value) public {}

    function allowance(address _owner, address _spender) view public returns (uint256 remaining) {}

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    uint256 public decimals;
    string public name;
}

contract IWETH is Token {
    function deposit() public payable {}

    function withdraw(uint256 amount) public {}
}

contract IGasToken {
    function freeUpTo(uint256 value) public returns (uint256) {
    }

    function free(uint256 value) public returns (uint256) {
    }
    
    function freeFrom(address from, uint256 value) public returns (uint256) {
    }

    function freeFromUpTo(address from, uint256 value) public returns (uint256) {
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"sellAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Trade","type":"event"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"internalType":"contract Token[]","name":"_path","type":"address[]"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams[]","name":"_distribution","type":"tuple[]"}],"name":"multiPathSwap","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"internalType":"contract Token[]","name":"_path","type":"address[]"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams[]","name":"_distribution","type":"tuple[]"},{"internalType":"address payable","name":"_receipient","type":"address"}],"name":"multiPathSwapAndSend","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"internalType":"contract Token[]","name":"_path","type":"address[]"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams[]","name":"_distribution","type":"tuple[]"},{"internalType":"address payable","name":"_receipient","type":"address"},{"internalType":"contract IGasToken","name":"_gasToken","type":"address"},{"internalType":"uint256","name":"_gasQtyPerToken","type":"uint256"}],"name":"multiPathSwapAndSendWithGasTokens","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"internalType":"contract Token[]","name":"_path","type":"address[]"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams[]","name":"_distribution","type":"tuple[]"},{"internalType":"contract IGasToken","name":"_gasToken","type":"address"},{"internalType":"uint256","name":"_gasQtyPerToken","type":"uint256"}],"name":"multiPathSwapWithGasTokens","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams","name":"_distribution","type":"tuple"}],"name":"swap","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams","name":"_distribution","type":"tuple"},{"internalType":"address payable","name":"_receipient","type":"address"}],"name":"swapAndSend","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams","name":"_distribution","type":"tuple"},{"internalType":"address payable","name":"_receipient","type":"address"},{"internalType":"contract IGasToken","name":"_gasToken","type":"address"},{"internalType":"uint256","name":"_gasQtyPerToken","type":"uint256"}],"name":"swapAndSendWithGasTokens","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"contract Token","name":"sellToken","type":"address"},{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"contract Token","name":"buyToken","type":"address"},{"internalType":"uint256","name":"minOutput","type":"uint256"}],"internalType":"struct AtomicTypes.SwapParams","name":"_swap","type":"tuple"},{"components":[{"internalType":"contract IAtomicExchange[]","name":"exchangeModules","type":"address[]"},{"internalType":"bytes[]","name":"exchangeData","type":"bytes[]"},{"internalType":"uint256[]","name":"chunks","type":"uint256[]"}],"internalType":"struct AtomicTypes.DistributionParams","name":"_distribution","type":"tuple"},{"internalType":"contract IGasToken","name":"_gasToken","type":"address"},{"internalType":"uint256","name":"_gasQtyPerToken","type":"uint256"}],"name":"swapWithGasTokens","outputs":[{"internalType":"uint256","name":"_output","type":"uint256"}],"stateMutability":"payable","type":"function"}]

608060405234801561001057600080fd5b50610ed3806100206000396000f3fe60806040526004361061007b5760003560e01c8063b11456bd1161004e578063b11456bd146100e2578063b965c75f146100f5578063bbf6c9f114610108578063d35db4141461011b5761007b565b806333a2901e1461008057806375804f6d146100a9578063898196f1146100bc57806398933bec146100cf575b600080fd5b61009361008e3660046109da565b61012e565b6040516100a09190610e34565b60405180910390f35b6100936100b7366004610ab6565b6101f6565b6100936100ca3660046108f0565b6102a2565b6100936100dd3660046107af565b610354565b6100936100f0366004610730565b610425565b610093610103366004610840565b61043f565b61009361011636600461098d565b6104f2565b610093610129366004610a3b565b610508565b600061015f610140602086018661070d565b856020013573ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a06105b5565b6040516319d1480f60e11b815273ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a0906333a2901e90349061019c90889088908890600401610dfc565b6020604051808303818588803b1580156101b557600080fd5b505af11580156101c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906101ee9190610b1d565b949350505050565b6000805a905061020786863361012e565b9150836001600160a01b031663079d229f33855a85036161a8018161022857fe5b046040518363ffffffff1660e01b8152600401610246929190610d17565b602060405180830381600087803b15801561026057600080fd5b505af1158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610b1d565b5050949350505050565b6000805a90506102b6898989898933610354565b9150836001600160a01b031663079d229f33855a85036161a801816102d757fe5b046040518363ffffffff1660e01b81526004016102f5929190610d17565b602060405180830381600087803b15801561030f57600080fd5b505af1158015610323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103479190610b1d565b5050979650505050505050565b6000610385610366602089018961070d565b886020013573ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a06105b5565b604051632624cefb60e21b815273ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a0906398933bec9034906103c8908b908b908b908b908b908b90600401610d30565b6020604051808303818588803b1580156103e157600080fd5b505af11580156103f5573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061041a9190610b1d565b979650505050505050565b6000610435868686868633610354565b9695505050505050565b6000805a90506104538a8a8a8a8a8a610354565b9150836001600160a01b031663079d229f33855a85036161a8018161047457fe5b046040518363ffffffff1660e01b8152600401610492929190610d17565b602060405180830381600087803b1580156104ac57600080fd5b505af11580156104c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e49190610b1d565b505098975050505050505050565b60006104ff83833361012e565b90505b92915050565b6000805a905061051987878761012e565b9150836001600160a01b031663079d229f33855a85036161a8018161053a57fe5b046040518363ffffffff1660e01b8152600401610558929190610d17565b602060405180830381600087803b15801561057257600080fd5b505af1158015610586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105aa9190610b1d565b505095945050505050565b6105be83610647565b156105d4578134146105cf57600080fd5b610642565b34156105df57600080fd5b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061060f90339085908790600401610cf3565b600060405180830381600087803b15801561062957600080fd5b505af115801561063d573d6000803e3d6000fd5b505050505b505050565b60006001600160a01b038216158061067b57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156106885750600161068c565b5060005b919050565b60008083601f8401126106a2578182fd5b50813567ffffffffffffffff8111156106b9578182fd5b60208301915083602080830285010111156106d357600080fd5b9250929050565b803561050281610e85565b6000606082840312156106f6578081fd5b50919050565b6000608082840312156106f6578081fd5b60006020828403121561071e578081fd5b813561072981610e85565b9392505050565b600080600080600060c08688031215610747578081fd5b61075187876106fc565b9450608086013567ffffffffffffffff8082111561076d578283fd5b61077989838a01610691565b909650945060a0880135915080821115610791578283fd5b5061079e88828901610691565b969995985093965092949392505050565b60008060008060008060e087890312156107c7578081fd5b6107d188886106fc565b9550608087013567ffffffffffffffff808211156107ed578283fd5b6107f98a838b01610691565b909750955060a0890135915080821115610811578283fd5b5061081e89828a01610691565b90945092505060c087013561083281610e85565b809150509295509295509295565b600080600080600080600080610120898b03121561085c578182fd5b6108668a8a6106fc565b9750608089013567ffffffffffffffff80821115610882578384fd5b61088e8c838d01610691565b909950975060a08b01359150808211156108a6578384fd5b506108b38b828c01610691565b90965094505060c08901356108c781610e85565b925060e08901356108d781610e85565b8092505061010089013590509295985092959890939650565b6000806000806000806000610100888a03121561090b578283fd5b61091589896106fc565b9650608088013567ffffffffffffffff80821115610931578485fd5b61093d8b838c01610691565b909850965060a08a0135915080821115610955578485fd5b506109628a828b01610691565b90955093505060c088013561097681610e85565b8092505060e0880135905092959891949750929550565b60008060a0838503121561099f578182fd5b6109a984846106fc565b9150608083013567ffffffffffffffff8111156109c4578182fd5b6109d0858286016106e5565b9150509250929050565b600080600060c084860312156109ee578283fd5b6109f885856106fc565b9250608084013567ffffffffffffffff811115610a13578283fd5b610a1f868287016106e5565b92505060a0840135610a3081610e85565b809150509250925092565b60008060008060006101008688031215610a53578081fd5b610a5d87876106fc565b9450608086013567ffffffffffffffff811115610a78578182fd5b610a84888289016106e5565b94505060a0860135610a9581610e85565b925060c0860135610aa581610e85565b9497939650919460e0013592915050565b60008060008060e08587031215610acb578182fd5b610ad586866106fc565b9350608085013567ffffffffffffffff811115610af0578283fd5b610afc878288016106e5565b93505060a0850135610b0d81610e85565b9396929550929360c00135925050565b600060208284031215610b2e578081fd5b5051919050565b6001600160a01b0316815260200190565b6001600160a01b03169052565b81835260006001600160fb1b03831115610b6b578081fd5b6020830280836020870137939093016020019283525090919050565b600060608301610b978384610e3d565b6060865291829052908290608086015b81831015610bd85760208435610bbc81610e85565b6001600160a01b03168252938401936001939093019201610ba7565b60209350610be884870187610e3d565b888303868a0152808352935091508381018484028201850183875b86811015610c7e57601f19808685030185528235601e19883603018112610c28578a8bfd5b8701803567ffffffffffffffff811115610c40578b8cfd5b803603891315610c4e578b8cfd5b808652808b83018c8801378581018b018c9052958a0195601f019091169093018801925090870190600101610c03565b5050610c8d6040890189610e3d565b9650945088810360408a0152610ca4818787610b53565b9998505050505050505050565b8035610cbc81610e85565b6001600160a01b03908116835260208281013590840152604082013590610ce282610e85565b166040830152606090810135910152565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060e08201610d40838a610cb1565b60e0608084015280610d528883610e34565b9050889150825b88811015610d855760208301610d7883610d7383876106da565b610b35565b9093509150600101610d59565b5083810360a0850152858152602080820192508087028201810188855b89811015610de657848303601f190186528135368c9003605e19018112610dc7578788fd5b610dd3848d8301610b87565b9685019693505090830190600101610da2565b50508094505050505061041a60c0830184610b46565b6000610e088286610cb1565b60c06080830152610e1c60c0830185610b87565b905060018060a01b03831660a0830152949350505050565b90815260200190565b6000808335601e19843603018112610e53578283fd5b830160208101925035905067ffffffffffffffff811115610e7357600080fd5b6020810236038313156106d357600080fd5b6001600160a01b0381168114610e9a57600080fd5b5056fea2646970667358221220353750a65747dce9ce88b45a9e5cb9f4d1f1f715e945a5a422c6fa2f2287a2b264736f6c634300060c0033

Deployed Bytecode

0x60806040526004361061007b5760003560e01c8063b11456bd1161004e578063b11456bd146100e2578063b965c75f146100f5578063bbf6c9f114610108578063d35db4141461011b5761007b565b806333a2901e1461008057806375804f6d146100a9578063898196f1146100bc57806398933bec146100cf575b600080fd5b61009361008e3660046109da565b61012e565b6040516100a09190610e34565b60405180910390f35b6100936100b7366004610ab6565b6101f6565b6100936100ca3660046108f0565b6102a2565b6100936100dd3660046107af565b610354565b6100936100f0366004610730565b610425565b610093610103366004610840565b61043f565b61009361011636600461098d565b6104f2565b610093610129366004610a3b565b610508565b600061015f610140602086018661070d565b856020013573ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a06105b5565b6040516319d1480f60e11b815273ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a0906333a2901e90349061019c90889088908890600401610dfc565b6020604051808303818588803b1580156101b557600080fd5b505af11580156101c9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906101ee9190610b1d565b949350505050565b6000805a905061020786863361012e565b9150836001600160a01b031663079d229f33855a85036161a8018161022857fe5b046040518363ffffffff1660e01b8152600401610246929190610d17565b602060405180830381600087803b15801561026057600080fd5b505af1158015610274573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102989190610b1d565b5050949350505050565b6000805a90506102b6898989898933610354565b9150836001600160a01b031663079d229f33855a85036161a801816102d757fe5b046040518363ffffffff1660e01b81526004016102f5929190610d17565b602060405180830381600087803b15801561030f57600080fd5b505af1158015610323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103479190610b1d565b5050979650505050505050565b6000610385610366602089018961070d565b886020013573ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a06105b5565b604051632624cefb60e21b815273ac7e32eb5cec7eb7b6b43a305b64d1d3487b97a0906398933bec9034906103c8908b908b908b908b908b908b90600401610d30565b6020604051808303818588803b1580156103e157600080fd5b505af11580156103f5573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061041a9190610b1d565b979650505050505050565b6000610435868686868633610354565b9695505050505050565b6000805a90506104538a8a8a8a8a8a610354565b9150836001600160a01b031663079d229f33855a85036161a8018161047457fe5b046040518363ffffffff1660e01b8152600401610492929190610d17565b602060405180830381600087803b1580156104ac57600080fd5b505af11580156104c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e49190610b1d565b505098975050505050505050565b60006104ff83833361012e565b90505b92915050565b6000805a905061051987878761012e565b9150836001600160a01b031663079d229f33855a85036161a8018161053a57fe5b046040518363ffffffff1660e01b8152600401610558929190610d17565b602060405180830381600087803b15801561057257600080fd5b505af1158015610586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105aa9190610b1d565b505095945050505050565b6105be83610647565b156105d4578134146105cf57600080fd5b610642565b34156105df57600080fd5b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061060f90339085908790600401610cf3565b600060405180830381600087803b15801561062957600080fd5b505af115801561063d573d6000803e3d6000fd5b505050505b505050565b60006001600160a01b038216158061067b57506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156106885750600161068c565b5060005b919050565b60008083601f8401126106a2578182fd5b50813567ffffffffffffffff8111156106b9578182fd5b60208301915083602080830285010111156106d357600080fd5b9250929050565b803561050281610e85565b6000606082840312156106f6578081fd5b50919050565b6000608082840312156106f6578081fd5b60006020828403121561071e578081fd5b813561072981610e85565b9392505050565b600080600080600060c08688031215610747578081fd5b61075187876106fc565b9450608086013567ffffffffffffffff8082111561076d578283fd5b61077989838a01610691565b909650945060a0880135915080821115610791578283fd5b5061079e88828901610691565b969995985093965092949392505050565b60008060008060008060e087890312156107c7578081fd5b6107d188886106fc565b9550608087013567ffffffffffffffff808211156107ed578283fd5b6107f98a838b01610691565b909750955060a0890135915080821115610811578283fd5b5061081e89828a01610691565b90945092505060c087013561083281610e85565b809150509295509295509295565b600080600080600080600080610120898b03121561085c578182fd5b6108668a8a6106fc565b9750608089013567ffffffffffffffff80821115610882578384fd5b61088e8c838d01610691565b909950975060a08b01359150808211156108a6578384fd5b506108b38b828c01610691565b90965094505060c08901356108c781610e85565b925060e08901356108d781610e85565b8092505061010089013590509295985092959890939650565b6000806000806000806000610100888a03121561090b578283fd5b61091589896106fc565b9650608088013567ffffffffffffffff80821115610931578485fd5b61093d8b838c01610691565b909850965060a08a0135915080821115610955578485fd5b506109628a828b01610691565b90955093505060c088013561097681610e85565b8092505060e0880135905092959891949750929550565b60008060a0838503121561099f578182fd5b6109a984846106fc565b9150608083013567ffffffffffffffff8111156109c4578182fd5b6109d0858286016106e5565b9150509250929050565b600080600060c084860312156109ee578283fd5b6109f885856106fc565b9250608084013567ffffffffffffffff811115610a13578283fd5b610a1f868287016106e5565b92505060a0840135610a3081610e85565b809150509250925092565b60008060008060006101008688031215610a53578081fd5b610a5d87876106fc565b9450608086013567ffffffffffffffff811115610a78578182fd5b610a84888289016106e5565b94505060a0860135610a9581610e85565b925060c0860135610aa581610e85565b9497939650919460e0013592915050565b60008060008060e08587031215610acb578182fd5b610ad586866106fc565b9350608085013567ffffffffffffffff811115610af0578283fd5b610afc878288016106e5565b93505060a0850135610b0d81610e85565b9396929550929360c00135925050565b600060208284031215610b2e578081fd5b5051919050565b6001600160a01b0316815260200190565b6001600160a01b03169052565b81835260006001600160fb1b03831115610b6b578081fd5b6020830280836020870137939093016020019283525090919050565b600060608301610b978384610e3d565b6060865291829052908290608086015b81831015610bd85760208435610bbc81610e85565b6001600160a01b03168252938401936001939093019201610ba7565b60209350610be884870187610e3d565b888303868a0152808352935091508381018484028201850183875b86811015610c7e57601f19808685030185528235601e19883603018112610c28578a8bfd5b8701803567ffffffffffffffff811115610c40578b8cfd5b803603891315610c4e578b8cfd5b808652808b83018c8801378581018b018c9052958a0195601f019091169093018801925090870190600101610c03565b5050610c8d6040890189610e3d565b9650945088810360408a0152610ca4818787610b53565b9998505050505050505050565b8035610cbc81610e85565b6001600160a01b03908116835260208281013590840152604082013590610ce282610e85565b166040830152606090810135910152565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b600060e08201610d40838a610cb1565b60e0608084015280610d528883610e34565b9050889150825b88811015610d855760208301610d7883610d7383876106da565b610b35565b9093509150600101610d59565b5083810360a0850152858152602080820192508087028201810188855b89811015610de657848303601f190186528135368c9003605e19018112610dc7578788fd5b610dd3848d8301610b87565b9685019693505090830190600101610da2565b50508094505050505061041a60c0830184610b46565b6000610e088286610cb1565b60c06080830152610e1c60c0830185610b87565b905060018060a01b03831660a0830152949350505050565b90815260200190565b6000808335601e19843603018112610e53578283fd5b830160208101925035905067ffffffffffffffff811115610e7357600080fd5b6020810236038313156106d357600080fd5b6001600160a01b0381168114610e9a57600080fd5b5056fea2646970667358221220353750a65747dce9ce88b45a9e5cb9f4d1f1f715e945a5a422c6fa2f2287a2b264736f6c634300060c0033

Deployed Bytecode Sourcemap

12853:4378:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13076:485;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14628:425;;;;;;:::i;:::-;;:::i;15490:485::-;;;;;;:::i;:::-;;:::i;13655:618::-;;;;;;:::i;:::-;;:::i;15111:277::-;;;;;;:::i;:::-;;:::i;16697:531::-;;;;;;:::i;:::-;;:::i;14320:217::-;;;;;;:::i;:::-;;:::i;16095:471::-;;;;;;:::i;:::-;;:::i;13076:485::-;13274:12;13337:69;13360:15;;;;:5;:15;:::i;:::-;13377:5;:11;;;12953:42;13337:22;:69::i;:::-;13483:70;;-1:-1:-1;;;13483:70:0;;12953:42;;13483:18;;13508:9;;13483:70;;13519:5;;13526:13;;13541:11;;13483:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13473:80;13076:485;-1:-1:-1;;;;13076:485:0:o;14628:425::-;14835:12;14859:13;14875:9;14859:25;;14905:45;14917:5;14924:13;14939:10;14905:11;:45::i;:::-;14895:55;;14961:9;-1:-1:-1;;;;;14961:22:0;;14984:10;15029:15;15008:9;14997:8;:20;15020:5;14997:28;14996:48;;;;;;14961:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14628:425;;;;;;;:::o;15490:485::-;15741:12;15765:13;15781:9;15765:25;;15811:61;15832:5;15839;;15846:13;;15861:10;15811:20;:61::i;:::-;15801:71;;15883:9;-1:-1:-1;;;;;15883:22:0;;15906:10;15951:15;15930:9;15919:8;:20;15942:5;15919:28;15918:48;;;;;;15883:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15490:485;;;;;;;;;;:::o;13655:618::-;13907:12;13970:69;13993:15;;;;:5;:15;:::i;:::-;14010:5;:11;;;12953:42;13970:22;:69::i;:::-;14116:149;;-1:-1:-1;;;14116:149:0;;12953:42;;14116:27;;14150:9;;14116:149;;14175:5;;14195;;;;14215:13;;;;14243:11;;14116:149;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14106:159;13655:618;-1:-1:-1;;;;;;;13655:618:0:o;15111:277::-;15288:12;15319:61;15340:5;15347;;15354:13;;15369:10;15319:20;:61::i;:::-;15312:68;15111:277;-1:-1:-1;;;;;;15111:277:0:o;16697:531::-;16993:12;17017:13;17033:9;17017:25;;17063:62;17084:5;17091;;17098:13;;17113:11;17063:20;:62::i;:::-;17053:72;;17136:9;-1:-1:-1;;;;;17136:22:0;;17159:10;17204:15;17183:9;17172:8;:20;17195:5;17172:28;17171:48;;;;;;17136:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16697:531;;;;;;;;;;;:::o;14320:217::-;14453:12;14484:45;14496:5;14503:13;14518:10;14484:11;:45::i;:::-;14477:52;;14320:217;;;;;:::o;16095:471::-;16347:12;16371:13;16387:9;16371:25;;16417:46;16429:5;16436:13;16451:11;16417;:46::i;:::-;16407:56;;16474:9;-1:-1:-1;;;;;16474:22:0;;16497:10;16542:15;16521:9;16510:8;:20;16533:5;16510:28;16509:48;;;;;;16474:84;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16095:471;;;;;;;;:::o;1845:335::-;1948:13;1954:6;1948:5;:13::i;:::-;1944:229;;;1999:7;1986:9;:20;1978:29;;;;;;1944:229;;;2079:9;:15;2071:24;;;;;;2110:51;;-1:-1:-1;;;2110:51:0;;-1:-1:-1;;;;;2110:19:0;;;;;:51;;2130:10;;2142:9;;2153:7;;2110:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1944:229;1845:335;;;:::o;3270:257::-;3322:4;-1:-1:-1;;;;;3355:28:0;;;;:73;;-1:-1:-1;;;;;;3400:28:0;;850:42;3400:28;3355:73;3338:182;;;-1:-1:-1;3461:4:0;3454:11;;3338:182;-1:-1:-1;3503:5:0;3338:182;3270:257;;;:::o;183:366:-1:-;;;327:3;320:4;312:6;308:17;304:27;294:2;;-1:-1;;335:12;294:2;-1:-1;365:20;;405:18;394:30;;391:2;;;-1:-1;;427:12;391:2;471:4;463:6;459:17;447:29;;522:3;471:4;;506:6;502:17;463:6;488:32;;485:41;482:2;;;539:1;;529:12;482:2;287:262;;;;;:::o;1357:158::-;1438:20;;1463:47;1438:20;1463:47;:::i;1568:167::-;;1688:2;1679:6;1674:3;1670:16;1666:25;1663:2;;;-1:-1;;1694:12;1663:2;-1:-1;1714:15;1656:79;-1:-1;1656:79::o;1780:160::-;;1892:3;1883:6;1878:3;1874:16;1870:26;1867:2;;;-1:-1;;1899:12;2225:269;;2343:2;2331:9;2322:7;2318:23;2314:32;2311:2;;;-1:-1;;2349:12;2311:2;1451:6;1438:20;1463:47;1504:5;1463:47;:::i;:::-;2401:77;2305:189;-1:-1;;;2305:189::o;2501:962::-;;;;;;2787:3;2775:9;2766:7;2762:23;2758:33;2755:2;;;-1:-1;;2794:12;2755:2;2856:81;2929:7;2905:22;2856:81;:::i;:::-;2846:91;;3002:3;2991:9;2987:19;2974:33;3027:18;;3019:6;3016:30;3013:2;;;-1:-1;;3049:12;3013:2;3087:94;3173:7;3164:6;3153:9;3149:22;3087:94;:::i;:::-;3069:112;;-1:-1;3069:112;-1:-1;3246:3;3231:19;;3218:33;;-1:-1;3260:30;;;3257:2;;;-1:-1;;3293:12;3257:2;;3331:116;3439:7;3430:6;3419:9;3415:22;3331:116;:::i;:::-;2749:714;;;;-1:-1;2749:714;;-1:-1;3313:134;;;2749:714;-1:-1;;;2749:714::o;3470:1104::-;;;;;;;3781:3;3769:9;3760:7;3756:23;3752:33;3749:2;;;-1:-1;;3788:12;3749:2;3850:81;3923:7;3899:22;3850:81;:::i;:::-;3840:91;;3996:3;3985:9;3981:19;3968:33;4021:18;;4013:6;4010:30;4007:2;;;-1:-1;;4043:12;4007:2;4081:94;4167:7;4158:6;4147:9;4143:22;4081:94;:::i;:::-;4063:112;;-1:-1;4063:112;-1:-1;4240:3;4225:19;;4212:33;;-1:-1;4254:30;;;4251:2;;;-1:-1;;4287:12;4251:2;;4325:116;4433:7;4424:6;4413:9;4409:22;4325:116;:::i;:::-;4307:134;;-1:-1;4307:134;-1:-1;;4478:3;4526:22;;80:20;105:41;80:20;105:41;:::i;:::-;4487:71;;;;3743:831;;;;;;;;:::o;4581:1392::-;;;;;;;;;4944:3;4932:9;4923:7;4919:23;4915:33;4912:2;;;-1:-1;;4951:12;4912:2;5013:81;5086:7;5062:22;5013:81;:::i;:::-;5003:91;;5159:3;5148:9;5144:19;5131:33;5184:18;;5176:6;5173:30;5170:2;;;-1:-1;;5206:12;5170:2;5244:94;5330:7;5321:6;5310:9;5306:22;5244:94;:::i;:::-;5226:112;;-1:-1;5226:112;-1:-1;5403:3;5388:19;;5375:33;;-1:-1;5417:30;;;5414:2;;;-1:-1;;5450:12;5414:2;;5488:116;5596:7;5587:6;5576:9;5572:22;5488:116;:::i;:::-;5470:134;;-1:-1;5470:134;-1:-1;;5641:3;5689:22;;80:20;105:41;80:20;105:41;:::i;:::-;5650:71;-1:-1;5758:3;5816:22;;1269:20;1294:51;1269:20;1294:51;:::i;:::-;5767:81;;;;5885:3;5929:9;5925:22;2014:20;5894:63;;4906:1067;;;;;;;;;;;:::o;5980:1250::-;;;;;;;;6318:3;6306:9;6297:7;6293:23;6289:33;6286:2;;;-1:-1;;6325:12;6286:2;6387:81;6460:7;6436:22;6387:81;:::i;:::-;6377:91;;6533:3;6522:9;6518:19;6505:33;6558:18;;6550:6;6547:30;6544:2;;;-1:-1;;6580:12;6544:2;6618:94;6704:7;6695:6;6684:9;6680:22;6618:94;:::i;:::-;6600:112;;-1:-1;6600:112;-1:-1;6777:3;6762:19;;6749:33;;-1:-1;6791:30;;;6788:2;;;-1:-1;;6824:12;6788:2;;6862:116;6970:7;6961:6;6950:9;6946:22;6862:116;:::i;:::-;6844:134;;-1:-1;6844:134;-1:-1;;7015:3;7073:22;;1269:20;1294:51;1269:20;1294:51;:::i;:::-;7024:81;;;;7142:3;7186:9;7182:22;2014:20;7151:63;;6280:950;;;;;;;;;;:::o;7237:582::-;;;7422:3;7410:9;7401:7;7397:23;7393:33;7390:2;;;-1:-1;;7429:12;7390:2;7491:81;7564:7;7540:22;7491:81;:::i;:::-;7481:91;;7637:3;7626:9;7622:19;7609:33;7662:18;7654:6;7651:30;7648:2;;;-1:-1;;7684:12;7648:2;7714:89;7795:7;7786:6;7775:9;7771:22;7714:89;:::i;:::-;7704:99;;;7384:435;;;;;:::o;7826:724::-;;;;8036:3;8024:9;8015:7;8011:23;8007:33;8004:2;;;-1:-1;;8043:12;8004:2;8105:81;8178:7;8154:22;8105:81;:::i;:::-;8095:91;;8251:3;8240:9;8236:19;8223:33;8276:18;8268:6;8265:30;8262:2;;;-1:-1;;8298:12;8262:2;8328:89;8409:7;8400:6;8389:9;8385:22;8328:89;:::i;:::-;8318:99;;;8454:3;8506:9;8502:22;80:20;105:41;140:5;105:41;:::i;:::-;8463:71;;;;7998:552;;;;;:::o;8557:1012::-;;;;;;8819:3;8807:9;8798:7;8794:23;8790:33;8787:2;;;-1:-1;;8826:12;8787:2;8888:81;8961:7;8937:22;8888:81;:::i;:::-;8878:91;;9034:3;9023:9;9019:19;9006:33;9059:18;9051:6;9048:30;9045:2;;;-1:-1;;9081:12;9045:2;9111:89;9192:7;9183:6;9172:9;9168:22;9111:89;:::i;:::-;9101:99;;;9237:3;9289:9;9285:22;80:20;105:41;140:5;105:41;:::i;:::-;9246:71;-1:-1;9354:3;9412:22;;1269:20;1294:51;1269:20;1294:51;:::i;:::-;8781:788;;;;-1:-1;8781:788;;9481:3;9521:22;2014:20;;8781:788;-1:-1;;8781:788::o;9576:870::-;;;;;9813:3;9801:9;9792:7;9788:23;9784:33;9781:2;;;-1:-1;;9820:12;9781:2;9882:81;9955:7;9931:22;9882:81;:::i;:::-;9872:91;;10028:3;10017:9;10013:19;10000:33;10053:18;10045:6;10042:30;10039:2;;;-1:-1;;10075:12;10039:2;10105:89;10186:7;10177:6;10166:9;10162:22;10105:89;:::i;:::-;10095:99;;;10231:3;10293:9;10289:22;1269:20;1294:51;1339:5;1294:51;:::i;:::-;9775:671;;;;-1:-1;10240:81;;10358:3;10398:22;2014:20;;-1:-1;;9775:671::o;10453:263::-;;10568:2;10556:9;10547:7;10543:23;10539:32;10536:2;;;-1:-1;;10574:12;10536:2;-1:-1;2162:13;;10530:186;-1:-1;10530:186::o;11170:201::-;-1:-1;;;;;29885:54;16723:73;;11360:4;11351:14;;11264:107::o;11830:137::-;-1:-1;;;;;29885:54;11917:45;;11911:56::o;15876:447::-;25369:19;;;15876:447;-1:-1;;;;;16104:78;;16101:2;;;-1:-1;;16185:12;16101:2;25418:4;16220:6;16216:17;31088:6;31083:3;25418:4;25413:3;25409:14;31065:30;31126:16;;;;25418:4;31126:16;31119:27;;;-1:-1;31126:16;;15998:325;-1:-1;15998:325::o;17044:1327::-;;17205:4;17200:3;17196:14;17296:100;17379:16;17372:5;17296:100;:::i;:::-;17205:4;17409:38;;25369:19;;;;13443:21;-1:-1;;25409:14;;;13470:360;13495:6;13492:1;13489:13;13470:360;;;25418:4;1104:6;1091:20;1116:56;1166:5;1116:56;:::i;:::-;-1:-1;;;;;29885:54;11917:45;;28638:12;;;;405:18;13510:9;;;;;11141:14;13470:360;;;25418:4;;;17694:88;25418:4;17769:5;17765:16;17758:5;17694:88;:::i;:::-;17818:14;;;17802;;;17795:38;25369:19;;;17660:122;-1:-1;17660:122;-1:-1;25409:14;;;12423:17;;;12414:27;;;;17660:122;-1:-1;12564:433;12589:6;12586:1;12583:13;12564:433;;;12641:20;;;25413:3;12645:4;12641:20;;12636:3;12629:33;28106:3;28093:17;28150:48;;28174:8;28158:14;28154:29;28150:48;28130:18;28126:73;28116:2;;-1:-1;;28203:12;28116:2;28232:33;;28287:19;;28357:18;28346:30;;28343:2;;;-1:-1;;28379:12;28343:2;28436:17;28158:14;28416:38;28406:8;28402:53;28399:2;;;-1:-1;;28458:12;28399:2;25381:6;25376:3;25369:19;31088:6;25418:4;28325:5;28321:16;25418:4;25413:3;25409:14;31065:30;31126:16;;;;;31119:27;;;12976:14;;;;31248:2;31228:14;31224:28;;;16586:39;;;;;;-1:-1;24810:14;;;;13517:1;12604:9;12564:433;;;12568:14;;18071:77;18142:4;18135:5;18131:16;18124:5;18071:77;:::i;:::-;18037:111;;;;18194:3;18188:4;18184:14;18142:4;18172:3;18168:14;18161:38;18214:119;18328:4;18314:12;18300;18214:119;:::i;:::-;18355:11;17178:1193;-1:-1;;;;;;;;;17178:1193::o;19876:967::-;1451:6;1438:20;1463:47;1504:5;1463:47;:::i;:::-;-1:-1;;;;;29885:54;;;16723:73;;28803:2;28794:12;;;2014:20;20408:14;;;20911:37;20547:4;20536:16;;1438:20;;1463:47;1438:20;1463:47;:::i;:::-;29885:54;20547:4;20621:14;;16723:73;28794:12;;;;2014:20;20807:14;;20911:37;19996:847::o;21080:460::-;-1:-1;;;;;29885:54;;;11760:58;;29885:54;;;;21443:2;21428:18;;11917:45;21526:2;21511:18;;20911:37;;;;21271:2;21256:18;;21242:298::o;21547:349::-;-1:-1;;;;;29885:54;;;;11760:58;;21882:2;21867:18;;20911:37;21710:2;21695:18;;21681:215::o;21903:1203::-;;22388:3;22377:9;22373:19;22403:125;22510:17;22501:6;22403:125;:::i;:::-;22388:3;22561;22550:9;22546:19;22539:49;22602:132;14066:86;14145:6;14140:3;14066:86;:::i;:::-;14059:93;;14251:21;;;-1:-1;14278:333;14303:6;14300:1;14297:13;14278:333;;;28803:2;14413:6;28794:12;14434:77;14507:3;28754:53;28794:12;14413:6;28754:53;:::i;:::-;14434:77;:::i;:::-;14518:86;;-1:-1;14427:84;-1:-1;14325:1;14318:9;14278:333;;;-1:-1;22773:20;;;22767:3;22752:19;;22745:49;25369:19;;;28803:2;25409:14;;;;-1:-1;15129:17;;;15120:27;;;;15268:21;-1:-1;15295:503;15320:6;15317:1;15314:13;15295:503;;;15372:20;;;-1:-1;;15372:20;15360:33;;28950:17;;29015:14;29011:29;;;-1:-1;;29007:48;28983:73;;28973:2;;-1:-1;;29060:12;28973:2;11551:116;11663:3;29113:8;29093:18;29089:33;11551:116;:::i;:::-;15777:14;;;;15506:142;-1:-1;;24810:14;;;;14325:1;15335:9;15295:503;;;15299:14;;22800:196;;;;;;;23007:89;23091:3;23080:9;23076:19;23067:6;23007:89;:::i;23113:775::-;;23451:125;23558:17;23549:6;23451:125;:::i;:::-;23436:3;23609;23598:9;23594:19;23587:49;23650:128;23436:3;23425:9;23421:19;23764:6;23650:128;:::i;:::-;23642:136;;405:18;;29896:42;;;29350:5;29885:54;23873:3;23862:9;23858:19;11917:45;23407:481;;;;;;:::o;23895:222::-;20911:37;;;24022:2;24007:18;;23993:124::o;26370:528::-;;;26521:3;26508:17;28150:48;;26589:8;26573:14;26569:29;26565:48;26545:18;26541:73;26531:2;;-1:-1;;26618:12;26531:2;26647:33;;26604:4;26736:16;;;-1:-1;26702:19;;-1:-1;26772:18;26761:30;;26758:2;;;26804:1;;26794:12;26758:2;26604:4;26855:6;26851:17;26573:14;26831:38;26821:8;26817:53;26814:2;;;26883:1;;26873:12;31265:133;-1:-1;;;;;29885:54;;31332:43;;31322:2;;31389:1;;31379:12;31322:2;31316:82;:::o

Swarm Source

ipfs://353750a65747dce9ce88b45a9e5cb9f4d1f1f715e945a5a422c6fa2f2287a2b2

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.