POST /api/v1/operations/prepare_omnichain_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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
chainIds | array required | Every chain the project launches on, all mainnets or all testnets. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account | string required | The one address that signs on every chain. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
owner | string required | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
projectUri | string required | Pinned metadata URI (ipfs://<cid>), or empty to set it later. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rulesetConfigurations | array required | Fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terminalConfigurations | array required | Fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
memo | string optional | Default: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
salt | string required | One random salt shared by every chain. Suckers pair only with the same salt and signer. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bridge | string optional | ccip links any chain pair. native links Ethereum with one L2 and maps native ETH only. both adds a native sucker where one exists. Values: Default: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deployTiersHookConfig | object optional | NFT tiers collection. Omitted: an empty collection priced in the first baseCurrency.Fields
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useDataHookForCashOut | boolean optional | Let NFTs cash out for surplus. Needs deployTiersHookConfig. Default: |
JSON schema
{
"type": "object",
"properties": {
"chainIds": {
"minItems": 2,
"maxItems": 4,
"type": "array",
"items": {
"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
}
]
},
"description": "Every chain the project launches on, all mainnets or all testnets."
},
"account": {
"description": "The one address that signs on every chain.",
"type": "string"
},
"owner": {
"type": "string"
},
"projectUri": {
"type": "string",
"maxLength": 4096,
"description": "Pinned metadata URI (ipfs://<cid>), or empty to set it later."
},
"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": {
"default": "",
"type": "string",
"maxLength": 4096
},
"salt": {
"description": "One random salt shared by every chain. Suckers pair only with the same salt and signer.",
"type": "string",
"pattern": "^0x[a-fA-F0-9]{64}$"
},
"bridge": {
"default": "ccip",
"type": "string",
"enum": [
"ccip",
"native",
"both"
],
"description": "ccip links any chain pair. native links Ethereum with one L2 and maps native ETH only. both adds a native sucker where one exists."
},
"deployTiersHookConfig": {
"description": "NFT tiers collection. Omitted: an empty collection priced in the first baseCurrency.",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"symbol": {
"type": "string",
"minLength": 1,
"maxLength": 32
},
"baseUri": {
"type": "string",
"maxLength": 4096
},
"tokenUriResolver": {
"type": "string"
},
"contractUri": {
"type": "string",
"maxLength": 4096
},
"tiersConfig": {
"type": "object",
"properties": {
"tiers": {
"maxItems": 32,
"type": "array",
"items": {
"type": "object",
"properties": {
"price": {
"description": "Tier price in the tiers currency, with the tiers decimals.",
"type": "string",
"maxLength": 78,
"pattern": "^(0|[1-9][0-9]*)$"
},
"initialSupply": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"votingUnits": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"reserveFrequency": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"reserveBeneficiary": {
"type": "string"
},
"encodedIpfsUri": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{64}$"
},
"category": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"discountPercent": {
"description": "Tier price discount, out of 200. 200 = free.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"flags": {
"type": "object",
"properties": {
"allowOwnerMint": {
"type": "boolean"
},
"useReserveBeneficiaryAsDefault": {
"type": "boolean"
},
"transfersPausable": {
"type": "boolean"
},
"useVotingUnits": {
"type": "boolean"
},
"cantBeRemoved": {
"type": "boolean"
},
"cantIncreaseDiscountPercent": {
"type": "boolean"
},
"cantBuyWithCredits": {
"type": "boolean"
}
},
"required": [
"allowOwnerMint",
"useReserveBeneficiaryAsDefault",
"transfersPausable",
"useVotingUnits",
"cantBeRemoved",
"cantIncreaseDiscountPercent",
"cantBuyWithCredits"
],
"additionalProperties": false
},
"splitPercent": {
"description": "Share of the tier price sent to the tier's splits, out of 1,000,000,000.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
},
"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": [
"price",
"initialSupply",
"votingUnits",
"reserveFrequency",
"reserveBeneficiary",
"encodedIpfsUri",
"category",
"discountPercent",
"flags",
"splitPercent",
"splits"
],
"additionalProperties": false
}
},
"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
}
]
},
"decimals": {
"description": "Decimals of tier prices.",
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"pattern": "^(0|[1-9][0-9]*)$",
"maxLength": 78
}
]
}
},
"required": [
"tiers",
"currency",
"decimals"
],
"additionalProperties": false
},
"flags": {
"type": "object",
"properties": {
"noNewTiersWithReserves": {
"type": "boolean"
},
"noNewTiersWithVotes": {
"type": "boolean"
},
"noNewTiersWithOwnerMinting": {
"type": "boolean"
},
"preventOverspending": {
"type": "boolean"
},
"issueTokensForSplits": {
"type": "boolean"
}
},
"required": [
"noNewTiersWithReserves",
"noNewTiersWithVotes",
"noNewTiersWithOwnerMinting",
"preventOverspending",
"issueTokensForSplits"
],
"additionalProperties": false
}
},
"required": [
"name",
"symbol",
"baseUri",
"tokenUriResolver",
"contractUri",
"tiersConfig",
"flags"
],
"additionalProperties": false
},
"useDataHookForCashOut": {
"default": false,
"description": "Let NFTs cash out for surplus. Needs deployTiersHookConfig.",
"type": "boolean"
}
},
"required": [
"chainIds",
"account",
"owner",
"projectUri",
"rulesetConfigurations",
"terminalConfigurations",
"salt"
],
"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
}