ETH Price: $2,139.71 (-1.25%)

Contract

0xe9b7bf1f1E4aF70174eDdA034fDf758fe577cdBe
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Airdrop115697042021-01-01 17:00:121903 days ago1609520412IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0014365
Airdrop112868612020-11-19 6:44:201947 days ago1605768260IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0015596923
Airdrop112863302020-11-19 4:43:461947 days ago1605761026IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0013562620
Airdrop112863212020-11-19 4:42:061947 days ago1605760926IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0013562620
Airdrop112858972020-11-19 3:12:431947 days ago1605755563IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0025090837
Airdrop112856652020-11-19 2:22:181947 days ago1605752538IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0015596923
Airdrop112851172020-11-19 0:22:441947 days ago1605745364IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0029091742.90000023
Airdrop112814632020-11-18 10:45:331948 days ago1605696333IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0032550248
Airdrop112809632020-11-18 8:54:501948 days ago1605689690IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0037249152.00000145
Airdrop112807722020-11-18 8:13:361948 days ago1605687216IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0040687860
Airdrop112752952020-11-17 11:57:311948 days ago1605614251IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0028481442
Airdrop112750792020-11-17 11:09:231949 days ago1605611363IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0022378233
Airdrop112750552020-11-17 11:03:401949 days ago1605611020IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0017631326
Airdrop112750552020-11-17 11:03:401949 days ago1605611020IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0020343930
Airdrop112750012020-11-17 10:53:121949 days ago1605610392IN
0xe9b7bf1f...fe577cdBe
0 ETH0.002102231
Airdrop112687662020-11-16 12:03:531949 days ago1605528233IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0017631326
Airdrop112680562020-11-16 9:21:441950 days ago1605518504IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0023056434
Airdrop112676902020-11-16 7:54:181950 days ago1605513258IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0018987628
Airdrop112673992020-11-16 6:48:091950 days ago1605509289IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0014986622.1
Airdrop112629852020-11-15 14:37:551950 days ago1605451075IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0018987628
Airdrop112608902020-11-15 6:55:221951 days ago1605423322IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0012206318
Airdrop112570372020-11-14 17:00:411951 days ago1605373241IN
0xe9b7bf1f...fe577cdBe
0 ETH0.001550
Airdrop112554542020-11-14 11:03:191952 days ago1605351799IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0007459411
Airdrop112544452020-11-14 7:22:571952 days ago1605338577IN
0xe9b7bf1f...fe577cdBe
0 ETH0.0012206318
Airdrop112544072020-11-14 7:14:371952 days ago1605338077IN
0xe9b7bf1f...fe577cdBe
0 ETH0.00108516
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MonetAirdrop

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
pragma solidity =0.5.16;

import "./Ownable.sol";
import "./libraries/SafeMath.sol";

contract MonetAirdrop is Ownable {
    using SafeMath for uint256;

    address public tokenCards;
    uint256 public laveCards;
    mapping(uint256 => uint256) cardNums;
    mapping(address => bool) public partner;

    constructor(address cards) public {
        tokenCards = cards;
    }

    // EXTERNAL
    function notify(address[] calldata accounts, uint256[] calldata cards) external onlyOwner {
        setCards(cards);
        setPartner(accounts);
    }

    function setPartner(address[] memory accounts) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            partner[accounts[i]] = true;
        }
    }

    function setCards(uint256[] memory cards) public onlyOwner {
        require(cards.length > 0, "cards is empty");

        uint256 levelMax = 10;
        uint256 _laveCards = laveCards;
        for (uint256 i = 0; i < cards.length; i++) {
            cardNums[levelMax.sub(i)] = cards[i];
            _laveCards = _laveCards.add(cards[i]);
        }
        laveCards = _laveCards;
    }

    function airdrop() external onlyCaller(msg.sender) {
        require(laveCards > 0, "lave cards is zero");
        require(partner[msg.sender], "Caller is not partner");

        uint256 seed = uint256(
            keccak256(abi.encodePacked(block.difficulty, now))
        );
        uint256 num = 0;
        uint256 random = seed % laveCards;
        for (uint256 i = 10; i > 4; i--) {
            if (cardNums[i] == 0) continue;
            num = num.add(cardNums[i]);
            if (random <= num) {
                partner[msg.sender] = false;
                laveCards = laveCards.sub(1);
                cardNums[i] = cardNums[i].sub(1);
                uint256 color = (seed / 10 - seed) % 4;
                uint256[] memory cards = new uint256[](1);
                cards[0] = i.mul(10).add(color).add(1000);
                ICardERC(tokenCards).cardsBatchMint(msg.sender, cards);
                emit Airdrop(msg.sender, cards[0]);
                return;
            }
        }
    }

    // MODIFIER
    modifier onlyCaller(address account) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        require(size == 0, "account is contract");

        _;
    }

    // EVENT
    event Airdrop(address indexed sender, uint256 card);
}

interface ICardERC {
    function cardsBatchMint(address _to, uint256[] calldata _cards) external;
}

pragma solidity =0.5.16;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
    
    function div(uint a, uint b) internal pure returns (uint z) {
        require(b > 0);
        return a / b;
    }
}

pragma solidity =0.5.16;

contract Ownable {
    address private _owner;

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

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

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"cards","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"card","type":"uint256"}],"name":"Airdrop","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"},{"constant":false,"inputs":[],"name":"airdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"laveCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"cards","type":"uint256[]"}],"name":"notify","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"partner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"cards","type":"uint256[]"}],"name":"setCards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setPartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenCards","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051610c3a380380610c3a8339818101604052602081101561003357600080fd5b5051600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055610b8d806100ad6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806357a31faf1161006657806357a31faf1461026a5780638da5cb5b1461030b5780638f32d59b14610313578063996dc45a1461031b578063f2fde38b146103355761009e565b806308c40811146100a35780630c467fa6146101635780633884d6351461019d57806341ccb623146101a557806353686d8c14610246575b600080fd5b610161600480360360408110156100b957600080fd5b810190602081018135600160201b8111156100d357600080fd5b8201836020820111156100e557600080fd5b803590602001918460208302840111600160201b8311171561010657600080fd5b919390929091602081019035600160201b81111561012357600080fd5b82018360208201111561013557600080fd5b803590602001918460208302840111600160201b8311171561015657600080fd5b50909250905061035b565b005b6101896004803603602081101561017957600080fd5b50356001600160a01b0316610420565b604080519115158252519081900360200190f35b610161610435565b610161600480360360208110156101bb57600080fd5b810190602081018135600160201b8111156101d557600080fd5b8201836020820111156101e757600080fd5b803590602001918460208302840111600160201b8311171561020857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107a5945050505050565b61024e610844565b604080516001600160a01b039092168252519081900360200190f35b6101616004803603602081101561028057600080fd5b810190602081018135600160201b81111561029a57600080fd5b8201836020820111156102ac57600080fd5b803590602001918460208302840111600160201b831117156102cd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610853945050505050565b61024e610968565b610189610977565b610323610988565b60408051918252519081900360200190f35b6101616004803603602081101561034b57600080fd5b50356001600160a01b031661098e565b610363610977565b6103a2576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b6103de82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061085392505050565b61041a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506107a592505050565b50505050565b60046020526000908152604090205460ff1681565b33803b8015610481576040805162461bcd60e51b81526020600482015260136024820152721858d8dbdd5b9d081a5cc818dbdb9d1c9858dd606a1b604482015290519081900360640190fd5b6000600254116104cd576040805162461bcd60e51b81526020600482015260126024820152716c617665206361726473206973207a65726f60701b604482015290519081900360640190fd5b3360009081526004602052604090205460ff16610529576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba103830b93a3732b960591b604482015290519081900360640190fd5b60408051446020808301919091524282840152825180830384018152606090920190925280519101206002546000908190838161056257fe5b069050600a5b600481111561079c5760008181526003602052604090205461058957610793565b6000818152600360205260409020546105a990849063ffffffff610a3016565b925082821161079357336000908152600460205260409020805460ff191690556002546105dd90600163ffffffff610a8516565b60025560008181526003602052604090205461060090600163ffffffff610a8516565b600082815260036020526040812091909155600485600a8104038161062157fe5b604080516001808252818301909252929091069250606091906020808301908038833901905050905061066f6103e8610663848187600a63ffffffff610ad516565b9063ffffffff610a3016565b8160008151811061067c57fe5b602090810291909101810191909152600154604080516374bc2e4b60e01b81523360048201818152602483019384528651604484015286516001600160a01b03909516956374bc2e4b95929488949293909260640191858101910280838360005b838110156106f55781810151838201526020016106dd565b505050509050019350505050600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b50505050336001600160a01b03167f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a8260008151811061076b57fe5b60200260200101516040518082815260200191505060405180910390a25050505050506107a1565b60001901610568565b505050505b5050565b6107ad610977565b6107ec576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b60005b81518110156107a15760016004600084848151811061080a57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016107ef565b6001546001600160a01b031681565b61085b610977565b61089a576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b60008151116108e1576040805162461bcd60e51b815260206004820152600e60248201526d636172647320697320656d70747960901b604482015290519081900360640190fd5b600254600a9060005b8351811015610960578381815181106108ff57fe5b60200260200101516003600061091e8487610a8590919063ffffffff16565b81526020019081526020016000208190555061095684828151811061093f57fe5b602002602001015183610a3090919063ffffffff16565b91506001016108ea565b506002555050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60025481565b610996610977565b6109d5576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b80820182811015610a7f576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b80820382811115610a7f576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000811580610af057505080820282828281610aed57fe5b04145b610a7f576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a265627a7a723158206fd07a80919f2ed231bddc2bcf1ac92cd5fa2e86dbb0a62b15a3c304a8e3ba7764736f6c634300051000320000000000000000000000001014cf898383d275da1c2ed970d0b2cd5ffef3c2

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806357a31faf1161006657806357a31faf1461026a5780638da5cb5b1461030b5780638f32d59b14610313578063996dc45a1461031b578063f2fde38b146103355761009e565b806308c40811146100a35780630c467fa6146101635780633884d6351461019d57806341ccb623146101a557806353686d8c14610246575b600080fd5b610161600480360360408110156100b957600080fd5b810190602081018135600160201b8111156100d357600080fd5b8201836020820111156100e557600080fd5b803590602001918460208302840111600160201b8311171561010657600080fd5b919390929091602081019035600160201b81111561012357600080fd5b82018360208201111561013557600080fd5b803590602001918460208302840111600160201b8311171561015657600080fd5b50909250905061035b565b005b6101896004803603602081101561017957600080fd5b50356001600160a01b0316610420565b604080519115158252519081900360200190f35b610161610435565b610161600480360360208110156101bb57600080fd5b810190602081018135600160201b8111156101d557600080fd5b8201836020820111156101e757600080fd5b803590602001918460208302840111600160201b8311171561020857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506107a5945050505050565b61024e610844565b604080516001600160a01b039092168252519081900360200190f35b6101616004803603602081101561028057600080fd5b810190602081018135600160201b81111561029a57600080fd5b8201836020820111156102ac57600080fd5b803590602001918460208302840111600160201b831117156102cd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610853945050505050565b61024e610968565b610189610977565b610323610988565b60408051918252519081900360200190f35b6101616004803603602081101561034b57600080fd5b50356001600160a01b031661098e565b610363610977565b6103a2576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b6103de82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061085392505050565b61041a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506107a592505050565b50505050565b60046020526000908152604090205460ff1681565b33803b8015610481576040805162461bcd60e51b81526020600482015260136024820152721858d8dbdd5b9d081a5cc818dbdb9d1c9858dd606a1b604482015290519081900360640190fd5b6000600254116104cd576040805162461bcd60e51b81526020600482015260126024820152716c617665206361726473206973207a65726f60701b604482015290519081900360640190fd5b3360009081526004602052604090205460ff16610529576040805162461bcd60e51b815260206004820152601560248201527421b0b63632b91034b9903737ba103830b93a3732b960591b604482015290519081900360640190fd5b60408051446020808301919091524282840152825180830384018152606090920190925280519101206002546000908190838161056257fe5b069050600a5b600481111561079c5760008181526003602052604090205461058957610793565b6000818152600360205260409020546105a990849063ffffffff610a3016565b925082821161079357336000908152600460205260409020805460ff191690556002546105dd90600163ffffffff610a8516565b60025560008181526003602052604090205461060090600163ffffffff610a8516565b600082815260036020526040812091909155600485600a8104038161062157fe5b604080516001808252818301909252929091069250606091906020808301908038833901905050905061066f6103e8610663848187600a63ffffffff610ad516565b9063ffffffff610a3016565b8160008151811061067c57fe5b602090810291909101810191909152600154604080516374bc2e4b60e01b81523360048201818152602483019384528651604484015286516001600160a01b03909516956374bc2e4b95929488949293909260640191858101910280838360005b838110156106f55781810151838201526020016106dd565b505050509050019350505050600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b50505050336001600160a01b03167f8c32c568416fcf97be35ce5b27844cfddcd63a67a1a602c3595ba5dac38f303a8260008151811061076b57fe5b60200260200101516040518082815260200191505060405180910390a25050505050506107a1565b60001901610568565b505050505b5050565b6107ad610977565b6107ec576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b60005b81518110156107a15760016004600084848151811061080a57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016107ef565b6001546001600160a01b031681565b61085b610977565b61089a576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b60008151116108e1576040805162461bcd60e51b815260206004820152600e60248201526d636172647320697320656d70747960901b604482015290519081900360640190fd5b600254600a9060005b8351811015610960578381815181106108ff57fe5b60200260200101516003600061091e8487610a8590919063ffffffff16565b81526020019081526020016000208190555061095684828151811061093f57fe5b602002602001015183610a3090919063ffffffff16565b91506001016108ea565b506002555050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60025481565b610996610977565b6109d5576040805162461bcd60e51b81526020600482018190526024820152600080516020610b39833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b80820182811015610a7f576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b80820382811115610a7f576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000811580610af057505080820282828281610aed57fe5b04145b610a7f576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a265627a7a723158206fd07a80919f2ed231bddc2bcf1ac92cd5fa2e86dbb0a62b15a3c304a8e3ba7764736f6c63430005100032

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

0000000000000000000000001014cf898383d275da1c2ed970d0b2cd5ffef3c2

-----Decoded View---------------
Arg [0] : cards (address): 0x1014CF898383D275Da1c2ED970D0B2cd5FfeF3c2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001014cf898383d275da1c2ed970d0b2cd5ffef3c2


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.