Skip to content

Validate an unsigned manifest; returns the exact bytes to sign and derived ids

POST
/v1/developers/projects/prepare
curl --request POST \
--url https://testnet-rpc.necter.network/v1/developers/projects/prepare \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "manifest": { "v": 1, "network": "example", "chain_id": 1, "developer": "example", "slug": "example", "version": 1, "previous": "example", "consensus": { "modules": { "worker": "example", "verifier": "example" }, "work": { "class": "deterministic", "verification": "redundant-execution", "execution": "committee", "functions": [ "example" ], "task_source": { "kind": "api" }, "max_gas_limit": 1, "committee": { "size": 1, "backups": 1, "min_size": 1, "selection": "collateral-reputation-sortition-v1", "weight_cap_multiple": 1 }, "round_secs": 1, "lease_secs": 1, "epoch_secs": 3600, "dispute_window_secs": 1 }, "economics": { "reward_token": "example", "vault": "example", "reward_model": "per-unit", "reward_per_unit": "example", "daily_emission": "example", "fee_split_bp": { "miner": 1, "developer": 1, "treasury": 1 }, "max_units_per_epoch": 1, "max_recipients_per_epoch": 1, "min_collateral": "example", "slashing_bp": { "invalid_result": 1, "missed_sla": 1 } } }, "scheduling": { "requirements": { "device_classes": [ "phone" ], "cpu_cores": 1, "ram_mb": 1, "storage_mb": 1, "gpu": "example", "min_benchmark": 1, "engines": [ "native" ], "attestation": [ "example" ] }, "sla": { "max_latency_ms": 1, "min_uptime_bp": 1 }, "public_tasks": true }, "listing": { "name": "example", "tagline": "example", "description": "example", "category": "blockchain", "tags": [ "example" ], "icon": "https://example.com", "banner": "https://example.com", "screenshots": [ "https://example.com" ], "video": "https://example.com", "website": "https://example.com", "docs": "https://example.com", "support": "https://example.com", "features": [ "example" ], "accent_color": "example" } } }'
Media typeapplication/json
object
manifest
required

(normative rules there)

object
v
required
integer
Allowed value: 1
network
required
string
chain_id
required
integer
developer
required

Lowercase EVM address

string
/^0x[0-9a-f]{40}$/
slug
required
string
/^[a-z0-9][a-z0-9-]{1,46}[a-z0-9]$/
version
required
integer
>= 1
previous
required
One of:
string
/^0x[0-9a-f]{64}$/
consensus
required
object
modules
required
object
worker
required
string
/^0x[0-9a-f]{64}$/
verifier
required
null
work
required
object
class
required
string
Allowed value: deterministic
verification
required
string
Allowed value: redundant-execution
execution
required
string
Allowed value: committee
functions
required
Array<string>
>= 1 items <= 64 items
task_source
required
One of:
object
kind
required
Allowed value: api
max_gas_limit
required
integer
>= 1 <= 10000000000
committee
required
object
size
required
integer
>= 3 <= 31
backups
required
integer
<= 16
min_size
required
integer
>= 3 <= 31
selection
required
string
Allowed value: collateral-reputation-sortition-v1
weight_cap_multiple
required
integer
>= 1 <= 100
round_secs
required
integer
>= 10 <= 600
lease_secs
required
integer
>= 5 <= 600
epoch_secs
required
integer
Allowed values: 3600 7200 10800 14400 21600 28800 43200 86400
dispute_window_secs
required
integer
>= 3600 <= 604800
economics
required
object
reward_token
required

Lowercase EVM address

string
/^0x[0-9a-f]{40}$/
vault
required

Lowercase EVM address

string
/^0x[0-9a-f]{40}$/
reward_model
required
string
Allowed values: per-unit epoch-pool
reward_per_unit
required

Token base units

string
/^(0|[1-9][0-9]{0,77})$/
daily_emission
required

Token base units

string
/^(0|[1-9][0-9]{0,77})$/
fee_split_bp
required
object
miner
required
integer
>= 5000 <= 10000
developer
required
integer
<= 5000
treasury
required
integer
<= 5000
max_units_per_epoch
required
integer
>= 1 <= 1000000000
max_recipients_per_epoch
required
integer
>= 1 <= 10000
min_collateral
required

Token base units

string
/^(0|[1-9][0-9]{0,77})$/
slashing_bp
required
object
invalid_result
required
integer
<= 5000
missed_sla
required
integer
<= 500
scheduling
required
object
requirements
required
object
device_classes
required
Array<string>
>= 1 items
Allowed values: phone tablet laptop desktop server
cpu_cores
required
integer
ram_mb
required
integer
storage_mb
required
integer
gpu
required
null
min_benchmark
required
integer
engines
required
Array<string>
>= 1 items
Allowed values: native pulley64 pulley32
attestation
required
array
0
sla
required
object
max_latency_ms
required
integer
>= 100 <= 600000
min_uptime_bp
required
integer
<= 10000
public_tasks
required
boolean
listing
required
object
name
required
string
>= 1 characters <= 64 characters
tagline
required
string
<= 120 characters
description
required
string
<= 8000 characters
category
required
string
Allowed values: blockchain depin machine-learning storage compute bandwidth data-sovereignty iot hardware-staking content-delivery
tags
required
Array<string>
<= 8 items
icon
required
string format: uri
banner
required
string | null format: uri
screenshots
required
Array<string>
<= 8 items
video
required
string | null format: uri
website
required
string | null format: uri
docs
required
string | null format: uri
support
required
string | null format: uri
features
required
Array<string>
<= 12 items
accent_color
required
string | null
/^#[0-9A-F]{6}$/

Valid (or list of problems)

Media typeapplication/json
object
valid
required
boolean
problems
required
Array<object>
object
path
required
string
code
required
string
message
required
string
canonical

UTF-8 canonical JSON to pass to personal_sign

string
manifest_hash
string
/^0x[0-9a-f]{64}$/
consensus_hash
string
/^0x[0-9a-f]{64}$/
project_id
string
/^0x[0-9a-f]{64}$/
vault
One of:

Lowercase EVM address

string
/^0x[0-9a-f]{40}$/
tier_changes
Array<string>
Allowed values: consensus scheduling listing

Example

{
"tier_changes": [
"consensus"
]
}