Payments — /evvm/payments
The page that sends EVVM tokens between users.
Two flows
Single recipient — pay()
Fields:
- From — defaults to the connected wallet
- To address or To identity — pick one. If you fill in a
username (e.g.
alice), Core resolves it on-chain via NameService. - Token — defaults to MATE
(
0x0000000000000000000000000000000000000001) - Amount — entered as a human-readable decimal (e.g.
10.5); the UI converts to wei using the token's decimals - Priority fee — paid to the executor; raise it to make your tx more attractive to relayers
- Nonce — auto-fetched from
getNextCurrentSyncNonce(sync) orgetNextFreeAsyncNonce(async) based on the priority toggle
Multi-recipient — dispersePay()
Same shape but the recipients are an editable list of (to, amount)
pairs. One signature, one tx, many recipients. Useful for payroll,
airdrops, or quick batches.
What happens when you click "Sign and submit"
- The frontend builds the EIP-191 payload via
packages/nextjs/src/lib/evvmSignatures.ts, which wraps the evvm-js signers. - Your wallet prompts for the signature (one prompt for
pay, one for each recipient ondispersePayif your wallet doesn't batch). - The frontend submits the signed call via the executor
(
utils/transactionExecuters/evvmExecuter.tsorlib/evvmExecutors.tsdepending on the form). - The tx hash is shown on success; click it to jump to the EVVMScan transaction page.
The exact bytes inside that EIP-191 payload — the unified envelope wrapping the action hash, executor pair, nonce, and isAsyncExec — are specified in the protocol's EIP-191 Signed Data Standard.
evvmSignatures.tsis the scaffold-evvm implementation of that spec.
Common gotchas
- "Insufficient balance" — your EVVM-side balance for the chosen
token is too low. Visit
/faucetto top up MATE. - "Bad signature" — the wallet signed something different from what the contract expected. Almost always caused by a stale nonce; refetch.
- Identity not found — the username you typed isn't registered on
this local chain. Check
/evvm/nameservicefirst.