Build the bytes yourself.
Every button on this site is backed by calldata. This page lets you build it by hand, copy it, and send it from your own wallet.
Mint a single block
First-is-first. The first valid mint of any unminted block in canonical order wins; everyone else's tx reverts but still pays gas. Before activation fee=0; after activation the target requires a capture fee in calldata.
Sends the bytes above as `data:` calldata in a 0-ETH self-transfer. Your wallet pays gas; this site never holds the signed tx.
data:,{"p":"edmt","op":"emt-mint","tick":"enat","blk":"18765432"}Preview updates as you type. Wrap with `cast --to-utf8` or `toUtf8Bytes` before sending — see CLI snippets below.
Send the calldata from anywhere.
These snippets only construct and send the calldata. They never read protocol state — keep an indexer endpoint open in another window if you want to verify the post-mint balance.
# self-send mint with raw calldata; replace <BLK>
cast send $YOUR_ADDR \
--rpc-url $ETH_RPC \
--private-key $PRIVATE_KEY \
--value 0 \
--gas-limit 30000 \
$(cast --to-utf8 'data:,{"p":"edmt","op":"emt-mint","tick":"enat","blk":"<BLK>"}')import { Wallet, JsonRpcProvider, toUtf8Bytes, hexlify } from "ethers";
const wallet = new Wallet(PRIVATE_KEY, new JsonRpcProvider(RPC_URL));
const payload = `data:,{"p":"edmt","op":"emt-mint","tick":"enat","blk":"${BLK}"}`;
const tx = await wallet.sendTransaction({
to: wallet.address, // self-send (protocol §5.2)
value: 0n,
data: hexlify(toUtf8Bytes(payload)),
});
console.log("submitted:", tx.hash);import { createWalletClient, http, toHex, stringToBytes } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { mainnet } from "viem/chains";
const account = privateKeyToAccount(PRIVATE_KEY);
const client = createWalletClient({ account, chain: mainnet, transport: http(RPC_URL) });
const payload = `data:,{"p":"edmt","op":"emt-mint","tick":"enat","blk":"${BLK}"}`;
const hash = await client.sendTransaction({
to: account.address,
value: 0n,
data: toHex(stringToBytes(payload)),
});All three snippets target Ethereum mainnet. Substitute your RPC URL and private key (or hardware-wallet signer) before running.
Four steps, no UI required.
- 01
Compose
Build the data: payload above, or by hand. The exact UTF-8 bytes are what the indexer reads — extra whitespace will cause your tx to be ignored.
- 02
Encode
Wrap the payload as hex bytes. cast `--to-utf8` does this; ethers.js uses `hexlify(toUtf8Bytes(...))`; viem uses `toHex(stringToBytes(...))`.
- 03
Sign
For mint, tx.to MUST equal tx.from (self-send). value can be 0. If the target requires capture fee, the fee comes from protocol-layer raw fragment balance, not ERC-20 bENAT allowance. Use a competitive priority fee for popular blocks; underbidding loses to other minters.
- 04
Verify
After inclusion, query any indexer endpoint (see Plate IX.E). Most public indexers re-derive state within seconds. Finality is reached after 64-96 PoS slots.
