From 879752cd165518a049e7d944279de3a80e1bcbf5 Mon Sep 17 00:00:00 2001 From: Karim <98668332+khadni@users.noreply.github.com> Date: Wed, 2 Sep 2026 17:21:34 -0500 Subject: [PATCH] add ACE guides, quick starts, and API reference docs --- public/api/ace/coordinator/openapi.json | 10454 ++++++++++++++++ public/api/ace/evaluation/openapi.json | 329 + public/api/ace/reporting/openapi.json | 2918 +++++ .../ace/account-setup/add-ace-wallets.webp | Bin 0 -> 116364 bytes .../images/ace/account-setup/api-key-1.webp | Bin 0 -> 42446 bytes .../images/ace/account-setup/api-key-2.webp | Bin 0 -> 77662 bytes .../ace/account-setup/organization-id.webp | Bin 0 -> 20010 bytes .../registry-1.webp | Bin 0 -> 28622 bytes .../policy-implementations-list.webp | Bin 0 -> 236884 bytes .../policy-engine-settings-2.webp | Bin 0 -> 168142 bytes .../policy-engines/policy-engine-view-1.webp | Bin 0 -> 37918 bytes .../ace/signing-model-sva-operations.png | Bin 0 -> 103066 bytes public/images/ace/signing-model-sva-setup.png | Bin 0 -> 145137 bytes .../PolicyInstanceBuilder.module.css | 285 + .../PolicyInstanceBuilder.tsx | 144 + .../LeftSidebar/RecursiveSidebar.astro | 8 +- src/components/MethodTabs/MethodTabs.astro | 12 + .../MethodTabs/MethodTabs.module.css | 86 + .../MethodTabs/MethodTabsClient.tsx | 111 + src/components/index.ts | 1 + src/config/sidebar.ts | 135 +- src/content/ace/beta-scope.mdx | 39 +- src/content/ace/concepts/architecture.mdx | 15 +- .../ace/concepts/cross-chain-identity.mdx | 17 +- src/content/ace/concepts/key-terms.mdx | 34 +- .../ace/concepts/off-chain-policies.mdx | 21 +- .../ace/concepts/policy-management.mdx | 4 +- src/content/ace/concepts/policy-ordering.mdx | 8 +- src/content/ace/concepts/reporting.mdx | 18 +- src/content/ace/concepts/security.mdx | 51 + .../ace/concepts/signing-ownership.mdx | 78 +- .../ace/getting-started/account-setup.mdx | 169 + .../ace/getting-started/identity-manager.mdx | 191 + src/content/ace/getting-started/index.mdx | 42 +- .../ace/getting-started/policy-manager.mdx | 277 + .../identity-manager/external-registries.mdx | 153 + .../ace/guides/identity-manager/index.mdx | 27 + .../manage-credential-types.mdx | 167 + .../identity-manager/manage-credentials.mdx | 219 + .../identity-manager/manage-identities.mdx | 332 + .../identity-manager/manage-registries.mdx | 260 + .../contracts/ace-compatible.mdx | 75 + .../policy-manager/contracts/erc20-token.mdx | 102 + .../contracts/erc3643-token.mdx | 160 + .../policy-manager/contracts/new-contract.mdx | 76 + .../contracts/security-considerations.mdx | 64 + .../contracts/upgrade-existing.mdx | 535 + .../guides/policy-manager/custom-policies.mdx | 235 + .../ace/guides/policy-manager/index.mdx | 66 + .../policy-manager/manage-data-validators.mdx | 197 + .../guides/policy-manager/manage-engines.mdx | 266 + .../guides/policy-manager/manage-policies.mdx | 207 + .../policy-manager/manage-protections.mdx | 220 + .../guides/policy-manager/manage-targets.mdx | 279 + .../grant-evaluation-access.mdx | 133 + .../offchain-policies/index.mdx | 34 + .../manage-offchain-policies.mdx | 288 + .../request-offchain-permits.mdx | 249 + src/content/ace/index.mdx | 17 +- src/content/ace/llms-full.txt | 4409 ++++++- src/content/ace/reference/api/coordinator.mdx | 36 - src/content/ace/reference/api/evaluation.mdx | 36 - src/content/ace/reference/api/reporting.mdx | 46 - src/content/ace/reference/apis.mdx | 104 + .../cross-chain-identity-contracts.mdx | 8 +- .../reference/policy-library/allow-policy.mdx | 4 +- .../policy-library/bypass-policy.mdx | 4 +- .../certified-action-don-validator-policy.mdx | 22 +- ...ial-registry-identity-validator-policy.mdx | 12 +- .../grouped-identity-validator-policy.mdx | 4 +- .../ace/reference/policy-library/index.mdx | 5 +- .../policy-library/interval-policy.mdx | 4 +- .../reference/policy-library/max-policy.mdx | 4 +- .../only-authorized-sender-policy.mdx | 4 +- .../reference/policy-library/pause-policy.mdx | 4 +- .../policy-library/reject-policy.mdx | 4 +- .../role-based-access-control-policy.mdx | 4 +- .../policy-library/secure-mint-policy.mdx | 4 +- .../policy-library/volume-policy.mdx | 4 +- .../policy-library/volume-rate-policy.mdx | 4 +- .../reference/policy-management-contracts.mdx | 5 +- src/content/ace/release-notes.mdx | 36 +- src/content/ace/supported-networks.mdx | 8 + src/data/ace-policy-implementations.json | 342 + src/features/ace/callouts/AceCallout.astro | 11 + src/features/ace/callouts/private-beta.mdx | 6 + src/features/redirects/redirects.json | 15 + src/pages/api/ace/coordinator/docs.astro | 295 + src/pages/api/ace/evaluation/docs.astro | 224 + src/pages/api/ace/reporting/docs.astro | 273 + 90 files changed, 25082 insertions(+), 667 deletions(-) create mode 100644 public/api/ace/coordinator/openapi.json create mode 100644 public/api/ace/evaluation/openapi.json create mode 100644 public/api/ace/reporting/openapi.json create mode 100644 public/images/ace/account-setup/add-ace-wallets.webp create mode 100644 public/images/ace/account-setup/api-key-1.webp create mode 100644 public/images/ace/account-setup/api-key-2.webp create mode 100644 public/images/ace/account-setup/organization-id.webp create mode 100644 public/images/ace/identity-manager-getting-started/registry-1.webp create mode 100644 public/images/ace/managing-policies/policy-implementations-list.webp create mode 100644 public/images/ace/policy-engines/policy-engine-settings-2.webp create mode 100644 public/images/ace/policy-engines/policy-engine-view-1.webp create mode 100644 public/images/ace/signing-model-sva-operations.png create mode 100644 public/images/ace/signing-model-sva-setup.png create mode 100644 src/components/ACE/PolicyInstanceBuilder/PolicyInstanceBuilder.module.css create mode 100644 src/components/ACE/PolicyInstanceBuilder/PolicyInstanceBuilder.tsx create mode 100644 src/components/MethodTabs/MethodTabs.astro create mode 100644 src/components/MethodTabs/MethodTabs.module.css create mode 100644 src/components/MethodTabs/MethodTabsClient.tsx create mode 100644 src/content/ace/concepts/security.mdx create mode 100644 src/content/ace/getting-started/account-setup.mdx create mode 100644 src/content/ace/getting-started/identity-manager.mdx create mode 100644 src/content/ace/getting-started/policy-manager.mdx create mode 100644 src/content/ace/guides/identity-manager/external-registries.mdx create mode 100644 src/content/ace/guides/identity-manager/index.mdx create mode 100644 src/content/ace/guides/identity-manager/manage-credential-types.mdx create mode 100644 src/content/ace/guides/identity-manager/manage-credentials.mdx create mode 100644 src/content/ace/guides/identity-manager/manage-identities.mdx create mode 100644 src/content/ace/guides/identity-manager/manage-registries.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/ace-compatible.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/erc20-token.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/erc3643-token.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/new-contract.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/security-considerations.mdx create mode 100644 src/content/ace/guides/policy-manager/contracts/upgrade-existing.mdx create mode 100644 src/content/ace/guides/policy-manager/custom-policies.mdx create mode 100644 src/content/ace/guides/policy-manager/index.mdx create mode 100644 src/content/ace/guides/policy-manager/manage-data-validators.mdx create mode 100644 src/content/ace/guides/policy-manager/manage-engines.mdx create mode 100644 src/content/ace/guides/policy-manager/manage-policies.mdx create mode 100644 src/content/ace/guides/policy-manager/manage-protections.mdx create mode 100644 src/content/ace/guides/policy-manager/manage-targets.mdx create mode 100644 src/content/ace/guides/policy-manager/offchain-policies/grant-evaluation-access.mdx create mode 100644 src/content/ace/guides/policy-manager/offchain-policies/index.mdx create mode 100644 src/content/ace/guides/policy-manager/offchain-policies/manage-offchain-policies.mdx create mode 100644 src/content/ace/guides/policy-manager/offchain-policies/request-offchain-permits.mdx delete mode 100644 src/content/ace/reference/api/coordinator.mdx delete mode 100644 src/content/ace/reference/api/evaluation.mdx delete mode 100644 src/content/ace/reference/api/reporting.mdx create mode 100644 src/content/ace/reference/apis.mdx create mode 100644 src/data/ace-policy-implementations.json create mode 100644 src/features/ace/callouts/AceCallout.astro create mode 100644 src/features/ace/callouts/private-beta.mdx create mode 100644 src/pages/api/ace/coordinator/docs.astro create mode 100644 src/pages/api/ace/evaluation/docs.astro create mode 100644 src/pages/api/ace/reporting/docs.astro diff --git a/public/api/ace/coordinator/openapi.json b/public/api/ace/coordinator/openapi.json new file mode 100644 index 00000000000..5993848cb13 --- /dev/null +++ b/public/api/ace/coordinator/openapi.json @@ -0,0 +1,10454 @@ +{ + "openapi": "3.0.4", + "info": { + "title": "Chainlink ACE Coordinator API", + "version": "0.1.0", + "description": "The Coordinator API is the control plane for ACE. Use it to create and manage all ACE resources for your organization." + }, + "servers": [ + { + "url": "https://ace.api.chain.link/v1", + "description": "Production" + } + ], + "components": { + "schemas": { + "ActionValidatorResponse": { + "type": "object", + "required": ["chain_selector", "validator_address"], + "properties": { + "chain_selector": { + "type": "string", + "description": "Chain selector identifying the network" + }, + "validator_address": { + "type": "string", + "description": "Deployed CertifiedActionDONValidator contract address on this chain" + } + } + }, + "AnyPolicyImplementationResponse": { + "oneOf": [ + { + "$ref": "#/components/schemas/PolicyImplementation" + }, + { + "$ref": "#/components/schemas/OffchainPolicyImplementation" + } + ] + }, + "AnyPolicyResponse": { + "oneOf": [ + { + "$ref": "#/components/schemas/Policy" + }, + { + "$ref": "#/components/schemas/OffchainPolicyResponse" + } + ], + "discriminator": { + "propertyName": "policy_kind", + "mapping": { + "onchain": "#/components/schemas/Policy", + "offchain": "#/components/schemas/OffchainPolicyResponse" + } + } + }, + "ApiErrorResponse": { + "type": "object", + "required": ["error", "message"], + "properties": { + "message": { + "type": "string", + "description": "Message of the response" + }, + "error": { + "type": "string", + "description": "Error type", + "enum": ["Already exists", "Internal error", "Not found", "Bad request", "Unauthorized", "Forbidden"] + } + } + }, + "ApplyOnchainPolicy": { + "type": "object", + "required": ["chain_selector", "current_policy_config_version"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "current_policy_config_version": { + "type": "string", + "format": "uint64", + "description": "Current policy config version on chain" + } + } + }, + "ChainSelector": { + "type": "string", + "format": "uint64", + "description": "Chain selector" + }, + "ConfigureDataValidatorChains": { + "type": "object", + "required": ["chain_selector", "current_config_version"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "current_config_version": { + "type": "string", + "format": "uint64", + "description": "Expected current config version on-chain (optimistic concurrency)" + } + } + }, + "ContractConfigSchema": { + "type": "object", + "additionalProperties": {}, + "description": "JSON Schema draft-07 document defining configurable parameters for an on-chain contract\nimplementation.\n" + }, + "CreateAnyPolicyRequest": { + "oneOf": [ + { + "$ref": "#/components/schemas/CreatePolicyRequest" + }, + { + "$ref": "#/components/schemas/CreateOffchainPolicyRequest" + } + ], + "description": "Create an onchain or offchain policy. `policy_kind` is optional and defaults to `\"onchain\"` if omitted. Set `policy_kind` to `\"offchain\"` to create an offchain policy.\n" + }, + "CreateCredentialInput": { + "type": "object", + "required": ["credential_type_id"], + "properties": { + "credential_type_id": { + "$ref": "#/components/schemas/Id" + }, + "credential_data": { + "description": "Required when the credential type is linked to a data schema (JSON object or array per data schema)" + }, + "external_unique_id": { + "type": "string", + "description": "External unique identifier for the credential" + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp of the credential" + } + } + }, + "CreateCredentialRegistryInput": { + "type": "object", + "required": ["name", "chain_selector", "description"], + "properties": { + "name": { + "type": "string", + "description": "Name of the credential registry" + }, + "address": { + "$ref": "#/components/schemas/EthAddress", + "description": "Optional address. If not provided, the registry will be deployed and status will be creation_pending" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "description": { + "type": "string", + "description": "Description of the credential registry" + } + } + }, + "CreateDataValidatorRequest": { + "type": "object", + "required": ["name", "data_validator_implementation_id"], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "data_validator_implementation_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_data_validators": { + "type": "array", + "description": "On-chain deployments; each chain_selector may appear at most once", + "items": { + "$ref": "#/components/schemas/CreateOnchainDataValidatorRequest" + } + } + } + }, + "CreateExtractorRequest": { + "type": "object", + "required": ["name", "supported_function_signatures", "outputs"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the extractor" + }, + "supported_function_signatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Function signatures that the extractor supports" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtractorOutputInput" + } + }, + "onchain_extractors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainExtractorInput" + } + } + } + }, + "CreateIdentitiesBatchRequest": { + "type": "object", + "required": ["identities"], + "properties": { + "identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateIdentityRequest" + }, + "description": "List of identities to create" + } + } + }, + "CreateIdentitiesBatchResponse": { + "type": "object", + "required": ["results"], + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateIdentityResult" + }, + "description": "List of identity creation results" + } + } + }, + "CreateIdentityRegistryInput": { + "type": "object", + "required": ["name", "chain_selector", "description"], + "properties": { + "name": { + "type": "string", + "description": "Name of the identity registry" + }, + "address": { + "$ref": "#/components/schemas/EthAddress", + "description": "Optional address. If not provided, the registry will be deployed and status will be creation_pending" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "description": { + "type": "string", + "description": "Description of the identity registry" + } + } + }, + "CreateIdentityRequest": { + "type": "object", + "required": ["title", "entity_id", "registry_id", "onchain_identities"], + "properties": { + "title": { + "type": "string", + "description": "Human-readable title of the identity" + }, + "description": { + "type": "string", + "description": "Description of the identity" + }, + "entity_id": { + "type": "string", + "description": "Entity ID of the identity" + }, + "registry_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainIdentityInput" + }, + "description": "Onchain identities to register with the identity" + }, + "credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateCredentialInput" + }, + "description": "Optional list of credentials to create for the new identity" + } + } + }, + "CreateIdentityResult": { + "type": "object", + "required": ["status"], + "properties": { + "identity": { + "$ref": "#/components/schemas/Identity" + }, + "status": { + "$ref": "#/components/schemas/CreateIdentityResultStatus" + }, + "error": { + "type": "string", + "description": "Error message if creation failed" + } + } + }, + "CreateIdentityResultStatus": { + "type": "string", + "description": "Status of the identity creation", + "enum": ["created", "failed"] + }, + "CreateOffchainPolicyRequest": { + "type": "object", + "required": ["type", "name", "policy_engine_id", "onchain_policies", "config"], + "properties": { + "policy_kind": { + "type": "string", + "enum": ["offchain"], + "description": "Optional. Set to \"offchain\" to create an offchain policy. Defaults to \"onchain\" if omitted." + }, + "type": { + "type": "string", + "enum": ["wallet_risk_scoring"], + "description": "Managed offchain policy MVP type. ACE Beta supports wallet_risk_scoring. Contact your Chainlink representative for setup assistance." + }, + "name": { + "type": "string", + "description": "Human-readable policy name" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id", + "description": "ID of the onchain PolicyEngine this policy is associated with" + }, + "onchain_policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateOnchainTargetProtectionRequest" + }, + "minItems": 1, + "description": "Chain selectors to deploy the CertifiedActionDONValidator on (one deployment per chain)" + }, + "config": { + "type": "object", + "additionalProperties": true, + "description": "Wallet screening configuration. Use secret_name, addresses_to_check, risk_threshold, block_unknown, optional category_filters, and optional fail_mode." + } + } + }, + "CreateOnchainDataValidatorRequest": { + "type": "object", + "required": ["chain_selector"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "initial_config": { + "type": "object", + "description": "Initial configuration for schema-derived keys", + "additionalProperties": true + } + } + }, + "CreateOnchainPolicyRequest": { + "type": "object", + "required": ["chain_selector"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "initial_config": { + "type": "object", + "description": "Initial configuration values for properties listed in initial_configs", + "additionalProperties": true + } + } + }, + "CreateOnchainTargetProtectionRequest": { + "type": "object", + "required": ["chain_selector"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + } + } + }, + "CreatePolicyEngineRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the policy engine" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy engine" + }, + "extractor_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Id" + } + }, + "onchain_policy_engines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyEngineInput" + } + } + }, + "required": ["name", "onchain_policy_engines"] + }, + "CreatePolicyRequest": { + "type": "object", + "required": ["name", "policy_implementation_id", "policy_engine_id"], + "properties": { + "policy_kind": { + "type": "string", + "enum": ["onchain"], + "description": "Optional. Identifies this as an onchain policy creation request. Defaults to \"onchain\" if omitted." + }, + "name": { + "type": "string", + "description": "Human-readable name of the policy instance" + }, + "description": { + "type": "string", + "description": "Description of the policy instance" + }, + "policy_implementation_id": { + "$ref": "#/components/schemas/Id" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_policies": { + "type": "array", + "description": "On-chain deployments; each chain_selector may appear at most once", + "items": { + "$ref": "#/components/schemas/CreateOnchainPolicyRequest" + } + } + } + }, + "CreateRegistryAccessGrantRequest": { + "type": "object", + "required": ["grantee_org_id"], + "properties": { + "grantee_org_id": { + "$ref": "#/components/schemas/OrgId", + "description": "Organization ID to grant registry access to" + } + } + }, + "CreateRegistryRequest": { + "type": "object", + "required": ["name", "description"], + "properties": { + "name": { + "type": "string", + "description": "Name of the registry" + }, + "description": { + "type": "string", + "description": "Description of the registry" + }, + "identity_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateIdentityRegistryInput" + }, + "description": "List of identity registries to create and associate with this registry" + }, + "credential_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateCredentialRegistryInput" + }, + "description": "List of credential registries to create and associate with this registry" + } + } + }, + "CreateTargetProtectionRequest": { + "type": "object", + "required": ["function_signature", "policy_instance_id"], + "description": "For onchain policies, `policy_instance_id` is the onchain policy instance ID and `policy_kind` may be omitted (defaults to \"onchain\"). For offchain (CADV) policies, `policy_instance_id` is the offchain policy ID and `policy_kind` must be \"offchain\".\n", + "properties": { + "function_signature": { + "type": "string", + "description": "Function signature of the target protection" + }, + "policy_instance_id": { + "$ref": "#/components/schemas/Id", + "description": "ID of the policy to protect. For onchain policies this is the policy instance ID; for offchain policies this is the offchain policy ID." + }, + "policy_kind": { + "type": "string", + "enum": ["onchain", "offchain"], + "description": "Kind of policy being protected. Defaults to \"onchain\" if omitted." + }, + "desired_position": { + "type": "integer", + "description": "Desired position of the target protection" + }, + "onchain_target_protections": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/CreateOnchainTargetProtectionRequest" + } + }, + "extractor_output_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Id" + } + } + } + }, + "CreateWalletRequest": { + "type": "object", + "required": ["owner_address", "chain_selector"], + "properties": { + "owner_address": { + "$ref": "#/components/schemas/EthAddress" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "type": "array", + "description": "ECDSA signer addresses allowed to sign transactions for this wallet. Only required for self-sign organizations.", + "items": { + "$ref": "#/components/schemas/EthAddress" + } + } + } + }, + "CreateWalletsRequest": { + "type": "object", + "required": ["wallets"], + "properties": { + "wallets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateWalletRequest" + } + } + } + }, + "CreatedAt": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the creation" + }, + "Credential": { + "type": "object", + "required": [ + "id", + "credential_type_id", + "external_unique_id", + "identity_id", + "chain_selectors", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "credential_type_id": { + "$ref": "#/components/schemas/Id" + }, + "credential_type": { + "$ref": "#/components/schemas/CredentialType" + }, + "credential_data": { + "nullable": true, + "description": "Validated credential payload JSON when the credential type is linked to a data schema; null otherwise" + }, + "external_unique_id": { + "type": "string", + "description": "External unique identifier for the credential" + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp of the credential" + }, + "identity_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainCredential" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when the credential was archived (null if not archived)" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "CredentialRegistry": { + "type": "object", + "required": [ + "id", + "address", + "name", + "description", + "created_at", + "updated_at", + "org_id", + "chain_selector", + "registry_id", + "status" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "name": { + "type": "string", + "description": "Human-readable name of the credential registry" + }, + "description": { + "type": "string", + "description": "Human-readable description of the credential registry" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "registry_id": { + "$ref": "#/components/schemas/Id" + }, + "status": { + "$ref": "#/components/schemas/RegistryStatus" + } + } + }, + "CredentialStatus": { + "type": "string", + "description": "Status of the credential (active or archived)", + "enum": ["active", "archived"] + }, + "CredentialType": { + "type": "object", + "required": [ + "id", + "registry_id", + "title", + "credential_type_hash", + "chain_selectors", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "registry_id": { + "$ref": "#/components/schemas/Id" + }, + "title": { + "type": "string", + "description": "Title of the credential type" + }, + "description": { + "type": "string", + "description": "Description of the credential type" + }, + "credential_type": { + "type": "string", + "description": "Type of the credential (e.g., \"common.KYC\")" + }, + "credential_type_hash": { + "type": "string", + "description": "Hash of the credential type" + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "data_schema": { + "nullable": true, + "allOf": [ + { + "$ref": "#/components/schemas/CredentialTypeEmbeddedDataSchema" + } + ] + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "CredentialTypeEmbeddedDataSchema": { + "type": "object", + "description": "Data schema linked to a credential type for credential payload validation", + "required": ["id", "name", "description", "schema"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "schema": { + "$ref": "#/components/schemas/PolicyConfigSchema" + } + } + }, + "CredentialTypePatchStatus": { + "type": "string", + "description": "Status for credential type PATCH (archive only)", + "enum": ["archived"] + }, + "DataValidator": { + "type": "object", + "required": [ + "id", + "name", + "description", + "data_validator_implementation_id", + "onchain_configs", + "chain_selectors" + ], + "description": "A data validator instance (deployment aggregate across chains).", + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "data_validator_implementation_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_configs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataValidatorOnchainConfig" + } + }, + "onchain_data_validators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainDataValidatorInstance" + }, + "description": "Deprecated — prefer onchain_configs for config grouping; retained for backward compatibility." + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "ongoing_config_changes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OngoingConfigChange" + } + }, + "archived_at": { + "type": "integer", + "format": "int64", + "nullable": true, + "description": "Unix timestamp when archived" + } + } + }, + "DataValidatorOnchainConfig": { + "type": "object", + "required": ["id", "chain_selectors", "config_json"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id", + "description": "Data validator config log ID" + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + }, + "description": "Chain selectors sharing this config log" + }, + "config_json": { + "type": "object", + "additionalProperties": true, + "description": "Configuration JSON for this log" + } + } + }, + "DataValidatorPatchStatus": { + "type": "string", + "description": "PATCH body for archiving a data validator instance", + "enum": ["archived"] + }, + "EthAddress": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address" + }, + "Extractor": { + "type": "object", + "required": [ + "id", + "name", + "supported_function_signatures", + "chain_selectors", + "outputs", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the extractor" + }, + "org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "supported_function_signatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Function signatures that the extractor supports" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtractorOutput" + } + }, + "onchain_extractors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainExtractor" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + } + } + }, + "ExtractorOutput": { + "type": "object", + "required": ["id", "extractor_id", "name", "type", "created_at", "updated_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "extractor_id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the extractor output" + }, + "type": { + "type": "string", + "description": "Type of the extractor output, e.g. \"address\", \"uint256\", \"bytes32\"" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "ExtractorOutputInput": { + "type": "object", + "required": ["name", "type"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the extractor output" + }, + "type": { + "type": "string", + "description": "Type of the extractor output, e.g. \"address\", \"uint256\", \"bytes32\"" + } + } + }, + "ExtractorPatchStatus": { + "type": "string", + "description": "Status for extractor PATCH (archive only)", + "enum": ["archived"] + }, + "ExtractorRegistration": { + "type": "object", + "required": [ + "id", + "extractor_id", + "policy_engine_id", + "onchain_extractor_registrations", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "extractor_id": { + "$ref": "#/components/schemas/Id" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_extractor_registrations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainExtractorRegistration" + } + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "HealthCheck": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "ok" + } + }, + "required": ["status"] + }, + "Id": { + "type": "string", + "format": "uuid", + "description": "ID" + }, + "Identity": { + "type": "object", + "required": ["id", "title", "ccid", "chain_selectors", "created_at", "updated_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "title": { + "type": "string", + "description": "Human-readable title of the identity" + }, + "description": { + "type": "string", + "description": "Description of the identity" + }, + "entity_id": { + "type": "string", + "description": "Entity ID of the identity" + }, + "ccid": { + "type": "string", + "description": "CCID of the identity" + }, + "registryId": { + "$ref": "#/components/schemas/Id" + }, + "onchain_identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainIdentity" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when the identity was archived (null if not archived)" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "IdentityPatchStatus": { + "type": "string", + "description": "Status for identity PATCH (archive only)", + "enum": ["archived"] + }, + "IdentityRegistry": { + "type": "object", + "required": [ + "id", + "address", + "name", + "description", + "created_at", + "updated_at", + "org_id", + "chain_selector", + "registry_id", + "status" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "name": { + "type": "string", + "description": "Human-readable name of the identity registry" + }, + "description": { + "type": "string", + "description": "Human-readable description of the identity registry" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "registry_id": { + "$ref": "#/components/schemas/Id" + }, + "status": { + "$ref": "#/components/schemas/RegistryStatus" + } + } + }, + "IdentityStatus": { + "type": "string", + "description": "Status of the identity", + "enum": ["creation_pending", "creation_failed", "created", "removal_pending", "removal_failed", "removed"] + }, + "JsonPatchOperation": { + "type": "object", + "required": ["op", "path"], + "properties": { + "op": { + "type": "string", + "description": "JSON Patch operation type", + "enum": ["add", "remove", "replace", "move", "copy", "test"] + }, + "path": { + "type": "string", + "description": "JSON pointer path to patch (RFC 6902)" + }, + "value": { + "description": "Value for the operation (can be any JSON type: string, number, boolean, object, array, or null)", + "nullable": true + }, + "from": { + "type": "string", + "description": "Source path for move/copy operations (RFC 6902)" + } + } + }, + "ListCredentialTypesResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["credential_types"], + "properties": { + "credential_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialType" + } + } + } + } + ] + }, + "ListCredentialsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["credentials"], + "properties": { + "credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Credential" + } + } + } + } + ] + }, + "ListDataValidatorsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "properties": { + "data_validators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataValidator" + } + } + } + } + ] + }, + "ListExtractorsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["extractors"], + "properties": { + "extractors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Extractor" + } + } + } + } + ] + }, + "ListIdentitiesResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["identities"], + "properties": { + "identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Identity" + } + } + } + } + ] + }, + "ListNetworksResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["networks"], + "properties": { + "networks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Network" + } + } + } + } + ] + }, + "ListOffchainPolicyProtectionsResponse": { + "type": "object", + "required": ["protections", "total", "total_pages", "page"], + "properties": { + "protections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OffchainPolicyProtectionResponse" + } + }, + "total": { + "type": "integer" + }, + "total_pages": { + "type": "integer" + }, + "page": { + "type": "integer" + } + } + }, + "ListPoliciesResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "properties": { + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AnyPolicyResponse" + } + } + } + } + ] + }, + "ListPolicyEnginesResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["policy_engines"], + "properties": { + "policy_engines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyEngine" + } + } + } + } + ] + }, + "ListPolicyImplementationsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["implementations"], + "properties": { + "implementations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AnyPolicyImplementationResponse" + } + } + } + } + ] + }, + "ListRegistriesResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["registries"], + "properties": { + "registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Registry" + } + } + } + } + ] + }, + "ListRegistryAccessGrantsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["access_grants"], + "properties": { + "access_grants": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegistryAccessGrant" + } + } + } + } + ] + }, + "ListResponseData": { + "type": "object", + "required": ["total", "total_pages", "page"], + "properties": { + "total": { + "type": "integer", + "description": "Total number of items" + }, + "total_pages": { + "type": "integer", + "description": "Total number of pages" + }, + "page": { + "type": "integer", + "description": "Current page" + } + } + }, + "ListTargetProtectionsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["target_protections"], + "properties": { + "target_protections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TargetProtection" + } + } + } + } + ] + }, + "ListTargetsResponse": { + "allOf": [ + { + "$ref": "#/components/schemas/ListResponseData" + }, + { + "type": "object", + "required": ["targets"], + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Target" + } + } + } + } + ] + }, + "ListWalletsResponse": { + "type": "object", + "required": ["wallets"], + "properties": { + "wallets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Wallet" + } + } + } + }, + "MergeTargetRequest": { + "type": "object", + "required": ["source_target_ids"], + "properties": { + "source_target_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Id" + }, + "minItems": 1, + "description": "The IDs of the source targets whose onchain targets will be transferred to the destination target." + } + } + }, + "Network": { + "type": "object", + "required": [ + "id", + "name", + "chain_id", + "chain_selector", + "chain_family", + "is_testnet", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the network" + }, + "chain_id": { + "type": "string", + "description": "Chain ID of the network" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "chain_family": { + "type": "string", + "description": "Chain family of the network" + }, + "is_testnet": { + "type": "boolean", + "description": "Whether this network is a testnet (not mainnet)" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "OffchainPolicyImplementation": { + "type": "object", + "required": ["id", "name", "type", "config", "created_at", "updated_at"], + "properties": { + "policy_kind": { + "type": "string", + "enum": ["offchain"], + "description": "Discriminator identifying this as an offchain policy implementation" + }, + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "description": "Unique managed policy type identifier, for example wallet_risk_scoring" + }, + "config": { + "type": "object", + "additionalProperties": true, + "description": "Implementation config including provider, provider_url, and config_schema" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + } + } + }, + "OffchainPolicyProtectionResponse": { + "type": "object", + "required": ["id", "offchain_policy_id", "function_signature", "function_selector", "status", "created_at"], + "properties": { + "id": { + "type": "string" + }, + "offchain_policy_id": { + "type": "string" + }, + "function_signature": { + "type": "string" + }, + "function_selector": { + "type": "string", + "description": "4-byte hex selector, e.g. \"0xa9059cbb\"" + }, + "status": { + "type": "string", + "enum": ["pending", "active", "failed", "removing", "removed"] + }, + "onchain_target_protections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainTargetProtection" + }, + "description": "Per-chain status of the addPolicyAt() registration on the PolicyEngine" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "OffchainPolicyResponse": { + "type": "object", + "required": ["id", "type", "name", "config", "deployment_status", "created_at", "policy_kind"], + "properties": { + "policy_kind": { + "type": "string", + "enum": ["offchain"], + "description": "Discriminator identifying this as an offchain policy" + }, + "id": { + "type": "string", + "description": "Policy ID" + }, + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "config": { + "type": "object", + "additionalProperties": true + }, + "policy_engine_id": { + "type": "string", + "description": "ID of the onchain PolicyEngine this policy is associated with" + }, + "policy_implementation_id": { + "type": "string", + "description": "ID of the offchain policy implementation (template) used to create this policy" + }, + "action_validators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ActionValidatorResponse" + }, + "description": "Per-chain CADV deployment info (chain selector + contract address). Populated once deployment_status is active." + }, + "deployment_status": { + "type": "string", + "enum": ["pending", "deploying", "active", "failed", "removing", "removed", "config_updating"] + }, + "workflow_id": { + "type": "string" + }, + "workflow_name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + } + } + }, + "OnChainCredentialStatus": { + "type": "string", + "description": "Status of the onchain credential\n", + "enum": [ + "creation_pending", + "creation_failed", + "created", + "update_pending", + "update_failed", + "removal_pending", + "removal_failed", + "removed" + ] + }, + "OnchainConfig": { + "type": "object", + "required": ["id", "chain_selectors", "config_json"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id", + "description": "Policy config log ID" + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + }, + "description": "Array of chain selectors that use this config" + }, + "config_json": { + "type": "object", + "additionalProperties": true, + "description": "The policy configuration as JSON" + } + } + }, + "OnchainCredential": { + "type": "object", + "required": ["id", "chain_selector", "status"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "status": { + "$ref": "#/components/schemas/OnChainCredentialStatus" + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp of the credential" + } + } + }, + "OnchainDataValidatorInstance": { + "type": "object", + "required": ["id", "chain_selector", "data_validator_config_version", "status"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "data_validator_config_version": { + "type": "string", + "format": "uint64", + "description": "Version of the data validator configuration on-chain" + }, + "status": { + "$ref": "#/components/schemas/OnchainDataValidatorInstanceStatus" + } + } + }, + "OnchainDataValidatorInstanceStatus": { + "type": "string", + "description": "Status of an on-chain data validator deployment", + "enum": ["creation_pending", "creation_failed", "created", "update_pending", "update_failed"] + }, + "OnchainExtractor": { + "type": "object", + "required": ["id", "extractor_id", "chain_selector", "address", "created_at", "updated_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "extractor_id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "type": "string", + "description": "Chain selector" + }, + "address": { + "type": "string", + "description": "Ethereum address" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "OnchainExtractorInput": { + "type": "object", + "required": ["chain_selector", "address"], + "properties": { + "chain_selector": { + "type": "string", + "description": "Chain selector" + }, + "address": { + "type": "string", + "description": "Ethereum address" + } + } + }, + "OnchainExtractorRegistration": { + "type": "object", + "required": ["id", "chain_selector", "status", "created_at", "updated_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "status": { + "$ref": "#/components/schemas/OnchainStatus" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "OnchainIdentity": { + "type": "object", + "required": ["id", "chain_selector", "identity_id", "address", "status", "created_at", "updated_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "identity_id": { + "$ref": "#/components/schemas/Id" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "status": { + "$ref": "#/components/schemas/IdentityStatus" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "OnchainIdentityInput": { + "type": "object", + "required": ["chain_selector", "address"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + } + } + }, + "OnchainPolicyEngine": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "status": { + "$ref": "#/components/schemas/OnchainPolicyEngineStatus" + } + }, + "required": ["id", "address", "chain_selector", "status"] + }, + "OnchainPolicyEngineInput": { + "type": "object", + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "required": ["chain_selector"] + }, + "OnchainPolicyEngineStatus": { + "type": "string", + "description": "Status of the onchain policy engine", + "enum": ["creation_pending", "creation_failed", "created"] + }, + "OnchainPolicyImplementation": { + "type": "object", + "required": ["chain_selector", "address"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + } + } + }, + "OnchainPolicyInstance": { + "type": "object", + "required": ["id", "chain_selector", "policy_config_version", "out_of_sync", "status"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "policy_config_version": { + "type": "string", + "format": "uint64", + "description": "Version of the policy configuration" + }, + "out_of_sync": { + "type": "boolean", + "description": "Whether the policy configuration is out of sync due to an external configuration change" + }, + "status": { + "$ref": "#/components/schemas/OnchainPolicyInstanceStatus" + } + } + }, + "OnchainPolicyInstanceStatus": { + "type": "string", + "description": "Status of the onchain policy instance", + "enum": ["creation_pending", "creation_failed", "created", "update_pending", "update_failed"] + }, + "OnchainStatus": { + "type": "string", + "description": "Status of the onchain entity", + "enum": ["active", "inactive"] + }, + "OnchainTarget": { + "type": "object", + "required": ["id", "chain_selector", "address"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + }, + "default_allow": { + "type": "boolean", + "description": "Default policy allow state on chain", + "default": true + } + } + }, + "OnchainTargetProtection": { + "type": "object", + "required": ["id", "chain_selector"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "position": { + "type": "integer", + "description": "Position of the target protection in for this specific chain" + }, + "status": { + "$ref": "#/components/schemas/TargetProtectionStatus" + } + } + }, + "OngoingConfigChange": { + "type": "object", + "required": ["chain_selectors", "patches"], + "properties": { + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + }, + "description": "Array of chain selectors for this configuration change" + }, + "patches": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JsonPatchOperation" + }, + "description": "Array of JSON patch operations to apply" + } + } + }, + "OrgId": { + "type": "string", + "description": "Organization ID (e.g. from CRE). Alphanumeric and limited symbols, max 100 characters.", + "pattern": "^[a-zA-Z0-9._-]{1,100}$" + }, + "PatchCredentialRequest": { + "type": "object", + "description": "Either status (to archive) OR update fields (external_unique_id, expires_at). Mutually exclusive.\n- If status is passed, other fields must not be passed (400).\n- If status=archived and credential is already archived, returns 400.\n- Only status=archived triggers archive; status=active is invalid for PATCH.\n- If external_unique_id or expires_at are set, reuses update logic.\n", + "properties": { + "status": { + "$ref": "#/components/schemas/CredentialStatus", + "description": "Set to \"archived\" to archive. Mutually exclusive with update fields." + }, + "external_unique_id": { + "type": "string", + "description": "External unique identifier. Mutually exclusive with status." + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp. Mutually exclusive with status." + } + } + }, + "PatchCredentialTypeRequest": { + "type": "object", + "description": "Either status (to archive) OR update fields (title, description). Mutually exclusive.\n- If status is passed, other fields must not be passed (400).\n- If status=archived and credential type is already archived, returns 400.\n- Only status=archived triggers archive.\n- If title or description are set, internally calls UpdateCredentialType (PUT).\n", + "properties": { + "status": { + "$ref": "#/components/schemas/CredentialTypePatchStatus", + "description": "Set to \"archived\" to archive. Mutually exclusive with update fields." + }, + "title": { + "type": "string", + "description": "Human-readable title. Mutually exclusive with status." + }, + "description": { + "type": "string", + "description": "Human-readable description of the credential type. Mutually exclusive with status." + } + } + }, + "PatchDataValidatorConfigsRequest": { + "type": "object", + "properties": { + "patches": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JsonPatchOperation" + }, + "description": "JSON Patch operations (RFC 6902)" + }, + "on_chains": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConfigureDataValidatorChains" + }, + "description": "Chains to apply patches on (must include at least one entry)" + } + } + }, + "PatchDataValidatorRequest": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "$ref": "#/components/schemas/DataValidatorPatchStatus" + } + } + }, + "PatchExtractorRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the extractor.", + "properties": { + "status": { + "$ref": "#/components/schemas/ExtractorPatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "PatchIdentityRequest": { + "type": "object", + "description": "Either status (to archive) OR update fields (title, description, onchain_identities). Mutually exclusive.\n- If status is passed, other fields must not be passed (400).\n- If status=archived and identity is already archived, returns 400.\n- Only status=archived triggers archive.\n- If title, description, or onchain_identities are set, internally calls UpdateIdentity (PUT).\n", + "properties": { + "status": { + "$ref": "#/components/schemas/IdentityPatchStatus", + "description": "Set to \"archived\" to archive. Mutually exclusive with update fields." + }, + "title": { + "type": "string", + "description": "Human-readable title. Mutually exclusive with status." + }, + "description": { + "type": "string", + "description": "Description of the identity. Mutually exclusive with status." + }, + "onchain_identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainIdentityInput" + }, + "description": "Onchain identities to register. Mutually exclusive with status." + } + } + }, + "PatchPolicyConfigsRequest": { + "type": "object", + "properties": { + "patches": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JsonPatchOperation" + }, + "description": "Array of JSON Patch operations to apply" + }, + "apply_onchain_policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplyOnchainPolicy" + }, + "description": "Array of onchain policies to apply the patches to" + } + } + }, + "PatchPolicyEngineRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the policy engine.", + "properties": { + "status": { + "$ref": "#/components/schemas/PolicyEnginePatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "PatchPolicyImplementationRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the policy implementation.", + "properties": { + "status": { + "$ref": "#/components/schemas/PolicyImplementationPatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "PatchPolicyRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the policy. Use policy_kind to distinguish onchain (default) from offchain policies.", + "properties": { + "status": { + "$ref": "#/components/schemas/PolicyPatchStatus", + "description": "Set to \"archived\" to archive." + }, + "policy_kind": { + "type": "string", + "enum": ["onchain", "offchain"], + "description": "Kind of policy to archive. Defaults to \"onchain\" if omitted." + } + } + }, + "PatchRegistryAccessGrantRequest": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "type": "string", + "enum": ["revoked"], + "description": "Target status. Currently only \"revoked\" is accepted." + } + } + }, + "PatchRegistryRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the registry.", + "properties": { + "status": { + "$ref": "#/components/schemas/RegistryPatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "PatchTargetProtectionRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the target protection.", + "properties": { + "status": { + "$ref": "#/components/schemas/TargetProtectionPatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "PatchTargetRequest": { + "type": "object", + "required": ["status"], + "description": "Set status to \"archived\" to archive the target.", + "properties": { + "status": { + "$ref": "#/components/schemas/TargetPatchStatus", + "description": "Set to \"archived\" to archive." + } + } + }, + "Policy": { + "type": "object", + "required": [ + "id", + "name", + "description", + "policy_engine_id", + "onchain_configs", + "chain_selectors", + "policy_kind" + ], + "properties": { + "policy_kind": { + "type": "string", + "enum": ["onchain"], + "description": "Discriminator identifying this as an onchain policy" + }, + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the policy instance" + }, + "description": { + "type": "string", + "description": "Description of the policy instance" + }, + "policy_implementation_id": { + "$ref": "#/components/schemas/Id" + }, + "policy_implementation_name": { + "type": "string", + "description": "Human-readable name of the policy implementation" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id" + }, + "onchain_configs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainConfig" + }, + "description": "Array of onchain configurations grouped by config log ID" + }, + "onchain_policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyInstance" + }, + "description": "Deprecated - use onchain_configs instead" + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "ongoing_config_changes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OngoingConfigChange" + }, + "description": "Array of ongoing configuration changes" + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + } + } + }, + "PolicyConfigSchema": { + "allOf": [ + { + "$ref": "#/components/schemas/ContractConfigSchema" + } + ], + "description": "JSON Schema draft-07 document defining the configurable parameters of this policy\nimplementation.\n" + }, + "PolicyEngine": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the policy engine" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy engine" + }, + "type": { + "$ref": "#/components/schemas/PolicyEngineType" + }, + "onchain_policy_engines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyEngine" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "extractor_registrations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtractorRegistration" + } + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + }, + "required": ["id", "name", "type", "chain_selectors", "created_at", "updated_at"] + }, + "PolicyEnginePatchStatus": { + "type": "string", + "description": "Status for policy engine PATCH (archive only)", + "enum": ["archived"] + }, + "PolicyEngineType": { + "type": "string", + "description": "Type of the policy engine", + "enum": ["standard", "system"] + }, + "PolicyImplementation": { + "type": "object", + "properties": { + "policy_kind": { + "type": "string", + "enum": ["onchain"], + "description": "Discriminator identifying this as an onchain policy implementation" + }, + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the policy implementation" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy implementation" + }, + "type": { + "$ref": "#/components/schemas/PolicyImplementationType" + }, + "policy_config_schema": { + "$ref": "#/components/schemas/PolicyConfigSchema" + }, + "onchain_policy_implementations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyImplementation" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "parameters": { + "type": "array", + "description": "Processed policy run parameters with server-generated fields", + "items": { + "$ref": "#/components/schemas/PolicyRunParametersResponse" + } + }, + "archived_at": { + "type": "integer", + "format": "int64", + "nullable": true, + "description": "Unix timestamp when archived; null if not archived" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the creation" + }, + "updated_at": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the last update" + } + }, + "required": [ + "id", + "name", + "description", + "type", + "policy_config_schema", + "chain_selectors", + "parameters", + "created_at", + "updated_at" + ] + }, + "PolicyImplementationPatchStatus": { + "type": "string", + "description": "Status for policy implementation PATCH (archive only)", + "enum": ["archived"] + }, + "PolicyImplementationType": { + "type": "string", + "description": "Type of the policy implementation; system types are predefined, custom for user-defined.", + "enum": [ + "allow", + "bypass", + "certified_action_don_validator", + "grouped_identity_validator", + "identity_validator", + "interval", + "max", + "only_authorized_sender", + "pause", + "reject", + "role_based_access_control", + "secure_mint", + "volume", + "volume_rate", + "custom" + ] + }, + "PolicyPatchStatus": { + "type": "string", + "description": "Status for policy PATCH (archive only)", + "enum": ["archived"] + }, + "PolicyRunParametersResponse": { + "type": "object", + "description": "Policy parameter with server-generated fields (used in responses)", + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Human-readable name of the policy parameter" + }, + "type": { + "type": "string", + "description": "Type of the policy parameter" + }, + "position": { + "type": "integer", + "description": "Position of the policy parameter" + }, + "max": { + "type": "integer", + "description": "Maximum number of values" + }, + "created_at": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the creation" + }, + "updated_at": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the last update" + } + }, + "required": ["id", "name", "type", "position", "max", "created_at", "updated_at"] + }, + "RegisterCredentialRequest": { + "type": "object", + "required": ["credential_type_id", "identity_id"], + "properties": { + "credential_type_id": { + "$ref": "#/components/schemas/Id" + }, + "credential_data": { + "description": "Required when the credential type is linked to a data schema (JSON object or array per data schema)" + }, + "external_unique_id": { + "type": "string", + "description": "External unique identifier for the credential" + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp of the credential" + }, + "identity_id": { + "$ref": "#/components/schemas/Id" + } + } + }, + "RegisterCredentialTypeRequest": { + "type": "object", + "required": ["registry_id", "title", "credential_type"], + "properties": { + "registry_id": { + "$ref": "#/components/schemas/Id" + }, + "title": { + "type": "string", + "description": "Human-readable title of the credential type" + }, + "description": { + "type": "string", + "description": "Human-readable description of the credential type" + }, + "credential_type": { + "type": "string", + "description": "Type of the credential (e.g., \"common.KYC\")" + }, + "data_schema_id": { + "$ref": "#/components/schemas/Id", + "description": "Optional shared or org-scoped data schema used to validate credential payload data" + } + } + }, + "RegisterOnchainTargetRequest": { + "type": "object", + "required": ["chain_selector", "address"], + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EthAddress" + } + } + }, + "RegisterPolicyImplementationRequest": { + "type": "object", + "required": ["name", "description", "policy_config_schema"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the policy implementation" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy implementation" + }, + "policy_config_schema": { + "$ref": "#/components/schemas/PolicyConfigSchema" + }, + "onchain_policy_implementations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyImplementation" + } + } + } + }, + "RegisterTargetRequest": { + "type": "object", + "required": ["title", "policy_engine_id"], + "properties": { + "title": { + "type": "string", + "description": "Human-readable title of the target" + }, + "description": { + "type": "string", + "description": "Human-readable description of the target" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id" + }, + "protected_methods": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Protected methods of the target" + }, + "onchain_targets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegisterOnchainTargetRequest" + } + }, + "desired_default_allow": { + "type": "boolean", + "description": "Whether to allow transactions by default if no policy explicitly returns an Allow or Reject. Defaults to true.", + "default": true + }, + "metadata": { + "type": "object", + "description": "JSON metadata associated with the target", + "additionalProperties": true + } + } + }, + "Registry": { + "type": "object", + "required": ["id", "name", "description", "org_id", "created_at", "updated_at", "chain_selectors", "mode"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "name": { + "type": "string", + "description": "Name of the registry" + }, + "description": { + "type": "string", + "description": "Description of the registry" + }, + "org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "identity_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityRegistry" + }, + "description": "List of identity registries associated with this registry" + }, + "credential_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialRegistry" + }, + "description": "List of credential registries associated with this registry" + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "mode": { + "$ref": "#/components/schemas/RegistryMode" + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + }, + "access_type": { + "type": "string", + "enum": ["owned", "granted"], + "description": "Whether the caller owns this registry or has been granted access by another org. Only present when the caller is a grantee or when include_granted=true is used on the list endpoint.", + "nullable": true + } + } + }, + "RegistryAccessGrant": { + "type": "object", + "required": ["id", "grantee_org_id", "grantor_org_id", "status", "granted_at"], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "grantee_org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "grantor_org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "status": { + "type": "string", + "enum": ["active", "revoked"], + "description": "Current status of the access grant" + }, + "granted_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when the grant was created" + }, + "revoked_at": { + "type": "integer", + "format": "int64", + "nullable": true, + "description": "Unix timestamp when the grant was revoked, null if still active" + } + } + }, + "RegistryMode": { + "type": "string", + "description": "Mode of the registry", + "enum": ["managed", "read_only"] + }, + "RegistryPatchStatus": { + "type": "string", + "description": "Status for registry PATCH (archive only)", + "enum": ["archived"] + }, + "RegistryStatus": { + "type": "string", + "description": "Status of the registry", + "enum": ["creation_pending", "creation_failed", "created"] + }, + "SigningMode": { + "type": "string", + "description": "Signing mode for onchain operations.\n- delegated: ACE signs operations using a delegated key (default; existing behavior).\n- self_sign: ACE creates unsigned operation drafts; the tenant signs and finalizes directly with CREC.\nImmutable after org creation.\n", + "enum": ["delegated", "self_sign"] + }, + "Target": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "title": { + "type": "string", + "description": "Human-readable title of the target" + }, + "description": { + "type": "string", + "description": "Human-readable description of the target" + }, + "policy_engine_id": { + "$ref": "#/components/schemas/Id" + }, + "protected_methods": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Protected methods of the target" + }, + "onchain_targets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainTarget" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "desired_default_allow": { + "type": "boolean", + "description": "Whether to allow transactions by default if no policy explicitly returns an Allow or Reject. Defaults to true.", + "default": true + }, + "metadata": { + "type": "object", + "description": "JSON metadata associated with the target", + "additionalProperties": true + }, + "archived_at": { + "type": "integer", + "format": "int64", + "nullable": true, + "description": "Unix timestamp when archived; null if not archived" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "owner_org_id": { + "$ref": "#/components/schemas/OrgId", + "description": "Owning organization. Present when include_granted=true; for granted targets this is the grantor org." + }, + "access_type": { + "type": "string", + "enum": ["owned", "granted"], + "description": "Whether the caller owns this target or has been granted evaluation access. Only present when include_granted=true." + } + }, + "required": [ + "id", + "title", + "description", + "policy_engine_id", + "protected_methods", + "desired_default_allow", + "chain_selectors", + "created_at", + "updated_at" + ] + }, + "TargetPatchStatus": { + "type": "string", + "description": "Status for target PATCH (archive only)", + "enum": ["archived"] + }, + "TargetProtection": { + "type": "object", + "required": [ + "id", + "function_selector", + "target_id", + "policy_instance_id", + "chain_selectors", + "extractor_output_ids", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "function_signature": { + "type": "string", + "description": "Function signature of the target protection" + }, + "function_selector": { + "type": "string", + "description": "Function selector of the target protection" + }, + "target_id": { + "$ref": "#/components/schemas/Id" + }, + "policy_instance_id": { + "$ref": "#/components/schemas/Id" + }, + "desired_position": { + "type": "integer", + "description": "Desired position of the target protection" + }, + "onchain_target_protections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainTargetProtection" + } + }, + "chain_selectors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + "extractor_output_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Id" + } + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if not archived)", + "nullable": true + } + } + }, + "TargetProtectionPatchStatus": { + "type": "string", + "description": "Status for target protection PATCH (archive only)", + "enum": ["archived"] + }, + "TargetProtectionStatus": { + "type": "string", + "description": "Status of the target protection", + "enum": ["creation_pending", "creation_failed", "created", "removal_pending", "removal_failed", "removed"] + }, + "UpdateCredentialRequest": { + "type": "object", + "required": ["external_unique_id"], + "properties": { + "external_unique_id": { + "type": "string", + "description": "External unique identifier for the credential" + }, + "expires_at": { + "type": "integer", + "format": "int64", + "description": "Expiration timestamp of the credential" + } + } + }, + "UpdateCredentialTypeRequest": { + "type": "object", + "required": ["title"], + "properties": { + "title": { + "type": "string", + "description": "Human-readable title of the credential type" + }, + "description": { + "type": "string", + "description": "Human-readable description of the credential type" + } + } + }, + "UpdateDataValidatorRequest": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "onchain_data_validators": { + "type": "array", + "description": "On-chain deployments; each chain_selector may appear at most once", + "items": { + "$ref": "#/components/schemas/CreateOnchainDataValidatorRequest" + } + } + } + }, + "UpdateExtractorRequest": { + "type": "object", + "required": ["name", "supported_function_signatures", "outputs"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the extractor" + }, + "supported_function_signatures": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Function signatures that the extractor supports" + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtractorOutputInput" + } + }, + "onchain_extractors": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainExtractorInput" + } + } + } + }, + "UpdateIdentityRequest": { + "type": "object", + "required": ["title", "onchain_identities"], + "properties": { + "title": { + "type": "string", + "description": "Human-readable title of the identity" + }, + "description": { + "type": "string", + "description": "Description of the identity" + }, + "onchain_identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainIdentityInput" + }, + "description": "Onchain identities to register with the identity" + } + } + }, + "UpdateOffchainPolicyConfigRequest": { + "type": "object", + "required": ["config"], + "properties": { + "config": { + "type": "object", + "additionalProperties": true, + "description": "Updated policy configuration. Triggers redeployment of the workflow with the new config (CRE upserts by owner + name). The policy's deployment_status will transition to config_updating while the operation is in progress.\n" + } + } + }, + "UpdateOnchainPolicyRequest": { + "type": "object", + "properties": {} + }, + "UpdatePolicyEngineRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the policy engine" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy engine" + }, + "extractor_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Id" + } + }, + "onchain_policy_engines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyEngineInput" + } + } + }, + "required": ["name", "onchain_policy_engines"] + }, + "UpdatePolicyImplementationRequest": { + "type": "object", + "required": ["name", "description", "onchain_policy_implementations"], + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the policy implementation" + }, + "description": { + "type": "string", + "description": "Human-readable description of the policy implementation" + }, + "onchain_policy_implementations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OnchainPolicyImplementation" + } + } + } + }, + "UpdatePolicyRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Human-readable name of the policy instance" + }, + "description": { + "type": "string", + "description": "Description of the policy instance" + }, + "onchain_policies": { + "type": "array", + "description": "On-chain deployments; each chain_selector may appear at most once", + "items": { + "$ref": "#/components/schemas/CreateOnchainPolicyRequest" + } + } + } + }, + "UpdateRegistryRequest": { + "type": "object", + "required": ["name", "description"], + "properties": { + "name": { + "type": "string", + "description": "Name of the registry" + }, + "description": { + "type": "string", + "description": "Description of the registry" + }, + "identity_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateIdentityRegistryInput" + }, + "description": "List of identity registries" + }, + "credential_registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateCredentialRegistryInput" + }, + "description": "List of credential registries" + } + } + }, + "UpdateTargetProtectionRequest": { + "type": "object", + "required": ["onchain_target_protections"], + "properties": { + "onchain_target_protections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateOnchainTargetProtectionRequest" + } + } + } + }, + "UpdateTargetRequest": { + "type": "object", + "required": ["title"], + "properties": { + "owner": { + "$ref": "#/components/schemas/EthAddress" + }, + "title": { + "type": "string", + "description": "Human-readable title of the target" + }, + "description": { + "type": "string", + "description": "Human-readable description of the target" + }, + "protected_methods": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Protected methods of the target" + }, + "onchain_targets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegisterOnchainTargetRequest" + } + }, + "desired_default_allow": { + "type": "boolean", + "description": "Whether to allow transactions by default if no policy explicitly returns an Allow or Reject. When omitted, the existing value is preserved." + }, + "metadata": { + "type": "object", + "description": "JSON metadata associated with the target", + "additionalProperties": true + } + } + }, + "UpdatedAt": { + "type": "integer", + "format": "int64", + "description": "Timestamp of the last update" + }, + "UserOrganization": { + "type": "object", + "required": [ + "id", + "crec_channel_id", + "crec_channel_offset", + "signing_mode", + "mainnet_allowed", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/OrgId" + }, + "crec_channel_id": { + "$ref": "#/components/schemas/Id" + }, + "crec_channel_offset": { + "type": "integer", + "description": "Offset of the CREC channel" + }, + "signing_mode": { + "$ref": "#/components/schemas/SigningMode" + }, + "mainnet_allowed": { + "type": "boolean", + "description": "When true, the organization may use mainnet networks for on-chain resources." + }, + "archived_at": { + "type": "integer", + "format": "int64", + "description": "Unix timestamp when archived (null if active)", + "nullable": true + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "Wallet": { + "type": "object", + "required": [ + "id", + "org_id", + "chain_selector", + "owner_address", + "wallet_address", + "status", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "$ref": "#/components/schemas/Id" + }, + "org_id": { + "$ref": "#/components/schemas/OrgId" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "owner_address": { + "$ref": "#/components/schemas/EthAddress" + }, + "wallet_address": { + "$ref": "#/components/schemas/EthAddress" + }, + "status": { + "$ref": "#/components/schemas/WalletStatus" + }, + "created_at": { + "$ref": "#/components/schemas/CreatedAt" + }, + "updated_at": { + "$ref": "#/components/schemas/UpdatedAt" + } + } + }, + "WalletStatus": { + "type": "string", + "description": "Status of the wallet", + "enum": ["creation_pending", "creation_failed", "created"] + } + }, + "parameters": { + "include_onchains": { + "name": "include_onchains", + "in": "query", + "description": "Whether to include onchain entities in the response. Defaults to true.", + "required": false, + "schema": { + "type": "boolean", + "default": true + } + }, + "page": { + "name": "page", + "in": "query", + "description": "Page number", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1 + } + }, + "page_size": { + "name": "page_size", + "in": "query", + "description": "Number of items to return per page", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 10 + } + } + }, + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "API key authentication. Format: `Apikey `" + } + } + }, + "security": [ + { + "ApiKeyAuth": [] + } + ], + "tags": [ + { + "name": "Health Check" + }, + { + "name": "Organizations" + }, + { + "name": "Networks" + }, + { + "name": "Wallets" + }, + { + "name": "Registries" + }, + { + "name": "Identities" + }, + { + "name": "Credential Types" + }, + { + "name": "Credentials" + }, + { + "name": "Policy Engines" + }, + { + "name": "Extractors" + }, + { + "name": "Policy Implementations" + }, + { + "name": "Policies" + }, + { + "name": "Data Validators" + }, + { + "name": "Targets" + }, + { + "name": "Target Protections" + } + ], + "x-constants": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "address": "0x1234567890123456789012345678901234567890", + "chain_id": "42161", + "timestamp": 1700000000, + "chain_family_evm": "evm", + "eth_sepolia_name": "Ethereum Sepolia", + "eth_sepolia_chain_id": "11155111", + "eth_sepolia_chain_selector": "16015286601757825753", + "arbitrum_chain_selector": "4949039107694359620", + "error_bad_request": { + "error": "Bad request", + "message": "Invalid request parameters" + }, + "error_not_found": { + "error": "Not found", + "message": "Resource not found" + }, + "error_conflict": { + "error": "Already exists", + "message": "Resource already exists" + }, + "error_forbidden": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + }, + "policy_config_schema_example": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + } + }, + "paths": { + "/health-check": { + "get": { + "tags": ["Health Check"], + "summary": "Health check endpoint", + "security": [], + "responses": { + "200": { + "description": "Service is healthy", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthCheck" + }, + "example": { + "status": "ok" + } + } + } + } + } + } + }, + "/organizations/me": { + "get": { + "tags": ["Organizations"], + "summary": "Returns the organization the caller belongs to.", + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserOrganization" + }, + "example": { + "id": "org-123", + "crec_channel_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "crec_channel_offset": 0, + "signing_mode": "delegated", + "mainnet_allowed": false, + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + } + } + } + }, + "/policy-engines": { + "get": { + "tags": ["Policy Engines"], + "summary": "Lists all policy engines.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPolicyEnginesResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Engine A", + "description": "Description for Policy Engine A", + "type": "standard", + "chain_selectors": ["16015286601757825753"], + "onchain_policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "status": "created" + } + ], + "extractor_registrations": [], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Policy Engines"], + "summary": "Creates a new policy engine.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreatePolicyEngineRequest" + }, + "example": { + "name": "Policy Engine A", + "description": "Description for Policy Engine A", + "extractor_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_policy_engines": [ + { + "chain_selector": "16015286601757825753" + }, + { + "chain_selector": "4949039107694359620" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyEngine" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Engine A", + "description": "Description for Policy Engine A", + "type": "standard", + "chain_selectors": ["16015286601757825753", "4949039107694359620"], + "onchain_policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "status": "created" + } + ], + "extractor_registrations": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_extractor_registrations": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "active", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "409": { + "description": "Policy engine already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/policy-engines/{policy_engine_id}": { + "get": { + "tags": ["Policy Engines"], + "summary": "Gets a policy engine by ID.", + "parameters": [ + { + "in": "path", + "name": "policy_engine_id", + "description": "Policy engine ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyEngine" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Engine A", + "description": "Description for Policy Engine A", + "type": "standard", + "chain_selectors": ["16015286601757825753"], + "onchain_policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "status": "created" + } + ], + "extractor_registrations": [], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Policy engine not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Policy Engines"], + "summary": "Updates a policy engine. The system policy engine (type \"system\") cannot be updated; it is reserved for registry protection.", + "parameters": [ + { + "in": "path", + "name": "policy_engine_id", + "description": "Policy engine ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePolicyEngineRequest" + }, + "example": { + "name": "Policy Engine A Updated", + "description": "Updated description for Policy Engine A", + "extractor_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_policy_engines": [ + { + "chain_selector": "16015286601757825753" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyEngine" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Engine A Updated", + "description": "Updated description for Policy Engine A", + "type": "standard", + "chain_selectors": ["16015286601757825753"], + "onchain_policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "status": "created" + } + ], + "extractor_registrations": [], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy engine not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Policy Engines"], + "summary": "Archives a policy engine. Rejected if already archived, if policy instances exist that are not archived, or if this is the system policy engine reserved for registry protection.", + "parameters": [ + { + "in": "path", + "name": "policy_engine_id", + "description": "Policy engine ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchPolicyEngineRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns policy engine when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyEngine" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Engine A", + "description": "Description for Policy Engine A", + "type": "standard", + "chain_selectors": ["16015286601757825753"], + "onchain_policy_engines": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "status": "created" + } + ], + "extractor_registrations": [], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived, or policy instances exist that are not archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy engine not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/extractors": { + "get": { + "tags": ["Extractors"], + "summary": "Lists extractors.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "policy_engine_id", + "description": "Policy engine ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "function_signature", + "description": "Function signature", + "schema": { + "type": "string" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListExtractorsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Extractor A", + "org_id": "org-123", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "chain_selectors": ["16015286601757825753"], + "outputs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "account", + "type": "address", + "created_at": 1700000000, + "updated_at": 1700000000 + }, + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "amount", + "type": "uint256", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "onchain_extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Extractors"], + "summary": "Creates a new extractor.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateExtractorRequest" + }, + "example": { + "name": "Extractor A", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "outputs": [ + { + "name": "account", + "type": "address" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "onchain_extractors": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Extractor" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Extractor A", + "org_id": "org-123", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "chain_selectors": ["16015286601757825753"], + "outputs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "account", + "type": "address", + "created_at": 1700000000, + "updated_at": 1700000000 + }, + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "amount", + "type": "uint256", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "onchain_extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + } + } + } + }, + "/extractors/{extractor_id}": { + "get": { + "tags": ["Extractors"], + "summary": "Gets an extractor by ID.", + "parameters": [ + { + "in": "path", + "name": "extractor_id", + "description": "Extractor ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Extractor" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Extractor A", + "org_id": "org-123", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "chain_selectors": ["16015286601757825753"], + "outputs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "account", + "type": "address", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "onchain_extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Extractor not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Extractors"], + "summary": "Updates an extractor.", + "parameters": [ + { + "in": "path", + "name": "extractor_id", + "description": "Extractor ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateExtractorRequest" + }, + "example": { + "name": "Extractor A", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "outputs": [ + { + "name": "account", + "type": "address" + }, + { + "name": "amount", + "type": "uint256" + } + ], + "onchain_extractors": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Extractor" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Extractor A", + "org_id": "org-123", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "chain_selectors": ["16015286601757825753"], + "outputs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "account", + "type": "address", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "onchain_extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Extractor not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Extractors"], + "summary": "Archives an extractor. Rejected if already archived.", + "parameters": [ + { + "in": "path", + "name": "extractor_id", + "description": "Extractor ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchExtractorRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns extractor when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Extractor" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Extractor A", + "org_id": "org-123", + "supported_function_signatures": ["mint(address,uint256)", "burn(address,uint256)"], + "chain_selectors": ["16015286601757825753"], + "outputs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "account", + "type": "address", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "onchain_extractors": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "extractor_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Extractor not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/policy-implementations": { + "get": { + "tags": ["Policy Implementations"], + "summary": "Lists all policy implementations (onchain and offchain).", + "description": "When `policy_kind` is omitted, returns onchain implementations only (backward compatible with existing clients). Use `policy_kind=all` to return both onchain and offchain implementations merged in a single list.\n", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "policy_kind", + "description": "Filter by policy kind. Omit or set to `onchain` for onchain-only (default). Set to `offchain` for offchain-only. Set to `all` for both kinds merged.\n", + "schema": { + "type": "string", + "enum": ["onchain", "offchain", "all"] + }, + "required": false + }, + { + "in": "query", + "name": "name", + "description": "Name", + "schema": { + "type": "string" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPolicyImplementationsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "implementations": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Implementation A", + "description": "Description for Policy Implementation A", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "chain_selectors": ["16015286601757825753"], + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "parameters": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Account", + "type": "address", + "position": 0, + "max": -1, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Policy Implementations"], + "summary": "Register a custom policy implementation.", + "description": "Registers a new policy implementation by supplying its name, description, on-chain addresses, and a policy_config_schema that declares the policy's configurable parameters.\n\nThe policy_config_schema is a JSON Schema document (draft-07) extended with ACE-specific fields:\n- **properties** — one entry per configurable parameter (e.g. an allowlist or a threshold). Each entry requires type, description, and a metadata block.\n- **metadata.on_chain_operations** — maps each type of config change (add, remove, replace) to a Solidity setter function. Copy the function_abi from your contract's JSON ABI build artifact.\n- **policy_run_parameters** — transaction values extracted by the policy engine and passed to the contract's run() function at enforcement time. Use [] if none.\n- **initial_configs** — ordered list of parameter names that must be set at deploy time (matching the configure() argument order). Use [] if none.\n- **$schema**, **type**, **additionalProperties** — always the fixed values shown in the example below.\n", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterPolicyImplementationRequest" + }, + "example": { + "name": "Allow Policy", + "description": "Maintains an allowlist. Rejects the transaction if any checked address is not on the list.", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "display_hints": { + "network_behaviour": "apply_per_chain", + "title": "Allowed addresses" + }, + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyImplementation" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Implementation A", + "description": "Description for Policy Implementation A", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "chain_selectors": ["16015286601757825753"], + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "parameters": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Account", + "type": "address", + "position": 0, + "max": -1, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "409": { + "description": "Policy implementation already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/policy-implementations/{policy_implementation_id}": { + "get": { + "tags": ["Policy Implementations"], + "summary": "Gets a policy implementation by ID.", + "parameters": [ + { + "in": "path", + "name": "policy_implementation_id", + "description": "Policy implementation ID", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnyPolicyImplementationResponse" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Implementation A", + "description": "Description for Policy Implementation A", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "chain_selectors": ["16015286601757825753"], + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "parameters": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Account", + "type": "address", + "position": 0, + "max": -1, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Policy implementation not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Policy Implementations"], + "summary": "Archives a policy implementation. Rejected if policy instances exist.", + "parameters": [ + { + "in": "path", + "name": "policy_implementation_id", + "description": "Policy implementation ID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchPolicyImplementationRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns policy implementation when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyImplementation" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Implementation A", + "description": "Description for Policy Implementation A", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "chain_selectors": ["16015286601757825753"], + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "parameters": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Account", + "type": "address", + "position": 0, + "max": -1, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy implementation not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot archive - policy instances exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + }, + "put": { + "tags": ["Policy Implementations"], + "summary": "Update a policy implementation", + "parameters": [ + { + "in": "path", + "name": "policy_implementation_id", + "description": "Policy implementation ID", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePolicyImplementationRequest" + }, + "example": { + "name": "Policy Implementation A", + "description": "Updated description for Policy Implementation A", + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyImplementation" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy Implementation A", + "description": "Updated description for Policy Implementation A", + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "allowlist": { + "type": "array", + "description": "Ethereum addresses permitted to send transactions protected by this policy.", + "items": { + "type": "object", + "properties": { + "address": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address to allow." + } + }, + "required": ["address"] + }, + "metadata": { + "primary_key_fields": ["address"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "allowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + }, + { + "type": "remove", + "function_abi": { + "name": "disallowAddress", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { + "name": "address", + "type": "address" + } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { + "name": "Account", + "type": "address", + "max": -1 + } + ], + "initial_configs": [] + }, + "chain_selectors": ["16015286601757825753"], + "onchain_policy_implementations": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "parameters": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Account", + "type": "address", + "position": 0, + "max": -1, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy implementation not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/targets": { + "get": { + "tags": ["Targets"], + "summary": "Lists all targets.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "policy_engine_id", + "description": "Policy Engine ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "search", + "description": "Search by target title or onchain address", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "chain_selector", + "description": "Filter by chain selector", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "include_granted", + "description": "When true, include targets owned by other orgs that granted evaluation access to the caller.", + "schema": { + "type": "boolean", + "default": false + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTargetsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Targets"], + "summary": "Registers a new target. Cannot reference the system policy engine (type \"system\"); that engine is reserved for registry protection.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterTargetRequest" + }, + "example": { + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Target" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "409": { + "description": "Target already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/targets/{target_id}": { + "get": { + "tags": ["Targets"], + "summary": "Gets a target by ID.", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Target" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Target not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Targets"], + "summary": "Updates a target. Rejected if the target uses the system policy engine (registry targets are managed internally).", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTargetRequest" + }, + "example": { + "title": "Target A Updated", + "description": "Updated description for Target A", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + "mint(address,uint256)" + ], + "desired_default_allow": true, + "metadata": {}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Target" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A Updated", + "description": "Updated description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + "mint(address,uint256)" + ], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Target not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Targets"], + "summary": "Archives a target. Rejected if policy target protections exist that are not archived, or if the target uses the system policy engine.", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchTargetRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns target when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Target" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Target not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot archive - policy target protections exist that are not archived", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/targets/{target_id}/merge": { + "post": { + "tags": ["Targets"], + "summary": "Merges source targets into this target by transferring their onchain targets and archiving the sources. The targets must belong to the same policy engine and must not have onchain targets on the same chain. The source targets will be archived after the merge.", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Destination Target ID (the target that will receive the onchain targets)", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MergeTargetRequest" + }, + "example": { + "source_target_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Target" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Target A", + "description": "Description for Target A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "protected_methods": ["transfer(address,uint256)", "transferFrom(address,address,uint256)"], + "desired_default_allow": true, + "metadata": {}, + "chain_selectors": ["16015286601757825753"], + "onchain_targets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "default_allow": true + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. archived target, system engine, same target)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Source or destination target not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot merge", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/targets/{target_id}/protections": { + "get": { + "tags": ["Target Protections"], + "summary": "Lists all protections for a target.", + "description": "Returns onchain target protections only. Offchain (CADV) protections created via POST /targets/{target_id}/protections with `policy_kind` `\"offchain\"` are managed under the offchain policy and are listed via GET /policies/{policy_id}/protections instead.\n", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "function_signature", + "description": "Function signature", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "policy_instance_id", + "description": "Policy instance ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "status", + "description": "Onchain target protection status", + "schema": { + "$ref": "#/components/schemas/TargetProtectionStatus" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTargetProtectionsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "function_signature": "transfer(address,uint256)", + "function_selector": "0xa9059cbb", + "target_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "chain_selectors": ["16015286601757825753"], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "position": 1, + "status": "created" + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Target Protections"], + "summary": "Creates a new target protection (onchain or offchain). Rejected if the target uses the system policy engine (registry protections are managed internally).", + "description": "Set `policy_instance_id` to the policy ID to protect. For onchain policies this is the onchain policy instance ID (`policy_kind` may be omitted). For offchain (CADV) policies this is the offchain policy ID and `policy_kind` must be `\"offchain\"`. Onchain protections return 200; offchain protection attachment is queued and returns 202.\n", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTargetProtectionRequest" + }, + "examples": { + "onchain": { + "summary": "Onchain policy protection", + "value": { + "function_signature": "transfer(address,uint256)", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "onchain_target_protections": [ + { + "chain_selector": "16015286601757825753" + } + ], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"] + } + }, + "offchain": { + "summary": "Offchain (CADV) policy protection", + "value": { + "function_signature": "transfer(address,uint256)", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_kind": "offchain", + "desired_position": 0, + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"] + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Onchain protection created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetProtection" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "function_signature": "transfer(address,uint256)", + "function_selector": "0xa9059cbb", + "target_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "chain_selectors": ["16015286601757825753"], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "position": 1, + "status": "created" + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "202": { + "description": "Offchain protection attachment accepted (async)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OffchainPolicyProtectionResponse" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Target or policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Conflict - target protection with same policy, target, and function selector already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/targets/{target_id}/protections/{protection_id}": { + "get": { + "tags": ["Target Protections"], + "summary": "Gets a specific protection on a target.", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + }, + { + "in": "path", + "name": "protection_id", + "description": "Protection ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetProtection" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "function_signature": "transfer(address,uint256)", + "function_selector": "0xa9059cbb", + "target_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "chain_selectors": ["16015286601757825753"], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "position": 1, + "status": "created" + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Target or protection not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Target Protections"], + "summary": "Updates a target protection. Rejected if the target uses the system policy engine.", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + }, + { + "in": "path", + "name": "protection_id", + "description": "Protection ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTargetProtectionRequest" + }, + "example": { + "onchain_target_protections": [ + { + "chain_selector": "16015286601757825753" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetProtection" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "function_signature": "transfer(address,uint256)", + "function_selector": "0xa9059cbb", + "target_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "chain_selectors": ["16015286601757825753"], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "position": 1, + "status": "created" + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. target protection already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Target or protection not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Target Protections"], + "summary": "Archives a target protection.", + "description": "Pass status=archived to archive. Only archives when all onchain target protections\nhave been removed from chain. If onchain protections still exist, triggers removal\nand archives when all are removed (async).\nRejected if the target uses the system policy engine (registry protections are managed internally).\n", + "parameters": [ + { + "in": "path", + "name": "target_id", + "description": "Target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + }, + { + "in": "path", + "name": "protection_id", + "description": "Protection ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchTargetProtectionRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns archived target protection.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetProtection" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "function_signature": "transfer(address,uint256)", + "function_selector": "0xa9059cbb", + "target_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_instance_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "desired_position": 1, + "chain_selectors": ["16015286601757825753"], + "extractor_output_ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6"], + "onchain_target_protections": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "position": 1, + "status": "created" + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. status must be archived, already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Target or protection not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/policies": { + "get": { + "tags": ["Policies"], + "summary": "Lists all policies (onchain and offchain).", + "description": "When `policy_kind` is omitted, returns onchain policies only with standard DB pagination (backward compatible with existing clients). Use `policy_kind=all` to return both onchain and offchain policies merged in a single list. Onchain-only query filters (e.g. `target_id`, `policy_engine_id`) exclude offchain policies from merged results.\n", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "policy_kind", + "description": "Filter by policy kind. Omit or set to `onchain` for onchain-only (default). Set to `offchain` for offchain-only. Set to `all` for both kinds merged.\n", + "schema": { + "type": "string", + "enum": ["onchain", "offchain", "all"] + }, + "required": false + }, + { + "in": "query", + "name": "target_id", + "description": "Filter by target ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "status", + "description": "Filter by policy status", + "schema": { + "$ref": "#/components/schemas/OnchainPolicyInstanceStatus" + }, + "required": false + }, + { + "in": "query", + "name": "name", + "description": "Name", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "only_with_active_protections", + "description": "Only return policies with active protections", + "schema": { + "type": "boolean", + "default": false + }, + "required": false + }, + { + "in": "query", + "name": "target_address", + "description": "Filter by target contract address", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "policy_engine_id", + "description": "Policy engine ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "policy_implementation_id", + "description": "Filter by policy implementation ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListPoliciesResponse" + }, + "example": { + "total": 2, + "total_pages": 1, + "page": 1, + "policies": [ + { + "policy_kind": "onchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_implementation_name": "Policy Implementation A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + }, + { + "policy_kind": "offchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "wallet_risk_scoring", + "name": "Transaction wallet screening", + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [{ "category": "Sanctions", "threshold": "LOW" }] + }, + "chain_selectors": ["16015286601757825753"], + "deployment_status": "active", + "created_at": "2024-01-01T00:00:00Z" + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Policies"], + "summary": "Creates a new policy (onchain or offchain). Use `policy_kind` to select the type. Policies cannot attach to the system policy engine (type \"system\"); that engine is reserved for registry protection.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAnyPolicyRequest" + }, + "examples": { + "onchain": { + "summary": "Create an onchain policy", + "value": { + "policy_kind": "onchain", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_policies": [ + { + "chain_selector": "16015286601757825753", + "initial_config": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ] + } + }, + "offchain": { + "summary": "Create an offchain policy", + "value": { + "policy_kind": "offchain", + "type": "wallet_risk_scoring", + "name": "Transaction wallet screening", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_policies": [ + { + "chain_selector": "16015286601757825753" + } + ], + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [{ "category": "Sanctions", "threshold": "LOW" }] + } + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnyPolicyResponse" + }, + "examples": { + "onchain": { + "summary": "Onchain policy created", + "value": { + "policy_kind": "onchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + }, + "offchain": { + "summary": "Offchain policy created", + "value": { + "policy_kind": "offchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "wallet_risk_scoring", + "name": "Transaction wallet screening", + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [{ "category": "Sanctions", "threshold": "LOW" }] + }, + "action_validators": [ + { + "chain_selector": "16015286601757825753", + "validator_address": "" + } + ], + "deployment_status": "pending", + "created_at": "2024-01-01T00:00:00Z" + } + } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy implementation or policy engine not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Conflict (e.g. active offchain policy already exists for this org)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}": { + "get": { + "tags": ["Policies"], + "summary": "Gets a policy by ID (onchain or offchain).", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "description": "Policy ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnyPolicyResponse" + }, + "examples": { + "onchain": { + "summary": "Onchain policy", + "value": { + "policy_kind": "onchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + }, + "offchain": { + "summary": "Offchain policy", + "value": { + "policy_kind": "offchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "type": "wallet_risk_scoring", + "name": "Transaction wallet screening", + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [{ "category": "Sanctions", "threshold": "LOW" }] + }, + "chain_selectors": ["16015286601757825753"], + "deployment_status": "active", + "created_at": "2024-01-01T00:00:00Z" + } + } + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Policies"], + "summary": "Updates a policy. Rejected if the policy is on the system policy engine reserved for registry protection.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "description": "Policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdatePolicyRequest" + }, + "example": { + "name": "Policy A Updated", + "description": "Updated description for Policy A", + "onchain_policies": [ + { + "chain_selector": "16015286601757825753" + }, + { + "chain_selector": "4949039107694359620" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A Updated", + "description": "Updated description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_implementation_name": "Policy Implementation A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753", "4949039107694359620"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "400": { + "description": "Bad request (e.g. policy already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Policies"], + "summary": "Archives a policy (onchain or offchain). For onchain policies, rejected if target protections exist that are not archived or if the policy is on the system policy engine. For offchain policies, triggers workflow undeployment.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchPolicyRequest" + }, + "examples": { + "onchain": { + "summary": "Archive an onchain policy", + "value": { + "status": "archived" + } + }, + "offchain": { + "summary": "Archive an offchain policy (triggers workflow undeployment)", + "value": { + "status": "archived", + "policy_kind": "offchain" + } + } + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns the archived policy.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnyPolicyResponse" + }, + "examples": { + "onchain": { + "value": { + "policy_kind": "onchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": 1700000000 + } + }, + "offchain": { + "value": { + "policy_kind": "offchain", + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Transaction wallet screening", + "type": "wallet_risk_scoring", + "action_validators": [ + { + "chain_selector": "16015286601757825753", + "validator_address": "0x1234567890123456789012345678901234567890" + } + ], + "deployment_status": "removing", + "created_at": 1700000000 + } + } + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot archive - target protections exist that are not archived", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/policies/{policy_id}/protections": { + "get": { + "tags": ["Policies"], + "summary": "List target protections for an offchain policy.", + "description": "Returns protections attached to the given offchain policy. Only applicable to offchain policies; onchain policy protections are listed via GET /targets/{target_id}/protections.\n", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Offchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListOffchainPolicyProtectionsResponse" + } + } + } + }, + "404": { + "description": "Offchain policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}/protections/{protection_id}": { + "get": { + "tags": ["Policies"], + "summary": "Get a specific offchain policy protection.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "path", + "name": "protection_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OffchainPolicyProtectionResponse" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + }, + "delete": { + "tags": ["Policies"], + "summary": "Remove an offchain policy protection (detaches validator from function on engine).", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "path", + "name": "protection_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "202": { + "description": "Protection removal accepted" + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}/config": { + "put": { + "tags": ["Policies"], + "summary": "Update the config of an offchain policy. Config is immutable once deployed; calling this endpoint triggers redeployment of the workflow with the new config (CRE upserts by owner + name). The policy's deployment_status transitions to config_updating while the operation is in progress, then back to active on success.\n", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Offchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOffchainPolicyConfigRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Config update accepted; redeployment queued", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnyPolicyResponse" + } + } + } + }, + "400": { + "description": "Bad request (invalid config or policy not in updatable state)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}/targets/{target_id}/access-grants": { + "get": { + "tags": ["Policies"], + "summary": "List evaluation access grants for an offchain policy and target pair.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Offchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "name": "target_id", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListRegistryAccessGrantsResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": ["Policies"], + "summary": "Grant another organization evaluation access for an offchain policy on a target.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Offchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "name": "target_id", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRegistryAccessGrantRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Grant created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistryAccessGrant" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "409": { + "description": "Active grant already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}/targets/{target_id}/access-grants/{grantee_org_id}": { + "patch": { + "tags": ["Policies"], + "summary": "Revoke evaluation access for a grantee organization.", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "required": true, + "description": "Offchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "name": "target_id", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "name": "grantee_org_id", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/OrgId" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchRegistryAccessGrantRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Grant revoked", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistryAccessGrant" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/policies/{policy_id}/onchain/{onchain_policy_id}": { + "put": { + "tags": ["Policies"], + "summary": "Updates states of an onchain policy.", + "description": "This endpoint triggers a re-sync of the onchain policy state. The request body is empty.\n", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "description": "Policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + }, + { + "in": "path", + "name": "onchain_policy_id", + "description": "Onchain policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOnchainPolicyRequest" + }, + "example": {} + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OnchainPolicyInstance" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "1", + "out_of_sync": false, + "status": "created" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy or onchain policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/policies/{policy_id}/configs": { + "patch": { + "tags": ["Policies"], + "summary": "Updates policy configurations with JSON patches.", + "description": "Applies [JSON Patch (RFC 6902)](https://jsonpatch.com/) operations\nto the policy's configuration.\n", + "parameters": [ + { + "in": "path", + "name": "policy_id", + "description": "Policy ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchPolicyConfigsRequest" + }, + "example": { + "patches": [ + { + "op": "add", + "path": "/allowList/-", + "value": "0x1234567890123456789012345678901234567890" + }, + { + "op": "remove", + "path": "/allowList/0" + } + ], + "apply_onchain_policies": [ + { + "chain_selector": "16015286601757825753", + "current_policy_config_version": "1" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Policy" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Policy A", + "description": "Description for Policy A", + "policy_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "policy_implementation_name": "Policy Implementation A", + "policy_engine_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": { + "allowList": ["0x1234567890123456789012345678901234567890"] + } + } + ], + "onchain_policies": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_config_version": "2", + "out_of_sync": false, + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/data-validators": { + "get": { + "tags": ["Data Validators"], + "summary": "Lists all data validator instances.", + "description": "Optional filters combine with AND semantics. Use `chain_selector` and/or `address` to narrow\nlist to instances that have a matching on-chain deployment row.\n", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "status", + "description": "Filters instances that have an on-chain deployment in this status", + "schema": { + "$ref": "#/components/schemas/OnchainDataValidatorInstanceStatus" + }, + "required": false + }, + { + "in": "query", + "name": "name", + "description": "Name (case-insensitive substring)", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "data_validator_implementation_id", + "description": "Data validator implementation ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": false + }, + { + "in": "query", + "name": "chain_selector", + "description": "When set, only instances that have an on-chain deployment on this CCIP chain selector are returned", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + }, + "required": false + }, + { + "in": "query", + "name": "address", + "description": "When set, only instances that have an on-chain deployment at this contract address are returned (case-insensitive match)", + "schema": { + "$ref": "#/components/schemas/EthAddress" + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListDataValidatorsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "0", + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Data Validators"], + "summary": "Creates a new data validator instance.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDataValidatorRequest" + }, + "example": { + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_data_validators": [ + { + "chain_selector": "16015286601757825753", + "initial_config": {} + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataValidator" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "0", + "status": "creation_pending" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Data validator implementation not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/data-validators/{data_validator_id}": { + "get": { + "tags": ["Data Validators"], + "summary": "Gets a data validator instance by ID.", + "parameters": [ + { + "in": "path", + "name": "data_validator_id", + "required": true, + "description": "Data validator instance ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataValidator" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "0", + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "404": { + "description": "Data validator instance not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Data Validators"], + "summary": "Updates a data validator instance.", + "parameters": [ + { + "in": "path", + "name": "data_validator_id", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateDataValidatorRequest" + }, + "example": { + "name": "Data Validator A Updated", + "description": "Updated description", + "onchain_data_validators": [ + { + "chain_selector": "16015286601757825753", + "initial_config": {} + }, + { + "chain_selector": "4949039107694359620", + "initial_config": {} + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataValidator" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A Updated", + "description": "Updated description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753", "4949039107694359620"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "0", + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Data validator instance not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Data Validators"], + "summary": "Archives a data validator instance.", + "parameters": [ + { + "in": "path", + "name": "data_validator_id", + "required": true, + "description": "Data validator instance ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchDataValidatorRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns the instance when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataValidator" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "0", + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Data validator instance not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot archive while on-chain deployment is being created or configuration change is in flight", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/data-validators/{data_validator_id}/configs": { + "patch": { + "tags": ["Data Validators"], + "summary": "Updates data validator configuration using JSON Patch.", + "description": "Applies [JSON Patch (RFC 6902)](https://jsonpatch.com/) operations to the instance configuration.\nUse `on_chains` to select deployments and supply `current_config_version` per chain (optimistic concurrency).\n", + "parameters": [ + { + "in": "path", + "name": "data_validator_id", + "description": "Data validator instance ID", + "schema": { + "$ref": "#/components/schemas/Id" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchDataValidatorConfigsRequest" + }, + "example": { + "patches": [ + { + "op": "add", + "path": "/someKey/-", + "value": "example" + } + ], + "on_chains": [ + { + "chain_selector": "16015286601757825753", + "current_config_version": "0" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataValidator" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Data Validator A", + "description": "Description", + "data_validator_implementation_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_configs": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "config_json": {} + } + ], + "onchain_data_validators": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "data_validator_config_version": "1", + "status": "created" + } + ], + "ongoing_config_changes": [], + "archived_at": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Data validator instance not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Configuration change rejected (version mismatch, instance not created, or ongoing change in flight)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/registries": { + "get": { + "tags": ["Registries"], + "summary": "Lists all registries.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "type", + "required": false, + "description": "Type of registry. Can be \"pair\", \"identity\", or \"credential\". Defaults to \"pair\".", + "schema": { + "type": "string", + "enum": ["pair", "identity", "credential"], + "default": "pair" + } + }, + { + "in": "query", + "name": "include_granted", + "required": false, + "description": "When true, includes registries that other orgs have granted access to the caller, in addition to owned registries. Each registry in the response will have an access_type field (\"owned\" or \"granted\").", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListRegistriesResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Registry A", + "description": "Description for Registry A", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753"], + "identity_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "credential_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Registries"], + "summary": "Creates a new registry with identity and credential registries.", + "description": "The address field is optional. If omitted, the registry will be deployed on-chain,\nits status will be \"creation_pending\" until created, and the mode will be `managed`. The possible modes are `managed` - when no address is provided - and `read_only` - when an address is passed - this mode does not allow any write changes to the registry like adding identities or credentials.\n", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRegistryRequest" + }, + "example": { + "name": "Registry A", + "description": "Description for Registry A", + "identity_registries": [ + { + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "credential_registries": [ + { + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Registry" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Registry A", + "description": "Description for Registry A", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753"], + "identity_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "credential_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "409": { + "description": "Registry already exists or conflict with existing registries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/registries/{registry_id}": { + "get": { + "tags": ["Registries"], + "summary": "Gets a registry by ID.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "query", + "name": "type", + "required": false, + "description": "Type of registry. Can be \"pair\", \"identity\", or \"credential\". Defaults to \"pair\".", + "schema": { + "type": "string", + "enum": ["pair", "identity", "credential"], + "default": "pair" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Registry" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Registry A", + "description": "Description for Registry A", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753"], + "identity_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "credential_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "403": { + "description": "Access denied — caller does not own this registry and has no active access grant (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "put": { + "tags": ["Registries"], + "summary": "Updates a registry with identity and credential registries.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateRegistryRequest" + }, + "example": { + "name": "Registry A", + "description": "Description for Registry A", + "identity_registries": [ + { + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + }, + { + "name": "Identity Registry on Chain B", + "description": "Description for identity registry on Chain B", + "chain_selector": "4949039107694359620", + "address": "0x1234567890123456789012345678901234567890" + } + ], + "credential_registries": [ + { + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + }, + { + "name": "Credential Registry on Chain B", + "description": "Description for credential registry on Chain B", + "chain_selector": "4949039107694359620", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Registry" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Registry A", + "description": "Description for Registry A", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753", "4949039107694359620"], + "identity_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + }, + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain B", + "description": "Description for identity registry on Chain B", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "4949039107694359620", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "credential_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + }, + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain B", + "description": "Description for credential registry on Chain B", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "4949039107694359620", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. registry already archived, cannot remove registry pairs - only adding new pairs is allowed)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Registry not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Conflict with existing registries", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + }, + "patch": { + "tags": ["Registries"], + "summary": "Archives a registry. Rejected if identities exist.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchRegistryRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns registry when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Registry" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Registry A", + "description": "Description for Registry A", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753"], + "identity_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Identity Registry on Chain A", + "description": "Description for identity registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "credential_registries": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Credential Registry on Chain A", + "description": "Description for credential registry on Chain A", + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. already archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Registry not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Cannot archive - identities exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/registries/{registry_id}/access-grants": { + "get": { + "tags": ["Registries"], + "summary": "Lists all access grants for a registry. Requires registry ownership.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListRegistryAccessGrantsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "access_grants": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1700000000, + "revoked_at": null + } + ] + } + } + } + }, + "403": { + "description": "Caller does not own the registry (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "post": { + "tags": ["Registries"], + "summary": "Grants registry access to another organization. Requires registry ownership.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateRegistryAccessGrantRequest" + }, + "example": { + "grantee_org_id": "org-456" + } + } + } + }, + "responses": { + "201": { + "description": "Access grant created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistryAccessGrant" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1700000000, + "revoked_at": null + } + } + } + }, + "400": { + "description": "Bad request (e.g. grantee_org_id missing or invalid)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "403": { + "description": "Caller does not own the registry (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + }, + "409": { + "description": "An active grant for this grantee already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/registries/{registry_id}/access-grants/{grantee_org_id}": { + "patch": { + "tags": ["Registries"], + "summary": "Revokes registry access for a grantee organization. Requires registry ownership.", + "parameters": [ + { + "in": "path", + "name": "registry_id", + "required": true, + "description": "Registry ID", + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "path", + "name": "grantee_org_id", + "required": true, + "description": "Grantee organization ID", + "schema": { + "$ref": "#/components/schemas/OrgId" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchRegistryAccessGrantRequest" + }, + "example": { + "status": "revoked" + } + } + } + }, + "responses": { + "200": { + "description": "Access grant updated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistryAccessGrant" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "revoked", + "granted_at": 1700000000, + "revoked_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. status value not accepted)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "403": { + "description": "Caller does not own the registry (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + }, + "404": { + "description": "No active access grant exists for the grantee (caller owns the registry)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/identities": { + "get": { + "tags": ["Identities"], + "summary": "Lists all identities.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "query", + "description": "Title of the identity, can be a substring", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "registry_id", + "description": "Filter by registry ID", + "required": false, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListIdentitiesResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to registry_id (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "post": { + "tags": ["Identities"], + "summary": "Creates a new identity.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentityRequest" + }, + "example": { + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_identities": [ + { + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753" + } + ], + "credentials": [ + { + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-123", + "expires_at": 1800000000 + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Identity" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + } + } + } + }, + "/identities/batch": { + "post": { + "tags": ["Identities"], + "summary": "Creates multiple identities in a batch operation.", + "description": "Creates multiple identities at once. If any identity fails validation or creation, the entire batch fails.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentitiesBatchRequest" + }, + "example": { + "identities": [ + { + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_identities": [ + { + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753" + } + ] + }, + { + "title": "Identity B", + "description": "Description for Identity B", + "entity_id": "0987654321", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "onchain_identities": [ + { + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753" + } + ] + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentitiesBatchResponse" + }, + "example": { + "results": [ + { + "status": "created", + "identity": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + }, + { + "status": "failed", + "error": "Identity already exists" + } + ] + } + } + } + }, + "400": { + "description": "Bad request - validation failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "409": { + "description": "Conflict - one or more identities already exist", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/identities/{identity_id}": { + "get": { + "tags": ["Identities"], + "summary": "Gets an identity by identity ID.", + "parameters": [ + { + "in": "path", + "name": "identity_id", + "description": "Identity ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Identity" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to the identity's registry (including when the identity id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "patch": { + "tags": ["Identities"], + "summary": "Update or archive an identity.", + "description": "Pass status=archived to archive, OR title/description/onchain_identities to update.\nMutually exclusive - if status is passed, update fields must not be passed (400).\nIf identity is already archived and status is passed, returns 400.\nIf identity is archived and update fields are passed, returns 400.\n", + "parameters": [ + { + "in": "path", + "name": "identity_id", + "description": "Identity ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchIdentityRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns identity when update fields are used; identity when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Identity" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A", + "description": "Description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Identity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "put": { + "tags": ["Identities"], + "summary": "Updates an identity.", + "description": "Returns 400 if identity is archived.", + "parameters": [ + { + "in": "path", + "name": "identity_id", + "description": "Identity ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateIdentityRequest" + }, + "example": { + "title": "Identity A Updated", + "description": "Updated description for Identity A", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890" + }, + { + "chain_selector": "4949039107694359620", + "address": "0x1234567890123456789012345678901234567890" + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Identity" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Identity A Updated", + "description": "Updated description for Identity A", + "entity_id": "1234567890", + "ccid": "0x1234567890123456789012345678901234567890", + "registryId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753", "4949039107694359620"], + "onchain_identities": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request (e.g. identity is archived)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Identity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/credential-types": { + "get": { + "tags": ["Credential Types"], + "summary": "Lists all credential types.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "in": "query", + "name": "registry_id", + "description": "Registry ID", + "required": false, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListCredentialTypesResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "credential_types": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A", + "description": "Description for Credential Type A", + "credential_type": "common.KYC", + "credential_type_hash": "0x1234567890123456789012345678901234567890", + "chain_selectors": ["16015286601757825753"], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to registry_id (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "post": { + "tags": ["Credential Types"], + "summary": "Register a credential type.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterCredentialTypeRequest" + }, + "example": { + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A", + "description": "Description for Credential Type A", + "credential_type": "common.KYC" + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A", + "description": "Description for Credential Type A", + "credential_type": "common.KYC", + "credential_type_hash": "0x1234567890123456789012345678901234567890", + "chain_selectors": ["16015286601757825753"], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "409": { + "description": "Credential type already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/credential-types/{credential_type_id}": { + "get": { + "tags": ["Credential Types"], + "summary": "Gets a credential type by its ID.", + "parameters": [ + { + "in": "path", + "name": "credential_type_id", + "description": "Credential Type ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A", + "description": "Description for Credential Type A", + "credential_type": "common.KYC", + "credential_type_hash": "0x1234567890123456789012345678901234567890", + "chain_selectors": ["16015286601757825753"], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to the credential type's registry (including when the credential type id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "put": { + "tags": ["Credential Types"], + "summary": "Update credential type details.", + "parameters": [ + { + "in": "path", + "name": "credential_type_id", + "description": "Credential Type ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCredentialTypeRequest" + }, + "example": { + "title": "Credential Type A Updated", + "description": "Updated description for Credential Type A" + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A Updated", + "description": "Updated description for Credential Type A", + "credential_type": "common.KYC", + "credential_type_hash": "0x1234567890123456789012345678901234567890", + "chain_selectors": ["16015286601757825753"], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Credential type not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Credential Types"], + "summary": "Archive or update a credential type.", + "description": "Either status=archived to archive, OR title/description to update. Mutually exclusive.\nIf credentials exist with this credential type, archive returns 409. No onchain operations.\n", + "parameters": [ + { + "in": "path", + "name": "credential_type_id", + "description": "Credential Type ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchCredentialTypeRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns credential type when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialType" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "registry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "title": "Credential Type A", + "description": "Description for Credential Type A", + "credential_type": "common.KYC", + "credential_type_hash": "0x1234567890123456789012345678901234567890", + "chain_selectors": ["16015286601757825753"], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Credential type not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + }, + "409": { + "description": "Conflict - credentials exist with this credential type", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/credentials": { + "get": { + "tags": ["Credentials"], + "summary": "Lists all credentials.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/include_onchains" + }, + { + "in": "query", + "name": "credential_type_id", + "description": "Credential Type ID", + "required": false, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "query", + "name": "identity_id", + "description": "Identity ID", + "required": false, + "schema": { + "$ref": "#/components/schemas/Id" + } + }, + { + "in": "query", + "name": "entity_id", + "description": "Entity ID", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "registry_id", + "description": "Registry ID", + "required": false, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListCredentialsResponse" + }, + "example": { + "total": 1, + "total_pages": 1, + "page": 1, + "credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-123", + "expires_at": 1800000000, + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "created", + "expires_at": 1800000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to registry_id (including when the registry id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "post": { + "tags": ["Credentials"], + "summary": "Register a credential.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegisterCredentialRequest" + }, + "example": { + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-123", + "expires_at": 1800000000 + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-123", + "expires_at": 1800000000, + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "created", + "expires_at": 1800000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "409": { + "description": "Credential already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/credentials/{credential_id}": { + "get": { + "tags": ["Credentials"], + "summary": "Gets a credential by its ID.", + "parameters": [ + { + "in": "path", + "name": "credential_id", + "description": "Credential ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-123", + "expires_at": 1800000000, + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "created", + "expires_at": 1800000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "403": { + "description": "Access denied — caller has no read access to the credential's registry (including when the credential id is unknown)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Forbidden", + "message": "You do not have permission to access this resource" + } + } + } + } + } + }, + "put": { + "tags": ["Credentials"], + "summary": "Update credential details.", + "parameters": [ + { + "in": "path", + "name": "credential_id", + "description": "Credential ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateCredentialRequest" + }, + "example": { + "external_unique_id": "ext-credential-456", + "expires_at": 1900000000 + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-456", + "expires_at": 1900000000, + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "created", + "expires_at": 1900000000 + } + ], + "archived_at": null, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Credential not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + }, + "patch": { + "tags": ["Credentials"], + "summary": "Update or archive a credential.", + "description": "Pass status=archived to archive, OR external_unique_id/expires_at to update.\nMutually exclusive - if status is passed, update fields must not be passed (400).\nIf credential is already archived and status is passed, returns 400.\n", + "parameters": [ + { + "in": "path", + "name": "credential_id", + "description": "Credential ID", + "required": true, + "schema": { + "$ref": "#/components/schemas/Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchCredentialRequest" + }, + "example": { + "status": "archived" + } + } + } + }, + "responses": { + "202": { + "description": "Request accepted. Returns credential when update fields are used; empty body when archived.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Credential" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "credential_type_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "external_unique_id": "ext-credential-123", + "expires_at": 1800000000, + "identity_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selectors": ["16015286601757825753"], + "onchain_credentials": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "chain_selector": "16015286601757825753", + "status": "created", + "expires_at": 1800000000 + } + ], + "archived_at": 1700000000, + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "404": { + "description": "Credential not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + }, + "/wallets": { + "get": { + "tags": ["Wallets"], + "summary": "Lists all wallets.", + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListWalletsResponse" + }, + "example": { + "wallets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "chain_selector": "16015286601757825753", + "owner_address": "0x1234567890123456789012345678901234567890", + "wallet_address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + }, + "post": { + "tags": ["Wallets"], + "summary": "Creates wallets on networks.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWalletsRequest" + }, + "example": { + "wallets": [ + { + "owner_address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "address": ["0x1234567890123456789012345678901234567890"] + }, + { + "owner_address": "0x1234567890123456789012345678901234567890", + "chain_selector": "4949039107694359620", + "address": ["0x1234567890123456789012345678901234567890"] + } + ] + } + } + } + }, + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListWalletsResponse" + }, + "example": { + "wallets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "chain_selector": "16015286601757825753", + "owner_address": "0x1234567890123456789012345678901234567890", + "wallet_address": "0x1234567890123456789012345678901234567890", + "status": "created", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Bad request", + "message": "Invalid request parameters" + } + } + } + }, + "409": { + "description": "Wallet already exists for this chain selector", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Already exists", + "message": "Resource already exists" + } + } + } + } + } + } + }, + "/networks": { + "get": { + "tags": ["Networks"], + "summary": "Lists all networks.", + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/page_size" + }, + { + "in": "query", + "name": "chain_id", + "description": "Chain ID", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "chain_family", + "description": "Chain family", + "schema": { + "type": "string" + }, + "required": false + }, + { + "in": "query", + "name": "show_unavailable", + "description": "When true, lists mainnet networks too (even if the org lacks mainnet_allowed and cannot use them for on-chain operations).", + "schema": { + "type": "boolean", + "default": false + }, + "required": false + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListNetworksResponse" + }, + "example": { + "total": 3, + "total_pages": 1, + "page": 1, + "networks": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Ethereum Sepolia", + "chain_id": "11155111", + "chain_selector": "16015286601757825753", + "chain_family": "evm", + "created_at": 1700000000, + "updated_at": 1700000000 + } + ] + } + } + } + } + } + } + }, + "/networks/{chain_selector}": { + "get": { + "tags": ["Networks"], + "summary": "Gets a network by chain selector.", + "parameters": [ + { + "in": "path", + "name": "chain_selector", + "description": "Chain selector", + "required": true, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + } + ], + "responses": { + "200": { + "description": "Successful operation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Network" + }, + "example": { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "name": "Ethereum Sepolia", + "chain_id": "11155111", + "chain_selector": "16015286601757825753", + "chain_family": "evm", + "created_at": 1700000000, + "updated_at": 1700000000 + } + } + } + }, + "404": { + "description": "Network not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + }, + "example": { + "error": "Not found", + "message": "Resource not found" + } + } + } + } + } + } + } + } +} diff --git a/public/api/ace/evaluation/openapi.json b/public/api/ace/evaluation/openapi.json new file mode 100644 index 00000000000..f5fc0f5d112 --- /dev/null +++ b/public/api/ace/evaluation/openapi.json @@ -0,0 +1,329 @@ +{ + "openapi": "3.0.4", + "info": { + "title": "Chainlink ACE Evaluation API", + "version": "0.1.0", + "description": "MVP API for starting and monitoring managed offchain policy evaluations. Its interfaces and capabilities can change during Beta. Contact your Chainlink representative for help with setup. Use the same API key authentication as the ACE Coordinator API." + }, + "servers": [ + { + "url": "https://ace.api.chain.link/v1/evaluation" + } + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "tags": [ + { + "name": "Evaluation", + "description": "Request and monitor managed offchain policy permits." + }, + { + "name": "Health Check" + } + ], + "paths": { + "/evaluate": { + "post": { + "tags": ["Evaluation"], + "summary": "Start permit evaluation", + "description": "Derives a deterministic permit_id from the authenticated organization and unique_evaluation_id, starts the evaluation, and returns the same evaluation on idempotent retries.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateRequest" + }, + "example": { + "caller_address": "0x1111111111111111111111111111111111111111", + "subject": "0x2222222222222222222222222222222222222222", + "function_signature": "transfer(address,uint256)", + "parameters": { + "to": "0x3333333333333333333333333333333333333333", + "amount": "100" + }, + "permit_parameters": [ + "0x0000000000000000000000001111111111111111111111111111111111111111", + "0x0000000000000000000000003333333333333333333333333333333333333333", + "0x0000000000000000000000000000000000000000000000000000000000000064" + ], + "chain_selector": "", + "unique_evaluation_id": "transfer-018f6b3e-7c42-7a1f-a8ed-5ecf90c03b30" + } + } + } + }, + "responses": { + "200": { + "description": "Evaluation accepted or duplicate request returning existing state", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluateResponse" + } + } + } + }, + "400": { + "description": "Invalid input", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "500": { + "description": "Internal error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/evaluate/{permitId}": { + "get": { + "tags": ["Evaluation"], + "operationId": "getEvaluationByPermitId", + "summary": "Get evaluation run by permit ID", + "description": "Returns the evaluation for the authenticated organization. Returns 404 when the permit does not exist or belongs to another organization.", + "parameters": [ + { + "name": "permitId", + "in": "path", + "required": true, + "description": "Permit identifier returned by POST /evaluate.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Evaluation found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EvaluationDetailResponse" + } + } + } + }, + "400": { + "description": "Invalid permit ID", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "404": { + "description": "Permit missing or not visible to this organization", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + }, + "500": { + "description": "Internal error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorResponse" + } + } + } + } + } + } + }, + "/health-check": { + "get": { + "tags": ["Health Check"], + "summary": "Health check", + "security": [], + "responses": { + "200": { + "description": "Service is healthy", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthCheck" + }, + "example": { + "status": "ok" + } + } + } + } + } + } + } + }, + "components": { + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "API key authentication. Format: Apikey " + } + }, + "schemas": { + "EvaluateRequest": { + "type": "object", + "required": [ + "caller_address", + "subject", + "function_signature", + "parameters", + "chain_selector", + "unique_evaluation_id" + ], + "properties": { + "caller_address": { + "$ref": "#/components/schemas/EthAddress" + }, + "subject": { + "$ref": "#/components/schemas/EthAddress" + }, + "function_signature": { + "type": "string", + "description": "Canonical ABI function signature, for example transfer(address,uint256). The coordinator derives the four-byte selector from this value." + }, + "parameters": { + "type": "object", + "additionalProperties": true, + "description": "Structured function parameters stored with the evaluation as contextual data." + }, + "permit_parameters": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional ABI-encoded permit parameters as 0x-prefixed 32-byte words. ACE forwards them to the workflow for address screening and exact onchain permit binding. For transfer(address,uint256), supply [from, to, amount]." + }, + "chain_selector": { + "type": "string", + "minLength": 1, + "maxLength": 20, + "description": "Chain selector for the target and CADV deployment." + }, + "unique_evaluation_id": { + "type": "string", + "description": "Client-generated identifier unique to this evaluation intent. Reusing it within the same organization returns the existing evaluation." + } + } + }, + "EvaluateResponse": { + "type": "object", + "required": ["permit_id", "status"], + "properties": { + "permit_id": { + "type": "string", + "description": "Hex-encoded bytes32 identifier for the evaluation." + }, + "status": { + "$ref": "#/components/schemas/EvaluationRunStatus" + } + } + }, + "EvaluationDetailResponse": { + "type": "object", + "required": ["permit_id", "status"], + "properties": { + "permit_id": { + "type": "string", + "description": "Permit identifier returned by POST /evaluate." + }, + "status": { + "$ref": "#/components/schemas/EvaluationRunStatus" + }, + "reason": { + "type": "string", + "nullable": true, + "description": "Details for a rejected or failed evaluation when available." + }, + "workflow_execution_id": { + "type": "string", + "nullable": true, + "description": "CRE workflow execution identifier when available." + }, + "expires_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "Permit expiry when available. Managed wallet risk permits currently do not expire, so this is normally null." + } + } + }, + "EvaluationRunStatus": { + "type": "string", + "description": "Lifecycle status of an offchain policy evaluation.", + "enum": ["evaluating", "rejected", "approving", "error", "ready"] + }, + "EthAddress": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "Ethereum address" + }, + "ApiErrorResponse": { + "type": "object", + "required": ["error", "message"], + "properties": { + "message": { + "type": "string" + }, + "error": { + "type": "string", + "enum": ["Already exists", "Internal error", "Not found", "Bad request", "Unauthorized", "Forbidden"] + } + } + }, + "HealthCheck": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "type": "string", + "example": "ok" + } + } + } + } + } +} diff --git a/public/api/ace/reporting/openapi.json b/public/api/ace/reporting/openapi.json new file mode 100644 index 00000000000..9283517579d --- /dev/null +++ b/public/api/ace/reporting/openapi.json @@ -0,0 +1,2918 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Chainlink ACE Reporting API", + "version": "1.0.0", + "description": "Read-only API for querying onchain state, transaction history, policy configurations, identities, and credentials" + }, + "servers": [ + { + "url": "https://ace.api.chain.link/v1/reporting", + "description": "Production" + } + ], + "security": [ + { + "ApiKeyAuth": [] + } + ], + "x-constants": { + "address": "0x1234567890123456789012345678901234567890", + "eth_sepolia_chain_selector": "16015286601757825753", + "timestamp": "2024-05-17T00:00:00Z", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "bytes32": "0xaabbccdd00112233aabbccdd00112233aabbccdd00112233aabbccdd00112233", + "method_selector": "0xa9059cbb", + "hex_bytes": "0x7b226e616d65223a22416c696365227d", + "error_bad_request": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + }, + "error_not_found": { + "message": "Resource not found", + "code": "NOT_FOUND" + }, + "error_internal": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + }, + "paths": { + "/health": { + "get": { + "summary": "Health check endpoint", + "operationId": "getHealth", + "tags": ["Health Check"], + "security": [], + "responses": { + "200": { + "description": "Service is healthy", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthResponse" + }, + "example": { + "status": "ok" + } + } + } + } + } + } + }, + "/policies": { + "get": { + "summary": "List policies", + "description": "Retrieve a list of policies. Returns state as of the specified time.", + "operationId": "listPolicies", + "tags": ["Policies"], + "parameters": [ + { + "name": "as_of", + "in": "query", + "description": "Show policies active as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "policy_engine_address", + "in": "query", + "description": "Filter by policy engine address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "owner", + "in": "query", + "description": "Filter by owner address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "chain_selector", + "in": "query", + "description": "Filter by chain selector (uint64)", + "required": false, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "page_size", + "in": "query", + "description": "Number of results per page", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "description": "Token for pagination", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of policies", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyListResponse" + }, + "example": { + "policies": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "owner": "0x1234567890123456789012345678901234567890", + "name": "Policy A", + "description": "Description for Policy A", + "policy_engine_address": "0x1234567890123456789012345678901234567890", + "version": 1, + "state": null, + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ], + "next_page_token": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/policies/{chain_selector}/{address}": { + "get": { + "summary": "Get policy by chain and address", + "description": "Retrieve a specific policy by its chain selector and address at a given point in time. Returns the policy version that was active at the specified as_of time.", + "operationId": "getPolicy", + "tags": ["Policies"], + "parameters": [ + { + "name": "chain_selector", + "in": "path", + "required": true, + "description": "Chain selector where the policy is deployed", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "address", + "in": "path", + "required": true, + "description": "Policy contract address", + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "as_of", + "in": "query", + "description": "Show policy state as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Policy details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyData" + }, + "example": { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "owner": "0x1234567890123456789012345678901234567890", + "name": "Policy A", + "description": "Description for Policy A", + "policy_engine_address": "0x1234567890123456789012345678901234567890", + "version": 1, + "state": null, + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Policy not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/policies/{chain_selector}/{address}/versions/{version}": { + "get": { + "summary": "Get specific policy version", + "description": "Retrieve a specific version of a policy (version can be numeric or \"latest\")", + "operationId": "getPolicyVersion", + "tags": ["Policies"], + "parameters": [ + { + "name": "chain_selector", + "in": "path", + "required": true, + "description": "Chain selector where the policy is deployed", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "address", + "in": "path", + "required": true, + "description": "Policy contract address", + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "description": "Version number or \"latest\"", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Policy version", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PolicyData" + }, + "example": { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "owner": "0x1234567890123456789012345678901234567890", + "name": "Policy A", + "description": "Description for Policy A", + "policy_engine_address": "0x1234567890123456789012345678901234567890", + "version": 1, + "state": null, + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Policy or version not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/identities": { + "get": { + "summary": "List identities", + "description": "Retrieve a list of identities with various filters.\n- Filter by wallet address to find which identity owns it\n- Filter by identity registry to see all identities in a registry\n- Filter by credential type to find identities with specific credentials\n- Filter by credential registry to see identities with credentials from that registry\n", + "operationId": "listIdentities", + "tags": ["Identities"], + "parameters": [ + { + "name": "as_of", + "in": "query", + "description": "Show identities active as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "address", + "in": "query", + "description": "Filter by wallet address (find identity that owns this address)", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "identity_registry", + "in": "query", + "description": "Filter by identity registry address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "credential_registry", + "in": "query", + "description": "Filter by credential registry address (find identities with credentials from this registry)", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "credential_type_id", + "in": "query", + "description": "Filter by credential type ID (find identities with this credential type)", + "required": false, + "schema": { + "$ref": "#/components/schemas/Bytes32" + } + }, + { + "name": "chain_selector", + "in": "query", + "description": "Filter by chain selector", + "required": false, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "include_credential_details", + "in": "query", + "description": "Include full credential data for each identity", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "page_size", + "in": "query", + "description": "Number of results per page", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "description": "Token for pagination", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of identities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityListResponse" + }, + "example": { + "identities": [ + { + "ccid": "0xaabbccdd00112233aabbccdd00112233aabbccdd00112233aabbccdd00112233", + "registries": [ + { + "registry_address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "addresses": [ + { + "address": "0x1234567890123456789012345678901234567890", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ], + "block_timestamp": "2024-05-17T00:00:00Z", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ], + "credentials": [ + { + "credential_type_id": "0xaabbccdd00112233aabbccdd00112233aabbccdd00112233aabbccdd00112233", + "credential_registry": { + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "block_timestamp": "2024-05-17T00:00:00Z", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + }, + "expires_at": null, + "credential_data": "0x7b226e616d65223a22416c696365227d", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + ], + "next_page_token": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/identities/{ccid}": { + "get": { + "summary": "Get identity by CCID", + "description": "Retrieve a specific identity by its Cross-Chain ID (CCID).\nReturns the full identity with all registries, addresses, and optionally credentials.\n", + "operationId": "getIdentityByCCID", + "tags": ["Identities"], + "parameters": [ + { + "name": "ccid", + "in": "path", + "required": true, + "description": "Cross-Chain ID (CCID) - 66 character hex string", + "schema": { + "$ref": "#/components/schemas/Bytes32" + } + }, + { + "name": "as_of", + "in": "query", + "description": "Show identity state as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "include_credential_details", + "in": "query", + "description": "Include full credential data", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Identity details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityData" + }, + "example": { + "ccid": "0xaabbccdd00112233aabbccdd00112233aabbccdd00112233aabbccdd00112233", + "registries": [ + { + "registry_address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "addresses": [ + { + "address": "0x1234567890123456789012345678901234567890", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ], + "block_timestamp": "2024-05-17T00:00:00Z", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ], + "credentials": [ + { + "credential_type_id": "0xaabbccdd00112233aabbccdd00112233aabbccdd00112233aabbccdd00112233", + "credential_registry": { + "address": "0x1234567890123456789012345678901234567890", + "chain_selector": "16015286601757825753", + "block_timestamp": "2024-05-17T00:00:00Z", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + }, + "expires_at": null, + "credential_data": "0x7b226e616d65223a22416c696365227d", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Identity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/targets": { + "get": { + "summary": "List targets", + "description": "Retrieve a list of targets (contracts protected by policy engines).\n- Filter by policy engine address to see targets attached to a specific engine\n- Filter by chain selector to see targets on a specific chain\n- Use include_policy_details to get full policy configuration for each target\n", + "operationId": "listTargets", + "tags": ["Targets"], + "parameters": [ + { + "name": "as_of", + "in": "query", + "description": "Show targets active as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "policy_engine_address", + "in": "query", + "description": "Filter by policy engine address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "chain_selector", + "in": "query", + "description": "Filter by chain selector", + "required": false, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "page_size", + "in": "query", + "description": "Number of results per page", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "description": "Token for pagination", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of targets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetListResponse" + }, + "example": { + "targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_engines": [ + { + "policy_engine_address": "0x1234567890123456789012345678901234567890", + "attached_at": "2024-05-17T00:00:00Z", + "detached_at": null, + "engine_default_behavior": "ALLOW", + "target_default_behavior": "ALLOW", + "protected_methods": [ + { + "method_selector": "0xa9059cbb", + "extractor": { + "address": "0x1234567890123456789012345678901234567890", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + }, + "policies": [ + { + "policy_address": "0x1234567890123456789012345678901234567890", + "policy_name": "Policy A", + "parameter_names": ["amount", "recipient"], + "mapper": null, + "version": 1, + "state": null, + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + ], + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + ], + "next_page_token": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/targets/{chain_selector}/{address}": { + "get": { + "summary": "Get target by chain and address", + "description": "Retrieve a specific target by its chain selector and address.\nReturns the target with all policy engine attachments and their configurations.\n", + "operationId": "getTarget", + "tags": ["Targets"], + "parameters": [ + { + "name": "chain_selector", + "in": "path", + "required": true, + "description": "Chain selector where the target is deployed", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "address", + "in": "path", + "required": true, + "description": "Target contract address", + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "as_of", + "in": "query", + "description": "Show target state as of given time (ISO 8601 format). Returns historical state.", + "required": true, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-05-17T00:00:00Z" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Target details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TargetData" + }, + "example": { + "chain_selector": "16015286601757825753", + "address": "0x1234567890123456789012345678901234567890", + "policy_engines": [ + { + "policy_engine_address": "0x1234567890123456789012345678901234567890", + "attached_at": "2024-05-17T00:00:00Z", + "detached_at": null, + "engine_default_behavior": "ALLOW", + "target_default_behavior": "ALLOW", + "protected_methods": [ + { + "method_selector": "0xa9059cbb", + "extractor": { + "address": "0x1234567890123456789012345678901234567890", + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + }, + "policies": [ + { + "policy_address": "0x1234567890123456789012345678901234567890", + "policy_name": "Policy A", + "parameter_names": ["amount", "recipient"], + "mapper": null, + "version": 1, + "state": null, + "effective_from": "2024-05-17T00:00:00Z", + "effective_to": null, + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + ], + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + } + ] + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Target not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/transactions": { + "get": { + "summary": "List transactions", + "description": "Retrieve a paginated list of transactions that triggered at least one\nACE policy engine evaluation (PolicyRunComplete event). Only transactions\nbelonging to the caller's organization are returned. Setup-only\ntransactions (e.g. IdentityRegistered) that did not produce a policy\nrun are excluded.\n\nSort contract:\n- `sort` must include both `chain_selector` and `block_number` (comma-separated)\n- Only `block_number` supports a direction prefix (`-` for descending, `+` or no prefix for ascending)\n- Valid values: `chain_selector,block_number`, `chain_selector,-block_number`\n- Default: `chain_selector,-block_number` (newest first within each chain)\n", + "operationId": "listTransactions", + "tags": ["Transactions"], + "parameters": [ + { + "name": "chain_selector", + "in": "query", + "description": "Filter by chain selector", + "required": false, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "from", + "in": "query", + "description": "Inclusive lower bound on block_timestamp (ISO 8601 format)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-01T00:00:00Z" + } + }, + { + "name": "to", + "in": "query", + "description": "Inclusive upper bound on block_timestamp (ISO 8601 format)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-31T23:59:59Z" + } + }, + { + "name": "from_address", + "in": "query", + "description": "Filter by sender address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "to_address", + "in": "query", + "description": "Filter by recipient address", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "target_contract_address", + "in": "query", + "description": "Filter by target contract address (contract must be integrated with ACE)", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "function_selector", + "in": "query", + "description": "Filter by function selector (4-byte hex, e.g. 0xa9059cbb)", + "required": false, + "schema": { + "$ref": "#/components/schemas/MethodSelector" + } + }, + { + "name": "policy_address", + "in": "query", + "description": "Filter by policy contract address that evaluated the transaction", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "policy_engine_address", + "in": "query", + "description": "Filter by policy engine address that evaluated the transaction", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "sort", + "in": "query", + "description": "Sort order for results. Must include both chain_selector and block_number (comma-separated).\nOnly block_number supports a direction prefix (- for descending, + or no prefix for ascending).\nValid values: chain_selector,block_number or chain_selector,-block_number.\nDefault: chain_selector,-block_number\n", + "required": false, + "schema": { + "type": "string", + "default": "chain_selector,-block_number", + "example": "chain_selector,-block_number" + } + }, + { + "name": "page_size", + "in": "query", + "description": "Number of results per page", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "description": "Token for pagination", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of transactions", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionListResponse" + }, + "example": { + "transactions": [ + { + "chain_selector": "16015286601757825753", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "block_timestamp": "2024-05-17T00:00:00Z", + "from_address": "0x1234567890123456789012345678901234567890", + "to_address": "0x1234567890123456789012345678901234567890", + "value": "0", + "data": "0x7b226e616d65223a22416c696365227d", + "gas_used": 85000, + "gas_limit": 100000, + "gas_price": "20000000000", + "gas_fee_cap": "25000000000", + "gas_tip_cap": "1000000000", + "effective_gas_price": "20000000000", + "cumulative_gas_used": 500000, + "tx_type": 2, + "revert_reason": null, + "l1_gas_used": null, + "l1_fee": null, + "policy_runs": [ + { + "on_chain": { + "target_contract_address": "0x1234567890123456789012345678901234567890", + "engine_address": "0x1234567890123456789012345678901234567890", + "method": { + "selector": "0xa9059cbb" + }, + "policies": [ + { + "address": "0x1234567890123456789012345678901234567890", + "version": 1, + "name": "Policy A", + "mapper_address": null, + "policy_state": null + } + ], + "params": { + "amount": 1000, + "recipient": "0x1234567890123456789012345678901234567890" + }, + "context": null, + "engine_default_behavior": "ALLOW", + "target_default_behavior": "ALLOW", + "extractor_address": "0x1234567890123456789012345678901234567890", + "log_index": 0 + } + } + ] + } + ], + "next_page_token": null + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/permits": { + "get": { + "summary": "List stored permits", + "description": "Paginated list of stored on-chain permits. Only permits for policies\nbelonging to the caller's organization are returned.\n", + "operationId": "listPermits", + "tags": ["Permits"], + "parameters": [ + { + "name": "chain_selector", + "in": "query", + "description": "Filter by chain selector", + "required": false, + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "policy_address", + "in": "query", + "description": "Filter by policy contract address that stored the permit", + "required": false, + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "permit_id", + "in": "query", + "description": "Filter by permit ID (lowercase 0x-prefixed bytes32)", + "required": false, + "schema": { + "$ref": "#/components/schemas/Bytes32" + } + }, + { + "name": "from", + "in": "query", + "description": "Inclusive lower bound on block_timestamp (ISO 8601)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-01T00:00:00Z" + } + }, + { + "name": "to", + "in": "query", + "description": "Inclusive upper bound on block_timestamp (ISO 8601)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-31T23:59:59Z" + } + }, + { + "name": "sort", + "in": "query", + "description": "Sort order. Must include both chain_selector and block_number (comma-separated).\nOnly block_number supports a direction prefix (- for descending, + or no prefix for ascending).\nValid values: chain_selector,block_number or chain_selector,-block_number.\nDefault: chain_selector,-block_number\n", + "required": false, + "schema": { + "type": "string", + "default": "chain_selector,-block_number", + "example": "chain_selector,-block_number" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Stored permits (may be empty)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermitListResponse" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Policy not found for the caller on this chain, when policy_address is set", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/registry-usage/events": { + "get": { + "summary": "List IDV registry usage events", + "description": "Paginated list of proven registry usage. The caller must own the requested registry for the given chain.\n\nSort contract (same as /transactions):\n- `sort` must include both `chain_selector` and `block_number` (comma-separated)\n- Only `block_number` supports a direction prefix (`-` for descending, `+` or no prefix for ascending)\n- Valid values: `chain_selector,block_number`, `chain_selector,-block_number`\n- Default: `chain_selector,-block_number`\n", + "operationId": "listRegistryUsageEvents", + "tags": ["Registry usage"], + "parameters": [ + { + "name": "registry_type", + "in": "query", + "required": true, + "description": "Whether the caller's registry filter is a credential or identity registry address", + "schema": { + "$ref": "#/components/schemas/RegistryType" + } + }, + { + "name": "chain_selector", + "in": "query", + "required": true, + "description": "Chain selector where the registry and runs are evaluated", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "registry_address", + "in": "query", + "required": true, + "description": "Registry contract address owned by the caller for this chain", + "schema": { + "$ref": "#/components/schemas/EvmAddress" + } + }, + { + "name": "ccid", + "in": "query", + "required": false, + "description": "Optional filter — only return rows for this CCID (lowercase 0x-prefixed bytes32)", + "schema": { + "$ref": "#/components/schemas/Bytes32" + } + }, + { + "name": "from", + "in": "query", + "description": "Inclusive lower bound on policy run block_timestamp (ISO 8601)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-01T00:00:00Z" + } + }, + { + "name": "to", + "in": "query", + "description": "Inclusive upper bound on policy run block_timestamp (ISO 8601)", + "required": false, + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-01-31T23:59:59Z" + } + }, + { + "name": "sort", + "in": "query", + "description": "Sort order. Must include both chain_selector and block_number (comma-separated).\nOnly block_number supports a direction prefix (- for descending, + or no prefix for ascending).\nValid values: chain_selector,block_number or chain_selector,-block_number.\nDefault: chain_selector,-block_number\n", + "required": false, + "schema": { + "type": "string", + "default": "chain_selector,-block_number", + "example": "chain_selector,-block_number" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/PageSize" + } + }, + { + "$ref": "#/components/parameters/AdminOrgId" + }, + { + "name": "page_token", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Registry usage events (may be empty)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistryUsageEventListResponse" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Registry not found for the caller on this chain, or not owned by the caller", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + }, + "/transactions/{chain_selector}/{tx_hash}": { + "get": { + "summary": "Get transaction by chain selector and hash", + "description": "Retrieve a specific transaction by its chain selector and transaction hash.\nThe transaction must have triggered at least one ACE policy engine\nevaluation (PolicyRunComplete event) within the caller's organization;\notherwise a 404 is returned. Setup-only transactions\n(e.g. IdentityRegistered) are not accessible through this endpoint.\n", + "operationId": "getTransaction", + "tags": ["Transactions"], + "parameters": [ + { + "name": "chain_selector", + "in": "path", + "required": true, + "description": "Chain selector where the transaction was executed", + "schema": { + "$ref": "#/components/schemas/ChainSelector" + } + }, + { + "name": "tx_hash", + "in": "path", + "required": true, + "description": "Transaction hash", + "schema": { + "$ref": "#/components/schemas/TransactionHash" + } + }, + { + "name": "include_policy_details", + "in": "query", + "description": "Include policy state JSON in the response", + "required": false, + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Transaction details", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TransactionData" + }, + "example": { + "chain_selector": "16015286601757825753", + "tx_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", + "block_number": 19876543, + "block_hash": "0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", + "block_timestamp": "2024-05-17T00:00:00Z", + "from_address": "0x1234567890123456789012345678901234567890", + "to_address": "0x1234567890123456789012345678901234567890", + "value": "0", + "data": "0x7b226e616d65223a22416c696365227d", + "gas_used": 85000, + "gas_limit": 100000, + "gas_price": "20000000000", + "gas_fee_cap": "25000000000", + "gas_tip_cap": "1000000000", + "effective_gas_price": "20000000000", + "cumulative_gas_used": 500000, + "tx_type": 2, + "revert_reason": null, + "l1_gas_used": null, + "l1_fee": null, + "policy_runs": [ + { + "on_chain": { + "target_contract_address": "0x1234567890123456789012345678901234567890", + "engine_address": "0x1234567890123456789012345678901234567890", + "method": { + "selector": "0xa9059cbb" + }, + "policies": [ + { + "address": "0x1234567890123456789012345678901234567890", + "version": 1, + "name": "Policy A", + "mapper_address": null, + "policy_state": null + } + ], + "params": { + "amount": 1000, + "recipient": "0x1234567890123456789012345678901234567890" + }, + "context": null, + "engine_default_behavior": "ALLOW", + "target_default_behavior": null, + "extractor_address": "0x1234567890123456789012345678901234567890", + "log_index": 0 + } + } + ] + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Invalid request parameters", + "code": "BAD_REQUEST" + } + } + } + }, + "404": { + "description": "Transaction not found or has no policy engine evaluations in this organization", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Resource not found", + "code": "NOT_FOUND" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + }, + "example": { + "message": "Internal server error", + "code": "INTERNAL_ERROR" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Blockhash": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{64}$", + "description": "Block hash (0x followed by 64 hex characters)" + }, + "Bytes32": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{64}$", + "description": "32-byte hex string (0x followed by 64 hex characters)", + "example": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" + }, + "ChainSelector": { + "type": "string", + "pattern": "^[0-9]{1,20}$", + "description": "Chain selector represented as a string to avoid JavaScript number precision loss (values can exceed 2^53). The underlying type is uint64.\n", + "example": "5009297550715157269" + }, + "CredentialData": { + "type": "object", + "description": "Credential associated with an identity", + "properties": { + "credential_type_id": { + "$ref": "#/components/schemas/Bytes32", + "description": "Type identifier for this credential (e.g., KYC_VERIFIED, ACCREDITED_INVESTOR)" + }, + "credential_registry": { + "$ref": "#/components/schemas/CredentialRegistryInfo", + "description": "The credential registry that issued this credential" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this credential expires (null if never expires)" + }, + "credential_data": { + "$ref": "#/components/schemas/HexBytes", + "nullable": true, + "description": "Hex-encoded credential data" + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this credential became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this credential was revoked (null if still active)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this credential was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this credential was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this credential" + } + }, + "required": [ + "credential_type_id", + "credential_registry", + "effective_from", + "block_number", + "block_hash", + "tx_hash" + ] + }, + "CredentialRegistryInfo": { + "type": "object", + "description": "Information about a credential registry", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Credential registry contract address" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector", + "description": "Chain selector where the registry is deployed" + }, + "block_timestamp": { + "type": "string", + "format": "date-time", + "description": "Block timestamp when this registry was created" + }, + "block_number": { + "type": "integer", + "description": "Block number when this registry was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this registry was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this registry" + } + }, + "required": ["address", "chain_selector", "block_timestamp", "block_number", "block_hash", "tx_hash"] + }, + "DataValidatorEvaluation": { + "type": "object", + "description": "State of a data validator contract at the time of a policy run evaluation.", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Data validator contract address" + }, + "version": { + "type": "integer", + "description": "Config version active at the evaluation block" + }, + "state": { + "$ref": "#/components/schemas/DataValidatorState", + "nullable": true, + "description": "Decoded data validator configuration active at the evaluation block. Null unless include_policy_details=true or state unavailable.\n" + } + }, + "required": ["address", "version"] + }, + "DataValidatorState": { + "type": "object", + "description": "Decoded data validator configuration as JSON. Structure varies by validator implementation and is passed through from the coordinator config log.\n", + "additionalProperties": true, + "example": { + "allowlist": [ + { + "item": "US" + } + ], + "denylist": [ + { + "item": "IR" + } + ] + } + }, + "DefaultBehavior": { + "type": "string", + "enum": ["ALLOW", "DENY"], + "description": "Default behavior when no policy explicitly allows or denies" + }, + "Error": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human-readable error message" + }, + "code": { + "type": "string", + "description": "Machine-readable error code (e.g., BAD_REQUEST, NOT_FOUND, INTERNAL_ERROR)" + }, + "request_id": { + "type": "string", + "description": "Unique request identifier (OTEL trace ID). Include this value when contacting support to help locate the request in logs and traces.\n", + "nullable": true + } + }, + "required": ["message", "code"] + }, + "EvmAddress": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{40}$", + "description": "EVM address (0x followed by 40 hex characters)" + }, + "ExtractorInfo": { + "type": "object", + "description": "Extractor contract configuration with block metadata", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Extractor contract address" + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this extractor became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this extractor was replaced (null if still active)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this extractor was set" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this extractor was set" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that set this extractor" + } + }, + "required": ["address", "effective_from", "block_number", "block_hash", "tx_hash"] + }, + "HealthResponse": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "ok" + } + }, + "required": ["status"] + }, + "HexBytes": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]*$", + "description": "Hex-encoded bytes (0x followed by hex characters)", + "example": "0x7b226e616d65223a22416c696365227d" + }, + "IdentityAddressInfo": { + "type": "object", + "description": "A wallet address registered to an identity in a specific registry", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Wallet address" + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this address registration became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this address registration was removed (null if still active)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this registration was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this registration was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this registration" + } + }, + "required": ["address", "effective_from", "block_number", "block_hash", "tx_hash"] + }, + "IdentityData": { + "type": "object", + "description": "Identity representation with nested structure. A CCID (Cross-Chain ID) can be registered\nin multiple identity registries (across different chains) and can have multiple wallet\naddresses within each registry. Credentials are associated with the CCID itself.\n", + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this identity. Present only for admin cross-org queries." + }, + "ccid": { + "$ref": "#/components/schemas/Bytes32", + "description": "Cross-Chain ID - unique identifier for the identity" + }, + "registries": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityRegistryEntry" + }, + "description": "Identity registries where this CCID is registered (across chains)" + }, + "credentials": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialData" + }, + "description": "Credentials associated with this identity (null if include_credential_details=false)", + "nullable": true + } + }, + "required": ["ccid", "registries"] + }, + "IdentityListResponse": { + "type": "object", + "description": "Paginated list of identities. When no identities match the given filters, an empty array is returned with a 200 status (not 404).\n", + "properties": { + "identities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityData" + } + }, + "next_page_token": { + "type": "string", + "description": "Opaque token to retrieve the next page of results. Null or absent when there are no more results. Pass this value as the page_token query parameter to fetch the next page.\n", + "nullable": true + } + }, + "required": ["identities"] + }, + "IdentityRegistryEntry": { + "type": "object", + "description": "Entry for a CCID within a specific identity registry", + "properties": { + "registry_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Identity registry contract address" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector", + "description": "Chain selector where the registry is deployed" + }, + "addresses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityAddressInfo" + }, + "description": "Wallet addresses registered for this CCID in this registry" + }, + "block_timestamp": { + "type": "string", + "format": "date-time", + "description": "Block timestamp when this registry was created" + }, + "block_number": { + "type": "integer", + "description": "Block number when this registry was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this registry was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this registry" + } + }, + "required": [ + "registry_address", + "chain_selector", + "addresses", + "block_timestamp", + "block_number", + "block_hash", + "tx_hash" + ] + }, + "MapperInfo": { + "type": "object", + "description": "Mapper contract configuration with block metadata", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Mapper contract address" + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this mapper became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this mapper was replaced (null if still active)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this mapper was set" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this mapper was set" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that set this mapper" + } + }, + "required": ["address", "effective_from", "block_number", "block_hash", "tx_hash"] + }, + "MethodPolicy": { + "type": "object", + "description": "A policy attached to a protected method.\nNote: A policy only appears in this list if it has an active version at the as_of time.\nPolicies without versions are not included.\n", + "properties": { + "policy_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Policy contract address" + }, + "policy_name": { + "type": "string", + "nullable": true, + "description": "Human-readable policy name (null if not set)" + }, + "parameter_names": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Parameter names this policy expects from the extractor (derived from policyParameterNames in contract)" + }, + "mapper": { + "$ref": "#/components/schemas/MapperInfo", + "nullable": true, + "description": "Mapper configuration for this policy (null if not configured)" + }, + "version": { + "type": "integer", + "description": "Policy version number (as of the requested as_of time)" + }, + "state": { + "$ref": "#/components/schemas/PolicyState", + "nullable": true, + "description": "Policy state/configuration (null if include_policy_details=false)" + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this policy version became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this policy version was superseded (null if current version)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this policy version was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this policy version was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this policy version" + } + }, + "required": [ + "policy_address", + "parameter_names", + "version", + "effective_from", + "block_number", + "block_hash", + "tx_hash" + ] + }, + "MethodSelector": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{8}$", + "description": "4-byte function selector (0x followed by 8 hex characters)", + "example": "0xa9059cbb" + }, + "OnChainPolicyRunData": { + "type": "object", + "description": "On-chain ACE policy engine evaluation details for a single PolicyRunComplete event", + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this policy run. Present only for admin cross-org queries." + }, + "target_contract_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Target contract address that was evaluated" + }, + "engine_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Policy engine address that performed the evaluation" + }, + "method": { + "$ref": "#/components/schemas/PolicyRunMethod", + "description": "Function method that was evaluated" + }, + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyRunPolicyDetail" + }, + "nullable": true, + "description": "Policies attached to this selector at evaluation time (null if no policies exist)" + }, + "params": { + "type": "object", + "additionalProperties": true, + "nullable": true, + "description": "Parameters extracted from the transaction calldata by the extractor" + }, + "context": { + "type": "string", + "nullable": true, + "description": "Additional context from the evaluation" + }, + "engine_default_behavior": { + "$ref": "#/components/schemas/DefaultBehavior", + "description": "Engine-level default behavior at time of evaluation" + }, + "target_default_behavior": { + "$ref": "#/components/schemas/DefaultBehavior", + "nullable": true, + "description": "Target-level default behavior at time of evaluation (null if unavailable)" + }, + "extractor_address": { + "$ref": "#/components/schemas/EvmAddress", + "nullable": true, + "description": "Extractor contract address active at time of evaluation (null if no extractor set for this selector)" + }, + "log_index": { + "type": "integer", + "description": "Log index of the evaluation event within the block" + } + }, + "required": ["target_contract_address", "engine_address", "engine_default_behavior", "method", "log_index"] + }, + "PageSize": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 20, + "description": "Maximum number of results to return per page (1-100, default 20). The actual number of results may be less than page_size if fewer results remain. When next_page_token is null in the response, there are no more results.\n" + }, + "PermitListResponse": { + "type": "object", + "required": ["permits"], + "properties": { + "permits": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StoredPermit" + } + }, + "next_page_token": { + "type": "string", + "nullable": true, + "description": "Opaque pagination token; absent or null when no more pages." + } + } + }, + "PolicyData": { + "type": "object", + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this policy. Present only for admin cross-org queries." + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "address": { + "$ref": "#/components/schemas/EvmAddress" + }, + "owner": { + "$ref": "#/components/schemas/EvmAddress" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Human-readable policy name (null if not set)" + }, + "description": { + "type": "string", + "nullable": true, + "description": "Policy description (null if not set)" + }, + "policy_engine_address": { + "$ref": "#/components/schemas/EvmAddress" + }, + "version": { + "type": "integer", + "description": "Version number (latest unless as_of is specified)" + }, + "state": { + "$ref": "#/components/schemas/PolicyState", + "description": "Policy state (null if include_policy_details=false)", + "nullable": true + }, + "effective_from": { + "type": "string", + "format": "date-time", + "description": "When this policy version became active" + }, + "effective_to": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this policy version was superseded (null if current version)" + }, + "block_number": { + "type": "integer", + "description": "Block number when this version was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this version was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this version" + } + }, + "required": [ + "chain_selector", + "address", + "owner", + "policy_engine_address", + "version", + "effective_from", + "block_number", + "block_hash", + "tx_hash" + ] + }, + "PolicyListResponse": { + "type": "object", + "description": "Paginated list of policies. When no policies match the given filters, an empty array is returned with a 200 status (not 404).\n", + "properties": { + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PolicyData" + } + }, + "next_page_token": { + "type": "string", + "description": "Opaque token to retrieve the next page of results. Null or absent when there are no more results. Pass this value as the page_token query parameter to fetch the next page.\n", + "nullable": true + } + }, + "required": ["policies"] + }, + "PolicyRunCredentialSource": { + "type": "object", + "description": "A credential source configured on a validator policy at the time of a policy run.", + "properties": { + "identity_registry": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Identity registry address" + }, + "credential_registry": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Credential registry address" + }, + "credential_type_id": { + "$ref": "#/components/schemas/Bytes32", + "nullable": true, + "description": "Credential type ID (null when not restricted to a specific type)" + }, + "data_validator": { + "$ref": "#/components/schemas/DataValidatorEvaluation", + "nullable": true, + "description": "Data validator state at time of evaluation; null when no validator is configured for this source." + } + }, + "required": ["identity_registry", "credential_registry"] + }, + "PolicyRunMethod": { + "type": "object", + "description": "Function method information for a policy run", + "properties": { + "selector": { + "$ref": "#/components/schemas/MethodSelector", + "description": "4-byte function selector (e.g. 0xa9059cbb)" + } + }, + "required": ["selector"] + }, + "PolicyRunPolicyDetail": { + "type": "object", + "description": "Details of a single policy attached to the evaluated selector at the time of the policy run.\nNote: per-policy individual result (ALLOWED/DENIED/CONTINUE), denial_reason, and mapped_params\nare not available from the on-chain PolicyRunComplete event.\n", + "properties": { + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Policy contract address" + }, + "version": { + "type": "integer", + "nullable": true, + "description": "Policy version active at time of evaluation" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Human-readable policy name (null if not set)" + }, + "mapper_address": { + "$ref": "#/components/schemas/EvmAddress", + "nullable": true, + "description": "Mapper contract address active at time of evaluation (null if not configured)" + }, + "policy_state": { + "$ref": "#/components/schemas/PolicyState", + "nullable": true, + "description": "Policy state/configuration at time of evaluation (null if include_policy_details=false or unavailable)" + }, + "credential_sources": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/PolicyRunCredentialSource" + }, + "description": "Credential sources configured on this policy at evaluation time. Present only for CredentialRegistryIdentityValidatorPolicy and GroupedIdentityValidatorPolicy; null for all other policy types. data_validator.state within each source is populated only when include_policy_details=true.\n" + } + }, + "required": ["address"] + }, + "PolicyState": { + "type": "object", + "description": "Policy state as JSON. Structure varies by policy type and is passed through from the on-chain policy contract. Field names within the state object are determined by the smart contract and may use camelCase (e.g., maxAmount) rather than the snake_case convention used by the rest of this API.\n", + "additionalProperties": true, + "example": { + "maxAmount": 10000, + "minAmount": 100 + } + }, + "ProtectedMethod": { + "type": "object", + "description": "A method on the target contract that is protected by policies", + "properties": { + "method_selector": { + "$ref": "#/components/schemas/MethodSelector", + "description": "4-byte function selector (e.g., 0xa9059cbb for transfer)" + }, + "extractor": { + "$ref": "#/components/schemas/ExtractorInfo", + "nullable": true, + "description": "Extractor configuration for this selector (null if not configured)" + }, + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MethodPolicy" + }, + "description": "Policies attached to this method (order is significant - evaluated in order). Empty array if no policies configured." + } + }, + "required": ["method_selector", "policies"] + }, + "RegistryType": { + "type": "string", + "enum": ["credential", "identity"], + "description": "Registry tenancy type for the registry_address filter" + }, + "RegistryUsageEvent": { + "type": "object", + "description": "One proven IDV registry usage from a PolicyRunComplete-backed run. consumer_org_id is omitted.\n", + "required": [ + "registry_type", + "registry_address", + "chain_selector", + "ccid", + "tx_hash", + "block_number", + "block_hash", + "block_timestamp", + "log_index", + "target_contract_address", + "policy_engine_address", + "function_selector" + ], + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this registry. Present only for admin cross-org queries." + }, + "registry_type": { + "$ref": "#/components/schemas/RegistryType" + }, + "registry_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Registry address from the request filter (lowercase)" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "ccid": { + "$ref": "#/components/schemas/Bytes32", + "description": "Lowercase hex bytes32 (0x-prefixed); aligns with reporting CCID conventions." + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash" + }, + "block_number": { + "type": "integer" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash" + }, + "block_timestamp": { + "type": "string", + "format": "date-time" + }, + "log_index": { + "type": "integer", + "description": "Policy run / PolicyRunComplete log index (disambiguate multiple runs per tx)." + }, + "target_contract_address": { + "$ref": "#/components/schemas/EvmAddress" + }, + "policy_engine_address": { + "$ref": "#/components/schemas/EvmAddress" + }, + "function_selector": { + "$ref": "#/components/schemas/MethodSelector" + }, + "matched_policy_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Policy whose policy_versions.state contained the matching credentialSources element." + }, + "matched_identity_registry": { + "$ref": "#/components/schemas/EvmAddress" + }, + "matched_credential_registry": { + "$ref": "#/components/schemas/EvmAddress" + }, + "credential_type_ids": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Bytes32" + }, + "description": "Credential type IDs declared on the matched policy credential source(s) for this identity registry / credential registry pair. PolicyRunComplete does not carry the specific credential type that satisfied validation, so all acceptable credential types are listed at the time of the policy run.\n" + } + } + }, + "RegistryUsageEventListResponse": { + "type": "object", + "required": ["events"], + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RegistryUsageEvent" + } + }, + "next_page_token": { + "type": "string", + "nullable": true, + "description": "Opaque pagination token; absent or null when no more pages." + } + } + }, + "StoredPermit": { + "type": "object", + "description": "One PermitStored event for metering off-chain workflow permits.", + "required": [ + "permit_id", + "policy_address", + "chain_selector", + "tx_hash", + "block_number", + "block_hash", + "block_timestamp", + "log_index" + ], + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this permit's policy. Present only for admin cross-org queries." + }, + "permit_id": { + "$ref": "#/components/schemas/Bytes32" + }, + "policy_address": { + "$ref": "#/components/schemas/EvmAddress" + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash" + }, + "block_number": { + "type": "integer" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash" + }, + "block_timestamp": { + "type": "string", + "format": "date-time" + }, + "log_index": { + "type": "integer", + "description": "PermitStored log index within the block." + } + } + }, + "TargetData": { + "type": "object", + "description": "Target contract representation. A target is a contract protected by one or more policy engines.\nEach target can be attached to multiple policy engines, and each attachment can have\nprotected methods with associated policies.\n", + "properties": { + "org_id": { + "type": "string", + "description": "Organization that owns this target. Present only for admin cross-org queries." + }, + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector", + "description": "Chain selector where the target is deployed" + }, + "address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Target contract address" + }, + "policy_engines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TargetPolicyEngineAttachment" + }, + "description": "Policy engines this target is attached to" + } + }, + "required": ["chain_selector", "address", "policy_engines"] + }, + "TargetListResponse": { + "type": "object", + "description": "Paginated list of targets. When no targets match the given filters, an empty array is returned with a 200 status (not 404).\n", + "properties": { + "targets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TargetData" + } + }, + "next_page_token": { + "type": "string", + "description": "Opaque token to retrieve the next page of results. Null or absent when there are no more results. Pass this value as the page_token query parameter to fetch the next page.\n", + "nullable": true + } + }, + "required": ["targets"] + }, + "TargetPolicyEngineAttachment": { + "type": "object", + "description": "Information about a target's attachment to a policy engine", + "properties": { + "policy_engine_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Policy engine contract address" + }, + "attached_at": { + "type": "string", + "format": "date-time", + "description": "When this target was attached to the policy engine" + }, + "detached_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When this target was detached (null if still attached)" + }, + "engine_default_behavior": { + "$ref": "#/components/schemas/DefaultBehavior", + "description": "Engine-level default behavior when no policy matches (ALLOW or DENY)" + }, + "target_default_behavior": { + "$ref": "#/components/schemas/DefaultBehavior", + "description": "Target-level default behavior override (null if not configured)", + "nullable": true + }, + "protected_methods": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProtectedMethod" + }, + "description": "Methods protected by policies (null if no methods configured)", + "nullable": true + }, + "block_number": { + "type": "integer", + "description": "Block number when this attachment was created" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash when this attachment was created" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash that created this attachment" + } + }, + "required": [ + "policy_engine_address", + "attached_at", + "engine_default_behavior", + "block_number", + "block_hash", + "tx_hash" + ] + }, + "TransactionData": { + "type": "object", + "description": "On-chain transaction that triggered at least one ACE policy engine\nevaluation (PolicyRunComplete event). Every returned transaction is\nguaranteed to have one or more policy runs. Policy state detail is\nincluded only when include_policy_details=true.\n", + "properties": { + "chain_selector": { + "$ref": "#/components/schemas/ChainSelector", + "description": "Chain selector where the transaction was executed" + }, + "tx_hash": { + "$ref": "#/components/schemas/TransactionHash", + "description": "Transaction hash" + }, + "block_number": { + "type": "integer", + "description": "Block number containing the transaction" + }, + "block_hash": { + "$ref": "#/components/schemas/Blockhash", + "description": "Block hash containing the transaction" + }, + "block_timestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp of the block containing the transaction" + }, + "from_address": { + "$ref": "#/components/schemas/EvmAddress", + "description": "Sender address" + }, + "to_address": { + "type": "string", + "nullable": true, + "description": "Recipient address (null for contract creation transactions)" + }, + "value": { + "type": "string", + "description": "Transaction value in wei (as string to avoid precision loss)" + }, + "data": { + "type": "string", + "nullable": true, + "description": "Transaction input data (hex-encoded)" + }, + "gas_used": { + "type": "integer", + "description": "Gas consumed by the transaction" + }, + "gas_limit": { + "type": "integer", + "description": "Gas limit set for the transaction" + }, + "gas_price": { + "type": "string", + "nullable": true, + "description": "Gas price in wei (as string)" + }, + "gas_fee_cap": { + "type": "string", + "nullable": true, + "description": "Maximum fee per gas (EIP-1559, as string)" + }, + "gas_tip_cap": { + "type": "string", + "nullable": true, + "description": "Maximum priority fee per gas (EIP-1559, as string)" + }, + "effective_gas_price": { + "type": "string", + "nullable": true, + "description": "Effective gas price in wei (as string)" + }, + "cumulative_gas_used": { + "type": "integer", + "nullable": true, + "description": "Cumulative gas used in the block up to this transaction" + }, + "tx_type": { + "type": "integer", + "nullable": true, + "description": "Transaction type (0=legacy, 1=access list, 2=EIP-1559)" + }, + "revert_reason": { + "type": "string", + "nullable": true, + "description": "Revert reason if transaction reverted (null if succeeded or not available)" + }, + "l1_gas_used": { + "type": "integer", + "nullable": true, + "description": "L1 gas used (for L2 chains, null otherwise)" + }, + "l1_fee": { + "type": "string", + "nullable": true, + "description": "L1 fee in wei (for L2 chains, as string, null otherwise)" + }, + "policy_runs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TransactionPolicyRunData" + }, + "description": "ACE policy engine evaluations (PolicyRunComplete events) for this transaction" + } + }, + "required": [ + "chain_selector", + "tx_hash", + "block_number", + "block_hash", + "block_timestamp", + "from_address", + "value", + "gas_used", + "gas_limit", + "policy_runs" + ] + }, + "TransactionHash": { + "type": "string", + "pattern": "^0x[a-fA-F0-9]{64}$", + "description": "Transaction hash (0x followed by 64 hex characters)" + }, + "TransactionListResponse": { + "type": "object", + "properties": { + "transactions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TransactionData" + } + }, + "next_page_token": { + "type": "string", + "description": "Opaque token to retrieve the next page of results. Null or absent when there are no more results. Pass this value as the page_token query parameter to fetch the next page.\n", + "nullable": true + } + }, + "required": ["transactions"] + }, + "TransactionPolicyRunData": { + "type": "object", + "description": "A policy engine evaluation for a transaction. Contains nested on-chain evaluation\ndetails. Off-chain evaluation is not yet implemented.\n", + "properties": { + "on_chain": { + "$ref": "#/components/schemas/OnChainPolicyRunData", + "description": "On-chain policy engine evaluation details" + } + }, + "required": ["on_chain"] + } + }, + "parameters": { + "AdminOrgId": { + "name": "org_id", + "in": "query", + "description": "Admin-only filter to scope results to a specific organization. Ignored for tenant requests.", + "required": false, + "schema": { + "type": "string", + "example": "org_SD46LSQkJbnaiBTg" + } + } + }, + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "API key authentication. Format: `Apikey `" + } + } + }, + "tags": [ + { + "name": "Health Check" + }, + { + "name": "Policies" + }, + { + "name": "Identities" + }, + { + "name": "Targets" + }, + { + "name": "Transactions" + }, + { + "name": "Permits" + }, + { + "name": "Registry usage" + } + ] +} diff --git a/public/images/ace/account-setup/add-ace-wallets.webp b/public/images/ace/account-setup/add-ace-wallets.webp new file mode 100644 index 0000000000000000000000000000000000000000..5159d50e35426ee72bc5749379bb38b8cf765e3d GIT binary patch literal 116364 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 literal 0 HcmV?d00001 diff --git a/public/images/ace/account-setup/api-key-1.webp b/public/images/ace/account-setup/api-key-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d768b65d6fea75873a893e27fb37404d286f41d GIT binary patch literal 42446 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 literal 0 HcmV?d00001 diff --git a/public/images/ace/account-setup/api-key-2.webp b/public/images/ace/account-setup/api-key-2.webp new file mode 100644 index 0000000000000000000000000000000000000000..f4792032ed7a5835d8ef038d1b10b7a9044c72a9 GIT binary patch literal 77662 zcmd?R1#Bc+lQn2&hBh;Eo4L){W@hF#GnbjM&CHB#w%g3i%*@PO`(|eK&5mZ?`<~{X z(XOdS3Ya_o20D*u{xvn|D z0uXq~`zHUnw`2#5eXn`nqSIdk9sv)4@j&?f&{w-hrncBEyQeKbqK}Sd0YA?;0LX*g zvE5BquiZk|`Id$+)AQ7=elPG6xDIH2(|-mG0Lk9zKDR!AZzaQkqpdJt{AVHe)f?x| zQY*0cGx0s}75EH1B3kJh2ZX*|yi45W^Z_ro_JJKpL{89fN zdfs(+1qAvD^aJ7nil4v#bw1}~>!1r0p#6FBG50?747?V2=~{bNcu#n}dg{6c9Cl3r z+<|+aIrr$#p*LHn0?U7RANaWdtpAW-OWAyyoLb4r0rpJI)wI=Y0bgb6ve{NC|96bA zu56>Z4nNZ*xV$E@$bk2FGl+Yjrbqz+=6QLIwfRky4NRAdo8q;YwSqSvHb{Eo4pRym zT2o3lTqG2&F+`G?8w)qEk~M=*P7|(j8VBm<0RGMc2_eQO9R=?L>PCa{p**e)`d^v$ zLa%18=7qyGQQ4>5_{F@esugbahZou63q2T4{#Q&${go>+ZQ*%q$L{fisfA4S5TJku zQr$@pFAT|-RNAj9c0fK8_MKyM?VqphOvi@dOkVTRT0sR~Dg4=(;NXuBJg)`9{_-5S zLR>$(@NuRSXKr~-rQPQ&QvZpWN3SCYc+iP)%&lYt_{JT-%t_F7ymHm%>|JxOHdN2H ze2aI#fcj_d{k8M|f1E{HvzzM?$$X;X@-TnbT-bC6zcjH`m5tve`%qYd!-fA@FCcOR z({O)|_hatQqldst#EJ4Unkvl94JEx?vUoYmVrF-yo$qQorJ%!ddm3_i8FOx~hnq6= zco-DY10rv$i^48pA1Z)A@;lMk`)UGZVjIx!%nm` zBPnTfY%F303icyXT|z*WIhyMjjn~dy4Hf1xI3J$YYp`dDyGJ4yK<190&|mp>oa&pm zkS=4Fm}zK`QQn~V*4&tNG%HJ-tAjx$t&fpJco0n2>)aVmBqpn+pW1f-H~3wdihp;w zNXJR-eJdPt{vqFzVX0Wml##O7zXaybBQpu*w&QRKq`?sc_|wXedR+^V7*~lA8m?>( zZ?>PijsP6Ba7FcWB<>Mw32;=p&3bTk^Blln72$9--oHzx=x+JV!_1q((d)8rxzP{g zUQ?OV;b#lR61ANgUps=YJo>EIzzO51`^B?lgqfPX^O;ZJh^D}>ohkN1px{d5j57}O zv{rTBZn)F3&}5=|@_n$*nni+xq0QVr(m}N=7pVDG&g?6QIvy>5ZuGOg$xZPL^PgF6 zi)yT4Pr_h^=)anXwpj9?FaEO+`LEAUu{H_S7ZuyCxlKTbSSgv;kzr)t+2G zKD6)=+H9~i&ssLxSSPA__5wOIXpx&ZLfosj2M)GsQcBlm2b^v3N4b>kXl4#mx%r4? zB-pUhvT0cr1!`YE=?{pU&$JB>dH2A`U1Bltn8Etgal2zL)cNH;N4~Ka<0!PK@M_OX zKoFMfJSD#HI679{?$F|^Z~X4Yw9D(Z4U%V63KR>2?$ZpGEPho`rWoc6UcC0?3>)A?$!&zxcpBt_yJUKwUAZHM4U1P_HJvk zm5HAp2(>Nxb#L~(%ph1d^7#<+@pnHR2x-sJDgwAwgc zma79qvvGs~5%~Ts>e04t8&miT&oXQSxV$W{wb*MqkOBzo(j}n<1&VtY#RNs;Q{m;F z-)zCo&z3~x3)mpQBUNUJy@96i?+Tq@G`!0&j+9)01>WfA(B*9$K$-nVf5!RX;m0)Z za{h6Bi1tTytGo2CnkZid+>)3|MnbLomwzO{zoo(7c@*Z#tUlMKSu$b)TT>s_k^N1H(*_=_ytIo1yjYItcscBtQ9rZu0uevoL~`IpI&M z>M>jIcM=Fc*9@P4KQ5z*gmL;W^YtI8RuS>XaK-sVAt02g3Ov-O;cYA=RT_sE`XzVTmJ-9vJR@aGj@6B(U;aFA(cE5E{4?eWsd<E>Ei#(L?*KowBd_~c@fUeINZVkT1lRK(tj_^OTY(7G*hpztzVEyHt zs;12l?OWQtn)I+5t6R$vfDsC(-}^tfVP@H1i%b5}zrXhWe|pxeq~rh8rGJY-o0qG? z$?!GtZ+|cL{t<-#-xz>Qp;@COF_Dj!s3lZ;ae15(+*d*DZEF0+Y#k3S?&F*>0EbXn zu1zd63HXBNsLPp|)BDH=vqbXk{9Itn`|+`kGK3)apQXybWKni?xdbOqJ@1gUy?yq9 zbi3bc8~t@l91%dEpM)v3Qy?1=?80q{8mUZw^U8X`ZtYpW^5M}J+M;<-EF=oq62blG zhOJ*<;=phWwWM;~NclR>8JVI+R}}Wo!u>y<54Ij`>C($#`5UzPpYrPev>+Z&rD6s) zeM6tjvA;@T%y_fBmeKkYy=kF>&<6V164cEH38Q#gA5vC%S(#7Dh+_S!^PDva#?@TP zy12Z^gSkN)dLAi>PNk-V>XQ0_yt3e^p^4zce=U)mP;6et;~9;+od4TbT>Vsj*t=Kn zg^=~zfeZwO^+AFitUXkg4pJT#0j+nGA>l3&O3M48r09;j(+m{qu}?Z3_uW!V|lnU+lJ~2M^+r5Ee#xY=p|thxQu~Krg4rS zV@tLAqmDakyfs#eb*1V;`8*i>j;d50LkJD4FR{Bs58olu8~jU z`*R3YO`bOM_-_@fzl6#EoBRE}HR+>UkYJ|G-+WO5(KLq&(<}b_z=|L?R)@)J(K3np zHx%l>h%}@b<2KisxUM##KC5BJ_(;>g{<;1Yshf8HK;3Bwaz>%ODVMG2Ir9+%CfjR? z+V24>hA}lG(`yWEP4J2CAPH<+5^nGROpaQlW+NZKb$|Og#`#gBA^k@#p10>abc`{= zLS=|IS=i^=`OP`}b5yKq(;vB`iWyt{o7BUWPINGdv;x#Z2KL`c0~C3EtQ5QYf9GCo z8=blfHvE%X`yavQPfPOu$TCIQagzTL&$d1kZFc`x0P@e};6D$Vzxm!!@w3b7V(pK{ z8_#bSMq2hd$iv-J241R|CWbl-MwbuvO5~6*34hhc`S(@^N}v=QA92)g`x7-oxuybE zHm_|;L%Fa1l!6YzSwX8%sc(}uS`S2(7G*5?brz18pP9;A z3;Gqpegi+N!3nSL=+wkNw>gJ@?_TJ`Qo2gmQra0ca2PPmF6!KbUf{7zcI2kUk~f9i zhW_)sko2wwY~FF16uLKP=`zl>V?zIBI?8mk_v4+DWmuH-PJZo7XR5~S(;X6?ya-#M z=wgu2&kY$ zzJ^G;X{y}vG9~}+cEdJB6|>dk@p47kwPGTz(Xfz6>%{kdGMP}^XY(IG4MW!d_n9nq z)??df+2g6&R95LJb$myu9awMC%dBfQ$cEr%d39{66m(3&JCjV8u2TEYcp5Z>E33e4tNRJr zHV}4oS*yl97nU!P<)4U+jsQPzdwhu;6!1G{s&DP#(3Mi{pkHv4azq(=*?h{q3I!sU z(|&7tRe!QP)0XJf4nCs6=tx+&66fEGRKU;>=$lNzjyw_zd7f9$3%y{jQf72eJKrOP zLe^*M8Z{4F7bU4?zY?qwFldEo=yPM8sx??JB$%vrmRJOHP(!lAqMyEH^dz{PBYEs@ z=V9oouR`zz!+8uC5mg|lx-oq^V}mOr@{i4*s$Q<;9Kme4UWISN=B}lGBkJXVlojJg z)R)sz%T&S{zLwq3+u%-4aVjk;_nCmHPd)nm`&`nB>@c4nw~@1@;|QQ-T=DJGUA6NK z3o8tWEf6h8`d=W31iB5>ZTrX`w`$2Sy+6|2FCnM@*ckhQsYL%rIU5@Phk&Ofr8W*U z|2GLJc@t!A&fPcmH~5=*vm8@$$2XJCoBY7P5<~w$-k7ocz;8GB3%WuI?5oOIeCsfT z<{sfJckep~f1^S+guir@8oL04Ni5$anwSa$b(UXBe^bIPOZ}cB4!ca#4SyI$iZNQ7 zKIi&d)U!~j=Z~*#sKogTCiCwiif^gXgq@P+-vn|%QA?A+|LXuG9sL2Uv+UCQ{2!n= z-Z?^9xg#5&S_S_xSpF2m4eKOwE5js{!WamZTuz^3k|&EJ z*ph;p@#pW-0sHx)ZEu}vX}-9$%oS4-hX4lT2aW1c%a_AZ(g8cF#ort;xBmSoT^KLw zLq3lv^A|piu$RF?l~QHe-P3wPmno|0uSJ%W{ohgNo9S^Y^K^%>Y1Y707WN9d+@w9T zsQH2|b1HN;8}1X~N@Y!U_lVN>3AG=1N9Q~H!y2g!{0HxIMI`doouB4On3!$J?He8M z)+!AHw*eB-kb)Wx?*LZ_tk!IaCh0q{C%RA8mG)mkhkVVXl;RD(Va@ZK(Map10J%%EIITU*?S?Kr( z-=Krbgy@|N-)Es7Hf;lL?jDce+G6MME}JGjP8 z&dFTlRpq)qUa6Va>K(G@9by4UQJT$Tqjhf6PNkhkXW3uxhT5>4oy4>_Y!D}wF-}jth;gVP4>x(zccoG1u zrUC{xC#wPwi2mlOes0}5GVYHl`&BL{IHo)R+?KxF*G{O((Gq+;h?@7>3xLBJyZ~L$R2kA z<cY3s2fT0l;Daml>L(Bb z&iv~g%1Es%_1HcmZAc=;QqZs4R^PYo?2nhDDyubse`wg={xB&j zBQJ6DpjPIEx}Bu`Cu^Uo@zq|1jmvoE0Ea?XNmt z17J-{BYrAq{_y+?KCpVjr5NeB7?xbqCHV}s*%udaM95gnB69-?;0aodcy5rqNbWKP zvzq@dL^a45SuNZ6Qt0TtN+|Lq_0~P(5F@Sgwf|h*$IbbKz84os&0M;A_nbj!j9d*; z>NSkT1xq;bnm7)5b7j8Y_;hjc7TOlp&W7D;N#l64xb~#qpEY)-L`s(LOn=hqZ0<|a zJB570kRRZLFA74y-#!gOx&RZKM0xL+&I z6YB`+@h{QbRQopctke)odhCIC!8(#N+EnU6R@)V%9T2s})^Y0%TGdGJXEQztp|_z- z{y_M8qecu}^k2l^K5dw$bK!(ZYj&TMVDshks@r3a@4KtBjl5v|LHbKykp1(8Abk|Z zz>UcnxS*>uINJig!TxF;k95WPbxNR=qByzI@cZ{eW{t6n~_D(wK)x;cR_ zp$QXDeA!~&>D^RUDW6&B2d`Zx*Y)jN`@`{6ePdb*eZU5B|zMo+V4K}6R?-h$z`O|h9`7<_ZCF{4!x!9vU8gURd8&bWgf6{)(?hV?>i8GI`pM}%qlbBWe zVte%r4p>xd6#ZA~qb_vqk`6W#qAPt0qKfPC4D*Ld!!&ckqJ6DHwSa*qc`tL&4lJbb zoaKEgJT>0)H^HLn9SMDIm;CyWj^3}hk_05LiZ-Ohp>c#x5s12VDvq3AXD2gA-wg`< z^*^mNf|egxdJZJMR6Kcy5}^prPJw#ueObIaG9`IKUIfR=w|EI@)_9lhe6m<_{Xi{Z zuC+RfIZmp8l0STLj*!jLCByd`;|l65`9z3fU+HY=@F4jPmZvblPrmdDPex_KrQz$5 z;Te_c{)6c#dRxdbok8hMjjpJ{+N@9}<>a2y3DBh=ic55s255e}sisD>ur*x1q$|M| z4OF#j1NkWKdN-&!DLWl=(d{KUrB@zS5g<=XSiX37Y(9Ot)I?+sWPHt+j4mjtPiV)> z<%pVRBnC9Flt*qFI;1r&Wo&7|@?sKWg!YHBS9la`RVM0+JgoU3dFumL+CZJfx{L}O zNsKv-V+ISr001g;GM|kL?>EwEQ{)PMesfdiW~nP>M>{3I>1=@Nk%Hh`BSgwr_+9vT z`J!`qDqgRoch~l?XvLw^R>yMA-8Jp_&+3#}PE(M@{YQU240mx(XR`T?=rc7VY z(v)cHav@JjL(x}r)?GL_a!4hmpxYI?_DG}eA{t~b&v$9E32~hWW}@X$Nw@)_$uH6z zr~FVcy&&U;I!rn4PMRsRNI$gtObp~ z-p#zxyfljErNhTSuX);yuTPx?+JYe2A8wsa4s3Y`QZSOge#4fW-=o381}*a~C$I+r zL9z^w#AMx8B{fu+Qtyot8_|Wps5KqvKx7W9_40#K!&Yf}S#&yxJW{qS^={Ub^5i5+ z-jJN(shZr(YajQay%zyjiubnBGX*bqR?=aefwoP=7Z+xA#qUvrcy#6NxMS*sary1;N@`a9d`%&9Xuo!1Yi`FI-Uhde{4P z=4SsjF03%{iM-10)bkFq4f0mFvz6pXcSsnXO#bn>1`%Q4rz?Cc{DsqfN5+Ma`s+oB zd#=pM`1Jl52bjGfq&b=DQ)|=JJ`C;GhcBer*RE1!ZE=wU$HVEoHheO4k9I~9z|-^$ z_wsLD%lB{0R7kd*tjA3CLd+v@;xRJFyd4K)2#DJP%nDDZii*psFw$cAgk2LdnqL&e1HA&w{TBrCK#xh&j8GXv|?`lisBhbChTS`mn(Tf z@&Ff$&p}%LWgk3Zy!ER3g$}P`ARIjI5{~Zi;_h*P#zabcv=E)k;T(OOU!e52(j#Y; zaFyfNmuZ6aJJ2XZC-JojF+=hqen zMiYZd1D=|UQ;F$8O3@;oRZX*T7+wWo#hEUZ|+vlV?9S& zU9WH~Oi*%lno_Up9gTT+xhq3>88&pYvpm~Pz6@a4H+y+^Qh}^s_c}X$pOXIOP2jcoH6237^`%P)yjkFHV3x>t3$YWXELaf6lA1evPJ zgT1$xtNpSQGbNe=Lgkq-R=XY{O&Z{svMzXUb?r7)^c4ZkcCwdx9Zz%FjT$l&Tow!b{a(eUoMB zXLnHAJ3oIl)ukD^|LoAd_3eR(K^h;yoXU&~X90i&_B%{$ubLj&dVu>%1SCR$w8q~l zKOKWr)#TXBp})YCRC@9%3vrX-%{up_Oc5Y%tbf{TD4`NR?!i&%A+Aha54!B#5nc(s zZcq(~t@j%z)||c{q&VRlODa`{oVIq?9ax(BX`eoTa9UTq$MdOKP3Vo~40I0gK#sFS zKI-|x<%i3y?F1#vOPO;yU8QOad&mgS*{?H*d(+2nRrLiW5_jWAG9h+* z^^%HITFQuw`L0h~?^0h*1Se>F9sjF-0q^u{E9e80jJ%G|5K~JCy~PUBuoztU#g;`R zhV8mrbE7BnWsh4g(FDk$_OX{E=OHKh)!clYgZvt+M0!gL*CR&WwsFPW>Qox#N@e!`(fbTJ0Hkcn zV{r}y10MQL2PbQ&P9eD-m+h@^;lhy4z%IU%hrT}&G}-PlCVjP?FeWswf#Te9~orQIGx5yTx! z^g#J|q5B(OhycIC&|*@%1`?dcB2F>+ zbLU`EK-QV$TSdH_MFQ&Z($vjw4Lf>*^Np56i|{pXTSOwX5gZkv z1~)}4UfE~8-i#cv;lte+PQFhU*zo%a9f!9wk_Z)8Ec_CA*^6KeBPR`NlZGl-*xDtU zVpO;WAn-_+g|a>QXX)22YF|$c{Am6K6;kdlc+L`ThoRp~zm@J9N0?+m%Z%X+;GP*! z#G=Pt@g0E}!oqW*rPM+ya7#K_Bt?HG>Xr`q&MyYDw5gW1q17*#%M0bcr&ts%w;)dV#D(rOM9w> z*Hr_v;ixH3Nn#{6e2t_p7`Y=qMRGB@+f9G0U=*+8t|Y44v6OT;kXp*VF1Ve~bu^p( zP*j=9sFlg9jW2y~A&8)E+6;tW@3ro@^s`+@e*q0WjzF26A2gEx8fnsBnkGZh(@xoF z$EbD&_WaHF`Uwpo&PoqB%cfT_*TYK1qyE6ak{Jgs8pP6#iQOJy36bWm(B^$ux7Xt- zGD8yJLG-4r6^fU8U6~-|DYsVDK%1Kp#4f;QZPb9X8>ITA&Hpgx@yU(YlAf-Ab597# zTzf8ca5pSWmkG|Ft=a^xz7_faCf{4-E&tl`Vq%>o8qIgPVhV2OXK3G)-z_>kY~q}} zwcWF*@4>n9d&Ca}1Z|T**V?!xp250~Kn)j?h;41^D+H*h2pG#z#TF@B_Us>foeHIa zNulW=5CL9YBj6cDO&-$ND=dHj?cMaVuU6y4uoI#zyEN?_soRhKMX3U%#0j3PdmMfs zF_$H6I5V&l*m6TVquJrSJb$#dL~~#pzp@E~4(qbm{Zg%qI?MI(i={KHDw@|M0tt4Ftc8*SN>>bxC29G_u)C;I9kk+{vuZ%LK6t^8ZFrT}<%G8raeaqL>bIuNxQc9Kf8sPTSU;Xr@Htc`*~*>*D#M8?!9OnHzdDRR zHkN^B4@R~AYw>J{)x+T$@{)AWD3Br^o&)__&wLnUA)`YrPL-#ZTCUY%#*Z@~24p+D z7Kl@1va1s&=xo~%oU}#BUuKe;gd9Gok)1mxe&DwhR@Q+W@xHN2ndd@@vS5yl{am14 zJ?=sJHT4|??*ovD3(7f*l0w!9F&FuMKu?RQ6sNVe$-AV+TMNSKZXXNJd~GPVb!&XK zxh^fICgpAIRD0=P{4+BjP6F+IiMa006Q7(|$>B`2jJbYwh{8Y(VqWG-1h$yHv zM?7EHr>7{iS2(#ZGH0D&3>6T{dp?Hb1s7GIsjxAdQ(fXBqm*$k*7FH$b?{C&YjGi) zP3rmy`2hJN$5$1Bmv5mAXt&-3>knTpXF%jl^NB9bw-k~^!1soyBW3#34I-ARNu?h4 zTm`ppZ5jowTh+o}Sfn04)Z9l!DmUwdc8~J;6lA+SNd%2|LyQ}PE@w)l{!>QL|K<2H zk7{o=7d_p-Y>nvZCOJ{#I^a3g@)PE?jsDBWNv4b^jUb&$_eu;GOK=cQu68w95m~+f zsMzmm3&@+H^7xUZgEczUk3wk-V6kPbkvAQdv-AzBCP3u)=aUcB-U?#4eJulm(X?DP zWeVlm>$aD95KN1%jol}^KkN@5`5SoWeQ-z;GAozUPX)BNl78}+pG+Uan zjpg5bQ@pN>YTlx~QRBS%d3UTospws7;a@K`Y>`%spMK?&ugPn#SU6u1C85rfMZx-^;+1d^YK_p*B(yuWxBSqkWakOj&`gNiU9uaSO)lTf? z4gT(&-Y`l^8T!inMw&Mj^^akDR@zu!%zTZyU`*I=vih1%#95&IjyGQ%_L`>M%hcm= zpTJPkBm<6-n}8*ir1XKf6Z}0J&StUYX6h8%Qyv=mp%!iM&lQa>6S5{K+k{7)`+LU0 z^GI)z&~zcIyyxGY%~b+JEsq}ZDiC&eodkom(5Gsf8Zh)1J(J2?!&hrvGgz{eD9X&E z0#jKX__D!K-~wtO%S*xEk}Yp2;2wz;CGuB^@7u(>+lj;Q*beb@EVvd8o+7OKf(Kjh z&E$v{qtR{zFk-d(y#Yzl+!=J=zi(<(aFms(#FT zcn^9;4EUR zlX9UD1Nu&O7tY=F4t?9u;0R@c&AL>Je&!=(&Qd0w_2<-|Lf%ff8Ng%5+}Zcx%3Yjr z8fDka8%}(4k%8!Lf0@*R6-;0rs&TI-^!i4rF6!Q>zn!Us(P%`=^D;)o8k~ad?N`7( z4*xVBx{$h#uEMiB-u-hnz}8bS$HGo@$+AkS(jy&@=YB{(T_-`6nw5cAAw{C$!q?e~ zUj?W0w7D$>12xuf*dR6e$Dzu46()}Ikq4#K`PXk~U*hi?ImyatNOZs1__C66FKPWk z)RPUoyOJG>*4IwD$Y=8tPt?<(9n$M8RE(j8?lQM6;*GlU!de|#8euFvNrqZ5Km|q= zlDb5e_&_%p)MQ~7z<#=*i|bYdgcs-{9O#hO&Q&XkYjI-u&jXCkXB_uwTKB5kgWoML zD*3y)D$4;_DX$Xc94Ndehh36cTM|a;hNVX5s~0T$m?7LoKfd1u1BkqECU+deH-Y|# zbf3BjxpEW+MAk`MBq7q?p0AxkPVJ_?sp{#dkSlTqjKoSJ|gYheFV-YH&4(O~@k++sG7wNsbRB!lioJuzsvHdWB}xh{Zu$tL9+gk)*Z#?c zk|0E!?5hK*8HPy>zLT4om!i(E^ejQ}2Be5ykEf~z&D{P#&e341*}9HSlg)voH)J7M zvn{i(+Y%_WyBy!R0z=+`_pBs_x^pv(TgomC8c`|snGaJ?l&B)KsxLyEQIBoJ%<)|v z(9?Gf(3|p42Cu-`IrG{!tu6d00nd-ym zv&4PbHv1IglMwtW8MzfnTZhGz!KEeN@Z5{p*ak&F2kj7a)n1v{vY73`{#G!TPmW?= z@yE1Cf(kjAz zb=0QEFZ&YU&cjS4@1gyrF(D}LcxrELGF+Ai|1A8Rl!*GW4=Lu zywU$sT+KsfC!MkoHMFt-jubl5 zTm$yFIrHEQ#|f`_tC6n47FR;$qB_iPZvYAyW^uqy95Z(n4JEIT>TP1%Tk3bOfVrT1 zBd0|K@gh0MK24rhY^vrbrD&e?;$V2dgrxo4jJzev56J`hC^YTk@S>wSk(A5>UQxK? z4R&LlxwmqZVT`SoR~?|6zpz$*H5BwlT-(GEaqObE66VEHklilpb|8mg?6Xzq-D%ohYo#k@7XlfHgihTvza@ zn>4Jo7BN-z$q`Uf%LJUW0EB)baZshBd`D;H{?<15k0gL~A2W=+d`$ao#S@IWvhWWi z*GfSmIxv6w@0L`l6hx7oUG0TVAyB_iT~r%ugA&sCWs)73Ydb%dC4V#zPAFA9vJl?O z)3XWLV%*=>*_ujx0bg6mm^6{_$wG&=oh`H9 z)67sKvVF*0RhcqH740LEyXA_dJvo^A^TyPUp%12&;ZUi+O`7o=N`n4iAt+HTYt#HD z@WQ>7AQpn|1UN(82}89mF!l5um#?b7)N9?l1X!N2YqIkQcGi;k2WeJ-9ms~j_Sb}$ zyqJI{C}KOIJ$Z-ONWIwix+cWqc_v(v1N|i0Xnl?L9Fkfq|N4cS-=m1E! zA!H0;i*E`d;VGf@ppsz!g4*1eM(K6TP;A#Kr-=&oX7`IB(bVV8noCu}Zu$+{cm~Ea zTdtnEIJbvIU~s?qxN)76Jg#XX&x(*2S1SY!A{?oq6XBpmUt^P?KsmCF^^yrXKC6de zp&9#Z`GFR*5s7W}mJ7V}@)xNRM>QpvlVBn`N{KH#4@|#(am#M6+9a+}&Lv#CvIdcb z8pTAjp-dAdz)zbsiskffi=R}xu9Gy|dEWw!W>Eq%oAi&4CIa$>EXMoO z8(f9M_>E01(U0wy>Xbc48x{sj0)QvLLn2sWXU;bXntrIQzM`zx7d6?D`1jIzI027s z7yQ;}o@%njTb>nBr!wbI9O9Ug?C}pQofiQo+dI^$J6hzt04S=vOLjxDhZu_arh5C zB-;bDKBpo%Q1_`nWBSdCqid5rn01-4DYmvAebsDI$tHu;&gN5dvMGadEn|OA1||#sAA{%We@&h1=X9lj6Lh zSHA3|4pf8<{i^`Qwih;}Jl&8pN(?XffTY2R9mB0y0h0HS7Rwucq;1m7N`P2~P$Fhs zG~@i_t=QD7Tdz2cT5H~ja2lyf z6mGW_N$=iXo;Jd6O}*%MK-5N(SZRRq?^8%-dF|27hjR!D_{y+*_!!ZD^D3Q`u-wP< zoa1oQK!w6~`O_6|!crxP*_y|tmi60huCw|=1&1BK2K{CfA|j3V2g8V@l_sT1A{uD< z-a!KeDiyTKOovmSRs*T{y*gHbyN*1O=Je3awPvqYGF?95oJT?xNedYTiu6YJQ_lWb z?!X2J;!kt`j#+t7oR?0`-OSXHCDCrW-sRF6k>cbj>*3A>BO+D;)8+A@_q6G0vz)bNK^McWp@UJEr{aYpe%t%rpnVzPB6 zS4JlOoVJMwEDqBFXr^S*N@JW3YQ<%6pAc0UyICYKaA74x*EPZ9aj9Nmf0#7dYICt)D!T-qC5Ig{!+rBty*%g zRt}1yxYlH%X17`_UxDyWf0Q!@+o0<9zL(^o+Ay2gzu#T=n$eA5($l6w6hb;hr+>sI zhverFdclXf@y^yddn*` zyjSeKOEQs<-47Mt3<;_X%j*>k;p3r@_TZ6V6I0r-W`rj$^9G0~U;NE$61PJ(37;jI zjFA1?Q2Ii-3=Lr->JpE#vZb@CcfMm`_w~XL$3XLA*C*1kpA8>-M<~nM#3pz0ah{GH zpsc6j%|HE)2QGYVF!{W$jVmKv8Dp%~iVmDcQG-#@R|;*VDPZwGfG0gm)B;BK2Y#4{ z&uN_y+*_k{w00z(%+8PM&1=FG95(mVt0?v`6w0Km?=q7 z6rJp<73WmLg^J1Fslg{6Y~V#3gOi-G=^*o0vNEcOKLdKXI25K0zYg_@iszlAsQc4p z%s1S91`}^~FWq6*QnfCrb?6G491ah4b=$q`+yd7r&Wc2-zn`&9u?q;8@(U^XPtZi* z^d`yF!63KeyQi(~n0j)LxKEs?8uGXgYzl|u^)kk3n-g=2EDko$N9jYZ3!mypCpdsy z->1gW_aQeF509Fr>vwHO%PVd6h3d%lX2ZA_UCTbt%)b2bB%%t?35zvGU@u0m#Q0*{ ziYAwbo7_BBl|WtV27xN0YWu7nf8-Zsv$#I>#Slh^f{X<%#oZMI_dSRJtx?tHAYVvp zMKoStDLS*+jOJ}!#0P13N>h8y{FzP>Tgnes+mY&d}#|)T|DpEaNFb>A*Cju0ZqPDcHq&KgWOzVtukD|>K(`^!R zk6aWn-y+xc-jankujW=ELF_%^Ec0#(grI)~=2pse-MSjpb`5 zD`~jb;Dc9E|DpZ!y$xv593p;TFi0byJLCAFD2rzA!nRtP8-ftXIuJv;v)>c9Ml_D9 z;h{CDikVfyyuL24B}RUDl4#S>?jOL1quq!sfZ1$i+*W>q1}P=0m5mI(n+z^xK>B9) zUlkEhJkXi81miPGXqRA{aarOG++Urq_rC88Gb*S9SBCf?)@#ti_~rIAX}ZjwwKw8g zNJ7lDC%lvusM=0enA~tpzQbd6JDhhe*WHC%Q$HyJcOes(Km71j>E_!Bl*v)Alsi*m zg9b&o2df=*B#s>8$H9@`XesPDqm~ws4@jCmaC~c5iYlLYTVlDBQVh6joIyZch%yQ= zCq`Q_A@$zJ44R$}FT=P1hvKCf`Ik_WeP?qZZ2IFUNAN4YI1^t64UOL2YWAcM_pFH| zmA=S@ok&M|kAag~f-bkK`IS_lv27##y!f%`nXON?KSKuuXws8tc6-_`sFD3Di#Qw` z(iCiN?l9oIU1g8R5aw`o`s0s#G^3u4H%b z`Xy~5+?53wGMzGT>ilX`MQ-*OO;!QVU zkBd`FGLbhbXrS70c~NYr-6mLQ)HV@d5!Pt~ik#~AtLiuDS7nkp>w@qzkutBy3_h;y zEn^>H`>EFyteS70t#@lAUGRv)nQ`F-DKpu61>4Gh1u`N}+1k8?kRWumC@k)~#cQ+Y z_6Zvlj$6-D9qT)*#by98YK7l}goZiT>1dRcRX~sz(~{kbYc-k!m^m@HunZO{L>6RA zi#>+wQ4k-2yb)lYlJ5Ss(KWz*I z@9(gtah!^K&hp+ro1_53Dk&5yXziu)kE($(mwu0{^cYlr$jt33))q}Z4%B7{8uCj# zd&zjBY(WP|79CmbH-_Rnfod`BXd?0aqX0M;T;VXIv~$s<+Xb~>hG0DT4NP&e6)f6< z1f$e{?9b$9@b-93Yp|zV+*0r)PGfj@w)(c5lG_0edYkC&EJC?FaRNr1jO{Mpxd2fi zr;*0M-s@iF_wThDwY`IKwo1B4?V)sqvBqZT&Q;?(;PDq5896?wX8kK6F zC3dvqq&rxY)BSjm3@~*F`9g2D_y9(YV6-h$@9?gAe}Aq>k?2c}oxk6g|Fe_%`8U`j z%c>|(-7_kKVFQMX9Zvn%h(dl#LvKrYM4Tw2ME5rmL(&z^mhK@$wbdpU#iVn=B{@A1 zs8!U%PbOtt*cb=LQhG%km(`YURWQr748NZl7S#(NW;WO!JPRuceKXt|2_jz8K$6%d zKhsvr+jV`eM!^(r+$`zBzO~#L#O(W2LlS3=(Mz4#(`{h66VPl5X6MD`>pCc$2)&i% z7xm%7%Z9tgIDXx@8j!Rm*8weAIO&UFJN8A~& zqVymSG@u+bj*s4Cof`k51}WBreeHn%^HXcPw59IT#hQ6tj;v06mHGbyUqGP0Jv)U$ zCv*pvg!DwK{|`gULR%b!UJD_@wRp{8yTgHFHZ%;1Zc7zKgaISJgZ@p;@0~6u=|f~Y zYxh^TueO<4iFuwZJtS&HG8djXLo6RvVTTv8evzcF*zMsEHyA&!MmgDVBpN-$B$G#B z--W$2S3P7&t@6Ow<7YW_GiP?lwJv4Zv~Huce39LEXJly1r~s_7CLS z#_hCq<}9c+;8Qu_+OZ1`XvvOtG+%YhN5Q$bgLQ2X`a;#=P}`MC9P1}?o6s)7JA;t% z%QsOpKV4G#4F8C1Xnh-cNebS2*M=L&LII^jCjQyZ`COp|x z-l9IwTuTOtoK7`X5Utx-CliQXLU474nv+8^mpvGae)di3zH^+=zWJ(Ukg^d$)NJ29?)rq+PnVy!Ys@lLYfZed?7 zUK|B#wXJF)m{g5N%fPr5^tvG5ICTa6dTpjxGA=9gIMC5OGfyv0lX8tqaScb|ee5 z;%gkqV5^~x3WbA0Ej$lyv$?Q zN08Pic)xlwk>#R*HT&IM`abAxS#^XTpCrn;=uJ#uzzUUiTWjgCwUXLx2Xd;WKod*X zcguU~fshcgHlU}=3-Zk|1ZR@vX_sRQRe8p6^iY zu%1+PQ)G5e2svS{64+(bU+V2Q$4+!<1Qt1B1Q3BBM^u{gR{U_>qjp-4ed?J0YB4 zGu_w;2+xVoh}ZUefyp|LCdr@$@jNzClw4d&=^==IKV~Ry{rrZ$J&%IF5y0esDFnQf zvX94mr0c7ypvkW?eM<0-4#!L?o(|RlFvYEri7Pg6MM9{6cRwPs?54yhvYKanNDRJz zf@zd5$V4215f7T(1z@->(ws_G81gLn)jW-+YqReX;kVQbenCPg%Q1C6rgTof(iV+` zkeUSHs&N3BVi*EItryYTpW)`B;B<-PrM80&34)U`vrwO*ebHJh7}^fyf863|L&m9D zN|KtO0AK~X2OVyX59R=;5Ub-eUnAl*AxLbtdsPKQsh8(9Ux0{`YXlIm?MegFUf0007d0=XQ! zWTA`3h;-iCGo0YrIvKSkH}B=nrtrS6^j)|JS0Ha}-WH2#)YHkKY}~F0p%kF#3cE+V z=OOKp7>;v}eLX-|O(xMFej(x*wV2wri@bagb|@**_Pr!Jx~a49p&t%|Ync$DjEq!Z z6b2=`ap%d3Cg}|Al|e`GOCj7qqboc#FhXqmwR@j`E%6Hi|NfB+|Q@&Tn9otKscr7P9C0d4xA7!{lx76 zm`e5CdlMJ!ooS(WHBQ;tp4q$N;Ne{1{TVNO@2`Q>D&Qf=2Qn<^K9Ha*V{0D&L7LR_ z2X0@64nYz4AW3EBRM``&Y&Tw!KqIIydTW3tV%ZFvn)X(-<%-7tPY~M(G>{tnClh>{ z7)5mJ1u8tbC!Aer&u$r97|k^OxAs;HsVP(JzS5!FmZd4soJoB;;6iZPxuImuPPZT# z^CyipyTWXf8x31T_^o6NSwAt+*xAicsDs932}t;Z=ouMV2xFmY?TJkRRgg%LzjJ;5 z`SD)teW-=EH7yiiM-mN?UCAI{uWsVZX|e2vDk>d~y?DQpM$PqQ&`e#}PdOlUX>Yta zB7Q*8@4E*)H6CqrKw|R;t588O%RQ;c@ucT9jHL~C)d&`vXLK2}C%B&>tuy zsQiSjxmF$9;kumLl9E2c(oct3gnNzp{Oq!vMk_?4p|!CEu7M0jl(AFqBkzCz~+6O2Y2)Er?liLkqS6Ns;j z{u=?mWD#CA*V~fhZFsmt&*}zncLZ+4q}}IzXaoZ;38B{X&GRQUT`x( zpp2UCIO)b1lgQ%B7B@vfiq|6N&-`iJqSEk~lM|Nxw3d=^84|ZR5)zT&BZ~!~yN206 zkDv2}!0X2%RmOY%b;(Zp{#{?-U&WVqK9+-R`0k~1jmwZF#6FgNj>wA&d>3n;gShOv zap4GQJkl81bL1>qwf5_aaEMs~5-Um@TkxD!!dU_Z{bS~fACiwN@ZCqZNsUdVOn}zY zg2SAe(OQ|22R7ZYB;AMae&plilDZ$CdS$|kMv@6iC?#fT%kN}N$Zd739N78u97Uv? zA(av4Kz_LUT?num9)KB8%T{>M!$q_U^R51DT{Vy(s6SV$xn#`q;IU2SE}$~EaO@^8-Pk31ThDNt*fUo-oemeXc)2A}yYy`PZ# z0g>(P2tl@ocro$*;QV)aont$DnhszVjxEgkXPk5sRH8K`2!asaGS+7L)JI=eJy;nH zxCt28Nld5tu)^vB66<)U0VQt%`OumVKrX)`bwK~Z8g!jNzOIt+AH;0S{uafJ9ccof ztR44viq(B?gf43!M%Z7F-RJDVo&;-q`167teP9W|-sqPHM~Xy8Q0j{bo1T&nLHncH z-Irn;TQM*rmr`g~CZ5xynNZ}?=ejvErvQ+?c)@Kn;sOPhj5s9Cqbii_YBozUvKBmU zg(zlzrzlinNPg4ZKW}4bxP*0a(FYq&#|h-Um&lQ{L6;`#r2`ID*0(-BhVJ8coDUW! z0fUYsY;Cs$3`r;1JV|J5=oZxRL@1zTFy2qi4cwC&6T-O#n-STPXUTPzS`*Wreg5Ob z(FdYa^w8^}7Q#^7J3e;4V)3g3bU-6dGHzAQH5KXz?iQ0*z1}?mt~G9bLF*T(2pF|X zq`F%}Ub3CNZmVT4C&5?Q87Xc8fSF1&1k>pTz8%&j?38^$HY_<{ibsfZ3cZ`5`!fVD zgD;|%AU8~R=6K-Q(};o0RH(p@9^q+cxe5`t@0q-yE{OQicDd=F4#@^u5f-;1=%V3D zb&A$pi5?z+t0L3U@Y5=;!4oOGB-VzqeXK1QmyK)8F=&KTIr+auvDqg-|HdPS!eno! z<4X-$&kv483V{t^WSZr0n)lS8DzF zRY`J&Mkm=9C?68U*^(BcNvCZ)`wF?juAU-kcw;81m92JUEv|>tCzOrG*oyK~= zvWH+UT3OLvQNKTj%C+n}uy1H33b*W-|<26_3+e~h|9<9CVxnnZ5|4Z=%1t@E$U!?Yc2F;Q-IFTH7wf_ghl z_;e6SNeInIh=+?YPwOQ={w%2Nqb*mPG%M~4xk9=x5eVgUp!Xwx47Ui+Elp@E0{N5N zNkz6cyG5%;4z1EZCv?xOrM2>fgi{p@W4cPFBAwyKwsyy9_5CbKlP@|e}j zd6A$0!l%9dr;KVGwtV58Gj!61o4LmcQ%VaXKuZj`&{!ehY*js#w*{)*gLH!!R-Akx z)HCBT1{d|{Jf+q@g@}6KrHVc{6;QKqQT8g@nxYjz0h@@xl6$Z5DX2MbZ(c{U_|A{> z+Yd|3aOJ>RzLeq~-(4Cv1}H+VqCI$hvr9lUSE zUCys@wD*z!iqCj#l=C7R4VZB{!zNm#+B#GWdA6wBboy_al<0+chU?Y2(3CFojgtD5 zu@tOpcgCY%JBm;>^ksQ2|GPS9^gc+~NIlKYfpZXjXMIf({xxPz8De{gU6K%2~Ed(wn*1@m8F#w^28=DAP znto_p1xUO}tm;yoUUy4&x3a0vpY4xZrERD^ibVlGFp;V_utqU-=-AjoKkCuC}EZuydrKA z$CJ+<;|YdML%#R8(+38~)JPN1$Z>pHG;Bhb_l({_8D5|X9Xmb{z{U$qY#!!agGmB~ z-+T$vVqCbv3-Fi>OC_B*52iuV#t!SQEnpu(ZcMY2t(r{bJfC5FvC76g@aKX#)`#to znUGLgZ95dM;iM-#r>86LCp#qM=+kM56J3iP0`8lw*a7(f;4|M|B3y|vnkE0q6s?o> zhH5C)cxin_XLQYSYwq6z(u(@HcL5y&jktPE#;X~AzfR!&hVeZeM$a7?{t$jDJ#-tI z36`UhlaP=-Rb%tX-|waE_;Kl@s;2Y@V|})-7~j#C>oL02j?FBRx)#p!hp?cMAmcLg z(}DXCjNIvMxeR?aMj7BuX*X6g$)5KU|IZ2(9wDDj`1s%kXdQ8Hkl5OVB7p+Kn+4c4 zT6}sm(--*#CQ@NwcJGWQa7nw6MP=!l+XnGpuEZ;M7JvVTJh-HW=R7(rT{S5``hr-V+O24rLK{@-s^y1PRn|CzVyN{%QT1m)Yx z0Jlv?oErL)y972kFsxIqFi~DC>86H_R~AxRTc&FHemEEY{$L(zbstVBR>2%<`HGn^ z2&JRgTEWlP0`hLjn^aI>r=ub@_ooLRhleob!k&IgGyS}!vdn#3cQ?;>^w+P+h0beu z4rmlqc+ose>+h@{U_7inh}gfQHBR3o{o>ss>Cm^QdP8b%FYe!OIV)TnvN77TnB&6- zu!GXM;0F94K1}=*U%^Hwe*)>a*M7F5wf1$1S2Krq zvReKe z5Mwe62|l=Ygxh1ad)rKQZeD5f_oi-wtlVwPM4rHmdQ^jL2eM^WeEI15OD-j;vKY*b z!uIjnce%@&cuEBWzLsxf1_j<#mMt+@bN$n4b_P7@c}ogg0t{u;zeD`s?qXshel#<+ zrMdFtisU*=vaACwU-Awl02lB>(fkAgJd<`dBA7C>*MP(mq~WbWB~+`eQ0@LYnE|=s z&bR>0m1N0-ygl8e{o-5H|G~nU@j@&O!E#kvoYX_6NgWW9u z1hW}<@qS|;2LanZ-M!@IH2b4uOe2(xY$y$0^W7H>QZ8)oR*m0dpcjYrnEMVUCP{_> zNz1|qYiK0Y)4X`0FA%k@bg2Y<6sy7ynH}dhNlNu4&SWDnoxP0n#!NeJk61aN?(z5Y;A^eLoS40;`ux#ZJH zv7_&jSh=Otpck}@Lbpun45923HcyyA$8lfw;qc-qfrV+ody zyACjCg``84pmLh z?_qO3+B!!T!zlZ}5cbfNQ$vnvnmM}%!w8$@X5AZWu;7re||bo(Tw_R4v%V7;)F%<9{M zO^hGmDQ*8^2Vab#D3cV8Bf(2YN=AvW_VhAna90~{*yN}x&Uow5P6(|+&DsOFt39+9 z53)V_jD%>hLtaC85nO0y>WV)Zpv%G6)n_yI$FnYawp~iFlr*u^yfn6F4r(zH?Wph9 zT+SAkZ$GE0Fg*S}#KYi>=EG1BF@zt(`*#C_ZO>Hdn4Q4uK z?CysX)97w*!mV&YFRcoJ^4-Lc{9SP5x~CRX)(O2Ux^oMrbwu?&a{NZ0^V16W4nd~& zV(hKH7vIdA3tK`JiW{Yy8DibEJpF~6TD>w4re;~#=l^aF?epfoC_VHOcb?R7a>;L@ zPJSm27yST5@M314bLJ&35?M7J0i2tTLEUK=DGm)494DUfzu!E+vy{&)sV@L|Pz|n4 zlEYWbxRgblykd@fYv&N^I9Hj8*gad>oVaLN1U8Q+N34hOy)|mgzVzQ>0W*i!0cM3* zJeYx#gC1{0&!yNC7x5n5EyN~wa1dE6BC$Ncu_@{Dx0_MC>eka$@hjk243r5Q6^f*N zy{xO0vNlIbtLbUr|yZ0tQP!CrXKr>@vXAIG>)lqa2jhCT@+z%!>diU7&4;N#Mzw zvfmdUSJ3Bv*wW2()eJ&nowB8~dQHdKQb;;pgSX6Bxjif1Zh|4~Kc^8iu3k$e_G$&j zXg8b=)Y8FcK-U=J^}!;sru!*1${@ul>4qNWqtZ0AUJJ<=&PxJG3b#Td?tfzx;|^$G z(L+JSp0ul<9V|`tz&@ z5#)ri(;KJgNt8&C$U|T0XM`PNj+mIg#(kmkV<}v7Xr*|TzxG4{8#?VZWR8y4s z58RP&Q=$w(<~#-vu+{l9;oAsJi5Mfs!q<@+9W#pEk*oLQP%7#x!k-fkllcnarS$-e za7_AfQ=&%=XmfP7?+mIS=`3-$U^n;(EWZn6fze04)Febk%#qD6X-n8~v3}pTLCB@`+Xl#UN;XWZtZI3*EUFhT zu^inju)O(Y-ddB=GorGe!FdA;s_QkI^CqI<06Zng+FKDhK{yXHo&*G}qbVdNKGbMP zpOdJ-#&eol``Ca1=<7&~sQMnHo>>CIiKNoT>&(ASshWJ7o7nZNu&5+EwBjYyU`9~( z?*eEwMh(Zr%FDN8&lY0!cz7>LJeYj8-a(9(+_-I7j-AmlUYeaw0@O6bgf|ug6x)-Q93AiU}w0gpbX9^ z@WWOdC!x=>qSZ>{o*or{EXM6mUsl?`7C^*07%t%BPJ9G>fH7~niZ!^`4mYde z;5gnJB_Y=x6&T+e0c81RIkaeQQ`n9?sB4Yeu%7Bf1Pq?9u&Gx z`~A83@GvMp1lJ^HhBl7b5|A{nY7ockcd{K|eKWCJ!vuCS21uKiWf4Jpich1SQH9{y+if6$=Zf%`V?47h zvJteE=3Zl&vht3dq277vyDAaWNTta(CWNwnp<<`~PeD$(01iuM&bE~OVtipy906uP zQ;GfEJ;mCvEO!kE9x>=%DP@Yb!v%rr=l|$%_WO?a}qhVvdWEW;N2dC+BZ@ z4m-qnI00T~y&?1Lz&4Z`>gyyb&Lak)NjxP}eG|3VAqNFlyWbj!jD>{zqo8Ukt6x%( zdV^{PM!~l2F<}i$g%{59No68D_Z=bbYk*N}GP$ehR1sn}#Cmiac6=!jESZqe9CJyH zWFXC&^0~iamN|ZxAY5~-VDcX(53V)Z?+ti75b*2fOa5_NduX;@0LN7^(~JSUNs#c@ z4Nw%X7T|?WrVKuf3}Ri-v6c8vr%4O# z;3o;Tw|(%N{M(fP6M>;hL8O|yuv(!ghjJ;YcQZ_3c_wf?A9sUPkR&Xl8o|&#tBmvN zy0O74m5A4si->7*L24Et>)n+*PA|Y=ty#a^p*`=0ND%Jfc4`%WF4OEyiwMKxRdvZM z*5TA@DxDMRniOVyUMj7|!0ez8vf@Rz>15FSEH&mJ;Z>gu%J@1`Z7}s}9wP$oI z7j}4rl|+k)a{2!P`i$d^d}6d23In2u8f)n+PVMWUrLTiAwI;vegCO)?dkWfcb>4+8 z=-8P9#{YcH49!){P}R+ZSoV+|Xruj4HD##6*0SrvE?BySt^;TyM=VM*sk@cp?`5H5 z)57U6_n5Eoqsl@5KM_vr;6;~2r{^O&nENgbC%G!iEvX&dATisJk;u66Nno5@C$Pci z)`o&?!vfUXv%W8PSf1$#Pz*%b%-FL^pR;T3E!5o!#aV>bsng#gNk-0?uUGEKe+kdT z0Z`SR6AqoQP}FW=nosvd3ayA~)4G#7^`~mVWr7(hgUdGLBXkP2Bdpc@G&?0V|J-B4 zSBwA0d$u_C^`JI0s8Iu@g|0WbCH^Fb3vK=XagwXC^OOYd-o~HXc%2ep3UiMwp#YDH zr&9{;chG@=p*uDmUZ>r7-gX~o{p-YDfP1HpuR7W<9Vby;3@mPly8RSyx>g-80u*ZW z#At9k`9gkr+Yf>M$g2NjY6=4SmD_FFov9L?b@N$MaohQTmqC(Yvd)xO0_ONVG1A2$ zi4`Nlgz46rj6sA9xm#|r%3=ooiHbMRa^8#K!V@uHX*kG{9i9oc+6Yf8bGb*Lt=zB2 z=ydaVHtg<$xo_~_Y;S}{O+68I$Y{O^WZO>6tcw%7Gk8wC|9q7Lhf}ICCN#wQvb6OT zq`q{FZgK{jM?PB~?3vtVe|^8pQn!$#K5<0I#BT1}B}Y!k59@NF73{sDa}Rn~vcdda z1%Q`^4%YowyCsak5AJAAuc$Tn5B%$sIPj&?ci-*L&wk|C1k?#Dk$(0^VQTVbnn5LG zpy~Fb@lu(5Z>$E-eru2fYV?F*3E>RfPiVQI-{Niho2Wc=qc6IuJt?K^^T=(+olazB zTLIEG+ItMceVTOR^RXD*ex2qqd&d@BV1)gUpg7i-f2K zxw!CnBzLWi&8T!eX_|I`HpjJWLQeeS#~H`Q9!#SA1W8LV^UO<~T``8g+OCL-_()vx z<~{#i_r|vvs$_bL)co)H=Kag~69&~XU*L80bsfKf|1sc(n!ewQNGg^4V*$4T``K(6 zsBoEvVuV0o+rr3C$0e!%e{q|U!02r*+pEJf5g3cwlb1*5&0Km4Vh^rEi@Ex^um#}m zDHRa$(o)qswN@FNit4J489bAVNz}$s%X&v6eKNLwt7YiSWh8oI^}iv)Y!6}f%1${B z?tQ;-0OB}Q{kGAwD9#*~|M$lzm;u#^E>+~g1!2UZf%D_m5**yZKoJFAsyxO&wX;qBu>66| z8F6qd%_0I^k^^oqEJ$$Ce*9&Jbp;JH77QwtDRMOFrND*AJ5g1tyn_e+Ld6F)Agh_b zm)Av5vs__!94A(4Z=qbW0!UYZNKMp=YA*2)Yrp)H-{U}wK6_}EJPT85rYf?-@hblQ< z+Tc&7$Tp| zJ2!L&50}yO#3*6sR$9(>&g~14nv7HhbUgA0X`l253RoJK4}afzT+NLcYRf&3(`@Kl`6;hZiEH3axFL3XoIGWd z@9J9R3ohGSxHtVzz90thd%lWOU4Uu=!pT8iGyX~i_KAazcib4a+fsG_C`5@$dI0<}Nq;r<+?|0upK0~r4y{xcN5>5UiS;k9d0(}1(y|<&(^Sc!ep=KEFngM8~9Zdj5+PGJk?X&uBIM*OSl@1 z7a0@uLeS`Vu!&OcIAU-RnE^aJO<`BNp1F#&yr!La5j3%zfHf~Nk)_;sIlyy_2+~E= zjqm|Zj2Bz|`3NYerPb~;4mve&n$~=jB)r0B#a8HS_BODfWrIsebO~}Ts1uc47R-sF`L6i zFqJzZjQlIktV;gquYW1zTGb>mHnQI~%g$On)kly*$>pe2r4@)7Hbh5$GpWQDXKgm3})V3%iN zP$19qlHXv3IrNv}%-O#B>M04_UKi9K8ULIhN2>uX6Pnc|wrqYPP`-s2cuDH&7=KeE zpq5Bb(e>7PHe<;A10uUBsWRmj=ZsC;Zm}j-bJ75Pds_oCF6Ck0ChpIrGjU+m_>!uQV9&WHTO-GdmMihFFB!XxdsOa0IjzFaY6P$mW~ zl+`70-=bwK#1%3sa7j>Kx}T7tx#^b)Zo#wfC~W7AfX#p6EO=M}8-bV~qnK6C(tq_f zqF+&ubiEx-_$T8qKAIOyLDk?q_GPR~=`P@Mrmv(psPxK`&lp`Ws)HmI_`-DM zbQan0vz`t%l_!f6c$j-T0<(jc&chcOBJN$-NNLB~K+#6~s^fn9O~nKLC(YBKjS-Ko z+N*N3O+K5}?q(cT;_#m{UnaDsc~x|`YBKr%!(Noc~Cg#>U^YzZwTstfsq0(Om$8``{m1 zPQF7m~)MVz;*f!q=SbeO^~ggy;Uldpk>6X9IS62M@f1?SF$eLL%M zn9%CL4x32$o_a^g{&fO_Yx!L?B4s zLBf^v!l#(4gVhckCg5omQLFe!ZlPqC49;&fA(-9xarlx_~dvN6dH$j zicoI0p@5UaV$A2awGRnfkdEMjUZCAk%Cv(ixgSEziH?^Fq6TxYbDW$?k*R!a)h8I_ z_i-Tkq3K_}kL zRk4uc5=Y6yxM6+_A*a^Cwm;9<7&HglyA<3H%W^(Q_a(5okxxD;CcQbw1QB4;N z&Ds#cXDn|53~^~@13O$3xfOOd-uC#pu8hAivT?ux64!n{8X4Cw#S`R%CIg}KTZY)= z-!*I4$Eetz%cK*y|L^K+on;Sk0=?~Gw+rJ_xZBoEfmUb>V*8(*NwT&eR$ONmVGO8> zm8oxVm-YONqrr4p>>Y~}WhFCtmduy5Dw1Uzp3}|*BP=}wv9lSB!{7$~V_|i(B4cKj zPBzMgC&ro(_dmNt(d&&62L||zhrh0`T$gwKXi2V4FjfhH*|9>-@;2Y+-^G`m&JUZg z4r$ze8M=RYlojm}uQKB_bqWe7iU&ZDi50wAL!X;U{~I{t(rQpUe|NkMuEW?Jp1Q5= zaRIbAlxN|HJFCVQd47VGEdR5K*Clad=^V`E)73JMv(!fa6&O2BhrZrXZd$>7t`D;sRYuOz_#Q-%0)U56nRdTzos1pfh(E=CBd zg@n?;VXBCgGT^l4$%@#8Fw5TZIX?{0x#|WJ=UIm^-v-4fCzCyC zQFxkVPtN-7x+@~Wfy0mtK;qdcaO4LM-=A|uU&@BrvuMu`tE|6|CoY*QjYXE)+R4z- zRtXKGU#gDtG5Q;dnn~JK{Xu~01dJ)Gd;}0aK*evNYP<|@3F$1W%4q>cyt=~W1DXen z1m-7Fcu>87lD1+!=ci5L!1CpZE0t$jbLUhCnc95I55}ofxy5k4XoD~d>1xi?HXjz4 zwJT?FZsl<074P*<*wUqo(4T;xeKC|WIq#mnecwK>Q}svwuI;pLroeRsBRNB)lsM=) z^?vTeyG7`Rgb?^3)0bZ&MW?MJgXn;S?sq*~)}Do`^iAN3pO6M|bB!e|V+dGS%uH#H7T0mc)2%>r z^Er#+!~}@j4w@m%3^6>{*+6!w@a7~_ooBqvOy~%*UtnX)c3$rtibxZ0(>&{p1lt9I z>1l^kXrk`5y{_=vJ-N@=Fp1Yk0oc|gg3txpgY1e;v+=JIAaImisMK)F zAMt&T!gPfYc8@%sLB&_6Xq#38UE%-n(~WG!nbj5lhUHHZ8+Q#4yl^j4ei6Q7z`Eid zSAvi!>fTy&lI}K?+-OMe&Jdc&DEE{#RPa=-jG28=(aIQrQ>dP+GU8jI&lC(_qmy1)avnc< zz(OW{TsvAsI+`5{fO}NmsWyNQ#A$Z$%*fv9WOtA8LxMdH;wXPy)Mh0ER{89>e%pq) z((*$qYdp~;0OJ#6CC75G91m1<_L=B;#(`xxzMv`5Y_j0@HBbzu^EfOU zO4~sFZv_3R6nq`yppmy|JSBl92%iN?Ff|1Rd!CGTIw_oSaDkWu)=q@s8LG+lZ8T*F>g7(b>g5e`!Wclx10@IwZ)fpejB za!ezPY&>xMm7rIn1o-uuE~~y5UumDmcXt_KHbyvz3a4}LNA5HHtv_f>M5zuYII{yI z?rqWj%z4zq7mDe|grOW_2M9pKM)ry#b5aH-~AJ)Ab@7poD|e7niKYNXyX}G_`*m4o7 zG4M`?6DM|swlwbK?p_&UbSw2m?62K~B18VKk>E~cJsb@<2F89l^Zn-4p_Z%(TWv*K zdS7MED>$_f>X$4qY@&ON2E+EuxQL23VmJh$$v|slL`5;iv#Z0GG~X&H`PP@B@DA zwl)4rX4D7_@0}tl#*|q^gJ1SVS+5IG2+q0@v6Fp8GteE2D_c6vZ&}oGj9o=XMDgMeZGJ5%TVaz>4+PAbIR zGcP!dV-z(KyMhH>$nb*63Vb@@caW3)w`*DZ5Ze6Iah@dEuS(ehjHsgm1Ij=~yp~~EW5*$uH5OA*GEm%MD^84{v48b3JbL$+3k3=A^m8Z-krj-d z4d=Mnkt>7~yTFz&Pt-+HVinWOLo$f3|NPExTY+_}E*}6HdliT*(?>^{FTby+13$CC zCdX_v`gr}G^L5kH^~Fo28P@j!{VHGU>~4SjkAZd3B|&XQ$buGIsm?Xb(iW?!XySQ|J8rFa8UbjDAOxM0Oy>z&@%uduS6ZT`Ew=-tU`Lhn^L4*TNPnu<}-&3esI z)1ND$NtvrhEJ*;r@M_oZ4U16mX<~Zos7_n)3L3Bpn|K&crDHw2HIsGnE?bHcLlCHzs-WEpn zc{p6d3Ayt>8ZmUwWNQ8L8C<)Yc-z^8W2Iq}bzldXd7_!b9$QHqHgV%oSsx>k*f5=v zkpmc-rX=TRrtu~T0ccAk08k`U7`xLg2$vPj9&Gm4#r3eId)q!Q4|vB_f5?y_ct}`f zYm<8AUHhDJy$Q87z}1 z2v7^>N3vYaMzY;lT?(RX2?TZgA#TX2EWcV9#WEb7OW+1oex$CZI8;a1$b*jnK!#ly zE_l-$n>IrdQ+K`QzXJ2EQ~*-F`9lk(wZkKloigSzDt07wlApLNk5$wy)lB ziu)AqSG0D39Au0DPg6^mG%qV)JvC)oquNIW@|ooCKdm)Kx32DZMv-Tt618-L{GcLv z;cl14gY{nx-6u?*x(A?MSuZ(Y<;7f?&jXQIY9BrPNIm;w&`j;Rp6ooDdXDay;Y@pe z02XA2EG|*Sw!CS2W1R>%$lWxm2BK9H##^l}=_oJ?t_k5}agDEBt?oe|5iBl~2GUJJ zufPilYSO>O%y6P&^Dp-B8js=G_QR=nlqN81x4Ds=u2>cG&Z1vA|DkW#EQHX1IQUlb z;kKlwrE8J)nSp!HLexIvUH?BudrvN*52jGAsXKmY&$0000000000002874{gk4NywFW(t8SljT3~CGW0~&24)PHQUsTS7b<{#}<80mOy#g(Li6x#Lo9BbLG zH=!IB000000E3bRW91-YJdVnDk@yy*{AEi+t72f^V_i_Be;~KT_pFoRJIFqgz_^c` zCp*neij(kQ9B3u)*i_y7Mgdw_4iCThYRLNGv-;guy@N$>{~x0*GcOLE)Y*>?_#8ih z4`6s%i<0@0wE||nKgER4RPcD-1A|qy5f+?37%z9ld#8*`V$5pW%3v zJ;*?ToXi|rCG+=Tgx=T}`|U-*Fimm!8Z~#v-!uGm&h{5p(w*Jz+n&G^mA-@f-L#si zNu-rO@DB73gMywpJI!HEN^nNr7maKb2E_92F;87n9+x+>ip$TBkH0kM@YQ-ZG~c*; z5BOuIz@*>MzXJ&tScjA)@>dO~C;`;Pxn9!sOC&%g@SUM;LkB|hLrngJol}r#!Lp{? zwrzLswr$()-fi2qZQHhO+qP}@>=WnSn3su|d|0&}GNK+Q%$0Ja$ZbEDHW zSZcO$vsTtw$^mgE`L(l9|02B+@Te9y_5R(){RBMNGi~9Vk3zZFh27q@bmy@J4(8n2 zNrS=RFOi<5qxfi4E}d=zQR}p2)SEs*wm+lAFV4W#FNu|7%Xo!vRUpVJV^6g}{AV>p zjplcE2zLs2)p-Y~LvvfryrBtzocP_6w_inLgT48O&$!sEbYPMC`>FyUeb)L1Ch93Y>G$%%AaK)CUvL3Vtl@S@{y%g17m{`xt zv%~?Wx(Dp@gPrPg27VT;+P(w!;dkS&YMsZWAFFj{cLUyPNZMkx-CfC1F8DKf+^k%)YozV6Rb(ll03_t5jtb$@bl2+Ro*rbegVX9MY*$}B`KKAH zclphjBwy4{b57si^$A9LRYQqSl@|WBcGPV>m_KvU|#&D+O*e_Mr z4p4M)Pqgl303@K`;_BdobZAt@lT|{q2VMv%aFVWHmW*%;Z}RFDZ#K3=Cs65FlMAfv zGd*CvTYxI20WaBJn-jD{p(@{#S8Tf!*;Hb&JkYlwAr%JwGijyfh-AYWKC|wqERBcR z?qBaiO$7M_d|g1<`{*_>-aNrX#F|5so|?Ikzd!R9DvkCKukFoN$3-L2`mlS%-R+1P|Q1{7qLQs*;*fV#YJsH`XdR%~E( zo@pkq(H%$QwYP^TLhHEu%L=J)0G@1&QdSe1_fo0AGo0t{aer*!-Neuz80ST9&Tw?x2CEI<=`b6{y@>-!N0wqe`4I8p8)hfH+22D_&tv4lTkL?hBeD1H9!=_1Rc` z$IJA~83<|9MH%v=+V_#kYA4yaooAc{mkL3mTgH#;szs?zY^wX z@ePu1yIAvJu9GI{yZmbQy);JA+;8zxNi}Rh(dx^T{8EXW5EZi{9fv|m>4W~g!G`Y3 zYdkrY8vN54sMRj#+yE`qR*I$fa#^w+5<_hg=$wc54G}oa3J(_=AUz%>;&pil$|B{L zRXX&wo)oGt^=YBlOnYKPwdn5wGw=%KnI(LMW7bL) z0v~lhiC)P7f6)ZlCAJoOBB3ojp$fANS&xQvJ*f{yqxvKj_w;Qo**D`wm^{AEtCnv; ztk1y?^DJ4a#mCL&1%8T0eUBg_xKCu!EF&~zt=u1RduQ7MdOZ=AQDPigqM+EZdynM+0 z5D=ZI<<01E6^qh#V%l*u3y`c`em)KRfv-MbXZ)C%ad}~8tC~K~Ds5bn+lt-GoYdd& zYB7Byn`Qq;AzbOW_pR3hTO)PdK3?FjaSJ~etgZVRdwJUa*;fYndeWlfeJWA8|B`hA znkVAMm(hOOeBf{YF0qbb1QTL{R_;4IkWCp<$1q~(#0L1uX56Q7RgU}vW+q0dxWrIh z`|G8)ZbMXhr<&WwsgWeB{slSgxw~VtEVyI3zQTE+%S;P5UCc_zofpM(#%!LQqL9DB zO@Mkdib33NRUbd09Q?ZO+~S@2co_$j0h8Cxwg>i+TqrkRovX}gM&UV`k#})OyFHZ; zGjp-*D=QUPWt=vfZxda} z2>uEt_JnucB%NdH2Bx=Z+b%9>v(~sr?E_>5p?|QZ@V|n86W)mQsiz&mUBfI%4(Fx< zAlcLhf>V^$$b{k=$`QI5bV(`FazP|CZDuOgr*{j_| zv*xl0k763O`HeY!rbS~;;>8x3QcXCJCCz($JHeqq31Sl5lQy$W2FU2gZN!J74oA@$ z2Bv_uIQ0SLxcxs64UG}*0{HL~Hxu`Hx9!fsx%49gwr7MKvi;^NLQx0P`m{=KlCn-Mu=Awut6=H< zi`>9To;Z>0bUOfh3A%~c`=vVi_{4giu5Ph-XXJpZ^X6ak5F2^4!BEe4BNvA2)8?AT$J$)e1n(fvSc$CharN4!J>qcbv;b8Dh$BAoo<-X#Sl zG=PP@0r&v`O3m(7*V*^`00#PUoGIxkk~bs`1qoyi6L8d7=+Ag5&X1E_9XBU+R+bH{uPa*q6Mb^r5F}21{d>X9 z@%x!L-eW-%e|K-k61_-Pj@QPy;oG@4>zyuyZkcKqBup%OF{p|()pwQYWiVl21bHR; z7JdQ%0DC6}Le7u+OV<+Z6#1GBgBDt-o9_))d$Ec8>ZpBYUm}286N!3RpBeva zn5VfOVNsn3=-W{vT);d35&jTI^-I3%0?qrc!~Zk+moP1vi= z!AOI)Bv?S<&`}7!B<-*=bywp#ui$4EBMD;IQ3Fl_?Fi>{v@SW7|Ki~2G0zPLDdDVP zZc`#w9qR7DY)4@|0GM%uDBOH!mcMA*Bdc7R>G1ZnmjMgKN}ys}!McAV+|Sh%(b+c9 zND8E-PE#XK8txf)_lNtnU5Vx4M-k}3^_UIJnTO#ThgyfchzPmVOjv?AOvANjdI4J2 z6Y*qG;be1iRN8s%>|>}&?m}cbH})1s6b=831W%kuZ!qqG35Tt21SiQj&u@R+?DJLB z!(A3Y1ya$jl$3}Qp_(9{&mic<@}zYLqO!`v9fb}XeTmI&$55_P%BmXfG0GYz!=OQz z1NOhH-kB>!gLoxWSkKSS+Z!^T)w*md0T&ARn5uJ?J|d%AwD0@CPh>O2nTX~?qtv6+ zBU{P{}?zDuSwGejd(0J zbB63~=D(`?3kjEkQwq?1!1~y)liFTS6P>n6F1uDZXSIjwq-Y+}Y@EAQObu7YJ2@61G>=pk zF+R#;0i_51t^Wv3^%4NSRuv8NU17 zy{tFk{5}Su=+x)A08EzRF|S83u)$Y(viJ1p`RJ#&vMRIPK%@{=Q>W}foP^9yH6xV z!;oOvQD|&lH#$l+R7IqCTESK)e*HT(!Rp+r#qbwX6!c@ob-is1>)qeHR*Nh-j$hYS z;RO(og6-Vn6>zbgf=;p6-~1WXEF&}p_ye?lijmitq$13YO#g;0)#IT|F|V7?>4_*v zc2uEl#~7};HuK*uvQ`OI``98SvESBoDO};jX4S4~!kk0p4BBeP`0p%wP}Oq6SF781 zD8suW?8f=7%;Rj9(559Il?Y_iKod=YiBBMHi4EFCMa)id>!2`9N{MH`CWqg~O$Ni? zgJbd!*!qAinmk;xNk0?hdT!QFap%!aP@ukYZieD;Gy42vd&x)z!79sX=u&kdt&ejR zP`5QUPx7b%5Z9ioO3*PLI%{!cFxD1(2QH=li9-d$yETR_VtQX?H4>_M(j}J6EWc6s zxOeAIQR{Ww!0uOGcB$%T)dI?d&vtDBy2n7Yb5?Ckwm}lvNYvZr=xn;%kY@KpnEY;n zp*{5c#C896JTn-L@AZA&5&M05?(BG7B5}Z`lZ9|59{d3pEfS`s_6Ujc0mqIRrp&ge zmV!@`igQX{N(^J%;+#!x$%J!|C^Qp%e#809LHn4!rv-Pf+A=6NeH6{`h%y9MP^%X* zKlQ4eVWGSx?>vt^2N&?#DPs6-4|Km)TIPkO!O`>4AX)ARJ0o9(*+Gmr`N*feOzoTE zp4Z}Z%pV1Xq~)E8@KUI<1hoV)hU2ml0Y)bdcl|-LItNCK6ekRZvALAW-4ZQD5B z4hP#Znb&fmS@ba+1pf}qf00~cX)PdeVK=u4QEi{cZ_{p^BCa>S8iwkjZ|*7Kuj^XZ`e9RxqTAxpf&JQ#viQ-bxpXf)W53H@l$z@^g)G9P|NS~;3@xurkkxZ6^ zhdYM@C9)$1L~F<{XXn7SZ~#`Gj@zN(En?ZU4@=8?_rYk`PxOfk&XA+Twa?*l8J>3dkTFfi%_wl{pC0n#HCf?I^}IJjh;LcCuE2N%iO1{K*3zIHu@7dWgF1Op5&H zI7+99B?OjsED&1(X*?i1V&ql#`y_mj1~KZu`lY=97GgRVD{-F9w$DZot2R@~W}lY? zjLYj{k(eu!8EK2tI2+(03jN&{$eX=Y>)9HUC3J<}mqc0bSr{8218fYoNvkP`&zZ68 zQ*C1o{ZC3s9SuFRhA?X1-)fxQ_n(VkA$?&))CgdFPe7z_$EJpNj+VOS@f+szT!hq0 zfA&AjZ@L=X$aj{&)Wr93Ulr{KOVM9?OW=6wDp+qoXZ`^qwI*P=YEbj#S z#RAX|YQcmS+C->y`|^^K_W^B)?VJtznu_8<6SmO1IuU}-z}yczh$(Je&u-0{CfjOghb>ijfM~Ti1wxXSeUY@seU{JCZVEh! zt*2|*?QoZPK|;d9PK_PGJ?!(uz$TJg>(p$SnV?iOuZyKIGDz$*&(U6JWK zXZr<1;a2(rwIGYvyws5MYuf-okYTDFuQF<k<=M_4T<7xbopOycXMn zmd;h&qt-$2zKsj0d{J7~8@GZ+&$!(9D_&OvAhw5}{6&cfxPPuON-~_OgIi29bN?ev zc9-@At9fmH^yu)$zCIm03#y_CjS8&(EC`e=MoWZ+)dxqwQpSbAdKtRgbNn$3Jc^=_ry-qRg z$?@i%(sdwN<;iLM*GQbYkiVjt#O%{Q3A4qXdjXrZcp)R?!0rGF9Xpd zAXq?@7Eg#z2kr+i0-*TUM}GB45_ki}zz8(4s+oFBzx-zWpVr$jXZSZ4OXPHG_L8&w zhgXyG-$V6ym4DKj+Co1}{h%p2K(dk8;u@U1$GhTz0Y7_>sL6gEvzKK9)PDq7uRDhN zWH!#QE(8Ny^QXC|_hWZ&cr2qKA-2{)4+QoG-Uy`a%r&L3nvz6Z=to1l!+yMnay|I1JiiBCE?9mP`hGf#}{h*BK*1j0*axQ8 z#B!I}bO28?=Yn5$rUY*=Xe`WI5TONm_qWvHx@3uBhmw!Ei({4EnShg$4E0ssa8@?3 z33i@?AGj_IyzI~QQD@BgxO6qvIPz?$Q5@1c&r)N8e13tz(i82T_8F!k{J)-MSsWST zG$pM&=69@4j-nVr3*c3Z(`SvdDI@v-X<;1qJtF7Kl{m~9U&wS5j6Ad&-!@3+jYzZ+ zvt45iZDjzX$iVgX3dOwyUv9k9Hl+Q3#Fd$pU<&IMo+%=TSt@bAk*(R&(IHutyzil# zz!z+V;;xbXNFBq_iQCxcrZ{#OI&djyysgT);Eb#0i$Z2(<)5FLhY1T5XkIu_Rsq?B z+A5|)#j?WQR1iBOX8`J7vEmU!&BA13ho{uO$K*c?3ze z^u@kH_NDnt57mwU?auO*zr<=i!`#noZ&RQgpCB9zP54^~)`!?0J(02wDdn<(Lz5eG z$wC72p3R>xcWS!&P3C`IULM;pEo_Jkv@)R|$9Nmi@>4##Dm?>ddmUO5a=DGwi|7T0 z@B{$Cz`3?5jAC{lL2w#UL-YHv6O;0=g#l-|JGnVVB+tHgR4%IZuBy|*ik35SjvBTN zr08^Jp>SR-rxxo0#91784KjaN*}3{J56aB93MbITLaryI*Qp2x%R2{{eR&zo%-V#psYLfj2xHmaqMQso$=|&2ubL09+|m$T=?FvO7uX$G`YWr2{C)3*OK^*faF%d+SX6J6yL&&` zhCF_Yn2Fk; &kup)zDdlk8?*UL*Vd2~|a;DtD)_C!KavrmT$17CMzUyu!Xag#-= zWJ{_kP*04(-W!RYlG=uL-@g;|`;Me#MtTH7L-&Tg6?Fm*$?vNX_Wb5aZ7BO~`v%Y7 zYm;tW>uL;M1L8u-#k8X;I4+3XKP);#hAR6Evnb(^Af5Py*=Ej%$n&=-uUkJi+4Ve3 z+d!7rxSeH_#&;`WB*rP4&Os`gd~N@%HIlPqZaRxbe_?~KCwxx;6oL!bOFSk2^)#?& z55&tqTtJLYkhGjfEQd3Fqj%SPlh6^@o=9rC9dN@9E0OvE>DqXFS$a<^7v$Kx(CNYd zSpLd+s~5w_+rs`);Ufm{Uysyq7?d%%w6SjkV$-Bo6;`B8#tlS632!XKj7*>Dl&3P1 zS5Ua@j=Hx~&RMxOrSM3{(Yd?R)Y8I~uSzqT8C5ot40`6Amw0@c(_;b)_|ouq7lZVg z_IDYrDH4^Fd|$t-u`zrvs~TJ>5r$~oa>FMpn!t<|Nxq(G*xc_W8GzWf(o^CaKOfb< zPO}BA?2LizBZzVqfp^anSE}XT&Qj=6cT)(n@4)gMZt?l3erT=m7MQ*(o4ih_8p{P| zW~v+-5MqsCBVmLJ-}y6py)*uDRw(*{>fj`Wp~aVaR~IYPyT~bBy&f|f?>H?zmm_ZA zfJPpDUSoB3IT1ur?b8@vdLx&3--10Yak9rTU0ORogU*~4DyBPNt}d4n5INsf-seR? zp`VQ-44Sas5~&3G#0{%Wd z2R_lmtWxX*v3@d%vpTj8@K&Q}cIEHylBK{ZAA>}>k;lW8)~7ALjbPiB*Eps|1qVU# z&D}Rko;}0g5nf*D3~R-XPQJ6~z8Kj0^6_q}Y|XOe8a{}KpJZ%{jE}2aJRHrFG%J8C zOOu{|qq_D?b2^Wa%OGzE6D0n?82qu*ZL{t=Ou%Ee=LLi`nq)USfCpjVJZK@r-SjI) zreWX)s8L2Dlr^d#fd2!Ap8%D_l_HS?wMxncNaY~t7U~}mo;Jp(c$`z^6eYs`OhizP zq6ekFQaDXV^<}m>Ky+u3r+{mFe8!|CbKwRo_NHS}DZJdvIe4%?|I>&}GEYR@ za*bEcwDSI!WS~H>^^>s-N?krwf12oA6Mh5leAgp;3H3sh{HBgAC}skc^Ui!2`!FrR z1tYt2oYYALo{Z;lXHY<^b0f80yaVEhOv94A#@W2rZYrbQdLUiJG&P4xrkfK7H=Nr5 zf4=#TwU2jD&yb`tq=wnZO*2w>ANVGzR5KlujA7!wHcR~st?Hldb7a`()kW!`{OJHh zVk$5}K%vh{QhbX1qG@$nx9p6kDK3lVpYX5Q%?`TbWuEINIfW7w3Ij@+dfTd4!@n6b zJNR=J4`JY&*bzIO>-!8!-K9r*)Xjlsatqenil5WYLhhBT%nqVLyJZhd=cSKKqRL~5 zaqu_5q18p_2N-+%JPuA;tc%T^0{E~w&a}6jleBVpH&`nn%{tfkG!~Masdm9GimH=+ zNlCvuwv8pCPn^^yDKBtd7(x7{SMcWsIR(q<J37D)N@nLvMg79% z!_3S3kx1^FUx61-Rx%tnx8;rNwKY&%79}%2eTb~11kyk?wh3tq)#ZHbn0sSdUKu<` zx512m0j6~f;kZ{FJRMr_V)dr=xhbz2zi^zsw{2u1e@)Jo#B+g%gS=+Y z*FKGQVyLm3`Qfzyy}Eh@+bk0pNndDuh4|GA3|?j;%#zs)PHGtK#dr2mh~(6;oDl@U zvM|DpdUPol4cySj`ybDa3k-BIOvg!UNBV2Cj%#=7yw-CA*?vgk&p$HpBSq(9Jg=3< znljx#H=S$os?$Tp7?{hahN8$@(u{hwa1yW7(46QI`jHtEt7@#>t+}_KjPM8uMTS*| zx=g@>zh)P1#z(6o1J#1e8oSnXpKvDOEWCkTG}V!C9@l*2vhtU` z9RXyRe!gJ;{*r)-N^M?-9jsp1{=0OHmC>BMmhYY5o|Uze^}B3$BQtc*>t#@8>9B@~ z;v9-sd`&*%&^IbPmtH)Hk*r!+wZbc_Dak4V9>DhQ=vFROwdVAWVzLFmqx z;G6R+x8|J$adjl-Qm9h7PS786h*%LaxuS8}E{xU989Q7ZT=U_MC93D%NYk~N9dJfr z(Vt2iNqoM}MZenp-3uBeIr0ml8FXEQ<1VOXv&Z5OL3ak|U7U8 zve1DVAz6^w&dJJs=p0~@62y&dL^`1+I}%;m(8SUY z!{%_B%P$x=q1^;5UX-h2c3abn+z=x;f~iDy_HqCMtByb|WSjvw9Re+cuk34w47A$e zDriig8`b@RXQ-kvz}<2BC34<4QF1t#ets&V;G0)EohBuH3d3VDdy!Rv=7d3xt4NLU z>@V8_5SGE4L`GhDqus1E(+}A%mC*pf;_-QSL8g)=Vp0Lh4KMt4B#BZ)_kwc)qHT zr6pa^aJ*zR(lZg$>QE+WR(pwROfNtY3J@GGtJOB{{)G34(X&}Ss|GO|bpAQx4{z#a ze~OR?R*%-X1h3?G&d}RtS?J`Ge)3gmar9*jPnVsm80p}re_6C*PBH5#+4sP~+QlC# zi`)Wd@b=UN=+$7Xs`q3@?3@MKXEE`@q68zH1Xid=LmVgj=)V!8;0_{KgYgnbEfN4D za1qs1Sp5+Y&FIS|_Nq4fhtgqzV67xJh-P*7cBHx@|b1hMr`B(q<~z7v9awaW1|+#s{@ zUWs5BWJ71NW+QUQn1B+VJp5X+b_Kj}K%0Eznltf+49KK?JDkpf5rDdzSHufJR&MKz z$~!m7SrU~Ysr0YmXi4#}WOjtaS8Cbi9n1F#=TvOtB{|$y0$!G? zoA5uLR0zJ<%H44H&&CKB4o z#rLX>HU=%V$tV$!^UY%*w;jva8Y{Hc6s8tn?UWv@zM(b%ut}-u*9cOHiEz#1;6L%< zsaQT&rJ+SD-EqyMbpzOwoOXepeEw+GTZsmjQT8-dhd%h;{MUeDHt?m{?QtA8<_cVU zwY5pi^By3M#2iHARH1ICZdobcA4poy^p@&QF6+(F)kXISYh0dkI-xhLYJJfeZfzoN z&znL^K_#_Kf3s?)Wg`y4!a?_^0)q0cZZA5rE0;P8ZNHenxvl$nAgBq~3QX)Ei)Li* zN&>`^d9Wtc1L1_geOYE?g1p-7)u6O&ob8MRFyqF~w1wHEZ34}3c%{xmGWPf6U+yp=O^^fmu(H_wgi(p( z8i;N5lsj|Eyj+dwUa?gMeO-|`ZkhP&!jVQCI#16_7P<%hmR z!leU1Q$>*Qn|DKSH@2yi@LsD67!)-%Bkb0@W9M|0=z8a^_bsy`oma?usm?k(2N72a z+W9+{nlXQzl$qf!0Kwv2iB@}t+2J9JfBPp??qA4?u`Bn8{K&t|@>^!$XjMeGkHED+ zOSky0rm@w6A>cY#`n22V!V}h$Y1^DX>*1$Uof+_y>MUfhQ;MU-@zZrUlX%nheH&9k zn>i#mgMR@0U~kAo^G@m(lVwaJOr-ZI=$$;a`B`j?AVWZM~uwPCT_ z5`IhFq;iE&&kGF?*U!qi8D+Oj}DmKy&&vUH-|VwUvILvj9FQg~n~e67ab>V(x}rOgzDCINlFqsitce{L3EGSpm`+Gz+f8nN;UO9laz!Fc z0TS?xXd%%~E6`^K!5Akc>QQAIrT91Ox!+=Gz1SxoFaEjzU$AMu)2VRk+fSRHGz7>K z+D~O8z*Ze~k;iw@RR7?}#sJzCcham`zFWa6#bghAR)8I=G`RL@UY0BPA-vtTuizDo zGYW=^i%2(D3IKJ0Xe)K)FahxTX?F)uoCDPpr`m zsrqP&2yGy805P)^LXj!WwK!?tza{vtylMqtPKg}7uYxAzAT(G~Go%Yk@SR)5lW+Az z$GKyz<44V2^Ngl@%y3WHb z!1S%fzpm&3$vitB(?(nVqWlz;$uIA;vRLjXa93M>y8+rcZ?e*0$R6}HrmztA4M4`Ru!AipxFKknLr*07F6j~LC@iw^7FCm!J#$@f zmQypC@IVSX)?N!H71>Y6(?DhNnZw(zqpd_Xc5d%_PNMb)Pr@fMgkJx!qoavHd*3(T z2Snw4KoAg)OHtw*ae?8CP+i3Y2Gddgu`^j=sE(gRB>#8~&LA0ovAIcxoZAh{zGqP& z%>)G^y_4x~yLPioy!B4V%IcNP+ga{RPILe1gePRDSdi|5T(7BN`B^&O?px}F6`se) z$HgX&L{SSSo@CBEON%f?Zx!3W>zy`nKFO0a8W)RelFcmNr&Vn4-=c4Ihhvgy40d{5Dyr1 zrT-*YP!K8dG1oK$YZLbGwAtGX;h(T;!i*=a1$yTm)^XhWR#>V|Khk0dk3Q%Ekt_*w zjlGuAi-x`##vcFXoHgyRQ(~^cNxqV^{i(y20NZZjk ziee&n%F)+DY2kxy5j5;VmkW}BawSD&1_&vpbsScq8htvkx*A`cJ1f->BV_KXVC-z|ofXUS(a=4!HS)=7zVGlnl09|S|L9}p7`Rxti@$M3rih}I+Mf6d~)DF$2^zk~!=Mnh3V zxEu*sjgMg}IQ7aDs`(NM!WvmA$*W~Bi0upR%&lgh z>A>#JoJULu z0c{JW%o@~3fj3JJGud+t3Te-*Qo&=FLKKE_g+#>{Loiwd8|~kNO^~(cB3tjR|dK4RWZkovxvaQs` zH60lJEfdE9mTYJn6hh0neY=#y8gy9zQ{uGdrkm7n6-u?9hXO0+5Og}0YE4Fl$qz6R zFeLnzC2+8laLlYIw3Lw67DtzOv++UPMuT8IV~-;eGffx})QnB4ZUp7UakeTdDr9YMMZIX2|F$-}FO({2&{$YWks{;tYWT%nTDU+gVSN$lXzBT~)b zox6adFm~XBuUeFyM`Hs5Zcr7(l8Rav{E~w?u=uYH=1!iq$|=*<>~K_>r(ptvitt80HEy{Hz}#RI@7h(8h85H~-uK=q$(vMmRZIX$O49>aY!;X12Gco# z3MdvPv77{ZQhVT8q;C+GW$Fv&+JEz~a?1cZAuT)M4C?$jrk$I98W}3OKBS3wrqFSO z2`RBk^8+J$YIYd=IoFeT|1Y{e+mKEhku4ck=}g&34tca@OAP=bew2CaCn|3-AIuWy zi;t_^K1r@i?rN<+Vfx@69PE!D)@jZhK8yxd>jyZ5!bSX3mjTTejyAncx>)t%Vu%PF z7Xxb8(xt5n=Y6bBY43inD&Po0|I*~u&gT zJ6BNIU6UydVl(iq9DV5&4H8G_kxQv%XtTnsnGW7ILPYvWoUD&SUi^y;b>#O zEL2eLLA4rYL{inQ;f=BP1$#1-6Dv=y3X2V7W)_4j59QFs*vKXpgr9GKGJXtS6nvL? zXxbpu;4q2GtZ;Qs_A*!&Bjj8vAMb%ob*%4zo_f0+y*=fKArat%oS@1Ip*UgVUC{(Z zPt;UwS|Gd43u5s|nendA|b(0tVnk;Bf8#Rfr*=&>sGt!Er9JT{(U7 z{f*!_d3c@~=T2sc57s)LV~()uE0IJ4Fl14dPNE22rPoZIqOunkhujWqj7#=`r#}Lc zN&Q;ug%Jo3*$|?JrbN<*(P|!XiilK2Skg~SSb=c{y362CdE+|ue12va0-t}sc*lKV zKnh-DSux8iAb*+cC-aydu#3^07<()b*n#q1YP1U5MARn}%elM?%=$?aH;V=NR>$R{ ztB*oL4dNb;2DV`9p1=ERFn8&8F_)z=c~rH@&b;WqsW7`w=QRJ2yh3mqtA*Xq1nsf8 zw^37OUA~vX!%lc5!ZHz)QurMgqDfGRk=BCa^US1#*3B;gED6jK+)kGG+B5PCFLwEC zwF_HOfGjq%p3H~Cwwim%M7(|S#4N_T9afC#;p`ymWdlc%ZWr#h`d_GoBPka|R6LdS zaVHH2gBjn{kd)Ppc*%&F9_cc9MWX zJDzYDJlC=!h&K*@X6(O{9KhC?Zppq#+9pc9Y7M*NmpUbD^HU zbh53^NKUq|z&?SM&d&VH?=ul}dp576IySD5`~yKCL6=Zp`{~$t^T>1i@`Xr6Gk>F*f7N30{kPyZG5^)3}?309mzJi;cCK1J+IMU{hY zB?IkpIbcD}X|m9_?tWUl4Ksj0tyDvssZellOq~Akqo{K?x|6K@Zt3hJswmcAv2x!o z{rylMuf`=N>6FXER*!Lak`vp$7dtiFQ*s3QcLXKGHStc+H{vm$tDcuTejBHFaDr3k z13X3jM?GfoqM8SF#Q0K#rP^RD1NgP?e@jpPUn5XrXX9R>2F2#&#w*ZnWYn89aqU4n z@4^QF_~OKAOoCCuWCfa6F_5XlIK#_hTH&|S0uV|7#=m-(B}YnU1vY)$=E4|0Ji2GCbm4F=B z$qt}aY}%BL(yA?wCfokTxffTbl|tGI%p?}K!Gz$X8unLw#d~=_ zJ;|3fu^Fc_mJdt$AnxO(smGj0ZLt;R@}~_<5S_kDb}9c2Je-`rw+#y${$dFoE9>D| zdLQWVCi;x=3eyRm6vv36s#Ef|A3uC-1+v};8oIZcmdgt?N5CMpPed@~=6@NViA}u) zooY>BWZJYtFt|(b1hG%&>!P(?XO@!^0m6TDVE-VPW2(=zTLE0c;25I&5G;E_#-_;8dvEJ%VU% z+xaJ)y}Fxn)g9@J!|@Z;6|5Nv_NOg266V>vaTRX&7I(?0kbhx3QlDwy^@RaTXAYz- z+$5DSmj!M~2nsT^mL>^!(zj3LH4!&ukt-uTS>!YoYiMc7Zc!L3X8q=vs>moozjeAb z2UjZG8HG7=o82s~j`wTj;Y^Yu5`3JKKe~+W;BbZpz4BIEVvyX*3UK|Hfp&Q}9* z-97}0{lbqCgdNNe@o>~WY}#Sror1q16U?peaFj8Ak+1w+4uTy zvFFuhXIXCS77!tA5ea-my{Vw&t@_H9lvVTSBAr=8hkzv55-SM`5Y9G<7>$cyh!1vK zEtcV!lFn`gG;b}|R!Gudl(PH^9&f1QmXxpXLPEpcF+{ikHk!p@gD1t?)K;te_Q6nr zdugukav^*Z?k3s007A`aQ3ZchSjA^ zCgaXG$}bm64>#h)#p16v#P`brNmsU2bO0Q6q_Pj6dK2$VUj2q1ZDbi|r(SqESrLlHl6r zY)G89P^I%%Pe7<8@^c{OA%yQOfx#Ch3_wGWD_qszT&W`6SWiOoWX@7bH6s9`$#+Vb z%t6#R@kVi~W+j&6f26xZ3~cpl^94E5mYM02$aWlWQSb(HwR&xPRKK+7?KhoCWK&3` z2JH$s-{Y^bq$xnCNx;*N1jI0vL?JA52J3;)q4oRoj{GYmbV>}#glaa>AUO7#I zw;kBaJcx|;_ld7O_IvheMSbROsVj^ABw!qCCS{WK$pKjf=&>4R74v8B9&+LOu(0Ggb_33eQr(RM!`2h0}m`Va^n2Vlr8B@>pS^; zJUo}Io3iT!q!T0PHAx>0>QKxdG8Jl4fTutWs2$|Apt1x%V@T`ORN_gT;YxavJen!d z%s3|W9T}GXxtV?QDB}m=BEI+JTn47asdmOz>gQ!lDw(AzB^PxiD9LMGmbClr$7d_W zAlHDlwKieR)}6GyD2nPO5>cBsUTqC`B&P&$h*Ugq8iXAqd(bWPpe1%6ax1KPp@m?e zdFb$l7)loyLDS(|L|kQ&fPm#v#tGAH6YvA(pE}f_p{U$$_aG=jQaX>eGubw+zV_A- z5nb)lMu$|WTJkv`^haG0GH=Xg38kDN-)P(gw>s|PImOU;$z^BpXLn=AOG`tjgUuYU zvYk)9%2d(GB06V$=>gNp4NUMc<$l{dQhIR9qa?A@189pX^fg1@(Ga%i(c-v( z?Cs1&e%o95MC7tUH6rc7zLEE590p(z5;4a{5u!XUkfQ6dJ^><2*N1$I+hAc5IfXD` zt5%>x?zs|i7Qk&O-D*up{gC(Oq2FD?QtN;K03K{YGSizsRZa>wAmMudvDoD5jq(nC z>W5ya(W46pLFU#NM_8e0J)t}_1D=|Q{i;|0xSRd`W@GtEuZ)&oMjZHsS-pXYlg|~T zi7nixRfF%b_|qI7c$ozar3?Af z?Z4e^W&i7bn-b}%*?EE=u0!AkynG~Hi#>b=!)t&eBM!yo(PFDJFcUrQ@;khnHGpNt zm^1E-78r@R=mP%Sx8F2Fg4ITC14vajgaWqnv72mGFJ&;WzXz|&<58&{Vk6)tTock& z9v**h+$X2?t=Vvpk9MF&s1d2N*A!dif4S>(hgg^p^C}CFRdI{>Hh_Wd%9AlDdF7Up z{nOH#8oU3xQ)dpoR%J&KwJgpJ61rO_0X3Yw0RyZ=*NVLk`gPwz-v`*3es-H;Mq3#@ z9|UW!RauELIz>#i^PV(1&XHP+_?&cn^=@}N2X&C34gBiTT_@3dws~|oqf~XJ$r5(S zsmM9yVg7Q$exKqFezqXM^eXOZ;Q?Pk)`-w z$!tv~dq!a7%)1U@(K?DQ>o;@_KQQp{inv?jJS7WREHzmLr8DOQL24EMhz9(LNEm?0 z`teWkhy&V3LC@=(u{v>ftFF6afWfhEbbE(JqmfTD6QO08;ElN|DM+rF*KGJyNZKBz zL&;0;M?}O77Hd1n#?7Aw)(-Cqy7~5^L1Mt^BhTbov&ts^k$U!HYs7f##_!A%75O_Y zQr%oH2lbmZr)Mh%gFg|$klPZjxezyO8Wq|t@{LsX(IL=_0F{z4wFLyPmQHCgc=BAuS}~=T~0^8Hnh%K_K5Th=^JU*i8`iQd-&0cxh%gy<(7%?zS=e z-fuEYl{MVQW&~j##sA+1j^2C@N%WwXr9-DAg?(Ssif(nMBL7q0?-BMVVF`X?fO3id za>i6nA-L;^Wbhz77b#l>coPFblm^*w)!f^kJERZPM^1sU);TCV0LTuFn|PRNdI!BMZr$Ni zt~r(2n|IYwroq^SXJByLg5>?DqebKn7`PWi5;|TYxg3`MFe6^$veC4wF59>u4XNw` z?|Iof4J9qom?JC=TuWjm!EF>We4(`dieao*2<7~*b=zK;ZTkK$t_l;RDa$|UMy5MD zoD|40pFuI_;|GyJ_LZFFA>3M8?bI~_8ojBR#7KqkMTxSlCzkg)U%vI%B5X4nEOaHH z9A-ipg+N>i%FfLd05;I_TuC`;Q08Pa^H^*4+sYHCjkjUCyA-KEW?t9M#(l`OuF^>h zGiI|?sb_+he4jmk?)GOSh+TxECxV>$48JU}LLZ3qBdxhJ;I@vJ_8wDRQbI-ue?Z@u zzc)J&#t3nrt|D+thDdx+(e%idOaRY;`|-w_UkiTl86GaRs}Zn3(Bjs>DWGcjg5<`W z1YwY|xwQvg(y1!}gV&wLvM8+ZX#n{HX=pupTKRFT|KTSxR7(tSA5LY_Y+wZTyW-nF zjcRt6``at3_6}0S&;m`t#fbfhfuWyXCVPq`L?UeHr;O#CO-9H{p0#V}GLi*(t~bzZ zBRQ4W@8E_4W?CNJ>FdJgcE)4XrL^*%#5`|5Q;CQ~hl@`H$^3;^#c5^a!o=6R30jT< zV@hPSIvi3ZkWu}9KF80Qt1&-qEZIB#0-#W6wOd4YiE`_|13?`YzH-dKK#~W$eZv#F z6vNmmsI970GD&~{NuQWG6SWAqU;qFB0000000000001%xDK!fDh$Udc%7`dX%6rnc zLKcPwCC;l5%w|&!a?PjAf$&x>&sY}p^v1zzPOCxYDm|~rO5;mHGBLD&>u6yKd4lI1 zk=?(-Ig!>99<%bMPeP%58&DD$>;P0-ok%L_dG%R-g+Hw!?BvRk*O2}h^@Z^X#zg0@ ztsS-`0Q3pYvsHRzn()LZ1}1KP_mrR@d$r^D!86$g zW_8zvW74L!b%AYEl+(Cj07lQdREz+XFA@nGB-=jnuX5L}9dXuo8aRTYrgsMo6s@%z zE-Dj05Wk5xc&Bo@8a!}n!LxENc(QrwVEfn?(Gfp{Dd;t()Qj|eh%+EIWc%$(u>t! zXQHKiW3!5&%6CKh%75S-k~kYdD1Z@Rn<5%d9X4x1Dh4f*Zo^{kvHtEgyZrLzTTIv8 zS6q`7i3&V;mk7>@-Orj7TaZdm=9hxQCi8j45=nHBRYutR_xrwn*S98N^r$k52(j|G zaKKk#gl75J`9)wh(4UxJRPSHKc;`H`;dEN8?YzZYKLl7_yCuiEpv}Dkj`^Ekr6NM% zC=T{9-P4}&i$(1DknQ5Z%+|bh@R%~TCAvlmd2sjeH`<^^>a4f{b!w5YKfw@G6LqUZ zZtW%az5-RAJZt%BBku`IaW+t0|J1;-sAbGb7Dyd0N&45bMMiFvP2(azoEUFnY*WScqk$ONqFPD7z3 z%xbJtHJB(hi(&3+!du>VzKJW)zNRT8w;f}&UoPm9C`1PAiU9y$YEK2r(#6M_NbPRg zlSIS%?YSw$v@k!e8gTX|HZ4FVuY0@3;WWW{I+Lpo@wRwT>%hWG2Mq2_?6&$*NAWBLv9?}%+VvOCL!o7j? z^|MGBFp|?CZxHmipmbdSN5tNw)FivNaOqM((Ci(wlu5o^c**ubpnn3KYOPXR&-hdt zJ@N>z((z?n=6*adtq>#kU4HfOq(NnB+4*amA{tn%IzhNykS1xwb^q48CFugj_JWER z@|GzG#gY#@(IjStWls6>m*lQ!kOv!Io+YJ?ZoWb1m%0tR1xZgGRiuWywWr_-E~bgTj|RsDLk# z!Ck#${r7Dg+7ce^($oq*@j$QTowQ4P%)wD0q}}#8}b53WocG4ZyQ6pkjLn@Eis!ZhUJm4 zPUn)ak{&--akTdH8aLTJb%vRp(NI)-g-;^iHsD5dlknJb4i}5+x#G1@G8#7C z)YP&NZZ^UaTFSb9i6uWMJajWkAliryd2QpZ`r=)chuXSL{7$ev3^)|ACm?3W032e_KQ*g5(c}4rgMiA;hVC?P;M7^fEkZ?z!(pA^*JV9m7Uc zEh)Qa+a?b&qTyG;;|pcdiF_RRCXbsUzg%kXt%v*d(54|lZi-$}8gN&Geyqh|5D_Q2 zb^30>VeF6<&Q&UEHh(%tj-KOfGLg*V9>VXl{fxZnE>$skoc*EH6}px0Dg>|f=hgbh zcv3dZ?sJZa`ZjLufESzdzJ`9s*sBgT)di3ep1$e9v- zHwDK_LI{#9EdG_kI^`v&w`I@$rq1X*EKgzh`bdJ70^<^J5 z53p-hH&=cDF)kD7X2sSd0XpBE-&2Cjx!g0}*sft8!aHr1aYAGT3Oj3r@#ffCNA{WS zM_Uw>yK(1Du0YtZrILR zkdgR4APl}yXBi^yZJk2Y@OvZC0`a-PrTTh`7CQDu+Z$yVnYGKWnKMp z5;6YSZ1Qo9udT$hm`!#|5)C#T0f8g`k}6PqB{z>IVfr9ao|}XWom&7(d7KQ=JP?MN z-rUUD<3bc*VO!R~i|* zqL0RCGVpcvSCHzT} zuRo4T$4sYGPa^khCjB;|m1zcn;8rzGAYgmY=ur>T*VKLRo9&N&82|@tc1g0!LKt;J z(Y7q~mSxSnR{x>uMFa5q&U*4TD2Xzs2jo-(A(Pgl8nMn^&u@TIJA8qxK(UryvjB`qe-pmidg8 z^|V_x_Liy%f|h5vc9!?PEPPt^nUkbPe<)ASTVe1&*%e>xjX^+PQoC)tQ?(*fuD)w3 zZaaT46Gq$0@{O)mO#pp6`##=;0V?fxSKeTa7SX0bdzOnIx66* z%2{mta+7vZj@N1W1>4t{(IoTg4y0~H9{jNcMX+VXs~-~Q0>*iuRTaj=;?@$v-#MOf zaKL{rCe^Hj(${dHY;eLD-Jy)aqOl8A;Cruw2x6)(rb77wiI2q7?TO$m8W?z-pQ(=N zpgNFUqP9m}QaEK|4M53s2`3L{@LN3#B$25N7F~inw9n*IpBP(JA~$R*bfS&|?G=58 zs@I8>g3JWj*lRD{hl(at!^&g<5>@nkDuIIJ#1i2H!>g;l0W%{$<2-=Gixgd16$YG) zVJmp92K9(LH3Ry~mqkQnN5S*BK;jU$X$PGwxqH;u#n6*ga*is`IE8DNaN-xoqSb@h zm4EwayH~=CZY%J603Nd)Cqs|)V8%tI})%N5*F*}gOV97Fq;;g@s2b<7de$u zt+bxt29jE(p4KoRdgf!Wdbn0l5FG{(2ims4NroTWEjym^mLf$Hh@#M_qirf7CS-4ZSz%!vx9cACV+D%;4G9}TX_fC`~r*1f{au|*DOsi1_&o3sxI zoj+RbsG0ZcOVG<;DFe67wO8Krhz38DSys1Rdm0ta3G!7M0*$|iSLgk#sv+Zj;xza&;}xt54}H8XX3qH-8@pkl)H@B3U!#!&=~k9 zqct))!US#*4}@VdN=-Bp^o~}xjtqEU%097B#LkJ`R(au>2Z(hma(?*O4T2dQPQMH% zk~wAV-Weuo!~UKIPNLwT@4wj`Lj?k8F1HlYX3$1)*qhU-n{|8jvHWgs1QG^BRTkP( zL4Y#BM+gIA#w=ctxBknHs9T+!lP(e;+7FJNCw0gs~f!gPDz$uU?D+z2xaq~LO~q|>lE`b_Hf>hjk^<2odpK*D)DY0 zGd5ZJp=$a^R3cB{RMFx^@aptvfu*$VaV&f99Y&5Gd1hFQW4&s4a4BQ z?8Q@8{fUjc;jlRwK@}_9AGkucM9rX`WJ^8}2E2KH^N?MkY(V8-TEHnQEb{)`b+Oct z7VEU$^kf)^En=`b>1Lv@5T52^au)ZCH6>REsXT@j&~3D1SKaVf0z$r~j#i+hD9=S~ zycpuZ>CHA9^zmdJ8D&rH?&xt~e7>s%lV+w5V|xI;FLBV1vErvBMg^maXjV@sN||{I z2fDoi(f+rYn}V=9o+iMuzT;*!bxcQM`+JC^!$8s$oVKIgxChK`VocG(!+ z3O%`DD07BFx_q0tc96*CKQFpgJ34RwGXUyuDKW03jVGB2ycXCG0wrak{iM$eDmgP*zTh}@hGNxGOeCC`;Fp>4U zL1_&$FK|(1NzaRSsYk!0zw~O^L~T>F;wRCdk(e{Y z>QPrg<)gohUb>f}%_pfZcQZ9Qm2sVO8X~^iv!v z%WPFf$FE6p*H0jKu%QFmL;4W#L|V~#leMrM01k=8)79G$G;{vXddkpO|U zpN_|hcad7z5YoiwMN|x7`L{<9rFl^z3RM>&NdFMl@K#~TnA9XG@T}_-u2MBS^w~JE zPP}dUly>>CmBY)G2);`F@~gP~g)fGQS_OhcO*BO;%~Jo-NTxU5`xX^1t!F_Aj%2ar zFNvekC2X0zCtZt#z<35RvKY=sOpNhn^Oc+;_?V&=wYLjumCLETKqs-8Tg1vrxaE08fOw8lcu% zTz_8M)S~ajm6?fSU+(!OH96mW(An*H=Jw0=N20&trdyq!(&69O#HozK_JjUF;}<4d z6!*b1oSo!jXB`?iSMZ_>0o%W@4NGkTwkg&>02!t(-R<~lxg-nq`)HRGJoW9#t#z!s zE#>ip|3PwXho!y%&-fsJ`Q-6iqG2MBcZGldmj%GzZLCBEe}r52hYZ*bL?%JPeYiCl zDWtK+P&48JH;}nD@nzetESH*J2`dTF_%i|BUNcYu72Uc5FeII}% zx8zT9a8us<02{L}pJ#x$>!)xB0T1NG+ybUYU&JGQY#~5y?AxMkq3n8313qSK({`q# za*M~l0Aw{JT8R8l(Rh(H*A2-8UI$^{L2LdG{;iiBR~is=pEYYsT>0HXywDk88m%6H z90`S(b7Jj}9Hx_+yyW@KC188f7@j^iR~p(1h=KEFImLGFY z<~SG%>~!|7lMWOG0tLg+^0j%CL`h?7eJl?bM@a3KeKFNl+fJmwnh(ZUrN}Dey}{r& zLWg>=4Kx@jl|JN`xRr}?O64QCl3d37^|A;t3O<#{oE|=KX#M!GRU@#a-E$qmlcA|+ zWFdY2x?q8VBfly^U9wTdBP8+HP7sg`x8acxT z{vpsgF{luiol-sC7pBMPMpZ>CGmbI`1=JLwXuDUvNWJ-hP!?q&BdKQp=(iVKT%qI_ zVTUX}%KLpj5Bl9dx{XjH41b`sISBlK_gThPNSxsZ%xO5T%UY6Hou>632}%$Od+!)5nWb_8)4CpYKO{dwWNl$Zp5F zvE()J=2^GU_@GY~SOTw(I|bRZ>&F-qAphOpoih~)k0EVLA9N6mr1#+Yow~e*h96Y7 z1nSzH4GuWajX@F~i>naNIZ3Lal}vS@+pCNP zOs%+C)D=s!zI%bZDS-0XxDy>g6Vt;NEJi_6UF1}#>;*>DsYC)>LTT@|R8}7jq(Z3R zqaJFAqZI}2A>RL1skbsnEsnoPdzq*?jGZ6GDc!D7sXU1f+n>shm}H=M3lk3(U6!mm zdzzZPSj_?fR0HckJ}exd)_jm!(Ou2W`2g_f0k(aA0-1M5-ThWd)i^9mIZ+WiKa%pL zhM8xNJy?jB3(G~3voT=6lu}gH0XCwcTK|cnQH`HL{-u3@c8VIE4pU*5JKLpAgNUv}Bh@tbG=l;WRpO7M3qJQl&wHLG zJ2Jm6nK#f^$ZU5Ly9QICG~WqL!)gCqKfntLrsAoTc*Xvz1f)^=L;pvDawTWA^bSl@ zL&|jRW#JK|knCc3Lyx9c`kdV=SXWGWjK7Pf&>1IV@3a7N)P;n+kSkj(d!1|`;@Zmm zgNhjw7$KYWRTqpoK1{s(>o~h|)0sz}hB^9kZ{ASLT;(lVMPy>i9g5OSeq><<**nLZ zYw4P%OQg>?v)=ltl%%Tb4X=pc)K+Os*SKrrvzm(DD7C35FONp%WYjGI&BG*-AsDdw z(>)FdX@`4XxX%Gy}e8Jv22``8t}FO{Ie%p4AV**87>BLR7p0;rwjTnLe(k{n`mqZ{nOLXT1A-XanQC3jj%gdrFKH|y=n77Yx_ z2L^Lxv16w<{!nU@XuDUt0^Ql~M?+s1Lc@yj>FBTZ`1J~eLmf{Gn-^t2QjHmas1=5k zd>tIeY?|Zv&XHdh!Zmb>vWs#s`Oj?~pu;fYd75AMl$B=ab6zI)Hi{XYT3~m>C-YMNOaGYZ!MPWL_(%Zu5xE)3P? zj9#?XNSooKQAgzeA?Vkvg|W!82-XL%3hdf}=^XA#zly6xlJ_1ETTK3dPsUDdjaBfw~*h#fiLvv}ga@9GOdcXy_Tb;;!;bc?OtWWMJaOYtncC zF~v}h&r7K0;zp3;*>V@I*nSIOl;Kui>n4-k&y$k8Tz$^;qE)P0Qb@U&Z&Ls)$uSr&-2<$~sI>?%f zTCI@mF@s8|FPMhQh)D_at-AjWB%Fd>FzOe>^FI25BPBN@34Jg~95>Wz5`@F2CT|+C7GGWS`3d z?mu$eMCm{GA2!W)H?mKQW)R(^x}jAf(3%OzU}fe*3HnyvqH8fF;Q5*`czODDF>Un) z%V4Cu4T?l17Bh2gdEH~}9oDVu2fkHe)bw3+TBCf{&QX+Ik#l04q2gWfYTXvNm>m?( zExr7nD=XA=>Eb^5yx9-MU((vv1(~#$A%)x#z8w1g|B9m~zt<~K;CZe&XZ&Olzr=hG z3a}aonHl*(w|K>}{-(lt-2YpZ$fHRl@`X$p3L_0v0~Ot;u`^iqwsVEXWJY1A_O48Z zuMEB$W;;E`x%Sk0pCC-&9`p?q&$&%*F4pa2ebTKgJB5B!;VR=HQ+K_Bq2aSVSwY1K zA=Dc->23Ms0A4(+(DQgfv99S!e-H>MQRL;`2ngVx{1ra-4>0 zb`N6ZWGjztGw$dY@8+~cI+mqmxLfk=tGHZI9|}=>9lG34NpV_a=|yX%JEKPwg?7{` zfw-KcG8E=CZ6Wp3M_#5XDa zfRZ8~PV4~Mm&ifAx&)NNbCf4Yt=;5RKoM96_Dn>rvf~y8iV$~6=Z8-AVeP66G1Fl* z+WbMO)I$f@&9Q!m7W(aOIY7m5oeB8SU{Q!*8>YeoG9rGUZzURv(j1_o)i24RjaP=3)K+&)*CxL0@I9Q_qrkq~NH}vqx%i(Cqmb4X z!*b2wweu&$ozg`3fmJ_Cc(3w5UFg)T4#I7k=Uf(|(w5`Ut*j!?AR$|Gey#LOu4A%h zL-)}UyDbff{;c=t$1Lkv_)XSN$(bGW-2{J{p(lpP;f-fxA?0!z%%`Fn4c4P1hrME81=`5qIn$69AmhB3ZPM&9wFHm5~E(ie2 zhKW=h-LVeXRsQLt$zC`}Mx=rf(~(t$4oOa=ANy{n6=)csdLWO$KDpXgfIFT>Q#fX4B7 zQWG@8HJn++lx4umdh&4$beJC`YGV4=m^-M1K_KhmOCp*5;bNX^=;-3vAN6x+yBzQ| z9p4raWqAQ0&!JD%S50oK9o3%QLg9yJ0Q8>0d0ObeNm~o`>!0vXQ{Z&Xn}ia%*qjn& zb&RQ%PyKIYZ(6T7BH5wd$joz#>as-)zXS&4{>bu?9QPmQ5kkk2#`EYvRCjG`aQaE5 zvRh~jpBn<_!vkTt8@5n-m;f`<9oKV&n;(5SAgGQEkSNpW_(=TwrM`-N&r4o%0wq~q9HxDH$$Fp@Q-IHR0V5Nx6_lGAp#cVyx?X?dEtIazT8}NplPXYl#$sI(B@+l_2128Yp)~|KyYG(HjSX+AjDeOlzO~^EqT(6=UU$jh7M&$NwQW ze4(`0iSUTmHanO6)tLtzFe?%#En+8IMvW^`y2#EfOE`XXdWMtcA?U*Mz6PEx1)nu)b@Y#7 zR0@4IGf2Lp`tuP*ZvoGlg?y0|UXk^kNv-$9rO=w91kJ*wab-W5zkgY)Gic+xQw`J& z1y2yWu2a}U-y$C6y<=t{!YIIg1Ip`9fRL^_s*rC3@YNCYzpX9+yE@?k?+w$n@)p{~ zOXcKM_iP4{P@f%@y1Rrm-q*IN_E-kH3qH5YQaXI?7I7Ep%PLKpbhNK@H z1m7(AA)(Hy4VgJ@T_$tBSB{kJI^eOG-gkOU3}1x(8~R>KbBufN3pJ%s*Rh0Km1SkE zInU&#w2-C6pxpP%M8tHs(TL=jb>Hv_0fR?_|DIAkH0u!=x z!a(?$3W=tdDKdhRo&3m!*bV=_?@QU{H@6cATja=Ih~~H6;us-og=!2a{@j3CBZ*A; z2#Cl>?$>sWR61$P=f?hTsmRicu;HL7j2z-bftez@sR9H+F`jyfl06JqoHveKuTqhU zvD;FW&v1P<>2Gi2I~DfF=f4OQ{^%BYt7N-_HO2|0Uc@rBUgwfos+Y505-ka^tU~g| zHFw1FQezk5&6EF{t@S4VK9QrtUpf`8+NiIKu-fIhJ?E$gjgU1SI;ai1e_e}Rrpuff zvQ$Z?$KzU-hePAo4HIx~@Zmn%FO(PgcMBA`42$_TcXc1<)rB|#1X;Vvf zi7`mhJQTEaq-dKDZ$l=Bu3V8T(_Vs%FQqQKG=;YJX8^EWYDq!OjL-!GWOWwPwcB_- zjK+lB+ee{lzT;{kjEI-aOvu!7YT_(Y3tmOd%jzuyHLc(!kBjlh=I+D}uEkYQlRfzx zvYl&-bCLQ)+&Wx^=?gsmD&d2_SiBICB;I#>Bw(^3M0plB}aNZiy((m`X;x`cw^>hSz z0dq5ON?hbxoZQV@s#YVs_Nuk65~ZQDCRAZ(RI&!P(QUNFDA5MkPz+1Y@|$)J}7#aNG7d} z{~EB=>_Z_YL{9RP0O(@*3ZwnOcAT!ty42&f|8gJYcpk4{0{nqFF}qMPz3P5g8et=W>EZJgn=5k#=sz{^o$pg7e~XQ^kREeg3IjUOF%+`P73|wT}}n zO@TPh@tHn#T9rmEZ%;|iRdOjkMME0>pibUtaj#PiK;nXycDn)TTSpn9l9L9W`guGD z@KuU+nqPD)JlX5)#E5u$Pb0A*RVS3A)T@LAUa}po0=S{T6SW{%L!GgP1T@ZuXf-DtH0{3K=T9 zoUbLgF2~t~-sQ1M&B@>6bS->S152iO2!x(Ho2O138RJTK`t2%5u1#wlC+KG2y`AL9GLv6Qg=jX zn+TCuG~u&R7}(~eChw8Ma1S2td9^cl-5f8&RGd83x?ZXw>rKeX=> z*^F-@O#IU2@TFdTeJRr&m`cMxET&M_%M)1DC>4PWZ)6qkr*nvd90++}?MlWD`Glht zjlQTj4Eao=Qap??{y3DvxWDWlFL<6=w??C$fY>~kA!V@%Lpq+k2Q+UUULJo$?(g~o zmaqK{c+xPwTi^;Djro(vc)w4!O$B5Ooa#xINK0aFuwN`oijdW4@s*tgwmwTZ9sRcQ z*+C&BX4iMpYoKW)X7o{72q9vKD`~n91hr`}+~(S{4?5R?-e!{KV}VpBc~;N`A~fl-&4gMfD%Nrj~4l(Y#?_#U~hz4 z9N7yxwznpaS>^pqH1sxuRkJq)w?2%IoKs7evH)H`rTo#7%|{MMgEA<%(JBQOldz_W z3iUWA#3Oug<#-XTDkxvgC_1E+WvBJKf9Lf|?7BsT0#s%Wj6QIktm*aWWM|^Qz{SA5 zXbUfP5Y%Ep0MH+;H*~G!zYS4BB+|fsPJ}i<-ajOPiL&sf%+$fwS{{Fabd7et`GvV_8wG2^xd+m>zH$Yz1Q#@ZxH+rkk$d zK66k4!}zY0!}0&V1B8Q0ADr!5D`8#3-rFpgf6jrxPL!g&fAc-EdcTP_*j4%L^a{sP zI9>;@5o~kM6ZGSPm8%d+f83BGfhl=Q8{p6Q8Gj$BCzoiMyd0-jdM*eQh16(Z)EK@; z(u37#3yjK`#xuWM)0dGKXGmugGC@QzsR6_FWNCs#UW_^KQWIO`Y_# zHFsAP>`a&sjbc@PX~LZ0q&7?3H5^g;dwkZasFP@Ja|8`Rlqx*AKyJYRz>|9@>$VLo zyB=-)@a%DP4ixiT9{!GZb1l3*H%(>n3P~uSgYVznST84mZn9&XR2SzbmSe~Zuo`Q-xTP{zXa?}|lRJVFS$TgK=T<-oSU-d0E7~gb6oeO=XPaPGHlE{k zeLX60gZKr&So5=;&yKBEY|hwq#!ywT;n|AK^oT(cN9ebB+*dtWJ} z%5z@i2HGNY6@)#kbG{2sr{W_ZR%z4IaKn7@1b&v>Au^9PyKlF@>8FkVf?;D$3^8J9PJdR6X z!gfkfKMkB!S3r&8Is+SVf6V{;1!uxGl1bmU(TN*LQ&uB<-1Xrs#by9;g%{jC!5SY@ zCmWL@2b9ll5e_736r3dF04p3;23~9Y2I0#Qz}5Ut%w6f-_=>bfpNP5(Hu-Zp^e(|F zcXP}*DBju!@N=vRqZcNpEB7M~fYIiT8NPiv7Gu=Q6~EmC$pzFD2r1OkyCSbrjles(=GtLo?z@ zVt}iaBL`l6ZcO5Ivup#`sI^}o-}m^N4NNN%ilFVSGknj*1$CDIhL^~b&E+(E03 zfSt)3>uWzre2}PwYM2Mq$5e)%@xGV+f2+>-8r62saBR$#D$Ij=wq1>nT~$KDS6*2F zo9ru!AA*M27-0qlU;!o3JD;ctIZGTYzMA+E@S9&XMu=*b6%H+2;TVx@HelDb<2y?U zxE6@{o8TeJEA;t6x?d)qeLP4B(MV4oAwXofp~E*xPHZi!UhZbe4>vD+!qyqpa#Q0e zBVH;v>cgAM-lN*l9SXR_V2^bxyw{|^c-;KG%D#@aj_{_;;{*b}Fx^W3UM_A$ltJTm zFiNWDUv23lWKSzC7hT>EVEUOpz@xBjyD3p_*L27o1oi8&tgJwP^*l!U?}FMiNQGH< z@({@VhKBvdrsffx8d={_Gz%ta8|1k2)%(u0iZ~c{EVu+B4X@p;rFs$0Rre2YS}UaP zuaD(K;dGQxrAxOKA^lGF|Cq#J$Re)fX|wY@+oZQU3r)`d6Qv2Tg*}-=!)yzkD}4NH zjdZFvS9}zxV0kcK!Ev;e|4LY3nGi7z)7>gg;^=#io9kEW_d!h~W`aPUhw8KS5xnd$ z{&xPmJz62ZS3yN?h}Euz%_}O=*DrDhqc2~4_U1*-?y)Q68BJfv(wqutj%8^S=aiD+ zk|TB{8ysuF8k+-xv)s{{Vs z@LZg7bWvoc*XrVefV@EG>E}`Zq}K8d#kMRn_itSQveYMbqJDauED85*1zdH-H=oC2 zjxkZ$m_I|r#Zxf54zz$JJcmNCKdjw6Sv<$k&cuPFgCEx5W)7d_%HuaJAO4T}=-8-r zXa!SSr9#32a`oFt`SJ#0Df-Z-SF?27qgdFX=y`@1Q;LJoO$SxNx&hBYcz#X;HF*OQ z8Gb;+0E@hdWBKA~*~>h)_$U&r9weWWWK5cF+S!DkVFQPk0Ju{FiLjxPb*pN3*!%Fq z>!jfA5UP?$KI>(3^O(B`5ZF5y3#l}EwS=KX9^ljw<45&ZiuO2}@j1rwN7?2!ARspk5Y8K;Lp!jB4AO}fJC{nuEKHDwyEf7pZ5@fc?-fZyR^fczYBp+#( zUI0Qdx==z4fdL$6`(nO}{_F0z25<*5kMo4Lbs7!8e_gv;DE{T)js=S}%#Nie`>Oz+ zy*DiN8*D=jhOXGZ1JMXd6_944^>@064Jsxa8Uw`Ix{a~gh@}u zs@T|xEI-^GM`GIXbOC1wRH#rvrD7CnBI$(wa*EnPLL(i~t*;=v94Q8bq$|>z`~&(` zU+EbJ716-ZIRc5)n+}Gno_n%c%cvlGYYCiHMu5TB46|6c=2}u-)N_&2tqY@#0po^U zsSCu*j^$djooJ20m(LJMd+ta#^&o`q9OSb@6=Aok^{TMU#3}*V`igAH;ntRWdtbG( z;Ck5w;6OK(A313DtNZ=xfg$JhS2dbmQY41zYsx6{)Ot?1xl~n>5az>)`BIN0VaH(e zKK1*oCoycDMXvV0qnR}MozfgL8JSs2;>%rq)!;5}ZN7rE>JSI~8jN(Y-U-_n^|K53 z*p3cJkIgB3jDURP!$KD9m9Ky{X)$CsL;meDu@^z$WuhNZj}*?TQSeX}*gJE&)Y(0t zlsNCY*;Y&Z2VYZwk6s%4L9Pa6GVT;ZEpgTM63>4{4r4}`wFtvr&>X6fmznt0B$oP8 zVi1VQV>q$IHxmcqY`}O!(p^2SYn+Vy57(_eRToqe2am5jBJ6O9K*AkvnMc0I4a)b=sN3IK~o|}obA%AKBpFEhH3D2uhNu*v?5|nl4!aq@KXEb zVt~|ihSm0W94TE-0>km?ueZHH%0UIK6wg#W0{qJP_(LUG?5^jF@|i7%>}Y?ipw|_7 z0bjHQ20y}Ym=D5jl&aeQqZ5=p4Lu)HHfvr16~^m`O6C4?1&Fg)teIeUyVrMf?NvrL zkXT{>00000007v~a8{b{5N1|cxNdYVdr5D2YHvqd$B38Yrv=lNmfEX>%{n13=Xp}3 ze1ZG%C_4wPZRyzosvuS0Ud%L7{3Nt`5&!@I00G)YB@gCg-XVYzNM^lI!}+C-cdMBT zq-s^1N~BIza&9VkLMuXS&uGy4V;C4mfrf=VKd&nMP{9h)DznbXtCexml@*XpsDhTI z86yO0fC4^hSFqN$7Qe|tDpPy{itq-Qe6sTWMAz%yc~{%0qLA6JL`8lx0umJj(?uF@ zqK50uFEJ(z0000000000000000000000Z9^r9@s>uy50hV-duE#g(MCPAr|G59qpY zAP35fW;*1)Q}bm9u(w^QYL?^MmIxp@sVWTqk2t!}00074H(F`Ab;}fM{8T_H6)mMm zPxoEh1=%l%==<08Tm>^~Pup_Y3p-4WYp(pp!R1+r>{a|9C-F-_FNBix%6%zzCHc*? z`AUw?!1UIISfA>N|AljB@=FnLzI0%^lWdmf)#ipQ{z)6(Ar)rU zM+`Z&@%t zC@uWRs}HXqGp*hQ5hMTr0D3>8Kd7O|fLQ2tBMIF@SE%KO5ly#;=b2bLo1cPLD4R&~ zQ|C_}0o+LhIicWn& z>A|}1vD6E6Gf-No*%rWXvVsp<7+F!;nOQ2>BQ=nMtnP*z8b=yS(^NlPLn}WL zaf}A7yhf(hZpeDEMuFbEr(X7wan+I>+2(G-_Due=^dGk_9AC?C~+}($efbWK=0ZOK8*uB#oW`dsH*dEw$~kfLeDcn z;V~9xNIeDZyuS&dL8AwYWcv{;EtJjRsy@nj@)d7dCl z32Ufr8u6WN_Sc9;JvPcOqSdx}WB~tp%Ky{wH_c`RY0WbQ1C-;qjrs)Ycu9{8DKFWe zE>!~=*ixMW<_haGxYe^<{1`s*SpljRXzHCcql#jte@lmtqccz#jZm1vD;w`|`vm_` zbFId|CU4t@3Fj|bcsWCchQwN(oC$?|yY5sHLi36kxfUIRVhU)lSjN<|+WDm7C-c43 z(Ur0e(O}bTDVS3AqsKE-(RBaj z^4ATQ1^Klps7+l;EU?HjY4wLn5V)t-ki~e~C!C>J=@9yMcWFGKDGPqHBizlWAZWI< z!myv)c4B=|+&n66-oH=d5mglp^)VzD+9`9T$JadzcG+*=&58oTGLUIeCP`#nai#z~ z!i6lSsYrj3pA&oo3%=ZuN=|(rzlX*MJV3-|f>oK0E=cJOvJI@Ut+AoYrrThL3Fw9v zQYOip;Axa>dhZm%%?=>h&LSDK%c5g-!!G;z_Qo{Y!tC7Zm?t)-9yD+)`2uwV_t&^X zb{nTa&2lrI{-OoGwMcPOs{ZznpQsTb@Wu|)7MG<#fZ#ZtaaBpo1@{CO(Qh|tucb`W z3Dy0dg6iUhd2CCfb|D=d0|!AI8B3{N44hm@Lg}-6FL`5ackCYo?jSIiL=3cymSJM| z|3;U78-*B*q{vZoDUCo5q24DkWJs(~NLX62pVKj=OS6IoUAB?~y9 zcMCJHb3YuHHhddIgnWG%n+sKe(~pA5|G`vB+lXKDrG5L|E9^jW5$ZZcwEvyo-35h~ zZ}U5}YbNJXya+)5rG1x(Bs|9NEMW85;Vq9A(N&+m7{_+PdY3wWop-da4Q!|)TN>xT zwTz*uRL=w>eEu7JVyT@c<5|_YZ8XS~`}cYusZ6%=xB|463lOQqTrZAn7xl&@j8yJk z=35H4!aZf2g(?AP#Tcf9*#}{|e^d}5h%u?m)b|0N17>Qe6Dn~II5YbD^&iEz@2vI1^*Z-nmRkIfs^etuiWBz6zsOnA z!TlkUVqClJLQQhP2N!Nbg0dozyV6d@(tsUz_CIpBmKJ>ww!ys8H1f?LFaU3(9$U%{ zIZMg196D2wsN&loQDQRxU8o2392+0oL5anJ6ST;cZal*fww_m;B$?YTF)ZIxj9=r3 zZsmv&>yp7Yf2-t6X+2PM0NtD17s`pI;%TpTwgK!c9UXCPGH%6le7E*k)M4)gyoRA2 zq+~ymfu`6{Et6L0NnhCB~&*8qm^)`+oRhe_W1OhLYp)pf)9WV$R=0ufNBl9Jq0)7U9s z6F5U%^o8sHe~S3iP5WBu`QI*uh ztY-W|sDVhsEwjCN4~f%B&j|mA?h=p@vr(-?=8?=N4E-5G78qOIvA`VWE^*{-A(Owe}-=JU0F#gTE;zp`4?9j z=PuYId88GNVH#Z4uREi2&4p`MsBR>moczb_A>E#zOBd;Oytz@JfN?6dy;{SCHT?Wj`6-T6^t0wJJWTXWRp)Qp&<9aJZji z0EnKWY`n@(aru&WAn~C>Ep(#{$v~C6^0_ScYmTO{)f@wC8KM(^>^W}R;5dH zqDJ~VsgkJ3qbp;)6{vf zU6Fr*wM6y+w#kEMzj+8J)M7^--Ng4~1OXtgMDkW^3q5~uF!gRKeY`Yi>ZnR2r^xS= zf6kpc-o?)<22AwPUv<>w5xzV7RLPTzLfJfcZK8R7ste-xp0pCRH>*52%GZglA&DWG zRlQs_%M6oN8N>ZgOG~x!t@TTe>ns2O000000007y4HN$tj5wj@^|9G@6D)y;p#-WT zFi8uWd;9;dR(pT{kbi*9kBy0F(ncjx-nS-QEQDbxvBadWgZ~n!6&m~1b1mhv=sxUd z2$`oWh2<7Ymt`E0Y1HNe=LhKH2Gl|?L=Cum+3vpK{?)#0iP4OJ*V)sEZ*gB+dF$~gDmRBfy(W@)t=A8jBVWi&ysBjZpr1ZtUmJj>9}ZOJ zP`)Neekf~rUQVbKu$;{>1GJOs&r-352U&jVr_Zx2aSyPW9Ap!a*AuK{MO1{^RW>>`N?1%kzpyKGGEC5{ieUHq5ZTO#hg01W^D05)xC zl*XJzmB(Nqq5YvW#yPH@?5G@sFE3FJDdAuSpM#l_EGo;hY5_3nLT}{rI`)Sq(GJF- zzyJUhg6=6WOfr2L8_p3b?#PRHV+#W?zDkHE{y~5P$TFuH_6jI+zS4Q^FO38c?hZ#L z1UJx8ylgTJVnTIlB4!|Jd}&xRQtZ9{es&L98(@d&hpMSL0N!wj$wcX{fN&CuO+Zbt zy%%?iDxs5duV*eOK7FHz`Muw05WubG56)|$-`z-Xlln1vsL8&9QVg*TcGB|rc{-7t zl(i}WWS^K+kOb#484D}7MPC$7H70R)H%5(P6K*9FM^19^Sy2(F$b%Xb4l`I~8?iB5 z{KF8{`b%Xw6jtReT`rLg5fcc3Yuv`Ri9Y>WF(4`NFQZ=!Td4^f99k zes^FZ9A!fLH{IMNgEi1fCr=~dQDC>+kHM!{+le@j- zyvd+Cr;bhz(MIJ{HQ<)uvf`|qEv6|ekzUjq8bd)lzHaRw|Jh^sJ|T#*Jcz-po|%1?iU(vP{&Jl8#;5^5)QNMr)%0F=F9@CTesNxma;WO<^gu@*F>SBN0&!9OQ4xLZ<$XQIKRhE z!7nzMaK;RKyT3me3wXNW_6GgQ--CodF4mIUlB5^U{I6)pG{OzF6W`PIy*4E@GeoA~ zAx}}0tO}@r|HcW+B8y$M^c6>d*1BVtz(OkIyV#&s^9-0D{9m2HrYhWB)yrcGm-7(+ zEbfsBqfN%V#=#Hwv}rqcMryElsin+TV~!rJl?ppHOJULJnxJv&?~-e)_WptZQ8~EB ziY)NnDJr#=5B*s*uf2jjXNACqhfHw*ZS1o5)dWOLCqHWz+Q!L-@P}X$n(5sQ+^2qG zP*lkSD4ei1H9`g+HRPMf*Jm^lrc9CJ9pjhQw7*6vGdsbE-Hf<3ePl1(f=@05I3bQj zj~~gE2(7++PH7K^cO&}bUKc;Q({?2`Jj0pEt_EnZfN6zG1H%m`uuU&C<~76b$b5CY z^oVs_&sm{q6^z!j@M3a9FSU+;(?&b>OO~1l3Mf>Hf0$1zW6KCSB- zf6h&4GN;$>i!2@9$GUz-+egD%sA7L44HBd3HO!{ZPGZmyC2MuauAr4FCfN^Xtc<(C zL%!9PB%n4Z9cDJq{@~Mn!(6UHI1!?4PgpPH6{ZYir>fTu6Aa+IGI+!TjHdix&ppuh z1ijGE$Zx;;Bp{ZvX+!M+Z+V<8v+WYijeDqx3o1k#CPN$qt47`em=!a@__+^AE3)`o zfo@@blziB^xmBF>f)&vK?>yOAF2~q!TC8UOSw6!sWnc}VEs8G?t`sLz z3N5DBL1Yj9-0s`}8J`{uWtl{D{ufD&V_RxI z5;i}o`eOys79rG&6mK)vfL6u|zU0^cPFij&Jhuj*7&7Qbe#n>T#C2r0f>SdqY|9BN z78dcAU20OqO*Pe-Eg}585nuDl%F1*=c3lXQ&~dk_c11i2i^y5Yp4fW)AVed10NW@{ zyPxGE`ySJd-JAe7t|W$hPr3Ztz%yCx(YFYzV8W?x{0o9&Q+VKf<5;Hr>h91^gw1+) zyc*vj02GBI*@`-f%@}oW%Qb5n^6x0^?O!7)&`Nk*MJFYqVGx_?5|pZxCHBMCWpBV9 z%NmSXJGIQH^TxdthLQQ?&k&iIZyePTN^O)!k%ewPWk9I7Tv-rQ@R3-qV5%AV6U76p zM(f2-etv6Os-=3{gWQP^E_UKX9UR48=2f*<>#cgDkpmfHJpU5BwE_vUf~O@wK1xN$ z*2Gx6?l2MI0}k)<@Wayicer_WW$RBq`Hf!`fB>gC%ZQ7hLLDkr+!1-&zGNLo?>l1%QpK~!mMta^!DdHO%dX^k0EEc}%OH_H(@}|F_Wvknt4>#qG#ASz~ zoD|S*=&GekG#gY(3dtq}mPSnh-BAyydmRH0>HuaKhkYRVG$%hRr;VHvB|`Xz)0+$C zV+Cm-H<-9x*SAAFmY<*6Zq&6KCYd7e5^eYwm6}2cjytINp+Hn`x#>-hMA@&1Rcsbc zt*Ks&X4vjH&fot{#=f0Ljy@t|Tkgkmd?G~77}pHDOK>ga5^9N38xaNIk{BcSeGW)IP$Xl<5Cjapj2dZ~#An zj*?2+M4_DI2h*xe?K6nS8E^cwL)RRS%lGU%u>7i^<&7@DPuVBa41QCTvtF!P=U{j6 zhd!)GBrRZh*6j>8S1PC?oU7%s#t^3IW75!t!S6%ZATU~zhy~U98$7b0P+}N>Hi9!j zKk-`rl65;Ho5n%Q@)iwb_@4<-9$%*LoaH~ARc_D8ODc-YlR;s{t#ZA1Kb{=#fLLkH zVf#OGb&mhph9#hcIC0ns$k>LJmVc+%lwj4=51ZcVmVMbN@qdEmOYohQ6?CV)FZeGu zZ3?+df&PXgH3cI6`$`nm(i(9a(*#UI!pha##{c_!(T?Xo6&2Ti{6zIN=SsRFe}+bGje-g* zy4v`>XVzUp4Y$gl)D+#S{OFv|%Ki zPSW2@WY5C^#3R11j*dBA0{2EXrd`zyMTCZSV*mD;wsfJelvkW4_#)h)fV{omFR5vC zYQWwj0JUpz6?eY)N~N6f16{{Mur`0ST3%7&7w-DH25y{QTkIWVIkHL*Lm+0<4QYkb zwC;xfs{>AP?Z^pB}{ry-eBH`8PUEEXH6s5F+@^ZLtek+^l z66wI!7Qc}ooq8>k@Ne5l$!*L+0pR!b0M`mwjqk&yO%eKdHn;eBCGj}fnj+djkXT>)K12=cJ-N5IdYJ)ms((p|(6HZbe>3-}`Ef zE2-%CG))S=V~bEfog3D-sYP)-KpRL?jur9S?54zDNHaql6~B8K7Bz|-i`*^!?ux39 z*|3YgR}_F#*IeTc#%pt$jV!A2F>=_~yQT2Yn^wNOfC@wPdnCF+0AriGOcY9eUfG0Y zcR35;L?sPspwJg;_U3DaoQquG3HdrHRd%iEJhmV^siN)9BOJVh9Vc-+uOH=nDsc_o zm$>#2@uB+tWj?dIldm?vJ0Wz39alq7ty(Kg^LKO+Vp#*bPrzY=B*F%}iH~IgF+$a0 zw{dcbFQfy#;_jZ%21%}OmBB^N!)P98h7^JaBD`|jEsRuT7~|>Qp4_nk*OiIv{*s+= z6-Bd4PhSb@b)q_{hd&M<;I&2kfZlYhgan41vVfrW-r0(iEb+9A7$O$JLVtK+4! z@e*1HrCa+`6LS@FKmY&$A@DF&)Jd(SVGYGNIZ{+&8}AtnU^hBllp7-Rx!XM8Q07dRe~&IEAEA=uw- zEcDOfY7;%?Hd0QIvh$B5^T@ZEi25lU^h}M4s{sNwZA|_mIq*=U4BW8c)zN7i?53QR zaYESmoSHe#mvby(u28x`^9$OWmhX*=0`8J^JU1M!G^JRDDz3p+O%`{~;CVm?XlFv@ zkfty^yVIrV)m-d$)evx4+bbBbl{?{;mncAzELTa9bC_MLQ*U7mO%*tPt?}#9sX6<&>xsAs#C0Lgz8DIjN;z7t& zK8%lFfe1Dpj59}GqF^B#zV=F5W7}C@BP2mYDSk5TJ8Ukuq<-a5sm;hUcP=uTHaG=! zg$k*$J29>Bf8ce(vjN)NzY>c-l2~I8?wOMU``hTsL$t#v0a^qfMgFt87}vizgbgjXydm;2mT!r~Knqt5Sbj__~lOSSog@PPGd( z(}8P*+b<+*SvkHKV8vR3-MEEqs5%?8rhR54k000000000000000 J00000007Ie$mIY4 literal 0 HcmV?d00001 diff --git a/public/images/ace/account-setup/organization-id.webp b/public/images/ace/account-setup/organization-id.webp new file mode 100644 index 0000000000000000000000000000000000000000..5675089e4155597b53c787a5efb0bb8409d119df GIT binary patch literal 20010 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 M00000000000DJWfCIA2c literal 0 HcmV?d00001 diff --git a/public/images/ace/identity-manager-getting-started/registry-1.webp b/public/images/ace/identity-manager-getting-started/registry-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..34ab39b0bbcac7c6e597cd8472364153b9d94ffe GIT binary patch literal 28622 zcmc$_V~j3L5VkqCZQHhO+qP}nwt2>L#fLjz&XJEXY23uD&(u8vfx$!HlQK^ z51{_p4X|95yq&K~Tt&PL+z9~u?hD=poPX^D&@bVCL_hB88h#xu??emN0~G>a0oMUU z{eJG7B*$>UH>AT|R`laZD;SnGluol<}h<@X|zl-`+ zefR(I{Zf1vO!`)S#ja`??#ukn{nETRdr5pDJPM%x)qThQLjS4RAyhL=3rr$3GK>U3 z|Em6|K7V}{ekR`c9rbs;BU=%+6BPB8_(gtdz6Cx6ZUGtsdjZQ%co+E2fAK5-6ZviVq4*3q?4JbO02Du=zh&RgUIecKkNW!q9RQ2Jk++5GhBuUr z?H6~u<9AV7^Q$K0bu0U~AX%Cm522{$R#s0IoLQ;V*^--r*H;Jh^$)aJfT*4-?Xq8OIVAhLPMBSA-BW>tRUa>_w5?WbWM+RFfoA@mo;d0@ufr*8q zuA&Ra=@>-$&_d-{f;jdZC;|+*v!N=tq49u{z>L*>e$_m|6a}5z$%3^~-FLJhn7?;F zhklKo9CuRt5bi=#%pNtqZ!LNd(b+CD4Xu<8XMT%a@|0cYL!SsXE&8a^8nb^XSFfm9 zE;RW!p??JOB#KeiLyjr4IgUXXcKc%=cSJ9Fm;rB1Zd4;qV{z4~DI z*AD&bC%5_}V?+!ii>=H{m$tpVY9e=YVW9@xW>4@yCrXpfAF4O=c^4%H6AZJmu1bUs z$>;!%OA$uior-`lkl4po06u7C{eU+Lr~b&s^1i`ufH+wZm~$-t(l6Xd_j$uSFP3*n zw;)5+?ot$wGIR1%>7SgMd!1Ax6tdV*vU{m04A^WJPqllo->tcMF03~dq5mOwTyM0L zsxanYDc}%N-5|8*5QH^Lt+RKZ57#pMuZwGBMz4U`?eG$f+7<=d|Ho`Df@2MVCJF#0 zNIN2De5C#tqW@dc>DZUTy(kd3GQtwNq&j(QOc{*_{~uQH%7gMShHB2-_6|pVJe}e( z`E#H0g&ee)o+{$lqyArkGFEZM&%zLLrQ87H6m&7&FwZ=KcP;48Z&g1S)xp<#@kIH5 zqYaUWp!Pp*!<`ozg94bF@o!XXO8lEgmmZ6W*?iV5a{m`JhZUHH*Z`Y@LlA}UUoMul zn|plJFfP>}V?zGV+k}!Hi)%_)Z?gD|4|iDgozE}jcQML@f=8`}QMv1Ous;p=WL(fP zsYz@l;^uU8(Z=1bKiNn7^bd3f!`f#%i+Mv@VS-Ep8AO!8yEZ3CgZ^8#*0x@SL+}!O zJ~r@ZoGHFZT99 z_lLziX7qj_>iitSuvXMWu@2a-t8XA?e^2C=axzHrNo8&VMwh(~PX}XdmHRdJ zO(($r61MmBi4sQ3+jF#k5#|gJvu$|!F4OVvSnXQQiD(H~kib>8nR2<#*&!D04rc^lv40ZvW-1e~ST92S8sb9y2d>9U{ zE+529uwH-GDu4efk0o&v_e$z%0O3vm)zM5EGfiNr*53&-iuu}(cGLY8<)?G6BH{e$ z+Z}rGCN8I%D;t3{d|>hT&Fa5y{2yBWpPc`%^gYJmd zf&9GQ_Fuw3R2bQlcd+I=u&rjFPyZjC{&(;HUyb4cpkKi6lS3DHzc1r|m!$s&9Ak>6 z$<$II!Q6ZI4a8&GgmRNEcG%y$7WPTHfB@dV%`V!QBgfMAVVCzfnS_HUV`_l3co^FU zEBbUA)D?(bJ<)%PU>lzDF7HfQY;4Zohll9uec;O7yKs4C`{H-8`oVkIdRn%NBu+|J zxxDvKie?50Y^HyaE7z~W7Gn}tg0%TO*nIIdEo#MyHEFK<(wg?gP;^Rr0etlaHB}pQ zd`G_^>mtmVa(}8r2uOZQI?}}<3)2g@R5W%m_D*ab#7y&jnqr4H(=gYV_RuSCsh_~4 zndiN0FDCIsjD4~Qj*KcAB{xf}S-Yi-__V>$uomz$%qtdnatQ1t6$y9qCB#^iv8$>H zu+A}Sakpnpcb~kQ-P(cA>#=1P0e=zl^7~aD=zfp&Tx)VeK?sM(x?S=jx z>Qy9!ul>>g1I+%J_p!`at=8^CtWB@xgE?IJ50&}H$HU2RV1@E2de?tO|Sg)aaVr!S*!~T!4q8SlwBHAh*p)J}T zCol2nlTfQ>&iqvu?In1$gnV<0YQv*03DskMq`~i-^R8&f!9TzN4VA1RE&m==lud^2 zse$06E7u{4l;+ugyx7iu@up}#b&@OeSKdYnn=Iwu;8v?JuAS4Rf zSL8>~Z14xQG3Spa9mfu+SD<#1-fPAAY#pC}icn|aJ5uWHE#MNXCp#EWuMD)4BUGn!x4{`xB&YC#v$sDpqDg;3B zkIFxM^DZ!;MX-|=$2eB;nFL;f;6oEZO}|UqEhh%dhsx^wVx_qK3N9Slmm?|Uf)k+E z8FLwD-}4WQ%9Ua6bplJohG{q%CX4HcMZ=G=Lfu}1!pv0I=)kF^Tuk1sx3Q#$%P|Wq zCOf;~bG95@5Vf6Bb1bU}1{N>R|9sTlld`Apu^*LL8N|Cna|0sA%|^PE|4m=zcAuWW zJunTP?JTBy7eRae`Kvm>(478U2n+EjZl)fJwX>Q>FiIUuzoD&pb%%;X9^GJlg92_; ze4};^Tse76k z!N%V~<_ez}#nq>$iGl9)yp0C7nEqMDmS>A1D5q`G8CAR^mf*J{)WczM-mn|X$?`P$ zXFfIYBJNu73?BNe@T8T_>ELbbup6_)14e%Nj`*$i9h-ClM|bs*V#R&p=+Y_YJS^Kw zCsh|=e?0)>K~o->o}AU^9<9{e@T~bL%0$ZfuO;zy#HOyx`zCpec6yg`{hby*kCVbB zbQVlk6!6$8n?8}-2GNngOzO1U5clGh8Ev=0_L z#uX1!KQVXS?kZ-9Je*&Km9Fs)j2qq%C}Kqtv{bCbkc~J1q<2!_p=2F388HosepgF* z=6om&bMee35k{DEw^tw}0b}@VE{E>j%U$zKcKG3uwsdHniBA{{nv-AjYu^_?1@{n8 ztB1?}I>V}|IFHo#B|zIfp!>E5;W#5Kmwy7`~5OF0Cb82s$fy8IFQT4e=~qD+C*ghjw3`Z6l$L6{D@?h zSAAUR+!8)>4PtuF6~)Lf#o^$hIq0a3y`N(GG&7b(bsEM(pT*9rFK%JeCd zi9<#Z#GRyEPlC7c^z@nWtm2P?MLV9(Zn05`iLXtEj|xk}E6s%KaGBrGfo39?xaOEY zJWIZviP6qfNn#tFD@7Vu1fiN5J$+@X|Yodm>|0R|g6~XT?WfNJgnU7_;JNXLe(7p)U##3G{hG_7nc^r?) ztVvOtk9TiSk82eUV|3_4nyXXijSPs(49?Tf$-P@3pRW|rI_FlY zGVgyD(hq0FGd9AhBS)>y<*T*PB&FCNlq4oke1jnMP@4cL0SBDtV;CJ&smROSt>2`e zixS%s%I@xLk41$uBG%>0yL{S`k=bKvk>hxSlzJE*7cK%qwOVj?U@Z;{5loGjQn0j& zNLWN9pastH2&uZDqaA7a5%IG-;s^G;;g&6-X&LB?0rBBCccM2s68jh(goi_ssS6@o z*z?K2t1L?IwGU}_Sv%^^aZdg7U`!pGT@f~0P>884$4x(df<`|5o@=V_d-ueQCxv%m zfHL{o=K#1w<9nx-M-MenW!Cs0c>)ry)26;Q?YUh~jyT$lm6A^V*JTvwR0m+XG%Vbk z{I!p;YZEK!$tA0{PE#Sb9PqU9*l)Lfy%Hi1$V`kZFbz--B0B1kFN>E+F9h>nkDYuInSQwsh62XGZ_Bfjb(ypcgQF(+t6_K%9G9jHj+WK{I}7VP^{|+Gee%Dd-ozhR#-egA z#GxFj$uZ&YQ%9w!SW!>TCCi#FV73<*<5#-HnWh}cSLzz*-`?5q!|U$vtdlh^J|2Co zY=EQB$XWWoPVa-=n)H{To1y1*mNg^@>LJxAB0#r7)Z2YuW+pJ?*y94x_5CvrMA|Y} zH!y5f1kq%+cxlC}#hF!M^6}sI11ddZ&`%|ZKO8t{6fEJUaAujnWZb(%8Gp7Bq)6jo zf_`M5Qg|eeBW#?5cJCX_vwBt23a=2i=a&` zgm!W)mLap-ZigE_Hny)%a(wMc8sUKX8mPG5s-IN2en;~VjUERuZV;9% zm;{T&du1=0vOE^vOKK+{@+*%I&x4(fKo>Z8JGVtJ+$cQi9YqTQueTpHBm%w6a`^1t zJmBtHf8HO69*V8UI?FEBQtuw83-eyUVaa^1Cr2@*`J%uwVfm7Uip5;d|Nt(d@V?ps^3^94!tSv#WOFvuoIGu#;LSA34FiK{x z+shCOxC@<$jFZv88^~&Gpj7tFRWC-cr59$B$U$VEY&e(i;JJf&@E1nlEh59EUHw8W zmpt(Qse~_x@Ome@J;Sak4Ndhal5Tz;>$DK+sQR+P5B<}E)b_?ISMJ=*^zWoBT?89( z*6_6Y$-sp6dbZM_GG}*O-Yv(F3qt(fe8gks(lRbcQ&Rwh$0>ZIm8TMcV%>_Jqfc&! z>OL>pGcxO(Bu{C-BKs7xn_e-haI3tmu-AvNPXG3j@p5-u>Yc4xpZCC-PQPq_Xf~&x z$(LY7I`XZ>`{W-eLEKh;gv^CEatwzVCd0D`-FMwN7mujxfW8s z&7c+Y=TXQ@f?LY3q5>8%cxkN`Gy|9Sq}+cz)U6Y|9izVReycz|zY0#X|8aPJEs#gM z?ZVg`?k|`N8W5SB*?nCTXjWi_Fpn06lY=j1&0r`Wcx?9C zlAfs2;Y5B{)?|~A+Exg-UYuB=tvy@T@JCmflTP$q(<9ieLXKRqLgcp)YuQQ9v?**T zCNVzZkJ^X_`%JmWFBN&&+mGgv4Zr5;=bm-Ar>5c|%c#p|*FFQe6X7y>NC=CjNy~3acP=bL+v!gTjGCd-kv0cA5{*+P(A4$=^p% zrzx_!4MpCz)p+SrPp{lfqjIu_Gf|=+&L}}OJR;_g9fXXcje`&VEgk5RlN0Tn^!TOq zFNlBDm=~F5!+<#i3EvY|HDb6%H=~A^eY9}!Vh**?usZKmMW`PEw-YU4Q}~YAH3A}R zf*UGLlpps_X^VA9OYMjsp}ywz7@jFf2DmX`{|EBgHJW35U5~PbN;s`$M?uEttR8ox z6;%hY5(`d91d+2Dw`Zow3DK$WGspls!qFL@R!SpN?wYn`g?Dfd|4a#SuK*v7)N`COV4Gt!iW4L>mM_;Y zPA`o^qbqeTI#~X*rY_`dC@OOQ9r#Xfn!{11hi7MwZ75&HsWlK8{tapnRaIq09A4^N z?wKoo&U%M*0gB_T-XK~j30}_tT@BR{zjM|KkUR&bGof8(yM*4C%Wt_TVRcAuIPHCu zIBV8Px@%t@$Z4yLqIU3xH_*q-u~ZV#P!VwfnZl$8FF0f?QEi{I&z(RF&5ZYA0{^O6 zfAy-!dEKM(bR6`UKYi1of8{f4|8QJ%JL%WFa=()ixk~F1yHM!!T(NY^h1YRM@?&&> zGKN+h7IC#qgBRPAO;*P>yYYPu_!GwObH4{j7R=VUjwnn~o9(a|tQRF_v0SQJ%74j` zC&}8Sr(Zuo?fYXy2Y_%8L zx7L?IP=fDZ)NcwB>9ER3&IC9j`X%N+;lq+ue~nN2ZaUznWPFKAM%5UMSfpVen`&sc zvda8@R`qw?M@6~#WO>I=kjP~t^MJGu`x&kHwAk9aQINRUmK**{ZQdB+DE=Hw=I_Zpl`D6@yCh(_A;!D1vSM5ZHW~hJvI$g(n z94;zuXLq-BKfLtJmjl{MqRplvl$+sVjXaudn>bWR6DqruSOE2w4~5fp5btq(XyHCI zSFa56L)0Xn)75c-cl|FD;fjJD{sok2S{}H#l4mW7kHf+e5RA8-lHNzVPQa$o??4oe zfqc{uCKth@IDB5$hh4#DTCnLqn;iZfHH>k zG6t_=>e4EfSo4}8mNbX|O@^)=W=}18QHX6?ze>X8hO>z~DXMbB4%n3c` zqN`%qs}bl7>bH!?_edtLK$H=utEx?tY$hKq%%CNtPa**&tJ6%v+A?-%@PO6gQq=M@ zO*i!@yw{!wjz59?7%gGdAm)k9FZJ)gqZcLMhUnzZwodk61K!bJtP^(=j$az8jmLo3 zX7Z&HV8!dT@+eqsHae@niiL{upn!HEQ7O;12!Wal9*zn-#p~GB?S{@`%&lipm~EEH zEF?XKq~+aH7)(^c--OBFjHVqnY;EuRv_g^;yP4#Lu=YQ;UCQ%%-fXv=U!f$1OW)+? zQdz?Sh%Gf~I$hX=uEV@ZKi~S??>n9t91z3l0=fR^cz!Ug2sCl1PSI#K(`>vSM-~^e=IFVe}vG*!ns0S&@6rVr;O1)TM2C zx`btZYqEoeWD%!GkR{XnV)6Qo`#Hk3Okc!KYsZkG?B5?qVlg6Q*Kzq&mP+J6r z$7Acng&vinj(A5gkwdOm=@3sr@2G*T0gUt@z!g@m6!8YM43HTPNCk#POSO_l0q5>$ z52tg0NxsCz7dXz`5oKSa2KRoQO?l6b;=-q00Z-KPps+tI z$f*j573*Q9!NH4!L>S4Q^sXmFvDXxBq93_IV}h;sOdCZX#;K1NVY&MKeS6BW2@N1R z?RM!;r`%_O3g3Uw76Urkwv~w=p-^@M$(*Gicpxv~g-Z!4uVwunJ8}mu6>$Nsf)pR~ zbhhv)FBje7dqnYDeFO|2I21IB!72P#5he&gH26?X%2BMJjUBLA@@)G!K@65sV4&J3 zUo5y_wwfDSd)5>AZeS_pJ1<*FNvvSbO0-8L(x+vXZ$$FYfW`a}78I6aLrl9*PQR+H zwe2q7xyN0(NeJx5}vNM3rCRDYH+5FE6ue4m;)! zqBE{l+Xo*~3%{{sO=h(1tt(u!QfZP3sBF(gw2Vwhhgdw`hI-s9;_sf`R(@V7{)h z5tZ}DTC*^{)DX=vr+K}X=(D146q|S*hPb^{?44#SmwbK`Etl%fJRD1msYn3~`p7B! zWh6$%T%(%F%=f$TSeSL7uH=FK(){~FQXhw~GKWk(BlC{>OqMEH}OKw)BEAgU{i(lD#85wb(dLtbGcU-q305g}yqi6(Yfo=YFD zpQ3`+z7%D!^7+2+y)V(9BW%?jmvYuSb4Y0$dG@$mm`O0KFcsH27?xzWA7cLpH-5ZP z_j74xZ^8;|c#>8oEfF=dY|0#JP?A8F)!|>s&Y*(-A*Hs3LcKdyB<@@pj)9;ffYQ}EnykF@qChX|KQv#=c*T@VWyCyE$(GRU=;Fv9W=p0 zzm)mK7HDcD-K;BQ#<(7>$Cw}h)N0;}V*9$G{oaaFcgGnbYbbdaOtR&rRu>{0-4h*lf(Q*<(?&jU*M0k40YP|6zs_IsM=tE2v!vcn2%L|stD7YYp zbls?2_Sq?s5y|OmbQr7YSkIb~g4k?w=x z96h16K{|OxLXe8{=D+35L%*|iw-w%8@J#Arof)-7jU)&nd5IV}-^uligHct~9Hf<; zeG6Xx2_TaqkVwM^q=!xe$}x&B?uV`f5?adzgi4t|tPf$!;;l7?kxjwZHcNLjU7puC z^%ve_<~^BlJwL}HH&TWZ+>n&^gpBTmYSOeFYC34Y7{TdFi=SU&lVofKn7dPC7NrEk zIX+A{A+qci%6J#_xmYdNHhm-usS5Ze+(3E_>}+V5DTBFx;2J{BNhK+)^FxF|yR!Rz z=2EH_E=(pI!}#d~GSB2AV;6ys2P1~54()u~S-NWqd6N-`qZ)f*Pm9G!u%$Rc4;Wur zLX@JS9*Fw0`rrDts9Zr{^x{O#z)v&iqjBnRIL4LQy~A!Ms}o{u+A4pBMCIBSYLnd7g; zQXy<#Cx3()sN<_~{cs)(MpEcP_X7ww^qk?G1w%s#V$cs|5rJEbFYDr|FQkYQpqK`j zk9yl09dzHFjm^N)7U0lVYg8O#zt7sjJe=E3-Hus>C!<^=^(A)(Zlk-RxhTM(%qfru z7{t47)+7CG{V9~JTNtdI(QUP@+wC*OgvjUMPOlv7nmZ?}UtFL<8!7rhibozunWpgu z98L502**$(<|!oxW^@2i6j7O-WcC?bGX&Vf7NHe>wn57mGU)T$eTTMzPWN@6=LpWu zY|g{q6YwLiySlC350x#*KLtJ;4WBjSwjE0?r2PtMl|8|X$P`Pj3>i*8+f1~5H+4+t z>jzPi$MvX*TOg@lg%|9l=xiRfip2j2>uAYPl3Wv{sTVc$*-*n` zX!jTf$LPjtS8R^-)u zs(dwt;^Bqv;U}ECaeJ(4`~JFzJP||F%pShO_{sE6c*%dCw2pA3&gr5|KFPgxz>Bsm zot-CBHh%7aER2_5OG_m$uXCvhcx%ktB|vg`OiHSD(6L1RHNwAU zO6#Fm%IQMGJ(nr~t-kN`#Bxcf?aa#20I7+GLZM+JZkkQ{C-pGe$!`bOk!Gr>C^|j; zIuZKYj8r3Yk+DfgvCE3_q%Zae=M4L+_5-Rfs;|`?%|WoUTr?JOc6P3CTZ@*OV0*aD zVkS&~KndVgOQVl`)5$QFSjNjs!0LHi(qM_ZW134jrtdLSd{+2pQ0r{v1lFB8n9KO# z8>GWGJ!H4hzU|pS;Tb#son=qWB=F&hGcx+BNq=S(CuYFdv9Bi!xq3d_Ht_6sU@hF; zU}4Gy;A9S8#GfX5QP$86f*3 zG{<*F-#+2LgbDe*eSlTm`#zUc^A?u6wLW-`7TYLg2mrVMY5*@+?yoqX*3zZO9#c<@ zK9@{~3(&M*N5Ln#Yz>u#-A2z)u`;*SM)n~&8Z*-E(U_MHpar4z{epN3MaT9!bL~hL zW|GwMV!FFIO&uNs!N3SfJ(jgMLjFTo(q&FJX@# z4&&4rhQ&mTN$8!(X*0Xfrfz~A)GFd!(}XJOMIKvfBwp}5#k8|23S*i#eYy^Us9JK{ zX+p#YC4zHFpY`|iAEy;xa&xuSyBMF)wWjA61ll)r5Cq07fuPaLYe}__L zo2b{<8#_=T?s{0$cOK1-Wt%VqfRClsbv|Z_6EpFoh zA0RX^F5I{$R{u0NqHnb?WS?B0T^R-%UO^)SI-4_i@6QTk?7d^`8wp3a8Vd& zF*?0(6Y>e#^IC$#SDS)aX#HK)nDWzT&lAw|Ub#Sfo6VrvSQp;{KC9oAWoD2YtJc4r z<485V%v^AgE!GGNJ{yG(x)J-x37m zV*=mLB9JH)3_9nJFuAvdX%IBiil*jI65K!iI|)qZ$Z=THONUc(&qx~+oM>J$$-)$B zok^pURFj?ZMYR?ud>-Zu?7bFFm_IVP=|x*hWsrXRgfRGEjME@j>oXpc@g1tC7Bn{? z+?ulU22V444*cD3eQ-tcP%HPi$1$5s#|_e|&k4z0a^wuvO6NR9X>LIL}ZN z_>f*gC$2b7@5W%Uy#cjHF|&a;1RchA0bK_n(&)?O6|?Sjq~=ZIWTmXvmlOX*2VXNm z;QEVLw82h#=2UbED>vlfSP9y8c5g+l{DJx+4l!8qn4^c;0yMPV^iK za>KDv`FX^svpxRnt_eIqCk*vk zm=sgDl`!z0NrAmU7voh?rsulalPwwj*pYHA@4FqWa+eYXNC$&LV{=4439?8>I1O+M zYSaB3()RDfb!>K#PUYl=2WQ6D>rbU~7kS}wo?cO)&OIy~3P3(%6DfH$Xe@SnzzInp zqVZPSXe>7O{7doDTk^W7#;sSOHTPI~lnsiU2-@h(&#w!|UT1$j#>7CBMENZ<`dL;? zSDut*0m=5)bEH(EuCDY-xJHubJO-+LR=Hd6IBx_ z#6(SRlTMOBp+(0pH!p|;?>Tp zlNGQnoXf#nQkqGxA)Vn|-?otP>AX`W6(ryj^L!E?Ce_MB<74=AHo1Oe06OVDJi&Qiyd0gRf{qLhqBClaTj3tLqzMb5TxX<|(j zxdB0}nnE=SjyVzK=xj4+(vXVyZw>PPQaXrAnJuLVM7mM@FvYr+Zx-NPZJ^4GoMmcDSf}>b; zt{FOM9yEpS??;;*J~Z?RtI@jdo-H*=9&Xm;FHaE!e^TJd&sCf!@Q%8qAy<=a<9--s zU92Eo$R~eb{JICGiKYDr^OG35D~e6*k^`=l4EF1?t*N9v>c%Zh56G>#unu1X2ZG8e z2pCfhIt~bP4F83yDv7q9dFjIVse<}=|MyjFkc%wtq?SpJ_nGcEeNV9)s^yz%Ru9d) z9=Igogawf~5+_GF1@a`>J8@yIpe$EldB9}&Bz_u|oa{S#{sm@HmJa*8T8hy5P{d^B zEb*sczFMHiFgrRQlGa+#cpG_UoPONB0E2H1w{`)s8ktKT9pVa%3f$>(+CHJFj@q1k z{x2lcTQvtzw6YAHY0On9T{KP})e?o6Kj(%2{pyAT`A3a(DmAs@RPD(j*R4x_vyV%e z@1VDd^?j}Xl_O>)Kud!aA)N0|KLPtNSh&kipIlw-rTsGUvF{lFCv(7hYOo%`{9pM} z*lq&4OQ&s+NZ5-c$}(vGg2zVz=7KT!Oc^%(-QhA9uToV1j6vN;;oPL@r!YF1yu7K1 zCUs&1SqPeTeJaZZQy>*Y6YSPR$N7sk(77AIxFJe=#8 z;X#8J)p42sN;2SWwqACLGA=1Uf7+p$1_BTHQ|G*PH_yT34dCD4n=VYbjzfkeVx=V7 zhD@ zz~zHQVb8vd82l^=xGutk?o9T2B(b5V{e$p?hEWA19AmIHQ>R{}l)%;6(s4@oN+RC& zq3^Kt5^K*dfm3N{XYXaGMxsU<9tSSWhzp@)2QNeH!u(nn?=iZ=m4U!c?tnmHbz?QC zmL_sD7B!nbP3p*=GZ&8ew1K)laBLin)NC5Glk%y91Lk;y2`k%mow|~A zE4}Y%Sq-oJ*ad$uw`(%0;H+IT$l8D2o3MAK6tvh*gv&(x9k%Q3gnlId$HKRVtj=vr z3s(OA?<5GbVj<#nzVdjYzX`d-9cK`AF3fkR3G$SBxZ@oU{8(U+O{x~JApT)TPOBN( zM0lxMX-FyqnN>1S+}{11sNAq=L;DKMnlH2C0<8*`lPQonhgL25Dv}!n0%HG*Q_xba zL;u{HN*CW9ocuTlg_>ss2nN`rWWmf*`%t5h&SkAKApw4_Pm|}}Pf44*y)8VrF8L|q z?^HCyA(%d1DY}EnB6Dn? zarwK|a?zTm+JCCBk;-eNgm>)2cg=D6yBL{3n&QB(8M1yRICDVMH~K50yBD*V?sI{? zRWp7tW<*-+lMdRELC_`;x2d!0v*uGAh;J(!w5+6sWag18Lf)^?gQU@fsce05!xnuQ z7pL9&Mbu}mFu+}A;4)0~IZ^6exxPrV^`W)b(RftR{Nah?+CT$WTuZ?wqVy#3a~=Yg zj^Z6IF?dRWVKUiCt7JrvWBC55J4}l!_hE!f+JITghE@l3HFmy>>21Ifrq5X9|APvkiT1 zhLpfH&D!*m?xrYU9BWHxMA4!0V)t|5zB%t|4+>EtD9Ho4F{}l(UGii`b>o3x6u>JOxq|Ye zCSOge%e@KDYPGujfX;Ry6g__XFy@euzG>H~ES}SGLATt<4pqJ%|INQxjOgY881l{! z%O{`@R`on=3jqr-QJ)rSi%RHO>t)EDiaEk58O$~_J#Qc_18&yQ)Tu(56Ho3DHu<>V zSmJeGRW8`ab5YRf0vv5Lxhv)?JoR#|4D;{@TQ*5r*QQI#AKBe6w5Us6t#L_=Gz8yd z)enhZ&kRW8h89QI_jNaXKz3{I&P1@!oEk#XrGCOYJ3;7YfNP;>nsgsa^Fn4q1?OXg zq$AV0QR2X8UNe}+FS^J#ntjvc;D9vB0`x3Z&^GRJ91MdK1Ag%?PiXH}Encd7hd#Rl zzCkZWY~^VoW`|mL*>W{)vvA6NE#tA0H~$XpmCwUW4r?sWxo^00$3kiI`8Z&{M~QK2TZmvowQuY4p` z)Ufb*GsIiXIEmC-gjrhIKdmuflO*%)9ObsGIwlI0G`NE{(2iy!M<<)oHwhPuXYQ6uxN?cexuTqj?jh zzjh1M0pZQ)kdaVK0uCCCq$MhWhI2ipbi8EgxGEf+SEiyKefUAgB=@-_p`5YD-_a{vkTR4b_iCO2t4osO3DHIlsS_MKlbQ)@QFDVm zDYLM1axO@$Ipq8SY(}1jo4xV+n~ssZpYn0@Xl{QX1OgD(Zt@}HgR~3Tu{Zga11mIA zdJ#|ek69uzok~SDH~-CLjJsLKZTBdkom3D~!05uq7*o5aFL6G{A$Mhg@W)Ig?`+R4 zBS!haQOg9U2c2VIiiO%qn{JuIRH&%bq#_V(|HOtaSBMv7g;SDEm^QGbda#k3=S|r@ zjndjj=yWA2WEwqKT?pCn1M{?DP=mcer|c2P#Zqae`=d(dl*7awL&+oiC`u-SbFxxk z9NfSjZ$*@Ux7b=Ft7dq-q_;;Xx{I^Cc8`ASh9tft`o|@Djy&LKomI#$pUufRh1^{_){`4J~5&-1|tWrJc>Z1?;rWw#%k!`i-7U|C{J5;{AEvb#Hs5&CR+u`+u*n?Q1wbPf3)^MjsQt%&T4 zB%0YbY0YJ-DHz+(l$BE1(tcFtsLrtrS%6FkX_YS-EQc&uM$f=cu&_?-9JX(g)oMOR ziyRD7Q6NxrM`rWDzzbxp-`)pLfJGP*fR{uEEmFb~kcc&Xr*>4sxcH3Ue&QJpLA>8K z;RnLkHOJ1LoF7is$}V##B+k@P5Xb;cql%b*FidyhmQk~YoLnq3?4^)HxVvhDkH8Y^ zR7+@BtC!=r*XyNF7V0A%&Ff9La+>UYU3?h`b27JvmMu^I)iA*WPkkZe`3 zHst0ja!eB3wiD)eFB;IzkDr9ohrgBsd9`A4ILNuvd+8GCYlo0SZ`>KsMAj} zZF__mg(}$jRue#Hv@#c>y5Q#!Sg2NHLO^ZI!IGcX05^}Q1KmEM+0f2NtEe~sk}z}n z_3KhyY+vb*JQQMra^C!KP*jvt5X!0q?j*7cZ9~(27vgM;Joss^hLY z3$JZ%I99@oGHhP#1|)5WbgNOI@Gr0xEDl-ne0YSLm3 zQsAVRFZEz>Xdn^O?@-)e($kj(7j}bzUH;s$av>FjMYED(mmzua>x%~K)6-iDc$7Su zzEq)eS5X@|PxO~?hT7|A@$q*5iP4O{P47M!E;rVA_X2KRNlxEELX|gJF_oV|mRnlR z1;eN60#A1X3dRO1+egX0Em?d>8_aZ-B5JhWHxOx}iow%QMY3idq?=77@H@hYLMBlG z{Ej*LvQXe>r&F1-xP}jh(m0YT;G6QbaH)^Ht+IfXp?x^{wRazdG@1A6ZK=( zL_km#HyYSTxGERzM6}v3zs_PZjh45p!obY^;IHrXef$5T&+z{|*$|xv8Tau2gT!iW z0nk0FfKu@7KJEyRJs@iVztO5H4ws4_0=bS;O&NLym${t(5&h_xfF+`!*+20$!?n#_ zw*MG%bjX^*rvL@Q{$B#WEkM$0B<5`A2bO2^{#-v5mda%it)-||JLYPg2$!BZYuLNi zHD^mP#z9W&*{!((;`r5EV)W21SW;wu(m1I`(!(l1ddMF_)bvH#y%Yc`DgqIk?G;DT;Ay z&_*IJ=f%jhoXSdup9XzMMlDH746=q{6KBX7FB_Wz(&4qneB}6rs|u;tJXRvWF)F5u zYjXG30`JC%q_&K}WSF$V69pDiapC?&&qq`LET)QQGbYL?Lgmw{>x3I=3`r#`DtXx} z(}KRm7P3SX<51rs@n4Xh<$mWokH1;I{XnEW0N8F$Q002*zg;OwJGXJE(kBY%tr)!$+zHL{q(E(!KWp?xWnNA_VF<%%mj~Fu^=pY2vP6mC4iNSbUf}btvg0TTsH~v;S$3zFe=+magcl2brwcOd`IlVVF+>1L;w0}= zJaxK+R0%>x29(mM)cmhr5{M1EJ`Ag3iGz8fTUtvf@*yn29w;2+npVxplhUB;E)QJ z2r|v&2mGbdlk~Wtaq7#3=SK$#NYPDQLi zjYf8P%m!t^yy7*IY>Lr7i_Op7P)?B#A`P$&nA|bCe4KbbuheX!`2`~4z;2ue^!8=X zq=S$*qh?p~0zym(fB*mh1OAc)!(spL=kItUaa5+HK$O+1nW=QZc4h4D<&&U5Os_2V zu*34~w%+oNOnnQ_bQd9<_~0ZsuC+dcr})AQ+fz!8$-w1E`%tk6!$x2$fY-?ot)dM> z<*1kfNN?w@AjEac_}~WMQ7hBSYDa9M?OoKWYbhG!OW9)-q-4pus5~N(FkO zJZb21S3*vD`Hlv@&8J7PnY1)oUa;<|1?Q|SyJIk>t9cVz(}4FCV*Oh~oKb1PJDa&0 za?+Ip9vw8zo}rp0fDkSXRhm`z6H||rIItxN*~j2>nc-c@9PYn*HEv1tx$?l`WPtu% zTkRnwuAD;E$%(ju)^lt4l?O>^j=z~xqMgI=rof~tP`(M%zEk^9Yqyc?pg)_(43-sg zHKsURM61LzkFSsGUwha+v|oVhkQ;IxXg>&;dEVV2d)6dx3hwW=Bm9@VFY_&Dm)w0l{LFZHZViz6S}qRrr2x<37AWc-PQ@`-39XE zJ~tbH!K;SpMsvzw3PNO2S<3HDF?%*XjpYs^9ZV3dvv37H-i`V<0KboX!!?_(CJVPI zDj%9@V9hOdwN*MHA44`BYr;>`)3HFzE!)Yb z3<+!aBE#%*5LtSwKt!U$QQuee)PU`nj!&z@C_fitX5j7eQz3grfhAxfAHot{cc}|pZkr)a{h^0Gm@?=hbz*U!{`^t^(n4qFo>qcoN z)Vn`{Plf<5K#_kYFiU05RZ1A|80}QFis53az!r92L(0Nq(M52~SFeP5R2k%$fjfuW zRw+YOYmbsUv}_QqARo0$7*^GPj&YB0Q!`_8>}{tzQblyhXx4sti3fGfx8FP69ih+o zJ+8nS2Hs7GX}Zx=q|9G6EU^qFa*|?PB*T`yo+Ju&S~I#4lC5NJ`;veG^B?67THVW2 z9}&dd7u}CXY`ZY9(&g^im5}S-%0Nw;^L$_;`&H(~aKVn5PIKQNO^{V};N%eRDiBlL zhPvxMjk>M2X6C{{d`a-A@{>N*Ar0jQz4972T_KlUU)Z#E_@@{&pcAtS#uhEjd-7ts zxI)o@+GjMzu=iq@*=a@_I_4D^K0fq%;zC5vRE68y;<$Xgby_G9KQGU-y;Q^3>$D9+ zxs&V(pM=>j$~#{&9^;VL2r!y8eg&qfZcd9n-MA z%=&9VDl`5S`aC#uNbB?0vm=Yz;`%$02J3aEEaz@EUc$pd@e~HV+W$Hv|2<=Lp5VU zt9aepN5&<_%EsbOURy!!dV2Lg^TK5WU_SsNa_S$^ z3=rx*#G$|5__44Kxz+h@Vb@Z_lJLCqd;4z}iDSg{xgi)*i2&U=VBwd_z8Lo%julrU zp=f#_3__-}zpRUy67{0CqgZr`KCBJYtDE5b5Vlu-5*t#MA*Vp$U9L=8@bd!N3-wZ6 z{jBh3J4F;uR!~Vp-x39GT5M#;s|bg~DNqNPNhg1JHXJfGm|%<8Gi4gjSdX_?1hpt; zU9&4?F9KadW^RAmYD;bEXnt1-_v^d-w%9$Ws8R05kFopMzq`|Y?B}pXVm-Lqi%VX8 zQ#(R7urHag27F)RD6*skp;MsMbb=MUgg1(DTDP#CZU9zP^I7qSHJq2i9EGUplutKs z7&<(RIruPb7-3a0)lFF9>SyE>3&!=?BRhTCc>8AYiw>Un?q-L-7qCb$k^*>Z`#s-P zM72H`rOO&F^kYIDBu4aO*AsgYfCdqw)?I&Lh*0A2$%Z*|nqd6a0HT zHx;;Ij*w{aXgUR43A+FQ2YC*mtdiv_fd%D9L#m?{lrr@|yAjPVxQE5tB0iLR zjYXG#5*)?BDrjLRpT`&8}PNBnI_UF}c1z51n8Qay%x{1#u)g3B{$ zwxr6>NPM8$vfX5d-Rsp$)S7(lq>KS)W{|g)$gVM0uFnDD$wImryl56BH)9ym&$l@) zPy$hQl8eMiybh|RwTwi9X%lr6pFcXq z_$o);2b`>3KkT<2q_EZ0M9r?1zf0&JUC`vs{eX=tii7gce)8UT-{K`;1@$!2R9VL9 zQw`a>ywh&Rx#Lb!!4N+)&hw&p(Nm`|8~Q!O7Ci7%HVI z&7>BIg^&l=Cm_t*XqfNng$~{+CN{QkMu^RCKNJ~`x=gro2Q2Jt<<9zbVO*bim{W|4 zAiVCfe<3c4-#^m5{lP`1vVfD~UP%#1>JQD47!9g(|Cv$=mcwgfiG=2IKa0vF;``Xj zRaHb|L!y*oWWeDAJ^zYd?Q9+PA)oU(gaWCrX9M$Is$l4~BbbvkhHHw5Z{+lwN=5+D zeo^<|$lbg{DQPX8L8h|XM`rB7Wj-J5?#~-R<7aEH&3l`0u}V;8VChdq(@lsM{xfRs zw92bCvKE+JSdJqVKeP~*R^_tS9kbL>9J!K0Q~?Vm(a*Bf4r#l%4+5ShVTRScULa}1 zo9skh#T#~~$02+MNp>uZ0{n&)9t1k;>(ifX;9fI9V4))oflOoCn>%}|ZtfKD_!9$w zCumU4g9Sdsjrs8P%6#z(oUt67d)a&dEWl(Ljx@$ zB_tOX3bcja291*=t{c@-o5ssbPy4((|CUjgeIaEGhFbG^Uwk0R54V@(+<`*#w(Nc_ z=+)*RYjqq$fhX&O&rkZvEj8K$MENf}{e%GLtF$L&V6oSVnvJrz5ZulZQOx8L5dWFx z52biF)U1htFFtNTpk2S`Cqpl25bA=!OlW=uU34P&h}$Kd$Nliw8!ii6jEC!_HcIbk z!A~GxO|MSh|8hekpZ-$)uY9gHdNXyA23(wutgqPem$bj zLQ<&`YIyVeh31?v3n7Ku;nWF}V^23ys+y?aoGmLuPn5>O&lUJKK&yhkp>Tw<2S_@A zSP7eBYK0jI@l9yeqv`3dRkrR`Cp<9PugAZlSsuX7Cl}$ab?~@KC;{5`l2x9oMj{DO ztP5)98LbF#$`{8p|LqY1PlBI@ze)phsTqQjKX&TOI2sA{IBoz(L++k%`@HlZ1wvS#)gFr_{NlKaUh=*A^x=LOIDm+Fg8TogGkbEjG+{)ocTx=2;3*b05 zxumw@pJ`bLNYhYNmDeKfSwae&ODBU%4WG$l*f6M)GiIH7V%Fqe`O}FPlB5=yEMyUz z>1;WlzAq&Im>GEs?~y1Oq`lb@t)j5*-Fq>fHp(;<${ck}_6vTfj<7Vtr6t+P=?6}hj%8c7I0?`qK( zx*RaUbLvRpN-39eQo5yNG}~-q(dK1jGgzE;A=!7quDjcYQbxsh@}1hwH?}l;pMXqw z<-M*s!Jt{RHIQe2pq@zT2ovp!yv1?|q!#+#O_TCHBkDjj0o5UdS<2G&mmTY?K_=b% z_69(@F~O5QD_CnU$QFz-s#JZv@bK?hQ6y`Sr-5(Xg!j|&wrAWpxvIP}h&=1coF0On1>$Jmib#)|?7nbxlXazbh10=k+vZpZHl zzuCzv=jl_{<87`DF~XkV3<|O6pQPW5jBx_QY_x_oY>@;16;%h1ci)OF3)$(jnR$3l zsckxC4h%oYv4mqU3d-{o`uRXgT?6K0<`$aegW5_e z$ZyX@s|A#0!?2tw(`t>V89e!gCu7*>B{*I8!+h||;dQyaVbK{f92cGp=u}Z3f|BJc zb9uJ255q|zrLX&tSW*qqV$K{xNK5Nax}KV+7V!bD#K_m29)(v_=rlx?IrxigaPQUB zViMXVy(gKSO_$&7e=+D7dVIw^+Q80rDR)}c!$LRlr-lwQXnz=GPi8u z(lP)ihu*t*WZCWWG?N(Y#`H^PaK*!dtYWOhGs_b*cH~tW8@l^KkWIP%WB@>ym&IFV z=M_xWzd|ppu&1O!K8R~bz&jxS7!HGukO=aJ;Y0eTh}TCm z;-nSoFx=B!2lXV<5o*83k2@d1JojBhE3qY&zBu%A1dlrkkf!XFHK~4@ZsZbbO%c$? zIwn0G${k%&d{nS!?z-)Q`PTBZ@HJEL#U4RAf72q3t;El!26B8FK*W*@%a5iVvtL_z z-^8OJ5x6FV1(=~5oEFx!_HRVSs6nnHZ%ZQQM~k!D*3^^$JXlO0b&q#@g$~hg{R{y4 zPHC)Q7Vgw&cd}?N-#q2{8g#e;iySc5pd{dS2_9}8|B$+s2$p4!MJ{3x{@8v*<9IS2 zX$`I9c=(~|2ixkY3^|nNpEn@TF5md&x084DeV5dV1ywx!zX|@3IcG++60`3l80|qY zn3r)g*EAU0Rf*KvS4?fb8DfFHt2zGx+zHu04ElBXu7q}cwZ4UxsjQ)TY|31G?Gc!H zkx~N2OGhkL^fMM@4=|DUTHK*Zz~Y!9wtJqBOy)4dK71Dqj`)c;z=c+s-Bb6+^qX*k zVx_M*G$sDkGo+6Wi+si)-cY=Yi~wR`&z0ZNX$DP-=#_e1G$)%KRr6J*azPNEwj~hS z$}(Oi1VMpcHJ}kve9@SNzOwXYcTOCu#3>v|#46&={KzY{t(kH=kNr~a&5pO0g}STmPD7!F=s7lG}pv+p-#a zv-vW4Te5VBAJ!y1ETGP5ahG1ijhk+#?ocbq<#uhj`H$IeA@%)vn=HhgkfBm77sw%p z1T2u)O+9oOWUu)|&Pi^S=DOB)MlxYhglY+VRM)?BNKZu$5d@%MzZnRl4}76E%0H_{ zM?5=oyJ@TcU98CEHf;k5!fxR7aPcwwdX)3y)59kpA5%6syshoHc zIGq(cE_y4lZeF%%M&w(49LP%NG}TMiv)(AA9-kDuTpTqoi+5nb>xfs-e7+?5J{fe}u#YAA0tO zx&}09CrQ9sw##O&44>Q5f-9Ob|8aL92PsE<8M)vwaJn|@cKq*!re~TQU+P{?6bwIO zT`lDy^ns=uvxp{K;T&(GO;0qCk=~o4({9hG>@BXp#1`^eBT>Uyf>y!EknrlABwrs^ z@9rNva*?ZFi2?BiH5dv1aPb9Q78`msrkwWT4U1+bt(QZtsu*Myy6#0@xtuKoWF%L8 z!%aOi72xb?ggpO8;_$sCST)bkE81H*0K)E#A+Ebh+tztJ^n4JrWB1H&_EP|+)p)j1 zP1Hto?>idoF)0A0`@Vm`NCf7ToB%9^tR4bhpL|8wiOuAFxnubW{{CGsBb~NYjcd*0 zXdZtKNia#r`FKFd({Qbi@JA^3ROM-lqII}|mcvna$*AfnjVF3OR&Naq>F#_z#5~}d zKHZH&4R-lWwLj&4mzP$L&j8uss1yQj zcuF?rw(9psz)Dt8<9I7Rm}%jGO{6=V*DaPGS_VMB9NrAa&4_0Ya={b7310NTZO)O> z)A2njzPofVpMK&Ko=Xx=^;4N_D>sW0Z#xb#oP;R~`_BpzwkAMy55r5u~edz%Tgpk4JY{`IRsw$ux8w5Dh`~Ofw@JVb_!#g=lE| z-6<%@j(P;l{O2p)iREb8y4@r<~+1la=7D)8V!I>%I z6E^Y74$|XY)nu4k9j8BIOKm?c(=;YRJ@QuTt)P+bh(s=+Pa6hGntwnWLrcK%3$((! z(1_D6vVOkiK_iPN8>*OVyoyzFU2{*`h|V}l1A6Lj-+WEwUeI`Mqz?eCQkNq9UwkaeJP-mH>{q+?K_>rhK${B|$KQfEDil;#Tt(2f8lyL}mT{eemqjrI8ziJ5bfsvLKp>X}mU^7ly{g_Safei582f? zZ%ECTKkAjx(J1^f+Q-@+o`O9wg!z%k~ayPUEA4-`(CLY!mSDv~*S1dv7U5^<1r|5mc=pM@g`i{~C0W z>Q+39j81d%dlTXoZ!`EO|KojdqngzfeIS@Xo+6Ru6RckhqHq6!utsi_?Ti+k&d)1BnM!AXO2YnO+I7M`*L!NdkBW&e3hE@0$U(THa>s=J9{o_9nUThl6YYC znxOr;Sc`%}l1fiH1-BLgEpJz^J^3U;F_6-*#s1U4$+#ZOw)Q#3CNHHd%N%!x%lSC( z{1TmO>xs$fJ@@+Q)L^6x;w4P+PxQlgFV4$G9kFz1_-2#xO1sF055hjl(x+La=(v|Ps|r()pzZF z3!|u2UJ)fRIWXl&B%L1)vZ;#J5m6iY{`ZdM-+;Yjz(5I`IX(j*jnO?U42=027>jBW zd2|>(CHC&|xN4eO!<(iRW2i(~>l)zZacm$5b-B8Q=;3C1kFbim$Ccg@mj$jef^w_d z2r!&(Tim`Vhf|^ib?njAFid-M9yYzR07oZ1_|t1wStedEXLn~(q?K$PF_6z#t=m7K z)%b&y--Xixw)=(%S1?}srk-&nlfm>rHG*2RW7MhhqOBZSsu9_QUOsSX&oS(yJ+xU^=V#&`Fu(Mf-X9d@y50wTGr&J@ko=PQHEcsqCWpwuY3>K~h)LUQ;WGeyEojB;%S7Se2?lM?^;0 z-KT>OdV2e=vdzCu9GY#c#ET$4>A-Br#sTOuA&-UWSQ--3(G676QV~b;YmK1@Bq$bL;~Q+dc0wJo zQTZDVxUYq2bmV_cR}i?(v~g0|>SLZeaWTI2D`(n300N*oHG3UNDzY=MB;1!m;Eq=B zLML&0%Y}bndLS-A@9=K5NvU@BI(L+}Q`v6cz~65$=BVxWvajeaSEo%0$4%TbBwn*fRw|)u=-OO6K;77?c$ddo}O^fe_=-)2-EYL%ad|j3D*~iq^V%daL zIe?8*|K~r{Gze)nZSq$i^nXB29Z0KtjEvg52IYUqgCt=P_*}3^-8o>jTBld*mS|_c za6x2NiNGGA9jBswNkE5O^S9-Qv5U+8>`r}dn)qIM#hD9&QtT^+0WF!0AVJ=vZstVr zTJqMqjJxD{1v4>yN0+F3BnsABTkoATv^SDEZy71te7wJbpmV=vcKf#Mi${D&a#XGx zbIAi=DGn4V1>&k3cQ!RFmE)i$6Z@S}QtmiwCd=*LiWux`3?kB%eqM2T|I92)c35Ma zVnWIQl^`4Y_^CefC)?#0pUANHjxU#X&KkS;YTyp5H(n2Ngz?FW`UxFmOc1TJAo~^a z?u-AR5Gd~PU~JL|Sb3ZEOSbYUX%b)u6bn4d;a{e*MDWf&fJg`qn0>#uGq#Xb)T26l z+)FG?5`@pbWG@P@rc^KLt+0yV?Ss;9(UN9$ftyxCtb5Y|@lsyh~2a{3hWILEFneLzb;?zYU(M^K~zZ^s$A`xBASI1K8 zgxYNex+HWwk*oG_gpP-@gsk+**RzG?do3Ak(jCSFNz48l5h(Qx=ziCYK(_eWY#}2u zLHAD4p{@Dg%_>qp|9K@BSLjf2mkf4X7?T|8kjm6|N8aH}_GR01ek>iB$=BZK7LmE( z58#osn&069M;o;7gdSC9+;09Nu47>%39RvkEC>6#`FHfuZ@%cVtyXGF8&ic7J;D`) z7WQ-~3I2u&EjDJcba$gSl+IT#MMDcwBf@ycX^82=L;N|f8|Bb>);JK{z`Z&iSp}ib z)_W;4_TGH@yH%EVnJ)%&*b-1rus=h~&-@YXu#JG^6|RHvU*Wp^p=#Q|Mx$2-L<+1@ z0s)`Xk-x^S?wX7|BOyYDS2zd3!rOkFhB>c$Kpj3RU4Azy!J03}2OnWvy9XQFKD$}u2inp6*M)S!uw^N!pGu44z$2!_eh>C$e-eL^Su|NTwCB;k+3%{S>=;wu zkzp)D;RkR>AyJehTgc?y9JCL`R;9_!?T;+cb@d6r>LM=MoD`2c7vpmaEHemsUj%pU z>dY35IDdaPud^+Ow`^(%6*?<0+!L!&A>`FOrShdJCi#Y4`ReN6>WSuoy5*{G zDth-k#V7NxR#Aa_gZ2mD0uuX`E?A4bL$Q}bHyq+7C0bXr7>0@+aRs!qLRa6)^r2L& zX4L&-0|~1aaXjq>msH8QD0lLg?k)Fzv<7FTE&yc#%QMll7)#>_ z3Ra-~526#|Ysj|-wJP+|O87`fdcM~!lA|_Y_9HyqVJ{9xaR~LbrJ3uJdKCt?06{Cc z4IY5)VCrd*CQztAx@!$Dl(k-ELuSbVWAdm{jJRBYW&yZzp360^ds5ewTB@aFyR9Wx zFXxs+I&+}Dwq7b!fbk&vaV#Kywd*qVx$5)ZZb!aWE#xmU(=lxe12>|5B*o()&SXn` zUf)g&y=Y_x=yX==P1`W8aI(z+%V6JJ_B=QqTZVx{9GdG$^j0AqSix|}uMEl8_6Z*K zsL;=c=*Fd(4>YRfTCJdoavo9TE~HO_O0?t~xDLXcoqmwCX~B`oC`(lV&Rc=vwmYaY zUXoC)X1|`wDbNQ6B87NG@*C)b3*>aX`-!-?EZw+_%K`H!O^@+f=^LM3yOj?_4t>mhPA3{AW+Vy^>R>oEdtfPn*BebOi&&0Q_`zGn zuH=TcL~hCtUMx()V)ktq6??qCF&v^OF&(3wg{|YJ9(mLB>nZvv=fyl(Bz^)=isK71 z8Mp#rcO-F_HVteO6M_43u@=}efubu0@`z8q21>ZUzT?c36%Ca!_niLRF_g~mSF|RuZ1CGLzGyc(6`};Q~Ze% z+PGS+GwAh!8cgvna&>3Fqmr#XiXo(=)9D60jXQ-2h{!537V9-LBPcxD)zIQze>;Ap zt4Z=i+zOE&SZ~BtaY@J(4O9${uEBzcz#CFfaPzh7z%5VOn4`->p<=~tNio0dlqFKL zxGubDI+vGcnhHFE59DDIJ50W-;`KbK@h0mgug-0Q1f>CyFo z#101th!_j>mbe!5KnU}s(lRj>^B~zy@4tz8x2}5<-(~NL9_~^LFt;>QKIej$Dxfq; zza3)~6u66Jo5Sxw#-Nl1pCZ><$4w@mwQj!e<5|5!!XLG|^SIP_e69M&J9`aZ%Mt+u zI*&nQO{o1jhWw++iX5bvWUw<{OCsUtnDK>c9`kReJfw6`Ux&Kuj<23`!l%L;Rixhl zOLKz`%vJmnb^;9zgHDFw3}?Nh3EbOOZ-ypxl<)=ol?+~F8(u`*Ru9G{d7M1bA8*1m zMSPxcJifj^n#al}X4zr6*}rA1aN(U~0mO!hL;XyqzVkB9>?rDF%D&5fI99oMV?XM4lz3If-jX)B)8!aTfnz?#COA2Q z=0cSu@l$B4nsA|Eib{*>O^!qfvLfQVRZqKdc_qdlq}}Xqu2P9E>!P=kKxs$xC%l|c z%IMA*Yqy&_w`6g_jaM^J0x4p#f88;u|4Cc0jB&dGvuRDkv#4a0l$HCZA|)&U7fC^M z8PE&w2#81bkJF}yxnyolxHR_X;q;LaQZ$_+ogW#!1c6u6G<9~bl>h)8+u4}{v^41m zFzD|NRF^Dj8pgxLFmp_{pZA=!ni7H65yIhCipfe92oY`HT)!9$oqB9cz>Gz3y`WOR z23c6K@}JfxrxUtpgJkG$X54^@>ydtPP4&4+0Wg|ox?;Xy{oE0U2A<*%xz literal 0 HcmV?d00001 diff --git a/public/images/ace/managing-policies/policy-implementations-list.webp b/public/images/ace/managing-policies/policy-implementations-list.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e05196d20e2903c3c815d937b548f6451f83573 GIT binary patch literal 236884 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%0AHT=^H+Ng+eme$jD-!|p5Q@{5ff=Ik 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 y(Y?aygQ3=mj-1-GglCjZT0VF{vDoi+tyU%C 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

(M#+=;nNizI~hzHkQQZ)3pcboxM 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%0AZU-L3@J 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

7i!aBE>%c^XxA1hruUQKW7Kv$Nf~ys}nyh-Qc$ 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

i3)AY( zG_AVlvdvN#f=b?xBD$WUG)>xRAlJ={5)+-()l9ah_Bkb5|A0ft8pad&X_yBd2DU&Z zjlx&&SqiQj=h;k0jVpk|qytx1YZ?D!O!#rH-5vNCb6DuCpoHv22rTgSxS< zZER(~A@9{H<~{}cA7FhA;QW(r*d$TJY4Gc_?Si0~n&R+&Vr&jn6~GEkqZ7|c;Y%dT zyl9ZiSB{QX$ZJH->d;!OoVd4eo7xbCGjoc@?N_AIyEakwrJeluJ5^z7o(?x4PHFV9 zX(GR6m_J{s#5{5J*#`JdDH2>G%CU89?L}thA=crfbo5;6*G=F+O8Pu!-Z8^hmOHb3 z*rth&%E{H|$$@|w3N!Dr6HZN5TO-wnla2`8BXm=hD^kl@XDyt|Z=)&$H=H~&tW}zQ zjRc%ziiwAP*Z}M(h!Q>ZJLnlB*%#HaLkkcNWhZltoVB-u(GC@Q@RMZX^VgxwznlCm zaWHVIl-~=+wMiJ(@OrkK_;_b)kBmj8z3U#H)d8LDe@m=`tF*-xiQ}0W&GYmdU`bIm z`R8W6X^TtPM3<^vO%B$OG$6_q{<{2KB6Q&l zO5GJB2k7S-Z)W0J@m!o4>D=-8M8$GSaMVVYcycjL&HU*i)wJSNga$m1!`~_50;nMC|Df z+W>2X%QN5)s_3j;?{}P2P)_al#m)qBuBs%b6#3vqNr(iMCmbqK?=q*K8l~GiUqTse z+GPaL;?Z_XdMNNqw+0Y3KTpBEe%Rf%ftq75xosY3d}F$9xkHT?sPm|S_|;&7|6OWT zR*r%K9GAj%`sf>%v%agiB5eY7ikedHyY}L%# z_hW4ci6;ifKx+o8j>35eSI{z&W&t6cQ3^ro{Gbgv2TX_~uR~lZr+Rv2HC{ENt}~Rm zOwxP6=60}HsPSp*sr6-LGaeBfo^&|`u?L3;lJ3J1AV{eUy5)S8Qk~ZK{x=Phd@{f< zQP2o?VV9@#o4cxyKjPm+d(TdOf&Mu#GnB09PtS%ok%ux2N@Y;#U--hig%Lr-JybDJ zmSA*rA-2!pzEHHQ3$kg?vZwT{)jx|-J?Z6VsI^(F&6PYqG=O;>q~QJ~n<_Oe(wJ{B z<+GvQgD##MEwQUPF59D_01*hM9r;E_z+NjwOu39CaDXD`$7RPo0T$JC9;4Ezog1Sq zmv9@Bno8F?>;LCLE7#BjmlGq+=d6y!mfHKT`Bn?rJv+r*7uBy~clp4XU635}o8~*)YyjI2H+@Nls}coAU0go`bVDK z`A&>lfUrvgN7Ji&0|KRq1g&{s@CCUTN@KCx`z$<{v*}(Dr2b*HTW?0LR1k!MVi;&{ z5Y(n(2$#^q;07mj{Uhvq20H(bPjmg<8H#a?h`~&>QCiiiy>Zaqnq`i*TENoB${l3SL}V9#ymq)xRliJWRP`nh#0EhpLI`!=WV|$@nb0C*B{g$FANGJ5 zQjwrHUAd}lW^>BsX%M17`Vu{8=lV1&SEoQ=)ppljrtmpW(;+L5aLn;48oxc$+Yr#b zDzCjr?BzZ({_pKU-t?RBIdzXj_9KR{-WGRl4I2id$FkV-CuIGPmyh}6q)rjG-#ySl zDtEM|UOF@)Cw9BO<%s`OqypVE=B%mbOSO-}?RCAHUF=%F?zc=E8(=#o))nKNt(ig!=csRwj0=W5 zi{H6w5b3WAmJE9|8)GAuaz)!88#low6!V<_S#aEA?WfX}yuJBksfZjLb<%gCWxldF$W8Kvv5)*D`2y#_xKbk{YxcbDZJs#nt$MZnE*~H`;F6-|pr` z1YO5FCo2%x8{ctXdiF`!30f~Y_SZGp-pLO@pO}%ggZbE9VIKya2gN4G9Zd{ zzY@MD<~bi2{!nayjpeIs-Q3}0v$vo_6u*)=P>M?Kgex&c=ZUXBerS2`30L}^x0&e9 zI!Gjt4sAggS$KsP#ceP9Db?>z1cHSCM=pii(7{uWL`!h)m0O_}L_YFWG$z4>fw5|~ z+wxSxf%DyOFuOmrP%(<*>qHpO_e z>I-+j0VCTYCz6U1HHIi212GscBR@GCzd3B(q-hRSKpNLn1}R=%9z(98QB=gsd`oQl z2cEb+;~XTkOiC^0TLJGtquSA;xW|;K2?}M_+|!<)K*bH_5Tb^g2#Jdbxw(A#n+FPA zl61n_)qUM#qp+Z~9eA@F^#(g%?{2UF^T=Hi2jq@X2IH9jQq#{N5tmSRR?MENgEh&p zGVg3*Yez27lj|z|Tsp;-L7=kLwWPU>HQqhFND0Ax%E_)Mr@Q0IKRV_|=f9L%vkG_m zmp^V9U31EVwgBrHJb+uGWbC4wXhN*tMFzN2_n+Wtmu93jI{RLPRR1rNJ1BoI78mC> zcKZhGeqI~IL*J<(8q&oN7Z3cdoN#NK8T{O;z2djQEZ^(n@iouqG4)Hx^}U<2h!EJ5 zD(+_%8CY>zji%GCWgHfsZE|@<<~(jzq4{>NYXysE|k3a2rInA2Vww|m(Ecn7L(k&lIA6r zOGn{wGydh>`Qaluk0P39Mh%TSI8|CI2>9GZv@IY&ZXRb5Lt@9y+x)J+1I7T6UhpO@ zm72NMZsUUAc$s?AcudhOtx`UAt*}=kEetafcS^%j8_cWh2)jztIeq zw0%GJ@8$3UzZz&v^wrI71Q434o4N0FD5dhS6ll zMN*v2N&L}oZ^-~r1&(%2K8&!2u{9+0O@oKP90wS5%VhZ-X9c{^wDN8CW)tBPJiXj( z{!v_;4P}s{7)yb={>(_+vI3jm-AJpWbf3MCMT3*AIotQ71pG|jX;TR!sH)O4m2)|_ z4;MxMU)|I1N3LwmJi0i&RXDW*6#FW!kfBAMubPYQh$$zbwEmu!4181Yn>B9~pxJS2 zWZlNviL+5#Wp4E9-pm9E?Iqyk0Pg8f0>g5!e-~W5-;^Pg@Ce9bDDP=urqTgVa&XxA z4&*DQ{ai>6Oh7dqeM}XiS%OGH%)YteZHleqkh2t{Q%&!@oxKvRxuc3s3z<_&2)ThH z6-dVJkStjX{oPk9m}2cw2*VLlxTdm-w4$R)tp2&OIS5D*kqxMgs~jT@+)$bJbAMlf z<&?^J*t~JKT(>6}cn^&Y#yY9N}nGf9ncB`Sl@4>>8Y&4A4%4#_84N@uxHX z0sCX%$1?kd6vL|@TcYI2xIHyU)yB~<>Q*1Hs>f7F9L-9k^Ga6RQu{u5Q)rRP~?dcr~(}Nn}f!RvI50?Z#ECM{GGr%|w)eR8gmj`;U z_Rc}Ds?3(KhyU0FEXYGDwiWJFu`0}`e?T6}Ko##XQ(cCi_X;CWX%$)J;`}pvQN)}V za_;h{XJ1l9)8BP4c(u!M@r}&z#6^BpTh}4EYgui%5VWs653^wVNOmkTb%PemK20zc zqOZ$i8~w3IZ!z7KarEjRkFV=oaH8;uhu7kEFRYqOiv7ng3#KE3DaE2N$;&4IA(j2e z_(07IgEXQnEU5G}6hIDXh5bZE@Gm-~Fvpqn(__#De;l#P6%*%j(Sf_ui*^DpQ0PFk z-M&RL#dyvY$UAP$ZQn>Qix9;pzP8^@nf_U`uM~WAC4H?j89t`( zhTJNj@?z^hkmyG=oBMGnI3_STXmk)e(VU`{K0%w{U~#xJUjMNIZa*#*TC5LDqD7=S zvT_}U**xy$WF|OXb`m9-2EHz~i((Wja_pFX7v)%^KjzJ`tRJ8xiY&LvKA;w`2rDRW zH3`)D(>HOiJQM^Ty7)46XFYY>^=0$|_rQJI&ZVTXQy9EyK@h5(e3vOdspj7oau05m z4Bd$TMc*#Jd3g@9A0-@1A*6zVO6D-OYsg5LypVZ3o&s8y@^n0R(ox#r7>6y2wL|UzA}G-+$@>7lVRi26^M_KZ=tuo*>o@_RN25B ze_sIOfN#5~M7j4pJcLt+F{~80QP3=k?5irr?4IP`Eb#Og_;SRoatL8i=xr3YD;T@M zTa9&pnSv;eH#P}1>6YsLYu#PU!7$kzmTh~JxL#y-D`qoI7EF**h=X@MZtsGC_$5T6E&sU)KuwF#L zhYXTYygFq1KvCMkuPu&*^?fgRHW$f_UiA@{N-unh>K=l_rvSqOify7jVUJMpm?#~q zC8#188x~UU*TaI16g8}0P4iC$fQTJuW8>5(A__N56P0WL;ehjCIPv+HMt!2PV450U z{+t6nI06*i4_fCo?Lgce@!D5#_utEP16WzoIVNGkG67@;+@A4O!8tXCiZ(lzm;dPS<9}M$<86-B zLWxPX#h{1}RuIA}LFmF8IN-zFpCE71|CLnY5nG||)-_*0fFbH7N|pb+)pD9AX})Ef z`T@Jz^=sRfZ3`s+w&=a67XGLY@0n>T6u$V=Hp!P5be3){H>iP@ApTYj;TD-iSRf z*FvaVKWGYU#1<9r$Ps05zD`7mo2a-ACl*o`2s@**7EAv)HAxlG zTUWB3Q0isw9$)K8w$f7Zon@UFY^-BUCOfO-nnJCT9;%AEt>d@@kW^20PYe~XTE%pL z+>AYac#p5OG!wua|4^=qYVAVQ}v&uPYJvtiSl4qK(6<@N4eo8Q8O1k9+UPd+@7}E){Ro^ zb~!;l5t}N6+u6NIv}sOC5Sp3tI?DBTg-%2WX4%x-7qq)g`8~)S1@|LX%&FdaC1bZ+ z(hxN37*!pr=QBeF0BJ1E5Q50^fH!}DECwmjl>7>qSH_Q%FOo4N(ux`_iw9B zjXmo3S^F3`gTB79t2inGT_`<@B&`VcEzUjis4fI+*p-E95uU17QNAaj&5GWJVXk{G zw3yQ-mZmxHaYt_3vCtOZ^VdOh?44s>1{krmq<0#7d$N=xzG|~*VZt?meO6zf5Hg2k zc(}7M^H$Q6N%_fg{HOyH>gKsmm{pvfC-Pa)7Gd5?V`>xavo>ToyZOk9b@FSLqnQd# zI}bK}_0R#SbM%&&A;%(D?0|F@hm9o`G6!)&=}`MYCHsNYk6q;xMe_Z?x~U6#r4Fsr z^D+T1(I*OJcyd>gQc2V9jraV5n|uDP$Hpmo#zz`2jHkV7DMi)Fnj3 z;AA$1W0<8H9;b9kwsU2CNC#MxehY>*f#)IhL&qwT zDq7Ee3CuYlc$p9TMZd`|`KoyT!&Z{J<5pG~H71Zy+9cr`Z6040LGnjW>&O(9ad@vf z{(=xaKP&EJuW9M8pC519>XkRW*K~)d4)eY<*wLjyw14aglA!$D5ejMuuWb#~mu&_K zo1UzghY%xe#!mlhLKZ6FJH@j+l%YQvkhFE@V&PaLz&EE)hBx&!@G`s{9(wLNH?#E* z%7+&7T854}m#x#A*#~xP2KVMzf~ABcWz8AI3Z-PqnFJq;sZXm4Iy$uf;3Xefxuia* zh;VsYG`SoD^yba>9;##qu?70l?x2^l5J)K)d9NumJ9U(`VlEMrO^ArIbOpd55V}tdsODl z){K4o^kXAH?{7%YQU{oUYR-J$$V*{w7>3L!$Hdoj@#BjyCm`TGVjHwI?@p|i#~oIe zF_Cl2t!fSq0{*_@1M5DT`Ghf8QiB&-8NuVFg&KaZsxD{;~lAD_Y_2;P;i&Y{nssY%erF3i~%Wfv7PS)rf#}jv ztp6WDsq3|KAsX9oGHr^v7T>HXFaEC|(&W|sV1->S@R86L7~i1+lcy6O!thi|-b7Iw zC?pa90Ltm7p&Ls*)T%4iM4dp!E#y95BJg_pPZfjLlFRpV9(|@-=}xriZOTu+VG#gi zgdkKMw8n48+hIJ_ulRR5ZO8iG>gyuAJ$i!Re@Y_1bG zNahmAcpT{a#hA%o|4sV;5m={GPd&^7AK5COliK^@YYE2Xl_Wu`_NiVFlRIbX6;HQ}R@^ z;QZn+RKd+XoN7T=- zc18(bS&Si8>Eg_-t0%?JNSm~UipR6B>GvKg^cLSL_qGn+f3X+|zKW*ZwSM?Lx@d!9 ze;dWn1~7fP=wDxS6y^P?Hx`6wscB#0EHucDBvQNPIga4W=iy{y{%q2$d&rKs*718d z&swFlR$2(~`vbypGDX&$ntHC4!;~XtBYbw{zIkn5?jAwo%p35@%^dM^-_80*&B*vB zUWN+xOO?B8On)YtW%w}+Cdy!Xt6x*g{~A#kG%mxdyZZKwf28ahz7TkE({g=Wf!z}7 zy$mRg%8k2BCY$knG^YcQ-I;UAYc?@&gUhtq~keImnH19N=D;I$1_AXO{@A} zO-_=dxsI;#k7hH)KoL!Aga{mIB8Wd=IwtR5Z5`_$t#+F*yH4Ylbs<)@UAV^Xxpo2a zdP&7q9vAski4tX@pC*~jW`|Kj;V!k1Iv&5_-i2$05}UpWvzXi6jZxd3Wp8LxG(3c6 z`qqCZnAi@F=vvecg|9~8%p38UDl|jHqijP~Aqo~y(rflHLg0*f+Au}*v$Gxafi^$V zXho~P!%CAz0}@?}Pn`fm0f4c|NbnSsEYD$w9a9EZ%rwDjatesvS0R;DxCE6MXI>6S+mGlV5JZ#ni_yq=cI=(j5cw*LQby)F^Ek?79XJ@Lv>1 zt$5ksh_yZs0Q(&z{omuckKysGYu+qP;P&Z81uG_EF3w;+a!bAg*>Wb})W8%uFnr+e z#WS+zOrqga78%08pTc5ZNu`uu!zI^eN<7Q5Cn^YICfV3+t{v?ft?LOhX#saXaN|pY z+mR~qslNHukCDSuE8W1S6f99}u|NLR9~N9^I47b&pcYZ*o~;sT|DgxbGtTi`Hox0n zJ0pT^66m1X?O4dl7~(}A#lBDh`tAADpz4055Wn!vB)j!D_qVjjOGF%SC1fW+-nQ4@5bfaFsMW<(Vpk_TGJ7tN*3V_zw@OP}TVmnE7V-E&_UdB2SX7h%6slzyMp0uLG^qFxxWJEEO_PwvA>E}zU`Roiqi zGfuC+zm3o>6hH3-^9Wyt#-u_&WIuhdB6hcq-vqvTby2-}zrVdUqjitH97ui-xc!j8 zt2n>EyX=QrqcN1W3MY#>S5(mclJb>VSn6H%roWqyg_J_{S|!02Cfc=9OvA1E?POsG zXIBxfD+y~>ueMUcfI)(4ZRef>Yy*}?33T=~^>sf39VthhJ%8vwQQ->zRgAc!fu>j0 zurz>c*f34ZT+y))VD(>Z1*=u&^R+T0PX4ud>o+v@YsnjkmUXWc-ei+_Q)H&%k@(Vk z$#i_4CWdfAP`(ad6B?+i@ThpY&w$%zS4m==i%eJ_>l?ePgN%ERx37`1cV7eq!>R zb6L?K*{`&s-7RBxzG)6qz)fk1V;ryn7#KaGLAc_I(548?$bSr2mu!Gk_ebK>e6tJ>fFJHHYpcQvN6n4&}ID+f6i<^kFKhx02|G?TO$ zB{QTST?hf;9mD;W4Q3-3z(3!V)5ZkZPbGK*-G@;Aeom7`%?Wmll_F_N%j7?y@h_0H zgU-Va9Q`aeonYe#*iQUz1B|B+D$Y0J_Z%&+*M;23mwliZhBU zYOB^+6ZZ!d6#u=RXAvLn#Zv&^o5}!rzk9-|>0Zs`5BoZAX^D*&dI+;k!x0KW^2bYc zPa0nBY|ONUooq{>JB^7tEM?H_%H>!kok9cs(rh~pm9#2g5RH;IuulP1Ir&h}9BrED zd~<8Y=hf{=^IKAtYK;GPxXz7CTNd2cqT`0GdX{jf+(=DxQd3t}XK!GavU^+#G}Gu` zaF1+u#Yc%OxuXc>A#4j3+5vY)uXnR?n@@RlK4REDt9Ja@LBw6k%4#I*zN*b6oI(;e zuLzNY^1&TFx9ybPXPDAmabNy2WF~{JvmSPdZDzzuAiCOL6$DqTxeumY0`L>eF_n3X zv+E@tG>u@X{GdCaOIBYJ3rzytj;$)gax%NgRe2rud``gz6bpC-6r_p6vMJRes2?0z zxa3u&twW{Sh_>uDALHQDYXm!(lu}1;%T*JY-#JH`vxIG=F1FdFJ1{59N#yI_kH4=^ zr@gm#aU0{~RviIs$+Px|*C*Er!E_)NbY3(AF@7bb&RMoQEwUHyOj^F00k*(!kSlfZ03STwsCu*0P* z75@Zh{0Bi|#fq)#Nf$JlMvP@EglB1O4ZJOV_{TV`+unkWEj?;8o?RJMbuh#z)85J! zO8$(wH{gCaQpz@QVNU!ct>BNO@E5s$2NN#9@Lauw^V&J42tz`KnDum%ri6cMW7Iy z1A+>++1oY4XdR-b9D>ccUD;=0tY%%gv~bT5lgdupvs~%4$P=6x@Z6!9pI2WjWiora zxz(OWJ9Hapen!P#DY>P*S*ET1z{6F=Y$Rsu6R3?lRoSq9T>V4`7t4nhd!shf{Jlb? zP<{wSxR1?%kzm_G^Z)z_+}{6E1@)Qmq;)C930rx}$wiSOq&~_^xj~@{due z*$62;{uO2rc;(QCu`t5y0!?Vn+909LH0hD3W9OK%bz9lMQ;I0TZ--C`X}Okq7;G*8 zCTU=AUJ{vKC~h&g_hB@V39y#GVIV^fM1MJNvoJBcgR8>lb$EFb4$RLgW$og-GGpf? zM@q1AyF*pVNj#7I{%fZf51~di%i{#@(G1%BrAgoLB}^-D?Z0dMvC0JD=M1WMp- z9IUZ(=)TEI~A%%UxzBk z;yR~|;g6tA0ZRpx^eMdFP2S0ARy6M?d8h8>m54nW9sA_dx$_gfS(TbmEP+$*9HnW+ zDuVCJbUc)J9lx4D0lnA1% z=wb6%E{Z3n%3}d~9Pk11=M8e@8sF74M-qawR`UkOk=`cll6PpZh-3KE>xl!jA;iVG zpLJ-Yz*g0srpxj1t*O+0h&evaCAw7H1UI&+g~G^W zZ~Gs%nNj%dP0Ln-F4dl+MZV!}@H{m?*)K)3EkV(7mLlLk@|q5MVg?i%u8QS~Z`}g{ zZN3Vdnp9nu@2Ep$!cHtMI`pkr4U~~k+ zX-3@@481Yu$fMgIB6U;mU`w$4{BqX>s%-K((}9(m?cyPSuH>MxYhBa;eZ+awS0^qQoOd@P`6FJ z20h#>A3b0QxA_UEw|cxLS-H_E;b~6s3hhv&UK)`SW`t={6Jy!y(56VQDYwwi6 z`GS7P3X{u6A6HhNqqQ5nycu#6LjAw`TsE}|F^_la99K_Q1qgd;l}eCUw{^`xe4|y% zNqOh*gGQf?xmTwza=L+uVZurtKK(t61x#4C6$Cc2CxCT?+WORmwy_D&{HFa|)r-bE zZ2N#UiqllSx~V&@EvM=r|08BRkvYeDt%!E^prpZ2I9P zGtuq8$vegnY+>3;Phu_7{5Nc(xc|!sRs&bB`H$QIO$VN`nAYYux5UdwnI9)KRhK}% z;B$qr*5Co^)tScdL$;RczgYLHt@v|MTrfJZF$vI%!{9Wb2gItWqG>7VOUskYv)0yoaCCPPx0IdUna1BgU?p?L_p5KU()c^ z7S^{rv7SX%Q9&dx1A=<~e_bb1)V}X=0N{L@tEPgKnx#Bd&>H z2B<#o$13?bZ#w7KIH1QbU|nblaoUvOJ}gCr6tR{sP@)z*rJ4|Tj8DqjsaIT=q#A+E zX?Z%*i|7LTpFevE7)y>hTY@lE(X4}Y953$NcG|YUTs1`UyznSBjwdXrS4r^d~ zf`DU6TW|=-Db=u!yFBy4q21dMnI~wMct0veo`gYW!vADhJ&e$f<(zCa)92T$hs&hJ z(#$+-dnh)U^LiEeFnx(R_2p5Z-OdUbQLt8Cog~>0htuO)yyzv$4)y={iU0&9GnRq5 z?K&2`p)G%&r!g}^Ih(?9X;PPhMbn!cOIfS;JRN%3#7v#A<8oRl$XN>UqYNK$4a!4? zsc)Hlj^gDRdX8^3v|sbbmfcK>%~}L%cV+HN^;ReAfh`!v>qCGfH!dC#6Wu&YA*ov_ zYY1}fB`@`sWL#+q4pg&R^Z&Pn|3e^~BL(IM0#bR3_XblBj?zW{kJ10TfjGFf$srD< z%EVL>M~ZkEoKz&$4#}9f#k|r*b<$nN;$-5$YYYGqyrn;E1=(>;WmRH&k7wns2Q&cp zAoc?Qz^z951+;hnTMJT5v^N^G=m!b2k0eTxde+r*kooA%{cbd~*4gn1HkFf1A9ycv z{U8xd%$7RY<`#C&5?JsgdFuf6o8KpTO(&9VQBch!w}PM>sQam4#>owb*d`)%qW2t1m9bA+IKVr05D(z19pZ@Om0 zCz6}L(B&?3X9L%~572Bo=z$xI59iv-S*AqIkzE`%kB(&G)B9Ll3IM^rpf`y(b;Y#0jxlav7I*(>p9l!vT>6}z| zv_tY%hJw9eLL|Sdr*B*mLck8ymt~)KJIc8&6+!*)8Qg@XWYlRSVjr|l3htJLs|%s( zLxe3VpAI8rO&hD;M=<5e`Ni8~Hw;pHE}fx3rEJoX>oXI{4Uxp^$+ zwVlO{7JSMf<#m7iypfGTH*q@hOmIuvWTDYh(DAKCL(-vkspXQX$rH6k$3 z;thvuC$DfzW`*H}r>AVD)uq#psijA+-4>26S($T2j%@2gtL}I3INDcDwe_8|$6sqo z0rA5cmoP~cESVv~h?~K@M*gY%AWyZB1-VHi{@A}Ky`0%z&1r(!DP)yqMD{M%o1PVI zr1JSzsC~C)Z;|uJx!%aGm8P4mUcdNf`g$KDnQXz)>j|z>MtP9f0yL2+ZwB#^f`Yy% zmRC?$3nm2!vD{ikAa3doYYWYU$CjEg&9Ql#x#hNK_$%2pKaD9bh}`fxd?^od%G}d6 z*1F?Z!uaCotHeJOaZJv#su+NZ8_lQQEkU60ES`(oK?W$hwHP)2)o5%I7beia0X~A~ z6%Du9>wc)c%ry#|S85C$MV9Qs|C1S$i|n_CX*6t#GF!*jCnifj2@wi+&&Nr~c!bWxzcyyJiJ_f1QWyDrIX@tpKk} z>SJ?@oNyrBmBbp=QbN%YY(~*{QkOORA?yW#03AfaHIB!7PY165T3&RsFL|Zm2hA9p z0McdEoj2^8Xy{W1!BY5mqT^1?T5=~}57`o`>OU zONsEMY)QUz-U`7jKTn-?6eI`@0mBgc4!6xhWUa*)URkQ}xkpLG5`U@$N;=U=5#c?N z@Ky`lCgmeFVG?O)Dy=280ww2Ms}ujT4Yk4aD2i^9SF9ndG)E^*DJ;UhZ6uU5WW(q@ zEfQeo@Z-U8Q=295m$5+Gs1>GpJ}hkyqiybL&_0~t!<+lx=!7xWX3zzcZAUV304|0U zS9x7C0O$iT7*SGUrf9)tV49Z4b;Mna)IfDx01BIq4c1u5Yz*wzbpL(f)E!VLORhR{^}gt?4Gq zPU&vGoy|-LhrrADPufQs8DnP|y{v>C8>KJOjQf(57WM-7&SmP#{={Vq8RhF0Ou($e zjO0XP5tLwGtE&L`5BJjoc^wIsu2QJyJ;VHvKg|K7!>(yqGiOR<{t8*ZD=_mtda4|= zD^R?xa${S;I#j~4@~QkP0xt4PS1XP5f3=$J=^a@9s~VJGywu*{z_P7<3`sR5ow?o< zKjRtH^1UeWTnxA-7;_*oI=*QfIoPO_!6vOKrNo}JPibn#tFVV3zL3=UdCIt}8VNFq zyIvOI8C*_YEX^s6vYdB=I(g!X&H;v=o}-3wyA<`}{5e#E5{$2<6pHGJ&jXGxe93ww z+_&mi&}E%@X}Tl%l<5wHV<7^P>y8*OKQFMd6~70J+S|*i#D;Z=vamVQYr{IIA(3-V zV0$u&>Cc)&_bN($L*skIyj}5Lq$yDmXeJ{*nU_o#9AG#E{AZ&eg&}!P&|J@%dIj1D z$p>()njfi5i0FOgm@3NoD;oZJC~LBXDjk~R9f0z-edo{YikSR;yIp~sO?sNWcx(O% zBN`=$TN$QoBP8yJ@vpm6;()KYRCrQiDiTL7dkv)4+@aLmO5H#O;v=llH584hrV(#2 z@6KySQv^0V^%_py+ddl_;*sI<%_7+V&Gg%TDDJewf-lR zMQ~);u{?}KDHI+j-I$7m8ZAu9TXKQ-j3Tnv)1spae#>Z_9cw533+J%xkq{UFG=+i7 z-!(LPR*$y_npMduh#6Q(GS}o*!2zIgSA6Uzjxe9w8@D2owz?eVvyqikvRe-6mdJl-i6-3-$~sh8{d46+?*y zp^$(O+k&!OB+VMOZb)XTsl19)hY=0_3sVkmw{`H5Q&wG=Ku_OK^pzt*DD=ed!SFOn zdsU9|{`E0>Y+B1MeX4RsadXI8M)Q34FWTw>amw24y$?rBNQ zEz0Qtf+8_~^C4{bG(C}4Sp#*KvwwVZky^D;Vx7P1Vj{va2U8|B3od6N(SSUOAV;nE zayBawCnQV4Cj9#>$QwX`RVuo zcm)};sl`4U%$9%b3W)P%8X&t>C|qDRd>%snMaG0F^Ey^7_K)EREGY3=vyqqRtd&A& z{RSNkmC{~nQhWDQ$`vZx)Ezk0sr(I$V^JW3)|PwH5^7PH*58}Z-<&wd{XN5kFTGDL?cKIB|%)uR;rS1Q%@1qS~V^gLyoc-Ln zFg#1`oE2WFy2waRgf3+z3b5X7Sm&22b4VsvXik zqRFg+tj=PY>Ci0B8U3FV`2Px?|63edgvUzDsv=}r1+`Q1oirHe8vsapAb}5|6pvpk z1P*hXmr$A%&DiB{m5 z19~n-9Ja-xFVakg!-Ze}y=k6%@V-*QU?0Qda&t1u<~6 zZ5pdhy`uTAd7gcAyi1($&!WUr+Vck*hrW?Ac|>U-6}d9eYiVM{aANy7b}3fg^!p*sk`%JVFKeIQO-~DabVp{e-qofms+{u4D!&A<{2`pTp`a}Tl`-D zYe1C0*E!!GAuB^M>s^W+T@|e!5u#Y?Y|l!Kk^O0y>t=$0kNH*5p5IqlCdv?>aNw&& z3!+Vq;SuJSXavlR8HCj#k##Ni7Q@AfK5eD1M$kvv+UjlTLu{;tS#yHEW#Dy0wXYA@ph{q6a1kv^OITadoEzas z5-42|S1h=?ob*qsW%{t^Tm~h}T?(UkI#;Xe(wl|!bgFP)A8OYKJEoQnSsqemLhQ#M zE?g?fr`L3ho0)GH-su8nLYpjQ2y&(@9hOwVcz77Wt^Ugnsa!2f(ge8oFwgBMxy{qe z*!mu`yqJXDG@S$y2@6S_a;Y3tJ$}9!gipvIZ~6xdRzqj0XyiiuNm1;7o?VA%WJ9nU ze88^j)u#-CyiV67Kf_hTSp@7cRmi(GDX3k#@AzxEz2&ZNQ=Ni}FZOSbzh8YDY_m&M zRhDQ$*I|LQu%N|)vLSBL8huor(%Q|ys#S(`{NDsEAF#=*-2ojR<}5fo5K1NDykMS+19e&jD&y~i%_P8DG1T7jtP!U4w0 z(9V!lAEg>ttp8}`+`sI3P?zd-^uU^cE@XfYbiGH6&M|>(%<;_^k2@btKxm6=jcW8` z3?pNLj+LiQLt|)|YW@{twV|xW)ldZuI_l8_qh$45r*;C-mCdk8N0*pk5|M<*tp~w# z`mnw>al*6WNR(G^rdsBje%_0~{5T~37XWIB(bb*ir%pk7Z_TGZROd_&8b0f9+ zVL`+|OpeWhIrkaF9@4`L-Q5;1T0tV+_2R+kF>(~>t1{yu@fNE72+Qfu z(+ob2Qtf1Zpa{IZN14ZFg@$#&+fPjo|N3#U!I1Dl=dof@fwJL~a$MWnAqJeBHudLIZ%MTVn~wM{Ng*NdTYqB3T& z{(^C6o}c+edD9nMkbvr6t&1oa9ZO{Ty;ty^o&X!`nOSZl#;>N%|GXg%|8HWyO$Wjxxh{#szln zXj@_s60f?vL34MZ37fU7OM%mLrc%9Z&kn5fh}55C>^51^(lJ`g6^OXs<}o@)GE90Q z-k+fDNHW~qf;cp|Go1G9ojBBZCq;!XWo zd<|?|4}6OxXX!7q=3=?b_p=`yQlH``=%-eAjv|dozndfUZDxcLgf`H_zx7d^jIvGc zlchVE8#I%5;*B)E3olFZ<`bCNf{A$CzQ)cl?|dInaMq~Un2(IUu|Bz9m@1orP?rA9 z|K0${y)jbk2qESUzMmGf$irGJcdlcls>$+kFQE#5ZnT#pMxCj6tJDD+E4y{2ZVg7nRm#lp*_^&D|=Cugl)(vZqvwU`090UQ@rI`mf zrYTY#MAfd9BAmr(Q6i4-`*pBf>){vK(P;rX3X4))GEPg6ST8jUi~NJ6Il(sB26UpO zpW%VK-7_Urpuj6sV(F@?0kK1l?Gv`WfwnkPgf7%I_Dkydp|=PkJV=6(xU}A;chkBR zDf7W0>(b_pAQm`AfSHt9B2$d55V{GcM*;0dPP66V zwzKRlHo?e$(RHxIW4hqq7E6pmQs)2;v%Zbv;)~9eUgVnVZcK}Rn_u{KV(4F?D9wW@ zXQ6kT-#x3zs+CTqQJ!WBgU3LbTTZca4{3hU|7kc77m5%6A1|vy{x>EkS1OS!m&dzx z03!*aW?~fUFUCZOSYEGxo&qG?(eq&LgrT{@8!Q-Sd!!h#5x$oPn559KmfsnL7_q@N z1qx&J8`}`tj^bRwvwZ(P)aOU9PkT_IqnB0>KPJL5hSD(jeRhE+GuWb&jjOOWA45m8pC!2 znttAk!2C8=-V{P$mB#cM|VHJ{>xXo;=R@Wd2=rmCn>ca7prKiD! zAd1-uaw~^46gpP7XO^bnI(YSfNNdB#QY=}a({W3%9q_Ze3YLwG?Jv1_B8HOTAB3D= z3Cd{wIkQ7Ct32+wC2!jG0V?p$9cQ{xya%!jF|96bi1#u~2MDjj_q#7^R&+g(hN^NP zr_l@a^OkXQ=XmuvfyH|bZ{JvWmn2FsGz8FfRW>HU$oqbcv-j{x$U$Ut%zd}Rr>h&T zCnj%9AS~|WNkBAyr&X*g2A(h&Tc(>e1%4V3@|ttOoSM%iS70DeOtvWKs$T@404Qk{ zwJrew03S1d3W!%kIq2kq%%q;VOClu0G31Kt0vKVR6537j7h97cR_(dzBP5h*#GNXB z@uNQH%BWt_$Mrx~lb)VN`JB_+S~lR;1rPF>!l)s?=^nZ6X3HM;rM*CVF$rR2C7&=u zjmyGg-82^H96>GMo%s(jb-_?`BrT4 zmiTgTj6Tu8lX6+VTopy)USA_MsrX!#xHP72t;(RvFv5Mv8$6Pi1nnD<}~j)N%Pr~wfK$?3$XMol`y>VqM^-o246xdWlcqqpLxU?nXj_gFFsvyzn~ zX2ugqKCyrY3{?0H9`e+S#7n1@ge_7-__1;lJ+p=N(D;Cg& zH%jyX1AA>S7lh6cn@;yiJon0y`=*6k(+|9();9wYDLHp+1KRR2x`FS~NbmQF7JCTI z^RNZb>dx3%rYAXuUMsB6b_`cH1u4Q?N4Ph3rq!Futm+xnAa@3*o944=-DyZ_h(|CF zv1Rw$CGwClK}1*fqWd^74`S7}y)EZF@;N5Ck*QVJn-_wQ_tR`&5!RLe=Qb=%MBF}@ zb77zoiS>e#m{$>~BIC~IZ)F>d7?+kPpnyDyqt+&OteWQMBDed{PC2hYO($duwq@ic zR)t-GMP0wwWa6t;*4QO`{-<5osZe@#F?SRsZ5bW7Y$;xv z3Z<2mgs2QSxrTyd+@uzpDu%Cb3^B+bk8>e=Vn9B3T)a##Z6D{14?Je z`s*>TU|RI~a4!6&=qa;SsB}t{;j4@WxCk~#a)t8)rkTROa1D8;;P5qt{N`)fkty*u zr8u-gGfz*K)tgLT4g%NV=K$}E5me%y5ZJw}YCh4`Hd1;vXP5dm3&e`CYU)agO^3_4 zGUnTWyjHtRV!;R^PFDgouc7a$^;Qz!!a4dfO3ZU-?@vor@B=`fbYfwMKz?L+-tx$V zx*u}|2IueIe>Khd$ln*2r`>=Yo)!2UNS=i?w>#dm5V)ZxNu_n1H=)c$06l)?O8tSZk0hk z7KNTvaJJKVZL5e`Rt>saclq`HpeC{KzsWcz9)*~aOP?>1>_>5A*{hwzuZgnDu41@|$SUNK|ku%oQeWsT=`q>8%yAWK` zM#>m-k|yeN7Y4B|IKv6l-Emq+4mRb@Z4_+;yrAgw?tpr;ieFYNoLQZ580ruBo>A z(2s%ff(G{HR2PT<1WKBYerH&Zvz=W$+#=_Lh$#s6*;r%>E|1iy#HQgN5P$$mI9`^_ zV~JVsbwQD&UeJoqILpUBU6)q6Fi@ZSe>bR$5I^1m$0W~Jb}pvezqSn9WUVn3`*5V zdk(ED?y2jpiY=@-&v{G`@G6JR&`-c9ZZDk#d+kBf-!cHYN2uz+jc+)vWPhma3Xd!r z?QKq;oDMriMFGfRokq*|J!5e|lRIg*FR&cRGa~Azd+q%Q2b5+Ca(Omai=S&VjZvpb zNTt#DHuF-(L${uleEglGoGxa%dqZ>g@xBymr>LRj=PKjfgW-lyK<+dJ@KXh9d@b_+ z?^Wi?g@tKfl|8Ph!#-NXkcmTaw!u&!bv!tGxOZ;63(6ePhXjY7NO)9aB7-1Q@RR6Q zy~u8LccmL-i5tx~b*7k!y3nl2C{SvZASREb1_VFs`i)2Wjs2WOb3(i(m~hgYt6)v! zfK*&8Z&`;%Y{3eFg1O~lM`F!AL-bd{&k8K!(m}$7A;hfbVN!d-54`n3g3P3=2 z>pr!@OGGX2E?|w$pIW4G?le5}%e8&dJ)awhg5`%eg*Npr%oz?PwErW0`734#)4SbI zWh>ufk2>v>+=Zt* z4Fp7Zqqbwp3- zi&DXzwc7^4xM4N14gN;=xaGzA18~=-Phc z>+35MxLQ2g$?NRQn&5FUJP-aF6v3|svLLP%%U+^*k#AugreI>bm4xHO+&cO+&-_22 zfFVzN4cS-|p|pBqgB*#i*O1yL#FO<_;~i$ds`Mdqf<2MJ6*e>MVi`L_ed_+3p@XCE zLx3tb`#8QRIi;@6XCgVSg&i9Ku{9OmrL9a;hn?nK9diECv-VfrRo{1I(o&=z`#l}} z9xRv&qmGO*N?4cY$oZsyspkIw&)2iu8VZ>E*|Hw1+<{zs6~}Z{#UG+>7<}3ayhx=M z>%gOIeGWt#pItEv&V!CkGTpWpCV#jA$X2I=TVnH|57@&vg#7YZZjOWXGsr1ipGvIj z6Y*|UjXKh=i}`xjEH5G%s~E)I+VfmIUnNeC14W$rdyTcw>jX8nU^P%>F7UM}2h*+r zR{R6wk&4*P7zqdDzFm&{anb4?H`~^Scs>Up%Skn6vLX0v6z8W!QIshueUL0Z4bIFkv7Hlmn0C(C{hzr;-=dh0U)Ny1j#B^s=kWOS$Gvezh z9TRQDa&>K!Nmdv}a5$;2WW}W(=8{^I*5Zl4{P*64VZ;qR+H=iSB-VDUsRAV1ZT+6` zMwW`cB10@-qvOd*rxvW^YIFRQpKAUF*)$#Pl0{zOG%>elA-lE>qWah6{l z4?m)*Q*JkAJ^5SDQpv;`+(XZt)pK|hHUf=K&!ADqJ;1m;`Eyi$8I+WScjXHIww|N| zS3*e;?U1)>)#`wb>EUm$T7w~_)@jFT?AVu&DMyyyu3u=$&m6$+IyX)T5pIa(VwHx2 zK@ii4>!iz>#K{~eXnWAia&{g9e4Sa145a!OEC?DQVv<9hH6yk-NQgd-3lo$S zBG)uIOa_u7F)kyM@eG9678)k&mGBWEUV#sV_A4R`_hR3_ENG+up6`AQ66$g6+HuE2^ z<7+X}sLL6+x88kvNa?kpG|Q2W$+*IjK)DXE8G%=lpurr+>F^hQ=q6eqRB4B=kdO1uw8sULa~az$XKI}iUMb-HniaN?_kBCXtGus=89zjDj(7>t z(ITMON=hH9!j-c-O<)gWD{>(Zgn)RFPN=2-^73nQIAvT&mL;kGY*KR&^@HY}j!@d; zjI-uxC9BSd2xig>aZ&bBDkL__Q?d6;cuYCCPTHaDbs7Q^kj)HbXu_lo=MZpQQyHRu zHy|9kMTg$RQv=LwuKf-!lWw5Pgsl4U`S9y8@G~hzd;v z;pqZ&mLjRuujcpxXbzxLWwandUobORlQWR!^HW7wS`;?wIKOPa*T;UO^BUS0S391G z8lF^}v!+X*wOOq>QD@A-PjakO7^daAGM3YAMm-aRlrII-%g7X-+tv0zEBeF>n z9>ffhRi6LR8Zj2XWf}SibMi|Jz+LtWl&u|ya8O;<~MyvmDW02S`)N)|$cQ2FI%pF~@PPPpc+0MYc4V_q_ z3$aZk0_$`{Mo&|`>^Wk63l`g1j!a0gzOqxZ>U-#hS4vx%?-+RfQ1L?946eHp7lGE_ z$Mv!8;i)@@9aV|@LvC110JQly?FbX1??eu~$^-gb6eI{iNq{XLx+Se(J4rMEl@a#8 z9!PP zNx0W{)ZMg)r7ELx3d63$JsLw;c3plB2SxAOrbyhijCEAn+J(g8s#A{SOloccXf4ql z=&GCreI_pZbG`KTs^e8U8Apb&Woz4obo>&9u1++Wd0GxZ_k@j$q7#Fvk3b1@mWKEN zjD+9}KCczUo`=#oh5B#!kH!0qzEjgi z)_3dGC{8tizEv~Zz1z##R|l2V{2}F}7sp|h;nnP8$(X}3$>HlsZ~0DsJY!tJPm>t`=2dzQ zzG9IOF?UFh{Aj+r(7G?kR8lfSReeTzO^i4E9#J0aQ=CG(hmhTM34Jbx$g|dxObuq7 zJ@Dl&ueq7;EN4WV^o~SgmSU6viJ4gL@ggTZ@r{o_MmtsZ;??lHpBBfmGL!vLkX2ez zv#?6Ft+7p=^WP+GN(2@y8I3rJW|vauon*=se!E#lge~N9@Ft*poiMl^wAlTMPVPTr-z3;}L_oKusdkZ7qnyWZySl4s8l?>j_Xy@gCNR zl!*!Lo+pXf=mOwfl+7>tw$-l47E3ek-~#C!{1EcqxbiZe@S`O z!>CR?ltD01gTHFY5u*pr%^2Iz&3nJtAK!(f!ZERfE8FLP=TSc6e6Img45wPaUxvrV z@a1q;1;1zgMn#_csPPu+c3-`GPr^=*NZVl&;^Y>Q$i%Qw%5dCCs)Ua9m-4ZY)4gZ) zM6EGP8IP)WtjIE7+C{I={=oBhI(kYGSF8$f$%3E8i{I_ZN8=I@zeu=>4z;9+b02>z zAo*h6_#p%73KC|;(MT$qfl(z)(hN)Pyz1EN$Rqv3KRui#b_`mjp&U|G`yODFz4ibS zqW*7v<0q>kCQ^ZBm$HZVH#;^&oPdyro!PV~moO z&sMjRL%XZ|oRJ6N;rs>OaBe?%oQdt{Zo5QF3BkgRXo-S7f?6A{gh*Nv#^-C4YL@S}LVWws1d~AJxT!2s};s51m zt4o1q+&f?!cU_pw)Hy#Y$7)<=-$=BB^9Us71cZ7gbJ8e*vUzi43CVs@Q2W!A|z-u1SUu74)ZXW_59azj?{7Nd?Of6~pBGxAWlv_awCfniil zDmD#?J?IG28wiT_uTn;&N<00bO}zZxqy||)Vo43#**jRWn96a04D2D4Ql2q3pU@wUq^Jm1L#4y(Xt9Ap` z<`Z%1-0R+d>5+X+)5kpa4-ZzwJA+3j+m`En8U|zd;%37j4@O2DlWgsN+q>zNVY81e zj+nutd3NT}X{HHphRK&6dR~CmQ$(6E|qP`YJtm9XD5bw95Nuztq`x^?} zy6el=^q;86B@!RNNs3oR5<*~WhZ@deEi}Ks_i2m8iI@g}I;>y=I2OX1A4&F0Rt05# zG?cGqwD&H{+IAKj>LwkY5`tS(Bi$%f%x@NwgZacWoL6j)X+iuyxZ0)eq@<&lratHl z8N=;7k8Mfc-T@Fm<{T0^MnN&u(W5?&vkyyZFpaUIH^|S2-oJH-kZiQMvM=vD{*iaGON&KVWX_!^p3WI)lzbs*8Ozl#6H_R(Qa#{+JX49J(?IxOHPjhHl zX>py4H`7?8Q%pLC@)LHJa#?1%N7jTdahI0V&4Cu1JOcB7MY~AzIsg z-&92^C8cJ>j5V=T0qg4~NRE=QRq5wekY)6VeTWbloamW%}nwDVy!^cFmCZt5zJm++ySs(}Wx9)kF-{9q}V}yyq)=_9ASEEms;r2uG z-q~WmOXpgAE~yHR1$hGK8F$|<0PrSDHAN+&h$b`oNuS!t-?xNx0#ZK^zg*)cV<-|# z(fPA`3+`fXhQ4<&sY{`Y2+9Izg6~<@^yZ(@@^1!vWHEV3vdg+j`1+0pM{7gWMjF@l z=i^+F6F(p98^kS@iwT`uRgl)e1Y29-JW2TG6XR*fG!QOd4D|b{9S-W33s=-jnqro_ zYzr%^|C4k3IvVDLKL=yUbyRGSHBqN~wZK7|_et|`>1T5Gzj9)j2|)$C>|;iht~K=z zNC^L!^t;Qs_p0e@8=j1qhMt-$X3rkRHe<1aZ|M!sQ>M^G(!yAk^=OWf;7~8E9-Cpm zs+~y_5c*jx=u3UTS`42zl;f;_Lfjq9T+E5IlBkTIEYY)1)=9xi@u;4^P4QAoX*S6> z_~y==-^|M_EgqqNg(khFqctR3jX^NjQ;2i%kCNl*6HPb7RpZ+}h29Thyotjt6U(u| z0)Ukie6w2+)U1kJ1GtCaU?01zk$BjyRaO@)X@`pi6;wnsUbvVT#PwPm_fq{szJU$6 z-1NT9!s)3o)Uj?oi$r=#`7N+#V(g8j-rl~$F1o-`W9G~Z8}H+$b7`w5J0V61joh+( zJ#6PQCv{_8xN5|u>y9|ntv)7FT5t~=4+HfOHQXIy4ENl7B!$5DCRkU9}2xlHg1@Pi$Q4~a1OhLd}lrlDVsZ{an|4~ zHy{88Gn@5;D;UE0%eSmsb)D%=`oaJcDZ8}Lu3b`DA^01~T=2{{m~(`}Cfzr34DI+!I_00Cfc?(PZRz>JF6^JVnEYD9Qk z&uYiOYb_<`AdoG!%`jL10ZwLCcOE>g*A_`-fKLj|bV6ndxOD_MgAf2E3Cx$uU8%zH zfM_gU00R2o3V$@Vk$@7Ir4j&8(yr;wAr8RSb=#nT3~oO$*Fg16(5<5Y00NWfV14hG zmU+}+m+>Kp01GeC`4Q24G4zjkclZ}Y^Z}=%lQRHnAFOXUC^(J9^oiTW&=7=ZCptNu zIhvAiUv;wljip+5DUEBf1ajL=LJ&vZ>{5Tq`t>;6d_Sb5MNFlzZWw3*y>b|9HXjB1 zxnNBlHODHe|IkAs3LL(kSHV}6kcz7=p_apOTvT)za~{Y-0DbXX9|>P2`5Cl)`m-+e zIbZhXuG(jgRa&ulimM z+~ru~07pXse@2DuN3unvtD)-qi>!aXh8TpZ7wd}f?^nqfn2-p^pE>jNl%~V3my4JM z=PDkHdr(45jqO5fHiA}l7M!oZ`D{sMEIQfFOjUMgTLf%uFP6KT-OVGI$I>My=zp_G zy?W`PYwF%7Y^;oHWj3K9mCx~o?)jYtPSD9(UI)AiYk%QIZm;iv_PPMp7hL&U=47x^ zkxd8Xxl1wQvC__0Hf#S-GQ?fQc)BQlXWOlN${GAo#NTZ%;B62?$PYuHd}SUH3-H*8 zwDK6Ud9+su+4>_A53rrJq;~sZD8&gZS!&Ao;P(shC<9rDrAm$jl!7Mi;7HJY!?NW_ zgWniC;#Z)q$SA&8FMXX4bcvP0S#9zMecVfDW@I)f>p%LjlXI-D>G}aX^EZ#LIO8?N zmCzp_3`n#k;p(3|)(__`LS#t3mE~9o*vLy6J;q`Y(@gaGMO0N2;K`R%EMkL5A{)4Y z-|ZsC6j5M=7aa~wA9S2epnXoX$)BG={@kpZzG!@JmDtj6lJ6Ak@_y&PLBbB6v)I1#$eDL4`C{jlD}O4FfHV zwuJZ)jbGQ6nt@(a+}wn=-<{_&WSCJnp_%RvQPg?jt#EDu4&hz`8Z*2G>y3wkB;2R3 zJKgy6@@OXdO$MjcRdG?jjh;~J1;*-A=R^SS^LwA-mxQ#_N9tNxXZ!?-z?V5-?!6@c z=iT1H=f0UhRr@bOPJpAECZldb9Dzqs-r5wZWCHg9>4GSRNGm-t#3?bNKFMwrHd;un zPhlO$|I-OYu`ZP}ctx3UCxrUNg7JcXc!A?##h{`C$UHt-6^M88;^jN(GF$Wf8c~07 z`lMtlx`388*tJ0!H;214YyH0|uZsIM8S{wN^R=A{HkTt>76BGze8BSohm%s3GyF?_ zpYvzolH1P!TmxE%5i5oUFJKUF-jq_LKf%QKj8N`f3;S9rcvOM#^_lRD-DI*K48aRH z*9vutKC51U+6tC?m}!=-dpE3J6puHi=td9*6L(@1Nfte4LYbT+ReJ(aX9g4B^yvAR zGam-aY41ZcuSuT4#dmDXnT^BP*c@7M#v_+k91A*#C&eoj;e*zdR?1AipQfq0MS-8yjDD;Fb=m3Ce*Fp4{M{8o+b*=KfOEHrM#1h3|#W2^N z7yv+M0L1(KfDjJnragybk_S5A#Vxy0D1$5o>5swZ`RM~#J@F`&^*sU@-p1$B7FiRC znvQBADD-C+lpmM>r+f1iJr|b@ zK#vkO%3dR`c}Rpc3Bl_O6YLCU)^rq!0q;z^t&$^Bed{vtg!zA6)Nadc-lV!I=^0Mh zu5X5B_&(o~Qe~Sz=`o-WjC|@S-uS%-AW|-WDBbX|b}IClbm3n_2w*Pi`(H)y6j|)W z>Ax3&E$_PsaE4A>^#+_{7V}mHJmM3sqwrkkJrDOSE3OvPiY7R=X1%+fD}$n@(5D?z zF#w%4gqPhVy;%KLVoT=!*6&Hc-uJOg#Mw6lC-0&&cE8*-+cCmE1uZt>U!_0^s=OT5 zSC%LsP^KG)kIqp2=K!G6V0A0e&wjC@^?ED)aC``LL@5Pi%PVWw@dsvA=}Sms5}mj< zWrFHPT-nWU9&LiEDy%s)^r@P}Z&ZQnRYu(&TzhWh6SXEO53pkyHX*pGqev7BuW8Gd z>xb39zY()13E^1&YKvjq*IJCtyG|#DEhQ5ELH765)dCreI8p1O&g+EFr$^G3ovIab z8tJy&@qc7G9(=1OWUL>=F5yXzMYb7*I=t!hF2Uat}N`Kof6Evxi68;#=0-IL% z$o#6)7)!H6l>}wt>jAAfk7+64j~68&hm>7(`_Ew3lu-6&q(QK{>n>cf=J7@Lw}g5t zKeiUhvP9Jxl+-Mn27_u#RIcm-|AXxC(CTBe-#KsSk)?ek0zQc8tgX?mo&!y`Mtw)sR(euKO$Wk zd4GNv2CCPj?#$}_*%-hj`24xyJ%7CoT9Q;49bRf_LQq1smCaA&uR0)|0=M*I?cjxW zJ*iN8dla4Q!PiKfiBL9VgL_mFIf*7n^;%ITvhbDt6FALD|+rqJmY(TE50MwORN zqw%3>Q}S;k1`$8l>mx2J08^R`p&J(z@=$EuVEF#~pAZ@L3`EL6X97a$0GwFHlFt6E zxfOX!Ew1J>uGFDD#h-9Vs>TxPOVF;QOs69#)m2#=>B_C=n{PQH600bY2$_dn2NH1+ zmZiYMaZ-785^(aM;n}0r_s+W$@u~u42#RwrO=!1lMTjd`5q7E{h*1-LxvL)gXgLu= z1b20i?*0@I%Zgs{b=4Cyp3c4S!(3u!Bo4UVm3!(oa=9co|I(JBJCrwFiNjm?BxL_b zqG|V_nr60mdkD7K($VryaJiji>g-(7#W!|&HF=nayyWIoUqpqdIvk&+)U9VybmK`o zvH!n+Ef9B3+HB}jim(~|=#cIV&AnWY<`PhoPeL!$*VSWr@8*Xxe((egg4*1%-ordI z3JVd5hS_`02CPUTyQ|lh8s1*&xh&K$GP29ay+PyhJki$7^-Pu%D`pT*9U-!XK9YiX zhv0E#$s2;zKJ^0G$>$!^3r`>b$;smA`wXHPz3S!vFw>`S!P+vIxVa+!1M@|S(fnda zl8JIG(?$Fq*kX-E2w2f=A%U~lL0-qzNrvo&e4DmX_5%F+>I3z`=5%`4v849sybWpL z(J4+WQbG2TH7bsK;#IPw0FW#9mgts9qFKEVbY> z^fH!nB{gh*(|E^yv*+ifvK8c}X?u;#th4mZeCm*_I@8{mUB>FEKc%zyJUM0000000000 z00000D?}m|`SnfqS%=RgAu8#q;5x*5lC)_rbBgd?Fx`xRu%Z|M0W(J$RCFRY_<18y zRKBo2iAY=k00000000V1*swB7af+*>=z(3}52$Y1&~wy1Wbq%qysS|B;kIy(?^cGTsu(jmz0o9^_TyMY+5x@~onR zu0CQ8%u{Rx>sEO`ZLGo~)uuF1_|y~D36#n+^e1cC4FKW?Dv? zbYI_mlpJG}$79!(P6;x`GoB~oGtXoAvFc$lb7PSp9q70o>R4oJ`Dh5RcrH+g?w@RUUKVTk!of8ijlg2TQ#t7&v@QuKpq~o%N zvqULwU7uO(>A1*j#xyQWkh^S%4OPF+&GYo;=qXGBTfQtqa(n!w;BAm!_uVkMyfTU_ zT3NpV$b=p)X~Hb0E|zRI76Wem0GtnFEK%y1o~n7Iw0xUOx|(NLyL;N?{dxkGke*29K@cS%y`kQt zs2|%iZr_F0Kb;HC-HV(O;!FB~KlHNqFo2;I0}MJSREYE<$G4#u9SppHPw7+f1~u#~ zKii-O#`P`|T#YlZ5g_wHob#Sq%@k^M)-Kf~pQXddo8z{4$s^XgXM&MYS(-b< zw~CcSyPj+!B zSIIgBJ3<$Pzq6riXu@e-e61HMdXGz^Cnc-@CW^J~pheKk#1&aBuU~9QLFL}0ChEDS z)ocv7Ou(NZHBF(duY`NA(t~b<@cK2A3=*@t@F?5qT>F2rM`QapicZ9w6^iM^Af7`|JhyFWbBVF}DJ_978%Q?#S9+p?S zctnc>r2PSFd7j%xvdIjjq&>04HRo_XJuMMA{0PmvakZYdifJbQyed!8|1GYTT*M7p z<^5+CstINeX{!*X(E#NaEwH=Gyl{5p=cu_vdDREST;E`LO*%$>rUd{W%7(J*z zSPw!pMgbxH5!Q0xqXe&Ye4khIB9OYzL3g>nfTlICwp?OGs!2%iaYQ3&Zn}H1h*VWyMoYK{~V*IY*kHBVcCH zElhkKF&j*u?TQg)F!^AVezA=}fWc`5+mz}2Z#0t|Ml&CkPYXbF!iz@{_CP1XK+o7? zE*ul~t+bY}!8rL?`vvLFD;^e5V=<}V;YbPkVY+20;8>u$FC~?bQGrrntUx*lSU6*2dE)DzjljTXa7FQyW^Bf5A-TM!NY% z8fp`g41uz_w|0KCe2B#j|9mX8%PGm}&3!cL_y7Zgi5pL=I6ZN>8axj&vrDDU1G67j z#4%Hp>UMZg-8~j8&Z228mr<0@1d5^6SZP{%Q?`Ws9j_{OgTE@}W{q2!MsT0=`2J?= zb;Y76$ncmj@FBzf;3XI0l~5I>r}jXqc+QDQm++t#--svhIWZ~w1brJg)ki0k4*hT2 z(pWk(=zD_SmiK1F$x4o*vULtBwm=Y@7$)rWii)r1Yd0b3V?KCb?qC zzk@v5$Sn%y_pveU5(2D8rShPZPG3VM&iM6S1?bw(_WLK>`UWe`Hd-hzH7# z0q|y_rJUh%Ad^VFfAl#3nHQeJ&z3DTy3<7ztd$-pJZAzq2Qw>$zKp%7?IfRNC^Ogd zMud*BL&-G#QHM|!fb$U+7*?eh@W!cs8;+k=j|DQm1Lpog?tWqr@T_IBgvFofEqyn; z%=qp_D<;0AQ+1j&u!=e{Rz*dnY^0_e_CDTA87lSa-anEMQA=0RkWQ{~^QS(?>%mNX zfo;6A@g_*JAI(@*BkeLFbY2iRA~*IA;~(-ZAiuw0i`qKqGXOe!Y)?dhv| zr@}=JW)38}y)5VectD50oU0dNXa0C;0C*kDQ5KB3pyRcjy_g$ z*ElHnfl_~CMWfN6>w!9@vL%hQJSmFvF~UB@&hv0K@5GK$ww2DnrA8sN3Oys3y)KJp zq_dShdrWsr#;!d-HHB^y{zW=am}f4>frErq z@$%-@Xy!*^Gsw&R!2qVpHsL=5Veua80e^b4kCuZ6?r=!fcwFy8=-uK>f%2(mekvGZ zWakDgCl_exBJ0;W4xKjy0euh-`S9_rZJHATAm6{+O z!Fgoo6pRiSW9i8yd=o$&ZVw97D!U|~yr-Vm9Cj&y6QLSKR;1#K37rDbqpyaFy}hxV zytxyvt<*0?#?Fe4i{6R5M#|Nk+#eS)rP*aSa$@w&Hs}spBzAxZxRjA3i=lg0ncCo- z(aV5C9+Qw^DXJwsRu3}gE>yo#lmQg^&*Mo;QvQlLc*+Q&GIDq{jtZ15S|SVcpZIes zm@5Zb_&@SFtU1+ZGg$wtUd-18SDn3QysbNwoGtJ-zKvSufExc3oOo{y^Q_eubI)lGxE0^%2MoYZF8*+yTM%+5SI3Z8n5| z6X5%D9Qc~C4*1G7NPymQ&k#crng7uMKNN9l$Y-5vW&Hd~bUL*mxB5j?31Jv9ar%TU z9)`W3JTF839(#}}RmyPh&)3Rw$!Io$sBxq44yvyIeN9K`il;F%j+BdaAcDRu@-lme zTF2RXy~C1)4wzyZDMKrrdDsBA0l#^C6~b~XVN{qZQoXXfEdX?>MG`xtX)RN4@pzMP z9dXd}4cmQ8p>(i3pz5J!Or(%d6B?TP4-?mLOB?w)?Hi83%r0SUwT^(KcHe#bd;2?y zwjw(uV!ybrzq=Yv(N3G{qY`jmHgrQ-ZKSo=Ma8gI^LV8o%A6;7M|c^Nimr3jfJGq# zz;1%g`H_?^Rc+x&F6M|+Wvzws|Udelz)eg=_Q`KcO&@1 z-`>b_Xz*+9{2s$`AY)gjT(?kPFU`BkN{w;Vh>b-lBF|0}Iq0EBj)i9(oNi!bz3|W8 z8Z(%r-+v^~HSj6J*<(aOoG|AXh!>k&5@PxoX>hN}DP7Fy;ZI%41|CaBOD= zBGTWRzzjg!Coyh*uTm7GrHcn;M?|$Yd9u1%Btx#0Xur;57G%|SU4x%lSM|8N3?2RH zg*IWSW6ad`XjA`l$V+$Bi(+wAZVNnmqs?5^B!R(kChHpFE46H~kd2x9YkB4l(JQrz z>c%HAKbYAo6(QT>PjRe@w{q-8gdTwn&GsWgD4Y1M-jMgr)@R~IxMv;fV!us8RU8*f zvPXo{`+R%Stn4TaKs?n#JKJ5bHMQ*FD!MYfRgAS{~a5Ri64j#5rRpbu9^uE{>wjQ-LI7;IO9uNXmF6 z=scnIbF_oAn)dhLJeFZ3esbM8>8KLY#wxc_q0x&&#*}(M8fs>?fc>|)D}N;FzZlR< z;9{8N(Zy!N-o}lwW;aItO`YO(d`UsGLY6##K)haii?aLQBuew`K&U%mw!GFwA=StO zseFk&D!A1kFK+7+yAA#RQzt>SvPtG+rdU0JL23H4fmT$%&1Ladh?j z)x}F2>jL+oFgtEex_A8VMv^hyebakWLZqnh@!wOG`*@~=f5;V()6G6ijWArXPOMYd ze0nSJ*S?5J>Ljv+EVz&-3iIFuy;APYM?JAcJ&@H#uxBz0r_Aucd;GyEPl{T-BrWi^ zJ;}MY?uFrvg8IXo)s9YdJ*;Sd^j(}>6~w$HB5~ani^33{GffAtAtF1E!~Qa(ymZe0 zVsOpDPch`2GNUE^a{!^kXtap_h?~aPC3;(7Xm)YnN$!Srf{-_p+!YVXFHbubqO(jp zDKGMWXM3rH`B-1X?wqo3Y~)Jyiayk;8DZ;CKy|KhzG}2qpXe0Csw3iPn{4+hTAFw8 zMfbvs6ZZ39ysOQ(*nLh~z6ZmDO~6j9&;EysbF2gjd(SfkF24#`lTZ2=*{R*hj$44j zju=SsHwdtRiml+grgFW(soiVl8?;%lTRM;Cb%?=KY-2ucFD+2hIoPdsjnjfxJ2I3R zFgk(E2l=b|pJ`3t$7$VvdQ~Csem*Ozyt8*Q3mo4o5hh(l6YOIN`_OA22|RJ8TQ>-u&&c9 zfxxN{QG3k4CDz0!(U?qCrSbHdNb&zWEKx*h0r5hV5eD)?EI$W-4ToRAjNk#{Pb8Sb zKjbV;6Ay5JSh|tQt61CS18=>i;b`*c8#o7p>&40}h&`2ky4+fvl6-l9-U0fhWjsVT zg})oRd+&5O+!eHDs}5yXGDj>9CL7IZ0mO}x5`e{U!}4537+rb8c^_c&vt9nqO#W}S zV#+Pw8!w+k7_Y90ykmYrc1814E$>3Ki~7|GRXFKnrj z`nlK-kv&@EN~UWf?pIuv={ACWprMeXvaS$d^AXYzX66CL^jb|Ukdkcx@g`OJh#T{0JmSLXaU3nLkCODBGTT)pNfCfVn!-$#PBz1AkNAroV(vJ<2VIOn#7+j;C zbRUlIA3R4FNabO1nCq$?dG@Dn-7X4|s(u*lpV$Z2O1%Y!3sb8do5>`4 z182AA@^^TUim`_O7;jE!*JGZ6FpD`Z(k!AO|)>-lqN)n!c4O64Hv5tAI zNFGNBsz?7tQ8?rcRO`I}W~rQf9qR=neAjVF= z0{LKjcEXcabI&E{XcbEY*XHi+e!{Hjq8I>CF1u;lDiIbZe#Kos8^xZ#Nfdc0yA1CR z+zxg!=AwZ*KQi*mE}LKBR}#ImAtVt;buWU}``p%nXu4apf!v5K2c(}?x4VQkell=! z&pZ1)&M#QJgEw5b&6P{#S79edzhC_s8DgWhUlCfC6&4S4_}`m`TMf1IzO3#^ zB(XRro>qT|!STr>4bVfnm+F@oQLYikcubm)G_9NOQ$9`H#yYayglWMN521y0lIgE( z2`AN*wR5sr%W5M3l00g=cj>2h{lKCRL)?DfrTtG#+rsAOnJYoKQB0}8sauDuGT zm+QdqrixE@htARphCIwaMoRnw+5jCbLP|Tmw5MTc^PnvTobNwQbc~V9d(8&+zihm8 z(`#ukDZURSM(-j&ul9OsIFWCGH#A1dzJt&qL%pmj8N!c*C=~kMCnbz z#BG>mkkdrh}$eUtNU`KtF_$AOUz8dLqS2(ag* zVQQlYq6vb5nnzOB=KP9Pbq-J!>5RFTj{&+x?hHBEH!E@tQ?--5ffv;jf~4239VA5+rx&;N)<`?FArkc3I5nOWQbqr&5Bm*&|`hbRLqHE@>joMN{- z{5D`mJ#Na64-Nu0S`9q{F-G7Qn?|*iZZUC|A6<1>yei%ovk3R!&|YS&n>uZcoUAVdeX%P_E3pCT64SYF}XVYVPOF(r?KoG(l46 z30G_Ya{ykUTIe?rKTsq`iXM!kNp{1kv}L*|%c39w23&(3KT8+sDbkgs81+&SjQCR* zZ`}jYAAnjo*JLo3YyMlSq~h_vcJ-1+Lvb@7ODIaNj^YSYASU9c{=zgbzhY<0KXG_X-SzC{d~aEfQYx89_H z%+T+>1<5Ft8-f)`@04T`C$}BvU`|*qL+o-`-+Grxd~i#FN`}-6AHX?jM9eR{SS@Y0 zud3I#ya&xu+4D?Bx(4?_rCN8B@zt1hh*v9{Q8>z9cqQoC)n~S?D>z!#w&x1)dYm~U=lvgcM5z=exVL8qr>g~v;f3@PCYO;-hj-OSz&C73IKzAb~y{GhA)KRfclvaxg~R}PdKsI6Zo zwNzmw3zp$nWeN)uHuQiqfDf!cXvDTzp{%5RUdeD6;30$KMCt-0*LYlK^55g_Q<(uO zaa|Zwpa2BG_aeUr`Hu=s9s8b}v}0G2!|qB!kh$Gmw>ojpsX>Kwb*M?#+$F2^f8Qxm z%s=3AeOZoVuq+DBjZiro19H6|Sc^FN9+@9o6|z~`icMd}NAc{Wr-`AAQ=Vh=Un@7FMSsX=(V(h<~A)8gA>UwZ@qDqseYJSTh)FpC|PKd z04AOg44wpohUo48q#9rdQgFtO=V3F#qpYe#Z@B|j3PXh0ID`U9JyStdbwiM+p)j1E zLJZP!0@e|mGdn5SBOM#lf!BbjqGmOY5=2{S`34171HOlz{slDu+lOP!YKEW=A#FV( zg?-zf{)v3${;GD+2b&gPe1ha_LDy=7)sf(5-9N9T4bkcJo9PW;Jfy^EA4rKgSkTx7 zwENn`e^HW(!3WC*hIc2NF5KcNHZT07B4OI2!qPERY%SZle^6Ms9Of4{mnr;DoS$7DV+vmI%* zeoV5X9zxQ$XoaQuJDE{Vnf zrTBT0pYd}ni4I58)%Qd_bpYl)-afhvGm;-e>9F04SX^f=|K<*rLRVKx;Xr933q>vn zq$n`DAtvlNj;(rwkPv9GM+HDRs6@*g!f8mU1J17M%6LC_Er=C&>+<(FSs}VJCjC8C ziE=kj%NUf&%-Op|8O$UD_DJo2bOa`6@pYI_4N=hXZC}ec@mhJpi+f2$^6|xtKmiTy zmCcRA$6KTY?TA{@xB=4;z=nf-H4hi00nxwnu{i*SngO@!)JYZdoHWd=Bt?HE$Upal>~?8uY}2E>z^GE@&=-V-w! zu0a|1u(=*t4IXNnCPuWn;kn=Kz4{ECNpx-`@jv|HqX-Tgu;un;-78xL7nn^0D1(56 z9K!_OZI>HW!E(_+^77vxHN3f6P`(8QGp9(B@;&?ts&`c^L_CPr*FqD22c8O|EEXk0f(d4tRk@t@c3#*t-M_Gm z^u+fSa2wMrHt{x9vWP9n-HTQA64k_^aZ?Yf6%0t1TvpmPKHFJH4*t7emlzaTX@~HP z%blSVa9v1o^o~%Q&ZSdz8khZy$|3+~Z>`u)am&`M^}rYhy6mhDVCiZfR@(T&xy4qC z-Q1g5D%td{2GiLt@;TlP19i;EFPSsY6QzbafR~j_rTVj`d|$BAzK!hf93k&W(alt5 za!t^OWLeKZ1jHwZ6bdW9d7xc4MQ(T|R)qdGJ%p1fNlL^C6=ZoXHt%re)=Y_8SR>gE zev5)(K;u@^jX`eE4o@OzCTcECEE~=g3l_(gY)9O2@i?W4^e}cx{6vT(cTc9kvaYCB zDv;PWz7J$g4u_w%>nzD!erKMK-4oHbgQyleX4`Rc8NU7Bs4eNU$zKDMm*=?BQ`B&10|ls^9`SO z-C(^{1oR=}|H+DY)SF;k^y$Ei;_R*0Gqj*z-FqUTTe4hX6A(H4D)n?+{RY0Mp{|oh z_Fo<8jWkk{-S9(J?BV&MPmd0}PDdp*BQsrn(<&v)WhpH^yZ65xNO9NJtxHTy!`mIm zp@zNmq2a~`gr>!y(;SS^AvG>s?_emYMxtc$?kFHqV(riVJ=1KI`M!ZyziY9&Uq6o? zc&?mJd}cu*D`WM-wO?YSSTMTp3C8S6}G~xGsujOo9MNz zGnn||6ayaZ#7i^{+6&iljtE{xu|9(vr6|fK)JvW-4l^-#&TQHQAJMAq&SO^(+IuQ! z00guPL^DVjKiDe9}BD`#12fBkt#3|Y0{Xz3C>6gJf9@O63 z_2OZlIxsx9VHy|j19uyGY;Igj4Hdz?38j~h&rQw2hcP5ypqD`CGu1&3RP&mGcxfRe ztxzP0!$zn|4{8+!EX4=oUD^iR*N}k-X?h+jo0xD(ju8L#Xic9n=S(e3%*UUE{+~ch>$^|fC^*u+S zOJoDk;z#ddxGk&S;%oi)qEU<-R`bbqAkkC@YF0HUAA9kl+fWE$26Zb)vQLZ>2H=OZ zLDVL)AIBJ0!lV63j;@GAET&QGVosdGgv`kF!=tqJJRCw|d9^U#L45`=&=Xo;G&Qrv z^lwKZl;53sy3D^R%UUtJ12}e34Gr}X2ldYTMVX7WpxxG?{y6h$qRP3Mu4f>XNPJhz zb*4nrZMntba4uIPJjl#j(n_-m^{>a6Y5|~dFA{($L(>Solpvbb~BimMO)XW&C*OM1d)_z7nX3$!)Y z%eM({)aC-4tHmx@srCykpM;P(#`y~zm3p|NC2pmrw+gYU?B#+7o9^d=P0 z$fIr-)n|$*QIN4SRHv`@O-k_(Ag`=UPkrqu$9GSySI4PdP*Oy#T-g=?9@$Y)MeOo* z&6(C3ZAyrfkXC^PEI4>PsHMTwo13QV4A6sL$;PLrFBneQnBwg6)zH+ln`7FK#czj) zY6E1x?S?ZQ8V4j6C7jrhnoqIZ2551>YmuW$VV*68fm>bk`Qt={#!&T#R{+iKTI02} z?j*=WUg?$r{6w^Z9)Q3xH+xrN+5P;fA%%^RkLywy8A(TX)I8U&%(>-j-p6kNB8- zZ%;-1C&DP?~WX6MIncsoKcNi9c74VaqbHV5Lb%gI7k ziOCV+RoIy6hrv1NNLmF`9vyxN)rSn(nVt#<4=Bm*n{DC@A&;>%Q#QGsU~;7+A92K{ zbAoIY&F@@@+Z-_$!E_CuS9qd-wMwhojbB5D-J(iOtd&Su+$Jge488Epn+*sSdshwt z05<8|XVMFjpR>?MgP08YD5@k}@udGIFxOb;dY7aUGzB&DS}Hb*?!lFH1TAWtR=2Pz za;fS&no*7ChjS$*3>Aa(cZNjt3NE>64Q(!b{iycT#FQ&v>&f@yC`d~^>0U3YfZL{> zgJ^7vIL)$MFTFd4n^US4iljCI>m8kkYXTtmrKB}3V?5M6SUKB~cUcU7RE`5!(~??B z1}asY#Lbi7`LPtU4ds{+0Gv)`qDX!BlME09oF<>X#Z*~g*%cQ+4Mq2Yz@+z_i+%9T zn+*$ovKN{(@0m8bq9UV24-k`w64TR&C8^JmkJoAmRz4_LqqmY4lCLX%O@DQ5cyenfvl85S-&h!zFr8stsU(bIp0<9CY`m(Xo6g zXfoIZLd>Mc_uN{s?7x?M;l{_hz}-Ok3&1A_Er~6tu+W2>j}oypY59cQw6yV#Bkv_o z+t7#Zd_^iY%=u-kZSCxWOlY^*GiAN4)_eh$Bc3K(NP~241Fs)@8sV{B0}p-mva%+7 z)AA&#V~7#`t)47Y?i<&!H^#Cx5_!5{EXY)tXAIP~s&*5Jf;#t7Ar(Aj2oZS?aV<~J zIbe7S#Aq~iV{?cI9wQ%e9i&);&is@iAA1?JymfPP%_c_zQC5x?b&5?2?C?L~NRL$T z9(&s+?Cq{#h|E6DpC!~GI`(?hqX27)iSIMb1ZzW-%bV7|%GT5^A8nPSBnF@3btH$v z0cOXkqpS&^U!(AmVVPJrpz_Cr$1w7K3^2XD8l)aBR>WC#6Wb2t+<*cM$ExyQ-DI0l z7-G=2=xuQWOI-&W6;r&RvR`%z&EFFlWGCYpQT}ObYW(Ir+RVo(limq#CdTYqhHd~N zMwu(exC_qhi#xLS!hlMDlT4-l$pHjbM^5TEnc>mRAGzV&3?79!_p#lNUw8Xhie2{p ze&rn64zs3eJg7ehOcrzw4Jc#~%)g2C86JcO%HMz$d zg116^x+&^No3%d3IY-?m$S(ehE9FJ8tCT>4Bu1^YnXV`dLentU_%}5<t3Z zX9+V^xg=x)X73{k%3M3cwy{Nv6Rj{E!=ps;E2;r{Yaqum|CHWCU}qL90y(%#VAmWG z=?vY78A=f&xQswrvUzgpj2b5JW9Ni0zb~3JKP} z3*^&4S-Jbo%;W2ZHLqb2FGKTS&w`F3y{7jSV4CpSA$@1>qfs6OU;|;V~R8dh|M`PSAKenVFgYob-0Yy&_G8}w85}(# z98naCjiC9t`~gqU%F9)eMDS)!sy-_pu1I7uTOz0S^_3(qn#_AOw5|LY0}tU9CQ6qc zV?Ny(2gD+&ITEX`Jy;>Vs>$y5LV66;i?1_zCLz2$Wg*~8wK&cSR}OB{nM6`50M>ly z1AFD8HZaBVp~A65fB-m6p(^I6K!*mr6NEWJs03dhkP^uU0GYuX=`~(2!z&@VSb$b37-%Wonm*P#tD<;L1E&YN|!%HV5wd$Qf17~?;B0-yF<@tGd z@cFILPp)a|Q&nBRQTe7<&tzBHsFT`NRTA#y+sXkhdx4=@UEAn|s!17v%Z(73`%8lP zA_simpai#JuDcMP23x&|5B@QBbILZhv(>1pj_axYL}Pd#f3vUBnXjmfqK_EPQ=)U} zslr);<_KD;RhrhgU8RTr9ICW6*Iu-2tEz8;@1VV0g+0|p)r}NPA+wSvFlY$?s2~*o zQb`iA7^=WmfA9e;%>hF$>r+N^|IO{ifn(p?ZLJrs`#@06&8;R`b_4(Nd z-8)`6K7ItY5sBQGPkP~mJ5BSCJ#)xtU4%0mge!G_-S6bAZnOG7g}dL%Q63W$-rlMx z-mu#M0000079bny(0OElMkoOg5N_#$vzmhC12Nlh>-9L3yuj|aS|ST${p;h9uc?z$ z!^c1xlq}dn#Uql-buJMv2(o0dr{=l>ULng7hOhXExH zN4`ENMCf%$#eWNa;qAtFF00e%Q*-M8D%2fvr>!JLl%exv-tsLWH zCq2;5{Wo?_JYGntH341wUh97W3qbQ2nTT|@iZXsg|7)$1)x~oEKgOYam}{f&K;*Hy zf@FDMiAYL{7}(Veg4CnA2&pxHNbk>!V!=^Yje|Jv;9B)=3c-lHP};=!1fI!b5iv=+ z?N%dTQKf>Q{j&(tEky`?t_t2vb1V9hSz1P}cvoE!M{^DdtKUdK_sLgvEkbK;$OAV1 zJKj#wTpzZk&87wd@}f$Po$;pyEdXs{j;D)S?J|(ZZp)GnY&bqtgrFwpOEFn>{O_NV z9}O<^*kCAx08<-+6dNm~ta0ab3^_FZ3cut&Eu&D55D`*1P|wq=BNf0JkKoBaiId83 z0F4edN|`JIv5yBcwxY)PK#%N^E^Y3!Q{>=h0R}F1wr=sSRXEpj#X8j*8M3YqugUoY zX=Oru?8<83N$sZ~CSq5N=~i292zaqCakACBXG4~4Mw7Kff4eDOr(Gh33{6{C74{%t z`$ZJ$!J9M-kVvvExVJTu*PquUM7Zk1-*>^UlO%|g$MM6U399(rtcBI{>IwzWQQS*JMl1&Ix?cm#tf(9&Ub#UpLC%AVWZN{c)-jNMp?X6Sja=~dx&?|e5 z`h74(+Ln!6&fBSAzVTz*1R*^AKe7ncTzb2e;z`iV_N< z;(nH_Cgj1%Lr+#{qPAFw05{8CxB?w+{|%3NJ?uh7YmRwTMRe$*^#y|dibwhm);`u< zhUkx&AXnf7807eb5Y#_t|HzFFDW;Nw#>I%7Y+#}#4BK}aBAu2d(FN+|4n8ezJ-!_T z1`YN~hB^F5PpC8yXgVh5)Ty#Z8@&yQaE~v4*0%{#?w3y@&x=7CJ8D(zBCnRuCg*!W zY1)Sk%9SLkdfZqu{|We>70iq@;_UqPZ-kQ%g2sroM(m9^G>ca306{8e*QYybfLuTV z;h+vz#iV-=NCZc6!aR?#HM$_p+u0v))y(&Iv`?BSKZBM6VcN&j@en(H7{;IICW z*EKLaJ+nq|m6Uo=VOFg*z^&mduqo+8`owX2i9F$lKsK^&#{_5EA~Y4Xm{CbAM~gvZ zA=Ma6Oxt;pSpQJ+&TI9A=KPYpMdUBd9xFneQ2acZkWFT=u}?UGMQi6C1FxAUsinD2 z=iIW6iX`56qfNXZ@LQ~^NGQmr`7+rHhMP9@b@fT|NOath4MK;F+a)Yf^DZH?Lb*w4 z$?IKZgjx8yEQ@u+bz%;9A$z}obor8rW$jjN7T`&pl)}6F2(DHT>DfcTionYS^>-W7 z!7fn3YOEqFCiX7Z6=9W0<4iAp6~)J)1Y6W5=b0^l!A4{fJrG$J39ZqcB{TpJ;vS1L z(|#f-6dHbUTM`9vtDlZkVq0wIokD@xW(;D*i;y_8>FXupSyxJk{IuosV~VrJD{+4y z>!c({IF+R0e!nHk9~kh>ChOol$BlGvO>w9O*!!+P`PX5?l!8suA}ORCjf(>=lA%61?ihwX z4$=>GSDAoN@|XtC5L)DU`W%qiiQ0WF-p2rbKpV3uN+coa4d%>D7lPC7^8f$<00Bdw z0ZZh!`l#-vWgWy)iqjwhA=@a7(y$SuD~6l0(m*dG9+v9)Qg;!nFq2Os35tHK$TNHT zM-p+UVAZ??5?#vfM$BZZf@$K{h@mdldt}1dfamqh$V0R@@ub^D|H2dySV_e;TVMr{ zEz_9r>4{wE)!+~-P1n+yjfY7%^)_}9fSo19Q25eRB#25uV1I1`TOz>+2Js*Y?SSJG zq9l*m#N5ZGvrhP%nqe>r6b)+}$*YnwrD6Ig0s+v7Alzn%%Fd_&02OOsj7-BCn^AbU z`9EEXlu-mHU_g?+d0TmL3$-B{ALvRfXIH9IWpQ3SoBDe8ZA5VnNqCeZ8Eg($B0unc zfT`D2Ry&&mHyXd(lQvmF zpKhN_^0ta@NgAjYboj|1By078SOBLo*oNsXEQ0xEOX11n2 zkFx>NW&Ls~Qs{KCFT3v)xc^{0jYfKXe&%j>!Mr3>MZ;ki@JgIHmqyyAc%)Dm4#_OK zfI(7#WESt$XAFsB2;aghF2jbBLxQIRq!R?Jb2Ld~ z!L*Uj#$eZZ7a6`+O{W-jNBdax`lW+vQgGq@N3aqWGC_te#VSE2(Opae!bI(hLyheV zuB5Cqbx^SjD?d^8f z;)xQ+KV_!X=z>Ua@o^+6ONc-@MpI3_I4zqLw#S@({o8@>35Z)H(5TFjl#<7o_tAMv z%&>_*0Z=H#WfRG)ZfCm)ko&7BXuJ}Jl+3Rjx|{bRXC`UN+jz>KWk{=X3b&p?&5kZg zN5w4gK8%IalcX|v8Gi1$qZw$f^6?JwR|zb{3_Rv+if42}o~Px0SwnmyhKzwBc~kh4 zrX><=39gYXHL<4y?w&}1!JPyN!e1mpor83Cig)4#%9H{kRR@m~IbW~y-jd=3F6~Bz z66uX^QXm5$*=nt~r)*WHMt}dA>^krdn|KGwQghS1+B43qA_f+Kb%2p2Fp^EAPfmx` zK1-bA@K3e9AaaNMHF~fT(X{c8_?~6kyw&-YbhFi zxj9uVvF?%5MtgU#iP9Z0Jia1wx`vl}G+lW!7o?=dvhB(^Z>T#vPW+vuCE?5aH4D*@ z)}{#7^mO6l0LuR>i)UM{<`OcQr|(yc^^WVz^Zx7E$TgIzjET6fV^izfI`LVOv}5N0 zUw+8B7BdAZKsSw@=$aCmGHfNU&# z`g}oiiq;&e+19NuI&j9ZBwo89QBsX~Hw8oF6d!GmLNvsh!bBcOjEUzH1`tmMTyhId zTIAxJvgTCMD~)IlIg*t$5|!8^%9S|;M=yQ9KK(n_R4#M+9Cr7|hC)%Vh5RATI%|~W zJ-8;*9^$SV(2-n_;a-b4F9YzN5}gS~RQZPQanY^7-74uysVNm0DVen_$1p=@f|tEQZj?{OM*Qk0;X5Pm`s8XAV-S46=w7_VG6=Hzm;~vl*QJCDBSW z)txq?TtNjs93P7>f6#fz?>$Yd-OIU?2mn?-6GCLdipx#G58s7%*#1&G5QzZ&(So4u zLWpNdc7ocDT?lKg;EXc7H4`HbNi@BKsPu4LZkHkF@lO7+T%#P)}? zmTz=vz<&;JnnSaWD#ntpPBP5P2fQFJH{m!$H$(>B70njn<^l3J1dn2jms?AtC_Y3_ z&lU@)3L}k2l48w5CBajIaO%XSc76od(c^_mD!Hy0yefOW1Oj3HFu!@LEuqSs@0ppz z2pRL1z3aI>-mJHr`7A3L&6{yTA@L%!WQ^1?kUVG<-SzrV2k7T=;QDUdu_g&gL0`@_ z1V~c3Um5*wj(5)772K5ChE?vv+`xYcZGL^djh=%E2%g8Rm5o3q2ow#aD>>&XFQ{Fa zmS6S6c)yhH*f?}fbgA05lKXLCNPu$JiUV$&2w2P zU6YvsxQ-p6HwV;EoGs_YI_<=)d;$7Ka^qMPTU|DX4bz&hKDx?p0Gd%gY<&)R5ud{M z4cZ`cM~@=MBdJvQj4p zE^dpbz2~!d?jgL>6(5|2?|lxR^HaM#1sxlEYkUpw)CICSBi@(^Xn%@D^-U{(`A4Kk z!Bxc;zzGwV{*=?azZfCoNM)s{t7(Z)x*MakQ=cJwPlUJbrlrA&6eOm2ii|I~`x;M= zl~sUe9(-Ag33Dl7BWTvyN1_^XKKBtv-hPzbp(zSk9#G$>mwC7Xx* zx9-}q1WrqkH%ENLl%TiW&FwVa1^B!WsKrRU3{aho38S04$JVvo(!0ANCWn8On_J*H z{3PY}xjrrb+r^X!J*8=RAQR&-wT&zx5KjLjJhJ%)nhN-INLc2l5C@;;_fA_|2lAzB z`uLJ(j8r{apW~BWUJ0CokfVjgIXaJ`dB%o|^6~ZQLL%6waA@VA4h0Cq+BPi5Y>R)h zkZy;IozHycSQMPY$;}g!tm5>Je4x^ydhN(!G0a6lEA%LcZew3!J0w`*%5={~Yb=)EI#FtR zGpVpeTd!e;tiHMU3R8?eBJ$8FMdDa5nv+XR5;S{V_$fsUT;lS2+)3-y_Fh%>ytL@h zOPsPzW>zc=kkb)Rpp6Sb)4nB|;X{^Ldcs@AiH)iYMwEl$Rosinw^q-j4`U#tP!}-b z9-Wv8+Apa4ixp9xJ);1m!PDG7WbV)`m;$c^;JNNTa|87i*(Cdq&BJCJpd?P!GJHl* zG__4*H&o#|o+vz|a0#TbwiQP!8IPtlab>obrZCxJ_iI<8%i;rMJy>#VARR8`=$0O2 zk@n^AynEeN1?j%wOSM^&Xg?BU90kBg#_4YJttfe$MfBC2IS{93OF7npZ5b0 z*VnEO;&@Lkd$3d}2*BOiTR zicviN-m@98zE?CnkFiIFTV!w;J2cP=Vaid3+HN`xY(q8qh*thT)~QpA>kl2$TtL{3tItZa58+kvKVXbX`5~J)6gI4d$4r z{Ny)#=yd;@o!Q_h=-b;{+?$f5*TTDBXRgsLfM@uIg`^K5XvD(b&~eOTG_wqGWxTC7 zxtsZ}GyluB2!YDs0PgSvld>cl(L54cw!A^w|E&x@vZ#!^K(T`_vPIk{9q5LJ-ms=5 zT#4WW*dGAm9e+G6dZUn$I3bZZ3+zq`Y1UT_s2TuwK_f!~*B5g~oRQM%2{}QJ(hC<;Ietc?_Ps& z2!$sP<=I0JRC(xWH#mATGU|Kp!`;FqB*v-%X|pgb6qfpr8uhtv0&Qp3_U=P_$jO;c z_KH)+f%-4@o_BIK!nifKgZ(j{Qh#4*l*M&s`1f*5-tZKyN z7y7$hK3@$q#jltFyF-74pec?9$Y%QRPYZ3bBH0E~A{a)U#L}h3gzE{44?Z$#7aP%_2M zy|l~XmZT#kXSdO?&i13=Z5%}W#iV+1L0Og6lQ(ojM6-}FXCf(Ul2a<1Lu>8Nl4$sg zD}r6=oQxo&PApwO2N64W{5KfulF1-)EJH%E{?MT_vkd(OOH-&#Qcq5)oQL^uQ_|0M zMhW+TI|E)RyTETAp>4OIjANYMpzQ@z7Pf#;1FM%3B$l#b{#Uv~v|@O6Dy)YuAo0** zTId2BqsB`-<#`d^l;-(fE$*54K`>H(Bx8A*3LPns_)+G`gRa)s_@e+Te+fBTmvZNA zZ$jnh@kWfk)zG6m2w=8iy7D2TRWTl$^wUG3oI7@gcPq*5I;?Mbi`n(g)nMNt148rs zSKF%YH{0z%rT6Yxc%v3p(Mp%9vf3`wX{ zc{YnC#sF4vl^0vx<&AB1k1~Y09y;A^YITcgF;NHkFI!+%9JUqW%z+LKr*rSRSLwp% zg59JoeyxG4W5OF2iZTbWf7ut8(~q?3&3Corb@)sg0?m`1a%j4XwE;ycA{ubVC`?pp zg$c&1T@}0S$v!Rs_&?*bnQ{_;#R}SDV->ZdJB+Q-KwwLHq<7f$<9jX_Pq0>B5M?DZH{|2q0YQQ&)$l)XccFiI4qS+;H4wr$(C zZQHhO{$<;?ZQE7-q7l&(F|(Le?lLzSH}m40&t{nhLET$zbtuHdp&w*{d8-s~dDOv~ z!-Ze}MkZ?e(Z^7&{3De_i=dNyx&>*C?8juY$%Jo%vuaobLIyXi0-q=nW?ZcAAsh&k z&9#CKnk}-x46;1!Ew^++?NkX*F}BjQeXFOhZQUC;S4FAoiA)d2*3jdI_R>GrJ_V!` z6YR&|7t7|3Ns`mkn=_#{5EqHGv{YvW-$eqNMCOXS87Q!^w9FKz=Fj59ziM%5`g3pd ze?g!zts6st*U~AeLb}5;~-n; zsNj1Osmr*}E(iGx7D|`rq^23L?iU-iikaVVU%i2Ey%!?25ydSv_3iw^qF5JLJVx`b zezMWOq(-WGx?%OZ>SQqn=T$>N=shwJpe|<=4ccE&yVyo=DaqKi1$pKs$S@Y4klNx1 z#s!KmYg$pYpp5ov^i z@%5T7BKBI0?&N$ghqVJC3Hk@%^3R}MZChD>EYeM#cCz_k&GAsr{fDNuwyLA~A_QaC z9ZKq!X5v88e*&RQ{V=Qgi_(msD;6mN9Ij@w^>2HkfSWhL0hm2`GWXSGc)f*r0H8)O zOsMAk^+21h$wsDAGqiTVEsUT&ust8wrYGqn!5Q&VU1NCj%IqFXkclG`{hBhNx;RAi zwHg@o!w=7!Z8?VoT;PVJKpHQ5zCY0X8`$))3fh2`k)Jw;6{?Y5F=-d05tf0FDm!Ziu15bzkJ)Yye?m$MD`XD@HX@oWF+^YWj!3n+L*ahbetj zc*Bp>N)8*BvJU1><_CbuI@8b_QBD!qPbeJTd*t@agMJl%N)sd5I-jH9R?DhBvk>V= zb;*$2M?Zl0vDIDB97WW1| zf(!V1^Kk)DxU<2~xU4N|MynNcyT7XapGVF~lv#xGR&8N~LtWwTPQCR8Ao&+MVq|UK z&ggsa?baWx8hC|w;n9A|EDcuQU*E6p+aGUC=r8e}ZT}+IJ~-l0kFL1joHe5HaUhhu zQPJ=nzTKe-Zs-jh$ER`f?{(xH6ze3EEv&@G3RN)^_)0uxp-Q9u;93TR79i*Eu=ZK% zWtQ!&F-S!HJ=yC16@589oS2_bB;P0qFmq2{C^7o2U=JVE&UiPVDaxj(MwiJmSuENx zM^=eC3*|VM0{lNiw3PdUpPw%pq~n>-0_^v&j60y~y$6tIKH}ix5HOtMxesi5%xZg+ z`ks?OIF5}r45XllmoZl?{^m9v^wll^PY~E z-O%R6hhgC4_#%dhCXRT&n++vQ%fP;lN={t@atAXF1L?%os@FrskKxEr{2Vl6(4I|# z5>jP5E>_LA%I*wqQ9OoP7~N`X0Oi)_G=S02N5ss$lQAD)+K} zIjl$Dj7j|brWOU!F9bt?O=3|tXX*c5zmLF@FmtZsSD(0x^spw{YET#*LTx-a*-Q1+XU{Of`!R>SqbKTg^(7hJFRqBWt6ih$rxO;ou2v z>YvVef+Ja8h_>!Ug(8ClZqJ0rb-_~BIfxfxK)QKLD{aIUh@SzT`c=hWN|4IcQaQ7s zDKon#lpyTygF>97txixTu^#z*&j`79yDnXb46?cZ=7_4h4}V=q9Qj^DBIYUM z=b?82L#-_4%2}vnfw(iEmyfsdh%fzAOeG3A(4xwd-$=G6W!1r=u~}x3R9c$z?J9Ku zT=tjNr+_L|-#aIlY_uG%=7g%^{qE1oZxgH5x975UEU<#+N@0u?SK|1R9+{3O{EVn> zNh)BK%yz6qR@=n)TN0vKc$?#xq$Q>#iOd?iw1iP7F$UH&iD6Jxo&2rFX8io;FYGNR+5c#{N zUq$E!GK9Z~C5FHQY7B%GDQy3}c6#|2Cq-#3Gk zL<`zjP7(oj<~Q4)0M;mJjI{KJbGMcAtc!m!0#Be)By)_4Y!gxWFP^e~>#0cPIUy4q0Q(@t0h9^B9P+ye_#TYQ*!BFBFc*41!E zR1XHM^M-OU>?KlzgfLBlMihQIPG>JrXlp94IcDg->A z6pzVGAXU6>_PU{l{;L|qgYkZ51`HF+iDice?t+$Cow!2<2_TRm!0U`OCbr{Sny(DU zR7GCLP32m|XGt^#c}ZLjtTLhwAHcc%=CSLUJNCEInFww5MOhPjfm6nd`Upb1C(}Co zjlBA_TD$d!DwIJXwjT;;ovb^Bme|KX8d@HKT15-p=>)pTgHICmi?t7M6%YjxoG>xA zg{r9DIwSti%a0!_(`8q|K8qqoeQ#_z3&PnQse#PWmj^|^YM8jcF!e^%by#%Z?QQY(J{^Sb#Jf@TBMj89F9d(JtTvBkPc z5c(tuZ_p4|39~T|I43Z?9hun`j7pKAoV8#Yp0X^1e>;i(2%#c$ zV1rf0t8?P+HS|9Al9tQS2b93Q(&v+1}}(+nF{Hwsc$Xe zw(jmoiE-B?4AEAV%NY{8pU7jQw&vdztly&>TS16NR#j))@;&Y)aF5u(@E^4{C58Ue z_~DFRndb>fWZiOhFDcPQ>|hmPDK&`vI6{V&;$e#9Qbz0y7c73MR3tX~m)i!7)V8Un z;+WD)cFJ7}o--I|3e3@!Qdb&$1Jc>v=jo=E9~-??yL!A|fox7;aTiMP<-o4CCf3A_z67-~?x=B~B6 z_31EB+buL+by@R=tYU?n+%D@<`g*JoeTku!5onOp`a?>T_2QcrBFONWm^muO5wA?? z3Rg8(V)H98cjb6_Wt(SNJxEo!nvWmFr&5m6mIwiS(sx(?3jak6?X$c9rOlUTW{NQ$ z^$@Tk{bz7tr}d9afB`A|IXe$3-6a7*`hyBFJ6y^**PJHD4GV6N8x?tFtH6@hJ}c*8 zJL7P|9TJz)4RS5G|oq3?8JRR@6g}s`KK>*`&eyvX3-TQN(dDTlWyn>(IjUtQKd}{$yFbOoH z8#H(?!$vFcog`cEp2!f?XGx)utK}sKA{?lxe?^n=zv_UdS<>9*t*&b<{?+04P$5Ei z`IJbACFDQ1+Q%f%aBUHWiOzNH0vi^b4dPm^oBAx5+s5nW z{<(O+XCPqM&?D*ORh2)41>b*!5bp1+Prs!17-`VNkdLl_#9eKjsEJgtZ%{WcV#V`gx=XDec0)D znuXBSSZ!n+Z?1)CI-D%zemuUq7^e+MSXJZMab4pI_qS6w3-Iun&E_G8>oSX|og+*W z-->d0Wz=W#V7am~$ga`AG81(!73xI@v!Q$0)eqzS3`#Hz|yh6jPkiDvL)WvgJW*o7z3wYsS#N5OeuDQGo zjMr&l@y)Ib#^66Tu<#aE^hh8-px?vl0}uP(pTtc6@Z1PR`@6+M0H+qGWBcFrBkSm< z?tHmR9|LBLWM<`47*#tAq?<|$x5kxGi~WbIhVR(}pj%i9&nAis62ymhdb;NfUBf!e zv<}tU2JT3#$=S*?7Y>EM37f;XAD7^Y0y?%#Bx5}aIl z8k+jLlWge(n8?z{1cCE4KuWfqF@fq;99@iO@9whIl{U&se&I^p@1~Kw0JlvtK10vq z8D$R~;kAc=zTeTqEj9IeOsx4s`XpR!Ej>EkBMY}ighe@nZL~*SU^?U=tF)%D|8pzI z>{lR_e~~)uEQ%k=RRQ#>DS`=4ApWzDK}KaTD4&5Wuv}=SVSH&1M%Vbmv(AG0%c}773bL-?toAs z2sE%j^GiC_g=Z8v2`E1qr-Z5KDqsjgzyxgcG}N!`Z&Ib}_D66pdD)7k_tnd?;S10^ zZn1Y&T4mnV5+PIqQr#h#aI|UuS8$oE>MXF@FXJPh%S03Ij1R<_%BvM_?I zGBAA0$#NR6#jl3bk5&VMH)8)Su5%OxMkQA@e~rz@b2E@iGWcNKTubUPyGwpLyRbWO z0{!F8XUCG`K_eT3X*tP3Ww+-AV=O9?1(hszZ=ih1OS7WivFHUzC zr*p_zJi%$c;>v_1Zn4+9m*eb5~)jc7N!E$(mIP5M9-WYi19o3()pZl29 zKq-2AnXtmuYyRg76=WxObk^2QfFAeJ`0GM4a!(`%0a1+wEd(k)4XpF}u6cU%mojvU zEK*`Ewk#>@rkHAP*6YuaSwFackt;L62j(-D{L5B}L5C}Pt>4+nWf+PRj|!0kX|EJU zkT~<85u2FNPbI7-oheS<|0a_to+`hUBmlZK>UoR%shJ)TpnGod3w8)<7oXG$Cg|{l z*a?IM_4YXsst;HHEA)xWzI!{fg&P_+d0|OWH*%pi48-X?a<7TLk!aY)C$0aF<%Rjj`aToGuZUR z1ZGL;O9*FEWb7pskb>1q$zVWbCjvlq9|XqA*}#HbsF0)tU+${*{;&KZ<|rX69%TB_BumHri8rs|9Km4+qOjRwDM zrNJs=vY>^jMK=?6@j~yZsMp@wpJw)UZUBYwAna4s_=T{em@%UYsg14HMe!eYXwZI~ zGtl@DBavBO!vg`)1(a8 zBm3#lQ5C@N^(sWRR$(wne1y&$`_qLw{5>Us5^?=r02-{X{Bmtf~ld{Z7k3@O2rfKXM ztGW09Cqaulvqn3uTT=e@6Fxz+7;L~p+Nt`wcsy$Bx53~>!kJI{TTQ~pu`tmSyfjm9 z-duu+ee5>Bi^y-{v(v8YP+sm`*?DF}8fufC%RIE+GB>$+OaL-OBSJH_psfEg@c#bt zOV9B8D`{~3|Hcpv7vcl^7YIm@r|HoNHXgiyJ!rOpaVBkn9djx30w@03dwl~GB5tbBqc?j#jfX75`k&&-<&iZ=Dx zuqsj-F0Fk4l*gM_`QS0NGPAT^Q5j6uHI>I`^d_0 zf?&A^n%Y-}eVb>N+#mhw` zVT9Zg)&#pY8wnP7XOiAThf%`cIYC>0grGd~==a5suUtDoFF8`X&OVRpgZYlP0l$9j zz?d%(46nrEVLAxQ_UfvT0`*?LPE^JB!kARBhbb3Ng^b#%A*`iqh4tOklm3T+fMRor z(OZUow30EaOULakUoA_SD?v0qv3vc{T8Kk4Emz`bRgccMW)3hU^Q`#B{^h$IylNG? z7*zJuB!${1f|qfp$Rk+OMbXx9%zMlr+*gIqF31m1*w*Kyg4CZ@GK|7kRj^9oTfOAo zu3N~0TSyde!Z4S4^9P1;Zz0RwIh}q`1Xuo%hTm4-aQZ=JGu~N(Wn~#bP;DQIRkbk{l{`MR|5UULf-Zkl4j>dT7%#d7XI#^h$CE#wTp3%f>qcQ{1B(GH42n%FGflrO? zh#w_n8{T&OtQeVtm5QlJuX<^O4q9_qDoZ&O&6 zSkw0Cff%C1BD}EP*l8&Dk#V+-hlZU1&`X@sU#wzcCF(5(6VLvY;A)qc&n7CbN(qdu z8CJTvl9jVkfha=QL3GTJ1#nSep)u#>@{1C6JZ{Ve3>22#ZMc8FxPJp}hvLBBn!O8% z;x!jX(0H=a;S6_JMSu0z^g$Ijl+#3%t|JC`l5h(I#+WosHPT%N5=VSnVCjif&V6>( zsXGbjB6eNc3%Bn!pKNv`tSj>6l1ossNagKKA6n1$4uoXT9>j88wo!stDWB2D6$@-O z?Fo~qy6$s9LE^Ld4>>$^>I2)nY7a_kX(ZG2blx`3LULr=ZsUo$LMzHi56DF^bqK0O zuWJnkNPrK3=~V>mdGkw5x2v1@kdwsHNzv#^{H>x}C{dCSI7>#)xnU#+DZSpeQ9NOO z`Q*fE6oyaf02a-@%BOyR@1kIwT%QgE4SexDzKWz=RsKJzx!EIAP-mWT1AdffzY4GP znu0CTgQq?X*F5ZAO$tB^!iB$@+$(_FFih4EIo~_QseTr1}Aksi!v~T-suJX=*icrh0x__ z!;DG*1dzezn}-I4|6j`Y&7*QQU7rL5NY$>vv*O6z=X&Xt^2dyz>Jzc&LenN z8=n7gFEG-8i5Y0{a%!n)2Z=a}rn6nQUzKC}N!j5)B0>2mV$x_#JKV2q#B~0Rls{xO zvIX*7hARM-*f>`!cd-DE$szBFRL2TGlNqfM-OEq>XQ$@G#@}^phu9dIjiu2tO?H~I zd4cyyxggjd+B=)ni+Ec$D)x!ZnFn5!u`hTftAB`%WSl-FC%cI=_aWFU%H7N*I&l_O zLktu>?(`L*kSbDeI*`CKhIU+WEiLgdWc;|4(bE)pB>h#;(5STy2+d#8Wd=!Jus#s5 z%a$at5M5*fhIu7Z)DMY17uf`9Q5wvd4u?<)?r~!ZDiUNJyU?vcR-YB4yJw8kk+1d zYU`aP!4a)fq5r~$jTzxW>o*w~{F+Q6E~r8E@?0&!^dAg9A;;J*?)~yL z^AE8}f2q=dWW;+H~n zV;~8?SFswKYXrEodw0K5K-a$-gabgO#+bsvkI8v;xjrFW2~N=ODhkLv0!s&n740qirnC{v$%bZ&4W^P3|1k z+J@WeHx3J&nHm}5RHZ_Sf`T@Pk&t!xvT4n?pgs`QhhuG9L@A4K4WHwL(ghFj@e-d+ zs4-M8x~{e}xV-d2Pyl0xf#aVJ^yc6!T)msDk$Y(;surn1TO$a zzIz1_;Lgi<#Z8jHxe7*Uy%8ybY1F!MN?{SK><55RgZGm|Wk2!p__h2+DITHP4#S!W zAMm@?Ko*yEoUHnLMi>tYr!P;vulRqV00x;II`NZUEocLgq%la>x_x>8=wxF$#`B9* zDQfoI7R^a%^hl<&4`DK@B-CsS1t!H6<})$zEaqzXRrt`)jjMX@s9^(K6)*#V4<534 zlc)HbbM(&(U&$qfbkx3n>!n}5h)(o-s zYxn|d?&9=1>Cp_($02La$Ut%68_+|vXC!+qz1!6Y7-71e=k2{=hFYBDfk zAua;7)UO>K!c)%$tWN&B9OV}mO$!^4sY~RhmJ|&*a>7^ zt9ZI9!Ok-s$H0{!`uC4EKw}(U;16xKd@F>H!?We(UI$>V)2?Y7?b%?1j{y1h@0Cq| zt)pZp$)QyFVEeq%esKCwT~pH@zf~Jk@b!>+o$6tVugpYcp++Dh+H&369&rYf zeUM!NC48K^BFqImN_q|b=-<2pkEJ^$vTmu*TAI%G?8mC_sEwrhZqS6|N__kM#(=&W zLhD>7I8cpl{mNL_@ks^b){!y(!AKxbmE4TXnQq*$@vNZZ2P+ID1Ag*YHh@C3F2#Jp z2u@;~#q7(^aLQ9?7tF1zF9|shYsLk?{;pTB$~s9n8mdfqhCe-p@_)`f%@#)@NZU?Fu;siUvC;GD8%ymTubauTmE05c){k^_ zq5RXp|Ar+HgK&w2j5&2<0rDpmLG!7gt97agj7{JI&p;0T5%di**SF~NhTtlAySFV9 zEsiKd1<&Z!G}VU9bjO)&IuLa3sh9iwbm?NW@q}OP&3c$&khdaMUIFU&dGzvruJY_^xQ17%NareE@-gGI712ghXMdZYm;&hb zX_g>+5ovspt1E~%oBsfDeBQYwfR;{ATT$PB*gH+P40FyPnv)cSV$U2Sjd|HCBo{{> zxJsg}PLwa}OTq>HK4#E_y*>pE-i>n>u_6+?;?+&T+l^P{nO^2!f`jeH=xmd{hP+3h zU+ovxLMBx?o3_qf=HwR7{I>D07Axj!zAjF$7KCVkG}rD@Uq{zfl8EjCx0IosQRi4l zPoWpUB*$O%KEKCvM<;6x6+dIch9^rK1X1Rk($#`Fv!ok9K@GXt9m*A=iM*deHWir` z`FU(Cv-2y^@#G!OTeXVyHq&LQhyByaI?*79Lt+AJL{V&iq`uFCXqw8Qx}Gh=1QVP3 z8hEy`aEiWc*2En3gIb+{zR^3m)#LZz{ZPjxD_U4;iD-q{M(WZMsngTjw(oELu|nlF zfIxG9W0k4PqmsQH;Z8PQJH8`F2W1L#d_I^tq!l}*1hwyy_hu*3)EJ4|?SgYZp5*u8 z=(3cuS`$j1c`wyFNpI%3TljAf9!MG_(NM_)H=ek!*g(EWUF|80?%iy{sl2UyfpkWa z@dlm?H~ljb^3T`F{e&tMf2Osev))s*|Kkr(N)p0`XggbiH1usGv-Fhu!oKsNscT#K znEjRoGZEXp?sOWHQpq2u6)g!oJTME?_!-&EH+9(8CU9hFUOToZgB#E-&*VHy!4145 zwoMq34s;S80)SB@lud8syzM^ji~>}%AMax+vQb~OvCdQm-}IpVp>#czqf(8S6TlVy z%bqFNvrE&%4k(zhN7}b*qgecge;jd#_DrkrFVD;ll_$n5*BHDOOZP64mGKmEhnsp| zw4{M;xtK_lA&DlwBMO3#4txLRSBFB_aU=1p9il~?Wr-*A&?qGmFVQC{fYg!xV-4Vc zYW@J8Wlbf16~hfP*j0A94nPs&S92_(ZBzfusg85IP5;T(na?_|R}^(*!UAmu zCJ3NF(h4$1BvY*i7QV2uImY0>>Yq~kudKwczWTqVJ3ZCGZ$Y1)Q) z$D?0h_uCY%OXF(7)`5ZGGXCcHo7%yKY^qYUUU661ynGV~S31k7kVkw%Q_3Oo*WIh@ z^Iq+B-I<3nGrfbmLCT_d!VTVAU`^MCs|>TtQ#i^WByUYx1<2eyg9Q?$u$DwU)ZbddG^}e*qw4WiqLlq42#WmY^>zn zK(dd?DSjfgBGS*|F!@51a>^+KJSf)xTti1M$au1>I`EAB)!w+1Sp4Q5cwPxU$3~tGEXfg+jU~3+1qK_P7IZHR5 zRrxxWh!++Fm=#|)$t->z%*8}XQ$)>+D*owTq5eeP`68@3i6Y$l&+N~3`6iY7?%=KA#X@9E z)r=scM+%qW%K&wdj81L{;%D;9?7&nP)l*WWJI4$Sf(oWo#E~=1vo_9Ej5G5uIYf(O z|6@S_xl?6sIoWEV+XIS=id-UbY@!rwHb|q&?JXgQnT$vfef96Wm0I~|4fO8|My2uu z&Nc4_sz{Iz>Id=;AFB-}c(Mdj3+cEPY}h8seU&5A+x9c=t&(UEtRtnlPX|IExY_> zVduUYkRb%jJ(37dgG*%VEW2b~kWchD%*O41wu(_n4WavZGspy4t-7n|5~cPCsA3J; z_QZP3u=X@-fDsuvBT=&ze5M;xo_BR&GSzufRU^)X4Hn}7Xl&eL^LaO@SrQTI;QW^s zuGDdhitt*JLWczhjTwQXdwlf|C=Qg=WC_HyRewkzEZ9{x=PM=D^Ue#EqjoX`Zx}B0 zD4#Rx_MDbKOvlKYF1Ic*ES#_ydf`~t;5KsWfSyC>ziZGnVKzjlJ01_Z6_aBM9`m_Ik?!*H@unp|n zI&Bf)YZ*=d+VsLcj#X=?6watEEk($`k!3rV{kzBKp#|uJ;-nVm6^CH@Hp{u(>g1^Z z!JB2us(}%oao#Wz^x^@TaE=l4peefcYc3{~#n%xYuu$_`YPh6y(FT%~BHsLQntDD6 zR_qb&*Y66Kz=BuvK2n+>)nlZvAWYCv-4T9RGX7;b8Y&T7@3y=2GSi4&9$Qm%%O3Bf z4_mnLutvGXhKbe6p{?GgcZ?17aby|G1-=^Ylr4XnRJ126`8h~8lKUDd=Z->2OMs`e zKlkG&YR@-4u0ODnS8d}N0E+d>iM0a`KOwys#-YDtXHP@xRcJ*FqS->-bYr#gr(VAd z`E>P2JoOO&mU!4>#mZF*$7?{>1{aMoK|dw7V6{v=%0&t4_9h&76)pR#09fC70n(-d z&HBwxCr-e;{vh@*aPJs) zXY5=vzk@awF$R7 zPqB9%mxf!W14gZ~sfZ41)ayp}mAv7BEG{mnywmcW`!ed;>F2rQkzgUHnzZ8pW{=KC zn3b)}zS6}nZ6}b@%^b%&4sQ)#e=_~;dg2&v?}LjAF~A87b=@>-q7v+gaxmP{%-Vt> zIq-em)o*gu%2T9fl27}PMggS1B6MFvtjY7F^OJI=wGB7&WBPrqz$-PK62{~Z<>zXDsb8b{K^@_%Fz zk<6d6*YwR*X(GZTqw*aUABC4%8Yofp(!(7C?KvgkYQwom=xmYsL_9YU$9;oWV*yNX zm3P9jFDDlF4yG$}xOc_+9y_c;H-h57g-icYENrwe-J@(o6t}CXzL%~To4w9ahbn6c zT86RZFJpoYA=hEa@!j+ed0cB1Yjqe1W04%7gZe7_mTF&Hf%k{?;U)C{`krx_gZFV$ zsU%Y~u3{`lB4)NL?8-$z>*0%UK0=!J0Q3!~YpNS^$wVBn-;`ikeK8_D#~Jyx!94-4 zzMWWbjM3i9Mca^E)B7VlWm~^B&W*El8PQVU7_+oCiL#w8;5(X7%)vse?+~3Q{2{Pn zC$whJxSIn!_muoIZTvVMXhFA}M$B_$7JfsQFv^_uF6TZ7!bFqu(bIdX$)#+*2`dLZ zJ-wi$*3??Cvp>@g#!zPSz79ca3s1&{NLu?6V`Vi3X%;$Qq9rA3P-V&BT+sLQYI>Jx zR{mclR>k`|k0`a_mZ)@8A)+Y=d4gZh~M?4B9drIj18B$fm;c?6&5OUNF? z9EhFJp^*0++!>@*SBc5PAYtBeN);ZUw_)ckZ}1$=8(@AUbt6K{n&Z|HaKhAU&;L!o z!2l9EK?kj|GHzW z)kzjM__->3xX9o7L%KhcSsgkk2DgAWCA;Ra?TP)x2@|qmOBCg)a?S|<;a4@heP9kb z)<(*ru^Em`P^gi@5e@RrfdV0+H4{f?7hF1j+L1p$ZY@(J1ch~?aq@E8G3l@ zAj2#MQ)!mR_hU^Wl)qyP{UBnf=)=P$&qhP9#qx|4bfqo@zv9rD5QwZ)k(~~S7p|sd z^@ST!Z9wo?p7k8UmRKj>;v#?L<%sd&4D#t_M*YLoMq~A&3ZfrON2ebI6WDf9aP2^Y zCad6kz~Iu8w(#5*_WxiIdbg+9!1-h81lI=6AsBi!43v^)?pe*KTH=htK>ohbi&-r3)ABPS09l3@A&+oi8-csV;6tB z>KHmdSiLuC+!fB%6Hjdfhzyc5m90Rkz#2mmFCw&?d+C4RIsaYY{<}x8+oNZix$U&k zh_Q+|0c(vcLc4u9_||!-3}CQK|C*e?4iV^x3B$dxocE>!0sus-bp?X&xR;Y%`Jw)r z)`L7kq{@dzBa$uMr`!KX!DSV}N@ZH|j8M<&_XDPHm|>CF^C(U#o=~?(vlS`iSq#WDcfeaq+W!38aguTg(Q`~Y~ zAbMN@B9;nY^A6vD3gi}lpL97tSSzCxGosgl+_L}+b5p;;6#7n8L}+e@JXgPi<97CZ zz?>%zcZY|Ku`PB0FLGg<$SEfZ!d#><%Uxl^3XymFf4;(0(-(B6L##J_B|V+{qcznb z8t%@kJpxJs{&3l0?8r~T>YPEqH7LcQjRTnx#+>dMVy-QAW0=MYaz7rC)eozkG3x$) zYPf1(5Agx(z2y4}9adxGE*KO|XZ`z)2yFRrt-QO|B@0gVFoCMe(0KZ|;HfR4NW+0s zA=tgVZzjy9DNwoz+ZyqNWxuwPjiK4Nb4HZJZNabVzTS-3hv@l1YZQ$0~&>3 zUMOh$rdD0v4Rsy*Qgc~F_RO7#bxbYNr0{(1=o0{l{W-oWw&lzAU}-Z*G9yJ8U%(({ zJou8~Zy)%2*9{Es)qrpdJPptw%bRt$#2c~A1&eHBR<=YTb1bnBnzZofD-73|@<$sH zE^c3?s();JtjhShPy9#?8FPbW6SFaTK5E^q?EvnjoL9Gmd@cK5l-&6kiEVl-8t{+S+`^MggFdYI z%ao?hZ7|ZT^6c*4;P}}ZE?8f8e@p^Wcxzr=h6G6e?4ZG5^GY6(g+&uNfp`>K0hVR! z00RU#AT;xZZ%Yu0McXjviGD_h(eNnrdr7veVF3sB!6OqQxHB6x#i6v~1j%168gz4&%3`_KNMN zpOaCHKc*9OH=w^$HFMk|7)EI$gU3aMKn!}c4QL>eNX7D3#zs%%Nt3Ybm-I&27i3-} z7?qQTc!(8td6D;{ZujQ3Xy%HL9I@*FX3_ZFfUX3JytW~sHP>kipn5PxhIX55UPr;| z_-fFD^C)T$CdjTIPwJW6b==v^Pyn~8*nNy7v$U9|SR2p;k(kWWMM@<=_tT*aGONsc zwepF|GY3Ef7O&10-?jt%&!boeEadovIy$&d2*yT*qP-uCy~qG@qD>_ZCFS)EzG{-& zDkEwtB|?|uO`w`AufqX?@+GnH^x=8YNB(hCl0RFp8iiswgbF8`m-2awHuo4PBRhKi zyVAS|6#G!R%B_N5>F%9pu{?avu1z-b)0p0NNtr026TlD9^UwN%9GsFodJS`_0I$u7vS+)x@mgYw z9AWJ-js4)TF(ylL$wh5E7GAUcNF3u1p3u`x;nD0SX}j*#Q!Dtzj>M2D$gMC>bVO!CO;Y?Tj*?VuW2tO6OY!+{tGBEdpz66 z133qhi!Ul`m(5QaNM9~EY{0lLQ*Tk@gK76?E00~#=F1sBHw$&P69f2Wxbv9Oah*G- zWju3(=$TDl!m3rF+H8LfrQVTF&`5H?gPw!E|6i^+3^i+pF_hnE>Ld=M`&6NTF?gNX zv||OJ>MJH=9YV>TlMt~H&8M+n0KJqOo}o|(>r{ZU_nD-ule>&l5^Ae4C00@CZB=rj zgLsy@WeaJdgD7UTRK9dlh;nJ)_|`&&X56F)ub?!o4lKXO->Ez~nx@rUbhtKD$)Cv^ zfR6%UEurt;(4#OnE`+z6DLXYGRw;j)WJVS{*albM5D^)1|VWGFaS@O50oAtqwcCrf+=-WZcD&O(6|0+qkEQ zb9qTp1uD$2wB-veFOx{KAxVF>_);SMgGD)$lYQ~QE^K5IW&6f?_wsft+T>n)_9|nB zs+0nUD@+?fHxSysnS5O0KR*MT!p>2ltyPSghex__`<9|4_*xRCRcmr&&|k#5fnl~| z5}4kHNJ}sg89+v{SP z))a1h>L91TM_bb-*9q_$n}3^3LR!rRZ1h7tzXP9B3?3!Gk}M8+PPQvu?$BIz@q{7S z6OB(|ug`T@(L+#seqUa#0c~4Q&|~?isMvd|P$dx2vipv;&4E>6zoB zubzkQ=|^(p=09zFZnWHLX2Gb}od*l~Jl3rE0a0eDG-NlyytX>Q!4cJj;z)Zd7qHrV zNSU>Ng{6%+sQ>mLSzp`nh@?AXHWe`iDTtjj2K*~eaG;u9Ti`}FjrstHZ^7xYBJyJT zaHuluM}QGRubs&w(4Q`y-l!h{gu3BWwJ_meBiXJE5eT7*Ui(7_*D!UXx5lmJPxh^` z%f0+)8VF{!W?6|^-%DW@VWm*J^DhcdH=(eqsOL?>i2zv&NJ_JBDwc0&q6FH)>18e* z@0g>FA6?mqwe~LYP{Iw7|8qNJp35LP;REuIagF7ZTJ_muL-(N?5QRKmTh2W-#5lx; z$?}h<0)L$cg)4NDcLl&lqoTNDZAy6dlV#qZy;?f&Rz;0jZLu4a2? z>~jXTfAQXgBjDTb>ZW(f0&y#~%=^wEa&QFLT`HWLw_tWvZIP zP{%ZV8C9;i)}$Vzy>I-^_}XN5Zj-l_N9J3U7rvESBjdqbX`9!^f0nZwy5j&x@Z#62 zWB2-98t+*fmtcQ($1dt_hiyW?0;#bw$FL1xU~(G_eK@62qRL2DXEG1lzbO_2Bk-@jws zY{sG$J|?}bmuoxa`=}V6Gy+f|nJe%;T!C?9Ye_=ikQ`e^%1ut=9TT6O$DTHnNu+V| z6zBzeR{VR{*jKHzKomiS2cF#R!NcbMwcFZW%Lv@k${KS%hkOS}8rjh7gQNaCg^-(YafXzV=dK|eDR^^VMW~M|r=VzyQS5kBMprH=o&D_&eUGLsk zOe0LbqRghy6BuRz4ta&Vi_iU1j`rQy|_|fP5-�MWKxip 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%0DC{%&hC@dIsS^xF3d>m>_!Ykbs&r?hB2JxV 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 literal 0 HcmV?d00001 diff --git a/public/images/ace/signing-model-sva-operations.png b/public/images/ace/signing-model-sva-operations.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbca594185e8e5b6bc25be66884e0f0080349cc GIT binary patch literal 103066 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

OKP&R6k{1zr*oY&2N< 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 literal 0 HcmV?d00001 diff --git a/public/images/ace/signing-model-sva-setup.png b/public/images/ace/signing-model-sva-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..c268d8ecc451f8a9c658a7e5999a511c7b8737fb GIT binary patch literal 145137 zcma&OcRZE<|38k1NK~Sf(K50sq0FPQGBb;gLpB-V*fT}L%-+i0n;heijBE~$b?kK< zdppN*e%EQeUcEo>&*%I5$BlEY=XyLJ^ZvMB-l?g`(NZ&0laP?mD#$-nCn2HwMnZDz z71eRzlaGN3Ur9*lNfaJRYr2pwqbL*l`$t+f%=n%Z)apE}eZH3Ur1%5NQ2IZA{rZjl zfUKYX$5X!jWaQt{oD6ULUPCRGEQ0yp6Z{zRQ2<1H`p=xq4D9R~(pS#>*jhw2$=u&d z0wa89Y1AJ4YZvq&_KT!s&r5o*@R7}31u6U=JNoz9_6%7mJ~5Z9TA%-00zU+zCQZh0 z?%&V;vrn!X64G05L`-S_8U(_Vb;$gd%J236?9=x%H9ftCrj54$AJI;dFJAo**{eMz z6XePLVxq45-uL%&5s!R)V${Ev>JyLaYsrw(_1Ch*$3i_wEn}Ye#(f(Me1G}(lnQ_l zIo|0-ie6UJCSy4M=O`(Xq+Uk4$)~n{?D2-2&&Mmjhy0pYO&_>3hUe~~oWC#a#{;3C zNZ_|R>E9buMWm9L-2ZP!ZG3+YxVh&dEEIBoef?gbp822a{Uw~=N+SOX5U0Y>`+m}Y z_83Yw8}wTMe-!km4*uNBP2jfAR7hu^`nkn})9g%tsRMC&`8pDzhyUz@y$U$iHRn-v zL2~+5ZJ+J`D#o{euc~$q7^B%_ssd4%|Fe&u10x<8m}YBtxaF$(-1yIX^Z{*BWEpA# z7nen8^dIYdr_b`y?bifd;J)&gc!6`7@PVd?mt01)nRLVB|N1_Xqo;MV?}^M+(x;dH zh>3W%tTUu_Qc*4sO5J{)zx5%otWt!$->;L*@qoSq=HX3tM>|YP(f;4}=6gsTs^@xQ z9ba5iL76W7Q&heY#MOK6xJF4YjELyTA<7}jD>zVb2#qKsIws9X z1050?0T?6IqF{P=l%!G9(X&#?fR}C8Bq@OP(;F2KB1p;r<73GbJupwiDqKP zSfwTeyM)+rB*1igq%0pCmHLXgqm7u`8B{@|@}rMN^M-IIFf&8nB(*QqwrZ0FPWYnieZ=mqJ7cyLT$*448By(~kzOqz{mkJ!J zy3nGPB3F1AiAKG7CB-N#SV2@6eLgZ;>HD=cvJv4C*%9p#Q&$M-1)>3+IM;JaqeX?~ z0hCwST!=<1|MRRONa=BmAmp7S*M!%ua}g+_Wv|#f=5{6}$bk|pX?buI|hX+3v)wYN!I8T;$ z?1v)wHq$JQio6P54g)tpoLQlTgC*55ukR-KfXY1Hd^GDJanBx3 z2g@aN43=!{6KN}YqNYnj*+yBx>7p5yF$EsvRBySHtqm<7DX=k|vuJ3F8@jL9X}i@S zQn^6~EXY;<>t54J7N4XWMfsxv~;Y~5h2u>9B&xsSwSQ^SPgl*CTZb!W0f!h1z3>6ye`z!I@VH^!N zy@|$Tf2OBcp@l2*J4@*uB_OcHp5ThaEiaa)bw_0M620ZzwG<;jsyD*LOf6zg{W7jL zo%+O5=qY4XjfdhRz+_L6T0YeQ5v6&jg*cIpE@>rSnRQvvBR%H9V8GNg3w(kxH;Lk~?k^&g%OI3b+G;lIZL z-`7<1^x>hj3PSXt`V$?F$F_ez=UYP+dg5Q6@aLr0AU@1L;?^})z!}V1YgoPpMbh+Z zy5h4XfrmqxNN@l0XTL6#s0#m18rXY@(ZFp>{oaqb+Cd@z?r+x*i1c3phbUlnH9lfA zXphQBqDnhs!2G{&>R+Kk?G2e06TQZp(U|`cCDfo~n&Tj|GtQPU46%_PS_7Q$}j;Iv^bmh zD{GUbE&}}FzmD-k!5}HGh0-ElotZAR{1a?_YfbAF zSw>s{mgh<*!N`*MZqiTQC=jnWmi{N#qc=|g!hg^f&urg+gnZ2}Byhfhbz1q24_E7T zf&2UW6vXtQh#a_(2$Dptzf+h2KG4c<_4zaCce=rq53HBIW47|o@dmDdB>vauiR=D| zI3>dj4CFti^PN4RcJ+@0ey{K!=>}lwfG2IqzaI-&{YMHeu|Jaet!IC9_#Zh(Q~{ea zsq?*&>JoA0_r!lr{&$xAOCrFzzGq)1z4d)Ks{iNqNXc&ixrt0<)K{Wdw0J;G|J&h! z=E-Qa)ZZa)mzJjI{<+Z~c`Fa90}h)CM!_TO3q9EF&+T_&S4 z<_E+wul>`ceo5bV^GwQ}|4Sq)z$RzEHQ)dJ3@DrYiNIgy_-RAG{ML^urmFEASlBC=un`5BYh++Q7^FLOI2q!W5Uwq{w zq9DGDkW&0n!T)rle~j{v_H%Ipsd<})l^Wx3k+Un1^;7(x`}Dm{tQ(X>PB#5e#4IJ! zNB>v)&!Ci&VQ??}7H|~6hXT5R;>i3;H4FAR`M)XpFWpQzPbT=G_{<lZm6!CXem;(ZC`o>VJ z=IK9zNbw?_|EYm$U^1ZrEwJT>-=3j^G3B@CAGi)&0kp12cH%b{U~T*BL7%fJA-_lb zaUuT^vowj`POBQ7eV1$i2ZVPy+7pRqw}_6=Z3D*SN%4{+(d_SxCMPbgw_u zC&qq=I^v%a_s7@l-^u!Ei5mg}gsHau6!$+t0(6?<$vHBrh*)AksF3FRRp|bZ?|1qX z#@~Vl-6yv^qfVFeGhqZtleaSbIHB(*(WE>oX|MlIx*wfQsrfzXkJ|j>(}^FcohDk- zH`C9dz=NOzYPH+Hh4rt~{8dx~pWjdhMDl3#c|_$Ua<2bB4vaWA1}dW{C5v_&do z_VrE?$ne2}b7{8}f!D7e9e%h!LnmzBlG`Z^C={?dgzFC=zUGmIy6LbhDHb!!2tp`(G?5 zGD~vp%TU1!n{a4kD4puI8cuLW%thN@FXgN|n9r4d%IdyssFAn^C!BKM?xpmz5Y1e= zBqnAtGOj9xH&^7-I_tDnvt>F`mY(zp^Ip%kw(FEsO;CRMV2QNzdV~9Lq>jGY(&u6? z0F`*;^UHu3WI@Q1;b(rCin%zKH{6%2gs-Kn-HLwJ*Z4(hD3oCfC>?Zsf$6W+*luAl z0%i$8Nwxb6LBJmPXH3FF)fSp9U790p^pxZ7G_2NaF;*{rc6jCf8eHvELBoHyoz-p8 z=Ay_dZI>Q;GVlW63hSQ@JXW@R2Y4$wNtfsyv_n-k#JjEEVJCDsEnIYn*^1Yqh0Qw# z>@@7!@O^K!8aJXW0=5PO^J=BEd$(eDqLLf zW<647;j~g7JrrlfZ$w?u6FusM#}3u*?N-)#7FO!lc9rd}>`}eCb+kq}C6vA=xIDTC z%j>FKy>!=ckzFc2&>w1@QsTI12U1%ISCt$Ime`$4@es`vwyle>hM||F*Yn7r5f(v5 zE+{F&;Y`reMC?P;D7)F*!nz`1Yo{WIu6qMX9`^F|p=p?_U^$P&jr}uGyp3AnC;xbm zlu5Fck(DGw`Il-AXM6ygSIVS`2}L#qKfERy3>|n=PM4dkn&^{FRJf}Y{zQZo-F&Wa6i{-F zYWNE?KHWo+{V=Q$^4X=at2Hyh@qTQ*iFRMZDiA7sFG@QHsk~AcAxSR*Naz$0fpd(+ zG}_(Bw^Opc2^akss13gFGM##_KKOmtmvZ&wX4YD_Z8_c1(H?wnN%5=rPcwgiMJ*@t zGq=8i-M{)oW1kr>^tf8<>rebG`cZ7 z0i#@OUi-c~t0>gCw|9aGR+Uu6(z7caV*crk_0B*%W$MZ(+lB3e-;fj_4-&FBXItk) zCFA=%uxL(U%l@|pVWh`aPhbzZgM8{PPT04XODoRBM)=&J()?Io+>&IRn^&Uy#JHSV z+^9LwPJF<}%h>T?ZXuxbl=%8htKQEhclC#S_f_Mmt1C3CbTESa6t!iR<%Y7-aWKLz zpqm-fJh>JF_8x^%ZczhWT61r>*Eq?w>Rx7fy(DKaJe-S8rsUBe4Cp{k`U@Ux0V){( zIpW;nbSA_y+vEitKN8PBzKhxe={cilzYYhmx;frWumQD;^z&6OZ=xB^M9HYq7!3fF zJHppT|LWrVPdZdpQ~p@XPkGAmEXwf1x0xu{1ysI9CgKGFPgfkpS4nHe=Fo9MxLbVd z^-T70X3+`Q0rk3kxrZ=9c*x+aMy9w1Unb*x|Fm+BYg0@{iUAn;qIL%+{lN*w-)3A( zE$+5jmD!kvf+gCX9^&^VN;+R{yVCdYJnpAHs9H#h+QhwN)s|+YiqJGT zI$$dLzz^f#^?QY9b(swQA^*E`s%yP7XT0xhG!EH7de(R496r~6EgJB1l-Cl=T9AQt~s z`f(*zXge?66hH7CI@>B@eYkI%2Z2*Ae^e}}Ji=2BE%weRA*!8LEcC1gEVZZac-z)& z6d1V9J%(fkC|Q)Oa|r$_Q4XlGn!+l_-S~KWwz{Rvl0AjFFBRHOF69c`L6L7D7BAs; zkcgEA%H$#%{x2gowL6j*gR)fI4+RJ?5shT#{&Z>l#ot(tZvSXdtLkM2lrwjP_hLhaSN(>3PM z&7x%0m-cR;KjH|fE^WB~(+ohQBkqZwS3VezPMaAU%Gxvb(A{y+kD)l7MejS9zgNuSJjTas z9m1M93Pe$cVBE37I?+K^ul*ytkE@jEd&+k|Q6JA)xq#Gxcp8FXhY;g-OYeh8zrt5+ zW?;{qe5bickx|b*+VaZrIEFEi{xTWHr*}$}s)97zH)?g4p4#Aa%A+}5NpB6*$z*$L zlUZI_*=S)4;&tejz%PeLd4(t`3f(qt^^s>dinA&(Y7Brs#}vX}=FB!Y;-ACDAgIui zb)}!VBapJ~jXCHgK07pcFDhuJ8gs|u70P2P0YaHw&PY+0b*@5_ub#JZjM{0$!ff;r zk5FRbgM%Fgt`elawe|Ys!YfGL{`E_D%)5dvdAn7e^4|O&VAwlSA#wMTDKSmq`a;43 zN;yeRh2!-L0-Xkut4T6diJd2j$U({dNiYROfCos`md^FiB|lpkxDWRN%{GG}e8!0m zUD-Bw%xNF;Q3agMF-T!fehGdlv(_3lFv`4I>-?6lw8K6O&D={@(O*)g8`OIjOhKdO zNX~p2NYJmYKPlU!=<|H(jzzaD<&RBx6HIE|5-%uh^*m6GW389r(C&T9U!(745lDN< zrBGty+a&uFc{uC$*C4p@V;WL>ZydL?gD>MCh9J~+`8jAR3!JJ zHPp9300nJWp6``o*Yk}X<_7_YzdU!!e3@@K!IMcTy6FDPoe~;=TER4rT3k9L1DCLjaN~Hzop*B`L41?VMFk z#DeXDp$odT6>Xi#!q&QXyS;-VmuC71o9*5Fu5EP{xY_T?BO0o-<#KGETr*Yy*-w)Q zJ3O}|ztg!4;##z9z?C)YU*$EDvZ)UM9f;Artu9)glv<;n&NF{!@Xepx^QIgK>0(=V zU}-01IomoV?7I07Q9ho)01a?d&cr+bV-6gItiQc&u_{z%D|4RkY-fh~JGHAMOQIyP zi{2S*D2es@#D<-f2<~vya+&8`A#_Q1Of?PnL;!y1p~hM6v5ruc!j@ib)D@1$?6-b> z8n`&XurZq|8&pJ0G$pGVURo!=J1ZsZ%(m`FH!gHR_{-!nxxEG^6}FbCZCTd2gL=NZ z?B}N^6He%nMv7k49 zVzAgFZFr?Nr!{DCe$J|}c2*X%Ed{7mLy&>Ug9VJl-dJ}K$7lHACQqDh?aRnsrl%qa z77&OrZV%oojBM)AekILdE}kP%;C8o*LvyK(^c zv|B0qO1(Aeg;Wrkr$~gO3087BHooT>2qWUsA zgEOosp)k^vhcNDS- zeE44B9>c~*%XZyds^;d)StVdk4ja;VvJ2K6J-;CJM~{a)N?G{PYM(0b1ZsrB5i5kB zbpVU-E${;#A1V2W>5x?!wB+DsyGU_Fl*cu78*Sr=J((RPgYOLNWM_)!LBE;pkH zSSROFXS~2U@@I?Z=wb6O2493ty6GcRh-CwMq}+Wkd>OEdyl~|TpSpnv~*njxEe&tXVjtFT4~g5t1~`ekF;{s=2*BPZr6RNT>u^`d@kU5Xs$mPA{A@$LEv_fnYhAA-ETtybDj;xf; z$0<_c{3{|^pXtSU$7SAGDho`0G25EiDDF?kW{N#M^^TMET)!SJuC0`CR6TUO9QUa% zd4DevED2ODN}&O)^VJq^TzNYOi51cD5MR&tfuM&eiqQ^N_Y~b+rPK!>5LhKt=n#O% z4rYWy($)yrf1?y6!7;ONTzKik3{z z?6hOF_Y4kQft>N--EI~p$2HkxC<|qze)q%eXC~Nfi=)pMXmw@;3xFDi>p3F5{a%K) z!IiTP=f6WCj}1QW-df>d0z0Y{nU>q)vb8O<8nL$gk%rf;{<#{9nOYr z6(SnK4Vv{i=0sZ%^Ac{bJgT7N!i_N}`y zn^B{78UgjwMV`W%L_^G^5^dzs8M~<=l8dUR{AVzo^M`~s9)UPkyT#*Aa-bNPtO&^+ zhzP|r(p{R=lJJaJUi$@)NFV(}D2M=o=+5pKaHB%9G_Oen_W5y@mwn#QOkBMT9NZu6 z^|4y+ysGnvMaywto((iiyZ=FqCNhsdzd+zz+9#Z@P25B>)LP8yJ?rLbgif}9=CYn>GA z7Pp{Qe{ZWJF{v^6fptVVX8p181(DAfcM3M3n6}Jdqxpiq5zl&N39C={1?31YH0c(_ z%(8>z_>S#wO*gg)NOlGxMY_`;6O)L_t07|(edS9jSf2VD<8iN}I@1)Hd?LS>q)DfY zku&POcnRPYR*lcIuk)90=9~~2chO2K*O5wmW#YIzu;Pigd}8oscFgN?d4X(&Sbsfm!DS>g`LJQZg-uLN;XhsGfn z&&}RC=84`>eMrswF?}3Swb2~^#%jbQdXdRV#)=i%e>9)$q64X|V)1k|6Pt@ztyrt0 z^l!HWL27KP=9p@~VyJ+6(0nH{IMD3& zbln)N%<{H&bMv#+*_{K1(i=|&+E-=85rHE!5MWv8>^ zv5&xai=9B2fjiKna?na%%7tyG72SBaz>A^=4ks*nLAN_8dhi|rgRH<_DKJ4mhm!~c za&BV7Dcs@b>)5y-l(&qZkQEoV(~vuan_8``yk!FfMv%>&^bgI*$0!AT(565 zUAUQ>2|6Khm>?vKu?1pQX;j-`q3-R+H-q)2eU6xSkrA_iww zP<8jVB2*lmCaAneKR0h`Q`|II(Zo3VH0iajS!fuzfq&}th_BPisX|W@FKCes3YnkCaENq%16bm^T|am>YD6MpdarEoB=!w{NVVv&q+xFM0;w>x+T z$t~Yco0}XmQ|;w4zxrtfPPm)_#dv(eKS!rW4_GScH`Fgn!74Lx{&59U!{L5OU5VKR z$z`A6Z(rx|>HBM0Ta7Mc?KbwK+AGxrx6$kEu>T6c(r?(Sy0Z5gWs ze=!lFXcq_x83XkQnDk#N(Bsg8@HL1N4#j>H*w&R2#>t+$@#xv)8+?c#>iV8@a^kgG zXp?<=KK+Roy`6PajclqDm&FaDL)R>ve)s)MGW3g)X^=9}9|` zb;CB4WOqk$^UZB>Om8=wbS6j3f`^F;~z_6pnn z7y^ERJHw&?Gq~ar{RX(qg5AZ`?&Cz;oE&oyIF(_M^y--<=NrP@y#}0&8PW9i*L9Zj zO8IYk#ts}10KkL_VKw=R29~R18@+Ns_%fp+d;$EjNm|pi`?3C{rx5{IXYozY0RU(#b-%brYH*}thtZkffJmzK~Y%^xouv1nL z2GpKOlWxPRYn3(G=$y&|q|h=9TQCETQ^Em&K@8eGToJz2RXwU}m4DG=&kn)RG2=hu zSsVO_RN4kcrskNKzecl==={`;<@t+ zx~rYntdY+UNZAlpvj+je)KP0AJL1v(+qndX?nFdRWyL^gcb$z0%F&trWGdwhfN_2x zhtplST_jA1ZWN~$N(peuschq?^b~pgbUU#te+x(>-qtiL&AA`GwXSIR46gC86% zC>KIi_TnU>RqL?Sn&*Xrc^~wi`jLyT}ya1Z=!e=g1Lc4H+ zCyRLI5*W8^HQQR5*SXAQmmBJ~lQ@`f2t5$3!;F1ium{jLNYSdQ}_44ujD~sCt zu91^1b}+BLgY`t`4Dvl%C;@2xNR=0W-H)TUrS7BOyVFkAq=3Zd3MdbH+koX#) z^Kg0pabiK`xQo$!yH(p4Jkm#^n?g#GbDV&IA6TD#q)AQ+S9l~Nx%62+cc74_Uni4N zINNKASpUn`Q3+eaaz5&KW(q`>Y+v5~a2ge{o=I$sbVoWC^46J|nM0%l;YITtTay(Xjk7GKf1u;eK5>0(R1uC*~Nc4l)>dEL5Vcs$5- zEV{il%r>rWyKN9+SKP!{nOhj_^==1@FMGp$1c1?2wz~=EObZ1jU}((5@}LsR0NLqH zo2yZZ-k4-j-m8AmMZoS9*(mK}259|kP;LiLk2eSq0XO3~-J&h;+8nDUc{15)vcNx? zr0Y4g@O^5##~CpHYQj+q?>Ovp!3Qzt)idJjk42%_-qFAdf_I)|YTOJYQ=L!t_H7j} zf1c+KwweC+t~ZKD2n^5i!sM&+4fvfef00dD_$YI=cCR@*x&q;x$eHBQtNrZdoP3Q*T&#HaDV`-1Z^l6`lqK zKn4=FHjZi{7uq^Gb?-M56?=)HM_~Cd4%1w8al$P5USX@oWFr#djW&JbNod~MY%e^o z(v1WWV-X{vZ)jZa%@JF;k5L*$}#)GPLYX2v|x^zO3vmI zOs=!Ky^Df`=R>z-JAuh|F1`Ra>F0cvv?(*mO&gZxv_Hjib?Z=vSH`qI*x3DO!aS96 zz5r**L`Nw6@_d`)J()ve?6{BZ-OIb80sw}XT&z^AU3n}$ zg>S9grwH5{9B&$re00SWpq^O)kzPEnfX?kM6ODg)0uB8M4xlPDu&Y%!XkpRoPI@kF z;IGSjg7e$)IALqk4;ijpu${sDul;9h7?~R1Q84#7-zw)vm)MT(8i<^?(2}9cQ!n2? z=#?V~!fS}#m*FuvmV5RtUnFU_m!MVLlM0QojsV0+6^;&|6k92Czq?Au3$$FMKism3 zi?Uig%215Ag1c_@7k&pY@BFJzb12@nlFPQq`+R251Mxj?LS}dGP6e=CRMBQnl5DiO z-xAE3aq=_bkgsx#e=|;^eB=}Q&9dXAj`_P$1-vk%Mo{+`pbd?odPjER>e-U>-2HVW zgSwb>-Z#5iC|gHC`2O?v7dsRo2e|`9{#}SyNZN$E>&eDAJQVT^FF`ey2uI`d$aF-uA{Whx_Jg zAEJ73R0t^0u6q8ZhBf02P;a|Dw0a?&3Xl)DNH=9tNJ$Aau&!du{BL}Hu$^(6n~PGL zt$xxIgc-QgTJ>7phMADt6Zn2$vK4;g0i6V_7qc$d6EyujoD&=V)zFiBb#(720v>hp ztjW!F0O^i<6-q=7N1uNXvL?b>^PSNprk#xM?%)%b{JoA3FC;vKU)f-?8L%|-zH>Xz ziVuH(P&tr5)~c)nA6oFHV6>=R%1}+tU?nn?e{ly+lh+ZvEa^3;wRg4=jl8JZYs&Ds zC@XMZ3Y+&itDD8XQtf;q3vzbZul7*WZdn7Va!f?X>J?^nKwGZ^aFnEC>-DH-A5+#Q zLQZlR@5@c-9i~~nL9hw*7ZH~9JR!qQqb!YDXq}NGI>h!dAG`TwQmON@;ip6wsdjF! zGN{d*u>x-}YK_%6dJ+PlSVMoZn7(xD-skPDc^=+-fyVmXt?G(0dc{3n5LJ8A%W7I= zSjp8&uH3d3Js^=t2x+_pM(l%@Ku1}q=wxuL6Gxd*iKi-iyy-i9!R z@XvcU@!j(L3v)MTPEu|Qzim7v#-WtYXw~0WL1xsy>2%kRl>9cp*XB5O?IVMpfvL34 zB79Hfakv)`r|yQnd%2dtA^>~pT)Z{?&R_`t)HqDWZ%-Yzv44zJq?Q@$CZD}`4F~lE znxEE0^mQ=5@{UwYQ~EoR)4B7C7)+nUUB`o}qc$FqRnIW~WF_oRjzO!^B+7Z>HXKR^ z1nxG&NG)x_T2Z;irPb;}xLcS_kkBA?3-o~&DcjU*@{@}+XNM>vS?80Y8`H#-!7 zIV+5UEzI0HQ)*u9N`Vm_tS8+7ZV4T>2|E)lgHhVU=yYmi0vwdWf;y}G=g9<2^}B+S zzF*uWPziaK@&Of*K_GAFxS}_KPXo}s>mMbf!+<7R-gpzhW}(9jZ#j)loolS+}{J1~YN^x*-1NEpct!sWF2mTHq|F#m0IX}5YM7lVSP&*^gQ z8MFAZHMke*yevDDuM6hU2IDmjmBVWvSEzaNE?o!-*(YU$*@j_WiYD2@Hh@ktH!3eL zgV?csI~8x(XO15&9s)ky`UMhPSp+ooive~G=gOH4 zl5B7;39w`_Y?`1*L8~qJrkGxXpHV8Qs)VXK(p{r~&$dddki0U{DyR zF>6zdb;Gt|AZPNWGyH>f_^_#>i$kXIEMo>esyj541jQjBJv^V5J1B))aSoN(=~tYG z$Ez_~K39VWqQ~*qwgj%>!!!EOOdPRJ@h?iM7!`)+QnMQ(E(rc$;<1~N5;elOg(Vdp z+J6Ut80ti2upt-s{Es)<3~1@l1qiLLRQAq47Ro;Z%iQJ; z@J0|uZ4s3xza30u_YrAin;alnVqNrQZlDP$+gy5qd(ZQFJdDel z0~e)RJ!(~G-RUh0>$y)uNm@WeR>M_SO*f8{M^s_}w9LuXcog!YxXHRFB@^Ivx%EHY zCc=S?d`DI=PF*vOv$xM>#W?~Lw9br-&u4mgLi?Q)KYIbS)Y#!_#i-5OGLlrt6Yq=e z`}1FwXNJbR`dD;f^s;haL$xt1pC#_$7GUtt*#kLr44MNk3|6k~gi(*X z+j@%;4sD>K65qDYHhWJM^~&-c4m<4(Fv&KzLycb+DhNluocpYb?Pz9S-;RuAkrK3W$XaKUqWaE#Mo7p~;HqnO9u$kM zoTkwttC3aSZc}f11Jtp_jl>=hKhuQi2HPe76Nr;} zrCr#mgcoa$t;(UpPzG@JD7XOcKkf+kLozr23ABKFl~_1dY1&cZ@SmS=h$)KpMlqQx03 z0<=F7hNnfLqMZyRGnGA;x|9TaVz%t#c=_Vp_^W37eo$mS2-MjgUF31>J^-4V%9Yd^ zSLuP5c+TEj&txW-4Prj+`XoY`NQ>N+-+XWiO>ZG%x;{yIL8v{QCQ4mjJioX(F3e3F zAX$cO?7wZpBwrg4w|KxQFX17!@vQ)QMF_>DLrBXWgaVYZXCCE03R#NN?1*XVeUZ1N zPfP2*?JsarsOM;%iw>w;zG2=Rl!@t1xQED4j*qf&YEsd$y1DTcj$InE>s!hdsdPci zO?B{65;M0b#Wd9d#+Qdx8<249*7k^uwV4Rt(Fm_dBJtIsUrF8$Ro<8Bwy?J5W9wH1 zX~aK6baEYXdkeF7FeW1UOI}8WGr-A$6LN3bP1a78U~SF>_n!i&b49zh^MrU2h?r8I z``Zm9#$Qn5qP_ATHfTB*FZ=$kX-8?;OYet#azxgM-AC_^_iPBf_KQXeQ@X>01-8-v z>WP^P(F3llX>46W+o?R(7YHrR%-zVk&o$J&bGZGZ=8J_7-)Eb-gq^q$cxSgJ!SY;H zzeA@GvY7PP=Wb!Bz%8vKC7zV}4zhW$Pu{`}P?GUGAP|i~k@;cvfFfK3z|9$i6N^~V z`3!FY-uVitfZN(~)q?(|E~HP~+$Nj6McjmP?CoKIuA@;sAGc`l6?dPG=T#r!jPpWb zW&a@IOdf+&85^6M%b6ca#)0DJ>m6o0NHb6_>IM0uvNKt&sB4II*b#6l z#DmTuV_Cto>;MOvUG0o7k^XTAInL_oxG=J%jCELT4Ri34$s%is_g)#tdnli(UPYsFxHxt|B{mycn-}4mRs4MJ4ly3dL;)>k>9ChU0J(T?i2@9B$f?`MAlaoq zk4P~WuE-n#ZGy2dp9uiF_|Re7@m3f66re9Q@?v)|XHT_I_8-?;^L^fyl37f{Pg41=608~hhqdVr7#Oy3;-Sr@nRTwU2;aXEv|ubjXrcR={FWIBG@f?kH>Ij0)WFcaL!%c z@bq{ceFaZ8Elk~%KhHd`X8ot@QBQ7nB(gF4Gn{0nr^a6T@%!}GZhTGNbZ^!=jXl=;o@5DKm)-e%PmMkfQJq`+^->Z(h+$MV9o$u zFa7sLn{o zZ0Gpe`HuMd9$U-Bi!Bfg16YiXqD2!g?G71PAq1ue%Cf{hanS>0DYi1}O7H~3lT-n3 zG=EA&bsSoQ{?UWPrL^r~rvSF`TP3af?$%b8Djo2fn%}lAm^qdtNvMXTCpyeX3-%{0 zieh+eGZUQ>4&b3Z(cPrS<`1ttv_J{C4uYK@Y^ADBxM75V{){jOXZlukX0lg@@I*~j z6I&qG;`|Ri;gTXnk?$y`JD9?@@-uSJ5h>Jy&t{3#xw55<1Kg^+!ClBPQC04nrej}3 zzD5~%?N7NQ3cZOvpo@3c^$`MQ(+xy1!7PS*4hB0_&w-{lxsAPnl3%2}XMXVIglFYw zYgpsehBT`}iA?U7c>CL4se3?9TvTE0T&$z-+G}ET#5892e5D=;Z<;vgL2v68fH`hF zD8B*$k8%}`G~^L@&S%JlD1M#mCj%Gio5dAe7<)(|kj?Exh)!h@b)+sBc*czV=@~mt z8&Hvw=O|Bp{!kD^ZpQ`?05S%Z99htM9)N2YEVnWvmfBWup2L;yw)S;^ycaaPReubs zr|CKyM!7ucxA#5`Hya*uW#-`0cO>*sLsf#&739$)Ek}-=!H!22h)w!D_?okLwAdO} zs{cKOjX~f3J2cEyY^DEm7bYfR5}^7Q0WusTwxxoOqx>)0Sjw?LJ#OYnVI@m}j&Lk1 z$Z8CVRry3YdeOSS<1k8pyYVDp+`1*0GWHc@%zlZ-Jlhi|(NSXtL&0RcLyG~hflv6!vHN~E%kp7|#K+&hs`Q+ZYG5B#T95>|1^?LYZYjwz zH`ZA;@3xr>I!m0>Z@ikJKr(mbE4AC07cR&e;Q1+aSKQH%E{0_~qoC2c@xo%q7b;Ri zY|M^4^F5Y%bam=r_gNUI0auhgeL&u;By&Zn7=L?LU9&uMHs({{i-<^E4LgGuqN1ncZLZ9Ov%F`OV zeGfjXR_cn!N~m$NNhAPO8lN6?KqmibsmzO+p!nh97S>A%cHrlUuTge2-oqvf!-IN- zqXwA*_ze@m3sRUo8s4K3vc$zWVQ?!zWS&duz!X%!0?5yNVawZ~wvd8BCC@4yLXtan z7>g-11{yR$==M2)m1{#y)+Y|N-=07t^YselFUSVEh}-pTW+sjFGO(wXEI!wQ+yFQQ z#y9{Sk39DSjseBeESmZeKHN`qV0b;ER=hX7;3I#=vv-5@nO(y`SUr8G27QiARzcBM zkBULvcHOOc#isz{M@~1hSNVfu1Mdwhj)iCGuE0A6Wo;iF^L1A)JzWFX@umPZ?YWDC zcgqtR8|ofwWI;LDuHk8e>r>}Tg;Zs~(IygT)6?n>+WiIqpy)No)AJZ6s&UbX4!kQ)YUR~S*iVsto9%2nZeSK2m zB!B;nRwmzOfF*D^{UMctFzc&V0GdU4C(!T? zv&c;7lenbAbFJ+`vN!(j6H*U1BcF_bchutbf(7^L0S)v;AKo;3PqE;W8ay)LsL~_x zbuKDi#HBgI-H1Q20+}N1;I*Gr=-D(kG31pv#IP7;*evNb(F3kV@>1jK%<*caVrY8}RQm z9MTio9+IEAmLlKdQhEq7`lIy-Ulr)y0C_U&Q=3t1XJWA~yoq6m2B8P4ULvLN z+YWqM>_PF6#X7IVUO3@FIb>BkxAcZ5sgjndXZ9)z*CvXdfdg%3q2qL{^e2vb?^jMp z*7tkl`VXLK&?(ZYNUtfBZmMDC+`zXKm697D;y>L^x0G(~%>41vpqeDv1}F;1%R?Ve zIiaA1@}lLhr&W78*NDxWJ__WbVt%rIqvd@qWfu{P+sU##6+ku8zVys0s}6fT?M6CB zjr-2~qgM|^=Fa(GlB1!5ErdQ8z=<>8kaq^C|Hxa~tRn@YY?x>HQO~c?nB4uma?`lA zwe8-MaA76Dd7A4~PW}BNBL#yz{@4UrL1^CTR%MVc7j@KL^q|Bw zaN&}nVU3pQp5jX>Pf36Gy}BEHZa!@(RwMDYbguF*KHvogBG*6OR<&UUaf#ZzI%@N1JNx zNz4E(0bLzz2~u^ z_D3ZX-x0Hcp>Mdm?Hd6xLFcB@-fFF%AtA(THj|ASic6bq0 zPZ~E=M#UtRThMwoRY>49sI=C+GF%%U@}aKo;C=M&xz2Vuoz|J^RiGi^P^NW0QE?|$ zt>;~VktStg`=NUw_3prq?|in^vg=b?~BQG8}y+vZG&l=)4Q%sGv&7>UQDcI%U28S~Zy*EW{F8>${)m|{}p;9$<1a_^=W zaQk2SzKKaG!#0~TTUx+LN87Fo*3%q_e_l*APxJ9koTF+|vz$k3zrieCj)xGw-|RwoMKw;h$*RSXc$qO z_Ez-mDer-~ir@0D-s%ZXAN?|td0i0QZwU}IE1QpPL+6Hq z+VmGb_PynaOalzPr^l)8>o=Mf-G<)leXC}BE9H5$Z@@cnq1J@Ijz6bar(^s4L0#7& zuJ};$li&6=6^eoLI%*W=U=ZyZaP68w^sVn-$4kpBzbA|?U3#I^&d{^85HN0z7QZ0; zd~Wa}dciKkHvN0S$i2ljy|$k3FMdC+;(wNKIhVn_&Z#~8NT{<_!MhoJLhlawUryaN zZU#fkkknc{qd!!M|8=Y2#r4sl*VYpV6T`Al&OH5yp@{v6yluSa2|mdWBrmyBmj&CV z6pGUx9cm#O+QH;vOiJK1+e=x2b^h9*EabK*jDU4!%C}X@2M3Pte3CWszEHJRVElPL zU0Zd&?NF0fzU$P7=FjJDE{tvSvMHNt{0$MO^SlfJWxM7|1QU2n*eV8TcH&O zij_B>&X*~1oz^QRQxb!87N2sQL}jII&U;HyO(UJBv-!|r*?7t6*DAsS1}@{SwD__(BYH}fmZ#z;Z$M;{C7jXLOGLj>qgYOU_7Et%7 zyHA-b72$Z8jOY3NZo8&#A;81nhX#hc6rGTee}(-!1Z@+t-BnY1dMS3PqK?{qD*1OE ze|>?b{#*m=h2<9Neu1o+?Z{S)sXsUNT}f}yW#!s|#a!nMixEZ9;X1YU4&+R|{kr{O zX7w{mFXiXbnx^G41mxEu!w{ZMyTCksYROQxO>4w1K1#GDERCv;i#TomL;YzluhG#< z_+JHKKax6bdHi_J|GK&He$K7wB}r52w1?(5#Xp|SWmIx)*|qOySc1KgR*z)Z8+)@Q zkr2Zf83f|Em+aO&zVza~d1sG(?=1{5*~(^gZOP7G)9%&t&CibxS2)sI7JNv2i+0md z?1^sfIFq4Xt=u-zQCKoG`>h~%N4CT0fuu6kugm6bIj6aoy@(^*N=B`&&6mv$r;6|B z*+1=i{+GBqZFhawrF(jMjbTeMF)^Qakm~4ns`Q-2pBB$3P0jd`_%0^<0FhYwft*SH z4%5`u-m;`Q+jrsfkNsxo-Z{pXy_lOTy2S1NlEj2);aQpEh}h$i#H9;*XQyw>HAv$c ziR|htT*aE(9Ovdo@_O8MM2j6Za20%K7tmnh-c?jDpJ0q09+rMK&HVzr+?WUMU$q{3 zkTO2C6PJ8@5U=>?%VQLeI<39vr-iv;>BgAvqVD=am8ZVQ<|Z!$I1i>S7?a*^u|0u4 zW2*J`Y5LE@l^QphsGMYLbCn#@f9l$z8Dwnf!0~%jD_dZM`c*Wivd~+{vCbMf zJuo&Z#+tAV_qRLN61X_+)G*Xn%kx{P+oZ*OH{RoYa!FyMh=bPHQi+;`F~n0$R4$yZ zRExITHPdeLBKo~8XTgKRWxtmrD{Rl(Z2qy!%# zX&BR5_6iuG5MxmyZ>eu60?DKo9p2f@WJy@buXXljM zD0y5wdhQ%Jj*{p4U{IzOrVbjOa;OTX;kO&YLpR1u5|mvDUcH6J>_K9;zTj-WtqF zQ20`K@9Wj&%rJt$9oS(EQ6-=BjKf>xfAzKMnCpT2H%C^OV@EeCT4+4BbX3n^bXgVK3wVsx7O-brJfwz%ku&_AM#8{%cY40*C1CmdLV@q2cE`-t|R;xuph$aEReK zbdl8RgY~huuikv;n(LUkBUYA)HgP>LReWuaIl8_@V(4Q8{ujFGo#XJ7Q`PkIIMdTK zE-907HCaRVNo8BhMrtrj*tm!j7F=JmKW0V*7*G}my@D`4oA|5nJ4ur>(E zQ`b|9Kln7UvJ^PK&D+;LZSX<>4&}Z z3BjFBA8@tTI0+aHdKS)KL}3Vx-&Roo*V`ZTt7|_ZI>VcQaHOb)KL6{62{w%4mKUxz zeqCp%Wne3SstDoU(yLHA<5HOYtY}!s{hCr2ijpqpFs#5 z7#sS{j_~qG4qP>cHvKPFoFIRKhxYB)f@u*c;0_{E*>l-#nW*Z2>SdL(M`Z2*vF4-K z#D<)dr!pmhs)`fG0Mnyf>e2nb#4*5)0cOOF7Os3s6T+J9G|VWply{{}vx7Htx{|2? z@5jbvvOsjUrCY1tuM?MnX8ujDitQuIliG6s>XZJ|_dn=W*^>yIHV~ofEnZ{2+M7~CKzgncy~^9mtkjOW!{e&Z zt64$+*L|Q?`h-_Ed56OA1mvnU&XYNZxSeCLm&9~ZntQjTlK>k9V|!=Dc>4C^ia2w-viqsuD|+}f-S9fHnbB+O+n@)Azfe^MudL6t|#tP`zW<(JsF zXU{RrG|XZx&}eG8nCY$a5u-<#vgL0I$~14kvkM7)oHUZvdLBn8 zWl}s&N)=zx;4?p;O~D@LvGA>^UZuD7+m5adrmVkK!JS)R}D+rKmD z&+k!2W)LoC_5N;Zd5%JlPFkx@>RU@$i02>^;&C#f(UcHc_c?PI0d_~M z3Yl8%yuC%^aoK5mgm8Gx4gm96k!|7oUeU*qP>AU>GsfzU*!FMp3p26A80BFl%C ziI!>|jbZg29EfcV%3fjrH4|~PXyMfx2KSX?Nr+gE_d+QB#gt)}idiOcg@T@xW#b&v zWWz%%yu^D**661>JpGTd! zjbUiQN+Jr31^abEU@88t!C`-_4cMO@{8xHFM@)UxdzE}UDg3LJnZb1YdMsdtuvwM| z2kn0pa&5oqMblW*xE0Q0+$BOre*16D$JNs9abt)#mhzudF0erm>M3-yk%jGwexFyEDNnU zjI(@XnYagOGR>79Lq-NKgl0S>kNj&?`ju3KdwC=Zp@OCam)@mNQfrT^l7`+d@xs~s zNuAKS_Hze!Zo5OpY(hj&vGHItW)XyhdD|v6_)gk`$Z#qtty59IP4mq0t6N!Q5YtY@ zgR?Dqzd~UCV3t%>0*2t$=B4>O*5R~Dol>j(<+5~XLWpVrVfG4ldBzpfR=PY)1v*2h zQm20P1^Ofkw_Z}jb1^2dNxTJUQw2FA}%A?7S_48yTD zY{2776Qx}ynP>#vQ}OWrcT?5i0TyZ(!SRiyJ0fL#J&q8iTtwp z-{0hnm`ws!B~HTD4KB@%JO0UKT_a$nb#rR{^XbT4|8&EO`>Ayf@sRGn%h-@d21S%M z4L%9X>3=d$;{;$u340Td-*67AY0}PHwM?k+|2JJVJHiWmq=$%lb!q&!h3*e(MqC^+ zY^m82+7R>kpA@Vs3n*Aj#HZ%#<_*_A`kxf68&ZWHyI^Z_fq*#t#jbS1ts?|W%R_V( z)7q2QWwpNBWQKL-6^ogz3f&fWi7ye{l?U(b2WFL~tcbsq?4T5tIp?E3SFWfQ%bv9IbWu&jEzn z{+?$*K#XK>kl#1LVh*CKHfHvQ^Yjm18%XyBYG5BlXb*kJ{{Qa{|5{GuERifLh@|?f zHbV8gAzrlv0>P~Tn-vAym=ahUq!<80A%+OBjqBsRauqv2%;*{mFC_+K zz_3QdN@RbJ+=i39{-iAos}N3R|6g3stL^NFk9%n8@cl zXp_aZ2myW)BdS_00kP31unud|#}YvWg3!CNC<^B6+G!Emxe}%p|Ov9s6 z*>p)8sDJyV!T2to2$4I0t|HxR^xCI?o>z0Io+G0c7h6~*J2^b5g`1}r~RBAZCvWa&Vc$K zw;>O~Wg&j?=)1EkMQ&;+aY=u*7+Fi!DCPl95b;_yop*&D8FAD>%SO1%=ee{!^8d|# zu4*>89NfOb8;tL=hk}eT^5<)+WVgx!_mXJVQumG}ua7T=k&t!u&J6>zI_(aks%gQ{ zwRc8#Y*8`5BKs^_>Yh*1;`smO61BR=Dqpo4vN2OHNKZ$~daOKFNz;Sl-+PN(0_@a4 zu2|HP&W|FdR{IQC(tKd1Xn~9fAX6lN3de}2z5-gv7|xPn6yi>N0F-osXT-y>Xh_Uh zfMZOpSfJ{A|2m5Ik|+M!heO{0NO~`BQueXoBi5yfTAqiYb#DTh67t=Idt7XzzQaMK zeDqy!TcQa(IgnKzez*V#S|Jnk&MjRlUlBQn5aVN{I!Dy2`Gz>t9NZuYSeZUkT zZu#~=LR$-p!uocD@?9a%Id8NvTLe_2`19|7Y{VZ3x-Vu_ZTv1n1lSw z;ZXPz0R74YEjt7TE(6s^G^1_Z@fkp^rojZ%jMn^+gc9eG|WZq zzEV87YuBdd*bcz(i>Jd=Q$Sb#RyhaXe+dPH=B(v`<%%6Z;fo)yCe_twLe% z6CD0;9qm`}U<-FjWI>8wF!N)>HFTGYSmPPL^gZV9vu;GH=+Va@U}yO%g`yW8~A;b zKvf$nTI$9crL`d4lyK|22%=f?+}4oY#DrHJT~0WD<*q^$Zv`;6Spkp6V}K5JExIfo zaho4bH7sj%nQqZs&I+q^oBvU^a7<J&F8c3fwwLJSJ#Z@}tp6<39wVXHKy*k{Sm!idN=lzh0O@}TT=Fgta zoD@%t$#J2d&oVD{?vAO+wRZinAEf*a`d9(yvWRY zEZ{_>@kni;)8>e)AH}q6o$HACXU_xmMsI)5a;p(Ea+)-&bfzP?hHDl>hz1~ICJ;qg zN&JHByVwJ2OfEkwQicJ`lwuErhKNoRmCn+AJ?Pw)qnB-58{yC(v7^1+B*9Xz#O|?> zWyikqA*0&KGt?=7%+q%|WoS#Cc* zm3lc1FP{S7H4t7cY_CoCJMBD`2lQ$k4qZ2-pUnU%AvbMw&W_)}m4~$iNMI}EAmYkQ z;%-RsK8NJ%_Vm;T^h68iXltzd!&DVXM$>!ke5-AN2L7oWPpN=jh~d1pNj%Mjcobli5BzJk~XU=mSz#(; zO*$N>oFJ{$^4nC?1#*<{Q7`wok2`4clE%`<+6pZ@4VjuvroeLU63g}4L9Tc)F;K}bNnhI49 z*k~BWCrBKtovr2fLwqqXBvRHLrTTvwh9^D1dG~2qDH!>ZW$TlSkzG)OG0A@A-d@&yU~gqylmYw%7!(N zy=?K8!B*ajP>n8Ipz<8)Y|-LGZPRz*8sIzsAYm9hqwb$N0_!9vPEyhFlaoo!7+dP> zP%F=coCJG3apLDBpz~rKaK`V(M@_l^{^g!hF3_Ucr2Fe@Vqgr)yAl1u)LkJ2gn%*F%4y*pjAj)mHsn{O#9GlSHhJj3 zwS^Hj&%<>CsKlsaN0+RcKAs@y^IrUN-*u+al&>$zc>IWN0DByIu4te|lS|la?2Ua# zpy26F#etuZrcfZD;Ze|xeRxxXBjjq&B?kApeDiWX5~-6szAavDJCF_!n+>z)H|~_; zo6E{nUrMHGxgUyA;G3f}`*PLcz}ulu{7|9-5`^0kSMKNhVMu(OnrFic^bT?r zoyj);idS$h4c2$%zt+GUdPk1x2bY%gcA&lcoS9Q|HrGwrmyy#~=i!G_kvW>V`W0TT z!k?7flfyN9o|N-nesy2eH|>c3_?Nf$n(+SAc@&CKr$6u5!;w~rroUE*qHJz+a0W&+ zg^Dv~t^)w77PL&H(bQEg@KUVcL~;Xpb?=Kqv5SB?31P5<(iB8To+-wQqO*P2wWON5 z=cmn*!R>3bm?1)68pi7tNP9h)p;54nAEB?Snh5lir(S&6dh3beSRm=4Vld`jHk`a~ zjMFvlsxb+Fp9g~&9;w5q5)^W`g@ajcpm=^HbL=*iB5$}HmVH?)&2E?dF4tDP>!Pb- z!v65&i%+dsZ@JRq{Q)MFZLL0kRQ|y!k$u0xzIv4{Bx)qj|N3#AG^EKbl{S((FR87d zSfKdmmx$yo2YZNtgp=@$EoBQZXp$ti2^|R<90G@d5>GbTx%$D0n#Er$3iN;X4L!sW zx_2>Ykg<^-xY0zbWk?tc2`*mBr>EQ@$=LJKlCsAgor#9LQ8P0$&$iCl>;QHdsa!i{ zdc0Zh&~I3*&25sJM(^o5zf&?lHe%AT1hpT4H%?P3qzCBTfbn=#GKD+8>QHOxtzT6F z?&q)^q%WCI zwv6cm==VjY&&CR4_wSr{R)~oBz-0|9ahYMvLP3XFX1i%>{GgQAG7$eTPE9UJ=e8(+ z_N~<e0mSBS0IR~NNp0y;;I`mtEAcC5DUeZYa$m1|}B@}|J;*>qu6 zK7}Jy&5W&{s)WZt^&iY`6jTy9j@C$feFr#n8k-M!>4f|&Xf#)J=y7#)S2>Z@Mv&|r z9wPS>7WHQpxZJizqHP?@vl7CjR?0#5Lj+A5Urp7}0QVLd6|8WPzzgy7b4Bk@WZ8Yr z#}OA);h{75^WuZyuHu5^OwC2Y7YU^(+peNh-J|!q1YYoHiZ`%*YP^#m)bexp$!`?V zS>-gsy&zrutV8oD{K%uS(Fd+G+QR#qHMu=*Q(YxzFE^br{22NIMLAXS5YqNM^!KWF z)-JfCFBUCHL}w<)+jUBCcd=8P9d4fEj=1(bNRN{XJ-GkR zLXPi)^>aCseHT*4?~08AP%b6pPQ3m*>VQ|`CRmc^+FWy!F?93S=tSbh=v~U zJz4COlTgcNrM;H#$E@@iMg8}&DH3H0nx)@E5jv|NkEVp8mPBPsGZ$4e_oUY}W~gU6 zUp%LMYYeZ-O{+NRwGWwp%r#|)7e*KVG=>(MO{&U&+Pt4nn z#YGNdp5p_y?LNWWBzbsv@iSS=k`Gr--n?kf=}wP*_}PcJ{hA)&V7}QEqwh2zwTRna znqdO2xm5(PaR@N9j)pYXoIg>qe-;WpC{&O*cL#W;HlMjSv#Yf1joj6a$i;D&U2mTT zdWwzMPG6)98Ha4HklaTCQGq(n9|{||@`0nwoRl8Chj@8z#yJVi@y`!$GTL_USQ>lw zhTc3%r^z(0fsWOXbNUIKohXSijiSzuBr*E2Nxk)r|ZUBMh95V+AsTZ zM-*C^4Idn<>!5SS>2;DV3x{ct7kb?;_?@O6)b1t0{0@lq`lJqH87`a}KX<|v+*Sef zr`uF~3_rb;)pnQmu~te}8aWSy85rO##=(EocGWAg9>XXoD2(-dTVCM)^?ag+YX&k7 zw$ojUufU8Yz<#)8k@;Yoji3I9BwTz4ONBdLi)!bqzbz;(Y_dZ7yz6E!s%oxeUzX)_xZ#FXXgoSrD~ zy*O}%Np1O9(YZ>}`^w@>dS?@QAS2^MevDn`8-=!^!};akf>jkoj_i4LSh&>3^ev;~ zlQP$Zm^UVDyKWU9r8-uJaUxS%KmT0wqOe4y)I(wlsNRr^N6c1BUt+?MdfUnSADBUa zZk)*Z*LO?jk1nwJ>HxxH6X!bt`nJuf7ntOx=i_cxH{#j*8i&=7TivWc@3r&dSQu}6 zx(EwJu-&qGD0S3BTBBzAx8>Mvm3GeAawkGwmnWSMec8;FQ*`-6+&d4Q4DVFUc>XaB z1J~)*d# z=h$rwl-$ZJ#1azHq<2vDyxTp$`)*oz5T(-@!GAZ3qR;!oi z!G}B);bMdybwj_7hw^sV-b4YloC~Wkem>E3q&Xu%|76l7dk8!QItMFa1xfvEsA!Tt za9NdvL0{YLdZ@GgKK8{nMR zj;fHL!YHvLluDxvIfWoL{C@d%M=ZD1)#vuUF){S!J!Pe_P^)8C{=u_%Z+~%Ce|KuK zjw--}Kd*)}^LF(#XC#CW*cj^VFj!&;Ey+i@O!QaxS|8j2d3|lXx9}8Sc9f(E?h>BF zdF{6Ga%eY>jQ%mUqh-Vz8@C<{C^|P`UzySAFZ^krQ@DSurk~sM>9};&)Im$UnQ_|V zXbxUEEd4R2QZso%#c_?mu0^#a@U&~%o=zB?OmVvN4YBdO3pdS=_xc^(L2KZ0V-!}y zUHf>;TR~RVrsy^()v>L&NIa;PZ+T+pMgVt?hFKW)Lz{7CYoyY~EV8Yx~k{*&g}2@e7MBy2VDwF2eda8avRaqTD6i z=GySIG4u5V-6?7fzSrgMzZZI}GdycREfTGtKi+26E0e1{G3f+5(4`NemBmL@*{D_{ z&i$k=*t9979YQ6eQVLiG zH(vkPhY_;7Mfxd(>1W^_2CB6by|<6 z4nKGc{=#+eDIHz%@v!vrS>_ZE^5Gv*MQfeRU-}X=IIB!(gStZ?+k(q+}4k)HI6ovSY{5ACd~f}A_oU8o6xce#Pt&stVZf{vSU4T znA#z%{ZjDPaMRm92}%eqKZ}RxKyd37NR3pBh0T2Bz#?)F^F0zJ&SbGsK?fesnPoI_;+0R2$-1}RO0T;vd#+cuw+ChH60*Ee2-U9Xi7=vP!A!Z>^E~Ql&xRDrz>8HYb zNZ8^iIIb_^&(s`dTEOYZs$jJ9`Z~mcn917kAzyRA-QR4Aao5OCPbr;vP>C@L9()(u zNh!@hsi)-x#{BK}eEIw)QW1#VCi|!5vYm9ZAQiES?&X}m%;!R;Q zH*;xNtFOM=Q0f)UM*eGND_<)%ha9et zGW+rU>0i1hr<+w3Dh@kG{Yag>hlCMFTQVcXtEs6IJ;H%+sr^{V*F#OtE0LmQkm)^O zFH{enD)xJF?ZeAOjSDLHM~NuUyhL@-4si*s)k1vLZfPaL)=?B#kA)qTYo+|Cvm!5pT{@2=QCPjvTk~uH%OyjTc>3*-SPp^$02NpA~&Kk^9X&<+?-@%ne!E{G**ubLVoO zfADg{2R(|AUc~ui7k1R-l+NfhnOlxroR-+ZNc~;|bM8dreJq%ePgZbjAR`hU?@9Xr z;)G3=uKvQ!aEDn6hWJGpDLdUshpf|JR3-B6zR?piJ2(XKNQXp`>7i(o1FE&mI$GG{ z$Fwkz1}q_F6@yakvVNXheh285S>v+!YJ0(5&qo%7s2ow?|5vWaTV@aHt>MaTHvGuJ zd(N1Yt$Fvg*oAC&0XVs7ERnGc`TXLy4uiti*6i5fX)St(_|@^seo!<#;tod%BQ3*5 zd9dzDrUdRge&|~Gx#{NRbjWol8KL_imgB)D?(GMaHx*UOYE&l!pb&%1XO&Z0M`2rx z$|-Re%TSjRZIQ#C8Iiu)Z+b5GM`PKG-n;vyY?|k(!}y)2zE)-C^!Ghwo`jvbR78{8 zp%*s|LucgBbR0L?zkEC7PGH$%c8h0+5 zLSlm)O48i-UwNGflOj9`QcMS3uWwVZXwOeZ4xCanPN+!XRpFqKci0 zXJEV6X7~Y8f4jh;;|=Mn=giEyoN@1JdJE08syz@VIm``2#_F8(u8;KB`O(1T*xcvK z^pTSMva%j>n1D+Tx+%6?gpviWm$<4->%}?x<$CvJs^_BTCH9(~muc#YN9pzFL`dld zDV_2!jMjHeUOFyz;R~njBF)(teS_3CsKv?L{;DaRCK1-OdZT2IgOO5%Oyf@=lmyI~ z@)B3f;@J)T z3`3TuG&Mr>rRQ*}H7JUg30Baf1*%hP?SbH9><85!fJrHWa+;lRhIPQsOmGkwmPmB; zm4DvXAE0t4PT*uxXsY}PyR8q+rdmz(BU7Zb;o9*BN>b%=HHr0Xs*j|!9=*Gp(F{2d z$huX|p zumRh;bIJrq!^4Nh#y6mnYpni5H3J=VE4#Hs_LsD8q;^VrQypnwOB$Xi;GgT8COW52 z??az~B-3mtUF85vPPBe{l4Z92+ikpI`nktceXiui?YkMS zafVK)M)wcukK*SBV`EVgKoBFERD(<|v4o`sI5P;5SL_gTW(==M8cQ-{d&)$jxd*B~!;&WCZ>}}kD!LeM=B{cOS%ZX8V)dhsNOR}XdNiloGbP*B znx5!1?#hSCZ7PHr|525k265)m7A!tU{mK4AxQGMIW_3XPX6gJ+_Lx(eF^PTg(b#G} z(E1ci01y-QQ0qS2@gw?ZB&UC7E{d9(J(N@7N-77j1ow+qUOQC=GMynSeS7-Vp*0Nyz}dDl#x+}aU;yfx%M6E ztRkihRRZeKjo}X;H?-kwkVt4j+J~)hdq>G^agb=7c5@RQo_Ju&P5+v~>j0QEedHd;PF36WdvNnaX@9`e zR&4MVSQP;Z51^ptLqAuMkXRNnrGMJ={DIvhz^1_&kTUrjK+O{G7Od_Z6V${`ty$NTH>R&%D+#J3& zcr4}tAVRA7+1s}uM}o)+C;n>IA8tBiBtZA>6dW;G>rs`WNAu>B*FOEF7#L*)&q~VA zg&_MINq8CmFXHgwh8{hB&1K}uPo}Ln@$ay~KOP2KP`WlK+0OUrMDkG`1rE*kC0k;6 z&=pb|+{b@zFO<+05LbS2VSI28h3YBuR)FuXU8wXL#jW!s529JD${wOyq=o3cS`b0t zSI%o!!ZnpSR*)u`H}IU`%F1;~dkpE3TQHx9sCRyGbgGT=qrglNRk*Lm0yZ@N zS{6a=##VjhB_sf@XFa$-#Ee?XLw8*w*fXR>xP5JA@(0@_*YjqB^gTpYo28aa@Ix`9 z=AB~l>h)=?*qa!6!It=vEnr$DArxuALEaP#p&e)m96eFmCJYsWC;Rz5$*gBvnm9=5 z9s&LwE(3uejl8=su-*cIEh~7GN1d^v{LcZt3cC&dTI`E;d13g_Y3i>@XR*iWb3XcP z|E@U#~ZQq!1SW#pSAH0NG5nVEw5|XwFsA|%?3AgR`&K zeFW{K`E!&(V~p69DhQ9$wFUtQpMv=4RDz`EJ(KU3=v@z>3dr-;{!u$J5i3?X%_mw) z8_GZ6tp>x)iSanJMf9sicNNDxha^}1PU&B*puDcQ05n<~yDd|C-5z3aI1mhVSY#a~ zI}>3k-!N=;`9*gksTs(>8ha)g=i&(`b>>Vs@;H4WcZlC$V(SJTa?+!;zoU~}hy~a& z8)(VR%qykK@X+(*^qxxV={%oMB_k2kJMdKk_A7lfSvm5d~b?_1u4lEeIGAcEHt z`a>QzU=vC6tTyyy-HfcPFZ+_==oH%VjhyHH%PMc8q0*520?r$m z%2zj@3vZ#e=q7qe?HA#+QvCN#CTXdP*?2YM+!02~n3wcgk;MuVGkGtBm@ax*(GTw%ofbt60c`(fKz5d$URwm36>K_+owOas_PoFvMF~4bNs1-agQIC`h4iTx4tieAw8o9aT zVU+;=7Ua407g9Fl1TPlS!Jgh#6X9P)j&8kR3xJk69NL_&7PWd<0Hg_AnCi{8uMNzG zj;~4yyB*daQ-b^LAX>~3Vx|9;c)cQ_DqU!2UABz2J}PX(E839VmKJRpi8&NH9U#5v zOGi{U#(%9JHZ+DJe}A_IOvj!D&{VDF-3uZ&P6H4_P0!ut zjZt8KLNK?flWUUuBikbgEXCzLc#-rKUIWbkg+KtqoDS2I#lBXBhscJ~aBJermL6=h zVYPcWQlbno<`mMx&ivA5j4SHGFW%BT%d6-yY6n40mMm(m8kw%YRKbcka4Bo z$GX{VwMPWT|Lrm1E@2n9zpAsid1ozag#desENHV<%DU?P;SMA7M*}st>wbE*SvL#v z0vlRGiGOd{mM$`DBJbjG3IQW+* z291N9i-U-A>w*w{M&EU8QM9Nde`i!9l7r2}+Sp)2kdP*yv&O2wjF~1;y7Iqz2FK^% z*xt*=(7_T=jcWc+%eAf@HS(ace4WhI?7Q(>1ho3|mWcS4wu4tY&^H8O#+1v_$n*&7)sKp32_mAKWg+^^75ZI|FuaZK`{6g`y(@uVft^fgY~Xr zN07l5E#$|`vz6QZ`Sd?WYf~9OVz0~~NqpyR<-czTVa717KYHVawY8xU$+G!$cg@#b z>zg(zY=vB8eW+G$-Y|TmoV*3N;=TN~pj+whO4gr@eNGmHDBT}s?$6|_*L%`9T75{% z4!{zpSVy{Y=fpA0-M??z%%a$Mn7|p(7OBsV*-@{l4fXyHHz4hpqhud~e3a%O-StMU zcc1-nIRM!V0Y8zC90oja8l<}gVefBnK2>0n;M&S6A7uzc{9HFkY%easRhMDoL;MU- zWkVs#)sb@$WEn&7>UP3T6a67=$vR}b_9JS~AQm=Z9nE+azGHH^WK>ZG@JfvnjxXj z3UP#zESLt_^!kl$A=YdUE@wrq)1)rI!v)1K2@u@61wcrrQ;bN;ks-36883tw1K`)}$S< z6w#>WjU*wNBMnbXRS^WPCBQ?|_!sUmx#dA2y>0~fz;E(Ci$8&6Zm$*;Q}VQYI7a!S z&-|iw1-dCk4=Tfbsm^rP#c}}Acb>yoM>_&Z05rR$#3_9UBk^9(zS3261FcOS-O7X0 zEFXhv=?>7p9l7^1#RY9CWgZX+ZpsHH`eu3%t`W@+d$vuDZa$m`wY6h)9>X5tq-O** zWV6r^ky*geW^gh@E9vV3<&Bb)}8g z@|ZCl4Liz+@-t-IM!*o9gN!~cd0G)58NPw0q-T*HDS4un(?tYi{3rK|*cc^g1&Yn5 zLG{suU{k+8-vLWcF#$&?!nUGP$TGcQMkkn+Lhqfb0-L#q6=UzissxY%v(tkh0J669 zR$41KTe3dYU5@avBY8dP#(ryg0Wrr+Pw3@dod;;WLcG3ZVjDjUhUN^+oE_Xa7svpZ zf&J8-;YktRD{pqj@?JWV_u%-IHy`0d(u(tJhP^ywDX=Hjr1Pc9ez~A3COazXzcA@5 zxCprrA76P>d5LDwFz?DdHl6(&9vSVD#YfIpa3bmN~bY3!`mrgZipTORSQ#Gl0689MMZ*FowC`Q>Th!e&QOVDn13zE zs1ImNpM07=VKce7q}pj;6UH$Exk?`aE2fYQB`9T?emserSOV+uQd`skDLj!Nb~>(p z-Oqrj(tI+I(uRN`)f(|;s zblyQI;_TXhE6vq#mUg)}wpxb^39>&M0s+N=y31WG3w%RQb4hzv#< z#^NnIg{(vD7iPx1L;>huJp*UOsqd1H*A7iYTcd{oW>XYzRn)s(xLDC(v_Z)6`j2Ck>?VeX<>&aOE~e3T7bVbs)L_OgBI z^VRWE`g#9Ab1K=a64|c31}=|>CEQOL9z0-}sL5XnCr8Vim6sGWe?lF~m);^f)6o0T z`(7Db|6(!?W~dWjDHdjTUMXlQ0gn5{!+Rr#rTmogaTl-n3tAw+mAk&wKSF`tv0ja^z$s@Qv%lm-~kUh;>3q*xqcX zW`2lcw12GqyZ%#jd8gXgjYaoZ-=q%>=LT6NIXL|9vT_6)J>b8~7m-9r!$<8M#_@qA zS%BlL*H4xEMx481s5u`!pX~hR`b+Fr+^zc3UtPmpKNh<1ZKqt@Iu@S)YOQxqz8|n( z_`UPYH`5PCA76XFr?5&^*{4Q3?q@Yy!p+MJ-c>9`H=c#1nbbybTM0aR0dNsyv6p`y z!DDdXvEQB}r$S}U+p2fjM`tH|aC|w|!*h+)J++%};>x>NQTq&FeXYAO@0OO+W6C3Y zBK5{Xld5@-K>#liGXWtnhWQ}LH-#$g;~c~o0u+Ue3u^A_UE<3V?^O7ek#BCWmjC|f z%dZsUMX+|g332~>{R<)kVddpUmK6!Ovo7A!T>{>OaJ(xjy?CgW0a7{qVvYAakvSFI z`VilFclUGi=Cn)8Ld_rHAkv~F;C%0ts9x!zQMNsoi|mis4Z}>o@*(B&Yagrp^PiiF zZB2fZu=>lja&(~(YuG#*zP!9}eW-)|sYSe~eV1XxLcVTOj^4@1`tdH?dO`14mZB3- zr*GSpeSAjuCG!h=X=C_|efA4v-)l`aYst`$K|z_UBwNAYmpNPpWzXk+1DqaR0tDAG$`4=kpXYjH+a=7@Bw7hST&FH ztBUjgxZUJLd)kOmO2OO}FXq2rxUfm_q{8_JO~2my-bO)kmif|y#pO?!ykMuLZL*kEdU=TcXzuGeM{Y_*D`)N>%fu+y$Rs5(> z6do8^6zl|1#Sbta9!YMy()GkNbZ_MSm#3d-Jj!Vfp5CozdiX;%ob{RSsb$xjv&pv( zjxnau8%X53*?c$WW$-ke_YsztO0I3Yn8dmo_p}xnFD<7jCoU>C?K37!cA6YyrL3ME z{}RuY&~;`{_$+s$%(u^j)v}TTl=reciw62fIXULE$6lSQ>vCh+-mqv?A=yS<9Rjs? zu2}R}1rt`>y*Vm+=&62DZf33>I;^9$A7SJpxr{8W!g!6<*Ta zIg%fYrf_%l|G*ST-Rjc(1~OPoVtjKxD1YR6{(*j;J3{7LQfAEJSoM5hqi!nx*H9{3 zmh0!ILP?oUyHEYZg!0x|O5f_(b#I|0K=xLb0VaT)SrM+=ZTXymp zlsssvWkaS9%oz`i5G8K^+Q(z8L5$M=#FuTxw;Ntt9YR9lSAhiF63hpP^3Og#5O||; zI}vlxFA@eoybytFNX5o$HP z>qlKWNMgW(`^m-xkluj2J~+Fb2(f3pQ1taxt>2y?k0BVR_}nWt4O|WD4GGXJm^DP zU;Eci)B|vBKx$jrE8cB8b_-;CiJ#TbTr^J>TAU-5i~0!%#-bXRsDC{hX~{gPVcsR6 zSKog(agK^jQQ&t+S{H0X%mG)W++f@8WEpbK(CRH)oVBNEpw?IMNIeJbuf;zuSZHKv zJ?81V^}W5|t&w1Lq!AUXe4fof&0J{Q&+}~YMtkm3^XPYZj|R8TkKbey2*|RI$;|q~ za^%SGo)Fmj6l+F`0CkLz==d=b7i3htr9J2*R>mog zgoSC>>*7l*#*9J=qxpL_GyoFw*h-uxuQnZgK}B-fsQTq~{GqV^B}TgjiIh>rE+ReG zFL#^1$Q}K{!=zB&%kzbtM?3!&lYNc`3CrxEeC9r>BX`H^)!U|uoc6r>_VID0zvwb7 z^QK4=4pnRAb&hl6S$5yU&y1XHqgPK?k*v6{sA0b7839)L+)*~dpsdo{CT4o|Cx4vc z(bg1n3SJ^?ff9O^GjBsq9}ktJC$a5P)BZxzbKUB}Xyj4t#$DT8w6~A5RhjvUKTy9! zQfX%&(OE{M5mV5&$GiHG|4SR&!MfnR)|bEcT+CPdQg#LFseC9pn<>}vP|Z)iaNP{G z^!w9zrX}5{7VUf3?_E3LahUDU6v>(*Z%B`lnEAdp!JVY%@*a=RBBI;)g`#SK=p}iq zFAdkAyxEsG{sBM4jE;PPbn?g7zQdWiqi@V@^3Fob$-c+i?Oa21LT}U}IfPcctUWxZ z*unf($4Ec%LDE5)YkM@`#RzV5a?9keX=ph!p|`jCjBo7T>peU|jV_7V_hNJK)^C|_ z+}R({^2=9PcT^&H#Efa!CrKk)C;Dh*m9x()-jerK24ab4A`nnkkDqbmohUH%uOQ8s zE%&;&U)TMt=-DsM(kv*O$pLf!{%79-3}Ekdd~Q4|A=>d!O2wPUL1kzwTiB)Adj$ku z`&d!F?T@ZPulp34ZFhmKWe_*}OAaePeunhpolk~|FQ4HUZOtY-9r|0}WnA(WY<&|; zlI0><_wK$E62j+T;abCydfV*B!UA|=ztERmatvO4;u?P8@J4P5y%?bycGUO8!~p5u zV-_V+GM9>BebIg}H26M#^p5fISJ&UYtgZ4a|K9!Vow&5#k-R4^v}xDj05;5jyyt_ zPVHND0M^uj;yUWd4lr&01fEev50ehA+P^hDVg5vPjT|)>UJjcZ#;6jm`y_i4Wu_=I zL(`6MAC$zY8oV;Npdsy|ZMq$DuE=x!-i$~dB6^wYPWtqON~$7bZY%hJy(IgM<^};y z_;VtsY~G9~t_3S|N}yg#?+KR~pXm3~w`R0@%3Li+n$xkYMh8>CscS8?ycilDg}J)@ z@cHw@dnb+ZxN>8%+GpED8(XxNxsuhCH7@r*d(ZPEP;r+U1vU14F| z82Elcl;7Ufzk+CpC|((%)jMu)s6QPWMq#C=RYOE>OVgT@7t4cM!l1%(-9sBlt2$Y> za1%srxx6@cyckeg)!7kNJv{S24HBs3&MuF-8f72Gi{@MO)&Da1@W_sYk;PC+%j$ic z$b?0OCpsYa-c9gKv@0xbjMVoiLmcIb4!L7D;DYJhr{(V*xvku3b+$y*43dRXGDBe- z(?@(6e8%CcLn7k3UHPU>tg!;7D&_B@j#skC*s!r3aL(;2`h7a2oV7Hu+@yiD>bX$fq5;Gevx@_+GGTR#xhj^^;N2iw} zOpQ!gPsh*I-ZMbcdHW)H(yNfIJzq)O9U_RqIInYf+_E}Wm1E5!fN)I9D$x3|mB z4?#e16U`%cYtOR1RoZWFGmA1O!F#d$+z%vGt;<1erPB9R&X#Pv@-tt+AxOZru*^dG zDWyE`^i5!5OZ+xyMWECqZ_R*xt1nMSMpmRpu#@&-<383@G)eXeY0lw~pilrAFUW68 zZ+Jf1+jSBWf$RTJ0U}5}31YTNNA9~$xF*y$G*T%RhNxzxLic{5UE_JWvI4NoP8C{n6sLj`+79ID03|e~CUS~v*N}%i zfOP2t<-L;vdcP_im3DJG#dEUNo2=Fr(ROF<`L+U3`ErS^Bu$fVK@;c|$F-&Y94bt2 z8NOS#ht`w8HP`y8^EkD-%V*pDXKc~c8-z(A6QH?(j!sXSVO4hSq`fytlJ`$(7g%xJ zPJGF_DI{}5p0f%>8Mb!o!+r7HQEyyY=@5Gl?OxMj$;KO+@ybch?`B$-Ap`NhHU9T3 zKuqCSO^BF{ixi&1(R_~q~N@rwrEQLEf;DKo%7C+Wn8?T|%p@yo0ggH7u0~U~P zYw+a;D$jgx<{csbJa15YO6Aj2ZfmVjZd2rZA~^mLFw-!&XXJP_?dBTGh{X@HEpXk}HHI>!GArq9HDLz3`nxV6wR4p9XmvozEWTEqOqd&p0txCvo?%Fj$Erd> z_k+%2(}i1@6sPrSpzVb9)}bTl2D1BAX&2new_4RtfEf(AAQvPNkrc-^z$M_;@6Z-U z$_Bwz0UG1JxH7c3^zyHUE$;iZzg-?GqRdx{dHxF&qM~xGE(|cJl<%3)H70M ztp{|vlASgJY6aKsugjVB@xe;kQ%%7IpjwSNWkUf+l7Go~FFVZ$v|*r`eImE%%Nz+@ zYF%yzcc2a|!by)!W}h>#=4=6;-M#Vv`-=xLdk@xV;pO2hRTtq$JD|R*P*`qW^xMpe z3MeOZT$|-=qge~AP_8;>U6?y+JICoZO#(0d+x7Oh4_=)gW1kWfM#A5683lp3*nGDA zJF8kSrhrQycJ1z9%8Rd`RO$IY;Mf;eLG3OeKO-8O_}iV9y6 zEb%w#jx1F{24zP;tMFP5-9E;|3Mf0&gxG6+lKeinN<8(Z$82?_fn_y4xxW4r_M^)f z9PL-H<73WB#^NiE#xdK04J0<~2$WHJ7nXyBZ|BJWQjRH^>m>0>;^#?{-S6bu4#rWi=a4MqaYma4 zw@!fS;85E7cDqdZyc8L+4@9Vy;Ib^r&fU%X)M=a*R$JPg?CZdNXg$TGz)iB^wC!(i zH(+eFLh+&VcJ4NlM)PWIL^ncN!SR~VVLT@lt@wK0Nbv{y)Vik!S=fCVC{{`cYfZ_;r zLxi6*oIn|hR~gVG`F2P9@IZi-k;Z*Vv1#iOT?TwERVq(|-XU3_sG!x0``E%h8wYT2 zjntm`^koB;e{$kX={u-VIin)7-hY-oNjJ17e{TUZELlo4^3$O@hU``|8L zntGtn91teC19>{MvxT5x&>*PvVWzsh;*vHKz@W_4p0@8F2wQ9C5)$?Jni?GioPKa3 zfM^V1B-F8-8s9eYFPbT-A)xZ{rAm-jc0KL>79zH_hh3(+{T7~UoVvzxWvySX26r^Ng zLHFiE+H;|57?x|=^H-TloMQK`pxtCtj3h_+l=hG>1%~y3t|m!L&f4u&tyn4$67c%5 zglJH5LFtYIDqpf5sy7xkASjQ!gIc3R%v(rk&ZL1fQV-n-$)7)ud@lJ*A~qZ#+3+WP zjTkr4`5S}iiL5A3oRz)(Bm9d%dm7@KTJRnfMAY(nXFMgXY#!2O-{~)pP+8To_+`|E z`zBIJFcF-078qvk@b2bGI-}tlWvKfxquUcZQ{em6_(Q!7z)9xX2<|U7P5t~toCllA zr12d- zV}BUPxyY7UWEoFMg2J68;Gh=E5mvoAACZ3q}^$1XXp}s>tnPA z7Ano*f*CkV3G#_5-#<_;hebzBCox+A;45Z`YG*?HN>Z{>`CXv#!B1SK4mQ8a@AQeB zHg%;VsRrNw|O24X~SG4J5lQFpA-2E+yh}r#8V|1 zB7rnxyoTf0@81p2w1jJ7BQ`W>yMl{Y8X&_Yz{ij?#QM1;kT(%yTgmC(!rI?2WV@5 zO@mWSD`vre?L_oKyP`a&~ zlSmNVT&W;-rK_^`)Q^pa3Zuge1h!OPq8P2eaM0U8|25u zbycADv%%TUyuctf{o#`T@5LiMSiArw9jmD-ub)C}*c+5X5Z3ZyCXiDyq>?Hz(_?YP z`1?zrXjDe?bDsZ2<^Zcj{s{Z68DPFBjCkkY`3NDIOf`abYGN`6;I2mAkuJ3(J{dtv z)N?iBajDb!+(v^of)p4uIHA{)!2uc}uT1&}@;f3?FzWQsS%Zc~i@;;Mu9375L+;nH zMW;jxNlb1`6|ZyD0Ugj&MED3`L1CO1`V5u-qQTSk?0Lh#3V7-QQ&hUtV$J5EWy1e> zRKP^Waa2C7kvqUBqaMAxb`g_9LyQYL1Z8_vf?`PxAW?F`otIBCz)r~Z$dnTHNC^XL zH@A+&x_P=S+5jrh`*7u2ZK~yf<3EcAz%_ytUID!>+ZCAQbcmuk7gth`f-rxI^U)Dq zZX3Cp0+a;W!_5`~WUeMy5IX-=qb028%hSsxpa;|v2!GVSQh4?0!U%A2oG4kIGA=xK->CS&C0m1Jx7CIw8v@eOk zC)Gf`zL%vu{lBKmZ|a^+LYrf|G$p!SjvCt z>9Y}e27zmTx%QId5RZf5g#pe!`s^Zw-2KD7ZO{@mgS{Nj1c1*G(k#~bK$ABRtv6~J z3I4z!STMGV?AesS>)haASkg37V~F#70+FI0P!222_*ar`vZM+ zL;?qi^82lTxoVe7>1UI>VDVm<=LPD5QAI0ptI3zIhZ6jkO5i2;5q|p(z>Kh6E1`C2 z0C|XhA$Wj$w&UY`4jN!|Okil=MFFkbkpHDC7kDlf&>si) z2Ei#&eR@$CmCmO5=SRsnLL!{ufL&n{m?}QWIPdu%WORpgiTeMu)72DUE{459p;H)$ z&DenQFOhb8lPtB1@aZnn$Or>L01@I)UL=?d&FF=+EEpj^Lqpu zOr@6)ksiqL2bmdjB6!6cA7MX$pRdyA1cg!c{4X#QwYvxvi~?hHi=PvI%VuW8NoY$@ zFn>+5Igoi_Aw4j35`KAs3+JfdH!i*bno7MABKD76#qDiz14xLEyRE*B1sK)I0;R+h-303}qz4indk_yH* z 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 +} + +const policies = policyData as PolicyImplementation[] + +function generateCurl(policy: PolicyImplementation): string { + const hasInitialConfig = Object.keys(policy.exampleConfig).length > 0 + const configJson = hasInitialConfig + ? JSON.stringify(policy.exampleConfig, null, 6).replace(/\n/g, "\n ") + : "{}" + + return `curl -X POST https://ace.api.chain.link/v1/policies \\ + -H "Content-Type: application/json" \\ + -H "Authorization: Apikey " \\ + -d '{ + "name": "My ${policy.name} Instance", + "description": "Description for this policy instance", + "policy_implementation_id": "${policy.id}", + "policy_engine_id": "", + "onchain_policies": [ + { + "chain_selector": "16015286601757825753", + "initial_config": ${configJson} + } + ] + }'` +} + +function CopyButton({ text }: { text: string }) { + const [copied, setCopied] = useState(false) + + const handleCopy = useCallback(() => { + navigator.clipboard.writeText(text).then(() => { + setCopied(true) + setTimeout(() => setCopied(false), 2000) + }) + }, [text]) + + return ( + + ) +} + +export default function PolicyInstanceBuilder() { + const [selectedId, setSelectedId] = useState("") + + const selected = policies.find((p) => p.id === selectedId) + + return ( +

+ ) +} diff --git a/src/components/LeftSidebar/RecursiveSidebar.astro b/src/components/LeftSidebar/RecursiveSidebar.astro index 3e42fb21aff..df20459814d 100644 --- a/src/components/LeftSidebar/RecursiveSidebar.astro +++ b/src/components/LeftSidebar/RecursiveSidebar.astro @@ -131,8 +131,8 @@ function shouldExpandSection(item: SectionContent, currentPage: string): boolean aria-current={ isCurrentPageMatch(item.url, currentPage, item.highlightAsCurrent) ? "page" : undefined } - target={isExternalUrl(item.url) ? "_blank" : undefined} - rel={isExternalUrl(item.url) ? "noopener noreferrer" : undefined} + target={isExternalUrl(item.url) || item.openInNewTab ? "_blank" : undefined} + rel={isExternalUrl(item.url) || item.openInNewTab ? "noopener noreferrer" : undefined} > {item.title} @@ -150,8 +150,8 @@ function shouldExpandSection(item: SectionContent, currentPage: string): boolean class={`${styles.navLink} ${isCurrentPageMatch(item.url, currentPage, item.highlightAsCurrent) ? styles.active : ""}`} href={buildHref(item.url)} aria-current={isCurrentPageMatch(item.url, currentPage, item.highlightAsCurrent) ? "page" : undefined} - target={isExternalUrl(item.url) ? "_blank" : undefined} - rel={isExternalUrl(item.url) ? "noopener noreferrer" : undefined} + target={isExternalUrl(item.url) || item.openInNewTab ? "_blank" : undefined} + rel={isExternalUrl(item.url) || item.openInNewTab ? "noopener noreferrer" : undefined} > {item.title} diff --git a/src/components/MethodTabs/MethodTabs.astro b/src/components/MethodTabs/MethodTabs.astro new file mode 100644 index 00000000000..95b8b6d676a --- /dev/null +++ b/src/components/MethodTabs/MethodTabs.astro @@ -0,0 +1,12 @@ +--- +import { MethodTabsClient } from "./MethodTabsClient" +--- + + + + + + + + + diff --git a/src/components/MethodTabs/MethodTabs.module.css b/src/components/MethodTabs/MethodTabs.module.css new file mode 100644 index 00000000000..24cc48043c2 --- /dev/null +++ b/src/components/MethodTabs/MethodTabs.module.css @@ -0,0 +1,86 @@ +.wrapper { + margin: var(--space-4x) 0; +} + +.tabBar { + display: flex; + gap: 2px; + margin-bottom: var(--space-4x); + border-bottom: 1px solid #e2e2e2; +} + +.tab { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 10px 18px; + border: none; + background: transparent; + color: var(--theme-text-light); + font-family: var(--font-body); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: color 0.2s ease; + white-space: nowrap; + line-height: 1.4; + margin-bottom: -1px; + border-bottom: 2px solid transparent; +} + +.tab:hover { + color: var(--theme-text); +} + +.tabActive { + color: var(--blue-600, #375bd2); + border-bottom-color: var(--blue-600, #375bd2); +} + +.tabIcon { + display: inline-flex; + align-items: center; + flex-shrink: 0; + width: 16px; + height: 16px; +} + +.tabIcon svg { + width: 16px; + height: 16px; +} + +.panelContainer { + position: relative; +} + +.panelUI, +.panelAPI { + visibility: visible; +} + +:global(html[data-method-tab="api"]) .panelUI, +:global(html[data-method-tab="ui"]) .panelAPI { + visibility: hidden; + position: absolute; + top: 0; + left: 0; + width: 100%; + pointer-events: none; +} + +:global(.theme-dark) .tabBar { + border-bottom-color: #3a3a3a; +} + +:global(.theme-dark) .tabActive { + color: var(--blue-400, #6d9eff); + border-bottom-color: var(--blue-400, #6d9eff); +} + +@media (max-width: 480px) { + .tab { + flex: 1; + justify-content: center; + } +} diff --git a/src/components/MethodTabs/MethodTabsClient.tsx b/src/components/MethodTabs/MethodTabsClient.tsx new file mode 100644 index 00000000000..4a250ebf908 --- /dev/null +++ b/src/components/MethodTabs/MethodTabsClient.tsx @@ -0,0 +1,111 @@ +/** @jsxImportSource preact */ +import type { ComponentChild } from "preact" +import { useRef, useEffect } from "preact/hooks" +import { useTabState } from "../Tabs/useTabState.ts" +import styles from "./MethodTabs.module.css" +import { clsx } from "~/lib/clsx/clsx.ts" + +const UIIcon = () => ( + + + + + + + +) + +const APIIcon = () => ( + + + + + + + +) + +type Props = { + "panel.ui"?: ComponentChild + "panel.api"?: ComponentChild +} + +function switchMethodTab(newTab: string, anchorEl: HTMLElement) { + const topBefore = anchorEl.getBoundingClientRect().top + + document.documentElement.dataset.methodTab = newTab + + const topAfter = anchorEl.getBoundingClientRect().top + + const delta = topAfter - topBefore + if (delta !== 0) { + window.scrollBy(0, delta) + } +} + +export function MethodTabsClient(props: Props) { + const [curr, setCurr] = useTabState("api", "methodPreference") + const wrapperRef = useRef(null) + + useEffect(() => { + document.documentElement.dataset.methodTab ??= curr + }, []) + + const handleSwitch = (tab: "ui" | "api") => { + if (tab === curr) return + switchMethodTab(tab, wrapperRef.current!) + setCurr(tab) + } + + return ( +
+
+ + +
+ +
+
+ {props["panel.ui"]} +
+
+ {props["panel.api"]} +
+
+
+ ) +} diff --git a/src/components/index.ts b/src/components/index.ts index 0738a698246..625331b82a2 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -16,6 +16,7 @@ export { default as ReleaseNotes } from "./ReleaseNotes.astro" export { default as Icon } from "./Icon.astro" export { default as ClickToZoom } from "./ClickToZoom.astro" export { default as PackageManagerTabs } from "./Tabs/PackageManagerTabs.astro" +export { default as MethodTabs } from "./MethodTabs/MethodTabs.astro" export { default as Accordion } from "./Quickstart/Accordion/Accordion.astro" export { default as PageTabs } from "./PageTabs.astro" export { default as SideBySideCode } from "./SideBySideCode/SideBySideCode.astro" diff --git a/src/config/sidebar.ts b/src/config/sidebar.ts index 1f4463c96d9..ade2a33c7cc 100644 --- a/src/config/sidebar.ts +++ b/src/config/sidebar.ts @@ -30,6 +30,7 @@ export type SectionContent = { children?: SectionContent[] isCollapsible?: boolean chainTypes?: ChainType[] + openInNewTab?: boolean } /** @@ -82,6 +83,7 @@ export const SIDEBAR: Partial> = { { title: "Architecture", url: "ace/concepts/architecture" }, { title: "Key Terms", url: "ace/concepts/key-terms" }, { title: "Signing & Ownership Model", url: "ace/concepts/signing-ownership" }, + { title: "Security Model", url: "ace/concepts/security" }, { title: "Policy Management", url: "ace/concepts/policy-management", @@ -94,7 +96,119 @@ export const SIDEBAR: Partial> = { }, { section: "Getting Started", - contents: [{ title: "Get Access", url: "ace/getting-started" }], + contents: [ + { title: "Getting Started with ACE", url: "ace/getting-started" }, + { title: "Account Setup", url: "ace/getting-started/account-setup" }, + { title: "Policy Manager Quick Start", url: "ace/getting-started/policy-manager" }, + { title: "Identity Manager Quick Start", url: "ace/getting-started/identity-manager" }, + ], + }, + { + section: "Guides", + contents: [ + { + title: "Policy Manager", + url: "ace/guides/policy-manager", + children: [ + { + title: "Making Your Contract ACE-Compatible", + url: "ace/guides/policy-manager/contracts/ace-compatible", + children: [ + { + title: "Building a New Contract", + url: "ace/guides/policy-manager/contracts/new-contract", + children: [ + { + title: "Building an ERC-20 Token", + url: "ace/guides/policy-manager/contracts/erc20-token", + }, + { + title: "Building an ERC-3643 Token", + url: "ace/guides/policy-manager/contracts/erc3643-token", + }, + ], + }, + { + title: "Upgrading Existing Contracts", + url: "ace/guides/policy-manager/contracts/upgrade-existing", + }, + { + title: "Security Considerations", + url: "ace/guides/policy-manager/contracts/security-considerations", + }, + ], + }, + { + title: "Managing Policy Engines", + url: "ace/guides/policy-manager/manage-engines", + }, + { + title: "Managing Targets", + url: "ace/guides/policy-manager/manage-targets", + }, + { + title: "Managing Policies", + url: "ace/guides/policy-manager/manage-policies", + }, + { + title: "Protecting Target Functions", + url: "ace/guides/policy-manager/manage-protections", + }, + { + title: "Managing Data Validators", + url: "ace/guides/policy-manager/manage-data-validators", + }, + { + title: "Custom Policies", + url: "ace/guides/policy-manager/custom-policies", + }, + { + title: "Offchain Policies", + url: "ace/guides/policy-manager/offchain-policies", + children: [ + { + title: "Managing Offchain Policies (MVP)", + url: "ace/guides/policy-manager/offchain-policies/manage-offchain-policies", + }, + { + title: "Requesting Offchain Permits", + url: "ace/guides/policy-manager/offchain-policies/request-offchain-permits", + }, + { + title: "Granting Evaluation Access", + url: "ace/guides/policy-manager/offchain-policies/grant-evaluation-access", + }, + ], + }, + ], + }, + { + title: "Identity Manager", + url: "ace/guides/identity-manager", + children: [ + { + title: "Managing Registries", + url: "ace/guides/identity-manager/manage-registries", + }, + { + title: "Managing Identities", + url: "ace/guides/identity-manager/manage-identities", + }, + { + title: "Managing Credential Types", + url: "ace/guides/identity-manager/manage-credential-types", + }, + { + title: "Managing Credentials", + url: "ace/guides/identity-manager/manage-credentials", + }, + { + title: "External Registries", + url: "ace/guides/identity-manager/external-registries", + }, + ], + }, + ], }, { section: "Reference", @@ -146,10 +260,23 @@ export const SIDEBAR: Partial> = { }, { title: "APIs", + url: "ace/reference/apis", children: [ - { title: "Coordinator API", url: "ace/reference/api/coordinator" }, - { title: "Evaluation API", url: "ace/reference/api/evaluation" }, - { title: "Reporting API", url: "ace/reference/api/reporting" }, + { + title: "Coordinator API", + url: "api/ace/coordinator/docs", + openInNewTab: true, + }, + { + title: "Evaluation API (MVP)", + url: "api/ace/evaluation/docs", + openInNewTab: true, + }, + { + title: "Reporting API", + url: "api/ace/reporting/docs", + openInNewTab: true, + }, ], }, ], diff --git a/src/content/ace/beta-scope.mdx b/src/content/ace/beta-scope.mdx index dcdb7c354a2..6cc2fbc0729 100644 --- a/src/content/ace/beta-scope.mdx +++ b/src/content/ace/beta-scope.mdx @@ -4,16 +4,14 @@ title: "Beta Scope" date: Last Modified metadata: description: "ACE Beta scope: supported networks, managed offchain risk policies, contract types, customizations, signing model, and contract upgradeability." - datePublished: "2026-04-20" - lastModified: "2026-08-18" + datePublished: "2026-03-31" + lastModified: "2026-07-17" --- import { Aside } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" - + ACE Beta is an early-access release for testing and integration on supported mainnet and testnet networks. The limitations listed below are all areas of active development. Each will be addressed as ACE progresses toward general availability. @@ -23,10 +21,10 @@ ACE Beta is available on selected [mainnet and testnet networks](/ace/supported- ## No custom extractors or mappers -ACE Beta provides a library of [pre-built, audited policies](/ace/reference/policy-library) (allowlists, volume limits, role-based access control, pause controls, and more). You can also register your own [custom policies](/ace/concepts/policy-management). The following customizations are **not available** through the platform during Beta: +ACE Beta provides a library of [pre-built, audited policies](/ace/reference/policy-library) (allowlists, volume limits, role-based access control, pause controls, and more). You can also register your own [custom policies](/ace/guides/policy-manager/custom-policies). The following customizations are **not available** through the platform during Beta: -- **Custom extractors**: Writing extractors for function signatures beyond the pre-built ERC-20 and ERC-3643 set. -- **Custom mappers**: Deploying mapper contracts that transform or combine extracted parameters before they reach a policy. +- **Custom extractors** — Writing extractors for function signatures beyond the pre-built ERC-20 and ERC-3643 set. +- **Custom mappers** — Deploying mapper contracts that transform or combine extracted parameters before they reach a policy. Because custom extractors are not available, the platform supports **ERC-20 and ERC-3643** function signatures only. These are the only contract types that get the full managed experience — policy configuration, reporting, and monitoring — through the Platform UI and Coordinator API. If you are building a different type of contract (vault, DEX, lending protocol), making it ACE-compatible could require custom extractors. Support for additional contract types and custom extractors is on the roadmap. @@ -46,16 +44,31 @@ In addition to attestation-based checks (verifying whether a credential exists), Data Validators are a **curated catalog maintained by Chainlink**, not something organizations deploy themselves. This is **by design**: curating the available validators and their data schemas ensures no personally identifiable information (PII) are used. The first available validator supports **jurisdiction control** using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes; Chainlink may add further validators over time. Bringing your own Data Validator is not offered — this is a permanent design choice, not a Beta limitation. -For the conceptual explanation of attestation-only vs. Credential Data Validator checks, see [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). +To get started, see [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators). For the conceptual explanation of attestation-only vs. Credential Data Validator checks, see [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). ## Signing model is chosen at onboarding ACE supports two signing models: **delegated signing** (Chainlink signs and executes transactions on your behalf) and **self-signing** (you sign operations yourself using the [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk)). Your organization chooses its signing model during onboarding. -In both models, you retain full ownership of your contracts through the [CRE Connect Wallet](/ace/concepts/key-terms#cre-connect-wallet). See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each model works. +In both models, you retain full ownership of your contracts through the [CRE Connect Wallet](/ace/concepts/signing-ownership). See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each model works. ## Managed offchain risk policies are limited during Beta -ACE Beta provides a managed policy that screens transaction participants with TRM Wallet Screening and delivers approved permits onchain through a managed CRE workflow. +ACE Beta provides a managed `wallet_risk_scoring` policy that screens transaction participants with TRM Wallet Screening and delivers approved permits onchain through a managed CRE workflow. + + + +The following limitations apply: + +- **TRM access required** — Your organization must have a TRM Labs account with Wallet Screening API access and provide its own API credential through CRE Vault DON. +- **One policy type** — `wallet_risk_scoring` is the only managed offchain policy available. Custom offchain integrations require assistance from Chainlink. +- **One active policy per organization** — Archive the existing offchain policy before creating another. +- **Ten addresses per evaluation** — A workflow execution can screen at most ten unique wallet addresses. +- **Fixed permit lifetime and usage** — Managed permits are single-use and do not expire. These values are not configurable in the current release. +- **Extractor-dependent protection** — Permit parameters must correspond to supported extractor outputs and exactly match the values extracted from the eventual onchain transaction. +- **CRE quotas apply** — Evaluations are subject to current [CRE Service Quotas](https://docs.chain.link/cre/service-quotas), including the HTTP trigger rate limit. -See [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) for a conceptual overview of managed and custom offchain policies. +See [Offchain Policies](/ace/guides/policy-manager/offchain-policies) for an overview, [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) to configure wallet screening, and [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) to integrate evaluations into an application. diff --git a/src/content/ace/concepts/architecture.mdx b/src/content/ace/concepts/architecture.mdx index 95fb577e212..d61e9976ed7 100644 --- a/src/content/ace/concepts/architecture.mdx +++ b/src/content/ace/concepts/architecture.mdx @@ -4,11 +4,14 @@ title: "ACE Architecture" date: Last Modified metadata: description: "Understand the Chainlink ACE system architecture: onchain contracts, the ACE Platform, and how the Policy Manager, Identity Manager, Reporting Manager, and Chainlink infrastructure work together to power automated compliance." - datePublished: "2026-04-20" - lastModified: "2026-04-20" + datePublished: "2026-03-31" + lastModified: "2026-03-31" --- import { Aside, ClickToZoom } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" + + ACE has two layers: **onchain smart contracts** that enforce compliance rules on the blockchain, and the **[ACE Platform](/ace/concepts/key-terms#ace-platform)** (UI and APIs) that lets you manage them. Under the hood, Chainlink infrastructure connects the two — routing your platform actions to the blockchain and indexing onchain events back into the Reporting API. This page gives a bird's-eye view of how all the pieces fit together. @@ -23,7 +26,7 @@ The following diagram shows the complete ACE architecture, from the ACE Platform The **ACE Platform** is everything you interact with: the **Platform UI**, the **Coordinator API** (to manage ACE resources), and the **Reporting API** (to query what happened onchain). The UI calls the Coordinator API under the hood, so both paths converge. -When you manage ACE (create policies, register identities, etc.), the Coordinator API routes your request through **CRE Connect**, which executes the blockchain transaction via your organization's **CRE Connect Wallet**. The CRE Connect Wallet owns all your ACE contracts and verifies that only authorized operators can act on them. +When you manage ACE (create policies, register identities, etc.), the Coordinator API routes your request through **CRE Connect**, which executes the blockchain transaction via your organization's **[CRE Connect Wallet](/ace/concepts/signing-ownership)**. The CRE Connect Wallet owns all your ACE contracts and verifies that only authorized operators can act on them. In the other direction, when policies run onchain, the contracts emit events. **Chainlink's indexing infrastructure** continuously monitors these events, indexes the data, and makes it available through the **Reporting API** — giving you a queryable view of all policy run activity, transaction history, and onchain state. @@ -37,19 +40,19 @@ ACE Beta provides three managers that abstract away the complexity of managing o The Policy Manager lets you create, configure, and deploy onchain compliance rules for your smart contracts. You can browse available policy types (allowlist, volume limits, role-based access control, etc.), create policy instances with per-network configuration, and attach them to specific function selectors on your protected contracts. -The Policy Manager operates on the **Policy Management** onchain contracts: it deploys and configures PolicyEngine instances, policy contracts, and extractors on your behalf. See the [Coordinator API](/ace/reference/api/coordinator) to get started. +The Policy Manager operates on the **Policy Management** onchain contracts: it deploys and configures PolicyEngine instances, policy contracts, and extractors on your behalf. See the [Policy Manager guides](/ace/guides/policy-manager/manage-engines) or the [Coordinator API reference](/api/ace/coordinator/docs) to get started. ### Identity Manager The Identity Manager lets you manage cross-chain identities and credentials. You can create identity and credential registries, register wallet addresses to CCIDs, define credential types, and issue credentials to users. -The Identity Manager operates on the **Cross-Chain Identity** onchain contracts: it writes to IdentityRegistry and CredentialRegistry instances on your behalf. See the [Coordinator API](/ace/reference/api/coordinator) to get started. +The Identity Manager operates on the **Cross-Chain Identity** onchain contracts: it writes to IdentityRegistry and CredentialRegistry instances on your behalf. See the [Identity Manager guides](/ace/guides/identity-manager/manage-identities) or the [Coordinator API reference](/api/ace/coordinator/docs) to get started. ### Reporting Manager The Reporting Manager gives you read-only access to onchain state and transaction history. You can query policy engines and their configurations, look up identities and credentials, and view policy run transactions with filtering by network, target contract, and time range. -The Reporting Manager exposes data through the **Reporting API**. Under the hood, Chainlink's indexing infrastructure monitors onchain events (such as `PolicyRunComplete`) emitted by your PolicyEngines and indexes the data so it can be queried through the API. See the [Reporting API overview](/ace/reference/api/reporting) for details. +The Reporting Manager exposes data through the **Reporting API**. Under the hood, Chainlink's indexing infrastructure monitors onchain events (such as `PolicyRunComplete`) emitted by your PolicyEngines and indexes the data so it can be queried through the API. See the [API Overview](/ace/reference/apis) for available endpoints. -To view or change the default result for a target contract, use the ACE Platform UI or Coordinator API. +To view or change the default result for a target contract, see [Managing Targets — Default allow behavior](/ace/guides/policy-manager/manage-targets#default-allow-behavior). ## Managing the policy chain @@ -95,4 +95,4 @@ Each policy in the chain costs gas. While the PolicyEngine is designed for effic Any time you add, remove, or reorder a policy, review the full chain to confirm the new ordering matches your intent. A single misplaced policy can create a gap in your compliance coverage. -For additional security guidance around trust boundaries, external call risks, and context handling, consult your integration documentation. +For additional security guidance around trust boundaries, external call risks, and context handling, see [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations). diff --git a/src/content/ace/concepts/reporting.mdx b/src/content/ace/concepts/reporting.mdx index e17a2db349d..b97c6873368 100644 --- a/src/content/ace/concepts/reporting.mdx +++ b/src/content/ace/concepts/reporting.mdx @@ -4,8 +4,8 @@ title: "Reporting Manager" date: Last Modified metadata: description: "Understand the ACE Reporting Manager: query policy run transactions, compliance configurations, identities, and credentials with point-in-time historical snapshots for audit and regulatory evidence." - datePublished: "2026-04-20" - lastModified: "2026-04-20" + datePublished: "2026-03-31" + lastModified: "2026-03-31" --- import { Aside } from "@components" @@ -64,21 +64,23 @@ This gives you a complete snapshot of "what compliance rules protect this contra ### Identities -Look up identity records by wallet address, identity registry, credential type, credential registry, or CCID. Each identity includes all registry memberships (which registries, which chains, which wallet addresses are mapped). You can optionally request full credential details, including the credential type identifier, the issuing credential registry, issuance and expiration timestamps, credential data, and full on-chain provenance (block number, transaction hash). +Look up identity records by wallet address, identity registry, credential type, credential registry, or CCID. Each identity includes all registry memberships (which registries, which chains, which wallet addresses are mapped). + +Set `include_credential_details=true` to include each identity's credentials in the response. Each credential record contains the credential type identifier, the issuing credential registry, issuance and expiration timestamps, credential data, and full on-chain provenance (block number, transaction hash). This lets you answer questions like "does this wallet address belong to a registered identity?" or "which identities have a KYC credential issued by this credential registry?" ## Point-in-time queries -Policies, Identities, and Targets all support point-in-time historical queries. This lets you reconstruct the state of your compliance system at any historical moment: +The Policies, Identities, and Targets endpoints each accept a required **`as_of`** timestamp parameter. This lets you reconstruct the state of your compliance system at any historical moment: - **What policies were active** on a contract on a specific date? - **What credentials** did an identity hold at the time of a transaction? - **What protections** were configured on a target contract last quarter? -Point-in-time queries are critical for regulatory investigations where you need to prove not just that compliance rules exist _today_, but that they were in place _when a specific event occurred_. The API returns the version of each resource that was effective at the specified time, including resources that have since been updated or removed. +Point-in-time queries are critical for regulatory investigations where you need to prove not just that compliance rules exist _today_, but that they were in place _when a specific event occurred_. The `as_of` parameter returns the version of each resource that was effective at the specified time, including resources that have since been updated or removed. -Transactions support time range filtering instead, since transactions are discrete events rather than stateful resources. +The Transactions endpoint uses `from` and `to` time range filters instead, since transactions are discrete events rather than stateful resources. ## How data flows @@ -103,9 +105,9 @@ This happens automatically for all contracts deployed through the ACE Platform. During Beta, the Reporting Manager is **API-only** — there is no reporting UI. You interact with it exclusively through the Reporting API. -The API provides read-only access. All compliance configuration changes (deploying policies, registering identities, issuing credentials) are done through the [Coordinator API](/ace/reference/api/coordinator) or Platform UI. +The API provides read-only access. All compliance configuration changes (deploying policies, registering identities, issuing credentials) are done through the Coordinator API or Platform UI. ## Next steps -- **[Reporting API overview](/ace/reference/api/reporting)** — What the Reporting API provides and what resources can be queried. +- **[Interactive API Reference](/api/ace/reporting/docs)** — Try API calls directly in the browser with full request/response schemas. - **[Architecture](/ace/concepts/architecture#how-ace-observes-onchain-activity-read-path)** — How the indexing pipeline connects onchain events to the Reporting API. diff --git a/src/content/ace/concepts/security.mdx b/src/content/ace/concepts/security.mdx new file mode 100644 index 00000000000..bdfb212848f --- /dev/null +++ b/src/content/ace/concepts/security.mdx @@ -0,0 +1,51 @@ +--- +section: ace +title: "Security Model" +date: Last Modified +metadata: + description: "Learn about the Chainlink ACE security model: policy administration controls, execution ordering, registry governance, and privacy guarantees." + datePublished: "2026-03-31" + lastModified: "2026-03-31" +--- + +This page covers the governance and operational security principles behind how ACE protects onchain assets and identity data — the controls, ordering guarantees, and privacy properties that administrators, auditors, and compliance teams should understand. + +For implementation-level security guidance (trust boundaries for policies and extractors, context handling, view function requirements), see [Security Considerations for Smart Contracts](/ace/guides/policy-manager/contracts/security-considerations). + +## Policy administration is a critical control + +The ability to add, remove, or reorder policies in a PolicyEngine is the most sensitive administrative power in ACE. An actor who gains control over these functions can effectively disable or bypass all compliance rules for every contract connected to that engine. + +In ACE Beta, policy administration is handled through the [ACE Platform](/ace/concepts/key-terms#ace-platform) — the Coordinator API and Platform UI — which means configuration changes go through the platform's authentication and authorization layer. The underlying onchain contracts enforce that only the [CRE Connect Wallet](/ace/concepts/key-terms#cre-connect-wallet) (which the platform operates on your behalf) can call administrative functions like `addPolicy`, `removePolicy`, `setExtractor`, and `setDefaultAllow`. + +## Policy execution order matters + +Policies execute in a strict, sequential order — the order they were added to the PolicyEngine for a given function selector. This order has direct security implications because of how the three policy outcomes interact: + +- **Reject** halts execution immediately and reverts the transaction. No subsequent policies run. +- **Allow** approves the transaction immediately and **bypasses all subsequent policies**. +- **Continue** passes the decision to the next policy in the chain. + +Because Allow skips everything after it, a permissive policy placed too early in the chain can inadvertently bypass critical security checks. For example, if an admin bypass policy is placed before a sanctions check, an admin address would never be screened. + +**Best practice:** Order restrictive policies (sanctions screening, denylist checks) before permissive ones (admin bypass, authorized sender lists). This ensures that hard blocks cannot be circumvented by an early Allow. + +For a detailed guide on ordering strategies, see [Policy Ordering & Composition](/ace/concepts/policy-ordering). + +## Registry governance + +The IdentityRegistry and CredentialRegistry are not protected by simple access-control lists. Instead, their administrative functions — `registerIdentity`, `registerCredential`, `removeCredential`, and others — are themselves protected by a PolicyEngine. This means: + +- Only addresses authorized by the registry's PolicyEngine can modify identity or credential data. +- The same policy model that protects application contracts also protects the identity infrastructure. +- Authorization can be as simple as an allowlist of Credential Issuers, or as sophisticated as a multi-policy chain with role checks and volume limits on issuance. + +This design ensures that credential issuance is governed by explicit, auditable rules rather than hardcoded access controls. In ACE Beta, the [Identity Manager](/ace/concepts/key-terms#identity-manager) handles registry governance through the platform — users in your organization can create registries, register identities, define credential types, and issue credentials, and the platform's CRE Connect Wallet executes these operations onchain. + +## Privacy guarantees + +ACE is designed so that no personally identifiable information (PII) is stored onchain: + +- **Credential data** is arbitrary `bytes` — typically a hash of offchain data or a non-sensitive reference. The system never requires raw PII to be written to the blockchain. +- **CCID-to-address mappings** are publicly readable onchain. This is by design — it enables cross-chain verification — but it means anyone can see which addresses share the same identity. For applications where this transparency is a concern, multiple CCIDs per user can be used to limit correlation across domains. See [Cross-Chain Identity: Privacy and correlation](/ace/concepts/cross-chain-identity#privacy-and-correlation) for details. +- **Credential type identifiers** are hashed (`keccak256`) but use known namespaced strings (e.g., `common.kyc`), so standard types are effectively public knowledge. diff --git a/src/content/ace/concepts/signing-ownership.mdx b/src/content/ace/concepts/signing-ownership.mdx index d06466ed1f4..449da426264 100644 --- a/src/content/ace/concepts/signing-ownership.mdx +++ b/src/content/ace/concepts/signing-ownership.mdx @@ -4,8 +4,8 @@ title: "Signing and Ownership Model" date: Last Modified metadata: description: "Understand how Chainlink ACE handles transaction signing and contract ownership: delegated signing and self-signing models, CRE Connect Wallet, and how to choose." - datePublished: "2026-07-17" - lastModified: "2026-08-18" + datePublished: "2026-03-31" + lastModified: "2026-07-17" --- import { Aside, ClickToZoom } from "@components" @@ -29,22 +29,68 @@ In the delegated model, ACE uses a **delegated trust** approach centered around ### How it works -When you trigger an action — whether from the ACE Platform UI or the API: +When your organization onboards onto ACE, the system deploys a CRE Connect Wallet for you on every network you require. + +Here is the key principle: + +- **Your wallet owns the CRE Connect Wallet.** +- **The CRE Connect Wallet owns all your ACE contracts** (policy engines, registries, policies, etc.). +- **Chainlink is registered as an authorized operator** on your CRE Connect Wallet — allowed to execute operations, but nothing more. + +This means you indirectly own every contract that ACE deploys for your organization, through the CRE Connect Wallet. + +### Permissions + +The CRE Connect Wallet enforces strict permission boundaries between you and Chainlink: + +| Action | You (client) | Chainlink | +| :--------------------------------------------------------- | :----------- | :---------- | +| **Change ownership** of the CRE Connect Wallet | Allowed | Not allowed | +| **Manage authorized signers** (add/remove who can operate) | Allowed | Not allowed | +| **Execute operations** on your contracts | Allowed | Allowed | + +Chainlink can only execute operations (deploy contracts, configure policies, register identities, etc.) — it cannot change who owns the account or who is authorized to sign. + +### What happens during setup + +When your organization is onboarded onto ACE: -1. The **Coordinator API** receives your request and sends it to **CRE Connect**. -1. CRE Connect prepares and signs the blockchain transaction on your behalf. -1. The signed transaction is routed through your organization's **CRE Connect Wallet** onchain. -1. The CRE Connect Wallet verifies authorization and executes the operation on the target contract. +1. You provide your wallet address to the ACE platform. +1. Chainlink creates an internal signing key dedicated to your organization. This key is managed entirely by Chainlink — you never see or interact with it. +1. ACE deploys a CRE Connect Wallet onchain, sets your wallet as its owner, and registers Chainlink's signing key as an authorized operator — all in a single deployment step. +1. ACE deploys all application contracts (policy engines, registries, etc.) and assigns ownership to your CRE Connect Wallet. -You never handle signing keys or submit raw transactions. Chainlink handles the entire signing and execution pipeline, while you retain full ownership of all deployed contracts. +Once setup is complete, the permission boundaries described above take effect: only you can change ownership or manage authorized signers. Chainlink can only execute operations. + + + +### What happens during operations + +When you trigger an action — whether from the ACE platform UI or the API: + +1. You perform an action (e.g., "deploy a new policy instance on Ethereum"). +1. ACE prepares the corresponding blockchain transaction and signs it using Chainlink's internal signing key for your organization. +1. ACE sends the signed transaction to your CRE Connect Wallet. +1. The CRE Connect Wallet verifies that the signer is in its list of authorized operators. +1. If authorized, the CRE Connect Wallet executes the operation on the target contract. + +During day-to-day operations, you never interact with a blockchain wallet or sign a transaction. ACE handles the signing and execution, while your CRE Connect Wallet enforces that only authorized operators can act. + + ### Your safety net You are always in control. Because your wallet owns the CRE Connect Wallet, you can at any time: -- Interact with the CRE Connect Wallet directly, bypassing Chainlink. -- Add or remove authorized operators (including Chainlink). -- Take over operational responsibility entirely. +- **Interact with the CRE Connect Wallet directly** — bypassing ACE entirely. +- **Remove Chainlink as an authorized signer** — immediately revoking ACE's ability to execute operations on your contracts. +- **Add other signers** — granting operation rights to your own keys or third parties. Revoking Chainlink's access does not affect your contract ownership. Your contracts remain yours, managed through your CRE Connect Wallet. You would simply take over operational responsibility. @@ -62,14 +108,14 @@ When you trigger an action — whether from the ACE Platform UI or the API: 1. You perform an action (e.g., "deploy a new policy instance on Ethereum"). 1. ACE prepares the corresponding blockchain transaction and creates an **unsigned draft operation** with status `pending_signature`. -1. You poll for pending operations using the CRE Connect SDK and retrieve the draft. +1. You poll for pending operations using the [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk) and retrieve the draft. 1. You sign the operation using your own key (EIP-712 typed data signing). 1. You submit the signed operation back through the CRE Connect SDK. 1. The CRE Connect Wallet verifies your signature and executes the operation onchain. ### Polling and signing with the CRE Connect SDK -The [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk) is a client library that provides all the tools needed for the self-signing workflow: +The [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk) is a Go client library that provides all the tools needed for the self-signing workflow: - **List pending operations** — Poll for unsigned draft operations waiting for your signature. - **Hash operations** — Compute the EIP-712 digest for an operation locally. @@ -81,9 +127,3 @@ The SDK supports multiple signer backends: local ECDSA keys, AWS KMS, HashiCorp ### Your safety net The same safety net applies as with delegated signing. Because your wallet owns the CRE Connect Wallet, you can at any time interact with it directly, add or remove authorized signers, or take over operational responsibility entirely. - -## Related pages - -- [Architecture](/ace/concepts/architecture) — how signing fits into the overall ACE system -- [Key Terms](/ace/concepts/key-terms) — definitions of CRE Connect, CRE Connect Wallet, and related terms -- [Beta Scope](/ace/beta-scope) — current scope and limitations diff --git a/src/content/ace/getting-started/account-setup.mdx b/src/content/ace/getting-started/account-setup.mdx new file mode 100644 index 00000000000..6b242d4ea9d --- /dev/null +++ b/src/content/ace/getting-started/account-setup.mdx @@ -0,0 +1,169 @@ +--- +section: ace +title: "Account Setup" +date: Last Modified +metadata: + description: "Set up your Chainlink ACE account: create an organization on app.chain.link, get your API key, create CRE Connect Wallets, and prepare for your first ACE deployment." + datePublished: "2026-03-31" + lastModified: "2026-04-15" +--- + +import { Aside, ClickToZoom, MethodTabs } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" + + + +This page walks through the shared setup steps for all ACE users. Whether you use the [Policy Manager](/ace/getting-started/policy-manager) to enforce compliance on smart contracts or the [Identity Manager](/ace/getting-started/identity-manager) to manage cross-chain identities and credentials, complete these steps first. + +## 1. Create your organization + +Go to [app.chain.link](https://app.chain.link) and create an account or sign in. + +Once signed in, click **"My Org"** in the bottom-left corner of the sidebar to open the Organization page. Your **Organization ID** is displayed in the page header — copy it. + + + +## 2. Share your Organization ID + +Share your Organization ID with your Chainlink contact so they can enable the ACE service for your organization. You cannot create API keys or use ACE until this step is complete. + + + +## 3. Create an API key + + + +Once your account has been provisioned for the ACE service, create an API key for authentication: + +1. Log in to the [Chainlink App](https://app.chain.link), click **"My Org"** at the bottom of the left sidebar, then select the **"APIs"** tab. +1. Click **"+ Organization API"**. + +1. Enter a name for the key and select an expiration period (1 day, 1 month, or 1 year). + +1. Click **"Generate"**. The API key is displayed once — copy it immediately. + + + +You will use this key in the `Authorization` header for all [Coordinator API](/api/ace/coordinator/docs) and [Reporting API](/api/ace/reporting/docs) calls: + +```bash +curl https://ace.api.chain.link/v1/ \ + -H "Authorization: Apikey " +``` + +## 4. Set up CRE Connect Wallets + +Before you can use ACE — whether from the Platform UI or the Coordinator API — you need a **CRE Connect Wallet** on each blockchain network where you want to operate. + +A CRE Connect Wallet is a dedicated onchain smart contract wallet that acts as the execution gateway for all ACE actions on a given chain. When you trigger an action (deploy a policy engine, register an identity, issue a credential), the ACE platform executes the blockchain transaction through your CRE Connect Wallet. For a full explanation of how the signing and ownership model works, see [Signing & Ownership Model](/ace/concepts/signing-ownership). + +Key points: + +- **One wallet per chain.** You need a CRE Connect Wallet on every network where you plan to use ACE. See [Supported Networks](/ace/supported-networks) for available chains. +- **You own it.** The `owner_address` you provide when creating the wallet becomes the owner of the CRE Connect Wallet onchain. +- **Chainlink operates through it.** Chainlink is registered as an authorized operator — allowed to execute operations on your behalf, but unable to change ownership or authorization settings. +- **Self-signing organizations** must also provide the `address` of the ECDSA signer authorized to sign operations. See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each signing model works. + + + + 1. In the [Chainlink App](https://app.chain.link), open the **Compliance** section from the left sidebar and click **Home**. + 1. Click **View Settings**, then click **Enable new network**. + 1. Select the network you want to enable and provide an EOA address as the wallet owner. To deploy wallets on multiple chains at once, click **Add more** to add additional networks before submitting. + + 1. The platform deploys your CRE Connect Wallet onchain. Once created, the wallet appears in your settings with its onchain address and deployment status. + + + The Coordinator API identifies networks using **chain selectors** — unique numeric identifiers used by Chainlink infrastructure to reference specific blockchains. These are different from standard chain IDs. You can find the chain selector for each supported network on the [Supported Networks](/ace/supported-networks) page. + + Create wallets on one or more networks in a single request. The `owner_address` is the EOA that becomes the onchain owner of the CRE Connect Wallet. This example creates wallets on Ethereum Sepolia and Arbitrum Sepolia: + + ```bash + curl -X POST https://ace.api.chain.link/v1/wallets \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "wallets": [ + { + "owner_address": "", + "chain_selector": "16015286601757825753" + }, + { + "owner_address": "", + "chain_selector": "3478487238524512106" + } + ] + }' + ``` + + The response includes the deployed wallet address and status for each chain: + + ```json + { + "wallets": [ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "org_id": "org-123", + "chain_selector": "16015286601757825753", + "owner_address": "0x1234...5678", + "wallet_address": "0xabcd...ef01", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + }, + { + "id": "8b2e1c4a-9f3d-4a7b-b6e8-1d2f3a4b5c6d", + "org_id": "org-123", + "chain_selector": "3478487238524512106", + "owner_address": "0x1234...5678", + "wallet_address": "0x9876...5432", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + } + ] + } + ``` + + Verify your wallets at any time: + + ```bash + curl https://ace.api.chain.link/v1/wallets \ + -H "Authorization: Apikey " + ``` + + For the full API schema and parameters, see the Coordinator API Reference. + + + + +## What happens next + +Your next step depends on what you need to do: + +| If you need to... | Next step | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| Enforce compliance policies on smart contracts | Deploy a PolicyEngine and integrate your contract. Continue to the [Policy Manager Quick Start](/ace/getting-started/policy-manager). | +| Manage cross-chain identities and issue credentials | Set up identity and credential registries. Continue to the [Identity Manager Quick Start](/ace/getting-started/identity-manager). | + +Many organizations do both. Start with whichever is most relevant to your first use case — the quick start guides cross-reference each other where the workflows intersect. diff --git a/src/content/ace/getting-started/identity-manager.mdx b/src/content/ace/getting-started/identity-manager.mdx new file mode 100644 index 00000000000..20af92c052e --- /dev/null +++ b/src/content/ace/getting-started/identity-manager.mdx @@ -0,0 +1,191 @@ +--- +section: ace +title: "Identity Manager Quick Start" +date: Last Modified +metadata: + description: "Get started as an Identity Manager with Chainlink ACE: create your account, set up identity and credential registries, register identities, issue credentials, and verify compliance via the Reporting Manager." + datePublished: "2026-04-06" + lastModified: "2026-05-26" +--- + +import { Aside, ClickToZoom, MethodTabs } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" + + + +This guide walks you through the **Identity Manager** — the ACE component for managing identity registries, registering cross-chain identities (CCIDs), and issuing credentials such as Proof of Identity, accreditation proofs, or sanctions clearance. By the end you will have identities registered and credentials issued on a supported network. + +### 1. Prerequisites + +- Familiarity with [Cross-Chain Identity](/ace/concepts/cross-chain-identity) concepts — CCIDs, credential registries, credential types, and credential sources +- **Must-read before proceeding:** [Signing & Ownership Model](/ace/concepts/signing-ownership) — understand how ACE manages keys, who owns what, and how the delegated trust model works + +### 2. Account setup + +Complete the [Account Setup](/ace/getting-started/account-setup) steps — organization creation, API key generation, and CRE Connect Wallet deployment — before proceeding. + +### 3. Set up your registries + +A **registry** is the top-level resource that groups an **identity registry** and a **credential registry**, deployed together on each chain you operate on. + +- The identity registry maps wallet addresses to cross-chain identities (CCIDs) +- The credential registry stores credential attestations linked to those CCIDs + +See [Managing Registries](/ace/guides/identity-manager/manage-registries) for full details. + + + + 1. In the [Chainlink App](https://app.chain.link), navigate to **Compliance > Identity Manager** in the left sidebar. + 1. Click the **Add a new registry** card. + 1. Enter a **Registry name** and optional **Description**, then click **Continue**. + 1. Select the networks you want to deploy the registry to, then click **Deploy registry**. ACE deploys the identity and credential registry contracts on each selected chain. + 1. Once deployed, click the **gear icon** next to the registry name to view the on-chain contract addresses for each identity and credential registry. + + + + Create a registry with a `POST` request: + + ```bash + curl -X POST "https://ace.api.chain.link/v1/registries" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "name": "My First Registry", + "description": "Identity and credential registries for my organization", + "identity_registries": [ + { "name": "Identity Registry - Sepolia", "description": "Identity registry on Ethereum Sepolia", "chain_selector": "16015286601757825753" }, + { "name": "Identity Registry - Arbitrum", "description": "Identity registry on Arbitrum Sepolia", "chain_selector": "3478487238524512106" } + ], + "credential_registries": [ + { "name": "Credential Registry - Sepolia", "description": "Credential registry on Ethereum Sepolia", "chain_selector": "16015286601757825753" }, + { "name": "Credential Registry - Arbitrum", "description": "Credential registry on Arbitrum Sepolia", "chain_selector": "3478487238524512106" } + ] + }' + ``` + + ACE deploys the identity and credential registry contracts on each specified chain. The response includes the registry `id` you will use in subsequent steps. + + + + +### 4. Define credential types + +Credential types represent the categories of attestation you issue — for example, Proof of Identity, accredited investor, or sanctions clearance. Each credential type is scoped to a specific registry and identified by a `credential_type` string that gets hashed on-chain to a `credential_type_hash`. This value is hashed using keccak256 — the standard cryptographic hash function used by Ethereum and EVM-compatible blockchains — and the resulting `credential_type_hash` is what gets recorded on-chain and referenced by policies. + + + + 1. In the [Chainlink App](https://app.chain.link), navigate to **Compliance > Identity Manager** and click on your registry card. + 1. Select the **Credential types** tab, then click **+ Add credential type**. + 1. In the drawer that opens, fill in: + - **Internal Display Name** — A label used by your team to identify and track this credential (not stored on-chain). + - **Credential** — The credential type string (e.g., `proof_of_identity_basic`). + - **Description** — Optional description. + 1. Click **Save**. + + + Create a credential type with a `POST` request. The `registry_id` was returned in the response when you created your registry. To retrieve it later, list your registries with `GET /registries`. + + ```bash + curl -X POST "https://ace.api.chain.link/v1/credential-types" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "registry_id": "", + "title": "KYC Verification", + "credential_type": "kyc_basic", + "description": "Basic KYC identity verification" + }' + ``` + + You can list existing credential types for a registry at any time: + + ```bash + curl -X GET "https://ace.api.chain.link/v1/credential-types?registry_id=a1b2c3d4-5678-9abc-def0-1234567890ab" \ + -H "Authorization: Apikey " + ``` + + + + +### 5. Register identities and issue credentials + +A cross-chain identity (CCID) aggregates one or more wallet addresses across EVM chains into a single logical entity. When you register an identity, you provide the on-chain addresses that belong to that entity and ACE writes the mapping into the identity registry on each relevant chain. + +A single CCID can span multiple chains and addresses — for example, one entity might have wallets on Ethereum, Arbitrum, and Avalanche that all resolve to the same CCID. + +Credentials are attestations linked to a registered identity. During Beta, ACE uses an **attestation-only** model — the Identity Manager asserts that a credential holds for a given CCID, and the credential registry records that attestation on-chain. + + + + The Platform UI lets you register an identity and assign credentials in a single flow: + + 1. In the [Chainlink App](https://app.chain.link), navigate to **Compliance > Identity Manager** and click on your registry card. + 1. Click **+ Add identity**. + 1. Fill in: + - **Alias** — An internal name for this identity. This is never written on-chain. + - **Metadata** — Optional internal reference data, also never written on-chain. + 1. Click **Continue**. + 1. Enter the wallet address(es) for the identity on each network where your registry is deployed. Click **Add more** to add multiple addresses per network or addresses on different networks. + 1. Click **Continue**. + 1. Assign credential types to this identity and set an expiration date for each credential. The expiration is optional — if omitted, the credential does not expire. + 1. Click **Deploy identity**. ACE registers the identity and issues the assigned credentials on-chain in one transaction. + + + + Register an identity and issue credentials in a single `POST` request by including the optional `credentials` array: + + ```bash + curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "My First Identity", + "entity_id": "user-12345", + "registry_id": "", + "description": "Test identity for getting started", + "onchain_identities": [ + { + "address": "0x1234567890abcdef1234567890abcdef12345678", + "chain_selector": "16015286601757825753" + } + ], + "credentials": [ + { + "credential_type_id": "", + "expires_at": 1800000000 + } + ] + }' + ``` + + The `credentials` array is optional — omit it to register an identity without credentials. Within each credential, `expires_at` is also optional (a Unix timestamp); if omitted, the credential does not expire. + + You can also issue credentials separately after the identity is created using `POST /credentials`. See [Managing Credentials](/ace/guides/identity-manager/manage-credentials) for details. + + + + + + +### 6. Verify via Reporting + +After issuing credentials, confirm they are visible and queryable through the **Reporting Manager**. The Reporting Manager provides a read-only view of all identities and credentials across your registries, which Policy Managers rely on when evaluating identity-based policies at transaction time. + +- Open the Reporting API to query credentials by identity, entity, or registry +- See [Reporting](/ace/concepts/reporting) for details on how reporting data flows into policy evaluation + +Once credentials appear in reporting, Policy Managers can reference them in identity-based policies such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy). + +### 7. What's next + +Explore the detailed guides for each Identity Manager workflow: + +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — add, update, and remove CCIDs and their on-chain address mappings +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — create and organize the credential categories your registry supports +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, revoke, and set expiration on credentials +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — view and manage your identity and credential registry deployments diff --git a/src/content/ace/getting-started/index.mdx b/src/content/ace/getting-started/index.mdx index aeb0e862606..ba95fd743de 100644 --- a/src/content/ace/getting-started/index.mdx +++ b/src/content/ace/getting-started/index.mdx @@ -2,19 +2,43 @@ section: ace title: "Getting Started with ACE" isIndex: true +date: Last Modified metadata: - description: "ACE (Automated Compliance Engine) is currently in private beta. Contact Chainlink to request access." - datePublished: "2026-04-20" + description: "Choose your onboarding path for Chainlink ACE: Policy Manager (enforce compliance on smart contracts), Identity Manager (manage cross-chain identities and credentials), or Reporting Manager (query compliance data)." + datePublished: "2026-03-31" + lastModified: "2026-04-15" --- -## Get Access to ACE +import { Aside } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" -Chainlink ACE is currently in **private beta**. To request access, schedule a demo, or learn more, [contact us](https://chain.link/contact). + -Once access is granted, you will be able to: +ACE offers three managers. Choose the path that matches what you need to do: -- Configure programmable compliance policies on your smart contracts using the **Policy Manager** -- Manage cross-chain identities and credentials using the **Identity Manager** -- Query onchain compliance state and transaction history using the **Reporting Manager** +|
Manager
| What it does | Get started | +| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| **Policy Manager** | Attach and configure compliance policies on smart contracts — volume limits, allowlists, RBAC, identity-based checks, and more | [Policy Manager Quick Start](/ace/getting-started/policy-manager) | +| **Identity Manager** | Manage identity registries, register cross-chain identities (CCIDs), and issue credentials such as Proof of Identity or accreditation attestations | [Identity Manager Quick Start](/ace/getting-started/identity-manager) | +| **Reporting Manager** | Query on-chain transaction history, policy configurations, and identity states via a read-only API for compliance verification | [Reporting concepts](/ace/concepts/reporting) — API Reference | -For an overview of ACE and its capabilities, see the [Overview](/ace) page and explore the [Core Concepts](/ace/concepts/architecture) section. +### Shared first step + +All three managers require **account setup** first — creating your organization, sharing your Org ID for enablement, generating an API key, and setting up [CRE Connect Wallets](/ace/concepts/key-terms#cre-connect-wallet): + +- [Account Setup](/ace/getting-started/account-setup) — the four steps every ACE user completes before using any manager + +### Not sure which Manager you need? + +- If you are a **token issuer or protocol team** deciding which compliance rules to enforce, start with the [Policy Manager Quick Start](/ace/getting-started/policy-manager). +- If you are an **identity provider (IDV)** or **credential issuer**, or **sanctions data provider** supplying data for others to consume, start with the [Identity Manager Quick Start](/ace/getting-started/identity-manager). +- Many organizations use **both managers**. Start with whichever is most relevant to your first use case — the guides cross-reference each other where the workflows intersect. + +### Background reading + +Before diving in, these pages provide essential context: + +- [Signing & Ownership Model](/ace/concepts/signing-ownership) — how ACE manages keys and the delegated and self-signing models +- [ACE Architecture](/ace/concepts/architecture) — system components and how they connect +- [Key Terms](/ace/concepts/key-terms) — ACE-specific terminology +- [Beta Scope](/ace/beta-scope) — what is and is not available during the Beta program diff --git a/src/content/ace/getting-started/policy-manager.mdx b/src/content/ace/getting-started/policy-manager.mdx new file mode 100644 index 00000000000..92f812497c8 --- /dev/null +++ b/src/content/ace/getting-started/policy-manager.mdx @@ -0,0 +1,277 @@ +--- +section: ace +title: "Policy Manager Quick Start" +date: Last Modified +metadata: + description: "Get started as a Policy Manager with Chainlink ACE: create your account, get your PolicyEngine address, integrate your smart contract, configure compliance policies, and test your first policy-protected transaction." + datePublished: "2026-04-15" + lastModified: "2026-05-26" +--- + +import { Aside, MethodTabs } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" + + + +This guide walks you through the **Policy Manager** — the ACE component for attaching and configuring compliance policies on smart contracts. By the end you will have a policy-protected contract running on a supported network. + +### 1. Prerequisites + +- Solidity basics +- **Must-read before proceeding:** [Signing & Ownership Model](/ace/concepts/signing-ownership) — understand how ACE manages keys, who owns what, and how the delegated trust model works + +### 2. Account setup + +Complete the [Account Setup](/ace/getting-started/account-setup) steps — organization creation, API key generation, and CRE Connect Wallet deployment — before proceeding. + +### 3. Create a PolicyEngine + +A **PolicyEngine** is the onchain contract that evaluates compliance rules on your smart contract. When you create a PolicyEngine, you also attach **extractors** — modules that decode transaction calldata so the PolicyEngine can evaluate policies against function arguments (sender, recipient, amount, etc.). + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager**. + 1. Click **Create a new engine**. + 1. Complete the three-step wizard: + - **Basic details** — enter an engine name and optional description. This metadata is internal and is not written onchain. + - **Networks** — select every chain where you want this engine deployed. Only networks enabled in your CRE account appear. Deploy a [CRE Connect Wallet](/ace/getting-started/account-setup#4-set-up-cre-connect-wallets) on each selected chain before creating the engine. + - **Contract types** — select **ERC-20** and/or **ERC-3643**. ACE attaches all pre-built extractors for the selected types automatically — you do not pick individual extractors in the UI. + 1. Submit the wizard and wait for onchain deployment to complete. + 1. Open the engine in Policy Manager and confirm its status is **Active**. Click the **gear icon** to copy the onchain PolicyEngine contract address for each network — you need these addresses in the next step. + + For full UI steps, see [Create a policy engine](/ace/guides/policy-manager/manage-engines#create-a-policy-engine). + + + + + + ACE Beta supports two contract types. Attach **all** extractors for your contract type at creation time so you don't have to add more later. + + #### Extractor IDs for API creation + + ##### ERC-20 extractors + + | Extractor | ID | Functions covered | + | -------------------------------------- | -------------------------------------- | --------------------------------------------------------------------- | + | ERC20TransferExtractor | `d4b8cd51-7d5a-487a-9ba5-bb7236e3184c` | `transfer(address,uint256)`, `transferFrom(address,address,uint256)` | + | ERC20ApproveExtractor | `572201bb-170b-4fda-ab89-a65b5bbc594b` | `approve(address,uint256)` | + | ComplianceTokenMintBurnExtractor | `245c24a9-6fdd-48e0-a418-725ed0b2056c` | `mint(address,uint256)`, `burnFrom(address,uint256)`, `burn(uint256)` | + | ComplianceTokenFreezeUnfreezeExtractor | `89df90a8-7f93-4ce1-9752-c0568062ae41` | `freeze(address,uint256,bytes)`, `unfreeze(address,uint256,bytes)` | + | ComplianceTokenForceTransferExtractor | `c360c6f1-1df5-43b3-bd53-ad7d4c0bba54` | `forceTransfer(address,address,uint256,bytes)` | + + ##### ERC-3643 extractors + + | Extractor | ID | Functions covered | + | -------------------------------- | -------------------------------------- | -------------------------------------------------------------------------------- | + | ERC20TransferExtractor | `d4b8cd51-7d5a-487a-9ba5-bb7236e3184c` | `transfer(address,uint256)`, `transferFrom(address,address,uint256)` | + | ERC20ApproveExtractor | `572201bb-170b-4fda-ab89-a65b5bbc594b` | `approve(address,uint256)` | + | ERC3643MintBurnExtractor | `f17bbe8b-8462-4dd7-8fb7-a4973dff04fc` | `mint(address,uint256)`, `burn(address,uint256)` | + | ERC3643FreezeUnfreezeExtractor | `a6422540-76fb-46bc-90e2-16cc7b0aaa1e` | `freezePartialTokens(address,uint256)`, `unfreezePartialTokens(address,uint256)` | + | ERC3643SetAddressFrozenExtractor | `bd80dda1-fa6c-4028-a26e-a1802ae41ec7` | `setAddressFrozen(address,bool)` | + | ERC3643ForcedTransferExtractor | `d9015eeb-3345-478f-b2f1-2194b6689078` | `forcedTransfer(address,address,uint256)` | + + + + Use `POST /policy-engines` with the `extractor_ids` for your contract type. Deploy on all available networks upfront to avoid additional updates later (see [Supported Networks](/ace/supported-networks) for chain selectors). + + **For an ERC-20 contract:** + + ```bash + curl -X POST https://ace.api.chain.link/v1/policy-engines \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "name": "My Policy Engine", + "description": "Policy engine for my ERC-20 token", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b", + "245c24a9-6fdd-48e0-a418-725ed0b2056c", + "89df90a8-7f93-4ce1-9752-c0568062ae41", + "c360c6f1-1df5-43b3-bd53-ad7d4c0bba54" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' + ``` + + **For an ERC-3643 contract:** + + ```bash + curl -X POST https://ace.api.chain.link/v1/policy-engines \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "name": "My Policy Engine", + "description": "Policy engine for my ERC-3643 token", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b", + "f17bbe8b-8462-4dd7-8fb7-a4973dff04fc", + "a6422540-76fb-46bc-90e2-16cc7b0aaa1e", + "bd80dda1-fa6c-4028-a26e-a1802ae41ec7", + "d9015eeb-3345-478f-b2f1-2194b6689078" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' + ``` + + The response includes the PolicyEngine `id` and the onchain addresses for each chain: + + ```json + { + "id": "28755f4d-81c4-4df8-b424-a65782704d89", + "name": "My Policy Engine", + "type": "standard", + "chain_selectors": [ + "16015286601757825753", + "3478487238524512106", + "14767482510784806043", + "16281711391670634445", + "10344971235874465080" + ], + "onchain_policy_engines": [ + { + "id": "a3f7c2e1-9b04-4d6a-8e5f-1c2d3e4f5a6b", + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678", + "status": "creation_pending" + }, + { + "id": "b4e8d3f2-0c15-4e7b-9f6a-2d3e4f5a6b7c", + "chain_selector": "3478487238524512106", + "address": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd", + "status": "creation_pending" + } + // ... one entry per chain + ], + "extractor_registrations": [], + "created_at": 1775580000, + "updated_at": 1775580000 + } + ``` + + + + +#### Verify deployment + +The PolicyEngine and its extractors start with `"creation_pending"` / `"inactive"` status while the onchain transactions are processed. Poll until everything is ready: + +```bash +curl https://ace.api.chain.link/v1/policy-engines/ \ + -H "Authorization: Apikey " +``` + +Check two things in the response: + +1. **PolicyEngine deployed** — Every entry in `onchain_policy_engines` shows `"status": "created"`. +1. **Extractors active** — Every entry in `extractor_registrations[].onchain_extractor_registrations` shows `"status": "active"`. + +In the Platform UI, confirm the engine status is **Active** and extractors appear in the engine settings page. + + + +#### Save the PolicyEngine addresses + +Copy the `address` value from each entry in `onchain_policy_engines` — or from the engine settings page in the UI — you need these addresses to deploy or upgrade your smart contract in the next step. Each chain has a different PolicyEngine contract address. + +### 4. Integrate your contract + +See [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) for a full overview of what your contract needs. In short: + +- Inherit from `PolicyProtected` (or `PolicyProtectedUpgradeable` for upgradeable contracts) +- Add the `runPolicy` modifier to the functions you want to protect +- Pass the PolicyEngine address during deployment or initialization + +**Choose your path:** + +#### New contract + +If you are building a new token or contract from scratch, ACE provides reference implementations you can use as a starting point: + +- **ERC-20** — see [Building an ERC-20 Compliance Token](/ace/guides/policy-manager/contracts/erc20-token) for the full guide +- **ERC-3643** — see [Building an ERC-3643 Compliance Token](/ace/guides/policy-manager/contracts/erc3643-token) for the full guide + +#### Existing contract + +If you have an already-deployed contract you want to add ACE compliance to, this involves modifying your implementation contract, testing, and executing a proxy upgrade. This is typically the longest step in the onboarding process. + +- See [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) for the step-by-step guide +- Non-upgradeable contracts require alternative approaches — contact your Chainlink representative for guidance + +### 5. Register your contract as a target + +After deploying your contract, register it as a target under your PolicyEngine. Provide the contract name, type, protected methods, and on-chain addresses for each chain where the contract is deployed. + +```bash +curl -X POST https://ace.api.chain.link/v1/targets \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token", + "description": "Production ERC-20 token with compliance enforcement", + "policy_engine_id": "", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + #[any other methods you want to protect] + ], + "desired_default_allow": true, + "metadata": {"contract_type": "ERC-20"}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0xYourContractAddressOnSepolia" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xYourContractAddressOnArbitrumSepolia" + }, + #[any other chains where your contract is deployed] + ] + }' +``` + +Include an entry in `onchain_targets` for every chain where you deployed the contract. Once registered, your target appears in the ACE Platform dashboard under your policy engine. + +For a full description of all fields and options, see [Managing Targets](/ace/guides/policy-manager/manage-targets#register-a-target). + +### 6. Post-setup checklist + +Before creating policies, confirm that every component is in the expected state. You can verify each of these with a single API call. + +|
Check
| What to look for | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------- | +| CRE Connect Wallets created | `GET /wallets` — every wallet shows `"status": "created"` | +| PolicyEngine deployed | `GET /policy-engines/` — every `onchain_policy_engines[].status` is `"created"` | +| Extractors active | Same response — every `extractor_registrations[].onchain_extractor_registrations[].status` is `"active"` | +| Contract visible in platform | Your target contract appears in the ACE Platform dashboard | + +### 7. Create and configure policies + +From the UI or API, create policy instances and attach them to your contract's protected functions. See [Managing Policies](/ace/guides/policy-manager/manage-policies) for creating and configuring policies, then [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) for attaching them to specific functions on your contracts. + +### 8. Test it + +Make a transaction against your protected contract, verify the policy enforces correctly, and check the results in the [Reporting Manager](/ace/concepts/reporting). diff --git a/src/content/ace/guides/identity-manager/external-registries.mdx b/src/content/ace/guides/identity-manager/external-registries.mdx new file mode 100644 index 00000000000..3b8d682a009 --- /dev/null +++ b/src/content/ace/guides/identity-manager/external-registries.mdx @@ -0,0 +1,153 @@ +--- +section: ace +title: "External Registries" +date: Last Modified +metadata: + description: "Share ACE identity and credential registries across organizations. Grant another organization read access to your registry, discover registries shared with you, and use them as credential sources in your policies." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside, MethodTabs } from "@components" + +**External registries** let one organization reuse another organization's [registry](/ace/guides/identity-manager/manage-registries) without re-issuing identities or credentials. The registry owner grants a second organization **read access**, and that organization can then reference the registry's identities and credentials — for example, to enforce KYC in its own policies using a KYC provider's registry. + +Access is granted per registry, is **read-only** for the recipient, and can be revoked at any time. + +## Roles and concepts + +|
Term
| Meaning | +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Grantor** | The organization that **owns** the registry and grants access to it. | +| **Grantee** | The organization that **receives** read access to the registry. | +| **Access grant** | The link between a registry and a grantee organization. It is either `active` or `revoked`. | +| **Org ID** | The identifier of an organization. The grantee shares theirs with the grantor so the grantor can grant access. Retrieve it with `GET /organizations/me` (Coordinator API). | +| **`access_type`** | A field on a registry indicating whether the caller `owned` it or was `granted` access to it. | + +## What the grantee can and cannot do + +An active grant gives the grantee **read access** to the registry: + +- **Can** list and view the registry, and read its [credential types](/ace/guides/identity-manager/manage-credential-types), [identities](/ace/guides/identity-manager/manage-identities), and [credentials](/ace/guides/identity-manager/manage-credentials). +- **Can** reference the registry's on-chain contracts as a credential source in its own [identity-validation policies](/ace/reference/policy-library/credential-registry-identity-validator-policy). +- **Cannot** write to the registry — registering identities, issuing credentials, or changing configuration remains exclusive to the grantor. + + + +## Grant access to another organization + +Granting access requires the grantee's **Org ID**. Ask the grantee to retrieve it and share it with you: + +```bash +# Run by the grantee — returns their organization, including its id +curl https://ace.api.chain.link/v1/organizations/me \ + -H "Authorization: Apikey " +``` + +As the registry owner, create the grant: + +```bash +curl -X POST https://ace.api.chain.link/v1/registries//access-grants \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "grantee_org_id": "org-456" + }' +``` + +The response is the created grant: + +```json +{ + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1800000000, + "revoked_at": null +} +``` + +## View who has access + +List the active and past grants for a registry you own: + +```bash +curl https://ace.api.chain.link/v1/registries//access-grants \ + -H "Authorization: Apikey " +``` + +Each entry includes the grantee, the status (`active` or `revoked`), and the `granted_at` / `revoked_at` timestamps, giving you an audit trail of who was granted access and when. + +## Use a registry shared with you + +As a grantee, include `include_granted=true` when listing registries to see registries other organizations have shared with you, alongside your own: + +```bash +curl "https://ace.api.chain.link/v1/registries?include_granted=true" \ + -H "Authorization: Apikey " +``` + +Each registry in the response carries an **`access_type`** field: + +- `"owned"` — your organization owns the registry. +- `"granted"` — another organization (shown in `org_id`) granted you access. + +Once you can see a granted registry, you use it the same way you would reference any credential source: + +1. Read the registry to get the on-chain **identity registry** and **credential registry** contract addresses per chain, and read its **credential types** to get the `credential_type_hash` values you need. +1. Add those addresses and credential type hashes as a **credential source** on your [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) or [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) instance. + +Your policy then validates credentials issued by the other organization at transaction time. Because the grant is read-only, you rely on the grantor to keep the credentials current; if they revoke a credential, your policy sees the change immediately. + + + +## Revoke access + +As the registry owner, revoke a grant by setting its status to `revoked`. Identify the grant by the grantee's Org ID: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/registries//access-grants/org-456 \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "revoked" + }' +``` + +Revocation takes effect immediately. The grant record is retained with a `revoked_at` timestamp for audit purposes rather than deleted, so the history of grants and revocations is preserved. To restore access later, create a new grant. + +## What happens when access is revoked + +Revoking a registry access grant is a **platform-level action only** — it removes the registry from the grantee's view in the ACE Platform (UI and API). The grantee can no longer browse the registry, read its credentials, or reference it in new policy configurations. + +**Onchain, nothing changes automatically.** If the grantee's policies already reference the revoked registry's onchain contracts as a credential source, those policies continue to validate credentials from that registry at transaction time. The onchain policy contracts have no awareness of platform-level access grants — they only know the registry contract addresses that were configured as credential sources. + +### What each party should do + +**Grantor** — After revoking access, be aware that the grantee's existing policies may still reference your registry onchain. + +**Grantee** — After a grant is revoked, the ACE Platform displays a warning on any policy instance that references a source from the revoked registry. You should remove the revoked registry source from your policy configuration to ensure your compliance setup reflects the current state of your access agreements. Until you remove it: + +- The policy continues to validate credentials from the revoked registry onchain. +- You cannot edit the revoked source — you can only remove it. +- You cannot reference the revoked registry in new policy configurations. + + + +## Related pages + +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — create and manage the registries you own +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — CCIDs, registries, and credential sources +- [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — reference a registry as a credential source +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — configure policy instances and their credential sources +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/identity-manager/index.mdx b/src/content/ace/guides/identity-manager/index.mdx new file mode 100644 index 00000000000..6295cf1dcb9 --- /dev/null +++ b/src/content/ace/guides/identity-manager/index.mdx @@ -0,0 +1,27 @@ +--- +section: ace +title: "Identity Manager Guides" +isIndex: true +date: Last Modified +metadata: + description: "Operational guides for Identity Managers using Chainlink ACE: manage registries, register cross-chain identities, define credential types, and issue credentials." + datePublished: "2026-04-06" + lastModified: "2026-04-06" +--- + +import { Aside } from "@components" + +These guides cover the day-to-day operations of an Identity Manager — from setting up registries to issuing and managing credentials across chains. + + + +## Available guides + +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — create, view, import, and archive identity and credential registry pairs +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — register cross-chain identities (CCIDs), map wallet addresses across chains, and manage identity lifecycle +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — define the categories of credentials your registry supports (e.g., KYC, accreditation, sanctions clearance) +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, renew, revoke, and set expiration on credentials using the attestation model +- [External Registries](/ace/guides/identity-manager/external-registries) — share a registry with another organization, and use registries shared with you as credential sources diff --git a/src/content/ace/guides/identity-manager/manage-credential-types.mdx b/src/content/ace/guides/identity-manager/manage-credential-types.mdx new file mode 100644 index 00000000000..1b8f8c5882e --- /dev/null +++ b/src/content/ace/guides/identity-manager/manage-credential-types.mdx @@ -0,0 +1,167 @@ +--- +section: ace +title: "Managing Credential Types" +date: Last Modified +metadata: + description: "Define, view, and manage credential types in Chainlink ACE using the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +Credential types define the categories of attestations you can issue to [cross-chain identities (CCIDs)](/ace/concepts/cross-chain-identity). Each credential type represents a distinct kind of verification — for example, KYC completion, accredited investor status, or sanctions clearance. When you create a credential type, the `credential_type` string you provide is hashed to produce a `credential_type_hash` that policy contracts reference on-chain. + +Credential types are scoped to a specific credential registry. Before creating credential types, make sure your [registries are set up](/ace/guides/identity-manager/manage-registries). + +A credential type can optionally be linked to a **data schema**, which lets the credentials you issue against it carry structured data (for example, a jurisdiction code). See [Typed credentials with data schemas](#typed-credentials-with-data-schemas) below. + +## What is a credential type? + +A credential type is a string you define to represent a specific compliance check or verification. This string is hashed and registered on-chain, so it cannot be changed after creation. You can create any credential types that match your requirements — for example: + +| Credential type string | Use case | +| ---------------------- | -------------------------------------- | +| `PROOF_OF_IDENTITY` | Identity verification | +| `PROOF_OF_FUNDS` | Source of funds or reserves check | +| `AML_CHECK` | Anti-money-laundering screening result | + +The `credential_type` string is case-sensitive and must be unique within a registry. + +## Define a credential type + +Register a credential type with a `POST` request: + +```bash +curl -X POST "https://ace.api.chain.link/v1/credential-types" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "registry_id": "", + "title": "KYC Verification", + "credential_type": "KYC", + "description": "Basic Know Your Customer identity verification" + }' +``` + +The response includes the generated `credential_type_id` and the `credential_type_hash` derived from your `credential_type` string. + +## Understand credential type hashes + +When you create a credential type, ACE hashes the `credential_type` string to produce a deterministic `credential_type_hash`. This hash is what gets written on-chain and what policy contracts use when evaluating identity-based rules. + +```text +credential_type string → credential_type_hash → on-chain reference +"KYC" → 0x7a8b...3f21 → used by policy contracts +``` + +Because the hash is derived from the string, choosing your `credential_type` strings carefully matters — they cannot be changed after creation. Policy contracts such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy) reference credentials by their `credential_type_hash` when checking whether an identity holds a required attestation. + + + +## Typed credentials with data schemas + +By default, credentials are **attestation-only**: they record that an identity holds a credential of a given type, with no additional data. You can instead create a **typed** credential type by linking it to a **data schema**. Credentials issued against a typed credential type carry structured data (validated against the schema), which policies can then evaluate through a [Data Validator](/ace/guides/policy-manager/manage-data-validators). + +A **data schema** is a reusable definition of the shape and format of a credential's data. ACE provides shared, ready-to-use schemas — the first is an [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code schema for jurisdiction use cases (an array of two-letter country codes such as `US`, `CA`, `GB`). + +To make a credential type typed, pass a `data_schema_id` when you create it. The ISO 3166-1 alpha-2 country code data schema ID is: + +```text +fb786cd7-6397-4ac6-790c-35746f343cad +``` + +```bash +curl -X POST "https://ace.api.chain.link/v1/credential-types" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "registry_id": "", + "title": "Jurisdiction", + "credential_type": "common.country", + "description": "Holder jurisdiction as ISO 3166-1 alpha-2 country codes", + "data_schema_id": "fb786cd7-6397-4ac6-790c-35746f343cad" + }' +``` + +Once a credential type is linked to a data schema, every credential you issue against it **must** include `credential_data` matching that schema — see [Issue a credential with data](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + + + +## View credential types + +List credential types with a `GET` request. Use the `registry_id` query parameter to filter by registry: + +```bash +curl "https://ace.api.chain.link/v1/credential-types?registry_id=&page=1&page_size=25" \ + -H "Authorization: Apikey " +``` + +To retrieve a single credential type by ID: + +```bash +curl "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " +``` + +## Update a credential type + +You can update a credential type's **title** and **description**. The `credential_type` string and `credential_type_hash` cannot be changed. + +Update a credential type with a `PUT` request: + +```bash +curl -X PUT "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "KYC Verification (Enhanced)", + "description": "Enhanced KYC verification including document and liveness checks" + }' +``` + +You can also make partial updates with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "description": "Updated description for KYC verification" + }' +``` + +## Archive a credential type + +Archiving a credential type prevents new credentials of that type from being issued. Existing credentials remain valid until they are individually archived or expire. + + + +Archive a credential type with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "status": "archived" + }' +``` + +If active credentials still reference the type, the request returns an error. Archive all associated credentials first, then retry. + +## Related resources + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — conceptual overview of CCIDs, registries, and credential types +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, revoke, and manage credentials linked to CCIDs +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — view and manage identity and credential registry deployments +- [Credential Registry Identity Validator Policy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy contract that checks credentials on-chain diff --git a/src/content/ace/guides/identity-manager/manage-credentials.mdx b/src/content/ace/guides/identity-manager/manage-credentials.mdx new file mode 100644 index 00000000000..09043249a12 --- /dev/null +++ b/src/content/ace/guides/identity-manager/manage-credentials.mdx @@ -0,0 +1,219 @@ +--- +section: ace +title: "Managing Credentials" +date: Last Modified +metadata: + description: "Issue, renew, revoke, and manage credentials in Chainlink ACE using the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +Credentials are attestations that a [cross-chain identity (CCID)](/ace/concepts/cross-chain-identity) holds a specific qualification — for example, KYC verification, accredited investor status, or sanctions clearance. Each credential links a **credential type** to an **identity** and is recorded on-chain across every chain where the credential registry is deployed. + +This guide covers the full credential lifecycle: issuing, viewing, updating, expiring, and revoking credentials through the Coordinator API. + +## Attestation vs. typed credentials + +ACE supports two kinds of credentials: + +- **Attestation-only** (the default) — The credential records only that an identity holds a credential of a given type, with no additional data. When you issue one, the on-chain record contains just the **credential type hash**, the **identity** (CCID) it is issued to, and an **issuance timestamp**. Policies verify existence — for example, "does this address have a valid KYC credential?" — without accessing any personally identifiable information (PII). +- **Typed** — When the credential type is linked to a [data schema](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas), the credential also carries structured `credential_data` (for example, a jurisdiction code). Policies can then evaluate the contents through a [Data Validator](/ace/guides/policy-manager/manage-data-validators), not just the credential's existence. + +In both cases, no PII should be stored on-chain — credential data must be a minimal, non-sensitive value (such as an ISO country code) or a hash. For a deeper discussion of credential data and privacy, see [Credential Data and Privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). + +## Issue a credential + +To issue a credential, you need a registered [identity](/ace/guides/identity-manager/manage-identities) and at least one [credential type](/ace/guides/identity-manager/manage-credential-types) defined in your registry. + + + +Issue a credential with a `POST` request: + +```bash +curl -X POST "https://ace.api.chain.link/v1/credentials" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "credential_type_id": "", + "identity_id": "", + "external_unique_id": "kyc-2026-04-acme", + "expires_at": 1806883200 + }' +``` + +| Field | Required | Description | +| -------------------- | -------- | ------------------------------------------------------------ | +| `credential_type_id` | Yes | UUID of the credential type to issue | +| `identity_id` | Yes | UUID of the target identity (CCID) | +| `external_unique_id` | No | Your own reference identifier for this credential | +| `expires_at` | No | Unix timestamp (integer); omit for a non-expiring credential | + +## Issue a credential with data + +When the credential type is linked to a [data schema](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas), include a `credential_data` field. The value must match the schema — for the [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code schema, that is a JSON array of two-letter country codes. ACE validates the data against the schema and encodes it on-chain. + +```bash +curl -X POST "https://ace.api.chain.link/v1/credentials" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "credential_type_id": "", + "identity_id": "", + "credential_data": ["US"], + "external_unique_id": "jurisdiction-2026-04-acme", + "expires_at": 1806883200 + }' +``` + + + +Once issued, the credential data can be enforced at transaction time by attaching a [Data Validator](/ace/guides/policy-manager/manage-data-validators) to the credential source of an identity-validation policy. + +## Issue credentials during identity creation + +You can issue credentials inline when registering a new identity by including a `credentials` array in the `POST /identities` request body. This is useful when you have completed verification before registration and want to create the identity and its credentials in a single call. + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Acme Corp Treasury", + "entity_id": "acme-corp-001", + "registry_id": "", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678" + } + ], + "credentials": [ + { + "credential_type_id": "", + "external_unique_id": "kyc-2026-04-acme", + "expires_at": 1806883200 + }, + { + "credential_type_id": "" + } + ] + }' +``` + +Each entry in the `credentials` array follows the same schema as the standalone `POST /credentials` endpoint, except that `identity_id` is inferred from the identity being created. See [Managing Identities](/ace/guides/identity-manager/manage-identities) for the full identity creation reference. + +## View and filter credentials + +List credentials with a `GET` request. All query parameters are optional: + +```bash +curl "https://ace.api.chain.link/v1/credentials?credential_type_id=&page=1&page_size=25" \ + -H "Authorization: Apikey " +``` + +| Parameter | Description | +| -------------------- | --------------------------------------------------- | +| `credential_type_id` | Filter by credential type | +| `identity_id` | Filter by identity | +| `entity_id` | Filter by entity | +| `registry_id` | Filter by registry | +| `include_onchains` | Include on-chain deployment details in the response | +| `page` | Page number (default: 1) | +| `page_size` | Results per page | + +To retrieve a single credential by its ID: + +```bash +curl "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " +``` + +## Credential expiration + +The `expires_at` field controls whether a credential has a limited validity period. + +- **No expiration** — Omit `expires_at` when issuing. The credential remains valid indefinitely until explicitly archived. +- **With expiration** — Provide a Unix timestamp (integer). Once the timestamp passes, policy checks that require this credential type will treat the credential as invalid. + +To **renew** an expiring credential, update it with a new `expires_at` value (see the next section). Alternatively, you can archive the expired credential and issue a new one. + + + +## Update a credential + +You can update a credential's `external_unique_id` and `expires_at` fields. You **cannot** change the credential type or the associated identity — to change either, archive the credential and issue a new one. + +Update a credential with a `PUT` request: + +```bash +curl -X PUT "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "external_unique_id": "kyc-2026-04-acme-renewed", + "expires_at": 1838419200 + }' +``` + +| Field | Required | Description | +| -------------------- | -------- | ------------------------------------------------- | +| `external_unique_id` | Yes | Updated reference identifier | +| `expires_at` | No | New expiration timestamp; omit to leave unchanged | + +You can also perform a partial update with `PATCH`. The `PATCH` endpoint accepts `external_unique_id` and `expires_at` independently, but you **cannot** combine field updates with a status change in the same request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "expires_at": 1838419200 + }' +``` + +## Revoke (archive) a credential + +Archiving a credential removes it from the on-chain credential registry. After archival, policy contracts will no longer see this credential — any policy that requires it (such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy)) will reject transactions from the associated addresses. + +Common reasons to revoke a credential: + +- KYC verification expired or failed re-verification +- Sanctions status changed +- Accreditation lapsed +- Entity relationship terminated + +Archive a credential with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "status": "archived" + }' +``` + + + +## Related resources + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — CCID model, credential registries, and the attestation lifecycle +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — register and manage CCIDs and their on-chain address mappings +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — create and organize the credential categories your registry supports +- [Credential Registry Identity Validator Policy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy that checks credentials at transaction time +- [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators) — enforce rules on credential data at transaction time +- [Beta Scope](/ace/beta-scope) — current scope and limitations diff --git a/src/content/ace/guides/identity-manager/manage-identities.mdx b/src/content/ace/guides/identity-manager/manage-identities.mdx new file mode 100644 index 00000000000..617b8d5e468 --- /dev/null +++ b/src/content/ace/guides/identity-manager/manage-identities.mdx @@ -0,0 +1,332 @@ +--- +section: ace +title: "Managing Identities" +date: Last Modified +metadata: + description: "Register, update, and manage cross-chain identities (CCIDs) in Chainlink ACE using the Platform UI or the Coordinator API." + datePublished: "2026-03-31" + lastModified: "2026-04-06" +--- + +import { Aside, MethodTabs } from "@components" + +This guide covers how to register, view, update, and archive cross-chain identities (CCIDs) using the ACE Platform UI or the Coordinator API. Identities are the foundation of ACE's credential system — every credential is issued against an identity. + + + +## What are identities (CCIDs)? + +A **cross-chain identity (CCID)** aggregates multiple wallet addresses across EVM chains into a single logical entity. Rather than treating each address on each chain as a separate user, ACE maps them all to one CCID. Credentials issued against that CCID are then valid for every linked address on every chain — no re-issuance or bridging required. + +Each identity includes: + +- **Title** — A human-readable label for internal use only (e.g., "Jane Doe"). This value is never written on-chain. +- **Entity ID** — A unique external identifier that ties the identity back to your system of record (e.g., a KYC provider user ID). This value must be unique within a registry. +- **Registry** — The registry the identity belongs to. +- **On-chain identities** — One or more wallet address + chain selector pairs that map to this CCID on-chain. + +For a deeper look at how CCIDs work, how they are generated, and the privacy considerations involved, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + +## Register an identity + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Identity Manager** and click on the registry you want to add an identity to. + 1. In the **Identities** tab, click **+ Add identity**. + 1. **Step 1 — Identity details:** Enter an alias and optional description for this identity. This metadata is for internal use only and is never written on-chain. + 1. **Step 2 — Add wallets:** Add the wallet address(es) for this identity on each chain where you need them. Your registry must be deployed on these chains. + 1. **Step 3 — Assign credentials (optional):** Optionally assign credentials to this identity, along with an optional expiration date for each. + + + Send a `POST` request to `/identities`: + + ```bash + curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Jane Doe", + "entity_id": "jane-doe-001", + "registry_id": "a1b2c3d4-5678-9abc-def0-1234567890ab", + "description": "Jane Doe's multi-chain wallets", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" + } + ] + }' + ``` + + You can also issue credentials inline at creation time by including a `credentials` array. This is useful when you already have the credential types and want to skip a separate issuance step: + + ```bash + curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Jane Doe", + "entity_id": "jane-doe-001", + "registry_id": "a1b2c3d4-5678-9abc-def0-1234567890ab", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678" + } + ], + "credentials": [ + { + "credential_type_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef", + "expires_at": 1800000000 + } + ] + }' + ``` + + See [Managing Credentials](/ace/guides/identity-manager/manage-credentials) for the full credential issuance workflow. + + + + +## Bulk import identities + +When onboarding many users at once, use the batch endpoint to create multiple identities in a single atomic request. Each identity in the batch follows the same schema as the single-create endpoint, including the optional `credentials` array — so you can register identities and issue credentials in one call. + +This feature is **API-only**. In the Platform UI, the **Bulk import via API** option under **+ Add identity** links to this documentation. + +Send a `POST` request to `/identities/batch`: + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities/batch" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "identities": [ + { + "title": "Identity A", + "entity_id": "user-001", + "registry_id": "", + "onchain_identities": [ + { + "address": "0x1111111111111111111111111111111111111111", + "chain_selector": "16015286601757825753" + } + ], + "credentials": [ + { + "credential_type_id": "", + "expires_at": 1800000000 + } + ] + }, + { + "title": "Identity B", + "entity_id": "user-002", + "registry_id": "", + "onchain_identities": [ + { + "address": "0x2222222222222222222222222222222222222222", + "chain_selector": "16015286601757825753" + }, + { + "address": "0x3333333333333333333333333333333333333333", + "chain_selector": "3478487238524512106" + } + ] + } + ] + }' +``` + +The `credentials` array is optional on each identity. The second identity in this example is created without credentials. + + + +## View and search identities + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Identity Manager** and click on the registry you want to browse. + 1. The **Identities** tab displays a list of all identities with their alias, CCID, and the networks they are deployed on. You can search by name or filter by network using the controls at the top. + 1. Click on any identity to view its details: + - **Credentials** — the credentials assigned to this identity. + - **Wallets** — the wallet addresses registered for this identity on each network. + + + Send a `GET` request to `/identities`: + + ```bash + curl -X GET "https://ace.api.chain.link/v1/identities?page=1&page_size=25&include_onchains=true" \ + -H "Authorization: Apikey " + ``` + + To search for identities by title, use the `query` parameter: + + ```bash + curl -X GET "https://ace.api.chain.link/v1/identities?query=jane&include_onchains=true" \ + -H "Authorization: Apikey " + ``` + + To retrieve a specific identity by ID: + + ```bash + curl -X GET "https://ace.api.chain.link/v1/identities/98765432-10fe-dcba-9876-543210fedcba" \ + -H "Authorization: Apikey " + ``` + + + + +## Update an identity + +You can update an identity's title, description, and on-chain address mappings. ACE offers two update approaches: full replacement and partial update. + + + + 1. Open the identity detail page (see [View and search identities](#view-and-search-identities) above). + 1. Click the **Edit** button next to the alias name. + 1. A drawer opens where you can edit the alias and description. + + + + + + ### Full update (PUT) + + A `PUT` request replaces the identity's mutable fields entirely. The `onchain_identities` array you provide becomes the complete set of address mappings — any existing mappings not included in the request are removed. + + ```bash + curl -X PUT "https://ace.api.chain.link/v1/identities/98765432-10fe-dcba-9876-543210fedcba" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Jane Doe (Updated)", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" + }, + { + "chain_selector": "10344971235874465080", + "address": "0x5555555555555555555555555555555555555555" + } + ] + }' + ``` + + + + ### Partial update (PATCH) + + A `PATCH` request updates only the fields you include. Use this when you want to change the title or description without touching the on-chain mappings. + + ```bash + curl -X PATCH "https://ace.api.chain.link/v1/identities/98765432-10fe-dcba-9876-543210fedcba" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Jane Doe — Primary", + "description": "Updated description for primary treasury wallets" + }' + ``` + + + + + + +## Cross-chain identity mapping + +A single CCID can span as many chains and addresses as needed. This is the core value proposition of ACE's identity model: one credential verification applies everywhere. + +For example, an entity operating wallets on Ethereum Sepolia, Arbitrum Sepolia, and Base Sepolia would have a single identity with three on-chain mappings: + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Multi-Chain Operator", + "entity_id": "operator-xyz-007", + "registry_id": "a1b2c3d4-5678-9abc-def0-1234567890ab", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "chain_selector": "10344971235874465080", + "address": "0xcccccccccccccccccccccccccccccccccccccccc" + } + ] + }' +``` + +| Chain | Chain Selector | Address | +| :--------------- | :--------------------- | :-------------- | +| Ethereum Sepolia | `16015286601757825753` | `0xaaaa...aaaa` | +| Arbitrum Sepolia | `3478487238524512106` | `0xbbbb...bbbb` | +| Base Sepolia | `10344971235874465080` | `0xcccc...cccc` | + +All three addresses resolve to the same CCID. A credential issued against this identity — such as a KYC attestation — is valid for all three addresses across all three chains. When any of these addresses interacts with a policy-protected contract, the policy resolves the address to the shared CCID and checks credentials from there. + +To add or remove chains later, use the [full update (PUT)](#full-update-put) endpoint with the updated list of on-chain identities. + +## Archive an identity + +Archiving marks an identity as inactive. Archived identities are retained for audit purposes but are no longer considered active. + + + + + + + Send a `PATCH` request with the `status` field: + + ```bash + curl -X PATCH "https://ace.api.chain.link/v1/identities/98765432-10fe-dcba-9876-543210fedcba" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "status": "archived" + }' + ``` + + + + + diff --git a/src/content/ace/guides/identity-manager/manage-registries.mdx b/src/content/ace/guides/identity-manager/manage-registries.mdx new file mode 100644 index 00000000000..7fb2f0f5982 --- /dev/null +++ b/src/content/ace/guides/identity-manager/manage-registries.mdx @@ -0,0 +1,260 @@ +--- +section: ace +title: "Managing Registries" +date: Last Modified +metadata: + description: "Create, view, and manage identity and credential registries in Chainlink ACE using the Platform UI or the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-04-06" +--- + +import { Aside, MethodTabs } from "@components" + +## What are registries? + +A **registry** in ACE is the top-level organizational unit for the Identity Manager. Each registry bundles two types of sub-registries: + +- **Identity registries** — map wallet addresses to [Cross-Chain Identifiers (CCIDs)](/ace/concepts/cross-chain-identity#the-cross-chain-identifier-ccid). +- **Credential registries** — manage the lifecycle of credentials linked to CCIDs. + +Each sub-registry corresponds to a smart contract deployed on a specific blockchain. A single registry can span multiple chains by including sub-registries on each target network. For a deeper explanation of the registry model and how it fits into the identity lifecycle, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + +## Create a registry + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Identity Manager** in the left sidebar. + 1. Click **Add a new registry**. + 1. **Step 1 — Registry details:** Set your registry's name and description. + 1. **Step 2 — Select networks:** Choose the networks you want your registry to be deployed to. + 1. Click **Deploy registry**. + + + Use the Coordinator API to create a registry with identity and credential sub-registries. Each entry in `identity_registries` and `credential_registries` specifies a `chain_selector` for the target network (see [Supported Networks](/ace/supported-networks) for chain selector values). + + This example creates a registry with sub-registries on Ethereum Sepolia and Arbitrum Sepolia: + + ```bash + curl -X POST https://ace.api.chain.link/v1/registries \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Production Identity Registry", + "description": "Identity and credential registries for compliance verification", + "identity_registries": [ + { "name": "Identity Registry - Sepolia", "description": "Identity registry on Ethereum Sepolia", "chain_selector": "16015286601757825753" }, + { "name": "Identity Registry - Arbitrum", "description": "Identity registry on Arbitrum Sepolia", "chain_selector": "3478487238524512106" } + ], + "credential_registries": [ + { "name": "Credential Registry - Sepolia", "description": "Credential registry on Ethereum Sepolia", "chain_selector": "16015286601757825753" }, + { "name": "Credential Registry - Arbitrum", "description": "Credential registry on Arbitrum Sepolia", "chain_selector": "3478487238524512106" } + ] + }' + ``` + + When you omit the `address` field, ACE deploys a new managed contract on that chain. To import an existing contract instead, provide its address — see [Import an existing registry](#import-an-existing-registry). + + The response includes the registry ID and the status of each sub-registry deployment: + + ```json + { + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "name": "Production Identity Registry", + "description": "Identity and credential registries for compliance verification", + "org_id": "org-123", + "mode": "managed", + "chain_selectors": ["16015286601757825753", "3478487238524512106"], + "identity_registries": [ + { + "id": "d4c3b2a1-f6e5-0987-dcba-0987654321fe", + "name": "Identity Registry - Sepolia", + "description": "Identity registry on Ethereum Sepolia", + "chain_selector": "16015286601757825753", + "address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12", + "registry_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "org_id": "org-123", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + }, + { + "id": "e5d4c3b2-a1f6-8907-edcb-a09876543210", + "name": "Identity Registry - Arbitrum", + "description": "Identity registry on Arbitrum Sepolia", + "chain_selector": "3478487238524512106", + "address": "0x2b3c4d5e6f7890abcdef1234567890abcdef1234", + "registry_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "org_id": "org-123", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + } + ], + "credential_registries": [ + { + "id": "f6e5d4c3-b2a1-9078-fedc-ba0987654321", + "name": "Credential Registry - Sepolia", + "description": "Credential registry on Ethereum Sepolia", + "chain_selector": "16015286601757825753", + "address": "0x3c4d5e6f7890abcdef1234567890abcdef123456", + "registry_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "org_id": "org-123", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + }, + { + "id": "07f6e5d4-c3b2-1098-0fed-cb1098765432", + "name": "Credential Registry - Arbitrum", + "description": "Credential registry on Arbitrum Sepolia", + "chain_selector": "3478487238524512106", + "address": "0x4d5e6f7890abcdef1234567890abcdef12345678", + "registry_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "org_id": "org-123", + "status": "created", + "created_at": 1775580000, + "updated_at": 1775580000 + } + ], + "archived_at": null, + "created_at": 1775580000, + "updated_at": 1775580000 + } + ``` + + + + +## View registries + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Identity Manager** in the left sidebar. You see all registries in your organization. + 1. Click on a registry to open it. The detail view has two tabs: + - **Identities** — lists the identities registered in this registry. + - **Credential types** — lists the credential types configured for this registry. + + + List all registries: + + ```bash + curl https://ace.api.chain.link/v1/registries \ + -H "Authorization: Apikey " + ``` + + Use query parameters to paginate and filter results: + + | Parameter | Description | + | :----------------- | :------------------------------------------------------------------------- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page | + | `include_onchains` | Include onchain sub-registry details in the response | + | `type` | Filter by type: `pair` (default), `identity`, or `credential` | + | `include_granted` | When `true`, also include registries other organizations have shared with you. Each registry carries an `access_type` of `owned` or `granted`. See [External Registries](/ace/guides/identity-manager/external-registries). | + + To retrieve a specific registry by ID: + + ```bash + curl https://ace.api.chain.link/v1/registries/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \ + -H "Authorization: Apikey " + ``` + + Use the `type` query parameter to filter by sub-registry type: + + ```bash + curl "https://ace.api.chain.link/v1/registries/a1b2c3d4-e5f6-7890-abcd-ef1234567890?type=identity" \ + -H "Authorization: Apikey " + ``` + + + + +## Multi-chain setup + +Registries are designed to work across multiple chains. Each entry in `identity_registries` and `credential_registries` targets a specific `chain_selector`, and the platform deploys (or imports) a contract on each specified chain independently. + +A typical multi-chain configuration: + +- **Identity registries** on every chain where users interact — so the IdentityRegistry on each chain can resolve wallet addresses to CCIDs locally. +- **Credential registries** on every chain where policies need to verify credentials at runtime. + +Because CCIDs are chain-agnostic identifiers, a credential issued on one chain's CredentialRegistry is logically valid across all chains. The multi-chain deployment ensures that each chain has a local copy of the registry contracts for low-latency, on-chain lookups. For more on how this model works, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + + + +## Update a registry + +You can update a registry's name, description, and add new sub-registries. Updates are **additive** — you can add new identity or credential sub-registries to additional chains, but you cannot remove existing sub-registry pairs. + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Identity Manager** and click on the registry you want to update. + 1. Click on the gear icon to open the settings page. Edit the registry's **name** or **description**. + + + + + + ```bash + curl -X PUT https://ace.api.chain.link/v1/registries/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Updated Registry Name", + "description": "Updated description with expanded chain coverage", + "identity_registries": [ + { "name": "Identity Registry - Base", "description": "Identity registry on Base Sepolia", "chain_selector": "10344971235874465080" } + ], + "credential_registries": [ + { "name": "Credential Registry - Base", "description": "Credential registry on Base Sepolia", "chain_selector": "10344971235874465080" } + ] + }' + ``` + + This example adds sub-registries on Base Sepolia to an existing registry. The existing sub-registries on other chains are unaffected. + + + + +## Share across organizations + +You can grant another organization read access to a registry you own, so it can use your identities and credentials as a credential source without re-issuing them. Grants are read-only for the recipient and can be revoked at any time. For the full workflow — granting, discovering registries shared with you, using them, and revoking — see [External Registries](/ace/guides/identity-manager/external-registries). + +## Archive a registry + +Archiving a registry deactivates it and prevents any further operations. Before archiving, all identities associated with the registry must be removed or archived first. + + + + + + + + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/registries/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' + ``` + + + +## Related pages + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — conceptual background on CCIDs, registries, and credential sources +- [Managing Identities and Credentials](/ace/guides/identity-manager/manage-identities) — register identities and issue credentials within a registry +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — define and manage the credential types used in credential registries +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema and parameters diff --git a/src/content/ace/guides/policy-manager/contracts/ace-compatible.mdx b/src/content/ace/guides/policy-manager/contracts/ace-compatible.mdx new file mode 100644 index 00000000000..e5039b306ed --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/ace-compatible.mdx @@ -0,0 +1,75 @@ +--- +section: ace +title: "Making Your Contract ACE-Compatible" +date: Last Modified +metadata: + description: "Learn what your smart contract needs to be ACE-compatible: inheriting PolicyProtected, adding the runPolicy modifier, connecting to a PolicyEngine, and registering extractors." + datePublished: "2026-03-31" + lastModified: "2026-05-26" +--- + +import { Aside } from "@components" + +A contract is ACE-compatible when it can route function calls through a PolicyEngine for compliance checks before execution. This requires four things: inheriting a base contract, marking functions for protection, connecting to a PolicyEngine, and registering extractors. This page explains what each requirement means at a high level — the sub-pages linked below walk through the implementation in detail. + +For background on how these components interact, see the [Architecture page](/ace/concepts/architecture#policy-management-contracts) and the [Policy Management](/ace/concepts/policy-management) concepts page. + + + +## What your contract needs + +### 1. Inherit from PolicyProtected + +Your contract must inherit from `PolicyProtected` (for new contracts) or `PolicyProtectedUpgradeable` (for contracts deployed behind a proxy that need an upgrade path). This base contract provides: + +- The `runPolicy` and `runPolicyWithContext` modifiers that hook your functions into the policy system. +- Functions to attach and manage the connection to a PolicyEngine. +- Context handling for passing additional data (like offchain signatures) to policies. + +### 2. Add the runPolicy modifier to protected functions + +Any function that should be subject to compliance checks needs the `runPolicy` modifier. The modifier intercepts the call and routes it through the [PolicyEngine](/ace/guides/policy-manager/manage-engines) before your function body executes. + +```solidity +// Before: no compliance checks +function transfer(address to, uint256 amount) public returns (bool) { + return super.transfer(to, amount); +} + +// After: the PolicyEngine checks all attached policies before execution +function transfer(address to, uint256 amount) public runPolicy returns (bool) { + return super.transfer(to, amount); +} +``` + +You choose which functions to protect. Unprotected functions continue to work normally without any policy checks. + +### 3. Connect to a PolicyEngine + +Your contract must be connected to a [PolicyEngine](/ace/guides/policy-manager/manage-engines) — the central orchestrator that holds all policies and executes them in order when a protected function is called. The connection is established during initialization (for [new contracts](/ace/guides/policy-manager/contracts/new-contract)) or migration (for [upgrades](/ace/guides/policy-manager/contracts/upgrade-existing)). + +### 4. Register extractors for protected functions + +[Extractors](/ace/guides/policy-manager/manage-policies#managing-extractors) are helper contracts that parse the calldata of your protected functions into named parameters (for example, `to` and `value` for an ERC-20 `transfer`). Policies use these named parameters to make their decisions — a volume limit policy reads `value`, a sanctions check reads `to`. + +One extractor is registered per function signature. To bind policies to specific functions, see [Protecting Target Functions](/ace/guides/policy-manager/manage-protections). + + + +## Integration paths + +How you integrate ACE depends on where your contract is today: + +- **[Building a New Contract](/ace/guides/policy-manager/contracts/new-contract)** — Starting a new project? ACE provides audited reference implementations for ERC-20 and ERC-3643 tokens that come pre-integrated with PolicyProtected. This is the fastest path. + +- **[Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing)** — Already have a deployed contract behind a proxy? You can add ACE compliance through a standard proxy upgrade without disrupting existing state, balances, or integrations. + +- **Non-upgradeable contract?** — If your contract is not behind a proxy, the upgrade guide also covers [alternative approaches](/ace/guides/policy-manager/contracts/upgrade-existing#alternatives-for-non-upgradeable-contracts) — wrapped contracts, contract migration, and edge protection — each with different tradeoffs depending on your constraints. diff --git a/src/content/ace/guides/policy-manager/contracts/erc20-token.mdx b/src/content/ace/guides/policy-manager/contracts/erc20-token.mdx new file mode 100644 index 00000000000..74722c36b0d --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/erc20-token.mdx @@ -0,0 +1,102 @@ +--- +section: ace +title: "Building an ERC-20 Compliance Token" +date: Last Modified +metadata: + description: "Build and deploy a policy-protected ERC-20 token using the Chainlink ACE reference implementation: token features, frozen token behavior, deployment patterns, and policy setup." + datePublished: "2026-03-31" + lastModified: "2026-03-31" +--- + +import { Aside } from "@components" + +The `ComplianceTokenERC20` is a ready-to-deploy, policy-protected ERC-20 token provided as an ACE reference implementation. It inherits `PolicyProtectedUpgradeable`, routes every state-changing function through a PolicyEngine, and is designed for deployment behind a proxy. + +For a comparison with the ERC-3643 variant and guidance on which to choose, see [Building a New Contract](/ace/guides/policy-manager/contracts/new-contract#choosing-between-erc-20-and-erc-3643). + +## What makes it ACE-compatible + +The token satisfies all the requirements described in [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible): + +1. **Inherits `PolicyProtectedUpgradeable`** — The contract calls `__PolicyProtected_init` during initialization, which sets the contract owner and connects it to a PolicyEngine. +1. **All state-changing functions are policy-protected** — Every function that modifies balances, allowances, or frozen state carries the `runPolicy` or `runPolicyWithContext` modifier. The PolicyEngine evaluates all attached policies before the function body executes. +1. **ERC-7201 namespaced storage** — All token state lives in a dedicated `ComplianceTokenStoreERC20` storage struct, following the [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) pattern for safe upgradeable storage. + +## Protected functions + +Every state-changing function on the token is policy-protected. The [`runPolicy` modifier](/ace/concepts/policy-management#the-policy-execution-flow) intercepts each call and routes it through the PolicyEngine, which evaluates all attached policies before the function body executes. Functions that need to pass additional context (such as offchain signatures or metadata) use [`runPolicyWithContext`](/ace/concepts/policy-management#the-context-parameter) instead, which forwards a `bytes context` parameter to every policy in the chain. + +### ERC-20 standard + +| Function |
Modifier
| Description | +| -------------------------------- | ----------------------------------------- | ---------------------------------------------------------------- | +| `transfer(to, amount)` | `runPolicy` | Transfer tokens from the caller to another address. | +| `transferFrom(from, to, amount)` | `runPolicy` | Transfer tokens on behalf of another address using an allowance. | +| `approve(spender, amount)` | `runPolicy` | Set an allowance for a spender. | + +### Minting and burning + +| Function | Modifier | Description | +| ------------------------ | ----------- | ------------------------------------------------ | +| `mint(to, amount)` | `runPolicy` | Create new tokens and assign them to an address. | +| `burn(amount)` | `runPolicy` | Destroy tokens from the caller's balance. | +| `burnFrom(from, amount)` | `runPolicy` | Destroy tokens from another address. | + +### Administrative and compliance + +| Function |
Modifier
| Description | +| ------------------------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------ | +| `freeze(account, amount, context)` | `runPolicyWithContext` | Freeze a specific amount of tokens on an account. Frozen tokens cannot be transferred or burned. | +| `unfreeze(account, amount, context)` | `runPolicyWithContext` | Unfreeze a previously frozen amount on an account. | +| `forceTransfer(from, to, amount, context)` | `runPolicyWithContext` | Administratively move tokens between accounts, subject to frozen balance checks. | + + + +## Frozen token behavior + +`ComplianceTokenERC20` uses a **strict preservation** model for frozen tokens: + +- **Available balance** = total balance - frozen balance. Every transfer, burn, and force transfer checks that the sender has sufficient _unfrozen_ balance and reverts if not. +- **No automatic unfreezing** — Frozen tokens remain frozen during all operations. An administrator must explicitly call `unfreeze` before those tokens can be moved or burned. +- **Pre-freezing** — Tokens can be frozen on an account before they are received. The frozen amount is tracked independently from the balance, so an admin can set a frozen amount in advance and the restriction takes effect as soon as tokens arrive. + +This model provides maximum compliance control: every change to frozen status is an explicit, auditable administrative action. + + + +## Storage layout + +All token state is stored in `ComplianceTokenStoreERC20`, which uses ERC-7201 namespaced storage at a deterministic slot: + +| Field | Type | Description | +| ---------------- | ------------------------------------------------- | --------------------------------- | +| `name` | `string` | Token name. | +| `symbol` | `string` | Token symbol. | +| `decimals` | `uint8` | Decimal precision for display. | +| `totalSupply` | `uint256` | Total supply of tokens. | +| `balances` | `mapping(address => uint256)` | Per-account token balances. | +| `allowances` | `mapping(address => mapping(address => uint256))` | Per-account spender allowances. | +| `frozenBalances` | `mapping(address => uint256)` | Per-account frozen token amounts. | +| `data` | `mapping(bytes32 => bytes)` | Generic storage for extensions. | + +## CCIP compatibility + +The contract exposes `getCCIPAdmin()`, which returns the contract owner. This enables integration with [Chainlink CCIP](/ccip) for cross-chain token transfers by identifying the admin authorized to configure the token's CCIP settings. + +## Reference implementation + +The full source code for the ERC-20 compliance token: + +- [ComplianceTokenERC20.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-20/src/ComplianceTokenERC20.sol) — Token contract with all protected functions and frozen token logic. +- [ComplianceTokenStoreERC20.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-20/src/ComplianceTokenStoreERC20.sol) — ERC-7201 namespaced storage layout. diff --git a/src/content/ace/guides/policy-manager/contracts/erc3643-token.mdx b/src/content/ace/guides/policy-manager/contracts/erc3643-token.mdx new file mode 100644 index 00000000000..8ae2d8e43eb --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/erc3643-token.mdx @@ -0,0 +1,160 @@ +--- +section: ace +title: "Building an ERC-3643 Compliance Token" +date: Last Modified +metadata: + description: "Build and deploy an ERC-3643 (T-REX) compliant token using Chainlink ACE's Cross-Chain Identity instead of ONCHAINID: key differences, frozen token behavior, and when to choose ERC-3643." + datePublished: "2026-03-31" + lastModified: "2026-03-31" +--- + +import { Aside } from "@components" + +The `ComplianceTokenERC3643` implements the [ERC-3643 (T-REX)](https://eips.ethereum.org/EIPS/eip-3643) `IToken` interface but replaces the canonical T-REX identity and compliance systems with ACE equivalents. It inherits `PolicyProtectedUpgradeable`, is deployed behind a proxy, and routes all state-changing functions through a PolicyEngine. + +For a comparison with the ERC-20 variant and guidance on which to choose, see [Building a New Contract](/ace/guides/policy-manager/contracts/new-contract#choosing-between-erc-20-and-erc-3643). + +## What makes it ACE-compatible + +The token satisfies all the requirements described in [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible): + +1. **Inherits `PolicyProtectedUpgradeable`** — The contract calls `__PolicyProtected_init` during initialization, which sets the contract owner and connects it to a PolicyEngine. +1. **All state-changing functions are policy-protected** — Every function that modifies state carries the `runPolicy` modifier. The PolicyEngine evaluates all attached policies before the function body executes. +1. **ERC-7201 namespaced storage** — All token state lives in a dedicated `ComplianceTokenStoreERC3643` storage struct, following the [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) pattern for safe upgradeable storage. + +## How it differs from canonical T-REX + +This implementation keeps the `IToken` interface that T-REX tooling and auditors expect, but swaps out the two internal subsystems for ACE equivalents: + +### Identity: ACE Cross-Chain Identity replaces ONCHAINID + +The canonical T-REX stack uses ONCHAINID for on-chain identity claims. This implementation replaces it with ACE's [Cross-Chain Identity](/ace/concepts/cross-chain-identity) infrastructure (IdentityRegistry and CredentialRegistry). The legacy interface stubs remain to satisfy `IToken` but are not functional: + +- `identityRegistry()` returns `address(0)`. +- `onchainID()` returns `address(0)`. +- `setIdentityRegistry()` reverts with "Not implemented". +- `setOnchainID()` reverts with "Not implemented". + +Identity verification is handled through ACE policies that validate credentials against the IdentityRegistry and CredentialRegistry. + +### Compliance: ACE Policy Management replaces ModularCompliance + +The canonical T-REX stack uses `ModularCompliance` for transfer rules. This implementation replaces it with ACE's [Policy Management](/ace/concepts/policy-management) system, where compliance rules are defined as policies attached to the PolicyEngine. The legacy stub remains: + +- `compliance()` returns `address(0)`. +- `setCompliance()` reverts with "Not implemented". + +### Wallet recovery not implemented + +- `recoveryAddress()` reverts with "Not implemented". Wallet recovery is not supported in this implementation. + +## Protected functions + +Every state-changing function on the token is policy-protected with [`runPolicy`](/ace/concepts/policy-management#the-policy-execution-flow), which intercepts each call and routes it through the PolicyEngine. The engine evaluates all attached policies before the function body executes. Functions that interact with user balances also carry the `whenNotPaused` modifier, which checks the token's pause state before proceeding. + +### Transfers + +| Function | Modifiers | Description | +| ---------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| `transfer(to, amount)` | `whenNotPaused`, `runPolicy` | Transfer tokens from the caller to another address. Checks that neither wallet is frozen and that the sender has sufficient unfrozen balance. | +| `transferFrom(from, to, amount)` | `whenNotPaused`, `runPolicy` | Transfer tokens on behalf of another address using an allowance. Same frozen and balance checks as `transfer`. | +| `forcedTransfer(from, to, amount)` | `runPolicy` | Administrative transfer that auto-unfreezes tokens if the unfrozen balance is insufficient. | + +### Allowances + +| Function | Modifiers | Description | +| --------------------------------------------- | ---------------------------- | ------------------------------- | +| `approve(spender, amount)` | `whenNotPaused`, `runPolicy` | Set an allowance for a spender. | +| `increaseAllowance(spender, addedValue)` | `whenNotPaused`, `runPolicy` | Increase an existing allowance. | +| `decreaseAllowance(spender, subtractedValue)` | `whenNotPaused`, `runPolicy` | Decrease an existing allowance. | + +### Minting and burning + +| Function |
Modifiers
| Description | +| --------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------- | +| `mint(to, amount)` | `runPolicy` | Create new tokens and assign them to an address. | +| `burn(userAddress, amount)` | `runPolicy` | Destroy tokens from an address. Auto-unfreezes tokens if the unfrozen balance is insufficient. | + +### Freezing + +| Function |
Modifiers
| Description | +| -------------------------------------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | +| `setAddressFrozen(userAddress, freeze)` | `runPolicy` | Freeze or unfreeze an entire address. A frozen address cannot send or receive tokens through regular transfers. | +| `freezePartialTokens(userAddress, amount)` | `runPolicy` | Freeze a specific amount of tokens on an account. | +| `unfreezePartialTokens(userAddress, amount)` | `runPolicy` | Unfreeze a previously frozen amount on an account. | + +### Token administration + +| Function | Modifiers | Description | +| ------------------- | ----------- | ---------------------------------------------------------------- | +| `pause()` | `runPolicy` | Pause the token. All functions with `whenNotPaused` will revert. | +| `unpause()` | `runPolicy` | Unpause the token. | +| `setName(name)` | `runPolicy` | Update the token name. | +| `setSymbol(symbol)` | `runPolicy` | Update the token symbol. | + +## Frozen token behavior + +`ComplianceTokenERC3643` uses an **automatic unfreezing** model, following the standard T-REX approach. There are two independent freeze mechanisms: + +- **Address freeze** — A boolean flag (`frozen[address]`) that blocks an address from sending or receiving tokens through regular `transfer` and `transferFrom` calls. +- **Partial token freeze** — A numeric amount (`frozenTokens[address]`) that restricts how many of an account's tokens can be moved. Available balance = total balance - frozen tokens. + +Regular transfers check both: the wallet must not be address-frozen, and the transfer amount must not exceed the unfrozen balance. + +**Administrative operations auto-unfreeze.** When `forcedTransfer` or `burn` is called and the unfrozen balance is insufficient, the contract automatically reduces `frozenTokens` by the shortfall and emits a `TokensUnfrozen` event. This means administrative actions are never blocked by partial frozen status — the admin has already decided the operation is necessary. + + + +## Built-in pause + +The token includes a built-in `pause`/`unpause` mechanism. Both functions are policy-protected. When paused, all functions carrying the `whenNotPaused` modifier revert — this includes `transfer`, `transferFrom`, `approve`, `increaseAllowance`, and `decreaseAllowance`. + +Administrative functions (`mint`, `burn`, `forcedTransfer`, freeze operations) do **not** carry `whenNotPaused` and remain callable while the token is paused. + + + +## Batch operations + +The ERC-3643 token supports batch operations for managing large numbers of holders efficiently: + +- `batchTransfer` — Transfer to multiple recipients in a single transaction. +- `batchForcedTransfer` — Force-transfer between multiple address pairs. +- `batchMint` — Mint to multiple recipients. +- `batchBurn` — Burn from multiple addresses. +- `batchSetAddressFrozen` — Freeze or unfreeze multiple addresses. +- `batchFreezePartialTokens` — Freeze token amounts on multiple accounts. +- `batchUnfreezePartialTokens` — Unfreeze token amounts on multiple accounts. + +Each batch function delegates to its single-item counterpart in a loop, so every individual operation goes through `runPolicy` independently. + +## Storage layout + +All token state is stored in `ComplianceTokenStoreERC3643`, which uses ERC-7201 namespaced storage at a deterministic slot: + +| Field | Type | Description | +| --------------- | ------------------------------------------------- | --------------------------------- | +| `tokenName` | `string` | Token name. | +| `tokenSymbol` | `string` | Token symbol. | +| `tokenDecimals` | `uint8` | Decimal precision for display. | +| `tokenPaused` | `bool` | Whether the token is paused. | +| `totalSupply` | `uint256` | Total supply of tokens. | +| `balances` | `mapping(address => uint256)` | Per-account token balances. | +| `allowances` | `mapping(address => mapping(address => uint256))` | Per-account spender allowances. | +| `frozen` | `mapping(address => bool)` | Per-account address freeze flag. | +| `frozenTokens` | `mapping(address => uint256)` | Per-account frozen token amounts. | + +## Reference implementation + +The full source code for the ERC-3643 compliance token: + +- [ComplianceTokenERC3643.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-3643/src/ComplianceTokenERC3643.sol) — Token contract implementing the `IToken` interface with ACE policy protection. +- [ComplianceTokenStoreERC3643.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-3643/src/ComplianceTokenStoreERC3643.sol) — ERC-7201 namespaced storage layout. diff --git a/src/content/ace/guides/policy-manager/contracts/new-contract.mdx b/src/content/ace/guides/policy-manager/contracts/new-contract.mdx new file mode 100644 index 00000000000..110ecdb1f3d --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/new-contract.mdx @@ -0,0 +1,76 @@ +--- +section: ace +title: "Building a New Contract" +date: Last Modified +metadata: + description: "Choose the right ACE-compatible contract type for your use case: ERC-20 compliance token or ERC-3643 (T-REX) compliant token, and understand the differences between them." + datePublished: "2026-03-31" + lastModified: "2026-03-31" +--- + +import { Aside } from "@components" + +If you are starting a new project, ACE provides audited reference implementations that come pre-integrated with PolicyProtected. You do not need to implement the ACE integration yourself — these contracts are ready to deploy and protect with policies. + +If you already have a deployed contract, see [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) instead. + +## Reference implementations + +ACE offers two token implementations, each designed for different regulatory contexts: + +- **ComplianceTokenERC20** — A policy-protected ERC-20 token with advanced frozen token handling, force transfers, and mint/burn controls. +- **ComplianceTokenERC3643** — A compliant implementation of the [ERC-3643 (T-REX)](https://eips.ethereum.org/EIPS/eip-3643) standard, using ACE Cross-Chain Identity instead of ONCHAINID and ACE Policy Management instead of T-REX ModularCompliance. + +Both implementations inherit from `PolicyProtectedUpgradeable` and must be deployed behind a proxy. During ACE Beta, deployment is managed through the ACE Platform. + +## Choosing between ERC-20 and ERC-3643 + +The right choice depends on your regulatory requirements, the asset type you are tokenizing, and how you need frozen tokens to behave. + +| Aspect | ERC-20 Compliance Token | ERC-3643 Compliance Token | +| ------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| **Standard** | ERC-20 | ERC-3643 (T-REX) | +| **Regulatory context** | Broad — suitable for any token that needs policy-based compliance | Securities — designed for regulated securities and financial instruments | +| **Identity system** | ACE Cross-Chain Identity | ACE Cross-Chain Identity (replaces ONCHAINID) | +| **Compliance system** | ACE Policy Management | ACE Policy Management (replaces T-REX ModularCompliance) | +| **Frozen token behavior** | Strict preservation — frozen tokens remain frozen during burns and force transfers | Operational flexibility — burns and force transfers can automatically unfreeze tokens when needed | +| **Pause support** | No built-in pause (use a PausePolicy instead) | Built-in `pause`/`unpause` with `whenNotPaused` modifier | +| **Batch operations** | No | Yes — batch transfer, mint, burn, freeze/unfreeze | +| **CCIP admin** | `getCCIPAdmin()` returns the contract owner | Not included | + +### Frozen token behavior explained + +The most significant difference between the two implementations is how frozen tokens are handled during administrative operations: + +**ERC-20 approach (strict preservation):** When an admin performs a burn or force transfer on an account with frozen tokens, the frozen balance is preserved. The operation only succeeds if the account has sufficient _unfrozen_ balance. This means an admin must explicitly unfreeze tokens before they can be burned or force-transferred. + +**ERC-3643 approach (automatic unfreezing):** When an admin performs a burn or force transfer, the contract automatically unfreezes tokens if the unfrozen balance is insufficient. This follows the T-REX philosophy that administrative actions should not be blocked by frozen status — the admin has already decided the operation is necessary. + +### When to choose each + +**Choose ERC-20** when: + +- You need a general-purpose compliant token without a specific regulatory framework requirement. +- You want strict control over frozen tokens — every unfreeze must be an explicit administrative action. +- You plan to integrate with CCIP for cross-chain transfers. + +**Choose ERC-3643** when: + +- You are tokenizing regulated securities and need compliance with the ERC-3643 standard. +- Your regulatory framework requires or benefits from the T-REX interface (existing tooling, auditor familiarity). +- You need batch operations for managing large numbers of holders efficiently. +- You prefer operational flexibility for administrative actions on frozen tokens. + +## Next steps + +- **[Building an ERC-20 Compliance Token](/ace/guides/policy-manager/contracts/erc20-token)** — Detailed guide for deploying and configuring the ERC-20 reference implementation. +- **[Building an ERC-3643 Compliance Token](/ace/guides/policy-manager/contracts/erc3643-token)** — Detailed guide for deploying and configuring the ERC-3643 reference implementation. + + diff --git a/src/content/ace/guides/policy-manager/contracts/security-considerations.mdx b/src/content/ace/guides/policy-manager/contracts/security-considerations.mdx new file mode 100644 index 00000000000..32a89ebde0e --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/security-considerations.mdx @@ -0,0 +1,64 @@ +--- +section: ace +title: "Security Considerations" +date: Last Modified +metadata: + description: "Security considerations for ACE smart contract integration: trust boundaries for policies and extractors, context handling pitfalls, external call risks, and non-reverting view function requirements." + datePublished: "2026-03-31" + lastModified: "2026-03-31" +--- + +This page covers the implementation-level security concerns that developers should understand when integrating with ACE contracts — trust boundaries, external call risks, and defensive programming patterns. + +For governance-level security (administration controls, execution ordering, registry governance, privacy guarantees), see the [Security Model](/ace/concepts/security) concepts page. + +## Trust model for policies and extractors + +The PolicyEngine delegates trust to the individual Policy, Extractor, and Mapper contracts it is configured to use. A vulnerability in any one of these components can compromise the entire system. + +### Policy trust + +A malicious or poorly written policy can introduce vulnerabilities at two levels: + +- **The `run()` function** (read-only) — A policy that always returns Allow would bypass all subsequent policies. A policy that makes dangerous external calls could be exploited for denial of service. +- **The `postRun()` function** (state-changing) — This function executes after a successful check and can modify onchain state. A malicious postRun could drain funds, change ownership, or corrupt state. + +Only install trusted, audited policies. ACE provides a library of pre-built, audited policies for common use cases. + +### Extractor trust + +The PolicyEngine relies on Extractors to correctly and honestly parse transaction calldata. If an Extractor is compromised, it could misrepresent the data that policies use for their decisions. For example, an Extractor could report a false `value` for a transfer, causing a VolumePolicy to undercount and allow transactions that should be blocked. + +### External call risks + +Many policies make external calls during execution — for example, querying a credential registry or checking an external data source. Since most policy `run()` functions are `view` (read-only), traditional reentrancy attacks are not possible. However, other risks apply: + +- **Denial of service** — A malicious external contract could revert or consume excessive gas, causing the entire policy chain to fail. +- **Inconsistent reads** — External contract state could change between multiple calls within the same transaction. +- **Gas exhaustion** — Deep call chains across multiple policies with external calls could exceed gas limits. + +For policies with state-changing functions (like `postRun()`), traditional reentrancy protections should be considered if those functions make external calls. + +**Mitigation:** Only interact with well-established, audited external contracts in policy logic. Implement proper error handling so that policies gracefully handle external contract failures rather than cascading reverts. + +## Context handling and race conditions + +The [context parameter](/ace/concepts/policy-management#the-context-parameter) is a powerful feature for passing arbitrary data to policies, but it requires careful handling. + +When using the two-step method (calling `setContext` followed by the protected function), the context is stored per sender in the PolicyProtected contract. If context is set but not consumed in the same atomic transaction, stale context from a previous call could be reused. In contracts used by multiple senders (like relayers or governance contracts), one user's context could potentially be overwritten by another before it is consumed. + +**Mitigation:** Always set and consume context within the same atomic transaction. For contracts with multiple concurrent users, prefer the direct argument method (`runPolicyWithContext`) over the two-step approach. + +## Non-reverting view functions + +All validator functions in the Cross-Chain Identity system — `validate()`, `validateCredentialData()`, and related view functions — must **never revert** under any circumstances. They must always return a boolean result. + +This is a critical reliability requirement. If a validator reverted during a policy check (for example, because an external call to a credential registry failed), it would break the entire policy chain for that transaction. The PolicyEngine would not be able to distinguish between "credential is invalid" and "validator is broken." + +Implementations must use defensive programming patterns: + +- Wrap external calls in try-catch blocks. +- Return `false` on any external call failure rather than allowing the revert to propagate. +- Validate all inputs before making external calls. + +This guarantees that the policy chain always completes and returns a definitive result, even when downstream dependencies fail. diff --git a/src/content/ace/guides/policy-manager/contracts/upgrade-existing.mdx b/src/content/ace/guides/policy-manager/contracts/upgrade-existing.mdx new file mode 100644 index 00000000000..f3be379d2fc --- /dev/null +++ b/src/content/ace/guides/policy-manager/contracts/upgrade-existing.mdx @@ -0,0 +1,535 @@ +--- +section: ace +title: "Upgrading Existing Contracts" +date: Last Modified +metadata: + description: "Add Chainlink ACE compliance to an already-deployed smart contract: storage safety with ERC-7201, two integration approaches, step-by-step instructions, alternatives for non-upgradeable contracts, and FAQ." + datePublished: "2026-03-31" + lastModified: "2026-05-26" +--- + +import { Aside } from "@components" + +This guide explains how to add ACE compliance to a contract that is already deployed. The process is a standard proxy upgrade — your existing state (balances, allowances, mappings) is fully preserved, your contract address stays the same, and all existing integrations continue to work. + + + + + +## Prerequisites + +Before starting, you should be familiar with: + +- [ACE Architecture](/ace/concepts/architecture) — how PolicyEngine, policies, and extractors work together +- [Policy Management](/ace/concepts/policy-management) — the execution model and policy outcomes + +### Your contract must be upgradeable + +This guide covers contracts deployed behind a proxy pattern — UUPS, Transparent Proxy, or Beacon Proxy. You need upgrade authority over the contract. + +If your contract is **not upgradeable**, see [Alternatives for non-upgradeable contracts](#alternatives-for-non-upgradeable-contracts) below. + +## Key concept: Storage safety with ERC-7201 + +When upgrading a contract, new variables must not overwrite existing state. `PolicyProtectedUpgradeable` uses [ERC-7201 namespaced storage](https://eips.ethereum.org/EIPS/eip-7201), which isolates all ACE data in a deterministic storage slot that cannot collide with your existing storage layout. + +```solidity +bytes32 private constant STORAGE_LOCATION = + keccak256(abi.encode(uint256(keccak256("chainlink.ace.PolicyProtected")) - 1)) + & ~bytes32(uint256(0xff)); +``` + +This formula produces a storage location that is guaranteed not to overlap with Solidity's default sequential storage layout. Your existing balances, allowances, and other state remain untouched. + +## Choosing your approach + +There are two ways to integrate ACE into an upgradeable contract: + +| Aspect | Approach 1: Extend PolicyProtectedUpgradeable | Approach 2: Implement IPolicyProtected | +| ------------------------- | --------------------------------------------- | ------------------------------------------- | +| **Bytecode impact** | +5-6 KB | +1-2 KB | +| **Implementation effort** | Add inheritance + modifiers | Write storage, context, and execution logic | +| **Maintenance** | Inherits ACE updates automatically | You maintain all custom code | +| **Risk** | Lower — proven patterns | Higher — custom code means custom bugs | + +**Recommendation:** Use Approach 1 unless your contract is near the 24 KB bytecode limit or you need custom control over how context is stored or policies are executed. + +## Approach 1: Extend PolicyProtectedUpgradeable (recommended) + +This approach inherits from `PolicyProtectedUpgradeable`, which provides built-in modifiers and automatic storage management. + +### Step 1: Update contract inheritance + +Add `PolicyProtectedUpgradeable` to your inheritance chain. + +**Before:** + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable { + // ... +} +``` + +**After:** + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PolicyProtectedUpgradeable} from "@chainlink/policy-management/core/PolicyProtectedUpgradeable.sol"; + +contract MyToken is PolicyProtectedUpgradeable, ERC20Upgradeable, UUPSUpgradeable { + // ... +} +``` + + + +### Step 2: Add a migration function + +Your original `initialize()` has already been called, so you cannot modify it. Instead, add a migration function using `reinitializer`: + +```solidity +function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + __PolicyProtected_init_unchained(policyEngine); +} +``` + +`reinitializer(2)` ensures this migration runs exactly once (version 1 was your original `initialize()`). If you have had previous upgrades with reinitializers, increment the version accordingly. + +`__PolicyProtected_init_unchained()` stores the PolicyEngine address in namespaced storage and registers your contract with the PolicyEngine. + + + +If you need to switch to a different PolicyEngine later, call `attachPolicyEngine(newAddress)` (owner-only). + +### Step 3: Add runPolicy to protected functions + +Add the `runPolicy` modifier to each function that should be subject to policy checks. + +**Before:** + +```solidity +function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); +} + +function transfer(address to, uint256 amount) public virtual override returns (bool) { + return super.transfer(to, amount); +} +``` + +**After:** + +```solidity +function mint(address to, uint256 amount) public runPolicy { + _mint(to, amount); +} + +function transfer(address to, uint256 amount) public virtual override runPolicy returns (bool) { + return super.transfer(to, amount); +} +``` + +Access control (restricting who can mint, for example) is now enforced through policies rather than traditional `onlyOwner` modifiers. This lets you change access rules by updating policies without upgrading the contract. + +For functions that need additional data passed to policies (signatures, proofs), use `runPolicyWithContext`: + +```solidity +function forceTransfer( + address from, + address to, + uint256 amount, + bytes calldata context +) public runPolicyWithContext(context) { + _update(from, to, amount); +} +``` + +### Complete before/after example + +**Before (standard upgradeable ERC-20):** + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable { + constructor() { + _disableInitializers(); + } + + function initialize(address initialOwner) public initializer { + __ERC20_init("MyToken", "MTK"); + __Ownable_init(initialOwner); + } + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} +} +``` + +**After (with ACE integration):** + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PolicyProtectedUpgradeable} from "@chainlink/policy-management/core/PolicyProtectedUpgradeable.sol"; + +contract MyToken is PolicyProtectedUpgradeable, ERC20Upgradeable, UUPSUpgradeable { + constructor() { + _disableInitializers(); + } + + function initialize(address initialOwner) public initializer { + __ERC20_init("MyToken", "MTK"); + __Ownable_init(initialOwner); + } + + function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + __PolicyProtected_init_unchained(policyEngine); + } + + function mint(address to, uint256 amount) public runPolicy { + _mint(to, amount); + } + + function transfer(address to, uint256 amount) + public + virtual + override + runPolicy + returns (bool) + { + return super.transfer(to, amount); + } + + function transferFrom(address from, address to, uint256 amount) + public + virtual + override + runPolicy + returns (bool) + { + return super.transferFrom(from, to, amount); + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} +} +``` + +**Key changes:** + +1. Import and inherit `PolicyProtectedUpgradeable` (remove explicit `Initializable` and `OwnableUpgradeable` — they are inherited through `PolicyProtectedUpgradeable`). +2. Add `migrateToACE()` with `reinitializer(2)`. +3. Add `runPolicy` to functions that need policy protection. + +## Approach 2: Implement IPolicyProtected (advanced) + +If your contract is near the 24 KB bytecode limit or you need custom control over policy execution, you can implement the `IPolicyProtected` interface directly instead of inheriting from `PolicyProtectedUpgradeable`. This adds only ~1-2 KB of bytecode but requires more code. + +### What you must implement + +You are responsible for: + +1. **Storage** — Storing the PolicyEngine address and per-sender context using ERC-7201 namespaced storage. +2. **Policy execution** — Calling `policyEngine.run()` with the correct payload in each protected function. +3. **Context handling** — Storing, retrieving, and clearing context data. +4. **Registration** — Attaching to and detaching from the PolicyEngine. +5. **ERC-165 support** — Implementing `supportsInterface()`. + +### Interface methods + +```solidity +interface IPolicyProtected { + function attachPolicyEngine(address policyEngine) external; + function getPolicyEngine() external view returns (address); + function setContext(bytes calldata context) external; + function getContext() external view returns (bytes memory); + function clearContext() external; +} +``` + +| Method | Purpose | +| -------------------- | ----------------------------------------------- | +| `attachPolicyEngine` | Registers your contract with a PolicyEngine | +| `getPolicyEngine` | Returns the current PolicyEngine address | +| `setContext` | Stores context data for the next protected call | +| `getContext` | Retrieves stored context for the current caller | +| `clearContext` | Clears context after use to prevent replay | + +### Implementation skeleton + +The following skeleton shows the key pieces for an ERC-20 token. It uses the same migration pattern as Approach 1, but all ACE logic is implemented manually. + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IPolicyProtected} from "@chainlink/policy-management/interfaces/IPolicyProtected.sol"; +import {IPolicyEngine} from "@chainlink/policy-management/interfaces/IPolicyEngine.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +contract MyToken is ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable, IPolicyProtected { + + // --- ERC-7201 Namespaced Storage --- + + struct ACEStorage { + address policyEngine; + mapping(address => bytes) senderContext; + } + + // Replace with your calculated ERC-7201 storage slot + bytes32 private constant ACE_STORAGE_LOCATION = 0x...; + + function _getACEStorage() private pure returns (ACEStorage storage $) { + assembly { + $.slot := ACE_STORAGE_LOCATION + } + } + + // --- Migration --- + + function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + _attachPolicyEngine(policyEngine); + } + + // --- IPolicyProtected --- + + function attachPolicyEngine(address policyEngine) external onlyOwner { + _attachPolicyEngine(policyEngine); + } + + function _attachPolicyEngine(address policyEngine) internal { + require(policyEngine != address(0), "Zero address"); + ACEStorage storage $ = _getACEStorage(); + $.policyEngine = policyEngine; + IPolicyEngine(policyEngine).attach(); + } + + function getPolicyEngine() public view returns (address) { + return _getACEStorage().policyEngine; + } + + function setContext(bytes calldata context) external { + _getACEStorage().senderContext[msg.sender] = context; + } + + function getContext() public view returns (bytes memory) { + return _getACEStorage().senderContext[msg.sender]; + } + + function clearContext() public { + delete _getACEStorage().senderContext[msg.sender]; + } + + function supportsInterface(bytes4 interfaceId) external pure returns (bool) { + return interfaceId == type(IPolicyProtected).interfaceId || + interfaceId == type(IERC165).interfaceId; + } + + // --- Policy Execution --- + + function _runPolicy() internal { + ACEStorage storage $ = _getACEStorage(); + require($.policyEngine != address(0), "PolicyEngine not set"); + + bytes memory context = getContext(); + IPolicyEngine($.policyEngine).run( + IPolicyEngine.Payload({ + selector: msg.sig, + sender: msg.sender, + data: msg.data[4:], + context: context + }) + ); + + if (context.length > 0) { + clearContext(); + } + } + + // --- Protected Functions --- + + function transfer(address to, uint256 amount) public virtual override returns (bool) { + _runPolicy(); + return super.transfer(to, amount); + } + + // ... other protected functions follow the same pattern +} +``` + + + +## Execute the upgrade + +At this point your updated implementation contract is ready. You need the PolicyEngine address to proceed. + +### Pre-upgrade checklist + +**Development:** + +- Updated contract compiles successfully +- Final bytecode is under 24 KB +- Unit tests pass +- Integration tests with PolicyEngine pass + +**Infrastructure:** + +- PolicyEngine address received from the ACE Platform (Beta) or deployed by your team (GA) + +### Upgrade execution + +Deploy the new implementation, then execute the upgrade and migration in one transaction. The exact pattern depends on your proxy type: + +**UUPS:** + +```solidity +bytes memory data = abi.encodeCall(MyToken.migrateToACE, (policyEngineAddress)); +MyToken(proxyAddress).upgradeToAndCall(newImplementationAddress, data); +``` + +**Transparent Proxy:** + +```solidity +bytes memory data = abi.encodeCall(MyToken.migrateToACE, (policyEngineAddress)); +ProxyAdmin(proxyAdminAddress).upgradeAndCall(proxyAddress, newImplementationAddress, data); +``` + +**Beacon Proxy:** + +```solidity +// Beacon does not support upgradeAndCall — execute separately +UpgradeableBeacon(beaconAddress).upgradeTo(newImplementationAddress); +MyToken(proxyAddress).migrateToACE(policyEngineAddress); +``` + +### Post-upgrade verification + +- `getPolicyEngine()` returns the correct address +- Protected functions trigger policy checks +- Policies allow and reject transactions as expected +- Existing balances, allowances, and other state are unchanged + +## Alternatives for non-upgradeable contracts + +If your contract is not deployed behind a proxy, a standard upgrade is not possible. Depending on your situation, there are three alternative approaches to bring ACE compliance to your application. + +### Wrapped contract + +Deploy a new ACE-compatible wrapper contract that sits in front of your original contract. Users interact with the wrapper, which enforces policies before delegating calls to the underlying contract. + +**How it works:** The wrapper inherits from `PolicyProtected` and exposes the same external interface as the original contract. Each function on the wrapper calls `runPolicy`, then forwards the call to the original contract. The original contract remains completely untouched. + +**When to use:** Your contract's logic does not need to change, but you need compliance checks on interactions with it. Works well for contracts where you can redirect user traffic to a new entry point. + +**Tradeoffs:** + +- The wrapper has a **different contract address**, so integrators (DEXs, lending protocols, front ends) must update their references. +- If wrapping a token, users may need to **migrate balances** or **re-approve allowances** to the wrapper. +- Adds a layer of indirection, which slightly increases gas costs per call. + +### Contract migration + +Deploy a brand-new ACE-native contract and migrate state from the old contract to the new one. The new contract is built from scratch with `PolicyProtected` integrated from the start. + +**How it works:** You take a snapshot of the old contract's state (balances, allowances, roles, etc.) and seed the new contract with that data during deployment or through a claim-based migration. The old contract is then deprecated or paused. + +**When to use:** You want no wrapper indirection, no legacy contract to maintain. Particularly suited for tokens where a coordinated migration event is feasible (for example, a token swap or airdrop). + +**Tradeoffs:** + +- Requires a **coordinated migration event** — all holders and integrators must move to the new contract. +- The new contract has a **different address**, which affects all downstream integrations. +- Migration patterns (snapshot + airdrop, or claim-based redemption) add operational complexity. +- The old contract must be handled (paused, drained, or deprecated) to prevent confusion. + +### Edge protection + +Instead of modifying your contract, apply ACE policies at the integration points that interact with it — for example, a DEX pool, a bridge, or a lending protocol front end. + +**How it works:** The protected contract is not your original contract, but the integration layer. A DEX pool contract or a custom router contract inherits `PolicyProtected` and enforces compliance checks before interacting with your original token or vault. Your contract is never modified. + +**When to use:** Modifying the contract is not an option (immutable deployment, no migration path), and you can control the integration points where compliance matters. Works well when compliance is needed at specific boundaries rather than on every direct interaction. + +**Tradeoffs:** + +- **Does not protect direct contract interactions** — any user who calls your contract directly (bypassing the protected integration point) is not subject to policy checks. +- Only covers the specific integration points where ACE is applied. Comprehensive coverage requires wrapping all relevant entry points. +- The original contract's functionality is unchanged, which may be a regulatory concern if direct access remains open. + + + +## FAQ + +### Will this upgrade overwrite my existing state? + +No. `PolicyProtectedUpgradeable` uses ERC-7201 namespaced storage, which stores ACE data in an isolated slot. Your existing balances, allowances, and all other state remain untouched. + +### What happens to token balances and allowances? + +All state is preserved. The upgrade replaces the implementation contract (the code), but all state lives in the proxy's storage and is not affected. Users do not need to re-approve. + +### What about tokens held in external contracts (DEXs, protocols)? + +Unaffected. Your contract address does not change, so all existing integrations continue working. The only difference is that transactions may revert if policies reject them. + +### Can I protect only some functions? + +Yes. You only add `runPolicy` to the functions you want to protect. All other functions continue working normally without policy checks. + +### Can I update policies after the upgrade? + +Yes. Policies can be added, removed, reordered, and reconfigured through the ACE Platform without touching your contract code. + +### What if I need to switch to a different PolicyEngine? + +Call `attachPolicyEngine(newAddress)` (owner-only). This detaches the old engine and registers your contract with the new one. Once ACE is integrated, a PolicyEngine is always required — you cannot set it to the zero address. + +### How many policies can I attach to a single function? + +The PolicyEngine supports up to 8 policies per function selector. + +### My contract is near the 24 KB bytecode limit. What can I do? + +Use [Approach 2](#approach-2-implement-ipolicyprotected-advanced), which adds only ~1-2 KB. You can also enable the Solidity optimizer with higher runs, move logic to external libraries, or split functionality into separate contracts. diff --git a/src/content/ace/guides/policy-manager/custom-policies.mdx b/src/content/ace/guides/policy-manager/custom-policies.mdx new file mode 100644 index 00000000000..9748a3821b4 --- /dev/null +++ b/src/content/ace/guides/policy-manager/custom-policies.mdx @@ -0,0 +1,235 @@ +--- +section: ace +title: "Custom Policies" +date: Last Modified +metadata: + description: "Write, deploy, and register your own ACE policy contract, then use it like any pre-built policy: the IPolicy contract, the config schema, registering an implementation, and creating instances." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +In addition to the [pre-built Policy Library](/ace/reference/policy-library), you can write and deploy **your own policy contract** and register it with the ACE Platform. Once registered, a custom policy behaves exactly like a library policy — you create instances of it, configure them, and attach them to protected functions. + +A custom policy implementation is **private to your organization**: it appears in your Policy Manager alongside the global library, but other organizations do not see it. + + + +## How it fits together + +A custom policy follows the same [implementation vs. instance](/ace/guides/policy-manager/manage-policies#policy-implementations-vs-policy-instances) model as library policies: + +1. **Write** a policy contract that implements the `IPolicy` interface. +1. **Deploy** it — this is your policy **implementation** contract — on each chain where you need it. +1. **Register** the implementation with the ACE Platform, providing its on-chain addresses and a **config schema**. This makes it an org-scoped policy type. +1. **Create instances** from it and **attach** them to target functions, exactly like a library policy. + +At instance-creation time, ACE's on-chain `PolicyFactory` clones your implementation into an instance and initializes it. The factory verifies that your implementation declares support for `IPolicy` (via ERC-165) — a contract that does not implement `IPolicy` cannot be instantiated. + +## Prerequisites + +- Solidity development experience and a deployment toolchain (Foundry, Hardhat, etc.). +- Familiarity with [Policy Management](/ace/concepts/policy-management) (the execution model, `run`/`postRun`, extractors, and parameters) and [Policy Ordering & Composition](/ace/concepts/policy-ordering). +- A deployed [PolicyEngine](/ace/guides/policy-manager/manage-engines). +- The `@chainlink/policy-management` contracts available in your project. + +## Step 1: Write the policy contract + +Every policy inherits from the base `Policy` contract and implements `run`. The base contract provides ownership, upgradeability, ERC-165 support, and the binding to a PolicyEngine. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Policy} from "@chainlink/policy-management/core/Policy.sol"; +import {IPolicyEngine} from "@chainlink/policy-management/interfaces/IPolicyEngine.sol"; + +contract LockoutPolicy is Policy { + string public constant override typeAndVersion = "LockoutPolicy 1.0.0"; + + mapping(address => uint256) public lockoutExpiresAt; + + /// @notice Configuration setter — locks an address for a duration (seconds). + function setLockout(address account, uint256 duration) public onlyOwner { + lockoutExpiresAt[account] = block.timestamp + duration; + } + + /// @notice Authorize setLockout so the PolicyEngine can apply configuration changes. + function authorizeConfigSelector(bytes4 selector) public pure override returns (bool) { + return selector == this.setLockout.selector; + } + + function run( + address, /* caller */ + address, /* subject */ + bytes4, /* selector */ + bytes[] calldata parameters, + bytes calldata /* context */ + ) public view override returns (IPolicyEngine.PolicyResult) { + // Always validate the inputs your policy expects. + require(parameters.length == 1, "LockoutPolicy: expected 1 parameter"); + address recipient = abi.decode(parameters[0], (address)); + + if (lockoutExpiresAt[recipient] > block.timestamp) { + revert IPolicyEngine.PolicyRejected("LockoutPolicy: address is locked out"); + } + return IPolicyEngine.PolicyResult.Continue; + } +} +``` + +Key pieces: + +- **`run(...)`** — read-only evaluation returning `Continue` (defer to the next policy), `Allowed` (approve and skip the rest of the chain), or reverting with `PolicyRejected` to block the transaction. The `parameters` array holds the extractor outputs mapped to this policy; always validate its length and decode defensively. +- **`postRun(...)`** _(optional)_ — override it to mutate state after a successful check (for example, incrementing a counter). It is `onlyPolicyEngine` and is not called when the policy rejects. +- **`configure(bytes)`** _(optional)_ — override it to decode initial configuration passed at instance creation. The base `initialize` calls it. +- **Configuration setters + `authorizeConfigSelector`** — expose owner-callable setters (like `setLockout`) to reconfigure the policy after deployment, and override `authorizeConfigSelector` to return `true` for those selectors so the PolicyEngine is allowed to call them. Selectors you do not authorize can only be called by the owner directly, not through the platform. +- **`typeAndVersion`** — a human-readable identifier, e.g. `"LockoutPolicy 1.0.0"`. + + + +## Step 2: Deploy the implementation + +Deploy your policy contract on each chain where you intend to use it. This deployed contract is the **implementation** — ACE clones it into instances; you do not attach the implementation to functions directly. Record the deployed address per chain; you need them in the next step. + + + +## Step 3: Register the implementation + +Register the deployed implementation with the Coordinator API so the platform can manage it. Provide a name, description, the on-chain addresses, and a **config schema**. + +```bash +curl -X POST https://ace.api.chain.link/v1/policy-implementations \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Lockout Policy", + "description": "Blocks transfers to locked-out recipients for a period of time", + "onchain_policy_implementations": [ + { "chain_selector": "16015286601757825753", "address": "0xYourImplementationOnSepolia" } + ], + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "lockouts": { + "type": "array", + "description": "Accounts to lock out and for how long.", + "items": { + "type": "object", + "required": ["account", "duration"], + "properties": { + "account": { "type": "string", "pattern": "^0x[a-fA-F0-9]{40}$" }, + "duration": { "type": "integer" } + } + }, + "metadata": { + "display_hints": { "network_behaviour": "apply_per_chain", "title": "Lockouts" }, + "primary_key_fields": ["account"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "setLockout", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { "name": "account", "type": "address" }, + { "name": "duration", "type": "uint256" } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { "name": "Recipient", "type": "address", "max": 1 } + ], + "initial_configs": [] + } + }' +``` + +|
Field
| Required | Description | +| -------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `name` | Yes | Human-readable name shown in Policy Manager | +| `description` | Yes | What the policy does | +| `policy_config_schema` | Yes | JSON Schema describing configurable fields, the parameters the policy consumes, and how configuration maps to on-chain setters (see below) | +| `onchain_policy_implementations` | No | Array of `{ chain_selector, address }` for your deployed implementation on each chain. ACE records these; it does **not** deploy the implementation for you. | + +The registered implementation is created with type `custom` and scoped to your organization. It now appears in `GET /policy-implementations` alongside the global library. + +## The config schema + +The `policy_config_schema` is a [JSON Schema (draft-07)](https://json-schema.org/draft-07) document with three ACE-specific parts. It drives the Platform UI, validates the configuration you supply, and tells the platform how to translate configuration into on-chain calls. + +### `properties` — configurable fields + +Each property is a configurable field of your policy. Its `metadata.on_chain_operations` map configuration changes to your contract's setter functions: + +- `add` / `remove` — for list-style fields (add or remove an entry), pointing at setters like `setLockout`. +- `replace` — for scalar fields (set a single value), pointing at a setter like `setMax`. + +Each operation carries the `function_abi` of the setter to call. **Those setters must be authorized by your contract's `authorizeConfigSelector`** — otherwise the PolicyEngine cannot call them and configuration changes will fail. + +### `policy_run_parameters` — what the policy consumes + +An ordered array declaring the parameters your `run` function expects, each with a `name`, a Solidity `type`, and a `max`: + +- `max: 1` — exactly one value at that position. +- `max: -1` — a variable number of values (must be the last parameter). Use this for policies that check an arbitrary number of addresses. + +When you attach the policy to a function, the extractor outputs you map to it must match these parameters by type and position. See [Policy Management — the extractor and mapper pattern](/ace/concepts/policy-management#the-extractor-and-mapper-pattern). + +### `initial_configs` — what is set at creation + +An array of property names that are provided when an instance is **created** (in the instance's `initial_config`) rather than configured afterward. Leave it empty to configure everything after deployment. + +## Step 4: Create and use instances + +From here, a custom policy is used exactly like a library policy: + +1. [Create a policy instance](/ace/guides/policy-manager/manage-policies#create-a-policy-instance) from your implementation, supplying an `initial_config` that matches your config schema. ACE clones your implementation through the `PolicyFactory` and initializes the instance. +1. [Attach the instance to a protected function](/ace/guides/policy-manager/manage-protections), mapping the extractor outputs to your `policy_run_parameters`. +1. [Update the configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration) over time through the authorized config selectors. + +## Manage a custom implementation + +- **Update** name, description, or on-chain addresses with `PUT /policy-implementations/{id}`. +- **Archive** with `PATCH /policy-implementations/{id}` (`{"status":"archived"}`). All instances of the implementation must be archived first. + +## Security considerations + +A custom policy runs inside the policy chain of every function it protects, so a bug or malicious construct affects those transactions. In particular: + +- Keep `run` read-only and defensive — validate `parameters` length and decode carefully. +- Ensure any external calls cannot revert the whole chain unexpectedly; return a decision rather than propagating failures. +- Treat `postRun` state changes with the same care as any state-changing external function (reentrancy, access control). + +See [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) and the [Security Model](/ace/concepts/security) for the full trust model. + +## Related pages + +- [Custom Policies Tutorial](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CUSTOM_POLICIES_TUTORIAL.md) — end-to-end contract walkthrough with a boilerplate template +- [Policy Management](/ace/concepts/policy-management) — execution model, `run`/`postRun`, parameters +- [Policy Management Contracts](/ace/reference/policy-management-contracts) — `IPolicy`, `IPolicyEngine`, and other interfaces +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policies to functions +- [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) — trust boundaries and defensive patterns diff --git a/src/content/ace/guides/policy-manager/index.mdx b/src/content/ace/guides/policy-manager/index.mdx new file mode 100644 index 00000000000..f5e4a259907 --- /dev/null +++ b/src/content/ace/guides/policy-manager/index.mdx @@ -0,0 +1,66 @@ +--- +section: ace +title: "Policy Manager Guides" +isIndex: true +date: Last Modified +metadata: + description: "Overview of the Policy Manager operational model and guides for Chainlink ACE: understand how policy engines, targets, policies, and protections fit together, integrate smart contracts, and configure compliance policies." + datePublished: "2026-04-06" + lastModified: "2026-07-17" +--- + +import { Aside, ClickToZoom } from "@components" + +These guides cover the day-to-day operations of a Policy Manager — from integrating your smart contracts with ACE to configuring and managing compliance policies. + + + +## How it all fits together + +The Policy Manager revolves around a handful of entities that work together to enforce compliance on your smart contracts. Understanding how they relate to each other makes the individual guides much easier to follow. + + + +- **PolicyEngine** — The on-chain orchestrator that evaluates policies. Everything — targets, policy instances, and extractors — is scoped to a single engine. +- **Extractors** — Modules that decode transaction calldata into named parameters (sender, amount, etc.) so policies can evaluate them. Attached to the engine at creation time. +- **Target** — A smart contract registered under an engine via the API or UI. +- **Policy Implementation** — A reusable compliance rule from the [Policy Library](/ace/reference/policy-library) (e.g., allowlist, volume limit, pause toggle). +- **Policy Instance** — A deployed copy of an implementation, configured with your specific parameters and scoped to an engine. +- **Protection** — The binding between a policy instance and a specific function on a target contract. This is what makes a function "policy-protected." +- **Data Validator** — An optional contract attached to an identity policy's credential source that validates the _contents_ of a credential (e.g., a jurisdiction allow/deny list), not just its existence. +- **Managed offchain policy (MVP)** — A CRE workflow and onchain validator managed by Chainlink that evaluate external risk data before issuing a permit for a specific transaction intent. + +### Typical setup flow + +1. [Create a PolicyEngine](/ace/guides/policy-manager/manage-engines) with extractors for your contract type (ERC-20 or ERC-3643). +1. [Integrate your contract](/ace/guides/policy-manager/contracts/ace-compatible) by inheriting `PolicyProtected` and adding the `runPolicy` modifier. +1. Deploy or upgrade your contract — it [appears as a target](/ace/guides/policy-manager/manage-targets) automatically. +1. [Create policy instances](/ace/guides/policy-manager/manage-policies) from the Policy Library with your configuration. +1. [Attach policies to functions](/ace/guides/policy-manager/manage-protections) by creating protections. + +## Smart contract integration + +- [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) — what your contract needs to work with ACE (inheriting `PolicyProtected`, adding the `runPolicy` modifier) +- [Building a New ERC-20 Token](/ace/guides/policy-manager/contracts/erc20-token) — reference implementation for a compliance-ready ERC-20 token +- [Building a New ERC-3643 Token](/ace/guides/policy-manager/contracts/erc3643-token) — reference implementation for an ERC-3643 security token +- [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) — how to add ACE compliance to an already-deployed upgradeable contract +- [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) — key security patterns and pitfalls when integrating with ACE + +## Policy engine and policy management + +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create, view, update, and archive policy engines +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register your deployed contracts as targets under a policy engine +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — browse policy implementations, create and configure policy instances +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — bind policy instances to specific functions on your target contracts +- [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators) — enforce rules on credential contents (e.g., jurisdiction allow/deny lists) by attaching Data Validators to identity policies +- [Custom Policies](/ace/guides/policy-manager/custom-policies) — write, deploy, and register your own policy contract, then use it like a library policy + + + +- [Offchain Policies](/ace/guides/policy-manager/offchain-policies) — understand the managed and custom models, configure the managed wallet screening MVP, and integrate offchain permits diff --git a/src/content/ace/guides/policy-manager/manage-data-validators.mdx b/src/content/ace/guides/policy-manager/manage-data-validators.mdx new file mode 100644 index 00000000000..df151e1976d --- /dev/null +++ b/src/content/ace/guides/policy-manager/manage-data-validators.mdx @@ -0,0 +1,197 @@ +--- +section: ace +title: "Managing Data Validators" +date: Last Modified +metadata: + description: "Create, configure, and attach Credential Data Validators in Chainlink ACE to enforce rules on credential contents — such as jurisdiction allow/deny lists — using the Coordinator API." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +A **Data Validator** is an on-chain contract that inspects the **contents** of a credential — not just whether it exists. Attaching a Data Validator to an identity-validation policy lets you enforce rules on credential data, such as "only allow investors whose credential says they are in the US or Canada" or "reject any account whose credential country is on a sanctions list". + +This guide covers creating, configuring, and attaching Data Validators. For the credential side of the workflow — linking a data schema to a credential type and issuing credentials with data — see [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas) and [Managing Credentials](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + + + +## How Data Validators fit in + +Identity-validation policies — the [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) and the [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) — resolve a caller's address to a CCID and check credentials from **credential sources**. Each credential source can optionally reference a Data Validator. + +When a credential source has a Data Validator configured, the policy performs an extra step at transaction time: + +1. Resolve the account's CCID and confirm the credential exists (attestation check). +1. Fetch the credential's stored `credentialData`. +1. Call the Data Validator's `validateCredentialData(...)`, which returns `true` or `false`. + +The credential passes only if **both** the attestation check and the data check succeed. Without a Data Validator, the source is attestation-only — it confirms the credential exists but ignores its contents. + + + +## The AllowDenyList Data Validator + +ACE provides a pre-built, audited Data Validator implementation: the **AllowDenyList Data Validator**. It validates a credential payload against an **allowlist** and a **denylist**, with an optional restriction by credential type. Its rules are: + +- If the **denylist** contains any value present in the credential, validation **fails**. +- If the **allowlist** is non-empty, at least one value in the credential must be allowlisted; otherwise validation **fails**. +- If the allowlist is empty, the allow check passes (deny-only mode). + +The first use case shipped on top of this implementation is **jurisdiction control** using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes (e.g., `US`, `CA`, `GB`). The country codes are the values checked against the allow and deny lists. + + + +## Prerequisites + +Before creating a Data Validator: + +1. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on your target chains. +1. A credential type linked to a **data schema** so its credentials carry data — for the jurisdiction use case, the ISO 3166-1 alpha-2 country code schema. See [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas). +1. Credentials issued **with data** against that credential type. See [Managing Credentials](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + +## Create a Data Validator + +A **Data Validator instance** is a deployed copy of a Data Validator implementation (such as the AllowDenyList country-code validator), configured with your specific allow and deny lists and scoped to one or more chains — the same shape as a policy instance. + +The AllowDenyList (country codes) Data Validator implementation ID is: + +```text +2aed366a-38af-4f48-b8e2-8fd1489db9fa +``` + +Create a Data Validator instance with a `POST` request. Provide the implementation ID and, for each chain, the `initial_config` with your allow and deny lists: + +```bash +curl -X POST https://ace.api.chain.link/v1/data-validators \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Jurisdiction allow/deny", + "description": "Allow US and CA, deny KP", + "data_validator_implementation_id": "2aed366a-38af-4f48-b8e2-8fd1489db9fa", + "onchain_data_validators": [ + { + "chain_selector": "16015286601757825753", + "initial_config": { + "allowlist": [{ "item": "US" }, { "item": "CA" }], + "denylist": [{ "item": "KP" }], + "supportedDataTypes": [] + } + } + ] + }' +``` + +| Field | Required | Description | +| ---------------------------------- | -------- | ------------------------------------------------------------------------- | +| `name` | Yes | Human-readable name for the instance | +| `description` | No | Description of the instance's purpose | +| `data_validator_implementation_id` | Yes | UUID of the Data Validator implementation to instantiate | +| `onchain_data_validators` | Yes | Array of per-chain deployments with `chain_selector` and `initial_config` | + +Each on-chain Data Validator starts in `creation_pending` status until deployment completes. The response includes the instance `id` and the on-chain addresses per chain. + + + +## Update a Data Validator configuration + +You can update the allow and deny lists after deployment without redeploying the validator. Configuration changes use JSON Patch and are version-checked per chain for optimistic concurrency. + +Update the configuration with a `PATCH` request. Supply `on_chains` with the `current_config_version` for each chain you are changing: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/data-validators//configs \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "patches": [ + { "op": "add", "path": "/allowlist/-", "value": "GB" } + ], + "on_chains": [ + { "chain_selector": "16015286601757825753", "current_config_version": "0" } + ] + }' +``` + +The JSON Patch format follows [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). If the `current_config_version` does not match the on-chain state, the request is rejected — re-fetch the instance and retry with the current version. + +## Attach a Data Validator to a credential source + +A Data Validator takes effect only when it is referenced by a **credential source** on an identity-validation policy. Each credential source has a `dataValidator` field: + +- `0x0000000000000000000000000000000000000000` — attestation-only (default). The source checks only that the credential exists. +- A Data Validator address — the source additionally validates credential contents through that validator. + +Set the `dataValidator` field to your deployed Data Validator address when configuring the credential source on your [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) or [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) instance. See [Managing Policies — Update policy configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration) for how to change a policy instance's configuration. + + + +## View Data Validators + +List all Data Validators: + +```bash +curl https://ace.api.chain.link/v1/data-validators \ + -H "Authorization: Apikey " +``` + +| Parameter | Description | +| ---------------------------------- | ------------------------------------ | +| `page` | Page number (default: 1) | +| `page_size` | Results per page | +| `include_onchains` | Include per-chain deployment details | +| `data_validator_implementation_id` | Filter by implementation | +| `chain_selector` | Filter by chain | +| `address` | Filter by on-chain address | +| `status` | Filter by on-chain status | + +To retrieve a specific Data Validator by ID: + +```bash +curl https://ace.api.chain.link/v1/data-validators/ \ + -H "Authorization: Apikey " +``` + +## Archive a Data Validator + +Archiving a Data Validator deactivates the instance. Before archiving, detach it from any credential source that references it (set that source's `dataValidator` back to the zero address). + +Archive a Data Validator with a `PATCH` request: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/data-validators/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' +``` + +## Related pages + +- [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy) — attestation-only vs. Data Validator checks +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — link a data schema to a credential type +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue credentials with data +- [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy that consumes Data Validators via credential sources +- [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) — grouped identity validation with routing and Data Validators +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/manage-engines.mdx b/src/content/ace/guides/policy-manager/manage-engines.mdx new file mode 100644 index 00000000000..a438abb0aa9 --- /dev/null +++ b/src/content/ace/guides/policy-manager/manage-engines.mdx @@ -0,0 +1,266 @@ +--- +section: ace +title: "Managing Policy Engines" +date: Last Modified +metadata: + description: "Create, view, update, add or remove extractors, and archive ACE policy engines using the Platform UI or the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-05-26" +--- + +import { Aside, ClickToZoom, MethodTabs } from "@components" + +A **policy engine** is the on-chain orchestrator that evaluates policies whenever a protected function is called. Each policy engine is deployed as a smart contract on one or more chains, and all your targets, policies, and protections are scoped to a specific engine. For a deeper explanation of how policy engines fit into the architecture, see [Architecture](/ace/concepts/architecture) and [Policy Management](/ace/concepts/policy-management). + + + +## Create a policy engine + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager**. + 1. Click **Create a new engine**. + 1. Complete the three-step wizard: + - **Basic details** — enter an engine name and optional description. This metadata is internal and is not written onchain. + - **Networks** — select every chain where you want this engine deployed. Only networks enabled in your CRE account appear. If you do not see a network, contact your admin to ensure it is enabled in your CRE account first. Deploy a [CRE Connect Wallet](/ace/getting-started/account-setup#4-set-up-cre-connect-wallets) on each selected chain before creating the engine. + - **Contract types** — select **ERC-20** and/or **ERC-3643**. ACE attaches all pre-built extractors for the selected types automatically. + 1. Submit the wizard and wait for onchain deployment to complete. The engine starts in `creation_pending` status until deployment finishes. + 1. Open the engine in Policy Manager and confirm its status is **Active**. Click the **gear icon** to view the onchain contract addresses and attached extractors. + + For verification and troubleshooting during deployment, see [Create a PolicyEngine](/ace/getting-started/policy-manager#create-a-policyengine) in the Policy Manager Quick Start. + + + + + + Create a policy engine with a `POST` request. Each entry in `onchain_policy_engines` specifies a `chain_selector` for a target chain (see [Supported Networks](/ace/supported-networks) for available chain selectors): + + ```bash + curl -X POST https://ace.api.chain.link/v1/policy-engines \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Production Policy Engine", + "description": "Main policy engine for compliance enforcement", + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' + ``` + + | Field | Required | Description | + | --- | --- | --- | + | `name` | Yes | Human-readable name | + | `description` | No | Description of the engine's purpose | + | `extractor_ids` | No | Array of extractor UUIDs to register with the engine | + | `onchain_policy_engines` | Yes | Array of objects with `chain_selector` values for each deployment chain | + + + + Each on-chain engine starts in `creation_pending` status until deployment completes. The response includes the engine `id` and the on-chain contract addresses. + + + + +## View policy engines + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** in the left sidebar. You see all the policy engines in your organization. + 1. Click on a policy engine to open it. The detail view has two tabs: + - **Contracts** — lists the target contracts protected by this policy engine. + - **Policy types** — lists all policy instances created for this policy engine. + + + + 1. To view the engine's on-chain details, click the **gear icon** (shown in the screenshot above) to open the settings page. There you can see: + - The **PolicyEngine contract addresses** on each network the engine is deployed to. + - The **Extractors** currently attached to this policy engine. + + + + + + List all policy engines: + + ```bash + curl https://ace.api.chain.link/v1/policy-engines \ + -H "Authorization: Apikey " + ``` + + | Parameter | Description | + | --- | --- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page (max: 100) | + | `include_onchains` | Include on-chain deployment details (default: true) | + + To retrieve a specific engine by ID: + + ```bash + curl https://ace.api.chain.link/v1/policy-engines/ \ + -H "Authorization: Apikey " + ``` + + + + +## Update a policy engine + +You can update a policy engine's name, description, and extractor associations. + + + + + + + Update a policy engine with a `PUT` request. Both `name` and `onchain_policy_engines` are required: + + ```bash + curl -X PUT https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Production Policy Engine (Updated)", + "description": "Updated description", + "extractor_ids": [""], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' + ``` + + + + +## Add or remove extractors + +Extractors decode transaction calldata into named parameters (sender, recipient, amount, etc.) so policies can evaluate them. If you forgot to attach an extractor during engine creation or need to remove one, use the `PUT /policy-engines/{id}` endpoint. + + + +### Add a missing extractor + +First, retrieve your engine to see which extractors are currently attached: + +```bash +curl https://ace.api.chain.link/v1/policy-engines/ \ + -H "Authorization: Apikey " +``` + +Check the `extractor_registrations` array in the response. Then send a PUT request that includes the existing extractor IDs plus the new one: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "My Policy Engine", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b", + "f17bbe8b-8462-4dd7-8fb7-a4973dff04fc" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' +``` + +In this example, `f17bbe8b-8462-4dd7-8fb7-a4973dff04fc` is the new extractor being added alongside two that were already attached. + +### Remove an extractor + +Send a PUT request with the `extractor_ids` array that **omits** the extractor you want to detach: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "My Policy Engine", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' +``` + + + +## Archive a policy engine + +Archiving a policy engine deactivates it and prevents any further operations. All policy instances associated with the engine must be archived first. + + + + + + + Archive a policy engine with a `PATCH` request: + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' + ``` + + + + + + +## Related pages + +- [Architecture](/ace/concepts/architecture) — how PolicyEngine contracts fit into the ACE system +- [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register contracts to protect under an engine +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/manage-policies.mdx b/src/content/ace/guides/policy-manager/manage-policies.mdx new file mode 100644 index 00000000000..cb235e63c13 --- /dev/null +++ b/src/content/ace/guides/policy-manager/manage-policies.mdx @@ -0,0 +1,207 @@ +--- +section: ace +title: "Managing Policies" +date: Last Modified +metadata: + description: "Browse policy implementations, create and configure policy instances, and update policy configurations in Chainlink ACE using the Platform UI or the Coordinator API." + datePublished: "2026-04-15" + lastModified: "2026-04-15" +--- + +import { Aside, ClickToZoom, MethodTabs } from "@components" +import PolicyInstanceBuilder from "../../../../components/ACE/PolicyInstanceBuilder/PolicyInstanceBuilder.tsx" + +This guide covers how to browse available policy types, create policy instances, and configure their parameters. For attaching policies to specific functions on your contracts, see [Protecting Target Functions](/ace/guides/policy-manager/manage-protections). + +## Policy implementations vs policy instances + +ACE distinguishes between two concepts: + +- **Policy implementation** — A reusable policy template (smart contract code) that defines specific compliance logic, such as an allowlist check or volume limit. ACE provides a [pre-built library](/ace/reference/policy-library) of audited implementations, and you can register your own [custom policy](/ace/guides/policy-manager/custom-policies) implementations, which are scoped to your organization. +- **Policy instance** — A deployed copy of a policy implementation, configured with your specific parameters and associated with a [policy engine](/ace/guides/policy-manager/manage-engines). You create a policy instance from an implementation and then attach it to target functions via [protections](/ace/guides/policy-manager/manage-protections). + +For example, the "Allow List Policy" implementation can be instantiated multiple times with different allowlists. + +## Browse policy implementations + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** in the left sidebar. + 1. Click on the policy engine you want to browse policies for. + 1. Select the **Policy types** tab. You see a list of all available policy implementations with their descriptions. + + + + + + List all policy implementations: + + ```bash + curl https://ace.api.chain.link/v1/policy-implementations \ + -H "Authorization: Apikey " + ``` + + | Parameter | Description | + | --- | --- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page (max: 100) | + | `include_onchains` | Include on-chain contract details (default: true) | + + To retrieve a specific implementation by ID: + + ```bash + curl https://ace.api.chain.link/v1/policy-implementations/ \ + -H "Authorization: Apikey " + ``` + + + + +## Create a policy instance + +A policy instance is created from a policy implementation and deployed on-chain within a policy engine. + + + + 1. From the **Policy types** tab (see [Browse policy implementations](#browse-policy-implementations) above), click on the policy implementation you want to use. + 1. Click the **+ Add instance** button. + 1. Follow the wizard to configure and create your policy instance. + + + Select a policy implementation below to see its configuration fields and get a ready-to-use curl command. Each implementation has a `policy_config_schema` that describes its configurable fields — the tool below extracts the key information you need. + + + + | Field | Required | Description | + | --- | --- | --- | + | `name` | Yes | Human-readable name for the policy instance | + | `description` | No | Description of the instance's purpose | + | `policy_implementation_id` | Yes | UUID of the policy implementation to instantiate | + | `policy_engine_id` | Yes | UUID of the policy engine to associate with | + | `onchain_policies` | No | Array of per-chain deployments with `chain_selector` and `initial_config` | + + Each on-chain policy starts in `creation_pending` status until deployment completes. + + + + + + +## View and filter policies + + + + 1. From the **Policy types** tab (see [Browse policy implementations](#browse-policy-implementations) above), click on the policy implementation type you are interested in. + 1. The list of policy instances created for that implementation type is displayed. + + + List all policy instances: + + ```bash + curl https://ace.api.chain.link/v1/policies \ + -H "Authorization: Apikey " + ``` + + | Parameter | Description | + | --- | --- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page (max: 100) | + | `include_onchains` | Include on-chain deployment details (default: true) | + | `target_id` | Filter by target | + | `policy_engine_id` | Filter by policy engine | + | `name` | Filter by name | + | `status` | Filter by on-chain status (`creation_pending`, `creation_failed`, `created`) | + | `only_with_active_protections` | Return only policies attached to at least one target function | + | `target_address` | Filter by target contract address | + + To retrieve a specific policy by ID: + + ```bash + curl https://ace.api.chain.link/v1/policies/ \ + -H "Authorization: Apikey " + ``` + + + + +## Update policy configuration + +After deploying a policy instance, you can update its on-chain configuration parameters — for example, adding an address to an allowlist or changing a volume threshold — without redeploying the policy. + + + + 1. From the policy instances list (see [View and filter policies](#view-and-filter-policies) above), click on the policy instance you want to update. + 1. A detail drawer opens on the right side of the screen. + 1. Click the **Edit configuration** button to modify the policy's parameters. + 1. Follow the wizard to update the policy's configuration. + + + Update policy configurations with a `PATCH` request using JSON patch operations: + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/policies//configs \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "patches": [ + { + "op": "add", + "path": "/allowList/-", + "value": "0x3333333333333333333333333333333333333333" + } + ] + }' + ``` + + The JSON patch format follows [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). Common operations: + + | Operation | Description | Example | + | --- | --- | --- | + | `add` | Add a value | Add an address to an allowlist | + | `remove` | Remove a value | Remove an address from a list | + | `replace` | Replace a value | Change a threshold | + + + + +## Archive a policy + +Archiving a policy instance removes it from active use. All target protections that reference this policy must be archived first. + + + + + + + Archive a policy with a `PATCH` request: + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/policies/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' + ``` + + + + + + +## Related pages + +- [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work +- [Policy Library](/ace/reference/policy-library) — pre-built policy implementations with configuration details +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine your policies belong to +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policy instances to target functions +- [Policy Ordering & Composition](/ace/concepts/policy-ordering) — how to compose effective rulesets +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/manage-protections.mdx b/src/content/ace/guides/policy-manager/manage-protections.mdx new file mode 100644 index 00000000000..cc56b8e3177 --- /dev/null +++ b/src/content/ace/guides/policy-manager/manage-protections.mdx @@ -0,0 +1,220 @@ +--- +section: ace +title: "Protecting Target Functions" +date: Last Modified +metadata: + description: "Create, view, update, and archive target protections to bind policy instances to specific contract functions in Chainlink ACE using the Platform UI or the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-05-26" +--- + +import { Aside, MethodTabs } from "@components" + +A **target protection** is the link between a [policy instance](/ace/guides/policy-manager/manage-policies) and a specific function on a [target contract](/ace/guides/policy-manager/manage-targets). When a user calls the protected function, the policy engine evaluates the bound policies in order and decides whether to allow or reject the transaction. Target protections are the final step in setting up on-chain compliance enforcement. + +## Prerequisites + +Before creating a target protection, you need: + +1. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on your target chains. +1. A [target contract](/ace/guides/policy-manager/manage-targets) registered under that engine. +1. A [policy instance](/ace/guides/policy-manager/manage-policies) created from a policy implementation and associated with the same engine. +1. Extractors attached to the engine that support the function signatures you want to protect (see the [Policy Manager Quick Start](/ace/getting-started/policy-manager#extractor-ids-for-api-creation) for the full list). + +## Create a target protection + +A protection binds a policy instance to a specific function on your target contract. Once created, every call to that function is evaluated against the policy. + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** in the left sidebar. + 1. Click on the policy engine that manages your target contract. + 1. In the **Contracts** tab, click on the target contract you want to protect. + 1. Click the **Attach Policy** button. + 1. **Step 1 — Select policy:** Choose the policy type and the specific policy instance you want to use. + 1. **Step 2 — Define protected functions:** Use the **Contract functions** dropdown to select a function to protect. For each function, choose the **Execution order**: + - **Last (default)** — the policy is added at the end of the evaluation chain. + - **First** — the policy is evaluated before all other policies on this function. + + To protect multiple functions with the same policy, click **Add more** and repeat for each function. + + + + 1. **Step 3 — Review and deploy:** Confirm your selections and deploy the protection. + + + + Create a target protection with a `POST` request: + + ```bash + curl -X POST https://ace.api.chain.link/v1/targets//protections \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "function_signature": "transfer(address,uint256)", + "policy_instance_id": "", + "desired_position": 0, + "extractor_output_ids": [ + "", + "" + ], + "onchain_target_protections": [ + { "chain_selector": "16015286601757825753" } + ] + }' + ``` + + | Field | Required | Description | + | --- | --- | --- | + | `function_signature` | Yes | The function to protect (e.g., `transfer(address,uint256)`) | + | `policy_instance_id` | Yes | UUID of the policy instance to bind | + | `desired_position` | No | Evaluation order (0 is first). Determines where in the policy chain this policy runs | + | `extractor_output_ids` | No | Array of extractor output UUIDs mapping extracted calldata to the policy's parameters | + | `onchain_target_protections` | No | Array of objects with `chain_selector` to specify deployment chains | + + Each on-chain protection starts in `creation_pending` status until the `AddPolicy` call completes. The combination of policy instance, target, and function selector must be unique. + + + + +## Position and evaluation order + +The `desired_position` determines the order in which policies are evaluated when a protected function is called: + +- **Position 0** is evaluated first. +- Policies are evaluated sequentially. If a policy returns **Reject**, the transaction is reverted immediately and remaining policies are not evaluated. +- If all policies return **Allow**, or if no policy explicitly rejects, the `desired_default_allow` setting on the [target](/ace/guides/policy-manager/manage-targets#default-allow-behavior) determines the outcome. + +For detailed information on composing effective rulesets, see [Policy Ordering & Composition](/ace/concepts/policy-ordering). + +## View protections + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** in the left sidebar. + 1. Click on the policy engine, then click on the target contract. + 1. Choose one of two views: + - **Functions** — groups protections by function. You see two sections: **Unprotected functions** (no policies attached) and **Protected functions** (with the policies protecting each function and their deployment status). + - **Policies** — groups protections by policy instance. Each policy card shows which functions it protects. + + You can also filter by **Policy** or **Status** using the dropdowns at the top. + + + + List all protections for a target: + + ```bash + curl https://ace.api.chain.link/v1/targets//protections \ + -H "Authorization: Apikey " + ``` + + | Parameter | Description | + | --- | --- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page (max: 100) | + | `include_onchains` | Include per-chain deployment details (default: true) | + | `function_signature` | Filter by function signature | + | `policy_instance_id` | Filter by policy instance | + | `status` | Filter by on-chain status (`creation_pending`, `created`, `removal_pending`, etc.) | + + To retrieve a specific protection: + + ```bash + curl https://ace.api.chain.link/v1/targets//protections/ \ + -H "Authorization: Apikey " + ``` + + + + +## Manage an existing protection + +From the **Functions** or **Policies** view on your target contract (see [View protections](#view-protections) above), click on a policy instance to open a detail drawer. From there you can: + +- **Detach policy** — removes the protection so the policy no longer evaluates this function (see [Archive a protection](#archive-a-protection) below). +- **Edit instance** — opens the policy instance configuration (see [Update policy configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration)). + +### Extend a protection to additional chains + +If you created a protection on one chain and later want it to apply on additional chains, you can extend it via the API. + + + + + + + Extend a protection to additional chains with a `PUT` request: + + ```bash + curl -X PUT https://ace.api.chain.link/v1/targets//protections/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "onchain_target_protections": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" } + ] + }' + ``` + + + + + + +### Archive a protection + +Archiving a protection unbinds the policy from the function. Once archived, the policy no longer evaluates transactions on that function. + + + + 1. From the **Functions** or **Policies** view on your target contract, click on the policy instance you want to detach. + 1. In the detail drawer, click **Detach policy**. + + + Archive a protection with a `PATCH` request: + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/targets//protections/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' + ``` + + + + + + +## Archival dependency chain + +ACE enforces an ordered archival flow. You must archive resources from the outside in: + +1. **Target protections** — archive these first +1. **Policy instances** — archive after all protections referencing them are archived +1. **Targets** — archive after all protections on the target are archived +1. **Policy engines** — archive after all policies in the engine are archived + +## Related pages + +- [Policy Ordering & Composition](/ace/concepts/policy-ordering) — how evaluation order affects transaction outcomes +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine that manages policies +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register contracts to protect +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/manage-targets.mdx b/src/content/ace/guides/policy-manager/manage-targets.mdx new file mode 100644 index 00000000000..77f2bcac7ba --- /dev/null +++ b/src/content/ace/guides/policy-manager/manage-targets.mdx @@ -0,0 +1,279 @@ +--- +section: ace +title: "Managing Targets" +date: Last Modified +metadata: + description: "Register, view, configure, and archive target contracts in Chainlink ACE using the Platform UI or the Coordinator API." + datePublished: "2026-04-06" + lastModified: "2026-04-06" +--- + +import { Aside, MethodTabs } from "@components" + +A **target** is a smart contract protected by ACE. After deploying your [ACE-compatible contract](/ace/guides/policy-manager/contracts/ace-compatible), you register it as a target under a PolicyEngine. Once registered, you can configure the [default policy result](#default-allow-behavior) and attach [policies](/ace/guides/policy-manager/manage-policies) to its functions via [protections](/ace/guides/policy-manager/manage-protections). + + + +## Register a target + +After deploying your contract, register it as a target with a `POST` request. Provide the contract name, type, protected methods, and on-chain addresses: + +```bash +curl -X POST https://ace.api.chain.link/v1/targets \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token", + "description": "Production ERC-20 token with compliance enforcement", + "policy_engine_id": "", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)" + #[any other methods you want to protect] + ], + "desired_default_allow": true, + "metadata": {"contract_type": "ERC-20"}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0xYourContractAddressOnSepolia" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xYourContractAddressOnArbitrumSepolia" + }, + #[any other chains where your contract is deployed] + ] + }' +``` + +| Field | Required | Description | +| ----------------------- | -------- | ------------------------------------------------------------- | +| `title` | Yes | Human-readable name for the target | +| `description` | No | Description of the contract | +| `policy_engine_id` | Yes | UUID of the policy engine to associate with | +| `protected_methods` | No | Array of function signatures that can be protected | +| `desired_default_allow` | No | Whether to allow transactions by default (default: `true`) | +| `onchain_targets` | No | Array of objects with `chain_selector` and contract `address` | +| `metadata` | No | Arbitrary JSON metadata (e.g., `{"contract_type": "ERC-20"}`) | + +## Default allow behavior + +The **default policy result** controls what happens when a transaction passes through the entire policy chain and no policy explicitly returns Allow or Reject (i.e., every policy returns Continue). This is configured per target contract via the `desired_default_allow` field: + +- **`true` (default)** — The transaction is allowed. This is appropriate when you want policies to act as blockers (reject specific cases), and everything else passes through. +- **`false`** — The transaction is rejected. This is appropriate for allowlist-style enforcement where only explicitly approved transactions proceed. + +For more on how policy evaluation ordering works, see [Policy Ordering & Composition](/ace/concepts/policy-ordering#the-default-result). + +### Change the default policy result + + + + + + + Update an existing target's default with a `PUT` request. Set `desired_default_allow` to `true` (allow by default) or `false` (reject by default). Because PUT is a full replacement, include all fields you want to keep: + + ```bash + curl -X PUT https://ace.api.chain.link/v1/targets/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token", + "description": "Production ERC-20 token with compliance enforcement", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)" + ], + "desired_default_allow": false, + "metadata": {"contract_type": "ERC-20"} + }' + ``` + + The Coordinator calls `SetTargetDefaultPolicyAllow` on the PolicyEngine contract for each chain where the target is deployed. + + + + +## View targets + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** in the left sidebar. You see all the policy engines in your organization. + 1. Click on a policy engine to open it. The **Contracts** tab lists all target contracts protected by this policy engine. + 1. Click on a target contract card to see its details. You can switch between two views: + - **Functions** — shows unprotected and protected functions, along with the policies protecting each protected function. + - **Policies** — shows the list of policies protecting this target contract and which specific functions each policy applies to. + + + List all targets: + + ```bash + curl https://ace.api.chain.link/v1/targets \ + -H "Authorization: Apikey " + ``` + + | Parameter | Description | + | --- | --- | + | `page` | Page number (default: 1) | + | `page_size` | Results per page (max: 100) | + | `include_onchains` | Include on-chain contract details (default: true) | + | `policy_engine_id` | Filter by policy engine | + | `chain_selector` | Filter by chain | + | `search` | Search by target title or on-chain address | + + To retrieve a specific target by ID: + + ```bash + curl https://ace.api.chain.link/v1/targets/ \ + -H "Authorization: Apikey " + ``` + + + + +## Update a target + +You can update a target's name, description, contract type, protected methods, default allow behavior, and on-chain addresses. + + + + + + 1. In the [ACE Platform](https://app.chain.link), go to **Compliance > Policy Manager** and click on your policy engine. + 1. In the **Contracts** tab, click on the target contract you want to update. + 1. Click the **Edit** icon in the contract header. A drawer opens on the right. + 1. Update the **Name**, **Contract type**, or **Description** as needed. + 1. Click **Save changes**. + + + + + + Update a target with a `PUT` request. Include all fields you want to preserve: + + ```bash + curl -X PUT https://ace.api.chain.link/v1/targets/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token (Updated)", + "description": "Updated description", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + "mint(address,uint256)" + ], + "desired_default_allow": true, + "metadata": {"contract_type": "ERC-20"} + }' + ``` + + + + +## Link targets + +When you deploy your ACE-compatible contract on a new chain, the control plane detects it automatically and creates a separate **detected target** (titled "unknown target"). Rather than managing each chain deployment as its own target, you can **merge** detected targets into an existing target to keep a single multi-chain target with all its on-chain addresses in one place. + +### Conditions + +A detected target can be merged (linked) into an existing target when: + +- The detected target was auto-discovered — it still has the default "unknown target" title. +- The detected target has at least one on-chain address. +- A valid destination target exists in the same policy engine: it must be a different target, already named, and deployed on a **different chain** than the source (no shared chain selectors). + +If no valid destination exists, the detected target cannot be merged — you can only rename it via **Edit details**. + +### How it works + +Merging transfers the on-chain addresses from the source target(s) to the destination target, then archives the sources. After the merge, the destination target contains all chain deployments and any protections remain on the destination. + + + + 1. In the [Chainlink Platform](https://app.chain.link), go to **Compliance > Policy Manager** and open your policy engine. + 1. In the **Contracts** tab, locate the detected contract (shown as "unknown target"). + 1. Click the **three-dot menu** on the detected contract card. + 1. Click **Link to existing contract**. + 1. Select the destination contract you want to merge into. + 1. Confirm the merge. The detected contract's on-chain address is transferred to the destination and the detected target is archived. + + + Merge one or more source targets into a destination target with a `POST` request: + + ```bash + curl -X POST "https://ace.api.chain.link/v1/targets//merge" \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "source_target_ids": [""] + }' + ``` + + |
Field
| Required | Description | + | --- | --- | --- | + | `source_target_ids` | Yes | Array of UUID(s) — the detected targets whose on-chain addresses will be transferred to the destination | + + The response returns the updated destination target with all merged on-chain addresses. The source targets are archived automatically. + +
+
+ + + +## Archive a target + +Archiving a target removes it from active use. All target protections associated with the target must be archived first. + + + + + + + Archive a target with a `PATCH` request: + + ```bash + curl -X PATCH https://ace.api.chain.link/v1/targets/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' + ``` + + + + + + +## Related pages + +- [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) — how to integrate `PolicyProtected` into your contract +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine your target will use +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create policy instances to attach to your target +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policies to specific functions on your target +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/offchain-policies/grant-evaluation-access.mdx b/src/content/ace/guides/policy-manager/offchain-policies/grant-evaluation-access.mdx new file mode 100644 index 00000000000..bf3b41ab990 --- /dev/null +++ b/src/content/ace/guides/policy-manager/offchain-policies/grant-evaluation-access.mdx @@ -0,0 +1,133 @@ +--- +section: ace +title: "Granting Evaluation Access" +date: Last Modified +metadata: + description: "Grant another organization access to request offchain permit evaluations against your protected target contract. Manage evaluation access grants for cross-organization compliance workflows." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +By default, only the organization that owns a target contract can request offchain permit evaluations for it through the [Evaluation API](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). **Evaluation access grants** let you extend this capability to other organizations — for example, allowing a DEX or lending protocol to request permits against your token's compliance rules. + +When you grant evaluation access, the grantee organization can call the Evaluation API for the specified target and offchain policy. The evaluation runs against **your** managed CRE workflow and risk configuration — the grantee does not need its own offchain policy or TRM credential. + + + +## Roles and concepts + +|
Term
| Meaning | +| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Grantor** | The organization that **owns** the target contract and the offchain policy, and grants evaluation access. | +| **Grantee** | The organization that **receives** evaluation access. It can call the Evaluation API for the specified target and policy. | +| **Access grant** | The link between an offchain policy–target pair and a grantee organization. It is either `active` or `revoked`. | +| **Org ID** | The identifier of an organization. The grantee shares theirs with the grantor so the grantor can create the grant. Retrieve it with `GET /organizations/me` (Coordinator API). | + +## What the grantee can and cannot do + +An active evaluation access grant lets the grantee: + +- **Call the Evaluation API** (`POST /evaluate`) for the granted target and offchain policy. The evaluation uses the grantor's managed workflow and TRM configuration. +- **Poll evaluation status** (`GET /evaluate/{permitId}`) for evaluations the grantee started. +- **List granted targets** using `GET /targets?include_granted=true` to discover targets other organizations have shared with them. + +The grantee **cannot**: + +- Modify the offchain policy, its risk thresholds, or the protection configuration. +- Manage the target contract, its policy engine, or any other resource owned by the grantor. +- Re-share evaluation access with a third organization. + + + +## Prerequisites + +Before granting evaluation access: + +1. You have a [managed offchain policy](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) with `deployment_status: active`. +1. The offchain policy has an active [protection](/ace/guides/policy-manager/manage-protections) on the target function. +1. You know the grantee's **Org ID**. Ask them to retrieve it: + +```bash +# Run by the grantee +curl https://ace.api.chain.link/v1/organizations/me \ + -H "Authorization: Apikey " +``` + +## Grant evaluation access + +As the target and policy owner, create the grant by specifying the offchain policy ID, target ID, and the grantee's Org ID: + +```bash +curl -X POST https://ace.api.chain.link/v1/policies//targets//access-grants \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "grantee_org_id": "" + }' +``` + +The response is the created grant: + +```json +{ + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1800000000, + "revoked_at": null +} +``` + +## View who has access + +List the active and past grants for a specific offchain policy and target pair: + +```bash +curl https://ace.api.chain.link/v1/policies//targets//access-grants \ + -H "Authorization: Apikey " +``` + +Each entry includes the grantee, the status (`active` or `revoked`), and timestamps, giving you an audit trail of who was granted access and when. + +## Discover granted targets (grantee) + +As a grantee, include `include_granted=true` when listing targets to see targets other organizations have shared with you, alongside your own: + +```bash +curl "https://ace.api.chain.link/v1/targets?include_granted=true" \ + -H "Authorization: Apikey " +``` + +Once you can see a granted target, you can call the Evaluation API for it the same way you would for your own targets. See [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) for the full evaluation workflow. + +## Revoke access + +As the policy and target owner, revoke a grant by setting its status to `revoked`: + +```bash +curl -X PATCH \ + https://ace.api.chain.link/v1/policies//targets//access-grants/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "revoked" + }' +``` + +Revocation takes effect immediately. The grantee can no longer request evaluations for this target and policy. The grant record is retained with a `revoked_at` timestamp for audit purposes. To restore access later, create a new grant. + +## Related pages + +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — call the Evaluation API and submit the protected transaction +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — configure TRM screening and attach protections +- [External Registries](/ace/guides/identity-manager/external-registries) — a similar grant model for sharing identity and credential registries +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema diff --git a/src/content/ace/guides/policy-manager/offchain-policies/index.mdx b/src/content/ace/guides/policy-manager/offchain-policies/index.mdx new file mode 100644 index 00000000000..b646b7988bc --- /dev/null +++ b/src/content/ace/guides/policy-manager/offchain-policies/index.mdx @@ -0,0 +1,34 @@ +--- +section: ace +title: "Offchain Policies" +isIndex: true +date: Last Modified +metadata: + description: "Understand the Chainlink ACE offchain policy models and configure the managed wallet risk screening MVP." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +ACE offchain policies evaluate data or logic outside the blockchain before authorizing a protected onchain action. The authorization is delivered onchain as a permit that is bound to a specific transaction intent. + +ACE supports two offchain policy models: + +- **Managed offchain policies** provide an out-of-the-box workflow. You configure the risk rules and protections, while Chainlink manages the CRE workflow, external provider call, onchain validator deployment, and permit delivery. The current implementation supports wallet risk screening with TRM Wallet Screening. +- **Custom offchain policies** support bespoke compliance logic and providers. You host the policy endpoint and work with Chainlink to configure and operate the integration. + + + +## Managed offchain policy guides + +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — meet the TRM and CRE prerequisites, configure wallet risk rules, create the policy, and attach protections to target functions. +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — call the Evaluation API, monitor an evaluation, and submit the protected transaction after its permit is ready onchain. +- [Granting Evaluation Access](/ace/guides/policy-manager/offchain-policies/grant-evaluation-access) — let another organization request permit evaluations against your protected target contract. + +## Learn how offchain policies work + +See [Offchain Policies](/ace/concepts/off-chain-policies) for the architecture and execution flows of both managed and custom offchain policy models. diff --git a/src/content/ace/guides/policy-manager/offchain-policies/manage-offchain-policies.mdx b/src/content/ace/guides/policy-manager/offchain-policies/manage-offchain-policies.mdx new file mode 100644 index 00000000000..9f4931028f0 --- /dev/null +++ b/src/content/ace/guides/policy-manager/offchain-policies/manage-offchain-policies.mdx @@ -0,0 +1,288 @@ +--- +section: ace +title: "Managing Offchain Policies (MVP)" +date: Last Modified +metadata: + description: "Configure a managed Chainlink ACE offchain policy that screens wallet addresses with TRM Wallet Screening before protected transactions execute." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +ACE managed offchain risk policies screen wallet addresses with [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) before allowing a protected onchain action. You configure the risk rules and the target functions to protect. Chainlink manages the CRE workflow, deploys the onchain permit validator, calls TRM, and delivers approved permits onchain. + +This guide covers policy setup. To integrate permit requests into your application, see [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). + + + +## How the managed policy works + +Creating a managed offchain policy provisions two components: + +- A managed CRE workflow that screens the configured wallet addresses with TRM Wallet Screening. +- A [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) (CADV) contract on each selected chain. The workflow writes approved permits to this contract through the Keystone Forwarder. + +When you attach the policy to a target function, the CADV becomes part of that function's policy chain. A call without a matching permit is rejected. A permit is valid only for its caller, target, function, and extracted parameters. + +## Prerequisites + +Before creating a managed offchain risk policy, you need: + +1. An ACE organization and [ACE API key](/ace/getting-started/account-setup#3-create-an-api-key). +1. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on every chain where you want to use the policy. +1. A [target contract](/ace/guides/policy-manager/manage-targets) associated with that policy engine. +1. An extractor attached to the policy engine that supports the target function. The extractor outputs determine which transaction parameters the permit must match. +1. A Chainlink CRE account with the [CRE CLI](https://docs.chain.link/cre/getting-started/cli-installation/macos-linux) installed and authenticated. +1. A TRM Labs account with Wallet Screening API access and a valid API key. ACE does not provide a TRM account or API credentials. See [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) to learn about the product and request access. + +## Store the TRM credential in Vault DON + +The managed workflow retrieves your TRM credential from Vault DON at runtime. The credential remains encrypted and is not included in the offchain policy configuration. + +TRM uses HTTP Basic authentication with the API key as both the username and password. Before uploading it, encode `:` as Base64 without a trailing newline: + +```bash +export TRM_API_KEY="" +export TRM_BASIC_AUTH=$(printf '%s:%s' "$TRM_API_KEY" "$TRM_API_KEY" | base64 | tr -d '\n') +``` + +Create a secrets file that maps the Vault DON secret identifier to the environment variable: + +```yaml +secretsNames: + trmApiKey: + - TRM_BASIC_AUTH +``` + +Upload the secret using the CRE CLI. Replace `` with your CRE target: + +```bash +cre secrets create production-secrets.yaml \ + --target \ + --secrets-auth=browser +``` + +The identifier under `secretsNames` is the value to use for `secret_name` when you create the policy. In this example, it is `trmApiKey`. + +For prerequisites, authentication options, secret lifecycle operations, and troubleshooting, see [Using Secrets with Deployed Workflows](https://docs.chain.link/cre/guides/workflow/secrets/using-secrets-deployed). + + + +## Configure the risk policy + +The `wallet_risk_scoring` policy supports the following configuration: + +|
Field
| Required | Description | +| ------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `secret_name` | Yes | Vault DON identifier containing the Base64-encoded TRM Basic Auth credential. | +| `addresses_to_check` | Yes | Which addresses to screen: `CALLER`, `PARAMETERS`, or `ALL`. | +| `risk_threshold` | Yes | Reject an address whose highest TRM risk level is at or above this threshold: `LOW`, `MEDIUM`, `HIGH`, or `SEVERE`. | +| `block_unknown` | No | When `true`, reject an address whose TRM risk level is `UNKNOWN`. Defaults to `false`. | +| `category_filters` | No | Category-specific thresholds. Each entry contains `category` and an optional `threshold`. If omitted, the global `risk_threshold` applies to that category. | +| `fail_mode` | No | `CLOSED` fails the evaluation when TRM returns an unsuccessful HTTP response. `OPEN` allows it to continue. Defaults to `CLOSED`. | + +### Select addresses to screen + +The `addresses_to_check` setting controls which addresses are sent to TRM: + +|
Value
| Addresses screened | +| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CALLER` | Only `caller_address` from the evaluation request. | +| `PARAMETERS` | Addresses found in `permit_parameters`. The first permit parameter represents the sender; subsequent address values are identified from the function signature. | +| `ALL` | The caller and all addresses found in `permit_parameters`, with duplicates removed. | + +For an ERC-20 `transfer(address,uint256)` evaluation with permit parameters `[from, to, amount]`, `CALLER` screens `from`, while `PARAMETERS` and `ALL` screen both `from` and `to`. + +The workflow accepts at most ten unique addresses per evaluation. + +### Apply global and category thresholds + +TRM assigns an overall risk level to each address. ACE orders the levels as follows: + +```text +UNKNOWN < LOW < MEDIUM < HIGH < SEVERE +``` + +An address is rejected when its overall level meets or exceeds `risk_threshold`. For example, a `HIGH` threshold rejects `HIGH` and `SEVERE` results. + +You can also apply different thresholds to individual TRM risk categories. The following configuration rejects: + +- Any address with an overall risk level of `HIGH` or `SEVERE`. +- Any `Sanctions` indicator at `LOW` or above. +- Any `Darknet Market` indicator at `MEDIUM` or above. + +```json +{ + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" }, + { "category": "Darknet Market", "threshold": "MEDIUM" } + ] +} +``` + +Category names are matched case-insensitively against the categories returned by TRM. Consult your TRM Wallet Screening account for the categories available to your organization. + + + +## Create the offchain policy + +Create the policy with `POST /v1/policies`. Use the same policy engine and chains as the target you plan to protect: + +```bash +curl -X POST https://ace.api.chain.link/v1/policies \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "name": "Transaction wallet screening", + "type": "wallet_risk_scoring", + "policy_engine_id": "", + "onchain_policies": [ + { "chain_selector": "" } + ], + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" }, + { "category": "Darknet Market", "threshold": "MEDIUM" } + ] + } + }' +``` + +ACE allows one active offchain policy per organization. Creating another returns a conflict until the existing policy is archived. + +Policy creation is asynchronous. The initial response includes the policy ID and a `deployment_status` such as `pending` or `deploying`. Poll the policy until it becomes `active`: + +```bash +curl https://ace.api.chain.link/v1/policies/ \ + -H "Authorization: Apikey " +``` + +ACE creates a managed CRE workflow and deploys one CADV contract per selected chain. When the policy becomes active, `action_validators` contains each chain selector and CADV address. + + + +## Attach the policy to a target function + +A protection connects the managed policy to a function on your target. The `extractor_output_ids` must identify, in order, the values that the permit will bind to onchain. + +For `transfer(address,uint256)`, use the `from`, `to`, and `amount` outputs from the same `ERC20TransferExtractor`: + +```bash +curl -X POST https://ace.api.chain.link/v1/targets//protections \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "policy_instance_id": "", + "function_signature": "transfer(address,uint256)", + "desired_position": 0, + "extractor_output_ids": [ + "", + "", + "" + ], + "onchain_target_protections": [ + { "chain_selector": "" } + ] + }' +``` + +The selected chains must be a subset of the chains configured on the offchain policy. The target and policy must also belong to the same policy engine. + +Protection attachment is asynchronous and returns `202 Accepted`. Poll the policy's protections until the new protection becomes `active`: + +```bash +curl https://ace.api.chain.link/v1/policies//protections \ + -H "Authorization: Apikey " +``` + +Once active, calls to the protected function require a matching permit. Continue with [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). + +## Update the policy configuration + +Updating the configuration redeploys the managed workflow but does not replace its CADV contracts or protections: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policies//config \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "SEVERE", + "block_unknown": true, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" } + ] + } + }' +``` + +The policy enters `config_updating` and returns to `active` after the workflow is redeployed. Do not request new evaluations while the configuration is updating. + +## Remove a protection or policy + +Remove a protection before archiving its policy: + +```bash +curl -X DELETE \ + https://ace.api.chain.link/v1/policies//protections/ \ + -H "Authorization: Apikey " +``` + +The removal is asynchronous. After all protections are removed, archive the policy: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/policies/ \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "status": "archived" + }' +``` + +Archiving removes the managed workflow and its event watchers. It also allows the organization to create a new offchain policy. + +## Beta and MVP limitations + +- `wallet_risk_scoring` is the only managed offchain policy type. +- Each organization can have one active offchain policy. +- Each evaluation can screen at most ten unique addresses. +- Every permit is single-use (`maxUses = 1`) and does not expire (`expiry = 0`). These values are not configurable in the current release. +- The values in `permit_parameters` must match the outputs configured on the protection and the values extracted from the eventual onchain call. +- General CRE service limits also apply. See [CRE Service Quotas](https://docs.chain.link/cre/service-quotas). + +## Related pages + +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — integrate evaluations and permits into an application +- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) — conceptual overview of managed and custom offchain policies +- [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) — onchain permit validation +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — protection concepts and evaluation order +- [Coordinator API Reference](/api/ace/coordinator/docs) — policy and protection API schemas diff --git a/src/content/ace/guides/policy-manager/offchain-policies/request-offchain-permits.mdx b/src/content/ace/guides/policy-manager/offchain-policies/request-offchain-permits.mdx new file mode 100644 index 00000000000..c00ada3c1b6 --- /dev/null +++ b/src/content/ace/guides/policy-manager/offchain-policies/request-offchain-permits.mdx @@ -0,0 +1,249 @@ +--- +section: ace +title: "Requesting Offchain Permits" +date: Last Modified +metadata: + description: "Call the Chainlink ACE Evaluation API, monitor a TRM wallet risk evaluation, and use the resulting permit for a protected onchain transaction." + datePublished: "2026-07-17" + lastModified: "2026-07-17" +--- + +import { Aside } from "@components" + +After a managed offchain risk policy protects a function, the function rejects calls that do not have a matching permit. Your application must request an evaluation, wait for the permit to be stored onchain, and then submit the protected transaction. + +This guide uses an ERC-20 `transfer(address,uint256)` as the example. For policy and protection setup, see [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies). + + + +## Evaluation flow + +1. Your application describes the intended transaction to the ACE Evaluation API. +1. ACE triggers the managed CRE workflow for your organization. +1. The workflow extracts the configured addresses and screens them with TRM Wallet Screening. +1. If the risk rules reject any address, the evaluation becomes `rejected` and no permit is created. +1. If the risk rules pass, the workflow writes a permit to the CADV contract through the Keystone Forwarder. +1. After ACE observes the onchain `PermitStored` event, the evaluation becomes `ready`. +1. Your application submits the protected transaction with the same caller, target, function, and parameter values. +1. The policy engine finds and consumes the permit. The permit cannot authorize another transaction. + +## Prerequisites + +Before requesting an evaluation, verify that: + +- The offchain policy has `deployment_status: active`. +- Its protection for the target function has `status: active`. +- You know the target contract address and chain selector. +- You know the wallet that will submit the onchain transaction. It must be the same address as `caller_address`. +- You know the ordered extractor outputs configured on the protection. Your `permit_parameters` must use that same order. + +## Evaluation API + +The production Evaluation API base URL is: + +```text +https://ace.api.chain.link/v1/evaluation +``` + +It uses the same ACE API key as the Coordinator API: + +```http +Authorization: Apikey +``` + + + +## Construct the evaluation request + +Start an evaluation with `POST /evaluate`: + +```json +{ + "caller_address": "0x1111111111111111111111111111111111111111", + "subject": "0x2222222222222222222222222222222222222222", + "function_signature": "transfer(address,uint256)", + "parameters": { + "to": "0x3333333333333333333333333333333333333333", + "amount": "100" + }, + "permit_parameters": [ + "0x0000000000000000000000001111111111111111111111111111111111111111", + "0x0000000000000000000000003333333333333333333333333333333333333333", + "0x0000000000000000000000000000000000000000000000000000000000000064" + ], + "chain_selector": "", + "unique_evaluation_id": "transfer-018f6b3e-7c42-7a1f-a8ed-5ecf90c03b30" +} +``` + +|
Field
| Description | +| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| `caller_address` | Wallet that will submit the protected transaction. | +| `subject` | Address of the protected target contract. | +| `function_signature` | Canonical function signature, such as `transfer(address,uint256)`. Do not send the four-byte selector. | +| `parameters` | Structured representation of the function arguments. ACE stores it with the evaluation as contextual data. | +| `permit_parameters` | Ordered ABI-encoded values used for address screening and exact onchain permit matching. | +| `chain_selector` | Chain where the target, policy engine, protection, and CADV are deployed. | +| `unique_evaluation_id` | Client-generated identifier unique to this transaction intent. ACE uses it to derive the permit ID. | + +### Encode permit parameters + +Each `permit_parameters` item is a `0x`-prefixed, 32-byte ABI word. The items must have the same order as the `extractor_output_ids` on the protection. + +For `transfer(address,uint256)`, the `ERC20TransferExtractor` produces: + +```text +[from, to, amount] +``` + +Therefore, encode: + +1. `from`: the transaction caller, as an ABI `address`. +1. `to`: the transfer recipient, as an ABI `address`. +1. `amount`: the transfer amount, as an ABI `uint256`. + +Use a standard ABI library rather than concatenating untrusted values manually. For example, with ethers v6: + +```javascript +import { AbiCoder } from "ethers" + +const abiCoder = AbiCoder.defaultAbiCoder() + +const permitParameters = [ + abiCoder.encode(["address"], [callerAddress]), + abiCoder.encode(["address"], [recipientAddress]), + abiCoder.encode(["uint256"], [amount]), +] +``` + + + +### Choose a unique evaluation ID + +`unique_evaluation_id` is scoped to your ACE organization. ACE combines it with the organization ID to derive a deterministic `permit_id`. + +Retrying with the same `unique_evaluation_id` is idempotent: ACE returns the existing evaluation instead of triggering another workflow execution. Never reuse an ID for a different caller, target, function, or set of parameters. + +Use a UUID or another collision-resistant identifier generated by your backend. Store it with the transaction intent so you can safely recover from a lost HTTP response. + +## Start the evaluation + +```bash +curl -X POST https://ace.api.chain.link/v1/evaluation/evaluate \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d @evaluation.json +``` + +The response contains the deterministic permit ID and initial status: + +```json +{ + "permit_id": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "status": "evaluating" +} +``` + +The response does not mean that the transaction is approved. Wait until the evaluation becomes `ready`. + +## Poll the evaluation + +Retrieve the evaluation using the returned permit ID: + +```bash +curl \ + https://ace.api.chain.link/v1/evaluation/evaluate/ \ + -H "Authorization: Apikey " +``` + +Polling every five seconds is a reasonable default. Stop when the evaluation reaches a terminal status. + +| Status | Terminal | Meaning | +| ------------ | -------- | ----------------------------------------------------------------------------------- | +| `evaluating` | No | The workflow is screening the configured addresses. | +| `approving` | No | TRM checks passed and the workflow is publishing the permit onchain. | +| `ready` | Yes | The permit was stored onchain. The protected transaction can now be submitted. | +| `rejected` | Yes | At least one configured risk rule rejected the evaluation. No permit was created. | +| `error` | Yes | The evaluation or onchain permit publication failed. No usable permit is available. | + +For `rejected` and `error`, the response can include a `reason`. `workflow_execution_id` identifies the CRE execution when available. Because permits do not expire in the current release, `expires_at` is normally `null`. + +```json +{ + "permit_id": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "status": "ready", + "reason": null, + "workflow_execution_id": "", + "expires_at": null +} +``` + +## Retry an evaluation + +The CRE HTTP trigger allows one new execution per workflow every 60 seconds. Polling an existing evaluation does not trigger the workflow and is not subject to that trigger rate. + +- If the initial HTTP response is lost or ambiguous, retry `POST /evaluate` with the same `unique_evaluation_id`. ACE returns the existing evaluation if it was created. +- If an evaluation reaches `rejected`, changing the identifier alone does not change the policy decision. Review the risk result or transaction intent. +- If an evaluation reaches `error` and the underlying issue is resolved, wait at least 60 seconds and submit a new evaluation with a new `unique_evaluation_id`. + +See [CRE Service Quotas](https://docs.chain.link/cre/service-quotas) for current workflow limits. + +## Submit the protected transaction + +Submit the transaction only after the evaluation becomes `ready`. The sender must be `caller_address`, and the target function must receive values that produce the same extracted parameters as `permit_parameters`. + +No permit bytes are added to the transaction. The CADV already stores the permit and looks it up from the action's caller, target, selector, and extracted parameters. + +After the protected call succeeds, the CADV increments the permit's usage counter. Managed risk policy permits have `maxUses = 1`, so another transaction with the same intent requires a new evaluation and permit. + + + +## Troubleshooting + +### Evaluation is rejected + +- At least one address met or exceeded the global `risk_threshold`. +- A TRM risk indicator met or exceeded a configured category threshold. +- TRM returned `UNKNOWN` and `block_unknown` is enabled. + +Review the response `reason` and the policy configuration. Do not retry a rejected intent without understanding why it was rejected. + +### Evaluation returns an error + +- The Vault DON secret identifier does not match `secret_name`. +- The TRM credential was not encoded as `:` before Base64 encoding. +- TRM or the CRE confidential HTTP request failed. +- The selected chain does not have an active CADV for the policy. +- The workflow could not write the permit onchain. + +If a TRM HTTP error should allow the action, review the policy's `fail_mode`. Use `OPEN` only after assessing the compliance impact. + +### Evaluation is ready but the transaction reverts + +- The transaction sender differs from `caller_address`. +- The target address or function differs from the evaluation. +- The eventual transaction produces different extractor values than `permit_parameters`. +- The protection's extractor outputs are missing or ordered differently. +- The permit has already been consumed. +- Another policy in the target function's policy chain rejected the call. + +## Related pages + +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — configure TRM screening and attach protections +- [Granting Evaluation Access](/ace/guides/policy-manager/offchain-policies/grant-evaluation-access) — let another organization request evaluations against your target +- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) — conceptual overview +- [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) — how permits are stored and consumed onchain +- [Evaluation API Reference](/api/ace/evaluation/docs) — complete request, response, and error schemas +- [CRE Service Quotas](https://docs.chain.link/cre/service-quotas) — current CRE workflow limits diff --git a/src/content/ace/index.mdx b/src/content/ace/index.mdx index 2aace1ea705..d4666f521b7 100644 --- a/src/content/ace/index.mdx +++ b/src/content/ace/index.mdx @@ -5,16 +5,14 @@ isIndex: true date: Last Modified metadata: description: "Chainlink ACE (Automated Compliance Engine) provides programmable, cross-chain compliance for smart contracts. Learn how ACE enables modular policy management and cross-chain identity verification." - datePublished: "2026-04-20" - lastModified: "2026-08-18" + datePublished: "2026-03-31" + lastModified: "2026-07-17" --- -import { Aside, ClickToZoom } from "@components" +import { ClickToZoom } from "@components" +import AceCallout from "@features/ace/callouts/AceCallout.astro" - + **Chainlink Automated Compliance Engine (ACE)** is a compliance layer for EVM smart contracts. It enforces rules — transfer limits, identity checks, sanctions screening, and more — at transaction time, without embedding compliance logic in your application code. Rules can be added, updated, or removed through the ACE Platform — your application contract doesn't need to change. @@ -102,9 +100,8 @@ Start here regardless of your role: - **[Policy Manager](/ace/concepts/policy-management)** — Configure and manage compliance policies for your smart contracts. - **[Identity Manager](/ace/concepts/cross-chain-identity)** — Manage cross-chain identities and credentials. +- **[API Reference](/ace/reference/apis)** — Use the Coordinator, Evaluation, and Reporting APIs programmatically. - **[Policy Library](/ace/reference/policy-library)** — All pre-built policies with configuration details. - **[Policy Ordering & Composition](/ace/concepts/policy-ordering)** — How to compose effective rulesets. -- **[Coordinator API](/ace/reference/api/coordinator)** — Manage ACE resources programmatically. -- **[Evaluation API](/ace/reference/api/evaluation)** — Request managed offchain policy evaluations and permits. -- **[Reporting API](/ace/reference/api/reporting)** — Query compliance state and transaction history. +- **[Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible)** — Integration guide for developers adding ACE to new or existing smart contracts. - **[Signing & Ownership Model](/ace/concepts/signing-ownership)** — Understand delegated and self-signing models. diff --git a/src/content/ace/llms-full.txt b/src/content/ace/llms-full.txt index 0e97c61ff5c..1885ca8cf0d 100644 --- a/src/content/ace/llms-full.txt +++ b/src/content/ace/llms-full.txt @@ -1,11 +1,8 @@ # Chainlink ACE Overview Source: https://docs.chain.link/ace -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 - + **Chainlink Automated Compliance Engine (ACE)** is a compliance layer for EVM smart contracts. It enforces rules — transfer limits, identity checks, sanctions screening, and more — at transaction time, without embedding compliance logic in your application code. Rules can be added, updated, or removed through the ACE Platform — your application contract doesn't need to change. @@ -88,23 +85,19 @@ Start here regardless of your role: - **[Policy Manager](/ace/concepts/policy-management)** — Configure and manage compliance policies for your smart contracts. - **[Identity Manager](/ace/concepts/cross-chain-identity)** — Manage cross-chain identities and credentials. +- **[API Reference](/ace/reference/apis)** — Use the Coordinator, Evaluation, and Reporting APIs programmatically. - **[Policy Library](/ace/reference/policy-library)** — All pre-built policies with configuration details. - **[Policy Ordering & Composition](/ace/concepts/policy-ordering)** — How to compose effective rulesets. -- **[Coordinator API](/ace/reference/api/coordinator)** — Manage ACE resources programmatically. -- **[Evaluation API](/ace/reference/api/evaluation)** — Request managed offchain policy evaluations and permits. -- **[Reporting API](/ace/reference/api/reporting)** — Query compliance state and transaction history. +- **[Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible)** — Integration guide for developers adding ACE to new or existing smart contracts. - **[Signing & Ownership Model](/ace/concepts/signing-ownership)** — Understand delegated and self-signing models. --- # Beta Scope Source: https://docs.chain.link/ace/beta-scope -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 - + ACE Beta is an early-access release for testing and integration on supported mainnet and testnet networks. The limitations listed below are all areas of active development. Each will be addressed as ACE progresses toward general availability. @@ -114,10 +107,10 @@ ACE Beta is available on selected [mainnet and testnet networks](/ace/supported- ## No custom extractors or mappers -ACE Beta provides a library of [pre-built, audited policies](/ace/reference/policy-library) (allowlists, volume limits, role-based access control, pause controls, and more). You can also register your own [custom policies](/ace/concepts/policy-management). The following customizations are **not available** through the platform during Beta: +ACE Beta provides a library of [pre-built, audited policies](/ace/reference/policy-library) (allowlists, volume limits, role-based access control, pause controls, and more). You can also register your own [custom policies](/ace/guides/policy-manager/custom-policies). The following customizations are **not available** through the platform during Beta: -- **Custom extractors**: Writing extractors for function signatures beyond the pre-built ERC-20 and ERC-3643 set. -- **Custom mappers**: Deploying mapper contracts that transform or combine extracted parameters before they reach a policy. +- **Custom extractors** — Writing extractors for function signatures beyond the pre-built ERC-20 and ERC-3643 set. +- **Custom mappers** — Deploying mapper contracts that transform or combine extracted parameters before they reach a policy. Because custom extractors are not available, the platform supports **ERC-20 and ERC-3643** function signatures only. These are the only contract types that get the full managed experience — policy configuration, reporting, and monitoring — through the Platform UI and Coordinator API. If you are building a different type of contract (vault, DEX, lending protocol), making it ACE-compatible could require custom extractors. Support for additional contract types and custom extractors is on the roadmap. @@ -137,19 +130,34 @@ In addition to attestation-based checks (verifying whether a credential exists), Data Validators are a **curated catalog maintained by Chainlink**, not something organizations deploy themselves. This is **by design**: curating the available validators and their data schemas ensures no personally identifiable information (PII) are used. The first available validator supports **jurisdiction control** using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes; Chainlink may add further validators over time. Bringing your own Data Validator is not offered — this is a permanent design choice, not a Beta limitation. -For the conceptual explanation of attestation-only vs. Credential Data Validator checks, see [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). +To get started, see [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators). For the conceptual explanation of attestation-only vs. Credential Data Validator checks, see [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). ## Signing model is chosen at onboarding ACE supports two signing models: **delegated signing** (Chainlink signs and executes transactions on your behalf) and **self-signing** (you sign operations yourself using the [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk)). Your organization chooses its signing model during onboarding. -In both models, you retain full ownership of your contracts through the [CRE Connect Wallet](/ace/concepts/key-terms#cre-connect-wallet). See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each model works. +In both models, you retain full ownership of your contracts through the [CRE Connect Wallet](/ace/concepts/signing-ownership). See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each model works. ## Managed offchain risk policies are limited during Beta -ACE Beta provides a managed policy that screens transaction participants with TRM Wallet Screening and delivers approved permits onchain through a managed CRE workflow. +ACE Beta provides a managed `wallet_risk_scoring` policy that screens transaction participants with TRM Wallet Screening and delivers approved permits onchain through a managed CRE workflow. + + + +The following limitations apply: + +- **TRM access required** — Your organization must have a TRM Labs account with Wallet Screening API access and provide its own API credential through CRE Vault DON. +- **One policy type** — `wallet_risk_scoring` is the only managed offchain policy available. Custom offchain integrations require assistance from Chainlink. +- **One active policy per organization** — Archive the existing offchain policy before creating another. +- **Ten addresses per evaluation** — A workflow execution can screen at most ten unique wallet addresses. +- **Fixed permit lifetime and usage** — Managed permits are single-use and do not expire. These values are not configurable in the current release. +- **Extractor-dependent protection** — Permit parameters must correspond to supported extractor outputs and exactly match the values extracted from the eventual onchain transaction. +- **CRE quotas apply** — Evaluations are subject to current [CRE Service Quotas](https://docs.chain.link/cre/service-quotas), including the HTTP trigger rate limit. -See [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) for a conceptual overview of managed and custom offchain policies. +See [Offchain Policies](/ace/guides/policy-manager/offchain-policies) for an overview, [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) to configure wallet screening, and [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) to integrate evaluations into an application. --- @@ -157,8 +165,15 @@ See [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) for a concept Source: https://docs.chain.link/ace/supported-networks Last Updated: 2026-05-26 + + ACE Beta is available on the following networks. + + ## Mainnet networks ## Testnet networks @@ -173,24 +188,32 @@ ACE Beta is available on the following networks. # Release Notes Source: https://docs.chain.link/ace/release-notes -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 + + ## July 17, 2026 — ACE Beta+ -ACE Beta+ builds on ACE Beta with new compliance capabilities. This release is still a Beta; see [Beta Scope](/ace/beta-scope) for the current scope and limitations. +ACE Beta+ builds on ACE Beta with new compliance capabilities. This release is still a Beta — see [Beta Scope](/ace/beta-scope) for the current scope and limitations. ### What's new -- **Custom policies**: You can now write, deploy, and register your own policy contract and use it like a pre-built library policy. See [Custom policy](/ace/concepts/key-terms#custom-policy). -- **Grouped identity validation**: The new [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) applies different credential requirements to different accounts. It routes each account to a group, by credential attestation or by credential data (for example, jurisdiction), then validates the account against that group's requirements. Use it to enforce, for example, one rule set for individuals and another for businesses, or different rules per jurisdiction, within a single policy. -- **External registries**: Organizations can now share registries with each other. A registry owner grants another organization read access, and the grantee can use the shared registry's identities and credentials as a credential source in its own policies without re-issuing credentials. Access is read-only for the recipient and revocable at any time. See [Cross-Chain Identity](/ace/concepts/cross-chain-identity#sharing-registries-across-organizations). -- **Credential data validation**: Credentials are no longer limited to attestation-only. You can now link a data schema to a credential type, issue credentials that carry structured data, and attach a [Data Validator](/ace/concepts/cross-chain-identity#credential-data-and-privacy) to a policy's credential source to enforce rules on that data. The first use case is **jurisdiction control** using a pre-built AllowDenyList Data Validator with [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. Data Validators are a curated catalog maintained by Chainlink. -- **Self-signing model**: Organizations can now choose between **delegated signing** (Chainlink signs on your behalf) and **self-signing** (you sign operations yourself) at onboarding. With self-signing, ACE creates unsigned draft operations that you poll, sign (EIP-712), and submit using the [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk). Both models use the same CRE Connect Wallet and all platform capabilities work identically. See [Signing & Ownership Model](/ace/concepts/signing-ownership). -- **Managed offchain risk policies**: Screen transaction participants with [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) before allowing a protected onchain action. Configure global and category-specific risk thresholds, request evaluations through the new [Evaluation API](/ace/reference/api/evaluation), and receive single-use permits delivered onchain by a managed CRE workflow. See [Off-Chain Policy Execution](/ace/concepts/off-chain-policies). +- **Custom policies** — You can now write, deploy, and register your own policy contract and use it like a pre-built library policy. Custom policy implementations are scoped to your organization. See [Custom Policies](/ace/guides/policy-manager/custom-policies). +- **Grouped identity validation** — The new [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) applies different credential requirements to different accounts. It routes each account to a group — by credential attestation or by credential data (for example, jurisdiction) — then validates the account against that group's requirements. Use it to enforce, for example, one rule set for individuals and another for businesses, or different rules per jurisdiction, within a single policy. +- **External registries** — Organizations can now share registries with each other. A registry owner grants another organization read access, and the grantee can use the shared registry's identities and credentials as a credential source in its own policies — without re-issuing credentials. Access is read-only for the recipient and revocable at any time. See [External Registries](/ace/guides/identity-manager/external-registries). +- **Credential data validation** — Credentials are no longer limited to attestation-only. You can now link a [data schema](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas) to a credential type, issue credentials that carry structured data, and attach a [Data Validator](/ace/guides/policy-manager/manage-data-validators) to a policy's credential source to enforce rules on that data. The first use case is **jurisdiction control** using a pre-built AllowDenyList Data Validator with [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. See [Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). +- **Self-signing model** — Organizations can now choose between **delegated signing** (Chainlink signs on your behalf) and **self-signing** (you sign operations yourself) at onboarding. With self-signing, ACE creates unsigned draft operations that you poll, sign (EIP-712), and submit using the [CRE Connect SDK](https://github.com/smartcontractkit/crec-sdk). Both models use the same CRE Connect Wallet and all platform capabilities work identically. See [Signing & Ownership Model](/ace/concepts/signing-ownership). +- **Managed offchain risk policies (MVP)** — Screen transaction participants with [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) before allowing a protected onchain action. Configure global and category-specific risk thresholds, request evaluations through the new Evaluation API, and receive single-use permits delivered onchain by a managed CRE workflow. Grant evaluation access to other organizations so they can request permits against your target contracts. This feature is an MVP; contact your Chainlink representative for help with setup. See [Offchain Policies](/ace/guides/policy-manager/offchain-policies), [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies), [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits), and [Granting Evaluation Access](/ace/guides/policy-manager/offchain-policies/grant-evaluation-access). ## May 26, 2026 — Mainnet support -ACE Beta is now live on the following mainnet networks: Ethereum, Arbitrum, Avalanche, Base, and Polygon, in addition to existing testnets. See [Supported Networks](/ace/supported-networks) for chain IDs and chain selectors. +### What's new + +- **Mainnet deployments** — ACE Beta now supports mainnet on Ethereum, Arbitrum, Avalanche, Base, and Polygon, in addition to existing testnets. Mainnet access is not enabled for all organizations by default — contact your Chainlink contact to request it. See [Supported Networks](/ace/supported-networks) for chain IDs and chain selectors. + +### Other improvements + +- Policy Engine creation is now available in the Platform UI under **Compliance > Policy Manager** (previously API-only). See [Managing Policy Engines](/ace/guides/policy-manager/manage-engines#create-a-policy-engine). ## April 15, 2026 — ACE Beta (Private Release) @@ -200,9 +223,9 @@ Chainlink ACE Beta is now available to a first set of selected participants as a ACE Beta ships with three core components: -- **Policy Manager**: Create policy engines, register target contracts, configure policy instances from the pre-built library, and enforce compliance rules on-chain. -- **Identity Manager**: Set up identity registries, register on-chain identities, define credential types, and issue verifiable credentials for use in identity-based policies. -- **Reporting Manager**: Query on-chain policy configurations, identity states, and transaction history via a read-only API to support compliance verification and auditing workflows. +- **Policy Manager** — Create policy engines, register target contracts, configure policy instances from the pre-built library, and enforce compliance rules on-chain. +- **Identity Manager** — Set up identity registries, register on-chain identities, define credential types, and issue verifiable credentials for use in identity-based policies. +- **Reporting Manager** — Query on-chain policy configurations, identity states, and transaction history via a read-only API to support compliance verification and auditing workflows. All three components support multi-chain deployments across all [supported testnets](/ace/supported-networks) and are accessible via the [Chainlink Platform UI](https://app.chain.link) and the Coordinator and Reporting APIs, once Chainlink provisions your organization with ACE Beta access. @@ -214,7 +237,9 @@ This is a testnet-only release. For full details on what is supported, known con # ACE Architecture Source: https://docs.chain.link/ace/concepts/architecture -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 + + ACE has two layers: **onchain smart contracts** that enforce compliance rules on the blockchain, and the **[ACE Platform](/ace/concepts/key-terms#ace-platform)** (UI and APIs) that lets you manage them. Under the hood, Chainlink infrastructure connects the two — routing your platform actions to the blockchain and indexing onchain events back into the Reporting API. This page gives a bird's-eye view of how all the pieces fit together. @@ -224,7 +249,7 @@ The following diagram shows the complete ACE architecture, from the ACE Platform The **ACE Platform** is everything you interact with: the **Platform UI**, the **Coordinator API** (to manage ACE resources), and the **Reporting API** (to query what happened onchain). The UI calls the Coordinator API under the hood, so both paths converge. -When you manage ACE (create policies, register identities, etc.), the Coordinator API routes your request through **CRE Connect**, which executes the blockchain transaction via your organization's **CRE Connect Wallet**. The CRE Connect Wallet owns all your ACE contracts and verifies that only authorized operators can act on them. +When you manage ACE (create policies, register identities, etc.), the Coordinator API routes your request through **CRE Connect**, which executes the blockchain transaction via your organization's **[CRE Connect Wallet](/ace/concepts/signing-ownership)**. The CRE Connect Wallet owns all your ACE contracts and verifies that only authorized operators can act on them. In the other direction, when policies run onchain, the contracts emit events. **Chainlink's indexing infrastructure** continuously monitors these events, indexes the data, and makes it available through the **Reporting API** — giving you a queryable view of all policy run activity, transaction history, and onchain state. @@ -238,19 +263,19 @@ ACE Beta provides three managers that abstract away the complexity of managing o The Policy Manager lets you create, configure, and deploy onchain compliance rules for your smart contracts. You can browse available policy types (allowlist, volume limits, role-based access control, etc.), create policy instances with per-network configuration, and attach them to specific function selectors on your protected contracts. -The Policy Manager operates on the **Policy Management** onchain contracts: it deploys and configures PolicyEngine instances, policy contracts, and extractors on your behalf. See the [Coordinator API](/ace/reference/api/coordinator) to get started. +The Policy Manager operates on the **Policy Management** onchain contracts: it deploys and configures PolicyEngine instances, policy contracts, and extractors on your behalf. See the [Policy Manager guides](/ace/guides/policy-manager/manage-engines) or the [Coordinator API reference](/api/ace/coordinator/docs) to get started. ### Identity Manager The Identity Manager lets you manage cross-chain identities and credentials. You can create identity and credential registries, register wallet addresses to CCIDs, define credential types, and issue credentials to users. -The Identity Manager operates on the **Cross-Chain Identity** onchain contracts: it writes to IdentityRegistry and CredentialRegistry instances on your behalf. See the [Coordinator API](/ace/reference/api/coordinator) to get started. +The Identity Manager operates on the **Cross-Chain Identity** onchain contracts: it writes to IdentityRegistry and CredentialRegistry instances on your behalf. See the [Identity Manager guides](/ace/guides/identity-manager/manage-identities) or the [Coordinator API reference](/api/ace/coordinator/docs) to get started. ### Reporting Manager The Reporting Manager gives you read-only access to onchain state and transaction history. You can query policy engines and their configurations, look up identities and credentials, and view policy run transactions with filtering by network, target contract, and time range. -The Reporting Manager exposes data through the **Reporting API**. Under the hood, Chainlink's indexing infrastructure monitors onchain events (such as `PolicyRunComplete`) emitted by your PolicyEngines and indexes the data so it can be queried through the API. See the [Reporting API overview](/ace/reference/api/reporting) for details. +The Reporting Manager exposes data through the **Reporting API**. Under the hood, Chainlink's indexing infrastructure monitors onchain events (such as `PolicyRunComplete`) emitted by your PolicyEngines and indexes the data so it can be queried through the API. See the [API Overview](/ace/reference/apis) for available endpoints. -To view or change the default result for a target contract, use the ACE Platform UI or Coordinator API. +To view or change the default result for a target contract, see [Managing Targets — Default allow behavior](/ace/guides/policy-manager/manage-targets#default-allow-behavior). ## Managing the policy chain @@ -872,13 +977,13 @@ Each policy in the chain costs gas. While the PolicyEngine is designed for effic Any time you add, remove, or reorder a policy, review the full chain to confirm the new ordering matches your intent. A single misplaced policy can create a gap in your compliance coverage. -For additional security guidance around trust boundaries, external call risks, and context handling, consult your integration documentation. +For additional security guidance around trust boundaries, external call risks, and context handling, see [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations). --- # Cross-Chain Identity Source: https://docs.chain.link/ace/concepts/cross-chain-identity -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 This page explains in depth how ACE's Cross-Chain Identity system works — the CCID model, the credential lifecycle, and how applications validate identities at runtime. For a high-level overview of the components themselves (IdentityRegistry, CredentialRegistry, CredentialRegistryIdentityValidatorPolicy), see the [Architecture page](/ace/concepts/architecture#cross-chain-identity-contracts). @@ -934,7 +1039,7 @@ Both registries are themselves protected by a PolicyEngine. This means write acc ### Sharing registries across organizations -A registry owner can grant another organization **read access** to a registry, so that organization can reference the same identities and credentials in its own policies without re-issuing them. Access is read-only for the recipient and revocable at any time. This is how a protocol reuses a provider's registry directly. See [External registry](/ace/concepts/key-terms#external-registry) in the glossary. +A registry owner can grant another organization **read access** to a registry, so that organization can reference the same identities and credentials in its own policies without re-issuing them. Access is read-only for the recipient and revocable at any time. This is how a protocol reuses a provider's registry directly. See [External Registries](/ace/guides/identity-manager/external-registries). ## Credential type identifiers @@ -1002,7 +1107,7 @@ The system supports two levels of credential verification: **Attestation-only** is the default mode. The policy asks a single binary question: *does this credential exist for this identity?* The answer is yes or no. The `credentialData` field is ignored entirely. This is sufficient for many compliance scenarios — for example, verifying that a user holds a `common.kyc` credential before allowing a transfer. -**Credential Data Validator** adds a second layer. When a `ICredentialDataValidator` contract is configured on a Credential Source, the policy first checks that the credential exists, then passes the `credentialData` bytes to the validator contract for an additional custom check. The validator reads the non-PII data and returns `true` or `false`. ACE provides a pre-built **AllowDenyList Data Validator** whose first use case is jurisdiction control using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. +**Credential Data Validator** adds a second layer. When a `ICredentialDataValidator` contract is configured on a Credential Source, the policy first checks that the credential exists, then passes the `credentialData` bytes to the validator contract for an additional custom check. The validator reads the non-PII data and returns `true` or `false`. ACE provides a pre-built **AllowDenyList Data Validator** whose first use case is jurisdiction control using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes. See [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators) to configure one. This enables decisions based on *what's inside* the credential, not just whether it exists. For example: @@ -1018,10 +1123,11 @@ This enables decisions based on *what's inside* the credential, not just whether ## Credential lifecycle @@ -1082,7 +1188,7 @@ Separate registries and validators allow: # Reporting Manager Source: https://docs.chain.link/ace/concepts/reporting -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 This page explains what the Reporting Manager provides, why it matters for compliance, and how the data pipeline works. For a high-level overview of how the Reporting Manager fits into the ACE architecture, see the [Architecture page](/ace/concepts/architecture#reporting-manager). @@ -1138,21 +1244,23 @@ This gives you a complete snapshot of "what compliance rules protect this contra ### Identities -Look up identity records by wallet address, identity registry, credential type, credential registry, or CCID. Each identity includes all registry memberships (which registries, which chains, which wallet addresses are mapped). You can optionally request full credential details, including the credential type identifier, the issuing credential registry, issuance and expiration timestamps, credential data, and full on-chain provenance (block number, transaction hash). +Look up identity records by wallet address, identity registry, credential type, credential registry, or CCID. Each identity includes all registry memberships (which registries, which chains, which wallet addresses are mapped). + +Set `include_credential_details=true` to include each identity's credentials in the response. Each credential record contains the credential type identifier, the issuing credential registry, issuance and expiration timestamps, credential data, and full on-chain provenance (block number, transaction hash). This lets you answer questions like "does this wallet address belong to a registered identity?" or "which identities have a KYC credential issued by this credential registry?" ## Point-in-time queries -Policies, Identities, and Targets all support point-in-time historical queries. This lets you reconstruct the state of your compliance system at any historical moment: +The Policies, Identities, and Targets endpoints each accept a required **`as_of`** timestamp parameter. This lets you reconstruct the state of your compliance system at any historical moment: - **What policies were active** on a contract on a specific date? - **What credentials** did an identity hold at the time of a transaction? - **What protections** were configured on a target contract last quarter? -Point-in-time queries are critical for regulatory investigations where you need to prove not just that compliance rules exist *today*, but that they were in place *when a specific event occurred*. The API returns the version of each resource that was effective at the specified time, including resources that have since been updated or removed. +Point-in-time queries are critical for regulatory investigations where you need to prove not just that compliance rules exist *today*, but that they were in place *when a specific event occurred*. The `as_of` parameter returns the version of each resource that was effective at the specified time, including resources that have since been updated or removed. -Transactions support time range filtering instead, since transactions are discrete events rather than stateful resources. +The Transactions endpoint uses `from` and `to` time range filters instead, since transactions are discrete events rather than stateful resources. ## How data flows @@ -1177,29 +1285,35 @@ This happens automatically for all contracts deployed through the ACE Platform. During Beta, the Reporting Manager is **API-only** — there is no reporting UI. You interact with it exclusively through the Reporting API. -The API provides read-only access. All compliance configuration changes (deploying policies, registering identities, issuing credentials) are done through the [Coordinator API](/ace/reference/api/coordinator) or Platform UI. +The API provides read-only access. All compliance configuration changes (deploying policies, registering identities, issuing credentials) are done through the Coordinator API or Platform UI. ## Next steps -- **[Reporting API overview](/ace/reference/api/reporting)** — What the Reporting API provides and what resources can be queried. +- **[Interactive API Reference](/api/ace/reporting/docs)** — Try API calls directly in the browser with full request/response schemas. - **[Architecture](/ace/concepts/architecture#how-ace-observes-onchain-activity-read-path)** — How the indexing pipeline connects onchain events to the Reporting API. --- # Off-Chain Policy Execution Source: https://docs.chain.link/ace/concepts/off-chain-policies -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 ACE policies are not limited to on-chain logic. Off-chain policy execution lets you enforce compliance rules that depend on data or systems outside the blockchain — your internal compliance engine, third-party risk APIs, or any custom business logic. The checks happen off-chain before the transaction, and the result is delivered on-chain as a cryptographic **permit** that authorizes the action. ACE provides two ways to use offchain policies: -- **Managed wallet risk screening** — An out-of-the-box policy that screens wallet addresses with TRM Wallet Screening. You configure the risk thresholds and call the ACE Evaluation API; Chainlink manages the CRE workflow and onchain permit delivery. +- **Managed wallet risk screening (MVP)** — An out-of-the-box policy that screens wallet addresses with TRM Wallet Screening. You configure the risk thresholds and call the ACE Evaluation API; Chainlink manages the CRE workflow and onchain permit delivery. - **Custom offchain integrations** — An advanced model for internal compliance systems, custom policy endpoints, and other business logic. These integrations require infrastructure hosted by your organization and assistance from Chainlink during Beta. + + ## Why off-chain policies? @@ -1220,7 +1334,7 @@ A protected function that requires off-chain verification will revert if the cal 2. ACE triggers a managed CRE workflow. The workflow selects the configured addresses and calls TRM Wallet Screening using the credential your organization stores in Vault DON. 3. The workflow compares TRM's results with the policy's global risk threshold, unknown-risk setting, and category-specific thresholds. 4. If an address is rejected, the evaluation becomes `rejected` and no permit is created. -5. If the evaluation passes, the workflow delivers a permit through the Keystone Forwarder. The [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) (CADV) stores it onchain. +5. If the evaluation passes, the workflow delivers a permit through the Keystone Forwarder. The [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) stores it onchain. 6. Your application polls the Evaluation API. When the status becomes `ready`, it submits the protected transaction. 7. The onchain policy matches the action to the stored permit and consumes it after the call succeeds. @@ -1259,7 +1373,8 @@ From the policy engine's perspective, the CertifiedActionDONValidatorPolicy is j ## Related pages -- [Evaluation API](/ace/reference/api/evaluation) — the runtime API for requesting managed offchain permits +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — configure managed TRM wallet screening +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — integrate the Evaluation API into an application - [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work - [Architecture](/ace/concepts/architecture) — how the on-chain and off-chain layers connect - [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) — the on-chain contract reference @@ -1269,326 +1384,3862 @@ From the policy engine's perspective, the CertifiedActionDONValidatorPolicy is j # Getting Started with ACE Source: https://docs.chain.link/ace/getting-started +Last Updated: 2026-04-15 -## Get Access to ACE + -Chainlink ACE is currently in **private beta**. To request access, schedule a demo, or learn more, [contact us](https://chain.link/contact). +ACE offers three managers. Choose the path that matches what you need to do: -Once access is granted, you will be able to: +| Manager | What it does | Get started | +| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| **Policy Manager** | Attach and configure compliance policies on smart contracts — volume limits, allowlists, RBAC, identity-based checks, and more | [Policy Manager Quick Start](/ace/getting-started/policy-manager) | +| **Identity Manager** | Manage identity registries, register cross-chain identities (CCIDs), and issue credentials such as Proof of Identity or accreditation attestations | [Identity Manager Quick Start](/ace/getting-started/identity-manager) | +| **Reporting Manager** | Query on-chain transaction history, policy configurations, and identity states via a read-only API for compliance verification | [Reporting concepts](/ace/concepts/reporting) — API Reference | -- Configure programmable compliance policies on your smart contracts using the **Policy Manager** -- Manage cross-chain identities and credentials using the **Identity Manager** -- Query onchain compliance state and transaction history using the **Reporting Manager** +### Shared first step -For an overview of ACE and its capabilities, see the [Overview](/ace) page and explore the [Core Concepts](/ace/concepts/architecture) section. +All three managers require **account setup** first — creating your organization, sharing your Org ID for enablement, generating an API key, and setting up [CRE Connect Wallets](/ace/concepts/key-terms#cre-connect-wallet): ---- +- [Account Setup](/ace/getting-started/account-setup) — the four steps every ACE user completes before using any manager -# Policy Management Contracts -Source: https://docs.chain.link/ace/reference/policy-management-contracts -Last Updated: 2026-04-20 +### Not sure which Manager you need? - +- If you are a **token issuer or protocol team** deciding which compliance rules to enforce, start with the [Policy Manager Quick Start](/ace/getting-started/policy-manager). +- If you are an **identity provider (IDV)** or **credential issuer**, or **sanctions data provider** supplying data for others to consume, start with the [Identity Manager Quick Start](/ace/getting-started/identity-manager). +- Many organizations use **both managers**. Start with whichever is most relevant to your first use case — the guides cross-reference each other where the workflows intersect. -The Policy Management contracts handle on-chain policy enforcement for ACE-compatible contracts. The source code and full documentation are available in the policy-management package of the chainlink-ace repository (Business Source License 1.1). +### Background reading -## Core interfaces +Before diving in, these pages provide essential context: -| Interface | Description | -| :--------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [IPolicyEngine](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicyEngine.sol) | Central orchestrator that manages policies, extractors, and mappers for protected contracts. Receives calls from `PolicyProtected` targets, runs the policy chain, and returns allow/reject decisions. | -| [IPolicyProtected](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicyProtected.sol) | Base interface for any contract that wants policy enforcement. Provides the `runPolicy` modifier, the connection to a `PolicyEngine`, and context handling for passing off-chain data to policies. | -| [IPolicy](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicy.sol) | Standard interface for all policy contracts. Each policy implements `run` (read-only evaluation that returns allow/continue/reject) and optionally `postRun` (state changes after execution, such as updating volume counters). | -| [IExtractor](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IExtractor.sol) | Parses transaction calldata into named parameters (e.g., `to` and `value` from an ERC-20 `transfer`) so policies can evaluate them. One extractor is registered per function signature. | -| [IMapper](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IMapper.sol) | Optional interface for transforming or combining extracted parameters before they reach a policy. Only needed for advanced scenarios where a policy expects a different parameter shape than the extractor provides. | +- [Signing & Ownership Model](/ace/concepts/signing-ownership) — how ACE manages keys and the delegated and self-signing models +- [ACE Architecture](/ace/concepts/architecture) — system components and how they connect +- [Key Terms](/ace/concepts/key-terms) — ACE-specific terminology +- [Beta Scope](/ace/beta-scope) — what is and is not available during the Beta program -## Pre-built policies +--- -ACE provides a library of audited, ready-to-use policy implementations covering common compliance scenarios — allowlists, volume limits, role-based access, pause controls, and more. See the policies source code for implementation details, or the [Policy Library](/ace/reference/policy-library) page for configuration and usage. +# Account Setup +Source: https://docs.chain.link/ace/getting-started/account-setup +Last Updated: 2026-04-15 -## Reference token implementations + -The repository includes reference token contracts that demonstrate full ACE integration: +This page walks through the shared setup steps for all ACE users. Whether you use the [Policy Manager](/ace/getting-started/policy-manager) to enforce compliance on smart contracts or the [Identity Manager](/ace/getting-started/identity-manager) to manage cross-chain identities and credentials, complete these steps first. -- [ERC-20 Compliance Token](https://github.com/smartcontractkit/chainlink-ace/tree/main/packages/tokens/erc-20) - — A policy-protected ERC-20 with frozen token handling. -- [ERC-3643 Compliance Token](https://github.com/smartcontractkit/chainlink-ace/tree/main/packages/tokens/erc-3643) - — A compliant implementation of the ERC-3643 T-REX standard. +## 1. Create your organization -## Repository documentation +Go to [app.chain.link](https://app.chain.link) and create an account or sign in. -The policy-management docs folder contains detailed guides: +Once signed in, click **"My Org"** in the bottom-left corner of the sidebar to open the Organization page. Your **Organization ID** is displayed in the page header — copy it. -- [Concepts](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CONCEPTS.md) - — Architecture, policy flow, extractors, mappers, and context handling -- [API Guide](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/API_GUIDE.md) - — Task-oriented guide with code examples for common operations -- [API Reference](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/API_REFERENCE.md) - — Complete interface specifications with function signatures and events -- [Custom Policies Tutorial](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CUSTOM_POLICIES_TUTORIAL.md) - — End-to-end walkthrough for building a custom policy contract -- [Policy Ordering Guide](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/POLICY_ORDERING_GUIDE.md) - — How evaluation order affects transaction outcomes -- [Security Considerations](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/SECURITY.md) - — Trust model, gas considerations, and context handling +## 2. Share your Organization ID -## Related pages +Share your Organization ID with your Chainlink contact so they can enable the ACE service for your organization. You cannot create API keys or use ACE until this step is complete. -- [Architecture](/ace/concepts/architecture) — How PolicyEngine contracts fit into the ACE system -- [Policy Management](/ace/concepts/policy-management) — Conceptual overview of policy chains and evaluation -- [Policy Library](/ace/reference/policy-library) — Pre-built policy implementations with configuration details + ---- +## 3. Create an API key -# Policy Library -Source: https://docs.chain.link/ace/reference/policy-library -Last Updated: 2026-04-20 + -ACE ships with a library of pre-built, audited policies that cover the most common compliance and access control patterns. Each policy is a standalone smart contract that plugs into a PolicyEngine and evaluates transactions at runtime. +Once your account has been provisioned for the ACE service, create an API key for authentication: -For guidance on combining policies and understanding execution order, see [Policy Ordering & Composition](/ace/concepts/policy-ordering). +1. Log in to the [Chainlink App](https://app.chain.link), click **"My Org"** at the bottom of the left sidebar, then select the **"APIs"** tab. +2. Click **"+ Organization API"**. +3. Enter a name for the key and select an expiration period (1 day, 1 month, or 1 year). +4. Click **"Generate"**. The API key is displayed once — copy it immediately. -## Policy summary + -| Policy | Description | -| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| [AllowPolicy](/ace/reference/policy-library/allow-policy) | Maintains an allowlist. Rejects the transaction if any checked address is **not** on the list. | -| [BypassPolicy](/ace/reference/policy-library/bypass-policy) | Maintains an allowlist. If **all** checked addresses are on the list, immediately allows the transaction and **skips all remaining policies**. | -| [RejectPolicy](/ace/reference/policy-library/reject-policy) | Maintains a denylist. Rejects the transaction if any checked address **is** on the list. | -| [OnlyAuthorizedSenderPolicy](/ace/reference/policy-library/only-authorized-sender-policy) | Rejects the transaction if the sender (`msg.sender`) is not on the authorized list. | -| [RoleBasedAccessControlPolicy](/ace/reference/policy-library/role-based-access-control-policy) | Maps roles to function selectors. Rejects if the sender does not hold a role allowed for the called function. | -| [MaxPolicy](/ace/reference/policy-library/max-policy) | Rejects the transaction if the extracted value exceeds a configured maximum. | -| [VolumePolicy](/ace/reference/policy-library/volume-policy) | Rejects the transaction if the extracted value is below a minimum or above a maximum. | -| [VolumeRatePolicy](/ace/reference/policy-library/volume-rate-policy) | Tracks cumulative volume per account per time period. Rejects if the period's cap would be exceeded. | -| [SecureMintPolicy](/ace/reference/policy-library/secure-mint-policy) | Checks a Chainlink Proof of Reserve feed. Rejects if minting would push total supply beyond verified reserves. | -| [IntervalPolicy](/ace/reference/policy-library/interval-policy) | Divides time into repeating slot-based cycles. Rejects if the current slot is outside the allowed window. | -| [PausePolicy](/ace/reference/policy-library/pause-policy) | Global toggle. Rejects every transaction when paused; passes through when unpaused. | -| [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) | Checks each address against configured credential requirements. Rejects if any address lacks required credentials. | -| [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) | Routes each address to a credential group, then validates it against that group's requirements. Rejects if no group matches or requirements fail. | -| [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) | Validates DON-issued permits delivered on-chain via the Keystone Forwarder. Rejects if no valid permit exists. | +You will use this key in the `Authorization` header for all [Coordinator API](/api/ace/coordinator/docs) and [Reporting API](/api/ace/reporting/docs) calls: ---- +```bash +curl https://ace.api.chain.link/v1/ \ + -H "Authorization: Apikey " +``` -# AllowPolicy -Source: https://docs.chain.link/ace/reference/policy-library/allow-policy -Last Updated: 2026-04-20 +## 4. Set up CRE Connect Wallets -The AllowPolicy restricts transactions to a known set of approved addresses. It checks every address extracted from the transaction against an allowlist and immediately rejects if any of them is not on the list, halting all subsequent policy checks. +Before you can use ACE — whether from the Platform UI or the Coordinator API — you need a **CRE Connect Wallet** on each blockchain network where you want to operate. -## Configuration +A CRE Connect Wallet is a dedicated onchain smart contract wallet that acts as the execution gateway for all ACE actions on a given chain. When you trigger an action (deploy a policy engine, register an identity, issue a credential), the ACE platform executes the blockchain transaction through your CRE Connect Wallet. For a full explanation of how the signing and ownership model works, see [Signing & Ownership Model](/ace/concepts/signing-ownership). -### Address allowlist +Key points: -The allowlist defines which addresses are permitted to participate in transactions protected by this policy. The list starts empty at deployment and must be populated afterward — until you add at least one address, every transaction will be rejected. +- **One wallet per chain.** You need a CRE Connect Wallet on every network where you plan to use ACE. See [Supported Networks](/ace/supported-networks) for available chains. +- **You own it.** The `owner_address` you provide when creating the wallet becomes the owner of the CRE Connect Wallet onchain. +- **Chainlink operates through it.** Chainlink is registered as an authorized operator — allowed to execute operations on your behalf, but unable to change ownership or authorization settings. +- **Self-signing organizations** must also provide the `address` of the ECDSA signer authorized to sign operations. See [Signing & Ownership Model](/ace/concepts/signing-ownership) for details on how each signing model works. -Each address is added or removed individually. When a protected function is called, the extractor provides one or more addresses from the transaction (for example, both the sender and receiver of a token transfer). Which addresses the policy receives depends on the [mapper configuration](/ace/concepts/policy-management#worked-example-erc-20-transfer). All of those addresses must be on the allowlist for the transaction to pass. +## What happens next -## Runtime behavior +Your next step depends on what you need to do: -The policy expects a variable number of parameters from the extractor, each an address. All provided addresses are checked against the allowlist. +| If you need to... | Next step | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| Enforce compliance policies on smart contracts | Deploy a PolicyEngine and integrate your contract. Continue to the [Policy Manager Quick Start](/ace/getting-started/policy-manager). | +| Manage cross-chain identities and issue credentials | Set up identity and credential registries. Continue to the [Identity Manager Quick Start](/ace/getting-started/identity-manager). | -- **`run()`** — Reverts if *any* address is not on the allowlist. Returns `Continue` otherwise. -- **`postRun()`** — No state changes. +Many organizations do both. Start with whichever is most relevant to your first use case — the quick start guides cross-reference each other where the workflows intersect. -## API reference +--- -### Setter functions +# Policy Manager Quick Start +Source: https://docs.chain.link/ace/getting-started/policy-manager +Last Updated: 2026-05-26 -- **`allowAddress(address account)`** — Adds an address to the allowlist. Reverts if the address is already listed. -- **`disallowAddress(address account)`** — Removes an address from the allowlist. Reverts if the address is not listed. + -### View functions +This guide walks you through the **Policy Manager** — the ACE component for attaching and configuring compliance policies on smart contracts. By the end you will have a policy-protected contract running on a supported network. -- **`addressAllowed(address account)`** — Returns `true` if the address is on the allowlist. +### 1. Prerequisites -## Use cases +- Solidity basics +- **Must-read before proceeding:** [Signing & Ownership Model](/ace/concepts/signing-ownership) — understand how ACE manages keys, who owns what, and how the delegated trust model works -- **Regulated access** — Restrict token transfers to a known set of approved addresses. -- **Gradual rollout** — Start with a small allowlist and expand as new addresses are vetted. +### 2. Account setup -## Source +Complete the [Account Setup](/ace/getting-started/account-setup) steps — organization creation, API key generation, and CRE Connect Wallet deployment — before proceeding. -[AllowPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/AllowPolicy.sol) +### 3. Create a PolicyEngine ---- +A **PolicyEngine** is the onchain contract that evaluates compliance rules on your smart contract. When you create a PolicyEngine, you also attach **extractors** — modules that decode transaction calldata so the PolicyEngine can evaluate policies against function arguments (sender, recipient, amount, etc.). -# BypassPolicy -Source: https://docs.chain.link/ace/reference/policy-library/bypass-policy -Last Updated: 2026-04-20 +#### Verify deployment -The BypassPolicy gives privileged addresses a fast path through the policy chain. If *all* addresses extracted from the transaction are on the bypass list, the policy immediately allows the transaction and skips every remaining policy in the chain. If any address is not on the list, the policy returns `Continue` and lets subsequent policies decide. +The PolicyEngine and its extractors start with `"creation_pending"` / `"inactive"` status while the onchain transactions are processed. Poll until everything is ready: -This is the only built-in policy that returns `Allowed`. +```bash +curl https://ace.api.chain.link/v1/policy-engines/ \ + -H "Authorization: Apikey " +``` - +Check two things in the response: -## Configuration +1. **PolicyEngine deployed** — Every entry in `onchain_policy_engines` shows `"status": "created"`. +2. **Extractors active** — Every entry in `extractor_registrations[].onchain_extractor_registrations` shows `"status": "active"`. -### Address allowlist +In the Platform UI, confirm the engine status is **Active** and extractors appear in the engine settings page. -The bypass list defines which addresses can skip the rest of the policy chain. The list starts empty at deployment and must be populated afterward. + -Each address is added or removed individually. When a protected function is called, the extractor provides one or more addresses from the transaction. Which addresses the policy receives depends on the [mapper configuration](/ace/concepts/policy-management#worked-example-erc-20-transfer). All of those addresses must be on the bypass list for the fast path to activate — if even one address is missing, the policy returns `Continue` and normal policy evaluation continues. +#### Save the PolicyEngine addresses -## Runtime behavior +Copy the `address` value from each entry in `onchain_policy_engines` — or from the engine settings page in the UI — you need these addresses to deploy or upgrade your smart contract in the next step. Each chain has a different PolicyEngine contract address. -The policy expects a variable number of parameters from the extractor, each an address. +### 4. Integrate your contract -- **`run()`** — Returns `Allowed` if all provided addresses are on the bypass list, skipping all subsequent policies. Returns `Continue` otherwise. -- **`postRun()`** — No state changes. +See [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) for a full overview of what your contract needs. In short: -## API reference +- Inherit from `PolicyProtected` (or `PolicyProtectedUpgradeable` for upgradeable contracts) +- Add the `runPolicy` modifier to the functions you want to protect +- Pass the PolicyEngine address during deployment or initialization -### Setter functions +**Choose your path:** -- **`allowAddress(address account)`** — Adds an address to the bypass list. Reverts if the address is already listed. -- **`disallowAddress(address account)`** — Removes an address from the bypass list. Reverts if the address is not listed. +#### New contract -### View functions +If you are building a new token or contract from scratch, ACE provides reference implementations you can use as a starting point: -- **`addressAllowed(address account)`** — Returns `true` if the address is on the bypass list. +- **ERC-20** — see [Building an ERC-20 Compliance Token](/ace/guides/policy-manager/contracts/erc20-token) for the full guide +- **ERC-3643** — see [Building an ERC-3643 Compliance Token](/ace/guides/policy-manager/contracts/erc3643-token) for the full guide -## Use cases +#### Existing contract -- **Privileged access** — Let administrators or system contracts bypass compliance checks entirely. -- **Layered permissions** — Place at the top of a policy chain so that listed addresses skip volume limits, identity checks, and other restrictions. +If you have an already-deployed contract you want to add ACE compliance to, this involves modifying your implementation contract, testing, and executing a proxy upgrade. This is typically the longest step in the onboarding process. -## Source +- See [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) for the step-by-step guide +- Non-upgradeable contracts require alternative approaches — contact your Chainlink representative for guidance -[BypassPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/BypassPolicy.sol) +### 5. Register your contract as a target ---- +After deploying your contract, register it as a target under your PolicyEngine. Provide the contract name, type, protected methods, and on-chain addresses for each chain where the contract is deployed. -# CertifiedActionDONValidatorPolicy -Source: https://docs.chain.link/ace/reference/policy-library/certified-action-don-validator-policy -Last Updated: 2026-08-18 +```bash +curl -X POST https://ace.api.chain.link/v1/targets \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token", + "description": "Production ERC-20 token with compliance enforcement", + "policy_engine_id": "", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)", + #[any other methods you want to protect] + ], + "desired_default_allow": true, + "metadata": {"contract_type": "ERC-20"}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0xYourContractAddressOnSepolia" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xYourContractAddressOnArbitrumSepolia" + }, + #[any other chains where your contract is deployed] + ] + }' +``` -The CertifiedActionDONValidatorPolicy (CADV) is the onchain contract that validates permits generated by [offchain policy execution](/ace/concepts/off-chain-policies). When a Chainlink DON workflow approves an action, it delivers a permit through the Keystone Forwarder. The CADV stores the permit and verifies it when the protected function is called. +Include an entry in `onchain_targets` for every chain where you deployed the contract. Once registered, your target appears in the ACE Platform dashboard under your policy engine. -For a full explanation of how offchain policies work, what you can connect to, and how the permit flow operates, see [Off-Chain Policy Execution](/ace/concepts/off-chain-policies). +For a full description of all fields and options, see [Managing Targets](/ace/guides/policy-manager/manage-targets#register-a-target). -## Permit lifecycle +### 6. Post-setup checklist -Managed offchain permits are **pre-presented**: the DON writes the permit to the CADV before the user submits the protected transaction. The user does not include permit bytes in the transaction. +Before creating policies, confirm that every component is in the expected state. You can verify each of these with a single API call. -The CADV indexes a permit by its transaction intent, which includes: +| Check | What to look for | +| ---------------------------- | -------------------------------------------------------------------------------------------------------- | +| CRE Connect Wallets created | `GET /wallets` — every wallet shows `"status": "created"` | +| PolicyEngine deployed | `GET /policy-engines/` — every `onchain_policy_engines[].status` is `"created"` | +| Extractors active | Same response — every `extractor_registrations[].onchain_extractor_registrations[].status` is `"active"` | +| Contract visible in platform | Your target contract appears in the ACE Platform dashboard | -- Caller address -- Protected target address -- Function selector -- Ordered parameters produced by the target function's extractor +### 7. Create and configure policies -At execution time, the policy engine passes the actual caller, target, selector, and extracted parameters to the CADV. The call is allowed only when they match a stored, valid permit. After the protected call succeeds, the policy engine invokes `postRun`, which increments the permit's usage count and emits `PermitUsed`. +From the UI or API, create policy instances and attach them to your contract's protected functions. See [Managing Policies](/ace/guides/policy-manager/manage-policies) for creating and configuring policies, then [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) for attaching them to specific functions on your contracts. -The managed `wallet_risk_scoring` policy currently creates permits with: +### 8. Test it -- `maxUses = 1` — the permit can authorize one successful transaction. -- `expiry = 0` — the permit does not expire. +Make a transaction against your protected contract, verify the policy enforces correctly, and check the results in the [Reporting Manager](/ace/concepts/reporting). -These values are fixed in the current Beta release. +--- -The CADV also emits `PermitStored` when the workflow publishes a permit. ACE waits for this event before changing the corresponding evaluation status to `ready`. +# Identity Manager Quick Start +Source: https://docs.chain.link/ace/getting-started/identity-manager +Last Updated: 2026-05-26 -## Combining with other policies + -The CADV is attached to a target function like any other policy. It can run before or after onchain policies such as identity, allowlist, or volume checks. All policies in the function's policy chain must allow the call. +This guide walks you through the **Identity Manager** — the ACE component for managing identity registries, registering cross-chain identities (CCIDs), and issuing credentials such as Proof of Identity, accreditation proofs, or sanctions clearance. By the end you will have identities registered and credentials issued on a supported network. -See [Policy Ordering & Composition](/ace/concepts/policy-ordering) for guidance on evaluation order. +### 1. Prerequisites -## Related pages +- Familiarity with [Cross-Chain Identity](/ace/concepts/cross-chain-identity) concepts — CCIDs, credential registries, credential types, and credential sources +- **Must-read before proceeding:** [Signing & Ownership Model](/ace/concepts/signing-ownership) — understand how ACE manages keys, who owns what, and how the delegated trust model works -- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) — conceptual overview of managed and custom offchain policies -- [Evaluation API](/ace/reference/api/evaluation) — the runtime API for requesting managed offchain permits -- [Policy Ordering & Composition](/ace/concepts/policy-ordering) — guidance on evaluation order +### 2. Account setup -## Source +Complete the [Account Setup](/ace/getting-started/account-setup) steps — organization creation, API key generation, and CRE Connect Wallet deployment — before proceeding. -- [CertifiedActionDONValidatorPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/CertifiedActionDONValidatorPolicy.sol) +### 3. Set up your registries ---- +A **registry** is the top-level resource that groups an **identity registry** and a **credential registry**, deployed together on each chain you operate on. -# CredentialRegistryIdentityValidatorPolicy -Source: https://docs.chain.link/ace/reference/policy-library/credential-registry-identity-validator-policy -Last Updated: 2026-08-18 +- The identity registry maps wallet addresses to cross-chain identities (CCIDs) +- The credential registry stores credential attestations linked to those CCIDs -The CredentialRegistryIdentityValidatorPolicy validates that accounts involved in a transaction hold the required credentials from ACE's [Cross-Chain Identity](/ace/concepts/cross-chain-identity) infrastructure. It checks each account against configured credential sources (IdentityRegistry + CredentialRegistry pairs) and credential requirements (which credential types must be present and how many validations are needed). +See [Managing Registries](/ace/guides/identity-manager/manage-registries) for full details. -This is the primary policy for enforcing identity-based compliance such as KYC, accreditation, or sanctions screening. +### 4. Define credential types - +Credential types represent the categories of attestation you issue — for example, Proof of Identity, accredited investor, or sanctions clearance. Each credential type is scoped to a specific registry and identified by a `credential_type` string that gets hashed on-chain to a `credential_type_hash`. This value is hashed using keccak256 — the standard cryptographic hash function used by Ethereum and EVM-compatible blockchains — and the resulting `credential_type_hash` is what gets recorded on-chain and referenced by policies. -## Configuration +### 5. Register identities and issue credentials -Both properties below can be set when the policy is first deployed and updated afterward by the policy owner. Credential sources contain on-chain addresses and must be configured per network. Credential requirements define rules that apply across chains. +A cross-chain identity (CCID) aggregates one or more wallet addresses across EVM chains into a single logical entity. When you register an identity, you provide the on-chain addresses that belong to that entity and ACE writes the mapping into the identity registry on each relevant chain. -### Credential sources +A single CCID can span multiple chains and addresses — for example, one entity might have wallets on Ethereum, Arbitrum, and Avalanche that all resolve to the same CCID. -A credential source defines *where* to look up identity and credential data for a given credential type. Each source is a tuple of: +Credentials are attestations linked to a registered identity. During Beta, ACE uses an **attestation-only** model — the Identity Manager asserts that a credential holds for a given CCID, and the credential registry records that attestation on-chain. -- **Credential type ID** — A `bytes32` identifier for the credential type this source applies to (e.g., KYC, accreditation). -- **Identity registry address** — The IdentityRegistry contract that maps wallet addresses to Cross-Chain Identifiers (CCIDs). -- **Credential registry address** — The CredentialRegistry contract that stores credentials linked to CCIDs. -- **Data validator address** (optional) — A contract that performs additional validation on the credential data. Set to `address(0)` for attestation-only checks, or a Data Validator address to validate credential contents (for example, a jurisdiction allow/deny list). See [Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy) for a full explanation of attestation-only vs. Credential Data Validator checks. +### 6. Verify via Reporting -Multiple sources can be registered for the same credential type. The policy checks all configured sources and counts validations across them. Source uniqueness is determined by the `(identityRegistry, credentialRegistry)` pair — two sources with the same registry pair but different `dataValidator` addresses are considered duplicates. +After issuing credentials, confirm they are visible and queryable through the **Reporting Manager**. The Reporting Manager provides a read-only view of all identities and credentials across your registries, which Policy Managers rely on when evaluating identity-based policies at transaction time. -**Limits:** Up to 8 sources per credential type. +- Open the Reporting API to query credentials by identity, entity, or registry +- See [Reporting](/ace/concepts/reporting) for details on how reporting data flows into policy evaluation -### Credential requirements +Once credentials appear in reporting, Policy Managers can reference them in identity-based policies such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy). -A credential requirement defines *what* credentials an account must hold. Each requirement specifies: +### 7. What's next -- **Requirement ID** — A unique `bytes32` identifier for this requirement. -- **Credential type IDs** — An array of `bytes32` credential types to check (e.g., KYC, accreditation). -- **Minimum validations** — How many of the listed credential types must validate successfully. Must be at least 1. -- **Invert flag** — When `true`, the check passes if the credential does *not* exist. This is useful for "must not be sanctioned" checks, where you want the transaction to succeed only if the account does not hold a sanctions credential. +Explore the detailed guides for each Identity Manager workflow: -An account passes a requirement if it accumulates at least `minValidations` successful validations across the listed credential types and configured sources. +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — add, update, and remove CCIDs and their on-chain address mappings +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — create and organize the credential categories your registry supports +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, revoke, and set expiration on credentials +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — view and manage your identity and credential registry deployments -**Limits:** Up to 8 requirements total, up to 32 credential types per requirement. +--- -## Runtime behavior +# Policy Manager Guides +Source: https://docs.chain.link/ace/guides/policy-manager +Last Updated: 2026-07-17 -The policy expects a variable number of parameters from the extractor, each an address to validate. Every address is checked against all configured requirements. +These guides cover the day-to-day operations of a Policy Manager — from integrating your smart contracts with ACE to configuring and managing compliance policies. -For each address, the validation process: + -1. Iterates through all credential requirements. -2. For each requirement, checks the listed credential types against each configured source. -3. For each source, looks up the account's CCID in the IdentityRegistry, then checks whether the CredentialRegistry holds the credential for that CCID. -4. If a DataValidator is configured, it additionally validates the credential data. -5. Counts successful validations. If the count meets `minValidations`, the requirement passes. +## How it all fits together -- **`run()`** — Reverts if any address fails any requirement. Returns `Continue` if all addresses pass all requirements. -- **`postRun()`** — No state changes. +The Policy Manager revolves around a handful of entities that work together to enforce compliance on your smart contracts. Understanding how they relate to each other makes the individual guides much easier to follow. -## API reference +- **PolicyEngine** — The on-chain orchestrator that evaluates policies. Everything — targets, policy instances, and extractors — is scoped to a single engine. +- **Extractors** — Modules that decode transaction calldata into named parameters (sender, amount, etc.) so policies can evaluate them. Attached to the engine at creation time. +- **Target** — A smart contract registered under an engine via the API or UI. +- **Policy Implementation** — A reusable compliance rule from the [Policy Library](/ace/reference/policy-library) (e.g., allowlist, volume limit, pause toggle). +- **Policy Instance** — A deployed copy of an implementation, configured with your specific parameters and scoped to an engine. +- **Protection** — The binding between a policy instance and a specific function on a target contract. This is what makes a function "policy-protected." +- **Data Validator** — An optional contract attached to an identity policy's credential source that validates the *contents* of a credential (e.g., a jurisdiction allow/deny list), not just its existence. +- **Managed offchain policy (MVP)** — A CRE workflow and onchain validator managed by Chainlink that evaluate external risk data before issuing a permit for a specific transaction intent. -### Setter functions +### Typical setup flow -**Credential sources:** +1. [Create a PolicyEngine](/ace/guides/policy-manager/manage-engines) with extractors for your contract type (ERC-20 or ERC-3643). +2. [Integrate your contract](/ace/guides/policy-manager/contracts/ace-compatible) by inheriting `PolicyProtected` and adding the `runPolicy` modifier. +3. Deploy or upgrade your contract — it [appears as a target](/ace/guides/policy-manager/manage-targets) automatically. +4. [Create policy instances](/ace/guides/policy-manager/manage-policies) from the Policy Library with your configuration. +5. [Attach policies to functions](/ace/guides/policy-manager/manage-protections) by creating protections. -- **`addCredentialSource(CredentialSourceInput input)`** — Adds a source for a credential type. Reverts if the source already exists or if the maximum number of sources (8) for that credential type has been reached. -- **`removeCredentialSource(bytes32 credentialTypeId, address identityRegistry, address credentialRegistry)`** — Removes a source. Reverts if the source is not found. +## Smart contract integration -**Credential requirements:** +- [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) — what your contract needs to work with ACE (inheriting `PolicyProtected`, adding the `runPolicy` modifier) +- [Building a New ERC-20 Token](/ace/guides/policy-manager/contracts/erc20-token) — reference implementation for a compliance-ready ERC-20 token +- [Building a New ERC-3643 Token](/ace/guides/policy-manager/contracts/erc3643-token) — reference implementation for an ERC-3643 security token +- [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) — how to add ACE compliance to an already-deployed upgradeable contract +- [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) — key security patterns and pitfalls when integrating with ACE -- **`addCredentialRequirement(CredentialRequirementInput input)`** — Adds a requirement. Reverts if a requirement with the same ID already exists or if the configuration is invalid. -- **`removeCredentialRequirement(bytes32 requirementId)`** — Removes a requirement. Reverts if the requirement ID is not found. +## Policy engine and policy management + +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create, view, update, and archive policy engines +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register your deployed contracts as targets under a policy engine +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — browse policy implementations, create and configure policy instances +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — bind policy instances to specific functions on your target contracts +- [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators) — enforce rules on credential contents (e.g., jurisdiction allow/deny lists) by attaching Data Validators to identity policies +- [Custom Policies](/ace/guides/policy-manager/custom-policies) — write, deploy, and register your own policy contract, then use it like a library policy + + + +- [Offchain Policies](/ace/guides/policy-manager/offchain-policies) — understand the managed and custom models, configure the managed wallet screening MVP, and integrate offchain permits + +--- + +# Making Your Contract ACE-Compatible +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/ace-compatible +Last Updated: 2026-05-26 + +A contract is ACE-compatible when it can route function calls through a PolicyEngine for compliance checks before execution. This requires four things: inheriting a base contract, marking functions for protection, connecting to a PolicyEngine, and registering extractors. This page explains what each requirement means at a high level — the sub-pages linked below walk through the implementation in detail. + +For background on how these components interact, see the [Architecture page](/ace/concepts/architecture#policy-management-contracts) and the [Policy Management](/ace/concepts/policy-management) concepts page. + + + +## What your contract needs + +### 1. Inherit from PolicyProtected + +Your contract must inherit from `PolicyProtected` (for new contracts) or `PolicyProtectedUpgradeable` (for contracts deployed behind a proxy that need an upgrade path). This base contract provides: + +- The `runPolicy` and `runPolicyWithContext` modifiers that hook your functions into the policy system. +- Functions to attach and manage the connection to a PolicyEngine. +- Context handling for passing additional data (like offchain signatures) to policies. + +### 2. Add the runPolicy modifier to protected functions + +Any function that should be subject to compliance checks needs the `runPolicy` modifier. The modifier intercepts the call and routes it through the [PolicyEngine](/ace/guides/policy-manager/manage-engines) before your function body executes. + +```solidity +// Before: no compliance checks +function transfer(address to, uint256 amount) public returns (bool) { + return super.transfer(to, amount); +} + +// After: the PolicyEngine checks all attached policies before execution +function transfer(address to, uint256 amount) public runPolicy returns (bool) { + return super.transfer(to, amount); +} +``` + +You choose which functions to protect. Unprotected functions continue to work normally without any policy checks. + +### 3. Connect to a PolicyEngine + +Your contract must be connected to a [PolicyEngine](/ace/guides/policy-manager/manage-engines) — the central orchestrator that holds all policies and executes them in order when a protected function is called. The connection is established during initialization (for [new contracts](/ace/guides/policy-manager/contracts/new-contract)) or migration (for [upgrades](/ace/guides/policy-manager/contracts/upgrade-existing)). + +### 4. Register extractors for protected functions + +[Extractors](/ace/guides/policy-manager/manage-policies#managing-extractors) are helper contracts that parse the calldata of your protected functions into named parameters (for example, `to` and `value` for an ERC-20 `transfer`). Policies use these named parameters to make their decisions — a volume limit policy reads `value`, a sanctions check reads `to`. + +One extractor is registered per function signature. To bind policies to specific functions, see [Protecting Target Functions](/ace/guides/policy-manager/manage-protections). + + + +## Integration paths + +How you integrate ACE depends on where your contract is today: + +- **[Building a New Contract](/ace/guides/policy-manager/contracts/new-contract)** — Starting a new project? ACE provides audited reference implementations for ERC-20 and ERC-3643 tokens that come pre-integrated with PolicyProtected. This is the fastest path. + +- **[Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing)** — Already have a deployed contract behind a proxy? You can add ACE compliance through a standard proxy upgrade without disrupting existing state, balances, or integrations. + +- **Non-upgradeable contract?** — If your contract is not behind a proxy, the upgrade guide also covers [alternative approaches](/ace/guides/policy-manager/contracts/upgrade-existing#alternatives-for-non-upgradeable-contracts) — wrapped contracts, contract migration, and edge protection — each with different tradeoffs depending on your constraints. + +--- + +# Building a New Contract +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/new-contract +Last Updated: 2026-03-31 + +If you are starting a new project, ACE provides audited reference implementations that come pre-integrated with PolicyProtected. You do not need to implement the ACE integration yourself — these contracts are ready to deploy and protect with policies. + +If you already have a deployed contract, see [Upgrading Existing Contracts](/ace/guides/policy-manager/contracts/upgrade-existing) instead. + +## Reference implementations + +ACE offers two token implementations, each designed for different regulatory contexts: + +- **ComplianceTokenERC20** — A policy-protected ERC-20 token with advanced frozen token handling, force transfers, and mint/burn controls. +- **ComplianceTokenERC3643** — A compliant implementation of the [ERC-3643 (T-REX)](https://eips.ethereum.org/EIPS/eip-3643) standard, using ACE Cross-Chain Identity instead of ONCHAINID and ACE Policy Management instead of T-REX ModularCompliance. + +Both implementations inherit from `PolicyProtectedUpgradeable` and must be deployed behind a proxy. During ACE Beta, deployment is managed through the ACE Platform. + +## Choosing between ERC-20 and ERC-3643 + +The right choice depends on your regulatory requirements, the asset type you are tokenizing, and how you need frozen tokens to behave. + +| Aspect | ERC-20 Compliance Token | ERC-3643 Compliance Token | +| ------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| **Standard** | ERC-20 | ERC-3643 (T-REX) | +| **Regulatory context** | Broad — suitable for any token that needs policy-based compliance | Securities — designed for regulated securities and financial instruments | +| **Identity system** | ACE Cross-Chain Identity | ACE Cross-Chain Identity (replaces ONCHAINID) | +| **Compliance system** | ACE Policy Management | ACE Policy Management (replaces T-REX ModularCompliance) | +| **Frozen token behavior** | Strict preservation — frozen tokens remain frozen during burns and force transfers | Operational flexibility — burns and force transfers can automatically unfreeze tokens when needed | +| **Pause support** | No built-in pause (use a PausePolicy instead) | Built-in `pause`/`unpause` with `whenNotPaused` modifier | +| **Batch operations** | No | Yes — batch transfer, mint, burn, freeze/unfreeze | +| **CCIP admin** | `getCCIPAdmin()` returns the contract owner | Not included | + +### Frozen token behavior explained + +The most significant difference between the two implementations is how frozen tokens are handled during administrative operations: + +**ERC-20 approach (strict preservation):** When an admin performs a burn or force transfer on an account with frozen tokens, the frozen balance is preserved. The operation only succeeds if the account has sufficient *unfrozen* balance. This means an admin must explicitly unfreeze tokens before they can be burned or force-transferred. + +**ERC-3643 approach (automatic unfreezing):** When an admin performs a burn or force transfer, the contract automatically unfreezes tokens if the unfrozen balance is insufficient. This follows the T-REX philosophy that administrative actions should not be blocked by frozen status — the admin has already decided the operation is necessary. + +### When to choose each + +**Choose ERC-20** when: + +- You need a general-purpose compliant token without a specific regulatory framework requirement. +- You want strict control over frozen tokens — every unfreeze must be an explicit administrative action. +- You plan to integrate with CCIP for cross-chain transfers. + +**Choose ERC-3643** when: + +- You are tokenizing regulated securities and need compliance with the ERC-3643 standard. +- Your regulatory framework requires or benefits from the T-REX interface (existing tooling, auditor familiarity). +- You need batch operations for managing large numbers of holders efficiently. +- You prefer operational flexibility for administrative actions on frozen tokens. + +## Next steps + +- **[Building an ERC-20 Compliance Token](/ace/guides/policy-manager/contracts/erc20-token)** — Detailed guide for deploying and configuring the ERC-20 reference implementation. +- **[Building an ERC-3643 Compliance Token](/ace/guides/policy-manager/contracts/erc3643-token)** — Detailed guide for deploying and configuring the ERC-3643 reference implementation. + + + +--- + +# Building an ERC-20 Compliance Token +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/erc20-token +Last Updated: 2026-03-31 + +The `ComplianceTokenERC20` is a ready-to-deploy, policy-protected ERC-20 token provided as an ACE reference implementation. It inherits `PolicyProtectedUpgradeable`, routes every state-changing function through a PolicyEngine, and is designed for deployment behind a proxy. + +For a comparison with the ERC-3643 variant and guidance on which to choose, see [Building a New Contract](/ace/guides/policy-manager/contracts/new-contract#choosing-between-erc-20-and-erc-3643). + +## What makes it ACE-compatible + +The token satisfies all the requirements described in [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible): + +1. **Inherits `PolicyProtectedUpgradeable`** — The contract calls `__PolicyProtected_init` during initialization, which sets the contract owner and connects it to a PolicyEngine. +2. **All state-changing functions are policy-protected** — Every function that modifies balances, allowances, or frozen state carries the `runPolicy` or `runPolicyWithContext` modifier. The PolicyEngine evaluates all attached policies before the function body executes. +3. **ERC-7201 namespaced storage** — All token state lives in a dedicated `ComplianceTokenStoreERC20` storage struct, following the [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) pattern for safe upgradeable storage. + +## Protected functions + +Every state-changing function on the token is policy-protected. The [`runPolicy` modifier](/ace/concepts/policy-management#the-policy-execution-flow) intercepts each call and routes it through the PolicyEngine, which evaluates all attached policies before the function body executes. Functions that need to pass additional context (such as offchain signatures or metadata) use [`runPolicyWithContext`](/ace/concepts/policy-management#the-context-parameter) instead, which forwards a `bytes context` parameter to every policy in the chain. + +### ERC-20 standard + +| Function | Modifier | Description | +| -------------------------------- | ----------- | ---------------------------------------------------------------- | +| `transfer(to, amount)` | `runPolicy` | Transfer tokens from the caller to another address. | +| `transferFrom(from, to, amount)` | `runPolicy` | Transfer tokens on behalf of another address using an allowance. | +| `approve(spender, amount)` | `runPolicy` | Set an allowance for a spender. | + +### Minting and burning + +| Function | Modifier | Description | +| ------------------------ | ----------- | ------------------------------------------------ | +| `mint(to, amount)` | `runPolicy` | Create new tokens and assign them to an address. | +| `burn(amount)` | `runPolicy` | Destroy tokens from the caller's balance. | +| `burnFrom(from, amount)` | `runPolicy` | Destroy tokens from another address. | + +### Administrative and compliance + +| Function | Modifier | Description | +| ------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------ | +| `freeze(account, amount, context)` | `runPolicyWithContext` | Freeze a specific amount of tokens on an account. Frozen tokens cannot be transferred or burned. | +| `unfreeze(account, amount, context)` | `runPolicyWithContext` | Unfreeze a previously frozen amount on an account. | +| `forceTransfer(from, to, amount, context)` | `runPolicyWithContext` | Administratively move tokens between accounts, subject to frozen balance checks. | + + + +## Frozen token behavior + +`ComplianceTokenERC20` uses a **strict preservation** model for frozen tokens: + +- **Available balance** = total balance - frozen balance. Every transfer, burn, and force transfer checks that the sender has sufficient *unfrozen* balance and reverts if not. +- **No automatic unfreezing** — Frozen tokens remain frozen during all operations. An administrator must explicitly call `unfreeze` before those tokens can be moved or burned. +- **Pre-freezing** — Tokens can be frozen on an account before they are received. The frozen amount is tracked independently from the balance, so an admin can set a frozen amount in advance and the restriction takes effect as soon as tokens arrive. + +This model provides maximum compliance control: every change to frozen status is an explicit, auditable administrative action. + + + +## Storage layout + +All token state is stored in `ComplianceTokenStoreERC20`, which uses ERC-7201 namespaced storage at a deterministic slot: + +| Field | Type | Description | +| ---------------- | ------------------------------------------------- | --------------------------------- | +| `name` | `string` | Token name. | +| `symbol` | `string` | Token symbol. | +| `decimals` | `uint8` | Decimal precision for display. | +| `totalSupply` | `uint256` | Total supply of tokens. | +| `balances` | `mapping(address => uint256)` | Per-account token balances. | +| `allowances` | `mapping(address => mapping(address => uint256))` | Per-account spender allowances. | +| `frozenBalances` | `mapping(address => uint256)` | Per-account frozen token amounts. | +| `data` | `mapping(bytes32 => bytes)` | Generic storage for extensions. | + +## CCIP compatibility + +The contract exposes `getCCIPAdmin()`, which returns the contract owner. This enables integration with [Chainlink CCIP](/ccip) for cross-chain token transfers by identifying the admin authorized to configure the token's CCIP settings. + +## Reference implementation + +The full source code for the ERC-20 compliance token: + +- [ComplianceTokenERC20.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-20/src/ComplianceTokenERC20.sol) — Token contract with all protected functions and frozen token logic. +- [ComplianceTokenStoreERC20.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-20/src/ComplianceTokenStoreERC20.sol) — ERC-7201 namespaced storage layout. + +--- + +# Building an ERC-3643 Compliance Token +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/erc3643-token +Last Updated: 2026-03-31 + +The `ComplianceTokenERC3643` implements the [ERC-3643 (T-REX)](https://eips.ethereum.org/EIPS/eip-3643) `IToken` interface but replaces the canonical T-REX identity and compliance systems with ACE equivalents. It inherits `PolicyProtectedUpgradeable`, is deployed behind a proxy, and routes all state-changing functions through a PolicyEngine. + +For a comparison with the ERC-20 variant and guidance on which to choose, see [Building a New Contract](/ace/guides/policy-manager/contracts/new-contract#choosing-between-erc-20-and-erc-3643). + +## What makes it ACE-compatible + +The token satisfies all the requirements described in [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible): + +1. **Inherits `PolicyProtectedUpgradeable`** — The contract calls `__PolicyProtected_init` during initialization, which sets the contract owner and connects it to a PolicyEngine. +2. **All state-changing functions are policy-protected** — Every function that modifies state carries the `runPolicy` modifier. The PolicyEngine evaluates all attached policies before the function body executes. +3. **ERC-7201 namespaced storage** — All token state lives in a dedicated `ComplianceTokenStoreERC3643` storage struct, following the [ERC-7201](https://eips.ethereum.org/EIPS/eip-7201) pattern for safe upgradeable storage. + +## How it differs from canonical T-REX + +This implementation keeps the `IToken` interface that T-REX tooling and auditors expect, but swaps out the two internal subsystems for ACE equivalents: + +### Identity: ACE Cross-Chain Identity replaces ONCHAINID + +The canonical T-REX stack uses ONCHAINID for on-chain identity claims. This implementation replaces it with ACE's [Cross-Chain Identity](/ace/concepts/cross-chain-identity) infrastructure (IdentityRegistry and CredentialRegistry). The legacy interface stubs remain to satisfy `IToken` but are not functional: + +- `identityRegistry()` returns `address(0)`. +- `onchainID()` returns `address(0)`. +- `setIdentityRegistry()` reverts with "Not implemented". +- `setOnchainID()` reverts with "Not implemented". + +Identity verification is handled through ACE policies that validate credentials against the IdentityRegistry and CredentialRegistry. + +### Compliance: ACE Policy Management replaces ModularCompliance + +The canonical T-REX stack uses `ModularCompliance` for transfer rules. This implementation replaces it with ACE's [Policy Management](/ace/concepts/policy-management) system, where compliance rules are defined as policies attached to the PolicyEngine. The legacy stub remains: + +- `compliance()` returns `address(0)`. +- `setCompliance()` reverts with "Not implemented". + +### Wallet recovery not implemented + +- `recoveryAddress()` reverts with "Not implemented". Wallet recovery is not supported in this implementation. + +## Protected functions + +Every state-changing function on the token is policy-protected with [`runPolicy`](/ace/concepts/policy-management#the-policy-execution-flow), which intercepts each call and routes it through the PolicyEngine. The engine evaluates all attached policies before the function body executes. Functions that interact with user balances also carry the `whenNotPaused` modifier, which checks the token's pause state before proceeding. + +### Transfers + +| Function | Modifiers | Description | +| ---------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| `transfer(to, amount)` | `whenNotPaused`, `runPolicy` | Transfer tokens from the caller to another address. Checks that neither wallet is frozen and that the sender has sufficient unfrozen balance. | +| `transferFrom(from, to, amount)` | `whenNotPaused`, `runPolicy` | Transfer tokens on behalf of another address using an allowance. Same frozen and balance checks as `transfer`. | +| `forcedTransfer(from, to, amount)` | `runPolicy` | Administrative transfer that auto-unfreezes tokens if the unfrozen balance is insufficient. | + +### Allowances + +| Function | Modifiers | Description | +| --------------------------------------------- | ---------------------------- | ------------------------------- | +| `approve(spender, amount)` | `whenNotPaused`, `runPolicy` | Set an allowance for a spender. | +| `increaseAllowance(spender, addedValue)` | `whenNotPaused`, `runPolicy` | Increase an existing allowance. | +| `decreaseAllowance(spender, subtractedValue)` | `whenNotPaused`, `runPolicy` | Decrease an existing allowance. | + +### Minting and burning + +| Function | Modifiers | Description | +| --------------------------- | ----------- | ---------------------------------------------------------------------------------------------- | +| `mint(to, amount)` | `runPolicy` | Create new tokens and assign them to an address. | +| `burn(userAddress, amount)` | `runPolicy` | Destroy tokens from an address. Auto-unfreezes tokens if the unfrozen balance is insufficient. | + +### Freezing + +| Function | Modifiers | Description | +| -------------------------------------------- | ----------- | --------------------------------------------------------------------------------------------------------------- | +| `setAddressFrozen(userAddress, freeze)` | `runPolicy` | Freeze or unfreeze an entire address. A frozen address cannot send or receive tokens through regular transfers. | +| `freezePartialTokens(userAddress, amount)` | `runPolicy` | Freeze a specific amount of tokens on an account. | +| `unfreezePartialTokens(userAddress, amount)` | `runPolicy` | Unfreeze a previously frozen amount on an account. | + +### Token administration + +| Function | Modifiers | Description | +| ------------------- | ----------- | ---------------------------------------------------------------- | +| `pause()` | `runPolicy` | Pause the token. All functions with `whenNotPaused` will revert. | +| `unpause()` | `runPolicy` | Unpause the token. | +| `setName(name)` | `runPolicy` | Update the token name. | +| `setSymbol(symbol)` | `runPolicy` | Update the token symbol. | + +## Frozen token behavior + +`ComplianceTokenERC3643` uses an **automatic unfreezing** model, following the standard T-REX approach. There are two independent freeze mechanisms: + +- **Address freeze** — A boolean flag (`frozen[address]`) that blocks an address from sending or receiving tokens through regular `transfer` and `transferFrom` calls. +- **Partial token freeze** — A numeric amount (`frozenTokens[address]`) that restricts how many of an account's tokens can be moved. Available balance = total balance - frozen tokens. + +Regular transfers check both: the wallet must not be address-frozen, and the transfer amount must not exceed the unfrozen balance. + +**Administrative operations auto-unfreeze.** When `forcedTransfer` or `burn` is called and the unfrozen balance is insufficient, the contract automatically reduces `frozenTokens` by the shortfall and emits a `TokensUnfrozen` event. This means administrative actions are never blocked by partial frozen status — the admin has already decided the operation is necessary. + + + +## Built-in pause + +The token includes a built-in `pause`/`unpause` mechanism. Both functions are policy-protected. When paused, all functions carrying the `whenNotPaused` modifier revert — this includes `transfer`, `transferFrom`, `approve`, `increaseAllowance`, and `decreaseAllowance`. + +Administrative functions (`mint`, `burn`, `forcedTransfer`, freeze operations) do **not** carry `whenNotPaused` and remain callable while the token is paused. + + + +## Batch operations + +The ERC-3643 token supports batch operations for managing large numbers of holders efficiently: + +- `batchTransfer` — Transfer to multiple recipients in a single transaction. +- `batchForcedTransfer` — Force-transfer between multiple address pairs. +- `batchMint` — Mint to multiple recipients. +- `batchBurn` — Burn from multiple addresses. +- `batchSetAddressFrozen` — Freeze or unfreeze multiple addresses. +- `batchFreezePartialTokens` — Freeze token amounts on multiple accounts. +- `batchUnfreezePartialTokens` — Unfreeze token amounts on multiple accounts. + +Each batch function delegates to its single-item counterpart in a loop, so every individual operation goes through `runPolicy` independently. + +## Storage layout + +All token state is stored in `ComplianceTokenStoreERC3643`, which uses ERC-7201 namespaced storage at a deterministic slot: + +| Field | Type | Description | +| --------------- | ------------------------------------------------- | --------------------------------- | +| `tokenName` | `string` | Token name. | +| `tokenSymbol` | `string` | Token symbol. | +| `tokenDecimals` | `uint8` | Decimal precision for display. | +| `tokenPaused` | `bool` | Whether the token is paused. | +| `totalSupply` | `uint256` | Total supply of tokens. | +| `balances` | `mapping(address => uint256)` | Per-account token balances. | +| `allowances` | `mapping(address => mapping(address => uint256))` | Per-account spender allowances. | +| `frozen` | `mapping(address => bool)` | Per-account address freeze flag. | +| `frozenTokens` | `mapping(address => uint256)` | Per-account frozen token amounts. | + +## Reference implementation + +The full source code for the ERC-3643 compliance token: + +- [ComplianceTokenERC3643.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-3643/src/ComplianceTokenERC3643.sol) — Token contract implementing the `IToken` interface with ACE policy protection. +- [ComplianceTokenStoreERC3643.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/tokens/erc-3643/src/ComplianceTokenStoreERC3643.sol) — ERC-7201 namespaced storage layout. + +--- + +# Upgrading Existing Contracts +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/upgrade-existing +Last Updated: 2026-05-26 + +This guide explains how to add ACE compliance to a contract that is already deployed. The process is a standard proxy upgrade — your existing state (balances, allowances, mappings) is fully preserved, your contract address stays the same, and all existing integrations continue to work. + + + + + +## Prerequisites + +Before starting, you should be familiar with: + +- [ACE Architecture](/ace/concepts/architecture) — how PolicyEngine, policies, and extractors work together +- [Policy Management](/ace/concepts/policy-management) — the execution model and policy outcomes + +### Your contract must be upgradeable + +This guide covers contracts deployed behind a proxy pattern — UUPS, Transparent Proxy, or Beacon Proxy. You need upgrade authority over the contract. + +If your contract is **not upgradeable**, see [Alternatives for non-upgradeable contracts](#alternatives-for-non-upgradeable-contracts) below. + +## Key concept: Storage safety with ERC-7201 + +When upgrading a contract, new variables must not overwrite existing state. `PolicyProtectedUpgradeable` uses [ERC-7201 namespaced storage](https://eips.ethereum.org/EIPS/eip-7201), which isolates all ACE data in a deterministic storage slot that cannot collide with your existing storage layout. + +```solidity +bytes32 private constant STORAGE_LOCATION = + keccak256(abi.encode(uint256(keccak256("chainlink.ace.PolicyProtected")) - 1)) + & ~bytes32(uint256(0xff)); +``` + +This formula produces a storage location that is guaranteed not to overlap with Solidity's default sequential storage layout. Your existing balances, allowances, and other state remain untouched. + +## Choosing your approach + +There are two ways to integrate ACE into an upgradeable contract: + +| Aspect | Approach 1: Extend PolicyProtectedUpgradeable | Approach 2: Implement IPolicyProtected | +| ------------------------- | --------------------------------------------- | ------------------------------------------- | +| **Bytecode impact** | +5-6 KB | +1-2 KB | +| **Implementation effort** | Add inheritance + modifiers | Write storage, context, and execution logic | +| **Maintenance** | Inherits ACE updates automatically | You maintain all custom code | +| **Risk** | Lower — proven patterns | Higher — custom code means custom bugs | + +**Recommendation:** Use Approach 1 unless your contract is near the 24 KB bytecode limit or you need custom control over how context is stored or policies are executed. + +## Approach 1: Extend PolicyProtectedUpgradeable (recommended) + +This approach inherits from `PolicyProtectedUpgradeable`, which provides built-in modifiers and automatic storage management. + +### Step 1: Update contract inheritance + +Add `PolicyProtectedUpgradeable` to your inheritance chain. + +**Before:** + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable { + // ... +} +``` + +**After:** + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PolicyProtectedUpgradeable} from "@chainlink/policy-management/core/PolicyProtectedUpgradeable.sol"; + +contract MyToken is PolicyProtectedUpgradeable, ERC20Upgradeable, UUPSUpgradeable { + // ... +} +``` + + + +### Step 2: Add a migration function + +Your original `initialize()` has already been called, so you cannot modify it. Instead, add a migration function using `reinitializer`: + +```solidity +function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + __PolicyProtected_init_unchained(policyEngine); +} +``` + +`reinitializer(2)` ensures this migration runs exactly once (version 1 was your original `initialize()`). If you have had previous upgrades with reinitializers, increment the version accordingly. + +`__PolicyProtected_init_unchained()` stores the PolicyEngine address in namespaced storage and registers your contract with the PolicyEngine. + + + +If you need to switch to a different PolicyEngine later, call `attachPolicyEngine(newAddress)` (owner-only). + +### Step 3: Add runPolicy to protected functions + +Add the `runPolicy` modifier to each function that should be subject to policy checks. + +**Before:** + +```solidity +function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); +} + +function transfer(address to, uint256 amount) public virtual override returns (bool) { + return super.transfer(to, amount); +} +``` + +**After:** + +```solidity +function mint(address to, uint256 amount) public runPolicy { + _mint(to, amount); +} + +function transfer(address to, uint256 amount) public virtual override runPolicy returns (bool) { + return super.transfer(to, amount); +} +``` + +Access control (restricting who can mint, for example) is now enforced through policies rather than traditional `onlyOwner` modifiers. This lets you change access rules by updating policies without upgrading the contract. + +For functions that need additional data passed to policies (signatures, proofs), use `runPolicyWithContext`: + +```solidity +function forceTransfer( + address from, + address to, + uint256 amount, + bytes calldata context +) public runPolicyWithContext(context) { + _update(from, to, amount); +} +``` + +### Complete before/after example + +**Before (standard upgradeable ERC-20):** + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +contract MyToken is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable { + constructor() { + _disableInitializers(); + } + + function initialize(address initialOwner) public initializer { + __ERC20_init("MyToken", "MTK"); + __Ownable_init(initialOwner); + } + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} +} +``` + +**After (with ACE integration):** + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.27; + +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {PolicyProtectedUpgradeable} from "@chainlink/policy-management/core/PolicyProtectedUpgradeable.sol"; + +contract MyToken is PolicyProtectedUpgradeable, ERC20Upgradeable, UUPSUpgradeable { + constructor() { + _disableInitializers(); + } + + function initialize(address initialOwner) public initializer { + __ERC20_init("MyToken", "MTK"); + __Ownable_init(initialOwner); + } + + function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + __PolicyProtected_init_unchained(policyEngine); + } + + function mint(address to, uint256 amount) public runPolicy { + _mint(to, amount); + } + + function transfer(address to, uint256 amount) + public + virtual + override + runPolicy + returns (bool) + { + return super.transfer(to, amount); + } + + function transferFrom(address from, address to, uint256 amount) + public + virtual + override + runPolicy + returns (bool) + { + return super.transferFrom(from, to, amount); + } + + function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} +} +``` + +**Key changes:** + +1. Import and inherit `PolicyProtectedUpgradeable` (remove explicit `Initializable` and `OwnableUpgradeable` — they are inherited through `PolicyProtectedUpgradeable`). +2. Add `migrateToACE()` with `reinitializer(2)`. +3. Add `runPolicy` to functions that need policy protection. + +## Approach 2: Implement IPolicyProtected (advanced) + +If your contract is near the 24 KB bytecode limit or you need custom control over policy execution, you can implement the `IPolicyProtected` interface directly instead of inheriting from `PolicyProtectedUpgradeable`. This adds only \~1-2 KB of bytecode but requires more code. + +### What you must implement + +You are responsible for: + +1. **Storage** — Storing the PolicyEngine address and per-sender context using ERC-7201 namespaced storage. +2. **Policy execution** — Calling `policyEngine.run()` with the correct payload in each protected function. +3. **Context handling** — Storing, retrieving, and clearing context data. +4. **Registration** — Attaching to and detaching from the PolicyEngine. +5. **ERC-165 support** — Implementing `supportsInterface()`. + +### Interface methods + +```solidity +interface IPolicyProtected { + function attachPolicyEngine(address policyEngine) external; + function getPolicyEngine() external view returns (address); + function setContext(bytes calldata context) external; + function getContext() external view returns (bytes memory); + function clearContext() external; +} +``` + +| Method | Purpose | +| -------------------- | ----------------------------------------------- | +| `attachPolicyEngine` | Registers your contract with a PolicyEngine | +| `getPolicyEngine` | Returns the current PolicyEngine address | +| `setContext` | Stores context data for the next protected call | +| `getContext` | Retrieves stored context for the current caller | +| `clearContext` | Clears context after use to prevent replay | + +### Implementation skeleton + +The following skeleton shows the key pieces for an ERC-20 token. It uses the same migration pattern as Approach 1, but all ACE logic is implemented manually. + +```solidity +import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IPolicyProtected} from "@chainlink/policy-management/interfaces/IPolicyProtected.sol"; +import {IPolicyEngine} from "@chainlink/policy-management/interfaces/IPolicyEngine.sol"; +import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; + +contract MyToken is ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable, IPolicyProtected { + + // --- ERC-7201 Namespaced Storage --- + + struct ACEStorage { + address policyEngine; + mapping(address => bytes) senderContext; + } + + // Replace with your calculated ERC-7201 storage slot + bytes32 private constant ACE_STORAGE_LOCATION = 0x...; + + function _getACEStorage() private pure returns (ACEStorage storage $) { + assembly { + $.slot := ACE_STORAGE_LOCATION + } + } + + // --- Migration --- + + function migrateToACE(address policyEngine) public reinitializer(2) onlyOwner { + _attachPolicyEngine(policyEngine); + } + + // --- IPolicyProtected --- + + function attachPolicyEngine(address policyEngine) external onlyOwner { + _attachPolicyEngine(policyEngine); + } + + function _attachPolicyEngine(address policyEngine) internal { + require(policyEngine != address(0), "Zero address"); + ACEStorage storage $ = _getACEStorage(); + $.policyEngine = policyEngine; + IPolicyEngine(policyEngine).attach(); + } + + function getPolicyEngine() public view returns (address) { + return _getACEStorage().policyEngine; + } + + function setContext(bytes calldata context) external { + _getACEStorage().senderContext[msg.sender] = context; + } + + function getContext() public view returns (bytes memory) { + return _getACEStorage().senderContext[msg.sender]; + } + + function clearContext() public { + delete _getACEStorage().senderContext[msg.sender]; + } + + function supportsInterface(bytes4 interfaceId) external pure returns (bool) { + return interfaceId == type(IPolicyProtected).interfaceId || + interfaceId == type(IERC165).interfaceId; + } + + // --- Policy Execution --- + + function _runPolicy() internal { + ACEStorage storage $ = _getACEStorage(); + require($.policyEngine != address(0), "PolicyEngine not set"); + + bytes memory context = getContext(); + IPolicyEngine($.policyEngine).run( + IPolicyEngine.Payload({ + selector: msg.sig, + sender: msg.sender, + data: msg.data[4:], + context: context + }) + ); + + if (context.length > 0) { + clearContext(); + } + } + + // --- Protected Functions --- + + function transfer(address to, uint256 amount) public virtual override returns (bool) { + _runPolicy(); + return super.transfer(to, amount); + } + + // ... other protected functions follow the same pattern +} +``` + + + +## Execute the upgrade + +At this point your updated implementation contract is ready. You need the PolicyEngine address to proceed. + +### Pre-upgrade checklist + +**Development:** + +- Updated contract compiles successfully +- Final bytecode is under 24 KB +- Unit tests pass +- Integration tests with PolicyEngine pass + +**Infrastructure:** + +- PolicyEngine address received from the ACE Platform (Beta) or deployed by your team (GA) + +### Upgrade execution + +Deploy the new implementation, then execute the upgrade and migration in one transaction. The exact pattern depends on your proxy type: + +**UUPS:** + +```solidity +bytes memory data = abi.encodeCall(MyToken.migrateToACE, (policyEngineAddress)); +MyToken(proxyAddress).upgradeToAndCall(newImplementationAddress, data); +``` + +**Transparent Proxy:** + +```solidity +bytes memory data = abi.encodeCall(MyToken.migrateToACE, (policyEngineAddress)); +ProxyAdmin(proxyAdminAddress).upgradeAndCall(proxyAddress, newImplementationAddress, data); +``` + +**Beacon Proxy:** + +```solidity +// Beacon does not support upgradeAndCall — execute separately +UpgradeableBeacon(beaconAddress).upgradeTo(newImplementationAddress); +MyToken(proxyAddress).migrateToACE(policyEngineAddress); +``` + +### Post-upgrade verification + +- `getPolicyEngine()` returns the correct address +- Protected functions trigger policy checks +- Policies allow and reject transactions as expected +- Existing balances, allowances, and other state are unchanged + +## Alternatives for non-upgradeable contracts + +If your contract is not deployed behind a proxy, a standard upgrade is not possible. Depending on your situation, there are three alternative approaches to bring ACE compliance to your application. + +### Wrapped contract + +Deploy a new ACE-compatible wrapper contract that sits in front of your original contract. Users interact with the wrapper, which enforces policies before delegating calls to the underlying contract. + +**How it works:** The wrapper inherits from `PolicyProtected` and exposes the same external interface as the original contract. Each function on the wrapper calls `runPolicy`, then forwards the call to the original contract. The original contract remains completely untouched. + +**When to use:** Your contract's logic does not need to change, but you need compliance checks on interactions with it. Works well for contracts where you can redirect user traffic to a new entry point. + +**Tradeoffs:** + +- The wrapper has a **different contract address**, so integrators (DEXs, lending protocols, front ends) must update their references. +- If wrapping a token, users may need to **migrate balances** or **re-approve allowances** to the wrapper. +- Adds a layer of indirection, which slightly increases gas costs per call. + +### Contract migration + +Deploy a brand-new ACE-native contract and migrate state from the old contract to the new one. The new contract is built from scratch with `PolicyProtected` integrated from the start. + +**How it works:** You take a snapshot of the old contract's state (balances, allowances, roles, etc.) and seed the new contract with that data during deployment or through a claim-based migration. The old contract is then deprecated or paused. + +**When to use:** You want no wrapper indirection, no legacy contract to maintain. Particularly suited for tokens where a coordinated migration event is feasible (for example, a token swap or airdrop). + +**Tradeoffs:** + +- Requires a **coordinated migration event** — all holders and integrators must move to the new contract. +- The new contract has a **different address**, which affects all downstream integrations. +- Migration patterns (snapshot + airdrop, or claim-based redemption) add operational complexity. +- The old contract must be handled (paused, drained, or deprecated) to prevent confusion. + +### Edge protection + +Instead of modifying your contract, apply ACE policies at the integration points that interact with it — for example, a DEX pool, a bridge, or a lending protocol front end. + +**How it works:** The protected contract is not your original contract, but the integration layer. A DEX pool contract or a custom router contract inherits `PolicyProtected` and enforces compliance checks before interacting with your original token or vault. Your contract is never modified. + +**When to use:** Modifying the contract is not an option (immutable deployment, no migration path), and you can control the integration points where compliance matters. Works well when compliance is needed at specific boundaries rather than on every direct interaction. + +**Tradeoffs:** + +- **Does not protect direct contract interactions** — any user who calls your contract directly (bypassing the protected integration point) is not subject to policy checks. +- Only covers the specific integration points where ACE is applied. Comprehensive coverage requires wrapping all relevant entry points. +- The original contract's functionality is unchanged, which may be a regulatory concern if direct access remains open. + + + +## FAQ + +### Will this upgrade overwrite my existing state? + +No. `PolicyProtectedUpgradeable` uses ERC-7201 namespaced storage, which stores ACE data in an isolated slot. Your existing balances, allowances, and all other state remain untouched. + +### What happens to token balances and allowances? + +All state is preserved. The upgrade replaces the implementation contract (the code), but all state lives in the proxy's storage and is not affected. Users do not need to re-approve. + +### What about tokens held in external contracts (DEXs, protocols)? + +Unaffected. Your contract address does not change, so all existing integrations continue working. The only difference is that transactions may revert if policies reject them. + +### Can I protect only some functions? + +Yes. You only add `runPolicy` to the functions you want to protect. All other functions continue working normally without policy checks. + +### Can I update policies after the upgrade? + +Yes. Policies can be added, removed, reordered, and reconfigured through the ACE Platform without touching your contract code. + +### What if I need to switch to a different PolicyEngine? + +Call `attachPolicyEngine(newAddress)` (owner-only). This detaches the old engine and registers your contract with the new one. Once ACE is integrated, a PolicyEngine is always required — you cannot set it to the zero address. + +### How many policies can I attach to a single function? + +The PolicyEngine supports up to 8 policies per function selector. + +### My contract is near the 24 KB bytecode limit. What can I do? + +Use [Approach 2](#approach-2-implement-ipolicyprotected-advanced), which adds only \~1-2 KB. You can also enable the Solidity optimizer with higher runs, move logic to external libraries, or split functionality into separate contracts. + +--- + +# Security Considerations +Source: https://docs.chain.link/ace/guides/policy-manager/contracts/security-considerations +Last Updated: 2026-03-31 + +This page covers the implementation-level security concerns that developers should understand when integrating with ACE contracts — trust boundaries, external call risks, and defensive programming patterns. + +For governance-level security (administration controls, execution ordering, registry governance, privacy guarantees), see the [Security Model](/ace/concepts/security) concepts page. + +## Trust model for policies and extractors + +The PolicyEngine delegates trust to the individual Policy, Extractor, and Mapper contracts it is configured to use. A vulnerability in any one of these components can compromise the entire system. + +### Policy trust + +A malicious or poorly written policy can introduce vulnerabilities at two levels: + +- **The `run()` function** (read-only) — A policy that always returns Allow would bypass all subsequent policies. A policy that makes dangerous external calls could be exploited for denial of service. +- **The `postRun()` function** (state-changing) — This function executes after a successful check and can modify onchain state. A malicious postRun could drain funds, change ownership, or corrupt state. + +Only install trusted, audited policies. ACE provides a library of pre-built, audited policies for common use cases. + +### Extractor trust + +The PolicyEngine relies on Extractors to correctly and honestly parse transaction calldata. If an Extractor is compromised, it could misrepresent the data that policies use for their decisions. For example, an Extractor could report a false `value` for a transfer, causing a VolumePolicy to undercount and allow transactions that should be blocked. + +### External call risks + +Many policies make external calls during execution — for example, querying a credential registry or checking an external data source. Since most policy `run()` functions are `view` (read-only), traditional reentrancy attacks are not possible. However, other risks apply: + +- **Denial of service** — A malicious external contract could revert or consume excessive gas, causing the entire policy chain to fail. +- **Inconsistent reads** — External contract state could change between multiple calls within the same transaction. +- **Gas exhaustion** — Deep call chains across multiple policies with external calls could exceed gas limits. + +For policies with state-changing functions (like `postRun()`), traditional reentrancy protections should be considered if those functions make external calls. + +**Mitigation:** Only interact with well-established, audited external contracts in policy logic. Implement proper error handling so that policies gracefully handle external contract failures rather than cascading reverts. + +## Context handling and race conditions + +The [context parameter](/ace/concepts/policy-management#the-context-parameter) is a powerful feature for passing arbitrary data to policies, but it requires careful handling. + +When using the two-step method (calling `setContext` followed by the protected function), the context is stored per sender in the PolicyProtected contract. If context is set but not consumed in the same atomic transaction, stale context from a previous call could be reused. In contracts used by multiple senders (like relayers or governance contracts), one user's context could potentially be overwritten by another before it is consumed. + +**Mitigation:** Always set and consume context within the same atomic transaction. For contracts with multiple concurrent users, prefer the direct argument method (`runPolicyWithContext`) over the two-step approach. + +## Non-reverting view functions + +All validator functions in the Cross-Chain Identity system — `validate()`, `validateCredentialData()`, and related view functions — must **never revert** under any circumstances. They must always return a boolean result. + +This is a critical reliability requirement. If a validator reverted during a policy check (for example, because an external call to a credential registry failed), it would break the entire policy chain for that transaction. The PolicyEngine would not be able to distinguish between "credential is invalid" and "validator is broken." + +Implementations must use defensive programming patterns: + +- Wrap external calls in try-catch blocks. +- Return `false` on any external call failure rather than allowing the revert to propagate. +- Validate all inputs before making external calls. + +This guarantees that the policy chain always completes and returns a definitive result, even when downstream dependencies fail. + +--- + +# Managing Policy Engines +Source: https://docs.chain.link/ace/guides/policy-manager/manage-engines +Last Updated: 2026-05-26 + +A **policy engine** is the on-chain orchestrator that evaluates policies whenever a protected function is called. Each policy engine is deployed as a smart contract on one or more chains, and all your targets, policies, and protections are scoped to a specific engine. For a deeper explanation of how policy engines fit into the architecture, see [Architecture](/ace/concepts/architecture) and [Policy Management](/ace/concepts/policy-management). + + + +## Create a policy engine + +## View policy engines + +## Update a policy engine + +You can update a policy engine's name, description, and extractor associations. + +## Add or remove extractors + +Extractors decode transaction calldata into named parameters (sender, recipient, amount, etc.) so policies can evaluate them. If you forgot to attach an extractor during engine creation or need to remove one, use the `PUT /policy-engines/{id}` endpoint. + + + +### Add a missing extractor + +First, retrieve your engine to see which extractors are currently attached: + +```bash +curl https://ace.api.chain.link/v1/policy-engines/ \ + -H "Authorization: Apikey " +``` + +Check the `extractor_registrations` array in the response. Then send a PUT request that includes the existing extractor IDs plus the new one: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "My Policy Engine", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b", + "f17bbe8b-8462-4dd7-8fb7-a4973dff04fc" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' +``` + +In this example, `f17bbe8b-8462-4dd7-8fb7-a4973dff04fc` is the new extractor being added alongside two that were already attached. + +### Remove an extractor + +Send a PUT request with the `extractor_ids` array that **omits** the extractor you want to detach: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policy-engines/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "My Policy Engine", + "extractor_ids": [ + "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c", + "572201bb-170b-4fda-ab89-a65b5bbc594b" + ], + "onchain_policy_engines": [ + { "chain_selector": "16015286601757825753" }, + { "chain_selector": "3478487238524512106" }, + { "chain_selector": "14767482510784806043" }, + { "chain_selector": "16281711391670634445" }, + { "chain_selector": "10344971235874465080" } + ] + }' +``` + + + +## Archive a policy engine + +Archiving a policy engine deactivates it and prevents any further operations. All policy instances associated with the engine must be archived first. + + + +## Related pages + +- [Architecture](/ace/concepts/architecture) — how PolicyEngine contracts fit into the ACE system +- [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register contracts to protect under an engine +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Managing Targets +Source: https://docs.chain.link/ace/guides/policy-manager/manage-targets +Last Updated: 2026-04-06 + +A **target** is a smart contract protected by ACE. After deploying your [ACE-compatible contract](/ace/guides/policy-manager/contracts/ace-compatible), you register it as a target under a PolicyEngine. Once registered, you can configure the [default policy result](#default-allow-behavior) and attach [policies](/ace/guides/policy-manager/manage-policies) to its functions via [protections](/ace/guides/policy-manager/manage-protections). + + + +## Register a target + +After deploying your contract, register it as a target with a `POST` request. Provide the contract name, type, protected methods, and on-chain addresses: + +```bash +curl -X POST https://ace.api.chain.link/v1/targets \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "title": "My ERC-20 Token", + "description": "Production ERC-20 token with compliance enforcement", + "policy_engine_id": "", + "protected_methods": [ + "transfer(address,uint256)", + "transferFrom(address,address,uint256)" + #[any other methods you want to protect] + ], + "desired_default_allow": true, + "metadata": {"contract_type": "ERC-20"}, + "onchain_targets": [ + { + "chain_selector": "16015286601757825753", + "address": "0xYourContractAddressOnSepolia" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xYourContractAddressOnArbitrumSepolia" + }, + #[any other chains where your contract is deployed] + ] + }' +``` + +| Field | Required | Description | +| ----------------------- | -------- | ------------------------------------------------------------- | +| `title` | Yes | Human-readable name for the target | +| `description` | No | Description of the contract | +| `policy_engine_id` | Yes | UUID of the policy engine to associate with | +| `protected_methods` | No | Array of function signatures that can be protected | +| `desired_default_allow` | No | Whether to allow transactions by default (default: `true`) | +| `onchain_targets` | No | Array of objects with `chain_selector` and contract `address` | +| `metadata` | No | Arbitrary JSON metadata (e.g., `{"contract_type": "ERC-20"}`) | + +## Default allow behavior + +The **default policy result** controls what happens when a transaction passes through the entire policy chain and no policy explicitly returns Allow or Reject (i.e., every policy returns Continue). This is configured per target contract via the `desired_default_allow` field: + +- **`true` (default)** — The transaction is allowed. This is appropriate when you want policies to act as blockers (reject specific cases), and everything else passes through. +- **`false`** — The transaction is rejected. This is appropriate for allowlist-style enforcement where only explicitly approved transactions proceed. + +For more on how policy evaluation ordering works, see [Policy Ordering & Composition](/ace/concepts/policy-ordering#the-default-result). + +### Change the default policy result + +## View targets + +## Update a target + +You can update a target's name, description, contract type, protected methods, default allow behavior, and on-chain addresses. + + + +## Link targets + +When you deploy your ACE-compatible contract on a new chain, the control plane detects it automatically and creates a separate **detected target** (titled "unknown target"). Rather than managing each chain deployment as its own target, you can **merge** detected targets into an existing target to keep a single multi-chain target with all its on-chain addresses in one place. + +### Conditions + +A detected target can be merged (linked) into an existing target when: + +- The detected target was auto-discovered — it still has the default "unknown target" title. +- The detected target has at least one on-chain address. +- A valid destination target exists in the same policy engine: it must be a different target, already named, and deployed on a **different chain** than the source (no shared chain selectors). + +If no valid destination exists, the detected target cannot be merged — you can only rename it via **Edit details**. + +### How it works + +Merging transfers the on-chain addresses from the source target(s) to the destination target, then archives the sources. After the merge, the destination target contains all chain deployments and any protections remain on the destination. + + + +## Archive a target + +Archiving a target removes it from active use. All target protections associated with the target must be archived first. + + + +## Related pages + +- [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) — how to integrate `PolicyProtected` into your contract +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine your target will use +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create policy instances to attach to your target +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policies to specific functions on your target +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Managing Policies +Source: https://docs.chain.link/ace/guides/policy-manager/manage-policies +Last Updated: 2026-04-15 + +This guide covers how to browse available policy types, create policy instances, and configure their parameters. For attaching policies to specific functions on your contracts, see [Protecting Target Functions](/ace/guides/policy-manager/manage-protections). + +## Policy implementations vs policy instances + +ACE distinguishes between two concepts: + +- **Policy implementation** — A reusable policy template (smart contract code) that defines specific compliance logic, such as an allowlist check or volume limit. ACE provides a [pre-built library](/ace/reference/policy-library) of audited implementations, and you can register your own [custom policy](/ace/guides/policy-manager/custom-policies) implementations, which are scoped to your organization. +- **Policy instance** — A deployed copy of a policy implementation, configured with your specific parameters and associated with a [policy engine](/ace/guides/policy-manager/manage-engines). You create a policy instance from an implementation and then attach it to target functions via [protections](/ace/guides/policy-manager/manage-protections). + +For example, the "Allow List Policy" implementation can be instantiated multiple times with different allowlists. + +## Browse policy implementations + +## Create a policy instance + +A policy instance is created from a policy implementation and deployed on-chain within a policy engine. + +## View and filter policies + +## Update policy configuration + +After deploying a policy instance, you can update its on-chain configuration parameters — for example, adding an address to an allowlist or changing a volume threshold — without redeploying the policy. + +## Archive a policy + +Archiving a policy instance removes it from active use. All target protections that reference this policy must be archived first. + + + +## Related pages + +- [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work +- [Policy Library](/ace/reference/policy-library) — pre-built policy implementations with configuration details +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine your policies belong to +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policy instances to target functions +- [Policy Ordering & Composition](/ace/concepts/policy-ordering) — how to compose effective rulesets +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Protecting Target Functions +Source: https://docs.chain.link/ace/guides/policy-manager/manage-protections +Last Updated: 2026-05-26 + +A **target protection** is the link between a [policy instance](/ace/guides/policy-manager/manage-policies) and a specific function on a [target contract](/ace/guides/policy-manager/manage-targets). When a user calls the protected function, the policy engine evaluates the bound policies in order and decides whether to allow or reject the transaction. Target protections are the final step in setting up on-chain compliance enforcement. + +## Prerequisites + +Before creating a target protection, you need: + +1. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on your target chains. +2. A [target contract](/ace/guides/policy-manager/manage-targets) registered under that engine. +3. A [policy instance](/ace/guides/policy-manager/manage-policies) created from a policy implementation and associated with the same engine. +4. Extractors attached to the engine that support the function signatures you want to protect (see the [Policy Manager Quick Start](/ace/getting-started/policy-manager#extractor-ids-for-api-creation) for the full list). + +## Create a target protection + +A protection binds a policy instance to a specific function on your target contract. Once created, every call to that function is evaluated against the policy. + +## Position and evaluation order + +The `desired_position` determines the order in which policies are evaluated when a protected function is called: + +- **Position 0** is evaluated first. +- Policies are evaluated sequentially. If a policy returns **Reject**, the transaction is reverted immediately and remaining policies are not evaluated. +- If all policies return **Allow**, or if no policy explicitly rejects, the `desired_default_allow` setting on the [target](/ace/guides/policy-manager/manage-targets#default-allow-behavior) determines the outcome. + +For detailed information on composing effective rulesets, see [Policy Ordering & Composition](/ace/concepts/policy-ordering). + +## View protections + +## Manage an existing protection + +From the **Functions** or **Policies** view on your target contract (see [View protections](#view-protections) above), click on a policy instance to open a detail drawer. From there you can: + +- **Detach policy** — removes the protection so the policy no longer evaluates this function (see [Archive a protection](#archive-a-protection) below). +- **Edit instance** — opens the policy instance configuration (see [Update policy configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration)). + +### Extend a protection to additional chains + +If you created a protection on one chain and later want it to apply on additional chains, you can extend it via the API. + +### Archive a protection + +Archiving a protection unbinds the policy from the function. Once archived, the policy no longer evaluates transactions on that function. + + + +## Archival dependency chain + +ACE enforces an ordered archival flow. You must archive resources from the outside in: + +1. **Target protections** — archive these first +2. **Policy instances** — archive after all protections referencing them are archived +3. **Targets** — archive after all protections on the target are archived +4. **Policy engines** — archive after all policies in the engine are archived + +## Related pages + +- [Policy Ordering & Composition](/ace/concepts/policy-ordering) — how evaluation order affects transaction outcomes +- [Managing Policy Engines](/ace/guides/policy-manager/manage-engines) — create the engine that manages policies +- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register contracts to protect +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Managing Data Validators +Source: https://docs.chain.link/ace/guides/policy-manager/manage-data-validators +Last Updated: 2026-07-17 + +A **Data Validator** is an on-chain contract that inspects the **contents** of a credential — not just whether it exists. Attaching a Data Validator to an identity-validation policy lets you enforce rules on credential data, such as "only allow investors whose credential says they are in the US or Canada" or "reject any account whose credential country is on a sanctions list". + +This guide covers creating, configuring, and attaching Data Validators. For the credential side of the workflow — linking a data schema to a credential type and issuing credentials with data — see [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas) and [Managing Credentials](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + + + +## How Data Validators fit in + +Identity-validation policies — the [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) and the [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) — resolve a caller's address to a CCID and check credentials from **credential sources**. Each credential source can optionally reference a Data Validator. + +When a credential source has a Data Validator configured, the policy performs an extra step at transaction time: + +1. Resolve the account's CCID and confirm the credential exists (attestation check). +2. Fetch the credential's stored `credentialData`. +3. Call the Data Validator's `validateCredentialData(...)`, which returns `true` or `false`. + +The credential passes only if **both** the attestation check and the data check succeed. Without a Data Validator, the source is attestation-only — it confirms the credential exists but ignores its contents. + + + +## The AllowDenyList Data Validator + +ACE provides a pre-built, audited Data Validator implementation: the **AllowDenyList Data Validator**. It validates a credential payload against an **allowlist** and a **denylist**, with an optional restriction by credential type. Its rules are: + +- If the **denylist** contains any value present in the credential, validation **fails**. +- If the **allowlist** is non-empty, at least one value in the credential must be allowlisted; otherwise validation **fails**. +- If the allowlist is empty, the allow check passes (deny-only mode). + +The first use case shipped on top of this implementation is **jurisdiction control** using [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country codes (e.g., `US`, `CA`, `GB`). The country codes are the values checked against the allow and deny lists. + + + +## Prerequisites + +Before creating a Data Validator: + +1. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on your target chains. +2. A credential type linked to a **data schema** so its credentials carry data — for the jurisdiction use case, the ISO 3166-1 alpha-2 country code schema. See [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas). +3. Credentials issued **with data** against that credential type. See [Managing Credentials](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + +## Create a Data Validator + +A **Data Validator instance** is a deployed copy of a Data Validator implementation (such as the AllowDenyList country-code validator), configured with your specific allow and deny lists and scoped to one or more chains — the same shape as a policy instance. + +The AllowDenyList (country codes) Data Validator implementation ID is: + +```text +2aed366a-38af-4f48-b8e2-8fd1489db9fa +``` + +Create a Data Validator instance with a `POST` request. Provide the implementation ID and, for each chain, the `initial_config` with your allow and deny lists: + +```bash +curl -X POST https://ace.api.chain.link/v1/data-validators \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Jurisdiction allow/deny", + "description": "Allow US and CA, deny KP", + "data_validator_implementation_id": "2aed366a-38af-4f48-b8e2-8fd1489db9fa", + "onchain_data_validators": [ + { + "chain_selector": "16015286601757825753", + "initial_config": { + "allowlist": [{ "item": "US" }, { "item": "CA" }], + "denylist": [{ "item": "KP" }], + "supportedDataTypes": [] + } + } + ] + }' +``` + +| Field | Required | Description | +| ---------------------------------- | -------- | ------------------------------------------------------------------------- | +| `name` | Yes | Human-readable name for the instance | +| `description` | No | Description of the instance's purpose | +| `data_validator_implementation_id` | Yes | UUID of the Data Validator implementation to instantiate | +| `onchain_data_validators` | Yes | Array of per-chain deployments with `chain_selector` and `initial_config` | + +Each on-chain Data Validator starts in `creation_pending` status until deployment completes. The response includes the instance `id` and the on-chain addresses per chain. + + + +## Update a Data Validator configuration + +You can update the allow and deny lists after deployment without redeploying the validator. Configuration changes use JSON Patch and are version-checked per chain for optimistic concurrency. + +Update the configuration with a `PATCH` request. Supply `on_chains` with the `current_config_version` for each chain you are changing: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/data-validators//configs \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "patches": [ + { "op": "add", "path": "/allowlist/-", "value": "GB" } + ], + "on_chains": [ + { "chain_selector": "16015286601757825753", "current_config_version": "0" } + ] + }' +``` + +The JSON Patch format follows [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902). If the `current_config_version` does not match the on-chain state, the request is rejected — re-fetch the instance and retry with the current version. + +## Attach a Data Validator to a credential source + +A Data Validator takes effect only when it is referenced by a **credential source** on an identity-validation policy. Each credential source has a `dataValidator` field: + +- `0x0000000000000000000000000000000000000000` — attestation-only (default). The source checks only that the credential exists. +- A Data Validator address — the source additionally validates credential contents through that validator. + +Set the `dataValidator` field to your deployed Data Validator address when configuring the credential source on your [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) or [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) instance. See [Managing Policies — Update policy configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration) for how to change a policy instance's configuration. + + + +## View Data Validators + +List all Data Validators: + +```bash +curl https://ace.api.chain.link/v1/data-validators \ + -H "Authorization: Apikey " +``` + +| Parameter | Description | +| ---------------------------------- | ------------------------------------ | +| `page` | Page number (default: 1) | +| `page_size` | Results per page | +| `include_onchains` | Include per-chain deployment details | +| `data_validator_implementation_id` | Filter by implementation | +| `chain_selector` | Filter by chain | +| `address` | Filter by on-chain address | +| `status` | Filter by on-chain status | + +To retrieve a specific Data Validator by ID: + +```bash +curl https://ace.api.chain.link/v1/data-validators/ \ + -H "Authorization: Apikey " +``` + +## Archive a Data Validator + +Archiving a Data Validator deactivates the instance. Before archiving, detach it from any credential source that references it (set that source's `dataValidator` back to the zero address). + +Archive a Data Validator with a `PATCH` request: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/data-validators/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "archived" + }' +``` + +## Related pages + +- [Cross-Chain Identity — Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy) — attestation-only vs. Data Validator checks +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — link a data schema to a credential type +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue credentials with data +- [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy that consumes Data Validators via credential sources +- [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) — grouped identity validation with routing and Data Validators +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Custom Policies +Source: https://docs.chain.link/ace/guides/policy-manager/custom-policies +Last Updated: 2026-07-17 + +In addition to the [pre-built Policy Library](/ace/reference/policy-library), you can write and deploy **your own policy contract** and register it with the ACE Platform. Once registered, a custom policy behaves exactly like a library policy — you create instances of it, configure them, and attach them to protected functions. + +A custom policy implementation is **private to your organization**: it appears in your Policy Manager alongside the global library, but other organizations do not see it. + + + +## How it fits together + +A custom policy follows the same [implementation vs. instance](/ace/guides/policy-manager/manage-policies#policy-implementations-vs-policy-instances) model as library policies: + +1. **Write** a policy contract that implements the `IPolicy` interface. +2. **Deploy** it — this is your policy **implementation** contract — on each chain where you need it. +3. **Register** the implementation with the ACE Platform, providing its on-chain addresses and a **config schema**. This makes it an org-scoped policy type. +4. **Create instances** from it and **attach** them to target functions, exactly like a library policy. + +At instance-creation time, ACE's on-chain `PolicyFactory` clones your implementation into an instance and initializes it. The factory verifies that your implementation declares support for `IPolicy` (via ERC-165) — a contract that does not implement `IPolicy` cannot be instantiated. + +## Prerequisites + +- Solidity development experience and a deployment toolchain (Foundry, Hardhat, etc.). +- Familiarity with [Policy Management](/ace/concepts/policy-management) (the execution model, `run`/`postRun`, extractors, and parameters) and [Policy Ordering & Composition](/ace/concepts/policy-ordering). +- A deployed [PolicyEngine](/ace/guides/policy-manager/manage-engines). +- The `@chainlink/policy-management` contracts available in your project. + +## Step 1: Write the policy contract + +Every policy inherits from the base `Policy` contract and implements `run`. The base contract provides ownership, upgradeability, ERC-165 support, and the binding to a PolicyEngine. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {Policy} from "@chainlink/policy-management/core/Policy.sol"; +import {IPolicyEngine} from "@chainlink/policy-management/interfaces/IPolicyEngine.sol"; + +contract LockoutPolicy is Policy { + string public constant override typeAndVersion = "LockoutPolicy 1.0.0"; + + mapping(address => uint256) public lockoutExpiresAt; + + /// @notice Configuration setter — locks an address for a duration (seconds). + function setLockout(address account, uint256 duration) public onlyOwner { + lockoutExpiresAt[account] = block.timestamp + duration; + } + + /// @notice Authorize setLockout so the PolicyEngine can apply configuration changes. + function authorizeConfigSelector(bytes4 selector) public pure override returns (bool) { + return selector == this.setLockout.selector; + } + + function run( + address, /* caller */ + address, /* subject */ + bytes4, /* selector */ + bytes[] calldata parameters, + bytes calldata /* context */ + ) public view override returns (IPolicyEngine.PolicyResult) { + // Always validate the inputs your policy expects. + require(parameters.length == 1, "LockoutPolicy: expected 1 parameter"); + address recipient = abi.decode(parameters[0], (address)); + + if (lockoutExpiresAt[recipient] > block.timestamp) { + revert IPolicyEngine.PolicyRejected("LockoutPolicy: address is locked out"); + } + return IPolicyEngine.PolicyResult.Continue; + } +} +``` + +Key pieces: + +- **`run(...)`** — read-only evaluation returning `Continue` (defer to the next policy), `Allowed` (approve and skip the rest of the chain), or reverting with `PolicyRejected` to block the transaction. The `parameters` array holds the extractor outputs mapped to this policy; always validate its length and decode defensively. +- **`postRun(...)`** *(optional)* — override it to mutate state after a successful check (for example, incrementing a counter). It is `onlyPolicyEngine` and is not called when the policy rejects. +- **`configure(bytes)`** *(optional)* — override it to decode initial configuration passed at instance creation. The base `initialize` calls it. +- **Configuration setters + `authorizeConfigSelector`** — expose owner-callable setters (like `setLockout`) to reconfigure the policy after deployment, and override `authorizeConfigSelector` to return `true` for those selectors so the PolicyEngine is allowed to call them. Selectors you do not authorize can only be called by the owner directly, not through the platform. +- **`typeAndVersion`** — a human-readable identifier, e.g. `"LockoutPolicy 1.0.0"`. + + + +## Step 2: Deploy the implementation + +Deploy your policy contract on each chain where you intend to use it. This deployed contract is the **implementation** — ACE clones it into instances; you do not attach the implementation to functions directly. Record the deployed address per chain; you need them in the next step. + + + +## Step 3: Register the implementation + +Register the deployed implementation with the Coordinator API so the platform can manage it. Provide a name, description, the on-chain addresses, and a **config schema**. + +```bash +curl -X POST https://ace.api.chain.link/v1/policy-implementations \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "name": "Lockout Policy", + "description": "Blocks transfers to locked-out recipients for a period of time", + "onchain_policy_implementations": [ + { "chain_selector": "16015286601757825753", "address": "0xYourImplementationOnSepolia" } + ], + "policy_config_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "additionalProperties": false, + "properties": { + "lockouts": { + "type": "array", + "description": "Accounts to lock out and for how long.", + "items": { + "type": "object", + "required": ["account", "duration"], + "properties": { + "account": { "type": "string", "pattern": "^0x[a-fA-F0-9]{40}$" }, + "duration": { "type": "integer" } + } + }, + "metadata": { + "display_hints": { "network_behaviour": "apply_per_chain", "title": "Lockouts" }, + "primary_key_fields": ["account"], + "on_chain_operations": [ + { + "type": "add", + "function_abi": { + "name": "setLockout", + "type": "function", + "stateMutability": "nonpayable", + "inputs": [ + { "name": "account", "type": "address" }, + { "name": "duration", "type": "uint256" } + ], + "outputs": [] + } + } + ] + } + } + }, + "policy_run_parameters": [ + { "name": "Recipient", "type": "address", "max": 1 } + ], + "initial_configs": [] + } + }' +``` + +| Field | Required | Description | +| -------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `name` | Yes | Human-readable name shown in Policy Manager | +| `description` | Yes | What the policy does | +| `policy_config_schema` | Yes | JSON Schema describing configurable fields, the parameters the policy consumes, and how configuration maps to on-chain setters (see below) | +| `onchain_policy_implementations` | No | Array of `{ chain_selector, address }` for your deployed implementation on each chain. ACE records these; it does **not** deploy the implementation for you. | + +The registered implementation is created with type `custom` and scoped to your organization. It now appears in `GET /policy-implementations` alongside the global library. + +## The config schema + +The `policy_config_schema` is a [JSON Schema (draft-07)](https://json-schema.org/draft-07) document with three ACE-specific parts. It drives the Platform UI, validates the configuration you supply, and tells the platform how to translate configuration into on-chain calls. + +### `properties` — configurable fields + +Each property is a configurable field of your policy. Its `metadata.on_chain_operations` map configuration changes to your contract's setter functions: + +- `add` / `remove` — for list-style fields (add or remove an entry), pointing at setters like `setLockout`. +- `replace` — for scalar fields (set a single value), pointing at a setter like `setMax`. + +Each operation carries the `function_abi` of the setter to call. **Those setters must be authorized by your contract's `authorizeConfigSelector`** — otherwise the PolicyEngine cannot call them and configuration changes will fail. + +### `policy_run_parameters` — what the policy consumes + +An ordered array declaring the parameters your `run` function expects, each with a `name`, a Solidity `type`, and a `max`: + +- `max: 1` — exactly one value at that position. +- `max: -1` — a variable number of values (must be the last parameter). Use this for policies that check an arbitrary number of addresses. + +When you attach the policy to a function, the extractor outputs you map to it must match these parameters by type and position. See [Policy Management — the extractor and mapper pattern](/ace/concepts/policy-management#the-extractor-and-mapper-pattern). + +### `initial_configs` — what is set at creation + +An array of property names that are provided when an instance is **created** (in the instance's `initial_config`) rather than configured afterward. Leave it empty to configure everything after deployment. + +## Step 4: Create and use instances + +From here, a custom policy is used exactly like a library policy: + +1. [Create a policy instance](/ace/guides/policy-manager/manage-policies#create-a-policy-instance) from your implementation, supplying an `initial_config` that matches your config schema. ACE clones your implementation through the `PolicyFactory` and initializes the instance. +2. [Attach the instance to a protected function](/ace/guides/policy-manager/manage-protections), mapping the extractor outputs to your `policy_run_parameters`. +3. [Update the configuration](/ace/guides/policy-manager/manage-policies#update-policy-configuration) over time through the authorized config selectors. + +## Manage a custom implementation + +- **Update** name, description, or on-chain addresses with `PUT /policy-implementations/{id}`. +- **Archive** with `PATCH /policy-implementations/{id}` (`{"status":"archived"}`). All instances of the implementation must be archived first. + +## Security considerations + +A custom policy runs inside the policy chain of every function it protects, so a bug or malicious construct affects those transactions. In particular: + +- Keep `run` read-only and defensive — validate `parameters` length and decode carefully. +- Ensure any external calls cannot revert the whole chain unexpectedly; return a decision rather than propagating failures. +- Treat `postRun` state changes with the same care as any state-changing external function (reentrancy, access control). + +See [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) and the [Security Model](/ace/concepts/security) for the full trust model. + +## Related pages + +- [Custom Policies Tutorial](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CUSTOM_POLICIES_TUTORIAL.md) — end-to-end contract walkthrough with a boilerplate template +- [Policy Management](/ace/concepts/policy-management) — execution model, `run`/`postRun`, parameters +- [Policy Management Contracts](/ace/reference/policy-management-contracts) — `IPolicy`, `IPolicyEngine`, and other interfaces +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — attach policies to functions +- [Security Considerations](/ace/guides/policy-manager/contracts/security-considerations) — trust boundaries and defensive patterns + +--- + +# Offchain Policies +Source: https://docs.chain.link/ace/guides/policy-manager/offchain-policies +Last Updated: 2026-07-17 + +ACE offchain policies evaluate data or logic outside the blockchain before authorizing a protected onchain action. The authorization is delivered onchain as a permit that is bound to a specific transaction intent. + +ACE supports two offchain policy models: + +- **Managed offchain policies** provide an out-of-the-box workflow. You configure the risk rules and protections, while Chainlink manages the CRE workflow, external provider call, onchain validator deployment, and permit delivery. The current implementation supports wallet risk screening with TRM Wallet Screening. +- **Custom offchain policies** support bespoke compliance logic and providers. You host the policy endpoint and work with Chainlink to configure and operate the integration. + + + +## Managed offchain policy guides + +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — meet the TRM and CRE prerequisites, configure wallet risk rules, create the policy, and attach protections to target functions. +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — call the Evaluation API, monitor an evaluation, and submit the protected transaction after its permit is ready onchain. +- [Granting Evaluation Access](/ace/guides/policy-manager/offchain-policies/grant-evaluation-access) — let another organization request permit evaluations against your protected target contract. + +## Learn how offchain policies work + +See [Offchain Policies](/ace/concepts/off-chain-policies) for the architecture and execution flows of both managed and custom offchain policy models. + +--- + +# Managing Offchain Policies (MVP) +Source: https://docs.chain.link/ace/guides/policy-manager/offchain-policies/manage-offchain-policies +Last Updated: 2026-07-17 + +ACE managed offchain risk policies screen wallet addresses with [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) before allowing a protected onchain action. You configure the risk rules and the target functions to protect. Chainlink manages the CRE workflow, deploys the onchain permit validator, calls TRM, and delivers approved permits onchain. + +This guide covers policy setup. To integrate permit requests into your application, see [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). + + + +## How the managed policy works + +Creating a managed offchain policy provisions two components: + +- A managed CRE workflow that screens the configured wallet addresses with TRM Wallet Screening. +- A [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) (CADV) contract on each selected chain. The workflow writes approved permits to this contract through the Keystone Forwarder. + +When you attach the policy to a target function, the CADV becomes part of that function's policy chain. A call without a matching permit is rejected. A permit is valid only for its caller, target, function, and extracted parameters. + +## Prerequisites + +Before creating a managed offchain risk policy, you need: + +1. An ACE organization and [ACE API key](/ace/getting-started/account-setup#3-create-an-api-key). +2. A [policy engine](/ace/guides/policy-manager/manage-engines) deployed on every chain where you want to use the policy. +3. A [target contract](/ace/guides/policy-manager/manage-targets) associated with that policy engine. +4. An extractor attached to the policy engine that supports the target function. The extractor outputs determine which transaction parameters the permit must match. +5. A Chainlink CRE account with the [CRE CLI](https://docs.chain.link/cre/getting-started/cli-installation/macos-linux) installed and authenticated. +6. A TRM Labs account with Wallet Screening API access and a valid API key. ACE does not provide a TRM account or API credentials. See [TRM Wallet Screening](https://www.trmlabs.com/blockchain-intelligence-platform/wallet-screening) to learn about the product and request access. + +## Store the TRM credential in Vault DON + +The managed workflow retrieves your TRM credential from Vault DON at runtime. The credential remains encrypted and is not included in the offchain policy configuration. + +TRM uses HTTP Basic authentication with the API key as both the username and password. Before uploading it, encode `:` as Base64 without a trailing newline: + +```bash +export TRM_API_KEY="" +export TRM_BASIC_AUTH=$(printf '%s:%s' "$TRM_API_KEY" "$TRM_API_KEY" | base64 | tr -d '\n') +``` + +Create a secrets file that maps the Vault DON secret identifier to the environment variable: + +```yaml +secretsNames: + trmApiKey: + - TRM_BASIC_AUTH +``` + +Upload the secret using the CRE CLI. Replace `` with your CRE target: + +```bash +cre secrets create production-secrets.yaml \ + --target \ + --secrets-auth=browser +``` + +The identifier under `secretsNames` is the value to use for `secret_name` when you create the policy. In this example, it is `trmApiKey`. + +For prerequisites, authentication options, secret lifecycle operations, and troubleshooting, see [Using Secrets with Deployed Workflows](https://docs.chain.link/cre/guides/workflow/secrets/using-secrets-deployed). + + + +## Configure the risk policy + +The `wallet_risk_scoring` policy supports the following configuration: + +| Field | Required | Description | +| -------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `secret_name` | Yes | Vault DON identifier containing the Base64-encoded TRM Basic Auth credential. | +| `addresses_to_check` | Yes | Which addresses to screen: `CALLER`, `PARAMETERS`, or `ALL`. | +| `risk_threshold` | Yes | Reject an address whose highest TRM risk level is at or above this threshold: `LOW`, `MEDIUM`, `HIGH`, or `SEVERE`. | +| `block_unknown` | No | When `true`, reject an address whose TRM risk level is `UNKNOWN`. Defaults to `false`. | +| `category_filters` | No | Category-specific thresholds. Each entry contains `category` and an optional `threshold`. If omitted, the global `risk_threshold` applies to that category. | +| `fail_mode` | No | `CLOSED` fails the evaluation when TRM returns an unsuccessful HTTP response. `OPEN` allows it to continue. Defaults to `CLOSED`. | + +### Select addresses to screen + +The `addresses_to_check` setting controls which addresses are sent to TRM: + +| Value | Addresses screened | +| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `CALLER` | Only `caller_address` from the evaluation request. | +| `PARAMETERS` | Addresses found in `permit_parameters`. The first permit parameter represents the sender; subsequent address values are identified from the function signature. | +| `ALL` | The caller and all addresses found in `permit_parameters`, with duplicates removed. | + +For an ERC-20 `transfer(address,uint256)` evaluation with permit parameters `[from, to, amount]`, `CALLER` screens `from`, while `PARAMETERS` and `ALL` screen both `from` and `to`. + +The workflow accepts at most ten unique addresses per evaluation. + +### Apply global and category thresholds + +TRM assigns an overall risk level to each address. ACE orders the levels as follows: + +```text +UNKNOWN < LOW < MEDIUM < HIGH < SEVERE +``` + +An address is rejected when its overall level meets or exceeds `risk_threshold`. For example, a `HIGH` threshold rejects `HIGH` and `SEVERE` results. + +You can also apply different thresholds to individual TRM risk categories. The following configuration rejects: + +- Any address with an overall risk level of `HIGH` or `SEVERE`. +- Any `Sanctions` indicator at `LOW` or above. +- Any `Darknet Market` indicator at `MEDIUM` or above. + +```json +{ + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" }, + { "category": "Darknet Market", "threshold": "MEDIUM" } + ] +} +``` + +Category names are matched case-insensitively against the categories returned by TRM. Consult your TRM Wallet Screening account for the categories available to your organization. + + + +## Create the offchain policy + +Create the policy with `POST /v1/policies`. Use the same policy engine and chains as the target you plan to protect: + +```bash +curl -X POST https://ace.api.chain.link/v1/policies \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "name": "Transaction wallet screening", + "type": "wallet_risk_scoring", + "policy_engine_id": "", + "onchain_policies": [ + { "chain_selector": "" } + ], + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "HIGH", + "block_unknown": false, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" }, + { "category": "Darknet Market", "threshold": "MEDIUM" } + ] + } + }' +``` + +ACE allows one active offchain policy per organization. Creating another returns a conflict until the existing policy is archived. + +Policy creation is asynchronous. The initial response includes the policy ID and a `deployment_status` such as `pending` or `deploying`. Poll the policy until it becomes `active`: + +```bash +curl https://ace.api.chain.link/v1/policies/ \ + -H "Authorization: Apikey " +``` + +ACE creates a managed CRE workflow and deploys one CADV contract per selected chain. When the policy becomes active, `action_validators` contains each chain selector and CADV address. + + + +## Attach the policy to a target function + +A protection connects the managed policy to a function on your target. The `extractor_output_ids` must identify, in order, the values that the permit will bind to onchain. + +For `transfer(address,uint256)`, use the `from`, `to`, and `amount` outputs from the same `ERC20TransferExtractor`: + +```bash +curl -X POST https://ace.api.chain.link/v1/targets//protections \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "policy_instance_id": "", + "function_signature": "transfer(address,uint256)", + "desired_position": 0, + "extractor_output_ids": [ + "", + "", + "" + ], + "onchain_target_protections": [ + { "chain_selector": "" } + ] + }' +``` + +The selected chains must be a subset of the chains configured on the offchain policy. The target and policy must also belong to the same policy engine. + +Protection attachment is asynchronous and returns `202 Accepted`. Poll the policy's protections until the new protection becomes `active`: + +```bash +curl https://ace.api.chain.link/v1/policies//protections \ + -H "Authorization: Apikey " +``` + +Once active, calls to the protected function require a matching permit. Continue with [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). + +## Update the policy configuration + +Updating the configuration redeploys the managed workflow but does not replace its CADV contracts or protections: + +```bash +curl -X PUT https://ace.api.chain.link/v1/policies//config \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "config": { + "secret_name": "trmApiKey", + "addresses_to_check": "ALL", + "fail_mode": "CLOSED", + "risk_threshold": "SEVERE", + "block_unknown": true, + "category_filters": [ + { "category": "Sanctions", "threshold": "LOW" } + ] + } + }' +``` + +The policy enters `config_updating` and returns to `active` after the workflow is redeployed. Do not request new evaluations while the configuration is updating. + +## Remove a protection or policy + +Remove a protection before archiving its policy: + +```bash +curl -X DELETE \ + https://ace.api.chain.link/v1/policies//protections/ \ + -H "Authorization: Apikey " +``` + +The removal is asynchronous. After all protections are removed, archive the policy: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/policies/ \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "policy_kind": "offchain", + "status": "archived" + }' +``` + +Archiving removes the managed workflow and its event watchers. It also allows the organization to create a new offchain policy. + +## Beta and MVP limitations + +- `wallet_risk_scoring` is the only managed offchain policy type. +- Each organization can have one active offchain policy. +- Each evaluation can screen at most ten unique addresses. +- Every permit is single-use (`maxUses = 1`) and does not expire (`expiry = 0`). These values are not configurable in the current release. +- The values in `permit_parameters` must match the outputs configured on the protection and the values extracted from the eventual onchain call. +- General CRE service limits also apply. See [CRE Service Quotas](https://docs.chain.link/cre/service-quotas). + +## Related pages + +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — integrate evaluations and permits into an application +- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) — conceptual overview of managed and custom offchain policies +- [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) — onchain permit validation +- [Protecting Target Functions](/ace/guides/policy-manager/manage-protections) — protection concepts and evaluation order +- [Coordinator API Reference](/api/ace/coordinator/docs) — policy and protection API schemas + +--- + +# Requesting Offchain Permits +Source: https://docs.chain.link/ace/guides/policy-manager/offchain-policies/request-offchain-permits +Last Updated: 2026-07-17 + +After a managed offchain risk policy protects a function, the function rejects calls that do not have a matching permit. Your application must request an evaluation, wait for the permit to be stored onchain, and then submit the protected transaction. + +This guide uses an ERC-20 `transfer(address,uint256)` as the example. For policy and protection setup, see [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies). + + + +## Evaluation flow + +1. Your application describes the intended transaction to the ACE Evaluation API. +2. ACE triggers the managed CRE workflow for your organization. +3. The workflow extracts the configured addresses and screens them with TRM Wallet Screening. +4. If the risk rules reject any address, the evaluation becomes `rejected` and no permit is created. +5. If the risk rules pass, the workflow writes a permit to the CADV contract through the Keystone Forwarder. +6. After ACE observes the onchain `PermitStored` event, the evaluation becomes `ready`. +7. Your application submits the protected transaction with the same caller, target, function, and parameter values. +8. The policy engine finds and consumes the permit. The permit cannot authorize another transaction. + +## Prerequisites + +Before requesting an evaluation, verify that: + +- The offchain policy has `deployment_status: active`. +- Its protection for the target function has `status: active`. +- You know the target contract address and chain selector. +- You know the wallet that will submit the onchain transaction. It must be the same address as `caller_address`. +- You know the ordered extractor outputs configured on the protection. Your `permit_parameters` must use that same order. + +## Evaluation API + +The production Evaluation API base URL is: + +```text +https://ace.api.chain.link/v1/evaluation +``` + +It uses the same ACE API key as the Coordinator API: + +```http +Authorization: Apikey +``` + + + +## Construct the evaluation request + +Start an evaluation with `POST /evaluate`: + +```json +{ + "caller_address": "0x1111111111111111111111111111111111111111", + "subject": "0x2222222222222222222222222222222222222222", + "function_signature": "transfer(address,uint256)", + "parameters": { + "to": "0x3333333333333333333333333333333333333333", + "amount": "100" + }, + "permit_parameters": [ + "0x0000000000000000000000001111111111111111111111111111111111111111", + "0x0000000000000000000000003333333333333333333333333333333333333333", + "0x0000000000000000000000000000000000000000000000000000000000000064" + ], + "chain_selector": "", + "unique_evaluation_id": "transfer-018f6b3e-7c42-7a1f-a8ed-5ecf90c03b30" +} +``` + +| Field | Description | +| ---------------------- | ---------------------------------------------------------------------------------------------------------- | +| `caller_address` | Wallet that will submit the protected transaction. | +| `subject` | Address of the protected target contract. | +| `function_signature` | Canonical function signature, such as `transfer(address,uint256)`. Do not send the four-byte selector. | +| `parameters` | Structured representation of the function arguments. ACE stores it with the evaluation as contextual data. | +| `permit_parameters` | Ordered ABI-encoded values used for address screening and exact onchain permit matching. | +| `chain_selector` | Chain where the target, policy engine, protection, and CADV are deployed. | +| `unique_evaluation_id` | Client-generated identifier unique to this transaction intent. ACE uses it to derive the permit ID. | + +### Encode permit parameters + +Each `permit_parameters` item is a `0x`-prefixed, 32-byte ABI word. The items must have the same order as the `extractor_output_ids` on the protection. + +For `transfer(address,uint256)`, the `ERC20TransferExtractor` produces: + +```text +[from, to, amount] +``` + +Therefore, encode: + +1. `from`: the transaction caller, as an ABI `address`. +2. `to`: the transfer recipient, as an ABI `address`. +3. `amount`: the transfer amount, as an ABI `uint256`. + +Use a standard ABI library rather than concatenating untrusted values manually. For example, with ethers v6: + +```javascript +import { AbiCoder } from "ethers" + +const abiCoder = AbiCoder.defaultAbiCoder() + +const permitParameters = [ + abiCoder.encode(["address"], [callerAddress]), + abiCoder.encode(["address"], [recipientAddress]), + abiCoder.encode(["uint256"], [amount]), +] +``` + + + +### Choose a unique evaluation ID + +`unique_evaluation_id` is scoped to your ACE organization. ACE combines it with the organization ID to derive a deterministic `permit_id`. + +Retrying with the same `unique_evaluation_id` is idempotent: ACE returns the existing evaluation instead of triggering another workflow execution. Never reuse an ID for a different caller, target, function, or set of parameters. + +Use a UUID or another collision-resistant identifier generated by your backend. Store it with the transaction intent so you can safely recover from a lost HTTP response. + +## Start the evaluation + +```bash +curl -X POST https://ace.api.chain.link/v1/evaluation/evaluate \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d @evaluation.json +``` + +The response contains the deterministic permit ID and initial status: + +```json +{ + "permit_id": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "status": "evaluating" +} +``` + +The response does not mean that the transaction is approved. Wait until the evaluation becomes `ready`. + +## Poll the evaluation + +Retrieve the evaluation using the returned permit ID: + +```bash +curl \ + https://ace.api.chain.link/v1/evaluation/evaluate/ \ + -H "Authorization: Apikey " +``` + +Polling every five seconds is a reasonable default. Stop when the evaluation reaches a terminal status. + +| Status | Terminal | Meaning | +| ------------ | -------- | ----------------------------------------------------------------------------------- | +| `evaluating` | No | The workflow is screening the configured addresses. | +| `approving` | No | TRM checks passed and the workflow is publishing the permit onchain. | +| `ready` | Yes | The permit was stored onchain. The protected transaction can now be submitted. | +| `rejected` | Yes | At least one configured risk rule rejected the evaluation. No permit was created. | +| `error` | Yes | The evaluation or onchain permit publication failed. No usable permit is available. | + +For `rejected` and `error`, the response can include a `reason`. `workflow_execution_id` identifies the CRE execution when available. Because permits do not expire in the current release, `expires_at` is normally `null`. + +```json +{ + "permit_id": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "status": "ready", + "reason": null, + "workflow_execution_id": "", + "expires_at": null +} +``` + +## Retry an evaluation + +The CRE HTTP trigger allows one new execution per workflow every 60 seconds. Polling an existing evaluation does not trigger the workflow and is not subject to that trigger rate. + +- If the initial HTTP response is lost or ambiguous, retry `POST /evaluate` with the same `unique_evaluation_id`. ACE returns the existing evaluation if it was created. +- If an evaluation reaches `rejected`, changing the identifier alone does not change the policy decision. Review the risk result or transaction intent. +- If an evaluation reaches `error` and the underlying issue is resolved, wait at least 60 seconds and submit a new evaluation with a new `unique_evaluation_id`. + +See [CRE Service Quotas](https://docs.chain.link/cre/service-quotas) for current workflow limits. + +## Submit the protected transaction + +Submit the transaction only after the evaluation becomes `ready`. The sender must be `caller_address`, and the target function must receive values that produce the same extracted parameters as `permit_parameters`. + +No permit bytes are added to the transaction. The CADV already stores the permit and looks it up from the action's caller, target, selector, and extracted parameters. + +After the protected call succeeds, the CADV increments the permit's usage counter. Managed risk policy permits have `maxUses = 1`, so another transaction with the same intent requires a new evaluation and permit. + + + +## Troubleshooting + +### Evaluation is rejected + +- At least one address met or exceeded the global `risk_threshold`. +- A TRM risk indicator met or exceeded a configured category threshold. +- TRM returned `UNKNOWN` and `block_unknown` is enabled. + +Review the response `reason` and the policy configuration. Do not retry a rejected intent without understanding why it was rejected. + +### Evaluation returns an error + +- The Vault DON secret identifier does not match `secret_name`. +- The TRM credential was not encoded as `:` before Base64 encoding. +- TRM or the CRE confidential HTTP request failed. +- The selected chain does not have an active CADV for the policy. +- The workflow could not write the permit onchain. + +If a TRM HTTP error should allow the action, review the policy's `fail_mode`. Use `OPEN` only after assessing the compliance impact. + +### Evaluation is ready but the transaction reverts + +- The transaction sender differs from `caller_address`. +- The target address or function differs from the evaluation. +- The eventual transaction produces different extractor values than `permit_parameters`. +- The protection's extractor outputs are missing or ordered differently. +- The permit has already been consumed. +- Another policy in the target function's policy chain rejected the call. + +## Related pages + +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — configure TRM screening and attach protections +- [Granting Evaluation Access](/ace/guides/policy-manager/offchain-policies/grant-evaluation-access) — let another organization request evaluations against your target +- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) — conceptual overview +- [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) — how permits are stored and consumed onchain +- [Evaluation API Reference](/api/ace/evaluation/docs) — complete request, response, and error schemas +- [CRE Service Quotas](https://docs.chain.link/cre/service-quotas) — current CRE workflow limits + +--- + +# Granting Evaluation Access +Source: https://docs.chain.link/ace/guides/policy-manager/offchain-policies/grant-evaluation-access +Last Updated: 2026-07-17 + +By default, only the organization that owns a target contract can request offchain permit evaluations for it through the [Evaluation API](/ace/guides/policy-manager/offchain-policies/request-offchain-permits). **Evaluation access grants** let you extend this capability to other organizations — for example, allowing a DEX or lending protocol to request permits against your token's compliance rules. + +When you grant evaluation access, the grantee organization can call the Evaluation API for the specified target and offchain policy. The evaluation runs against **your** managed CRE workflow and risk configuration — the grantee does not need its own offchain policy or TRM credential. + + + +## Roles and concepts + +| Term | Meaning | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Grantor** | The organization that **owns** the target contract and the offchain policy, and grants evaluation access. | +| **Grantee** | The organization that **receives** evaluation access. It can call the Evaluation API for the specified target and policy. | +| **Access grant** | The link between an offchain policy–target pair and a grantee organization. It is either `active` or `revoked`. | +| **Org ID** | The identifier of an organization. The grantee shares theirs with the grantor so the grantor can create the grant. Retrieve it with `GET /organizations/me` (Coordinator API). | + +## What the grantee can and cannot do + +An active evaluation access grant lets the grantee: + +- **Call the Evaluation API** (`POST /evaluate`) for the granted target and offchain policy. The evaluation uses the grantor's managed workflow and TRM configuration. +- **Poll evaluation status** (`GET /evaluate/{permitId}`) for evaluations the grantee started. +- **List granted targets** using `GET /targets?include_granted=true` to discover targets other organizations have shared with them. + +The grantee **cannot**: + +- Modify the offchain policy, its risk thresholds, or the protection configuration. +- Manage the target contract, its policy engine, or any other resource owned by the grantor. +- Re-share evaluation access with a third organization. + + + +## Prerequisites + +Before granting evaluation access: + +1. You have a [managed offchain policy](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) with `deployment_status: active`. +2. The offchain policy has an active [protection](/ace/guides/policy-manager/manage-protections) on the target function. +3. You know the grantee's **Org ID**. Ask them to retrieve it: + +```bash +# Run by the grantee +curl https://ace.api.chain.link/v1/organizations/me \ + -H "Authorization: Apikey " +``` + +## Grant evaluation access + +As the target and policy owner, create the grant by specifying the offchain policy ID, target ID, and the grantee's Org ID: + +```bash +curl -X POST https://ace.api.chain.link/v1/policies//targets//access-grants \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "grantee_org_id": "" + }' +``` + +The response is the created grant: + +```json +{ + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1800000000, + "revoked_at": null +} +``` + +## View who has access + +List the active and past grants for a specific offchain policy and target pair: + +```bash +curl https://ace.api.chain.link/v1/policies//targets//access-grants \ + -H "Authorization: Apikey " +``` + +Each entry includes the grantee, the status (`active` or `revoked`), and timestamps, giving you an audit trail of who was granted access and when. + +## Discover granted targets (grantee) + +As a grantee, include `include_granted=true` when listing targets to see targets other organizations have shared with you, alongside your own: + +```bash +curl "https://ace.api.chain.link/v1/targets?include_granted=true" \ + -H "Authorization: Apikey " +``` + +Once you can see a granted target, you can call the Evaluation API for it the same way you would for your own targets. See [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) for the full evaluation workflow. + +## Revoke access + +As the policy and target owner, revoke a grant by setting its status to `revoked`: + +```bash +curl -X PATCH \ + https://ace.api.chain.link/v1/policies//targets//access-grants/ \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "revoked" + }' +``` + +Revocation takes effect immediately. The grantee can no longer request evaluations for this target and policy. The grant record is retained with a `revoked_at` timestamp for audit purposes. To restore access later, create a new grant. + +## Related pages + +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) — call the Evaluation API and submit the protected transaction +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) — configure TRM screening and attach protections +- [External Registries](/ace/guides/identity-manager/external-registries) — a similar grant model for sharing identity and credential registries +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Identity Manager Guides +Source: https://docs.chain.link/ace/guides/identity-manager +Last Updated: 2026-04-06 + +These guides cover the day-to-day operations of an Identity Manager — from setting up registries to issuing and managing credentials across chains. + + + +## Available guides + +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — create, view, import, and archive identity and credential registry pairs +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — register cross-chain identities (CCIDs), map wallet addresses across chains, and manage identity lifecycle +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — define the categories of credentials your registry supports (e.g., KYC, accreditation, sanctions clearance) +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, renew, revoke, and set expiration on credentials using the attestation model +- [External Registries](/ace/guides/identity-manager/external-registries) — share a registry with another organization, and use registries shared with you as credential sources + +--- + +# Managing Registries +Source: https://docs.chain.link/ace/guides/identity-manager/manage-registries +Last Updated: 2026-04-06 + +## What are registries? + +A **registry** in ACE is the top-level organizational unit for the Identity Manager. Each registry bundles two types of sub-registries: + +- **Identity registries** — map wallet addresses to [Cross-Chain Identifiers (CCIDs)](/ace/concepts/cross-chain-identity#the-cross-chain-identifier-ccid). +- **Credential registries** — manage the lifecycle of credentials linked to CCIDs. + +Each sub-registry corresponds to a smart contract deployed on a specific blockchain. A single registry can span multiple chains by including sub-registries on each target network. For a deeper explanation of the registry model and how it fits into the identity lifecycle, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + +## Create a registry + +## View registries + +## Multi-chain setup + +Registries are designed to work across multiple chains. Each entry in `identity_registries` and `credential_registries` targets a specific `chain_selector`, and the platform deploys (or imports) a contract on each specified chain independently. + +A typical multi-chain configuration: + +- **Identity registries** on every chain where users interact — so the IdentityRegistry on each chain can resolve wallet addresses to CCIDs locally. +- **Credential registries** on every chain where policies need to verify credentials at runtime. + +Because CCIDs are chain-agnostic identifiers, a credential issued on one chain's CredentialRegistry is logically valid across all chains. The multi-chain deployment ensures that each chain has a local copy of the registry contracts for low-latency, on-chain lookups. For more on how this model works, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + + + +## Update a registry + +You can update a registry's name, description, and add new sub-registries. Updates are **additive** — you can add new identity or credential sub-registries to additional chains, but you cannot remove existing sub-registry pairs. + +## Share across organizations + +You can grant another organization read access to a registry you own, so it can use your identities and credentials as a credential source without re-issuing them. Grants are read-only for the recipient and can be revoked at any time. For the full workflow — granting, discovering registries shared with you, using them, and revoking — see [External Registries](/ace/guides/identity-manager/external-registries). + +## Archive a registry + +Archiving a registry deactivates it and prevents any further operations. Before archiving, all identities associated with the registry must be removed or archived first. + + + +## Related pages + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — conceptual background on CCIDs, registries, and credential sources +- [Managing Identities and Credentials](/ace/guides/identity-manager/manage-identities) — register identities and issue credentials within a registry +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — define and manage the credential types used in credential registries +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema and parameters + +--- + +# Managing Identities +Source: https://docs.chain.link/ace/guides/identity-manager/manage-identities +Last Updated: 2026-04-06 + +This guide covers how to register, view, update, and archive cross-chain identities (CCIDs) using the ACE Platform UI or the Coordinator API. Identities are the foundation of ACE's credential system — every credential is issued against an identity. + + + +## What are identities (CCIDs)? + +A **cross-chain identity (CCID)** aggregates multiple wallet addresses across EVM chains into a single logical entity. Rather than treating each address on each chain as a separate user, ACE maps them all to one CCID. Credentials issued against that CCID are then valid for every linked address on every chain — no re-issuance or bridging required. + +Each identity includes: + +- **Title** — A human-readable label for internal use only (e.g., "Jane Doe"). This value is never written on-chain. +- **Entity ID** — A unique external identifier that ties the identity back to your system of record (e.g., a KYC provider user ID). This value must be unique within a registry. +- **Registry** — The registry the identity belongs to. +- **On-chain identities** — One or more wallet address + chain selector pairs that map to this CCID on-chain. + +For a deeper look at how CCIDs work, how they are generated, and the privacy considerations involved, see [Cross-Chain Identity](/ace/concepts/cross-chain-identity). + +## Register an identity + +## Bulk import identities + +When onboarding many users at once, use the batch endpoint to create multiple identities in a single atomic request. Each identity in the batch follows the same schema as the single-create endpoint, including the optional `credentials` array — so you can register identities and issue credentials in one call. + +This feature is **API-only**. In the Platform UI, the **Bulk import via API** option under **+ Add identity** links to this documentation. + +Send a `POST` request to `/identities/batch`: + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities/batch" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "identities": [ + { + "title": "Identity A", + "entity_id": "user-001", + "registry_id": "", + "onchain_identities": [ + { + "address": "0x1111111111111111111111111111111111111111", + "chain_selector": "16015286601757825753" + } + ], + "credentials": [ + { + "credential_type_id": "", + "expires_at": 1800000000 + } + ] + }, + { + "title": "Identity B", + "entity_id": "user-002", + "registry_id": "", + "onchain_identities": [ + { + "address": "0x2222222222222222222222222222222222222222", + "chain_selector": "16015286601757825753" + }, + { + "address": "0x3333333333333333333333333333333333333333", + "chain_selector": "3478487238524512106" + } + ] + } + ] + }' +``` + +The `credentials` array is optional on each identity. The second identity in this example is created without credentials. + + + +## View and search identities + +## Update an identity + +You can update an identity's title, description, and on-chain address mappings. ACE offers two update approaches: full replacement and partial update. + +## Cross-chain identity mapping + +A single CCID can span as many chains and addresses as needed. This is the core value proposition of ACE's identity model: one credential verification applies everywhere. + +For example, an entity operating wallets on Ethereum Sepolia, Arbitrum Sepolia, and Base Sepolia would have a single identity with three on-chain mappings: + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Multi-Chain Operator", + "entity_id": "operator-xyz-007", + "registry_id": "a1b2c3d4-5678-9abc-def0-1234567890ab", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + { + "chain_selector": "3478487238524512106", + "address": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + { + "chain_selector": "10344971235874465080", + "address": "0xcccccccccccccccccccccccccccccccccccccccc" + } + ] + }' +``` + +| Chain | Chain Selector | Address | +| :--------------- | :--------------------- | :-------------- | +| Ethereum Sepolia | `16015286601757825753` | `0xaaaa...aaaa` | +| Arbitrum Sepolia | `3478487238524512106` | `0xbbbb...bbbb` | +| Base Sepolia | `10344971235874465080` | `0xcccc...cccc` | + +All three addresses resolve to the same CCID. A credential issued against this identity — such as a KYC attestation — is valid for all three addresses across all three chains. When any of these addresses interacts with a policy-protected contract, the policy resolves the address to the shared CCID and checks credentials from there. + +To add or remove chains later, use the [full update (PUT)](#full-update-put) endpoint with the updated list of on-chain identities. + +## Archive an identity + +Archiving marks an identity as inactive. Archived identities are retained for audit purposes but are no longer considered active. + + + +--- + +# Managing Credential Types +Source: https://docs.chain.link/ace/guides/identity-manager/manage-credential-types +Last Updated: 2026-07-17 + +Credential types define the categories of attestations you can issue to [cross-chain identities (CCIDs)](/ace/concepts/cross-chain-identity). Each credential type represents a distinct kind of verification — for example, KYC completion, accredited investor status, or sanctions clearance. When you create a credential type, the `credential_type` string you provide is hashed to produce a `credential_type_hash` that policy contracts reference on-chain. + +Credential types are scoped to a specific credential registry. Before creating credential types, make sure your [registries are set up](/ace/guides/identity-manager/manage-registries). + +A credential type can optionally be linked to a **data schema**, which lets the credentials you issue against it carry structured data (for example, a jurisdiction code). See [Typed credentials with data schemas](#typed-credentials-with-data-schemas) below. + +## What is a credential type? + +A credential type is a string you define to represent a specific compliance check or verification. This string is hashed and registered on-chain, so it cannot be changed after creation. You can create any credential types that match your requirements — for example: + +| Credential type string | Use case | +| ---------------------- | -------------------------------------- | +| `PROOF_OF_IDENTITY` | Identity verification | +| `PROOF_OF_FUNDS` | Source of funds or reserves check | +| `AML_CHECK` | Anti-money-laundering screening result | + +The `credential_type` string is case-sensitive and must be unique within a registry. + +## Define a credential type + +Register a credential type with a `POST` request: + +```bash +curl -X POST "https://ace.api.chain.link/v1/credential-types" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "registry_id": "", + "title": "KYC Verification", + "credential_type": "KYC", + "description": "Basic Know Your Customer identity verification" + }' +``` + +The response includes the generated `credential_type_id` and the `credential_type_hash` derived from your `credential_type` string. + +## Understand credential type hashes + +When you create a credential type, ACE hashes the `credential_type` string to produce a deterministic `credential_type_hash`. This hash is what gets written on-chain and what policy contracts use when evaluating identity-based rules. + +```text +credential_type string → credential_type_hash → on-chain reference +"KYC" → 0x7a8b...3f21 → used by policy contracts +``` + +Because the hash is derived from the string, choosing your `credential_type` strings carefully matters — they cannot be changed after creation. Policy contracts such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy) reference credentials by their `credential_type_hash` when checking whether an identity holds a required attestation. + + + +## Typed credentials with data schemas + +By default, credentials are **attestation-only**: they record that an identity holds a credential of a given type, with no additional data. You can instead create a **typed** credential type by linking it to a **data schema**. Credentials issued against a typed credential type carry structured data (validated against the schema), which policies can then evaluate through a [Data Validator](/ace/guides/policy-manager/manage-data-validators). + +A **data schema** is a reusable definition of the shape and format of a credential's data. ACE provides shared, ready-to-use schemas — the first is an [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code schema for jurisdiction use cases (an array of two-letter country codes such as `US`, `CA`, `GB`). + +To make a credential type typed, pass a `data_schema_id` when you create it. The ISO 3166-1 alpha-2 country code data schema ID is: + +```text +fb786cd7-6397-4ac6-790c-35746f343cad +``` + +```bash +curl -X POST "https://ace.api.chain.link/v1/credential-types" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "registry_id": "", + "title": "Jurisdiction", + "credential_type": "common.country", + "description": "Holder jurisdiction as ISO 3166-1 alpha-2 country codes", + "data_schema_id": "fb786cd7-6397-4ac6-790c-35746f343cad" + }' +``` + +Once a credential type is linked to a data schema, every credential you issue against it **must** include `credential_data` matching that schema — see [Issue a credential with data](/ace/guides/identity-manager/manage-credentials#issue-a-credential-with-data). + + + +## View credential types + +List credential types with a `GET` request. Use the `registry_id` query parameter to filter by registry: + +```bash +curl "https://ace.api.chain.link/v1/credential-types?registry_id=&page=1&page_size=25" \ + -H "Authorization: Apikey " +``` + +To retrieve a single credential type by ID: + +```bash +curl "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " +``` + +## Update a credential type + +You can update a credential type's **title** and **description**. The `credential_type` string and `credential_type_hash` cannot be changed. + +Update a credential type with a `PUT` request: + +```bash +curl -X PUT "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "KYC Verification (Enhanced)", + "description": "Enhanced KYC verification including document and liveness checks" + }' +``` + +You can also make partial updates with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "description": "Updated description for KYC verification" + }' +``` + +## Archive a credential type + +Archiving a credential type prevents new credentials of that type from being issued. Existing credentials remain valid until they are individually archived or expire. + + + +Archive a credential type with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credential-types/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "status": "archived" + }' +``` + +If active credentials still reference the type, the request returns an error. Archive all associated credentials first, then retry. + +## Related resources + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — conceptual overview of CCIDs, registries, and credential types +- [Managing Credentials](/ace/guides/identity-manager/manage-credentials) — issue, revoke, and manage credentials linked to CCIDs +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — view and manage identity and credential registry deployments +- [Credential Registry Identity Validator Policy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy contract that checks credentials on-chain + +--- + +# Managing Credentials +Source: https://docs.chain.link/ace/guides/identity-manager/manage-credentials +Last Updated: 2026-07-17 + +Credentials are attestations that a [cross-chain identity (CCID)](/ace/concepts/cross-chain-identity) holds a specific qualification — for example, KYC verification, accredited investor status, or sanctions clearance. Each credential links a **credential type** to an **identity** and is recorded on-chain across every chain where the credential registry is deployed. + +This guide covers the full credential lifecycle: issuing, viewing, updating, expiring, and revoking credentials through the Coordinator API. + +## Attestation vs. typed credentials + +ACE supports two kinds of credentials: + +- **Attestation-only** (the default) — The credential records only that an identity holds a credential of a given type, with no additional data. When you issue one, the on-chain record contains just the **credential type hash**, the **identity** (CCID) it is issued to, and an **issuance timestamp**. Policies verify existence — for example, "does this address have a valid KYC credential?" — without accessing any personally identifiable information (PII). +- **Typed** — When the credential type is linked to a [data schema](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas), the credential also carries structured `credential_data` (for example, a jurisdiction code). Policies can then evaluate the contents through a [Data Validator](/ace/guides/policy-manager/manage-data-validators), not just the credential's existence. + +In both cases, no PII should be stored on-chain — credential data must be a minimal, non-sensitive value (such as an ISO country code) or a hash. For a deeper discussion of credential data and privacy, see [Credential Data and Privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). + +## Issue a credential + +To issue a credential, you need a registered [identity](/ace/guides/identity-manager/manage-identities) and at least one [credential type](/ace/guides/identity-manager/manage-credential-types) defined in your registry. + + + +Issue a credential with a `POST` request: + +```bash +curl -X POST "https://ace.api.chain.link/v1/credentials" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "credential_type_id": "", + "identity_id": "", + "external_unique_id": "kyc-2026-04-acme", + "expires_at": 1806883200 + }' +``` + +| Field | Required | Description | +| -------------------- | -------- | ------------------------------------------------------------ | +| `credential_type_id` | Yes | UUID of the credential type to issue | +| `identity_id` | Yes | UUID of the target identity (CCID) | +| `external_unique_id` | No | Your own reference identifier for this credential | +| `expires_at` | No | Unix timestamp (integer); omit for a non-expiring credential | + +## Issue a credential with data + +When the credential type is linked to a [data schema](/ace/guides/identity-manager/manage-credential-types#typed-credentials-with-data-schemas), include a `credential_data` field. The value must match the schema — for the [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) country code schema, that is a JSON array of two-letter country codes. ACE validates the data against the schema and encodes it on-chain. + +```bash +curl -X POST "https://ace.api.chain.link/v1/credentials" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "credential_type_id": "", + "identity_id": "", + "credential_data": ["US"], + "external_unique_id": "jurisdiction-2026-04-acme", + "expires_at": 1806883200 + }' +``` + + + +Once issued, the credential data can be enforced at transaction time by attaching a [Data Validator](/ace/guides/policy-manager/manage-data-validators) to the credential source of an identity-validation policy. + +## Issue credentials during identity creation + +You can issue credentials inline when registering a new identity by including a `credentials` array in the `POST /identities` request body. This is useful when you have completed verification before registration and want to create the identity and its credentials in a single call. + +```bash +curl -X POST "https://ace.api.chain.link/v1/identities" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "title": "Acme Corp Treasury", + "entity_id": "acme-corp-001", + "registry_id": "", + "onchain_identities": [ + { + "chain_selector": "16015286601757825753", + "address": "0x1234567890abcdef1234567890abcdef12345678" + } + ], + "credentials": [ + { + "credential_type_id": "", + "external_unique_id": "kyc-2026-04-acme", + "expires_at": 1806883200 + }, + { + "credential_type_id": "" + } + ] + }' +``` + +Each entry in the `credentials` array follows the same schema as the standalone `POST /credentials` endpoint, except that `identity_id` is inferred from the identity being created. See [Managing Identities](/ace/guides/identity-manager/manage-identities) for the full identity creation reference. + +## View and filter credentials + +List credentials with a `GET` request. All query parameters are optional: + +```bash +curl "https://ace.api.chain.link/v1/credentials?credential_type_id=&page=1&page_size=25" \ + -H "Authorization: Apikey " +``` + +| Parameter | Description | +| -------------------- | --------------------------------------------------- | +| `credential_type_id` | Filter by credential type | +| `identity_id` | Filter by identity | +| `entity_id` | Filter by entity | +| `registry_id` | Filter by registry | +| `include_onchains` | Include on-chain deployment details in the response | +| `page` | Page number (default: 1) | +| `page_size` | Results per page | + +To retrieve a single credential by its ID: + +```bash +curl "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " +``` + +## Credential expiration + +The `expires_at` field controls whether a credential has a limited validity period. + +- **No expiration** — Omit `expires_at` when issuing. The credential remains valid indefinitely until explicitly archived. +- **With expiration** — Provide a Unix timestamp (integer). Once the timestamp passes, policy checks that require this credential type will treat the credential as invalid. + +To **renew** an expiring credential, update it with a new `expires_at` value (see the next section). Alternatively, you can archive the expired credential and issue a new one. + + + +## Update a credential + +You can update a credential's `external_unique_id` and `expires_at` fields. You **cannot** change the credential type or the associated identity — to change either, archive the credential and issue a new one. + +Update a credential with a `PUT` request: + +```bash +curl -X PUT "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "external_unique_id": "kyc-2026-04-acme-renewed", + "expires_at": 1838419200 + }' +``` + +| Field | Required | Description | +| -------------------- | -------- | ------------------------------------------------- | +| `external_unique_id` | Yes | Updated reference identifier | +| `expires_at` | No | New expiration timestamp; omit to leave unchanged | + +You can also perform a partial update with `PATCH`. The `PATCH` endpoint accepts `external_unique_id` and `expires_at` independently, but you **cannot** combine field updates with a status change in the same request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "expires_at": 1838419200 + }' +``` + +## Revoke (archive) a credential + +Archiving a credential removes it from the on-chain credential registry. After archival, policy contracts will no longer see this credential — any policy that requires it (such as the [Credential Registry Identity Validator](/ace/reference/policy-library/credential-registry-identity-validator-policy)) will reject transactions from the associated addresses. + +Common reasons to revoke a credential: + +- KYC verification expired or failed re-verification +- Sanctions status changed +- Accreditation lapsed +- Entity relationship terminated + +Archive a credential with a `PATCH` request: + +```bash +curl -X PATCH "https://ace.api.chain.link/v1/credentials/" \ + -H "Authorization: Apikey " \ + -H "Content-Type: application/json" \ + -d '{ + "status": "archived" + }' +``` + + + +## Related resources + +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — CCID model, credential registries, and the attestation lifecycle +- [Managing Identities](/ace/guides/identity-manager/manage-identities) — register and manage CCIDs and their on-chain address mappings +- [Managing Credential Types](/ace/guides/identity-manager/manage-credential-types) — create and organize the credential categories your registry supports +- [Credential Registry Identity Validator Policy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — the policy that checks credentials at transaction time +- [Managing Data Validators](/ace/guides/policy-manager/manage-data-validators) — enforce rules on credential data at transaction time +- [Beta Scope](/ace/beta-scope) — current scope and limitations + +--- + +# External Registries +Source: https://docs.chain.link/ace/guides/identity-manager/external-registries +Last Updated: 2026-07-17 + +**External registries** let one organization reuse another organization's [registry](/ace/guides/identity-manager/manage-registries) without re-issuing identities or credentials. The registry owner grants a second organization **read access**, and that organization can then reference the registry's identities and credentials — for example, to enforce KYC in its own policies using a KYC provider's registry. + +Access is granted per registry, is **read-only** for the recipient, and can be revoked at any time. + +## Roles and concepts + +| Term | Meaning | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Grantor** | The organization that **owns** the registry and grants access to it. | +| **Grantee** | The organization that **receives** read access to the registry. | +| **Access grant** | The link between a registry and a grantee organization. It is either `active` or `revoked`. | +| **Org ID** | The identifier of an organization. The grantee shares theirs with the grantor so the grantor can grant access. Retrieve it with `GET /organizations/me` (Coordinator API). | +| **`access_type`** | A field on a registry indicating whether the caller `owned` it or was `granted` access to it. | + +## What the grantee can and cannot do + +An active grant gives the grantee **read access** to the registry: + +- **Can** list and view the registry, and read its [credential types](/ace/guides/identity-manager/manage-credential-types), [identities](/ace/guides/identity-manager/manage-identities), and [credentials](/ace/guides/identity-manager/manage-credentials). +- **Can** reference the registry's on-chain contracts as a credential source in its own [identity-validation policies](/ace/reference/policy-library/credential-registry-identity-validator-policy). +- **Cannot** write to the registry — registering identities, issuing credentials, or changing configuration remains exclusive to the grantor. + + + +## Grant access to another organization + +Granting access requires the grantee's **Org ID**. Ask the grantee to retrieve it and share it with you: + +```bash +# Run by the grantee — returns their organization, including its id +curl https://ace.api.chain.link/v1/organizations/me \ + -H "Authorization: Apikey " +``` + +As the registry owner, create the grant: + +```bash +curl -X POST https://ace.api.chain.link/v1/registries//access-grants \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "grantee_org_id": "org-456" + }' +``` + +The response is the created grant: + +```json +{ + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "grantee_org_id": "org-456", + "grantor_org_id": "org-123", + "status": "active", + "granted_at": 1800000000, + "revoked_at": null +} +``` + +## View who has access + +List the active and past grants for a registry you own: + +```bash +curl https://ace.api.chain.link/v1/registries//access-grants \ + -H "Authorization: Apikey " +``` + +Each entry includes the grantee, the status (`active` or `revoked`), and the `granted_at` / `revoked_at` timestamps, giving you an audit trail of who was granted access and when. + +## Use a registry shared with you + +As a grantee, include `include_granted=true` when listing registries to see registries other organizations have shared with you, alongside your own: + +```bash +curl "https://ace.api.chain.link/v1/registries?include_granted=true" \ + -H "Authorization: Apikey " +``` + +Each registry in the response carries an **`access_type`** field: + +- `"owned"` — your organization owns the registry. +- `"granted"` — another organization (shown in `org_id`) granted you access. + +Once you can see a granted registry, you use it the same way you would reference any credential source: + +1. Read the registry to get the on-chain **identity registry** and **credential registry** contract addresses per chain, and read its **credential types** to get the `credential_type_hash` values you need. +2. Add those addresses and credential type hashes as a **credential source** on your [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) or [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) instance. + +Your policy then validates credentials issued by the other organization at transaction time. Because the grant is read-only, you rely on the grantor to keep the credentials current; if they revoke a credential, your policy sees the change immediately. + + + +## Revoke access + +As the registry owner, revoke a grant by setting its status to `revoked`. Identify the grant by the grantee's Org ID: + +```bash +curl -X PATCH https://ace.api.chain.link/v1/registries//access-grants/org-456 \ + -H "Content-Type: application/json" \ + -H "Authorization: Apikey " \ + -d '{ + "status": "revoked" + }' +``` + +Revocation takes effect immediately. The grant record is retained with a `revoked_at` timestamp for audit purposes rather than deleted, so the history of grants and revocations is preserved. To restore access later, create a new grant. + +## What happens when access is revoked + +Revoking a registry access grant is a **platform-level action only** — it removes the registry from the grantee's view in the ACE Platform (UI and API). The grantee can no longer browse the registry, read its credentials, or reference it in new policy configurations. + +**Onchain, nothing changes automatically.** If the grantee's policies already reference the revoked registry's onchain contracts as a credential source, those policies continue to validate credentials from that registry at transaction time. The onchain policy contracts have no awareness of platform-level access grants — they only know the registry contract addresses that were configured as credential sources. + +### What each party should do + +**Grantor** — After revoking access, be aware that the grantee's existing policies may still reference your registry onchain. + +**Grantee** — After a grant is revoked, the ACE Platform displays a warning on any policy instance that references a source from the revoked registry. You should remove the revoked registry source from your policy configuration to ensure your compliance setup reflects the current state of your access agreements. Until you remove it: + +- The policy continues to validate credentials from the revoked registry onchain. +- You cannot edit the revoked source — you can only remove it. +- You cannot reference the revoked registry in new policy configurations. + + + +## Related pages + +- [Managing Registries](/ace/guides/identity-manager/manage-registries) — create and manage the registries you own +- [Cross-Chain Identity](/ace/concepts/cross-chain-identity) — CCIDs, registries, and credential sources +- [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) — reference a registry as a credential source +- [Managing Policies](/ace/guides/policy-manager/manage-policies) — configure policy instances and their credential sources +- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema + +--- + +# Policy Management Contracts +Source: https://docs.chain.link/ace/reference/policy-management-contracts +Last Updated: 2026-04-15 + + + +The Policy Management contracts handle on-chain policy enforcement for ACE-compatible contracts. The source code and full documentation are available in the policy-management package of the chainlink-ace repository (Business Source License 1.1). + +## Core interfaces + +| Interface | Description | +| :--------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [IPolicyEngine](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicyEngine.sol) | Central orchestrator that manages policies, extractors, and mappers for protected contracts. Receives calls from `PolicyProtected` targets, runs the policy chain, and returns allow/reject decisions. | +| [IPolicyProtected](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicyProtected.sol) | Base interface for any contract that wants policy enforcement. Provides the `runPolicy` modifier, the connection to a `PolicyEngine`, and context handling for passing off-chain data to policies. | +| [IPolicy](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IPolicy.sol) | Standard interface for all policy contracts. Each policy implements `run` (read-only evaluation that returns allow/continue/reject) and optionally `postRun` (state changes after execution, such as updating volume counters). | +| [IExtractor](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IExtractor.sol) | Parses transaction calldata into named parameters (e.g., `to` and `value` from an ERC-20 `transfer`) so policies can evaluate them. One extractor is registered per function signature. | +| [IMapper](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/interfaces/IMapper.sol) | Optional interface for transforming or combining extracted parameters before they reach a policy. Only needed for advanced scenarios where a policy expects a different parameter shape than the extractor provides. | + +## Pre-built policies + +ACE provides a library of audited, ready-to-use policy implementations covering common compliance scenarios — allowlists, volume limits, role-based access, pause controls, and more. See the policies source code for implementation details, or the [Policy Library](/ace/reference/policy-library) page for configuration and usage. + +## Reference token implementations + +The repository includes reference token contracts that demonstrate full ACE integration: + +- [ERC-20 Compliance Token](https://github.com/smartcontractkit/chainlink-ace/tree/main/packages/tokens/erc-20) + — A policy-protected ERC-20 with frozen token handling. +- [ERC-3643 Compliance Token](https://github.com/smartcontractkit/chainlink-ace/tree/main/packages/tokens/erc-3643) + — A compliant implementation of the ERC-3643 T-REX standard. + +## Repository documentation + +The policy-management docs folder contains detailed guides: + +- [Concepts](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CONCEPTS.md) + — Architecture, policy flow, extractors, mappers, and context handling +- [API Guide](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/API_GUIDE.md) + — Task-oriented guide with code examples for common operations +- [API Reference](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/API_REFERENCE.md) + — Complete interface specifications with function signatures and events +- [Custom Policies Tutorial](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/CUSTOM_POLICIES_TUTORIAL.md) + — End-to-end walkthrough for building a custom policy contract +- [Policy Ordering Guide](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/POLICY_ORDERING_GUIDE.md) + — How evaluation order affects transaction outcomes +- [Security Considerations](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/docs/SECURITY.md) + — Trust model, gas considerations, and context handling + +## Related pages + +- [Architecture](/ace/concepts/architecture) — How PolicyEngine contracts fit into the ACE system +- [Policy Management](/ace/concepts/policy-management) — Conceptual overview of policy chains and evaluation +- [Making Your Contract ACE-Compatible](/ace/guides/policy-manager/contracts/ace-compatible) — What your contract needs to work with ACE +- [Policy Library](/ace/reference/policy-library) — Pre-built policy implementations with configuration details + +--- + +# Policy Library +Source: https://docs.chain.link/ace/reference/policy-library +Last Updated: 2026-07-17 + +ACE ships with a library of pre-built, audited policies that cover the most common compliance and access control patterns. Each policy is a standalone smart contract that plugs into a PolicyEngine and evaluates transactions at runtime. + +For guidance on combining policies and understanding execution order, see [Policy Ordering & Composition](/ace/concepts/policy-ordering). + +## Policy summary + +| Policy | Description | +| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | +| [AllowPolicy](/ace/reference/policy-library/allow-policy) | Maintains an allowlist. Rejects the transaction if any checked address is **not** on the list. | +| [BypassPolicy](/ace/reference/policy-library/bypass-policy) | Maintains an allowlist. If **all** checked addresses are on the list, immediately allows the transaction and **skips all remaining policies**. | +| [RejectPolicy](/ace/reference/policy-library/reject-policy) | Maintains a denylist. Rejects the transaction if any checked address **is** on the list. | +| [OnlyAuthorizedSenderPolicy](/ace/reference/policy-library/only-authorized-sender-policy) | Rejects the transaction if the sender (`msg.sender`) is not on the authorized list. | +| [RoleBasedAccessControlPolicy](/ace/reference/policy-library/role-based-access-control-policy) | Maps roles to function selectors. Rejects if the sender does not hold a role allowed for the called function. | +| [MaxPolicy](/ace/reference/policy-library/max-policy) | Rejects the transaction if the extracted value exceeds a configured maximum. | +| [VolumePolicy](/ace/reference/policy-library/volume-policy) | Rejects the transaction if the extracted value is below a minimum or above a maximum. | +| [VolumeRatePolicy](/ace/reference/policy-library/volume-rate-policy) | Tracks cumulative volume per account per time period. Rejects if the period's cap would be exceeded. | +| [SecureMintPolicy](/ace/reference/policy-library/secure-mint-policy) | Checks a Chainlink Proof of Reserve feed. Rejects if minting would push total supply beyond verified reserves. | +| [IntervalPolicy](/ace/reference/policy-library/interval-policy) | Divides time into repeating slot-based cycles. Rejects if the current slot is outside the allowed window. | +| [PausePolicy](/ace/reference/policy-library/pause-policy) | Global toggle. Rejects every transaction when paused; passes through when unpaused. | +| [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) | Checks each address against configured credential requirements. Rejects if any address lacks required credentials. | +| [GroupedIdentityValidatorPolicy](/ace/reference/policy-library/grouped-identity-validator-policy) | Routes each address to a credential group, then validates it against that group's requirements. Rejects if no group matches or requirements fail. | +| [CertifiedActionDONValidatorPolicy](/ace/reference/policy-library/certified-action-don-validator-policy) | Validates DON-issued permits delivered on-chain via the Keystone Forwarder. Rejects if no valid permit exists. | + +--- + +# AllowPolicy +Source: https://docs.chain.link/ace/reference/policy-library/allow-policy +Last Updated: 2026-03-31 + +The AllowPolicy restricts transactions to a known set of approved addresses. It checks every address extracted from the transaction against an allowlist and immediately rejects if any of them is not on the list, halting all subsequent policy checks. + +## Configuration + +### Address allowlist + +The allowlist defines which addresses are permitted to participate in transactions protected by this policy. The list starts empty at deployment and must be populated afterward — until you add at least one address, every transaction will be rejected. + +Each address is added or removed individually. When a protected function is called, the extractor provides one or more addresses from the transaction (for example, both the sender and receiver of a token transfer). Which addresses the policy receives depends on the [mapper configuration](/ace/concepts/policy-management#worked-example-erc-20-transfer). All of those addresses must be on the allowlist for the transaction to pass. + +## Runtime behavior + +The policy expects a variable number of parameters from the extractor, each an address. All provided addresses are checked against the allowlist. + +- **`run()`** — Reverts if *any* address is not on the allowlist. Returns `Continue` otherwise. +- **`postRun()`** — No state changes. + +## API reference + +### Setter functions + +- **`allowAddress(address account)`** — Adds an address to the allowlist. Reverts if the address is already listed. +- **`disallowAddress(address account)`** — Removes an address from the allowlist. Reverts if the address is not listed. + +### View functions + +- **`addressAllowed(address account)`** — Returns `true` if the address is on the allowlist. + +## Use cases + +- **Regulated access** — Restrict token transfers to a known set of approved addresses. +- **Gradual rollout** — Start with a small allowlist and expand as new addresses are vetted. + +## Source + +[AllowPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/AllowPolicy.sol) + +--- + +# BypassPolicy +Source: https://docs.chain.link/ace/reference/policy-library/bypass-policy +Last Updated: 2026-03-31 + +The BypassPolicy gives privileged addresses a fast path through the policy chain. If *all* addresses extracted from the transaction are on the bypass list, the policy immediately allows the transaction and skips every remaining policy in the chain. If any address is not on the list, the policy returns `Continue` and lets subsequent policies decide. + +This is the only built-in policy that returns `Allowed`. + + + +## Configuration + +### Address allowlist + +The bypass list defines which addresses can skip the rest of the policy chain. The list starts empty at deployment and must be populated afterward. + +Each address is added or removed individually. When a protected function is called, the extractor provides one or more addresses from the transaction. Which addresses the policy receives depends on the [mapper configuration](/ace/concepts/policy-management#worked-example-erc-20-transfer). All of those addresses must be on the bypass list for the fast path to activate — if even one address is missing, the policy returns `Continue` and normal policy evaluation continues. + +## Runtime behavior + +The policy expects a variable number of parameters from the extractor, each an address. + +- **`run()`** — Returns `Allowed` if all provided addresses are on the bypass list, skipping all subsequent policies. Returns `Continue` otherwise. +- **`postRun()`** — No state changes. + +## API reference + +### Setter functions + +- **`allowAddress(address account)`** — Adds an address to the bypass list. Reverts if the address is already listed. +- **`disallowAddress(address account)`** — Removes an address from the bypass list. Reverts if the address is not listed. + +### View functions + +- **`addressAllowed(address account)`** — Returns `true` if the address is on the bypass list. + +## Use cases + +- **Privileged access** — Let administrators or system contracts bypass compliance checks entirely. +- **Layered permissions** — Place at the top of a policy chain so that listed addresses skip volume limits, identity checks, and other restrictions. + +## Source + +[BypassPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/BypassPolicy.sol) + +--- + +# CertifiedActionDONValidatorPolicy +Source: https://docs.chain.link/ace/reference/policy-library/certified-action-don-validator-policy +Last Updated: 2026-07-17 + +The CertifiedActionDONValidatorPolicy (CADV) is the onchain contract that validates permits generated by [offchain policy execution](/ace/concepts/off-chain-policies). When a Chainlink DON workflow approves an action, it delivers a permit through the Keystone Forwarder. The CADV stores the permit and verifies it when the protected function is called. + +For a full explanation of how off-chain policies work, what you can connect to, and how the permit flow operates, see [Off-Chain Policy Execution](/ace/concepts/off-chain-policies). + + + +## Permit lifecycle + +Managed offchain permits are **pre-presented**: the DON writes the permit to the CADV before the user submits the protected transaction. The user does not include permit bytes in the transaction. + +The CADV indexes a permit by its transaction intent, which includes: + +- Caller address +- Protected target address +- Function selector +- Ordered parameters produced by the target function's extractor + +At execution time, the policy engine passes the actual caller, target, selector, and extracted parameters to the CADV. The call is allowed only when they match a stored, valid permit. After the protected call succeeds, the policy engine invokes `postRun`, which increments the permit's usage count and emits `PermitUsed`. + +The managed `wallet_risk_scoring` policy currently creates permits with: + +- `maxUses = 1` — the permit can authorize one successful transaction. +- `expiry = 0` — the permit does not expire. + +These values are fixed in the current Beta release. + +The CADV also emits `PermitStored` when the workflow publishes a permit. ACE waits for this event before changing the corresponding evaluation status to `ready`. + +## Combining with other policies + +The CADV is attached to a target function like any other policy. It can run before or after onchain policies such as identity, allowlist, or volume checks. All policies in the function's policy chain must allow the call. + +See [Policy Ordering & Composition](/ace/concepts/policy-ordering) for guidance on evaluation order. + +## Related pages + +- [Managing Offchain Policies (MVP)](/ace/guides/policy-manager/offchain-policies/manage-offchain-policies) +- [Requesting Offchain Permits](/ace/guides/policy-manager/offchain-policies/request-offchain-permits) +- [Off-Chain Policy Execution](/ace/concepts/off-chain-policies) + +## Source + +- [CertifiedActionDONValidatorPolicy.sol](https://github.com/smartcontractkit/chainlink-ace/blob/main/packages/policy-management/src/policies/CertifiedActionDONValidatorPolicy.sol) + +--- + +# CredentialRegistryIdentityValidatorPolicy +Source: https://docs.chain.link/ace/reference/policy-library/credential-registry-identity-validator-policy +Last Updated: 2026-07-17 + +The CredentialRegistryIdentityValidatorPolicy validates that accounts involved in a transaction hold the required credentials from ACE's [Cross-Chain Identity](/ace/concepts/cross-chain-identity) infrastructure. It checks each account against configured credential sources (IdentityRegistry + CredentialRegistry pairs) and credential requirements (which credential types must be present and how many validations are needed). + +This is the primary policy for enforcing identity-based compliance such as KYC, accreditation, or sanctions screening. + + + +## Configuration + +Both properties below can be set when the policy is first deployed and updated afterward by the policy owner. Credential sources contain on-chain addresses and must be configured per network. Credential requirements define rules that apply across chains. + +### Credential sources + +A credential source defines *where* to look up identity and credential data for a given credential type. Each source is a tuple of: + +- **Credential type ID** — A `bytes32` identifier for the credential type this source applies to (e.g., KYC, accreditation). +- **Identity registry address** — The IdentityRegistry contract that maps wallet addresses to Cross-Chain Identifiers (CCIDs). +- **Credential registry address** — The CredentialRegistry contract that stores credentials linked to CCIDs. +- **Data validator address** (optional) — A contract that performs additional validation on the credential data. Set to `address(0)` for attestation-only checks, or a [Data Validator](/ace/guides/policy-manager/manage-data-validators) address to validate credential contents (for example, a jurisdiction allow/deny list). See [Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy) for a full explanation of attestation-only vs. Credential Data Validator checks. + +Multiple sources can be registered for the same credential type. The policy checks all configured sources and counts validations across them. Source uniqueness is determined by the `(identityRegistry, credentialRegistry)` pair — two sources with the same registry pair but different `dataValidator` addresses are considered duplicates. + +**Limits:** Up to 8 sources per credential type. + +### Credential requirements + +A credential requirement defines *what* credentials an account must hold. Each requirement specifies: + +- **Requirement ID** — A unique `bytes32` identifier for this requirement. +- **Credential type IDs** — An array of `bytes32` credential types to check (e.g., KYC, accreditation). +- **Minimum validations** — How many of the listed credential types must validate successfully. Must be at least 1. +- **Invert flag** — When `true`, the check passes if the credential does *not* exist. This is useful for "must not be sanctioned" checks, where you want the transaction to succeed only if the account does not hold a sanctions credential. + +An account passes a requirement if it accumulates at least `minValidations` successful validations across the listed credential types and configured sources. + +**Limits:** Up to 8 requirements total, up to 32 credential types per requirement. + +## Runtime behavior + +The policy expects a variable number of parameters from the extractor, each an address to validate. Every address is checked against all configured requirements. + +For each address, the validation process: + +1. Iterates through all credential requirements. +2. For each requirement, checks the listed credential types against each configured source. +3. For each source, looks up the account's CCID in the IdentityRegistry, then checks whether the CredentialRegistry holds the credential for that CCID. +4. If a DataValidator is configured, it additionally validates the credential data. +5. Counts successful validations. If the count meets `minValidations`, the requirement passes. + +- **`run()`** — Reverts if any address fails any requirement. Returns `Continue` if all addresses pass all requirements. +- **`postRun()`** — No state changes. + +## API reference + +### Setter functions + +**Credential sources:** + +- **`addCredentialSource(CredentialSourceInput input)`** — Adds a source for a credential type. Reverts if the source already exists or if the maximum number of sources (8) for that credential type has been reached. +- **`removeCredentialSource(bytes32 credentialTypeId, address identityRegistry, address credentialRegistry)`** — Removes a source. Reverts if the source is not found. + +**Credential requirements:** + +- **`addCredentialRequirement(CredentialRequirementInput input)`** — Adds a requirement. Reverts if a requirement with the same ID already exists or if the configuration is invalid. +- **`removeCredentialRequirement(bytes32 requirementId)`** — Removes a requirement. Reverts if the requirement ID is not found. ### View functions @@ -1612,7 +5263,7 @@ For each address, the validation process: # GroupedIdentityValidatorPolicy Source: https://docs.chain.link/ace/reference/policy-library/grouped-identity-validator-policy -Last Updated: 2026-08-18 +Last Updated: 2026-07-17 The GroupedIdentityValidatorPolicy validates transaction participants against **different credential requirements depending on who they are**. Instead of applying one fixed rule set to every account — as the [CredentialRegistryIdentityValidatorPolicy](/ace/reference/policy-library/credential-registry-identity-validator-policy) does — it first **routes** each account to a **group**, then validates the account against that group's requirements. This lets a single policy enforce, for example, one set of rules for individuals and another for businesses, or different rules per jurisdiction. @@ -1704,7 +5355,7 @@ A source tells the policy where to resolve identities and credentials for a give - **Credential type ID** — The `bytes32` credential type this source applies to. - **Identity registry address** — The IdentityRegistry that maps wallet addresses to CCIDs. - **Credential registry address** — The CredentialRegistry that stores credentials linked to CCIDs. -- **Data validator address** (optional) — A contract that performs additional validation on the credential data. Set to `address(0)` for attestation-only checks, or a Data Validator address to validate credential contents. See [Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). +- **Data validator address** (optional) — A contract that performs additional validation on the credential data. Set to `address(0)` for attestation-only checks, or a [Data Validator](/ace/guides/policy-manager/manage-data-validators) address to validate credential contents. See [Credential data and privacy](/ace/concepts/cross-chain-identity#credential-data-and-privacy). Source uniqueness within a group and credential type is determined by the `(identityRegistry, credentialRegistry)` pair. Both routing and requirements draw on the same per-group sources. @@ -1776,7 +5427,7 @@ For each address, the policy: # IntervalPolicy Source: https://docs.chain.link/ace/reference/policy-library/interval-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The IntervalPolicy restricts transaction execution to specific time slots within a repeating cycle. It divides time into fixed-length slots, groups those slots into a cycle, and only allows transactions when the current slot falls within a configured range. Transactions attempted outside the allowed window are rejected. @@ -1867,7 +5518,7 @@ This policy does not use extracted parameters. It relies entirely on `block.time # MaxPolicy Source: https://docs.chain.link/ace/reference/policy-library/max-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The MaxPolicy enforces a maximum value constraint on individual transactions. It compares a value extracted from the transaction (for example, a transfer amount) against a configured ceiling and rejects any transaction where the value exceeds that ceiling. @@ -1913,7 +5564,7 @@ The policy expects exactly one parameter from the extractor: # OnlyAuthorizedSenderPolicy Source: https://docs.chain.link/ace/reference/policy-library/only-authorized-sender-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The OnlyAuthorizedSenderPolicy restricts who can call a protected function based on the transaction sender. Unlike the AllowPolicy and RejectPolicy (which check addresses extracted from the transaction parameters), this policy checks `msg.sender` directly and rejects if the sender is not on the authorized list. @@ -1962,7 +5613,7 @@ This policy does not use extracted parameters. It checks `msg.sender` directly. # PausePolicy Source: https://docs.chain.link/ace/reference/policy-library/pause-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The PausePolicy provides a global pause/unpause mechanism for protected functions. When paused, the policy rejects every transaction regardless of any other conditions. When unpaused, it returns `Continue` and lets subsequent policies decide. @@ -2005,7 +5656,7 @@ This policy does not use extracted parameters. It checks only its internal pause # RejectPolicy Source: https://docs.chain.link/ace/reference/policy-library/reject-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The RejectPolicy blocks transactions involving addresses on a denylist. It checks every address extracted from the transaction and immediately rejects if any of them is on the list, halting all subsequent policy checks. @@ -2047,7 +5698,7 @@ The policy expects a variable number of parameters from the extractor, each an a # RoleBasedAccessControlPolicy Source: https://docs.chain.link/ace/reference/policy-library/role-based-access-control-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The RoleBasedAccessControlPolicy provides fine-grained, role-based access control for protected functions. It maps named roles to specific function selectors (operations) and checks whether the transaction sender holds a role that is permitted to perform the requested operation. If the sender lacks the required role, the transaction is rejected. @@ -2107,7 +5758,7 @@ This policy checks `msg.sender` against role assignments for the current functio # SecureMintPolicy Source: https://docs.chain.link/ace/reference/policy-library/secure-mint-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The SecureMintPolicy ensures the total supply of a token does not exceed the actual reserves of the underlying asset. Before every mint, it reads the latest reserve value from a [Chainlink Proof of Reserve](/data-feeds/proof-of-reserve) data feed and checks whether the new total supply (current supply plus the requested mint amount) would exceed what the reserves can back. If it would, the policy rejects the transaction. @@ -2198,7 +5849,7 @@ The policy expects one parameter from the extractor: # VolumePolicy Source: https://docs.chain.link/ace/reference/policy-library/volume-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The VolumePolicy enforces minimum and maximum value constraints on individual transactions. It compares a value extracted from the transaction against configured bounds and rejects if the value falls outside the allowed range. @@ -2260,7 +5911,7 @@ The policy expects exactly one parameter from the extractor: # VolumeRatePolicy Source: https://docs.chain.link/ace/reference/policy-library/volume-rate-policy -Last Updated: 2026-04-20 +Last Updated: 2026-03-31 The VolumeRatePolicy enforces per-account volume limits within configurable time periods. It tracks cumulative transaction amounts for each account and rejects transactions that would push the account's total volume past the allowed maximum for the current period. When a new period begins, the counter resets automatically. @@ -2331,7 +5982,7 @@ The policy expects exactly two parameters from the extractor: # Cross-Chain Identity Contracts Source: https://docs.chain.link/ace/reference/cross-chain-identity-contracts -Last Updated: 2026-08-18 +Last Updated: 2026-07-17