What kind of noise can $trumpet make in this market? That is the whole experiment.
Donald Trump talks a lot. A trumpet is loud. Put the two together and you get a very stupid memecoin at a time when far too many tokens are trying to sound clever. The joke takes about five seconds to understand, which is already more useful than a roadmap nobody will read. There is no complicated story to memorize and no need to pretend a half-working app will change the world. It is orange, it is loud, and it is here to see how far a simple joke can travel.
Official $trumpet token address
0x00000000000000000000000000000000
$trumpet token locker
0xEB0620dE7518A4441154f4E76F4C2AF8dd7e4399
Why Robinhood
I am used to Ethereum. It is where I learned my way around tokens, contracts, and onchain transactions. But I have watched more of the memecoin crowd move over to Robinhood Chain, and I understand why. Faster transactions and lower costs make a big difference when people just want to buy, sell, and send tokens without paying a painful fee every time.
Launching there also gives me the chance to build a custom locker specifically for $trumpet. The locker will be open source, with no hidden code or mystery buttons. Anyone will be able to inspect the contract, confirm what it holds, check when the lock ends, and verify every extension onchain.
No smart contract should be called 100% safe just because its developer says so. The goal is to make this one simple, public, and easy to verify. The code should do exactly what this page says it does.
$trumpet Token Locker
The locker does one job. It holds tokens and refuses to release them early. Here is the whole thing in four parts.
1. lock tokens
I approve the locker, then call lockTokens with the token address, amount, and number of days. The tokens move into the contract.
2. no early exit
The locked amount and unlock time are public onchain. Even the owner cannot withdraw early. The contract rejects every withdrawal until the timer has finished.
3. real day timers
Entering 30 means exactly 30 periods of 24 hours from the block timestamp. That is 2,592,000 seconds, not a vague calendar month.
4. extend or withdraw
relockTokens adds tokens and time to the whole lock. Only the deployer can withdraw, and only after the timer is finished.
read the lock
Enter a token address to read its locked amount and unlock time directly from the locker on Robinhood Chain. No wallet connection is needed.
View the full Solidity source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC20Minimal {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
interface IERC20MetadataMinimal is IERC20Minimal {
function decimals() external view returns (uint8);
}
library SafeTokenTransfer {
error TokenTransferFailed();
function safeTransfer(IERC20Minimal token, address to, uint256 amount) internal {
_call(token, abi.encodeCall(token.transfer, (to, amount)));
}
function safeTransferFrom(IERC20Minimal token, address from, address to, uint256 amount) internal {
_call(token, abi.encodeCall(token.transferFrom, (from, to, amount)));
}
function _call(IERC20Minimal token, bytes memory data) private {
(bool success, bytes memory result) = address(token).call(data);
if (!success || (result.length != 0 && !abi.decode(result, (bool)))) {
revert TokenTransferFailed();
}
}
}
contract TrumpetTokenLocker {
using SafeTokenTransfer for IERC20Minimal;
error OnlyOwner();
error InvalidToken();
error AmountMustBePositive();
error DurationMustBePositive();
error ActiveLockExists();
error NoActiveLock();
error LockStillActive(uint256 unlockTime);
error UnsupportedDecimals(uint8 decimals);
error FeeOnTransferTokensNotSupported();
struct TokenLock {
uint256 amount;
uint256 unlockTime;
}
address public immutable owner;
mapping(address token => TokenLock lock) public locks;
event TokensLocked(address indexed token, uint256 amount, uint256 unlockTime);
event LockExtended(address indexed token, uint256 addedAmount, uint256 totalAmount, uint256 unlockTime);
event TokensWithdrawn(address indexed token, uint256 amount);
modifier onlyOwner() {
if (msg.sender != owner) revert OnlyOwner();
_;
}
constructor() {
owner = msg.sender;
}
function lockTokens(address token, uint256 wholeTokenAmount, uint256 durationDays) external onlyOwner {
_validateToken(token);
if (wholeTokenAmount == 0) revert AmountMustBePositive();
if (durationDays == 0) revert DurationMustBePositive();
if (locks[token].amount != 0) revert ActiveLockExists();
uint256 amount = _toTokenUnits(token, wholeTokenAmount);
_pullExactAmount(token, amount);
uint256 unlockTime = block.timestamp + (durationDays * 1 days);
locks[token] = TokenLock({amount: amount, unlockTime: unlockTime});
emit TokensLocked(token, amount, unlockTime);
}
function relockTokens(address token, uint256 additionalWholeTokens, uint256 additionalDays) external onlyOwner {
TokenLock storage currentLock = locks[token];
if (currentLock.amount == 0) revert NoActiveLock();
if (additionalDays == 0) revert DurationMustBePositive();
uint256 addedAmount;
if (additionalWholeTokens != 0) {
addedAmount = _toTokenUnits(token, additionalWholeTokens);
_pullExactAmount(token, addedAmount);
currentLock.amount += addedAmount;
}
uint256 extensionStart = currentLock.unlockTime > block.timestamp
? currentLock.unlockTime
: block.timestamp;
currentLock.unlockTime = extensionStart + (additionalDays * 1 days);
emit LockExtended(token, addedAmount, currentLock.amount, currentLock.unlockTime);
}
function withdrawTokens(address token) external onlyOwner {
TokenLock memory currentLock = locks[token];
if (currentLock.amount == 0) revert NoActiveLock();
if (block.timestamp < currentLock.unlockTime) {
revert LockStillActive(currentLock.unlockTime);
}
delete locks[token];
IERC20Minimal(token).safeTransfer(owner, currentLock.amount);
emit TokensWithdrawn(token, currentLock.amount);
}
function _validateToken(address token) private view {
if (token == address(0) || token.code.length == 0) revert InvalidToken();
}
function _toTokenUnits(address token, uint256 wholeTokenAmount) private view returns (uint256) {
uint8 tokenDecimals = IERC20MetadataMinimal(token).decimals();
if (tokenDecimals > 77) revert UnsupportedDecimals(tokenDecimals);
return wholeTokenAmount * (10 ** uint256(tokenDecimals));
}
function _pullExactAmount(address token, uint256 amount) private {
IERC20Minimal erc20 = IERC20Minimal(token);
uint256 balanceBefore = erc20.balanceOf(address(this));
erc20.safeTransferFrom(owner, address(this), amount);
uint256 received = erc20.balanceOf(address(this)) - balanceBefore;
if (received != amount) revert FeeOnTransferTokensNotSupported();
}
}
What Noise Can They Make?
The current market is full of tokens selling utility. There is always a big roadmap, a fancy dashboard, or some new piece of tech that will apparently change everything. Then you try to use it and find out it is not ready, barely works, or was just a larp with a nice logo.
Some teams are building real products, of course. But plenty of projects ask people to buy the dream long before the product exists. I find the old-school way more interesting. No fake utility. No ten-year plan. Just a dumb joke that everyone understands from the start.
That is why $trumpet exists. Orange man gets people talking. A trumpet makes sure the talking is loud. In this market, honest noise might be more fun than another serious pitch for technology nobody can actually use.
Who wouldn't want to tell their friends they made generational internet money by buying a trumpet with Trump's face?
$trumpet Token
$trumpet will launch on Robinhood Chain. There is no private presale, and I am not giving myself any free tokens. Every token available at launch will be available to the public.
I plan to buy 2.5 ETH worth of $trumpet at launch. I will make that purchase through the public launch like everyone else. The idea is to help the token move toward migration. It is a normal purchase, not a free developer allocation.
Read Before You Honk
$trumpet is a memecoin. Its price can go up, go down, or go to zero. There are no guaranteed returns, ownership rights, revenue claims, or promises of future utility. Check the contract, check the locker, verify the official token address, and do not spend money you cannot afford to lose.