Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions showcase/og-block/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# OG BLOCK — EconomyOS Showcase submission

This folder is the submission package for the EconomyOS Community Showcase.
It is a copy-ready mirror of what goes into a PR against
[`Virtual-Protocol/acp-cli-demos`](https://github.com/Virtual-Protocol/acp-cli-demos).

## What OG BLOCK is

OG BLOCK turns real NFT holdings on Base into a public **culture score** and
leaderboard — instead of ranking people by followers or engagement. A profile
has two wallet slots:

- **Human wallet** — the operator's personal holder wallet.
- **Agent wallet** — an autonomous agent's wallet, verified as its own slot.

NFTs held in **either** wallet accumulate into one combined score. Each slot is
verified independently by signing a challenge **from that wallet's own key**, so
an agent's on-chain identity is proven, not just claimed. Agent wallets are
recognized on-chain through an **AgentIdentity** NFT
(`0x8004a169fb4a3325136eb29fa0ceb6d2e539a432` on Base).

**EconomyOS primitive used:** `wallet` (Agent Wallet). Designed to extend into
the ACP flow next.

## Live proof

- App: https://www.joinog.xyz
- Leaderboard (live scores): https://www.joinog.xyz/leaderboard
- Example verified profile: https://www.joinog.xyz/u/airplanestar_
- Public profile API (JSON): https://www.joinog.xyz/api/profile/airplanestar_
- Source: https://github.com/airplanestar888/OG-Block
- Demo video (agent wallet link flow): https://x.com/ogblockchain/status/2092282854105547104

### Agent used in the demo

- **Agent**: airplane (ACP agent, HYBRID role)
- **Agent ID**: `019f0a02-50d4-7169-b047-a5771369e32a`
- **Agent wallet**: `0x3282f5ae930f8be53695de152cf890b9385e8263` (Base mainnet)
- **AgentIdentity NFT**: #58870 on `0x8004a169fb4a3325136eb29fa0ceb6d2e539a432`
- **Linked profile**: [@airplanestar_](https://www.joinog.xyz/u/airplanestar_)

Status: live on Base mainnet — 16 profiles onboarded, 2,000+ NFTs tracked,
top score 61.5K and a combined ecosystem score of 99.2K.

## Scoring model

`100` for holding ≥1 NFT, `+25` per additional NFT, `+50` per NFT with a rare
trait, `+75` per early token (id < 500). Combined across both wallet slots.
Binary file added showcase/og-block/assets/demo.mp4
Binary file not shown.
60 changes: 60 additions & 0 deletions showcase/og-block/prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Demo Prompt

Reproduce the OG BLOCK agent-link flow end-to-end with any ACP agent.

## Operator side (one-time)

On https://joinog.xyz/dashboard, open the **Agent Wallet** panel and tap
**Connect agent**. The modal generates a one-time code (`OGB-XXXX-XXXX`,
single-use, expires in 15 minutes) together with a copy-paste instruction.

Equivalent authenticated API call:

```http
POST /api/agent/link-code
→ { "code", "expiresAt", "ttlMs", "handle", "instruction" }
```

## Agent side (paste this to your agent)

```text
TASK: register YOUR wallet as the agent wallet of the OG BLOCK profile
@<OPERATOR_HANDLE>. Follow only this instruction.

1. Run: acp agent use --agent-id <YOUR_AGENT_ID>
2. Run: acp wallet address ← record this address, it is what you register
3. Sign this exact text with that key (EIP-191 personal_sign), using the
CURRENT UTC time:
---
OG BLOCK agent link
Code: <CODE>
Agent wallet: <YOUR_ADDRESS>
Timestamp: <ISO_8601_UTC_NOW>
---
acp wallet sign-message --chain-id 8453 --message "<THE_EXACT_TEXT>"
4. POST JSON to https://joinog.xyz/api/agent/link
{
"code": "<CODE>",
"address": "<YOUR_ADDRESS>",
"chainId": 8453,
"message": "<THE_EXACT_SIGNED_TEXT>",
"signature": "<0x_SIGNATURE>"
}
5. Report the response body.

Rules: the signature must recover to exactly <YOUR_ADDRESS> (plain ECDSA);
if your wallet is a smart account driven by an internal operator key, submit
THAT signer EOA address instead. Failed attempts do not consume the code.
```

Success looks like:

```json
{ "ok": true, "handle": "<operator_handle>", "agentWallet": "<your address>", "score": 1234 }
```

Then verify publicly:

```bash
curl https://joinog.xyz/api/profile/<operator_handle>
```
84 changes: 84 additions & 0 deletions showcase/og-block/result-redacted.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Result Report (redacted)

Live end-to-end run of the `og-block-agent-link` flow against production
(`https://joinog.xyz`), executed 2026-08-25. Secrets redacted per Showcase
contribution rules: codes are single-use and now expired; signatures are
truncated; no private material is included.

## Environment

| Item | Value |
| --- | --- |
| Chain | Base mainnet (8453) |
| Agent | airplane (ACP agent, HYBRID role) |
| Agent ID | `019f0a02-50d4-7169-b047-a5771369e32a` |
| Agent wallet (ACP) | `0x3282f5ae930f8be53695de152cf890b9385e8263` |
| AgentIdentity NFT | #58870 on `0x8004a169fb4a3325136eb29fa0ceb6d2e539a432` |
| Operator profile | `@airplanestar_` |
| Endpoint under test | `POST https://joinog.xyz/api/agent/link` |

## Run log

### 1. One-time code issued

```
code=OGB-****-**** expiresAt=2026-08-25T15:52:51.593Z
```

Instruction block generated server-side by `POST /api/agent/link-code`
(authenticated operator session required — unauthenticated calls correctly
return `401 Unauthorized`, verified).

### 2. Agent selects its ACP wallet and signs

```bash
acp agent use --agent-id <AGENT_ID>
acp wallet address
# → 0x3282f5ae930f8be53695de152cf890b9385e8263
acp wallet sign-message --chain-id 8453 --message "<CHALLENGE_TEXT>"
# → signature=0x7261c6874eda1cf5c2…e1d69d1c (truncated, redacted)
```

### 3. POST /api/agent/link → HTTP 200

```json
{
"ok": true,
"handle": "airplanestar_",
"agentWallet": "0x3282f5ae930f8be53695de152cf890b9385e8263",
"score": 100
}
```

### 4. Database state after linking

```json
{
"slots": [
{
"address": "0x3282f5ae930f8be53695de152cf890b9385e8263",
"wallet_slot": "agent",
"verified_at": "2026-08-25T15:25:30.806+00:00"
}
],
"score": { "score": 100, "nft_count": 1, "rank": 16 }
}
```

Public read-back matches:
`https://joinog.xyz/api/profile/airplanestar_` → score 100, nftCount 1,
agentWallet linked.

## Negative cases observed in the field

| Case | Server response | Note |
| --- | --- | --- |
| Unauthenticated code generation | `401 {"error":"Unauthorized"}` | Guard works as designed |
| Signature recovers to a different address than submitted (smart-account operator key) | `400 {"error":"Signature could not be verified"}` | Documented fix: submit the signer EOA address instead |
| Failed attempts do NOT consume the code | — | Retry within expiry succeeds after fixing the payload |

## Post-run rescore

Combined score recalculated automatically across human + agent slots after a
successful link (verified-contract NFTs only). Registration retry-hardened:
transient provider errors during rescoring are retried before surfacing.
99 changes: 99 additions & 0 deletions showcase/og-block/showcase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{
"slug": "og-block",
"title": "OG BLOCK",
"tagline": "Ranks a public culture score from on-chain NFT holdings, with first-class support for agent wallets",
"description": "OG BLOCK turns real NFT holdings on Base into a public culture score and leaderboard, instead of ranking people by followers or engagement. A profile has both a human wallet and an agent wallet slot: each is verified independently by signing from its own key, and NFTs from either wallet accumulate into one combined score. Agent wallets are recognized on-chain through an AgentIdentity NFT, so an autonomous agent gets its own cultural reputation that is pulled, verified, and ranked publicly. Live on Base mainnet with 16 verified profiles onboarded and 2,000+ NFTs tracked.",
"status": "live",
"topic": "agents",
"topics": ["agents", "commerce"],
"builder": {
"name": "airplanestar",
"url": "https://x.com/airplanestar_"
},
"links": {
"repo": "https://github.com/airplanestar888/OG-Block",
"demo": "https://www.joinog.xyz/leaderboard",
"share": "https://x.com/ogblockchain/status/2092282854105547104?s=20",
"feedback": "https://github.com/airplanestar888/OG-Block/issues/new?title=Feedback%3A%20OG%20BLOCK",
"video": "https://x.com/ogblockchain/status/2092282854105547104?s=20"
},
"primitives": ["wallet"],
"visual": {
"kind": "live app",
"eyebrow": "base + agent wallet",
"title": "on-chain culture score",
"videoLabel": "Watch the agent wallet demo on X",
"posterUrl": "https://joinog.xyz/opengraph-image"
},
"skills": [
{
"name": "og-block-agent-link",
"href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/og-block/skills/og-block-agent-link",
"sourcePath": "showcase/og-block/skills/og-block-agent-link",
"summary": "Register any ACP agent's own Base wallet into an OG BLOCK profile's agent slot using a one-time code, then read back the combined culture score and rank. Zero funding required — works with any ACP agent out of the box.",
"install": "cp -R showcase/og-block/skills/og-block-agent-link ~/.agents/skills/"
}
],
"artifacts": [
{
"label": "Live app — joinog.xyz",
"href": "https://www.joinog.xyz",
"kind": "demo"
},
{
"label": "Public leaderboard (live scores)",
"href": "https://www.joinog.xyz/leaderboard",
"kind": "proof"
},
{
"label": "Example verified profile card",
"href": "https://www.joinog.xyz/u/airplanestar_",
"kind": "proof"
},
{
"label": "Public profile API (JSON)",
"href": "https://www.joinog.xyz/api/profile/airplanestar_",
"kind": "proof"
},
{
"label": "OG Card NFT contract on Base mainnet (verified source)",
"href": "https://basescan.org/address/0x841b99c7957107a633b8b063498b142f7c6d9e67#code",
"kind": "proof"
},
{
"label": "Agent wallet AgentIdentity #58870 on Base (on-chain proof)",
"href": "https://basescan.org/nft/0x8004a169fb4a3325136eb29fa0ceb6d2e539a432/58870",
"kind": "proof"
},
{
"label": "Agent wallet on BaseScan (0x3282…8263)",
"href": "https://basescan.org/address/0x3282f5ae930f8be53695de152cf890b9385e8263",
"kind": "proof"
},
{
"label": "Demo video (agent wallet link flow)",
"href": "https://x.com/ogblockchain/status/2092282854105547104?s=20",
"kind": "video"
},
{
"label": "Redacted result report",
"href": "https://github.com/Virtual-Protocol/acp-cli-demos/blob/main/showcase/og-block/result-redacted.md",
"kind": "proof"
},
{
"label": "Demo prompt",
"href": "https://github.com/Virtual-Protocol/acp-cli-demos/blob/main/showcase/og-block/prompt.md",
"kind": "prompt"
},
{
"label": "Source repository",
"href": "https://github.com/airplanestar888/OG-Block",
"kind": "docs"
}
],
"feedbackPrompts": [
"Does the agent wallet verification flow feel trustworthy?",
"Is the scoring model fair for on-chain holdings?",
"Which EconomyOS primitive should OG BLOCK integrate next?"
]
}
Loading
Loading