编译器
0.8.19+commit.7dd6d404
文件 1 的 10:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 10:DelegatedOps.sol
pragma solidity 0.8.19;
contract DelegatedOps {
event DelegateApprovalSet(address indexed caller, address indexed delegate, bool isApproved);
mapping(address owner => mapping(address caller => bool isApproved)) public isApprovedDelegate;
modifier callerOrDelegated(address _account) {
require(msg.sender == _account || isApprovedDelegate[_account][msg.sender], "Delegate not approved");
_;
}
function setDelegateApproval(address _delegate, bool _isApproved) external {
isApprovedDelegate[msg.sender][_delegate] = _isApproved;
emit DelegateApprovalSet(msg.sender, _delegate, _isApproved);
}
}
文件 3 的 10:FeeDistributor.sol
pragma solidity 0.8.19;
import "SafeERC20.sol";
import "ITokenLocker.sol";
import "PrismaOwnable.sol";
import "SystemStart.sol";
import "DelegatedOps.sol";
contract FeeDistributor is PrismaOwnable, SystemStart, DelegatedOps {
using SafeERC20 for IERC20;
ITokenLocker public immutable tokenLocker;
mapping(address token => uint128[65535]) public weeklyFeeAmounts;
mapping(address account => mapping(address feeToken => uint256 claimFromWeek)) public accountClaimWeek;
address[] public feeTokens;
mapping(address token => FeeTokenData) feeTokenData;
struct FeeTokenData {
bool isRegistered;
uint16 firstWeek;
uint16 lastWeek;
}
struct BoundedClaim {
address token;
uint256 claimFromWeek;
uint256 claimUntilWeek;
}
event NewFeeToken(address token);
event FeesReceived(address indexed caller, address indexed token, uint256 indexed week, uint256 amount);
event FeesClaimed(
address indexed account,
address indexed receiver,
address indexed token,
uint256 claimFromWeek,
uint256 claimUntilWeek,
uint256 amount
);
constructor(address _prismaCore, ITokenLocker _tokenLocker) PrismaOwnable(_prismaCore) SystemStart(_prismaCore) {
tokenLocker = _tokenLocker;
}
function feeTokensLength() external view returns (uint) {
return feeTokens.length;
}
function claimable(address account, address[] calldata tokens) external view returns (uint256[] memory amounts) {
uint256 currentWeek = getWeek();
amounts = new uint256[](tokens.length);
if (currentWeek > 0) {
for (uint256 i = 0; i < tokens.length; i++) {
address token = tokens[i];
FeeTokenData memory data = feeTokenData[token];
uint256 claimFromWeek = accountClaimWeek[account][token];
if (claimFromWeek < data.firstWeek) claimFromWeek = data.firstWeek;
uint256 claimUntilWeek = data.lastWeek + 1;
if (claimUntilWeek > currentWeek) claimUntilWeek = currentWeek;
amounts[i] = _getClaimable(account, token, claimFromWeek, claimUntilWeek);
}
}
return amounts;
}
function getClaimBounds(
address account,
address token
) external view returns (uint256 claimFromWeek, uint256 claimUntilWeek) {
uint256 currentWeek = getWeek();
if (currentWeek == 0) return (0, 0);
bool canClaim;
FeeTokenData memory data = feeTokenData[token];
claimFromWeek = accountClaimWeek[account][token];
if (claimFromWeek < data.firstWeek) claimFromWeek = data.firstWeek;
claimUntilWeek = data.lastWeek + 1;
if (claimUntilWeek > currentWeek) claimUntilWeek = currentWeek;
for (uint256 i = claimFromWeek; i < claimUntilWeek; i++) {
uint256 weight = tokenLocker.getAccountWeightAt(account, i);
if (weight == 0) continue;
uint256 totalWeight = tokenLocker.getTotalWeightAt(i);
uint256 amount = (weeklyFeeAmounts[token][i] * weight) / totalWeight;
if (amount > 0) {
claimFromWeek = i;
canClaim = true;
break;
}
}
claimUntilWeek = claimFromWeek + 1;
for (uint256 i = currentWeek - 1; i > claimFromWeek; i--) {
uint256 weight = tokenLocker.getAccountWeightAt(account, i);
if (weight == 0) continue;
uint256 totalWeight = tokenLocker.getTotalWeightAt(i);
uint256 amount = (weeklyFeeAmounts[token][i] * weight) / totalWeight;
if (amount > 0) {
claimUntilWeek = i + 1;
if (claimUntilWeek > currentWeek) claimUntilWeek = currentWeek;
canClaim = true;
break;
}
}
if (canClaim) return (claimFromWeek, claimUntilWeek);
else return (0, 0);
}
function registerNewFeeToken(address token) external onlyOwner returns (bool) {
require(!feeTokenData[token].isRegistered, "Already registered");
feeTokenData[token] = FeeTokenData({ isRegistered: true, firstWeek: uint16(getWeek()), lastWeek: 0 });
feeTokens.push(token);
emit NewFeeToken(token);
return true;
}
function depositFeeToken(address token, uint256 amount) external returns (bool) {
FeeTokenData memory data = feeTokenData[token];
require(data.isRegistered, "Not a registered fee token");
if (amount > 0) {
uint256 received = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
received = IERC20(token).balanceOf(address(this)) - received;
uint256 week = getWeek();
weeklyFeeAmounts[token][week] = uint128(weeklyFeeAmounts[token][week] + received);
if (week > data.lastWeek) {
data.lastWeek = uint16(week);
feeTokenData[token] = data;
}
emit FeesReceived(msg.sender, token, week, amount);
}
return true;
}
function claim(
address account,
address receiver,
address[] calldata tokens
) external callerOrDelegated(account) returns (uint256[] memory claimedAmounts) {
uint256 currentWeek = getWeek();
require(currentWeek > 0, "No claims in first week");
uint256 length = tokens.length;
claimedAmounts = new uint256[](length);
for (uint256 i = 0; i < length; i++) {
address token = tokens[i];
FeeTokenData memory data = feeTokenData[token];
require(data.isRegistered, "Not a registered fee token");
uint256 claimFromWeek = accountClaimWeek[account][token];
if (claimFromWeek < data.firstWeek) claimFromWeek = data.firstWeek;
uint256 claimUntilWeek = data.lastWeek + 1;
if (claimUntilWeek > currentWeek) claimUntilWeek = currentWeek;
accountClaimWeek[account][token] = currentWeek;
uint256 amount = _getClaimable(account, token, claimFromWeek, claimUntilWeek);
if (amount > 0) {
claimedAmounts[i] = amount;
IERC20(token).safeTransfer(receiver, amount);
emit FeesClaimed(account, receiver, token, claimFromWeek, currentWeek, amount);
}
}
return claimedAmounts;
}
function claimWithBounds(
address account,
address receiver,
BoundedClaim[] calldata claims
) external callerOrDelegated(account) returns (uint256[] memory claimedAmounts) {
uint256 currentWeek = getWeek();
claimedAmounts = new uint256[](claims.length);
uint256 length = claims.length;
for (uint i = 0; i < length; i++) {
address token = claims[i].token;
uint256 claimFromWeek = claims[i].claimFromWeek;
uint256 claimUntilWeek = claims[i].claimUntilWeek;
FeeTokenData memory data = feeTokenData[token];
require(data.isRegistered, "Not a registered fee token");
require(claimFromWeek < claimUntilWeek, "claimFromWeek > claimUntilWeek");
require(claimUntilWeek <= currentWeek, "claimUntilWeek too high");
require(accountClaimWeek[account][token] <= claimFromWeek, "claimFromWeek too low");
if (claimFromWeek < data.firstWeek) claimFromWeek = data.firstWeek;
accountClaimWeek[account][token] = claimUntilWeek;
uint256 amount = _getClaimable(account, token, claimFromWeek, claimUntilWeek);
if (amount > 0) {
claimedAmounts[i] = amount;
IERC20(token).safeTransfer(receiver, amount);
emit FeesClaimed(account, receiver, token, claimFromWeek, claimUntilWeek, amount);
}
}
return claimedAmounts;
}
function _getClaimable(
address account,
address token,
uint256 claimFromWeek,
uint256 claimUntilWeek
) internal view returns (uint256 claimableAmount) {
uint128[65535] storage feeAmounts = weeklyFeeAmounts[token];
for (uint256 i = claimFromWeek; i < claimUntilWeek; i++) {
uint256 feeAmount = feeAmounts[i];
if (feeAmount == 0) continue;
uint256 weight = tokenLocker.getAccountWeightAt(account, i);
if (weight == 0) continue;
uint256 totalWeight = tokenLocker.getTotalWeightAt(i);
claimableAmount += (feeAmount * weight) / totalWeight;
}
return claimableAmount;
}
}
文件 4 的 10: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);
}
文件 5 的 10:IERC20Permit.sol
pragma solidity ^0.8.0;
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);
}
文件 6 的 10:IPrismaCore.sol
pragma solidity ^0.8.0;
interface IPrismaCore {
event FeeReceiverSet(address feeReceiver);
event GuardianSet(address guardian);
event NewOwnerAccepted(address oldOwner, address owner);
event NewOwnerCommitted(address owner, address pendingOwner, uint256 deadline);
event NewOwnerRevoked(address owner, address revokedOwner);
event Paused();
event PriceFeedSet(address priceFeed);
event Unpaused();
function acceptTransferOwnership() external;
function commitTransferOwnership(address newOwner) external;
function revokeTransferOwnership() external;
function setFeeReceiver(address _feeReceiver) external;
function setGuardian(address _guardian) external;
function setPaused(bool _paused) external;
function setPriceFeed(address _priceFeed) external;
function OWNERSHIP_TRANSFER_DELAY() external view returns (uint256);
function feeReceiver() external view returns (address);
function guardian() external view returns (address);
function owner() external view returns (address);
function ownershipTransferDeadline() external view returns (uint256);
function paused() external view returns (bool);
function pendingOwner() external view returns (address);
function priceFeed() external view returns (address);
function startTime() external view returns (uint256);
}
文件 7 的 10:ITokenLocker.sol
pragma solidity ^0.8.0;
interface ITokenLocker {
struct LockData {
uint256 amount;
uint256 weeksToUnlock;
}
struct ExtendLockData {
uint256 amount;
uint256 currentWeeks;
uint256 newWeeks;
}
event LockCreated(address indexed account, uint256 amount, uint256 _weeks);
event LockExtended(address indexed account, uint256 amount, uint256 _weeks, uint256 newWeeks);
event LocksCreated(address indexed account, LockData[] newLocks);
event LocksExtended(address indexed account, ExtendLockData[] locks);
event LocksFrozen(address indexed account, uint256 amount);
event LocksUnfrozen(address indexed account, uint256 amount);
event LocksWithdrawn(address indexed account, uint256 withdrawn, uint256 penalty);
function extendLock(uint256 _amount, uint256 _weeks, uint256 _newWeeks) external returns (bool);
function extendMany(ExtendLockData[] calldata newExtendLocks) external returns (bool);
function freeze() external;
function getAccountWeightWrite(address account) external returns (uint256);
function getTotalWeightWrite() external returns (uint256);
function lock(address _account, uint256 _amount, uint256 _weeks) external returns (bool);
function lockMany(address _account, LockData[] calldata newLocks) external returns (bool);
function setPenaltyWithdrawalsEnabled(bool _enabled) external returns (bool);
function unfreeze(bool keepIncentivesVote) external;
function withdrawExpiredLocks(uint256 _weeks) external returns (bool);
function withdrawWithPenalty(uint256 amountToWithdraw) external returns (uint256);
function MAX_LOCK_WEEKS() external view returns (uint256);
function PRISMA_CORE() external view returns (address);
function getAccountActiveLocks(
address account,
uint256 minWeeks
) external view returns (LockData[] memory lockData, uint256 frozenAmount);
function getAccountBalances(address account) external view returns (uint256 locked, uint256 unlocked);
function getAccountWeight(address account) external view returns (uint256);
function getAccountWeightAt(address account, uint256 week) external view returns (uint256);
function getTotalWeight() external view returns (uint256);
function getTotalWeightAt(uint256 week) external view returns (uint256);
function getWeek() external view returns (uint256 week);
function getWithdrawWithPenaltyAmounts(
address account,
uint256 amountToWithdraw
) external view returns (uint256 amountWithdrawn, uint256 penaltyAmountPaid);
function guardian() external view returns (address);
function incentiveVoter() external view returns (address);
function lockToTokenRatio() external view returns (uint256);
function lockToken() external view returns (address);
function owner() external view returns (address);
function penaltyWithdrawalsEnabled() external view returns (bool);
function prismaCore() external view returns (address);
function totalDecayRate() external view returns (uint32);
function totalUpdatedWeek() external view returns (uint16);
}
文件 8 的 10:PrismaOwnable.sol
pragma solidity 0.8.19;
import "IPrismaCore.sol";
contract PrismaOwnable {
IPrismaCore public immutable PRISMA_CORE;
constructor(address _prismaCore) {
PRISMA_CORE = IPrismaCore(_prismaCore);
}
modifier onlyOwner() {
require(msg.sender == PRISMA_CORE.owner(), "Only owner");
_;
}
function owner() public view returns (address) {
return PRISMA_CORE.owner();
}
function guardian() public view returns (address) {
return PRISMA_CORE.guardian();
}
}
文件 9 的 10:SafeERC20.sol
pragma solidity ^0.8.0;
import "IERC20.sol";
import "IERC20Permit.sol";
import "Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
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.isContract(address(token));
}
}
文件 10 的 10:SystemStart.sol
pragma solidity 0.8.19;
import "IPrismaCore.sol";
contract SystemStart {
uint256 immutable startTime;
constructor(address prismaCore) {
startTime = IPrismaCore(prismaCore).startTime();
}
function getWeek() public view returns (uint256 week) {
return (block.timestamp - startTime) / 1 weeks;
}
}
{
"compilationTarget": {
"FeeDistributor.sol": "FeeDistributor"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_prismaCore","type":"address"},{"internalType":"contract ITokenLocker","name":"_tokenLocker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"bool","name":"isApproved","type":"bool"}],"name":"DelegateApprovalSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimFromWeek","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimUntilWeek","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"week","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeesReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"NewFeeToken","type":"event"},{"inputs":[],"name":"PRISMA_CORE","outputs":[{"internalType":"contract IPrismaCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"feeToken","type":"address"}],"name":"accountClaimWeek","outputs":[{"internalType":"uint256","name":"claimFromWeek","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"claim","outputs":[{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"claimFromWeek","type":"uint256"},{"internalType":"uint256","name":"claimUntilWeek","type":"uint256"}],"internalType":"struct FeeDistributor.BoundedClaim[]","name":"claims","type":"tuple[]"}],"name":"claimWithBounds","outputs":[{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"claimable","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFeeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getClaimBounds","outputs":[{"internalType":"uint256","name":"claimFromWeek","type":"uint256"},{"internalType":"uint256","name":"claimUntilWeek","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeek","outputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"isApprovedDelegate","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"registerNewFeeToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"bool","name":"_isApproved","type":"bool"}],"name":"setDelegateApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenLocker","outputs":[{"internalType":"contract ITokenLocker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"weeklyFeeAmounts","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"}]