BangToken
0x65d50be91662f4a154ca65cbac63655283ffc750
Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
1,878 bytes
ABI entries
21
9 read · 4 write
License
none
Contract information
- Address
- 0x65d50be91662f4a154ca65cbac63655283ffc750
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.26+commit.8a97fa7a
- Optimization
- Enabled
- Creator
- 0x2c0e114523…5F4D2f1325
- Creation tx
- 0x4caad98309…16e43c6a33
Token
- Name
- BANG FINANCE
- Symbol
- BANG
- Decimals
- 18
- Holders
- 1,212
- Market
- View token page →
Read contract (9)
TOTAL_SUPPLY() → uint256
allowance(address, address) → uint256
balanceOf(address) → uint256
decimals() → uint8
factory() → address
name() → string
symbol() → string
totalSupply() → uint256
vault() → address
Events (2)
ApprovalTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "string",
"name": "_symbol",
"type": "string"
},
{
"internalType": "address",
"name": "_mintTo",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "AlreadyWired",
"type": "error"
},
{
"inputs": [],
"name": "InsufficientAllowance",
"type": "error"
},
{
"inputs": [],
"name": "InsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "NotFactory",
"type": "error"
},
{
"inputs": [],
"name": "ZeroAddress",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "TOTAL_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "vault",
"outputs": [
{
"internalType": "contract IBangShareLedger",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_vault",
"type": "address"
}
],
"name": "wireVault",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/**
* BangToken — a plain, ownerless ERC-20.
*
* No tax, no owner, no mint, no blacklist, no pause. Transfers move the
* FULL amount — that is what keeps it compatible with Uniswap V4, routers,
* aggregators, and the Robinhood app. All fee economics live in the V4
* pool's hook, never in this token.
*
* The one addition: each transfer notifies the dividend vault so it can
* keep a live holder ledger (V4 rejects fee-on-transfer tokens, not
* notify-on-transfer ones — no value is withheld here). The notification
* is wrapped in try/catch, so a misbehaving vault can never brick trading.
*
* Fixed 1,000,000,000 supply, minted once to the factory at construction.
* The factory puts it into the pool and burns the remainder.
*/
interface IBangShareLedger {
function setShares(address account, uint256 balance) external;
}
contract BangToken {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 ether;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
/// Dividend vault, wired once by the factory in the launch transaction.
IBangShareLedger public vault;
address public immutable factory;
bool private _wired;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
error InsufficientBalance();
error InsufficientAllowance();
error ZeroAddress();
error AlreadyWired();
error NotFactory();
constructor(string memory _name, string memory _symbol, address _mintTo) {
if (_mintTo == address(0)) revert ZeroAddress();
name = _name;
symbol = _symbol;
// The factory is the mint recipient — NOT msg.sender, which is the
// deployer helper contract. Getting this wrong makes wireVault
// permanently uncallable and bricks every launch.
factory = _mintTo;
_balances[_mintTo] = TOTAL_SUPPLY;
emit Transfer(address(0), _mintTo, TOTAL_SUPPLY);
}
/// One-shot wiring by the deploying factory, inside the launch tx.
/// Deployment plumbing, not ownership — it can only ever be called once.
function wireVault(address _vault) external {
if (msg.sender != factory) revert NotFactory();
if (_wired) revert AlreadyWired();
_wired = true;
vault = IBangShareLedger(_vault);
}
function totalSupply() external pure returns (uint256) {
return TOTAL_SUPPLY;
}
function balanceOf(address account) external view returns (uint256) {
return _balances[account];
}
function allowance(address owner, address spender) external view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) external returns (bool) {
_transfer(msg.sender, to, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
uint256 allowed = _allowances[from][msg.sender];
if (allowed != type(uint256).max) {
if (allowed < amount) revert InsufficientAllowance();
unchecked {
_allowances[from][msg.sender] = allowed - amount;
}
}
_transfer(from, to, amount);
return true;
}
function _transfer(address from, address to, uint256 amount) internal {
if (to == address(0)) revert ZeroAddress();
uint256 bal = _balances[from];
if (bal < amount) revert InsufficientBalance();
unchecked {
_balances[from] = bal - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_notify(from);
_notify(to);
}
/// Push the post-transfer balance to the vault's share ledger.
/// try/catch: dividend accounting must never be able to block a trade.
function _notify(address account) internal {
if (address(vault) == address(0)) return;
try vault.setShares(account, _balances[account]) {} catch {}
}
}
Chain explorer3089msChain node76ms