Skip to main content
Source of truth: contracts/src/IAgentSpendPolicy.sol, contracts/src/IAgentReallocation.sol, and contracts/src/X402PaymentValidator.sol, with the specification in ARCHITECTURE.md sections 16.3 and 16.5. The excerpts below are the parts other components depend on. If an excerpt and a file disagree, the file is authoritative.

One rule across every seam

Money crosses a boundary as an integer in the settlement asset’s base units, never as a float. The chain compares uint256 values, and an application check done in floating point can put an amount on the other side of a cap from the chain’s own check. Conversion to base units happens once, when a proposal is built, rounding down, and the settlement asset’s decimals is read from the token contract, not assumed.

IAgentSpendPolicy

Deployed at 0xe54512401B8fCD0DCc3f4Aa4929b99F05AbA3f05 on Monad testnet.
check runs in the validation phase and applies the allowlist, recipient rule, zero native value, and the per-transaction cap to the sum of all calls. record runs in the execution phase through Kernel’s pre-execution hook and applies the rolling daily cap. The rationale is on Spend policy.

IAgentReallocation

Deployed at 0x4e7500415e81017670a9cFb8763f873EE6694A7f on Monad testnet.
The file also exposes views: settlementAsset, capitalFloor, agent, currentEvaluation, minEvaluationInterval, lastEvaluationAt, lastDebitEvaluation, policyCommitment, policyNonce, isCovered, hashPolicy, and domainSeparator.

Owner policy typed data

The policy is an EIP-712 struct ReallocationPolicy(address owner, address[] agents, uint16 capBps, uint32 slotCeilingBps, uint256 capitalFloor, uint256 nonce) in the domain Monadeum Reallocation, version 1, bound to the chain id and the contract address. A commit is refused unless capBps is between 1 and 2000, slotCeilingBps between 1 and 40000, capitalFloor is at least the protocol floor, and the list names at least two Active agents registered to the signer. Only signatures from externally owned accounts are accepted, and the high-s form is rejected. Each commit or revocation consumes the owner’s nonce.

Protocol constants, fixed at deployment with no setter

REALLOCATION_CAP_BPS = 2000 (the 0.2 cap), SLOT_CEILING_BPS = 40000 (the ceiling of 4), and a capital floor of 6 * 10^decimals / 100 base units (0.06).

IAgentCommitments

Not deployed. Each agent account commits its own genome hash and strategy-version hash once, in the owner-signed operation that deploys it. There is no update, delete, admin, or upgrade path, and a zero hash reverts.

X402PaymentValidator

Deployed at 0xCA918F53FFc7507Bd41602c0bD1ef72558705991 on Monad testnet. It is a Kernel v3.1 validator module (isValidSignatureWithSender is its only accepting path, and validateUserOp always fails). Its ERC-1271 signature layout is:
Public views include nonceFor(account, epoch, slot), authorizationDigest(...), kernelWrappedHash(account, digest), config(account), isPayee(account, payee), and maxOutflowPer24h(account), which returns 26 * paymentsPerEpoch * maxValue. The enforced bounds are on x402 validator.
Last modified on October 13, 2026