编译器
0.8.19+commit.7dd6d404
文件 1 的 10:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
set._values[toDeleteIndex] = lastValue;
set._indexes[lastValue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly {
result := store
}
return result;
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 2 的 10:ManagerActions.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
contract ManagerActions{
constructor(){}
address owner;
address feeSink;
uint256 public frozen;
uint256 public permitErc721 = 0;
mapping(address => uint256) denylist;
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet deniedAddresses;
function freezeContract(uint256 value_) external {
require(msg.sender == owner, 'NVS');
frozen = value_;
}
function handleErc721Flag(uint256 value_) external {
require(msg.sender == owner, 'NVS');
permitErc721 = value_;
}
function updateFeeSink(address feeSink_) external {
require(msg.sender == owner, 'NVS');
feeSink = feeSink_;
}
function claimFees() external {
address owner_ = owner;
assembly {
if iszero(eq(caller(), owner_)) {
revert(0,0)
}
if iszero(call(gas(), sload(feeSink.slot), selfbalance(), 0, 0, 0, 0)) {
revert(0,0)
}
}
}
function addToDenylist(address[] memory list) external {
require(msg.sender == owner, 'NVS');
uint len = list.length;
for(uint i = 0; i < len;) {
if (!deniedAddresses.contains(list[i])) {
deniedAddresses.add(list[i]);
}
unchecked {
denylist[list[i]] = 1;
i++;
}
}
}
function removeFromDenylist(address[] memory list) external {
require(msg.sender == owner, 'NVS');
uint len = list.length;
for(uint i = 0; i < len;) {
if (deniedAddresses.contains(list[i])) {
deniedAddresses.remove(list[i]);
}
unchecked {
denylist[list[i]] = 0;
i++;
}
}
}
function getDenylist() external view returns (address[] memory) {
require(msg.sender == owner, 'NVS');
return deniedAddresses.values();
}
}
文件 3 的 10:NativeTransferer.sol
pragma solidity ^0.8.0;
contract NativeTransferer {
uint256 internal constant GAS_STIPEND_NO_STORAGE_WRITES = 2300;
function _performMultiNativeTransfer(uint256 offset, uint256 length, uint256 amount) internal {
assembly {
for { let i := 0 } lt(i, length) { i := add(i, 1) } {
let to := calldataload(add(offset, mul(i, 0x20)))
if iszero( call(
GAS_STIPEND_NO_STORAGE_WRITES,
to,
amount,
0,
0,
0,
0
)) {
revert(0,0)
}
}
}
}
function _performMultiNativeTransferCustom(uint256 recipientsOffset, uint256 length, uint256 amountsOffset) internal returns (uint256 totalAmount){
assembly {
for { let i := 0 } lt(i, length) { i := add(i, 1) } {
let to := calldataload(add(recipientsOffset, mul(i, 0x20)))
let amount := calldataload(add(amountsOffset, mul(i, 0x20)))
totalAmount := add(totalAmount, amount)
if iszero( call(
GAS_STIPEND_NO_STORAGE_WRITES,
to,
amount,
0,
0,
0,
0
)) {
revert(0,0)
}
}
}
}
}
文件 4 的 10:PremiumSubscriptionRegistryEvents.sol
pragma solidity ^0.8.0;
interface PremiumSubscriptionRegistryEvents {
event WalletBaseFeeSet(address indexed Wallet, uint256 BaseFeeInWei);
event WalletBaseFeeReset(address indexed Wallet);
event TxnsAdded(address[] Wallet, uint256[] Txns);
}
文件 5 的 10:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
文件 6 的 10:SlashToken.sol
pragma solidity 0.8.19;
import "../handshake-drop-libs/TokenTransferer.sol";
import "../handshake-drop-types/interfaces/SlashTokenEvents.sol";
import "../handshake-drop-libs/NativeTransferer.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "../handshake-drop-libs/SubscriptionRegistry.sol";
contract SlashToken is TokenTransferer, NativeTransferer, SlashTokenEvents, SubscriptionRegistry, ReentrancyGuard {
constructor() ReentrancyGuard(){}
function erc20AirdropEqualAmount(address[] calldata recipients, uint256 amount, address token) external payable nonReentrant {
require(frozen == 0, "CF");
require(denylist[msg.sender] == 0, 'UD');
uint256 value = _getBaseFeeForWallet();
uint256 purchasedTxns = _getAvailableTxnsForWallet();
uint recipientsLength = recipients.length;
value = value == 0 ? baseFee : value;
if (purchasedTxns == 0) {
require(msg.value == value, "NVV");
} else {
_updateAvailableTxnsForWallet();
}
require(isInitialized != 0, 'NIY');
require(recipientsLength <= 500, 'NVL');
uint recipientsOffset;
assembly {
recipientsOffset := recipients.offset
}
_performMultiERC20Transfer(token, recipientsOffset, recipientsLength, amount);
emit Erc20AirdropEqualAmount(msg.sender, token, recipientsLength, recipientsLength*amount);
}
function erc20AirdropCustomAmount(address[] calldata recipients, uint256[] calldata amount, address token, uint256 totalAmount) external payable nonReentrant {
require(frozen == 0, "CF");
require(denylist[msg.sender] == 0, 'UD');
uint256 value = _getBaseFeeForWallet();
uint256 purchasedTxns = _getAvailableTxnsForWallet();
uint recipientsLength = recipients.length;
value = value == 0 ? baseFee : value;
if (purchasedTxns == 0) {
require(msg.value == value, "NVV");
} else {
_updateAvailableTxnsForWallet();
}
require(isInitialized != 0, 'NIY');
require(recipientsLength <= 500 && recipientsLength == amount.length, 'NVL');
uint recipientsOffset;
uint amountsOffset;
assembly {
recipientsOffset := recipients.offset
amountsOffset := amount.offset
}
_performMultiERC20TransferCustom(token, recipientsOffset, recipientsLength, amountsOffset, totalAmount);
emit Erc20AirdropCustomAmount(msg.sender, token, recipientsLength, totalAmount);
}
function nativeAirdropEqualAmount(address[] calldata recipients, uint256 amount) external payable nonReentrant {
require(frozen == 0, "CF");
require(isInitialized != 0, 'NIY');
require(denylist[msg.sender] == 0, 'UD');
uint recipientsOffset;
uint recipientsLength = recipients.length;
uint256 value = _getBaseFeeForWallet();
uint256 purchasedTxns = _getAvailableTxnsForWallet();
uint256 recipientsValue = amount * recipientsLength;
value = value == 0 ? (baseFee + recipientsValue) : (value + recipientsValue);
if (purchasedTxns == 0) {
require(msg.value == value, "NVV");
} else {
require(msg.value == recipientsValue, 'NVV');
_updateAvailableTxnsForWallet();
}
require(recipientsLength <= 500, 'NVL');
assembly {
recipientsOffset := recipients.offset
}
_performMultiNativeTransfer(recipientsOffset, recipientsLength, amount);
emit NativeAirdropEqualAmount(msg.sender, recipientsLength, recipientsValue);
}
function nativeAirdropCustomAmount(address[] calldata recipients, uint256[] calldata amounts) external payable nonReentrant {
require(frozen == 0, "CF");
require(isInitialized != 0, 'NIY');
require(denylist[msg.sender] == 0, 'UD');
uint256 value = _getBaseFeeForWallet();
uint256 purchasedTxns = _getAvailableTxnsForWallet();
uint recipientsOffset;
uint amountsOffset;
uint recipientsLength = recipients.length;
require(recipientsLength <= 500 && recipientsLength == amounts.length, 'NVL');
assembly {
recipientsOffset := recipients.offset
amountsOffset := amounts.offset
}
uint totalAmount = _performMultiNativeTransferCustom(recipientsOffset, recipientsLength, amountsOffset);
value = value == 0 ? (baseFee + totalAmount) : (value + totalAmount);
if (purchasedTxns == 0) {
require(msg.value == value, "NVV");
} else {
require(msg.value == totalAmount, 'NVV');
_updateAvailableTxnsForWallet();
}
emit NativeAirdropCustomAmount(msg.sender, recipientsLength, totalAmount);
}
function erc721Airdrop(address[] calldata recipients, uint256[] calldata ids, address token) external payable nonReentrant {
require(permitErc721 != 0, 'NEY');
require(frozen == 0, "CF");
require(isInitialized != 0, 'NIY');
require(denylist[msg.sender] == 0, 'UD');
uint256 value = _getBaseFeeForWallet();
value = value == 0 ? baseFee : value;
uint256 purchasedTxns = _getAvailableTxnsForWallet();
uint recipientsLength = recipients.length;
if (purchasedTxns == 0) {
require(msg.value == value, "NVV");
} else {
_updateAvailableTxnsForWallet();
}
require(recipientsLength <= 500 && recipientsLength == ids.length, 'NVL');
uint recipientsOffset;
uint idsOffset;
assembly {
recipientsOffset := recipients.offset
idsOffset := ids.offset
}
_performMultiERC721Transfer(token, msg.sender, recipientsOffset, recipientsLength, idsOffset);
emit Erc721Airdrop(msg.sender, token, recipientsLength);
}
}
文件 7 的 10:SlashTokenEvents.sol
pragma solidity ^0.8.0;
interface SlashTokenEvents {
event Erc20AirdropEqualAmount(address indexed From, address indexed Token,uint256 RecipientsLength, uint256 TotalAmount);
event Erc20AirdropCustomAmount(address indexed From, address indexed Token, uint256 RecipientsLength, uint256 TotalAmount);
event NativeAirdropEqualAmount(address indexed From,uint256 RecipientsLength, uint256 TotalAmount);
event NativeAirdropCustomAmount(address indexed From, uint256 RecipientsLength, uint256 TotalAmount);
event Erc721Airdrop(address indexed From, address indexed Token, uint256 RecipientsLength);
}
文件 8 的 10:SlashTokenRegistryEvents.sol
pragma solidity ^0.8.0;
interface SlashTokenRegistryEvents {
event TxnsBundleBought(address indexed Buyer, uint256 Amount, uint256 Txns);
event BundlesUpdated(address indexed Operator, uint256[] BundlesAmounts, uint256[] BundlesPrices);
}
文件 9 的 10:SubscriptionRegistry.sol
pragma solidity ^0.8.0;
import "../handshake-drop-types/interfaces/SlashTokenRegistryEvents.sol";
import "../handshake-drop-types/interfaces/PremiumSubscriptionRegistryEvents.sol";
import "./ManagerActions.sol";
contract SubscriptionRegistry is SlashTokenRegistryEvents, PremiumSubscriptionRegistryEvents, ManagerActions {
mapping (address => uint256) baseFeeWhitelisted;
mapping(address => uint256) public userToTxns;
uint256[] availableTxnsBundles;
uint256[] txnsBundlesToPrice;
uint256 isInitialized;
uint256 public baseFee;
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet bundleUsers;
function initialize(address admin_, address feeSink_, uint256 baseFeeCostInWei, uint256[] memory availableTxnsBundles_, uint256[] memory txnsBundlesToPrice_ ) external {
require(isInitialized == 0, 'AI');
require(availableTxnsBundles_.length == txnsBundlesToPrice_.length, 'NVD');
owner = admin_;
feeSink = feeSink_;
availableTxnsBundles = availableTxnsBundles_;
txnsBundlesToPrice = txnsBundlesToPrice_;
isInitialized = 1;
baseFee = baseFeeCostInWei;
}
constructor(){}
function buyTxnsBundle(uint256 bundleIndex, uint256 quantity) external payable {
require(frozen == 0, "CF");
require(msg.value == txnsBundlesToPrice[bundleIndex] * quantity, 'NVV');
require(denylist[msg.sender] == 0, 'UD');
require(quantity != 0, 'NVA');
if(!bundleUsers.contains(msg.sender)) {
bundleUsers.add(msg.sender);
}
uint256 total;
unchecked {
total = availableTxnsBundles[bundleIndex] * quantity;
userToTxns[msg.sender] += total;
}
emit TxnsBundleBought(msg.sender, msg.value, total);
}
function setBaseFeeForWallet(address wallet, uint256 amountInWei) external {
require(amountInWei < baseFee, "NVV");
require(msg.sender == owner, 'NVS');
baseFeeWhitelisted[wallet] = amountInWei;
emit WalletBaseFeeSet(wallet, amountInWei);
}
function resetBaseFeeForWallet(address wallet) external {
require(msg.sender == owner, 'NVS');
delete baseFeeWhitelisted[wallet];
emit WalletBaseFeeReset(wallet);
}
function addTxnsToWallets(address[] memory wallets, uint256[] memory txns) external {
require(msg.sender == owner, 'NVS');
require(wallets.length == txns.length, "NVL");
uint len = wallets.length;
for(uint i =0; i<len;){
unchecked {
userToTxns[wallets[i]] += txns[i];
i++;
}
}
emit TxnsAdded(wallets, txns);
}
function setNewBaseFee(uint256 baseFee_) external {
require(msg.sender == owner, 'NVS');
baseFee = baseFee_;
}
function updateBundles(uint256[] memory availableTxnsBundles_, uint256[] memory txnsBundlesToPrice_ ) external {
require(msg.sender == owner, 'NVS');
require(availableTxnsBundles_.length == txnsBundlesToPrice_.length, 'NVD');
availableTxnsBundles = availableTxnsBundles_;
txnsBundlesToPrice = txnsBundlesToPrice_;
emit BundlesUpdated(msg.sender, availableTxnsBundles_, txnsBundlesToPrice_);
}
function getBundles() external view returns (uint256[] memory AvailableBundles, uint256[] memory BundlesPrices) {
AvailableBundles = availableTxnsBundles;
BundlesPrices = txnsBundlesToPrice;
}
function getBaseFeeForWallet() external view returns (uint256) {
return baseFeeWhitelisted[msg.sender];
}
function getAvailableTxnsForWallet() external view returns (uint256) {
return userToTxns[msg.sender];
}
function getUsersThatBoughtBundles() external view returns (address[] memory Users) {
require(msg.sender == owner, 'NVS');
Users = bundleUsers.values();
}
function _getBaseFeeForWallet() internal view returns (uint256) {
return baseFeeWhitelisted[msg.sender];
}
function _updateAvailableTxnsForWallet() internal {
unchecked {
--userToTxns[msg.sender];
}
}
function _getAvailableTxnsForWallet() internal view returns (uint256) {
return userToTxns[msg.sender];
}
}
文件 10 的 10:TokenTransferer.sol
pragma solidity ^0.8.13;
contract TokenTransferer {
error TransferFromFailed();
function _performMultiERC20Transfer(address token, uint256 recipientsOffset, uint256 length, uint256 amount) internal{
assembly {
let total := mul(amount, length)
let m := mload(0x40)
mstore(0x60, total)
mstore(0x40, address())
mstore(0x2c, shl(96, caller()))
mstore(0x0c, 0x23b872dd000000000000000000000000)
if iszero(
and(
or(
eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
)
)
{
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
mstore(0x40, amount)
for { let i := 0 } lt(i, length) { i := add(i, 1) } {
let to := calldataload(add(recipientsOffset, mul(i, 0x20)))
mstore(0x2c, shl(96, to))
mstore(0x0c, 0xa9059cbb000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
}
mstore(0x60, 0)
mstore(0x40, m)
}
}
function _performMultiERC20TransferCustom(address token, uint256 recipientsOffset, uint256 recipientsLength, uint256 amountsOffset, uint256 totalAmount) internal {
assembly {
let m := mload(0x40)
mstore(0x60, totalAmount)
mstore(0x40, address())
mstore(0x2c, shl(96, caller()))
mstore(0x0c, 0x23b872dd000000000000000000000000)
if iszero(
and(
or(
eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20)
)
)
{
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
let sumAmount := 0
for { let i := 0 } lt(i, recipientsLength) { i := add(i, 1) } {
let to := calldataload(add(recipientsOffset, mul(i, 0x20)))
let amount := calldataload(add(amountsOffset, mul(i, 0x20)))
sumAmount := add(sumAmount, amount)
mstore(0x40, amount)
mstore(0x2c, shl(96, to))
mstore(0x0c, 0xa9059cbb000000000000000000000000)
if iszero(
and(
or(eq(mload(0x00), 1), iszero(returndatasize())),
call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
}
if iszero(eq(totalAmount, sumAmount)) {
revert(0,0)
}
mstore(0x60, 0)
mstore(0x40, m)
}
}
function _performMultiERC721Transfer(
address token,
address from,
uint256 recipientsOffset,
uint256 recipientsLength,
uint256 idsOffset
) internal {
assembly {
let m := mload(0x40)
for { let i := 0 } lt(i, recipientsLength) { i := add(i, 1) } {
let to := calldataload(add(recipientsOffset, mul(i, 0x20)))
let identifier := calldataload(add(idsOffset, mul(i, 0x20)))
mstore(0x60, identifier)
mstore(0x40, to)
mstore(0x2c, shl(96, from))
mstore(0x0c, 0x23b872dd000000000000000000000000)
if iszero(
and(
iszero(returndatasize()),
call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x00)
)
) {
mstore(0x00, 0x7939f424)
revert(0x1c, 0x04)
}
}
mstore(0x60, 0)
mstore(0x40, m)
}
}
}
{
"compilationTarget": {
"contracts/handshake-drop/handshake-drop-core/SlashToken.sol": "SlashToken"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 9999999
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Operator","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"BundlesAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"BundlesPrices","type":"uint256[]"}],"name":"BundlesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":true,"internalType":"address","name":"Token","type":"address"},{"indexed":false,"internalType":"uint256","name":"RecipientsLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TotalAmount","type":"uint256"}],"name":"Erc20AirdropCustomAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":true,"internalType":"address","name":"Token","type":"address"},{"indexed":false,"internalType":"uint256","name":"RecipientsLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TotalAmount","type":"uint256"}],"name":"Erc20AirdropEqualAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":true,"internalType":"address","name":"Token","type":"address"},{"indexed":false,"internalType":"uint256","name":"RecipientsLength","type":"uint256"}],"name":"Erc721Airdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"uint256","name":"RecipientsLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TotalAmount","type":"uint256"}],"name":"NativeAirdropCustomAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"From","type":"address"},{"indexed":false,"internalType":"uint256","name":"RecipientsLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TotalAmount","type":"uint256"}],"name":"NativeAirdropEqualAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"Wallet","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"Txns","type":"uint256[]"}],"name":"TxnsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"Txns","type":"uint256"}],"name":"TxnsBundleBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Wallet","type":"address"}],"name":"WalletBaseFeeReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"BaseFeeInWei","type":"uint256"}],"name":"WalletBaseFeeSet","type":"event"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"addToDenylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"txns","type":"uint256[]"}],"name":"addTxnsToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"baseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bundleIndex","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"buyTxnsBundle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"erc20AirdropCustomAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"erc20AirdropEqualAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"token","type":"address"}],"name":"erc721Airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"freezeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableTxnsForWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseFeeForWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBundles","outputs":[{"internalType":"uint256[]","name":"AvailableBundles","type":"uint256[]"},{"internalType":"uint256[]","name":"BundlesPrices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDenylist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUsersThatBoughtBundles","outputs":[{"internalType":"address[]","name":"Users","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"handleErc721Flag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"feeSink_","type":"address"},{"internalType":"uint256","name":"baseFeeCostInWei","type":"uint256"},{"internalType":"uint256[]","name":"availableTxnsBundles_","type":"uint256[]"},{"internalType":"uint256[]","name":"txnsBundlesToPrice_","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"nativeAirdropCustomAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"nativeAirdropEqualAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"permitErc721","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"}],"name":"removeFromDenylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"resetBaseFeeForWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amountInWei","type":"uint256"}],"name":"setBaseFeeForWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseFee_","type":"uint256"}],"name":"setNewBaseFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"availableTxnsBundles_","type":"uint256[]"},{"internalType":"uint256[]","name":"txnsBundlesToPrice_","type":"uint256[]"}],"name":"updateBundles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feeSink_","type":"address"}],"name":"updateFeeSink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userToTxns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]