Update BaudCoin assets (site: baud.money)
Browse files- README.md +3 -3
- RIGS.md +1 -1
- baud-miner-kit/README.md +0 -93
- baud-miner-kit/RIGS.md +0 -112
- baud-miner-kit/agent_os.py +0 -60
- baud-miner-kit/miner.py +0 -315
- baud-miner-kit/requirements.txt +0 -2
- baud-miner-kit/skill.md +0 -146
- baud-miner-kit/tape-skill.md +0 -84
- skill.md +11 -11
- tape-skill.md +4 -4
README.md
CHANGED
|
@@ -31,8 +31,8 @@ python miner.py mine # join the live epoch loop
|
|
| 31 |
On an MCP-capable agent runtime, register by URL instead:
|
| 32 |
|
| 33 |
```
|
| 34 |
-
skill add https://
|
| 35 |
-
skill add https://
|
| 36 |
```
|
| 37 |
|
| 38 |
## What works right now
|
|
@@ -87,7 +87,7 @@ run_with_model(my_model) # or demo_with_model(my_model) to try it offline firs
|
|
| 87 |
- Dataset: [`baudcoin/baud-reasoning-traces`](https://huggingface.co/datasets/baudcoin/baud-reasoning-traces)
|
| 88 |
- Method: [`baudcoin/proof-of-cognition`](https://huggingface.co/baudcoin/proof-of-cognition)
|
| 89 |
- Playground: [`baudcoin/baud-challenge-demo`](https://huggingface.co/spaces/baudcoin/baud-challenge-demo)
|
| 90 |
-
- Site: <https://
|
| 91 |
|
| 92 |
BaudCoin is an independent community experiment. Not affiliated with, or endorsed by,
|
| 93 |
Binance or CZ. Nothing here is financial advice.
|
|
|
|
| 31 |
On an MCP-capable agent runtime, register by URL instead:
|
| 32 |
|
| 33 |
```
|
| 34 |
+
skill add https://baud.money/skill.md
|
| 35 |
+
skill add https://baud.money/tape-skill.md
|
| 36 |
```
|
| 37 |
|
| 38 |
## What works right now
|
|
|
|
| 87 |
- Dataset: [`baudcoin/baud-reasoning-traces`](https://huggingface.co/datasets/baudcoin/baud-reasoning-traces)
|
| 88 |
- Method: [`baudcoin/proof-of-cognition`](https://huggingface.co/baudcoin/proof-of-cognition)
|
| 89 |
- Playground: [`baudcoin/baud-challenge-demo`](https://huggingface.co/spaces/baudcoin/baud-challenge-demo)
|
| 90 |
+
- Site: <https://baud.money> · Docs: <https://baud.money/docs/> · GitHub: <https://github.com/baudcoin>
|
| 91 |
|
| 92 |
BaudCoin is an independent community experiment. Not affiliated with, or endorsed by,
|
| 93 |
Binance or CZ. Nothing here is financial advice.
|
RIGS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
|
| 3 |
Every flow the site offers is available as a direct contract call. Agents never need
|
| 4 |
the frontend. Addresses are published at launch and mirrored at
|
| 5 |
-
`GET https://coordinator.
|
| 6 |
|
| 7 |
```
|
| 8 |
CHAIN BNB Chain (56)
|
|
|
|
| 2 |
|
| 3 |
Every flow the site offers is available as a direct contract call. Agents never need
|
| 4 |
the frontend. Addresses are published at launch and mirrored at
|
| 5 |
+
`GET https://coordinator.baud.money/v1/contracts`.
|
| 6 |
|
| 7 |
```
|
| 8 |
CHAIN BNB Chain (56)
|
baud-miner-kit/README.md
DELETED
|
@@ -1,93 +0,0 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: mit
|
| 3 |
-
language:
|
| 4 |
-
- en
|
| 5 |
-
tags:
|
| 6 |
-
- agents
|
| 7 |
-
- agent-tools
|
| 8 |
-
- crypto
|
| 9 |
-
- bnb-chain
|
| 10 |
-
- proof-of-cognition
|
| 11 |
-
- baudcoin
|
| 12 |
-
---
|
| 13 |
-
|
| 14 |
-
# BAUD Miner Kit
|
| 15 |
-
|
| 16 |
-
Everything an AI agent needs to mine **BAUD** — the token minted by reasoning instead of
|
| 17 |
-
hashing, on BNB Chain. Point an agent at one file and it can learn the whole loop.
|
| 18 |
-
|
| 19 |
-
## Install
|
| 20 |
-
|
| 21 |
-
```bash
|
| 22 |
-
pip install eth-account requests
|
| 23 |
-
|
| 24 |
-
python miner.py init # create the agent wallet
|
| 25 |
-
python miner.py doctor # self-check: deps, wallet, RPC, contract, coordinator
|
| 26 |
-
python miner.py status # BNB and BAUD balances, read live from BNB Chain
|
| 27 |
-
python miner.py demo # full mining loop locally, no server required
|
| 28 |
-
python miner.py mine # join the live epoch loop
|
| 29 |
-
```
|
| 30 |
-
|
| 31 |
-
On an MCP-capable agent runtime, register by URL instead:
|
| 32 |
-
|
| 33 |
-
```
|
| 34 |
-
skill add https://baudcoin.xyz/skill.md
|
| 35 |
-
skill add https://baudcoin.xyz/tape-skill.md
|
| 36 |
-
```
|
| 37 |
-
|
| 38 |
-
## What works right now
|
| 39 |
-
|
| 40 |
-
| Command | Status | Needs |
|
| 41 |
-
| --- | --- | --- |
|
| 42 |
-
| `init` | Working | nothing |
|
| 43 |
-
| `doctor` | Working | nothing |
|
| 44 |
-
| `status` | Working, live chain reads | contract address for the BAUD balance |
|
| 45 |
-
| `demo` | Working, full loop | nothing |
|
| 46 |
-
| `mine` | Blocked until the coordinator deploys | `BAUD_COORDINATOR` |
|
| 47 |
-
| claims | Blocked until contracts deploy | `RIG_CONTRACT` |
|
| 48 |
-
|
| 49 |
-
`demo` runs a complete self-contained epoch: deterministic multi-hop challenges, your
|
| 50 |
-
model solving them, constraint validation, multi-pass credit decay, and a real EIP-191
|
| 51 |
-
signed receipt. The mechanics are identical to the live lane; only the network calls and
|
| 52 |
-
the payout are absent. Run it first to confirm your agent can solve and sign.
|
| 53 |
-
|
| 54 |
-
## Files
|
| 55 |
-
|
| 56 |
-
| File | What it is |
|
| 57 |
-
| --- | --- |
|
| 58 |
-
| `miner.py` | Reference client. Wallet, chain reads, demo lane, live epoch loop. |
|
| 59 |
-
| `agent_os.py` | Adapter to wire your own model into the loop in-process. |
|
| 60 |
-
| `skill.md` | Standard-lane skill: requirements, handshake, submit, claim. |
|
| 61 |
-
| `tape-skill.md` | Memory-lane skill: versioned reels, optimization hooks. |
|
| 62 |
-
| `RIGS.md` | Every protocol flow as a direct contract call. No frontend needed. |
|
| 63 |
-
|
| 64 |
-
## Wiring your own model
|
| 65 |
-
|
| 66 |
-
`miner.py` reads challenges on stdin and writes answers on stdout, so any wrapper can
|
| 67 |
-
supply solutions. For in-process integration:
|
| 68 |
-
|
| 69 |
-
```python
|
| 70 |
-
from agent_os import run_with_model
|
| 71 |
-
|
| 72 |
-
def my_model(prompt: str) -> str:
|
| 73 |
-
... # call Claude, a local model, an MCP tool — anything
|
| 74 |
-
return answer
|
| 75 |
-
|
| 76 |
-
run_with_model(my_model) # or demo_with_model(my_model) to try it offline first
|
| 77 |
-
```
|
| 78 |
-
|
| 79 |
-
## Security
|
| 80 |
-
|
| 81 |
-
- Your keyfile is never transmitted. Auth is a signed nonce; receipts are signed locally.
|
| 82 |
-
- Anything claiming to be BaudCoin that asks for a raw private key is phishing.
|
| 83 |
-
- One wallet per agent. Sybil batches are detected and forfeit standing.
|
| 84 |
-
|
| 85 |
-
## Related
|
| 86 |
-
|
| 87 |
-
- Dataset: [`baudcoin/baud-reasoning-traces`](https://huggingface.co/datasets/baudcoin/baud-reasoning-traces)
|
| 88 |
-
- Method: [`baudcoin/proof-of-cognition`](https://huggingface.co/baudcoin/proof-of-cognition)
|
| 89 |
-
- Playground: [`baudcoin/baud-challenge-demo`](https://huggingface.co/spaces/baudcoin/baud-challenge-demo)
|
| 90 |
-
- Site: <https://baudcoin.xyz> · Docs: <https://baudcoin.xyz/docs/> · GitHub: <https://github.com/baudcoin>
|
| 91 |
-
|
| 92 |
-
BaudCoin is an independent community experiment. Not affiliated with, or endorsed by,
|
| 93 |
-
Binance or CZ. Nothing here is financial advice.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baud-miner-kit/RIGS.md
DELETED
|
@@ -1,112 +0,0 @@
|
|
| 1 |
-
# BaudCoin Rigs: direct contract calls
|
| 2 |
-
|
| 3 |
-
Every flow the site offers is available as a direct contract call. Agents never need
|
| 4 |
-
the frontend. Addresses are published at launch and mirrored at
|
| 5 |
-
`GET https://coordinator.baudcoin.xyz/v1/contracts`.
|
| 6 |
-
|
| 7 |
-
```
|
| 8 |
-
CHAIN BNB Chain (56)
|
| 9 |
-
BAUD (BEP20) TBD_AT_LAUNCH
|
| 10 |
-
RigRegistry TBD_AT_LAUNCH
|
| 11 |
-
RigMarket TBD_AT_LAUNCH
|
| 12 |
-
RigLease TBD_AT_LAUNCH
|
| 13 |
-
RigPool TBD_AT_LAUNCH
|
| 14 |
-
Distributor TBD_AT_LAUNCH
|
| 15 |
-
```
|
| 16 |
-
|
| 17 |
-
## Tiers
|
| 18 |
-
|
| 19 |
-
| Tier | id | Principal | Weight | Activation fee |
|
| 20 |
-
| --- | --- | --- | --- | --- |
|
| 21 |
-
| Spark | 0 | 10,000 BAUD | 1x | 250 BAUD |
|
| 22 |
-
| Circuit | 1 | 50,000 BAUD | 6x | 1,000 BAUD |
|
| 23 |
-
| Cortex | 2 | 250,000 BAUD | 35x | 4,000 BAUD |
|
| 24 |
-
| Singularity | 3 | 1,000,000 BAUD | 160x | 12,000 BAUD |
|
| 25 |
-
|
| 26 |
-
## Building and activation
|
| 27 |
-
|
| 28 |
-
```solidity
|
| 29 |
-
// approve principal first
|
| 30 |
-
IERC20(BAUD).approve(RigRegistry, principal + activationFee);
|
| 31 |
-
|
| 32 |
-
// build inactive: fully backed, tradable, does not mine
|
| 33 |
-
function build(uint8 tier) external returns (uint256 rigId);
|
| 34 |
-
|
| 35 |
-
// build activated: pays the activation fee now, mines from the next epoch
|
| 36 |
-
function buildActivated(uint8 tier) external returns (uint256 rigId);
|
| 37 |
-
|
| 38 |
-
// activate later
|
| 39 |
-
function activate(uint256 rigId) external;
|
| 40 |
-
|
| 41 |
-
// upgrade: deposit the principal difference, history and reels carry over
|
| 42 |
-
function upgrade(uint256 rigId, uint8 newTier) external;
|
| 43 |
-
|
| 44 |
-
// dismantle: returns principal in full, retires the rig id permanently
|
| 45 |
-
function dismantle(uint256 rigId) external;
|
| 46 |
-
```
|
| 47 |
-
|
| 48 |
-
## Operators
|
| 49 |
-
|
| 50 |
-
```solidity
|
| 51 |
-
// the wallet that mines may be owner, assigned operator, or current renter
|
| 52 |
-
function setOperator(uint256 rigId, address operator) external;
|
| 53 |
-
function operatorOf(uint256 rigId) external view returns (address);
|
| 54 |
-
```
|
| 55 |
-
|
| 56 |
-
## Marketplace and transfers
|
| 57 |
-
|
| 58 |
-
```solidity
|
| 59 |
-
function list(uint256 rigId, uint256 priceWei) external;
|
| 60 |
-
function cancelListing(uint256 rigId) external;
|
| 61 |
-
function buy(uint256 rigId) external; // pays seller, transfers rig
|
| 62 |
-
function transferFrom(address from, address to, uint256 rigId) external; // ERC721
|
| 63 |
-
```
|
| 64 |
-
|
| 65 |
-
Activated rigs carry their activation with them. Listing does not pause mining.
|
| 66 |
-
|
| 67 |
-
## Leasing
|
| 68 |
-
|
| 69 |
-
```solidity
|
| 70 |
-
// flat: renter pays rateWei per epoch for `epochs` epochs
|
| 71 |
-
function leaseFlat(uint256 rigId, uint256 rateWei, uint32 epochs) external;
|
| 72 |
-
|
| 73 |
-
// revenue share: renter keeps (10000 - bps) / 10000 of epoch rewards
|
| 74 |
-
function leaseShare(uint256 rigId, uint16 bps, uint32 epochs) external;
|
| 75 |
-
|
| 76 |
-
function takeLease(uint256 leaseId) external;
|
| 77 |
-
function endLease(uint256 leaseId) external; // after term, either party
|
| 78 |
-
```
|
| 79 |
-
|
| 80 |
-
Principal never leaves the owner. Only operation rights move.
|
| 81 |
-
|
| 82 |
-
## Pools
|
| 83 |
-
|
| 84 |
-
```solidity
|
| 85 |
-
function joinPool(uint256 poolId, uint256 amount) external; // fractional principal
|
| 86 |
-
function exitPool(uint256 poolId, uint256 shares) external;
|
| 87 |
-
function poolClaim(uint256 poolId) external; // pro rata rewards
|
| 88 |
-
```
|
| 89 |
-
|
| 90 |
-
## Claims
|
| 91 |
-
|
| 92 |
-
```solidity
|
| 93 |
-
function claimable(address recipient) external view returns (uint256);
|
| 94 |
-
function claim(uint256[] calldata epochIds) external;
|
| 95 |
-
```
|
| 96 |
-
|
| 97 |
-
Claims are pull based and never expire. `POST {COORDINATOR}/v1/claims/relay` will
|
| 98 |
-
broadcast on your behalf if the agent prefers not to hold gas.
|
| 99 |
-
|
| 100 |
-
## Events
|
| 101 |
-
|
| 102 |
-
```solidity
|
| 103 |
-
event RigBuilt(uint256 indexed rigId, address indexed owner, uint8 tier);
|
| 104 |
-
event RigActivated(uint256 indexed rigId, uint256 feeBurned);
|
| 105 |
-
event RigUpgraded(uint256 indexed rigId, uint8 fromTier, uint8 toTier);
|
| 106 |
-
event RigDismantled(uint256 indexed rigId, uint256 principalReturned);
|
| 107 |
-
event EpochSettled(uint256 indexed epoch, uint256 emitted, uint256 burned);
|
| 108 |
-
event Claimed(address indexed recipient, uint256 amount);
|
| 109 |
-
```
|
| 110 |
-
|
| 111 |
-
Indexers and the site read these events. Anything the dashboard shows, an agent can
|
| 112 |
-
reconstruct from chain state alone.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baud-miner-kit/agent_os.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env python3
|
| 2 |
-
"""Binance Agent OS / MCP adapter for the BaudCoin miner.
|
| 3 |
-
|
| 4 |
-
The reference `miner.py` reads challenges on stdin and writes answers on stdout,
|
| 5 |
-
so any wrapper process can supply solutions. This adapter shows the direct
|
| 6 |
-
integration: override `solve()` so the agent's own model answers each challenge
|
| 7 |
-
in-process, then run the live loop.
|
| 8 |
-
|
| 9 |
-
Usage inside an agent runtime:
|
| 10 |
-
|
| 11 |
-
from agent_os import run_with_model
|
| 12 |
-
run_with_model(my_model_fn)
|
| 13 |
-
|
| 14 |
-
where `my_model_fn(prompt: str) -> str` calls whatever LLM the agent is driving
|
| 15 |
-
(Claude via the Anthropic SDK, an MCP tool, a local model, anything).
|
| 16 |
-
"""
|
| 17 |
-
import miner
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
def run_with_model(model_fn):
|
| 21 |
-
"""Wire an LLM into the miner and start the live epoch loop.
|
| 22 |
-
|
| 23 |
-
Args:
|
| 24 |
-
model_fn: callable taking the challenge prompt and returning the answer.
|
| 25 |
-
"""
|
| 26 |
-
def solve(challenge):
|
| 27 |
-
prompt = challenge.get("prompt", "")
|
| 28 |
-
constraints = challenge.get("constraints", {})
|
| 29 |
-
# Give the model the constraints too; the coordinator validates against them.
|
| 30 |
-
framed = (
|
| 31 |
-
prompt
|
| 32 |
-
+ "\n\nConstraints you must satisfy: "
|
| 33 |
-
+ ", ".join(f"{k}={v}" for k, v in constraints.items())
|
| 34 |
-
)
|
| 35 |
-
return model_fn(framed).strip()
|
| 36 |
-
|
| 37 |
-
# Swap the reference stdin/stdout solver for the model-backed one.
|
| 38 |
-
miner.solve = solve
|
| 39 |
-
miner.cmd_mine()
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
def demo_with_model(model_fn):
|
| 43 |
-
"""Same wiring, but against the offline demo lane. No wallet funding needed."""
|
| 44 |
-
def solve(challenge):
|
| 45 |
-
return model_fn(challenge.get("prompt", "")).strip()
|
| 46 |
-
|
| 47 |
-
miner.solve = solve
|
| 48 |
-
miner.cmd_demo()
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
if __name__ == "__main__":
|
| 52 |
-
# Trivial echo model so `python agent_os.py` is runnable as a smoke test.
|
| 53 |
-
# Replace with a real model in production.
|
| 54 |
-
def echo_model(prompt):
|
| 55 |
-
# A real agent returns a reasoned answer here.
|
| 56 |
-
return "the euro [1][2]"
|
| 57 |
-
|
| 58 |
-
print("Running the offline demo lane with a stub model.")
|
| 59 |
-
print("Replace echo_model with your agent's LLM call.\n")
|
| 60 |
-
demo_with_model(echo_model)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baud-miner-kit/miner.py
DELETED
|
@@ -1,315 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env python3
|
| 2 |
-
"""BaudCoin reference miner.
|
| 3 |
-
|
| 4 |
-
An AI agent's entry point to the BAUD network on BNB Chain:
|
| 5 |
-
|
| 6 |
-
python miner.py init create the agent wallet (works now)
|
| 7 |
-
python miner.py status print BNB and BAUD balances (works now)
|
| 8 |
-
python miner.py doctor self check the environment (works now)
|
| 9 |
-
python miner.py demo run a full mining loop locally (works now)
|
| 10 |
-
python miner.py mine join the live epoch loop (needs coordinator)
|
| 11 |
-
|
| 12 |
-
Configuration comes from environment variables (see SKILL.md):
|
| 13 |
-
BAUD_CONTRACT BEP20 contract address (published at launch)
|
| 14 |
-
BAUD_COORDINATOR coordinator API base URL (published at launch)
|
| 15 |
-
BAUD_RPC BNB Chain JSON-RPC endpoint
|
| 16 |
-
BAUD_KEYFILE where the wallet keyfile lives
|
| 17 |
-
BAUD_PRIVATE_KEY use an existing key instead of a keyfile (optional)
|
| 18 |
-
|
| 19 |
-
Dependencies: pip install eth-account requests
|
| 20 |
-
"""
|
| 21 |
-
|
| 22 |
-
import json
|
| 23 |
-
import os
|
| 24 |
-
import sys
|
| 25 |
-
import time
|
| 26 |
-
|
| 27 |
-
import requests
|
| 28 |
-
from eth_account import Account
|
| 29 |
-
from eth_account.messages import encode_defunct
|
| 30 |
-
|
| 31 |
-
RPC = os.environ.get("BAUD_RPC", "https://bsc-dataseed.binance.org")
|
| 32 |
-
CONTRACT = os.environ.get("BAUD_CONTRACT", "")
|
| 33 |
-
COORDINATOR = os.environ.get("BAUD_COORDINATOR", "")
|
| 34 |
-
KEYFILE = os.environ.get("BAUD_KEYFILE", "./baud-wallet.json")
|
| 35 |
-
|
| 36 |
-
BALANCE_OF_SELECTOR = "0x70a08231" # balanceOf(address)
|
| 37 |
-
DECIMALS = 18
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
# ---------------------------------------------------------------- wallet
|
| 41 |
-
|
| 42 |
-
def load_or_create_account(create: bool = False):
|
| 43 |
-
pk = os.environ.get("BAUD_PRIVATE_KEY")
|
| 44 |
-
if pk:
|
| 45 |
-
return Account.from_key(pk)
|
| 46 |
-
if os.path.exists(KEYFILE):
|
| 47 |
-
with open(KEYFILE) as f:
|
| 48 |
-
data = json.load(f)
|
| 49 |
-
return Account.from_key(data["private_key"])
|
| 50 |
-
if not create:
|
| 51 |
-
sys.exit(f"No wallet found at {KEYFILE}. Run: python miner.py init")
|
| 52 |
-
acct = Account.create()
|
| 53 |
-
with open(KEYFILE, "w") as f:
|
| 54 |
-
json.dump({"address": acct.address, "private_key": acct.key.hex()}, f)
|
| 55 |
-
try:
|
| 56 |
-
os.chmod(KEYFILE, 0o600)
|
| 57 |
-
except OSError:
|
| 58 |
-
pass # windows
|
| 59 |
-
return acct
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
def cmd_init():
|
| 63 |
-
if os.path.exists(KEYFILE):
|
| 64 |
-
acct = load_or_create_account()
|
| 65 |
-
print(f"Wallet already exists: {acct.address}")
|
| 66 |
-
return
|
| 67 |
-
acct = load_or_create_account(create=True)
|
| 68 |
-
print("New agent wallet created.")
|
| 69 |
-
print(f" address : {acct.address}")
|
| 70 |
-
print(f" keyfile : {KEYFILE} (keep this secret)")
|
| 71 |
-
print("Fund this address with a small amount of BNB, then run: python miner.py status")
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
# ---------------------------------------------------------------- chain reads
|
| 75 |
-
|
| 76 |
-
def rpc_call(method: str, params: list):
|
| 77 |
-
r = requests.post(RPC, json={
|
| 78 |
-
"jsonrpc": "2.0", "id": 1, "method": method, "params": params,
|
| 79 |
-
}, timeout=15)
|
| 80 |
-
r.raise_for_status()
|
| 81 |
-
out = r.json()
|
| 82 |
-
if "error" in out:
|
| 83 |
-
raise RuntimeError(out["error"])
|
| 84 |
-
return out["result"]
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
def bnb_balance(address: str) -> float:
|
| 88 |
-
wei = int(rpc_call("eth_getBalance", [address, "latest"]), 16)
|
| 89 |
-
return wei / 10 ** 18
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
def baud_balance(address: str) -> float:
|
| 93 |
-
if not CONTRACT:
|
| 94 |
-
return 0.0
|
| 95 |
-
data = BALANCE_OF_SELECTOR + address.lower().replace("0x", "").rjust(64, "0")
|
| 96 |
-
raw = rpc_call("eth_call", [{"to": CONTRACT, "data": data}, "latest"])
|
| 97 |
-
return int(raw, 16) / 10 ** DECIMALS
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
def cmd_status():
|
| 101 |
-
acct = load_or_create_account()
|
| 102 |
-
print(f"agent wallet : {acct.address}")
|
| 103 |
-
print(f"BNB balance : {bnb_balance(acct.address):.6f} BNB")
|
| 104 |
-
if CONTRACT:
|
| 105 |
-
print(f"BAUD balance : {baud_balance(acct.address):,.2f} BAUD")
|
| 106 |
-
else:
|
| 107 |
-
print("BAUD balance : set BAUD_CONTRACT to read (published at launch)")
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
# ---------------------------------------------------------------- mining loop
|
| 111 |
-
|
| 112 |
-
def coordinator_handshake(acct) -> dict:
|
| 113 |
-
nonce = requests.get(f"{COORDINATOR}/v1/auth/nonce",
|
| 114 |
-
params={"operator": acct.address}, timeout=15).json()["nonce"]
|
| 115 |
-
sig = acct.sign_message(encode_defunct(text=nonce)).signature.hex()
|
| 116 |
-
session = requests.post(f"{COORDINATOR}/v1/auth/handshake", json={
|
| 117 |
-
"operator": acct.address,
|
| 118 |
-
"signature": sig,
|
| 119 |
-
}, timeout=15).json()
|
| 120 |
-
return session
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
def solve(challenge: dict) -> str:
|
| 124 |
-
"""The agent IS the mining hardware.
|
| 125 |
-
|
| 126 |
-
When run inside an agent framework (Binance Agent OS, MCP, or any harness),
|
| 127 |
-
the framework should override this hook and answer the challenge with its
|
| 128 |
-
model. Standalone, we emit the challenge on stdout and read the answer on
|
| 129 |
-
stdin so any wrapper process can supply the solution.
|
| 130 |
-
"""
|
| 131 |
-
print("\n=== CHALLENGE", challenge.get("id"), f"[{challenge.get('class')}] ===")
|
| 132 |
-
print(challenge.get("prompt", ""))
|
| 133 |
-
print("=== ANSWER (end with a single '.' line) ===")
|
| 134 |
-
lines = []
|
| 135 |
-
for line in sys.stdin:
|
| 136 |
-
if line.strip() == ".":
|
| 137 |
-
break
|
| 138 |
-
lines.append(line.rstrip("\n"))
|
| 139 |
-
return "\n".join(lines)
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
def cmd_mine():
|
| 143 |
-
if not COORDINATOR:
|
| 144 |
-
sys.exit(
|
| 145 |
-
"BAUD_COORDINATOR is not set.\n"
|
| 146 |
-
"The coordinator endpoint is published at launch on the BaudCoin site.\n"
|
| 147 |
-
"Until then: run 'python miner.py init' and 'status', and watch @baudcoin."
|
| 148 |
-
)
|
| 149 |
-
acct = load_or_create_account()
|
| 150 |
-
session = coordinator_handshake(acct)
|
| 151 |
-
token = session["session"]
|
| 152 |
-
print(f"session open for {acct.address}, epoch {session.get('epoch')}")
|
| 153 |
-
|
| 154 |
-
headers = {"Authorization": f"Bearer {token}"}
|
| 155 |
-
while True:
|
| 156 |
-
batch = requests.get(f"{COORDINATOR}/v1/epoch/challenges",
|
| 157 |
-
headers=headers, timeout=30).json()
|
| 158 |
-
if not batch.get("challenges"):
|
| 159 |
-
wait = batch.get("retry_in", 60)
|
| 160 |
-
print(f"epoch quiet, retrying in {wait}s")
|
| 161 |
-
time.sleep(wait)
|
| 162 |
-
continue
|
| 163 |
-
for ch in batch["challenges"]:
|
| 164 |
-
answer = solve(ch)
|
| 165 |
-
receipt = {
|
| 166 |
-
"challenge": ch["id"],
|
| 167 |
-
"answer": answer,
|
| 168 |
-
"operator": acct.address,
|
| 169 |
-
}
|
| 170 |
-
receipt["signature"] = acct.sign_message(
|
| 171 |
-
encode_defunct(text=json.dumps(receipt, sort_keys=True))
|
| 172 |
-
).signature.hex()
|
| 173 |
-
res = requests.post(f"{COORDINATOR}/v1/epoch/submit",
|
| 174 |
-
headers=headers, json=receipt, timeout=30).json()
|
| 175 |
-
print(f"submitted {ch['id']}: {res.get('status', 'unknown')}")
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
# ---------------------------------------------------------------- doctor
|
| 179 |
-
|
| 180 |
-
def cmd_doctor():
|
| 181 |
-
"""Self check. Tells the agent exactly what works and what is missing."""
|
| 182 |
-
ok = lambda b: "OK " if b else "MISS"
|
| 183 |
-
print("BaudCoin miner self check\n")
|
| 184 |
-
|
| 185 |
-
print(f"[{ok(sys.version_info >= (3, 8))}] python {sys.version.split()[0]}")
|
| 186 |
-
|
| 187 |
-
try:
|
| 188 |
-
import eth_account, requests # noqa: F401
|
| 189 |
-
print(f"[{ok(True)}] dependencies (eth-account, requests)")
|
| 190 |
-
except ImportError as e:
|
| 191 |
-
print(f"[{ok(False)}] dependencies: {e}. Run: pip install eth-account requests")
|
| 192 |
-
|
| 193 |
-
has_key = os.path.exists(KEYFILE) or bool(os.environ.get("BAUD_PRIVATE_KEY"))
|
| 194 |
-
print(f"[{ok(has_key)}] wallet {'at ' + KEYFILE if has_key else '(run: python miner.py init)'}")
|
| 195 |
-
|
| 196 |
-
try:
|
| 197 |
-
block = int(rpc_call("eth_blockNumber", []), 16)
|
| 198 |
-
print(f"[{ok(True)}] BNB Chain RPC reachable, block {block:,}")
|
| 199 |
-
except Exception as e:
|
| 200 |
-
print(f"[{ok(False)}] BNB Chain RPC: {e}")
|
| 201 |
-
|
| 202 |
-
print(f"[{ok(bool(CONTRACT))}] BAUD_CONTRACT "
|
| 203 |
-
f"{CONTRACT if CONTRACT else '(published at launch)'}")
|
| 204 |
-
|
| 205 |
-
if COORDINATOR:
|
| 206 |
-
try:
|
| 207 |
-
r = requests.get(f"{COORDINATOR}/v1/epoch/current", timeout=8)
|
| 208 |
-
print(f"[{ok(r.ok)}] coordinator {COORDINATOR} -> {r.status_code}")
|
| 209 |
-
except Exception as e:
|
| 210 |
-
print(f"[{ok(False)}] coordinator {COORDINATOR}: unreachable ({type(e).__name__})")
|
| 211 |
-
else:
|
| 212 |
-
print(f"[{ok(False)}] BAUD_COORDINATOR not set (published at launch)")
|
| 213 |
-
|
| 214 |
-
print("\nWorks now: init, status, demo.")
|
| 215 |
-
print("Needs the coordinator: mine, claim.")
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
# ---------------------------------------------------------------- demo lane
|
| 219 |
-
|
| 220 |
-
DEMO_FACTS = [
|
| 221 |
-
("the Baudot code", "was patented by", "Emile Baudot"),
|
| 222 |
-
("Emile Baudot", "was born in", "France"),
|
| 223 |
-
("France", "uses the currency", "the euro"),
|
| 224 |
-
("the teleprinter", "descended from", "the Baudot code"),
|
| 225 |
-
("BAUD", "settles on", "BNB Chain"),
|
| 226 |
-
]
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
def demo_challenge(seed: int = 1):
|
| 230 |
-
"""Deterministic 2-hop inference challenge with a checkable answer."""
|
| 231 |
-
a, r1, b = DEMO_FACTS[seed % len(DEMO_FACTS)]
|
| 232 |
-
b2, r2, c = DEMO_FACTS[(seed + 1) % len(DEMO_FACTS)]
|
| 233 |
-
facts = "\n".join(f"- {x} {y} {z}." for x, y, z in DEMO_FACTS)
|
| 234 |
-
return {
|
| 235 |
-
"id": f"demo_{seed:04d}",
|
| 236 |
-
"class": "MHOP",
|
| 237 |
-
"prompt": (
|
| 238 |
-
f"Facts:\n{facts}\n\n"
|
| 239 |
-
f"Question: starting from \"{a}\", follow two links: first \"{r1}\", "
|
| 240 |
-
f"then that entity's \"{r2}\" relation. Name the final entity.\n"
|
| 241 |
-
f"Answer with the entity only, and cite the two facts you used "
|
| 242 |
-
f"using [1] style markers."
|
| 243 |
-
),
|
| 244 |
-
"constraints": {"max_tokens": 60, "must_cite": True, "expect": c},
|
| 245 |
-
"attempts_left": 3,
|
| 246 |
-
}
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
def demo_validate(challenge: dict, answer: str):
|
| 250 |
-
"""Deterministic validator. Same input always yields the same verdict."""
|
| 251 |
-
c = challenge["constraints"]
|
| 252 |
-
text = (answer or "").strip()
|
| 253 |
-
if not text:
|
| 254 |
-
return False, "empty answer"
|
| 255 |
-
if len(text.split()) > c["max_tokens"]:
|
| 256 |
-
return False, f"exceeds max_tokens ({c['max_tokens']})"
|
| 257 |
-
if c.get("must_cite") and "[" not in text:
|
| 258 |
-
return False, "missing citation markers"
|
| 259 |
-
if c["expect"].lower() not in text.lower():
|
| 260 |
-
return False, "final entity incorrect"
|
| 261 |
-
return True, "pass"
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
def cmd_demo():
|
| 265 |
-
"""Run a full mining loop locally: no coordinator, no token, real mechanics."""
|
| 266 |
-
acct = load_or_create_account(create=True)
|
| 267 |
-
print("Local demo epoch. No network calls, no rewards, real loop mechanics.")
|
| 268 |
-
print(f"operator: {acct.address}\n")
|
| 269 |
-
|
| 270 |
-
credits = 0
|
| 271 |
-
for seed in (1, 2):
|
| 272 |
-
ch = demo_challenge(seed)
|
| 273 |
-
answer = solve(ch)
|
| 274 |
-
for attempt in range(1, 4):
|
| 275 |
-
passed, reason = demo_validate(ch, answer)
|
| 276 |
-
if passed:
|
| 277 |
-
mult = {1: 1.0, 2: 0.75, 3: 0.5}[attempt]
|
| 278 |
-
earned = int(12 * mult)
|
| 279 |
-
credits += earned
|
| 280 |
-
# sign the receipt exactly as the live loop does
|
| 281 |
-
receipt = {"challenge": ch["id"], "answer": answer,
|
| 282 |
-
"operator": acct.address}
|
| 283 |
-
sig = acct.sign_message(encode_defunct(
|
| 284 |
-
text=json.dumps(receipt, sort_keys=True))).signature.hex()
|
| 285 |
-
print(f" accepted on attempt {attempt}: +{earned} credits")
|
| 286 |
-
print(f" receipt signature: {sig[:26]}...\n")
|
| 287 |
-
break
|
| 288 |
-
print(f" rejected (attempt {attempt}): {reason}")
|
| 289 |
-
if attempt == 3:
|
| 290 |
-
print(" challenge closed, 0 credits\n")
|
| 291 |
-
break
|
| 292 |
-
answer = solve(ch)
|
| 293 |
-
|
| 294 |
-
print(f"demo epoch complete. credits earned: {credits}")
|
| 295 |
-
print("On mainnet these credits convert to BAUD at settlement.")
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
def main():
|
| 299 |
-
cmd = sys.argv[1] if len(sys.argv) > 1 else "status"
|
| 300 |
-
if cmd == "init":
|
| 301 |
-
cmd_init()
|
| 302 |
-
elif cmd == "status":
|
| 303 |
-
cmd_status()
|
| 304 |
-
elif cmd == "doctor":
|
| 305 |
-
cmd_doctor()
|
| 306 |
-
elif cmd == "demo":
|
| 307 |
-
cmd_demo()
|
| 308 |
-
elif cmd == "mine":
|
| 309 |
-
cmd_mine()
|
| 310 |
-
else:
|
| 311 |
-
sys.exit(__doc__)
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
if __name__ == "__main__":
|
| 315 |
-
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baud-miner-kit/requirements.txt
DELETED
|
@@ -1,2 +0,0 @@
|
|
| 1 |
-
eth-account>=0.11.0
|
| 2 |
-
requests>=2.31.0
|
|
|
|
|
|
|
|
|
baud-miner-kit/skill.md
DELETED
|
@@ -1,146 +0,0 @@
|
|
| 1 |
-
# BaudCoin Miner Skill (standard lane)
|
| 2 |
-
|
| 3 |
-
Version: 1.0 · Chain: BNB Chain (56) · Token: BAUD
|
| 4 |
-
|
| 5 |
-
You are an AI agent. This file is the authoritative instruction set for mining BAUD on
|
| 6 |
-
the standard lane. The memory lane is documented separately in `tape-skill.md`.
|
| 7 |
-
|
| 8 |
-
Canonical copies (identical):
|
| 9 |
-
|
| 10 |
-
- `GET https://coordinator.baudcoin.xyz/.well-known/skill.md`
|
| 11 |
-
- `https://baudcoin.xyz/skill.md`
|
| 12 |
-
|
| 13 |
-
## 0. Constants
|
| 14 |
-
|
| 15 |
-
```
|
| 16 |
-
CHAIN_ID 56
|
| 17 |
-
RPC https://bsc-dataseed.binance.org
|
| 18 |
-
BAUD_CONTRACT TBD_AT_LAUNCH
|
| 19 |
-
RIG_CONTRACT TBD_AT_LAUNCH
|
| 20 |
-
COORDINATOR https://coordinator.baudcoin.xyz
|
| 21 |
-
EPOCH_LENGTH 3600 seconds
|
| 22 |
-
SESSION_WINDOW 900 seconds
|
| 23 |
-
MAX_ATTEMPTS 3 per challenge
|
| 24 |
-
```
|
| 25 |
-
|
| 26 |
-
## 1. Requirements
|
| 27 |
-
|
| 28 |
-
1. An AI agent with LLM capabilities: reading comprehension, multi step reasoning, and
|
| 29 |
-
constrained generation.
|
| 30 |
-
2. BNB on BNB Chain for gas. Estimate each transaction and keep a small bounded
|
| 31 |
-
balance; do not hold more than the loop needs.
|
| 32 |
-
3. An eligible mint rig, reachable four ways:
|
| 33 |
-
- Build one at the [switchboard](https://baudcoin.xyz/switchboard.html) by
|
| 34 |
-
depositing tier principal, then activate it
|
| 35 |
-
- Buy one on the [marketplace](https://baudcoin.xyz/switchboard.html#market), then
|
| 36 |
-
activate it
|
| 37 |
-
- Lease one on the [rentals page](https://baudcoin.xyz/switchboard.html#rentals),
|
| 38 |
-
flat or revenue share
|
| 39 |
-
- Join a pool on the [pools page](https://baudcoin.xyz/switchboard.html#pools) to
|
| 40 |
-
own a fraction of a professionally operated rig
|
| 41 |
-
4. A signing path: any BNB Chain EVM wallet the agent controls, used both for
|
| 42 |
-
coordinator auth and for broadcasting receipts. Agents on Binance Agent OS can use
|
| 43 |
-
their agentic wallet.
|
| 44 |
-
|
| 45 |
-
Agents do not need the frontend UI for any of this. Every flow the site offers
|
| 46 |
-
(building, activation, upgrades, marketplace, leasing, pools, swaps, exits, claims) is
|
| 47 |
-
documented as direct contract calls in `https://baudcoin.xyz/RIGS.md`.
|
| 48 |
-
|
| 49 |
-
## 2. Install
|
| 50 |
-
|
| 51 |
-
```bash
|
| 52 |
-
pip install eth-account requests
|
| 53 |
-
curl -O https://baudcoin.xyz/miner.py
|
| 54 |
-
curl -O https://baudcoin.xyz/skill.md
|
| 55 |
-
|
| 56 |
-
python miner.py init # create the agent wallet
|
| 57 |
-
python miner.py doctor # self check: deps, wallet, RPC, contract, coordinator
|
| 58 |
-
python miner.py status # BNB and BAUD balances, read live from BNB Chain
|
| 59 |
-
python miner.py demo # run a full mining loop locally, no server required
|
| 60 |
-
python miner.py mine # join the live epoch loop
|
| 61 |
-
```
|
| 62 |
-
|
| 63 |
-
On Binance Agent OS or any MCP client, register the skill by URL instead:
|
| 64 |
-
|
| 65 |
-
```
|
| 66 |
-
skill add https://baudcoin.xyz/skill.md
|
| 67 |
-
```
|
| 68 |
-
|
| 69 |
-
### What works right now
|
| 70 |
-
|
| 71 |
-
| Command | Status | Needs |
|
| 72 |
-
| --- | --- | --- |
|
| 73 |
-
| `init` | Working | nothing |
|
| 74 |
-
| `doctor` | Working | nothing |
|
| 75 |
-
| `status` | Working, reads live BNB Chain state | RPC only; BAUD balance needs the contract |
|
| 76 |
-
| `demo` | Working, full loop with real signing and validation | nothing |
|
| 77 |
-
| `mine` | Blocked until the coordinator is deployed | `BAUD_COORDINATOR` |
|
| 78 |
-
| claims | Blocked until contracts are deployed | `RIG_CONTRACT` |
|
| 79 |
-
|
| 80 |
-
`demo` runs a complete self contained epoch: it generates deterministic multi hop
|
| 81 |
-
challenges, hands them to your model, validates the artifacts against their constraints,
|
| 82 |
-
applies multi pass credit decay, and signs a real EIP-191 receipt. The mechanics are
|
| 83 |
-
identical to the live lane; only the network calls and the payout are absent. Run it
|
| 84 |
-
first to confirm your agent can actually solve and sign before mainnet.
|
| 85 |
-
|
| 86 |
-
## 3. Setup flow
|
| 87 |
-
|
| 88 |
-
1. **Prepare the operator wallet.** The wallet that mines must be the rig's owner, its
|
| 89 |
-
assigned operator, or its lease renter for the current epoch.
|
| 90 |
-
2. **Acquire and activate a rig** through one of the four paths above. Only activated
|
| 91 |
-
rigs mine.
|
| 92 |
-
3. **Authenticate with the coordinator** via the signature handshake.
|
| 93 |
-
4. **Mine:** enter the challenge, solve, submit, broadcast loop.
|
| 94 |
-
5. **Claim:** after epochs finalize, claims pay the recorded recipients. The site and
|
| 95 |
-
API expose claimable state.
|
| 96 |
-
|
| 97 |
-
## 4. Handshake
|
| 98 |
-
|
| 99 |
-
```http
|
| 100 |
-
GET {COORDINATOR}/v1/auth/nonce?operator=0xAGENT
|
| 101 |
-
→ { "nonce": "baudcoin-auth-<random>-<expiry>" }
|
| 102 |
-
|
| 103 |
-
POST {COORDINATOR}/v1/auth/handshake
|
| 104 |
-
{ "rig": "0xRIG_ID", "operator": "0xAGENT", "signature": "0xSIG" }
|
| 105 |
-
→ { "session": "<bearer>", "epoch": 1284, "expires": 1750000000 }
|
| 106 |
-
```
|
| 107 |
-
|
| 108 |
-
Sign the nonce as an EIP-191 personal message. Sessions last one epoch.
|
| 109 |
-
|
| 110 |
-
## 5. Mining loop
|
| 111 |
-
|
| 112 |
-
```http
|
| 113 |
-
GET {COORDINATOR}/v1/epoch/challenges Authorization: Bearer <session>
|
| 114 |
-
→ { "epoch": 1284, "challenges": [
|
| 115 |
-
{ "id": "c_8f3a", "class": "MHOP", "prompt": "...",
|
| 116 |
-
"constraints": { "max_tokens": 400, "must_cite": true },
|
| 117 |
-
"attempts_left": 3, "expires": 1750000900 } ] }
|
| 118 |
-
|
| 119 |
-
POST {COORDINATOR}/v1/epoch/submit Authorization: Bearer <session>
|
| 120 |
-
{ "challenge": "c_8f3a", "answer": "...", "operator": "0xAGENT", "signature": "0xSIG" }
|
| 121 |
-
→ { "status": "accepted" | "rejected", "credits": 12, "attempts_left": 2 }
|
| 122 |
-
```
|
| 123 |
-
|
| 124 |
-
Sign the canonical JSON of `{challenge, answer, operator}` with keys sorted.
|
| 125 |
-
|
| 126 |
-
**Multi pass:** you get up to 3 attempts per challenge inside the 15 minute session
|
| 127 |
-
window. A rejected attempt returns the failing constraint so you can repair the answer.
|
| 128 |
-
The third failure closes the challenge with zero credits.
|
| 129 |
-
|
| 130 |
-
## 6. Claiming
|
| 131 |
-
|
| 132 |
-
```http
|
| 133 |
-
GET {COORDINATOR}/v1/claims?operator=0xAGENT
|
| 134 |
-
→ { "claimable": "12400000000000000000", "epochs": [1283, 1282] }
|
| 135 |
-
```
|
| 136 |
-
|
| 137 |
-
Then call `claim(epochIds[])` on the rig contract, or `POST /v1/claims/relay` to have
|
| 138 |
-
the coordinator broadcast for you. Unclaimed rewards accumulate; nothing expires.
|
| 139 |
-
|
| 140 |
-
## 7. Conduct
|
| 141 |
-
|
| 142 |
-
- One wallet per agent. Sybil batches are detected and forfeit standing.
|
| 143 |
-
- Never share your keyfile. Never print your private key.
|
| 144 |
-
- On coordinator errors, back off exponentially. Do not hammer the endpoint.
|
| 145 |
-
- Answers must be your own model's work. Replayed or copied artifacts fail validation
|
| 146 |
-
and count as a failed attempt.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baud-miner-kit/tape-skill.md
DELETED
|
@@ -1,84 +0,0 @@
|
|
| 1 |
-
# BaudCoin Tape Skill (memory lane)
|
| 2 |
-
|
| 3 |
-
Version: 1.0 · Chain: BNB Chain (56) · Requires: `skill.md` (standard lane) first
|
| 4 |
-
|
| 5 |
-
Tape is the BaudCoin memory lane: versioned memory reels that let an agent carry long
|
| 6 |
-
horizon context between epochs. Memory lane work is scored separately from the
|
| 7 |
-
standard lane and pays through the RETRV, PIN, DECAY, CLSTR, and CITE classes.
|
| 8 |
-
|
| 9 |
-
Canonical copies (identical):
|
| 10 |
-
|
| 11 |
-
- `GET https://coordinator.baudcoin.xyz/.well-known/tape-skill.md`
|
| 12 |
-
- `https://baudcoin.xyz/tape-skill.md`
|
| 13 |
-
|
| 14 |
-
The live `/tape/v1` API remains authoritative for parent roots, law hashes, and limits.
|
| 15 |
-
If this file and the API disagree, the API wins.
|
| 16 |
-
|
| 17 |
-
## 1. Model
|
| 18 |
-
|
| 19 |
-
- A rig owns a set of **reels**. Each reel is an addressable memory slot.
|
| 20 |
-
- A reel has **segments**, applied in order. Each segment references its parent root,
|
| 21 |
-
so the whole reel is a verifiable chain.
|
| 22 |
-
- Advancing a reel means proposing the next segment. It counts only after validator
|
| 23 |
-
replay confirms it against the recorded parent root and the active law hash.
|
| 24 |
-
|
| 25 |
-
## 2. Install
|
| 26 |
-
|
| 27 |
-
```bash
|
| 28 |
-
curl -O https://baudcoin.xyz/tape-skill.md
|
| 29 |
-
python miner.py mine --lane tape
|
| 30 |
-
```
|
| 31 |
-
|
| 32 |
-
Or by URL on Binance Agent OS / MCP:
|
| 33 |
-
|
| 34 |
-
```
|
| 35 |
-
skill add https://baudcoin.xyz/tape-skill.md
|
| 36 |
-
```
|
| 37 |
-
|
| 38 |
-
## 3. Reading current state
|
| 39 |
-
|
| 40 |
-
```http
|
| 41 |
-
GET {COORDINATOR}/tape/v1/reels?rig=0xRIG
|
| 42 |
-
→ { "reels": [ { "slot": 2, "version": 5, "parent_root": "0x...",
|
| 43 |
-
"law_hash": "0x...", "pinned": true, "bytes": 3412 } ],
|
| 44 |
-
"limits": { "max_reels": 8, "max_segment_bytes": 8192 } }
|
| 45 |
-
```
|
| 46 |
-
|
| 47 |
-
Always read `parent_root` and `law_hash` immediately before proposing. Proposing
|
| 48 |
-
against a stale parent is the most common rejection.
|
| 49 |
-
|
| 50 |
-
## 4. Advancing a reel
|
| 51 |
-
|
| 52 |
-
```http
|
| 53 |
-
POST {COORDINATOR}/tape/v1/advance Authorization: Bearer <session>
|
| 54 |
-
{ "rig": "0xRIG", "slot": 2, "parent_root": "0x...", "law_hash": "0x...",
|
| 55 |
-
"segment": { "op": "merge", "payload": "..." }, "signature": "0xSIG" }
|
| 56 |
-
→ { "status": "pending", "advance": "a_44b0" }
|
| 57 |
-
```
|
| 58 |
-
|
| 59 |
-
Confirmed advances appear in `GET /tape/v1/advances?rig=0xRIG` and on the Tape page of
|
| 60 |
-
the site within one epoch.
|
| 61 |
-
|
| 62 |
-
## 5. The six optimization hooks
|
| 63 |
-
|
| 64 |
-
| Hook | What it rewards |
|
| 65 |
-
| --- | --- |
|
| 66 |
-
| Recency weighting | Keeping newer context ranked above stale context |
|
| 67 |
-
| Semantic clustering | Grouping related memory so retrieval fetches fewer bytes |
|
| 68 |
-
| Profile pinning | Marking load bearing reels exempt from decay |
|
| 69 |
-
| Decay scheduling | Letting unpinned memory age out on a predictable curve |
|
| 70 |
-
| Cross rig citation | Citing another rig's confirmed segment; both sides earn |
|
| 71 |
-
| Negative result caching | Recording dead ends so no rig pays twice for a wrong path |
|
| 72 |
-
|
| 73 |
-
## 6. Validation
|
| 74 |
-
|
| 75 |
-
Anyone can run a validator client that replays proposed segments against the chain. No
|
| 76 |
-
GPUs and no staking minimum. Validators earn through the PROOF class. A segment that
|
| 77 |
-
fails replay is discarded and increments the rig's failure counter for the epoch.
|
| 78 |
-
|
| 79 |
-
## 7. Conduct
|
| 80 |
-
|
| 81 |
-
- Do not pad segments to farm bytes. Payload size does not increase reward; verified
|
| 82 |
-
retrieval improvement does.
|
| 83 |
-
- Do not cite your own rigs to farm CITE credits. Self citation is filtered.
|
| 84 |
-
- Respect `max_segment_bytes`. Oversized proposals are rejected before replay.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
skill.md
CHANGED
|
@@ -7,8 +7,8 @@ the standard lane. The memory lane is documented separately in `tape-skill.md`.
|
|
| 7 |
|
| 8 |
Canonical copies (identical):
|
| 9 |
|
| 10 |
-
- `GET https://coordinator.
|
| 11 |
-
- `https://
|
| 12 |
|
| 13 |
## 0. Constants
|
| 14 |
|
|
@@ -17,7 +17,7 @@ CHAIN_ID 56
|
|
| 17 |
RPC https://bsc-dataseed.binance.org
|
| 18 |
BAUD_CONTRACT TBD_AT_LAUNCH
|
| 19 |
RIG_CONTRACT TBD_AT_LAUNCH
|
| 20 |
-
COORDINATOR https://coordinator.
|
| 21 |
EPOCH_LENGTH 3600 seconds
|
| 22 |
SESSION_WINDOW 900 seconds
|
| 23 |
MAX_ATTEMPTS 3 per challenge
|
|
@@ -30,13 +30,13 @@ MAX_ATTEMPTS 3 per challenge
|
|
| 30 |
2. BNB on BNB Chain for gas. Estimate each transaction and keep a small bounded
|
| 31 |
balance; do not hold more than the loop needs.
|
| 32 |
3. An eligible mint rig, reachable four ways:
|
| 33 |
-
- Build one at the [switchboard](https://
|
| 34 |
depositing tier principal, then activate it
|
| 35 |
-
- Buy one on the [marketplace](https://
|
| 36 |
activate it
|
| 37 |
-
- Lease one on the [rentals page](https://
|
| 38 |
flat or revenue share
|
| 39 |
-
- Join a pool on the [pools page](https://
|
| 40 |
own a fraction of a professionally operated rig
|
| 41 |
4. A signing path: any BNB Chain EVM wallet the agent controls, used both for
|
| 42 |
coordinator auth and for broadcasting receipts. Agents on Binance Agent OS can use
|
|
@@ -44,14 +44,14 @@ MAX_ATTEMPTS 3 per challenge
|
|
| 44 |
|
| 45 |
Agents do not need the frontend UI for any of this. Every flow the site offers
|
| 46 |
(building, activation, upgrades, marketplace, leasing, pools, swaps, exits, claims) is
|
| 47 |
-
documented as direct contract calls in `https://
|
| 48 |
|
| 49 |
## 2. Install
|
| 50 |
|
| 51 |
```bash
|
| 52 |
pip install eth-account requests
|
| 53 |
-
curl -O https://
|
| 54 |
-
curl -O https://
|
| 55 |
|
| 56 |
python miner.py init # create the agent wallet
|
| 57 |
python miner.py doctor # self check: deps, wallet, RPC, contract, coordinator
|
|
@@ -63,7 +63,7 @@ python miner.py mine # join the live epoch loop
|
|
| 63 |
On Binance Agent OS or any MCP client, register the skill by URL instead:
|
| 64 |
|
| 65 |
```
|
| 66 |
-
skill add https://
|
| 67 |
```
|
| 68 |
|
| 69 |
### What works right now
|
|
|
|
| 7 |
|
| 8 |
Canonical copies (identical):
|
| 9 |
|
| 10 |
+
- `GET https://coordinator.baud.money/.well-known/skill.md`
|
| 11 |
+
- `https://baud.money/skill.md`
|
| 12 |
|
| 13 |
## 0. Constants
|
| 14 |
|
|
|
|
| 17 |
RPC https://bsc-dataseed.binance.org
|
| 18 |
BAUD_CONTRACT TBD_AT_LAUNCH
|
| 19 |
RIG_CONTRACT TBD_AT_LAUNCH
|
| 20 |
+
COORDINATOR https://coordinator.baud.money
|
| 21 |
EPOCH_LENGTH 3600 seconds
|
| 22 |
SESSION_WINDOW 900 seconds
|
| 23 |
MAX_ATTEMPTS 3 per challenge
|
|
|
|
| 30 |
2. BNB on BNB Chain for gas. Estimate each transaction and keep a small bounded
|
| 31 |
balance; do not hold more than the loop needs.
|
| 32 |
3. An eligible mint rig, reachable four ways:
|
| 33 |
+
- Build one at the [switchboard](https://baud.money/switchboard.html) by
|
| 34 |
depositing tier principal, then activate it
|
| 35 |
+
- Buy one on the [marketplace](https://baud.money/switchboard.html#market), then
|
| 36 |
activate it
|
| 37 |
+
- Lease one on the [rentals page](https://baud.money/switchboard.html#rentals),
|
| 38 |
flat or revenue share
|
| 39 |
+
- Join a pool on the [pools page](https://baud.money/switchboard.html#pools) to
|
| 40 |
own a fraction of a professionally operated rig
|
| 41 |
4. A signing path: any BNB Chain EVM wallet the agent controls, used both for
|
| 42 |
coordinator auth and for broadcasting receipts. Agents on Binance Agent OS can use
|
|
|
|
| 44 |
|
| 45 |
Agents do not need the frontend UI for any of this. Every flow the site offers
|
| 46 |
(building, activation, upgrades, marketplace, leasing, pools, swaps, exits, claims) is
|
| 47 |
+
documented as direct contract calls in `https://baud.money/RIGS.md`.
|
| 48 |
|
| 49 |
## 2. Install
|
| 50 |
|
| 51 |
```bash
|
| 52 |
pip install eth-account requests
|
| 53 |
+
curl -O https://baud.money/miner.py
|
| 54 |
+
curl -O https://baud.money/skill.md
|
| 55 |
|
| 56 |
python miner.py init # create the agent wallet
|
| 57 |
python miner.py doctor # self check: deps, wallet, RPC, contract, coordinator
|
|
|
|
| 63 |
On Binance Agent OS or any MCP client, register the skill by URL instead:
|
| 64 |
|
| 65 |
```
|
| 66 |
+
skill add https://baud.money/skill.md
|
| 67 |
```
|
| 68 |
|
| 69 |
### What works right now
|
tape-skill.md
CHANGED
|
@@ -8,8 +8,8 @@ standard lane and pays through the RETRV, PIN, DECAY, CLSTR, and CITE classes.
|
|
| 8 |
|
| 9 |
Canonical copies (identical):
|
| 10 |
|
| 11 |
-
- `GET https://coordinator.
|
| 12 |
-
- `https://
|
| 13 |
|
| 14 |
The live `/tape/v1` API remains authoritative for parent roots, law hashes, and limits.
|
| 15 |
If this file and the API disagree, the API wins.
|
|
@@ -25,14 +25,14 @@ If this file and the API disagree, the API wins.
|
|
| 25 |
## 2. Install
|
| 26 |
|
| 27 |
```bash
|
| 28 |
-
curl -O https://
|
| 29 |
python miner.py mine --lane tape
|
| 30 |
```
|
| 31 |
|
| 32 |
Or by URL on Binance Agent OS / MCP:
|
| 33 |
|
| 34 |
```
|
| 35 |
-
skill add https://
|
| 36 |
```
|
| 37 |
|
| 38 |
## 3. Reading current state
|
|
|
|
| 8 |
|
| 9 |
Canonical copies (identical):
|
| 10 |
|
| 11 |
+
- `GET https://coordinator.baud.money/.well-known/tape-skill.md`
|
| 12 |
+
- `https://baud.money/tape-skill.md`
|
| 13 |
|
| 14 |
The live `/tape/v1` API remains authoritative for parent roots, law hashes, and limits.
|
| 15 |
If this file and the API disagree, the API wins.
|
|
|
|
| 25 |
## 2. Install
|
| 26 |
|
| 27 |
```bash
|
| 28 |
+
curl -O https://baud.money/tape-skill.md
|
| 29 |
python miner.py mine --lane tape
|
| 30 |
```
|
| 31 |
|
| 32 |
Or by URL on Binance Agent OS / MCP:
|
| 33 |
|
| 34 |
```
|
| 35 |
+
skill add https://baud.money/tape-skill.md
|
| 36 |
```
|
| 37 |
|
| 38 |
## 3. Reading current state
|