Contract 0x23a13973655da144c53472f2ec7dc6616ab9ab0a 15

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xede1c0cf6483c34bf781b5be0ea231b7f910b0ef34171030f09edcf85f1b5624Multisend Token106478412023-10-13 10:17:3455 days 5 hrs ago0xc4c52dc841fae8b44759bab72c7a36a9e6554cc9 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO6.520185697833 4,645.770579453
0xa2fffb920347b7b900c9e4de773af56d909a5e93279e1ba1d847e7a2c6bc2e44Multisend Token106478412023-10-13 10:17:3455 days 5 hrs ago0xc4c52dc841fae8b44759bab72c7a36a9e6554cc9 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO35.6412880041 4,645.770579453
0xf0a5c3a09ae49061d3d86cc9b045e5bda44f20839c13b6920b9aa4d2661a4beeMultisend Token105323202023-10-05 20:59:4562 days 19 hrs ago0xc4c52dc841fae8b44759bab72c7a36a9e6554cc9 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO3.945452266715 4,650.98863935
0xa50093535fc953a4f392843ab79be0f7f20bf20a132f8d07b190542b0fb99679Multisend Token105323192023-10-05 20:59:3962 days 19 hrs ago0xc4c52dc841fae8b44759bab72c7a36a9e6554cc9 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO34.249466618455 4,650.988668719
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903Multisend Ether101398522023-09-10 6:32:1588 days 9 hrs agoCrotama: Deployer IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a154,231 CRO4.346476975282 4,668.816752706
0x134367698103f00448b4ef85a576b396a1b03b60b073dffe3c4418eeff042c1fMultisend Token84475622023-05-22 19:10:14198 days 20 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO3.337521286003 4,746.089440646
0x98b82729341056426f24b1e1fe76086a868e9441c7dd0ff376d1928e3fe34606Multisend Token78940772023-04-16 13:19:48235 days 2 hrs ago0x38f8d523e7115edc783e3b783d93d8a678354d51 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.321114247777 4,771.535961402
0xda33e2cac217c7f4db09491e0e724d866e27faf3e7cefb224e1097a4db3667f0Multisend Token78838512023-04-15 21:16:52235 days 18 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.880618756915 4,772.005554299
0x0534da47579d94b82804cf88c6c016499c2e0554741e2db65b16bc5aac616559Multisend Token77767002023-04-08 21:07:34242 days 18 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO22.708154793009 4,776.931120987
0xa2cf49ddd1c9f53f549bc5f8a365b45955a3388ecbb8fa5c6c5e9edbad06d877Multisend Token77685432023-04-08 8:19:57243 days 7 hrs ago0x838f2e76cd04e94638af3d6237f1c1799ea839f4 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO0.967432409593 4,777.019374049
0x3790f3584adbb9efc25694ff0166cebb77a5893c42310e37bcb13a810651e143Multisend Token77502532023-04-07 3:37:56244 days 12 hrs ago0x838f2e76cd04e94638af3d6237f1c1799ea839f4 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.236223011244 4,778.153597054
0x4e65c06e1a08e14e2f76a8b7cb32c6da52159dc04f698c9eee8f1d9b8489da89Multisend Ether76692002023-04-01 20:23:59249 days 19 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a10,345.8501314 CRO1.286426270064 4,781.880485406
0x265f5706dd4f50e24f96a9292ff9d663661d6efe58d67b0404b6e58eccb52ebdMultisend Token74040202023-03-15 12:19:06267 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.048075958379 4,794.028188166
0x992386d848b4efe975e0ea2594847a7acfdec2d87c5148c82dbf820c5923148aMultisend Token74040072023-03-15 12:17:52267 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.37836476184 4,794.028742094
0xe74e985a115f436d66adf0f3cd5e8a9d142f75c1d5eaf1b2912abad69130b10eMultisend Token74039152023-03-15 12:09:12267 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO5.615063819047 4,794.032943168
0xedf8520b4ae41e291ef9cf2009c4af623fcf126f32781093f6d1d96764f1ba0fMultisend Token74038972023-03-15 12:07:31267 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO3.297672004987 4,794.033763629
0x0159443f5a608eb82d3e53aa5bd71eb587cd604252e7775b7eedb0b3544ff39eMultisend Token74038892023-03-15 12:06:46267 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO91.086647610687 4,794.034084773
0x25df5a96ba8ea28019a2f07f5a23df27b450595445779ea3798beab98bb3c5b9Multisend Token74038192023-03-15 12:00:10267 days 4 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO91.086708096389 4,794.037268231
0x5d02624604182bebd4578b860c8241d33bd7907ecc8726ebc0cab07f071827ceMultisend Token68586162023-02-07 20:21:01302 days 19 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.949310406835 4,817.549018814
0xe94d869d613b5d98d7ee2815ac429277b44145853c73648bb7cc5fba1a9cab44Multisend Token67061922023-01-28 20:51:54312 days 19 hrs ago0x43f2de85222a6c1fad109d0831a12f7209514124 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO24.406139658673 4,824.558665648
0xfe9afbdefdc83956b9e761139cccddb086068c82d33d4375b959da0f585f7b8bMultisend Token67061892023-01-28 20:51:37312 days 19 hrs ago0x43f2de85222a6c1fad109d0831a12f7209514124 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO50.189262618665 4,824.558779847
0x36c29b0ffd47270f844eb61a7854df91faf1b26cf64482daa0848b11dab363a3Multisend Token66843522023-01-27 10:27:04314 days 5 hrs ago0xb329a3ed0b4ff79ab4ce82b0851eec63846afdb7 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.074073877441 4,825.563291588
0x81ee821eec59e8acbcf0655bb80ea296a59b59b8eb9ee4904f9583b1dca1b27fMultisend Token65221592023-01-16 18:58:14324 days 21 hrs ago0x770acbf0a2fe9091756a94ecb898a519c96aa72d IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO19.109971000293 4,832.945972158
0x8aeef5faa0d228a18d4ba6682bcc9775065c971707084b2d6ba55520cd131058Multisend Token64884752023-01-14 14:05:39327 days 2 hrs agoCrolon Mars: Deployer IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO51.277006817933 4,835.470474319
0xd54c0afc277038958e721665e210774faeef8bfe253ad6166cbd63dac6814105Multisend Token64884702023-01-14 14:05:11327 days 2 hrs agoCrolon Mars: Deployer IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO55.71904639892 4,835.470676206
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x6d3431a6c9315d75a9dc35aeb2420d96415e36e21 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x303b941d751f65d715f1beeafce7213895ee5ed22 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x4eff16ce216d227c05fd08bfa8b335991742e5b610 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x95f793f8fe8634469852031fef7c793005b3d7dc13 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x42069a1d0fd0f41d6b3cf933414bec64200a3da118 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x0e7cbfad82990406bec8c5a342a2981e371c243327 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x488cd19663edb68dc8d36c354b6e745a49f011a430 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xd4e322695ba0a8432a1577a5539e7c57415543b739 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x67c340812ed301f8c765a775627b71d79cdd1e9a41 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x2b717e793d0c70f70643026ab487dc2dcdcd054b49 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x54f7b5c0638db594211d99d830c2324f488b34bf53 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x146f7e4de40eeca95ff997203b29532c3f3b8caa57 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x160bf2873e6c377a51b7091a63c75bde9cf38bba81 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x7e780ce63622257fcab99799b29055f44fb7ddf487 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x308c8edd419945e2564bac9bf6f5b963b67a2e8990 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x6aa70c674104d8cbd70d8535bd1e69d08fd37880100 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xc2726df2067e8a82577447560f846855390b7f3b126 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x259b3d7313190186111bfd672f7cb4f11f6860f0126 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x38f17b02fbfd4a7941426441811c4fd904334715128 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x5ffbb14b532a042723ff1268e52f00f1fadfdadc134 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x4055a244be93716aa7191adc37a868d31f29d43b138 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x2f4417f22e6d767cdf9c85fda8d633271f621c51163 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x71b11138fd927a7bb59df9edb2d3642a7cf7fd9e176 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0aCronos ID Name degenfren.cro178 CRO
0xa841a67bb9603c77e67be82cd53f17477feb3b19ca8702080b15f9119645e903101398522023-09-10 6:32:1588 days 9 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x645c181fa77fa024c7a33a290b1f58274e446de8232 CRO
[ Download CSV Export 
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PinkMultisend

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : PinkMultisend.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

interface IPinkMultisend {
    function multisendToken(
        address token,
        bool ensureExactAmount,
        address[] calldata targets,
        uint256[] calldata amounts
    ) external payable;

    function multisendEther(
        address[] calldata targets,
        uint256[] calldata amounts
    ) external payable;
}

contract PinkMultisend is Ownable, IPinkMultisend {
    using SafeERC20 for IERC20;

    event Multisent(address token, uint256 total);

    receive() external payable {
        revert();
    }

    function multisendToken(
        address token,
        bool ensureExactAmount,
        address[] calldata targets,
        uint256[] calldata amounts
    ) external payable override {
        if (token == address(0)) {
            multisendEther(targets, amounts);
        } else {
            require(targets.length == amounts.length, "Length mismatched");
            IERC20 erc20 = IERC20(token);
            uint256 total = 0;

            // In case people want to make sure they transfer the exact
            // amount of tokens to the recipients (for example, an owner
            // might forget excluding this contract from the transfer fee
            // deduction), use this option as a safeguard
            function(
                IERC20,
                address,
                address,
                uint256
            ) transfer = ensureExactAmount
                    ? _safeTransferFromEnsureExactAmount
                    : _safeTransferFrom;

            for (uint256 i = 0; i < targets.length; i++) {
                total += amounts[i];
                transfer(erc20, msg.sender, targets[i], amounts[i]);
            }

            emit Multisent(token, total);
        }
    }

    function multisendEther(
        address[] calldata targets,
        uint256[] calldata amounts
    ) public payable override {
        require(targets.length == amounts.length, "Length mismatched");

        uint256 total;
        for (uint256 i = 0; i < targets.length; i++) {
            total += amounts[i];
            payable(targets[i]).transfer(amounts[i]);
        }

        // In case someone tries to claim the ether inside the contract
        // by sending a higher sum of total amount than msg.value
        require(total == msg.value, "Total mismatched");

        emit Multisent(address(0), total);
    }

    function withdrawWronglySentEther(address to) external onlyOwner {
        payable(to).transfer(address(this).balance);
    }

    function withdrawWronglySentToken(address token, address to)
        external
        onlyOwner
    {
        IERC20(token).safeTransfer(to, IERC20(token).balanceOf(address(this)));
    }

    function _safeTransferFromEnsureExactAmount(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) private {
        uint256 balanceBefore = token.balanceOf(to);
        token.safeTransferFrom(from, to, amount);
        require(
            token.balanceOf(to) - balanceBefore == (from != to ? amount : 0), // if from is the same as to, the final balance should be the same as before the transfer
            "Not enough tokens were transfered, check tax and fee options or try setting ensureExactAmount to false"
        );
    }

    function _safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) private {
        token.safeTransferFrom(from, to, amount);
    }
}

File 2 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

File 3 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

File 4 of 6 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

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

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

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

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

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

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

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

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

File 5 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 6 of 6 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"Multisent","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":"targets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multisendEther","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"ensureExactAmount","type":"bool"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multisendToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawWronglySentEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawWronglySentToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610efb8061007e6000396000f3fe6080604052600436106100745760003560e01c80638da5cb5b1161004e5780638da5cb5b146100cd578063ab883d28146100f9578063c2321a6e1461010c578063f2fde38b1461012c57600080fd5b8063284523af14610083578063540d497814610098578063715018a6146100b857600080fd5b3661007e57600080fd5b600080fd5b610096610091366004610c7a565b61014c565b005b3480156100a457600080fd5b506100966100b3366004610c2e565b6102d6565b3480156100c457600080fd5b50610096610339565b3480156100d957600080fd5b50600054604080516001600160a01b039092168252519081900360200190f35b610096610107366004610d0a565b61036f565b34801561011857600080fd5b50610096610127366004610c48565b61051c565b34801561013857600080fd5b50610096610147366004610c2e565b6105d4565b6001600160a01b03861661016b576101668484848461036f565b6102ce565b8281146101b35760405162461bcd60e51b815260206004820152601160248201527013195b99dd1a081b5a5cdb585d18da1959607a1b60448201526064015b60405180910390fd5b856000610bb2876101c65761066f6101ca565b61068a5b905060005b86811015610287578585828181106101f757634e487b7160e01b600052603260045260246000fd5b90506020020135836102099190610e2b565b925061027584338a8a8581811061023057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906102459190610c2e565b89898681811061026557634e487b7160e01b600052603260045260246000fd5b905060200201358663ffffffff16565b8061027f81610e86565b9150506101cf565b50604080516001600160a01b038b168152602081018490527f5877a06a1eac9fc2d9048726981d1495bf51a77dc70b27a04b3ece333b4dd486910160405180910390a15050505b505050505050565b6000546001600160a01b031633146103005760405162461bcd60e51b81526004016101aa90610df6565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610335573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146103635760405162461bcd60e51b81526004016101aa90610df6565b61036d6000610876565b565b8281146103b25760405162461bcd60e51b815260206004820152601160248201527013195b99dd1a081b5a5cdb585d18da1959607a1b60448201526064016101aa565b6000805b84811015610498578383828181106103de57634e487b7160e01b600052603260045260246000fd5b90506020020135826103f09190610e2b565b915085858281811061041257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104279190610c2e565b6001600160a01b03166108fc85858481811061045357634e487b7160e01b600052603260045260246000fd5b905060200201359081150290604051600060405180830381858888f19350505050158015610485573d6000803e3d6000fd5b508061049081610e86565b9150506103b6565b503481146104db5760405162461bcd60e51b815260206004820152601060248201526f151bdd185b081b5a5cdb585d18da195960821b60448201526064016101aa565b6040805160008152602081018390527f5877a06a1eac9fc2d9048726981d1495bf51a77dc70b27a04b3ece333b4dd486910160405180910390a15050505050565b6000546001600160a01b031633146105465760405162461bcd60e51b81526004016101aa90610df6565b6040516370a0823160e01b81523060048201526103359082906001600160a01b038516906370a082319060240160206040518083038186803b15801561058b57600080fd5b505afa15801561059f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c39190610d8f565b6001600160a01b03851691906108c6565b6000546001600160a01b031633146105fe5760405162461bcd60e51b81526004016101aa90610df6565b6001600160a01b0381166106635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101aa565b61066c81610876565b50565b6106846001600160a01b03851684848461092e565b50505050565b6040516370a0823160e01b81526001600160a01b038381166004830152600091908616906370a082319060240160206040518083038186803b1580156106cf57600080fd5b505afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190610d8f565b905061071e6001600160a01b03861685858561092e565b826001600160a01b0316846001600160a01b0316141561073f576000610741565b815b6040516370a0823160e01b81526001600160a01b0385811660048301528391908816906370a082319060240160206040518083038186803b15801561078557600080fd5b505afa158015610799573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bd9190610d8f565b6107c79190610e43565b1461086f5760405162461bcd60e51b815260206004820152606660248201527f4e6f7420656e6f75676820746f6b656e732077657265207472616e736665726560448201527f642c20636865636b2074617820616e6420666565206f7074696f6e73206f722060648201527f7472792073657474696e6720656e737572654578616374416d6f756e7420746f6084820152652066616c736560d01b60a482015260c4016101aa565b5050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261092990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610966565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526106849085906323b872dd60e01b906084016108f2565b60006109bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610a389092919063ffffffff16565b80519091501561092957808060200190518101906109d99190610d73565b6109295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016101aa565b6060610a478484600085610a51565b90505b9392505050565b606082471015610ab25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016101aa565b843b610b005760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101aa565b600080866001600160a01b03168587604051610b1c9190610da7565b60006040518083038185875af1925050503d8060008114610b59576040519150601f19603f3d011682016040523d82523d6000602084013e610b5e565b606091505b5091509150610b6e828286610b79565b979650505050505050565b60608315610b88575081610a4a565b825115610b985782518084602001fd5b8160405162461bcd60e51b81526004016101aa9190610dc3565b634e487b7160e01b600052605160045260246000fd5b80356001600160a01b0381168114610bdf57600080fd5b919050565b60008083601f840112610bf5578182fd5b50813567ffffffffffffffff811115610c0c578182fd5b6020830191508360208260051b8501011115610c2757600080fd5b9250929050565b600060208284031215610c3f578081fd5b610a4a82610bc8565b60008060408385031215610c5a578081fd5b610c6383610bc8565b9150610c7160208401610bc8565b90509250929050565b60008060008060008060808789031215610c92578182fd5b610c9b87610bc8565b95506020870135610cab81610eb7565b9450604087013567ffffffffffffffff80821115610cc7578384fd5b610cd38a838b01610be4565b90965094506060890135915080821115610ceb578384fd5b50610cf889828a01610be4565b979a9699509497509295939492505050565b60008060008060408587031215610d1f578384fd5b843567ffffffffffffffff80821115610d36578586fd5b610d4288838901610be4565b90965094506020870135915080821115610d5a578384fd5b50610d6787828801610be4565b95989497509550505050565b600060208284031215610d84578081fd5b8151610a4a81610eb7565b600060208284031215610da0578081fd5b5051919050565b60008251610db9818460208701610e5a565b9190910192915050565b6020815260008251806020840152610de2816040850160208701610e5a565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115610e3e57610e3e610ea1565b500190565b600082821015610e5557610e55610ea1565b500390565b60005b83811015610e75578181015183820152602001610e5d565b838111156106845750506000910152565b6000600019821415610e9a57610e9a610ea1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b801515811461066c57600080fdfea2646970667358221220c870a043d992f5daac25f6c1ab8804af795941270750c2720bb36eda2e5e016b64736f6c63430008040033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.