### Install SDK via Maven Source: https://docs.ripple.com/products/custody/get-started/integrate-via-sdk.md Command to install the SDK JAR file into the local Maven repository. ```bash mvn install:install-file -Dfile=./sdk-{sdk-version}.jar -DgroupId=com.metaco -DartifactId=sdk -Dversion={sdk-version} -Dpackaging=jar -DpomFile=./sdk-{sdk-version}.xml ``` -------------------------------- ### Complete Luna HSM Configuration Example Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/on-premise-hsm/thales-luna.md Full configuration example demonstrating both notary and vault components using environment variable placeholders for sensitive data. ```yaml # production.yaml - Complete Luna HSM Configuration # Global settings harmonize: repository: base: "my-registry.example.com/harmonize" urls: base: "custody.example.com" tls: true # Notary configuration components: notary: enabled: true platform: kms_luna kms_luna: host: "luna-hsm.example.com" port: "1792" slot: "0" pin: "${NOTARY_PIN}" # Injected from secrets manager client: certificate: | -----BEGIN CERTIFICATE----- ${LUNA_CLIENT_CERT} -----END CERTIFICATE----- key: | -----BEGIN PRIVATE KEY----- ${LUNA_CLIENT_KEY} -----END PRIVATE KEY----- server: certificate: | -----BEGIN CERTIFICATE----- ${LUNA_SERVER_CERT} -----END CERTIFICATE----- # Vault configuration (uses same partition as Notary) harmonize: vaults: "00000000-0000-0000-0000-000000000000": enabled: true platform: kms_luna notary_public_key: "ed25519:${NOTARY_PUBLIC_KEY}" # Set after Notary initialization kms_luna: host: "luna-hsm.example.com" port: "1792" slot: "0" # Same partition as Notary pin: "${PARTITION_PIN}" client: certificate: | -----BEGIN CERTIFICATE----- ${LUNA_CLIENT_CERT} -----END CERTIFICATE----- key: | -----BEGIN PRIVATE KEY----- ${LUNA_CLIENT_KEY} -----END PRIVATE KEY----- server: certificate: | -----BEGIN CERTIFICATE----- ${LUNA_SERVER_CERT} -----END CERTIFICATE----- ``` -------------------------------- ### Complete BlockSafe HSM Configuration Example Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/on-premise-hsm/blocksafe.md A comprehensive example showing both notary and vault configurations in a single production.yaml file. ```yaml # production.yaml - Complete BlockSafe HSM Configuration # Global settings harmonize: repository: base: "my-registry.example.com/harmonize" urls: base: "custody.example.com" tls: true # Notary configuration components: notary: enabled: true platform: kms_blocksafe kms_blocksafe: secretRef: "custody-blocksafe-credentials" # Or inline configuration (not recommended for production): # device: "3001@192.168.1.100" # slot: 0 # pin: "${SLOT_PIN}" # Vault configuration (uses same slot as Notary) harmonize: vaults: "00000000-0000-0000-0000-000000000000": enabled: true platform: kms_blocksafe notary_public_key: "ed25519:${NOTARY_PUBLIC_KEY}" kms_blocksafe: secretRef: "custody-blocksafe-credentials" # Or inline configuration (not recommended for production): # device: "3001@192.168.1.100" # slot: 0 # Same slot as Notary # pin: "${SLOT_PIN}" ``` -------------------------------- ### Ledger Configuration Example Source: https://docs.ripple.com/products/custody/deployment/reference/ledgers.md Example of defining multiple ledger network entries within a deployment values file. Ensure all required endpoint fields are provided for each enabled ledger family. ```yaml harmonize: ledgers: bitcoin: mainnet: enabled: true url: "http://bitcoin-rpc.example.com:8332" user: "" password: "" fallbackFeeRate: 100 ethereum: mainnet: enabled: true uri: "https://ethereum-node.example.com" xrpl: mainnet: enabled: true uri: "https://xrpl-node.example.com" substrate: polkadot: enabled: true ws: "wss://substrate-ws.example.com" sidecar: "https://substrate-sidecar.example.com" stellar: mainnet: enabled: true url: "https://stellar-horizon.example.com" passphrase: "" ``` -------------------------------- ### Create user payload examples Source: https://docs.ripple.com/products/custody/v1.15/api/environment/user/create JSON payloads for defining new users, including configurations for internal-only logins and multi-provider SSO setups. ```json "payload": { "id": "61aaa805-f9b8-11eb-b158-dcfb48cfb3cb", "alias": "op1@ripple.com", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7ItVC+y2KerttcRjPLDs8QmDVz7yI7ElQA70Sz+cLcBI6041aObPvcNqps8eTYe2jhc2Kb5qgNgoACB3SqpYIA==", "roles": [ "manager" ], "loginIds": [ { "id": "op1@harmonize.com", "providerId": "harmonize" } ], "lock": "Unlocked", "description": "A user with role manager", "customProperties": {}, "type": "v0_CreateUser" }, ``` ```json "payload": { "id": "61aaa805-f9b8-11eb-b158-dcfb48cfb3cb", "alias": "op1@ripple.com", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7ItVC+y2KerttcRjPLDs8QmDVz7yI7ElQA70Sz+cLcBI6041aObPvcNqps8eTYe2jhc2Kb5qgNgoACB3SqpYIA==", "roles": [ "manager" ], "loginIds": [ { "id": "op1@company.com", "providerId": "harmonize" }, { "id": "op1@company.com", "providerId": "azure-ad" } ], "lock": "Unlocked", "description": "A user with role manager", "customProperties": {}, "type": "v0_CreateUser" }, ``` -------------------------------- ### Get request state response example Source: https://docs.ripple.com/products/custody/v1.15/api/get-started/key-operations/update/check Example JSON response returned by the Get request state operation, showing the request status and history. ```json { "id": "276fe27c-1ae4-4e93-a811-3f3d3e49cabe", "requester": { "id": "6ac20654-450e-29e4-65e2-1bdecb7db7c4", "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1" }, "status": "Succeeded", "history": [ { "source": "Notary", "status": "Succeeded", "hint": "Processing succeeded", "createdAt": "2021-07-19T13:36:14.834Z" }, { "source": "Gateway", "status": "Processing", "hint": "None", "createdAt": "2021-07-19T13:36:11.053Z" } ], "lastModifiedAt": "2021-07-19T13:36:14.834Z" } ``` -------------------------------- ### User Conflict Response Example Source: https://docs.ripple.com/products/custody/support/change-history/migration-guide-v115 Example JSON response from the GET /internal/v1/users/conflicts endpoint showing both sameAlias and samePublicKey conflict types. ```json { "sameAlias":[ { "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e", "alias": "op1@ripple.com", "userIds":[ "497f6eca-6276-4993-bfeb-53cbbbba6f08", "47ecb890-2e2b-4d53-9428-bf08f2ee56dc" ] } ], "samePublicKey":[ { "publicKey": "MFkw...NfPfw/q9YW74Q==", "users":[ { "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e", "alias": "op2@ripple.com", "userId": "497f6eca-6276-4993-bfeb-53cbbbba6f08" }, { "domainId": "89hd02c3-fdd8-452e-bc6e-ef07a335ec7e", "alias": "op1@ripple.com", "userId": "hks86eca-6276-4993-bfeb-53cbbbba6f08" } ] } ] } ``` -------------------------------- ### Deployment Configuration JSON Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/advanced-secret-management.md Example structure for the 'config' key containing deployment and infrastructure settings. ```json { "deployment": { "vault": { "release-name": "vault-01", "construct-id": "00000000-0000-0000-0000-000000000001" } }, "custody": { "environment": "https://api.your-instance.custody.example.com/" }, "infrastructure": { "aws": { "region": "us-east-1", "ec2-iam-role": "vault-role", "vpc": { "create-new": false, "id": "vpc-abc123", "subnet-id": "subnet-def456" } } } } ``` -------------------------------- ### Get remaining users response Source: https://docs.ripple.com/products/custody/v1.15/api/get-started/key-operations/update/check Example response from the Get remaining users operation listing users eligible to approve or reject an intent. ```json [ { "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1", "users": [ "0c723b1e-5d44-44b6-a61c-1dc97efaedf1", "fdf4ae91-c435-48d2-a3d2-b849d972744d", "da7b5a8a-f6b9-11eb-8d3f-dcfb48cfb3cb", "490e8791-1652-4e11-a6d1-efcdbc3aa9c3" ] } ] ``` -------------------------------- ### Configure internal and external AMQP settings Source: https://docs.ripple.com/products/custody/deployment/reference/amqp.md Example configuration demonstrating internal AMQP for core components and external AMQP for event processing. ```yaml harmonize: internalAmqp: enabledForCoreComponents: true username: "user" vhost: "harmonize" sslEnabled: true externalAmqp: enabledForCoreComponents: false host: "events-rabbitmq.example.com" port: 5671 username: "events" password: "SECURE_PASSWORD" vhost: "events" sslEnabled: true amqpProtocolVersion: "v1" ``` -------------------------------- ### Get intent details response Source: https://docs.ripple.com/products/custody/v1.15/api/get-started/key-operations/update/check Example response from the Get intent details operation showing the current status and approval progress of an intent. ```json { "data": { "id": "75ff1be5-cca9-4481-a7af-23bb33ff0ed8", "details": { "payload": { "data": "some data", "type": "v0_NotarizeData" }, "expiryAt": "2021-10-21T17:02:24.331Z", "author": { "id": "6ac20654-450e-29e4-65e2-1bdecb7db7c4", "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1" }, "targetDomainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1", "metadata": { "description": null, "createdAt": "2021-08-27T13:50:48.450Z", "customProperties": {} }, "proposalSignature": "MEYCIQDsHgd41Ix/O0yJ1y+AOT9V7TMOvhhPNJ2WSyQi2CNiXwIhAKfEE3T+ukbIoNGAutJfAiVZ0F5RFJG94QrLMy1pSEZa" }, "state": { "status": "Open", "error": null, "progressPerPolicy": [ { "stepProgress": [ { "state": "Open", "decisions": [ { "author": { "id": "6ac20654-450e-29e4-65e2-1bdecb7db7c4", "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1" }, "authorRoles": [ "admin" ], "seenBySystemAt": "2021-08-27T13:50:48.450Z", "expiryAt": "2021-08-27T21:50:47.516Z", "decision": "Approve", "rejectionReason": null, "rawRequest": "{\"author\":{\"domainId\":\"5cd224fe-193e-8bce-c94c-c6c05245e2d1\",\"id\":\"6ac20654-450e-29e4-65e2-1bdecb7db7c4\"},\"customProperties\":{},\"\":\"2021-08-27T21:50:47.516Z\",\"id\":\"75ff1be5-cca9-4481-a7af-23bb33ff0ed8\",\"payload\":{\"data\":\"some data\",\"type\":\"v0_NotarizeData\"},\"targetDomainId\":\"5cd224fe-193e-8bce-c94c-c6c05245e2d1\",\"type\":\"Propose\"}", "signature": "" } ] } ], "policyReference": { "id": "39ab337e-3347-4c4d-8bc7-dd518535ee61", "revision": 1, "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1" } } ] } }, "signature": "" } ``` -------------------------------- ### Get current user API response Source: https://docs.ripple.com/products/custody/governance/users/manage-users-and-roles.md Example JSON response from the Get current user endpoint, showing public key and domain associations. ```json { "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7ItVC+y2KpbztcRjPLDs8QmDVz7yI7ElQA70Sz+cLcBI6041aObPvcNqps8eTYe2jhc2Kb5qgNgoACB3SqpYIA==", "domains": [ { "id": "67241e7d-f345-459e-9293-475693c45d85", "alias": "My root domain", "userReference": { "id": "61aaa805-f9b8-11eb-b158-dcfb48cfb3cb", "alias": "operator@example.com" } } ] } ``` -------------------------------- ### POST /v1/genesis Source: https://docs.ripple.com/products/custody/devbox/genesis/rungenesis Initializes the system genesis by providing the root domain setup, including users and policies. ```APIDOC ## POST /v1/genesis ### Description Initializes the system genesis by providing the root domain setup, including users and policies. ### Method POST ### Endpoint /v1/genesis ### Request Body - **rootDomainSetup** (object) - Required - Configuration for the root domain. - **id** (string) - Required - Unique identifier for the domain. - **alias** (string) - Required - Alias for the domain. - **lock** (string) - Required - Lock status: "Unlocked" or "Locked". - **governingStrategy** (string) - Optional - Strategy: "ConsiderDescendants" or "CoerceDescendants". - **permissions** (object) - Required - Access control definitions. - **users** (array) - Required - List of users to initialize. - **policies** (array) - Required - List of policies to initialize. ``` -------------------------------- ### List Query Request Source: https://docs.ripple.com/products/custody/identity-and-access/authentication/authenticate-api-requests.md Example of a GET request to retrieve a list of entities. ```http GET /v1/domains Authorization: Bearer ``` -------------------------------- ### Example account creation intent in JSON format Source: https://docs.ripple.com/products/custody/v1.15/resources/openssl-examples A sample JSON structure representing an account creation intent. ```json { "author":{ "id":"e02f08ce-e515-46fa-9ed3-326179a1de89", "domainId":"789265d6-aea6-4c7b-9d68-1a532ea3060b" }, "expiryAt":"2024-08-24T14:15:22Z", "targetDomainId":"789265d6-aea6-4c7b-9d68-1a532ea3060b", "id":"1b96fd0f-4e50-4782-9fae-ff0fce7f982c", "payload":{ "id":"9dbc612f-b98a-4c83-8143-9d33e1865127", "alias":"OpenSSL Test Account 1", "providerDetails":{ "vaultId":"00000000-0000-0000-0000-000000000000", "keyStrategy":"VaultHard", "type":"Vault" }, "ledgerIds":["bitcoin-cash-testnet"], "lock":"Unlocked", "customProperties":{}, "type":"v0_CreateAccount" }, "description":"OpenSSL Creation of Test Account 1", "customProperties":{}, "type":"Propose" } ``` -------------------------------- ### Detail Query Request Source: https://docs.ripple.com/products/custody/identity-and-access/authentication/authenticate-api-requests.md Example of a GET request to retrieve a specific entity by its ID. ```http GET /v1/domains/{domainId} Authorization: Bearer ``` -------------------------------- ### Define users with roles and SSO Source: https://docs.ripple.com/products/custody/v1.15/get-started/deployment/system-setup/setup Example configuration for creating a user with multiple roles and associated login providers. ```json "users": [ { "id": "e1fe3431-f899-427b-9e67-a75fb9fe5e57", "alias": "operator@ripple.com", "publicKey": "MFkw...NfPfw/q9YW74Q==", "roles": [ "manager","compliance","director","operator" ], "loginIds": [ { "id": "op1@company.com", "providerId": "harmonize" }, { "id": "op1@company.com", "providerId": "azure-ad" } ], "lock": "Unlocked", "description": "A user", "customProperties": {} } ], ``` -------------------------------- ### Configure Multiple Telemetry Backends Source: https://docs.ripple.com/products/custody/v1.15/get-started/deployment/system-setup/telemetry Examples for routing logs, traces, and metrics to different endpoints. ```yaml harmonize: telemetry: enabled: true otel: logs: host: 'my-otel-endpoint-for-logs.com' traces: host: 'my-otel-endpoint-for-traces.com' metrics: host: 'my-otel-endpoint-for-metrics.com' ``` ```yaml harmonize: telemetry: otel: # Logs config logs: # Enable or disable enabled: true host: 'my-otel-endpoint-for-logs.com' protocol: 'https' ``` ```yaml harmonize: telemetry: type: otlp protocol: http host: 'my-otel-endpoint-for-logs-and-traces.com' # E.g. Elasticsearch otel: metrics: host: 'my-otel-endpoint-for-metrics.com' # E.g Prometheus ``` -------------------------------- ### Stellar account initialization payload Source: https://docs.ripple.com/products/custody/accounts-and-assets/accounts/ledger-specific-settings/stellar-api.md Example JSON payload for creating a transaction order to initialize a Stellar account with a specified starting balance. ```json { "payload": { "id": "953d75b2-e384-46e9-8a72-a1ce753a50e2", "accountId": "953d75b2-e384-46e9-8a72-a1ce753a50e2", "parameters": { "operation": { "destination":{ "address": "GBDAE3PRVTN4GWYR7O4QW3Y6RFHU564RPFJ5CMYIMG3AYNJFDGW3L7O7", "type": "Address" }, "startingBalance":"10000000", "type": "CreateAccount" }, "memo": { "value": "Stellar account fund", "type": "Text" }, "feeStrategy": { "priority": "Low", "type": "Priority" }, "maximumFee": "200", "type": "Stellar" }, "description": "", "customProperties": {}, "type": "v0_CreateTransactionOrder" } } ``` -------------------------------- ### Retrieve Public Key API Response Source: https://docs.ripple.com/products/custody/overview/security/data-integrity-and-audit-trail.md Example JSON response from the Get system properties API containing the platform's public key. ```json { "id": "CUSTODY_API_KEY", "value": { "publicKey": { "value": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1WXjDbBcWEVmqObzEndfnug+nd4EOEqcXMY5a5I0XvfRq1+K6Z9K1DdZ2YgFIbuzdX2Z2kOfE/fcDj/QzF5IAw==", "type": "PublicKey" } } } ``` -------------------------------- ### Create Namespaces and Apply Network Policies Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/production-best-practices.md Use these commands to establish the recommended namespace structure and enforce network isolation between components. ```bash # Create namespaces kubectl create namespace custody-core kubectl create namespace custody-vaults kubectl create namespace custody-networks kubectl create namespace custody-monitoring # Apply network policies (restrict cross-namespace traffic) kubectl apply -f network-policies/ ``` -------------------------------- ### Define genesis users in the domain setup Source: https://docs.ripple.com/products/custody/governance/genesis/plan-your-first-users.md Example of the users array structure within a genesis domain configuration. These users are embedded directly and do not require a type field. ```json [ { "id": "e1fe3431-f899-427b-9e67-a75fb9fe5e57", "alias": "platform-admin-1@example.com", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEe32vCCfM0LXmT6VuZo4AykiZ8YfBMB92nKNX8K+PRhN7/qPhILzGlOv/7kDyefTxHSrytXG28OB0cPwErlHgyQ==", "roles": ["platform-admin", "policy-operator"], "loginIds": [ { "id": "platform-admin-1@example.com", "providerId": "harmonize" } ], "lock": "Unlocked", "description": "Genesis platform administrator", "customProperties": { "userType": "human" } }, { "id": "7bf37a53-51a5-48da-b7d1-c2fa05bd3f14", "alias": "compliance-1@example.com", "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET1BnSIvToEO6r5BMmaG+O3GL0/A7JilzCdmJ3trIWIsXDuv8jAcGizraMouqWIHTx2hi3rxoH7eABURbfSSryw==", "roles": ["compliance"], "loginIds": [ { "id": "compliance-1@example.com", "providerId": "harmonize" } ], "lock": "Unlocked", "description": "Genesis compliance approver", "customProperties": { "userType": "human" } } ] ``` -------------------------------- ### Configure notification and email settings in YAML Source: https://docs.ripple.com/products/custody/deployment/reference/notifications.md Example deployment values file demonstrating the structure for enabling email notifications and configuring the notification service component. ```yaml harmonize: notifications: email: enabled: true sender: "noreply@example.com" smtp: host: "smtp.example.com" port: "587" username: "" password: "" components: notification: enabled: true replicas: 1 resources: limits: cpu: 1000m memory: 1024Mi requests: cpu: 100m memory: 256Mi service: main: ports: http: port: 80 targetPort: 3000 ``` -------------------------------- ### MPT Issuance ID Example Source: https://docs.ripple.com/products/custody/accounts-and-assets/tokenization/xrpl-mpts.md Example of a 192-bit unique identifier for an MPT issuance. ```text 00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000 ``` -------------------------------- ### Configure Syslog settings Source: https://docs.ripple.com/products/custody/deployment/reference/telemetry-configuration.md Example YAML configuration for enabling and defining Syslog connection parameters. ```yaml syslog: enabled: true host: 'my-syslog-receiver-hostname.com' port: '54526' gatewayName: harmonize_syslog ``` -------------------------------- ### v0_UpdateLedger Payload Examples Source: https://docs.ripple.com/products/custody/accounts-and-assets/blockchains/dynamic-ledgers-update-payloads.md Examples of JSON payloads for updating different blockchain ledgers. ```APIDOC ## v0_UpdateLedger Payload ### Description Use the `v0_UpdateLedger` intent to update blockchain ledger configurations. The payload requires a reference object and specific parameters based on the blockchain type. ### Request Body - **reference** (object) - Required - Contains the ledger `id` and `revision`. - **alias** (string) - Required - Human-readable name of the ledger. - **parameters** (object) - Required - Blockchain-specific configuration parameters. - **type** (string) - Required - Must be set to `v0_UpdateLedger`. ### Example Payload (Algorand) { "payload": { "reference": { "id": "algorand", "revision": 1 }, "alias": "Algorand", "parameters": { "type": "Algorand", "genesisId": "mainnet-v1.0", "genesisHash": "wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=", "nativeTickerName": "Algo", "nativeTickerSymbol": "ALGO", "nativeTickerDecimals": 6 }, "type": "v0_UpdateLedger" } } ``` -------------------------------- ### Get remaining users Source: https://docs.ripple.com/products/custody/v1.19/api/reference/openapi/intents Get the list of users who still need to approve an intent. ```APIDOC ## GET /v1/domains/{domainId}/intents/{intentId}/remaining-users ### Description Returns the remaining user IDs able to approve for the currently open step of the intent approval process. ``` -------------------------------- ### Deploy Core Services with Helm Source: https://docs.ripple.com/products/custody/deployment/install/first-time-installation.md Installs the core services using the provided configuration file within the specified namespace. ```bash helm install harmonize . \ -f production.yaml \ --namespace custody-core \ --create-namespace ``` -------------------------------- ### GET /v1/domain/{domainId}/sponsor/events Source: https://docs.ripple.com/products/custody/reference/api/openapi Get audit events for sponsorship configuration changes (deprecated). ```APIDOC ## GET /v1/domain/{domainId}/sponsor/events ### Description Get audit events for sponsorship configuration changes (deprecated). ### Method GET ### Endpoint /v1/domain/{domainId}/sponsor/events ``` -------------------------------- ### Configure Telemetry via Helm Source: https://docs.ripple.com/products/custody/deployment/reference/telemetry-configuration.md Example configuration for enabling OTLP telemetry with a specific host and protocol. ```yaml harmonize: telemetry: type: 'otlp' protocol: 'https' host: 'my-telemetry-hostname.com' ``` -------------------------------- ### Substrate Fee Parameters Configuration Source: https://docs.ripple.com/products/custody/v1.19/api/accounting/account-settings/dynamic-ledgers-payloads Example of a Substrate-based ledger configuration including method weights and transaction payment parameters. ```json "base": 67641000, "type": "MethodWeight", "reads": 9, "writes": 6 } }, { "name": "set_payee", "methodId": 7, "feeParameters": { "base": 26060000, "type": "MethodWeight", "reads": 2, "writes": 1 } }, { "name": "set_controller", "methodId": 8, "feeParameters": { "base": 29380000, "type": "MethodWeight", "reads": 3, "writes": 3 } }, { "name": "rebond", "methodId": 19, "feeParameters": { "base": 102961223, "type": "MethodWeight", "reads": 10, "writes": 7 } } ], "moduleId": 7 } ], "feeParameters": { "type": "TransactionPayment", "readWeight": 20499000, "writeWeight": 83471000, "baseExtrinsic": 126045000, "transactionByteFee": "1000000", "weightToFeePolynomial": [ "0", "0.079336745" ] }, "transactionVersion": 26 } ] }, "description": null, "customProperties": {}, "type": "v0_CreateLedger" } ``` -------------------------------- ### GenesisSucceeded event payload example Source: https://docs.ripple.com/products/custody/reference/events-and-webhooks/event-payload-reference.md Example JSON structure for the GenesisSucceeded event, containing public keys and entity references. ```json { "domainId": "5cd224fe-193e-8bce-c94c-c6c05245e2d1", "payload": { "apiPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET1BnSIvToEO6r5BMmaG+O3GL0/A7JilzCdmJ3trIWIsXDuv8jAcGizraMouqWIHTx2hi3rxoH7eABURbfSSryw==", "messagingPublicKey": "MCowBQYDK2VwAyEAUGkt+kcvAT4vh+XSEL5Azv4XjjN4e+RojV2gr+Bu0Uk=", "type": "GenesisSucceeded", "createdEntitiesReferences": { "domains": [ { "id": "70fe2431-0c7e-4251-aa69-8c960a4303b5", "parentDomainId": null | "27aef9d4-c41f-496b-a84b-89a0982f230d" } ], "users": [ { "domainId": "70fe2431-0c7e-4251-aa69-8c960a4303b5", "id": "b9e2a9ca-2eb5-4cc3-98b1-0e9d3ec09129" } ], "policies": [ { "domainId": "70fe2431-0c7e-4251-aa69-8c960a4303b5", "id": "8e7a40d3-b255-4a0a-8b80-13596bf566ae" } ], "tickers": [ { "id": "def26868-39e0-4ad3-8f02-22d388409544" } ], "systemProperties": [ { "id": "STATE_REVIEW_AUTHORITY" } ] }, "genesis": null | { "data": { "executedAt": "2019-08-24T14:15:10Z", "payload": { "rootDomainSetup": { }, "cryptoSetup": { }, "tickers": [ ], "systemProperties": [ ] } }, "signature": "", } }, }, "id": "d1553d40-fbd9-3e44-ac7b-8cd59fa20c77", "sequenceNumber": 1, "savedAt": "2021-11-26T12:16:23.027Z" } ``` -------------------------------- ### Prepare challenge string Source: https://docs.ripple.com/products/custody/v1.15/resources/openssl-examples Displays the contents of a challenge file containing a UUID. ```sh user@HOSTNAME:~/test$ cat challenge.txt 22ff6b83-784c-46ab-8514-096c3c2b93ff ``` -------------------------------- ### Indexer deployment values configuration Source: https://docs.ripple.com/products/custody/deployment/reference/indexers.md Example of a deployment values file demonstrating configuration patterns for Bitcoin, Ethereum, Substrate, and Cardano indexers. ```yaml harmonize: ledgers: bitcoin: mainnet: enabled: true nodeEndpoint: "bitcoin-rpc.internal:8332" url: "https://bitcoin-indexer.example.com" user: "" password: "" fallbackFeeRate: 100 ethereum: mainnet: enabled: true uri: "https://ethereum-node.example.com" substrate: polkadot: enabled: true ws: "wss://substrate-ws.example.com" sidecar: "https://substrate-sidecar.example.com" cardano: mainnet: enabled: true http: "https://cardano-node.example.com" ws: "wss://cardano-ws.example.com" ``` -------------------------------- ### Create a Policy Source: https://docs.ripple.com/products/custody/v1.19/resources/sdk/entities Demonstrates creating a policy using the builder pattern or the action object interface. ```java var domainId = ""; var policyId = ""; var policyAlias = ""; var policyDescription = ""; var conditionExpression = "context.request.author.id != '6ac20654-450e-29e4-65e2-1bdecb7db7c4'"; var policyWorkflow = Policies.WorkflowCondition.simpleBuilder() .quorum(1) .role("admin") .build(); var policyCondition = Policies.PolicyCondition.simpleBuilder() .expression(conditionExpression) .build(); var policy = Policies.CreatePolicy.builder() .id(policyId) .alias(policyAlias) .intentType(Policies.IntentType.v0_CreateAccount) .description(policyDescription) .locked(false) .rank(1) .condition(policyCondition) .workflow(policyWorkflow) .build(); harmonize.policies(domainId).create(policy, Expire.hours(24)) .waitForSucceed(Timeout.minutes(1)); ``` ```java var domainId = ""; var policyId = ""; var policyAlias = ""; var policyDescription = ""; var conditionExpression = "context.request.author.id != '6ac20654-450e-29e4-65e2-1bdecb7db7c4'"; var policyWorkflow = Policies.WorkflowCondition.simpleBuilder() .quorum(1) .role("admin") .build(); var policyCondition = Policies.PolicyCondition.simpleBuilder() .expression(conditionExpression) .build(); harmonize.policies(domainId).create() .id(policyId) .alias(policyAlias) .intentType(Policies.IntentType.v0_CreateAccount) .description(policyDescription) .locked(false) .rank(1) .condition(policyCondition) .workflow(policyWorkflow) .expire(Expire.hours(24)) .submit() .waitForSucceed(Timeout.minutes(1)); ``` -------------------------------- ### Install Vault Agent Injector Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/advanced-secret-management.md Helm commands to add the HashiCorp repository and install the Vault Agent Injector into the cluster. ```bash # Add Helm repository helm repo add hashicorp https://helm.releases.hashicorp.com helm repo update # Install Vault with injector helm install vault hashicorp/vault \ --namespace vault-system \ --create-namespace \ --set "injector.enabled=true" \ --set "server.dev.enabled=true" # Verify installation kubectl get pods -n vault-system ``` -------------------------------- ### Configure Ledgers Source: https://docs.ripple.com/products/custody/deployment/install/first-time-installation.md Example YAML configuration for enabling and connecting to blockchain ledgers. ```yaml # production.yaml harmonize: ledgers: bitcoin-mainnet: enabled: true node: uri: "https://bitcoin-node.my-bank.local:8332" # For basic auth: "https://user:password@bitcoin-node.my-bank.local:8332" ethereum-mainnet: enabled: true node: uri: "https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY" # Or self-hosted: "https://ethereum-node.my-bank.local:8545" ``` -------------------------------- ### Install External Secrets Operator via Helm Source: https://docs.ripple.com/products/custody/deployment/integrate-kms/advanced-secret-management.md Commands to add the Helm repository, install the operator, and verify the deployment. ```bash # Add Helm repository helm repo add external-secrets https://charts.external-secrets.io helm repo update # Install ESO helm install external-secrets \ external-secrets/external-secrets \ --namespace external-secrets-system \ --create-namespace \ --set installCRDs=true # Verify installation kubectl get pods -n external-secrets-system ``` -------------------------------- ### Get account balances response structure Source: https://docs.ripple.com/products/custody/v1.15/api/accounting-entities/account/balances The response format for the Get account balances operation, showing the structure of account references and balance components. ```json { "items": [ { "accountReference": { "id": "", "domainId": "" }, "tickerId": "", "totalAmount": "", "reservedAmount": "", "quarantinedAmount": "", "lastUpdatedAt": "" }, { "accountReference": { "id": "", "domainId": "" }, "tickerId": "", "totalAmount": "", "reservedAmount": "", "quarantinedAmount": "", "lastUpdatedAt": "" } ], "count": "", "currentStartingAfter": "", "nextStartingAfter": "" } ```