编译器
0.8.22+commit.4fc1097e
文件 1 的 10:Address.sol
pragma solidity ^0.8.20;
library Address {
error AddressInsufficientBalance(address account);
error AddressEmptyCode(address target);
error FailedInnerCall();
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
function _revert(bytes memory returndata) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}
文件 2 的 10:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 3 的 10:FifthScapeVestingBase.sol
pragma solidity 0.8.22;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
contract FifthScapeVestingBase is Ownable, ReentrancyGuard, Pausable {
using SafeERC20 for IERC20;
IERC20 public token;
uint256 public start;
uint256 public duration;
uint256 public initialReleasePercentage;
uint256 public endDate;
mapping(address => uint256) private _allocatedTokens;
mapping(address => uint256) private _claimedTokens;
mapping(address => bool) private _managers;
mapping(address => bool) private _blacklist;
event TokensAllocated(address indexed beneficiary, uint256 value);
event TokensClaimed(address indexed beneficiary, uint256 value);
event StartUpdated(uint256 oldStart, uint256 newStart);
event TokenUpdated(address oldToken, address newToken);
event ManagerSetted(address manager, bool isManager);
event Blacklisted(address account);
event BlacklistRemoved(address account);
event DurationUpdated(uint256 oldDuration, uint256 newDuration);
event InitialReleasePercentageUpdated(
uint256 oldInitialReleasePercentage,
uint256 newInitialReleasePercentage
);
event EndDateUpdated(uint256 oldEndDate, uint256 newEndDate);
modifier onlyManager() {
require(
_managers[msg.sender] == true,
"FifthScapeVestingBase: not manager"
);
_;
}
constructor(
address token_,
uint256 start_,
uint256 duration_,
uint256 initialReleasePercentage_,
address _owner
) Ownable(_owner) {
token = IERC20(token_);
start = start_;
duration = duration_;
initialReleasePercentage = initialReleasePercentage_;
endDate = start + duration;
}
function claimTokens(
address[] memory _beneficiaries
) public nonReentrant whenNotPaused {
for (uint256 i = 0; i < _beneficiaries.length; i++) {
uint256 claimableTokens = getClaimableTokens(_beneficiaries[i]);
require(
claimableTokens > 0,
"FifthScapeVestingBase: no claimable tokens"
);
require(
_blacklist[_beneficiaries[i]] == false,
"FifthScapeVestingBaseL: beneficiary is blacklisted"
);
_claimedTokens[_beneficiaries[i]] += claimableTokens;
token.safeTransfer(_beneficiaries[i], claimableTokens);
emit TokensClaimed(_beneficiaries[i], claimableTokens);
}
}
function getAllocatedTokens(
address _beneficiary
) public view returns (uint256 amount) {
return _allocatedTokens[_beneficiary];
}
function getClaimedTokens(
address _beneficiary
) public view returns (uint256 amount) {
return _claimedTokens[_beneficiary];
}
function getClaimableTokens(
address _beneficiary
) public view returns (uint256 amount) {
uint256 releasedTokens = getReleasedTokensAtTimestamp(
_beneficiary,
_currentTime()
);
return releasedTokens - _claimedTokens[_beneficiary];
}
function getReleasedTokensAtTimestamp(
address _beneficiary,
uint256 _timestamp
) public view returns (uint256 amount) {
if (_timestamp < start) {
return 0;
}
uint256 elapsedTime = _timestamp - start;
if (elapsedTime >= duration) {
return _allocatedTokens[_beneficiary];
}
uint256 initialRelease = (_allocatedTokens[_beneficiary] *
initialReleasePercentage) / 100;
uint256 remainingTokensAfterInitialRelease = _allocatedTokens[
_beneficiary
] - initialRelease;
uint256 subsequentRelease = (remainingTokensAfterInitialRelease *
elapsedTime) / duration;
uint256 totalReleasedTokens = initialRelease + subsequentRelease;
return totalReleasedTokens;
}
function getBlacklist(
address _account
) public view returns (bool isBlacklist) {
return _blacklist[_account];
}
function getManager(address _account) public view returns (bool isManager) {
isManager = _managers[_account];
}
function allocateTokensManager(
address _benificiary,
uint256 _amount
) external whenNotPaused nonReentrant onlyManager {
address[] memory benificiary = new address[](1);
benificiary[0] = _benificiary;
uint256[] memory amount = new uint256[](1);
amount[0] = _amount;
_allocateTokens(benificiary, amount);
}
function allocateTokens(
address[] memory _benificiaries,
uint256[] memory _amounts
) external onlyOwner {
_allocateTokens(_benificiaries, _amounts);
}
function updateStart(uint256 _start) external onlyOwner {
uint256 oldStart = start;
start = _start;
emit StartUpdated(oldStart, _start);
}
function updateToken(address _token) external onlyOwner {
address oldToken = address(token);
token = IERC20(_token);
emit TokenUpdated(oldToken, _token);
}
function updateDuration(uint256 _newDuration) external onlyOwner {
uint256 oldDuration = duration;
duration = _newDuration;
emit DurationUpdated(oldDuration, _newDuration);
}
function updateInitialReleasePercentage(
uint256 _newInitialReleasePercentage
) external onlyOwner {
uint256 oldInitialReleasePercentage = initialReleasePercentage;
initialReleasePercentage = _newInitialReleasePercentage;
emit InitialReleasePercentageUpdated(
oldInitialReleasePercentage,
_newInitialReleasePercentage
);
}
function updateEndDate(uint256 _newEndDate) external onlyOwner {
uint256 oldEndDate = endDate;
endDate = _newEndDate;
emit EndDateUpdated(oldEndDate, _newEndDate);
}
function setManager(address _manager, bool _isManager) external onlyOwner {
require(
_manager != address(0),
"FifthScapeVestingBase: manager is invalid"
);
_managers[_manager] = _isManager;
emit ManagerSetted(_manager, _isManager);
}
function blacklist(address _beneficiary) external onlyOwner {
require(
_beneficiary != address(0),
"FifthScapeVestingBase: beneficiary is invalid"
);
_allocatedTokens[_beneficiary] = 0;
_claimedTokens[_beneficiary] = 0;
_blacklist[_beneficiary] = true;
emit Blacklisted(_beneficiary);
}
function removeBlacklist(address _beneficiary) external onlyOwner {
require(
_beneficiary != address(0),
"FifthScapeVestingBase: beneficiary is invalid"
);
_blacklist[_beneficiary] = false;
emit BlacklistRemoved(_beneficiary);
}
function _allocateTokens(
address[] memory _beneficiaries,
uint256[] memory _amounts
) internal {
require(
_beneficiaries.length == _amounts.length,
"FifthScapeVestingBase: beneficiaries and amounts length mismatched"
);
for (uint256 i = 0; i < _beneficiaries.length; i++) {
require(
_beneficiaries[i] != address(0),
"FifthScapeVestingBase: invalid beneficiary"
);
require(
_blacklist[_beneficiaries[i]] == false,
"FifthScapeVestingBaseL: beneficiary is blacklisted"
);
_allocatedTokens[_beneficiaries[i]] =
_allocatedTokens[_beneficiaries[i]] +
_amounts[i];
emit TokensAllocated(_beneficiaries[i], _amounts[i]);
}
}
function _currentTime() internal view returns (uint256 currentTime) {
currentTime = block.timestamp;
}
function withdrawERC20(
address _tokenAddress,
uint256 _amount
) external onlyOwner {
IERC20 currentToken = IERC20(_tokenAddress);
currentToken.approve(address(this), _amount);
currentToken.safeTransferFrom(address(this), owner(), _amount);
}
function withdrawNative(uint256 _amount) external onlyOwner {
(bool hs, ) = payable(owner()).call{value: _amount}("");
require(hs, "EnergiWanBridge:: Failed to withdraw native coins");
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
}
文件 4 的 10:FifthScapeVesting_Presale.sol
pragma solidity 0.8.22;
import {FifthScapeVestingBase} from "./base/FifthScapeVestingBase.sol";
contract FifthScapeVesting_Presale is FifthScapeVestingBase {
uint256 private START = 1734693212;
uint256 private DURATION = 240 days;
uint256 private INITIAL_RELEASE_PERCENTAGE = 40;
constructor(
address _token,
address _owner
)
FifthScapeVestingBase(
_token,
START,
DURATION,
INITIAL_RELEASE_PERCENTAGE,
_owner
)
{}
}
文件 5 的 10:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 6 的 10:IERC20Permit.sol
pragma solidity ^0.8.20;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 7 的 10:Ownable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
error OwnableUnauthorizedAccount(address account);
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 8 的 10:Pausable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Pausable is Context {
bool private _paused;
event Paused(address account);
event Unpaused(address account);
error EnforcedPause();
error ExpectedPause();
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 9 的 10:ReentrancyGuard.sol
pragma solidity ^0.8.20;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
_status = ENTERED;
}
function _nonReentrantAfter() private {
_status = NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
文件 10 的 10:SafeERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
error SafeERC20FailedOperation(address token);
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}
{
"compilationTarget": {
"contracts/vesting/FifthScapeVesting_Presale.sol": "FifthScapeVesting_Presale"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"DurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldEndDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndDate","type":"uint256"}],"name":"EndDateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldInitialReleasePercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newInitialReleasePercentage","type":"uint256"}],"name":"InitialReleasePercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"},{"indexed":false,"internalType":"bool","name":"isManager","type":"bool"}],"name":"ManagerSetted","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStart","type":"uint256"}],"name":"StartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokensAllocated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_benificiaries","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"allocateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_benificiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"allocateTokensManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiaries","type":"address[]"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getAllocatedTokens","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getBlacklist","outputs":[{"internalType":"bool","name":"isBlacklist","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getClaimableTokens","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"getClaimedTokens","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getManager","outputs":[{"internalType":"bool","name":"isManager","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getReleasedTokensAtTimestamp","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialReleasePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"removeBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"bool","name":"_isManager","type":"bool"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDuration","type":"uint256"}],"name":"updateDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEndDate","type":"uint256"}],"name":"updateEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInitialReleasePercentage","type":"uint256"}],"name":"updateInitialReleasePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"}],"name":"updateStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"}]