{"id":29555816,"url":"https://github.com/fireblocks/fireblocks-xrp-sdk","last_synced_at":"2025-10-23T15:32:08.769Z","repository":{"id":302303121,"uuid":"1005010702","full_name":"fireblocks/fireblocks-xrp-sdk","owner":"fireblocks","description":"A stateless SDK and REST API server for Fireblocks customers, simplifying advanced operations on the Ripple Ledger (XRPL).","archived":false,"fork":false,"pushed_at":"2025-08-04T11:52:30.000Z","size":350,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-04T15:46:57.838Z","etag":null,"topics":["dex","fireblocks","tokenization","xrp"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fireblocks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-19T14:20:02.000Z","updated_at":"2025-07-16T13:55:19.000Z","dependencies_parsed_at":"2025-07-18T09:41:18.723Z","dependency_job_id":"ffe33e42-467b-4f37-a1ea-b60dc531edbc","html_url":"https://github.com/fireblocks/fireblocks-xrp-sdk","commit_stats":null,"previous_names":["fireblocks/fireblocks-xrp-sdk"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fireblocks/fireblocks-xrp-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Ffireblocks-xrp-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Ffireblocks-xrp-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Ffireblocks-xrp-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Ffireblocks-xrp-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fireblocks","download_url":"https://codeload.github.com/fireblocks/fireblocks-xrp-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Ffireblocks-xrp-sdk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269832936,"owners_count":24482341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-11T02:00:10.019Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dex","fireblocks","tokenization","xrp"],"created_at":"2025-07-18T09:41:05.400Z","updated_at":"2025-10-23T15:32:03.727Z","avatar_url":"https://github.com/fireblocks.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fireblocks XRP SDK\n\nA stateless SDK and REST API server for Fireblocks customers, simplifying advanced operations on the Ripple Ledger (XRPL).\n\n---\n\n## ⚡ Project Overview\n\n**Fireblocks XRP SDK** enables secure, advanced XRP ledger operations via simple SDK calls or a stateless REST API.  \nBuilt for Fireblocks customers who want seamless DEX, token, and issuer operations on Ripple.\n\n\u003e **Disclaimer**  \n\u003e This SDK relies on Fireblocks' RAW signing capabilities. Customers are fully responsible for safe usage, setup, and transaction outcomes. Fireblocks is not liable for any loss of funds resulting from the use of this code. Contact the Fireblocks Professional Services team for assistance.\n\n### **Prerequisites**\n\n- Fireblocks workspace and API credentials ([how to create an API key](https://developers.fireblocks.com/reference/quickstart)).\n- RAW signing is enabled on your Fireblocks workspace. (Contact your Customer Success Manager for more information)\n- TAP rules set to allow RAW transactions.\n- Node.js v18+ for SDK usage.\n- Docker (for REST API server).\n\n---\n\n## 🚀 Features\n\n- **Advanced XRPL support:** DEX ([OfferCreate](https://xrpl.org/docs/references/protocol/transactions/types/offercreate)/[Cancel](https://xrpl.org/docs/references/protocol/transactions/types/offercancel), [Cross Currency Payments](https://xrpl.org/docs/concepts/payment-types/cross-currency-payments) and [Credentials](https://xrpl.org/docs/references/protocol/transactions/types/credentialcreate)), [token \u0026 XRP transfers](https://xrpl.org/docs/references/protocol/transactions/types/payment), [setting trust lines](https://xrpl.org/docs/references/protocol/transactions/types/trustset), [account settings](\u003c(https://xrpl.org/docs/references/protocol/transactions/types/accountset)\u003e), [clawback](https://xrpl.org/docs/references/protocol/transactions/types/clawback), [freeze/unfreeze](https://xrpl.org/docs/references/protocol/transactions/types/trustset) and [burn](https://xrpl.org/docs/use-cases/tokenization/stablecoin-issuer#burn).\n- **Fireblocks wallet integration:** Secure MPC key management, raw signing flows, and transaction creation.\n- **Raw content validation with callback handler support** Any Raw transaction created by the SDK includes the unhashed payload for further validation actions on your callback handler before signing.\n- **Stateless, pool-managed SDK:** Efficient use of Fireblocks APIs with per-vault pooling.\n- **REST API:** Simple to run as a Docker container.\n\n---\n\n## 📦 Installation\n\n### **SDK / Library Usage**\n\nClone this repository and install dependencies:\n\n```bash\ngit clone https://github.com/fireblocks/fireblocks-xrp-sdk.git\ncd fireblocks-xrp-sdk\nnpm install\n```\n\n### REST API (Docker)\n\nBuild and run the REST API server:\n\n```bash\ncp .env.example .env\n# Edit .env to your configuration\ndocker-compose up --build\n```\n\n- By default, the API server runs on port `3000`.\n- To change the port, set the `PORT` variable in your `.env` file.\n\n\u003e The project includes a sample `docker-compose.yml` and `.env.example` for quick setup.\n\n---\n\n## ⚙️ Configuration\n\nAll configuration is via environment variables.\n\nStart by copying `.env.example` to `.env` and editing for your environment:\n\n```bash\ncp .env.example .env\n```\n\n| Variable Name                   | Required | Default  | Purpose                                                                                                                |\n| ------------------------------- | :------: | -------- | ---------------------------------------------------------------------------------------------------------------------- |\n| `FIREBLOCKS_API_KEY`            |   Yes    | –        | Your Fireblocks API key UUID                                                                                           |\n| `FIREBLOCKS_API_PATH_TO_SECRET` |   Yes    | –        | Path to Fireblocks private key                                                                                         |\n| `FIREBLOCKS_VAULT_ACCOUNT_ID`   |    No    | –        | Optional - Can be added to use a single wallet SDK intance, should be ommited when used as a dockerized server.        |\n| `FIREBLOCKS_ASSET_ID`           |    No    | XRP_TEST | Use `XRP` for mainnet, `XRP_TEST` for testnet                                                                          |\n| `FIREBLOCKS_BASE_PATH`          |    No    | US       | Fireblocks API environment (see [docs](https://developers.fireblocks.com/docs/workspace-environments) for region URLs) |\n| `SDK_LOG_LEVEL`                 |    No    | info     | Log level: debug, info, warn, error, fatal                                                                             |\n| `PORT`                          |    No    | 3000     | API server port (REST mode)                                                                                            |\n\n---\n\n## 🔑 Mounting Your Fireblocks Private Key in Docker\n\nThe SDK and REST API require access to your Fireblocks API private key (FIREBLOCKS_API_SECRET) for signing and secure communication with Fireblocks.\nWhen running inside Docker, you must mount this file and reference it correctly.\n\n1. Store Your Private Key\n   Place your Fireblocks API private key file in the project directory under ./secrets/fireblocks_secret.key:\n\n```bash\nyour-project-root/\n│\n├─ secrets/\n│ └─ fireblocks_secret.key\n├─ .env\n├─ docker-compose.yml\n└─ ...\n```\n\n#### **Important: Never commit your private key to source control.**\n\n2. Reference the Private Key in `.env`\n   Set the environment variable in your `.env` file to match the path inside the container:\n\n```bash\nFIREBLOCKS_API_SECRET=/secrets/fireblocks_secret.key\n```\n\n3. How Docker Compose Mounts the Key\n   Your `docker-compose.yml` already mounts both the secrets folder and the .env file into the container:\n\n```yaml\nservices:\n  fireblocks-xrp-sdk:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    volumes:\n      - ./secrets/fireblocks_secret.key:/secrets/fireblocks_secret.key:ro\n      - ./.env:/app/.env:ro\n    ports:\n      - \"3000:3000\"\n    env_file: ./.env\n    environment:\n      - FIREBLOCKS_API_SECRET=/secrets/fireblocks_secret.key\n    restart: unless-stopped\n```\n\nThis setup ensures that:\n\nYour private key is available in the container at `/secrets/fireblocks_secret.key`.\n\nThe `.env` file with your Fireblocks credentials is available at `/app/.env`.\n\nThe `FIREBLOCKS_API_SECRET` environment variable tells the SDK where to find the key.\n\n4. Running the API Server\n   Build and run the container with:\n\n```bash\ndocker-compose up --build\n```\n\n5. Security Notes\n   Do not include your private key in the repo.\n   Only give read permissions (:ro) to the mounted secret.\n   Consider using secrets management solutions for production deployments.\n\n## 🛠️ Usage\n\n### SDK Usage Example\n\nSample usage via direct SDK in Node.js (see `/examples` for more):\n\n```ts\nimport { FbksXrpApiService } from \"./src/api/ApiService\";\nimport { TransactionType } from \"./src/pool/types\";\nimport { BasePath } from \"@fireblocks/ts-sdk\";\nimport dotenv from \"dotenv\";\n\ndotenv.config();\n\n(async () =\u003e {\n  const apiService = new FbksXrpApiService({\n    apiKey: process.env.FIREBLOCKS_API_KEY || \"\",\n    apiSecret: process.env.FIREBLOCKS_API_PATH_TO_SECRET || \"\",\n    assetId: process.env.FIREBLOCKS_ASSET_ID || \"XRP_TEST\",\n    basePath: (process.env.FIREBLOCKS_BASE_PATH as BasePath) || BasePath.US,\n  });\n\n  const params = {\n    sellAmount: \"10\",\n    buyAmount: {\n      currency: \"THT\",\n      issuer: \"rpbkpPF8PrPuMN8NgEVkCsJDCWwP9KePFq\",\n      value: \"2\",\n    },\n    flags: {\n      tfPassiveOffer: true,\n      tfSellOffer: true,\n    },\n    domainId:\n      \"ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890\",\n  };\n\n  const opts: ExecuteTransactionOpts = {\n    vaultAccountId: process.env.FIREBLOCKS_VAULT_ACCOUNT_ID || \"\",\n    transactionType: TransactionType.OFFER_CREATE,\n    params,\n  };\n\n  const res = await apiService.executeTransaction(opts);\n\n  if (\"result\" in res) {\n    console.log(`Tx submitted: ${res.result.hash}`);\n  } else {\n    console.log(`Transaction submitted with ID: ${res.id}`);\n  }\n\n  await apiService.shutdown();\n})();\n```\n\n\u003e See more SDK samples in `/examples/`.\n\n### Raw content validation support\n\nAny transaction created by the SDK (excluding `xrpTransfer()` that does not rely on Raw signing) includes the unhased transaction payload as an additional `extraParameters` key (`unhashedTxPayload`), this is passed to allow pre-signature validation by a callback handler instance connected to your Fireblocks API Co-Signer instance.\n\nIn the transaction object received by the callback handler, the `extraParameters` object will have this structure:\n\n```json\n{\n  \"rawMessageData\": {\n    \"messages\": [\n      {\n        \"content\": \"4147FCCCB874E67DDB05C3D353972EFA21DC0D18F6F0B3768C22AFDAAEEC10E7\"\n      }\n    ]\n  },\n  \"unhashedTxPayload\": {\n    \"Fee\": \"10\",\n    \"Amount\": {\n      \"value\": \"100\",\n      \"issuer\": \"rhsMZjNb4ehEHdfLbMCRBnwMr7XAnicnVS\",\n      \"currency\": \"FBX\"\n    },\n    \"Account\": \"rpbkpPF8PrPuMN8NgEVkCsJDCWwP9KePFq\",\n    \"Sequence\": 7855319,\n    \"Destination\": \"rfSeUdwJC4ejRZ3mNfdH7KMWPyGGx6UTmf\",\n    \"SigningPubKey\": \"03077CBD3FC5F7B9FC8364C83900A78659AF60D16C62DB2860C498C3593D29BA2D\",\n    \"TransactionType\": \"Payment\",\n    \"LastLedgerSequence\": 8224033\n  }\n}\n```\n\nUse the `unhashedTxPayload` parameter to validate the raw message (`content`) before signing it.\n\n### REST API Usage\n\n#### 1. Run API Server\n\n```bash\ndocker-compose up --build\n```\n\n#### 2. API Authentication\n\nAll requests require valid Fireblocks API credentials via environment parameters.\nNo additional API key/JWT is needed on REST endpoints.\n\n#### 3. Try Endpoints (cURL)\n\n**OfferCreate example:**\n\n```bash\ncurl -X POST http://localhost:3000/api/dex/offerCreate/\u003cvaultAccountId\u003e \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"sellAmount\": \"10\",\n    \"buyAmount\": {\n      \"currency\": \"THT\",\n      \"issuer\": \"rpbkpPF8PrPuMN8NgEVkCsJDCWwP9KePFq\",\n      \"value\": \"2\"\n    },\n    \"flags\": {\n      \"tfPassiveOffer\": true,\n      \"tfSellOffer\": true\n    },\n    \"domainId\":\n      \"ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF1234567890\",\n  }'\n```\n\n#### 4. Postman Collection\n\nImport [`Fireblocks-XRP-SDK-API.postman_collection.json`](https://github.com/fireblocks/fireblocks-xrp-sdk/blob/main/Fireblocks-XRP-SDK-API.postman_collection.json)\n_All REST API routes and sample payloads are included for testing._\n\n### 5. Success Response JSON Example\n\n```json\n{\n  \"api_version\": 2,\n  \"id\": 28,\n  \"result\": {\n    \"close_time_iso\": \"2025-06-18T18:32:21Z\",\n    \"ctid\": \"C07D2C9900000001\",\n    \"hash\": \"4B2FA0715A4DBBBBC64AEDB456EB66C5EB51622563E9844301221379BEE0A0B2\",\n    \"ledger_hash\": \"A9694DDCED235E2DCB12A83EF6635DD3ED6D3C6453382667684D8129A5C6E436\",\n    \"ledger_index\": 8203417,\n    \"meta\": {\n      \"AffectedNodes\": [\n        {\n          \"CreatedNode\": {\n            \"LedgerEntryType\": \"Offer\",\n            \"LedgerIndex\": \"99DABC072D601478026701338BC2B949EF8496E9EBEC2178CFFADC4E8DAB11C3\",\n            \"NewFields\": {\n              \"Account\": \"rNZxC1fL1qREWqu9N5A74nHWwqo39XoNYB\",\n              \"BookDirectory\": \"C0E0F7D521A20EE39BA81685BF4169312FF9FB83CFFB999D54071AFD498D0000\",\n              \"Flags\": 196608,\n              \"Sequence\": 7855642,\n              \"TakerGets\": \"10\",\n              \"TakerPays\": {\n                \"currency\": \"THT\",\n                \"issuer\": \"rpbkpPF8PrPuMN8NgEVkCsJDCWwP9KePFq\",\n                \"value\": \"2\"\n              }\n            }\n          }\n        },\n        {\n          \"ModifiedNode\": {\n            \"FinalFields\": {\n              \"Flags\": 0,\n              \"Owner\": \"rNZxC1fL1qREWqu9N5A74nHWwqo39XoNYB\",\n              \"RootIndex\": \"AAEC4ADFADE1BF6FB00855A846C68D52268D942F4E25EC2A87BDE6815A4FED0A\"\n            },\n            \"LedgerEntryType\": \"DirectoryNode\",\n            \"LedgerIndex\": \"AAEC4ADFADE1BF6FB00855A846C68D52268D942F4E25EC2A87BDE6815A4FED0A\",\n            \"PreviousTxnID\": \"F6B1A95D26D57322EC872B2C3D65518DC47430218827C3F0349388F963E27CCB\",\n            \"PreviousTxnLgrSeq\": 8167686\n          }\n        },\n        {\n          \"ModifiedNode\": {\n            \"FinalFields\": {\n              \"ExchangeRate\": \"54071afd498d0000\",\n              \"Flags\": 0,\n              \"RootIndex\": \"C0E0F7D521A20EE39BA81685BF4169312FF9FB83CFFB999D54071AFD498D0000\",\n              \"TakerGetsCurrency\": \"0000000000000000000000000000000000000000\",\n              \"TakerGetsIssuer\": \"0000000000000000000000000000000000000000\",\n              \"TakerPaysCurrency\": \"0000000000000000000000005448540000000000\",\n              \"TakerPaysIssuer\": \"118A2EE1CD3C489E36DDD301C7E702DC0D8DF53F\"\n            },\n            \"LedgerEntryType\": \"DirectoryNode\",\n            \"LedgerIndex\": \"C0E0F7D521A20EE39BA81685BF4169312FF9FB83CFFB999D54071AFD498D0000\",\n            \"PreviousTxnID\": \"F6B1A95D26D57322EC872B2C3D65518DC47430218827C3F0349388F963E27CCB\",\n            \"PreviousTxnLgrSeq\": 8167686\n          }\n        },\n        {\n          \"ModifiedNode\": {\n            \"FinalFields\": {\n              \"Account\": \"rNZxC1fL1qREWqu9N5A74nHWwqo39XoNYB\",\n              \"Balance\": \"40999850\",\n              \"Flags\": 0,\n              \"OwnerCount\": 4,\n              \"Sequence\": 7855643\n            },\n            \"LedgerEntryType\": \"AccountRoot\",\n            \"LedgerIndex\": \"E3D4BE3CCB2AF535B829037621B57F5B3914AC4ECED4B65D407386FB4938199B\",\n            \"PreviousFields\": {\n              \"Balance\": \"40999860\",\n              \"OwnerCount\": 3,\n              \"Sequence\": 7855642\n            },\n            \"PreviousTxnID\": \"7660C7BF2BDA0CC2EC15AFA3CDC5ECCBB7676AB20655D927C743FA4E8408E00F\",\n            \"PreviousTxnLgrSeq\": 8203373\n          }\n        }\n      ],\n      \"TransactionIndex\": 0,\n      \"TransactionResult\": \"tesSUCCESS\"\n    },\n    \"tx_json\": {\n      \"Account\": \"rNZxC1fL1qREWqu9N5A74nHWwqo39XoNYB\",\n      \"Fee\": \"10\",\n      \"Flags\": 589824,\n      \"LastLedgerSequence\": 8203434,\n      \"Sequence\": 7855642,\n      \"SigningPubKey\": \"031CD7DD2D580A62D45F2A180F04F39DC9222570A23E0F092E1D7C49E68B731FB4\",\n      \"TakerGets\": \"10\",\n      \"TakerPays\": {\n        \"currency\": \"THT\",\n        \"issuer\": \"rpbkpPF8PrPuMN8NgEVkCsJDCWwP9KePFq\",\n        \"value\": \"2\"\n      },\n      \"TransactionType\": \"OfferCreate\",\n      \"TxnSignature\": \"3045022100FD948DE8CC15EE77F6DB1FF47BD27B93422CE65CEDD320B82E7B06BAE253AA21022001B12BAC6ACBB65B8A6FDEF6E7E665128DD0BD98ED37463F9E41C1B659F27613\",\n      \"date\": 803586741,\n      \"ledger_index\": 8203417\n    },\n    \"validated\": true\n  },\n  \"type\": \"response\"\n}\n```\n\n---\n\n## 📚 API \u0026 Documentation Endpoints\n\nThe running API server exposes interactive documentation and SDK reference for easier integration and onboarding:\n\n| Purpose               | URL                               | Description                                               |\n| --------------------- | --------------------------------- | --------------------------------------------------------- |\n| **Swagger UI**        | `http://localhost:3000/api-docs`  | Interactive REST API explorer for all endpoints.          |\n| **TypeDoc Reference** | `http://localhost:3000/type-docs` | SDK Classes/Methods documentation (generated by TypeDoc). |\n\n\u003e Both URLs assume the default port `3000`—change if you modify your server port.\n\u003e The TypeDoc reference is also available [here](https://fireblocks.github.io/fireblocks-xrp-sdk/).\n\n**DEX Routes:**\n\n- `POST /api/dex/offerCreate/:vaultAccountId`\n- `POST /api/dex/offerCancel/:vaultAccountId`\n- `POST /api/dex/crossCurrencyPayment/:vaultAccountId`\n- `POST /api/dex/credentialCreate/:vaultAccountId`\n- `POST /api/dex/credentialAccept/:vaultAccountId`\n- `POST /api/dex/credentialDelete/:vaultAccountId`\n\n**Token Routes:**\n\n- `POST /api/token/tokenTransfer/:vaultAccountId`\n- `POST /api/token/accountSet/:vaultAccountId`\n- `POST /api/token/burnToken/:vaultAccountId`\n- `POST /api/token/clawback/:vaultAccountId`\n- `POST /api/token/freezeToken/:vaultAccountId`\n- `POST /api/token/trustSet/:vaultAccountId`\n- `POST /api/token/xrpTransfer/:vaultAccountId`\n\n**Each endpoint expects a JSON body and returns a transaction result.**\n_See Postman or `/examples/` for detailed payloads._\n\n### Error Handling\n\nAll errors return a JSON.\n\nBad request example (400):\n\n```json\n{\n  \"error\": \"Missing vault account ID\",\n  \"message\": \"Vault account Id is missing from the request URL\"\n}\n```\n\nNot found example (404):\n\n```json\n{\n  \"error\": \"Not Found\",\n  \"message\": \"Cannot POST /api/dex/offerCanc\"\n}\n```\n\n---\n\n## 🧪 Development \u0026 Contribution\n\n- **Run tests:**\n\n  ```bash\n  npm run test\n  ```\n\n- **CI/CD:**\n  The project uses GitHub Actions for lint, build, and tests.\n- **Contributions:**\n  PRs and issues are welcome!\n\n---\n\n## 🛡️ Security \u0026 Responsibility\n\n\u003e RAW signing is a powerful operation.\n\u003e Ensure your Fireblocks workspace is properly configured.\n\u003e **Fireblocks is not responsible for loss of funds caused by incorrect use of this SDK or API.**\n\n---\n\n## 📝 License\n\nMIT License\n\n---\n\n## 💬 Support\n\nFor setup help, troubleshooting, or feature requests, please contact the Fireblocks Professional Services team.\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffireblocks%2Ffireblocks-xrp-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffireblocks%2Ffireblocks-xrp-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffireblocks%2Ffireblocks-xrp-sdk/lists"}