// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @title JetstreamToken
/// @notice ERC-20 à supply fixe, 18 décimales, **sans owner, sans mint, et sans aucune condition
/// de transfert**. La totalité de la supply est mintée à la bonding curve au déploiement.
///
/// @dev ⚠️ CE CONTRAT NE DOIT JAMAIS ACQUÉRIR DE LOGIQUE DE TRANSFERT CONDITIONNELLE.
///
/// `_update` n'est **pas** surchargé, et ne doit pas l'être. Aucun chemin de transfert ne peut
/// reverter en dehors des règles d'ERC-20 elles-mêmes (solde insuffisant, allowance). C'est ce
/// qui rend le token lisible comme non-honeypot par une machine : un détecteur cherche
/// exactement « un transfert peut échouer selon l'état du contrat », et il n'y en a aucun.
///
/// ── Ce qui a été retiré, et pourquoi ────────────────────────────────────────────────────
///
/// Ce token a porté un **gate de transfert** : les envois vers la pool pré-créée étaient
/// bloqués jusqu'à la migration (`pendingPool`, `poolUnlocked`, `revert PoolLocked()` dans
/// `_update`). Son but était d'empêcher un tiers d'apporter de la liquidité hostile avant nous.
///
/// Il a été retiré pour deux raisons, dans cet ordre :
///
/// 1. **Il ne marchait pas.** Il ne bloquait que `currency1`, le coin. Une fourchette de ticks
/// au-dessus du prix courant ne réclame que `currency0` — de l'ETH natif, que tout le monde
/// possède. Un attaquant contournait le gate pour **1 wei** et faisait ouvrir la pool au
/// prix de son choix (ADR-002 §3bis, vérifié sur la chaîne).
/// 2. **`JetstreamHook.beforeAddLiquidity` fait le travail, sur les deux actifs.** Aucun apport
/// de liquidité n'est accepté avant l'enregistrement de la pool, quel que soit l'actif
/// déposé. Le gate était donc devenu redondant en plus d'être insuffisant.
///
/// Le retirer ne coûte donc aucune protection — il en supprime une qui n'en était pas une — et
/// fait disparaître la seule raison qu'un scanner avait de signaler ce token.
contract JetstreamToken is ERC20 {
/// @notice Bonding curve détentrice de la supply au déploiement. Information, aucun pouvoir.
address public immutable curve;
/// @notice Factory ayant déployé ce token. Information, aucun pouvoir.
address public immutable factory;
/// @notice URI des metadata (CID IPFS).
string public tokenURI;
error ZeroAddress();
constructor(
string memory name_,
string memory symbol_,
string memory tokenURI_,
address curve_,
uint256 totalSupply_
) ERC20(name_, symbol_) {
if (curve_ == address(0)) revert ZeroAddress();
factory = msg.sender;
curve = curve_;
tokenURI = tokenURI_;
_mint(curve_, totalSupply_); // seule et unique émission
}
/// @notice Toujours `address(0)` : ce token n'a **aucun propriétaire**, et ne peut pas en avoir.
///
/// @dev Cette fonction n'accorde aucun pouvoir et n'en retire aucun — elle ne fait qu'exposer
/// un fait déjà vrai. Elle existe pour une raison de **lisibilité machine** : les scanners
/// (DEXScreener, GoPlus, TokenSniffer…) détectent la renonciation en appelant `owner()` et
/// en vérifiant qu'elle rend l'adresse nulle. Un token qui n'hérite tout simplement pas
/// d'`Ownable` ne répond pas du tout, et le scanner ne peut alors **rien conclure** : il
/// affiche « Renounced ❌ », ce qui suggère à tort qu'un owner subsiste.
///
/// Il n'existe donc, et il n'existera jamais, ni `transferOwnership`, ni `renounceOwnership`,
/// ni variable de stockage derrière cette valeur : c'est une constante.
function owner() external pure returns (address) {
return address(0);
}
// ⚠️ Rien d'autre. Pas de `_update` surchargé, pas de setter, pas de rôle, pas de pause.
// La surface de ce contrat est volontairement close : `ERC20` + trois lectures.
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "tokenURI_",
"type": "string",
"internalType": "string"
},
{
"name": "curve_",
"type": "address",
"internalType": "address"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"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": "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": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "curve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "pure"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "tokenURI",
"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": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146105e5578063095ea7b31461056357806318160ddd1461054657806323b872dd14610416578063313ce567146103fb5780633c130d901461032657806370a08231146102ef5780637165485d146102ac5780638da5cb5b1461029257806395d89b4114610174578063a9059cbb14610143578063c45a0155146101005763dd62ed3e146100a8575f80fd5b346100fc5760403660031901126100fc576100c16106e4565b6001600160a01b036100d16106fa565b91165f5260016020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b5f80fd5b346100fc575f3660031901126100fc5760206040516001600160a01b037f00000000000000000000000046379e454562d11ea1b0010405d5a43a54b994fb168152f35b346100fc5760403660031901126100fc5761016961015f6106e4565b6024359033610710565b602060405160018152f35b346100fc575f3660031901126100fc576040515f6004548060011c90600181168015610288575b602083108114610274578285529081156102585750600114610202575b50819003601f01601f191681019067ffffffffffffffff8211818310176101ee57604082905281906101ea90826106ba565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610242575060209150820101826101b8565b600181602092548385880101520191019061022d565b90506020925060ff191682840152151560051b820101826101b8565b634e487b7160e01b5f52602260045260245ffd5b91607f169161019b565b346100fc575f3660031901126100fc5760206040515f8152f35b346100fc575f3660031901126100fc5760206040516001600160a01b037f00000000000000000000000046379e454562d11ea1b0010405d5a43a54b994fb168152f35b346100fc5760203660031901126100fc576001600160a01b036103106106e4565b165f525f602052602060405f2054604051908152f35b346100fc575f3660031901126100fc576040515f6005548060011c906001811680156103f1575b60208310811461027457828552908115610258575060011461039b5750819003601f01601f191681019067ffffffffffffffff8211818310176101ee57604082905281906101ea90826106ba565b60055f9081529091507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b8282106103db575060209150820101826101b8565b60018160209254838588010152019101906103c6565b91607f169161034d565b346100fc575f3660031901126100fc57602060405160128152f35b346100fc5760603660031901126100fc5761042f6106e4565b6104376106fa565b604435906001600160a01b03831692835f52600160205260405f206001600160a01b0333165f5260205260405f20545f19811061047a575b506101699350610710565b8381106105125784156104e65733156104ba57610169945f52600160205260405f206001600160a01b0333165f526020528360405f20910390558461046f565b7f94280d62000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7fe602df05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b83907ffb8f41b2000000000000000000000000000000000000000000000000000000005f523360045260245260445260645ffd5b346100fc575f3660031901126100fc576020600254604051908152f35b346100fc5760403660031901126100fc5761057c6106e4565b6024359033156104e6576001600160a01b03169081156104ba57335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100fc575f3660031901126100fc576040515f6003548060011c906001811680156106b0575b60208310811461027457828552908115610258575060011461065a5750819003601f01601f191681019067ffffffffffffffff8211818310176101ee57604082905281906101ea90826106ba565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82821061069a575060209150820101826101b8565b6001816020925483858801015201910190610685565b91607f169161060c565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100fc57565b602435906001600160a01b03821682036100fc57565b6001600160a01b03169081156107ec576001600160a01b03169182156107c057815f525f60205260405f205481811061078e57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b827fe450d38c000000000000000000000000000000000000000000000000000000005f5260045260245260445260645ffd5b7fec442f05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7f96c6fd1e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x38edaa…013746 | 18 days agoThu, 30 Jul 2026 01:29:20 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…913507fa |
| 0xbba53c…23f3d7 | 18 days agoThu, 30 Jul 2026 01:29:17 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…913507fa |
| 0xa2a772…37d7e1 | 18 days agoThu, 30 Jul 2026 01:03:23 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…913507fa |
| 0xece858…41a215 | 18 days agoThu, 30 Jul 2026 01:03:21 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…913507fa |
| 0x82be58…c04929 | 18 days agoThu, 30 Jul 2026 01:03:04 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…913507fa |
| 0x48b438…29e6fd | 18 days agoThu, 30 Jul 2026 01:02:59 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…913507fa |
| 0xdeee05…52017a | 19 days agoThu, 30 Jul 2026 00:52:49 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…913507fa |
| 0xf1f7ed…1c2e88 | 19 days agoThu, 30 Jul 2026 00:52:45 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…913507fa |
| 0xc8b3ee…834f1b | 19 days agoThu, 30 Jul 2026 00:51:25 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…061f7a1c |
| 0x7df6c8…0696ef | 19 days agoThu, 30 Jul 2026 00:50:34 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…0e60a203 |
| 0x9045c3…0b92c7 | 19 days agoThu, 30 Jul 2026 00:48:04 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…92699476 |
| 0xaa3a05…ac2f5c | 19 days agoThu, 30 Jul 2026 00:48:03 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…92699476 |
| 0xaed335…4c2e04 | 19 days agoThu, 30 Jul 2026 00:48:00 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…92699476 |
| 0x1198c0…f8fbb9 | 19 days agoThu, 30 Jul 2026 00:47:58 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…92699476 |
| 0x8be7ab…225e08 | 19 days agoThu, 30 Jul 2026 00:46:40 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…92699476 |
| 0x6cf15e…23db99 | 19 days agoThu, 30 Jul 2026 00:46:36 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…92699476 |
| 0x7f3714…f2d72f | 19 days agoThu, 30 Jul 2026 00:39:32 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…8b9ca2e4 |
| 0xf689af…23bc33 | 19 days agoThu, 30 Jul 2026 00:38:16 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…643705ca |
| 0x62ef42…9115c3 | 19 days agoThu, 30 Jul 2026 00:34:38 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…43185452 |
| 0x742525…a2e68b | 19 days agoThu, 30 Jul 2026 00:09:25 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…a49f5ae5 |
| 0x1c83ec…45c6ed | 19 days agoThu, 30 Jul 2026 00:09:09 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…a49f5ae5 |
| 0x8e5dd5…e1a7d9 | 19 days agoThu, 30 Jul 2026 00:08:55 UTC | Transfer | [0] 0x000000000000…209a653c [1] 0x000000000000…43e40951 data: 0x000000000000000000…a49f5ae5 |
| 0xc01b93…1afba3 | 19 days agoThu, 30 Jul 2026 00:08:45 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…209a653c data: 0x000000000000000000…a49f5ae5 |
| 0xcdc2b3…eac360 | 19 days agoWed, 29 Jul 2026 23:27:25 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…1ab7bd8f |
| 0x64e7d8…67abd9 | 19 days agoWed, 29 Jul 2026 23:26:33 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f3c553eb data: 0x000000000000000000…6c24744c |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xaf1c48…3ac4d3 | Approve | 22,597,951 | 19 days agoWed, 29 Jul 2026 16:29:36 UTC | 0xa998…53eb | IN | Halcyon | $0.000 ETH | 0.00000101 | |
| 0x4ba803…db96cc | Approve | 22,471,182 | 19 days agoWed, 29 Jul 2026 12:57:53 UTC | 0xa2f5…50c4 | IN | Halcyon | $0.000 ETH | 0.00000104 | |
| 0xeab405…47a412 | Approve | 22,471,096 | 19 days agoWed, 29 Jul 2026 12:57:44 UTC | 0x4dd6…e3f2 | IN | Halcyon | $0.000 ETH | 0.00000105 | |
| 0x49bd1d…ec72cc | Approve | 22,470,552 | 19 days agoWed, 29 Jul 2026 12:56:49 UTC | 0x363e…653c | IN | Halcyon | $0.000 ETH | 0.00000105 | |
| 0xe8b8cd…ba3827 | Approve | 22,469,966 | 19 days agoWed, 29 Jul 2026 12:55:50 UTC | 0x4627…ad88 | IN | Halcyon | $0.000 ETH | 0.00000105 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 22,469,079 | 19 days agoWed, 29 Jul 2026 12:54:21 UTC | 0x80d21c…8fc855 | CREATE | 0xbe6b50e0 | 0x4637…94fb | IN | 0x76c4…52b3 | 0 ETH |