文件 1 的 1:VaultAirdrop.sol
pragma solidity 0.8.28;
interface IERC721 {
function ownerOf(uint256 tokenId) external view returns (address owner);
}
interface IERC20 {
function transfer(address to, uint256 value) external returns (bool);
}
contract VaultAirdrop {
uint256 public constant TOTAL_LENGO_PER_BUTTPLUGGY = 21_000_000 ether;
IERC721 public immutable BUTTPLUGGY = IERC721(0x0000420538CD5AbfBC7Db219B6A1d125f5892Ab0);
IERC20 public immutable LENGOTOKEN = IERC20(0x414645E751D3646E3D6827164037f08425150Be5);
mapping(uint256 => bool) public claimed;
function claim(uint256 tokenId) external {
require(BUTTPLUGGY.ownerOf(tokenId) == msg.sender, "!NFT_OWNER");
require(!claimed[tokenId], "ALREADY_CLAIMED");
claimed[tokenId] = true;
LENGOTOKEN.transfer(msg.sender, TOTAL_LENGO_PER_BUTTPLUGGY);
}
function claim(uint256[] calldata _tokensId) external {
uint256 amount = 0;
for (uint256 i = 0; i < _tokensId.length; i++) {
if (claimed[_tokensId[i]]) continue;
claimed[_tokensId[i]] = true;
require(BUTTPLUGGY.ownerOf(_tokensId[i]) == msg.sender, "!NFT_OWNER");
amount += TOTAL_LENGO_PER_BUTTPLUGGY;
}
require(amount > 0, "empty claim");
LENGOTOKEN.transfer(msg.sender, amount);
}
}
{
"compilationTarget": {
"src/VaultAirdrop.sol": "VaultAirdrop"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": [
":forge-std/=lib/forge-std/src/"
]
}