Versions and activation
Every change to a project is a new signed manifest with version = previous + 1 and previous = the
previous manifest_hash. What happens next depends on which tier changed (prepare reports it in
tier_changes).
| Change | Example | Chain transaction | Effective |
|---|---|---|---|
| Listing only | new description, screenshots, tags | none | immediately |
| Scheduling | device classes, RAM, public_tasks |
none | immediately |
| Consensus | new worker module, committee size, reward per unit, fee split, collateral | publishVersion (gasless available) |
at the first epoch starting ≥ publication + 1 hour |
A listing- or scheduling-only version must keep consensus byte-identical.
Publish a version
Section titled “Publish a version”from necter_dev import api, login, personal_sign, sign_typed
tok = login()m = api("GET", f"/v1/projects/{project_id}/manifest")["manifest"]prev_hash = api("GET", f"/v1/projects/{project_id}/manifest")["manifest_hash"]m["version"] += 1m["previous"] = prev_hashm["listing"]["tagline"] = "Now with bigger committees"m["consensus"]["work"]["committee"]["size"] = 5 # a consensus change
p = api("POST", "/v1/developers/projects/prepare", tok, json={"manifest": m})assert p["valid"], p["problems"]envelope = {"manifest": m, "manifest_hash": p["manifest_hash"], "consensus_hash": p["consensus_hash"], "project_id": p["project_id"], "sig_type": "eip191", "signature": personal_sign(p["canonical"])}r = api("POST", f"/v1/developers/projects/{project_id}/versions", tok, json=envelope)print(r["version"], r["publish_tx"]) # publish_tx is null for listing/scheduling-only versionsFor a consensus change, publish it on-chain. Gasless:
v = m["version"]payload = api("POST", f"/v1/developers/projects/{project_id}/versions/{v}/publish", tok) # typed dataapi("POST", f"/v1/developers/projects/{project_id}/versions/{v}/publish", tok, json={"typed_data": payload["typed_data"], "signature": sign_typed(payload["typed_data"])})Or send publish_tx from your wallet. The version stays pending until its activation epoch; at most
one consensus version can be pending (a new one replaces it). GET /v1/projects/{id}/versions lists them.
Rules that protect miners
Section titled “Rules that protect miners”- Activation delay (
activation_delay_secs= 3600): miners see new economics before they apply. Rounds and receipts always name theconsensus_hashthey ran under. epoch_secscan never change: epoch numbers would overlap. A project that needs a different epoch length is a new project with a new vault.- When you change the fee split or emission, schedule the matching vault config (
scheduleConfig) too. Vault - No ownership transfer: the developer address is part of the project id. If you lose the key, publish a new project.