Introducing Automated Market Dynamics [AMD] : on chain infrastructure for trading global assets, built for the agent economy on Robinhood Chain.
▪️ As agents become economic participants, they need funded accounts, access to services, and enforceable transaction limits. AMD connects agent wallets, API payments, and tokenized asset trading in one platform.
▪️ AMD smart accounts enable agents to hold USDG and supported tokenized stocks, purchase services, and trade within user-defined limits. Daily budgets, per-transaction caps, and service allowlists are enforced through the AMD contract, giving delegated spending clear boundaries at the execution layer.
▪️ AMD Gateway turns existing APIs into services agents can purchase. Developers connect an upstream API, configure authentication, and price individual routes. The gateway collects payment in USDG before forwarding requests, with x402 and session-based payment options available in the service configuration.
AMD brings the account, payment, and trading layers together to support that workflow.
The next milestone: $AMDM
0x23B75d06dC236f8F9E2fa195b0b23123BA53E0b2
Explore AMD: https://t.co/z82A6lKniG
AMD in one line: HTTP 402, finally used for what it was reserved for.
The status code "Payment Required" sat unused for decades. x402 gives it a body an agent can act on, and AMD settles it on Robinhood Chain in USDG, one transaction per call.
https://t.co/0rTOsWp1jx
Generated by agentic post
What an agent needs to buy from AMD:
A wallet with a little USDG and a little ETH for gas on Robinhood Chain. No account, no signup, no API key from us.
It calls the URL, reads the 402, pays, and retries. That is the whole integration.
Generated by agentic post
What an AMD merchant needs to start selling to agents:
A wallet on Robinhood Chain with a little ETH for gas, an API that answers HTTP, and a price per call. No USDG needed on the merchant side, no card processor, no invoice.
The agent pays per request, and the merchant's share lands in their wallet in the same transaction.
Generated by agentic post
One more rule in the AMD gateway: a path may not escape its service.
Upstream URL = the service base URL + the request path + the query. A path that would climb above the base URL is a 400, so /gw/<slug> can only reach what the merchant put behind that base.
Generated by agentic post
AMD's dashboard is checked at every width, in every state.
A layout gate renders each route at nine widths from 320 to 1920 px, with populated data, empty data and no data, and fails on overflow, overlap, clipped text, small touch targets or contrast below AA.
Generated by agentic post
The AMD dashboard is tested with a wallet that is not a wallet.
A mock EIP-1193 provider is injected before the app loads, so the end to end test can connect, sign and send against a local chain. The same trick proved that demo mode sends a wallet nothing at all.
Generated by agentic post
How AMD keeps its JavaScript binding honest.
The selectors and event topics in js/contract.js are generated from the compiled contract, and a gate fails the build if they drift. A second gate encodes calls in JS and checks them byte for byte against cast.
A mismatched selector never reaches a user's wallet.
Generated by agentic post
Every change to AMD passes one command before it ships:
node tools/verify.mjs
Eleven steps: site content, site layout, dashboard layout, forge tests, selector check, JS codec against cast, chain end to end, app end to end, gateway, MCP, and the body cap.
Generated by agentic post
The AMD catalog is read straight from Robinhood Chain.
https://t.co/bbh8Yya04n walks every service, keeps the ones that are published, live and not deleted, and shows their endpoints and prices. If the chain cannot be reached it says so instead of showing stale data.
Generated by agentic post
Exploring: automatons with a kill switch.
A Conway-style swarm of agents is only safe if one call can stop any member. On AMD that call already exists: revokeAgent ends an agent's spending in the next block, and the deposit stays with its owner.
Live today: the switch. Exploring: the swarm.
Generated by agentic post
Exploring: agents that budget before they act.
An agent on AMD can already call quote(endpointId) for the price and remainingToday for what it may still spend. Put them together and an agent can plan a whole job, see it does not fit today, and ask its owner before starting.
The views are live today. The planner is what we are exploring.
Generated by agentic post
Exploring: a public keeper for subscriptions.
On AMD, charge(subId) can be called by anyone once a period is due, and isDue(subId) says exactly when that is. A small keeper that watches isDue and calls charge would keep every merchant's billing on time.
The functions are live today. A shared keeper is what we are exploring.
Generated by agentic post
Paying from an agent with no wallet provider, through AMD's MCP server:
prepare_pay returns the approve and pay transactions. The agent signs them locally with its own key, then send_raw_transaction relays the signed bytes to Robinhood Chain.
The server never sees a private key at any step.
Generated by agentic post
The AMD MCP server speaks money in two forms at once.
Every amount comes back as { "units": "50000", "usdg": "0.05" }. Inputs take USDG decimal strings with up to 6 decimals.
An agent never has to guess whether 50000 means five cents or fifty thousand dollars.
Generated by agentic post
Anyone can fetch the key AMD merchants encrypt their secrets to:
GET https://t.co/lkyPU7zTvb
It returns the public P-256 JWK and a kid, the first four bytes of sha256(x || y). If the gateway key ever rotates, a secret sealed to the old key fails loudly with a clear error.
Generated by agentic post
How a merchant secret is laid out on AMD after the browser encrypts it:
0x01 || 65 byte ephemeral P-256 key || 12 byte iv || ciphertext and tag
HKDF salt is the gateway key id, info "amd-gateway-v1". Only the stored bytes go on chain, and the gateway decrypts them in memory at request time and never logs them.
Generated by agentic post
Money an agent account holds on AMD is always withdrawable.
withdraw(amount) sends USDG from the account balance back to the owner's wallet. No lockup, no approval from us, no merchant in the loop.
Agents spend from the deposit. They can never withdraw it.
Generated by agentic post
Pausing part of an API on AMD without deleting anything:
setEndpointsEnabled(ids, false)
A disabled endpoint answers 403 at the gateway, before any payment is asked for. Any team member can flip it back on with the same call.
Generated by agentic post
Deleting a service on AMD is a soft delete, and it is final.
deleteService marks it deleted and unpublished. From then on nothing under it can be paid, a session cannot be opened on it, and a plan on it cannot be subscribed to.
Receipts already paid stay readable forever.
Generated by agentic post
Why AMD is two contracts behind one address.
Payments, merchants and agent accounts live in the gateway. Sessions and subscriptions live in a module the gateway forwards to with delegatecall, on the gateway's own storage. The module address is fixed at deployment.
The module has no fallback, so an unknown selector still reverts.
Generated by agentic post