# PersistedProjectControlChallenge

[All API schemas](/api-reference/schemas/)

<code>object</code> — Additional properties rejected

| Field | Required at this level | Type | Description and constraints |
| --- | --- | --- | --- |
| <code>schemaVersion</code> | Yes | Constant <code>persisted-project-control-challenge-v1</code> | — |
| <code>challenge</code> | Yes | <code>object</code> | Additional properties rejected |
| <code>challenge.organizationId</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>challenge.projectId</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>challenge.projectResourceVersion</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>challenge.chainId</code> | Yes | <code>integer</code> | Maximum: <code>9007199254740991</code>; Exclusive minimum: <code>0</code> |
| <code>challenge.genesisHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>challenge.token</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{40}$</code> |
| <code>challenge.schemaVersion</code> | Yes | Constant <code>project-control-challenge-v1</code> | — |
| <code>challenge.actorId</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>challenge.controller</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{40}$</code> |
| <code>challenge.custodyAccount</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{40}$</code> |
| <code>challenge.attestationHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>challenge.nonce</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>challenge.audience</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>challenge.deployment</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>challenge.purpose</code> | Yes | Constant <code>PROJECT&#95;TREASURY&#95;READ&#95;ACCESS&#95;ONLY</code> | — |
| <code>challenge.issuedAt</code> | Yes | <code>integer</code> | Minimum: <code>0</code>; Maximum: <code>9007199254740991</code> |
| <code>challenge.expiresAt</code> | Yes | <code>integer</code> | Minimum: <code>0</code>; Maximum: <code>9007199254740991</code> |
| <code>identity</code> | Yes | <code>object</code> | Additional properties rejected |
| <code>identity.payload</code> | Yes | <code>object</code> | Additional properties rejected |
| <code>identity.payload.organizationId</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>identity.payload.projectId</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>identity.payload.projectResourceVersion</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>identity.payload.chainId</code> | Yes | <code>integer</code> | Maximum: <code>9007199254740991</code>; Exclusive minimum: <code>0</code> |
| <code>identity.payload.genesisHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>identity.payload.token</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{40}$</code> |
| <code>identity.payload.schemaVersion</code> | Yes | Constant <code>project-identity-attestation-v1</code> | — |
| <code>identity.payload.publisher</code> | Yes | <code>object</code> | Additional properties rejected |
| <code>identity.payload.publisher.id</code> | Yes | <code>string</code> | Pattern: <code>^&#91;a-zA-Z0-9&#93;&#91;a-zA-Z0-9:&#95;-&#93;{2,159}$</code> |
| <code>identity.payload.publisher.resourceVersion</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>identity.payload.controller</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{40}$</code> |
| <code>identity.payload.issuedAt</code> | Yes | <code>integer</code> | Minimum: <code>0</code>; Maximum: <code>9007199254740991</code> |
| <code>identity.payload.expiresAt</code> | Yes | <code>integer</code> | Minimum: <code>0</code>; Maximum: <code>9007199254740991</code> |
| <code>identity.payloadHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>identity.signature</code> | Yes | <code>string</code> | Pattern: <code>^&#91;A-Za-z0-9+/&#93;{86}==$</code> |
| <code>anchor</code> | Yes | <code>object</code> | Additional properties rejected |
| <code>anchor.chainId</code> | Yes | <code>integer</code> | Maximum: <code>9007199254740991</code>; Exclusive minimum: <code>0</code> |
| <code>anchor.genesisHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>anchor.blockNumber</code> | Yes | <code>string</code> | Pattern: <code>^&#40;0&#124;&#91;1-9&#93;&#91;0-9&#93;{0,77}&#41;$</code> |
| <code>anchor.blockHash</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>anchor.finality</code> | Yes | Constant <code>FINALIZED</code> | — |
| <code>resourceVersion</code> | Yes | <code>string</code> | Pattern: <code>^0x&#91;0-9a-f&#93;{64}$</code> |
| <code>recordedAt</code> | Yes | <code>string</code> | Format: <code>date-time</code>; Pattern: <code>^&#40;?:&#40;?:&#92;d&#92;d&#91;2468&#93;&#91;048&#93;&#124;&#92;d&#92;d&#91;13579&#93;&#91;26&#93;&#124;&#92;d&#92;d0&#91;48&#93;&#124;&#91;02468&#93;&#91;048&#93;00&#124;&#91;13579&#93;&#91;26&#93;00&#41;-02-29&#124;&#92;d{4}-&#40;?:&#40;?:0&#91;13578&#93;&#124;1&#91;02&#93;&#41;-&#40;?:0&#91;1-9&#93;&#124;&#91;12&#93;&#92;d&#124;3&#91;01&#93;&#41;&#124;&#40;?:0&#91;469&#93;&#124;11&#41;-&#40;?:0&#91;1-9&#93;&#124;&#91;12&#93;&#92;d&#124;30&#41;&#124;&#40;?:02&#41;-&#40;?:0&#91;1-9&#93;&#124;1&#92;d&#124;2&#91;0-8&#93;&#41;&#41;&#41;T&#40;?:&#40;?:&#91;01&#93;&#92;d&#124;2&#91;0-3&#93;&#41;:&#91;0-5&#93;&#92;d&#40;?::&#91;0-5&#93;&#92;d&#40;?:&#92;.&#92;d+&#41;?&#41;?&#40;?:Z&#124;&#40;&#91;+-&#93;&#40;?:&#91;01&#93;&#92;d&#124;2&#91;0-3&#93;&#41;:&#91;0-5&#93;&#92;d&#41;&#41;&#41;$</code> |

Nested required fields apply when their parent object or matching union branch is present. Named types link to their complete schema.

Exact definition: <code>#/components/schemas/PersistedProjectControlChallenge</code> in the [OpenAPI contract](/openapi/liquidity-operating-system-v2.openapi.json).