// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import { ReentrancyGuard } from "openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol";
import { Math } from "openzeppelin-contracts/contracts/utils/math/Math.sol";
/// @notice Per-launch native-ETH custody funded directly by one Dev and up to twenty Team EOAs.
contract BundleVault is ReentrancyGuard {
uint256 public constant MAX_TEAM_WALLETS = 20;
enum State {
Open,
Locked,
Executed,
Cancelled
}
address public immutable factory;
address public immutable creator;
address public immutable dev;
State public state;
bool public consumed;
uint256 public totalDeposited;
uint256 public teamTotalDeposited;
uint256 public totalRefundable;
address[] private _team;
mapping(address contributor => bool) public isTeam;
mapping(address contributor => uint256 amount) public deposited;
mapping(address contributor => uint256 amount) public refundable;
mapping(address contributor => uint256 amount) public actualUsed;
error OnlyFactory();
error OnlyCreator();
error InvalidState(State expected, State actual);
error InvalidContributor(address contributor);
error DuplicateContributor(address contributor);
error TooManyTeamWallets(uint256 supplied);
error ZeroDeposit();
error AmountExceedsBalance(uint256 requested, uint256 available);
error AlreadyConsumed();
error InvalidExecutionAccounting();
error NothingToClaim();
error NativeTransferFailed();
event Deposited(address indexed contributor, uint256 amount, uint256 contributorTotal);
event OpenWithdrawal(address indexed contributor, uint256 amount);
event Locked(uint256 totalDeposited);
event Consumed(uint256 amount);
event Executed(uint256 devUsed, uint256 teamUsed, uint256 refundableAmount);
event Cancelled(uint256 refundableAmount);
event RefundClaimed(address indexed contributor, uint256 amount);
modifier onlyFactory() {
if (msg.sender != factory) revert OnlyFactory();
_;
}
modifier onlyCreator() {
if (msg.sender != creator) revert OnlyCreator();
_;
}
constructor(address factory_, address creator_, address dev_, address[] memory team_) {
if (factory_ == address(0)) revert InvalidContributor(factory_);
if (creator_ == address(0)) revert InvalidContributor(creator_);
if (dev_ == address(0)) revert InvalidContributor(dev_);
if (team_.length > MAX_TEAM_WALLETS) revert TooManyTeamWallets(team_.length);
factory = factory_;
creator = creator_;
dev = dev_;
for (uint256 i; i < team_.length; ++i) {
address member = team_[i];
if (member == address(0)) revert InvalidContributor(member);
if (member == dev_ || isTeam[member]) revert DuplicateContributor(member);
isTeam[member] = true;
_team.push(member);
}
}
function teamCount() external view returns (uint256) {
return _team.length;
}
function teamAt(uint256 index) external view returns (address) {
return _team[index];
}
function teamMembers() external view returns (address[] memory) {
return _team;
}
function isContributor(address account) public view returns (bool) {
return account == dev || isTeam[account];
}
function deposit() external payable {
_requireState(State.Open);
if (!isContributor(msg.sender)) revert InvalidContributor(msg.sender);
if (msg.value == 0) revert ZeroDeposit();
deposited[msg.sender] += msg.value;
totalDeposited += msg.value;
if (isTeam[msg.sender]) teamTotalDeposited += msg.value;
emit Deposited(msg.sender, msg.value, deposited[msg.sender]);
}
function withdrawOpen(uint256 amount) external nonReentrant {
_requireState(State.Open);
uint256 available = deposited[msg.sender];
if (amount == 0 || amount > available) revert AmountExceedsBalance(amount, available);
deposited[msg.sender] = available - amount;
totalDeposited -= amount;
if (isTeam[msg.sender]) teamTotalDeposited -= amount;
_sendNative(msg.sender, amount);
emit OpenWithdrawal(msg.sender, amount);
}
function lock() external onlyFactory {
_requireState(State.Open);
state = State.Locked;
emit Locked(totalDeposited);
}
/// @notice Transfers the locked bundle to the Factory. A reverting launch reverts this transfer and the lock.
function consume() external onlyFactory nonReentrant returns (uint256 amount) {
_requireState(State.Locked);
if (consumed) revert AlreadyConsumed();
consumed = true;
amount = totalDeposited;
_sendNative(factory, amount);
emit Consumed(amount);
}
/// @notice Returns the deterministic per-Team actual-use allocation for an aggregate partially-filled swap.
function previewTeamUsage(uint256 teamUsed)
public
view
returns (address[] memory members, uint256[] memory usedAmounts)
{
if (teamUsed > teamTotalDeposited) revert InvalidExecutionAccounting();
members = _team;
usedAmounts = new uint256[](members.length);
uint256 remainingUsed = teamUsed;
uint256 remainingDeposits = teamTotalDeposited;
for (uint256 i; i < members.length; ++i) {
uint256 memberDeposit = deposited[members[i]];
uint256 memberUsed;
if (remainingUsed != 0 && memberDeposit != 0) {
memberUsed = i + 1 == members.length
? remainingUsed
: Math.mulDiv(remainingUsed, memberDeposit, remainingDeposits);
if (memberUsed > memberDeposit) memberUsed = memberDeposit;
}
usedAmounts[i] = memberUsed;
remainingUsed -= memberUsed;
remainingDeposits -= memberDeposit;
}
if (remainingUsed != 0) revert InvalidExecutionAccounting();
}
/// @notice Finalizes actual ETH use and credits all unused funds to contributor-only pull refunds.
function finalizeExecution(uint256 devUsed, uint256 teamUsed) external payable onlyFactory {
_requireState(State.Locked);
if (!consumed || devUsed > deposited[dev] || teamUsed > teamTotalDeposited) {
revert InvalidExecutionAccounting();
}
uint256 usedTotal = devUsed + teamUsed;
if (usedTotal > totalDeposited || msg.value != totalDeposited - usedTotal) {
revert InvalidExecutionAccounting();
}
state = State.Executed;
actualUsed[dev] = devUsed;
refundable[dev] = deposited[dev] - devUsed;
(address[] memory members, uint256[] memory usedAmounts) = previewTeamUsage(teamUsed);
for (uint256 i; i < members.length; ++i) {
actualUsed[members[i]] = usedAmounts[i];
refundable[members[i]] = deposited[members[i]] - usedAmounts[i];
}
totalRefundable = msg.value;
emit Executed(devUsed, teamUsed, msg.value);
}
/// @notice Cancels an unlaunched bundle. Every contributor retains a pull claim to its full deposit.
function cancel() external onlyCreator {
_requireState(State.Open);
state = State.Cancelled;
totalRefundable = totalDeposited;
emit Cancelled(totalDeposited);
}
function claimRefund() external nonReentrant returns (uint256 amount) {
if (state == State.Executed) {
amount = refundable[msg.sender];
if (amount == 0) revert NothingToClaim();
refundable[msg.sender] = 0;
} else if (state == State.Cancelled) {
amount = deposited[msg.sender];
if (amount == 0) revert NothingToClaim();
deposited[msg.sender] = 0;
} else {
revert InvalidState(State.Executed, state);
}
totalRefundable -= amount;
_sendNative(msg.sender, amount);
emit RefundClaimed(msg.sender, amount);
}
function _requireState(State expected) private view {
if (state != expected) revert InvalidState(expected, state);
}
function _sendNative(address recipient, uint256 amount) private {
(bool success,) = recipient.call{ value: amount }("");
if (!success) revert NativeTransferFailed();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "factory_",
"type": "address",
"internalType": "address"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
},
{
"name": "dev_",
"type": "address",
"internalType": "address"
},
{
"name": "team_",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyConsumed",
"type": "error",
"inputs": []
},
{
"name": "AmountExceedsBalance",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "available",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "DuplicateContributor",
"type": "error",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InvalidContributor",
"type": "error",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InvalidExecutionAccounting",
"type": "error",
"inputs": []
},
{
"name": "InvalidState",
"type": "error",
"inputs": [
{
"name": "expected",
"type": "uint8",
"internalType": "enum BundleVault.State"
},
{
"name": "actual",
"type": "uint8",
"internalType": "enum BundleVault.State"
}
]
},
{
"name": "NativeTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OnlyCreator",
"type": "error",
"inputs": []
},
{
"name": "OnlyFactory",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "TooManyTeamWallets",
"type": "error",
"inputs": [
{
"name": "supplied",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroDeposit",
"type": "error",
"inputs": []
},
{
"name": "Cancelled",
"type": "event",
"inputs": [
{
"name": "refundableAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Consumed",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Deposited",
"type": "event",
"inputs": [
{
"name": "contributor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "contributorTotal",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Executed",
"type": "event",
"inputs": [
{
"name": "devUsed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "teamUsed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "refundableAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Locked",
"type": "event",
"inputs": [
{
"name": "totalDeposited",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OpenWithdrawal",
"type": "event",
"inputs": [
{
"name": "contributor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RefundClaimed",
"type": "event",
"inputs": [
{
"name": "contributor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MAX_TEAM_WALLETS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "actualUsed",
"type": "function",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "cancel",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimRefund",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "consume",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "consumed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "deposit",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "deposited",
"type": "function",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "dev",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "finalizeExecution",
"type": "function",
"inputs": [
{
"name": "devUsed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "teamUsed",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "isContributor",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isTeam",
"type": "function",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "lock",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "previewTeamUsage",
"type": "function",
"inputs": [
{
"name": "teamUsed",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "members",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "usedAmounts",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "refundable",
"type": "function",
"inputs": [
{
"name": "contributor",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "state",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "enum BundleVault.State"
}
],
"stateMutability": "view"
},
{
"name": "teamAt",
"type": "function",
"inputs": [
{
"name": "index",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "teamCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "teamMembers",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "view"
},
{
"name": "teamTotalDeposited",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalDeposited",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalRefundable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "withdrawOpen",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60806040526004361061018e575f3560e01c806391cca3db116100dc578063ce634a8411610087578063e361442d11610062578063e361442d14610487578063ea8a1af0146104a6578063f83d08ba146104ba578063ff50abdc146104ce575f80fd5b8063ce634a841461044c578063d0e30db01461046b578063d0fe7ca214610473575f80fd5b8063c19d93fb116100b7578063c19d93fb146103c9578063c45a0155146103ee578063cb13cddb14610421575f80fd5b806391cca3db14610355578063b3c7854714610388578063b5545a3c146103b5575f80fd5b8063676365741161013c578063833763241161011757806383376324146103175780638caa00831461032c57806391a9207b14610340575f80fd5b806367636574146102a457806368ec0d99146102c1578063773b43e0146102ec575f80fd5b80631dedc6f71161016c5780631dedc6f71461023f57806324851914146102615780632f0099001461028f575f80fd5b806302d05d3f146101925780630432dc9b146101ef5780631d0d35f514610210575b5f80fd5b34801561019d575f80fd5b506101c57f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb0381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101fa575f80fd5b506102036104e3565b6040516101e69190611668565b34801561021b575f80fd5b5061022f61022a36600461167a565b610550565b60405190151581526020016101e6565b34801561024a575f80fd5b506102536105d5565b6040519081526020016101e6565b34801561026c575f80fd5b5061022f61027b36600461167a565b60056020525f908152604090205460ff1681565b6102a261029d3660046116ad565b610750565b005b3480156102af575f80fd5b505f5461022f90610100900460ff1681565b3480156102cc575f80fd5b506102536102db36600461167a565b60076020525f908152604090205481565b3480156102f7575f80fd5b5061025361030636600461167a565b60086020525f908152604090205481565b348015610322575f80fd5b5061025360025481565b348015610337575f80fd5b50600454610253565b34801561034b575f80fd5b5061025360035481565b348015610360575f80fd5b506101c57f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb0381565b348015610393575f80fd5b506103a76103a23660046116cd565b610b36565b6040516101e69291906116e4565b3480156103c0575f80fd5b50610253610d57565b3480156103d4575f80fd5b505f546103e19060ff1681565b6040516101e691906117a2565b3480156103f9575f80fd5b506101c57f000000000000000000000000317ecdc782f90a384f5132d6afcf34e6619eae8d81565b34801561042c575f80fd5b5061025361043b36600461167a565b60066020525f908152604090205481565b348015610457575f80fd5b506101c56104663660046116cd565b610f1b565b6102a2610f56565b34801561047e575f80fd5b50610253601481565b348015610492575f80fd5b506102a26104a13660046116cd565b61108b565b3480156104b1575f80fd5b506102a26111c5565b3480156104c5575f80fd5b506102a26112a7565b3480156104d9575f80fd5b5061025360015481565b6060600480548060200260200160405190810160405280929190818152602001828054801561054657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161051b575b5050505050905090565b5f7f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb0373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806105cf575073ffffffffffffffffffffffffffffffffffffffff82165f9081526005602052604090205460ff165b92915050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000317ecdc782f90a384f5132d6afcf34e6619eae8d1614610645576040517f0c6d42ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61064d61137d565b61065760016113ab565b5f54610100900460ff1615610698576040517f6f47ab5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556001546106f17f000000000000000000000000317ecdc782f90a384f5132d6afcf34e6619eae8d82611414565b6040518181527f6a52cd7f75cfe8b2cd55f985879f8566d6a538bccd6ff5b03501046cca793cfa9060200160405180910390a161074d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b90565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000317ecdc782f90a384f5132d6afcf34e6619eae8d16146107bf576040517f0c6d42ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107c960016113ab565b5f54610100900460ff161580610822575073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb03165f9081526006602052604090205482115b8061082e575060025481115b15610865576040517f942191a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61087082846117dd565b905060015481118061088f57508060015461088b91906117f0565b3414155b156108c6576040517f942191a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660021781557f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb0373ffffffffffffffffffffffffffffffffffffffff168152600860209081526040808320869055600690915290205461094b9084906117f0565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb03165f908152600760205260408120919091558061099d84610b36565b915091505f5b8251811015610ae8578181815181106109be576109be611803565b602002602001015160085f8584815181106109db576109db611803565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550818181518110610a3257610a32611803565b602002602001015160065f858481518110610a4f57610a4f611803565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a9b91906117f0565b60075f858481518110610ab057610ab0611803565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f20556001016109a3565b50346003819055604080518781526020810187905280820192909252517f3e504bb8b225ad41f613b0c3c4205cdd752d1615b4d77cd1773417282fcfb5d99181900360600190a15050505050565b606080600254831115610b75576040517f942191a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805480602002602001604051908101604052809291908181526020018280548015610bd657602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610bab575b50505050509150815167ffffffffffffffff811115610bf757610bf7611830565b604051908082528060200260200182016040528015610c20578160200160208202803683370190505b5060025490915083905f5b8451811015610d17575f60065f878481518110610c4a57610c4a611803565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f845f14158015610c9e57508115155b15610cd4578651610cb08460016117dd565b14610cc557610cc08583866114af565b610cc7565b845b905081811115610cd45750805b80868481518110610ce757610ce7611803565b6020908102919091010152610cfc81866117f0565b9450610d0882856117f0565b93505050806001019050610c2b565b508115610d50576040517f942191a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050915091565b5f610d6061137d565b60025f5460ff166003811115610d7857610d7861173c565b03610ddb5750335f9081526007602052604081205490819003610dc7576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260076020526040812055610e9c565b60035f5460ff166003811115610df357610df361173c565b03610e565750335f9081526006602052604081205490819003610e42576040517f969bf72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260066020526040812055610e9c565b5f546040517f77e5c5f2000000000000000000000000000000000000000000000000000000008152610e939160029160ff9091169060040161185d565b60405180910390fd5b8060035f828254610ead91906117f0565b90915550610ebd90503382611414565b60405181815233907f358fe4192934d3bf28ae181feda1f4bd08ca67f5e2fad55582cce5eb67304ae99060200160405180910390a261074d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f60048281548110610f2f57610f2f611803565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1692915050565b610f5f5f6113ab565b610f6833610550565b610fa0576040517f72300840000000000000000000000000000000000000000000000000000000008152336004820152602401610e93565b345f03610fd9576040517f56316e8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526006602052604081208054349290610ff79084906117dd565b925050819055503460015f82825461100f91906117dd565b9091555050335f9081526005602052604090205460ff1615611042573460025f82825461103c91906117dd565b90915550505b335f81815260066020908152604091829020548251348152918201527f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca910160405180910390a2565b61109361137d565b61109c5f6113ab565b335f908152600660205260409020548115806110b757508082115b156110f8576040517fd0db48520000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610e93565b61110282826117f0565b335f90815260066020526040812091909155600180548492906111269084906117f0565b9091555050335f9081526005602052604090205460ff1615611159578160025f82825461115391906117f0565b90915550505b6111633383611414565b60405182815233907fed75380afb0647d8606b14a9ebbee380fa488370413874a29eb7b7c9eb67094f9060200160405180910390a2506111c260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008afc6b844fdfc010e3f518cd8e5c259f3902eb031614611234576040517f47bc7cc800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61123d5f6113ab565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166003908117909155600154908190556040519081527fc41d93b8bfbf9fd7cf5bfe271fd649ab6a6fec0ea101c23b82a2a28eca2533a9906020015b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000317ecdc782f90a384f5132d6afcf34e6619eae8d1614611316576040517f0c6d42ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61131f5f6113ab565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155546040519081527f032bc66be43dbccb7487781d168eb7bda224628a3b2c3388bdf69b532a3a16119060200161129d565b611385611560565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b8060038111156113bd576113bd61173c565b5f5460ff1660038111156113d3576113d361173c565b146111c2575f546040517f77e5c5f2000000000000000000000000000000000000000000000000000000008152610e9391839160ff9091169060040161185d565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461146a576040519150601f19603f3d011682016040523d82523d5f602084013e61146f565b606091505b50509050806114aa576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f805f6114bc86866115c5565b91509150815f036114e0578381816114d6576114d6611878565b0492505050611559565b8184116114f7576114f76003851502601118611600565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150505b9392505050565b61158c5f60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00611611565b156115c3576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b5414919050565b5f8151808452602084019350602083015f5b8281101561165e57815173ffffffffffffffffffffffffffffffffffffffff1686526020958601959091019060010161162a565b5093949350505050565b602081525f6115596020830184611618565b5f6020828403121561168a575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114611559575f80fd5b5f80604083850312156116be575f80fd5b50508035926020909101359150565b5f602082840312156116dd575f80fd5b5035919050565b604081525f6116f66040830185611618565b82810360208401528084518083526020830191506020860192505f5b81811015611730578351835260209384019390920191600101611712565b50909695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6004811061179e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b602081016105cf8284611769565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156105cf576105cf6117b0565b818103818111156105cf576105cf6117b0565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040810161186b8285611769565b6115596020830184611769565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x6261b4…0bccd0 | 8 days agoSun, 09 Aug 2026 22:27:35 UTC | 0x358fe4…4ae9 | [0] 0x000000000000…3902eb03 data: 0x000000000000000000…a4514014 |
| 0xa190ea…9db0c2 | 8 days agoSun, 09 Aug 2026 22:07:09 UTC | 0x3e504b…b5d9 | data: 0x000000000000000000…a4514014 |
| 0xa190ea…9db0c2 | 8 days agoSun, 09 Aug 2026 22:07:09 UTC | 0x6a52cd…3cfa | data: 0x000000000000000000…672c3000 |
| 0xa190ea…9db0c2 | 8 days agoSun, 09 Aug 2026 22:07:09 UTC | 0x032bc6…1611 | data: 0x000000000000000000…672c3000 |
| 0xc3afdc…cd716a | 8 days agoSun, 09 Aug 2026 22:07:08 UTC | 0x73a19d…88ca | [0] 0x000000000000…3902eb03 data: 0x000000000000000000…b94e0000 |
| 0xc1cee1…b32162 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x73a19d…88ca | [0] 0x000000000000…3271670d data: 0x000000000000000000…d01d6000 |
| 0xf9c66b…d95ed9 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x73a19d…88ca | [0] 0x000000000000…250fef3e data: 0x000000000000000000…d860a000 |
| 0x150c65…36978c | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x73a19d…88ca | [0] 0x000000000000…3b9043ca data: 0x000000000000000000…68e10000 |
| 0xed265d…019254 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x73a19d…88ca | [0] 0x000000000000…08dcf3b7 data: 0x000000000000000000…9c7f3000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x6261b4…0bccd0 | claimRefund | 32,294,940 | 8 days agoSun, 09 Aug 2026 22:27:35 UTC | 0x8afc…eb03 | IN | BundleVault | $0.000 ETH | 0.00000105 | |
| 0xc3afdc…cd716a | Deposit | 32,282,677 | 8 days agoSun, 09 Aug 2026 22:07:08 UTC | 0x8afc…eb03 | IN | BundleVault | $22.720.012 ETH | 0.00000152 | |
| 0xf9c66b…d95ed9 | Deposit | 32,282,674 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x748e…ef3e | IN | BundleVault | $12.070.00637 ETH | 0.00000169 | |
| 0xc1cee1…b32162 | Deposit | 32,282,674 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x2388…670d | IN | BundleVault | $12.100.00639 ETH | 0.00000169 | |
| 0xed265d…019254 | Deposit | 32,282,673 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0x9079…f3b7 | IN | BundleVault | $12.120.00640 ETH | 0.00000265 | |
| 0x150c65…36978c | Deposit | 32,282,673 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0xb877…43ca | IN | BundleVault | $12.150.00641 ETH | 0.00000169 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 32,294,940 | 8 days agoSun, 09 Aug 2026 22:27:35 UTC | 0x6261b4…0bccd0 | CALL | claimRefund | 0x6074…d521 | OUT | 0x8afc…eb03 | 0.00187 ETH |
| 32,282,686 | 8 days agoSun, 09 Aug 2026 22:07:09 UTC | 0xa190ea…9db0c2 | CALL | launch | 0x317e…ae8d | IN | 0x6074…d521 | 0.00187 ETH |
| 32,282,686 | 8 days agoSun, 09 Aug 2026 22:07:09 UTC | 0xa190ea…9db0c2 | CALL | launch | 0x6074…d521 | OUT | 0x317e…ae8d | 0.03758 ETH |
| 32,282,666 | 8 days agoSun, 09 Aug 2026 22:07:07 UTC | 0xa3ca80…6a2dbc | CREATE2 | prepareBundle | 0x499a…d41c | IN | 0x6074…d521 | 0 ETH |