Contract 0x23a13973655da144c53472f2ec7dc6616ab9ab0a 4

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x924b9a7843df91f5e1aa953bf256d32288cc7970f3ee131f41f1586227387f58Multisend Token56949482022-11-23 13:51:292 days 21 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO16.282359956972 4,871.099110397
0x13c4258c1131ab2d3cf20759f441acbb89dabe045d1656c87eef51e1bdb04fa6Multisend Token56639382022-11-21 13:01:554 days 22 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO3.909983536666 4,872.532926082
0xb554a5cdf5b641f773377b32fd54c639fcec3bec31f0dd7469d32719bb766f7cMultisend Token56230352022-11-18 20:38:067 days 15 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.514626224797 4,874.428279295
0xced6a77c0bc125e119b4504a7aa98b80186a19631f30ef493b7fdc2eaad21390Multisend Token56226032022-11-18 19:57:177 days 15 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO14.931862976455 4,874.448176017
0xcc24429329aa147832b5ddcede7205db246fa241b87b7e976856c3e68ab784f2Multisend Token56203212022-11-18 16:21:387 days 19 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO17.244852416232 4,874.553008916
0x99ec3ec75cdb1e1a99a6bf61ccd72365e0a38c85ab758ced97b4b5dada8e71d2Multisend Token56002562022-11-17 8:46:279 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO4.463561144176 4,875.48076287
0xaa4bf841971605c5d3d875973cae4d01db1d5afa1df66dea2c04db1038c22de5Multisend Token55902932022-11-16 17:05:269 days 18 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO45.183586213718 4,875.942706039
0x0d8275607f3cb70be00cf8e17ad9e9a640dcdc8281477eb90270e45c79dd723cMultisend Token55850272022-11-16 8:47:0410 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO4.352649048571 4,876.185590703
0xc8ceb6fbb8b9fedcaaa71bfd195688b19b0a48585a9c17439bdc058cb4313726Multisend Token55714282022-11-15 11:19:2811 days 31 mins ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO4.571780506008 4,876.805161649
0x6d9db41cd5f7ba83bff54b890cd3a1a10e49b06630e76b97e739d0f6c29db484Multisend Token55560372022-11-14 10:55:4612 days 54 mins ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO5.346411384774 4,877.498439772
0xb223411c09f4d9be0ce851ee33dc37371a06fc6912c2843d2c265eae312adf27Multisend Token55237412022-11-12 7:36:2114 days 4 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.583205785028 4,878.916534353
0xc5ce5bf58003181bbf2a555b5f799530637ce8c3bc54f0d874ecff6bdc709218Multisend Token55092112022-11-11 8:40:4815 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO4.560693365134 4,879.57871365
0xe87394fa9f895edbf5ba45746a0571d032e7e774afdde2aea235bbe0043eefacMultisend Token54943452022-11-10 9:13:4716 days 2 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.768286954197 4,880.257375508
0xa9cde0baf1e7c2271768374c0f68b08cadf17b090f6720e149429b3259777111Multisend Token54782112022-11-09 7:37:3517 days 4 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.696063088839 4,880.971335537
0xc3ac6e38ad11b0895da984bd730858988c51733677e3eeb931bc63c5478b8111Multisend Token54634622022-11-08 8:13:5218 days 3 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.76965220248 4,881.631484802
0xc2788bc60411986794875e2c412da2d5acaa8968773a6ff334cab9375308770bMultisend Token54478672022-11-07 7:37:0219 days 4 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.769995699131 4,882.34017649
0xac8a2d5571a374a0cdf49194865ed7f337a6cb555c5aad4ba70e84615ea97e46Multisend Token54411222022-11-06 20:57:5519 days 14 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO5.353111823125 4,882.649055985
0x7eb2e6e4053b87b4551ac01fdfdd2a7513d772ffab526397933d02343e34cc7cMultisend Token54035962022-11-04 9:48:0522 days 2 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO2.697932769186 4,884.356217819
0x0fb9bd2975c336424880063a426e3c7cb7ea0f1ccf857648079d4a100ad7ce9eMultisend Token53879702022-11-03 9:12:0323 days 2 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.186075305109 4,885.069379683
0x3b8905159fe9f799145cfc825f39313aad9fa49ed3c5c9a1436727d18229892dMultisend Token53725002022-11-02 8:52:4024 days 2 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.371463355738 4,885.781712966
0x415ae9789c1c6989d2caed942cf55545e125023b6647cf19d64e010759f69d91Multisend Token53500702022-10-31 21:35:1125 days 14 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO10.935131966576 4,886.816688077
0x51f0a96e4d56ac409d25f0df4cc208f52b33047b6c78f66a965cf55130a21311Multisend Token53500692022-10-31 21:35:0425 days 14 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO48.823882741696 4,886.81670747
0xe55df7c79fc5668373ca10fe87d5ffa450b7a1483964317cf366a3a7e6f8ea8fMultisend Token53500682022-10-31 21:34:5925 days 14 hrs ago0xeefd2d76564d3c38920503881796ef3a5fecf268 IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO44.669995931583 4,886.816733808
0x42c505a48de399b7d9ba8ff21cc36d5c7cabc772a12724b32f61f418d98ea5f5Multisend Token47838712022-09-24 16:17:4662 days 19 hrs ago0x770acbf0a2fe9091756a94ecb898a519c96aa72d IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO0.943531971845 4,912.821701314
0xcc7f102da0e4605d2c1a7a7d5003638530bdf8b1aa81ea95de0197209ad0f068Multisend Token47838622022-09-24 16:16:5662 days 19 hrs ago0x770acbf0a2fe9091756a94ecb898a519c96aa72d IN  0x23a13973655da144c53472f2ec7dc6616ab9ab0a0 CRO1.413659652492 4,912.822120989
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x6439afd48531a88a481ffca0de1335fd04908c8f50 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x9d03870cb4e54b6ae7345045864cf85dbc502d6a102.2862854 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x4638438616f799a8b7a504722a8024f7f0d451d1200 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x58200e7e8dac79950154268a4c5bb1809bea0495205 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x8e9c8975503e3223aede60b4d8f1fbb45ac93a00250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x43ed52382d670fbada5a80f5bf0bd6e36081f18e250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x31fb2c6d7498d69a9bd3cc146507a73eecef0172250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x56820bc4dcc9ae3dc589267c7736efb45c2a2265250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x21d5a0f5dcf34426af464603ae679b0a1c257f32250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xcc58eef957969d658e2f93460bbf9638cf8b884e250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x3d6e2e430bb02b24e542f082f63b09b520eae7b2250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xebd9747e656ffef82333f38ca48d630b4ff792e5250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x26fc95f7892256caa1449a6cc292f8a4648216d5250 CRO
0x35c13887a684b0eedbe1b89c67c3ada6315e5dd5f14f445780088fea607b4d7046045952022-09-12 21:38:2474 days 14 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x24f390fff7f6d83c93685daa991692357bc11db5250 CRO
0x0397da6930bdbf0ab3efb49da8c75cb57483e07dacdafe33fdfd54cfcf2466da45969932022-09-12 9:40:1475 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x29420f552ffeefa89d177f76e234746b9bc1221e500 CRO
0x0397da6930bdbf0ab3efb49da8c75cb57483e07dacdafe33fdfd54cfcf2466da45969932022-09-12 9:40:1475 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xda85c4a66ebea97aa48a6e1741ec0e639ffe17831,000 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xa2d767629ef6aafb33a2c072ef067098a0e8e639250 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xbcea2b8cdda7b04502f7c3a6b6eac34a89275b13350 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x939135417f1af940ab9fa55b911394699d51ab47400 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0xba1d939d8811496dc69b3198fe63e1ea25744e8f400 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x3e9a40e07de62f15e4ab2db205065528d0707c34404.2003927 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x6439afd48531a88a481ffca0de1335fd04908c8f450 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x43c6566d7d5df6bcbc4d3a5faea4f73e1971407e468 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x78f12d0d41e72a52c13c1940590387d0c7c52ee8500 CRO
0x21f4f0991dd400178a8deb00c45ad5fea807610fdcb04e89ce2f3a98f3f6516c45969822022-09-12 9:39:1175 days 2 hrs ago 0x23a13973655da144c53472f2ec7dc6616ab9ab0a0x29420f552ffeefa89d177f76e234746b9bc1221e500 CRO
[ Download CSV Export 
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

Contract Source Code (Solidity Standard Json-Input format)

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.