Skip to content

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.

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"] += 1
m["previous"] = prev_hash
m["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 versions

For 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 data
api("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.

  • Activation delay (activation_delay_secs = 3600): miners see new economics before they apply. Rounds and receipts always name the consensus_hash they ran under.
  • epoch_secs can 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.