Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
Minimal Proxy Contract for 0x656de6630d52c6db587e54b2544eacf510f28b80.
EIP-1167 - minimal bytecode implementation that delegates all calls to a known address
EIP-1167 - minimal bytecode implementation that delegates all calls to a known address
- Contract name:
- PulseBeefyVault
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 1
- Verified at
- 2026-02-12T02:11:07.707444Z
contracts/Vaults/PulseBeefyVault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./IStrategy.sol";
contract PulseBeefyVault is ERC20, ReentrancyGuard, Ownable {
using SafeERC20 for IERC20;
IStrategy public strategy;
bool public initialized;
// Strategy upgrade timelock
address public candidateStrategy;
uint256 public proposalTimestamp;
uint256 public approvalDelay;
event NewStratCandidate(address indexed implementation);
event UpgradeStrat(address indexed implementation);
event Deposit(address indexed user, uint256 amount, uint256 shares);
event Withdraw(address indexed user, uint256 amount, uint256 shares);
constructor() ERC20("", "") Ownable(msg.sender) {}
/// @notice Initialize vault (called once after clone deploy)
function initialize(
IStrategy _strategy,
string memory _name,
string memory _symbol,
uint256 _approvalDelay
) external {
require(!initialized, "already initialized");
initialized = true;
strategy = _strategy;
approvalDelay = _approvalDelay;
_setNameSymbol(_name, _symbol);
_transferOwnership(msg.sender);
}
// --- ERC20 overrides for clone naming ---
string private _vaultName;
string private _vaultSymbol;
function name() public view override returns (string memory) {
return bytes(_vaultName).length > 0 ? _vaultName : super.name();
}
function symbol() public view override returns (string memory) {
return bytes(_vaultSymbol).length > 0 ? _vaultSymbol : super.symbol();
}
function _setNameSymbol(string memory n, string memory s) internal {
_vaultName = n;
_vaultSymbol = s;
}
function want() public view returns (IERC20) {
return IERC20(strategy.want());
}
/// @notice Total want tokens held by vault + strategy
function balance() public view returns (uint256) {
return want().balanceOf(address(this)) + IStrategy(strategy).balanceOf();
}
/// @notice How many want tokens a full share is worth
function getPricePerFullShare() public view returns (uint256) {
return totalSupply() == 0 ? 1e18 : (balance() * 1e18) / totalSupply();
}
/// @notice Deposit want tokens, receive pb shares
function deposit(uint256 _amount) public nonReentrant {
strategy.beforeDeposit();
uint256 _pool = balance();
want().safeTransferFrom(msg.sender, address(this), _amount);
earn();
uint256 _after = balance();
_amount = _after - _pool; // handle deflationary tokens
uint256 shares = 0;
if (totalSupply() == 0) {
shares = _amount;
} else {
shares = (_amount * totalSupply()) / _pool;
}
_mint(msg.sender, shares);
emit Deposit(msg.sender, _amount, shares);
}
/// @notice Convenience: deposit all want tokens held by sender
function depositAll() external {
deposit(want().balanceOf(msg.sender));
}
/// @notice Send idle want tokens to the strategy to work
function earn() public {
uint256 _bal = want().balanceOf(address(this));
want().safeTransfer(address(strategy), _bal);
strategy.deposit();
}
/// @notice Withdraw want tokens by burning pb shares
function withdraw(uint256 _shares) public nonReentrant {
uint256 r = (balance() * _shares) / totalSupply();
_burn(msg.sender, _shares);
uint256 b = want().balanceOf(address(this));
if (b < r) {
uint256 _withdraw = r - b;
strategy.withdraw(_withdraw);
uint256 _after = want().balanceOf(address(this));
uint256 _diff = _after - b;
if (_diff < _withdraw) {
r = b + _diff;
}
}
want().safeTransfer(msg.sender, r);
emit Withdraw(msg.sender, r, _shares);
}
/// @notice Convenience: withdraw all shares held by sender
function withdrawAll() external {
withdraw(balanceOf(msg.sender));
}
// --- Strategy upgrade with timelock ---
function proposeStrat(address _implementation) public onlyOwner {
candidateStrategy = _implementation;
proposalTimestamp = block.timestamp;
emit NewStratCandidate(_implementation);
}
function upgradeStrat() public onlyOwner {
require(candidateStrategy != address(0), "no candidate");
require(
block.timestamp >= proposalTimestamp + approvalDelay,
"delay not passed"
);
// Retire old strategy - sends all funds back
strategy.retireStrat();
strategy = IStrategy(candidateStrategy);
candidateStrategy = address(0);
proposalTimestamp = type(uint256).max;
earn();
emit UpgradeStrat(address(strategy));
}
/// @notice Rescue tokens accidentally sent to vault (not want)
function inCaseTokensGetStuck(address _token) external onlyOwner {
require(_token != address(want()), "!want");
uint256 amount = IERC20(_token).balanceOf(address(this));
IERC20(_token).safeTransfer(msg.sender, amount);
}
}
Compiler Settings
{"remappings":[":@1inch/solidity-utils/=lib/solidity-utils/",":@chainlink/=lib/foundry-chainlink-toolkit/",":@chainlink/contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/",":@forge-std/=lib/forge-std/src/",":@gearbox-protocol/core-v2/=lib/core-v2/",":@gearbox-protocol/core-v3/=lib/core-v3/",":@gearbox-protocol/sdk-gov/=lib/sdk-gov/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":@redstone-finance/=lib/integrations-v3/node_modules/@redstone-finance/",":@uniswap/v2-core/=lib/v2-core/",":@uniswap/v2-periphery/=lib/v2-periphery/",":chainlink-brownie-contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/",":chainlink/=lib/chainlink/",":core-v2/=lib/core-v2/contracts/",":core-v3/=lib/core-v3/contracts/",":ds-test/=lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":foundry-chainlink-toolkit/=lib/foundry-chainlink-toolkit/",":foundry-devops/=lib/foundry-devops/",":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",":integrations-v3/=lib/integrations-v3/",":openzeppelin-contracts copy/=lib/openzeppelin-contracts copy/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":sdk-gov/=lib/sdk-gov/",":solidity-lib/=lib/solidity-lib/contracts/",":solidity-utils/=lib/solidity-utils/contracts/",":v2-core/=lib/v2-core/contracts/",":v2-periphery/=lib/v2-periphery/contracts/"],"optimizer":{"runs":1,"enabled":true},"metadata":{"bytecodeHash":"none"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/Vaults/PulseBeefyVault.sol":"PulseBeefyVault"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewStratCandidate","inputs":[{"type":"address","name":"implementation","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpgradeStrat","inputs":[{"type":"address","name":"implementation","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"shares","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"approvalDelay","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"candidateStrategy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositAll","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"earn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPricePerFullShare","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"inCaseTokensGetStuck","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_strategy","internalType":"contract IStrategy"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"},{"type":"uint256","name":"_approvalDelay","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"initialized","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalTimestamp","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeStrat","inputs":[{"type":"address","name":"_implementation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStrategy"}],"name":"strategy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"upgradeStrat","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"want","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_shares","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAll","inputs":[]}]
Contract Creation Code
0x3d602d80600a3d3981f3363d3d373d3d3d363d73656de6630d52c6db587e54b2544eacf510f28b805af43d82803e903d91602b57fd5bf3
Deployed ByteCode
0x363d3d373d3d3d363d73656de6630d52c6db587e54b2544eacf510f28b805af43d82803e903d91602b57fd5bf3