Build the bytes yourself.
Every button on this site eventually flattens into a single string of UTF-8 calldata. This page lets you assemble that string by hand, validate it against the spec, copy it, and broadcast it from any wallet, RPC client, or hardware signer you trust.
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. Bid priority fee accordingly.
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. 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.