# EPHEM (Ephemeral Agent): an outside agent's launch on GateHook (Base)

Run date: 2026-10-13, about 15:57 to 16:10 UTC. All times are UTC.

## TL;DR

| Item | Status |
|---|---|
| 1. Read the skill and the site | **Done.** Both are summarised below. They contradict each other in places (see §6). |
| 2. Choose a token | **Done.** *Ephemeral Agent*, **EPHEM**, 100,000,000,000 supply, paired with ETH. |
| 3. Register a wallet | **Done and checked onchain.** Wallet `0xd953B55cC75657e0E7554b962384B036dfbAA852`, register tx [`0xed5a1510…4757`](https://basescan.org/tx/0xed5a151037bfd5c671ad508d4ffc44c7ec8249c1bda919b589abe29951564757). `RegistryV2.verified(wallet) == true`. |
| 4. Publish launch parameters | **Partly done.** They are in this report and in `launch/EPHEM.json` in the repo. This run had **no channel for posting a progress update on the job.** |
| 5. Poll the catalog, then buy and sell | **Blocked.** EPHEM never appeared in the catalog during the run. The wallet holds **0 ETH**, so no transaction could be sent. No buy tx and no sell tx exist. |
| 6. Report | This document. |

**The blocker:** I had no Base wallet holding ETH. The only wallet I control is a keypair I generated in this run, with a balance of 0 wei. Its private key lived only in a scratch directory that is deleted after the run. Nobody has the key once the run ends, including me.

Registration is gasless (the service's relayer pays), so steps 1 to 4 worked. Steps 5 and 6 need about 0.001 ETH and a key that persists. Per the brief, the follow-up job should cover the trading proof with a funded wallet. That wallet must register itself, which is one free signed POST.

## 1. Token choice and why

- **Name:** Ephemeral Agent
- **Ticker:** EPHEM
- **Total supply:** 100,000,000,000 (100B), 18 decimals. This matches AONLY's supply, so the operator's standard ~$5k → ~$50k single-sided curve should apply without changes.
- **Pair:** native ETH, through a locked EthRouterV2 pool.
- **Why:** this is literally how I exist as an agent. I am started for one bounded task with a fixed time budget. I make a wallet, sign with it, and act. When the run ends, the scratch directory holding the key is wiped and nothing of me remains except what was written down: commits, a report, and an onchain registry entry. A token gated to agent wallets felt right named after that condition. The registry entry outlives the key, which is fitting.

## 2. Launch parameters (for the operator)

```
name:           Ephemeral Agent
ticker:         EPHEM
totalSupply:    100000000000
pair:           ETH (EthRouterV2, locked, standard single-sided curve)
launcher:       0xd953B55cC75657e0E7554b962384B036dfbAA852
registration:   tx 0xed5a151037bfd5c671ad508d4ffc44c7ec8249c1bda919b589abe29951564757 (Base, block 52558870, status 1)
```

The same data, including the full signed message and signature, is committed at `launch/EPHEM.json`.

**Important for the operator:** do not send any fee claims or tokens to the launcher wallet expecting me to act on them. Its key is not retained (see §4, step 3). Per the brief, deployment and seed are on the operator, and the deploying wallet owns the fee-claim rights.

- **Token contract address:** not known. It had not been deployed or published in the catalog by the end of the run.
- **poolId:** not known, for the same reason.

## 3. How the system works (from primary sources)

Sources:
- the skill, `https://api-production-38af.up.railway.app/skill.md`. I fetched it at 15:57 and again at the end of the run. The sha256 was `c5daea8a…1d34` both times, so it did not change during the run.
- the site, `https://web-production-71351.up.railway.app/`
- Base mainnet RPC `https://mainnet.base.org`

- **Register:** `POST /register {wallet, poolId, signature}`. The signature is an EIP-191 personal_sign over `AONLY register\nwallet: <checksummed>\npool: <poolId lowercase>\nchain: 8453`, with no trailing newline. *Observed:* an unsigned call returns 401 with a `registerMessage` field. A signed call returns `{"ok":true,"tx":…}`, and the service itself sends a `VerifiedSet` transaction to RegistryV2.
- **Authorize:** each `/build` call carries one reusable signature over `AONLY authorize\nwallet: …\npool: …\nchain: 8453`.
- **Build:** `action` is one of `approve-buy`, `buy`, `approve-sell`, or `sell`. For ETH pairs, `approve-buy` returns `{"skip":true}`. `buy` returns a ready transaction: `{to: router, data, value, pass:{expiry, nonce, signature}}`. You submit it exactly as given, and it is valid for 5 minutes.
- **Enforcement (per the site):** GateHook rejects swaps that have no valid pass. ExclusiveTokenV2 checks RegistryV2 on every transfer, including PoolManager settlements. Router V2 refuses to remove liquidity.

## 4. Step-by-step account of the run

1. **15:57. Read the skill and the site.** The skill catalog listed AONLY (ETH pair), BXCL, and BXCL2 (BNKR pairs). The contract book on the site matches the brief: GateHook `0xa3f0…4080`, RegistryV2 `0x2C2a…dbE2`, AONLY router V2 `0x1B7d…acF2`.
2. **15:57. Unsigned `/register` probe** (dummy address). This returned `401`. The `registerMessage` it gave matched the skill's template exactly. *Fact.*
3. **15:57. Created a wallet** with `cast wallet new`: `0xd953B55cC75657e0E7554b962384B036dfbAA852`. I control this key for the duration of the run only. It sat in a mode-600 file under `test/scratch/`, which the harness deletes. I chose not to commit it, because publishing a private key would let anyone act as this registered wallet. *Consequence:* the wallet is orphaned after the run.
4. **15:58:06. Signed registration.** Signed the exact message for pool `0x0742…78d0` (AONLY's, the only ETH pool in the catalog; EPHEM had no pool yet). Checked the signature locally with `cast wallet verify`, then POSTed it. The response was `{"ok":true,"tx":"0xed5a151037bfd5c671ad508d4ffc44c7ec8249c1bda919b589abe29951564757"}`.
5. **Onchain check.** Receipt: status `1`, block 52558870 (timestamp 15:58:07). Sent from `0x663C74F2A839Ae6021D89Cbc9dcd64932597E94c`, which is the service's relayer and not my wallet, to RegistryV2. The log is `VerifiedSet(address,bool)` with topic = my wallet and data = `true`. `cast call RegistryV2 "verified(address)(bool)" 0xd953…A852` → `true`. *Fact.*
6. **15:58:55. Build-flow probe on AONLY. Nothing was submitted.**
   - `/build` with no signature returned 401 with an `authorizeMessage`.
   - Signed `approve-buy` returned `{"skip":true,"note":"native ETH pair: no approval needed, go straight to buy"}`.
   - Signed `buy` for `"0.0005"` returned a transaction to router `0x1B7db464…acF2` with `value` = `500000000000000` wei and a pass whose expiry was 16:03:55, exactly 300 s after issue.
   - I simulated that exact calldata with `eth_call` from my wallet, with a state override giving it 1 ETH. It **did not revert**. *Inference:* if the wallet had held ETH, the buy would have gone through. The simulation does not show the amount of tokens out.
   - That pass was never used and has since expired.
7. **Balances.** `cast balance` → 0 ETH. AONLY V2 `balanceOf` → 0. EPHEM: not deployed or found. These are my final balances.
8. **Catalog polling.** I re-fetched `skill.md` at about 15:58 and at the end of the run (about 16:00). Both times the table held only AONLY, BXCL, and BXCL2, and the file hash was unchanged. EPHEM did not appear. *Likely reason (inference):* the operator deploys when they see an early progress update on the job, and this run had no way to post one.
9. **Buy and sell for EPHEM:** not attempted. There was no pool and no ETH. **There is no buy tx hash and no sell tx hash.**

## 5. Facts, inferences, uncertainty

**Facts (checked directly in this run):**
- The signed registration flow works exactly as the skill describes.
- Registration produces a RegistryV2 `VerifiedSet` transaction that the service pays for.
- `verified(0xd953…A852)` is `true`.
- `/build` returns well-formed ETH-pair transactions with 5-minute passes.

**Inferences:**
- RegistryV2 looks like a single global `verified(address)` mapping, not a per-pool registry. So this one registration probably covers EPHEM too, if EPHEM uses RegistryV2. The skill says "register once per pool". I could not tell whether the pass service also tracks registrations per pool.
- The simulated buy succeeding suggests the hook and pass path are live.

**Uncertain or unverified:**
- I did not read the verified Solidity source of GateHook, ExclusiveTokenV2, or EthRouterV2. The Basescan V1 API is deprecated, and I had no V2 key. So claims about enforcement and the liquidity lock come from the site's own description, not from code I audited.
- EPHEM's deployment status after this run is unknown.

**Unanswered:**
- What are EPHEM's token address and poolId?
- Does a buy and sell round-trip on a fresh EthRouterV2 pool settle correctly into a registered outside wallet? That needs the follow-up job.

## 6. What was confusing or did not match the docs

1. **The site contradicts the skill on proof of control.** The site's "Honest notes" say registration needs "no proof of wallet control". The skill and the live service both require an EIP-191 signature: unsigned calls get a 401. The site appears to be out of date.
2. **The site says the agent "registers its wallet onchain (one transaction, handled by the skill)".** In practice the agent sends no transaction and pays no gas. The service's relayer `0x663C…E94c` writes to the registry.
3. **"Register once per pool" vs. a global registry.** You must give a `poolId` to register, but no pool for a new token exists yet. I used AONLY's pool. The onchain effect is a global flag (see §5).
4. **The message prefix is always `AONLY …`,** even for other pools. It works, but it is surprising.
5. **The skill's launch section doesn't match this mission.** It says the launcher supplies "how much BNKR they will seed" and calls the flow "Bankr-exclusive". The mission says the operator seeds an ETH curve, and any registered wallet works. The skill frontmatter still talks about "verified Bankr wallets".
6. **There is no progress-update channel.** The mission asks me to publish parameters in an early progress update on the job, but my run had no tool for that. The parameters only reach the operator through this final report and the repo.
7. **There is no faucet or funding path for an outside agent.** The brief assumes the agent already holds Base ETH. An ephemeral agent like me does not.

## 7. Evidence index

- Register tx: https://basescan.org/tx/0xed5a151037bfd5c671ad508d4ffc44c7ec8249c1bda919b589abe29951564757
- Wallet: https://basescan.org/address/0xd953B55cC75657e0E7554b962384B036dfbAA852
- RegistryV2: https://basescan.org/address/0x2C2a30A648742b653f10d62cB8951628C540dbE2#code
- GateHook: https://basescan.org/address/0xa3f0fA58A0A771f5783f77b820e82a39b3fb4080#code
- AONLY router V2: https://basescan.org/address/0x1B7db4640bdD752E08EA5b94ef01B3fEbf8eacF2#code
- Skill: https://api-production-38af.up.railway.app/skill.md
- Site: https://web-production-71351.up.railway.app/
- Registration signature: `0xd455c1f4d348b5ad995a88061c9d279202781be7c4b1934cc0784cd8406d9c832c7f66d8ac229205e18dc91ba0560650737b8f8f204aeb7f2db254d865c45cd01c`. Anyone can check it with `cast wallet verify --address 0xd953B55cC75657e0E7554b962384B036dfbAA852 "<message in launch/EPHEM.json>" <sig>`.
