编译器
0.8.17+commit.8df45f5f
文件 1 的 6:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 6:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
文件 3 的 6:IERC20.sol
pragma solidity ^0.8.0;
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 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 4 的 6:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 5 的 6:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 6 的 6:Vepoch.sol
pragma solidity 0.8.17;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract VEpoch is ERC20, Ownable {
struct Deposit {
address owner;
uint32 depositTs;
uint32 lockDuration;
uint256 depositTokenBalance;
}
mapping(uint256 => Deposit) public deposits;
uint256 public depositCount;
uint256 public maxDepositDuration = 730 days;
IERC20 public immutable depositToken;
bool public maxDepositDurationLocked;
bool public authorisedLocked;
mapping(address => bool) public authorised;
event Deposited(uint256 depositId);
event DepositExtend(uint256 _depositId, uint32 _secondsExtended);
event WithdrawnForfeit(uint256 depositId, uint256 depositTokensReturned, uint256 veTokensBurned, uint256 rewardForfeit);
event Withdrawn(uint256 depositId, uint256 depositTokensReturned, uint256 veTokensBurned);
event Authorised(address authorisedAddress, bool newAuthorisationStatus);
event MaxDepositDurationSet(uint256 newMaxDepositDuration);
event DepositOwnershipTransferred(uint256 depositId, address newOwner);
event RewardClaimed(uint256 depositId, uint256 yieldTokenAmount);
event RewardForfeit(uint256 depositId, uint256 yieldTokenAmount);
IERC20Metadata public immutable rewardToken;
mapping(uint256 => uint256) public rewardStakingPower;
uint256 private rewardIndex;
mapping(uint256 => uint256) private rewardIndexOf;
mapping(uint256 => uint256) private earned;
mapping(uint256 => uint256) public rewardTokensClaimed;
constructor(address _depositToken, address _yieldToken, address _newOwner) ERC20("Vote Escrow Epoch", "vEPOCH") {
depositToken = IERC20(_depositToken);
rewardToken = IERC20Metadata(_yieldToken);
authorised[address(this)] = true;
_transferOwnership(_newOwner);
}
function transfer(address to, uint256 amount) public override returns (bool) {
require(authorised[msg.sender], "NON TRANSFERABLE");
_transfer(msg.sender, to, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
require(authorised[msg.sender], "NON TRANSFERABLE");
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function addRewardTokens(uint256 _tokenAmount) external {
rewardIndex += (_tokenAmount * 1e18) / totalSupply();
rewardToken.transferFrom(msg.sender, address(this), _tokenAmount);
}
function _calculateRewards(uint256 _depositId) private view returns (uint256) {
uint256 shares = rewardStakingPower[_depositId];
return (shares * (rewardIndex - rewardIndexOf[_depositId])) / 1e18;
}
function calculateRewardsEarned(uint256 _depositId) external view returns (uint256) {
return earned[_depositId] + _calculateRewards(_depositId);
}
function _updateRewards(uint256 _depositId) private {
earned[_depositId] += _calculateRewards(_depositId);
rewardIndexOf[_depositId] = rewardIndex;
}
function _claimYield(uint256 _depositId) private returns (uint256 reward) {
require(deposits[_depositId].owner == msg.sender, "NOT OWNER");
_updateRewards(_depositId);
reward = earned[_depositId];
earned[_depositId] = 0;
rewardTokensClaimed[_depositId] += reward;
emit RewardClaimed(_depositId, reward);
}
function claimYield(uint256 _depositId) public {
uint256 reward = _claimYield(_depositId);
rewardToken.transfer(msg.sender, reward);
}
function claimYield(uint256[] calldata _depositIds) public {
uint256 totalRewards;
for(uint256 i = 0; i < _depositIds.length; i++) {
totalRewards += _claimYield(_depositIds[i]);
}
rewardToken.transfer(msg.sender, totalRewards);
}
function calculateVeTokens(uint256 _tokenAmount, uint256 _duration) public pure returns(uint256) {
return (_tokenAmount * (11574074074075 * _duration)) / 1e18;
}
function deposit(uint256 _tokenAmount, uint32 _duration, address _behalfOf) external returns(uint256 _depositCount) {
require(_duration > 3599 && _duration <= maxDepositDuration, "INVALID DURATION");
_depositCount = ++depositCount;
deposits[_depositCount] = Deposit(
_behalfOf,
uint32(block.timestamp),
_duration,
_tokenAmount
);
uint256 veTokensMinted = calculateVeTokens(_tokenAmount, _duration);
require(veTokensMinted > 0, "INSUFFICIENT VEPOCH MINTED");
_mint(_behalfOf, veTokensMinted);
_updateRewards(_depositCount);
rewardStakingPower[_depositCount] += veTokensMinted;
depositToken.transferFrom(msg.sender, address(this), _tokenAmount);
emit Deposited(_depositCount);
return _depositCount;
}
function withdrawForfeit(uint256 _depositId, uint256 _depositTokensToRemove) external {
Deposit storage d = deposits[_depositId];
require(d.owner == msg.sender, "NOT OWNER");
require(
(d.depositTs + d.lockDuration) > block.timestamp,
"DEPOSIT IS MATURED"
);
require(d.depositTs != block.timestamp, "DEPOSIT IN SAME BLOCK");
uint256 percentage = (_depositTokensToRemove * 1e18) / d.depositTokenBalance;
d.depositTokenBalance -= _depositTokensToRemove;
uint256 veEndTokenBalance = calculateVeTokens(d.depositTokenBalance, d.lockDuration);
uint256 burnAmount = rewardStakingPower[_depositId] - veEndTokenBalance;
require(burnAmount > 0, "INSUFFICIENT VEPOCH BURNED");
_burn(msg.sender, burnAmount);
_updateRewards(_depositId);
rewardStakingPower[_depositId] -= burnAmount;
uint256 forfeitReward = ((earned[_depositId] + rewardTokensClaimed[_depositId]) * percentage) / 1e18;
if(forfeitReward > earned[_depositId]) {
rewardTokensClaimed[_depositId] -= (forfeitReward - earned[_depositId]);
earned[_depositId] = 0;
rewardToken.transferFrom(msg.sender, address(this), forfeitReward - earned[_depositId]);
} else {
earned[_depositId] -= forfeitReward;
}
rewardIndex += (forfeitReward * 1e18) / totalSupply();
emit WithdrawnForfeit(_depositId, _depositTokensToRemove, burnAmount, forfeitReward);
if(d.depositTokenBalance == 0) {
delete deposits[_depositId];
}
depositToken.transfer(msg.sender, _depositTokensToRemove);
}
function withdraw(uint256 _depositId, uint256 _tokenAmount) external {
Deposit storage d = deposits[_depositId];
require(d.owner == msg.sender, "NOT OWNER");
require(
block.timestamp > (d.depositTs + d.lockDuration),
"DEPOSIT NOT MATURED"
);
uint256 veTokensBurned = calculateVeTokens(d.depositTokenBalance, d.lockDuration);
_updateRewards(_depositId);
if(_tokenAmount == d.depositTokenBalance) {
_burn(msg.sender, veTokensBurned);
rewardStakingPower[_depositId] = 0;
claimYield(_depositId);
delete deposits[_depositId];
depositToken.transfer(msg.sender, _tokenAmount);
emit Withdrawn(_depositId, _tokenAmount, veTokensBurned);
return;
}
veTokensBurned = (veTokensBurned * ((_tokenAmount * 1e18) / d.depositTokenBalance)) / 1e18;
d.depositTokenBalance -= _tokenAmount;
require(veTokensBurned > 0, "INSUFFICIENT VEPOCH BURNED");
_burn(msg.sender, veTokensBurned);
rewardStakingPower[_depositId] -= veTokensBurned;
depositToken.transfer(msg.sender, _tokenAmount);
emit Withdrawn(_depositId, _tokenAmount, veTokensBurned);
}
function extendDeposit(uint256 _depositId, uint32 _secondsToExtend) external {
Deposit storage d = deposits[_depositId];
require(d.owner == msg.sender, "NOT OWNER");
require(maxDepositDuration >= d.lockDuration + _secondsToExtend, "INVALID DURATION");
uint256 veTokenDiff = calculateVeTokens(d.depositTokenBalance, _secondsToExtend);
_mint(msg.sender, veTokenDiff);
_updateRewards(_depositId);
rewardStakingPower[_depositId] += veTokenDiff;
deposits[_depositId].lockDuration += _secondsToExtend;
emit DepositExtend(_depositId, _secondsToExtend);
}
function transferDepositOwnership(uint256 _depositId, address _newOwner) external {
Deposit storage d = deposits[_depositId];
require(d.owner == msg.sender, "NOT OWNER");
_transfer(msg.sender, _newOwner, calculateVeTokens(d.depositTokenBalance, d.lockDuration));
d.owner = _newOwner;
emit DepositOwnershipTransferred(_depositId, _newOwner);
}
function setAuthorisedLocked() external onlyOwner {
authorisedLocked = true;
}
function setMaxDepositDurationLocked() external onlyOwner {
maxDepositDurationLocked = true;
}
function setAuthorised(address _address, bool _newAuthorisationStatus) external onlyOwner {
require(!authorisedLocked);
authorised[_address] = _newAuthorisationStatus;
emit Authorised(_address, _newAuthorisationStatus);
}
function setMaxDepositDuration(uint32 _newMaxDepositDuration) external onlyOwner {
require(!maxDepositDurationLocked);
require(_newMaxDepositDuration <= 3650 days, "10 YEAR MAX");
maxDepositDuration = _newMaxDepositDuration;
emit MaxDepositDurationSet(_newMaxDepositDuration);
}
}
{
"compilationTarget": {
"contracts/Vepoch.sol": "VEpoch"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_depositToken","type":"address"},{"internalType":"address","name":"_yieldToken","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"authorisedAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"newAuthorisationStatus","type":"bool"}],"name":"Authorised","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_depositId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"_secondsExtended","type":"uint32"}],"name":"DepositExtend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"DepositOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxDepositDuration","type":"uint256"}],"name":"MaxDepositDurationSet","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":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"yieldTokenAmount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"yieldTokenAmount","type":"uint256"}],"name":"RewardForfeit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositTokensReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veTokensBurned","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositTokensReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"veTokensBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardForfeit","type":"uint256"}],"name":"WithdrawnForfeit","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"addRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authorisedLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"calculateRewardsEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"calculateVeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_depositIds","type":"uint256[]"}],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint32","name":"_duration","type":"uint32"},{"internalType":"address","name":"_behalfOf","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"_depositCount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"deposits","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"depositTs","type":"uint32"},{"internalType":"uint32","name":"lockDuration","type":"uint32"},{"internalType":"uint256","name":"depositTokenBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint32","name":"_secondsToExtend","type":"uint32"}],"name":"extendDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxDepositDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDepositDurationLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardStakingPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokensClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_newAuthorisationStatus","type":"bool"}],"name":"setAuthorised","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAuthorisedLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newMaxDepositDuration","type":"uint32"}],"name":"setMaxDepositDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMaxDepositDurationLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferDepositOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint256","name":"_depositTokensToRemove","type":"uint256"}],"name":"withdrawForfeit","outputs":[],"stateMutability":"nonpayable","type":"function"}]