POST /api/v1/operations/prepare_launch/plans
Parameters
| Name | Location | Details |
|---|---|---|
X-Juicebox-Account | header / required | Enrolled account identity, including authority chain and lowercase owner address. Enrollment derives this identity before the account exists. |
X-Juicebox-Signer | header / required | Owner wallet or authorized bot address that signed this request. |
X-Juicebox-Issued-At | header / required | Unix seconds, sent as 1–13 decimal digits without leading zeros; at most 30 seconds ahead of server time. |
X-Juicebox-Expires-At | header / required | Unix seconds, sent as 1–13 decimal digits without leading zeros; in the future and within 300 seconds of issuedAt. |
X-Juicebox-Nonce | header / required | Fresh random 32-byte lowercase nonce. A consumed nonce cannot be retried. |
X-Juicebox-Signature | header / required | EIP-712 CenterRequest signature over every signed field. Contract-owner signatures may vary in length. This is a computed request proof, not a reusable API key. |
X-Juicebox-Grant | header / optional | Authorized bot grant ID. Required for a bot; omit for the owner, signing grantId as the empty string. |
Idempotency-Key | header / required | Signed retry identity. Required on plan creation and transaction submission. Preserve exact method, target, Content-Type, and body bytes; use a fresh request nonce and signature. |
Request body
| Field | Type | Details | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
chainId | one of required | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account | string required | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
owner | string required | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
composition | string required | Explicit standard core launch. This does not deploy a 721 hook, revnet, or omnichain identity. Values: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
projectUri | string required | Metadata URI; content is not fetched or treated as instructions. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rulesetConfigurations | array required | Fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terminalConfigurations | array required | Fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
memo | string optional |
JSON schema
{
"type": "object",
"properties": {
"chainId": {
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 10
},
{
"type": "number",
"const": 8453
},
{
"type": "number",
"const": 42161
},
{
"type": "number",
"const": 11155111
},
{
"type": "number",
"const": 11155420
},
{
"type": "number",
"const": 84532
},
{
"type": "number",
"const": 421614
}
]
},
"account": {
"type": "string"
},
"owner": {
"type": "string"
},
"composition": {
"type": "string",
"const": "core",
"description": "Explicit standard core launch. This does not deploy a 721 hook, revnet, or omnichain identity."
},
"projectUri": {
"type": "string",
"maxLength": 4096,
"description": "Metadata URI; content is not fetched or treated as instructions."
},
"rulesetConfigurations": {
"minItems": 1,
"maxItems": 16,
"type": "array",
"items": {
"type": "object",
"properties": {
"mustStartAtOrAfter": {
"description": "Unix seconds. A lower bound, not a promised start; 0 asks the contract to resolve timing.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"duration": {
"description": "Seconds per cycle. Zero has no automatic cycles.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"weight": {
"description": "Tokens issued per one unit of baseCurrency, with 18 decimals: 1000000000000000000000 = 1,000 tokens. 0 means zero issuance; 1 inherits decayed weight when a prior ruleset exists.",
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$"
},
"weightCutPercent": {
"description": "Issuance cut applied each cycle, out of 1,000,000,000. 100,000,000 = 10%.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"approvalHook": {
"description": "Gates the next ruleset, not this ruleset.",
"type": "string"
},
"metadata": {
"type": "object",
"properties": {
"reservedPercent": {
"description": "Share of new tokens reserved for splits, out of 10,000. 2500 = 25%.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"cashOutTaxRate": {
"description": "Cash-out tax out of 10,000. 0 = no tax; 10,000 = cash outs return nothing.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"baseCurrency": {
"description": "Currency that issuance is priced in: 1 = ETH, 2 = USD. Use 1 for ETH, not 61166 (native ETH's accounting currency). A token's own currency, uint32(uint160(token)), applies only when payments come in that token or JBPrices has a feed for it.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"pausePay": {
"type": "boolean"
},
"pauseCreditTransfers": {
"type": "boolean"
},
"allowOwnerMinting": {
"type": "boolean"
},
"allowSetCustomToken": {
"type": "boolean"
},
"allowTerminalMigration": {
"type": "boolean"
},
"allowSetTerminals": {
"type": "boolean"
},
"allowSetController": {
"type": "boolean"
},
"allowAddAccountingContext": {
"type": "boolean"
},
"allowAddPriceFeed": {
"type": "boolean"
},
"ownerMustSendPayouts": {
"type": "boolean"
},
"holdFees": {
"type": "boolean"
},
"scopeCashOutsToLocalBalances": {
"type": "boolean",
"description": "false: cash outs count every chain's supply and surplus (through the suckers). true: only this chain's. Recommended: false, which is what revnet.money sends."
},
"useDataHookForPay": {
"type": "boolean"
},
"useDataHookForCashOut": {
"type": "boolean"
},
"dataHook": {
"type": "string"
},
"metadata": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
}
},
"required": [
"reservedPercent",
"cashOutTaxRate",
"baseCurrency",
"pausePay",
"pauseCreditTransfers",
"allowOwnerMinting",
"allowSetCustomToken",
"allowTerminalMigration",
"allowSetTerminals",
"allowSetController",
"allowAddAccountingContext",
"allowAddPriceFeed",
"ownerMustSendPayouts",
"holdFees",
"scopeCashOutsToLocalBalances",
"useDataHookForPay",
"useDataHookForCashOut",
"dataHook",
"metadata"
],
"additionalProperties": false
},
"splitGroups": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"groupId": {
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$",
"description": "Payout splits: uint256(uint160(token)) as a decimal string (native ETH is 0x000000000000000000000000000000000000EEEe, group 61166). Reserved token splits: 1."
},
"splits": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"percent": {
"description": "Share of the split group, out of 1,000,000,000. 500,000,000 = 50%.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"projectId": {
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$"
},
"beneficiary": {
"type": "string"
},
"preferAddToBalance": {
"type": "boolean"
},
"lockedUntil": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"hook": {
"type": "string"
}
},
"required": [
"percent",
"projectId",
"beneficiary",
"preferAddToBalance",
"lockedUntil",
"hook"
],
"additionalProperties": false
}
}
},
"required": [
"groupId",
"splits"
],
"additionalProperties": false
}
},
"fundAccessLimitGroups": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"terminal": {
"type": "string"
},
"token": {
"description": "Token address; native ETH is 0x000000000000000000000000000000000000EEEe.",
"type": "string"
},
"payoutLimits": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"amount": {
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$"
},
"currency": {
"description": "JB currency ID: uint32(uint160(token)) for a token (native ETH is 0x000000000000000000000000000000000000EEEe, currency 61166), or 1 = ETH and 2 = USD.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
}
},
"surplusAllowances": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"amount": {
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$"
},
"currency": {
"description": "JB currency ID: uint32(uint160(token)) for a token (native ETH is 0x000000000000000000000000000000000000EEEe, currency 61166), or 1 = ETH and 2 = USD.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
}
}
},
"required": [
"terminal",
"token",
"payoutLimits",
"surplusAllowances"
],
"additionalProperties": false
}
}
},
"required": [
"mustStartAtOrAfter",
"duration",
"weight",
"weightCutPercent",
"approvalHook",
"metadata",
"splitGroups",
"fundAccessLimitGroups"
],
"additionalProperties": false
}
},
"terminalConfigurations": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"terminal": {
"type": "string"
},
"accountingContextsToAccept": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"token": {
"description": "Token address; native ETH is 0x000000000000000000000000000000000000EEEe.",
"type": "string"
},
"decimals": {
"description": "Token decimals. Native ETH uses 18.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"currency": {
"description": "Usually uint32(uint160(token)); native ETH is 0x000000000000000000000000000000000000EEEe, currency 61166.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
}
},
"required": [
"token",
"decimals",
"currency"
],
"additionalProperties": false
}
}
},
"required": [
"terminal",
"accountingContextsToAccept"
],
"additionalProperties": false
}
},
"memo": {
"type": "string",
"maxLength": 4096
}
},
"required": [
"chainId",
"account",
"owner",
"composition",
"projectUri",
"rulesetConfigurations",
"terminalConfigurations"
],
"additionalProperties": false
}Response 201
| Field | Type | Details | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | string (uuid) required | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account | string required | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operation | string required | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
draft | object required | Fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
commitment | string required | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
createdAt | integer required | Unix timestamp in milliseconds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
expiresAt | integer required | Unix timestamp in milliseconds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
revision | integer required | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
smartAccount | object optional | Fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status | string required | Values: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
steps | array required | Fields
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
confirmationScope | string required |
JSON schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"account": {
"$ref": "#/components/schemas/Address"
},
"operation": {
"type": "string"
},
"draft": {
"$ref": "#/components/schemas/PlanDraft"
},
"commitment": {
"$ref": "#/components/schemas/Hash"
},
"createdAt": {
"$ref": "#/components/schemas/UnixMilliseconds"
},
"expiresAt": {
"$ref": "#/components/schemas/UnixMilliseconds"
},
"revision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"smartAccount": {
"type": "object",
"properties": {
"bindingId": {
"$ref": "#/components/schemas/Hash"
},
"stateHash": {
"$ref": "#/components/schemas/Hash"
},
"chainId": {
"$ref": "#/components/schemas/ChainId"
},
"address": {
"$ref": "#/components/schemas/Address"
},
"manifestRevision": {
"$ref": "#/components/schemas/Hash"
}
},
"required": [
"bindingId",
"stateHash",
"chainId",
"address",
"manifestRevision"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"prepared",
"pending",
"partial",
"blocked",
"reorged",
"expired",
"transactions_confirmed"
]
},
"steps": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PlanStep"
},
"minItems": 1,
"maxItems": 32
},
"confirmationScope": {
"type": "string"
}
},
"required": [
"id",
"account",
"operation",
"draft",
"commitment",
"createdAt",
"expiresAt",
"revision",
"status",
"steps",
"confirmationScope"
],
"additionalProperties": false
}