// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.28;
import { ReentrancyGuard } from "solady/utils/ReentrancyGuard.sol";
import { SafeTransferLib } from "solady/utils/SafeTransferLib.sol";
import { IBondingCurve } from "../interfaces/IBondingCurve.sol";
import { IMigrationManager } from "../interfaces/IMigrationManager.sol";
import { IERC20 } from "../interfaces/IERC20.sol";
/// @title BondingCurve
/// @notice Virtual-reserve constant-product (x*y=k) curve for a single LaunchToken.
/// 1% trading fee taken on the ETH side (in on buy, out on sell).
/// Graduates when a buy drives `virtualTokenReserve` down to
/// `GRADUATION_FLOOR`; at that point all leftover token supply +
/// collected ETH are forwarded to the MigrationManager which moves
/// them into a Thor V3 pool (LP position NFT permanently locked).
///
/// @dev Constants per docs/adr/0001-bonding-curve-constants.md, amended by
/// docs/adr/0009-graduation-raise-5-eth.md (ratios taken verbatim
/// from pump.fun's verified on-chain layout; the ETH scale is set so
/// the curve raises ≈ 5 ETH at graduation).
///
/// Self-consistency property: graduation triggers exactly when the
/// curve's tradable allocation (`VIRTUAL_TOKEN_RESERVE −
/// GRADUATION_FLOOR == 793_100_000e18`, equal to
/// `LaunchpadFactory.BONDING_CURVE_SUPPLY`) is depleted. Unlike a
/// stand-alone ETH-raised threshold, this trigger cannot drift from
/// the curve's actual carrying capacity.
contract BondingCurve is IBondingCurve, ReentrancyGuard {
using SafeTransferLib for address;
// ---------------- Constants ----------------
uint256 public constant VIRTUAL_ETH_RESERVE = 1.7646 ether;
uint256 public constant VIRTUAL_TOKEN_RESERVE = 1_073_000_000e18;
/// @notice Floor below which `virtualTokenReserve` cannot fall — the buy
/// that drives `newVirtualToken` to this value graduates the curve.
/// @dev Equals `VIRTUAL_TOKEN_RESERVE − BONDING_CURVE_SUPPLY` =
/// 1.073B − 793.1M = 279.9M. At this point the curve has sold its
/// entire allocation and `realEthReserve` ≈ 5 ETH (exactly
/// 5.000015219721329047 ETH; raised = VIRTUAL_ETH_RESERVE ×
/// 793.1M/279.9M), corresponding to ~$72.5k FDV at ETH ≈ $3k.
uint256 public constant GRADUATION_FLOOR = 279_900_000e18;
uint256 public constant TRADING_FEE_BPS = 100;
uint256 public constant BPS_DENOMINATOR = 10_000;
// ---------------- Immutables ----------------
address public immutable override token;
address public immutable override migrationManager;
address public immutable override feeRecipient;
// ---------------- Storage ----------------
uint256 public override virtualEthReserve;
uint256 public override virtualTokenReserve;
bool public override graduated;
// ---------------- Errors ----------------
error ZeroAddress();
error AlreadyGraduated();
error InsufficientEthIn();
error InsufficientTokensIn();
error InsufficientOutput();
error MigrationFailed();
// ---------------- Modifiers ----------------
modifier whenNotGraduated() {
if (graduated) revert AlreadyGraduated();
_;
}
// ---------------- Construction ----------------
constructor(
address _token,
address _migrationManager,
address _feeRecipient
) {
if (_token == address(0) || _migrationManager == address(0) || _feeRecipient == address(0)) {
revert ZeroAddress();
}
token = _token;
migrationManager = _migrationManager;
feeRecipient = _feeRecipient;
virtualEthReserve = VIRTUAL_ETH_RESERVE;
virtualTokenReserve = VIRTUAL_TOKEN_RESERVE;
}
// ---------------- Views ----------------
/// @inheritdoc IBondingCurve
function realEthReserve() external view override returns (uint256) {
return virtualEthReserve - VIRTUAL_ETH_RESERVE;
}
/// @inheritdoc IBondingCurve
/// @dev Spot price scaled by 1e18 (ETH-wei per token-wei × 1e18, i.e. ETH per token).
function price() external view override returns (uint256) {
return (virtualEthReserve * 1e18) / virtualTokenReserve;
}
// ---------------- Trade: Buy ----------------
/// @inheritdoc IBondingCurve
function buy(
uint256 minTokensOut
) external payable override nonReentrant whenNotGraduated returns (uint256 tokensOut) {
if (msg.value == 0) revert InsufficientEthIn();
uint256 vEth = virtualEthReserve;
uint256 vTok = virtualTokenReserve;
uint256 k = vEth * vTok;
uint256 fee = (msg.value * TRADING_FEE_BPS) / BPS_DENOMINATOR;
uint256 ethInAfterFee = msg.value - fee;
// x*y=k: new x = x + dx, new y = ⌈K/new x⌉, dy = old y - new y
// Ceil-divide on newVirtualToken so K never decreases (rounding favors the pool;
// the user receives at most the fair-math output, never more by 1 wei).
uint256 newVirtualEth = vEth + ethInAfterFee;
uint256 newVirtualToken = (k + newVirtualEth - 1) / newVirtualEth;
// slither-disable-next-line uninitialized-local
uint256 refund;
// slither-disable-next-line uninitialized-local
bool willGraduate;
// If this buy would push virtualToken below the graduation floor, clamp at
// the floor and recompute consumed ETH (and the proportional fee) so the
// user is refunded the unused portion. The buy that crosses the floor is
// exactly the buy that graduates the curve.
if (newVirtualToken <= GRADUATION_FLOOR) {
newVirtualToken = GRADUATION_FLOOR;
// ceil-divide: ensure newVirtualEth * newVirtualToken >= k (K monotone).
newVirtualEth = (k + newVirtualToken - 1) / newVirtualToken;
uint256 consumedAfterFee = newVirtualEth - vEth;
// Recover the gross msg.value that produced exactly `consumedAfterFee`
// post-fee. Ceil-divide so the pool isn't underfunded by 1 wei.
uint256 consumedMsgValue = (consumedAfterFee * BPS_DENOMINATOR + (BPS_DENOMINATOR - TRADING_FEE_BPS) - 1)
/ (BPS_DENOMINATOR - TRADING_FEE_BPS);
// Belt-and-suspenders: rounding edge could in principle nudge over by 1 wei.
if (consumedMsgValue > msg.value) consumedMsgValue = msg.value;
fee = consumedMsgValue - consumedAfterFee;
refund = msg.value - consumedMsgValue;
willGraduate = true;
}
tokensOut = vTok - newVirtualToken;
if (tokensOut < minTokensOut) revert InsufficientOutput();
// Effects.
virtualEthReserve = newVirtualEth;
virtualTokenReserve = newVirtualToken;
// Interactions.
if (fee > 0) feeRecipient.safeTransferETH(fee);
token.safeTransfer(msg.sender, tokensOut);
if (refund > 0) msg.sender.safeTransferETH(refund);
emit Buy(msg.sender, msg.value - refund, newVirtualEth - vEth, tokensOut, newVirtualEth, newVirtualToken);
if (willGraduate) {
_graduate();
}
}
// ---------------- Trade: Sell ----------------
/// @inheritdoc IBondingCurve
function sell(
uint256 tokensIn,
uint256 minEthOut
) external override nonReentrant whenNotGraduated returns (uint256 ethOut) {
if (tokensIn == 0) revert InsufficientTokensIn();
// Pull tokens from seller into the curve.
token.safeTransferFrom(msg.sender, address(this), tokensIn);
// x*y=k: new y = y + dy, new x = ⌈K/new y⌉, dx = old x - new x
// Ceil-divide on newVirtualEth so K never decreases (rounding favors the pool;
// ethOutGross ≤ what the curve actually holds, no 1-wei underflow on transfer).
uint256 newVirtualToken = virtualTokenReserve + tokensIn;
uint256 k = virtualEthReserve * virtualTokenReserve;
uint256 newVirtualEth = (k + newVirtualToken - 1) / newVirtualToken;
uint256 ethOutGross = virtualEthReserve - newVirtualEth;
uint256 fee = (ethOutGross * TRADING_FEE_BPS) / BPS_DENOMINATOR;
ethOut = ethOutGross - fee;
if (ethOut < minEthOut) revert InsufficientOutput();
// Effects.
virtualEthReserve = newVirtualEth;
virtualTokenReserve = newVirtualToken;
// Interactions.
feeRecipient.safeTransferETH(fee);
msg.sender.safeTransferETH(ethOut);
emit Sell(msg.sender, tokensIn, ethOutGross, ethOut, newVirtualEth, newVirtualToken);
}
// ---------------- Graduation ----------------
/// @dev Forward all leftover tokens + all real ETH to MigrationManager and lock the curve.
/// MigrationManagerV3 creates/adopts a Thor V3 pool, seeds it (with the LaunchpadFactory's
/// DEX_RESERVE_SUPPLY also added), and permanently locks the LP position NFT in the vault.
function _graduate() private {
graduated = true;
uint256 ethToMigration = address(this).balance;
uint256 leftoverTokens = IERC20(token).balanceOf(address(this));
if (leftoverTokens > 0) {
token.safeTransfer(migrationManager, leftoverTokens);
}
// The migration call is the last interaction; if it reverts the entire buy
// (including state changes) reverts. We surface the failure with a custom error.
// The slither-disable-next-line below: migrationManager is `address public
// immutable`, set in the constructor with a zero-address check (see line 79).
// Slither's heuristic doesn't track immutable state, so it sees a
// "potentially user-controlled" address — false positive.
// slither-disable-next-line arbitrary-send-eth
try IMigrationManager(migrationManager).migrate{ value: ethToMigration }(token, leftoverTokens) {
emit Graduated(token, ethToMigration, leftoverTokens);
} catch {
revert MigrationFailed();
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_token",
"type": "address",
"internalType": "address"
},
{
"name": "_migrationManager",
"type": "address",
"internalType": "address"
},
{
"name": "_feeRecipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyGraduated",
"type": "error",
"inputs": []
},
{
"name": "InsufficientEthIn",
"type": "error",
"inputs": []
},
{
"name": "InsufficientOutput",
"type": "error",
"inputs": []
},
{
"name": "InsufficientTokensIn",
"type": "error",
"inputs": []
},
{
"name": "MigrationFailed",
"type": "error",
"inputs": []
},
{
"name": "Reentrancy",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "Buy",
"type": "event",
"inputs": [
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethInAfterFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualEth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualToken",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethToMigration",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "leftoverTokens",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Sell",
"type": "event",
"inputs": [
{
"name": "seller",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokensIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethOutBeforeFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethOutAfterFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualEth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualToken",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "GRADUATION_FLOOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TRADING_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "VIRTUAL_ETH_RESERVE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "VIRTUAL_TOKEN_RESERVE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "minTokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "feeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "graduated",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "migrationManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "price",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "realEthReserve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "sell",
"type": "function",
"inputs": [
{
"name": "tokensIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "token",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "virtualEthReserve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "virtualTokenReserve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163187ac4cb146108a9575080632ab04c7b14610879578063343ee3b71461085c578063469048401461081857806352b86d2b146107fc5780637e309b92146107d6578063935adf0e146107b1578063a035b1fe14610767578063cb24a72f14610745578063d79875eb1461057d578063d96a094a14610166578063dd4d7bf71461014a578063e1a452181461012d578063e7c2b7721461010a5763fc0c546a146100c3575f80fd5b346101075780600319360112610107576040517f00000000000000000000000029ca2d89d2f0c7910a340471df1921c27f7630056001600160a01b03168152602090f35b80fd5b5034610107578060031936011261010757602060ff600254166040519015158152f35b503461010757806003193601126101075760206040516127108152f35b5034610107578060031936011261010757602060405160648152f35b5060203660031901126103d9573068929eee149b4bd212685414610570573068929eee149b4bd212685560ff60025416610561573415610552575f546001546101af81836108f7565b6064340234810460640361053e576127109004926101d66101d085346108ea565b82610928565b936101e18584610928565b5f19810190811161053e57856101f69161090a565b5f945f946ae787216768429d2180000083111561049c575b5081610219916108ea565b95600435871061048d576102ad87927f178f20a8980b4e6cdc2c84f3ef670f5047f63638f90a8acc6b724b43f1da778d94835f55816001558061045d575b5061029e6102977f00000000000000000000000029ca2d89d2f0c7910a340471df1921c27f7630059961028b87338d610975565b8061044e575b346108ea565b96846108ea565b92604051948594339886610935565b0390a26102cc575b6020823868929eee149b4bd2126855604051908152f35b6002805460ff191660011790556040516370a0823160e01b81523060048201526001600160a01b03821691479190602082602481875afa918215610443575f9261040f575b5081806103dd575b50507f000000000000000000000000df6e6e5cfce09b64fd24fe9f433f452649f874286001600160a01b0316803b156103d9575f839160446040518094819363ad68ebf760e01b83528960048401528760248401525af190816103c4575b5061038b5763513dfed160e11b8552600485fd5b602094507f1c858049e704460ab9455025be4078f9e746e3fd426a56040d06389edb8197db91604091825191825286820152a25f6102b5565b6103d19196505f906109c6565b5f945f610377565b5f80fd5b610408917f000000000000000000000000df6e6e5cfce09b64fd24fe9f433f452649f8742890610975565b5f81610319565b9091506020813d60201161043b575b8161042b602093836109c6565b810103126103d95751905f610311565b3d915061041e565b6040513d5f823e3d90fd5b6104588133610959565b610291565b610487907f00000000000000000000000004a081d955d03a6708762247f46cc1abfe6fcd17610959565b5f610257565b63bb2875c360e01b5f5260045ffd5b95509350505092506ae787216768429d21800000918281019081811161053e576ae787216768429d217fffff0190811161053e57829004926104de81856108ea565b6127108102818104612710148215171561053e576126ac81019081811161053e576126ab0190811161053e576126ac900490813410610536575b61052561052c91836108ea565b91346108ea565b936001938161020e565b349150610518565b634e487b7160e01b5f52601160045260245ffd5b633c1c569160e21b5f5260045ffd5b63e6a0d45f60e01b5f5260045ffd5b63ab143c065f526004601cfd5b346103d95760403660031901126103d9576004353068929eee149b4bd212685414610570573068929eee149b4bd212685560ff60025416610561578015610736577f00000000000000000000000029ca2d89d2f0c7910a340471df1921c27f7630056040519082606052306040523360601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f51141615610718575b50505f6060526040526001549061062d8183610928565b906106438261063e5f5495866108f7565b610928565b5f19810190811161053e5761065b836106629261090a565b80946108ea565b91606483028381046064148415171561053e5761271090049361068585856108ea565b93602435851061048d576107017f20a7fc03b19d7f251cc907f177ff82194c6aebe9a2b47e1cd734dcb6bf772cc293836106e960209989965f55836001557f00000000000000000000000004a081d955d03a6708762247f46cc1abfe6fcd17610959565b6106f38533610959565b604051948594339886610935565b0390a23868929eee149b4bd2126855604051908152f35b3b153d171015610729578280610616565b637939f4245f526004601cfd5b630f0e3fbb60e31b5f5260045ffd5b346103d9575f3660031901126103d957602060405167187d1e59caa780008152f35b346103d9575f3660031901126103d9575f54670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561053e576107a96020916001549061090a565b604051908152f35b346103d9575f3660031901126103d95760206040516ae787216768429d218000008152f35b346103d9575f3660031901126103d95760206040516b037790968dc8efffd10000008152f35b346103d9575f3660031901126103d95760205f54604051908152f35b346103d9575f3660031901126103d9576040517f00000000000000000000000004a081d955d03a6708762247f46cc1abfe6fcd176001600160a01b03168152602090f35b346103d9575f3660031901126103d9576020600154604051908152f35b346103d9575f3660031901126103d9575f5467187d1e59caa77fff19810190811161053e57602090604051908152f35b346103d9575f3660031901126103d9577f000000000000000000000000df6e6e5cfce09b64fd24fe9f433f452649f874286001600160a01b03168152602090f35b9190820391821161053e57565b8181029291811591840414171561053e57565b8115610914570490565b634e487b7160e01b5f52601260045260245ffd5b9190820180921161053e57565b9192608093969594919660a084019784526020840152604083015260608201520152565b5f80809338935af11561096857565b63b12d13eb5f526004601cfd5b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f511416156109a8575b50505f603452565b3b153d1710156109b9575f806109a0565b6390b8ec185f526004601cfd5b601f909101601f19168101906001600160401b038211908210176109e957604052565b634e487b7160e01b5f52604160045260245ffd
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 | |
| Thors Cashcat (CASHCAT) | CASHCAT | 760,261,823.529321 | — | — |
| 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 |
|---|---|---|---|
| 0xc6a337…4f8850 | 23 days agoSat, 25 Jul 2026 12:40:46 UTC | 0x20a7fc…2cc2 | [0] 0x000000000000…b0eb82b2 data: 0x000000000000000000…96221051 |
| 0x3b2972…d3f1c1 | 30 days agoSat, 18 Jul 2026 22:39:51 UTC | 0x178f20…778d | [0] 0x000000000000…20dddabe data: 0x000000000000000000…8b0aab0b |
| 0x9cbda0…16aec4 | 34 days agoTue, 14 Jul 2026 06:09:08 UTC | 0x178f20…778d | [0] 0x000000000000…b0eb82b2 data: 0x000000000000000000…8c0f9271 |
| 0xaa5256…fca40d | 39 days agoThu, 09 Jul 2026 18:53:08 UTC | 0x178f20…778d | [0] 0x000000000000…76b2b38f data: 0x000000000000000000…9726f7b7 |
| 0x007f86…33b931 | 40 days agoThu, 09 Jul 2026 02:41:28 UTC | 0x178f20…778d | [0] 0x000000000000…20dddabe data: 0x000000000000000000…d24734f5 |
| 0x98d003…9d7cb6 | 40 days agoWed, 08 Jul 2026 20:22:11 UTC | 0x178f20…778d | [0] 0x000000000000…fe6fcd17 data: 0x000000000000000000…6609976a |
| 0xba884c…932a56 | 40 days agoWed, 08 Jul 2026 18:23:47 UTC | 0x178f20…778d | [0] 0x000000000000…fe6fcd17 data: 0x000000000000000000…c9a54263 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xc6a337…4f8850 | sell | 19,017,110 | 23 days agoSat, 25 Jul 2026 12:40:46 UTC | 0xd3f2…82b2 | IN | BondingCurve | $0.000 ETH | 0.00000556 | |
| 0x3b2972…d3f1c1 | buy | 13,345,886 | 30 days agoSat, 18 Jul 2026 22:39:51 UTC | 0x9a75…dabe | IN | BondingCurve | $1.890.001 ETH | 0.00000417 | |
| 0x9cbda0…16aec4 | buy | 9,302,168 | 34 days agoTue, 14 Jul 2026 06:09:08 UTC | 0xd3f2…82b2 | IN | BondingCurve | $46.840.02475 ETH | 0.00000376 | |
| 0xaa5256…fca40d | buy | 5,447,654 | 39 days agoThu, 09 Jul 2026 18:53:08 UTC | 0xb568…b38f | IN | BondingCurve | $47.310.025 ETH | 0.00000299 | |
| 0x007f86…33b931 | buy | 4,866,726 | 40 days agoThu, 09 Jul 2026 02:41:28 UTC | 0x9a75…dabe | IN | BondingCurve | $0.370.00019 ETH | 0.00000193 | |
| 0x98d003…9d7cb6 | buy | 4,639,833 | 40 days agoWed, 08 Jul 2026 20:22:11 UTC | 0x04a0…cd17 | IN | BondingCurve | $0.190.0001 ETH | 0.00000157 | |
| 0xba884c…932a56 | buy | 4,568,947 | 40 days agoWed, 08 Jul 2026 18:23:47 UTC | 0x04a0…cd17 | IN | BondingCurve | $56.770.03 ETH | 0.00000246 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xc6a33787…4f8850 | Transfer | 19,017,110 | 23 days agoSat, 25 Jul 2026 12:40:46 UTC | 0xd3f2…82b2 | IN | 0x5040…fcd7 | 13,829,813.542880 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0x97250eb3…596ba1 | Transfer | 18,594,721 | 24 days agoSat, 25 Jul 2026 00:53:14 UTC | 0xcaf7…5d11 | IN | 0x5040…fcd7 | $0.001 DIH | ||
| 0x3b297287…d3f1c1 | Transfer | 13,345,886 | 30 days agoSat, 18 Jul 2026 22:39:51 UTC | 0x5040…fcd7 | OUT | 0x9a75…dabe | 551,058.956266 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0x9cbda043…16aec4 | Transfer | 9,302,168 | 34 days agoTue, 14 Jul 2026 06:09:08 UTC | 0x5040…fcd7 | OUT | 0xd3f2…82b2 | 13,829,813.542880 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0xaa52562f…fca40d | Transfer | 5,447,654 | 39 days agoThu, 09 Jul 2026 18:53:08 UTC | 0x5040…fcd7 | OUT | 0xb568…b38f | 14,352,900.545504 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0x007f868d…33b931 | Transfer | 4,866,726 | 40 days agoThu, 09 Jul 2026 02:41:28 UTC | 0x5040…fcd7 | OUT | 0x9a75…dabe | 115,255.299846 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0x98d003db…9d7cb6 | Transfer | 4,639,833 | 40 days agoWed, 08 Jul 2026 20:22:11 UTC | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 58,219.318282 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0xba884c41…932a56 | Transfer | 4,568,947 | 40 days agoWed, 08 Jul 2026 18:23:47 UTC | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 17,760,742.350777 CASHCAT | Thors Cashcat (CASHCAT) | |
| 0x7b173914…6a7338 | Transfer | 4,568,899 | 40 days agoWed, 08 Jul 2026 18:23:42 UTC | 0x7bd1…2dcc | IN | 0x5040…fcd7 | 793,099,999.999999 CASHCAT | Thors Cashcat (CASHCAT) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 19,017,110 | 23 days agoSat, 25 Jul 2026 12:40:46 UTC | 0xc6a337…4f8850 | CALL | sell | 0x5040…fcd7 | OUT | 0xd3f2…82b2 | 0.02428 ETH |
| 19,017,110 | 23 days agoSat, 25 Jul 2026 12:40:46 UTC | 0xc6a337…4f8850 | CALL | sell | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00024 ETH |
| 13,345,886 | 30 days agoSat, 18 Jul 2026 22:39:51 UTC | 0x3b2972…d3f1c1 | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00001 ETH |
| 9,302,168 | 34 days agoTue, 14 Jul 2026 06:09:08 UTC | 0x9cbda0…16aec4 | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00024 ETH |
| 5,447,654 | 39 days agoThu, 09 Jul 2026 18:53:08 UTC | 0xaa5256…fca40d | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00025 ETH |
| 4,866,726 | 40 days agoThu, 09 Jul 2026 02:41:28 UTC | 0x007f86…33b931 | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00000 ETH |
| 4,639,833 | 40 days agoWed, 08 Jul 2026 20:22:11 UTC | 0x98d003…9d7cb6 | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.00000 ETH |
| 4,568,947 | 40 days agoWed, 08 Jul 2026 18:23:47 UTC | 0xba884c…932a56 | CALL | buy | 0x5040…fcd7 | OUT | 0x04a0…cd17 | 0.0003 ETH |
| 4,568,899 | 40 days agoWed, 08 Jul 2026 18:23:42 UTC | 0x7b1739…6a7338 | CREATE | createToken | 0x7bd1…2dcc | IN | 0x5040…fcd7 | 0 ETH |