编译器
0.8.20+commit.a1b79de6
文件 1 的 5:ClaimHelper.sol
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./interfaces/IVestingManager.sol";
import "./interfaces/IManagedVestingWallet.sol";
import "./interfaces/IWalletFactory.sol";
contract ClaimHelper is ReentrancyGuard {
struct VestingData {
address manager;
uint256 amount;
bytes32[] proof;
}
address public EYWA;
constructor(address token) {
require(token != address(0), "ClaimHelper: zero address");
EYWA = token;
}
function claim(
address beneficiary,
VestingData[] calldata data
) external nonReentrant {
for (uint256 i; i < data.length; ++i) {
IVestingByWhitelist impl = IVestingByWhitelist(data[i].manager);
try impl.claim(beneficiary, data[i].amount, data[i].proof) {
} catch Error(string memory reason) {
revert(reason);
} catch Panic(uint256) {
revert("ClaimHelper: something went wrong");
} catch (bytes memory) {
revert("ClaimHelper: something went wrong");
}
}
}
function releasable(
address beneficiary,
address factory,
address[] calldata managers
) external view returns (uint256[] memory amounts) {
IWalletFactory factoryImpl = IWalletFactory(factory);
amounts = new uint256[](managers.length);
for (uint256 i; i < managers.length; ++i) {
address wallet = factoryImpl.walletForOrigin(beneficiary, managers[i], 0, true);
if (wallet != address(0)) {
IVestingWallet walletImpl = IVestingWallet(wallet);
amounts[i] = walletImpl.releasable(EYWA);
}
}
}
}
文件 2 的 5:IManagedVestingWallet.sol
pragma solidity ^0.8.17;
import "./IWalletFactory.sol";
interface IVestingWallet {
function start() external view returns (uint256);
function duration() external view returns (uint256);
function cliff(uint64 timestamp) external view returns (uint256);
function beneficiary() external view returns (address);
function releasable(address token) external view returns (uint256);
function released(address token) external view returns (uint256);
}
interface IManagedVestingWallet is IVestingWallet {
function vestingManager() external view returns (address);
}
interface ITransferableVestingWallet1 is IManagedVestingWallet {
function pinnedTo() external view returns (uint256);
function pin(uint256 tokenId_) external;
function unpin(uint256 tokenId_) external;
function merge(address to) external;
function increaseReleased(address token, uint256 amount) external;
}
interface ITransferableVestingWallet2 is ITransferableVestingWallet1 {
function transfer(address beneficiary_, uint8 v, bytes32 r, bytes32 s, uint256 deadline) external;
function transfer(address beneficiary_) external;
}
文件 3 的 5:IVestingManager.sol
pragma solidity ^0.8.17;
import "./IWalletFactory.sol";
interface IVestingManager {
function PERCENTAGE_DENOM() external view returns (uint256);
function token() external view returns (address);
function NFT() external view returns (address);
function DAO() external view returns (address);
function start() external view returns (uint64);
function duration() external view returns (uint64);
function allowMultipleReleases() external view returns (bool);
function cliff(uint256 timestamp) external view returns (uint256);
function setStart(uint64) external;
function setDuration(uint64) external;
function addCliff(uint256 timestamp, uint256 cliff_) external;
function setNFT(address NFT_) external;
function setDAO(address DAO_) external;
function walletFactory() external view returns (address);
function attachWallet(address currentBeneficiary, address newBeneficiary) external;
function getBeneficiaryWallets(address) external view returns (address[] memory wallets);
}
interface IVestingByWhitelist is IVestingManager {
function claim(address beneficiary, uint256 amount, bytes32[] calldata merkleProof) external;
}
interface IVestingByNFT is IVestingManager {
function claim(address beneficiary, uint256 amount, uint256 tokenId) external returns (address);
function transferToWallet(address wallet, uint256 amount) external;
}
文件 4 的 5:IWalletFactory.sol
pragma solidity ^0.8.17;
interface IWalletFactory {
function walletFor(address beneficiary, address vestingManager, uint256 idx, bool strict) external view returns (address);
function walletForOrigin(address beneficiary, address vestingManager, uint256 idx, bool strict) external view returns (address);
function createWallet(address beneficiary, address vestingManager, uint256 idx) external returns (address);
function walletToIdx(address wallet) external returns (uint256);
function isValidWallet(address wallet) external returns (bool);
}
文件 5 的 5: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;
}
}
{
"compilationTarget": {
"contracts/ClaimHelper.sol": "ClaimHelper"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EYWA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"components":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct ClaimHelper.VestingData[]","name":"data","type":"tuple[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"address[]","name":"managers","type":"address[]"}],"name":"releasable","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"}]