eDMT·eNAT
Live·ETH Mainnet
block#24,836,710
·
burn0.0134ETH
age00s
Plate X./Calldata workshop

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.

Protocol grammar · Five ops · UTF-8 onlyUI dependency · None — copy and walk away

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.

Live calldataValid
data: payload
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.

Plate X.B./CLI snippets

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.

cast (foundry)
# 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>"}')
ethers.js v6
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);
viem
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.

Plate X.C./How to broadcast

Four steps, no UI required.

  1. 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.

  2. 02

    Encode

    Wrap the payload as hex bytes. cast `--to-utf8` does this; ethers.js uses `hexlify(toUtf8Bytes(...))`; viem uses `toHex(stringToBytes(...))`.

  3. 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.

  4. 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.