// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/*
* Caffee trading — pump.fun-style bonding curve + fair launch, graduating to the
* live Uniswap-V2 DEX on Robinhood Chain.
*
* LaunchToken : fixed-supply ERC-20 (reused from the launchpad).
* CaffeeCurve : holds the whole supply; buy()/sell() on a virtual-reserve
* constant-product curve with a platform fee; graduates to a
* Uniswap-V2 WETH pair (liquidity locked) when the curve sells out.
* CaffeeLaunch : factory — deploys token (CREATE2, vanity-able) + curve with
* pump.fun default params and seeds the supply.
*
* Defaults (owner-tunable on the factory):
* total supply 1,000,000,000
* for the curve 800,000,000 (sold via buys)
* for graduation LP 200,000,000 (added to the DEX pair, LP burned)
* virtual token res 1,073,000,000 virtual ETH res 1.2 fee 1%
* -> selling out the curve raises ~3.5 ETH, which all becomes locked LP.
*/
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) external view returns (uint256);
function transfer(address, uint256) external returns (bool);
function allowance(address, address) external view returns (uint256);
function approve(address, uint256) external returns (bool);
function transferFrom(address, address, uint256) external returns (bool);
}
interface IWETH is IERC20 { function deposit() external payable; }
interface IUniV2Factory {
function getPair(address, address) external view returns (address);
function createPair(address, address) external returns (address);
}
interface IUniV2Pair { function mint(address to) external returns (uint256); }
/* ----------------------------- LaunchToken ----------------------------- */
contract LaunchToken is IERC20 {
string public name;
string public symbol;
uint8 public immutable decimals;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
address public owner;
bool public immutable mintable;
bool public immutable burnable;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
modifier onlyOwner() { require(msg.sender == owner, "NOT_OWNER"); _; }
constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _initialSupply, address _owner, bool _mintable, bool _burnable) {
require(_owner != address(0), "OWNER_ZERO");
name = _name; symbol = _symbol; decimals = _decimals; owner = _owner; mintable = _mintable; burnable = _burnable;
if (_initialSupply > 0) { _totalSupply = _initialSupply; _balances[_owner] = _initialSupply; emit Transfer(address(0), _owner, _initialSupply); }
emit OwnershipTransferred(address(0), _owner);
}
function totalSupply() external view returns (uint256) { return _totalSupply; }
function balanceOf(address a) external view returns (uint256) { return _balances[a]; }
function allowance(address o, address s) external view returns (uint256) { return _allowances[o][s]; }
function transfer(address to, uint256 amt) external returns (bool) { _transfer(msg.sender, to, amt); return true; }
function approve(address sp, uint256 amt) external returns (bool) { _allowances[msg.sender][sp] = amt; emit Approval(msg.sender, sp, amt); return true; }
function transferFrom(address f, address to, uint256 amt) external returns (bool) {
uint256 a = _allowances[f][msg.sender];
if (a != type(uint256).max) { require(a >= amt, "ALLOWANCE"); _allowances[f][msg.sender] = a - amt; emit Approval(f, msg.sender, a - amt); }
_transfer(f, to, amt); return true;
}
function _transfer(address f, address to, uint256 amt) internal {
require(to != address(0), "TO_ZERO");
uint256 b = _balances[f]; require(b >= amt, "BALANCE");
unchecked { _balances[f] = b - amt; _balances[to] += amt; }
emit Transfer(f, to, amt);
}
function mint(address to, uint256 amt) external onlyOwner { require(mintable, "NOT_MINTABLE"); require(to != address(0), "TO_ZERO"); _totalSupply += amt; unchecked { _balances[to] += amt; } emit Transfer(address(0), to, amt); }
function burn(uint256 amt) external { require(burnable, "NOT_BURNABLE"); uint256 b = _balances[msg.sender]; require(b >= amt, "BALANCE"); unchecked { _balances[msg.sender] = b - amt; _totalSupply -= amt; } emit Transfer(msg.sender, address(0), amt); }
function transferOwnership(address n) external onlyOwner { require(n != address(0), "OWNER_ZERO"); emit OwnershipTransferred(owner, n); owner = n; }
function renounceOwnership() external onlyOwner { emit OwnershipTransferred(owner, address(0)); owner = address(0); }
}
/* ----------------------------- CaffeeCurve ----------------------------- */
contract CaffeeCurve {
address constant BURN = 0x000000000000000000000000000000000000dEaD;
IERC20 public immutable token;
address public immutable creator;
address public immutable treasury;
IWETH public immutable weth;
IUniV2Factory public immutable dexFactory;
uint256 public immutable curveSupply; // sellable tokens
uint256 public immutable lpSupply; // tokens reserved for graduation LP
uint16 public immutable feeBps;
uint256 public virtualTokenReserves;
uint256 public virtualEthReserves;
uint256 public realTokenReserves; // sellable remaining
uint256 public realEthReserves; // ETH collected (net of fees), == contract balance
bool public graduated;
address public pair;
uint256 private _lock;
modifier lock() { require(_lock == 0, "REENTRANT"); _lock = 1; _; _lock = 0; }
modifier live() { require(!graduated, "GRADUATED"); _; }
event Buy(address indexed buyer, address indexed to, uint256 ethIn, uint256 tokensOut, uint256 refund);
event Sell(address indexed seller, uint256 tokensIn, uint256 ethOut);
event Graduated(address indexed pair, uint256 ethToLp, uint256 tokensToLp);
constructor(address _token, address _creator, address _treasury, address _weth, address _dexFactory,
uint256 _vToken, uint256 _vEth, uint256 _curveSupply, uint256 _lpSupply, uint16 _feeBps) {
token = IERC20(_token); creator = _creator; treasury = _treasury;
weth = IWETH(_weth); dexFactory = IUniV2Factory(_dexFactory);
curveSupply = _curveSupply; lpSupply = _lpSupply; feeBps = _feeBps;
virtualTokenReserves = _vToken; virtualEthReserves = _vEth;
realTokenReserves = _curveSupply; realEthReserves = 0;
}
function buy(uint256 minTokensOut) external payable returns (uint256) { return _buy(msg.sender, minTokensOut); }
function buyFor(address to, uint256 minTokensOut) external payable returns (uint256) { return _buy(to, minTokensOut); }
function _buy(address to, uint256 minTokensOut) internal lock live returns (uint256 tokensOut) {
require(msg.value > 0, "NO_ETH");
uint256 gross = msg.value;
uint256 ethIn = gross - (gross * feeBps) / 10000;
tokensOut = (ethIn * virtualTokenReserves) / (virtualEthReserves + ethIn);
uint256 fee;
uint256 refund;
if (tokensOut >= realTokenReserves) {
// final buy — sell exactly the remaining curve supply, refund the excess
tokensOut = realTokenReserves;
ethIn = (virtualEthReserves * tokensOut) / (virtualTokenReserves - tokensOut);
uint256 grossNeeded = (ethIn * 10000) / (10000 - feeBps);
if (grossNeeded > gross) grossNeeded = gross;
fee = grossNeeded - ethIn;
refund = gross - grossNeeded;
} else {
fee = gross - ethIn;
}
require(tokensOut >= minTokensOut, "SLIPPAGE");
// effects
virtualEthReserves += ethIn;
virtualTokenReserves -= tokensOut;
realEthReserves += ethIn;
realTokenReserves -= tokensOut;
// interactions
require(token.transfer(to, tokensOut), "TOK_OUT");
if (fee > 0) _sendEth(treasury, fee);
if (refund > 0) _sendEth(msg.sender, refund);
emit Buy(msg.sender, to, ethIn, tokensOut, refund);
if (realTokenReserves == 0) _graduate();
}
function sell(uint256 tokenAmount, uint256 minEthOut) external lock live returns (uint256) {
require(tokenAmount > 0, "NO_TOKENS");
uint256 ethOut = (tokenAmount * virtualEthReserves) / (virtualTokenReserves + tokenAmount);
require(ethOut <= realEthReserves, "INSUFFICIENT");
uint256 fee = (ethOut * feeBps) / 10000;
uint256 toUser = ethOut - fee;
require(toUser >= minEthOut, "SLIPPAGE");
// effects
virtualEthReserves -= ethOut;
virtualTokenReserves += tokenAmount;
realEthReserves -= ethOut;
realTokenReserves += tokenAmount;
// interactions
require(token.transferFrom(msg.sender, address(this), tokenAmount), "TOK_IN");
if (fee > 0) _sendEth(treasury, fee);
_sendEth(msg.sender, toUser);
emit Sell(msg.sender, tokenAmount, toUser);
return toUser;
}
function _graduate() internal {
graduated = true;
address p = dexFactory.getPair(address(token), address(weth));
if (p == address(0)) p = dexFactory.createPair(address(token), address(weth));
pair = p;
uint256 ethForLp = realEthReserves;
realEthReserves = 0;
weth.deposit{value: ethForLp}();
require(weth.transfer(p, ethForLp), "WETH_XFER");
require(token.transfer(p, lpSupply), "TOK_LP");
IUniV2Pair(p).mint(BURN); // LP tokens locked forever
emit Graduated(p, ethForLp, lpSupply);
}
function _sendEth(address to, uint256 amt) internal { (bool ok, ) = to.call{value: amt}(""); require(ok, "ETH_SEND"); }
/* ---- views for the UI ---- */
function spotPrice() public view returns (uint256) { return virtualEthReserves * 1e18 / virtualTokenReserves; } // wei per token
function getBuyQuote(uint256 ethIn) external view returns (uint256 tokensOut) {
uint256 net = ethIn - ethIn * feeBps / 10000;
tokensOut = net * virtualTokenReserves / (virtualEthReserves + net);
if (tokensOut > realTokenReserves) tokensOut = realTokenReserves;
}
function getSellQuote(uint256 tokenIn) external view returns (uint256 ethOut) {
uint256 gross = tokenIn * virtualEthReserves / (virtualTokenReserves + tokenIn);
ethOut = gross - gross * feeBps / 10000;
}
function tokensSold() external view returns (uint256) { return curveSupply - realTokenReserves; }
receive() external payable { revert("NO_DIRECT_ETH"); }
}
/* ----------------------------- CaffeeLaunch ---------------------------- */
contract CaffeeLaunch {
address public owner;
address public treasury;
uint16 public feeBps;
IWETH public immutable weth;
IUniV2Factory public immutable dexFactory;
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 ether;
uint256 public constant CURVE_SUPPLY = 800_000_000 ether;
uint256 public constant LP_SUPPLY = 200_000_000 ether;
uint256 public virtualTokenInit = 1_073_000_000 ether;
uint256 public virtualEthInit = 1.2 ether;
address[] public curves;
mapping(address => address) public curveOf; // token => curve
event Launched(address indexed token, address indexed curve, address indexed creator, string name, string symbol);
event ParamsUpdated(uint256 vToken, uint256 vEth, uint16 feeBps, address treasury);
modifier onlyOwner() { require(msg.sender == owner, "NOT_OWNER"); _; }
constructor(address _treasury, uint16 _feeBps, address _weth, address _dexFactory) {
require(_feeBps <= 500, "FEE_TOO_HIGH");
owner = msg.sender;
treasury = _treasury == address(0) ? msg.sender : _treasury;
feeBps = _feeBps;
weth = IWETH(_weth);
dexFactory = IUniV2Factory(_dexFactory);
}
/// Deploy a fair-launch token (CREATE2 via `salt`, so the address can be vanity-ground)
/// + its bonding curve, seeded with the whole supply. Optional dev-buy with msg.value.
function launch(string calldata name, string calldata symbol, bytes32 salt, uint256 minCreatorTokens)
external payable returns (address token, address curve)
{
LaunchToken t = new LaunchToken{salt: salt}(name, symbol, 18, TOTAL_SUPPLY, address(this), false, false);
CaffeeCurve c = new CaffeeCurve(address(t), msg.sender, treasury, address(weth), address(dexFactory),
virtualTokenInit, virtualEthInit, CURVE_SUPPLY, LP_SUPPLY, feeBps);
require(t.transfer(address(c), TOTAL_SUPPLY), "SEED");
t.renounceOwnership();
if (msg.value > 0) c.buyFor{value: msg.value}(msg.sender, minCreatorTokens);
curves.push(address(c));
curveOf[address(t)] = address(c);
emit Launched(address(t), address(c), msg.sender, name, symbol);
return (address(t), address(c));
}
function predictToken(string calldata name, string calldata symbol, bytes32 salt) external view returns (address) {
bytes memory init = abi.encodePacked(type(LaunchToken).creationCode,
abi.encode(name, symbol, uint8(18), TOTAL_SUPPLY, address(this), false, false));
bytes32 h = keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, keccak256(init)));
return address(uint160(uint256(h)));
}
function curvesLength() external view returns (uint256) { return curves.length; }
function setParams(uint256 _vToken, uint256 _vEth, uint16 _feeBps, address _treasury) external onlyOwner {
require(_feeBps <= 500, "FEE_TOO_HIGH");
virtualTokenInit = _vToken; virtualEthInit = _vEth; feeBps = _feeBps;
treasury = _treasury == address(0) ? owner : _treasury;
emit ParamsUpdated(_vToken, _vEth, _feeBps, treasury);
}
function transferOwnership(address n) external onlyOwner { require(n != address(0), "OWNER_ZERO"); owner = n; }
}[
{
"type": "constructor",
"inputs": [
{
"name": "_name",
"type": "string",
"internalType": "string"
},
{
"name": "_symbol",
"type": "string",
"internalType": "string"
},
{
"name": "_decimals",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "_initialSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
},
{
"name": "_mintable",
"type": "bool",
"internalType": "bool"
},
{
"name": "_burnable",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "o",
"type": "address",
"internalType": "address"
},
{
"name": "s",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "sp",
"type": "address",
"internalType": "address"
},
{
"name": "amt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "burn",
"type": "function",
"inputs": [
{
"name": "amt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "burnable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "mint",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "mintable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "f",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amt",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "n",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063a07c7ce411610066578063a07c7ce414610257578063a9059cbb1461027e578063dd62ed3e14610291578063f2fde38b146102ca57600080fd5b806370a08231146101f3578063715018a61461021c5780638da5cb5b1461022457806395d89b411461024f57600080fd5b8063313ce567116100d3578063313ce5671461016b57806340c10f19146101a457806342966c68146101b95780634bf365df146101cc57600080fd5b806306fdde0314610105578063095ea7b31461012357806318160ddd1461014657806323b872dd14610158575b600080fd5b61010d6102dd565b60405161011a9190610953565b60405180910390f35b6101366101313660046109bd565b61036b565b604051901515815260200161011a565b6002545b60405190815260200161011a565b6101366101663660046109e7565b6103d8565b6101927f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161011a565b6101b76101b23660046109bd565b6104cb565b005b6101b76101c7366004610a24565b6105fd565b6101367f000000000000000000000000000000000000000000000000000000000000000081565b61014a610201366004610a3d565b6001600160a01b031660009081526003602052604090205490565b6101b76106f2565b600554610237906001600160a01b031681565b6040516001600160a01b03909116815260200161011a565b61010d610766565b6101367f000000000000000000000000000000000000000000000000000000000000000081565b61013661028c3660046109bd565b610773565b61014a61029f366004610a5f565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b6101b76102d8366004610a3d565b610789565b600080546102ea90610a92565b80601f016020809104026020016040519081016040528092919081815260200182805461031690610a92565b80156103635780601f1061033857610100808354040283529160200191610363565b820191906000526020600020905b81548152906001019060200180831161034657829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103c69086815260200190565b60405180910390a35060015b92915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146104b557828110156104465760405162461bcd60e51b8152602060048201526009602482015268414c4c4f57414e434560b81b60448201526064015b60405180910390fd5b6104508382610ae2565b6001600160a01b0386166000818152600460209081526040808320338085529252909120929092557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256104a38685610ae2565b60405190815260200160405180910390a35b6104c0858585610852565b506001949350505050565b6005546001600160a01b031633146104f55760405162461bcd60e51b815260040161043d90610af5565b7f00000000000000000000000000000000000000000000000000000000000000006105515760405162461bcd60e51b815260206004820152600c60248201526b4e4f545f4d494e5441424c4560a01b604482015260640161043d565b6001600160a01b0382166105915760405162461bcd60e51b8152602060048201526007602482015266544f5f5a45524f60c81b604482015260640161043d565b80600260008282546105a39190610b18565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b7f00000000000000000000000000000000000000000000000000000000000000006106595760405162461bcd60e51b815260206004820152600c60248201526b4e4f545f4255524e41424c4560a01b604482015260640161043d565b33600090815260036020526040902054818110156106a35760405162461bcd60e51b815260206004820152600760248201526642414c414e434560c81b604482015260640161043d565b3360008181526003602090815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016105f1565b6005546001600160a01b0316331461071c5760405162461bcd60e51b815260040161043d90610af5565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600180546102ea90610a92565b6000610780338484610852565b50600192915050565b6005546001600160a01b031633146107b35760405162461bcd60e51b815260040161043d90610af5565b6001600160a01b0381166107f65760405162461bcd60e51b815260206004820152600a6024820152694f574e45525f5a45524f60b01b604482015260640161043d565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166108925760405162461bcd60e51b8152602060048201526007602482015266544f5f5a45524f60c81b604482015260640161043d565b6001600160a01b038316600090815260036020526040902054818110156108e55760405162461bcd60e51b815260206004820152600760248201526642414c414e434560c81b604482015260640161043d565b6001600160a01b0380851660008181526003602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109459086815260200190565b60405180910390a350505050565b602081526000825180602084015260005b818110156109815760208186018101516040868401015201610964565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146109b857600080fd5b919050565b600080604083850312156109d057600080fd5b6109d9836109a1565b946020939093013593505050565b6000806000606084860312156109fc57600080fd5b610a05846109a1565b9250610a13602085016109a1565b929592945050506040919091013590565b600060208284031215610a3657600080fd5b5035919050565b600060208284031215610a4f57600080fd5b610a58826109a1565b9392505050565b60008060408385031215610a7257600080fd5b610a7b836109a1565b9150610a89602084016109a1565b90509250929050565b600181811c90821680610aa657607f821691505b602082108103610ac657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156103d2576103d2610acc565b6020808252600990820152682727aa2fa7aba722a960b91b604082015260600190565b808201808211156103d2576103d2610acc56fea2646970667358221220ac9ab10c99a9ee4249f5101493888078eda77baff88fa1d0a4f4e2109ffb302564736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x5ddc03…89931b | 12 days agoTue, 04 Aug 2026 05:27:39 UTC | Transfer | [0] 0x000000000000…e08b71d1 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…4c27b209 |
| 0x5ddc03…89931b | 12 days agoTue, 04 Aug 2026 05:27:39 UTC | Approval | [0] 0x000000000000…e08b71d1 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…00000000 |
| 0x5ddc03…89931b | 12 days agoTue, 04 Aug 2026 05:27:39 UTC | Approval | [0] 0x000000000000…e08b71d1 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…4c27b209 |
| 0x5ddc03…89931b | 12 days agoTue, 04 Aug 2026 05:27:39 UTC | Transfer | [0] 0x000000000000…9526913e [1] 0x000000000000…e08b71d1 data: 0x000000000000000000…4c27b209 |
| 0x5ddc03…89931b | 12 days agoTue, 04 Aug 2026 05:27:39 UTC | Approval | [0] 0x000000000000…9526913e [1] 0x000000000000…e08b71d1 data: 0x000000000000000000…00000000 |
| 0x320db3…971b99 | 12 days agoTue, 04 Aug 2026 05:27:33 UTC | Approval | [0] 0x000000000000…9526913e [1] 0x000000000000…e08b71d1 data: 0x000000000000000000…4c27b209 |
| 0xe429c4…a984f9 | 12 days agoTue, 04 Aug 2026 05:27:09 UTC | Approval | [0] 0x000000000000…9526913e [1] 0x000000000000…e08b71d1 data: 0x000000000000000000…4c27b209 |
| 0x92dbf5…06b551 | 23 days agoFri, 24 Jul 2026 15:01:31 UTC | Transfer | [0] 0x000000000000…75b7029a [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…a759237f |
| 0x92dbf5…06b551 | 23 days agoFri, 24 Jul 2026 15:01:31 UTC | Approval | [0] 0x000000000000…75b7029a [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…00000000 |
| 0x1bc1c4…1a624b | 23 days agoFri, 24 Jul 2026 15:01:23 UTC | Approval | [0] 0x000000000000…75b7029a [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…a759237f |
| 0xe5cfea…8dc127 | 24 days agoThu, 23 Jul 2026 06:38:34 UTC | Approval | [0] 0x000000000000…d28a495e [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0x180246…4e738a | 24 days agoThu, 23 Jul 2026 02:04:06 UTC | Transfer | [0] 0x000000000000…059dbb1e [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…4eeb9eda |
| 0x180246…4e738a | 24 days agoThu, 23 Jul 2026 02:04:06 UTC | Approval | [0] 0x000000000000…059dbb1e [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…99146126 |
| 0xb4fafd…686d6b | 24 days agoThu, 23 Jul 2026 02:03:57 UTC | Approval | [0] 0x000000000000…059dbb1e [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…e8000000 |
| 0xbcf6c3…c72db1 | 25 days agoWed, 22 Jul 2026 15:31:30 UTC | Transfer | [0] 0x000000000000…afb26100 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…76c840ed |
| 0xbcf6c3…c72db1 | 25 days agoWed, 22 Jul 2026 15:31:30 UTC | Approval | [0] 0x000000000000…afb26100 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…00000000 |
| 0xbf9cfb…0ffe34 | 25 days agoWed, 22 Jul 2026 15:31:19 UTC | Approval | [0] 0x000000000000…afb26100 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…76c840ed |
| 0x4cc5b5…e7cf64 | 25 days agoWed, 22 Jul 2026 14:37:56 UTC | Transfer | [0] 0x000000000000…01df2246 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…ffcd8389 |
| 0x4cc5b5…e7cf64 | 25 days agoWed, 22 Jul 2026 14:37:56 UTC | Approval | [0] 0x000000000000…01df2246 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…00000000 |
| 0xc6628a…1ba217 | 25 days agoWed, 22 Jul 2026 14:37:48 UTC | Approval | [0] 0x000000000000…01df2246 [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…ffcd8389 |
| 0x149eb6…0b78c0 | 29 days agoSat, 18 Jul 2026 10:05:47 UTC | Approval | [0] 0x000000000000…d28a495e [1] 0x000000000000…a27c0835 data: 0xffffffffffffffffff…ffffffff |
| 0x4f7ef2…bdb367 | 30 days agoFri, 17 Jul 2026 13:42:28 UTC | Transfer | [0] 0x000000000000…d6c7aebf [1] 0x000000000000…01df2246 data: 0x000000000000000000…ffcd8389 |
| 0x9194e4…5bd07a | 30 days agoFri, 17 Jul 2026 08:52:07 UTC | Transfer | [0] 0x000000000000…6fa93c6a [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…323d54ad |
| 0xac37c9…661b89 | 30 days agoFri, 17 Jul 2026 08:51:54 UTC | Approval | [0] 0x000000000000…6fa93c6a [1] 0x000000000000…d6c7aebf data: 0xffffffffffffffffff…ffffffff |
| 0x5eed2d…e8a777 | 30 days agoFri, 17 Jul 2026 02:54:07 UTC | Transfer | [0] 0x000000000000…fed0b6ae [1] 0x000000000000…d6c7aebf data: 0x000000000000000000…5e5f30d1 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x320db3…971b99 | Approve | 27,372,500 | 12 days agoTue, 04 Aug 2026 05:27:33 UTC | 0xf6fe…913e | IN | Caffee | $0.000 ETH | 0.00000053 | |
| 0xe429c4…a984f9 | Approve | 27,372,260 | 12 days agoTue, 04 Aug 2026 05:27:09 UTC | 0xf6fe…913e | IN | Caffee | $0.000 ETH | 0.00000093 | |
| 0x1bc1c4…1a624b | Approve | 18,240,301 | 23 days agoFri, 24 Jul 2026 15:01:23 UTC | 0xb4b9…029a | IN | Caffee | $0.000 ETH | 0.00000528 | |
| 0xe5cfea…8dc127 | Approve | 17,078,095 | 24 days agoThu, 23 Jul 2026 06:38:34 UTC | 0x7451…495e | IN | Caffee | $0.000 ETH | 0.00000465 | |
| 0xb4fafd…686d6b | Approve | 16,913,769 | 24 days agoThu, 23 Jul 2026 02:03:57 UTC | 0x4169…bb1e | IN | Caffee | $0.000 ETH | 0.00000440 | |
| 0xbf9cfb…0ffe34 | Approve | 16,534,879 | 25 days agoWed, 22 Jul 2026 15:31:19 UTC | 0xd775…6100 | IN | Caffee | $0.000 ETH | 0.00000368 | |
| 0xc6628a…1ba217 | Approve | 16,502,810 | 25 days agoWed, 22 Jul 2026 14:37:48 UTC | 0xd06b…2246 | IN | Caffee | $0.000 ETH | 0.00000347 | |
| 0x149eb6…0b78c0 | Approve | 12,895,089 | 29 days agoSat, 18 Jul 2026 10:05:47 UTC | 0x7451…495e | IN | Caffee | $0.000 ETH | 0.00000323 | |
| 0xac37c9…661b89 | Approve | 11,989,979 | 30 days agoFri, 17 Jul 2026 08:51:54 UTC | 0x011f…3c6a | IN | Caffee | $0.000 ETH | 0.00000364 | |
| 0x4bfa80…8a6051 | Approve | 11,776,075 | 30 days agoFri, 17 Jul 2026 02:54:00 UTC | 0xec23…b6ae | IN | Caffee | $0.000 ETH | 0.00000383 | |
| 0xeed220…f30a6d | Approve | 11,344,196 | 31 days agoThu, 16 Jul 2026 14:53:27 UTC | 0xd06b…2246 | IN | Caffee | $0.000 ETH | 0.00000299 | |
| 0x4ff7c0…546cf2 | Approve | 11,060,920 | 31 days agoThu, 16 Jul 2026 07:00:55 UTC | 0x7451…495e | IN | Caffee | $0.000 ETH | 0.00000301 | |
| 0x1a0aa0…2a0e1c | Approve | 11,019,866 | 31 days agoThu, 16 Jul 2026 05:52:21 UTC | 0xe2d6…ea70 | IN | Caffee | $0.000 ETH | 0.00000158 | |
| 0xb2f056…1896bd | Approve | 10,687,891 | 32 days agoWed, 15 Jul 2026 20:38:28 UTC | 0xeb47…fef3 | IN | Caffee | $0.000 ETH | 0.00000164 | |
| 0xad061d…819055 | Approve | 10,458,240 | 32 days agoWed, 15 Jul 2026 14:17:15 UTC | 0xc5d3…093e | IN | Caffee | $0.000 ETH | 0.00000280 | |
| 0x90fb3b…f478de | Approve | 10,424,710 | 32 days agoWed, 15 Jul 2026 13:21:24 UTC | 0x011f…3c6a | IN | Caffee | $0.000 ETH | 0.00000150 | |
| 0x603d9a…4c1791 | Approve | 10,420,170 | 32 days agoWed, 15 Jul 2026 13:13:50 UTC | 0x810f…e545 | IN | Caffee | $0.000 ETH | 0.00000271 | |
| 0xec7220…8adac2 | Approve | 10,367,902 | 32 days agoWed, 15 Jul 2026 11:46:44 UTC | 0xaf26…ef75 | IN | Caffee | $0.000 ETH | 0.00000263 | |
| 0x574612…248eec | Approve | 10,347,572 | 32 days agoWed, 15 Jul 2026 11:12:50 UTC | 0x011f…3c6a | IN | Caffee | $0.000 ETH | 0.00000261 | |
| 0x9cb3fe…30c2d8 | Approve | 10,321,698 | 32 days agoWed, 15 Jul 2026 10:29:49 UTC | 0x8ae2…63c7 | IN | Caffee | $0.000 ETH | 0.00000257 | |
| 0xbe1d38…3d0e82 | Approve | 10,306,617 | 32 days agoWed, 15 Jul 2026 10:04:43 UTC | 0xeb47…fef3 | IN | Caffee | $0.000 ETH | 0.00000254 | |
| 0x68d5dd…6c7afb | Approve | 10,303,424 | 32 days agoWed, 15 Jul 2026 09:59:22 UTC | 0x8ed6…b28c | IN | Caffee | $0.000 ETH | 0.00000251 | |
| 0xffc8a0…12bf03 | Approve | 10,300,524 | 32 days agoWed, 15 Jul 2026 09:54:32 UTC | 0xe2d6…ea70 | IN | Caffee | $0.000 ETH | 0.00000262 | |
| 0xec4498…cb21a8 | Approve | 10,299,229 | 32 days agoWed, 15 Jul 2026 09:52:25 UTC | 0x8ae2…63c7 | IN | Caffee | $0.000 ETH | 0.00000254 | |
| 0xb7270f…ad2140 | Approve | 10,133,038 | 32 days agoWed, 15 Jul 2026 05:16:10 UTC | 0xf66d…45f9 | IN | Caffee | $0.000 ETH | 0.00000232 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x1192f5ae…f8249e | Transfer | 17,325,415 | 24 days agoThu, 23 Jul 2026 13:31:53 UTC | 0xcaf7…5d11 | IN | 0x1b19…ffee | $0.001 DIH |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 9,573,084 | 33 days agoTue, 14 Jul 2026 13:41:44 UTC | 0xe17f61…79c5aa | CREATE2 | launch | 0xdedc…ad56 | IN | 0x1b19…ffee | 0 ETH |