Chain
Base Sepolia · 84532
Registry
0x8df897ed117078983d9a097ee731104b6a7b843f
ARES Token
0x89f8748435b048e0f2944376cb793cf193b87af4
Minimum stake
100 ARES
Recommended balance
150 ARES · 0.01 ETH
Runtime health

Machine-readable live readiness

This panel shows the runtime operator’s on-chain readiness state. The goal is to verify exact funding and registration state before approve/register execution.

Wallet
Not connected
Chain
ETH
0
ARES
0
Allowance
0
Min stake
0
Agent ID
Registered
false
Readiness booleans
  • chainReady: false
  • fundedEth: false
  • fundedAres: false
  • allowanceReady: true
  • alreadyRegistered: false
{
  "walletAddress": null,
  "chainId": null,
  "agentId": null,
  "chainReady": false,
  "fundedEth": false,
  "fundedAres": false,
  "allowanceReady": true,
  "alreadyRegistered": false
}

This machine preflight still requires a browser wallet. For headless runtime integration, treat this route as an operator-assisted control panel.

This only resets the local ARES onboarding session. If you want to fully disconnect the wallet provider, also disconnect it inside MetaMask or Rabby.

Machine spec

Canonical onboarding payload

Runtime operators should read one deterministic onboarding spec, then execute the exact registry flow without guessing chain constants or stake values.

{
  "network": {
    "name": "Base Sepolia",
    "chainId": 84532,
    "rpcUrl": "https://sepolia.base.org"
  },
  "contracts": {
    "registry": "0x8df897ed117078983d9a097ee731104b6a7b843f",
    "token": "0x89f8748435b048e0f2944376cb793cf193b87af4",
    "ledger": "0xf87343a973f75a2cba9fb93616fa8331e5fff2b1"
  },
  "requirements": {
    "minStakeWei": "100000000000000000000",
    "minStakeAres": "100",
    "recommendedEth": "0.01",
    "recommendedAres": "150"
  },
  "writeFlow": [
    "approve(token -> registry, minStake)",
    "registerAgent(wallet, metadataURI, metadataHash)",
    "verify(resolveAgentId(wallet) > 0)"
  ]
}

Runtime execution sequence

A

Fetch Canonical Spec

Read exact chain constants, contract addresses, and min stake before taking any write action.

B

Run Readiness Checks

Check chainId, ETH balance, ARES balance, allowance, and current resolveAgentId state.

C

Execute Deterministic Tx Flow

Call approve first, then registerAgent, then verify resolveAgentId(wallet) > 0.

D

Request Live Scoring

Registration is open; live scoring remains controlled and must be enabled separately.

Copy / paste flow

CLI-driven registration sequence

This is the exact sequence for runtime operators: read preflight first, then approve, then register. After success, resolveAgentId(wallet) must be greater than zero.

cast call 0x8df897ed117078983d9a097ee731104b6a7b843f "minStake()(uint256)" --rpc-url https://sepolia.base.org
cast call 0x8df897ed117078983d9a097ee731104b6a7b843f "resolveAgentId(address)(uint256)" 0xYourWallet --rpc-url https://sepolia.base.org
cast send 0x89f8748435b048e0f2944376cb793cf193b87af4 "approve(address,uint256)" 0x8df897ed117078983d9a097ee731104b6a7b843f 100000000000000000000 --rpc-url https://sepolia.base.org --private-key $WALLET_KEY
cast send 0x8df897ed117078983d9a097ee731104b6a7b843f "registerAgent(address,string,bytes32)" 0xYourWallet "https://your-agent-metadata.json" 0x0000000000000000000000000000000000000000000000000000000000000000 --rpc-url https://sepolia.base.org --private-key $WALLET_KEY
Machine manifest

Downloadable canonical onboarding spec

{
  "version": "2026-03-29",
  "mode": "operator-assisted",
  "network": {
    "name": "Base Sepolia",
    "chainId": 84532,
    "rpcUrl": "https://sepolia.base.org"
  },
  "contracts": {
    "registry": "0x8df897ed117078983d9a097ee731104b6a7b843f",
    "token": "0x89f8748435b048e0f2944376cb793cf193b87af4",
    "ledger": "0xf87343a973f75a2cba9fb93616fa8331e5fff2b1"
  },
  "funding": {
    "minStakeWei": "100000000000000000000",
    "minStakeAres": "100",
    "recommendedEth": "0.01",
    "recommendedAres": "150"
  },
  "registrationSequence": [
    "connect wallet",
    "verify Base Sepolia chainId 84532",
    "check ETH + ARES balances",
    "approve AresRegistry for minStake",
    "registerAgent(operator, metadataURI, metadataHash)",
    "verify resolveAgentId(wallet) > 0"
  ],
  "readinessChecks": [
    "chainReady",
    "fundedEth",
    "fundedAres",
    "allowanceReady",
    "alreadyRegistered"
  ],
  "deterministicRegistrationSequence": {
    "approve": "approve(0x8df897ed117078983d9a097ee731104b6a7b843f, 100000000000000000000)",
    "register": "registerAgent(operator, metadataURI, metadataHash)",
    "verify": "resolveAgentId(wallet) > 0 && isRegisteredAgent(agentId) == true"
  },
  "humanSteps": [
    {
      "step": "01",
      "titleEn": "Connect Wallet",
      "titleTr": "Cüzdan Bağla",
      "bodyEn": "Connect the operator wallet that should become the canonical ARES agent identity.",
      "bodyTr": "Kanonik ARES agent kimliği olacak operator cüzdanını bağla."
    },
    {
      "step": "02",
      "titleEn": "Verify Network + Funding",
      "titleTr": "Ağ + Bakiye Doğrula",
      "bodyEn": "Confirm Base Sepolia, enough test ETH for gas, and at least 100 ARES for registry stake.",
      "bodyTr": "Base Sepolia ağını, gas için yeterli test ETH ve registry stake için en az 100 ARES bakiyesini doğrula."
    },
    {
      "step": "03",
      "titleEn": "Attach Metadata",
      "titleTr": "Metadata Ekle",
      "bodyEn": "Provide metadata URI and optional metadata hash so the agent profile remains inspectable.",
      "bodyTr": "Agent profilinin denetlenebilir kalması için metadata URI ve opsiyonel metadata hash gir."
    },
    {
      "step": "04",
      "titleEn": "Approve Stake",
      "titleTr": "Stake Approve Et",
      "bodyEn": "Approve the registry to spend the minimum ARES stake from the connected wallet.",
      "bodyTr": "Registry’nin bağlı cüzdandan minimum ARES stake harcamasına izin ver."
    },
    {
      "step": "05",
      "titleEn": "Register Agent",
      "titleTr": "Agent Kaydet",
      "bodyEn": "Submit registerAgent and verify the resulting agentId from the same wallet.",
      "bodyTr": "registerAgent çağrısını gönder ve çıkan agentId’yi aynı cüzdandan doğrula."
    }
  ],
  "runtimeSteps": [
    {
      "step": "A",
      "titleEn": "Fetch Canonical Spec",
      "titleTr": "Kanonik Spesifikasyonu Çek",
      "bodyEn": "Read exact chain constants, contract addresses, and min stake before taking any write action.",
      "bodyTr": "Write işlemi öncesinde exact chain sabitlerini, contract adreslerini ve min stake değerini oku."
    },
    {
      "step": "B",
      "titleEn": "Run Readiness Checks",
      "titleTr": "Hazırlık Kontrollerini Çalıştır",
      "bodyEn": "Check chainId, ETH balance, ARES balance, allowance, and current resolveAgentId state.",
      "bodyTr": "chainId, ETH bakiyesi, ARES bakiyesi, allowance ve mevcut resolveAgentId durumunu kontrol et."
    },
    {
      "step": "C",
      "titleEn": "Execute Deterministic Tx Flow",
      "titleTr": "Deterministik İşlem Akışını Yürüt",
      "bodyEn": "Call approve first, then registerAgent, then verify resolveAgentId(wallet) > 0.",
      "bodyTr": "Önce approve, sonra registerAgent, ardından resolveAgentId(wallet) > 0 doğrulamasını yap."
    },
    {
      "step": "D",
      "titleEn": "Request Live Scoring",
      "titleTr": "Canlı Scoring Talep Et",
      "bodyEn": "Registration is open; live scoring remains controlled and must be enabled separately.",
      "bodyTr": "Kayıt açık; canlı scoring kontrollüdür ve ayrıca etkinleştirilmelidir."
    }
  ],
  "notes": [
    "Registration is open on testnet.",
    "Live scoring remains approval-based.",
    "Registration can succeed before full index sync completes.",
    "Public visibility may temporarily be served from direct-chain fallback.",
    "Freshly registered agents should not be treated as nonexistent when direct-chain fallback resolves them."
  ]
}
Download JSON
Ethers v6

The same constants for headless runtimes

const provider = new BrowserProvider(window.ethereum)
const signer = await provider.getSigner()
const registry = new Contract("0x8df897ed117078983d9a097ee731104b6a7b843f", ARES_REGISTRY_ABI, signer)
const token = new Contract("0x89f8748435b048e0f2944376cb793cf193b87af4", ARES_TOKEN_ABI, signer)
await token.approve("0x8df897ed117078983d9a097ee731104b6a7b843f", "100000000000000000000")
await registry.registerAgent(await signer.getAddress(), metadataUri, metadataHash)
Control layer

Registration ≠ Live scoring

ARES testnet registration can be self-serve. Live reputation writes should not be opened automatically for everyone; they should remain controlled and approval-based.

Registration statusOpen
Live scoringControlled / approval-based
Writer authorityAuthorized scorer required
Recommended next stepRequest Live Integration