编译器
0.8.24+commit.e11b9ed9
文件 1 的 14:AbridgeMessageHandler.sol
pragma solidity ^0.8.24;
import { IAbridge, IAbridgeMessageHandler } from "./IAbridge.sol";
abstract contract AbridgeMessageHandler is IAbridgeMessageHandler {
IAbridge private _abridge;
event AbridgeUpdated(address indexed oldBridge, address indexed newBridge);
event RouteUpdated(address indexed sender, bool allowed);
error NotCalledFromAbridge();
modifier onlyAbridge() {
if (msg.sender != address(_abridge)) {
revert NotCalledFromAbridge();
}
_;
}
constructor(address abridge_) {
_abridge = IAbridge(abridge_);
}
function abridge() public view returns (IAbridge) {
return _abridge;
}
function _setAbridge(address bridge) internal {
address oldBridge = address(_abridge);
_abridge = IAbridge(bridge);
emit AbridgeUpdated(oldBridge, address(bridge));
}
function _updateRoute(address sender, bool allowed) internal {
_abridge.updateRoute(sender, allowed);
emit RouteUpdated(sender, allowed);
}
}
文件 2 的 14: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();
}
}
}
文件 3 的 14: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;
}
}
文件 4 的 14:DepositPool.sol
pragma solidity ^0.8.24;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { IDepositPool } from "./IDepositPool.sol";
import { IVaultNav } from "../vaultNav/IVaultNav.sol";
import { MessageLib } from "../message-lib/MessageLib.sol";
import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol";
import { Ownable, Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol";
import { IAbridgeMessageHandler } from "../abridge/IAbridge.sol";
import { AbridgeMessageHandler } from "../abridge/AbridgeMessageHandler.sol";
contract DepositPool is AbridgeMessageHandler, Pausable, Ownable2Step, IDepositPool {
using SafeERC20 for IERC20;
address public immutable LSD;
address public immutable ASSET_TOKEN;
uint256 public immutable ASSET_TOKEN_DECIMALS;
address public smartSavingsOnGravity;
mapping(address owner => uint256 totalDeposits) public totalDeposits;
mapping(address owner => uint256 amount) public pendingDeposits;
uint256 public totalLsdMinted;
uint256 public accDepositAmount;
uint256 public depositCap;
address public withdrawer;
address public treasury;
uint128 public lzReceiveGasLimit = 100_000;
IVaultNav public vaultNav;
modifier onlyValidDepositAmount(uint256 _amount) {
if (_amount == 0) {
revert InvalidDepositAmount();
}
if (accDepositAmount + _amount > depositCap) {
revert AmountExceedsDepositCap();
}
_;
}
modifier onlyWithdrawer() {
if (msg.sender != withdrawer) {
revert InvalidWithdrawer(msg.sender);
}
_;
}
constructor(
address _lsd,
address _token,
uint8 _decimals,
address _vaultNav,
address _owner,
address _treasury,
address _abridge,
address _smartSavingsOnGravity
) Ownable(_owner) AbridgeMessageHandler(_abridge) {
if (_lsd == address(0)) {
revert InvalidLSD();
}
LSD = _lsd;
ASSET_TOKEN = _token;
ASSET_TOKEN_DECIMALS = _decimals;
if (_decimals > 18) {
revert InvalidVaultToken();
}
if (_vaultNav == address(0)) {
revert InvalidAddress(_vaultNav);
}
vaultNav = IVaultNav(_vaultNav);
if (_treasury == address(0)) {
revert InvalidAddress(_treasury);
}
treasury = _treasury;
smartSavingsOnGravity = _smartSavingsOnGravity;
}
receive() external payable {}
function deposit(
address _to,
uint256 _amount,
bool _mintOnGravity
) external payable onlyValidDepositAmount(_amount) whenNotPaused {
_deposit(_to, _amount, _mintOnGravity);
}
function depositWithPermit(
address _to,
uint256 _amount,
bool _mintOnGravity,
PermitInput calldata _permit
) external payable onlyValidDepositAmount(_amount) whenNotPaused {
try
IERC20Permit(ASSET_TOKEN).permit(
msg.sender,
address(this),
_permit.value,
_permit.deadline,
_permit.v,
_permit.r,
_permit.s
)
{} catch {}
_deposit(_to, _amount, _mintOnGravity);
}
function withdraw(uint256 _amount) external onlyWithdrawer {
uint256 depositedAmount = 0;
if (ASSET_TOKEN == address(0)) {
depositedAmount = address(this).balance;
} else {
depositedAmount = IERC20(ASSET_TOKEN).balanceOf(address(this));
}
if (_amount == 0 || _amount > depositedAmount) {
revert InvalidWithdrawalAmount(_amount);
}
if (ASSET_TOKEN == address(0)) {
(bool sent, ) = treasury.call{ value: _amount }("");
if (!sent) revert SendFailed(treasury, _amount);
} else {
IERC20(ASSET_TOKEN).safeTransfer(treasury, _amount);
}
emit Withdrawn(treasury, ASSET_TOKEN, _amount, LSD);
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function rescueWithdraw(address _token, address _to) external onlyOwner {
if (_token == address(0)) {
uint256 amount = address(this).balance;
(bool sent, ) = _to.call{ value: amount }("");
if (!sent) {
revert SendFailed(_to, amount);
}
} else {
uint256 _amount = IERC20(_token).balanceOf(address(this));
IERC20(_token).safeTransfer(_to, _amount);
}
}
function setSmartSavingsOnGravity(address _smartSavings) external onlyOwner {
smartSavingsOnGravity = _smartSavings;
emit SmartSavingsOnGravityUpdated(_smartSavings);
}
function setAbridge(address _abridge) external onlyOwner {
_setAbridge(_abridge);
}
function setLzReceiveGasLimit(uint128 _gasLimit) external onlyOwner {
lzReceiveGasLimit = _gasLimit;
emit NewLzReceiveGasLimit(_gasLimit);
}
function setDepositCap(uint256 _amount) external onlyOwner {
if (_amount < accDepositAmount) revert InvalidDepositCap(_amount);
depositCap = _amount;
emit NewDepositCap(_amount);
}
function setWithdrawer(address _withdrawer) external onlyOwner {
withdrawer = _withdrawer;
emit NewWithdrawer(_withdrawer);
}
function setTreasury(address _treasury) external onlyOwner {
if (_treasury == address(0)) {
revert InvalidAddress(_treasury);
}
treasury = _treasury;
emit NewTreasury(_treasury);
}
function setInitialLsdMinted(uint256 _amount) external onlyOwner {
if (totalLsdMinted != 0 || _amount == 0) {
revert InvalidInitialLsdMinted(_amount);
}
totalLsdMinted = _amount;
emit TotalLsdMintedInitialized(_amount);
}
function handleMessage(
address ,
bytes calldata ,
bytes32
) external view override onlyAbridge returns (bytes4) {
revert NotImplemented(IAbridgeMessageHandler.handleMessage.selector);
}
function remainingDepositCap() external view returns (uint256) {
return depositCap - accDepositAmount;
}
function depositFee(address _to) public view returns (uint256) {
(, uint256 amount) = abridge().estimateFee(
smartSavingsOnGravity,
lzReceiveGasLimit,
MessageLib.pack(
MessageLib.Message({
valueType: uint8(MessageLib.TOTAL_CLAIMS_TYPE),
value: totalDeposits[_to],
owner: _to,
timestamp: 0,
delta: 0
})
)
);
return amount;
}
function _deposit(address _to, uint256 _amount, bool _mintOnGravity) internal {
uint256 actualAmount = _amount;
uint256 messageFee = msg.value;
if (ASSET_TOKEN == address(0)) {
if (msg.value < _amount) {
revert InvalidDepositAmount();
}
messageFee -= _amount;
} else {
uint256 balanceBefore = IERC20(ASSET_TOKEN).balanceOf(address(this));
IERC20(ASSET_TOKEN).safeTransferFrom(msg.sender, address(this), _amount);
uint256 balanceAfter = IERC20(ASSET_TOKEN).balanceOf(address(this));
actualAmount = balanceAfter - balanceBefore;
}
accDepositAmount += actualAmount;
uint256 lsdAmount = vaultNav.tokenE18ToLsdAtTime(
LSD,
actualAmount * 10 ** (18 - ASSET_TOKEN_DECIMALS),
uint48(block.timestamp)
);
if (lsdAmount == 0) {
revert DepositAmountTooSmall(actualAmount);
}
totalLsdMinted += lsdAmount;
if (!_mintOnGravity) {
pendingDeposits[_to] += lsdAmount;
emit Deposited(msg.sender, _to, ASSET_TOKEN, actualAmount, LSD, lsdAmount, block.timestamp, 0, 0);
} else {
totalDeposits[_to] += lsdAmount;
uint256 _depositFee = depositFee(_to);
if (messageFee < _depositFee) {
revert InsufficientFee(_depositFee, messageFee);
}
(bytes32 guid, uint256 nativeFee) = _deposited(_to, messageFee);
emit Deposited(
msg.sender,
_to,
ASSET_TOKEN,
actualAmount,
LSD,
lsdAmount,
block.timestamp,
guid,
nativeFee
);
}
}
function _deposited(address _to, uint256 _messageFee) internal returns (bytes32 _guid, uint256 _nativeFee) {
bytes memory message = MessageLib.pack(
MessageLib.Message({
valueType: uint8(MessageLib.TOTAL_DEPOSITS_TYPE),
value: totalDeposits[_to],
owner: _to,
timestamp: 0,
delta: 0
})
);
uint256 balanceBeforeSend = address(this).balance;
_guid = abridge().send{ value: _messageFee }(smartSavingsOnGravity, lzReceiveGasLimit, message);
uint256 balanceAfterSend = address(this).balance;
_nativeFee = balanceBeforeSend - balanceAfterSend;
if (_nativeFee < _messageFee) {
uint256 refundAmount = _messageFee - _nativeFee;
(bool sent, ) = msg.sender.call{ value: refundAmount }("");
if (!sent) revert SendFailed(msg.sender, refundAmount);
}
}
}
文件 5 的 14:IAbridge.sol
pragma solidity ^0.8.24;
interface IAbridgeMessageHandler {
function handleMessage(address _from, bytes calldata _msg, bytes32 guid) external returns (bytes4 response);
}
interface IAbridge {
event MessageSent(address indexed sender, address indexed receiver, bytes32 guid, uint256 fee);
event MessageReceived(address indexed sender, address indexed receiver, bytes32 guid);
event AuthorizedSenderUpdated(address indexed sender, bool authorized);
event RouteUpdated(address indexed receiver, address indexed sender, bool allowed);
error InsufficientFee(uint256 _sent, uint256 _required);
error UnauthorizedSender(address _sender);
error DisallowedRoute(address _sender, address _receiver);
error InvalidReceiverResponse(bytes4 _response);
function updateRoute(address _sender, bool _allowed) external;
function send(
address _receiver,
uint128 _executeGasLimit,
bytes memory _msg
) external payable returns (bytes32 _guid);
function eid() external view returns (uint32);
function authorizedSenders(address sender) external view returns (bool authorized);
function estimateFee(
address _receiver,
uint128 _executeGasLimit,
bytes memory _msg
) external view returns (address _token, uint256 _fee);
}
文件 6 的 14:IDepositPool.sol
pragma solidity ^0.8.24;
interface IDepositPool {
struct PermitInput {
uint256 value;
uint256 deadline;
uint8 v;
bytes32 r;
bytes32 s;
}
event Deposited(
address indexed from,
address indexed to,
address token,
uint256 amount,
address lsd,
uint256 lsdAmount,
uint256 timestamp,
bytes32 guid,
uint256 fee
);
event Withdrawn(address indexed _to, address _token, uint256 _amount, address _lsd);
event NewWithdrawer(address withdrawer);
event NewDepositCap(uint256 cap);
event NewTreasury(address treasury);
event NewLzReceiveGasLimit(uint128 gasLimit);
event SmartSavingsOnGravityUpdated(address addr);
event TotalLsdMintedInitialized(uint256 amount);
error InvalidLSD();
error InvalidVaultToken();
error InvalidDepositAmount();
error AmountExceedsDepositCap();
error InvalidDepositCap(uint256 _cap);
error SendFailed(address to, uint256 amount);
error InvalidWithdrawer(address withdrawer);
error InvalidWithdrawalAmount(uint256 amount);
error InvalidAddress(address addr);
error DepositAmountTooSmall(uint256 amount);
error InsufficientFee(uint256 wanted, uint256 provided);
error NotImplemented(bytes4 selector);
error InvalidInitialLsdMinted(uint256 amount);
function deposit(address _to, uint256 _amount, bool mintOnGravity) external payable;
function depositWithPermit(
address _to,
uint256 _amount,
bool mintOnGravity,
PermitInput calldata _permit
) external payable;
function setDepositCap(uint256 _amount) external;
function setWithdrawer(address _withdrawer) external;
function setTreasury(address _treasury) external;
function withdraw(uint256 _amount) external;
function remainingDepositCap() external view returns (uint256);
function depositFee(address _to) external view returns (uint256);
function LSD() external view returns (address);
function ASSET_TOKEN() external view returns (address);
}
文件 7 的 14: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);
}
文件 8 的 14: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);
}
文件 9 的 14:IVaultNav.sol
pragma solidity ^0.8.24;
interface IVaultNav {
event NavUpdated(address indexed lsd, uint256 nav, uint256 timestamp);
event SetNavUpdater(address indexed lsd, address updater);
error NavNotFound(uint48 _timestamp);
error InvalidNavUpdater(address updater);
error NavInvalidValue(uint256 nav);
error TimestampTooLarge();
error InvalidUpdatePeriod();
error NavUpdateInvalidTimestamp();
function appendNav(address lsd, uint256 nav, uint48 timestamp) external;
function setNavUpdater(address lsd, address updater) external;
function getNavByTimestamp(
address vaultType,
uint48 timestamp
) external view returns (uint256 nav, uint48 updateTime);
function lsdToTokenE18AtTime(address _lsd, uint256 _amount, uint48 _timestamp) external view returns (uint256);
function tokenE18ToLsdAtTime(
address _lsd,
uint256 _tokenAmountE18,
uint48 _timestamp
) external view returns (uint256);
}
文件 10 的 14:MessageLib.sol
pragma solidity ^0.8.24;
library MessageLib {
struct Message {
uint8 valueType;
uint256 value;
address owner;
uint256 timestamp;
uint256 delta;
}
uint256 internal constant _MAX_VALUE = type(uint136).max;
uint256 internal constant _MAX_TIMESTAMP = type(uint48).max;
uint256 internal constant _MAX_DELTA = type(uint128).max;
uint8 public constant TOTAL_DEPOSITS_TYPE = 1;
uint8 public constant TOTAL_POOL_UNLOCKS_TYPE = 2;
uint8 public constant TOTAL_CLAIMS_TYPE = 3;
uint8 public constant TOTAL_REQUESTS_TYPE = 4;
uint8 public constant TOTAL_REDEEMEDS_TYPE = 5;
error MessageLib_ValueOverflow();
error MessageLib_TimestampOverflow();
error MessageLib_DeltaOverflow();
error MessageLib_InvalidMessageLength(uint256 length);
function unpack(bytes memory b) internal pure returns (Message memory m) {
uint8 valueType;
uint136 value;
address owner;
uint48 _timestamp;
uint128 _delta;
if (b.length != 60) revert MessageLib_InvalidMessageLength(b.length);
assembly {
valueType := mload(add(b, 1))
value := mload(add(b, 18))
owner := mload(add(b, 38))
_timestamp := mload(add(b, 44))
_delta := mload(add(b, 60))
}
return Message(valueType, value, owner, _timestamp, _delta);
}
function pack(Message memory m) internal pure returns (bytes memory) {
if (m.value > _MAX_VALUE) revert MessageLib_ValueOverflow();
if (m.timestamp > _MAX_TIMESTAMP) revert MessageLib_TimestampOverflow();
if (m.delta > _MAX_DELTA) revert MessageLib_DeltaOverflow();
return abi.encodePacked(m.valueType, uint136(m.value), m.owner, uint48(m.timestamp), uint128(m.delta));
}
}
文件 11 的 14: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);
}
}
文件 12 的 14:Ownable2Step.sol
pragma solidity ^0.8.20;
import {Ownable} from "./Ownable.sol";
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
function acceptOwnership() public virtual {
address sender = _msgSender();
if (pendingOwner() != sender) {
revert OwnableUnauthorizedAccount(sender);
}
_transferOwnership(sender);
}
}
文件 13 的 14: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());
}
}
文件 14 的 14: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/depositPool/DepositPool.sol": "DepositPool"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"_lsd","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_vaultNav","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_abridge","type":"address"},{"internalType":"address","name":"_smartSavingsOnGravity","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":"AmountExceedsDepositCap","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositAmountTooSmall","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"wanted","type":"uint256"},{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidDepositAmount","type":"error"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"InvalidDepositCap","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvalidInitialLsdMinted","type":"error"},{"inputs":[],"name":"InvalidLSD","type":"error"},{"inputs":[],"name":"InvalidVaultToken","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvalidWithdrawalAmount","type":"error"},{"inputs":[{"internalType":"address","name":"withdrawer","type":"address"}],"name":"InvalidWithdrawer","type":"error"},{"inputs":[],"name":"MessageLib_DeltaOverflow","type":"error"},{"inputs":[],"name":"MessageLib_TimestampOverflow","type":"error"},{"inputs":[],"name":"MessageLib_ValueOverflow","type":"error"},{"inputs":[],"name":"NotCalledFromAbridge","type":"error"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"NotImplemented","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":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldBridge","type":"address"},{"indexed":true,"internalType":"address","name":"newBridge","type":"address"}],"name":"AbridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"lsd","type":"address"},{"indexed":false,"internalType":"uint256","name":"lsdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"NewDepositCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"gasLimit","type":"uint128"}],"name":"NewLzReceiveGasLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"NewTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"}],"name":"NewWithdrawer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"RouteUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"SmartSavingsOnGravityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TotalLsdMintedInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_lsd","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"ASSET_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ASSET_TOKEN_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LSD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"abridge","outputs":[{"internalType":"contract IAbridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_mintOnGravity","type":"bool"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_mintOnGravity","type":"bool"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IDepositPool.PermitInput","name":"_permit","type":"tuple"}],"name":"depositWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"handleMessage","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzReceiveGasLimit","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":"owner","type":"address"}],"name":"pendingDeposits","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingDepositCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_abridge","type":"address"}],"name":"setAbridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDepositCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setInitialLsdMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_gasLimit","type":"uint128"}],"name":"setLzReceiveGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_smartSavings","type":"address"}],"name":"setSmartSavingsOnGravity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawer","type":"address"}],"name":"setWithdrawer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"smartSavingsOnGravity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"totalDeposits","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLsdMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultNav","outputs":[{"internalType":"contract IVaultNav","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]