From 6cd12cec8ab846c7ddaec661ff3e7368aff23ac4 Mon Sep 17 00:00:00 2001 From: collins-w Date: Tue, 19 May 2026 22:00:39 +0300 Subject: [PATCH] feat: add relayer version 1.5.0 docs --- .../1.5.x/api/buildSponsoredTransaction.mdx | 59 ++ content/relayer/1.5.x/api/callPlugin.mdx | 55 ++ content/relayer/1.5.x/api/callPluginGet.mdx | 42 + .../relayer/1.5.x/api/cancelTransaction.mdx | 15 + .../relayer/1.5.x/api/createNotification.mdx | 15 + content/relayer/1.5.x/api/createRelayer.mdx | 15 + content/relayer/1.5.x/api/createSigner.mdx | 15 + .../relayer/1.5.x/api/deleteNotification.mdx | 15 + .../1.5.x/api/deletePendingTransactions.mdx | 15 + content/relayer/1.5.x/api/deleteRelayer.mdx | 15 + content/relayer/1.5.x/api/deleteSigner.mdx | 15 + content/relayer/1.5.x/api/getNetwork.mdx | 15 + content/relayer/1.5.x/api/getNotification.mdx | 15 + content/relayer/1.5.x/api/getPlugin.mdx | 15 + content/relayer/1.5.x/api/getRelayer.mdx | 15 + .../relayer/1.5.x/api/getRelayerBalance.mdx | 15 + .../relayer/1.5.x/api/getRelayerStatus.mdx | 15 + content/relayer/1.5.x/api/getSigner.mdx | 15 + .../relayer/1.5.x/api/getTransactionById.mdx | 15 + .../1.5.x/api/getTransactionByNonce.mdx | 15 + content/relayer/1.5.x/api/health.mdx | 35 + content/relayer/1.5.x/api/index.mdx | 114 +++ content/relayer/1.5.x/api/listNetworks.mdx | 25 + .../relayer/1.5.x/api/listNotifications.mdx | 25 + content/relayer/1.5.x/api/listPlugins.mdx | 15 + content/relayer/1.5.x/api/listRelayers.mdx | 25 + content/relayer/1.5.x/api/listSigners.mdx | 25 + .../relayer/1.5.x/api/listTransactions.mdx | 15 + content/relayer/1.5.x/api/list_metrics.mdx | 33 + content/relayer/1.5.x/api/metric_detail.mdx | 38 + .../1.5.x/api/quoteSponsoredTransaction.mdx | 37 + content/relayer/1.5.x/api/readiness.mdx | 118 +++ .../relayer/1.5.x/api/replaceTransaction.mdx | 15 + content/relayer/1.5.x/api/rpc.mdx | 15 + content/relayer/1.5.x/api/scrape_metrics.mdx | 30 + content/relayer/1.5.x/api/sendTransaction.mdx | 15 + content/relayer/1.5.x/api/sign.mdx | 15 + content/relayer/1.5.x/api/signTransaction.mdx | 15 + content/relayer/1.5.x/api/signTypedData.mdx | 15 + content/relayer/1.5.x/api/updateNetwork.mdx | 19 + .../relayer/1.5.x/api/updateNotification.mdx | 15 + content/relayer/1.5.x/api/updatePlugin.mdx | 29 + content/relayer/1.5.x/api/updateRelayer.mdx | 15 + content/relayer/1.5.x/api/updateSigner.mdx | 15 + content/relayer/1.5.x/changelog.mdx | 867 ++++++++++++++++ content/relayer/1.5.x/configuration/index.mdx | 720 ++++++++++++++ .../relayer/1.5.x/configuration/network.mdx | 399 ++++++++ .../relayer/1.5.x/configuration/signers.mdx | 374 +++++++ .../relayer/1.5.x/configuration/storage.mdx | 197 ++++ content/relayer/1.5.x/evm.mdx | 322 ++++++ content/relayer/1.5.x/guides/index.mdx | 9 + .../1.5.x/guides/stellar-channels-guide.mdx | 232 +++++ .../stellar-sponsored-transactions-guide.mdx | 635 ++++++++++++ .../guides/stellar-x402-facilitator-guide.mdx | 340 +++++++ .../1.5.x/guides/zama-fhevm-counter-guide.mdx | 397 ++++++++ content/relayer/1.5.x/index.mdx | 350 +++++++ content/relayer/1.5.x/plugins/channels.mdx | 822 ++++++++++++++++ content/relayer/1.5.x/plugins/index.mdx | 923 ++++++++++++++++++ content/relayer/1.5.x/quickstart.mdx | 167 ++++ content/relayer/1.5.x/roadmap.mdx | 113 +++ content/relayer/1.5.x/solana.mdx | 349 +++++++ content/relayer/1.5.x/stellar.mdx | 562 +++++++++++ content/relayer/1.5.x/structure.mdx | 105 ++ content/relayer/1.5.x/zama-fhevm.mdx | 155 +++ content/relayer/latest-versions.js | 5 +- netlify.toml | 5 + src/lib/openapi.ts | 2 +- src/navigation/arbitrum-stylus.json | 104 +- src/navigation/ethereum-evm.json | 106 +- src/navigation/polkadot.json | 102 +- src/navigation/stellar.json | 118 +-- src/navigation/zama.json | 108 +- 72 files changed, 9445 insertions(+), 272 deletions(-) create mode 100644 content/relayer/1.5.x/api/buildSponsoredTransaction.mdx create mode 100644 content/relayer/1.5.x/api/callPlugin.mdx create mode 100644 content/relayer/1.5.x/api/callPluginGet.mdx create mode 100644 content/relayer/1.5.x/api/cancelTransaction.mdx create mode 100644 content/relayer/1.5.x/api/createNotification.mdx create mode 100644 content/relayer/1.5.x/api/createRelayer.mdx create mode 100644 content/relayer/1.5.x/api/createSigner.mdx create mode 100644 content/relayer/1.5.x/api/deleteNotification.mdx create mode 100644 content/relayer/1.5.x/api/deletePendingTransactions.mdx create mode 100644 content/relayer/1.5.x/api/deleteRelayer.mdx create mode 100644 content/relayer/1.5.x/api/deleteSigner.mdx create mode 100644 content/relayer/1.5.x/api/getNetwork.mdx create mode 100644 content/relayer/1.5.x/api/getNotification.mdx create mode 100644 content/relayer/1.5.x/api/getPlugin.mdx create mode 100644 content/relayer/1.5.x/api/getRelayer.mdx create mode 100644 content/relayer/1.5.x/api/getRelayerBalance.mdx create mode 100644 content/relayer/1.5.x/api/getRelayerStatus.mdx create mode 100644 content/relayer/1.5.x/api/getSigner.mdx create mode 100644 content/relayer/1.5.x/api/getTransactionById.mdx create mode 100644 content/relayer/1.5.x/api/getTransactionByNonce.mdx create mode 100644 content/relayer/1.5.x/api/health.mdx create mode 100644 content/relayer/1.5.x/api/index.mdx create mode 100644 content/relayer/1.5.x/api/listNetworks.mdx create mode 100644 content/relayer/1.5.x/api/listNotifications.mdx create mode 100644 content/relayer/1.5.x/api/listPlugins.mdx create mode 100644 content/relayer/1.5.x/api/listRelayers.mdx create mode 100644 content/relayer/1.5.x/api/listSigners.mdx create mode 100644 content/relayer/1.5.x/api/listTransactions.mdx create mode 100644 content/relayer/1.5.x/api/list_metrics.mdx create mode 100644 content/relayer/1.5.x/api/metric_detail.mdx create mode 100644 content/relayer/1.5.x/api/quoteSponsoredTransaction.mdx create mode 100644 content/relayer/1.5.x/api/readiness.mdx create mode 100644 content/relayer/1.5.x/api/replaceTransaction.mdx create mode 100644 content/relayer/1.5.x/api/rpc.mdx create mode 100644 content/relayer/1.5.x/api/scrape_metrics.mdx create mode 100644 content/relayer/1.5.x/api/sendTransaction.mdx create mode 100644 content/relayer/1.5.x/api/sign.mdx create mode 100644 content/relayer/1.5.x/api/signTransaction.mdx create mode 100644 content/relayer/1.5.x/api/signTypedData.mdx create mode 100644 content/relayer/1.5.x/api/updateNetwork.mdx create mode 100644 content/relayer/1.5.x/api/updateNotification.mdx create mode 100644 content/relayer/1.5.x/api/updatePlugin.mdx create mode 100644 content/relayer/1.5.x/api/updateRelayer.mdx create mode 100644 content/relayer/1.5.x/api/updateSigner.mdx create mode 100644 content/relayer/1.5.x/changelog.mdx create mode 100644 content/relayer/1.5.x/configuration/index.mdx create mode 100644 content/relayer/1.5.x/configuration/network.mdx create mode 100644 content/relayer/1.5.x/configuration/signers.mdx create mode 100644 content/relayer/1.5.x/configuration/storage.mdx create mode 100644 content/relayer/1.5.x/evm.mdx create mode 100644 content/relayer/1.5.x/guides/index.mdx create mode 100644 content/relayer/1.5.x/guides/stellar-channels-guide.mdx create mode 100644 content/relayer/1.5.x/guides/stellar-sponsored-transactions-guide.mdx create mode 100644 content/relayer/1.5.x/guides/stellar-x402-facilitator-guide.mdx create mode 100644 content/relayer/1.5.x/guides/zama-fhevm-counter-guide.mdx create mode 100644 content/relayer/1.5.x/index.mdx create mode 100644 content/relayer/1.5.x/plugins/channels.mdx create mode 100644 content/relayer/1.5.x/plugins/index.mdx create mode 100644 content/relayer/1.5.x/quickstart.mdx create mode 100644 content/relayer/1.5.x/roadmap.mdx create mode 100644 content/relayer/1.5.x/solana.mdx create mode 100644 content/relayer/1.5.x/stellar.mdx create mode 100644 content/relayer/1.5.x/structure.mdx create mode 100644 content/relayer/1.5.x/zama-fhevm.mdx diff --git a/content/relayer/1.5.x/api/buildSponsoredTransaction.mdx b/content/relayer/1.5.x/api/buildSponsoredTransaction.mdx new file mode 100644 index 00000000..676b5832 --- /dev/null +++ b/content/relayer/1.5.x/api/buildSponsoredTransaction.mdx @@ -0,0 +1,59 @@ +--- +title: Prepares a sponsored (gasless) transaction with fee payments. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/transactions/sponsored/build + toc: [] + structuredData: + headings: [] + contents: + - content: >- + This endpoint builds a transaction where the relayer will pay the + network fees on behalf of the user. + + The user pays fees in a token of their choice (e.g., USDC) instead of + the native network currency. + + + The endpoint accepts either a pre-built transaction XDR or a set of + operations to build a transaction from. + + It returns a prepared transaction that includes: + + - The transaction XDR (base64 encoded) ready for signing + + - The fee amount in both the fee token and native currency (stroops + for Stellar) + + - The fee token identifier + + - The transaction validity timestamp + + + After receiving the prepared transaction, the user must sign it and + submit it through the standard + + transaction submission endpoint. For Stellar, the transaction will be + wrapped in a fee-bump transaction + + where the relayer pays the network fees. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +This endpoint builds a transaction where the relayer will pay the network fees on behalf of the user. +The user pays fees in a token of their choice (e.g., USDC) instead of the native network currency. + +The endpoint accepts either a pre-built transaction XDR or a set of operations to build a transaction from. +It returns a prepared transaction that includes: +- The transaction XDR (base64 encoded) ready for signing +- The fee amount in both the fee token and native currency (stroops for Stellar) +- The fee token identifier +- The transaction validity timestamp + +After receiving the prepared transaction, the user must sign it and submit it through the standard +transaction submission endpoint. For Stellar, the transaction will be wrapped in a fee-bump transaction +where the relayer pays the network fees. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/callPlugin.mdx b/content/relayer/1.5.x/api/callPlugin.mdx new file mode 100644 index 00000000..461ec8ec --- /dev/null +++ b/content/relayer/1.5.x/api/callPlugin.mdx @@ -0,0 +1,55 @@ +--- +title: Execute a plugin with optional wildcard route routing +full: true +_openapi: + method: POST + route: /api/v1/plugins/{plugin_id}/call + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Logs and traces are only returned when the plugin is configured with + `emit_logs` / `emit_traces`. + + Plugin-provided errors are normalized into a consistent payload + (`code`, `details`) and a derived + + message so downstream clients receive a stable shape regardless of how + the handler threw. + + + The endpoint supports wildcard route routing, allowing plugins to + implement custom routing logic: + + - `/api/v1/plugins/{plugin_id}/call` - Default endpoint (route = "") + + - `/api/v1/plugins/{plugin_id}/call?route=/verify` - Custom route via + query parameter + + - `/api/v1/plugins/{plugin_id}/call/verify` - Custom route via URL + path (route = "/verify") + + + The route is passed to the plugin handler via the `context.route` + field. + + You can specify a custom route either by appending it to the URL path + or by using the `route` query parameter. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Logs and traces are only returned when the plugin is configured with `emit_logs` / `emit_traces`. +Plugin-provided errors are normalized into a consistent payload (`code`, `details`) and a derived +message so downstream clients receive a stable shape regardless of how the handler threw. + +The endpoint supports wildcard route routing, allowing plugins to implement custom routing logic: +- `/api/v1/plugins/{plugin_id}/call` - Default endpoint (route = "") +- `/api/v1/plugins/{plugin_id}/call?route=/verify` - Custom route via query parameter +- `/api/v1/plugins/{plugin_id}/call/verify` - Custom route via URL path (route = "/verify") + +The route is passed to the plugin handler via the `context.route` field. +You can specify a custom route either by appending it to the URL path or by using the `route` query parameter. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/callPluginGet.mdx b/content/relayer/1.5.x/api/callPluginGet.mdx new file mode 100644 index 00000000..66e531f4 --- /dev/null +++ b/content/relayer/1.5.x/api/callPluginGet.mdx @@ -0,0 +1,42 @@ +--- +title: Execute a plugin via GET (must be enabled per plugin) +full: true +_openapi: + method: GET + route: /api/v1/plugins/{plugin_id}/call + toc: [] + structuredData: + headings: [] + contents: + - content: >- + This endpoint is disabled by default. To enable it for a given plugin, + set + + `allow_get_invocation: true` in the plugin configuration. + + + When invoked via GET: + + - `params` is an empty object (`{}`) + + - query parameters are passed to the plugin handler via + `context.query` + + - wildcard route routing is supported the same way as POST (see + `doc_call_plugin`) + + - Use the `route` query parameter or append the route to the URL path +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +This endpoint is disabled by default. To enable it for a given plugin, set +`allow_get_invocation: true` in the plugin configuration. + +When invoked via GET: +- `params` is an empty object (`{}`) +- query parameters are passed to the plugin handler via `context.query` +- wildcard route routing is supported the same way as POST (see `doc_call_plugin`) +- Use the `route` query parameter or append the route to the URL path + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/cancelTransaction.mdx b/content/relayer/1.5.x/api/cancelTransaction.mdx new file mode 100644 index 00000000..f9386e94 --- /dev/null +++ b/content/relayer/1.5.x/api/cancelTransaction.mdx @@ -0,0 +1,15 @@ +--- +title: Cancels a specific transaction by its ID. +full: true +_openapi: + method: DELETE + route: /api/v1/relayers/{relayer_id}/transactions/{transaction_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/createNotification.mdx b/content/relayer/1.5.x/api/createNotification.mdx new file mode 100644 index 00000000..68cf6f88 --- /dev/null +++ b/content/relayer/1.5.x/api/createNotification.mdx @@ -0,0 +1,15 @@ +--- +title: Creates a new notification. +full: true +_openapi: + method: POST + route: /api/v1/notifications + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/createRelayer.mdx b/content/relayer/1.5.x/api/createRelayer.mdx new file mode 100644 index 00000000..5b3f3fac --- /dev/null +++ b/content/relayer/1.5.x/api/createRelayer.mdx @@ -0,0 +1,15 @@ +--- +title: Creates a new relayer. +full: true +_openapi: + method: POST + route: /api/v1/relayers + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/createSigner.mdx b/content/relayer/1.5.x/api/createSigner.mdx new file mode 100644 index 00000000..a6cf47b0 --- /dev/null +++ b/content/relayer/1.5.x/api/createSigner.mdx @@ -0,0 +1,15 @@ +--- +title: Creates a new signer. +full: true +_openapi: + method: POST + route: /api/v1/signers + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/deleteNotification.mdx b/content/relayer/1.5.x/api/deleteNotification.mdx new file mode 100644 index 00000000..37f0d840 --- /dev/null +++ b/content/relayer/1.5.x/api/deleteNotification.mdx @@ -0,0 +1,15 @@ +--- +title: Deletes a notification by ID. +full: true +_openapi: + method: DELETE + route: /api/v1/notifications/{notification_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/deletePendingTransactions.mdx b/content/relayer/1.5.x/api/deletePendingTransactions.mdx new file mode 100644 index 00000000..7bd50545 --- /dev/null +++ b/content/relayer/1.5.x/api/deletePendingTransactions.mdx @@ -0,0 +1,15 @@ +--- +title: Deletes all pending transactions for a specific relayer. +full: true +_openapi: + method: DELETE + route: /api/v1/relayers/{relayer_id}/transactions/pending + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/deleteRelayer.mdx b/content/relayer/1.5.x/api/deleteRelayer.mdx new file mode 100644 index 00000000..3746ac9d --- /dev/null +++ b/content/relayer/1.5.x/api/deleteRelayer.mdx @@ -0,0 +1,15 @@ +--- +title: Deletes a relayer by ID. +full: true +_openapi: + method: DELETE + route: /api/v1/relayers/{relayer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/deleteSigner.mdx b/content/relayer/1.5.x/api/deleteSigner.mdx new file mode 100644 index 00000000..7cb6fb8d --- /dev/null +++ b/content/relayer/1.5.x/api/deleteSigner.mdx @@ -0,0 +1,15 @@ +--- +title: Deletes a signer by ID. +full: true +_openapi: + method: DELETE + route: /api/v1/signers/{signer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getNetwork.mdx b/content/relayer/1.5.x/api/getNetwork.mdx new file mode 100644 index 00000000..1cd6e2be --- /dev/null +++ b/content/relayer/1.5.x/api/getNetwork.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves details of a specific network by ID. +full: true +_openapi: + method: GET + route: /api/v1/networks/{network_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getNotification.mdx b/content/relayer/1.5.x/api/getNotification.mdx new file mode 100644 index 00000000..73e6e6ba --- /dev/null +++ b/content/relayer/1.5.x/api/getNotification.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves details of a specific notification by ID. +full: true +_openapi: + method: GET + route: /api/v1/notifications/{notification_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getPlugin.mdx b/content/relayer/1.5.x/api/getPlugin.mdx new file mode 100644 index 00000000..ad9a588c --- /dev/null +++ b/content/relayer/1.5.x/api/getPlugin.mdx @@ -0,0 +1,15 @@ +--- +title: Get plugin by ID +full: true +_openapi: + method: GET + route: /api/v1/plugins/{plugin_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getRelayer.mdx b/content/relayer/1.5.x/api/getRelayer.mdx new file mode 100644 index 00000000..395b174a --- /dev/null +++ b/content/relayer/1.5.x/api/getRelayer.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves details of a specific relayer by ID. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getRelayerBalance.mdx b/content/relayer/1.5.x/api/getRelayerBalance.mdx new file mode 100644 index 00000000..f4b3eb6b --- /dev/null +++ b/content/relayer/1.5.x/api/getRelayerBalance.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves the balance of a specific relayer. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id}/balance + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getRelayerStatus.mdx b/content/relayer/1.5.x/api/getRelayerStatus.mdx new file mode 100644 index 00000000..917e0a99 --- /dev/null +++ b/content/relayer/1.5.x/api/getRelayerStatus.mdx @@ -0,0 +1,15 @@ +--- +title: Fetches the current status of a specific relayer. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id}/status + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getSigner.mdx b/content/relayer/1.5.x/api/getSigner.mdx new file mode 100644 index 00000000..e4d8eb5d --- /dev/null +++ b/content/relayer/1.5.x/api/getSigner.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves details of a specific signer by ID. +full: true +_openapi: + method: GET + route: /api/v1/signers/{signer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getTransactionById.mdx b/content/relayer/1.5.x/api/getTransactionById.mdx new file mode 100644 index 00000000..2147994f --- /dev/null +++ b/content/relayer/1.5.x/api/getTransactionById.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves a specific transaction by its ID. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id}/transactions/{transaction_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/getTransactionByNonce.mdx b/content/relayer/1.5.x/api/getTransactionByNonce.mdx new file mode 100644 index 00000000..aa43240b --- /dev/null +++ b/content/relayer/1.5.x/api/getTransactionByNonce.mdx @@ -0,0 +1,15 @@ +--- +title: Retrieves a transaction by its nonce value. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id}/transactions/by-nonce/{nonce} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/health.mdx b/content/relayer/1.5.x/api/health.mdx new file mode 100644 index 00000000..09e2874c --- /dev/null +++ b/content/relayer/1.5.x/api/health.mdx @@ -0,0 +1,35 @@ +--- +title: Health routes implementation +full: true +_openapi: + method: GET + route: /api/v1/health + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + + Handles the `/health` endpoint. + + + Returns an `HttpResponse` with a status of `200 OK` and a body of + `"OK"`. + + This endpoint is used for liveness probes in container orchestration + platforms. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file + +Handles the `/health` endpoint. + +Returns an `HttpResponse` with a status of `200 OK` and a body of `"OK"`. +This endpoint is used for liveness probes in container orchestration platforms. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/index.mdx b/content/relayer/1.5.x/api/index.mdx new file mode 100644 index 00000000..5d7b8fcb --- /dev/null +++ b/content/relayer/1.5.x/api/index.mdx @@ -0,0 +1,114 @@ +--- +title: Relayer API Reference +--- + +## Relayers + +### [List Relayers](/relayer/1.5.x/api/listRelayers) +Lists all relayers with pagination support + +### [Create Relayer](/relayer/1.5.x/api/createRelayer) +Creates a new relayer + +### [Get Relayer](/relayer/1.5.x/api/getRelayer) +Retrieves details of a specific relayer by ID + +### [Delete Relayer](/relayer/1.5.x/api/deleteRelayer) +Deletes a relayer by ID + +### [Update Relayer](/relayer/1.5.x/api/updateRelayer) +Updates a relayer's information + +### [Get Relayer Balance](/relayer/1.5.x/api/getRelayerBalance) +Retrieves the balance of a specific relayer + +### [RPC](/relayer/1.5.x/api/rpc) +Performs a JSON-RPC call using the specified relayer + +### [Sign](/relayer/1.5.x/api/sign) +Signs data using the specified relayer + +### [Sign Transaction](/relayer/1.5.x/api/signTransaction) +Signs a transaction using the specified relayer (Stellar only) + +### [Sign Typed Data](/relayer/1.5.x/api/signTypedData) +Signs typed data using the specified relayer + +### [Get Relayer Status](/relayer/1.5.x/api/getRelayerStatus) +Fetches the current status of a specific relayer + +### [Send Transaction](/relayer/1.5.x/api/sendTransaction) +Sends a transaction through the specified relayer + +### [List Transactions](/relayer/1.5.x/api/listTransactions) +Lists all transactions for a specific relayer with pagination + +### [Get Transaction by Nonce](/relayer/1.5.x/api/getTransactionByNonce) +Retrieves a transaction by its nonce value + +### [Delete Pending Transactions](/relayer/1.5.x/api/deletePendingTransactions) +Deletes all pending transactions for a specific relayer + +### [Get Transaction by ID](/relayer/1.5.x/api/getTransactionById) +Retrieves a specific transaction by its ID + +### [Replace Transaction](/relayer/1.5.x/api/replaceTransaction) +Replaces a specific transaction with a new one + +### [Cancel Transaction](/relayer/1.5.x/api/cancelTransaction) +Cancels a specific transaction by its ID + +## Plugins + +### [Call Plugin](/relayer/1.5.x/api/callPlugin) +Calls a plugin method + +## Notifications + +### [List Notifications](/relayer/1.5.x/api/listNotifications) +Lists all notifications with pagination support + +### [Create Notification](/relayer/1.5.x/api/createNotification) +Creates a new notification + +### [Get Notification](/relayer/1.5.x/api/getNotification) +Retrieves details of a specific notification by ID + +### [Delete Notification](/relayer/1.5.x/api/deleteNotification) +Deletes a notification by ID + +### [Update Notification](/relayer/1.5.x/api/updateNotification) +Updates an existing notification + +## Signers + +### [List Signers](/relayer/1.5.x/api/listSigners) +Lists all signers with pagination support + +### [Create Signer](/relayer/1.5.x/api/createSigner) +Creates a new signer + +### [Get Signer](/relayer/1.5.x/api/getSigner) +Retrieves details of a specific signer by ID + +### [Delete Signer](/relayer/1.5.x/api/deleteSigner) +Deletes a signer by ID + +### [Update Signer](/relayer/1.5.x/api/updateSigner) +Updates an existing signer + +## Metrics + +### [Scrape Metrics](/relayer/1.5.x/api/scrape_metrics) +Triggers an update of system metrics and returns the result in plain text format + +### [List Metrics](/relayer/1.5.x/api/list_metrics) +Returns a list of all available metric names in JSON format + +### [Metric Detail](/relayer/1.5.x/api/metric_detail) +Returns the details of a specific metric in plain text format + +## Health + +### [Health](/relayer/1.5.x/api/health) +Health routes implementation diff --git a/content/relayer/1.5.x/api/listNetworks.mdx b/content/relayer/1.5.x/api/listNetworks.mdx new file mode 100644 index 00000000..4a398438 --- /dev/null +++ b/content/relayer/1.5.x/api/listNetworks.mdx @@ -0,0 +1,25 @@ +--- +title: Network routes implementation +full: true +_openapi: + method: GET + route: /api/v1/networks + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + + Lists all networks with pagination support. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file + +Lists all networks with pagination support. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/listNotifications.mdx b/content/relayer/1.5.x/api/listNotifications.mdx new file mode 100644 index 00000000..3eebf16c --- /dev/null +++ b/content/relayer/1.5.x/api/listNotifications.mdx @@ -0,0 +1,25 @@ +--- +title: Notification routes implementation +full: true +_openapi: + method: GET + route: /api/v1/notifications + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + + Lists all notifications with pagination support. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file + +Lists all notifications with pagination support. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/listPlugins.mdx b/content/relayer/1.5.x/api/listPlugins.mdx new file mode 100644 index 00000000..52b79c70 --- /dev/null +++ b/content/relayer/1.5.x/api/listPlugins.mdx @@ -0,0 +1,15 @@ +--- +title: List plugins. +full: true +_openapi: + method: GET + route: /api/v1/plugins + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/listRelayers.mdx b/content/relayer/1.5.x/api/listRelayers.mdx new file mode 100644 index 00000000..c9606b10 --- /dev/null +++ b/content/relayer/1.5.x/api/listRelayers.mdx @@ -0,0 +1,25 @@ +--- +title: Relayer routes implementation +full: true +_openapi: + method: GET + route: /api/v1/relayers + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + + Lists all relayers with pagination support. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file + +Lists all relayers with pagination support. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/listSigners.mdx b/content/relayer/1.5.x/api/listSigners.mdx new file mode 100644 index 00000000..3487905c --- /dev/null +++ b/content/relayer/1.5.x/api/listSigners.mdx @@ -0,0 +1,25 @@ +--- +title: Signer routes implementation +full: true +_openapi: + method: GET + route: /api/v1/signers + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + + Lists all signers with pagination support. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file + +Lists all signers with pagination support. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/listTransactions.mdx b/content/relayer/1.5.x/api/listTransactions.mdx new file mode 100644 index 00000000..0a56fd88 --- /dev/null +++ b/content/relayer/1.5.x/api/listTransactions.mdx @@ -0,0 +1,15 @@ +--- +title: Lists all transactions for a specific relayer with pagination. +full: true +_openapi: + method: GET + route: /api/v1/relayers/{relayer_id}/transactions/ + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/list_metrics.mdx b/content/relayer/1.5.x/api/list_metrics.mdx new file mode 100644 index 00000000..da5464dc --- /dev/null +++ b/content/relayer/1.5.x/api/list_metrics.mdx @@ -0,0 +1,33 @@ +--- +title: Metrics routes implementation +full: true +_openapi: + method: GET + route: /metrics + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Note: OpenAPI documentation for these endpoints can be found in the + `openapi.rs` file + + Returns a list of all available metric names in JSON format. + + + # Returns + + + An `HttpResponse` containing a JSON array of metric names. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file +Returns a list of all available metric names in JSON format. + +# Returns + +An `HttpResponse` containing a JSON array of metric names. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/metric_detail.mdx b/content/relayer/1.5.x/api/metric_detail.mdx new file mode 100644 index 00000000..c20be66c --- /dev/null +++ b/content/relayer/1.5.x/api/metric_detail.mdx @@ -0,0 +1,38 @@ +--- +title: Returns the details of a specific metric in plain text format. +full: true +_openapi: + method: GET + route: /metrics/{metric_name} + toc: [] + structuredData: + headings: [] + contents: + - content: >- + # Parameters + + + - `path`: The name of the metric to retrieve details for. + + + # Returns + + + An `HttpResponse` containing the metric details in plain text, or a + 404 error if the metric is + + not found. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +# Parameters + +- `path`: The name of the metric to retrieve details for. + +# Returns + +An `HttpResponse` containing the metric details in plain text, or a 404 error if the metric is +not found. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/quoteSponsoredTransaction.mdx b/content/relayer/1.5.x/api/quoteSponsoredTransaction.mdx new file mode 100644 index 00000000..028d07aa --- /dev/null +++ b/content/relayer/1.5.x/api/quoteSponsoredTransaction.mdx @@ -0,0 +1,37 @@ +--- +title: Estimates fees for a sponsored (gasless) transaction. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/transactions/sponsored/quote + toc: [] + structuredData: + headings: [] + contents: + - content: >- + This endpoint provides fee estimation for transactions where the + relayer will pay the network fees + + on behalf of the user. The user pays fees in a token of their choice + (e.g., USDC) instead of the + + native network currency (e.g., XLM for Stellar). + + + The endpoint accepts either a pre-built transaction XDR or a set of + operations to build a transaction from. + + It returns the estimated fee amount in the specified fee token and the + conversion rate from the native currency. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +This endpoint provides fee estimation for transactions where the relayer will pay the network fees +on behalf of the user. The user pays fees in a token of their choice (e.g., USDC) instead of the +native network currency (e.g., XLM for Stellar). + +The endpoint accepts either a pre-built transaction XDR or a set of operations to build a transaction from. +It returns the estimated fee amount in the specified fee token and the conversion rate from the native currency. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/readiness.mdx b/content/relayer/1.5.x/api/readiness.mdx new file mode 100644 index 00000000..40b3a759 --- /dev/null +++ b/content/relayer/1.5.x/api/readiness.mdx @@ -0,0 +1,118 @@ +--- +title: Readiness endpoint that checks system resources, Redis, Queue, and plugins. +full: true +_openapi: + method: GET + route: /api/v1/ready + toc: [] + structuredData: + headings: [] + contents: + - content: >- + Returns 200 OK if the service is ready to accept traffic, or 503 + Service Unavailable if not. + + This endpoint is used for readiness probes in container orchestration + platforms like + + AWS ECS or Kubernetes. + + + ## Health Check Components + + + - **System**: File descriptor usage, CLOSE_WAIT socket count + + - **Redis**: Primary and reader pool connectivity + + - **Queue**: Queue's Redis connections (separate from app's Redis) + + - **Plugins**: Plugin pool health, circuit breaker state, and + connection metrics (if enabled) + + + ## Status Levels + + + - `healthy`: All components operational + + - `degraded`: Some components degraded but service can function (e.g., + reader pool down) + + - `unhealthy`: Critical components failed, service unavailable + + + ## Plugin Connection Metrics + + + When plugins are enabled, the following connection metrics are + exposed: + + + - `shared_socket_available_slots`: Number of additional concurrent + plugin executions that can start + + - `shared_socket_active_connections`: Current number of active plugin + execution connections + + - `shared_socket_registered_executions`: Number of plugin executions + currently registered (awaiting response) + + - `connection_pool_available_slots`: Available connections to the pool + server + + - `connection_pool_active_connections`: Active connections to the pool + server + + + These metrics help diagnose connection pool exhaustion and plugin + capacity issues. + + + ## Caching + + + Health check results are cached for 10 seconds to prevent excessive + load from frequent + + health checks. Multiple requests within the TTL return the same cached + response. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Returns 200 OK if the service is ready to accept traffic, or 503 Service Unavailable if not. +This endpoint is used for readiness probes in container orchestration platforms like +AWS ECS or Kubernetes. + +## Health Check Components + +- **System**: File descriptor usage, CLOSE_WAIT socket count +- **Redis**: Primary and reader pool connectivity +- **Queue**: Queue's Redis connections (separate from app's Redis) +- **Plugins**: Plugin pool health, circuit breaker state, and connection metrics (if enabled) + +## Status Levels + +- `healthy`: All components operational +- `degraded`: Some components degraded but service can function (e.g., reader pool down) +- `unhealthy`: Critical components failed, service unavailable + +## Plugin Connection Metrics + +When plugins are enabled, the following connection metrics are exposed: + +- `shared_socket_available_slots`: Number of additional concurrent plugin executions that can start +- `shared_socket_active_connections`: Current number of active plugin execution connections +- `shared_socket_registered_executions`: Number of plugin executions currently registered (awaiting response) +- `connection_pool_available_slots`: Available connections to the pool server +- `connection_pool_active_connections`: Active connections to the pool server + +These metrics help diagnose connection pool exhaustion and plugin capacity issues. + +## Caching + +Health check results are cached for 10 seconds to prevent excessive load from frequent +health checks. Multiple requests within the TTL return the same cached response. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/replaceTransaction.mdx b/content/relayer/1.5.x/api/replaceTransaction.mdx new file mode 100644 index 00000000..8e28e10b --- /dev/null +++ b/content/relayer/1.5.x/api/replaceTransaction.mdx @@ -0,0 +1,15 @@ +--- +title: Replaces a specific transaction with a new one. +full: true +_openapi: + method: PUT + route: /api/v1/relayers/{relayer_id}/transactions/{transaction_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/rpc.mdx b/content/relayer/1.5.x/api/rpc.mdx new file mode 100644 index 00000000..cdd2f992 --- /dev/null +++ b/content/relayer/1.5.x/api/rpc.mdx @@ -0,0 +1,15 @@ +--- +title: Performs a JSON-RPC call using the specified relayer. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/rpc + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/scrape_metrics.mdx b/content/relayer/1.5.x/api/scrape_metrics.mdx new file mode 100644 index 00000000..986fb545 --- /dev/null +++ b/content/relayer/1.5.x/api/scrape_metrics.mdx @@ -0,0 +1,30 @@ +--- +title: >- + Triggers an update of system metrics and returns the result in plain text + format. +full: true +_openapi: + method: GET + route: /debug/metrics/scrape + toc: [] + structuredData: + headings: [] + contents: + - content: >- + # Returns + + + An `HttpResponse` containing the updated metrics in plain text, or an + error message if the + + update fails. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +# Returns + +An `HttpResponse` containing the updated metrics in plain text, or an error message if the +update fails. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/sendTransaction.mdx b/content/relayer/1.5.x/api/sendTransaction.mdx new file mode 100644 index 00000000..64bfbdff --- /dev/null +++ b/content/relayer/1.5.x/api/sendTransaction.mdx @@ -0,0 +1,15 @@ +--- +title: Sends a transaction through the specified relayer. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/transactions + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/sign.mdx b/content/relayer/1.5.x/api/sign.mdx new file mode 100644 index 00000000..591452d9 --- /dev/null +++ b/content/relayer/1.5.x/api/sign.mdx @@ -0,0 +1,15 @@ +--- +title: Signs data using the specified relayer. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/sign + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/signTransaction.mdx b/content/relayer/1.5.x/api/signTransaction.mdx new file mode 100644 index 00000000..cb4ccf73 --- /dev/null +++ b/content/relayer/1.5.x/api/signTransaction.mdx @@ -0,0 +1,15 @@ +--- +title: Signs a transaction using the specified relayer (Stellar only). +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/sign-transaction + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/signTypedData.mdx b/content/relayer/1.5.x/api/signTypedData.mdx new file mode 100644 index 00000000..cac3b291 --- /dev/null +++ b/content/relayer/1.5.x/api/signTypedData.mdx @@ -0,0 +1,15 @@ +--- +title: Signs typed data using the specified relayer. +full: true +_openapi: + method: POST + route: /api/v1/relayers/{relayer_id}/sign-typed-data + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/updateNetwork.mdx b/content/relayer/1.5.x/api/updateNetwork.mdx new file mode 100644 index 00000000..43e56567 --- /dev/null +++ b/content/relayer/1.5.x/api/updateNetwork.mdx @@ -0,0 +1,19 @@ +--- +title: >- + Updates a network's configuration. + + Currently supports updating RPC URLs only. Can be extended to support other + fields. +full: true +_openapi: + method: PATCH + route: /api/v1/networks/{network_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/updateNotification.mdx b/content/relayer/1.5.x/api/updateNotification.mdx new file mode 100644 index 00000000..8cf969c7 --- /dev/null +++ b/content/relayer/1.5.x/api/updateNotification.mdx @@ -0,0 +1,15 @@ +--- +title: Updates an existing notification. +full: true +_openapi: + method: PATCH + route: /api/v1/notifications/{notification_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/updatePlugin.mdx b/content/relayer/1.5.x/api/updatePlugin.mdx new file mode 100644 index 00000000..643e8ea2 --- /dev/null +++ b/content/relayer/1.5.x/api/updatePlugin.mdx @@ -0,0 +1,29 @@ +--- +title: Update plugin configuration +full: true +_openapi: + method: PATCH + route: /api/v1/plugins/{plugin_id} + toc: [] + structuredData: + headings: [] + contents: + - content: |- + Updates mutable plugin fields such as timeout, emit_logs, emit_traces, + raw_response, allow_get_invocation, config, and forward_logs. + The plugin id and path cannot be changed after creation. + + All fields are optional - only the provided fields will be updated. + To clear the `config` field, pass `"config": null`. +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + +Updates mutable plugin fields such as timeout, emit_logs, emit_traces, +raw_response, allow_get_invocation, config, and forward_logs. +The plugin id and path cannot be changed after creation. + +All fields are optional - only the provided fields will be updated. +To clear the `config` field, pass `"config": null`. + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/updateRelayer.mdx b/content/relayer/1.5.x/api/updateRelayer.mdx new file mode 100644 index 00000000..699e8571 --- /dev/null +++ b/content/relayer/1.5.x/api/updateRelayer.mdx @@ -0,0 +1,15 @@ +--- +title: Updates a relayer's information based on the provided update request. +full: true +_openapi: + method: PATCH + route: /api/v1/relayers/{relayer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/api/updateSigner.mdx b/content/relayer/1.5.x/api/updateSigner.mdx new file mode 100644 index 00000000..14d73848 --- /dev/null +++ b/content/relayer/1.5.x/api/updateSigner.mdx @@ -0,0 +1,15 @@ +--- +title: Updates an existing signer. +full: true +_openapi: + method: PATCH + route: /api/v1/signers/{signer_id} + toc: [] + structuredData: + headings: [] + contents: [] +--- + +{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */} + + \ No newline at end of file diff --git a/content/relayer/1.5.x/changelog.mdx b/content/relayer/1.5.x/changelog.mdx new file mode 100644 index 00000000..30c9dac1 --- /dev/null +++ b/content/relayer/1.5.x/changelog.mdx @@ -0,0 +1,867 @@ +--- +title: Changelog +--- + + +# [v1.4.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v1.4.0) - 2026-02-20 + +## [1.4.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.3.0...v1.4.0) (2026-02-20) + + +### 🚀 Features + +* Add Arbitrum support ([#373](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/373)) ([7b5372b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b5372bf54fe26756ca5db6cb393e0d9d79ae621)) +* Add AWS KMS Ed25519 support ([#567](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/567)) ([d87d41b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d87d41bf4b819ac0bfd2c11dd1e7ac053fd7797f)) +* Add background job redis collections prefix support ([#484](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/484)) ([971ab9b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/971ab9b49c1397247a36d6daf54738249e854132)) +* add base models ([#5](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/5)) ([55db42b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/55db42b16d88e95ca8f6927e3b4d07c939e677c8)) +* Add Channels plugin documentation and update navigation ([#530](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/530)) ([cbb1fba](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/cbb1fba363ac4b82e85427d0edb0466c6cff6f7f)) +* Add channels plugin example ([#526](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/526)) ([6a107c6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a107c6ef7866011a39ac4011d520fc745b5ac86)) +* Add CLA assistant bot ([#130](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/130)) ([4ad5733](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4ad5733daadefe5e52bd617eaa47039677443745)) +* add directory structure and example ([d946c10](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d946c10fd96ee2d1ce2e373ba4ccfced31f985f9)) +* Add EIP-712 signing and KMS fixes ([#501](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/501)) ([23c9c7d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23c9c7d6f589fbcc540303c6800b38196750449f)) +* add evm intrinsic gas_limit validation ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* Add get_status method for EVM and Stellar ([#229](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/229)) ([e84217e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e84217e0fa941fcd580ad6b84ab6bfac939dd5f4)) +* add INTHEWILD.md ([#543](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/543)) ([2592dc1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2592dc13b2908c0e9d0f47312f1952b6e4484553)) +* Add key-value storage support for plugins ([#463](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/463)) ([dfb12e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dfb12e0128088eda36f827b9346348783e1d1651)) +* Add Launctube plugin example ([#414](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/414)) ([5bda763](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5bda7635f304923fcd4031f855009228eeefee4b)) +* Add logging improvements ([#28](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/28)) ([bb6751a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bb6751a4f868eb82787e7763a7995d3974ecfd49)) +* Add logic to resubmit transaction ([#102](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/102)) ([6c258b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6c258b625dc7edb1d028b771647ff25b12c2b07d)) +* Add metrics for failed and successful txs ([#637](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/637)) ([e770954](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e770954d4c07b8b634df7beb43362c44a64d28fe)) +* Add node support to environment ([#236](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/236)) ([3ab46f8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ab46f848e7e4c6dee2545d62dc646b33623d63d)) +* Add noop support and refactor status ([#134](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/134)) ([f0e3a17](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f0e3a177a536c53fe8eff834243d417bb673b744)) +* add optimism extra cost calculation ([#146](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/146)) ([b85e070](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b85e070074ecc0aa4fbd7d5dc3af6ca0d600220b)) +* Add optimism-based tag to networks ([#439](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/439)) ([101338d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/101338d843ceef854edc7863f25ec528db2d3f5e)) +* Add PEAQ network ([#465](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/465)) ([0c23016](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0c2301675b2fed1576d8ae7eb261f5faca1803c0)) +* Add plugin invoker service ([#290](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/290)) ([489ce02](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/489ce0285cd88a18b1616af94bfc970a4a674228)) +* Add plugin requestId support ([#471](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/471)) ([0296ed1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0296ed1b778dbd2139059fcf88015158d6ad16b0)) +* Add plugins call endpoint ([#279](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/279)) ([c278589](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c278589f4c6bf88be86788fdd9b68c2f166f5f33)) +* Add queue processing support ([#6](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/6)) ([3ebbac2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ebbac25f1ecb403dec7d090d39882a85227d883)) +* Add release workflow ([#148](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/148)) ([bd9a7e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bd9a7e91a300e6650b08f799aecea4478bb4b974)) +* Add SEI network ([#477](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/477)) ([9174be4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9174be4f4cb0db7c9dc1e54eef94a77cc55c94eb)) +* Add sign tx for evm local signer ([#65](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/65)) ([b17fb36](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b17fb3625677f1dbcf1ddf3963db13b9b88ca25e)) +* Add status check circuit breaker ([#623](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/623)) ([961bc68](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/961bc68278e5da89f25846d88f7618392af9750f)) +* Add status_reason field to transaction responses ([#369](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/369)) ([c489e5d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c489e5d39e3cec555caf92ac93266016c547b2bb)) +* Add Stellar account creation script ([#503](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/503)) ([0550c49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0550c49444be585c6d40c43514758f57604d818b)) +* Add Stellar Channels Guide documentation ([#544](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/544)) ([5c45c67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c45c67cc342e70e63f2115ccadcf3c47450e119)) +* Add stellar launchtube plugin ([#401](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/401)) ([801e2f7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/801e2f7efc8f0cb7eb54f545ce398e6ee24cf6b9)) +* Add support for feebumped tx ([#309](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/309)) ([b4efd2e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b4efd2e894fb6534b61a10c5f8872a73d923410c)) +* Add support for Japan Open Chain ([#464](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/464)) ([44aaad1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44aaad1d9f51e354992861282cadab4c51f3b1e5)) +* add support for relayer paused and system disabled state ([#13](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/13)) ([44968a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44968a29ec4f1cf1166c2ad726f2c9a1bac246c3)) +* Add support for stellar InvokeHostFunction transactions ([#284](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/284)) ([32ba63e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/32ba63e58e3dfc1359b7a5c9f61f9ff2a8b6c317)) +* Add support to plugin list endpoint ([#358](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/358)) ([6517af0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6517af0a753db41638b006fa2b896a3ccec0d4ef)) +* add the number requests to plugin metric ([#645](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/645)) ([fc97ddc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fc97ddc9183feb7c9e656fbacc95e00325908cf1)) +* add timeout_seconds to EVM relayer configuration ([#169](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/169)) ([6fd59bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd59bc0e5993d63608d47e7ba7825a027e26b99)) +* Add transaction status handling for stellar ([#223](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/223)) ([9496eb6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9496eb63514afb0bd29c731bebe86ffdcf393362)) +* Add wait API for plugin transactions ([#345](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/345)) ([6069af2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6069af256e6cfe8470244731d4bb444b87bd175f)) +* Add worldchain testnet support ([#137](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/137)) ([25751ef](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25751ef97b7b9fbe0c4b53fab5b762d1696f8c93)) +* Added resolve_plugin_path for script_path ([#340](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/340)) ([0b30739](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0b30739e51f5ef6c0b97c1da585d403496b2bbac)) +* Adding job tests ([#110](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/110)) ([4d2dd98](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4d2dd98efedacaded8d4ace118c43dbe25907278)) +* Adding Local node using Anvil ([#594](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/594)) ([4716987](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/47169872ef950937f8fd6a7df298b7bad2c53ff3)) +* Authentication improvements ([#456](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/456)) ([429e29e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/429e29e55a72e9d5c13a5ce6d7024edeb8d942ac)) +* Background queue connection improvements ([#640](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/640)) ([1fe278c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1fe278ccc0410650f63f453ff86d51b4ef3470f6)) +* Cleanup improvements ([#651](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/651)) ([34448a7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/34448a7b9f8f52397cb7a73912e00d52b286b2e8)) +* Create initial js plugins library ([#302](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/302)) ([98238e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/98238e9a6a30de8dba3bf8d308a82658e29de46f)) +* enabling it to listen on all interfaces - allows for easy docker config ([74a59da](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/74a59da79b314160baf35ec9750e372fbad0f360)) +* enabling it to listen on all interfaces - allows for easy docker config ([23f94c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23f94c07ce46254f7b80df77ce8c4fc59fb4eef6)) +* Enhance LaunchTube plugin configuration ([#473](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/473)) ([84bde73](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/84bde737b20cea48cb10ae575fe4f96515795243)) +* Enhance logging with requestIds for traceability ([#455](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/455)) ([25b453f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25b453f8c385e8abc4c5dc31fc0d9b9467ed3031)) +* Enhance Stellar tx handling with fee updates ([#368](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/368)) ([05617d7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/05617d7cb06ab378c2c2207f9d0a2e11a04cc472)) +* Enhance Stellar with concurrent transaction support ([#423](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/423)) ([7e7fb4f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e7fb4ffba95133c4eb983c9d8ef0b0b4bc0c786)) +* **evm:** Add AWS KMS signer support ([#287](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/287)) ([723a9a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/723a9a8d7e625dd3f52b2d678d0e1cd842053e06)) +* **evm:** add status_reason for failed on-chain transactions ([#522](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/522)) ([#659](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/659)) ([d81325d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d81325d38d4bc48b36ab854f23f859c304ad6a6a)) +* **evm:** Implement delete pending txs ([#289](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/289)) ([bc6f829](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc6f829e580d42359adebceeddaf38002390e10b)) +* **evm:** Implement json rpc endpoint ([#286](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/286)) ([91528aa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/91528aab82e3fa3cba08f63feb4ac9879aa8940e)) +* extract networks to json files ([#238](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/238)) ([5ac07b3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ac07b3c570485d7cdbc419a23f373867d7ebe81)) +* Fix fd issue ([#615](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/615)) ([ae411bd](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ae411bd773308b8ca4216f9456bfe40866ccd23c)) +* Forward plugin logs to Rust logs ([#589](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/589)) ([d250717](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d25071765bd7d8804f199adceb0383077df36106)) +* gas price cache ([#422](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/422)) ([6b838c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b838c5121e84bec4f50edf16ac5fc601d1fce3d)) +* handle non-retriable errors and provider health errors ([#233](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/233)) ([7add348](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7add348da4d06af5ebebcce78d856485e9894ac3)) +* Handle Stellar tx submission status ([#626](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/626)) ([#629](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/629)) ([4c30746](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4c307463a1767ff3d6e398446e32bb5e00646033)) +* implement balance validation in EVM ([#168](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/168)) ([27fe333](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/27fe333806c28c268af981f5377e188160c845b9)) +* Implement get_balance method for StellarRelayer ([#228](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/228)) ([d92c75f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d92c75fe7da1b02ddb7a38df32f98082474e4cd9)) +* implement network config deserializing ([#235](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/235)) ([6d537f9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6d537f9298626fefc0d5a45c311a95208e1c8ef5)) +* Implement network inheritance for configs ([#428](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/428)) ([818258a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/818258a7b2770523f869e812113b1b3079926360)) +* improve examples ([#119](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/119)) ([7e59aa6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e59aa64f75f3470807396b293e71cd68d3292d1)) +* Improve plugin error handling and response structure ([#480](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/480)) ([a9bd690](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a9bd6903ade06335511a25ada1cf0a25966590b3)) +* Improve plugin lock usage ([#638](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/638)) ([d52d03f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d52d03f863c2886b8278feb9aa30f2b1f6670379)) +* Improve ready route, expose more stats ([#632](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/632)) ([9447c19](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9447c19d9ca212453104993676fccdb2e6c60d53)) +* Improve Redis startup logic ([#120](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/120)) ([8618ecf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8618ecf00b4739891fe4ce98caf14f729face896)) +* Improve Redis startup logic ([#120](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/120)) ([8618ecf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8618ecf00b4739891fe4ce98caf14f729face896)) +* Improve request id tracing logic ([#656](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/656)) ([6dd1431](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6dd143178085ec3fcb2b953ecd0b78d3efdfa41a)) +* Improve tracing logs ([#639](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/639)) ([a2e2243](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a2e22433eacf9b74669a79c2c77ee1d95c0866fe)) +* Include method tag in solana rpc result ([#437](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/437)) ([53ad7b0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/53ad7b0c5fd0a9571a1d753c623818be6f4429d7)) +* Integrate Netlify with antora ([#74](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/74)) ([09e3d48](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/09e3d4894b54c58754b373da239e9d564df69aa9)) +* Local signing for stellar ([#178](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/178)) ([f69270a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f69270ade4c9a9239bba874ac74858c8e7375298)) +* Pass arbitrary payloads to script execution ([#312](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/312)) ([adecaf5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/adecaf5d73c3df9083c6a3fcf62ed669bc90b25c)) +* Plat 5744 implement an api key authentication mechanism ([#11](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/11)) ([8891887](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/88918872d51ab10632ec6d590689d52e59dfd640)) +* Plat 5768 setup metrics endpoint ([#50](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/50)) ([7c292a5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7c292a572a7aef8213969fc72cadca74f9016fe8)) +* Plat 6434 improve authorization header validation ([#122](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/122)) ([eed7c31](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/eed7c31e938c7b6ecaa82774ca5d3a508bb89281)) +* Plat-5749 implement basic webhook notifications service ([#12](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/12)) ([1b47b64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b47b64c318208eb7dc2ec6d62020fab30ccafbb)) +* Plat-5802 openapi sdk client ([#109](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/109)) ([1b4b681](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b4b681a3755f60e2934548a9666c60a4465dabb)) +* PLAT-6026 Imp cancel transaction ([#101](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/101)) ([1e5cc47](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1e5cc47bdc54acafeeefb60489db410b42722b0f)) +* PLAT-6026 Imp cancel transaction ([#101](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/101)) ([1e5cc47](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1e5cc47bdc54acafeeefb60489db410b42722b0f)) +* Plat-6118 implement logic for syncing relayer state upon service start ([#19](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/19)) ([2ba3629](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ba36292a0b8d0d67ddab42d2845a6a0d5f31e3a)) +* Plat-6153 add network definitions for Solana networks ([#26](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/26)) ([ff453d5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ff453d59724eeaa194ccf7f83993ce8d649f7432)) +* Plat-6154 add support for solana local signer ([#29](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/29)) ([40caead](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40caeadde5f08200410912b98943346971084163)) +* plat-6158 implement Solana rpc service ([#36](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/36)) ([8fb50a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fb50a833e7f9b1773dbe4ca1d77a9609a5d5ec1)) +* Plat-6159 extend relayer config file solana policies ([#38](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/38)) ([4f4602b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4602b754e71539937447c1743a7f069317598b)) +* Plat-6164 implement feeestimate rpc method ([#61](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/61)) ([43b016c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/43b016c4e5faa5ee1fedcdadccf3bc768962178e)) +* Plat-6165 implement transfertransaction rpc method ([#63](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/63)) ([c59a3b8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c59a3b8894c32470adf10770f4804e272aa829d3)) +* Plat-6167 implement signtransaction rpc method ([#57](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/57)) ([ad7a1ff](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ad7a1ffe41eb868f54737c1f1b44a52c6d02d172)) +* Plat-6169 implement getsupportedtokens rpc method ([#45](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/45)) ([3f91199](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3f9119981acd7f92618ba6ec12c3039563368202)) +* Plat-6170 add vault hosted signer support ([#99](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/99)) ([7a9491d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7a9491d4094fc21bc87551c68687b4f44f3edd18)) +* Plat-6207 implement trait abstraction relayer ([#43](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/43)) ([abeb7cf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/abeb7cfccc9e70b26ddd0d41d736352d57d6ade9)) +* plat-6215 add support for rpc failovers and retries ([#231](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/231)) ([ca6d24f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ca6d24f1bcdbb912795dcb1496519b49b5e81bf1)) +* Plat-6216 adding network symbol support ([#37](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/37)) ([21f798f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/21f798fc114de47ae0ed7e127e496bb50ca081a8)) +* Plat-6236 adding validation payload ([#42](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/42)) ([a5ff165](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a5ff165df14f48d47adee03e8e2c8ef5a899ff57)) +* Plat-6236 adding validation payload ([#42](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/42)) ([a5ff165](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a5ff165df14f48d47adee03e8e2c8ef5a899ff57)) +* Plat-6239 whitelist policy validation ([#44](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/44)) ([3adb45e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3adb45e17b8b23c70e09e422cfca051ebab266f1)) +* Plat-6239 whitelist policy validation ([#44](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/44)) ([3adb45e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3adb45e17b8b23c70e09e422cfca051ebab266f1)) +* Plat-6248 implementation dummy of legacy price ([#49](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/49)) ([6319d64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6319d64bf27fd75f5192165df885156ca91ea9f0)) +* Plat-6248 implementation dummy of legacy price ([#49](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/49)) ([6319d64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6319d64bf27fd75f5192165df885156ca91ea9f0)) +* Plat-6267 add utility script for generating local keystore files ([#69](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/69)) ([b5df7f6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b5df7f6b0450118c9123de46689fa115efcdec94)) +* Plat-6291 add webhook notifications for rpc methods ([#72](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/72)) ([2f35d81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2f35d81b3711cf2f87dbc6df31b9e0f90432164e)) +* Plat-6299 clean transaction response ([#76](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/76)) ([fc5dd05](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fc5dd05154bca4a1d740cef058bb797cd3f513a0)) +* Plat-6300 returning the balance of the relayer ([#78](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/78)) ([e0ce8e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e0ce8e04f3950c094c9af3e3413d61cd7162c8e7)) +* Plat-6300 returning the balance of the relayer ([#78](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/78)) ([e0ce8e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e0ce8e04f3950c094c9af3e3413d61cd7162c8e7)) +* Plat-6303 store solana submitted transactions to db and run status check logic ([#398](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/398)) ([e8420bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e8420bca02c20a53b02d9bedc8da1b7a784716dc)) +* Plat-6304 use Authorization header instead of x api key ([#94](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/94)) ([34e8a81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/34e8a813234ee6aaf2a6956f6dd45f82e47e7861)) +* Plat-6309 Fetching eip1559 prices ([#83](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/83)) ([68d574f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68d574fcb159ae3b6502167a9bcf34bb1a56ea7e)) +* Plat-6309 Fetching eip1559 prices ([#83](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/83)) ([68d574f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68d574fcb159ae3b6502167a9bcf34bb1a56ea7e)) +* plat-6340 store private keys securely in memory ([#104](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/104)) ([28c2fab](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/28c2fab84f3db6b9d971126cf917263da395c421)) +* PLAT-6350 - Sign EIP-1559 ([#98](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/98)) ([673e420](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/673e4202f9d98bfd02512090fa3daacfa40831fe)) +* PLAT-6350 - Sign EIP-1559 ([#98](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/98)) ([673e420](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/673e4202f9d98bfd02512090fa3daacfa40831fe)) +* PLAT-6374 EIP-1559 default if network support it and not explicit false ([#100](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/100)) ([c982dde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c982ddefeba93381ac7d2c5e09f616a60820b8b8)) +* PLAT-6374 EIP-1559 default if network support it and not explicit false ([#100](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/100)) ([c982dde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c982ddefeba93381ac7d2c5e09f616a60820b8b8)) +* PLAT-6416 Use generics transaction factory ([#105](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/105)) ([7b94662](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b946625af77c6aabd336d34646e9ae62ece3b6a)) +* plat-6433 add minimum length validations for config sensitive values ([#125](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/125)) ([31453c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/31453c5586ca4fef70e7ea0e2dcd0260a8a721a6)) +* Plat-6441 document upcoming work ([#131](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/131)) ([377a8bb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/377a8bb57ff5b3b23abb58d1c3378489c40218cf)) +* PLAT-6442 - Abstraction and unit tests relayer domain ([#117](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/117)) ([643194a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/643194acd9079ac3ac157e909f0b30199af8b0c9)) +* PLAT-6442 - Abstraction and unit tests relayer domain ([#117](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/117)) ([643194a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/643194acd9079ac3ac157e909f0b30199af8b0c9)) +* Plat-6457 Ignore utoipa ([#127](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/127)) ([234854a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/234854afbf30a9a94fa3365f60f035e53e068938)) +* Plat-6457 Ignore utoipa ([#127](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/127)) ([234854a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/234854afbf30a9a94fa3365f60f035e53e068938)) +* Plat-6459 create mermaid architecture diagram ([#126](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/126)) ([3de147b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3de147b907c28d3e9a8a38a2d6b8cd665253c423)) +* plat-6471 add Solana Token 2022 extensions support ([#166](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/166)) ([d35c506](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d35c506ea298a86897ede5702481403f839f2451)) +* plat-6476 Add support to collect transaction fee ([#135](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/135)) ([4f4a07b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4a07b2846d2980bbf09734602315702ded9dbe)) +* Plat-6479 added support for rpc custom endpoints ([#138](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/138)) ([3df3d49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3df3d49ec6a662698a90630811d717920b7cdf3b)) +* Plat-6521 add turnkey hosted signer support (evm, solana) ([#174](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/174)) ([b24688e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b24688ead4fe3015ca3b7c74e56f1906085a5aa3)) +* plat-6522 allow for the use of on chain defi to automatically swap spl ([#198](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/198)) ([dc9e2e2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dc9e2e2dd1d46830bc6479c1928a2e7ef7f91fb3)) +* plat-6571 add support for gcp signer ([#221](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/221)) ([0170fa1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0170fa12c3ecc64d1c48ed3a726358ed74d4596b)) +* Plat-6677 implement redis repositories for existing collections ([#350](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/350)) ([5fee731](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5fee731c5f19013f41a12a5b93af79d65bdf777e)) +* Plat-6679 implement startup logic to populate redis from config file ([#359](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/359)) ([5e1c0c8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5e1c0c825d3c1185a5c59360a2c857d79b46abba)) +* Plat-6681 expose crud api endpoints ([#365](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/365)) ([f3c3426](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f3c34266f3f035cd240105833ef4e67711cb0356)) +* Plat-6684 add support for transaction entries expiration ([#394](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/394)) ([6f6f765](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6f6f765556b2fc16764f8afe02ceedf268c26c13)) +* plat-6817 EVM add support for gas limit calculation ([#355](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/355)) ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* plat-6873 add storage documentation ([#395](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/395)) ([ffd4ed5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ffd4ed58d322bad63be500a084a0b082ac7b59d9)) +* Plugin performance improvements ([#606](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/606)) ([bfc7033](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bfc70335d6ed4250f77176bb399fc1582dd55dac)) +* Plugin routing support ([#587](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/587)) ([7ad8bee](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7ad8beeda185ef3e865ade834593879967762d5b)) +* Plugins improvements ([#410](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/410)) ([648a0f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/648a0f121a6308e8bde0e09010d2e0c83de5c6ec)) +* **polkadot:** Add Polkadot testnet and TLS 1.3 compatibility ([#525](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/525)) ([9a3780c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a3780c632b8016b322d70b5b1287b3b859165fa)) +* **polygon-zkevm:** Support for custom estimation methods ([#461](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/461)) ([1180d92](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1180d921da23d5b0d675c441a926600dc72d49bc)) +* Pricing validation on receiving payload EVM ([#59](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/59)) ([1206d42](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1206d4241dbda84bc861f501d322f6bd33234f0b)) +* Pricing validation on receiving payload EVM ([#59](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/59)) ([1206d42](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1206d4241dbda84bc861f501d322f6bd33234f0b)) +* Redis conn optimisations ([#630](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/630)) ([a2cd2c6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a2cd2c610016973ef6b3955eeba92bf91db52332)) +* Redis pool ([#609](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/609)) ([0350f61](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0350f617da2747dc373fefddb2248cd5e80f581c)) +* Relayer health check job ([#506](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/506)) ([de01f67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/de01f67e8ca2a30c5b5c99b98dc5bcc8c735ec34)) +* Relayer plugins - add support to plugins in configs ([#253](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/253)) ([6a14239](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a14239486900b2ef121b5de9e87410c412b65fe)) +* replace l2 extra fees with price overriders ([#460](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/460)) ([da2d90e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da2d90e958bb6f86d3227f251b1981672a9a4fb1)) +* **replace_tx:** Implement replace tx for evm ([#272](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/272)) ([b48e71f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b48e71f55fda03bea83e90255b0d180db704cb52)) +* RPC improvements ([#600](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/600)) ([0ac8b4c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0ac8b4cb5286c119113bd52bfdd8ff564c15e2fc)) +* RPC logic improvements ([#535](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/535)) ([68b2145](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68b214559a8957f79c40fe43477a2f2aebf6026a)) +* Scalability improvements ([#515](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/515)) ([471128d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/471128d51951bf6cb89dcd206ce821bd5146937c)) +* Set default network folder ([#313](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/313)) ([b28c99c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b28c99c43bedd921a55660622d845e63890e0d74)) +* Signer service ([#8](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/8)) ([4f85b7b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f85b7bf5b6aa83903ed8febdfe244d54e803642)) +* **signer:** Add GCP Signer to EVM ([#305](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/305)) ([a8817b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a8817b6c87c65731232d0a141338f3996aef2510)) +* **signer:** Implement CDP signing for evm+solana ([#457](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/457)) ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* Solana send transaction endpoint ([#521](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/521)) ([1ecb022](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1ecb022e2acbc928e3834451240477e32d9140b8)) +* Speed support transaction ([#62](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/62)) ([a572af6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a572af65ca4f664dce13e705eac37b56dee306fa)) +* SQS queue backend support ([#650](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/650)) ([2740c76](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2740c760b7d5fd32ae8af389b89efb4ee58715f0)) +* Stellar RPC config ([#213](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/213)) ([6fd75ea](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd75ea65bf1a945ba891f99d83b0cdacdf30014)) +* Stellar RPC service ([#183](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/183)) ([9943ffd](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9943ffd67a709df487264f50eccd03b06cc817d4)) +* Stellar soroban gas abstraction ([#642](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/642)) ([3a9b71c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3a9b71cd76c367c2a8bac1f05e280229345b8ace)) +* Stellar sponsored transactions (gas abstraction) ([#563](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/563)) ([9a38990](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a3899073cc3a73d6f2c3501b7af572d23cddba7)) +* Stellar transaction submission ([#199](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/199)) ([c6b72bf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c6b72bfba82c7fb9288c07e49bef04cf527d1245)) +* **stellar:** Add Google Cloud KMS signer support ([#481](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/481)) ([9886d84](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9886d842888cf5549f2dbcf488543c46011bb2fd)) +* **stellar:** Add simple resubmit logic ([#665](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/665)) ([8dc11a7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8dc11a735fcf05c4b0444972ee0c2193f4e3ad91)) +* **stellar:** Add Turnkey signer support ([#495](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/495)) ([2a8cdde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2a8cddec0625556fe46c4b6fa0194906ef4eea57)) +* **stellar:** Surface inner failure details ([#653](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/653)) ([9a23b17](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a23b17a75b41d83b97c0c24fe3ee0334928c6e3)) +* Store and return stellar soroban transaction result ([#590](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/590)) ([9370790](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9370790d4272f27edb3c269ed517572fe38107a2)) +* support for multiple custom RPCs with weighted configuration ([#182](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/182)) ([92ea5ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/92ea5ad324323b957fcbdce85c37517ec6f963ba)) +* support for retries and failovers in EVM Provider ([#197](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/197)) ([542f21a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/542f21a9346def9b7fe47e0a29a2bbd5ab2af349)) +* Support more frequent transaction cleanup ([#617](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/617)) ([c92fb2a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c92fb2a10aeb1d3e4b06f478744ef03ab5a3fa0e)) +* Support plugin timeouts ([#348](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/348)) ([0a1c51e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0a1c51e9fe540ba570af25146538992a26b9a8a0)) +* Transaction store optimisations ([#611](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/611)) ([00de860](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/00de86075ddd6326e5df359cad809de555f197f0)) +* Transactions list endpoint - sort improvements ([#573](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/573)) ([63433ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63433ad71208cbdb6bd1508d7df2c66b6839e81d)) +* Tx submissions and status mgmt ([#81](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/81)) ([9f829f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9f829f1c59c4221c9cf38c6cb1ff36351a348cd1)) +* Types introduced for plugin params and result ([#351](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/351)) ([dda83a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dda83a296fd5bd5bfca7f7902f4ca035e1bd8796)) +* Unify mempool detection ([#427](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/427)) ([63c04dc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c04dce27f8afb3a136e8b0400ca7853def19d8)) +* Update alloy package ([#430](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/430)) ([1725804](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1725804bcb534b58a23216de18386f1dad0485d7)) +* Update plugin system to support HTTP headers ([#566](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/566)) ([26e66a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/26e66a228d155917c87691774c234cbe346d2990)) +* Update Stellar network config and docs ([#380](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/380)) ([a4e1a0f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a4e1a0f38590f21c6d5e917a02fee4f6bef4f075)) +* Update transaction status to mined/expired ([#85](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/85)) ([8f5ee53](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f5ee53bbe64d55ccf8015a1c8d203cf5e391f08)) +* Use separate connection for queues ([#646](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/646)) ([badb70c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/badb70c845f00c284de4104652b366f116bc437e)) + + +### 🐛 Bug Fixes + +* Add launchtube env vars to docker-compose ([#425](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/425)) ([3879b88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3879b88932313e28b3a9b8dcaf97edfa944ccea7)) +* Add memo validation for InvokeHostFunction ([#294](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/294)) ([6bb4ffa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6bb4ffaf9ceb4a8daef29ec5878595cca7041300)) +* Adding coverage report for integration tests ([#599](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/599)) ([f350048](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f3500489da3ee8de3086943f4ea09e8bb3f4e86c)) +* Adding worker for removing redis queues metadata ([#620](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/620)) ([3ce6c19](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ce6c1902e8895129883b745129b83a7c046b35e)) +* **cdp:** Solana signing ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* change the ampersand to and, as as the shell interpret it ([#206](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/206)) ([d164d6a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d164d6a4d63fbf0acdfe1330cf25147e86280af8)) +* Changing base image to wolfi, added node and npm ([#266](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/266)) ([1181996](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1181996dac6da52f96e164b1c937828a3940d5b8)) +* CLA assistant ([#171](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/171)) ([b326a56](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b326a5680722e812263aab949003c214795fd2c0)) +* CLA labels ([#173](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/173)) ([e31405b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e31405b8cba9ffd2ff991d56444320ff3d069ad0)) +* clippy issues with deps ([#434](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/434)) ([632b93c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/632b93cea00a8c7ea7d16b21ccac7c545160a6ed)) +* Codecov changes and adjustments ([#113](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/113)) ([6e62dcf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6e62dcf212a917421c7559566136c018e17c38f5)) +* Config example file ([#285](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/285)) ([a020c6f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a020c6fcd6f9b638d955d5f2c99aa0e199d8bf6e)) +* Correct env var value in semgrep.yml ([#375](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/375)) ([2e98e21](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e98e2149135b97a62b90c302675379642fdf7b3)) +* Docker Compose ([#156](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/156)) ([6ca012f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6ca012fb9b50d5c2159c498679673cb27530fc3c)) +* Docker cross-platform build architecture mismatch ([#496](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/496)) ([5c4fdaa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c4fdaa99a796f0ad8a1540e4e8b784c425a12b5)) +* Docker readme file ([#339](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/339)) ([2db9933](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2db9933def061046cc3585a07249107a236ef98c)) +* docker-scan - chainguard issue ([#255](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/255)) ([c9ab94b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c9ab94bcee7b386a33b063504b3e6d2cf188d8b5)) +* Docs link ([#128](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/128)) ([8263828](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/82638284cf13a4da376624362f5353b57365302a)) +* Docs path for crate ([#129](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/129)) ([51cf556](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/51cf556411c9c1f79dbee7f4c3aa25df7fe2af49)) +* **docs:** replaced Monitor for Relayer ([2ff196b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ff196bf772668556210a895d4f83315e579577f)) +* Documentation name for antora ([#121](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/121)) ([63c36f5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c36f5393b1369a169c8617b20952bca30aef0c)) +* Encrypt google kms key ([#603](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/603)) ([e6faf5a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e6faf5aa92520f46d553ef36c381b733a869dcc9)) +* Encryption for webhook signing key ([#619](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/619)) ([df776b0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/df776b0c5394faaab90c4f0123dc43f22a70f14f)) +* Environment variables ([#124](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/124)) ([8d31131](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8d31131c087a6d0a64ae2dadecb5ae395ad1b575)) +* fix alloy error mapping and improve provider retry logic ([#540](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/540)) ([f181f15](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f181f15d161f34ce3b0be0a3a755a3b1542344e7)) +* Fix initialise relayer logic for persisted mode ([#485](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/485)) ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fix initialize relayer logic for persisted mode ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fix SDK breaking change for calling plugins method ([#607](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/607)) ([82117e1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/82117e160256f60148349ade730b85cd33846f0e)) +* Fix system cleanup redis usage ([#625](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/625)) ([f5e903f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f5e903f90dff197700f92ef81dd5e3ef7abeae90)) +* Fix the codecov yaml syntax ([#108](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/108)) ([ab9ab5b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab9ab5b0c9313d083cd47c71d7faade867c58deb)) +* Fixes solana allowed_tokens policy validation ([#467](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/467)) ([367a6e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/367a6e9b1eaf333ea288147c4349a93246407e16)) +* Flaky logging tests ([#89](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/89)) ([bc909cc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc909cc336613bb5a191c562632278bd3c270b09)) +* Google kms universe_domain security validation ([#610](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/610)) ([19f47dc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/19f47dcc86c3d0bfb47f24e91e75dba3bf9d81f6)) +* Implement stellar sequence sync and tx reset ([#367](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/367)) ([60b5deb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/60b5deb4915041d60a064cfac1a066406c339517)) +* Improve docker cargo caching ([#505](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/505)) ([da288c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da288c06e6636f1f3ea43fbc8040a575e1788f49)) +* Improve openapi spec for evm transaction response ([#468](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/468)) ([1c0ba6c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1c0ba6c8f2c4b94c9b223e58d8aad834ce512761)) +* Improve security for Redis container ([#598](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/598)) ([caa5803](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/caa5803fa5ad806115aa788afea44c5566d54ee2)) +* Improve security validations for RPC urls ([#605](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/605)) ([0f9b288](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0f9b288721225666a639ace895b976d18b5236c0)) +* Inheritance validation ([#374](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/374)) ([f8b921b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f8b921b4d6d85b8068428f1e34de121183a02179)) +* Limit transaction cleanup concurency ([#618](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/618)) ([5d3e267](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5d3e26744eddf9c6865defc3fb016d629215e787)) +* **logging:** preserve span context when output is warn-filtered ([#658](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/658)) ([c33635d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c33635de541a805b09674225a29995b9421b1eab)) +* Make plugins entry in configs optional ([#300](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/300)) ([f299779](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f299779318429677fd672d4a2433828971a1b62e)) +* Minor fixes in Plugin docs ([#325](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/325)) ([33bb6a1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/33bb6a1841f2e84723e49cc81258a930241dc735)) +* Missing libssl and workflow ([#155](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/155)) ([9de7133](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9de7133c2ba1768f4d989158f19c27444e522f9e)) +* Openapi spec version and update gh workflow ([#470](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/470)) ([afdc091](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/afdc091d8bafbc3900e8f909f62cfd490a757aac)) +* Optimism L1 data fee formula ([#513](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/513)) ([fca1c01](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fca1c01d321a7c3d61cf88513af187163db5d184)) +* place the gh release app token setup after docker build step ([#547](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/547)) ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* plae the gh release app token setup after docker build step ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* Plat 6286 write tests for metrics and middleware functions ([#70](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/70)) ([18124fb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/18124fbbfbc26f300648a7a4050ebf9be72465ac)) +* PLAT-6426 Increase test coverage ([#118](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/118)) ([1fa41f0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1fa41f0f225c9d515690738e960073396dce66ce)) +* PLAT-6478 create unit test for use of on relayers dotenv ([#139](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/139)) ([509e166](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/509e1664518823ef3844e52e818707f3371ddbff)) +* plat-6480 allow transfering wrapped sol tokens ([#132](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/132)) ([f04e66a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f04e66a568c877c2a4c5c5378fb6017c2e41d2c6)) +* Plat-6815 resubmission bug ([#353](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/353)) ([72ac174](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/72ac17471e3a0a6ac35e9a9bb9ff8fe5e8b94bf2)) +* plat-6888 aws kms signer issue ([#411](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/411)) ([3c12c88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3c12c88703c92526fe975eabba6ba0ffa9ca9c79)) +* Plugin result + adds tests for plugin ts lib ([#336](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/336)) ([b30246e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b30246e8922d3cb5bd3c5b92a7678f7591db5b97)) +* Recover stuck Stellar Sent transactions ([#612](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/612)) ([d3d5e32](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d3d5e3295136e39656b36b587392215efa8d5dab)) +* Relayer plugins format output ([#307](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/307)) ([8f25e5f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f25e5f55812e3d346c8bc0ff063cf07e2f0b753)) +* Release merge conflicts ([#163](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/163)) ([4cac422](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4cac4221817373a1ae7eff92db187dbae2f1665b)) +* remove the ci job dependant from the test job ([#222](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/222)) ([4056610](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40566108b66c701323145c2889ce0141b84714b8)) +* Replace automatic minor version bumps ([#315](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/315)) ([85784b4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/85784b486a9508429ae94373a7f3db13d78b39d6)) +* Replace tx request body ([#326](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/326)) ([a20c916](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a20c916b592891b7a2afafd2e62b32723fc05dc2)) +* Resolve Redis race condition and price calculator overflow ([#483](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/483)) ([3e6a2ca](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3e6a2ca2ff6d712ed173a08acb90066221b1109f)) +* Revert queue buffer changes ([#648](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/648)) ([e7ad9b8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e7ad9b858c69920bc359666365eeb54c8d27f2c4)) +* SBOM upload error ([#342](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/342)) ([1f9318e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1f9318e22cbe59ca03bc617b0986379574e5f770)) +* Semgrep CI integration ([#371](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/371)) ([6b9a6d2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b9a6d24e22b78743f16c566026b34f9912669ad)) +* Semgrep send metrics value ([#381](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/381)) ([315ccbc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/315ccbca9a48816fc6e0c8133301aa3e3186ff93)) +* Skip re-simulation for pre-simulated fee-bump ([#631](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/631)) ([582fba7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/582fba7e74d8b6930da85fea3747a22362c323a6)) +* Skip releases ([ccafcbe](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ccafcbe11bc6ea46dacb9c59be578abd45112ad3)) +* Solve issues with new solana_sdk version ([#324](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/324)) ([ab97253](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab972533259506bb21e22ec7f899a45d2fc97db5)) +* stellar tx data persistance ([#500](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/500)) ([d60a019](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d60a01958582aa5ab70b2dc369b1531d493db637)) +* Switch Redocly build to use standalone html file ([#291](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/291)) ([97a8698](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/97a86980bec6260920a469018fee0d3541d1a063)) +* syntax error in codeql.yml ([#385](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/385)) ([987fd33](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/987fd33566b66b2821490d0769a3c863a778c271)) +* Update base image digest ([#556](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/556)) ([fb114fa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fb114fa7acefcfeae653cf43f91cbf0272bf002f)) +* Update configs and dockerfiles in examples ([#298](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/298)) ([2e505ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e505ad827ab7544f7c6a3fdf4018b1e9428f1d6)) +* Update semgrep.yml ([#347](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/347)) ([5ffb803](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ffb8036ca6d3fb5a8cdb34fa5484e7732c842a1)) +* Update Stellar API docs to match implementation ([#292](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/292)) ([96d95e3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/96d95e35784c25f39afe626b56f11477fd213196)) +* Use rustls tls in stellar client ([#596](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/596)) ([459a301](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/459a301d554698929ee56d98720a041c5757675e)) +* Use unicode character for emoji ([#343](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/343)) ([784e89f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/784e89fae4ad2ddad037ddbbd0bec6df160e9a6a)) + +[Changes][v1.4.0] + + + +# [v1.3.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v1.3.0) - 2025-12-05 + +## [1.3.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.2.0...v1.3.0) (2025-12-05) + + +### 🚀 Features + +* Add Arbitrum support ([#373](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/373)) ([7b5372b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b5372bf54fe26756ca5db6cb393e0d9d79ae621)) +* Add AWS KMS Ed25519 support ([#567](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/567)) ([d87d41b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d87d41bf4b819ac0bfd2c11dd1e7ac053fd7797f)) +* Add background job redis collections prefix support ([#484](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/484)) ([971ab9b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/971ab9b49c1397247a36d6daf54738249e854132)) +* add base models ([#5](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/5)) ([55db42b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/55db42b16d88e95ca8f6927e3b4d07c939e677c8)) +* Add Channels plugin documentation and update navigation ([#530](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/530)) ([cbb1fba](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/cbb1fba363ac4b82e85427d0edb0466c6cff6f7f)) +* Add channels plugin example ([#526](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/526)) ([6a107c6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a107c6ef7866011a39ac4011d520fc745b5ac86)) +* Add CLA assistant bot ([#130](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/130)) ([4ad5733](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4ad5733daadefe5e52bd617eaa47039677443745)) +* add directory structure and example ([d946c10](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d946c10fd96ee2d1ce2e373ba4ccfced31f985f9)) +* Add EIP-712 signing and KMS fixes ([#501](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/501)) ([23c9c7d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23c9c7d6f589fbcc540303c6800b38196750449f)) +* add evm intrinsic gas_limit validation ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* Add get_status method for EVM and Stellar ([#229](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/229)) ([e84217e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e84217e0fa941fcd580ad6b84ab6bfac939dd5f4)) +* add INTHEWILD.md ([#543](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/543)) ([2592dc1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2592dc13b2908c0e9d0f47312f1952b6e4484553)) +* Add key-value storage support for plugins ([#463](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/463)) ([dfb12e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dfb12e0128088eda36f827b9346348783e1d1651)) +* Add Launctube plugin example ([#414](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/414)) ([5bda763](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5bda7635f304923fcd4031f855009228eeefee4b)) +* Add logging improvements ([#28](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/28)) ([bb6751a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bb6751a4f868eb82787e7763a7995d3974ecfd49)) +* Add logic to resubmit transaction ([#102](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/102)) ([6c258b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6c258b625dc7edb1d028b771647ff25b12c2b07d)) +* Add node support to environment ([#236](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/236)) ([3ab46f8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ab46f848e7e4c6dee2545d62dc646b33623d63d)) +* Add noop support and refactor status ([#134](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/134)) ([f0e3a17](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f0e3a177a536c53fe8eff834243d417bb673b744)) +* add optimism extra cost calculation ([#146](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/146)) ([b85e070](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b85e070074ecc0aa4fbd7d5dc3af6ca0d600220b)) +* Add optimism-based tag to networks ([#439](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/439)) ([101338d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/101338d843ceef854edc7863f25ec528db2d3f5e)) +* Add PEAQ network ([#465](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/465)) ([0c23016](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0c2301675b2fed1576d8ae7eb261f5faca1803c0)) +* Add plugin invoker service ([#290](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/290)) ([489ce02](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/489ce0285cd88a18b1616af94bfc970a4a674228)) +* Add plugin requestId support ([#471](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/471)) ([0296ed1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0296ed1b778dbd2139059fcf88015158d6ad16b0)) +* Add plugins call endpoint ([#279](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/279)) ([c278589](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c278589f4c6bf88be86788fdd9b68c2f166f5f33)) +* Add queue processing support ([#6](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/6)) ([3ebbac2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ebbac25f1ecb403dec7d090d39882a85227d883)) +* Add release workflow ([#148](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/148)) ([bd9a7e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bd9a7e91a300e6650b08f799aecea4478bb4b974)) +* Add SEI network ([#477](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/477)) ([9174be4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9174be4f4cb0db7c9dc1e54eef94a77cc55c94eb)) +* Add sign tx for evm local signer ([#65](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/65)) ([b17fb36](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b17fb3625677f1dbcf1ddf3963db13b9b88ca25e)) +* Add status_reason field to transaction responses ([#369](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/369)) ([c489e5d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c489e5d39e3cec555caf92ac93266016c547b2bb)) +* Add Stellar account creation script ([#503](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/503)) ([0550c49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0550c49444be585c6d40c43514758f57604d818b)) +* Add Stellar Channels Guide documentation ([#544](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/544)) ([5c45c67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c45c67cc342e70e63f2115ccadcf3c47450e119)) +* Add stellar launchtube plugin ([#401](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/401)) ([801e2f7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/801e2f7efc8f0cb7eb54f545ce398e6ee24cf6b9)) +* Add support for feebumped tx ([#309](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/309)) ([b4efd2e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b4efd2e894fb6534b61a10c5f8872a73d923410c)) +* Add support for Japan Open Chain ([#464](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/464)) ([44aaad1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44aaad1d9f51e354992861282cadab4c51f3b1e5)) +* add support for relayer paused and system disabled state ([#13](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/13)) ([44968a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44968a29ec4f1cf1166c2ad726f2c9a1bac246c3)) +* Add support for stellar InvokeHostFunction transactions ([#284](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/284)) ([32ba63e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/32ba63e58e3dfc1359b7a5c9f61f9ff2a8b6c317)) +* Add support to plugin list endpoint ([#358](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/358)) ([6517af0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6517af0a753db41638b006fa2b896a3ccec0d4ef)) +* add timeout_seconds to EVM relayer configuration ([#169](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/169)) ([6fd59bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd59bc0e5993d63608d47e7ba7825a027e26b99)) +* Add transaction status handling for stellar ([#223](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/223)) ([9496eb6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9496eb63514afb0bd29c731bebe86ffdcf393362)) +* Add wait API for plugin transactions ([#345](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/345)) ([6069af2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6069af256e6cfe8470244731d4bb444b87bd175f)) +* Add worldchain testnet support ([#137](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/137)) ([25751ef](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25751ef97b7b9fbe0c4b53fab5b762d1696f8c93)) +* Added resolve_plugin_path for script_path ([#340](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/340)) ([0b30739](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0b30739e51f5ef6c0b97c1da585d403496b2bbac)) +* Adding job tests ([#110](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/110)) ([4d2dd98](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4d2dd98efedacaded8d4ace118c43dbe25907278)) +* Authentication improvements ([#456](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/456)) ([429e29e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/429e29e55a72e9d5c13a5ce6d7024edeb8d942ac)) +* Create initial js plugins library ([#302](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/302)) ([98238e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/98238e9a6a30de8dba3bf8d308a82658e29de46f)) +* enabling it to listen on all interfaces - allows for easy docker config ([74a59da](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/74a59da79b314160baf35ec9750e372fbad0f360)) +* enabling it to listen on all interfaces - allows for easy docker config ([23f94c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23f94c07ce46254f7b80df77ce8c4fc59fb4eef6)) +* Enhance LaunchTube plugin configuration ([#473](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/473)) ([84bde73](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/84bde737b20cea48cb10ae575fe4f96515795243)) +* Enhance logging with requestIds for traceability ([#455](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/455)) ([25b453f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25b453f8c385e8abc4c5dc31fc0d9b9467ed3031)) +* Enhance Stellar tx handling with fee updates ([#368](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/368)) ([05617d7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/05617d7cb06ab378c2c2207f9d0a2e11a04cc472)) +* Enhance Stellar with concurrent transaction support ([#423](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/423)) ([7e7fb4f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e7fb4ffba95133c4eb983c9d8ef0b0b4bc0c786)) +* **evm:** Add AWS KMS signer support ([#287](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/287)) ([723a9a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/723a9a8d7e625dd3f52b2d678d0e1cd842053e06)) +* **evm:** Implement delete pending txs ([#289](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/289)) ([bc6f829](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc6f829e580d42359adebceeddaf38002390e10b)) +* **evm:** Implement json rpc endpoint ([#286](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/286)) ([91528aa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/91528aab82e3fa3cba08f63feb4ac9879aa8940e)) +* extract networks to json files ([#238](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/238)) ([5ac07b3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ac07b3c570485d7cdbc419a23f373867d7ebe81)) +* gas price cache ([#422](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/422)) ([6b838c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b838c5121e84bec4f50edf16ac5fc601d1fce3d)) +* handle non-retriable errors and provider health errors ([#233](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/233)) ([7add348](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7add348da4d06af5ebebcce78d856485e9894ac3)) +* implement balance validation in EVM ([#168](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/168)) ([27fe333](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/27fe333806c28c268af981f5377e188160c845b9)) +* Implement get_balance method for StellarRelayer ([#228](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/228)) ([d92c75f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d92c75fe7da1b02ddb7a38df32f98082474e4cd9)) +* implement network config deserializing ([#235](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/235)) ([6d537f9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6d537f9298626fefc0d5a45c311a95208e1c8ef5)) +* Implement network inheritance for configs ([#428](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/428)) ([818258a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/818258a7b2770523f869e812113b1b3079926360)) +* improve examples ([#119](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/119)) ([7e59aa6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e59aa64f75f3470807396b293e71cd68d3292d1)) +* Improve plugin error handling and response structure ([#480](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/480)) ([a9bd690](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a9bd6903ade06335511a25ada1cf0a25966590b3)) +* Improve Redis startup logic ([#120](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/120)) ([8618ecf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8618ecf00b4739891fe4ce98caf14f729face896)) +* Improve Redis startup logic ([#120](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/120)) ([8618ecf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8618ecf00b4739891fe4ce98caf14f729face896)) +* Include method tag in solana rpc result ([#437](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/437)) ([53ad7b0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/53ad7b0c5fd0a9571a1d753c623818be6f4429d7)) +* initial repo setup ([d8815b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d8815b6752931003536aa427370ca8fb1c57231c)) +* Integrate Netlify with antora ([#74](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/74)) ([09e3d48](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/09e3d4894b54c58754b373da239e9d564df69aa9)) +* Local signing for stellar ([#178](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/178)) ([f69270a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f69270ade4c9a9239bba874ac74858c8e7375298)) +* Pass arbitrary payloads to script execution ([#312](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/312)) ([adecaf5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/adecaf5d73c3df9083c6a3fcf62ed669bc90b25c)) +* Plat 5744 implement an api key authentication mechanism ([#11](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/11)) ([8891887](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/88918872d51ab10632ec6d590689d52e59dfd640)) +* Plat 5768 setup metrics endpoint ([#50](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/50)) ([7c292a5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7c292a572a7aef8213969fc72cadca74f9016fe8)) +* Plat 6434 improve authorization header validation ([#122](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/122)) ([eed7c31](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/eed7c31e938c7b6ecaa82774ca5d3a508bb89281)) +* Plat-5749 implement basic webhook notifications service ([#12](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/12)) ([1b47b64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b47b64c318208eb7dc2ec6d62020fab30ccafbb)) +* Plat-5802 openapi sdk client ([#109](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/109)) ([1b4b681](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b4b681a3755f60e2934548a9666c60a4465dabb)) +* PLAT-6026 Imp cancel transaction ([#101](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/101)) ([1e5cc47](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1e5cc47bdc54acafeeefb60489db410b42722b0f)) +* PLAT-6026 Imp cancel transaction ([#101](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/101)) ([1e5cc47](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1e5cc47bdc54acafeeefb60489db410b42722b0f)) +* Plat-6118 implement logic for syncing relayer state upon service start ([#19](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/19)) ([2ba3629](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ba36292a0b8d0d67ddab42d2845a6a0d5f31e3a)) +* Plat-6153 add network definitions for Solana networks ([#26](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/26)) ([ff453d5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ff453d59724eeaa194ccf7f83993ce8d649f7432)) +* Plat-6154 add support for solana local signer ([#29](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/29)) ([40caead](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40caeadde5f08200410912b98943346971084163)) +* plat-6158 implement Solana rpc service ([#36](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/36)) ([8fb50a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fb50a833e7f9b1773dbe4ca1d77a9609a5d5ec1)) +* Plat-6159 extend relayer config file solana policies ([#38](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/38)) ([4f4602b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4602b754e71539937447c1743a7f069317598b)) +* Plat-6164 implement feeestimate rpc method ([#61](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/61)) ([43b016c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/43b016c4e5faa5ee1fedcdadccf3bc768962178e)) +* Plat-6165 implement transfertransaction rpc method ([#63](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/63)) ([c59a3b8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c59a3b8894c32470adf10770f4804e272aa829d3)) +* Plat-6167 implement signtransaction rpc method ([#57](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/57)) ([ad7a1ff](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ad7a1ffe41eb868f54737c1f1b44a52c6d02d172)) +* Plat-6169 implement getsupportedtokens rpc method ([#45](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/45)) ([3f91199](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3f9119981acd7f92618ba6ec12c3039563368202)) +* Plat-6170 add vault hosted signer support ([#99](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/99)) ([7a9491d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7a9491d4094fc21bc87551c68687b4f44f3edd18)) +* Plat-6207 implement trait abstraction relayer ([#43](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/43)) ([abeb7cf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/abeb7cfccc9e70b26ddd0d41d736352d57d6ade9)) +* plat-6215 add support for rpc failovers and retries ([#231](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/231)) ([ca6d24f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ca6d24f1bcdbb912795dcb1496519b49b5e81bf1)) +* Plat-6216 adding network symbol support ([#37](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/37)) ([21f798f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/21f798fc114de47ae0ed7e127e496bb50ca081a8)) +* Plat-6236 adding validation payload ([#42](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/42)) ([a5ff165](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a5ff165df14f48d47adee03e8e2c8ef5a899ff57)) +* Plat-6236 adding validation payload ([#42](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/42)) ([a5ff165](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a5ff165df14f48d47adee03e8e2c8ef5a899ff57)) +* Plat-6239 whitelist policy validation ([#44](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/44)) ([3adb45e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3adb45e17b8b23c70e09e422cfca051ebab266f1)) +* Plat-6239 whitelist policy validation ([#44](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/44)) ([3adb45e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3adb45e17b8b23c70e09e422cfca051ebab266f1)) +* Plat-6248 implementation dummy of legacy price ([#49](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/49)) ([6319d64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6319d64bf27fd75f5192165df885156ca91ea9f0)) +* Plat-6248 implementation dummy of legacy price ([#49](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/49)) ([6319d64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6319d64bf27fd75f5192165df885156ca91ea9f0)) +* Plat-6267 add utility script for generating local keystore files ([#69](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/69)) ([b5df7f6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b5df7f6b0450118c9123de46689fa115efcdec94)) +* Plat-6291 add webhook notifications for rpc methods ([#72](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/72)) ([2f35d81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2f35d81b3711cf2f87dbc6df31b9e0f90432164e)) +* Plat-6299 clean transaction response ([#76](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/76)) ([fc5dd05](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fc5dd05154bca4a1d740cef058bb797cd3f513a0)) +* Plat-6300 returning the balance of the relayer ([#78](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/78)) ([e0ce8e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e0ce8e04f3950c094c9af3e3413d61cd7162c8e7)) +* Plat-6300 returning the balance of the relayer ([#78](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/78)) ([e0ce8e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e0ce8e04f3950c094c9af3e3413d61cd7162c8e7)) +* Plat-6303 store solana submitted transactions to db and run status check logic ([#398](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/398)) ([e8420bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e8420bca02c20a53b02d9bedc8da1b7a784716dc)) +* Plat-6304 use Authorization header instead of x api key ([#94](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/94)) ([34e8a81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/34e8a813234ee6aaf2a6956f6dd45f82e47e7861)) +* Plat-6309 Fetching eip1559 prices ([#83](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/83)) ([68d574f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68d574fcb159ae3b6502167a9bcf34bb1a56ea7e)) +* Plat-6309 Fetching eip1559 prices ([#83](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/83)) ([68d574f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68d574fcb159ae3b6502167a9bcf34bb1a56ea7e)) +* plat-6340 store private keys securely in memory ([#104](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/104)) ([28c2fab](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/28c2fab84f3db6b9d971126cf917263da395c421)) +* PLAT-6350 - Sign EIP-1559 ([#98](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/98)) ([673e420](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/673e4202f9d98bfd02512090fa3daacfa40831fe)) +* PLAT-6350 - Sign EIP-1559 ([#98](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/98)) ([673e420](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/673e4202f9d98bfd02512090fa3daacfa40831fe)) +* PLAT-6374 EIP-1559 default if network support it and not explicit false ([#100](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/100)) ([c982dde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c982ddefeba93381ac7d2c5e09f616a60820b8b8)) +* PLAT-6374 EIP-1559 default if network support it and not explicit false ([#100](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/100)) ([c982dde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c982ddefeba93381ac7d2c5e09f616a60820b8b8)) +* PLAT-6416 Use generics transaction factory ([#105](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/105)) ([7b94662](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b946625af77c6aabd336d34646e9ae62ece3b6a)) +* plat-6433 add minimum length validations for config sensitive values ([#125](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/125)) ([31453c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/31453c5586ca4fef70e7ea0e2dcd0260a8a721a6)) +* Plat-6441 document upcoming work ([#131](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/131)) ([377a8bb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/377a8bb57ff5b3b23abb58d1c3378489c40218cf)) +* PLAT-6442 - Abstraction and unit tests relayer domain ([#117](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/117)) ([643194a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/643194acd9079ac3ac157e909f0b30199af8b0c9)) +* PLAT-6442 - Abstraction and unit tests relayer domain ([#117](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/117)) ([643194a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/643194acd9079ac3ac157e909f0b30199af8b0c9)) +* Plat-6457 Ignore utoipa ([#127](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/127)) ([234854a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/234854afbf30a9a94fa3365f60f035e53e068938)) +* Plat-6457 Ignore utoipa ([#127](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/127)) ([234854a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/234854afbf30a9a94fa3365f60f035e53e068938)) +* Plat-6459 create mermaid architecture diagram ([#126](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/126)) ([3de147b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3de147b907c28d3e9a8a38a2d6b8cd665253c423)) +* plat-6471 add Solana Token 2022 extensions support ([#166](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/166)) ([d35c506](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d35c506ea298a86897ede5702481403f839f2451)) +* plat-6476 Add support to collect transaction fee ([#135](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/135)) ([4f4a07b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4a07b2846d2980bbf09734602315702ded9dbe)) +* Plat-6479 added support for rpc custom endpoints ([#138](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/138)) ([3df3d49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3df3d49ec6a662698a90630811d717920b7cdf3b)) +* Plat-6521 add turnkey hosted signer support (evm, solana) ([#174](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/174)) ([b24688e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b24688ead4fe3015ca3b7c74e56f1906085a5aa3)) +* plat-6522 allow for the use of on chain defi to automatically swap spl ([#198](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/198)) ([dc9e2e2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dc9e2e2dd1d46830bc6479c1928a2e7ef7f91fb3)) +* plat-6571 add support for gcp signer ([#221](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/221)) ([0170fa1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0170fa12c3ecc64d1c48ed3a726358ed74d4596b)) +* Plat-6677 implement redis repositories for existing collections ([#350](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/350)) ([5fee731](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5fee731c5f19013f41a12a5b93af79d65bdf777e)) +* Plat-6679 implement startup logic to populate redis from config file ([#359](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/359)) ([5e1c0c8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5e1c0c825d3c1185a5c59360a2c857d79b46abba)) +* Plat-6681 expose crud api endpoints ([#365](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/365)) ([f3c3426](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f3c34266f3f035cd240105833ef4e67711cb0356)) +* Plat-6684 add support for transaction entries expiration ([#394](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/394)) ([6f6f765](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6f6f765556b2fc16764f8afe02ceedf268c26c13)) +* plat-6817 EVM add support for gas limit calculation ([#355](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/355)) ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* plat-6873 add storage documentation ([#395](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/395)) ([ffd4ed5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ffd4ed58d322bad63be500a084a0b082ac7b59d9)) +* Plugins improvements ([#410](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/410)) ([648a0f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/648a0f121a6308e8bde0e09010d2e0c83de5c6ec)) +* **polkadot:** Add Polkadot testnet and TLS 1.3 compatibility ([#525](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/525)) ([9a3780c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a3780c632b8016b322d70b5b1287b3b859165fa)) +* **polygon-zkevm:** Support for custom estimation methods ([#461](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/461)) ([1180d92](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1180d921da23d5b0d675c441a926600dc72d49bc)) +* Pricing validation on receiving payload EVM ([#59](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/59)) ([1206d42](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1206d4241dbda84bc861f501d322f6bd33234f0b)) +* Pricing validation on receiving payload EVM ([#59](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/59)) ([1206d42](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1206d4241dbda84bc861f501d322f6bd33234f0b)) +* Relayer health check job ([#506](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/506)) ([de01f67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/de01f67e8ca2a30c5b5c99b98dc5bcc8c735ec34)) +* Relayer plugins - add support to plugins in configs ([#253](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/253)) ([6a14239](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a14239486900b2ef121b5de9e87410c412b65fe)) +* replace l2 extra fees with price overriders ([#460](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/460)) ([da2d90e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da2d90e958bb6f86d3227f251b1981672a9a4fb1)) +* **replace_tx:** Implement replace tx for evm ([#272](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/272)) ([b48e71f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b48e71f55fda03bea83e90255b0d180db704cb52)) +* RPC logic improvements ([#535](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/535)) ([68b2145](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68b214559a8957f79c40fe43477a2f2aebf6026a)) +* Scalability improvements ([#515](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/515)) ([471128d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/471128d51951bf6cb89dcd206ce821bd5146937c)) +* Set default network folder ([#313](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/313)) ([b28c99c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b28c99c43bedd921a55660622d845e63890e0d74)) +* Signer service ([#8](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/8)) ([4f85b7b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f85b7bf5b6aa83903ed8febdfe244d54e803642)) +* **signer:** Add GCP Signer to EVM ([#305](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/305)) ([a8817b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a8817b6c87c65731232d0a141338f3996aef2510)) +* **signer:** Implement CDP signing for evm+solana ([#457](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/457)) ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* Solana send transaction endpoint ([#521](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/521)) ([1ecb022](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1ecb022e2acbc928e3834451240477e32d9140b8)) +* Speed support transaction ([#62](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/62)) ([a572af6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a572af65ca4f664dce13e705eac37b56dee306fa)) +* Stellar RPC config ([#213](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/213)) ([6fd75ea](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd75ea65bf1a945ba891f99d83b0cdacdf30014)) +* Stellar RPC service ([#183](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/183)) ([9943ffd](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9943ffd67a709df487264f50eccd03b06cc817d4)) +* Stellar sponsored transactions (gas abstraction) ([#563](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/563)) ([9a38990](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a3899073cc3a73d6f2c3501b7af572d23cddba7)) +* Stellar transaction submission ([#199](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/199)) ([c6b72bf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c6b72bfba82c7fb9288c07e49bef04cf527d1245)) +* **stellar:** Add Google Cloud KMS signer support ([#481](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/481)) ([9886d84](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9886d842888cf5549f2dbcf488543c46011bb2fd)) +* **stellar:** Add Turnkey signer support ([#495](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/495)) ([2a8cdde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2a8cddec0625556fe46c4b6fa0194906ef4eea57)) +* support for multiple custom RPCs with weighted configuration ([#182](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/182)) ([92ea5ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/92ea5ad324323b957fcbdce85c37517ec6f963ba)) +* support for retries and failovers in EVM Provider ([#197](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/197)) ([542f21a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/542f21a9346def9b7fe47e0a29a2bbd5ab2af349)) +* Support plugin timeouts ([#348](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/348)) ([0a1c51e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0a1c51e9fe540ba570af25146538992a26b9a8a0)) +* Transactions list endpoint - sort improvements ([#573](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/573)) ([63433ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63433ad71208cbdb6bd1508d7df2c66b6839e81d)) +* Tx submissions and status mgmt ([#81](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/81)) ([9f829f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9f829f1c59c4221c9cf38c6cb1ff36351a348cd1)) +* Types introduced for plugin params and result ([#351](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/351)) ([dda83a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dda83a296fd5bd5bfca7f7902f4ca035e1bd8796)) +* Unify mempool detection ([#427](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/427)) ([63c04dc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c04dce27f8afb3a136e8b0400ca7853def19d8)) +* Update alloy package ([#430](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/430)) ([1725804](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1725804bcb534b58a23216de18386f1dad0485d7)) +* Update plugin system to support HTTP headers ([#566](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/566)) ([26e66a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/26e66a228d155917c87691774c234cbe346d2990)) +* Update Stellar network config and docs ([#380](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/380)) ([a4e1a0f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a4e1a0f38590f21c6d5e917a02fee4f6bef4f075)) +* Update transaction status to mined/expired ([#85](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/85)) ([8f5ee53](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f5ee53bbe64d55ccf8015a1c8d203cf5e391f08)) + + +### 🐛 Bug Fixes + +* Add launchtube env vars to docker-compose ([#425](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/425)) ([3879b88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3879b88932313e28b3a9b8dcaf97edfa944ccea7)) +* Add memo validation for InvokeHostFunction ([#294](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/294)) ([6bb4ffa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6bb4ffaf9ceb4a8daef29ec5878595cca7041300)) +* **cdp:** Solana signing ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* change the ampersand to and, as as the shell interpret it ([#206](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/206)) ([d164d6a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d164d6a4d63fbf0acdfe1330cf25147e86280af8)) +* Changing base image to wolfi, added node and npm ([#266](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/266)) ([1181996](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1181996dac6da52f96e164b1c937828a3940d5b8)) +* CLA assistant ([#171](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/171)) ([b326a56](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b326a5680722e812263aab949003c214795fd2c0)) +* CLA labels ([#173](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/173)) ([e31405b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e31405b8cba9ffd2ff991d56444320ff3d069ad0)) +* clippy issues with deps ([#434](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/434)) ([632b93c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/632b93cea00a8c7ea7d16b21ccac7c545160a6ed)) +* Codecov changes and adjustments ([#113](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/113)) ([6e62dcf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6e62dcf212a917421c7559566136c018e17c38f5)) +* Config example file ([#285](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/285)) ([a020c6f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a020c6fcd6f9b638d955d5f2c99aa0e199d8bf6e)) +* Correct env var value in semgrep.yml ([#375](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/375)) ([2e98e21](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e98e2149135b97a62b90c302675379642fdf7b3)) +* Docker Compose ([#156](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/156)) ([6ca012f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6ca012fb9b50d5c2159c498679673cb27530fc3c)) +* Docker cross-platform build architecture mismatch ([#496](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/496)) ([5c4fdaa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c4fdaa99a796f0ad8a1540e4e8b784c425a12b5)) +* Docker readme file ([#339](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/339)) ([2db9933](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2db9933def061046cc3585a07249107a236ef98c)) +* docker-scan - chainguard issue ([#255](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/255)) ([c9ab94b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c9ab94bcee7b386a33b063504b3e6d2cf188d8b5)) +* Docs link ([#128](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/128)) ([8263828](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/82638284cf13a4da376624362f5353b57365302a)) +* Docs path for crate ([#129](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/129)) ([51cf556](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/51cf556411c9c1f79dbee7f4c3aa25df7fe2af49)) +* **docs:** replaced Monitor for Relayer ([2ff196b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ff196bf772668556210a895d4f83315e579577f)) +* Documentation name for antora ([#121](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/121)) ([63c36f5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c36f5393b1369a169c8617b20952bca30aef0c)) +* Environment variables ([#124](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/124)) ([8d31131](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8d31131c087a6d0a64ae2dadecb5ae395ad1b575)) +* fix alloy error mapping and improve provider retry logic ([#540](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/540)) ([f181f15](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f181f15d161f34ce3b0be0a3a755a3b1542344e7)) +* Fix initialise relayer logic for persisted mode ([#485](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/485)) ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fix initialize relayer logic for persisted mode ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fix the codecov yaml syntax ([#108](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/108)) ([ab9ab5b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab9ab5b0c9313d083cd47c71d7faade867c58deb)) +* Fixes solana allowed_tokens policy validation ([#467](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/467)) ([367a6e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/367a6e9b1eaf333ea288147c4349a93246407e16)) +* Flaky logging tests ([#89](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/89)) ([bc909cc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc909cc336613bb5a191c562632278bd3c270b09)) +* Implement stellar sequence sync and tx reset ([#367](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/367)) ([60b5deb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/60b5deb4915041d60a064cfac1a066406c339517)) +* Improve docker cargo caching ([#505](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/505)) ([da288c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da288c06e6636f1f3ea43fbc8040a575e1788f49)) +* Improve openapi spec for evm transaction response ([#468](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/468)) ([1c0ba6c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1c0ba6c8f2c4b94c9b223e58d8aad834ce512761)) +* Inheritance validation ([#374](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/374)) ([f8b921b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f8b921b4d6d85b8068428f1e34de121183a02179)) +* Make plugins entry in configs optional ([#300](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/300)) ([f299779](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f299779318429677fd672d4a2433828971a1b62e)) +* Minor fixes in Plugin docs ([#325](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/325)) ([33bb6a1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/33bb6a1841f2e84723e49cc81258a930241dc735)) +* Missing libssl and workflow ([#155](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/155)) ([9de7133](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9de7133c2ba1768f4d989158f19c27444e522f9e)) +* Openapi spec version and update gh workflow ([#470](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/470)) ([afdc091](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/afdc091d8bafbc3900e8f909f62cfd490a757aac)) +* Optimism L1 data fee formula ([#513](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/513)) ([fca1c01](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fca1c01d321a7c3d61cf88513af187163db5d184)) +* place the gh release app token setup after docker build step ([#547](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/547)) ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* plae the gh release app token setup after docker build step ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* Plat 6286 write tests for metrics and middleware functions ([#70](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/70)) ([18124fb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/18124fbbfbc26f300648a7a4050ebf9be72465ac)) +* PLAT-6426 Increase test coverage ([#118](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/118)) ([1fa41f0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1fa41f0f225c9d515690738e960073396dce66ce)) +* PLAT-6478 create unit test for use of on relayers dotenv ([#139](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/139)) ([509e166](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/509e1664518823ef3844e52e818707f3371ddbff)) +* plat-6480 allow transfering wrapped sol tokens ([#132](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/132)) ([f04e66a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f04e66a568c877c2a4c5c5378fb6017c2e41d2c6)) +* Plat-6815 resubmission bug ([#353](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/353)) ([72ac174](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/72ac17471e3a0a6ac35e9a9bb9ff8fe5e8b94bf2)) +* plat-6888 aws kms signer issue ([#411](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/411)) ([3c12c88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3c12c88703c92526fe975eabba6ba0ffa9ca9c79)) +* Plugin result + adds tests for plugin ts lib ([#336](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/336)) ([b30246e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b30246e8922d3cb5bd3c5b92a7678f7591db5b97)) +* Relayer plugins format output ([#307](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/307)) ([8f25e5f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f25e5f55812e3d346c8bc0ff063cf07e2f0b753)) +* Release merge conflicts ([#163](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/163)) ([4cac422](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4cac4221817373a1ae7eff92db187dbae2f1665b)) +* remove the ci job dependant from the test job ([#222](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/222)) ([4056610](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40566108b66c701323145c2889ce0141b84714b8)) +* Replace automatic minor version bumps ([#315](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/315)) ([85784b4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/85784b486a9508429ae94373a7f3db13d78b39d6)) +* Replace tx request body ([#326](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/326)) ([a20c916](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a20c916b592891b7a2afafd2e62b32723fc05dc2)) +* Resolve Redis race condition and price calculator overflow ([#483](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/483)) ([3e6a2ca](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3e6a2ca2ff6d712ed173a08acb90066221b1109f)) +* SBOM upload error ([#342](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/342)) ([1f9318e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1f9318e22cbe59ca03bc617b0986379574e5f770)) +* Semgrep CI integration ([#371](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/371)) ([6b9a6d2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b9a6d24e22b78743f16c566026b34f9912669ad)) +* Semgrep send metrics value ([#381](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/381)) ([315ccbc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/315ccbca9a48816fc6e0c8133301aa3e3186ff93)) +* Skip releases ([ccafcbe](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ccafcbe11bc6ea46dacb9c59be578abd45112ad3)) +* Solve issues with new solana_sdk version ([#324](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/324)) ([ab97253](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab972533259506bb21e22ec7f899a45d2fc97db5)) +* stellar tx data persistance ([#500](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/500)) ([d60a019](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d60a01958582aa5ab70b2dc369b1531d493db637)) +* Switch Redocly build to use standalone html file ([#291](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/291)) ([97a8698](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/97a86980bec6260920a469018fee0d3541d1a063)) +* syntax error in codeql.yml ([#385](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/385)) ([987fd33](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/987fd33566b66b2821490d0769a3c863a778c271)) +* Update base image digest ([#556](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/556)) ([fb114fa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fb114fa7acefcfeae653cf43f91cbf0272bf002f)) +* Update configs and dockerfiles in examples ([#298](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/298)) ([2e505ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e505ad827ab7544f7c6a3fdf4018b1e9428f1d6)) +* Update semgrep.yml ([#347](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/347)) ([5ffb803](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ffb8036ca6d3fb5a8cdb34fa5484e7732c842a1)) +* Update Stellar API docs to match implementation ([#292](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/292)) ([96d95e3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/96d95e35784c25f39afe626b56f11477fd213196)) +* Use unicode character for emoji ([#343](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/343)) ([784e89f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/784e89fae4ad2ddad037ddbbd0bec6df160e9a6a)) + +[Changes][v1.3.0] + + + +# [v1.2.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v1.2.0) - 2025-11-11 + +## [1.2.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.1.0...v1.2.0) (2025-11-11) + + +### 🚀 Features + +* Add background job redis collections prefix support ([#484](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/484)) ([971ab9b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/971ab9b49c1397247a36d6daf54738249e854132)) +* Add Channels plugin documentation and update navigation ([#530](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/530)) ([cbb1fba](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/cbb1fba363ac4b82e85427d0edb0466c6cff6f7f)) +* Add channels plugin example ([#526](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/526)) ([6a107c6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a107c6ef7866011a39ac4011d520fc745b5ac86)) +* Add EIP-712 signing and KMS fixes ([#501](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/501)) ([23c9c7d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23c9c7d6f589fbcc540303c6800b38196750449f)) +* add evm intrinsic gas_limit validation ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* add INTHEWILD.md ([#543](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/543)) ([2592dc1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2592dc13b2908c0e9d0f47312f1952b6e4484553)) +* Add key-value storage support for plugins ([#463](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/463)) ([dfb12e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dfb12e0128088eda36f827b9346348783e1d1651)) +* Add optimism-based tag to networks ([#439](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/439)) ([101338d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/101338d843ceef854edc7863f25ec528db2d3f5e)) +* Add PEAQ network ([#465](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/465)) ([0c23016](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0c2301675b2fed1576d8ae7eb261f5faca1803c0)) +* Add plugin requestId support ([#471](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/471)) ([0296ed1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0296ed1b778dbd2139059fcf88015158d6ad16b0)) +* Add SEI network ([#477](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/477)) ([9174be4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9174be4f4cb0db7c9dc1e54eef94a77cc55c94eb)) +* Add Stellar account creation script ([#503](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/503)) ([0550c49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0550c49444be585c6d40c43514758f57604d818b)) +* Add Stellar Channels Guide documentation ([#544](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/544)) ([5c45c67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c45c67cc342e70e63f2115ccadcf3c47450e119)) +* Add support for Japan Open Chain ([#464](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/464)) ([44aaad1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44aaad1d9f51e354992861282cadab4c51f3b1e5)) +* Authentication improvements ([#456](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/456)) ([429e29e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/429e29e55a72e9d5c13a5ce6d7024edeb8d942ac)) +* Enhance LaunchTube plugin configuration ([#473](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/473)) ([84bde73](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/84bde737b20cea48cb10ae575fe4f96515795243)) +* Enhance logging with requestIds for traceability ([#455](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/455)) ([25b453f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25b453f8c385e8abc4c5dc31fc0d9b9467ed3031)) +* Enhance Stellar with concurrent transaction support ([#423](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/423)) ([7e7fb4f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e7fb4ffba95133c4eb983c9d8ef0b0b4bc0c786)) +* gas price cache ([#422](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/422)) ([6b838c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b838c5121e84bec4f50edf16ac5fc601d1fce3d)) +* Implement network inheritance for configs ([#428](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/428)) ([818258a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/818258a7b2770523f869e812113b1b3079926360)) +* Improve plugin error handling and response structure ([#480](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/480)) ([a9bd690](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a9bd6903ade06335511a25ada1cf0a25966590b3)) +* Include method tag in solana rpc result ([#437](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/437)) ([53ad7b0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/53ad7b0c5fd0a9571a1d753c623818be6f4429d7)) +* Pass arbitrary payloads to script execution ([#312](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/312)) ([adecaf5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/adecaf5d73c3df9083c6a3fcf62ed669bc90b25c)) +* **polkadot:** Add Polkadot testnet and TLS 1.3 compatibility ([#525](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/525)) ([9a3780c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9a3780c632b8016b322d70b5b1287b3b859165fa)) +* **polygon-zkevm:** Support for custom estimation methods ([#461](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/461)) ([1180d92](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1180d921da23d5b0d675c441a926600dc72d49bc)) +* Relayer health check job ([#506](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/506)) ([de01f67](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/de01f67e8ca2a30c5b5c99b98dc5bcc8c735ec34)) +* replace l2 extra fees with price overriders ([#460](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/460)) ([da2d90e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da2d90e958bb6f86d3227f251b1981672a9a4fb1)) +* RPC logic improvements ([#535](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/535)) ([68b2145](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68b214559a8957f79c40fe43477a2f2aebf6026a)) +* Scalability improvements ([#515](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/515)) ([471128d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/471128d51951bf6cb89dcd206ce821bd5146937c)) +* **signer:** Implement CDP signing for evm+solana ([#457](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/457)) ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* Solana send transaction endpoint ([#521](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/521)) ([1ecb022](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1ecb022e2acbc928e3834451240477e32d9140b8)) +* **stellar:** Add Google Cloud KMS signer support ([#481](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/481)) ([9886d84](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9886d842888cf5549f2dbcf488543c46011bb2fd)) +* **stellar:** Add Turnkey signer support ([#495](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/495)) ([2a8cdde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2a8cddec0625556fe46c4b6fa0194906ef4eea57)) +* Unify mempool detection ([#427](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/427)) ([63c04dc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c04dce27f8afb3a136e8b0400ca7853def19d8)) +* Update alloy package ([#430](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/430)) ([1725804](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1725804bcb534b58a23216de18386f1dad0485d7)) + + +### 🐛 Bug Fixes + +* Add launchtube env vars to docker-compose ([#425](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/425)) ([3879b88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3879b88932313e28b3a9b8dcaf97edfa944ccea7)) +* **cdp:** Solana signing ([187ca0c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/187ca0c5de9889d5ad39433abcf54408cb66596f)) +* clippy issues with deps ([#434](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/434)) ([632b93c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/632b93cea00a8c7ea7d16b21ccac7c545160a6ed)) +* Docker cross-platform build architecture mismatch ([#496](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/496)) ([5c4fdaa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5c4fdaa99a796f0ad8a1540e4e8b784c425a12b5)) +* fix alloy error mapping and improve provider retry logic ([#540](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/540)) ([f181f15](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f181f15d161f34ce3b0be0a3a755a3b1542344e7)) +* Fix initialise relayer logic for persisted mode ([#485](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/485)) ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fix initialize relayer logic for persisted mode ([5398adf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5398adf054080b0f925607509e8ffa107f288895)) +* Fixes solana allowed_tokens policy validation ([#467](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/467)) ([367a6e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/367a6e9b1eaf333ea288147c4349a93246407e16)) +* Improve docker cargo caching ([#505](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/505)) ([da288c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/da288c06e6636f1f3ea43fbc8040a575e1788f49)) +* Improve openapi spec for evm transaction response ([#468](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/468)) ([1c0ba6c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1c0ba6c8f2c4b94c9b223e58d8aad834ce512761)) +* Openapi spec version and update gh workflow ([#470](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/470)) ([afdc091](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/afdc091d8bafbc3900e8f909f62cfd490a757aac)) +* Optimism L1 data fee formula ([#513](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/513)) ([fca1c01](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fca1c01d321a7c3d61cf88513af187163db5d184)) +* place the gh release app token setup after docker build step ([#547](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/547)) ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* plae the gh release app token setup after docker build step ([8fae614](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fae61415935e505d30edfb507c6dc12c5f2e354)) +* plat-6480 allow transfering wrapped sol tokens ([#132](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/132)) ([f04e66a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f04e66a568c877c2a4c5c5378fb6017c2e41d2c6)) +* Resolve Redis race condition and price calculator overflow ([#483](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/483)) ([3e6a2ca](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3e6a2ca2ff6d712ed173a08acb90066221b1109f)) +* stellar tx data persistance ([#500](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/500)) ([d60a019](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d60a01958582aa5ab70b2dc369b1531d493db637)) +* Update base image digest ([#556](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/556)) ([fb114fa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fb114fa7acefcfeae653cf43f91cbf0272bf002f)) + +[Changes][v1.2.0] + + + +# [v1.1.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v1.1.0) - 2025-08-11 + +## [1.1.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.0.0...v1.1.0) (2025-08-11) + + +### 🚀 Features + +* Add Arbitrum support ([#373](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/373)) ([7b5372b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b5372bf54fe26756ca5db6cb393e0d9d79ae621)) +* add evm intrinsic gas_limit validation ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* Add Launctube plugin example ([#414](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/414)) ([5bda763](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5bda7635f304923fcd4031f855009228eeefee4b)) +* Add status_reason field to transaction responses ([#369](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/369)) ([c489e5d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c489e5d39e3cec555caf92ac93266016c547b2bb)) +* Add stellar launchtube plugin ([#401](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/401)) ([801e2f7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/801e2f7efc8f0cb7eb54f545ce398e6ee24cf6b9)) +* Add support to plugin list endpoint ([#358](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/358)) ([6517af0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6517af0a753db41638b006fa2b896a3ccec0d4ef)) +* Add wait API for plugin transactions ([#345](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/345)) ([6069af2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6069af256e6cfe8470244731d4bb444b87bd175f)) +* Added resolve_plugin_path for script_path ([#340](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/340)) ([0b30739](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0b30739e51f5ef6c0b97c1da585d403496b2bbac)) +* Enhance Stellar tx handling with fee updates ([#368](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/368)) ([05617d7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/05617d7cb06ab378c2c2207f9d0a2e11a04cc472)) +* Plat-6303 store solana submitted transactions to db and run status check logic ([#398](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/398)) ([e8420bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e8420bca02c20a53b02d9bedc8da1b7a784716dc)) +* Plat-6677 implement redis repositories for existing collections ([#350](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/350)) ([5fee731](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5fee731c5f19013f41a12a5b93af79d65bdf777e)) +* Plat-6679 implement startup logic to populate redis from config file ([#359](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/359)) ([5e1c0c8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5e1c0c825d3c1185a5c59360a2c857d79b46abba)) +* Plat-6681 expose crud api endpoints ([#365](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/365)) ([f3c3426](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f3c34266f3f035cd240105833ef4e67711cb0356)) +* Plat-6684 add support for transaction entries expiration ([#394](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/394)) ([6f6f765](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6f6f765556b2fc16764f8afe02ceedf268c26c13)) +* plat-6817 EVM add support for gas limit calculation ([#355](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/355)) ([dd1b2d6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dd1b2d6768d09f051791d0db68c912a38d273715)) +* plat-6873 add storage documentation ([#395](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/395)) ([ffd4ed5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ffd4ed58d322bad63be500a084a0b082ac7b59d9)) +* Plugins improvements ([#410](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/410)) ([648a0f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/648a0f121a6308e8bde0e09010d2e0c83de5c6ec)) +* Support plugin timeouts ([#348](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/348)) ([0a1c51e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0a1c51e9fe540ba570af25146538992a26b9a8a0)) +* Types introduced for plugin params and result ([#351](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/351)) ([dda83a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dda83a296fd5bd5bfca7f7902f4ca035e1bd8796)) +* Update Stellar network config and docs ([#380](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/380)) ([a4e1a0f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a4e1a0f38590f21c6d5e917a02fee4f6bef4f075)) + + +### 🐛 Bug Fixes + +* Correct env var value in semgrep.yml ([#375](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/375)) ([2e98e21](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e98e2149135b97a62b90c302675379642fdf7b3)) +* Docker readme file ([#339](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/339)) ([2db9933](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2db9933def061046cc3585a07249107a236ef98c)) +* Implement stellar sequence sync and tx reset ([#367](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/367)) ([60b5deb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/60b5deb4915041d60a064cfac1a066406c339517)) +* Inheritance validation ([#374](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/374)) ([f8b921b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f8b921b4d6d85b8068428f1e34de121183a02179)) +* Minor fixes in Plugin docs ([#325](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/325)) ([33bb6a1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/33bb6a1841f2e84723e49cc81258a930241dc735)) +* Plat-6815 resubmission bug ([#353](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/353)) ([72ac174](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/72ac17471e3a0a6ac35e9a9bb9ff8fe5e8b94bf2)) +* plat-6888 aws kms signer issue ([#411](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/411)) ([3c12c88](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3c12c88703c92526fe975eabba6ba0ffa9ca9c79)) +* Plugin result + adds tests for plugin ts lib ([#336](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/336)) ([b30246e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b30246e8922d3cb5bd3c5b92a7678f7591db5b97)) +* Replace tx request body ([#326](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/326)) ([a20c916](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a20c916b592891b7a2afafd2e62b32723fc05dc2)) +* SBOM upload error ([#342](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/342)) ([1f9318e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1f9318e22cbe59ca03bc617b0986379574e5f770)) +* Semgrep CI integration ([#371](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/371)) ([6b9a6d2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6b9a6d24e22b78743f16c566026b34f9912669ad)) +* Semgrep send metrics value ([#381](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/381)) ([315ccbc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/315ccbca9a48816fc6e0c8133301aa3e3186ff93)) +* Solve issues with new solana_sdk version ([#324](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/324)) ([ab97253](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab972533259506bb21e22ec7f899a45d2fc97db5)) +* Switch Redocly build to use standalone html file ([#291](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/291)) ([97a8698](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/97a86980bec6260920a469018fee0d3541d1a063)) +* syntax error in codeql.yml ([#385](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/385)) ([987fd33](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/987fd33566b66b2821490d0769a3c863a778c271)) +* Update semgrep.yml ([#347](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/347)) ([5ffb803](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ffb8036ca6d3fb5a8cdb34fa5484e7732c842a1)) +* Use unicode character for emoji ([#343](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/343)) ([784e89f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/784e89fae4ad2ddad037ddbbd0bec6df160e9a6a)) + +[Changes][v1.1.0] + + + +# [v1.0.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v1.0.0) - 2025-06-30 + +## [1.0.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.2.0...v1.0.0) (2025-06-30) + + +### 🚀 Features + +* Add get_status method for EVM and Stellar ([#229](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/229)) ([e84217e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e84217e0fa941fcd580ad6b84ab6bfac939dd5f4)) +* Add node support to environment ([#236](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/236)) ([3ab46f8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ab46f848e7e4c6dee2545d62dc646b33623d63d)) +* Add plugin invoker service ([#290](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/290)) ([489ce02](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/489ce0285cd88a18b1616af94bfc970a4a674228)) +* Add plugins call endpoint ([#279](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/279)) ([c278589](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c278589f4c6bf88be86788fdd9b68c2f166f5f33)) +* Add support for feebumped tx ([#309](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/309)) ([b4efd2e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b4efd2e894fb6534b61a10c5f8872a73d923410c)) +* Add support for stellar InvokeHostFunction transactions ([#284](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/284)) ([32ba63e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/32ba63e58e3dfc1359b7a5c9f61f9ff2a8b6c317)) +* Add transaction status handling for stellar ([#223](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/223)) ([9496eb6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9496eb63514afb0bd29c731bebe86ffdcf393362)) +* Create initial js plugins library ([#302](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/302)) ([98238e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/98238e9a6a30de8dba3bf8d308a82658e29de46f)) +* **evm:** Add AWS KMS signer support ([#287](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/287)) ([723a9a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/723a9a8d7e625dd3f52b2d678d0e1cd842053e06)) +* **evm:** Implement delete pending txs ([#289](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/289)) ([bc6f829](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc6f829e580d42359adebceeddaf38002390e10b)) +* **evm:** Implement json rpc endpoint ([#286](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/286)) ([91528aa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/91528aab82e3fa3cba08f63feb4ac9879aa8940e)) +* extract networks to json files ([#238](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/238)) ([5ac07b3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/5ac07b3c570485d7cdbc419a23f373867d7ebe81)) +* handle non-retriable errors and provider health errors ([#233](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/233)) ([7add348](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7add348da4d06af5ebebcce78d856485e9894ac3)) +* Implement get_balance method for StellarRelayer ([#228](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/228)) ([d92c75f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d92c75fe7da1b02ddb7a38df32f98082474e4cd9)) +* implement network config deserializing ([#235](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/235)) ([6d537f9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6d537f9298626fefc0d5a45c311a95208e1c8ef5)) +* Pass arbitrary payloads to script execution ([#312](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/312)) ([adecaf5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/adecaf5d73c3df9083c6a3fcf62ed669bc90b25c)) +* plat-6215 add support for rpc failovers and retries ([#231](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/231)) ([ca6d24f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ca6d24f1bcdbb912795dcb1496519b49b5e81bf1)) +* plat-6522 allow for the use of on chain defi to automatically swap spl ([#198](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/198)) ([dc9e2e2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/dc9e2e2dd1d46830bc6479c1928a2e7ef7f91fb3)) +* plat-6571 add support for gcp signer ([#221](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/221)) ([0170fa1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0170fa12c3ecc64d1c48ed3a726358ed74d4596b)) +* Relayer plugins - add support to plugins in configs ([#253](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/253)) ([6a14239](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6a14239486900b2ef121b5de9e87410c412b65fe)) +* **replace_tx:** Implement replace tx for evm ([#272](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/272)) ([b48e71f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b48e71f55fda03bea83e90255b0d180db704cb52)) +* Set default network folder ([#313](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/313)) ([b28c99c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b28c99c43bedd921a55660622d845e63890e0d74)) +* **signer:** Add GCP Signer to EVM ([#305](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/305)) ([a8817b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a8817b6c87c65731232d0a141338f3996aef2510)) +* Stellar RPC config ([#213](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/213)) ([6fd75ea](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd75ea65bf1a945ba891f99d83b0cdacdf30014)) +* support for retries and failovers in EVM Provider ([#197](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/197)) ([542f21a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/542f21a9346def9b7fe47e0a29a2bbd5ab2af349)) + + +### 🐛 Bug Fixes + +* Add memo validation for InvokeHostFunction ([#294](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/294)) ([6bb4ffa](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6bb4ffaf9ceb4a8daef29ec5878595cca7041300)) +* change the ampersand to and, as as the shell interpret it ([#206](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/206)) ([d164d6a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d164d6a4d63fbf0acdfe1330cf25147e86280af8)) +* Changing base image to wolfi, added node and npm ([#266](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/266)) ([1181996](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1181996dac6da52f96e164b1c937828a3940d5b8)) +* Config example file ([#285](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/285)) ([a020c6f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a020c6fcd6f9b638d955d5f2c99aa0e199d8bf6e)) +* docker-scan - chainguard issue ([#255](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/255)) ([c9ab94b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c9ab94bcee7b386a33b063504b3e6d2cf188d8b5)) +* Make plugins entry in configs optional ([#300](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/300)) ([f299779](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f299779318429677fd672d4a2433828971a1b62e)) +* Relayer plugins format output ([#307](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/307)) ([8f25e5f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f25e5f55812e3d346c8bc0ff063cf07e2f0b753)) +* remove the ci job dependant from the test job ([#222](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/222)) ([4056610](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40566108b66c701323145c2889ce0141b84714b8)) +* Replace automatic minor version bumps ([#315](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/315)) ([85784b4](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/85784b486a9508429ae94373a7f3db13d78b39d6)) +* Update configs and dockerfiles in examples ([#298](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/298)) ([2e505ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2e505ad827ab7544f7c6a3fdf4018b1e9428f1d6)) +* Update Stellar API docs to match implementation ([#292](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/292)) ([96d95e3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/96d95e35784c25f39afe626b56f11477fd213196)) + +[Changes][v1.0.0] + + + +# [v0.2.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v0.2.0) - 2025-05-14 + +## [0.2.0](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.1.1...v0.2.0) (2025-05-14) + + +### 🚀 Features + +* add optimism extra cost calculation ([#146](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/146)) ([b85e070](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b85e070074ecc0aa4fbd7d5dc3af6ca0d600220b)) +* add timeout_seconds to EVM relayer configuration ([#169](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/169)) ([6fd59bc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6fd59bc0e5993d63608d47e7ba7825a027e26b99)) +* implement balance validation in EVM ([#168](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/168)) ([27fe333](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/27fe333806c28c268af981f5377e188160c845b9)) +* Local signing for stellar ([#178](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/178)) ([f69270a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f69270ade4c9a9239bba874ac74858c8e7375298)) +* plat-6471 add Solana Token 2022 extensions support ([#166](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/166)) ([d35c506](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d35c506ea298a86897ede5702481403f839f2451)) +* Plat-6521 add turnkey hosted signer support (evm, solana) ([#174](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/174)) ([b24688e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b24688ead4fe3015ca3b7c74e56f1906085a5aa3)) +* Stellar RPC service ([#183](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/183)) ([9943ffd](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9943ffd67a709df487264f50eccd03b06cc817d4)) +* Stellar transaction submission ([#199](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/199)) ([c6b72bf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c6b72bfba82c7fb9288c07e49bef04cf527d1245)) +* support for multiple custom RPCs with weighted configuration ([#182](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/182)) ([92ea5ad](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/92ea5ad324323b957fcbdce85c37517ec6f963ba)) + + +### 🐛 Bug Fixes + +* CLA assistant ([#171](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/171)) ([b326a56](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b326a5680722e812263aab949003c214795fd2c0)) +* CLA labels ([#173](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/173)) ([e31405b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e31405b8cba9ffd2ff991d56444320ff3d069ad0)) +* Docker Compose ([#156](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/156)) ([6ca012f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6ca012fb9b50d5c2159c498679673cb27530fc3c)) +* Missing libssl and workflow ([#155](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/155)) ([9de7133](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9de7133c2ba1768f4d989158f19c27444e522f9e)) +* Release merge conflicts ([#163](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/163)) ([4cac422](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4cac4221817373a1ae7eff92db187dbae2f1665b)) +* Skip releases ([ccafcbe](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ccafcbe11bc6ea46dacb9c59be578abd45112ad3)) + +[Changes][v0.2.0] + + + +# [v0.1.1](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v0.1.1) - 2025-04-08 + +## [0.1.1](https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.1.0...v0.1.1) (2025-04-08) + + +### 🐛 Bug Fixes + +* Skip releases ([e79b2e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e79b2e963439721dd8e151fa0827654e4019df5f)) +* Skip releases with release please ([#158](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/158)) ([e79b2e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e79b2e963439721dd8e151fa0827654e4019df5f)) + + +### ⚙️ Miscellaneous Chores + +* Fix workflow and missing libs in docker file ([#157](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/157)) ([c7a681d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c7a681dea154b06b675a286e936606e2f9ce087b)) +* plat-7575 Docs fixes ([#153](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/153)) ([#154](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/154)) ([44257e8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44257e8ea3e658adbf40f69ad809e4e3503e9af4)) + +[Changes][v0.1.1] + + + +# [v0.1.0](https://github.com/OpenZeppelin/openzeppelin-relayer/releases/tag/v0.1.0) - 2025-04-07 + +## 0.1.0 (2025-04-07) + + +### 🚀 Features + +* add base models ([#5](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/5)) ([55db42b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/55db42b16d88e95ca8f6927e3b4d07c939e677c8)) +* Add CLA assistant bot ([#130](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/130)) ([4ad5733](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4ad5733daadefe5e52bd617eaa47039677443745)) +* add directory structure and example ([d946c10](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d946c10fd96ee2d1ce2e373ba4ccfced31f985f9)) +* Add logging improvements ([#28](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/28)) ([bb6751a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bb6751a4f868eb82787e7763a7995d3974ecfd49)) +* Add logic to resubmit transaction ([#102](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/102)) ([6c258b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6c258b625dc7edb1d028b771647ff25b12c2b07d)) +* Add noop support and refactor status ([#134](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/134)) ([f0e3a17](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f0e3a177a536c53fe8eff834243d417bb673b744)) +* Add queue processing support ([#6](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/6)) ([3ebbac2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3ebbac25f1ecb403dec7d090d39882a85227d883)) +* Add release workflow ([#148](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/148)) ([bd9a7e9](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bd9a7e91a300e6650b08f799aecea4478bb4b974)) +* Add sign tx for evm local signer ([#65](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/65)) ([b17fb36](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b17fb3625677f1dbcf1ddf3963db13b9b88ca25e)) +* add support for relayer paused and system disabled state ([#13](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/13)) ([44968a2](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/44968a29ec4f1cf1166c2ad726f2c9a1bac246c3)) +* Add worldchain testnet support ([#137](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/137)) ([25751ef](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/25751ef97b7b9fbe0c4b53fab5b762d1696f8c93)) +* Adding job tests ([#110](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/110)) ([4d2dd98](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4d2dd98efedacaded8d4ace118c43dbe25907278)) +* enabling it to listen on all interfaces - allows for easy docker config ([74a59da](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/74a59da79b314160baf35ec9750e372fbad0f360)) +* enabling it to listen on all interfaces - allows for easy docker config ([23f94c0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/23f94c07ce46254f7b80df77ce8c4fc59fb4eef6)) +* improve examples ([#119](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/119)) ([7e59aa6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7e59aa64f75f3470807396b293e71cd68d3292d1)) +* Improve Redis startup logic ([#120](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/120)) ([8618ecf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8618ecf00b4739891fe4ce98caf14f729face896)) +* initial repo setup ([d8815b6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/d8815b6752931003536aa427370ca8fb1c57231c)) +* Integrate Netlify with antora ([#74](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/74)) ([09e3d48](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/09e3d4894b54c58754b373da239e9d564df69aa9)) +* Plat 5744 implement an api key authentication mechanism ([#11](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/11)) ([8891887](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/88918872d51ab10632ec6d590689d52e59dfd640)) +* Plat 5768 setup metrics endpoint ([#50](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/50)) ([7c292a5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7c292a572a7aef8213969fc72cadca74f9016fe8)) +* Plat 6434 improve authorization header validation ([#122](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/122)) ([eed7c31](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/eed7c31e938c7b6ecaa82774ca5d3a508bb89281)) +* Plat-5749 implement basic webhook notifications service ([#12](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/12)) ([1b47b64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b47b64c318208eb7dc2ec6d62020fab30ccafbb)) +* Plat-5802 openapi sdk client ([#109](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/109)) ([1b4b681](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1b4b681a3755f60e2934548a9666c60a4465dabb)) +* PLAT-6026 Imp cancel transaction ([#101](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/101)) ([1e5cc47](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1e5cc47bdc54acafeeefb60489db410b42722b0f)) +* Plat-6118 implement logic for syncing relayer state upon service start ([#19](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/19)) ([2ba3629](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ba36292a0b8d0d67ddab42d2845a6a0d5f31e3a)) +* Plat-6153 add network definitions for Solana networks ([#26](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/26)) ([ff453d5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ff453d59724eeaa194ccf7f83993ce8d649f7432)) +* Plat-6154 add support for solana local signer ([#29](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/29)) ([40caead](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/40caeadde5f08200410912b98943346971084163)) +* plat-6158 implement Solana rpc service ([#36](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/36)) ([8fb50a8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8fb50a833e7f9b1773dbe4ca1d77a9609a5d5ec1)) +* Plat-6159 extend relayer config file solana policies ([#38](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/38)) ([4f4602b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4602b754e71539937447c1743a7f069317598b)) +* Plat-6164 implement feeestimate rpc method ([#61](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/61)) ([43b016c](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/43b016c4e5faa5ee1fedcdadccf3bc768962178e)) +* Plat-6165 implement transfertransaction rpc method ([#63](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/63)) ([c59a3b8](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c59a3b8894c32470adf10770f4804e272aa829d3)) +* Plat-6167 implement signtransaction rpc method ([#57](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/57)) ([ad7a1ff](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ad7a1ffe41eb868f54737c1f1b44a52c6d02d172)) +* Plat-6169 implement getsupportedtokens rpc method ([#45](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/45)) ([3f91199](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3f9119981acd7f92618ba6ec12c3039563368202)) +* Plat-6170 add vault hosted signer support ([#99](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/99)) ([7a9491d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7a9491d4094fc21bc87551c68687b4f44f3edd18)) +* Plat-6207 implement trait abstraction relayer ([#43](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/43)) ([abeb7cf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/abeb7cfccc9e70b26ddd0d41d736352d57d6ade9)) +* Plat-6216 adding network symbol support ([#37](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/37)) ([21f798f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/21f798fc114de47ae0ed7e127e496bb50ca081a8)) +* Plat-6236 adding validation payload ([#42](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/42)) ([a5ff165](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a5ff165df14f48d47adee03e8e2c8ef5a899ff57)) +* Plat-6239 whitelist policy validation ([#44](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/44)) ([3adb45e](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3adb45e17b8b23c70e09e422cfca051ebab266f1)) +* Plat-6248 implementation dummy of legacy price ([#49](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/49)) ([6319d64](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6319d64bf27fd75f5192165df885156ca91ea9f0)) +* Plat-6267 add utility script for generating local keystore files ([#69](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/69)) ([b5df7f6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/b5df7f6b0450118c9123de46689fa115efcdec94)) +* Plat-6291 add webhook notifications for rpc methods ([#72](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/72)) ([2f35d81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2f35d81b3711cf2f87dbc6df31b9e0f90432164e)) +* Plat-6299 clean transaction response ([#76](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/76)) ([fc5dd05](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fc5dd05154bca4a1d740cef058bb797cd3f513a0)) +* Plat-6300 returning the balance of the relayer ([#78](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/78)) ([e0ce8e0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/e0ce8e04f3950c094c9af3e3413d61cd7162c8e7)) +* Plat-6304 use Authorization header instead of x api key ([#94](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/94)) ([34e8a81](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/34e8a813234ee6aaf2a6956f6dd45f82e47e7861)) +* Plat-6309 Fetching eip1559 prices ([#83](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/83)) ([68d574f](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/68d574fcb159ae3b6502167a9bcf34bb1a56ea7e)) +* plat-6340 store private keys securely in memory ([#104](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/104)) ([28c2fab](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/28c2fab84f3db6b9d971126cf917263da395c421)) +* PLAT-6350 - Sign EIP-1559 ([#98](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/98)) ([673e420](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/673e4202f9d98bfd02512090fa3daacfa40831fe)) +* PLAT-6374 EIP-1559 default if network support it and not explicit false ([#100](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/100)) ([c982dde](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c982ddefeba93381ac7d2c5e09f616a60820b8b8)) +* PLAT-6416 Use generics transaction factory ([#105](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/105)) ([7b94662](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/7b946625af77c6aabd336d34646e9ae62ece3b6a)) +* plat-6433 add minimum length validations for config sensitive values ([#125](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/125)) ([31453c5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/31453c5586ca4fef70e7ea0e2dcd0260a8a721a6)) +* Plat-6441 document upcoming work ([#131](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/131)) ([377a8bb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/377a8bb57ff5b3b23abb58d1c3378489c40218cf)) +* PLAT-6442 - Abstraction and unit tests relayer domain ([#117](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/117)) ([643194a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/643194acd9079ac3ac157e909f0b30199af8b0c9)) +* Plat-6457 Ignore utoipa ([#127](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/127)) ([234854a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/234854afbf30a9a94fa3365f60f035e53e068938)) +* Plat-6459 create mermaid architecture diagram ([#126](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/126)) ([3de147b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3de147b907c28d3e9a8a38a2d6b8cd665253c423)) +* plat-6476 Add support to collect transaction fee ([#135](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/135)) ([4f4a07b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f4a07b2846d2980bbf09734602315702ded9dbe)) +* Plat-6479 added support for rpc custom endpoints ([#138](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/138)) ([3df3d49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/3df3d49ec6a662698a90630811d717920b7cdf3b)) +* Pricing validation on receiving payload EVM ([#59](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/59)) ([1206d42](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1206d4241dbda84bc861f501d322f6bd33234f0b)) +* Signer service ([#8](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/8)) ([4f85b7b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4f85b7bf5b6aa83903ed8febdfe244d54e803642)) +* Speed support transaction ([#62](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/62)) ([a572af6](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/a572af65ca4f664dce13e705eac37b56dee306fa)) +* Tx submissions and status mgmt ([#81](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/81)) ([9f829f1](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9f829f1c59c4221c9cf38c6cb1ff36351a348cd1)) +* Update transaction status to mined/expired ([#85](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/85)) ([8f5ee53](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8f5ee53bbe64d55ccf8015a1c8d203cf5e391f08)) + + +### 🐛 Bug Fixes + +* Codecov changes and adjustments ([#113](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/113)) ([6e62dcf](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/6e62dcf212a917421c7559566136c018e17c38f5)) +* Docs link ([#128](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/128)) ([8263828](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/82638284cf13a4da376624362f5353b57365302a)) +* Docs path for crate ([#129](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/129)) ([51cf556](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/51cf556411c9c1f79dbee7f4c3aa25df7fe2af49)) +* **docs:** replaced Monitor for Relayer ([2ff196b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/2ff196bf772668556210a895d4f83315e579577f)) +* Documentation name for antora ([#121](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/121)) ([63c36f5](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/63c36f5393b1369a169c8617b20952bca30aef0c)) +* Environment variables ([#124](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/124)) ([8d31131](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/8d31131c087a6d0a64ae2dadecb5ae395ad1b575)) +* Fix the codecov yaml syntax ([#108](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/108)) ([ab9ab5b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/ab9ab5b0c9313d083cd47c71d7faade867c58deb)) +* Flaky logging tests ([#89](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/89)) ([bc909cc](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/bc909cc336613bb5a191c562632278bd3c270b09)) +* Plat 6286 write tests for metrics and middleware functions ([#70](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/70)) ([18124fb](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/18124fbbfbc26f300648a7a4050ebf9be72465ac)) +* PLAT-6426 Increase test coverage ([#118](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/118)) ([1fa41f0](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/1fa41f0f225c9d515690738e960073396dce66ce)) +* PLAT-6478 create unit test for use of on relayers dotenv ([#139](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/139)) ([509e166](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/509e1664518823ef3844e52e818707f3371ddbff)) +* plat-6480 allow transferring wrapped sol tokens ([#132](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/132)) ([f04e66a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/f04e66a568c877c2a4c5c5378fb6017c2e41d2c6)) + + +### 📚 Documentation + +* add cargo docs ([#75](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/75)) ([c4dd8e3](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c4dd8e30525ccaeb563560bc2ef87cdcec5b1790)) +* Add testing instructions ([#107](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/107)) ([c7c2ed7](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/c7c2ed7772d99b4b68ced9fbf8835fa9e46da5e1)) +* Adding configuration documentation ([#48](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/48)) ([929cc1b](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/929cc1bf1e0c6b3be872daf6654abe24eb79b907)) +* Fixing formatting and location of files ([#41](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/41)) ([4d4f153](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/4d4f1530f466a5bd597d0338559ccb33815286f0)) +* Move README to a similar format to Monitor ([#39](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/39)) ([5985339](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/59853396b3786a972ce7bbc793d4dbacc62fe6c0)) +* Readability improvements ([#133](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/133)) ([9220727](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/9220727cc2b4349052c2d96a48c5d9c3012b38b9)) +* Small doc updates - policy field descriptions ([#51](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/51)) ([cc83c49](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/cc83c496bbe2593018b03c414a864691c967ff41)) +* Small fixes and Antora docs improvements ([#40](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/40)) ([655d16d](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/655d16dc658a74b7413ce785dee5b8e33cfb40f7)) +* TG link and other minor doc updates ([#116](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/116)) ([fc68b6a](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/fc68b6afa844d2c2638d031fce44fcc514d59a7d)) +* Update API docs. Fix Dockerfiles ([#77](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/77)) ([0bd6bfe](https://github.com/OpenZeppelin/openzeppelin-relayer/commit/0bd6bfea69d60c1a7e9d6b8a690ba1a2d0e44b74)) + +[Changes][v0.1.0] + + +[v1.4.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.3.0...v1.4.0 +[v1.3.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.2.0...v1.3.0 +[v1.2.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.1.0...v1.2.0 +[v1.1.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v1.0.0...v1.1.0 +[v1.0.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.2.0...v1.0.0 +[v0.2.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.1.1...v0.2.0 +[v0.1.1]: https://github.com/OpenZeppelin/openzeppelin-relayer/compare/v0.1.0...v0.1.1 +[v0.1.0]: https://github.com/OpenZeppelin/openzeppelin-relayer/tree/v0.1.0 diff --git a/content/relayer/1.5.x/configuration/index.mdx b/content/relayer/1.5.x/configuration/index.mdx new file mode 100644 index 00000000..db8d27db --- /dev/null +++ b/content/relayer/1.5.x/configuration/index.mdx @@ -0,0 +1,720 @@ +--- +title: Configuration +--- + +## Overview + +Most configuration files should live under `./config`, including the signer configurations, under `./config/keys`. +Please ensure appropriate access permissions on all configuration files (for `./config/keys/*`, we recommend `0500`. + + + +The OpenZeppelin Relayer supports two configuration approaches: + +**_File-based Configuration:_** + +1. **_`config.json`_**: Contains relayer definitions, signer configurations, and network policies +2. **_`.env`_** file: Contains environment variables like API keys and connection strings + +**_API-based Configuration:_** + +- Full CRUD operations for relayers, signers, and notifications via REST API +- Changes take effect immediately (no container restart required) +- See the **_API Reference_** page for detailed endpoints documentation + +See [Storage Configuration](./configuration/storage) for detailed information about how file-based and API-based configurations work together, storage behavior, and best practices. + +For quick setup examples with pre-configured files, see the [examples directory](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples) in our GitHub repository. + + + +## Environment configuration (.env) + +This defines some base configurations for the Relayer application: + +Copy the example environment file and update values according to your needs + +```bash +cp .env.example .env +``` + +This table lists the environment variables and their default values. + +| Environment Variable | Default Value | Accepted Values | Description | +| ------------------------------------------------------------------ | ------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `RUST_LOG` | `info` | `info, debug, warn, error, trace` | Log level. | +| `REPOSITORY_STORAGE_TYPE` | `in-memory` | `in-memory, redis` | Type of storage used for storing repository config and resources. See [Storage Configuration](./configuration/storage) for detailed information. | +| `RESET_STORAGE_ON_START` | `false` | `bool` | Clears all resources from storage on startup and reloads entries from the config file. See [Storage Configuration](./configuration/storage) for usage details. | +| `TRANSACTION_EXPIRATION_HOURS` | `4` | `number` | Number of hours after which transactions in a final state are removed from storage. See [Storage Configuration](./configuration/storage) for more information. | +| `CONFIG_DIR` | `./config` | `` | Relative path of directory where config files reside | +| `CONFIG_FILE_NAME` | `config.json` | `` | File Name of the configuration file. | +| `RATE_LIMIT_REQUESTS_PER_SECOND` | `100` | `` | Rate limit for the API in requests per second. | +| `RATE_LIMIT_BURST_SIZE` | `300` | `` | Rate limit burst size. | +| `API_KEY` | `` | `string`, | API key to use for authentication to the relayer server. Minimum length 32 characters. | +| `WEBHOOK_SIGNING_KEY` | `` | `string` | Signing key to use for webhook notifications. Minimum length 32 characters. | +| `LOG_MODE` | `stdout` | `stdout, file` | Write logs either to console or to file. | +| `LOG_DATA_DIR` | `./logs` | `` | Directory to persist log files on host. | +| `LOG_MAX_SIZE (in bytes)` | `1073741824` | `` | Size after which logs needs to be rolled. | +| `METRICS_ENABLED` | `false` | `bool` | Enable metrics server for external tools to scrape metrics. | +| `METRICS_PORT` | `8081` | `` | Port to use for metrics server. | +| `REDIS_URL` | `redis://localhost:6379` | `` | Redis connection URL for the primary instance. Used for all write operations and read operations when `REDIS_READER_URL` is not set. See [Storage Configuration](./configuration/storage) for Redis setup details. | +| `REDIS_READER_URL` | (none) | `` | Optional separate endpoint for read operations. When set, read operations use this endpoint while writes use `REDIS_URL`. Useful for AWS ElastiCache with read replicas. See [Storage Configuration](./configuration/storage) for configuration examples. | +| `REDIS_CONNECTION_TIMEOUT_MS` | `10000` | `` | Connection timeout for Redis in milliseconds. See [Storage Configuration](./configuration/storage) for Redis configuration. | +| `REDIS_POOL_MAX_SIZE` | `500` | `` | Maximum number of connections in the primary Redis connection pool. See [Storage Configuration](./configuration/storage) for tuning guidance. | +| `REDIS_READER_POOL_MAX_SIZE` | `1000` | `` | Maximum number of connections in the reader Redis connection pool. Only used when `REDIS_READER_URL` is set. Useful for read-heavy workloads. See [Storage Configuration](./configuration/storage) for pool sizing recommendations. | +| `REDIS_POOL_TIMEOUT_MS` | `10000` | `` | Maximum time to wait for a connection from the pool. See [Storage Configuration](./configuration/storage) for performance tuning. | +| `REDIS_KEY_PREFIX` | `oz-relayer` | `string` | Redis key prefix for namespacing. See [Storage Configuration](./configuration/storage) for more information. | +| `QUEUE_BACKEND` | `redis` | `redis, sqs` | Queue backend implementation. `redis` uses Apalis + Redis queues. `sqs` uses AWS SQS workers and queue backend abstraction. | +| `AWS_REGION` | (none) | `` | Required when `QUEUE_BACKEND=sqs`. Used to build/resolve SQS queue endpoints. | +| `AWS_ACCOUNT_ID` | (none) | `` | Required when `QUEUE_BACKEND=sqs` and `SQS_QUEUE_URL_PREFIX` is not set. Used to construct default SQS queue URLs. | +| `SQS_QUEUE_URL_PREFIX` | (none) | `` | Optional override for SQS queue URL prefix (example: `https://sqs.us-east-1.amazonaws.com/123456789012/relayer-`). When set, `AWS_ACCOUNT_ID` is not required. | +| `SQS_QUEUE_TYPE` | `auto` | `auto, standard, fifo` | SQS queue type. `auto` (default) probes the `transaction-request` queue at startup to detect the type. `standard` and `fifo` skip probing and use the specified type directly. | +| `DISTRIBUTED_MODE` | `false` | `bool` (`true/false`, `1/0`) | Enables Redis-based distributed locks for cron/cleanup tasks in multi-instance deployments, preventing duplicate scheduled execution across nodes. | +| `STORAGE_ENCRYPTION_KEY` | `` | `string` | Encryption key used to encrypt data at rest in Redis storage. See [Storage Configuration](./configuration/storage) for security details. | +| `RPC_TIMEOUT_MS` | `10000` | `` | Sets the maximum time to wait for RPC connections before timing out. | +| `PROVIDER_MAX_RETRIES` | `3` | `` | Maximum number of retry attempts for provider operations. | +| `PROVIDER_RETRY_BASE_DELAY_MS` | `100` | `` | Base delay between retry attempts in milliseconds. | +| `PROVIDER_RETRY_MAX_DELAY_MS` | `2000` | `` | Maximum delay between retry attempts in milliseconds. | +| `PROVIDER_MAX_FAILOVERS` | `3` | `` | Maximum number of failovers (switching to different providers). | +| `PROVIDER_FAILURE_THRESHOLD` | `3` | `` | Number of consecutive failures before a provider is temporarily paused. When a provider reaches this threshold, it will be paused for the duration specified by `PROVIDER_PAUSE_DURATION_SECS`. Supports legacy env var `RPC_FAILURE_THRESHOLD`. | +| `PROVIDER_PAUSE_DURATION_SECS` | `60` | `` | Duration in seconds that a provider remains paused after reaching the failure threshold. During this time, the relayer will attempt to use other available providers. Supports legacy env var `RPC_PAUSE_DURATION_SECS`. | +| `PROVIDER_FAILURE_EXPIRATION_SECS` | `60` | `` | Duration in seconds after which individual failure records are considered stale and automatically removed. This allows providers to naturally recover over time even without explicit success calls. Failures older than this duration are not counted toward the failure threshold. | +| `RPC_ALLOWED_HOSTS` | `` | `` | Comma-separated list of allowed RPC hostnames/IPs. If non-empty, only URLs with these hosts are permitted. Example: `eth-mainnet.g.alchemy.com,mainnet.infura.io` | +| `RPC_BLOCK_PRIVATE_IPS` | `false` | `bool` | Block private IP addresses (RFC 1918, loopback, link-local) in RPC URLs. Set to `true` to prevent RPC URLs from targeting private networks. | +| `CONNECTION_BACKLOG` | `511` | `` | TCP listen backlog size (pending connections queue). Higher values allow more connections to be queued during traffic bursts, preventing connection drops. Default of 511 is a production-ready value that balances memory usage with burst capacity. | +| `REQUEST_TIMEOUT_SECONDS` | `30` | `` | Request handler timeout in seconds for API endpoints. This is a security measure to prevent resource exhaustion attacks (DoS). It limits how long a request handler can run, preventing slowloris-style attacks and ensuring resources are freed promptly. | +| `RELAYER_CONCURRENCY_LIMIT` | `100` | `` | Maximum number of concurrent requests allowed for `/api/v1/relayers/*` endpoints. When this limit is reached, additional requests will be rejected with a 429 Too Many Requests error. This helps prevent resource exhaustion and ensures fair resource allocation. | +| `MAX_CONNECTIONS` | `256` | `` | Maximum number of concurrent TCP connections allowed server-wide. This is a safety net that prevents the server from accepting more connections than it can handle. When this limit is reached, new connections will be rejected. | +| `ENABLE_SWAGGER` | `false` | `true, false` | Enable or disable Swagger UI for API documentation. | +| `KEYSTORE_PASSPHRASE` | `` | `` | Passphrase for the keystore file used for signing transactions. | +| `BACKGROUND_WORKER_TRANSACTION_REQUEST_CONCURRENCY` | `50` | `` | Maximum number of concurrent transaction request jobs that can be processed simultaneously. | +| `BACKGROUND_WORKER_TRANSACTION_SENDER_CONCURRENCY` | `75` | `` | Maximum number of concurrent transaction submission jobs that can be processed simultaneously. | +| `BACKGROUND_WORKER_TRANSACTION_STATUS_CHECKER_CONCURRENCY` | `50` | `` | Maximum number of concurrent generic/default transaction status check jobs that can be processed simultaneously. This worker handles Solana and any future networks that don’t have dedicated status checkers. | +| `BACKGROUND_WORKER_TRANSACTION_STATUS_CHECKER_EVM_CONCURRENCY` | `100` | `` | Maximum number of concurrent EVM transaction status check invocations that can be processed simultaneously. EVM handles the highest volume (~75% of all status checks) and uses optimized retries (8-20s) to avoid triggering premature resubmission. | +| `BACKGROUND_WORKER_TRANSACTION_STATUS_CHECKER_STELLAR_CONCURRENCY` | `50` | `` | Maximum number of concurrent Stellar transaction status checks that can be processed simultaneously. Stellar status checker uses fast retries (2-3s) optimized for Stellar’s faster block times. | +| `BACKGROUND_WORKER_NOTIFICATION_SENDER_CONCURRENCY` | `30` | `` | Maximum number of concurrent notifications that can be processed simultaneously. | +| `BACKGROUND_WORKER_SOLANA_TOKEN_SWAP_REQUEST_CONCURRENCY` | `10` | `` | Maximum number of concurrent Solana token swap requests that can be processed simultaneously. Low volume worker. | +| `BACKGROUND_WORKER_TRANSACTION_CLEANUP_CONCURRENCY` | `1` | `` | Maximum number of concurrent transaction cleanup invocations that can be processed simultaneously. Defaults to 1 to avoid database conflicts. | +| `BACKGROUND_WORKER_RELAYER_HEALTH_CHECK_CONCURRENCY` | `10` | `` | Maximum number of concurrent relayer health check invocations that can be processed simultaneously. Low volume worker. | + +### Environment configuration example + +`.env` file config example: + +``` +RUST_LOG=DEBUG +CONFIG_DIR=./config +CONFIG_FILE_NAME=config.json +WEBHOOK_SIGNING_KEY=e1d42480-6f74-4d0b-85f4-b7f0bb690fae +API_KEY=5eefd216-0e44-4ca7-b421-2925f90d30d5 +RATE_LIMIT_REQUESTS_PER_SECOND=100 +RATE_LIMIT_BURST_SIZE=300 +METRICS_ENABLED=true +METRICS_PORT=8081 +REDIS_URL=redis://localhost:6379 +REDIS_CONNECTION_TIMEOUT_MS=10000 +REDIS_KEY_PREFIX=oz-relayer +RPC_TIMEOUT_MS=10000 +PROVIDER_MAX_RETRIES=3 +PROVIDER_RETRY_BASE_DELAY_MS=100 +PROVIDER_RETRY_MAX_DELAY_MS=2000 +PROVIDER_MAX_FAILOVERS=3 +PROVIDER_FAILURE_THRESHOLD=3 +PROVIDER_PAUSE_DURATION_SECS=60 +PROVIDER_FAILURE_EXPIRATION_SECS=60 +RPC_BLOCK_PRIVATE_IPS=true +RPC_ALLOWED_HOSTS=eth-mainnet.g.alchemy.com,mainnet.infura.io +CONNECTION_BACKLOG=511 +REQUEST_TIMEOUT_SECONDS=30 +RELAYER_CONCURRENCY_LIMIT=100 +MAX_CONNECTIONS=256 +ENABLE_SWAGGER=false +KEYSTORE_PASSPHRASE=your_keystore_passphrase +STORAGE_ENCRYPTION_KEY=X67aXacJB+krEldv9i2w7NCSFwwOzVV/1ELM2KJJjQw= +REPOSITORY_STORAGE_TYPE=redis +RESET_STORAGE_ON_START=false +TRANSACTION_EXPIRATION_HOURS=8 +``` + +### Queue backend configuration + +Set `QUEUE_BACKEND` to choose the queue system: + +- `redis` (default): Redis queue backend via Apalis workers +- `sqs`: AWS SQS queue backend (standard or FIFO queues) + +Example for SQS: + +```bash +QUEUE_BACKEND=sqs +AWS_REGION=us-east-1 +AWS_ACCOUNT_ID=123456789012 +# Optional: "auto" (default), "standard", or "fifo" +# SQS_QUEUE_TYPE=auto +# Optional alternative to AWS_ACCOUNT_ID: +# SQS_QUEUE_URL_PREFIX=https://sqs.us-east-1.amazonaws.com/123456789012/relayer- +``` + +By default (`SQS_QUEUE_TYPE=auto`), the relayer **auto-detects** whether your queues are standard or FIFO at startup by probing the `transaction-request` queue. Set `SQS_QUEUE_TYPE=standard` or `SQS_QUEUE_TYPE=fifo` to skip probing and use the specified type directly. + +For distributed deployments (multiple relayer instances), set: + +```bash +DISTRIBUTED_MODE=true +``` + +This enables distributed locking for cron/cleanup tasks so only one instance executes each scheduled job at a time. + +### SQS queue provisioning guide + +When `QUEUE_BACKEND=sqs`, create queues with the `relayer-` prefix (or your custom `SQS_QUEUE_URL_PREFIX`). By default (`SQS_QUEUE_TYPE=auto`), the relayer auto-detects the queue type at startup by probing a reference queue. You can also set `SQS_QUEUE_TYPE=standard` or `SQS_QUEUE_TYPE=fifo` to skip probing. + +#### Standard queues + +Standard queues offer higher throughput, native per-message `DelaySeconds`, and simpler setup. Duplicate deliveries are possible but harmless since all handlers are idempotent. + +Required queue names: + +- `relayer-transaction-request` +- `relayer-transaction-submission` +- `relayer-status-check` +- `relayer-status-check-evm` +- `relayer-status-check-stellar` +- `relayer-notification` +- `relayer-token-swap-request` +- `relayer-relayer-health-check` + +AWS CLI example (replace ``): + +```bash +aws sqs create-queue \ + --queue-name relayer-transaction-request \ + --attributes VisibilityTimeout=30 +``` + +#### FIFO queues + +FIFO queues provide message ordering per group and exactly-once delivery via deduplication. The relayer sets `MessageGroupId` and `MessageDeduplicationId` on send. + +Required queue names: + +- `relayer-transaction-request.fifo` +- `relayer-transaction-submission.fifo` +- `relayer-status-check.fifo` +- `relayer-status-check-evm.fifo` +- `relayer-status-check-stellar.fifo` +- `relayer-notification.fifo` +- `relayer-token-swap-request.fifo` +- `relayer-relayer-health-check.fifo` + +AWS CLI example (replace ``): + +```bash +aws sqs create-queue \ + --queue-name relayer-transaction-request.fifo \ + --attributes \ +FifoQueue=true,ContentBasedDeduplication=false,VisibilityTimeout=30,DeduplicationScope=messageGroup,FifoThroughputLimit=perMessageGroupId +``` + +For production workloads, enable **high-throughput FIFO** on high-volume queues (transaction-request, transaction-submission, status-check). Set `DeduplicationScope=messageGroup` and `FifoThroughputLimit=perMessageGroupId` to raise throughput from 300 to 70,000 messages/second per queue. + +#### Recommended queue settings + +These settings apply to both standard and FIFO queues: + +| Queue | Visibility timeout (seconds) | Suggested maxReceiveCount (DLQ redrive) | +| --- | --- | --- | +| `transaction-request` | `30` | `6` | +| `transaction-submission` | `30` | `2` | +| `status-check` | `30` | `1000` (or a high value) | +| `status-check-evm` | `30` | `1000` (or a high value) | +| `status-check-stellar` | `20` | `1000` (or a high value) | +| `notification` | `60` | `6` | +| `token-swap-request` | `60` | `3` | +| `relayer-health-check` | `60` | `3` | + +Notes: + +- Status-check queues use short-delay re-enqueue for retries; use a high `maxReceiveCount` to avoid premature DLQ movement. +- Configure a DLQ per queue in production. For FIFO queues, the DLQ must also be FIFO. + +Set redrive policy to attach a DLQ: + +```bash +aws sqs set-queue-attributes \ + --queue-url "https://sqs.us-east-1.amazonaws.com//relayer-transaction-request" \ + --attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"\",\"maxReceiveCount\":\"6\"}"}' +``` + +## Main configuration file (config.json) + +This file can exist in any directory, but the default location is `./config/config.json`. + + + +All components defined in `config.json` can also be managed via REST API endpoints. This provides runtime flexibility for adding, updating, or removing relayers, signers, and notifications without restarting the service. See the **_API Reference_** page for detailed endpoints documentation. + + + +Key sections in this file include: + +- Signers: Defines transaction signing methods. +- Notifications: Sets up status alerts +- Relayers: Configures networks, notifications channels, policies & singers. +- Networks: Defines blockchain network configurations. +- Plugins: Configures plugins. + +### 1. Signers + +Transaction signers are responsible for cryptographically signing transactions before they are submitted to blockchain networks. + +For comprehensive details on configuring all supported signer types including: + +- Local keystore file signers +- HashiCorp Vault (secret and transit) +- Cloud KMS providers (Google Cloud, AWS) +- Turnkey signers +- CDP signers +- Security best practices and troubleshooting + +See the dedicated [Signers Configuration](./configuration/signers) guide. + +Signers can also be managed via API endpoints. + +See the **_API Reference_** page for detailed endpoints documentation. + +### 2. Notifications + +- `notifications` array containing notification entries: + +```json +"notifications": [ + { + "id": "notification-test", + "type": "webhook", + "url": "https://webhook.site/f95cf78d-742d-4b21-88b7-d683e6fd147b", + "signing_key": { + "type": "env", + "value": "WEBHOOK_SIGNING_KEY" + } + } +] +``` + +Available configuration fields +| Field | Type | Description | +| --- | --- | --- | +| id | String | Unique id for the notification | +| type | String | Type of notification (only `webhook` available, for now) | +| url | String | Notification URL | +| signing_key.type | String | Type of key used in signing the notification (`env` or `plain`) | +| signing_key.value | String | Signing key value, env variable name, ... | + +Notifications can also be managed via API endpoints. + +See the **_API Reference_** page for detailed endpoints documentation. + +### 3. Relayers + +- `relayers` array, containing relayer entries: + +```json +"relayers": [ + { + "id": "solana-testnet", + "name": "Solana Testnet", + "paused": false, + "notification_id": "notification-test", + "signer_id": "local-signer", + "network_type": "solana", + "network": "testnet", + "custom_rpc_urls": [ + { + "url": "https://primary-rpc.example.com", + "weight": 2 // Higher weight routes more requests to this endpoint. The value must be an integer between 0 and 100 (inclusive). + }, + { + "url": "https://backup-rpc.example.com", + "weight": 1 + } + ], + "policies": { + "allowed_programs": [ + "11111111111111111111111111111111", + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "BPFLoaderUpgradeab1e11111111111111111111111" + ] + } + } +] +``` + +Available configuration fields +| Field | Type | Description | +| --- | --- | --- | +| id | String | Unique id for the relayer | +| name | String | Human readable name for the relayer | +| paused | Boolean | Whether or not the relayer is paused (`true`, `false`) | +| notification_id | String | ID of a configured notification object | +| signer_id | String | ID of a configured signer | +| network_type | String | Type of network the relayer will connect to (`evm`, `solana`) | +| network | String | Network the relayer will connect to. Must match a network identifier defined in your network configuration files. See [Network Configuration](/relayer/network_configuration) for details on defining networks. | +| custom_rpc_urls | list | Optional custom RPC URLs for the network. If provided, this will be used instead of the public RPC URLs. This is useful for using your own RPC node or a paid service provider. The first url of the list is going to be used as the default | +| policies | list | Overrides default policies. Please refer to the [`Policies`](./configuration#network-policies) table | + +Policies +| Network type | Policy | Type | Description | +| --- | --- | --- | --- | +| solana, evm, stellar | min_balance | `unsigned 128` (evm/solana), `unsigned 64` (stellar) | Minimum balance (in lamports, wei, or stroops) required for the relayer to operate. Optional. | +| solana | fee_payment_strategy | `enum(user,relayer)` | Specifies who pays the fee. "user" (default) means the sender pays; "relayer" means the relayer pays. For "user", RPC methods add an instruction to transfer SPL tokens (calculated from the current SOL price plus a configurable margin) from the user to the relayer, ensuring fees are sustainably covered in tokens rather than SOL. | +| stellar | fee_payment_strategy | `enum(user,relayer)` | Specifies who pays the fee. "user" enables sponsored transactions (users pay fees in tokens), "relayer" means relayer pays all fees in XLM. Optional. | +| solana | swap_config | `SwapConfig` | Optional object configuring automated token‐swaps on Solana. | +| stellar | swap_config | `SwapConfig` | Optional object configuring automated token swaps on Stellar. Includes strategies (order-book, soroswap), cron_schedule, and min_balance_threshold. | +| solana | fee_margin_percentage | `f32` | Additional margin percentage added to estimated transaction fees to account for price fluctuations. For example, a value of 10 will add 10% to estimated fees. Optional. | +| stellar | fee_margin_percentage | `f32` | Fee margin percentage applied when converting XLM fees to token amounts for sponsored transactions. Optional. | +| stellar | slippage_percentage | `f32` | Maximum slippage percentage allowed when swapping tokens via DEX for sponsored transactions. Optional. | +| solana | max_allowed_fee_lamports | `unsigned 64` | Maximum allowed fee (in lamports) for a transaction. Optional. | +| solana | allowed_tokens | `Vector` | List of allowed tokens. Only these tokens are supported if provided. Optional. | +| stellar | allowed_tokens | `Vector` | List of tokens allowed for fee payments in sponsored transactions. Each token includes asset, max_allowed_fee (optional), and swap_config (optional). Optional. | +| solana | allowed_programs | `Vector` | List of allowed programs by their identifiers. Only these programs are supported if provided. | +| solana | allowed_accounts | `Vector` | List of allowed accounts by their public keys. The relayer will only operate with these accounts if provided. | +| solana | disallowed_accounts | `Vector` | List of disallowed accounts by their public keys. These accounts will be explicitly blocked. | +| solana | max_tx_data_size | `unsigned 16` | Maximum transaction size. Optional. | +| solana | max_signatures | `unsigned 8` | Maximum supported signatures. Optional. | +| stellar | max_fee | `unsigned 32` | Maximum transaction fee in stroops (1 XLM = 10,000,000 stroops) the relayer is willing to pay. Optional. | +| stellar | timeout_seconds | `unsigned 64` | Transaction timeout in seconds. Optional. | +| stellar | concurrent_transactions | `bool` | Enable concurrent transaction processing. When enabled, bypasses the lane gating mechanism that normally ensures sequential processing for each relayer. Only enable this when your relayer manages transactions from multiple accounts with independent sequence number pools. Optional. | +| evm | gas_price_cap | `unsigned 128` | Specify a maximum gas price for every transaction sent with the Relayer. When enabled, any transaction exceeding the cap will have its gasPrice or maxFeePerGas overwritten. (Optional) | +| evm | gas_limit_estimation | `bool` | Automatic gas_limit calculation. Enabled by default. (Optional) | +| evm | whitelist_receivers | `Vector` | A list of authorized contracts for each transaction sent using the Relayer. Transactions will be rejected if the destination address is not on the list. (Optional) | + +#### RPC URL Configuration + +The relayer supports two ways to configure RPC URLs: + +1. **_Public RPC URLs_**: These are the default RPC endpoints provided by the network. They are automatically selected based on the network configuration. +2. **_Custom RPC URLs_**: You can specify custom RPC URLs using the `custom_rpc_urls` field in the relayer configuration. Each URL can be configured with an optional weight for high availability: + +```json +"custom_rpc_urls": [ + { + "url": "https://primary-rpc.example.com", + "weight": 2 // Higher weight routes more requests to this endpoint. The value must be an integer between 0 and 100 (inclusive). + }, + { + "url": "https://secondary-rpc.example.com", + "weight": 100, // Max allowed weight + }, + { + "url": "https://backup-rpc.example.com" // No weight specified, defaults to 100 + }, + { + "url": "https://backup2-rpc.example.com", + "weight": 0, // A value of 0 disables the endpoint. + } +] +``` + +This is useful when you want to: + +- Use your own RPC nodes with load balancing +- Use a paid service provider for better reliability and performance +- Override the default public RPC URLs +- Access custom network endpoints +- Configure primary and backup endpoints with different weights + +When both are available, the relayer will: + +1. First attempt to use the `custom_rpc_urls` if configured. +2. Fall back to the public RPC URLs if no custom URL is configured. + +For backward compatibility, string arrays are still supported: + +```json +"custom_rpc_urls": ["https://your-rpc.example.com"] +``` + +#### Provider Health Management + +The relayer automatically tracks the health of RPC providers and manages failover: + +- **Failure Tracking**: When a provider fails, the failure is recorded with a timestamp. Failures older than `PROVIDER_FAILURE_EXPIRATION_SECS` (default: 60 seconds) are automatically considered stale and removed. + +- **Automatic Pausing**: When a provider reaches `PROVIDER_FAILURE_THRESHOLD` (default: 3) failures within the expiration window, it is automatically paused for `PROVIDER_PAUSE_DURATION_SECS` (default: 60 seconds). During this pause period, the relayer will attempt to use other available providers. + +- **Automatic Recovery**: After the pause duration expires, the provider becomes available again. Additionally, if all failures expire (older than `PROVIDER_FAILURE_EXPIRATION_SECS`), the provider automatically recovers even if it hasn't reached the pause expiration time. + +- **Fallback Behavior**: If all non-paused providers are unavailable, the relayer will fall back to paused providers as a last resort, ensuring maximum availability. + +You can configure these behaviors using the environment variables: + +- `PROVIDER_FAILURE_THRESHOLD`: Number of failures before pausing (default: 3) +- `PROVIDER_PAUSE_DURATION_SECS`: How long to pause a failed provider (default: 60 seconds) +- `PROVIDER_FAILURE_EXPIRATION_SECS`: How long failures are remembered (default: 60 seconds) + +#### RPC URL Security + +You can configure the following security features via environment variables: + +- **`RPC_ALLOWED_HOSTS`**: Comma-separated list of allowed RPC hostnames/IPs. If non-empty, only URLs with these hosts are permitted. + + - Example: `RPC_ALLOWED_HOSTS=eth-mainnet.g.alchemy.com,mainnet.infura.io` + +- **`RPC_BLOCK_PRIVATE_IPS`**: Block private IP addresses (RFC 1918, loopback, link-local). Set to `true` to prevent RPC URLs from targeting private networks. + - Example: `RPC_BLOCK_PRIVATE_IPS=true` + - Default: `false` (for backwards compatibility) + + + +Cloud metadata endpoints (`169.254.169.254`, `fd00:ec2::254`) are **always blocked** to prevent credential theft, regardless of configuration. + + + +**Recommended Production Configuration:** + +```bash +RPC_BLOCK_PRIVATE_IPS=true +RPC_ALLOWED_HOSTS=eth-mainnet.g.alchemy.com,mainnet.infura.io,eth.llamarpc.com +``` + + + +When using custom RPC URLs: + +- Ensure the URLs are secure (HTTPS) when accessing over public networks +- Keep your API keys and authentication tokens secure +- Test the RPC endpoints' reliability and performance before using it in production +- Configure weights to prioritize endpoints, assigning higher values to more reliable or performant ones. +- The weight must be an integer between 0 and 100 (inclusive). +- A weight of 0 disables the endpoint. +- If a weight is not specified for an endpoint, it defaults to 100. + + + +Relayers could also be managed via API endpoints. + +See the **_API Reference_** page for detailed endpoints documentation. + +### 4. Plugins + +For more information on how to write a plugin, please refer to the [Plugins](/relayer/plugins) page. + +- `plugins` array, containing plugin configurations: + +```json +"plugins": [ + { + "id": "my-plugin", + "path": "my-plugin.ts" + } +] +``` + +Available configuration fields +| Field | Type | Description | +| --- | --- | --- | +| id | String | Unique id for the plugin | +| path | String | Path to the plugin file | + +### 5. Networks + +You can configure networks either: + +- In separate JSON files (recommended for better organization) +- Directly in your main `config.json` + +For comprehensive network configuration details, including: + +- Network field reference +- Configuration examples for all network types +- Network inheritance +- Special tags and their behavior +- Best practices and troubleshooting + +See the dedicated [Network Configuration](/relayer/network_configuration) guide. + +## Configuration File Example + +Full `config/config.json` example with evm and solana relayers definitions using keystore signer: + +```json +{ + "relayers": [ + { + "id": "sepolia-example", + "name": "Sepolia Example", + "network": "sepolia", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "evm", + "custom_rpc_urls": [ + { + "url": "https://primary-rpc.example.com", + "weight": 2 + }, + { + "url": "https://backup-rpc.example.com", + "weight": 1 + } + ], + "policies": { + "gas_price_cap": 30000000000000, + "eip1559_pricing": true + } + }, + { + "id": "solana-example", + "name": "Solana Example", + "network": "devnet", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "solana", + "custom_rpc_urls": [ + { + "url": "https://primary-solana-rpc.example.com", + "weight": 2 + }, + { + "url": "https://backup-solana-rpc.example.com", + "weight": 1 + } + ], + "policies": { + "fee_payment_strategy": "user", + "min_balance": 0, + "allowed_tokens": [ + { + "mint": "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr", + "max_allowed_fee": 100000000 + }, + { + "mint": "So11111111111111111111111111111111111111112" + } + ] + } + }, + { + "id": "solana-mainnet-example", + "name": "Solana Mainnet Example", + "network": "mainnet-beta", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "solana", + "custom_rpc_urls": ["https://your-private-solana-rpc.example.com"], + "policies": { + "fee_payment_strategy": "user", + "min_balance": 0, + "swap_config": { + "cron_schedule": "0 0 * * * *", + "min_balance_threshold": 0, + "strategy": "jupiter-ultra" + }, + "allowed_tokens": [ + { + "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "max_allowed_fee": 100000000, + "swap_config": { + "min_amount": 0, + "max_amount": 0, + "retain_min_amount": 0 + } + }, + { + "mint": "So11111111111111111111111111111111111111112" + } + ] + } + } + ], + "notifications": [ + { + "id": "notification-example", + "type": "webhook", + "url": "https://webhook.site/1384d4d9-21b1-40a0-bcd1-d3f3b66be955", + "signing_key": { + "type": "env", + "value": "WEBHOOK_SIGNING_KEY" + } + } + ], + "signers": [ + { + "id": "local-signer", + "type": "local", + "config": { + "path": "config/keys/local-signer.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE" + } + } + } + ], + "networks": [ + { + "average_blocktime_ms": 12000, + "chain_id": 11155111, + "explorer_urls": [ + "https://api-sepolia.etherscan.io/api", + "https://sepolia.etherscan.io" + ], + "features": ["eip1559"], + "is_testnet": true, + "network": "sepolia", + "required_confirmations": 6, + "rpc_urls": [ + "https://sepolia.drpc.org", + "https://1rpc.io/sepolia", + "https://ethereum-sepolia-rpc.publicnode.com", + "https://ethereum-sepolia-public.nodies.app" + ], + "symbol": "ETH", + "tags": ["deprecated"], + "type": "evm" + }, + { + "type": "solana", + "network": "devnet", + "rpc_urls": ["https://api.devnet.solana.com"], + "explorer_urls": ["https://explorer.solana.com?cluster=devnet"], + "average_blocktime_ms": 400, + "is_testnet": true + }, + { + "type": "solana", + "network": "mainnet-beta", + "rpc_urls": ["https://api.mainnet-beta.solana.com"], + "explorer_urls": ["https://explorer.solana.com"], + "average_blocktime_ms": 400, + "is_testnet": false + } + ] +} +``` + +## Configuration Management Approaches + +The OpenZeppelin Relayer supports two complementary approaches for configuration management: + +### File-based Configuration + +- Ideal for initial setup and deployment +- Configuration persists across restarts +- Requires container restart for changes to take effect +- Suitable for infrastructure-as-code workflows + +### API-based Configuration + +- Enables runtime configuration changes +- No service restarts required +- Perfect for dynamic environments +- Supports automated configuration management + + + +See [Storage Configuration](./configuration/storage) for detailed information about how file-based and API-based configurations work together, storage behavior, and best practices. + + diff --git a/content/relayer/1.5.x/configuration/network.mdx b/content/relayer/1.5.x/configuration/network.mdx new file mode 100644 index 00000000..3901b5b8 --- /dev/null +++ b/content/relayer/1.5.x/configuration/network.mdx @@ -0,0 +1,399 @@ +--- +title: Network Configuration +--- + +The OpenZeppelin Relayer supports multiple blockchain networks through a flexible JSON-based configuration system. This guide covers everything you need to know about configuring networks for your relayer instances. + +## Overview + +Networks are defined in JSON configuration files, allowing you to: + +- Configure **_any EVM-compatible network_** (Ethereum, Polygon, BSC, Arbitrum, Optimism, etc.) +- Set up **_Solana networks_** (mainnet-beta, devnet, testnet, custom RPC endpoints) +- Configure **_Stellar networks_** (Pubnet, Testnet, custom networks) +- Create **_custom network configurations_** with specific RPC endpoints, chain IDs, and network parameters +- Use **_inheritance_** to create network variants without duplicating configuration + +## Network Types + +| Network Type | Description | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `evm` | Ethereum Virtual Machine compatible networks. Supports any EVM chain by configuring chain ID, RPC URLs, and network-specific parameters. | +| `solana` | Solana blockchain networks. Supports all Solana clusters and custom RPC endpoints. | +| `stellar` | Stellar blockchain networks. Supports Stellar Public Network and Testnet. | + +## Configuration Methods + +### Default Network Configuration + +If no `networks` field is specified in your `config.json`, the relayer will automatically load network configurations from the `./config/networks` directory. This is the default behavior. + +```json +{ + "relayers": [...], + "notifications": [...], + "signers": [...] + // No "networks" field - defaults to "./config/networks" +} +``` + + + Once you specify a `networks` field in your configuration, the default + `./config/networks` directory will ***not*** be loaded automatically. If you + want to use files from that directory, you must explicitly specify the path + `"./config/networks"`. + + +You can configure networks in two ways: + +### Method 1: Separate JSON Files + +Specify the path to network configuration files in your main `config.json`: + +```json +{ + "relayers": [...], + "notifications": [...], + "signers": [...], + "networks": "./config/networks" // Path to directory or file +} +``` + + + This is the same as the default behavior, but explicitly specified. You can + also point to a different directory or file path. + + +Each JSON file **_must_** contain a top-level `networks` array: + +```json +{ + "networks": [ + // ... network definitions ... + ] +} +``` + +When using a directory structure: + +``` +networks/ +├── evm.json # {"networks": [...]} +├── solana.json # {"networks": [...]} +└── stellar.json # {"networks": [...]} +``` + +### Method 2: Direct Configuration + +Define networks directly in your main `config.json` instead of using separate files: + +```json +{ + "relayers": [...], + "notifications": [...], + "signers": [...], + "networks": [ + { + "type": "evm", + "network": "ethereum-mainnet", + "chain_id": 1, + // ... other fields + } + ] +} +``` + +When using this method, the default `./config/networks` directory is ignored, and only the networks defined in this array will be available. + +## Network Field Reference + +### Common Fields + +All network types support these configuration fields: + +| Field | Type | Required | Description | +| ---------------------- | ------------- | -------- | -------------------------------------------------------------------------------- | +| `type` | string | Yes | Network type: `"evm"`, `"solana"`, or `"stellar"` | +| `network` | string | Yes | Unique network identifier (e.g., "ethereum-mainnet", "polygon-mumbai") | +| `from` | string | No | Name of parent network to inherit from (same type only) | +| `rpc_urls` | array[string] | Yes\* | List of RPC endpoint URLs (\*Required for base networks, optional for inherited) | +| `explorer_urls` | array[string] | No | List of blockchain explorer URLs | +| `average_blocktime_ms` | number | No | Estimated average time between blocks in milliseconds | +| `is_testnet` | boolean | No | Whether this is a testnet (affects behavior and validation) | +| `tags` | array[string] | No | Arbitrary tags for categorization and filtering | + +### Special Network Tags + +Some tags have special meaning and affect relayer behavior: + +| Tag | Description and Behavior | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `rollup` | Identifies Layer 2 rollup networks (e.g., Arbitrum, Optimism, Base) | +| `optimism-based` | Identifies Optimism-based networks using the OP Stack (e.g., Optimism, Base, World Chain) | +| `optimism` _(deprecated)_ | **_DEPRECATED_**: Use `optimism-based` instead. This tag will be removed in a future version. | +| `arbitrum-based` | Identifies Arbitrum-based networks using the Arbitrum Stack | +| `no-mempool` | Indicates networks that lack a traditional mempool (e.g., Arbitrum). Note: The relayer also treats networks tagged as `arbitrum-based` or `optimism-based` as lacking a mempool, even if `no-mempool` is not present. | +| `deprecated` | Marks networks that are deprecated and may be removed in future versions | + +#### Example: Using Special Tags + +Here’s an example showing how special tags are used in practice: + +```json +{ + "type": "evm", + "network": "arbitrum-one", + "chain_id": 42161, + "required_confirmations": 1, + "symbol": "ETH", + "rpc_urls": ["https://arb1.arbitrum.io/rpc"], + "tags": ["rollup", "no-mempool"], // Arbitrum is a rollup without mempool + "is_testnet": false +} +``` + +These tags help the relayer: + +- Apply specific transaction handling for rollups +- Use optimized fee calculation for OP Stack chains +- Skip mempool-related operations for networks without mempools +- Warn users about deprecated networks + +### EVM-Specific Fields + + + The OpenZeppelin Relayer supports any EVM-based L1 blockchain, as long as it + doesn’t deviate significantly from standard EVM behavior. Some L2 networks may + also work, depending on how closely they follow EVM conventions. Users are + encouraged to add the networks they need via the JSON configuration and test + them thoroughly on testnets before deploying to production. + + +| Field | Type | Required | Description | +| ------------------------ | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| `chain_id` | number | Yes\* | Unique chain identifier (e.g., 1 for Ethereum mainnet, 137 for Polygon) (\*Required for base networks, optional for inherited) | +| `required_confirmations` | number | Yes\* | Number of block confirmations before considering a transaction final (\*Required for base networks, optional for inherited) | +| `symbol` | string | Yes\* | Native currency symbol (e.g., "ETH", "MATIC", "BNB") (\*Required for base networks, optional for inherited) | +| `features` | array[string] | No | Supported features (e.g., ["eip1559", "london"]) | + +#### Example: EVM Network Configuration + +Here’s an example showing an EVM network configuration: + +```json +{ + "type": "evm", + "network": "ethereum-mainnet", + "chain_id": 1, // Ethereum mainnet chain ID + "required_confirmations": 12, // High security: 12 confirmations + "symbol": "ETH", // Native currency symbol + "features": ["eip1559"], // Supports EIP-1559 fee market + "rpc_urls": ["https://mainnet.infura.io/v3/YOUR_KEY"], + "is_testnet": false +} +``` + +### Solana-Specific Fields + +Currently, Solana networks use only the common fields. Additional Solana-specific configuration options may be added in future versions. + +### Stellar-Specific Fields + +| Field | Type | Required | Description | +| ------------ | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| `passphrase` | string | No | Network passphrase for transaction signing and network identification (optional for all networks, including base networks) | + +#### Example: Stellar Network Configuration + +Here’s an example showing a Stellar network configuration with passphrase: + +```json +{ + "type": "stellar", + "network": "pubnet", + "rpc_urls": ["https://mainnet.sorobanrpc.com"], + "explorer_urls": ["https://stellar.expert/explorer/public"], + "passphrase": "Public Global Stellar Network ; September 2015", // Official mainnet passphrase + "average_blocktime_ms": 5000, + "is_testnet": false +} +``` + +## Configuration Examples + +### Basic EVM Network + +```json +{ + "type": "evm", + "network": "ethereum-mainnet", + "chain_id": 1, + "required_confirmations": 12, + "symbol": "ETH", + "rpc_urls": ["https://mainnet.infura.io/v3/YOUR_KEY"], + "explorer_urls": ["https://etherscan.io"], + "average_blocktime_ms": 12000, + "is_testnet": false, + "tags": ["mainnet", "ethereum"] +} +``` + +### Layer 2 EVM Network with Tags + +```json +{ + "type": "evm", + "network": "optimism", + "chain_id": 10, + "required_confirmations": 1, + "symbol": "ETH", + "rpc_urls": ["https://mainnet.optimism.io", "https://optimism.drpc.org"], + "features": ["eip1559"], + "tags": ["rollup", "optimism-based"], + "average_blocktime_ms": 2000, + "is_testnet": false +} +``` + +### Solana Network + +```json +{ + "type": "solana", + "network": "mainnet-beta", + "rpc_urls": ["https://api.mainnet-beta.solana.com"], + "explorer_urls": ["https://explorer.solana.com"], + "average_blocktime_ms": 400, + "is_testnet": false, + "tags": ["mainnet", "solana"] +} +``` + +### Stellar Network + +```json +{ + "type": "stellar", + "network": "pubnet", + "rpc_urls": ["https://mainnet.sorobanrpc.com"], + "passphrase": "Public Global Stellar Network ; September 2015", + "explorer_urls": ["https://stellar.expert/explorer/public"], + "average_blocktime_ms": 5000, + "is_testnet": false, + "tags": ["mainnet", "stellar"] +} +``` + +## Network Inheritance + +Networks can inherit from other networks of the same type, allowing you to create variants without duplicating configuration: + +```json +{ + "networks": [ + { + "type": "evm", + "network": "ethereum-base", + "chain_id": 1, + "required_confirmations": 12, + "symbol": "ETH", + "rpc_urls": ["https://mainnet.infura.io/v3/YOUR_KEY"] + }, + { + "from": "ethereum-base", + "type": "evm", + "network": "ethereum-sepolia", + "chain_id": 11155111, + "required_confirmations": 3, + "rpc_urls": ["https://sepolia.infura.io/v3/YOUR_KEY"], + "is_testnet": true + } + ] +} +``` + +When using inheritance: + +- The child network inherits all fields from the parent +- Fields specified in the child override parent values +- The `from` field must reference a network of the same type + +## Using Networks in Relayer Configuration + +Once networks are defined, reference them in your relayer configurations: + +```json +{ + "relayers": [ + { + "id": "my-evm-relayer", + "name": "My EVM Relayer", + "network": "ethereum-mainnet", // References network ID + "network_type": "evm", + "signer_id": "my-signer" + } + ] +} +``` + +## Best Practices + +### 1. Network Organization + +- Group related networks in separate files (e.g., `ethereum.json`, `polygon.json`) +- Use consistent naming conventions for network identifiers +- Include both mainnet and testnet configurations + +### 2. RPC URLs + +- Always configure multiple RPC URLs for redundancy +- Use private/dedicated RPC endpoints for production +- Ensure URLs are secure (HTTPS) when accessing over public networks +- Configure `RPC_ALLOWED_HOSTS` and `RPC_BLOCK_PRIVATE_IPS` environment variables for SSRF protection in production. See [Configuration → RPC URL Security](/relayer/configuration#rpc-url-security) for details. + +### 3. Confirmation Requirements + +- Set appropriate `required_confirmations` based on network security +- Higher values for mainnet, lower for testnets +- Consider network-specific finality characteristics + +### 4. Tags and Features + +- Use tags to categorize networks (e.g., "mainnet", "testnet", "rollup") +- Enable appropriate features (e.g., "eip1559" for supported networks) +- Document custom tags used in your organization + +### 5. Inheritance + +- Create base configurations for common settings +- Use inheritance to reduce duplication +- Override only necessary fields in child networks + +## Troubleshooting + +### Common Issues + +**_Network not found:_** + +- Ensure the network identifier in relayer config matches exactly +- Check that network configuration files are in the correct location +- Verify JSON syntax is valid + +**_RPC connection failures:_** + +- Test RPC URLs independently before configuring +- Ensure firewall/network allows outbound HTTPS connections +- Check API keys are included in RPC URLs where required + +**_Invalid configuration:_** + +- Validate required fields are present for network type +- Ensure numeric fields (chain_id, confirmations) are numbers, not strings +- Check that inherited networks reference existing parent networks + +## See Also + +- [Relayer Configuration](/relayer/configuration) +- [Quickstart Guide](/relayer/quickstart) +- [Solana Integration](/relayer/solana) +- [API Reference](/relayer/api) diff --git a/content/relayer/1.5.x/configuration/signers.mdx b/content/relayer/1.5.x/configuration/signers.mdx new file mode 100644 index 00000000..d465e51f --- /dev/null +++ b/content/relayer/1.5.x/configuration/signers.mdx @@ -0,0 +1,374 @@ +--- +title: Signers Configuration +--- + +## Overview + +Signers are responsible for cryptographically signing transactions before they are submitted to blockchain networks. OpenZeppelin Relayer supports multiple signer types to accommodate different security requirements and infrastructure setups. + +Each signer is referenced by its `id` in relayer configurations. + +## Configuration Structure + +Example signer configuration: +```json +"signers": [ + { + "id": "my_id", + "type": "local", + "config": { + "path": "config/keys/local-signer.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE" + } + } + } +] +``` + +## Supported Signer Types + +OpenZeppelin Relayer supports the following signer types: + +* `local`: Keystore file signer +* `vault`: HashiCorp Vault secret signer +* `vault_transit`: HashiCorp Vault Transit signer +* `turnkey`: Turnkey signer +* `google_cloud_kms`: Google Cloud KMS signer +* `aws_kms`: Amazon AWS KMS signer +* `cdp`: Coinbase Developer Platform signer + +## Network Compatibility Matrix + +The following table shows which signer types are compatible with each network type: + +| Signer Type | EVM Networks | Solana Networks | Stellar Networks | +| --- | --- | --- | --- | +| `local` | ✅ Supported | ✅ Supported | ✅ Supported | +| `vault` | ✅ Supported | ✅ Supported | ❌ Not supported | +| `vault_transit` | ❌ Not supported | ✅ Supported | ❌ Not supported | +| `turnkey` | ✅ Supported | ✅ Supported | ✅ Supported | +| `google_cloud_kms` | ✅ Supported | ✅ Supported | ✅ Supported | +| `aws_kms` | ✅ Supported | ✅ Supported | ✅ Supported | +| `cdp` | ✅ Supported | ✅ Supported | ❌ Not supported | + + + + +***Network-specific considerations:*** + +* ***EVM Networks***: Use secp256k1 cryptography. Most signers support EVM networks with proper key generation. +* ***Solana Networks***: Use ed25519 cryptography. Ensure your signer supports ed25519 key generation and signing. +* ***Stellar Networks***: Use ed25519 cryptography with specific Stellar requirements. Supported by local, AWS KMS, Google Cloud KMS, and Turnkey signers. +* ***AWS KMS***: Supports secp256k1 (EVM) and ed25519 (Solana, Stellar) key types. +* ***Google Cloud KMS***: Supports secp256k1 (EVM) and ed25519 (Solana, Stellar) key types. +* ***Turnkey***: Supports EVM, Solana, and Stellar networks with appropriate key management. + + + +## Common Configuration Fields + +All signer types share these common configuration fields: + +| Field | Type | Description | +| --- | --- | --- | +| id | String | Unique identifier for the signer (used to reference this signer in relayer configurations) | +| type | String | Type of signer (see supported signer types above) | +| config | Map | Signer type-specific configuration object | + +## Local Signer Configuration + +The local signer uses encrypted keystore files stored on the filesystem. + +```json +{ + "id": "local-signer", + "type": "local", + "config": { + "path": "config/keys/local-signer.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE" + } + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| path | String | Path to the signer JSON file. Should be under the `./config` directory | +| passphrase.type | String | Type of passphrase source (`env` or `plain`) | +| passphrase.value | String | Passphrase value or environment variable name | + +## HashiCorp Vault Signer Configuration + +### Vault Secret Signer + +Uses HashiCorp Vault’s secret engine to store private keys. + +```json +{ + "id": "vault-signer", + "type": "vault", + "config": { + "address": "https://vault.example.com", + "role_id": { + "type": "env", + "value": "VAULT_ROLE_ID" + }, + "secret_id": { + "type": "env", + "value": "VAULT_SECRET_ID" + }, + "key_name": "relayer-key", + "mount_point": "secret" + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| address | String | Specifies the Vault API endpoint | +| role_id.type | String | Type of value source (`env` or `plain`) | +| role_id.value | String | The Vault AppRole role identifier value, or the environment variable name where the AppRole role identifier is stored | +| secret_id.type | String | Type of value source (`env` or `plain`) | +| secret_id.value | String | The Vault AppRole role secret value, or the environment variable name where the AppRole secret value is stored | +| key_name | String | The name of the cryptographic key within Vault’s Secret engine that is used for signing operations | +| mount_point | String | The mount point for the Secrets engine in Vault. Defaults to `secret` if not explicitly specified. Optional. | + +### Vault Transit Signer + +Uses HashiCorp Vault’s Transit secrets engine for cryptographic operations. + +```json +{ + "id": "vault-transit-signer", + "type": "vault_transit", + "config": { + "address": "https://vault.example.com", + "role_id": { + "type": "env", + "value": "VAULT_ROLE_ID" + }, + "secret_id": { + "type": "env", + "value": "VAULT_SECRET_ID" + }, + "key_name": "relayer-transit-key", + "mount_point": "transit", + "namespace": "production", + "pubkey": "your-public-key-here" + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| address | String | Specifies the Vault API endpoint | +| role_id.type | String | Type of value source (`env` or `plain`) | +| role_id.value | String | The Vault AppRole role identifier value, or the environment variable name where the AppRole role identifier is stored | +| secret_id.type | String | Type of value source (`env` or `plain`) | +| secret_id.value | String | The Vault AppRole role secret value, or the environment variable name where the AppRole secret value is stored | +| key_name | String | The name of the cryptographic key within Vault’s Transit engine that is used for signing operations | +| mount_point | String | The mount point for the Transit secrets engine in Vault. Defaults to `transit` if not explicitly specified. Optional. | +| namespace | String | The Vault namespace for API calls. This is used only in Vault Enterprise environments. Optional. | +| pubkey | String | Public key of the cryptographic key within Vault’s Transit engine that is used for signing operations | + +## Turnkey Signer Configuration + +Uses Turnkey’s secure key management infrastructure. + +```json +{ + "id": "turnkey-signer", + "type": "turnkey", + "config": { + "api_public_key": "your-api-public-key", + "api_private_key": { + "type": "env", + "value": "TURNKEY_API_PRIVATE_KEY" + }, + "organization_id": "your-org-id", + "private_key_id": "your-private-key-id", + "public_key": "your-public-key" + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| api_public_key | String | The public key associated with your Turnkey API access credentials. Used for authentication to the Turnkey signing service | +| api_private_key.type | String | Type of value source (`env` or `plain`) | +| api_private_key.value | String | The Turnkey API private key or environment variable name containing it. Used with the public key to authenticate API requests | +| organization_id | String | Your unique Turnkey organization identifier. Required to access resources within your specific organization | +| private_key_id | String | The unique identifier of the private key in your Turnkey account that will be used for signing operations | +| public_key | String | The public key corresponding to the private key identified by private_key_id. Used for address derivation and signature verification | + +## Google Cloud KMS Signer Configuration + +Uses Google Cloud Key Management Service for secure key operations. + + + + +***Network-specific key requirements:*** + +For ***EVM*** transaction signing, ensure your Google Cloud KMS key is created with: +- Protection level: HSM +- Purpose: Asymmetric sign +- Algorithm: "Elliptic Curve secp256k1 - SHA256 Digest" + +For ***Solana*** and ***Stellar*** transaction signing, ensure your Google Cloud KMS key is created with: +- Protection level: Software or HSM +- Purpose: Asymmetric sign +- Algorithm: "Elliptic Curve ED25519 Key" + + + +```json +{ + "id": "gcp-kms-signer", + "type": "google_cloud_kms", + "config": { + "service_account": { + "project_id": "your-gcp-project", + "private_key_id": { + "type": "env", + "value": "GCP_PRIVATE_KEY_ID" + }, + "private_key": { + "type": "env", + "value": "GCP_PRIVATE_KEY" + }, + "client_email": { + "type": "env", + "value": "GCP_CLIENT_EMAIL" + }, + "client_id": "your-client-id" + }, + "key": { + "location": "us-west2", + "key_ring_id": "relayer-keyring", + "key_id": "relayer-key", + "key_version": 1 + } + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| service_account.project_id | String | The Google Cloud project ID where your KMS resources are located | +| service_account.private_key_id.type | String | Type of value source for the private key ID (`env` or `plain`) | +| service_account.private_key_id.value | String | The private key ID value or the environment variable name containing it | +| service_account.private_key.type | String | Type of value source for the private key (`env` or `plain`) | +| service_account.private_key.value | String | The Google Cloud service account private key (PEM format) or the environment variable name containing it | +| service_account.client_email.type | String | Type of value source for the client email (`env` or `plain`) | +| service_account.client_email.value | String | The Google Cloud service account client email or the environment variable name containing it | +| service_account.client_id | String | The Google Cloud service account client ID | +| key.location | String | The Google Cloud location (region) where your KMS key ring is located (e.g., "us-west2", "global") | +| key.key_ring_id | String | The KMS key ring ID containing your cryptographic key | +| key.key_id | String | The KMS key ID used for signing operations | +| key.key_version | Integer | The version of the KMS key to use for signing operations. Defaults to 1 | + +## AWS KMS Signer Configuration + +Uses Amazon Web Services Key Management Service for cryptographic operations. + +```json +{ + "id": "aws-kms-signer", + "type": "aws_kms", + "config": { + "region": "us-west-2", + "key_id": "arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012" + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| region | String | AWS region. If the key is non-replicated across regions, this must match the key's original region. Optional. If not specified, the default region from shared credentials is used | +| key_id | String | ID of the key in AWS KMS (can be key ID, key ARN, alias name, or alias ARN) | + +## CDP Signer Configuration + +Uses CDP’s secure key management infrastructure. + +```json +{ + "id": "cdp-signer", + "type": "cdp", + "config": { + "api_key_id": "your-cdp-api-key-id", + "api_key_secret": { + "type": "env", + "value": "CDP_API_KEY_SECRET" + }, + "wallet_secret": { + "type": "env", + "value": "CDP_WALLET_SECRET" + }, + "account_address": "your-cdp-evm-or-solana-account-address" + } +} +``` + +Configuration fields: +| Field | Type | Description | +| --- | --- | --- | +| api_key_id | String | The Key ID of a Secret API Key. Used for authentication to the CDP signing service | +| api_key_secret.type | String | Type of value source (`env` or `plain`) | +| api_key_secret.value | String | The API key secret or environment variable name containing it. Used with the Key ID to authenticate API requests | +| wallet_secret.type | String | Type of value source (`env` or `plain`) | +| wallet_secret.value | String | The Wallet Secret or environment variable name containing it. Used to authorize API requests for signing operations. | +| account_address | String | The address of the CDP EVM EOA or CDP Solana Account used for signing operations. | + +## Security Best Practices + +### File Permissions +* Set restrictive permissions on keystore files: `chmod 0500 config/keys/*` +* Ensure configuration directories are properly secured +* Use environment variables for sensitive data like passphrases and API keys + +### Key Management +* Use HSM-backed keys for production environments when available +* Implement proper key rotation policies +* Never commit private keys or sensitive configuration to version control +* Use dedicated service accounts with minimal required permissions + +### Environment Separation +* Use different signers for different environments (development, staging, production) +* Implement proper secrets management in production deployments +* Consider using cloud-native key management services for enhanced security + +## Troubleshooting + +### Common Issues + +***Invalid keystore passphrase*** + +* Verify the passphrase environment variable is correctly set +* Check that the keystore file is not corrupted +* Ensure the keystore format is compatible + +***Cloud KMS authentication failures*** + +* Verify service account credentials are valid and properly formatted +* Check that the service account has necessary permissions for KMS operations +* Ensure the KMS key exists and is in the correct region/project + +***Vault connection issues*** + +* Verify Vault server address and network connectivity +* Check AppRole credentials and permissions +* Ensure the secret/transit engine is properly mounted and configured + +For additional troubleshooting help, check the application logs and refer to the specific cloud provider or service documentation. diff --git a/content/relayer/1.5.x/configuration/storage.mdx b/content/relayer/1.5.x/configuration/storage.mdx new file mode 100644 index 00000000..b9f9f41b --- /dev/null +++ b/content/relayer/1.5.x/configuration/storage.mdx @@ -0,0 +1,197 @@ +--- +title: Storage Configuration +--- + +## Overview + +OpenZeppelin Relayer supports two storage backends for persisting configuration data and transaction state. The choice of storage backend affects how configuration is managed, data persistence, and performance characteristics. + + + + +Storage type determines how your configuration changes persist and how file-based and API-based configuration interact. Choose the right storage type for your deployment needs. + + + + + + +***Community Contributions Welcome***: Additional storage backends (such as PostgreSQL, MongoDB, or other databases) are welcomed as contributions from the open source community. The storage system is designed to be extensible, making it straightforward to add new storage implementations. + + + +## Storage Types + +### In-Memory Storage + +In-memory storage keeps all configuration and transaction data in the application’s memory. + +#### Use Cases +* ***Development and testing environments*** +* ***Temporary deployments*** +* ***Single-instance deployments*** +* ***When data persistence across restarts is not required*** + +#### Characteristics +* ***Fast Performance***: No network overhead for data access +* ***No External Dependencies***: Does not require Redis or other external services +* ***No Persistence***: All data is lost when the container restarts +* ***Single Instance***: Cannot be shared across multiple relayer instances + +#### Configuration Sync Behavior +* Configuration from `config.json` is loaded on every startup +* API changes are ***not*** synchronized back to `config.json` file +* All API-based configuration changes are lost on restart +* File-based configuration always takes precedence on startup + +```bash +# Enable in-memory storage +REPOSITORY_STORAGE_TYPE=in-memory +``` + +### Redis Storage + +Redis storage persists all configuration and transaction data in a Redis database. + +#### Use Cases +* ***Production deployments*** +* ***Multi-instance deployments*** +* ***When data persistence is required*** +* ***Scalable environments*** +* ***When API-based configuration changes should persist*** + +#### Characteristics +* ***Persistent***: Data survives container restarts +* ***Network Dependency***: Requires Redis connection +* ***Encryption***: Supports encryption at rest for sensitive data + +#### Configuration Sync Behavior +* Configuration from `config.json` is loaded into Redis ***only once*** during the first startup +* Subsequent startups use the configuration stored in Redis +* API changes are persisted and survive restarts +* File-based configuration can override Redis by setting `RESET_STORAGE_ON_START=true` + +```bash +# Enable Redis storage +REPOSITORY_STORAGE_TYPE=redis +REDIS_URL=redis://localhost:6379 +STORAGE_ENCRYPTION_KEY=your-encryption-key-here +``` + +## Configuration Reference + +### Core Storage Settings + +| Environment Variable | Default Value | Accepted Values | Description | +| --- | --- | --- | --- | +| `REPOSITORY_STORAGE_TYPE` | `in-memory` | `in-memory, redis` | Type of storage backend used for storing configuration and transaction data. | +| `RESET_STORAGE_ON_START` | `false` | `true, false` | When `true`, clears all data from storage on startup and reloads from config files. Useful for forcing file-based configuration to override stored data. | +| `TRANSACTION_EXPIRATION_HOURS` | `4` | `number` | Number of hours after which transactions in a final state are automatically removed from storage to prevent storage bloat. | + +### Redis-Specific Settings + +| Environment Variable | Default Value | Accepted Values | Description | +| --- | --- | --- | --- | +| `REDIS_URL` | `redis://localhost:6379` | Redis connection string | Full connection URL for the Redis primary instance. Used for all write operations and read operations when `REDIS_READER_URL` is not set. | +| `REDIS_READER_URL` | (none) | Redis connection string | Optional separate endpoint for read operations. When set, read operations (GET, MGET, etc.) use this endpoint while writes use `REDIS_URL`. Useful for AWS ElastiCache with read replicas to distribute read load. | +| `REDIS_READER_POOL_MAX_SIZE` | `1000` | `number` | Optional separate pool size for reader connections. Useful for read-heavy workloads where more reader connections are beneficial. | +| `REDIS_CONNECTION_TIMEOUT_MS` | `10000` | `number` (milliseconds) | Maximum time to wait when connecting to Redis before timing out. | +| `REDIS_POOL_MAX_SIZE` | `500` | `number` | Maximum number of connections in the Redis connection pool. Adjust based on your Redis instance capacity, workload, and deployment scale. | +| `REDIS_POOL_TIMEOUT_MS` | `10000` | `number` (milliseconds) | Maximum time to wait for a connection from the pool before timing out. Higher values help handle traffic spikes. | +| `REDIS_KEY_PREFIX` | `oz-relayer` | `string` | Prefix added to all Redis keys. Useful for namespacing when sharing Redis with other applications. | +| `STORAGE_ENCRYPTION_KEY` | `` | `string` (base64) | Encryption key used to encrypt sensitive data at rest in Redis. Generate using `cargo run --example generate_encryption_key`. | + +## Security Considerations + +### Redis Security + + + + +When using Redis storage in production: + +* ***Use encryption at rest***: Always set `STORAGE_ENCRYPTION_KEY` +* ***Secure Redis access***: Use Redis AUTH, TLS, and network security +* ***Network isolation***: Deploy Redis in a private network +* ***Regular backups***: Implement Redis backup strategy +* ***Monitor access***: Log and monitor Redis access patterns + + + +### AWS ElastiCache with Read Replicas + +When using AWS ElastiCache with read replicas, you can distribute read load across multiple nodes by configuring separate endpoints: + +```bash +# AWS ElastiCache configuration with read replicas +REDIS_URL=redis://my-cluster.xxx.cache.amazonaws.com:6379 # Primary endpoint (writes) +REDIS_READER_URL=redis://my-cluster-ro.xxx.cache.amazonaws.com:6379 # Reader endpoint (reads) +REDIS_POOL_MAX_SIZE=200 # Connections to primary +REDIS_READER_POOL_MAX_SIZE=500 # More connections for reads (optional) +``` + +***Benefits:*** +- **Reduced primary load**: Read operations are distributed to replica nodes +- **Improved read performance**: Multiple replicas can handle concurrent reads +- **Better fault tolerance**: Read availability continues even during primary failover +- **Cost efficiency**: Smaller primary instance with multiple read replicas + +***When `REDIS_READER_URL` is not set:*** +- All operations (reads and writes) use `REDIS_URL` +- This maintains backward compatibility with single-endpoint configurations +- Suitable for standalone Redis or when read scaling is not needed + +### Connection Pool Tuning + +Redis connection pooling improves performance and prevents connection exhaustion. Configure pool size based on your Redis instance capacity, workload, and deployment scale. + +***Factors to consider:*** + +* **Redis instance capacity**: Check your Redis instance's maximum connection limit (e.g., ElastiCache small instances support 65,000+ connections) +* **Transaction volume**: Higher TPS requires more connections +* **Number of relayers**: More active relayers increase concurrent operations +* **Instance count**: Divide total connection budget across multiple relayer instances +* **Traffic patterns**: Account for traffic spikes and peak loads + +***Configuration:*** +```bash +REDIS_POOL_MAX_SIZE=500 # Adjust based on instance capacity and workload +REDIS_POOL_TIMEOUT_MS=15000 # Time to wait for available connection +``` + +### Encryption at Rest + +Sensitive configuration data is encrypted before being stored in Redis when `STORAGE_ENCRYPTION_KEY` is provided. + +***Encrypted Data Includes:*** +- Signer private keys and passphrases +- Webhook signing keys +- API keys (when stored in configuration) +- Other sensitive configuration values + +***Generate Encryption Key:*** +```bash +# Generate a secure encryption key +cargo run --example generate_encryption_key + +# Alternative using OpenSSL +openssl rand -base64 32 +``` + +## Transaction Storage Management + +### Automatic Cleanup + +Transactions are automatically removed from storage after reaching their final state to prevent storage bloat: + +```bash +# Configure transaction retention (default: 4 hours) +TRANSACTION_EXPIRATION_HOURS=8 +``` + +***Final Transaction States:*** + +* `confirmed` - Transaction confirmed on blockchain +* `failed` - Transaction failed and will not be retried +* `cancelled` - Transaction was cancelled by user +* `expired`: - Transaction was expired diff --git a/content/relayer/1.5.x/evm.mdx b/content/relayer/1.5.x/evm.mdx new file mode 100644 index 00000000..df49db77 --- /dev/null +++ b/content/relayer/1.5.x/evm.mdx @@ -0,0 +1,322 @@ +--- +title: EVM Integration +--- + +## Overview + +OpenZeppelin Relayer provides comprehensive support for EVM (Ethereum Virtual Machine) networks, enabling secure transaction relaying, advanced gas management, EIP-1559 support, and robust fee estimation. This page covers everything you need to get started and make the most of EVM-specific features. + +## Features + +- Advanced gas price management with EIP-1559 support +- Dynamic gas limit estimation with fallback mechanisms +- Transaction replacement and acceleration +- Multi-network support (Ethereum, Arbitrum, Optimism, BSC, Polygon, etc.) +- Custom RPC endpoints with load balancing and failover +- Secure transaction signing with multiple signer backends +- Transaction status monitoring and confirmation tracking +- Whitelist-based security policies +- Metrics and observability + +## Supported Networks + +EVM networks are defined via JSON configuration files, providing flexibility to: + +- Configure any EVM-compatible network (Ethereum, Polygon, BSC, Arbitrum, Optimism, etc.) +- Set up custom EVM-compatible networks with specific RPC endpoints +- Create network variants using inheritance from base configurations +- Support both Layer 1 and Layer 2 networks + +For detailed network configuration options, see the [Network Configuration](/relayer/network_configuration) guide. + +## Supported Signers + +- `local` (local keystore files) +- `vault` (HashiCorp Vault secret storage) +- `vault_cloud` (hosted HashiCorp Vault) +- `turnkey` (hosted Turnkey signer) +- `google_cloud_kms` (Google Cloud KMS) +- `aws_kms` (Amazon AWS KMS) +- `cdp` (hosted Coinbase Developer Platform signer) + +For detailed signer configuration options, see the [Signers](/relayer/configuration/signers) guide. + + + +In production systems, hosted signers (AWS KMS, Google Cloud KMS, Turnkey, CDP) are recommended for the best security model. + + + +## Quickstart + +For a step-by-step setup, see [Quick Start Guide](/relayer/quickstart). +Key prerequisites: + +- Rust 2021, version `1.88` or later +- Redis +- Docker (optional) + +Example configuration for an EVM relayer: + +```json +{ + "id": "sepolia-example", + "name": "Sepolia Example", + "network": "sepolia", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "evm", + "custom_rpc_urls": [ + { + "url": "https://primary-rpc.example.com", + "weight": 100 + }, + { + "url": "https://backup-rpc.example.com", + "weight": 100 + } + ], + "policies": { + "gas_price_cap": 100000000000, + "eip1559_pricing": true, + "gas_limit_estimation": true, + "whitelist_receivers": [ + "0x1234567890123456789012345678901234567890", + "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" + ], + "min_balance": 1000000000000000000 + } +}, +``` + +For more configuration examples, visit the [OpenZeppelin Relayer examples repository, window=\_blank](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples). + +## Configuration + +### Relayer Policies + +In addition to standard relayer configuration and policies, EVM relayers support additional options: + +- `gas_price_cap`: Maximum gas price limit (in wei) for transactions +- `gas_limit_estimation`: Enable/disable automatic gas limit estimation +- `whitelist_receivers`: List of authorized contract addresses for transactions +- `min_balance`: Minimum balance required for the relayer to operate (in wei) +- `eip1559_pricing`: Enable/disable EIP-1559 pricing methodology for transaction fees + +You can check all options in [User Documentation - Relayers](/relayer#3_relayers). + +### Gas Management Configuration + +#### Gas Price Cap + +Set a maximum gas price to protect against extreme network congestion: + +```json +{ + "policies": { + "gas_price_cap": 100000000000 // 100 Gwei maximum + } +} +``` + +#### Gas Limit Estimation + +Enable or disable automatic gas limit estimation: + +```json +{ + "policies": { + "gas_limit_estimation": true // Enable automatic estimation + } +} +``` + +When disabled, gas limits must be provided explicitly in transaction requests. + +The relayer uses a two-tier approach for gas limit estimation: + +1. **_Primary Method_**: Uses the RPC `estimate_gas` method to calculate gas requirements + - The estimated value is increased by 10% as a safety buffer + - Provides accurate estimates for most transaction types +2. **_Fallback Method_**: When RPC estimation fails, default gas limits are applied based on transaction type: + - **_Simple ETH transfer_** (no data): 21,000 gas + - **_ERC20 transfer_** (`0xa9059cbb`): 65,000 gas + - **_ERC721/ERC20 transferFrom_** (`0x23b872dd`): 80,000 gas + - **_Complex contracts_** (all other function calls): 200,000 gas + + + +For advanced users working with complex transactions or custom contracts, it is recommended to include an explicit `gas_limit` parameter in the transaction request to ensure optimal gas usage and avoid estimation errors. + + + +#### Whitelist Receivers + +Restrict transactions to specific contract addresses: + +```json +{ + "policies": { + "whitelist_receivers": [ + "0x1234567890123456789012345678901234567890", + "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd" + ] + } +} +``` + +## API Reference + +The EVM API provides comprehensive transaction management capabilities. + +Common endpoints: + +- `POST /api/v1/relayers//transactions` send transaction +- `GET /api/v1/relayers//transactions` list transactions +- `GET /api/v1/relayers//transactions/` get transaction by id + +### Send Transaction - Speed params + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers/sepolia-example/transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "value": 1, + "data": "0x", + "to": "0xd9b55a2ba539031e3c18c9528b0dc3a7f603a93b", + "speed": "average" +}' +``` + +### Send Transaction - Speed params with gas limit included + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers/sepolia-example/transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "value": 1, + "data": "0x", + "to": "0xd9b55a2ba539031e3c18c9528b0dc3a7f603a93b", + "speed": "average", + "gas_limit": 21000 +}' +``` + +### Transaction with EIP-1559 Pricing + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers/sepolia-example/transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "value": 1, + "data": "0x", + "to": "0xd9b55a2ba539031e3c18c9528b0dc3a7f603a93b", + "max_fee_per_gas": 30000000000, + "max_priority_fee_per_gas": 20000000000, +}' +``` + +### Transaction with Legacy Pricing - gas estimation included + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers/sepolia-example/transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "value": 1, + "data": "0x", + "to": "0xd9b55a2ba539031e3c18c9528b0dc3a7f603a93b", + "gas_price": "12312313123" +}' +``` + +### Get Transaction Status + +```bash +curl --location --request GET 'http://localhost:8080/api/v1/relayers/sepolia-example/transactions/' \ +--header 'Authorization: Bearer ' +``` + +See [API Reference](./api) for full details and examples. + +## Transaction Lifecycle + +### 1. Transaction Submission + +- Validate transaction parameters +- Check whitelist policies (if enabled) +- Estimate gas limit (if not provided) +- Calculate gas price based on network conditions + +### 2. Transaction Signing + +- Sign transaction using configured signer +- Generate appropriate signature format + +### 3. Transaction Broadcasting + +- Submit to network via RPC endpoints +- Handle RPC failures with automatic retries +- Switch to backup RPC endpoints if needed + +### 4. Transaction Monitoring + +- Track transaction status and confirmations +- Handle transaction replacements if needed +- Send notifications on status changes + +### 5. Transaction Confirmation + +- Wait for required number of confirmations +- Mark transaction as confirmed or failed +- Clean up resources + +## Security Best Practices + +### Network Security + +- Use private RPC endpoints in production +- Configure `RPC_ALLOWED_HOSTS` and `RPC_BLOCK_PRIVATE_IPS` for SSRF protection. See [Configuration → RPC URL Security](/relayer/configuration#rpc-url-security) +- Configure appropriate `gas_price_cap` to prevent excessive fees +- Enable `whitelist_receivers` for controlled environments +- Monitor relayer balance and set appropriate `min_balance` + +### Signer Security + +- Use hosted signers (AWS KMS, Google Cloud KMS, Turnkey) in production +- Rotate signer keys regularly +- Implement proper access controls and audit logging +- Never store private keys in plain text + +### Operational Security + +- Deploy behind a secure reverse proxy +- Use HTTPS for all communications +- Implement proper rate limiting +- Monitor for unusual transaction patterns + +### Monitoring and Observability + +Enable metrics and monitor: + +- Transaction success rates +- Gas price trends +- RPC endpoint performance +- Relayer balance levels +- Failed transaction patterns + +## Support + +For help with EVM integration: + +- Join our [Telegram](https://t.me/openzeppelin_tg/2) community +- Open an issue on our [GitHub repository](https://github.com/OpenZeppelin/openzeppelin-relayer) +- Check our [comprehensive documentation](https://docs.openzeppelin.com/relayer) + +## License + +This project is licensed under the GNU Affero General Public License v3.0. diff --git a/content/relayer/1.5.x/guides/index.mdx b/content/relayer/1.5.x/guides/index.mdx new file mode 100644 index 00000000..43cbcff3 --- /dev/null +++ b/content/relayer/1.5.x/guides/index.mdx @@ -0,0 +1,9 @@ +--- +title: Guides +--- + +## Overview + +Step-by-step guides for integrating with OpenZeppelin Relayer services and implementing common patterns for blockchain applications. + +Browse the available guides for your network in the sidebar. diff --git a/content/relayer/1.5.x/guides/stellar-channels-guide.mdx b/content/relayer/1.5.x/guides/stellar-channels-guide.mdx new file mode 100644 index 00000000..46db362b --- /dev/null +++ b/content/relayer/1.5.x/guides/stellar-channels-guide.mdx @@ -0,0 +1,232 @@ +--- +title: Stellar Channels Guide +--- + +## Overview + +OpenZeppelin Stellar Channels Service is a managed infrastructure for submitting Stellar Soroban transactions with automatic parallel processing and fee management. The service handles all the complexity of transaction submission, allowing you to focus on building your application. + +**Key Benefits:** + +- **_Zero Infrastructure Management_**: No servers, relayers, or channel accounts to configure +- **_Automatic Fee Payment_**: Gas fees paid by the service on your behalf +- **_Parallel Processing_**: High throughput via managed pool of channel accounts +- **_Simple Integration_**: Type-safe SDK with minimal setup +- **_Free to Use_**: No credits, subscriptions, or payment systems (subject to fair use policy) + +## Service Endpoints + +- **Mainnet**: `https://channels.openzeppelin.com` +- **Testnet**: `https://channels.openzeppelin.com/testnet` + +## Getting Started + +### 1. Get Your API Key + +Visit the service endpoint to generate an API key: + +- **Mainnet**: https://channels.openzeppelin.com/gen +- **Testnet**: https://channels.openzeppelin.com/testnet/gen + +Save your API key securely - you'll need it for all requests. + +### 2. Install the Client + +```bash +npm install @openzeppelin/relayer-plugin-channels +# or +pnpm add @openzeppelin/relayer-plugin-channels +# or +yarn add @openzeppelin/relayer-plugin-channels +``` + +### 3. Initialize the Client + +```typescript +import { ChannelsClient } from '@openzeppelin/relayer-plugin-channels'; + +const client = new ChannelsClient({ + baseUrl: 'https://channels.openzeppelin.com/testnet', + apiKey: process.env.CHANNELS_API_KEY, +}); +``` + +## Submitting Transactions + +The Channels service supports two transaction submission methods depending on your use case. + +### Method 1: Soroban Function + Auth (Recommended) + +This method is ideal when you want the service to handle transaction building and simulation. Submit the Soroban function and authorization entries, and the service builds the complete transaction using a channel account from the pool, enabling high-throughput parallel processing. + +```typescript +import { Contract, Networks, SorobanRpc } from '@stellar/stellar-sdk'; + +// Initialize your contract +const contract = new Contract('CA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUWDA'); + +// Build the transaction (don't sign yet) +const rpc = new SorobanRpc.Server('https://soroban-testnet.stellar.org'); +const source = await rpc.getAccount(sourceAddress); + +const tx = new TransactionBuilder(source, { + fee: '100', + networkPassphrase: Networks.TESTNET, +}) + .addOperation(contract.call('transfer' /* args */)) + .setTimeout(30) + .build(); + +// Simulate to get auth entries +const simulation = await rpc.simulateTransaction(tx); +const assembled = SorobanRpc.assembleTransaction(tx, simulation).build(); + +// Extract function and auth XDRs +const op = assembled.operations[0]; +const func = op.func.toXDR('base64'); +const auth = (op.auth ?? []).map((a) => a.toXDR('base64')); + +// Submit to Channels +const result = await client.submitSorobanTransaction({ + func: func, + auth: auth, +}); + +console.log('Transaction submitted:', result.hash); +console.log('Status:', result.status); +``` + +**When to use this method:** + +- You want the service to handle transaction assembly +- You're working with standard Soroban contract calls +- You need automatic simulation and resource calculation +- You need high-throughput parallel transaction processing + +### Method 2: Pre-Signed Transaction XDR + +This method gives you full control over the transaction structure. You build, sign, and submit a complete transaction envelope. + +```typescript +import { Keypair, Networks, TransactionBuilder } from '@stellar/stellar-sdk'; + +// Build and sign your transaction +const sourceKeypair = Keypair.fromSecret('S...'); +const tx = new TransactionBuilder(source, { + fee: '100', + networkPassphrase: Networks.TESTNET, +}) + .addOperation(/* your operation */) + .setTimeout(30) + .build(); + +// Sign the transaction +tx.sign(sourceKeypair); + +// Submit to Channels +const result = await client.submitTransaction({ + xdr: tx.toXDR(), // base64 envelope XDR +}); + +console.log('Transaction submitted:', result.hash); +console.log('Status:', result.status); +``` + +**When to use this method:** + +- You need precise control over transaction structure +- You're using advanced Stellar features +- Your transaction is already signed by another system + +## Response Format + +All successful submissions return: + +```typescript +{ + transactionId: string; // Internal tracking ID + hash: string; // Stellar transaction hash + status: string; // Transaction status (e.g., "confirmed") +} +``` + +## Fair Use Policy + +The Channels service is free to use, subject to a fair use policy that ensures equitable access for all users. + +**How it works:** + +- Each API key has a fee consumption limit (measured in stroops) +- The limit resets automatically 24 hours after your first transaction +- If you exceed the limit, requests return `FEE_LIMIT_EXCEEDED` until the reset + +This policy allows generous usage for development and production while preventing abuse. If you have higher throughput requirements, consider [self-hosting the Channels plugin](/relayer/plugins/channels). + +## Error Handling + +The SDK provides structured error handling with three error types: + +```typescript +import { + PluginTransportError, + PluginExecutionError, + PluginUnexpectedError, +} from '@openzeppelin/relayer-plugin-channels'; + +try { + const result = await client.submitSorobanTransaction({ func, auth }); + console.log('Success:', result.hash); +} catch (error) { + if (error instanceof PluginTransportError) { + // Network failures (connection, timeout, 5xx errors) + console.error('Service unavailable:', error.message); + console.error('Status:', error.statusCode); + } else if (error instanceof PluginExecutionError) { + // Transaction rejected (validation, simulation failure, on-chain failure) + console.error('Transaction failed:', error.message); + console.error('Error code:', error.errorDetails?.code); + console.error('Details:', error.errorDetails?.details); + } else if (error instanceof PluginUnexpectedError) { + // Client-side errors (parsing, validation) + console.error('Client error:', error.message); + } +} +``` + +### Common Error Codes + +| Code | Description | Resolution | +| --------------------- | ------------------------------------- | --------------------------------------------------------- | +| `INVALID_PARAMS` | Invalid request parameters | Check that you're providing either `xdr` OR `func`+`auth` | +| `INVALID_XDR` | Failed to parse XDR | Verify XDR is valid base64 and properly encoded | +| `POOL_CAPACITY` | All channel accounts in use | Retry after a short delay | +| `SIMULATION_FAILED` | Transaction simulation failed | Check contract address and function arguments | +| `ONCHAIN_FAILED` | Transaction failed on-chain | Review transaction logic and on-chain state | +| `INVALID_TIME_BOUNDS` | Transaction timeout too far in future | Set timeout to ≤30 seconds | +| `FEE_LIMIT_EXCEEDED` | API key exceeded fair use fee limit | Wait for 24-hour reset or contact support | + +## TypeScript Support + +The SDK is fully typed + +```typescript +import type { + ChannelsClient, + ChannelsFuncAuthRequest, + ChannelsXdrRequest, + ChannelsTransactionResponse, +} from '@openzeppelin/relayer-plugin-channels'; + +// All parameters and responses are fully typed +const request: ChannelsFuncAuthRequest = { + func: 'AAAABAAAAAEAAAAGc3ltYm9s...', + auth: ['AAAACAAAAAEAAAA...'], +}; + +const response: ChannelsTransactionResponse = await client.submitSorobanTransaction(request); +``` + +## Support & Resources + +- **Stellar SDK Documentation**: https://stellar.github.io/js-stellar-sdk/ +- **Channels Plugin**: https://github.com/OpenZeppelin/relayer-plugin-channels diff --git a/content/relayer/1.5.x/guides/stellar-sponsored-transactions-guide.mdx b/content/relayer/1.5.x/guides/stellar-sponsored-transactions-guide.mdx new file mode 100644 index 00000000..1eac5585 --- /dev/null +++ b/content/relayer/1.5.x/guides/stellar-sponsored-transactions-guide.mdx @@ -0,0 +1,635 @@ +--- +title: Stellar Sponsored Transactions Guide +--- + +## Overview + +Stellar Sponsored Transactions (also known as gasless transactions) allow users to pay transaction fees using tokens instead of the native XLM currency. This enables a better user experience where users can pay fees in stablecoins like USDC or other tokens they already hold, without needing to maintain XLM balances. + +**How it works:** + +1. **Quote**: Estimate the fee cost in your preferred token +2. **Build**: Prepare a transaction that includes fee payment in the token +3. **Sign**: User signs the transaction including fee payment +4. **Send**: Submit the transaction (relayer pays XLM fees, user pays token fees) + +The relayer handles the complexity of fee conversion, token swaps, and XLM fee payment, while users simply pay in their preferred token. + +## Prerequisites + +- A running OpenZeppelin Relayer instance +- A Stellar relayer configured with sponsored transaction support ("fee_payment_strategy" = "user") +- Trustlines enabled for the fee tokens you want to accept +- Sufficient XLM balance in the relayer account for network fees + +## Configuration + +### 1. Basic Relayer Setup + +First, configure a Stellar relayer in your `config.json`: + +```json +{ + "relayers": [ + { + "id": "stellar-sponsored", + "name": "Stellar Sponsored Transactions", + "network": "testnet", + "paused": false, + "signer_id": "local-signer", + "network_type": "stellar", + "policies": { + "fee_payment_strategy": "user", + "min_balance": 100000000, + "max_fee": 100000, + "allowed_tokens": [ + { + "asset": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", + "max_allowed_fee": 1000000000, + "swap_config": { + "slippage_percentage": 1.0, + "min_amount": 1000000, + "max_amount": 10000000000, + "retain_min_amount": 5000000 + } + } + ], + "slippage_percentage": 1.0, + "fee_margin_percentage": 10.0, + "swap_config": { + "strategies": ["order-book"], + "cron_schedule": "0 */6 * * *", + "min_balance_threshold": 50000000 + } + } + } + ] +} +``` + +### 2. Policy Configuration Explained + +#### `fee_payment_strategy` + +- **`relayer`**: Relayer pays all network fees. Users pay fees in tokens. +- **`user`**: User must include fee payment in the transaction. + +#### `allowed_tokens` + +List of tokens that can be used for fee payment. Each token can have: + +- **`asset`**: Asset identifier in format `"native"` or `"CODE:ISSUER"` (e.g., `"USDC:GA5Z..."`) +- **`max_allowed_fee`**: Maximum fee amount in token's smallest unit (stroops for native, token decimals for others) +- **`swap_config`**: Token-specific swap configuration: + - `slippage_percentage`: Maximum acceptable slippage (default: 1.0%) + - `min_amount`: Minimum swap amount + - `max_amount`: Maximum swap amount + - `retain_min_amount`: Minimum amount to retain after swap + +#### `swap_config` (Global) + +Configuration for converting collected tokens back to XLM: + +- **`strategies`**: DEX strategies to use (currently supports `order-book`) +- **`cron_schedule`**: Schedule for automatic token swaps (e.g., `"0 */6 * * *"` = every 6 hours) +- **`min_balance_threshold`**: Minimum XLM balance (in stroops) before triggering swaps + +#### `slippage_percentage` + +Default slippage tolerance for token conversions (default: 1.0%) + +#### `fee_margin_percentage` + +Additional fee margin added to estimated fees to account for price fluctuations (default: 10.0%) + +### 3. Enabling Trustlines + +Before users can pay fees in tokens, the relayer account must establish trustlines to those tokens. This is a one-time setup per token. + +For a complete example of how to create trustlines, see the [Relayer SDK example](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/blob/main/examples/relayers/stellar/src/sponsored/createTrustline.ts). + +## Using the API + +The sponsored transaction flow consists of four steps: **Quote**, **Build**, **Sign**, and **Send**. + +### Step 1: Get Fee Quote + +Estimate the transaction fee in your preferred token. + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions/sponsored/quote` + +**Request Body:** + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" +} +``` + +Or with operations: + +```json +{ + "operations": [ + { + "type": "payment", + "destination": "GBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "amount": 1000000, + "asset": "native" + } + ], + "source_account": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4K4KZVN" +} +``` + +**Response:** + +```json +{ + "success": true, + "data": { + "fee_in_token_ui": "1.5", + "fee_in_token": "15000000", + "conversion_rate": "0.15" + } +} +``` + +For complete code examples, see the [Relayer SDK examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/sponsored). + +### Step 2: Build Sponsored Transaction + +Prepare a transaction that includes fee payment in the specified token. + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions/sponsored/build` + +**Request Body:** + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" +} +``` + +Or with operations: + +```json +{ + "operations": [ + { + "type": "payment", + "destination": "GBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", + "amount": 1000000, + "asset": "native" + } + ], + "source_account": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", + "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" +} +``` + +**Response:** + +```json +{ + "success": true, + "data": { + "transaction": "AAAAAgAAAAD...", + "fee_in_token_ui": "1.5", + "fee_in_token": "15000000", + "fee_in_stroops": "100000", + "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN", + "valid_until": "2024-01-01T00:01:00Z" + } +} +``` + +For complete code examples, see the [Relayer SDK examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/sponsored). + +### Step 3: Sign Transaction + +The user must sign the transaction XDR returned from the Build endpoint. The transaction includes fee payment operations and is ready for signing. The signing method depends on your wallet setup and relayer configuration: + +#### Option 1: Manual Signing with xBull Wallet + +If using the xBull wallet, the transaction can be manually signed: + +1. Open xBull wallet +2. Navigate to **Drawer menu → Lab → Import XDR** +3. Paste the transaction XDR from the Build response +4. Review and sign the transaction + +> **Note:** Other Stellar wallets may support similar XDR import and signing flows. Consult your wallet's documentation for specific instructions. + +#### Option 2: Programmatic Signing via Relayer + +If the user's address is connected with another relayer configured in **relayer fee payment mode**, you can use the Sign Transaction endpoint: + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/sign-transaction` + +```` + +#### Option 3: Custom Signing Solution + +You can also use any Stellar SDK or signing library to sign the transaction programmatically with the user's private key. + +For complete code examples, see the [Relayer SDK examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/sponsored). + +### Step 4: Submit to Relayer + +Submit the signed transaction to the relayer. The relayer will: +1. Process it as a fee-bump transaction (wrap it in a fee-bump envelope) +2. Sign the fee-bump transaction with the relayer's key +3. Submit it to the Stellar network + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions` + +**Request Body:** + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "network": "testnet", + "fee_bump": true +} +```` + +**Response:** + +```json +{ + "success": true, + "data": { + "id": "tx-123456", + "status": "pending", + "network_data": { + "signature": "abc123...", + "transaction": "AAAAAgAAAAD..." + } + } +} +``` + +For complete code examples, see the [Relayer SDK examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/sponsored). + +## Request/Response Formats + +### Fee Token Format + +Fee tokens are specified using Stellar asset identifiers: + +- **Native XLM**: `"native"` +- **Token**: `"CODE:ISSUER"` (e.g., `"USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"`) + +### Operations Format + +When building transactions from operations, use the following format: + +```json +{ + "operations": [ + { + "type": "payment", + "destination": "G...", + "amount": 1000000, + "asset": "native" + }, + { + "type": "payment", + "destination": "G...", + "amount": 5000000, + "asset": "USDC:GA5Z..." + } + ] +} +``` + +Supported operation types: + +- `payment`: Standard payment operation +- `createAccount`: Account creation +- `changeTrust`: Trustline management +- `manageData`: Data entry management +- `bumpSequence`: Sequence number bump +- `setOptions`: Account options +- `allowTrust`: Trustline authorization +- `accountMerge`: Account merge +- `manageBuyOffer`: Create buy offer +- `manageSellOffer`: Create sell offer +- `createPassiveSellOffer`: Create passive offer +- `pathPaymentStrictSend`: Path payment strict send +- `pathPaymentStrictReceive`: Path payment strict receive +- `createClaimableBalance`: Create claimable balance +- `claimClaimableBalance`: Claim claimable balance +- `beginSponsoringFutureReserves`: Begin sponsoring reserves +- `endSponsoringFutureReserves`: End sponsoring reserves +- `revokeSponsorship`: Revoke sponsorship +- `clawback`: Clawback operation +- `clawbackClaimableBalance`: Clawback claimable balance +- `setTrustLineFlags`: Set trustline flags +- `liquidityPoolDeposit`: Deposit to liquidity pool +- `liquidityPoolWithdraw`: Withdraw from liquidity pool +- `invokeHostFunction`: Soroban contract invocation +- `extendFootprintTtl`: Extend footprint TTL +- `restoreFootprint`: Restore footprint + +## Best Practices + +1. **Always Quote First**: Get a fee quote before building to show users the expected cost +2. **Handle Expiration**: Transactions expire after 1 minute. Rebuild if needed +3. **Monitor Relayer Balance**: Ensure the relayer has sufficient XLM for network fees +4. **Configure Swap Schedule**: Set up automatic token swaps to maintain XLM balance +5. **Set Appropriate Limits**: Configure `max_allowed_fee` to prevent excessive fees +6. **Use Fee Margins**: The `fee_margin_percentage` helps account for price fluctuations +7. **Monitor Trustlines**: Ensure trustlines are established before users attempt transactions + +## Soroban Gas Abstraction + +### Overview + +Soroban Gas Abstraction extends the sponsored transaction concept to Soroban smart contracts. Instead of requiring users to hold XLM for contract invocation fees, users can pay in any Soroban token (e.g., a USDC Soroban token contract). This is powered by a **FeeForwarder smart contract** that wraps the user's contract call with fee collection logic. + +**How it differs from Classic Stellar Sponsored Transactions:** + +| Aspect | Classic Stellar | Soroban Gas Abstraction | +| -------------------- | ----------------------------------------------- | -------------------------------------------------------- | +| **Transaction type** | Classic operations (payments, trustlines, etc.) | Soroban `InvokeHostFunction` operations | +| **Fee mechanism** | Fee-bump transaction wrapper | FeeForwarder smart contract | +| **Fee token format** | Credit assets (`CODE:ISSUER`) | Soroban token contracts (`C...` address) | +| **Authorization** | Standard transaction signing | User signs a `SorobanAuthorizationEntry` | +| **Submission** | Relayer wraps in fee-bump envelope | Relayer injects signed auth entries and submits directly | + +### Prerequisites + +- A running OpenZeppelin Relayer instance +- A Stellar relayer configured with `"fee_payment_strategy": "user"` +- A deployed **FeeForwarder contract** on the target network. [Check the OpenZeppelin contract here](https://github.com/OpenZeppelin/stellar-contracts/tree/main/packages/fee-abstraction) +- The `STELLAR_TESTNET_FEE_FORWARDER_ADDRESS` or `STELLAR_MAINNET_FEE_FORWARDER_ADDRESS` environment variable set to the FeeForwarder contract address +- Allowed tokens configured with Soroban token contract addresses (`C...` format) +- Sufficient XLM balance in the relayer account for network fees + +### Configuration + +Configure the relayer with Soroban token contracts in the `allowed_tokens` list. Note that Soroban tokens use contract addresses (`C...` format) rather than the `CODE:ISSUER` format used for classic Stellar assets. + +```json +{ + "relayers": [ + { + "id": "stellar-soroban-gas", + "name": "Stellar Soroban Gas Abstraction", + "network": "testnet", + "paused": false, + "signer_id": "local-signer", + "network_type": "stellar", + "policies": { + "fee_payment_strategy": "user", + "fee_margin_percentage": 5, + "allowed_tokens": [ + { + "asset": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", + "max_allowed_fee": 1000000000, + "swap_config": { + "slippage_percentage": 0.5, + "min_amount": 10000000, + "max_amount": 1000000000, + "retain_min_amount": 10000000 + } + } + ], + "swap_config": { + "strategies": ["soroswap"], + "cron_schedule": "0 */6 * * *", + "min_balance_threshold": 50000000 + } + } + } + ] +} +``` + +Set the required environment variables: + + + For testnet, you must provide all environment variables. For mainnet, the code + already contains default addresses, but you can override them using + environment variables. + + +```bash +# Stellar FeeForwarder Contract Addresses +# STELLAR_MAINNET_FEE_FORWARDER_ADDRESS= +STELLAR_TESTNET_FEE_FORWARDER_ADDRESS= + +# Stellar Soroswap Router Contract Addresses +STELLAR_MAINNET_SOROSWAP_ROUTER_ADDRESS= +STELLAR_TESTNET_SOROSWAP_ROUTER_ADDRESS= + +# Stellar Soroswap Factory Contract Addresses +STELLAR_MAINNET_SOROSWAP_FACTORY_ADDRESS= +STELLAR_TESTNET_SOROSWAP_FACTORY_ADDRESS= + +# Stellar Soroswap Native Wrapper (XLM) Contract Addresses +STELLAR_MAINNET_SOROSWAP_NATIVE_WRAPPER_ADDRESS= +STELLAR_TESTNET_SOROSWAP_NATIVE_WRAPPER_ADDRESS= +``` + +### Using the API + +The Soroban gas abstraction flow uses the same endpoints as classic sponsored transactions but with key differences in the request/response payloads and an additional authorization signing step. + +#### Step 1: Get Fee Quote + +Estimate the fee for a Soroban contract invocation in your preferred token. + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions/sponsored/quote` + +**Request Body:** + +The `transaction_xdr` should contain the Soroban `InvokeHostFunction` operation, and the `fee_token` should be a Soroban token contract address (`C...` format). + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "fee_token": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC" +} +``` + +**Response:** + +The response includes `max_fee_in_token` and `max_fee_in_token_ui` fields that account for slippage buffer. These represent the maximum amount the user authorizes. + +```json +{ + "success": true, + "data": { + "fee_in_token_ui": "1.5", + "fee_in_token": "15000000", + "conversion_rate": "0.15", + "max_fee_in_token": "15750000", + "max_fee_in_token_ui": "1.575" + } +} +``` + +#### Step 2: Build Sponsored Transaction + +Prepare a Soroban transaction that wraps your contract call with the FeeForwarder contract. + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions/sponsored/build` + +**Request Body:** + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "fee_token": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC" +} +``` + +**Response:** + +The response includes a `user_auth_entry` field containing the Soroban authorization entry that the user must sign. This authorization entry authorizes the FeeForwarder contract to collect fees in the specified token on the user's behalf. + +```json +{ + "success": true, + "data": { + "transaction": "AAAAAgAAAAD...", + "fee_in_token_ui": "1.5", + "fee_in_token": "15000000", + "fee_in_stroops": "100000", + "fee_token": "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", + "valid_until": "2024-01-01T00:01:00Z", + "user_auth_entry": "AAAABgAAAAA...", + "max_fee_in_token": "15750000", + "max_fee_in_token_ui": "1.575" + } +} +``` + +#### Step 3: Sign the Authorization Entry + +Unlike classic sponsored transactions where the user signs the full transaction XDR, for Soroban gas abstraction the user must sign the **`user_auth_entry`** returned from the Build response. This is a `SorobanAuthorizationEntry` XDR that authorizes: + +1. The FeeForwarder contract to transfer fee tokens from the user to the relayer +2. The user's original contract invocation (wrapped inside the FeeForwarder call) + +The signing method depends on your setup: + +- **Programmatic signing**: Use the Stellar SDK to sign the authorization entry with the user's private key +- **Wallet signing**: Use a Soroban-compatible wallet that supports signing authorization entries +- **CLI helper tool**: A ready-to-use signing tool is provided in the repository at `helpers/sign_soroban_auth_entry.rs` + +##### Using the CLI Helper Tool + +The repository includes a helper tool that signs Soroban authorization entries directly from the command line. This is useful for testing and development: + +```bash +cargo run --example sign_soroban_auth_entry -- \ + --secret-key "S..." \ + --auth-entry "" \ + --network testnet +``` + +To generate the full JSON payload ready for the `/transactions` endpoint, include the `--transaction-xdr` flag: + +```bash +cargo run --example sign_soroban_auth_entry -- \ + --secret-key "S..." \ + --auth-entry "" \ + --network testnet \ + --transaction-xdr "" +``` + +This outputs a JSON object with `network`, `transaction_xdr`, and `signed_auth_entry` fields that can be sent directly to the Submit endpoint. + +For complete code examples of signing authorization entries and testing the full gas abstraction flow (quote, build, sign, and send), see the [Relayer SDK examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/soroban). The example demonstrates the end-to-end flow including fee estimation, transaction building, authorization signing, and submission. + +#### Step 4: Submit to Relayer + +Submit the transaction XDR from the Build response along with the user's **signed authorization entry**. The relayer will: + +1. Inject the user's signed authorization entry into the transaction +2. Add the relayer's own authorization entry (as the transaction source account) +3. Re-simulate the transaction with the signed auth entries for accurate resource calculation +4. Apply a resource buffer (15% safety margin) to prevent execution failures +5. Sign the transaction with the relayer's key +6. Submit it to the Stellar network + +**Endpoint:** `POST /api/v1/relayers/{relayer_id}/transactions` + +**Request Body:** + +```json +{ + "transaction_xdr": "AAAAAgAAAAD...", + "network": "testnet", + "signed_auth_entry": "AAAABgAAAAA..." +} +``` + +> **Note:** The `signed_auth_entry` field is used instead of `fee_bump` for Soroban gas abstraction. These two fields are mutually exclusive. + +**Response:** + +```json +{ + "success": true, + "data": { + "id": "tx-123456", + "status": "pending", + "network_data": { + "signature": "abc123...", + "transaction": "AAAAAgAAAAD..." + } + } +} +``` + +### Fee Token Format + +For Soroban gas abstraction, fee tokens are specified using Soroban contract addresses: + +- **Soroban token**: `"C..."` (e.g., `"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"`) + +This differs from classic sponsored transactions which use the `"CODE:ISSUER"` format. The relayer automatically detects whether to use the classic or Soroban flow based on the `fee_token` format and the presence of `InvokeHostFunction` operations in the transaction XDR. + +### How the FeeForwarder Contract Works + +The FeeForwarder contract acts as a proxy that: + +1. **Collects the fee**: Transfers the fee token amount from the user to the relayer +2. **Executes the user's call**: Invokes the target contract function on behalf of the user +3. **Manages authorization**: Bundles fee approval and contract invocation into a single authorization entry + +The contract's `forward()` function takes these parameters: + +- `fee_token` - Soroban token contract address for fee payment +- `fee_amount` - Actual fee to charge +- `max_fee_amount` - Maximum fee authorized by the user (includes slippage buffer) +- `expiration_ledger` - Ledger number when the authorization expires +- `target_contract` - The contract the user wants to invoke +- `target_fn` - The function name to call +- `target_args` - The function arguments +- `user` - The user's account address +- `relayer` - The relayer's account address (fee recipient) + +### Best Practices for Soroban Gas Abstraction + +1. **Use the Quote endpoint first**: Always get a fee estimate before building to show users the expected cost, including the max fee with slippage +2. **Handle authorization expiration**: Authorization entries expire at a specific ledger. Rebuild if the authorization has expired +3. **Validate token contract addresses**: Ensure fee tokens use valid Soroban contract addresses (`C...` format, 56 characters) +4. **Monitor resource fees**: Soroban transactions have dynamic resource fees based on CPU instructions, storage reads/writes, and ledger entry access. The relayer applies a 15% buffer, but complex contract calls may need higher limits +5. **Set appropriate max fees**: Configure `max_allowed_fee` per token to prevent excessive fees during network congestion +6. **Configure the FeeForwarder address**: Ensure the correct FeeForwarder contract address is set via environment variables for each network + +## Additional Resources + +- [Stellar Documentation](https://developers.stellar.org/) +- [Stellar SDK for JavaScript](https://stellar.github.io/js-stellar-sdk/) +- [OpenZeppelin Relayer API Reference](/relayer/api) +- [Network Configuration Guide](/relayer/network_configuration) diff --git a/content/relayer/1.5.x/guides/stellar-x402-facilitator-guide.mdx b/content/relayer/1.5.x/guides/stellar-x402-facilitator-guide.mdx new file mode 100644 index 00000000..0c9ef79f --- /dev/null +++ b/content/relayer/1.5.x/guides/stellar-x402-facilitator-guide.mdx @@ -0,0 +1,340 @@ +--- +title: x402 Facilitator +--- + +## Overview + +x402 Facilitator is a plugin for OpenZeppelin Relayer that enables payment verification and settlement for x402 payments on Stellar. The plugin implements the X402 payment facilitation protocol, allowing applications to accept payments in Stellar assets (like USDC) for API access or content. + +The plugin features: + +- **Payment verification**: Validates payment payloads against payment requirements +- **Transaction settlement**: Submits verified payments on-chain via the relayer or an optional channel service +- **Auth entry validation**: Verifies authorization entries are properly signed +- **Multi-network support**: Configure multiple Stellar networks and assets +- **Channel service integration**: Optional integration with the Channels plugin for high-throughput settlement + +## Prerequisites + +- Node.js >= 18 +- pnpm >= 10 +- OpenZeppelin Relayer (installed and configured) +- Stellar relayer account (for transaction submission) + +## Example Setup + +For a complete working example with Docker Compose, refer to the x402 Facilitator plugin example in the OpenZeppelin Relayer repository: + +- **Location**: [examples/x402-facilitator-plugin](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/x402-facilitator-plugin) +- **Documentation**: [README.md](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/x402-facilitator-plugin/README.md) + +## Installation + +x402 Facilitator can be added to any OpenZeppelin Relayer installation. + +**Resources:** + +- **npm package**: [@openzeppelin/relayer-plugin-x402-facilitator](https://www.npmjs.com/package/@openzeppelin/relayer-plugin-x402-facilitator) +- **GitHub repository**: https://github.com/OpenZeppelin/relayer-plugin-x402-facilitator +- **Example setup**: [x402-facilitator-plugin](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/x402-facilitator-plugin) + +### Install from npm + +```bash +# From the root of your Relayer repository +cd plugins +pnpm add @openzeppelin/relayer-plugin-x402-facilitator +``` + +### Create the plugin wrapper + +Inside your Relayer, create a directory for the plugin and expose its handler: + +```bash +mkdir -p plugins/x402-facilitator +``` + +Create `plugins/x402-facilitator/index.ts`: + +```typescript +export { handler } from "@openzeppelin/relayer-plugin-x402-facilitator"; +``` + +## Configuration + +### Plugin Registration + +Register the plugin in your `config/config.json` file: + +```json +{ + "plugins": [ + { + "id": "x402-facilitator", + "path": "x402-facilitator/index.ts", + "timeout": 30, + "emit_logs": false, + "emit_traces": false, + "forward_logs": true, + "raw_response": true, + "allow_get_invocation": true, + "config": { + "networks": [ + { + "network": "stellar:testnet", + "type": "stellar", + "relayer_id": "stellar-example", + "assets": [ + "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA" + ] + } + ] + } + } + ] +} +``` + +Note on `path`: this is the plugin entrypoint path as seen by the running Relayer process. + +- If you run Relayer locally, ensure the file exists at that path under your `plugins/` directory. +- If you run Relayer in Docker, ensure the file exists at that path inside the container (for example by mounting your plugin folder into `/app/plugins/x402-facilitator` in the container). + +**_Configuration Options:_** + +- `id`: Unique identifier for the plugin +- `path`: Path to the plugin file (relative to `plugins/` directory) +- `timeout`: Maximum execution time in seconds (default: 30) +- `emit_logs`: Whether to include plugin logs in API responses (default: false) +- `emit_traces`: Whether to include plugin traces in API responses (default: false) +- `raw_response`: Whether to return raw plugin response without ApiResponse wrapper (default: false, recommended for x402 compatibility) +- `config.networks`: Array of network configurations + - `network`: Network identifier (e.g., "stellar:testnet", "stellar:pubnet") + - `type`: Network type (must be "stellar") + - `relayer_id`: ID of the relayer to use for this network + - `assets`: Array of supported asset contract addresses + - `channel_service_api_url` (optional): Channel service API URL for settlement + - `channel_service_api_key` (optional): Channel service API key + +### Relayer Configuration + +The plugin requires at least one Stellar relayer configured for transaction submission: + +```json +{ + "relayers": [ + { + "id": "stellar-example", + "name": "Stellar Example", + "network": "testnet", + "paused": false, + "network_type": "stellar", + "signer_id": "local-signer", + "policies": { + "fee_payment_strategy": "relayer", + "min_balance": 0 + } + } + ], + "signers": [ + { + "id": "local-signer", + "type": "local", + "config": { + "path": "config/keys/local-signer.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE" + } + } + } + ] +} +``` + +**Important configuration notes:** + +- **Relayer account**: Must be configured with `network_type: "stellar"` and a valid signer +- **Network**: Use `testnet` for testing or `mainnet` for production +- **Signers**: Each relayer references a signer by `signer_id`; signers are defined separately with keystore paths +- **Keystore files**: Create keystore files for each account; see the [OpenZeppelin Relayer documentation](https://docs.openzeppelin.com/relayer) for key management +- **Assets**: Configure the contract addresses of assets you want to accept payments in (for example, a USDC contract address) + +### Channel Service Integration (Optional) + +For high-throughput settlement, you can configure the plugin to use the Channels plugin: + +```json +{ + "plugins": [ + { + "id": "x402-facilitator", + "path": "x402-facilitator/index.ts", + "timeout": 30, + "raw_response": true, + "config": { + "networks": [ + { + "network": "stellar:testnet", + "type": "stellar", + "relayer_id": "stellar-example", + "assets": [ + "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA" + ], + "channel_service_api_url": "http://localhost:8080/api/v1/plugins/channels-plugin/call", + "channel_service_api_key": "YOUR_CHANNELS_API_KEY" + } + ] + } + } + ] +} +``` + +When `channel_service_api_url` and `channel_service_api_key` are configured, the plugin will use the Channels service for settlement instead of the relayer API, enabling parallel transaction processing. + +## API Usage + +The x402 Facilitator plugin implements the X402 v2 specification API, providing three main endpoints: + +- **`/verify`**: Verifies a payment payload against payment requirements +- **`/settle`**: Settles a verified payment by submitting the transaction on-chain +- **`/supported`**: Discovery of supported payment kinds + +### Invocation + +The plugin is invoked via the standard Relayer plugin endpoint with route-based routing: + +```bash +POST /api/v1/plugins/{plugin-id}/call/{route} +``` + +Where `{route}` is one of: + +- `verify` - Payment verification +- `settle` - Payment settlement +- `supported` - Supported payment kinds + +## Integration with x402 Ecosystem + +The plugin implements the API defined by the x402 v2 spec, making it compatible with any packages in the x402 ecosystem. For more information on available packages, see [https://github.com/coinbase/x402](https://github.com/coinbase/x402). + +### x402-express Example + +To use OpenZeppelin Relayer and its x402-facilitator plugin with x402-express (and similar packages), point the facilitator to your Relayer plugin URL and pass the Relayer API key via `createAuthHeaders`: + +**.env** +```text +STELLAR_ADDRESS= +FACILITATOR_URL=http://localhost:8080/api/v1/plugins/x402-facilitator/call +``` + +```typescript +import { config } from "dotenv"; +import express from "express"; +import { paymentMiddleware, x402ResourceServer } from "@x402/express"; +import { ExactStellarScheme } from "@x402/stellar/exact/server"; +import { HTTPFacilitatorClient } from "@x402/core/server"; +config(); + +const stellarAddress = process.env.STELLAR_ADDRESS as string | undefined; + +// Validate stellar address is provided +if (!stellarAddress) { + console.error("❌ STELLAR_ADDRESS is required"); + process.exit(1); +} + +const facilitatorUrl = process.env.FACILITATOR_URL; +if (!facilitatorUrl) { + console.error("❌ FACILITATOR_URL environment variable is required"); + process.exit(1); +} +const facilitatorClient = new HTTPFacilitatorClient({ url: facilitatorUrl, createAuthHeaders: async () => ({ + // Use your Relayer API key for the plugin + verify: { Authorization: "Bearer RELAYER_API_KEY" }, + settle: { Authorization: "Bearer RELAYER_API_KEY" }, + supported: { Authorization: "Bearer RELAYER_API_KEY" }, +})}); + +const app = express(); + +app.use( + paymentMiddleware( + { + "GET /weather": { + accepts: [ + { + scheme: "exact", + price: "$0.001", + network: "stellar:testnet", + payTo: stellarAddress, + }, + ], + description: "Weather data", + mimeType: "application/json", + }, + }, + new x402ResourceServer(facilitatorClient) + .register("stellar:testnet", new ExactStellarScheme()) + + ), +); + +app.get("/weather", (req, res) => { + res.send({ + report: { + weather: "sunny", + temperature: 70, + }, + }); +}); + +app.listen(4021, () => { + console.log(`Server listening at http://localhost:${4021}`); +}); +``` + +### Server Setup (Express) + +Set up an Express server with x402 payment middleware. For detailed instructions, see the [x402 Express server guide](https://github.com/coinbase/x402/tree/main/examples/typescript/servers/advanced/README.md). + +### Client Setup (Fetch) + +Make requests to x402-protected endpoints using the fetch client. For detailed instructions, see the [x402 Fetch client guide](https://github.com/coinbase/x402/blob/main/examples/typescript/clients/advanced/README.md). + +## How It Works + +### Verification Flow + +1. **Protocol Validation**: Validates X402 version, scheme, and network +2. **Transaction Parsing**: Decodes transaction XDR and extracts operation details +3. **Operation Validation**: Ensures it's an `invokeHostFunction` calling `transfer` +4. **Amount & Recipient Validation**: Validates transfer amount and recipient match requirements +5. **Auth Entry Validation**: Verifies auth entries are present and signed by the payer +6. **Envelope Signature Check**: Ensures transaction envelope has no signatures (for relayer rebuild) +7. **Simulation**: Simulates transaction to ensure it will succeed +8. **Security Checks**: Validates transaction source is not the relayer + +### Settlement Flow + +1. **Verification**: Verifies payment before settlement +2. **Operation Extraction**: Extracts operation details and signed auth entries from transaction +3. **Submission**: + - **If channel service configured**: Submits via channel service API with `func` and `auth` XDRs + - **Otherwise**: Submits via relayer API with operations format +4. **Confirmation**: Waits for transaction confirmation + +### Channel Service vs Relayer API + +The plugin supports two settlement methods: + +- **Relayer API** (default): Uses the relayer's `sendTransaction` with operations format +- **Channel Service API** (optional): Uses external channel service when `channel_service_api_url` and `channel_service_api_key` are configured + +## Additional Resources + +- **_OpenZeppelin Relayer Documentation_**: https://docs.openzeppelin.com/relayer +- **_Stellar SDK Documentation_**: https://stellar.github.io/js-stellar-sdk/ +- **_Coinbase x402 GitHub Repository_**: https://github.com/coinbase/x402 +- **_x402 Facilitator Plugin Repository_**: https://github.com/OpenZeppelin/relayer-plugin-x402-facilitator diff --git a/content/relayer/1.5.x/guides/zama-fhevm-counter-guide.mdx b/content/relayer/1.5.x/guides/zama-fhevm-counter-guide.mdx new file mode 100644 index 00000000..5ea3b5c4 --- /dev/null +++ b/content/relayer/1.5.x/guides/zama-fhevm-counter-guide.mdx @@ -0,0 +1,397 @@ +--- +title: Zama FHEVM Counter Guide +--- + +## Overview + +This guide walks through an end-to-end integration between the OpenZeppelin Relayer and a Zama FHEVM contract, using the counter example shipped with the [OpenZeppelin Relayer SDK](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk). The counter contract is deployed from [Zama's fhevm-hardhat-template](https://github.com/zama-ai/fhevm-hardhat-template) and demonstrates the two OpenZeppelin Relayer responsibilities in an FHEVM flow: + +- **Transaction submission**: sending an encrypted `increment()` call on-chain. +- **EIP-712 signing**: signing the typed-data payload that authorizes user decryption of the counter's encrypted state. + + + +**Terminology.** In this guide: + +- **OpenZeppelin Relayer** (or "OZ Relayer") — this service. It holds an EVM signer, submits on-chain transactions, and signs EIP-712 payloads. +- **Zama Relayer** — the Zama-operated service that the [`@zama-fhe/relayer-sdk`](https://www.npmjs.com/package/@zama-fhe/relayer-sdk) talks to under the hood. It serves FHE public keys and routes decryption requests to the Zama KMS / coprocessor. Applications interact with it only indirectly through the Zama Relayer SDK. It holds no OpenZeppelin key material and does not sign EIP-712. + + + +By the end of this guide you will have: + +- Configured a Zama FHE instance in your application. +- Read and decrypted an encrypted counter value from the contract. +- Submitted an encrypted increment through the OpenZeppelin Relayer and waited for confirmation. +- Re-read and decrypted the updated value. + + +The FHE encryption/decryption primitives run in your application using the Zama Relayer SDK. The OpenZeppelin Relayer never sees cleartext values or your decryption keypair — it only sends transactions and signs EIP-712 payloads. + + +## Prerequisites + +- Node.js `>= 22.14.0` +- `pnpm` (the example repository uses pnpm for installs) +- A running OpenZeppelin Relayer with: + - a valid API key + - an EVM relayer configured on Sepolia (or another FHEVM-enabled network) +- A Zama FHE counter contract deployed on your target network (e.g. via [fhevm-hardhat-template](https://github.com/zama-ai/fhevm-hardhat-template)) + +## Example Setup + +The complete working example lives in the OpenZeppelin Relayer SDK repository: + +- **Location**: [examples/relayers/zama](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama) +- **Documentation**: [README.md](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama/README.md) + +The rest of this guide explains the moving parts, references the example files, and shows the minimum code required to adapt the flow to your own contract. + +## Architecture + +Four components participate in the flow: + +- **Your script** — orchestrates the flow and prints progress. +- **OpenZeppelin Relayer** — signs typed data and submits transactions. The only component holding an EVM signer. +- **Zama Relayer SDK (client)** + **Zama Relayer (service)** — the SDK encrypts inputs, generates keypairs for user decryption, and builds EIP-712 payloads; the Zama Relayer service serves FHE public keys and routes decryption requests to the Zama KMS / coprocessor. The application only interacts with it indirectly through the SDK. +- **FHEVM contract** — stores encrypted state on-chain. + +The key boundary is that the OpenZeppelin Relayer does not do any encryption or decryption. The Zama Relayer SDK (and, behind it, the Zama Relayer service) handles all FHE primitives; the OpenZeppelin Relayer only provides EVM transaction execution and EIP-712 signing. + +``` +┌─────────────┐ ┌─────────────────────────┐ ┌──────────────┐ +│ Your app │──────▶│ OpenZeppelin Relayer │──────▶│ FHEVM network│ +│ (Zama SDK) │ │ sendTransaction + │ │ Sepolia / │ +│ │◀──────│ signTypedData │ │ Mainnet │ +└─────────────┘ └─────────────────────────┘ └──────────────┘ + │ + ▼ +┌─────────────────────────────┐ +│ Zama Relayer │ +│ FHE public keys + │ +│ decryption request routing │ +│ (accessed via Zama SDK) │ +└─────────────────────────────┘ +``` + +## OpenZeppelin Relayer Configuration + +Zama FHEVM contracts live on standard EVM networks, so the OpenZeppelin Relayer is configured as a regular `evm` relayer. + +```json +{ + "relayers": [ + { + "id": "zama-sepolia", + "name": "Zama FHEVM Sepolia", + "network": "sepolia", + "paused": false, + "signer_id": "local-signer", + "network_type": "evm" + } + ], + "signers": [ + { + "id": "local-signer", + "type": "local", + "config": { + "path": "config/keys/local-signer.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE" + } + } + } + ] +} +``` + +**Important notes:** + +- The OpenZeppelin Relayer's signer is used both for submitting the encrypted transaction and for signing the EIP-712 payload that the Zama Relayer SDK requires for user decryption. The same key backs both operations. +- For production, prefer a hosted signer (AWS KMS, Google Cloud KMS, Turnkey, CDP) over `local`. +- The OpenZeppelin Relayer must be funded on the target network so it can pay gas for FHEVM contract calls. + +## Installation + +From the root of the `openzeppelin-relayer-sdk` repository: + +```bash +pnpm install +``` + +The example imports the Zama Relayer SDK (`@zama-fhe/relayer-sdk`) as part of the workspace dependencies. If you are integrating the flow into your own project, install it directly: + +```bash +pnpm add @zama-fhe/relayer-sdk @openzeppelin/relayer-sdk ethers dotenv +``` + +## Environment Configuration + +Copy `.env.example` to `.env` in `examples/relayers/zama/`: + +```bash +RELAYER_API_KEY= +RELAYER_ID= +ZAMA_CONTRACT_ADDRESS= +RPC_URL=https://ethereum-sepolia-rpc.publicnode.com +RELAYER_BASE_PATH=http://localhost:8080 + +# Optional: reuse an existing decryption keypair across runs +# ZAMA_PUBLIC_KEY= +# ZAMA_PRIVATE_KEY= +``` + +- `RELAYER_BASE_PATH` defaults to `http://localhost:8080` if not set. This points at your OpenZeppelin Relayer. +- `RPC_URL` defaults to the public Sepolia RPC if not set. +- If `ZAMA_PUBLIC_KEY` and `ZAMA_PRIVATE_KEY` are not set, the script generates a fresh decryption keypair on each run. Reusing the same keypair is useful for consistent user-decryption behavior across runs. + +## Running the Example + +Run the counter example from the SDK repository root: + +```bash +npx ts-node examples/relayers/zama/counter.ts +``` + +The script should: + +1. Read the encrypted counter handle from the contract. +2. Attempt decryption (public first, then user decryption with an OpenZeppelin Relayer signed EIP-712 payload). +3. Submit an encrypted `increment()` through the OpenZeppelin Relayer and poll until the transaction is mined or confirmed. +4. Re-read and decrypt the updated counter value. + +## Generating a Reusable Decryption Keypair + +To keep the same decryption keypair across runs, run the helper script: + +```bash +npx ts-node examples/relayers/zama/generate-keypair.ts +``` + +Copy the printed `ZAMA_PUBLIC_KEY` and `ZAMA_PRIVATE_KEY` values into your `.env` file. + + +The decryption keypair is an application side secret. Do not pass the private key to the OpenZeppelin Relayer; it is only used by the Zama Relayer SDK to decrypt results returned by the Zama Relayer. + + +## Walkthrough + +The following snippets show the OpenZeppelin Relayer's specific integration points from `counter.ts`. Full code is in the [SDK repository](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama). + +### 1. Initialize the OpenZeppelin Relayer client and Zama SDK + +```typescript +import { Configuration, RelayersApi } from '@openzeppelin/relayer-sdk'; +import { SepoliaConfig, createInstance, type FhevmInstanceConfig } from '@zama-fhe/relayer-sdk/node'; +import { JsonRpcProvider, getAddress } from 'ethers'; + +const relayersApi = new RelayersApi( + new Configuration({ + basePath: process.env.RELAYER_BASE_PATH ?? 'http://localhost:8080', + accessToken: process.env.RELAYER_API_KEY!, + }), +); + +const zamaConfig: FhevmInstanceConfig = { + ...SepoliaConfig, + network: process.env.RPC_URL!, +}; + +const provider = new JsonRpcProvider(process.env.RPC_URL!); +const instance = await createInstance(zamaConfig); +``` + +### 2. Fetch the OpenZeppelin Relayer's on-chain address + +The OpenZeppelin Relayer's EVM address is needed both when building encrypted inputs and when authorizing user decryption. + +```typescript +const relayerInfo = await relayersApi.getRelayer(process.env.RELAYER_ID!); +const relayerAddress = getAddress(relayerInfo.data.data!.address!); +``` + +### 3. Read and decrypt the encrypted counter + +The contract exposes a `getCount()` view that returns the encrypted handle. Decoding the handle is a plain EVM call — no OpenZeppelin Relayer involvement. + +```typescript +import { Interface } from 'ethers'; +import ABI from './abi.json'; + +const iface = new Interface(ABI); + +async function getCount(contractAddress: string): Promise { + const data = iface.encodeFunctionData('getCount', []); + const result = await provider.call({ to: contractAddress, data }); + return iface.decodeFunctionResult('getCount', result)[0]; +} +``` + +The script first attempts public decryption. If the handle is not publicly decryptable, it falls back to user decryption (covered in [Decryption Model](#decryption-model) below). + +### 4. Submit an encrypted `increment()` via the OpenZeppelin Relayer + +Encryption happens locally with the Zama Relayer SDK. The encrypted handle plus input proof are encoded into a normal EVM transaction and handed to the OpenZeppelin Relayer's `sendTransaction`. + +```typescript +import { Speed } from '@openzeppelin/relayer-sdk'; + +const encInput = instance.createEncryptedInput(contractAddress, relayerAddress); +encInput.add32(1); +const { handles, inputProof } = await encInput.encrypt(); + +const data = iface.encodeFunctionData('increment', [handles[0], inputProof]); + +const txResponse = await relayersApi.sendTransaction(process.env.RELAYER_ID!, { + to: contractAddress, + data, + value: 0, + gas_limit: 500000, + speed: Speed.FAST, +}); + +const transactionId = txResponse.data.data!.id!; +``` + +### 5. Poll for confirmation + +Poll `getTransactionById` on the OpenZeppelin Relayer until the transaction reaches `mined` or `confirmed`: + +```typescript +import type { EvmTransactionResponse } from '@openzeppelin/relayer-sdk'; + +async function waitForConfirmation(transactionId: string): Promise { + for (let attempt = 1; attempt <= 60; attempt += 1) { + await new Promise((resolve) => setTimeout(resolve, 2000)); + + const status = await relayersApi.getTransactionById(process.env.RELAYER_ID!, transactionId); + const tx = status.data.data as EvmTransactionResponse | undefined; + + if (!tx) throw new Error(`Transaction ${transactionId} not returned by the OpenZeppelin Relayer`); + if (tx.status === 'mined' || tx.status === 'confirmed') return tx.hash; + if (tx.status === 'failed' || tx.status === 'canceled' || tx.status === 'expired') { + throw new Error(`Transaction ${tx.status}: ${tx.status_reason ?? 'unknown'}`); + } + } + throw new Error('Transaction confirmation timed out'); +} +``` + +## Decryption Model + +Zama FHEVM supports two decryption paths, and the example tries them in this order: + +### 1. Public Decryption + +If an encrypted handle is marked as publicly decryptable on-chain, the Zama Relayer SDK can decrypt it directly via the Zama Relayer, with no involvement from the OpenZeppelin Relayer. + +```typescript +const result = await instance.publicDecrypt([encryptedHandle]); +const clear = result.clearValues[encryptedHandle as `0x${string}`]; +``` + +### 2. User Decryption (OpenZeppelin Relayer's signed EIP-712) + +When decryption requires authorization, the Zama Relayer SDK builds an EIP-712 payload and the **OpenZeppelin Relayer** signs it via `signTypedData`. The resulting signature is passed to `userDecrypt`, which uses it to authorize the Zama Relayer to return the cleartext. + +```typescript +import { TypedDataEncoder } from 'ethers'; +import type { SignDataResponseEvm } from '@openzeppelin/relayer-sdk'; + +const keypair = instance.generateKeypair(); +const contractAddresses = [contractAddress]; +const startTimeStamp = Math.floor((Date.now() - 24 * 60 * 60 * 1000) / 1000); +const durationDays = 365; + +const eip712 = instance.createEIP712( + keypair.publicKey, + contractAddresses, + startTimeStamp, + durationDays, +); + +// Hash the domain and struct, then ask the OpenZeppelin Relayer to sign. +const domainSeparator = TypedDataEncoder.hashDomain(eip712.domain); +const { EIP712Domain, ...structTypes } = eip712.types; +const messageHash = TypedDataEncoder.hashStruct( + eip712.primaryType, + Object.fromEntries(Object.entries(structTypes).map(([k, v]) => [k, [...v]])), + eip712.message, +); + +const signResponse = await relayersApi.signTypedData(process.env.RELAYER_ID!, { + domain_separator: domainSeparator, + hash_struct_message: messageHash, +}); +const signature = (signResponse.data.data as SignDataResponseEvm).sig!; + +const decrypted = await instance.userDecrypt( + [{ handle: encryptedHandle, contractAddress }], + keypair.privateKey, + keypair.publicKey, + signature, + contractAddresses, + relayerAddress, + startTimeStamp, + durationDays, +); +``` + +The EIP-712 domain separator and message hash are computed locally using `ethers` so the OpenZeppelin Relayer only has to sign the final hashes via its `signTypedData` endpoint. + +## Using on Mainnet + +The example defaults to Sepolia. To run against Ethereum mainnet: + +1. In `counter.ts`, use `MainnetConfig` instead of `SepoliaConfig` and provide the Zama Relayer API key: + + ```typescript + import { + MainnetConfig, + createInstance, + type FhevmInstanceConfig, + } from '@zama-fhe/relayer-sdk/node'; + + const zamaConfig: FhevmInstanceConfig = { + ...MainnetConfig, + network: process.env.RPC_URL!, + auth: { __type: 'ApiKeyHeader', value: process.env.ZAMA_FHEVM_API_KEY! }, + }; + ``` + +2. Add the following to your `.env`: + + ```bash + ZAMA_FHEVM_API_KEY= + RPC_URL=https://ethereum-rpc.publicnode.com + ``` + +3. Point `ZAMA_CONTRACT_ADDRESS` at your mainnet contract and configure the OpenZeppelin Relayer for Ethereum mainnet. + + +Mainnet requires API key authentication with the Zama Relayer. See the [Zama mainnet API key guide](https://docs.zama.org/protocol/relayer-sdk-guides/fhevm-relayer/mainnet-api-key) for instructions on obtaining one. + + +## Current Limitations + +- The example is hardcoded for Sepolia via `SepoliaConfig` plus an explicit Sepolia RPC URL. +- It assumes a counter contract shape compatible with the included ABI. +- Logging and error handling are intentionally simple — this is a demo script, not production code. +- It does not cover OpenZeppelin Relayer creation or contract deployment. + +## Troubleshooting + +- **`Missing required environment variable`**: one of the required values in `.env` is unset. +- **`did not return an address`**: the configured `RELAYER_ID` is valid for the API, but the response did not include an EVM address. Check that the OpenZeppelin Relayer is fully provisioned and the signer is reachable. +- **`Public decryption failed`**: this can be expected depending on the contract and permissions. The script will then try user decryption. +- **`User decryption failed`**: check that the OpenZeppelin Relayer can sign typed data correctly and that the contract address and decryption keypair are the ones you expect. Confirm the EIP-712 `startTimeStamp` / `durationDays` window is valid. +- **Transaction polling timeout**: the transaction may still be pending, the OpenZeppelin Relayer may be unhealthy, or the target chain may be slow. Inspect `getTransactionById` directly and check OpenZeppelin Relayer logs. + +## Additional Resources + +- [Zama Relayer SDK Guides](https://docs.zama.org/protocol/relayer-sdk-guides) +- [Zama fhevm-hardhat-template](https://github.com/zama-ai/fhevm-hardhat-template) +- [Zama mainnet API key guide](https://docs.zama.org/protocol/relayer-sdk-guides/fhevm-relayer/mainnet-api-key) +- [OpenZeppelin Relayer SDK — Zama example](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama) +- [Zama FHEVM Integration](/relayer/zama-fhevm) diff --git a/content/relayer/1.5.x/index.mdx b/content/relayer/1.5.x/index.mdx new file mode 100644 index 00000000..499f3448 --- /dev/null +++ b/content/relayer/1.5.x/index.mdx @@ -0,0 +1,350 @@ +--- +title: OpenZeppelin Relayer +--- + +## Overview + +OpenZeppelin Relayer is a service that provides infrastructure to relay transactions to the EVM & Non-EVM networks. It is designed to be used as a backend for dApps that need to interact with these networks. + +## Features + +* ***Multi-Chain Support***: Interact with multiple blockchain networks, including Solana and EVM-based chains. +* ***Transaction Relaying***: Submit transactions to supported blockchain networks efficiently. +* ***Transaction Signing***: Securely sign transactions using configurable key management. +* ***Transaction Fee Estimation***: Estimate transaction fees for better cost management. +* ***Solana Gasless Transactions***: Support for gasless transactions on Solana, enabling users to interact without transaction fees. +* ***Stellar Gasless/Sponsored Transactions***: Support for sponsored transactions on Stellar, enabling users to pay fees in tokens (e.g., USDC) instead of native XLM. +* ***Transaction Nonce Management***: Handle nonce management to ensure transaction order. +* ***Transaction Status Monitoring***: Track the status of submitted transactions. +* ***SDK Integration***: Easily interact with the relayer through our companion JavaScript/TypeScript SDK. +* ***Extensible Architecture***: Easily add support for new blockchain networks. +* ***Configurable Network Policies***: Define and enforce network-specific policies for transaction processing. +* ***Metrics and Observability***: Monitor application performance using Prometheus and Grafana. +* ***Docker Support***: Deploy the relayer using Docker for both development and production environments. +* ***Plugins***: Extend the functionality of the relayer with custom logic using TypeScript functions. + +## Supported Networks + +OpenZeppelin Relayer supports multiple blockchain networks through a flexible JSON-based configuration system. Networks are defined in configuration files, allowing you to configure: + +* ***Any EVM-compatible network*** (Ethereum, Polygon, BSC, Arbitrum, Optimism, etc.) +* ***Solana networks*** (mainnet-beta, devnet, testnet, custom RPC endpoints) +* ***Stellar networks*** (Pubnet, Testnet, custom networks) +* ***Create custom network configurations*** with specific RPC endpoints, chain IDs, and network parameters +* ***Use inheritance*** to create network variants that inherit from base configurations + +### Network Types + +| Network Type | Description | +| --- | --- | +| `evm` | Ethereum Virtual Machine compatible networks. Supports any EVM chain by configuring chain ID, RPC URLs, and network-specific parameters. | +| `solana` | Solana blockchain networks. Supports all Solana clusters and custom RPC endpoints. | +| `stellar` | Stellar blockchain networks (Partial support). Supports Stellar Public Network and Testnet. | + +Networks can be loaded from: + +* ***JSON arrays***: Direct network definitions in configuration files +* ***Directory of files***: Multiple JSON files each containing network definitions + +For detailed network configuration options and examples, see the [Network Configuration](/relayer/network_configuration) page. + + + + +For information about our development plans and upcoming features, see [Project Roadmap](/relayer/roadmap). + + + + + + +To get started immediately, see [Quickstart](/relayer/quickstart). + + + +## Technical Overview + +```mermaid +%%{init: { + 'theme': 'base', + 'themeVariables': { + 'background': '#ffffff', + 'mainBkg': '#ffffff', + 'primaryBorderColor': '#cccccc' + } +}}%% +flowchart TB + subgraph "Clients" + client[API/SDK] + end + + subgraph "OpenZeppelin Relayer" + subgraph "API Layer" + api[API Routes & Controllers] + middleware[Middleware] + plugins[Plugins] + end + + subgraph "Domain Layer" + domain[Domain Logic] + relayer[Relayer Services] + policies[Policy Enforcement] + end + + subgraph "Infrastructure" + repositories[Repositories] + jobs[Job Queue System] + signer[Signer Services] + provider[Network Providers] + end + + subgraph "Services Layer" + transaction[Transaction Services] + vault[Vault Services] + webhook[Webhook Notifications] + monitoring[Monitoring & Metrics] + end + + subgraph "Configuration" + config_files[Config Files] + env_vars[Environment Variables] + end + end + + subgraph "External Systems" + blockchain[Blockchain Networks] + redis[Redis] + vault_ext[HashiCorp Vault] + metrics[Prometheus/Grafana] + notification[Notification Services] + end + + %% Client connections + client -- "HTTP Requests" --> api + + %% API Layer connections + api -- "Processes requests" --> middleware + middleware -- "Validates & routes" --> domain + middleware -- "Invokes" --> plugins + + %% Domain Layer connections + domain -- "Uses" --> relayer + domain -- "Enforces" --> policies + relayer -- "Processes" --> transaction + plugins -- "Interacts with" --> relayer + + %% Services Layer connections + transaction -- "Signs with" --> signer + transaction -- "Connects via" --> provider + transaction -- "Queues jobs" --> jobs + webhook -- "Notifies" --> notification + monitoring -- "Collects" --> metrics + signer -- "May use" --> vault + + %% Infrastructure connections + repositories -- "Stores data" --> redis + jobs -- "Processes async" --> redis + vault -- "Secrets management" --> vault_ext + provider -- "Interacts with" --> blockchain + + %% Configuration connections + config_files -- "Configures" --> domain + env_vars -- "Configures" --> domain + + %% Styling + classDef apiClass fill:#f9f,stroke:#333,stroke-width:2px + classDef domainClass fill:#bbf,stroke:#333,stroke-width:2px + classDef infraClass fill:#bfb,stroke:#333,stroke-width:2px + classDef serviceClass fill:#fbf,stroke:#333,stroke-width:2px + classDef configClass fill:#fbb,stroke:#333,stroke-width:2px + classDef externalClass fill:#ddd,stroke:#333,stroke-width:1px + + class api,middleware,plugins apiClass + class domain,relayer,policies domainClass + class repositories,jobs,signer,provider infraClass + class transaction,vault,webhook,monitoring serviceClass + class config_files,env_vars configClass + class blockchain,redis,vault_ext,metrics,notification externalClass +``` + +## Project Structure + +The project follows a standard Rust project layout: + +``` +openzeppelin-relayer/ +├── src/ +│ ├── api/ # Route and controllers logic +│ ├── bootstrap/ # Service initialization logic +│ ├── config/ # Configuration logic +│ ├── constants/ # Constant values used in the system +│ ├── domain/ # Domain logic +│ ├── jobs/ # Asynchronous processing logic (queueing) +│ ├── logging/ # Logs File rotation logic +│ ├── metrics/ # Metrics logic +│ ├── models/ # Data structures and types +│ ├── repositories/ # Configuration storage +│ ├── services/ # Services logic +│ └── utils/ # Helper functions +│ +├── config/ # Configuration files +├── tests/ # Integration tests +├── docs/ # Documentation +├── scripts/ # Utility scripts +├── examples/ # Configuration examples +├── helpers/ # Rust helper scripts +├── plugins/ # Plugins directory +└── ... other root files (Cargo.toml, README.md, etc.) +``` + +For detailed information about each directory and its contents, see [Project Structure Details](/relayer/structure). + +## Getting Started + +### Prerequisites + +* Rust 2021 edition, version `1.86` or later +* Docker (optional, for containerized deployment) +* Node.js, typescript and ts-node (optional, for plugins) + + + +**Ready-to-Use Example Configurations** + +For quick setup with various configurations, check the [examples directory](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples) in our GitHub repository: + +* `basic-example`: Simple setup with Redis +* `basic-example-logging`: Configuration with file-based logging +* `basic-example-metrics`: Setup with Prometheus and Grafana metrics +* `vault-secret-signer`: Using HashiCorp Vault for key management +* `vault-transit-signer`: Using Vault Transit for secure signing +* `evm-gcp-kms-signer`: Using Google Cloud KMS for EVM secure signing +* `evm-turnkey-signer`: Using Turnkey for EVM secure signing +* `solana-turnkey-signer`: Using Turnkey for Solana secure signing +* `evm-cdp-signer`: Using CDP for EVM secure signing +* `solana-cdp-signer`: Using CDP for Solana secure signing +* `redis-storage`: Using Redis for Storage +* `network-configuration-config-file`: Using Custom network configuration via config file +* `network-configuration-json-file`: Using Custom network configuration via JSON file + +Each example includes a README with step-by-step instructions and Docker Compose configuration. + + +### Install Locally + +1. Clone the repository: + + ```bash + git clone https://github.com/openzeppelin/openzeppelin-relayer + cd openzeppelin-relayer + ``` +2. Verify you have sodium libs installed. If not, follow these instructions: + + * Install a stable libsodium version from [here](https://download.libsodium.org/libsodium/releases/). + * Follow the steps in the [libsodium installation guide](https://doc.libsodium.org/installation). +3. Install dependencies: + + ```bash + cargo build + ``` + +## Running the Relayer + +### Option 1: Run Locally + +```bash +cargo run +``` + + +Before executing the command, ensure that the `.env` and `config.json` files are configured as detailed in the [Configuration References](/relayer#configuration_references) section. + + +### Option 2: Run with Docker + +The Relayer can be run as either a development or production container using the corresponding Dockerfile (`Dockerfile.development` or `Dockerfile.production`). + +#### Step 1: Configure Environment + +* Edit `.env` at the root of the repository to adjust environment variables +* The appropriate .env file will be included during image build + +#### Step 2: Build the Image + +You can build using Docker Compose (v2). + +```bash +# Default build +docker compose build + +# Or, for a leaner image (and using Dockerfile.production) +DOCKERFILE=Dockerfile.production docker compose build +``` + +#### Step 3: Run the Container + +Use Docker Compose to run the container: + +```bash +docker compose up -d +``` + +For production runs, you can use: + +```bash +DOCKERFILE=Dockerfile.production docker compose up -d +``` + +## Configuration + +OpenZeppelin Relayer supports two configuration approaches: + +***File-based Configuration:*** +- ***`config.json`***: Contains relayer definitions, signer configurations, and network policies +- ***`.env`***: Contains environment variables like API keys and connection strings + +***API-based Configuration:*** +- Runtime configuration management via REST API +- No service restarts required for configuration changes +- Full CRUD operations for relayers, signers, and notifications + + + + +Both approaches can be used together. File-based configuration is loaded on startup, while API changes provide runtime flexibility. Changes to environment variables (`.env`) always require restarting the container. + +When used together, API changes are not synced to file-based configuration. File-based configuration is loaded only once when using persistent storage mode. + +For quick setup examples with pre-configured files, see the [examples directory](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples) in our GitHub repository. + + + +For comprehensive configuration details, including: + +* Environment variables and their settings +* Main configuration file structure +* Signer configurations (local, vault, cloud KMS, etc.) +* Notification setup +* Relayer policies and network settings +* Plugin configuration +* Complete configuration examples + +See the dedicated [Configuration Guide](/relayer/configuration). + +## Important Considerations + +## Deployment Considerations + + +The OpenZeppelin Relayer is designed to function as a backend service and is not meant to be directly exposed to the public internet. To protect the service from unauthorized access, deploy it behind your own secure backend infrastructure—such as a reverse proxy or firewall—and restrict access to trusted internal components only. Direct exposure can increase the risk of exploitation and security breaches. + + +## Support + +For support or inquiries, contact us on [Telegram](https://t.me/openzeppelin_tg/2). + +## License +This project is licensed under the GNU Affero General Public License v3.0 - see the LICENSE file for details. + +## Security +For security concerns, please refer to our [Security Policy](https://github.com/OpenZeppelin/openzeppelin-relayer/blob/main/SECURITY.md). diff --git a/content/relayer/1.5.x/plugins/channels.mdx b/content/relayer/1.5.x/plugins/channels.mdx new file mode 100644 index 00000000..b4338fb5 --- /dev/null +++ b/content/relayer/1.5.x/plugins/channels.mdx @@ -0,0 +1,822 @@ +--- +title: Channels +--- + +## Overview + +Channels is a plugin for OpenZeppelin Relayer that enables parallel transaction submission on Stellar using channel accounts with automatic fee bumping. Channel accounts provide unique sequence numbers for concurrent transaction processing, eliminating sequence number conflicts. + +The plugin features: + +- **_Parallel Transaction Processing_**: Uses a pool of channel accounts for concurrent submissions +- **_Automatic Fee Bumping_**: Dedicated fund account pays transaction fees +- **_Dynamic Pool Management_**: Channel accounts acquired and released automatically +- **_Transaction Simulation_**: Automatically simulates and builds transactions with proper resources +- **_Management API_**: Dynamic configuration of channel accounts + +## Using the Plugin Client + +The fastest way to interact with Channels is through the plugin's TypeScript client, which provides a type-safe, unified interface for transaction submission and management operations. + +### Installation + +```bash +npm install @openzeppelin/relayer-plugin-channels +# or +pnpm add @openzeppelin/relayer-plugin-channels +``` + +### Client Setup + +The client supports two connection modes that are automatically detected based on configuration: + +```typescript +import { ChannelsClient } from "@openzeppelin/relayer-plugin-channels"; + +// Direct HTTP connection to Channels service +const directClient = new ChannelsClient({ + baseUrl: "https://channels.openzeppelin.com", // Channels service URL + apiKey: process.env.CHANNELS_API_KEY, // Service API key + adminSecret: process.env.CHANNELS_ADMIN, // Optional: for management + timeout: 30000, // Optional: request timeout +}); + +// Connection via OpenZeppelin Relayer plugin +const relayerClient = new ChannelsClient({ + pluginId: "channels-plugin", // Plugin identifier (triggers relayer mode) + baseUrl: "http://localhost:8080", // Relayer URL + apiKey: process.env.RELAYER_API_KEY, // Relayer API key (sent as Bearer AND custom header) + apiKeyHeader: "x-api-key", // Optional: header for fee tracking (default: x-api-key) + adminSecret: process.env.CHANNELS_ADMIN, // Optional: for management +}); +``` + +### Submitting Transactions + +Channels provides separate methods for different transaction types: + +```typescript +// Submit signed transaction (XDR) +const result = await client.submitTransaction({ + xdr: "AAAAAgAAAABQEp+s8xGPrF...", // Complete signed envelope +}); + +// Submit Soroban transaction (func + auth) +const result = await client.submitSorobanTransaction({ + func: "AAAABAAAAAEAAAAGc3ltYm9s...", // Host function XDR + auth: ["AAAACAAAAAEAAAA...", "AAAACAAAAAEAAAB..."], // Detached auth entries +}); + +console.log("Transaction:", result.transactionId, result.hash, result.status); +``` + +### Managing Channel Accounts + +For managing channel accounts, the SDK provides the following methods: + +```typescript +// List configured channel accounts +const accounts = await client.listChannelAccounts(); +console.log("Channel accounts:", accounts.relayerIds); + +// Update channel accounts (requires adminSecret) +const result = await client.setChannelAccounts([ + "channel-001", + "channel-002", + "channel-003", +]); +console.log("Update successful:", result.ok, result.appliedRelayerIds); + +// Query fee usage (requires adminSecret) +const usage = await client.getFeeUsage("client-api-key"); +console.log("Fee usage:", usage); +``` + +### Example Scripts + +For complete working examples and additional client usage details, see the [Channels Plugin README](https://github.com/OpenZeppelin/relayer-plugin-channels#plugin-client). + +## Prerequisites + +- Node.js >= 18 +- pnpm >= 10 +- OpenZeppelin Relayer (installed and configured) + +## Example Setup + +For a complete working example with Docker Compose, refer to the Channels plugin example in the OpenZeppelin Relayer repository: + +- **_Location_**: [examples/channels-plugin-example](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/channels-plugin-example) +- **_Documentation_**: [README.md](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/channels-plugin-example/README.md) + +## Installation + +Channels can be added to any OpenZeppelin Relayer installation. + +**_Resources:_** + +- **_npm Package_**: [@openzeppelin/relayer-plugin-channels](https://www.npmjs.com/package/@openzeppelin/relayer-plugin-channels) +- **_GitHub Repository_**: https://github.com/OpenZeppelin/relayer-plugin-channels +- **_Example Setup_**: [channels-plugin-example](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/channels-plugin-example) + +### Install from npm + +```bash +# From the root of your Relayer repository +cd plugins +pnpm add @openzeppelin/relayer-plugin-channels +``` + +### Create the plugin wrapper + +Inside your Relayer, create a directory for the plugin and expose its handler: + +```bash +mkdir -p plugins/channels +``` + +Create `plugins/channels/index.ts`: + +```typescript +export { handler } from "@openzeppelin/relayer-plugin-channels"; +``` + +## Configuration + +### Plugin Registration + +Register the plugin in your `config/config.json` file: + +```json +{ + "plugins": [ + { + "id": "channels-plugin", + "path": "channels/index.ts", + "timeout": 60 + } + ] +} +``` + +### Environment Variables + +Configure the required environment variables: + +```bash +# Required environment variables +export STELLAR_NETWORK="testnet" # or "mainnet" +export FUND_RELAYER_ID="channels-fund" # ID of the fund relayer +export PLUGIN_ADMIN_SECRET="your-secret-here" # Required for management API + +# Optional environment variables +export LOCK_TTL_SECONDS=30 # Lock timeout (default: 30, range: 3-30) +export MAX_FEE=1000000 # Maximum fee in stroops (default: 1,000,000) +``` + +**_Required Variables:_** + +- `STELLAR_NETWORK`: Either "testnet" or "mainnet" +- `FUND_RELAYER_ID`: Relayer ID for the account that pays transaction fees + +**_Optional Variables:_** + +- `PLUGIN_ADMIN_SECRET`: Secret for accessing the management API (required to manage channel accounts) +- `LOCK_TTL_SECONDS`: TTL for channel account locks in seconds (default: 30, range: 3-30) +- `MAX_FEE`: Maximum transaction fee in stroops (default: 1,000,000) +- `FEE_LIMIT`: Fair use limit for fee consumption per API key in stroops. When exceeded, requests are rejected with `FEE_LIMIT_EXCEEDED` error (when not set, fee tracking is disabled) +- `FEE_RESET_PERIOD_SECONDS`: Reset fee consumption every N seconds (e.g., 86400 = 24 hours). When configured, each API key's fee consumption resets automatically after the period expires +- `API_KEY_HEADER`: HTTP header name used to extract the client API key for fee tracking (default: x-api-key) +- `LIMITED_CONTRACTS`: Comma-separated list of contract addresses with restricted pool access. Comma separation will be trimmed and can handle spaces. +- `CONTRACT_CAPACITY_RATIO`: Ratio (0-1) determining what portion of the channel pool limited contracts can access (default: 0.8). The ratio is converted using Math.floor() which always rounds DOWN to the nearest integer, with a minimum guarantee of 1 channel. + +### Contract Capacity Limits + +Channels supports per-contract capacity limits to prevent high-volume contracts from monopolizing the channel pool. This feature ensures fair resource distribution by restricting certain contracts to a subset of available channels while allowing other contracts full pool access. + +**_How It Works:_** + +When a transaction targets a contract listed in `LIMITED_CONTRACTS`, Channels restricts that transaction to a deterministic subset of the channel pool based on the configured `CONTRACT_CAPACITY_RATIO`. The subset is selected using hash-based partitioning, ensuring consistent channel assignment for each limited contract. + +**_Configuration:_** + +```bash +# Restrict high-volume contracts to 80% of the channel pool +export LIMITED_CONTRACTS="CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC,CA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUWDA" +export CONTRACT_CAPACITY_RATIO=0.8 +``` + +**_Behavior Notes:_** + +- **_Case-insensitive matching_**: Contract addresses are normalized to uppercase for comparison +- **_Minimum guarantee_**: Limited contracts are always guaranteed at least 1 channel, even with low capacity ratios +- **_Unlisted contracts_**: Contracts not in `LIMITED_CONTRACTS` retain full access to all channels +- **_Deterministic selection_**: The same contract always gets the same subset of channels, ensuring predictable behavior + +### Relayer Configuration + +Channels requires two types of relayers: + +1. **_Fund Account_**: The account that pays transaction fees (should have `concurrent_transactions: true` enabled) +2. **_Channel Accounts_**: At least one channel account (recommended: 2 or more for better throughput) + +Configure relayers in your `config/config.json`: + +```json +{ + "relayers": [ + { + "id": "channels-fund", + "name": "Channels Fund Account", + "network": "testnet", + "paused": false, + "network_type": "stellar", + "signer_id": "channels-fund-signer", + "policies": { + "concurrent_transactions": true + } + }, + { + "id": "channel-001", + "name": "Channel Account 001", + "network": "testnet", + "paused": false, + "network_type": "stellar", + "signer_id": "channel-001-signer" + }, + { + "id": "channel-002", + "name": "Channel Account 002", + "network": "testnet", + "paused": false, + "network_type": "stellar", + "signer_id": "channel-002-signer" + } + ], + "notifications": [], + "signers": [ + { + "id": "channels-fund-signer", + "type": "local", + "config": { + "path": "config/keys/channels-fund.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE_FUND" + } + } + }, + { + "id": "channel-001-signer", + "type": "local", + "config": { + "path": "config/keys/channel-001.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE_CHANNEL_001" + } + } + }, + { + "id": "channel-002-signer", + "type": "local", + "config": { + "path": "config/keys/channel-002.json", + "passphrase": { + "type": "env", + "value": "KEYSTORE_PASSPHRASE_CHANNEL_002" + } + } + } + ], + "networks": "./config/networks", + "plugins": [ + { + "id": "channels", + "path": "channel/index.ts", + "timeout": 30, + "emit_logs": true, + "emit_traces": true + } + ] +} +``` + +**_Important Configuration Notes:_** + +- **_Fund Account_** (`channels-fund`): Must have `"concurrent_transactions": true` in policies to enable parallel transaction processing +- **_Channel Accounts_**: Create at least 2 for better throughput (you can add more as `channel-003`, etc.) +- **_Network_**: Use `testnet` for testing or `mainnet` for production +- **_Signers_**: Each relayer references a signer by `signer_id`, and signers are defined separately with keystore paths +- **_Keystore Files_**: You’ll need to create keystore files for each account - see [OpenZeppelin Relayer documentation](https://docs.openzeppelin.com/relayer) for details on creating and managing keys +- **_Plugin Registration_**: The plugin `id` should match what you use in environment variables and API calls + +After configuration, fund these accounts on-chain and register them with Channels (see "Initializing Channel Accounts" below). + +## Initializing Channel Accounts + +After configuring your relayers in `config.json` and funding the Stellar accounts, register them with Channels via the Management API: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "setChannelAccounts", + "adminSecret": "your-secret-here", + "relayerIds": ["channel-001", "channel-002"] + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "ok": true, + "appliedRelayerIds": ["channel-001", "channel-002"] + }, + "error": null +} +``` + +This tells Channels which relayers to use as channel accounts. All relayer IDs must match your configured relayer IDs in `config.json`. + +Channels is now ready to serve Soroban transactions. + +## Automated Setup + +To skip the manual configuration steps, use the provided automation script. It automates the entire setup process: creating signers and relayers via the API, funding accounts on-chain, and registering them with Channels. + +### Prerequisites + +When using the automated setup, you only need to configure and fund the **_fund account_**: + +```json +{ + "relayers": [ + { + "id": "channels-fund", + "chain": "stellar", + "signer": "channels-fund-signer", + "policies": { + "concurrent_transactions": true + } + } + ] +} +``` + +The script creates all channel account signers and relayers dynamically - no config.json entries needed for channel accounts. + +### Running the Script + +```bash +pnpm exec tsx ./scripts/create-channel-accounts.ts \ + --total 3 \ + --base-url http://localhost:8080 \ + --api-key \ + --funding-relayer channels-fund \ + --plugin-id channels-plugin \ + --plugin-admin-secret \ + --network testnet +``` + +### What the Script Does + +1. **_Creates channel account signers and relayers via API_**: Following the naming pattern `channel-0001`, `channel-0002`, etc. +2. **_Funds channel accounts on-chain_**: Submits funding transactions through the fund relayer and waits for confirmation +3. **_Registers with Channels_**: Automatically calls the Management API to register all channel accounts + +### Script Options + +- `--total`: Number of channel accounts to create (recommended: 2-3 for testing, more for production) +- `--fix`: Audit and heal partially created state (use if the script was interrupted) +- `--dry-run`: Preview actions without making changes +- `--prefix`: Customize the naming prefix (default: `channel-`) +- `--starting-balance`: XLM amount for each account (default: 5) + +### Script Location + +- Example directory: [`scripts/create-channel-accounts.ts`](https://github.com/OpenZeppelin/relayer-plugin-channels/blob/main/scripts/create-channel-accounts.ts) + +## API Usage + +Channels is invoked by making POST requests to the plugin endpoint: + +```bash +POST /api/v1/plugins/{plugin-id}/call +``` + +### Submitting Transactions + +There are two ways to submit transactions to Channels: + +#### Option 1: Complete Transaction XDR + +Submit a complete, signed transaction envelope: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "xdr": "AAAAAgAAAAA..." + } + }' +``` + +#### Option 2: Soroban Function + Auth + +Submit just the Soroban function and authorization entries: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "func": "AAAABAAAAAEAAAAGc3ltYm9s...", + "auth": ["AAAACAAAAAEAAAA..."] + } + }' +``` + +### Parameters + +- `xdr` (string): Complete transaction envelope XDR (base64) - must be signed, not a fee-bump envelope +- `func` (string): Soroban host function XDR (base64) +- `auth` (array of strings): Array of Soroban authorization entry XDRs (base64) + +**_Important Notes:_** + +- Provide either `xdr` OR `func`+`auth`, not both +- When using `xdr`, the transaction must be a regular signed transaction (not a fee-bump envelope) +- When using `func`+`auth`, Channels will build and simulate the transaction automatically +- Transactions are always submitted with fee bumping from the fund account + +### Generating XDR with Stellar SDK + +Use the `@stellar/stellar-sdk` to generate the required XDR values: + +#### Who Signs the Transaction? + +The transaction must be signed by **the user's keypair** (the account invoking the smart contract), **not** the channel or fund accounts. Channels handles fee payment separately through fee bumping - your transaction signature authorizes the contract call, while the fund account pays the network fees. + +For Soroban contract calls: + +- **Full XDR mode**: Sign the entire transaction envelope with the invoker's key +- **func + auth mode**: Sign only the authorization entries with the invoker's key + +#### Tools for Creating and Signing Transactions + +While you can use the Stellar SDK programmatically, several tools make the process easier: + +**[Stellar Laboratory](https://lab.stellar.org/)** - Official web-based tool for: + +- Building and signing transactions visually +- Inspecting and decoding XDR data + +**Popular Stellar Wallets with XDR Signing Support:** + +- **[Freighter](https://www.freighter.app/)** - Browser extension wallet with Soroban support and XDR signing +- **[Albedo](https://albedo.link/)** - Web-based wallet supporting transaction signing and XDR export +- **[Lobstr](https://lobstr.co/)** - Mobile and web wallet with transaction signing capabilities + +These wallets can sign transactions and export the signed XDR for submission to Channels. + +#### Full Transaction Envelope XDR + +```typescript +import { Networks, TransactionBuilder, rpc } from "@stellar/stellar-sdk"; + +// Build your transaction +const tx = new TransactionBuilder(account, { + fee: "100", + networkPassphrase: Networks.TESTNET, +}) + .addOperation(/* Operation.invokeHostFunction from Contract.call(...) */) + .setTimeout(30) + .build(); + +// Sign with the USER's keypair (the account invoking the contract) +// This is NOT the channel or fund account - it's your end user's key +tx.sign(userKeypair); + +// Export base64 envelope XDR for submission to Channels +const envelopeXdr = tx.toXDR(); +``` + +#### Soroban Function + Auth XDRs + +```typescript +// Build and simulate first to obtain auth +const baseTx = /* TransactionBuilder(...).addOperation(...).build() */; +const sim = await rpcServer.simulateTransaction(baseTx); + +// Apply simulation, then extract from the InvokeHostFunction operation +const assembled = rpc.assembleTransaction(baseTx, sim).build(); +const op = assembled.operations[0]; // Operation.InvokeHostFunction + +const funcXdr = op.func.toXDR("base64"); +const authXdrs = (op.auth ?? []).map(a => a.toXDR("base64")); +``` + +## Management API + +Channels provides a management API to dynamically configure channel accounts. This API requires authentication via the `PLUGIN_ADMIN_SECRET` environment variable. + +### List Channel Accounts + +Get the current list of configured channel accounts: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "listChannelAccounts", + "adminSecret": "your-secret-here" + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "relayerIds": ["channel-001", "channel-002"] + }, + "error": null +} +``` + +### Set Channel Accounts + +Configure the channel accounts that Channels will use. This replaces the entire list: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "setChannelAccounts", + "adminSecret": "your-secret-here", + "relayerIds": ["channel-001", "channel-002", "channel-003"] + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "ok": true, + "appliedRelayerIds": ["channel-001", "channel-002", "channel-003"] + }, + "error": null +} +``` + +**_Important Notes:_** + +- You must configure at least one channel account before Channels can process transactions +- The management API will prevent removing accounts that are currently locked (in use). On failure it returns HTTP 409 with code `LOCKED_CONFLICT` and `details.locked` listing the blocked IDs +- All relayer IDs must exist in your OpenZeppelin Relayer configuration +- The `adminSecret` must match the `PLUGIN_ADMIN_SECRET` environment variable + +### Get Fee Usage + +Query fee consumption for a specific API key (requires `FEE_LIMIT` to be configured): + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "getFeeUsage", + "adminSecret": "your-secret-here", + "apiKey": "client-api-key-to-check" + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "consumed": 500000, + "limit": 1000000, + "remaining": 500000, + "periodStartAt": "2024-01-15T00:00:00.000Z", + "periodEndsAt": "2024-01-16T00:00:00.000Z" + }, + "error": null +} +``` + +**_Response Fields:_** + +- `consumed`: Fee used in stroops +- `limit`: Effective fee limit (custom if set, otherwise default) - undefined if unlimited +- `remaining`: Remaining fee budget - undefined if unlimited +- `periodStartAt`: ISO 8601 timestamp when current period started (if reset period configured) +- `periodEndsAt`: ISO 8601 timestamp when period will reset (if reset period configured) + +### Get Fee Limit + +Query fee limit configuration for an API key: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "getFeeLimit", + "adminSecret": "your-secret-here", + "apiKey": "client-api-key-to-query" + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "limit": 500000 + }, + "error": null +} +``` + +**_Response Fields:_** + +- `limit`: Fee limit (custom if set, otherwise default), undefined if unlimited + +### Set Fee Limit + +Set a custom fee limit for an API key: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "setFeeLimit", + "adminSecret": "your-secret-here", + "apiKey": "client-api-key", + "limit": 500000 + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "ok": true, + "limit": 500000 + }, + "error": null +} +``` + +### Delete Fee Limit + +Remove custom limit for an API key (reverts to default): + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/channels-plugin/call \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "params": { + "management": { + "action": "deleteFeeLimit", + "adminSecret": "your-secret-here", + "apiKey": "client-api-key" + } + } + }' +``` + +**_Response:_** + +```json +{ + "success": true, + "data": { + "ok": true + }, + "error": null +} +``` + +## Responses + +All API responses use the standard Relayer envelope format: `success, data, error, metadata`. + +### Success Response (HTTP 200) + +```json +{ + "success": true, + "data": { + "transactionId": "tx_123456", + "status": "confirmed", + "hash": "1234567890abcdef..." + }, + "error": null +} +``` + +**_Response Fields:_** + +- `success`: `true` when the plugin executed successfully +- `data`: Contains the transaction result +- `transactionId`: The OpenZeppelin Relayer transaction ID +- `status`: Transaction status (e.g., "confirmed") +- `hash`: The Stellar transaction hash +- `error`: `null` on success + +### Error Response (HTTP 4xx) + +```json +{ + "success": false, + "data": { + "code": "POOL_CAPACITY", + "details": {} + }, + "error": "Too many transactions queued. Please try again later", + "metadata": { + "logs": [{ "level": "error", "message": "All channel accounts in use" }] + } +} +``` + +**_Error Response Fields:_** + +- `success`: `false` when the plugin encountered an error +- `data`: Contains error details +- `code`: Error code (e.g., "POOL_CAPACITY", "LOCKED_CONFLICT") +- `details`: Additional context about the error +- `error`: Human-readable error message +- `metadata.logs`: Plugin execution logs (if `emit_logs` is enabled) + +### Common Error Codes + +- `CONFIG_MISSING`: Missing required environment variable +- `UNSUPPORTED_NETWORK`: Invalid network type +- `INVALID_PARAMS`: Invalid request parameters +- `INVALID_XDR`: Failed to parse XDR +- `INVALID_ENVELOPE_TYPE`: Not a regular transaction envelope (e.g., fee bump) +- `INVALID_TIME_BOUNDS`: TimeBounds too far in the future +- `NO_CHANNELS_CONFIGURED`: No channel accounts have been configured via management API +- `POOL_CAPACITY`: All channel accounts in use +- `RELAYER_UNAVAILABLE`: Relayer not found +- `SIMULATION_FAILED`: Transaction simulation failed +- `ONCHAIN_FAILED`: Transaction failed on-chain +- `WAIT_TIMEOUT`: Transaction wait timeout +- `MANAGEMENT_DISABLED`: Management API not enabled +- `UNAUTHORIZED`: Invalid admin secret +- `LOCKED_CONFLICT`: Cannot remove locked channel accounts +- `FEE_LIMIT_EXCEEDED`: API key has exceeded its fair use fee limit +- `API_KEY_REQUIRED`: Fee tracking is enabled but request is missing the API key header + +## Additional Resources + +- **_Stellar SDK Documentation_**: https://stellar.github.io/js-stellar-sdk/ +- **_Soroban Documentation_**: https://soroban.stellar.org/docs +- **_OpenZeppelin Relayer Documentation_**: https://docs.openzeppelin.com/relayer diff --git a/content/relayer/1.5.x/plugins/index.mdx b/content/relayer/1.5.x/plugins/index.mdx new file mode 100644 index 00000000..84f3acae --- /dev/null +++ b/content/relayer/1.5.x/plugins/index.mdx @@ -0,0 +1,923 @@ +--- +title: Plugins +--- + +## Overview + +OpenZeppelin Relayer supports plugins to extend the functionality of the relayer. + +Plugins are `TypeScript` functions running in the Relayer server that can include any arbitrary logic defined by the Relayer operator. + +The plugin system features: + +- **_Handler Pattern_**: Simple export-based plugin development +- **_TypeScript Support_**: Full type safety and IntelliSense +- **_Plugin API_**: Clean interface for interacting with relayers +- **_Key-Value Storage_**: Persistent state and locking for plugins +- **_HTTP Headers_**: Access request headers for authentication and metadata +- **_Route-Based Invocation_**: Optional route suffix (`/call/`) for multi-endpoint plugins +- **_Docker Integration_**: Seamless development and deployment +- **_Comprehensive Error Handling_**: Detailed logging and debugging capabilities + +## Configuration + +### Writing a Plugin + +Plugins are declared under `plugins` directory, and are expected to be TypeScript files (`.ts` extension). + +```bash +openzeppelin-relayer/ +├── plugins/ +│ └── my-plugin.ts # Plugin code +└── config/ + └── config.json # Plugins in configuration file +``` + +#### Handler Pattern (Recommended) + +This approach uses a simple `handler` export pattern with a single context parameter: + +```typescript +/// Required imports. +import { Speed, PluginContext, pluginError } from '@openzeppelin/relayer-sdk'; + +/// Define your plugin parameters interface +type MyPluginParams = { + destinationAddress: string; + amount?: number; + message?: string; + relayerId?: string; +}; + +/// Define your plugin return type +type MyPluginResult = { + transactionId: string; + confirmed: boolean; + note?: string; +}; + +/// Export a handler function - that's it! +export async function handler(context: PluginContext): Promise { + const { api, params, kv, headers } = context; + console.info('🚀 Plugin started...'); + + // Validate parameters + if (!params.destinationAddress) { + throw pluginError('destinationAddress is required', { + code: 'MISSING_PARAM', + status: 400, + details: { field: 'destinationAddress' }, + }); + } + + // Use the relayer API + const relayer = api.useRelayer(params.relayerId || 'my-relayer'); + + const result = await relayer.sendTransaction({ + to: params.destinationAddress, + value: params.amount || 1, + data: '0x', + gas_limit: 21000, + speed: Speed.FAST, + }); + + console.info(`Transaction submitted: ${result.id}`); + + // Optionally store something in KV + await kv.set('last_tx_id', result.id); + + // Wait for confirmation + await result.wait({ + interval: 5000, // Check every 5 seconds + timeout: 120000, // Timeout after 2 minutes + }); + + return { + transactionId: result.id, + message: `Successfully sent ${params.amount || 1} wei to ${params.destinationAddress}`, + }; +} +``` + +#### Handler Context (`PluginContext`) + +All modern plugins export a single function with the signature: + +```typescript +import type { PluginContext } from '@openzeppelin/relayer-sdk'; + +export async function handler(context: PluginContext) { + const { api, params, kv, headers, route, method, query, config } = context; + + // ...your logic + return { ok: true }; +} +``` + +The `handler` receives a `PluginContext` object with these commonly-used fields: + +| Field | Type | Description | +| --- | --- | --- | +| `context.api` | `PluginAPI` | Client for interacting with Relayers (e.g. `api.useRelayer(...)`). | +| `context.params` | `any` | The input parameters for the plugin invocation. For `POST`, this comes from the request body; for `GET`, it is `{}`. | +| `context.kv` | KV store client | Persistent key/value store (namespaced per plugin). Only available in the modern context handler. | +| `context.headers` | `Record` | Incoming HTTP headers (lowercased keys; values are arrays). | +| `context.route` | `string` | The route suffix, including the leading slash, e.g. `""`, `"/verify"`, `"/settle"`. | +| `context.method` | `"GET" \| "POST"` | The HTTP method used to invoke the plugin. | +| `context.query` | `Record` | Query parameters parsed from the request URL. Most useful for `GET` invocations. | +| `context.config` | `unknown` | User-defined plugin configuration object from `plugins[].config` in the Relayer config file. | + + + `context.params` is user-provided input. Prefer defining a `type` for your params, validating required fields, and using + `pluginError(...)` to return structured 4xx errors. + + +#### Legacy Patterns (Deprecated, but supported) + + + The legacy patterns below are deprecated and will be removed in a future version. Please migrate to the single-context + handler pattern. Legacy plugins continue to work but will show deprecation warnings. The two-parameter handler does + not have access to the KV store. + + +```typescript +// Legacy: runPlugin pattern (deprecated) +import { runPlugin, PluginAPI } from '../lib/plugin'; + +async function myPlugin(api: PluginAPI, params: any) { + // Plugin logic here (no KV access) + return 'result'; +} + +runPlugin(myPlugin); +``` + +**_Legacy handler (two-parameter, deprecated, no KV)_**: + +```typescript +import { PluginAPI } from '@openzeppelin/relayer-sdk'; + +export async function handler(api: PluginAPI, params: any): Promise { + // Same logic as before, but no KV access in this form + return 'done!'; +} +``` + +### Declaring in config file + +Plugins are configured in the `./config/config.json` file, under the `plugins` key. + +The file contains a list of plugins, each with an id, path, timeout in seconds (optional), and logging configuration options. + +The plugin path is relative to the `/plugins` directory + +Example: + +```json +"plugins": [ + { + "id": "my-plugin", + "path": "my-plugin.ts", + "timeout": 30, + "emit_logs": false, + "emit_traces": false, + "raw_response": false, + "allow_get_invocation": false, + "config": { + "featureFlagExample": true + } + "forward_logs": false + } +] +``` + +### Configuration Options + +#### Timeout + +The timeout is the maximum time **in seconds** that the plugin can run. If the plugin exceeds the timeout, it will be terminated with an error. + +The timeout is optional, and if not provided, the default is 300 seconds (5 minutes). + +#### Logging Configuration + +Plugins support three logging configuration options that control how plugin output is handled: + +- **`emit_logs`** (default: `false`): When `true`, includes plugin console output (console.log, console.error, etc.) in the HTTP response `metadata.logs` field. Useful for client-side debugging and inspection. + +- **`emit_traces`** (default: `false`): When `true`, includes API interaction traces (messages exchanged between the plugin and Relayer) in the HTTP response `metadata.traces` field. Useful for understanding plugin-relayer communication. + +- **`forward_logs`** (default: `false`): When `true`, forwards plugin console logs to the Relayer's Rust tracing system, making them appear in the Relayer's unified log output. This enables server-side debugging and monitoring through your existing log aggregation infrastructure. Log levels are automatically mapped (error → error!, warn → warn!, info/log → info!, debug → debug!). + +**Use Cases:** + +- **Development/Debugging**: Enable `forward_logs: true` to see plugin logs alongside Relayer logs in your development environment +- **Production Monitoring**: Use `forward_logs: true` for critical plugins to monitor their execution in production logs +- **Client Debugging**: Enable `emit_logs: true` to return logs in API responses for client-side inspection +- **API Tracing**: Enable `emit_traces: true` to debug plugin-relayer interactions + +**Note**: These options are independent and can be used together. For example, you can enable `forward_logs` for server-side monitoring while keeping `emit_logs` disabled to avoid exposing logs to API clients. + +## Plugin Development Guidelines + +### TypeScript Best Practices + +- **_Define Parameter Types_**: Always create interfaces or types for your plugin parameters +- **_Define Return Types_**: Specify what your plugin returns for better developer experience +- **_Handle Errors Gracefully_**: Use try-catch blocks and return structured error responses +- **_Validate Input_**: Check required parameters and provide meaningful error messages +- **_Use Async/Await_**: Modern async patterns for better readability + +### Testing Your Plugin + +You can test your handler function directly with a mocked context: + +```typescript +import { handler } from './my-plugin'; +import type { PluginContext } from '@openzeppelin/relayer-sdk'; + +const mockContext = { + api: { + useRelayer: (_id: string) => ({ + sendTransaction: async () => ({ id: 'test-tx-123', wait: async () => ({ hash: '0xhash' }) }), + }), + }, + params: { + destinationAddress: '0x742d35Cc6640C21a1c7656d2c9C8F6bF5e7c3F8A', + amount: 1000, + }, + kv: { + set: async () => true, + get: async () => null, + del: async () => true, + exists: async () => false, + scan: async () => [], + clear: async () => 0, + withLock: async (_k: string, fn: () => Promise) => fn(), + connect: async () => {}, + disconnect: async () => {}, + }, + headers: { + 'content-type': ['application/json'], + authorization: ['Bearer test-token'], + }, +} as unknown as PluginContext; + +const result = await handler(mockContext); +console.log(result); +``` + +## Invocation + +Plugins are invoked by hitting the `/api/v1/plugins/{plugin-id}/call{route}` endpoint. + +- `route` is optional. Use `/call` for a single endpoint, or `/call/` to expose multiple routes from the same plugin. +- The plugin receives the route as `context.route`. +- You can implement your own routing by branching on `context.route` (for example, `"/verify"`, `"/settle"`, `""`). + +Example (route-based invocation): + +```bash +# Calls the plugin with context.route = "/verify" +curl -X POST http://localhost:8080/api/v1/plugins/my-plugin/call/verify \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -d '{"params":{}}' +``` + +The endpoint accepts a `POST` request. + +- If the request body contains a top-level `params` field, that value is used as `context.params`. +- If the request body does not contain `params`, the entire JSON body is treated as `params`. + +Example `POST` request body: + +```json +{ + "params": { + "destinationAddress": "0x742d35Cc6640C21a1c7656d2c9C8F6bF5e7c3F8A", + "amount": 1000000000000000, + "message": "Hello from OpenZeppelin Relayer!" + } +} +``` + +The parameters are passed directly to your plugin’s `handler` function. + +### GET invocation (optional) + +By default, plugins can only be called with `POST`. To allow `GET` requests, set `allow_get_invocation: true` in the plugin configuration. + +- `GET` requests invoke the plugin with an empty params object (`context.params = {}`). +- Query parameters are available to plugins via `context.query` as `Record`. + +## Responses + +By default, API responses use the `ApiResponse` envelope: `success, data, error, metadata`. + +If `raw_response: true` is set for a plugin, the Relayer bypasses the envelope and returns the plugin result (or plugin error) directly. + +### Success responses (HTTP 200) + +- `data` contains your handler return value (decoded from JSON when possible). +- `metadata.logs?` and `metadata.traces?` are only populated if the plugin configuration enables `emit_logs` / `emit_traces`. +- `error` is `null`. +- Plugin logs are forwarded to the Relayer's tracing system if `forward_logs` is enabled (appears in server logs, not in HTTP response). + +### Plugin errors (HTTP 4xx) + +- Throwing `pluginError(...)` (or any `Error`) is normalized into a consistent HTTP payload. +- `error` provides the client-facing message, derived from the thrown error or from log output when the message is empty. +- `data` carries `code?: string, details?: any` reported by the plugin. +- `metadata` follows the same visibility rules (`emit_logs` / `emit_traces`). +- Plugin error logs are also forwarded to the Relayer's tracing system if `forward_logs` is enabled. + +### Raw responses (`raw_response: true`) + +- **Success**: the response body is the value returned by your plugin handler. +- **Error**: the response body is the plugin error payload (typically `{ "code": string | null, "details": any | null }`) and the HTTP status is taken from the error. +- **No metadata envelope**: when `raw_response` is enabled, the response does not include `metadata` even if `emit_logs` / `emit_traces` are enabled. + +### Complete Example + +1. **_Plugin Code_** (`plugins/example.ts`): + +```typescript +import { Speed, PluginContext, pluginError } from '@openzeppelin/relayer-sdk'; + +type ExampleResult = { + transactionId: string; + transactionHash: string | null; + message: string; + timestamp: string; +}; + +export async function handler(context: PluginContext): Promise { + const { api, params, kv, headers } = context; + console.info('🚀 Example plugin started'); + console.info(`📋 Parameters:`, JSON.stringify(params, null, 2)); + + if (!params.destinationAddress) { + throw pluginError('destinationAddress is required', { + code: 'MISSING_PARAM', + status: 400, + details: { field: 'destinationAddress' }, + }); + } + + const amount = params.amount || 1; + const message = params.message || 'Hello from OpenZeppelin Relayer!'; + + console.info(`💰 Sending ${amount} wei to ${params.destinationAddress}`); + + const relayer = api.useRelayer('my-relayer'); + const result = await relayer.sendTransaction({ + to: params.destinationAddress, + value: amount, + data: '0x', + gas_limit: 21000, + speed: Speed.FAST, + }); + + // Example persistence + await kv.set('last_transaction', result.id); + + const confirmation = await result.wait({ interval: 5000, timeout: 120000 }); + + return { + transactionId: result.id, + transactionHash: confirmation.hash || null, + message: `Successfully sent ${amount} wei to ${params.destinationAddress}. ${message}`, + timestamp: new Date().toISOString(), + }; +} +``` + +1. **_Plugin Configuration_** (`config/config.json`): + +```json +{ + "plugins": [ + { + "id": "example-plugin", + "path": "example-plugin.ts", + "timeout": 30, + "emit_logs": true, + "emit_traces": true, + "forward_logs": true + } + ] +} +``` + +1. **_API Invocation_**: + +```bash +curl -X POST http://localhost:8080/api/v1/plugins/example-plugin/call \ +-H "Content-Type: application/json" \ +-H "Authorization: Bearer YOUR_API_KEY" \ +-d '{ + "params": { + "destinationAddress": "0x742d35Cc6640C21a1c7656d2c9C8F6bF5e7c3F8A", + "amount": 1000000000000000, + "message": "Test transaction from plugin" + } +}' +``` + +1. **_API Response (Success)_**: + +```json +{ + "success": true, + "data": { + "transactionId": "tx-123456", + "confirmed": true, + "note": "Sent 1000000000000000 wei to 0x742d35Cc..." + }, + "metadata": { + "logs": [{ "level": "info", "message": "🚀 Example plugin started" }], + "traces": [ + { + "relayerId": "my-relayer", + "method": "sendTransaction", + "payload": { + /* ... */ + } + } + ] + }, + "error": null +} +``` + +2. **API Response (Error)**: + +```json +{ + "success": false, + "data": { + "code": "MISSING_PARAM", + "details": { "field": "destinationAddress" } + }, + "metadata": { + "logs": [{ "level": "error", "message": "destinationAddress is required" }] + }, + "error": "destinationAddress is required" +} +``` + +## Response Fields + +- **`data`**: The value returned by your plugin's handler function (decoded from JSON when possible) +- **`metadata.logs`**: Terminal output from the plugin (console.log, console.error, etc.) when `emit_logs` is true. These logs are also forwarded to the Relayer's tracing system when `forward_logs` is enabled. +- **`metadata.traces`**: Messages exchanged between the plugin and the Relayer via PluginAPI when `emit_traces` is true +- **`error`**: Error message if the plugin execution failed (business errors) + +## Logging and Debugging + +The Relayer provides multiple ways to access plugin logs and debug information: + +### Server-Side Logging (`forward_logs`) + +When `forward_logs: true` is enabled in your plugin configuration, all plugin console output is forwarded to the Relayer's Rust tracing system. This means: + +- Plugin logs appear in the same log stream as Relayer logs +- Logs are automatically mapped to appropriate tracing levels (error → error!, warn → warn!, info/log → info!, debug → debug!) +- Logs include plugin context (plugin ID) for easy filtering +- Works with your existing log aggregation infrastructure (e.g., CloudWatch, Datadog, ELK stack) +- Logs are forwarded for both successful executions and errors + +**Example**: With `forward_logs: true`, a plugin's `console.error('Transaction failed')` will appear in your Relayer logs as: + +``` +ERROR plugin_id=my-plugin Transaction failed +``` + +This is particularly useful for: +- **Production monitoring**: Monitor plugin execution alongside Relayer operations +- **Debugging**: See plugin logs in real-time during development +- **Troubleshooting**: Correlate plugin behavior with Relayer events in unified logs + +### Client-Side Logging (`emit_logs`) + +When `emit_logs: true` is enabled, plugin logs are included in the HTTP response `metadata.logs` field. This allows clients to inspect plugin execution without accessing server logs. + +**Example**: With `emit_logs: true`, the API response includes: + +```json +{ + "success": true, + "data": { ... }, + "metadata": { + "logs": [ + { "level": "info", "message": "🚀 Plugin started..." }, + { "level": "error", "message": "Validation failed" } + ] + } +} +``` + +### API Tracing (`emit_traces`) + +When `emit_traces: true` is enabled, API interaction traces are included in the HTTP response `metadata.traces` field. This shows the messages exchanged between your plugin and the Relayer API. + +**Example**: With `emit_traces: true`, the API response includes: + +```json +{ + "success": true, + "data": { ... }, + "metadata": { + "traces": [ + { + "relayerId": "my-relayer", + "method": "sendTransaction", + "payload": { ... } + } + ] + } +} +``` + +## Key-Value Storage + +The Relayer provides a built-in key-value store for plugins to maintain persistent state across invocations. This addresses the core problem of enabling persistent state management and programmatic configuration updates for plugins. + +### Why a KV store? + +- Plugins execute as isolated processes with no persistent memory +- No mechanism exists to maintain state between invocations +- Plugins requiring shared state or coordination need safe concurrency primitives + +### Configuration + +- Reuses the same Redis URL as the Relayer via the `REDIS_URL` environment variable +- No extra configuration is required +- Keys are namespaced per plugin ID to prevent collisions + +### Usage + +Access the KV store through the `kv` property in the `PluginContext`: + +[source,typescript] + +``` +export async function handler(context: PluginContext) { + const { kv } = context; + // Set a value (with optional TTL in seconds) + await kv.set('my-key', { data: 'value' }, { ttlSec: 3600 }); + // Get a value + const value = await kv.get<{ data: string }>('my-key'); + // Atomic update with lock + const updated = await kv.withLock('counter-lock', async () => { + const count = (await kv.get('counter')) ?? 0; + const next = count + 1; + await kv.set('counter', next); + return next; + }, { ttlSec: 10 }); + + return { value, updated }; +} + +``` + +### Available Methods + +- `get(key: string): Promise` +- `set(key: string, value: unknown, opts?: ttlSec?: number ): Promise` +- `del(key: string): Promise` +- `exists(key: string): Promise` +- `listKeys(pattern?: string, batch?: number): Promise` +- `clear(): Promise` +- `withLock(key: string, fn: () => Promise, opts?: ttlSec?: number; onBusy?: 'throw' | 'skip' ): Promise` + +Keys must match `[A-Za-z0-9:_-]1,512` and are automatically namespaced per plugin. + +## HTTP Headers + +Plugins can access HTTP headers from the incoming request through the `headers` property in `PluginContext`. This enables authentication validation, custom header processing, and request metadata inspection. + +### Header Format + +Headers are provided as `Record` (object with string keys and string array values): + +- Header names are **lowercase** (normalized by the HTTP server) +- Each header value is an **array** to support multi-value headers (e.g., multiple `Set-Cookie` headers) +- Access the first value with `headers['header-name']?.[0]` + +### Usage + +[source,typescript] + +``` +export async function handler(context: PluginContext) { + const { headers } = context; + + // Access a single-value header + const authToken = headers['authorization']?.[0]; + + // Access a custom header + const requestId = headers['x-request-id']?.[0]; + + // Check if header exists + if (!headers['x-api-key']?.[0]) { + throw pluginError('API key required', { code: 'MISSING_HEADER', status: 401 }); + } + + // Handle multi-value headers + const acceptTypes = headers['accept'] || []; + + return { receivedHeaders: Object.keys(headers).length }; +} +``` + +### Common Use Cases + +- **Authentication**: Validate `Authorization` or custom API key headers +- **Request Tracing**: Read `X-Request-Id` or correlation IDs +- **Content Negotiation**: Check `Accept` or `Content-Type` headers +- **Custom Metadata**: Access application-specific headers passed by clients + +### Important Notes + +- Headers are only available in the **modern context pattern** (single-parameter handler) +- Legacy two-parameter handlers do not receive headers +- Header names are always lowercase regardless of how they were sent + +## Migration from Legacy Patterns + +### Current Status + +- ✅ **Legacy plugins still work** - No immediate action required +- ⚠️ **Deprecation warnings** - Legacy plugins will show console warnings +- 📅 **Future removal** - The legacy `runPlugin` and two-parameter `handler(api, params)` will be removed in a future major version +- 🎯 **Recommended action** - Migrate to single-parameter `PluginContext` handler for new plugins and KV access + +### Migration Steps + +If you have existing plugins using `runPlugin()` or the two-parameter handler, migration is simple: + +**Before (Legacy runPlugin - still works)**: +[source,typescript] + +``` +import runPlugin, PluginAPI from "./lib/plugin"; + +async function myPlugin(api: PluginAPI, params: any): Promise + // Your plugin logic + return result; + + +runPlugin(myPlugin); // ⚠️ Shows deprecation warning +``` + +**Intermediate (Legacy two-parameter - still works, no KV)**: +[source,typescript] + +``` +import PluginAPI from "@openzeppelin/relayer-sdk"; + +export async function handler(api: PluginAPI, params: any): Promise + // Same plugin logic - ⚠️ Deprecated, no KV access + return result; + +``` + +**After (Modern context - recommended, with KV and headers)**: +[source,typescript] + +``` +import PluginContext from "@openzeppelin/relayer-sdk"; + +export async function handler(context: PluginContext): Promise + const api, params, kv, headers = context; + // Same plugin logic plus KV and headers access! + return result; + +``` + +### Step-by-Step Migration + +1. **Remove the `runPlugin()` call** at the bottom of your file +2. **Rename your function to `handler`** (or create a new handler export) +3. **Export the `handler` function** using `export async function handler` +4. **Add proper TypeScript types** for better development experience +5. **Test your plugin** to ensure it works with the new pattern +6. **Update your documentation** to reflect the new pattern + +### Backwards Compatibility + +The relayer will automatically detect which pattern your plugin uses: + +- If handler accepts one parameter → modern context pattern (with KV and headers) +- If handler accepts two parameters → legacy pattern (no KV or headers, with warning) +- If `runPlugin()` was called → legacy pattern (no KV or headers, with warning) +- If neither → shows clear error message + +This ensures a smooth transition period where both patterns work simultaneously. + +## Performance Tuning + +For production deployments handling high concurrency, the plugin system offers extensive tuning options via environment variables. + +### Execution Modes + +The plugin system supports two execution modes: + +| Mode | Environment Variable | Description | +|------|---------------------|-------------| +| **Pool mode** (default) | `PLUGIN_USE_POOL=true` | Uses persistent worker pool. Best performance. | +| **ts-node mode** | `PLUGIN_USE_POOL=false` | Spawns a new process per request. Simpler but slower. | + + +Pool mode is enabled by default since v1.4. It significantly improves performance by reusing worker processes and maintaining persistent connections. Use `PLUGIN_USE_POOL=false` only for debugging or if you encounter issues. + + +### Environment Variables Reference + +#### Simple Scaling (Recommended) + + +**Most users only need one variable!** Set `PLUGIN_MAX_CONCURRENCY` and everything else is auto-calculated. + + +```bash +# This is all you need for 3000 concurrent users: +export PLUGIN_MAX_CONCURRENCY=3000 +``` + +The system automatically derives on **both Rust and Node.js sides**: + +**Rust side (connection pool & queue):** +- `PLUGIN_POOL_MAX_CONNECTIONS` = 3000 (1:1 ratio) +- `PLUGIN_SOCKET_MAX_CONCURRENT_CONNECTIONS` = 4500 (1.5x for headroom) +- `PLUGIN_POOL_MAX_QUEUE_SIZE` = 6000 (2x for burst handling) +- `PLUGIN_POOL_QUEUE_SEND_TIMEOUT_MS` = auto-scaled based on workload per thread (500-1000ms) + +**Node.js side (worker pool):** +- `PLUGIN_POOL_MAX_THREADS` = memory-aware scaling (see below), capped at 32 +- `PLUGIN_POOL_CONCURRENT_TASKS` = (concurrency / maxThreads) × 1.2, capped at 250 +- `PLUGIN_WORKER_HEAP_MB` = 512 + (concurrent_tasks × 5), between 1024-2048MB + +#### Advanced Overrides (Power Users) + +You can override any auto-derived value when needed: + +```bash +# Set the primary scaling knob +export PLUGIN_MAX_CONCURRENCY=3000 + +# Override just the queue size (other values still auto-derived) +export PLUGIN_POOL_MAX_QUEUE_SIZE=10000 +``` + +#### All Available Variables + +| Variable | Default | Auto-Derived From | Description | +|----------|---------|-------------------|-------------| +| `PLUGIN_MAX_CONCURRENCY` | 2048 | - | **Primary scaling knob** - sets expected concurrent load | +| **Rust Side** |||| +| `PLUGIN_POOL_MAX_CONNECTIONS` | 2048 | `MAX_CONCURRENCY` | Max connections to pool server | +| `PLUGIN_SOCKET_MAX_CONCURRENT_CONNECTIONS` | 4096 | `MAX_CONCURRENCY × 1.5` | Max plugin connections to relayer | +| `PLUGIN_POOL_MAX_QUEUE_SIZE` | 4096 | `MAX_CONCURRENCY × 2` | Max queued requests | +| `PLUGIN_POOL_QUEUE_SEND_TIMEOUT_MS` | 500 | Workload-based (500-1000ms) | Wait time when queue is full | +| `PLUGIN_POOL_CONNECT_RETRIES` | 15 | - | Retry attempts when connecting | +| `PLUGIN_POOL_REQUEST_TIMEOUT_SECS` | 30 | - | Timeout for pool requests | +| `PLUGIN_SOCKET_IDLE_TIMEOUT_SECS` | 60 | - | Close idle connections after | +| `PLUGIN_SOCKET_READ_TIMEOUT_SECS` | 30 | - | Read timeout per message | +| `PLUGIN_POOL_WORKERS` | auto | CPU cores | Queue processing workers | +| `PLUGIN_POOL_SOCKET_BACKLOG` | 2048 | `MAX_CONCURRENCY` | Socket connection backlog | +| **Node.js Side** |||| +| `PLUGIN_POOL_MIN_THREADS` | auto | `max(2, cpuCount/2)` | Minimum worker threads | +| `PLUGIN_POOL_MAX_THREADS` | auto | Memory-aware (capped at 32) | Worker threads in pool | +| `PLUGIN_POOL_CONCURRENT_TASKS` | auto | `(concurrency/threads) × 1.2` | Tasks per worker (max 250) | +| `PLUGIN_WORKER_HEAP_MB` | auto | `512 + (tasks × 5)` | Worker heap size (1024-2048MB) | +| `PLUGIN_POOL_IDLE_TIMEOUT` | 60000 | - | Worker idle timeout (ms) | + +#### Memory-Aware Thread Scaling + +The plugin system automatically scales worker threads based on **both concurrency requirements AND available system memory**. This prevents out-of-memory issues on systems with limited RAM. + +**How it works:** +1. **Memory budget**: Uses 50% of system RAM for worker threads +2. **Per-worker allocation**: ~1GB heap budget per worker thread +3. **Concurrency scaling**: `concurrency / 200` threads (each thread handles ~200 concurrent requests via async I/O) +4. **Final calculation**: `min(memory_based, concurrency_based)`, capped at 32 threads + +**Examples:** + +| System RAM | Max Concurrency | Memory-Based | Concurrency-Based | Final Threads | +|------------|-----------------|--------------|-------------------|---------------| +| 16GB | 1000 | 8 | 5 | 5 | +| 16GB | 5000 | 8 | 25 | 8 | +| 32GB | 5000 | 16 | 25 | 16 | +| 64GB | 10000 | 32 | 50 | 32 | + + +This prevents the previous issue where high concurrency (e.g., 5000 VUs) would spawn too many threads, causing excessive memory pressure and GC pauses. + + +#### Queue Timeout Auto-Scaling + +The queue send timeout (`PLUGIN_POOL_QUEUE_SEND_TIMEOUT_MS`) automatically scales based on workload per thread: + +| Workload per Thread | Timeout | +|---------------------|---------| +| > 100 items/thread | 1000ms (heavy load) | +| 50-100 items/thread | 750ms (medium load) | +| < 50 items/thread | 500ms (light load) | + +This ensures requests have sufficient time to queue during traffic spikes while maintaining responsiveness under normal load. + +#### Timeout Alignment + + +Timeouts must be aligned! If your plugin takes up to 120s, set these accordingly. + + +```bash +# In config.json: "timeout": 120 + +# Environment should match: +export PLUGIN_POOL_REQUEST_TIMEOUT_SECS=120 +export PLUGIN_SOCKET_IDLE_TIMEOUT_SECS=180 # 1.5x plugin timeout +``` + +#### Health & Recovery + +Controls automatic health monitoring and recovery. + +| Variable | Default | Description | +|----------|---------|-------------| +| `PLUGIN_POOL_HEALTH_CHECK_INTERVAL_SECS` | 5 | Minimum seconds between health checks | +| `PLUGIN_TRACE_TIMEOUT_MS` | 100 | Timeout for collecting execution traces | + +### Load Profile Examples + +#### Low Load (< 100 concurrent requests) + +```bash +# Default settings are sufficient - pool mode is enabled automatically +``` + +#### Medium Load (100-1000 concurrent requests) + +```bash +export PLUGIN_MAX_CONCURRENCY=1000 +``` + +#### High Load (1000-5000 concurrent requests) + +```bash +export PLUGIN_MAX_CONCURRENCY=3000 +export PLUGIN_POOL_REQUEST_TIMEOUT_SECS=60 +``` + +#### Extreme Load (5000+ concurrent requests) + +```bash +export PLUGIN_MAX_CONCURRENCY=8000 +export PLUGIN_POOL_REQUEST_TIMEOUT_SECS=120 +export PLUGIN_POOL_CONNECT_RETRIES=20 +``` + +### Troubleshooting Common Errors + +| Error | Cause | Solution | +|-------|-------|----------| +| `Plugin execution queue is full` | More requests than queue can hold | Increase `PLUGIN_POOL_MAX_QUEUE_SIZE` and `PLUGIN_POOL_QUEUE_SEND_TIMEOUT_MS` | +| `Connection limit reached` | Too many concurrent plugin connections | Increase `PLUGIN_SOCKET_MAX_CONCURRENT_CONNECTIONS` | +| `Failed to connect to pool after N attempts` | Pool server overwhelmed | Increase `PLUGIN_POOL_CONNECT_RETRIES` and `PLUGIN_POOL_MAX_CONNECTIONS` | +| `ScriptTimeout(N)` | Plugin execution exceeded timeout | Increase `timeout` in plugin config (config.json) | +| `All connection permits exhausted` | Connection pool at capacity | Increase `PLUGIN_POOL_MAX_CONNECTIONS` | +| `FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory` | Worker heap too small | Increase `PLUGIN_WORKER_HEAP_MB` or reduce `PLUGIN_POOL_CONCURRENT_TASKS` | +| `Pool server crashed and restarting` | Memory pressure or GC issues | Check logs for heap usage; reduce `PLUGIN_MAX_CONCURRENCY` or increase system RAM | + + +When increasing limits significantly, monitor your system's memory and CPU usage. Each connection consumes resources. + + +## Architecture & Internals + +For developers who want to understand or modify the plugin system internals, see the [Architecture Guide](https://github.com/OpenZeppelin/openzeppelin-relayer/blob/main/plugins/ARCHITECTURE.md). + +The architecture documentation covers: + +- **System Architecture**: High-level diagram showing Rust ↔ Node.js communication +- **Module Overview**: Purpose of each Rust and TypeScript module +- **Communication Protocols**: JSON-line protocol for pool and shared socket communication +- **Request Flow**: Step-by-step execution path for plugin requests +- **Health & Recovery**: Circuit breaker states, dead server detection, memory pressure handling +- **Module Dependencies**: How the codebase modules relate to each other + +### Key Source Files + +| Component | Location | Description | +|-----------|----------|-------------| +| **Rust Plugin Runner** | `src/services/plugins/runner.rs` | Entry point for plugin execution | +| **Pool Executor** | `src/services/plugins/pool_executor.rs` | Manages Node.js process and connections | +| **Configuration** | `src/services/plugins/config.rs` | Auto-derivation logic for all env vars | +| **Pool Server** | `plugins/lib/pool-server.ts` | Node.js server accepting plugin requests | +| **Executor** | `plugins/lib/pool-executor.ts` | Plugin execution | +| **Plugin SDK** | `plugins/lib/plugin.ts` | PluginContext and API for plugins | diff --git a/content/relayer/1.5.x/quickstart.mdx b/content/relayer/1.5.x/quickstart.mdx new file mode 100644 index 00000000..0fc82c09 --- /dev/null +++ b/content/relayer/1.5.x/quickstart.mdx @@ -0,0 +1,167 @@ +--- +title: Quick Start Guide +--- + +This guide provides step-by-step instructions for setting up OpenZeppelin Relayer. It includes prerequisites, installation, and configuration examples. + +## Prerequisites + +* Rust 2021, version `1.88` or later. +* Redis +* Docker (optional, for containerized deployment) +* Node.js, typescript and ts-node (optional, for plugins) + +## Configuration + +### Step 1: Clone the Repository + +Clone the repository and navigate to the project directory: + +```bash +git clone https://github.com/OpenZeppelin/openzeppelin-relayer +cd openzeppelin-relayer +``` + +### Step 2: Create Configuration Files + +Create environment configuration: + +```bash +cp .env.example .env +``` + +These files are already partially configured. We will add missing data in next steps. + +Ready-to-Use Example Configurations + +For quick setup with various configurations, check the [examples directory](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples) in our GitHub repository: + +### Step 3: Create a Signer + +Generate a new signer keystore for the basic example: + +```bash +cargo run --example create_key -- \ + --password \ + --output-dir examples/basic-example/config/keys \ + --filename local-signer.json +``` +Replace `` with a strong password. + + + + +Your password must contain at least: + +* 12 characters +* One uppercase letter +* One lowercase letter +* One number +* One special character + + + +Next, update the `KEYSTORE_PASSPHRASE` in `.env` with the password you used above. + +### Step 4: Configure Notifications + +#### Configure Webhook URL + +Edit the file `config/config.json` and update the `notifications[0].url` field with your webhook URL. For a quick test, you can use a temporary URL from [Webhook.site](https://webhook.site). + +#### Configure Webhook Signing Key + +Generate a webhook signing key: + +```bash +cargo run --example generate_uuid +``` + + + + +Alternatively, you can use any online UUID generator tool if you don’t want to run the included command. + + + +Copy the generated UUID and update the `WEBHOOK_SIGNING_KEY` entry in `.env`. + +### Step 5: Configure API Key + +Generate an API key signing key for development: + +```bash +cargo run --example generate_uuid +``` + + + + +You can also use UUID generator with a simple command on your terminal. + +```bash +uuidgen +``` + +Alternatively, you can use any online UUID generator tool. + + + +Copy the generated UUID and update the `API_KEY` entry in `.env`. + +### Step 6: Run the Service + +#### Local + +Run Redis container: + +```sh +docker run --name openzeppelin-redis \ + -p 6379:6379 \ + -d redis:latest +``` + +Run Relayer service: + +```bash +cargo run +``` + +#### Docker + +Building and Running the docker image: + +```bash +docker compose up -d +``` + +By default docker compose command uses `Dockerfile.development` to build the image. If you want to use `Dockerfile.production`, you can use the following command: + +```bash +DOCKERFILE=Dockerfile.production docker compose up -d +``` + +### Step 7: Test the Relayer + +Verify the service by sending a GET request: + +```bash +curl -X GET http://localhost:8080/api/v1/relayers \ + -H "Content-Type: application/json" \ + -H "AUTHORIZATION: Bearer YOUR_API_KEY" +``` +Replace `YOUR_API_KEY` with the API key you configured in your `.env` file. + +Expected Result: A successful request should return an HTTP 200 status code along with the list of relayers. + +## Using the relayer through the API + +For detailed API usage, refer to the [API Reference](./api) page. + +## Using the relayer through the SDK + +For documentation and examples on how to consume Relayer service via SDK check [SDK documentation](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk). + +## Additional Resources and Troubleshooting + +Troubleshooting: If you encounter issues during setup or deployment, verify your environment variables, check container logs, and review your configuration files for syntax errors. diff --git a/content/relayer/1.5.x/roadmap.mdx b/content/relayer/1.5.x/roadmap.mdx new file mode 100644 index 00000000..0fbfbfbf --- /dev/null +++ b/content/relayer/1.5.x/roadmap.mdx @@ -0,0 +1,113 @@ +--- +title: OpenZeppelin Relayer Roadmap +--- + +This document outlines the planned development roadmap for the OpenZeppelin Relayer project. Please note that priorities and timelines may shift based on community feedback, security considerations, and emerging blockchain ecosystem needs. + + + + +This roadmap represents our current plans and is subject to change. We will update this document regularly to reflect our progress and any changes in direction. + + + +## General Roadmap + +* **Stability Improvements** + * Enhanced error handling and recovery mechanisms: Implement robust exception management and failover processes to minimize downtime. + * Improved background job processing: Optimize task scheduling and queuing systems to ensure smooth and reliable asynchronous operations. + * Comprehensive test coverage: Extend unit, integration, and regression tests across all components. + * End-to-End (E2E) testing: Simulate real-world scenarios to verify complete system functionality. + * Performance optimizations: Enhance throughput and reduce latency for high-demand scenarios. + * Stress and load testing: Identify and address performance bottlenecks under extreme conditions. +* **Security Enhancements** + * External security audit: Engage third-party experts to identify and remediate vulnerabilities. + * Continuous security monitoring: Implement ongoing surveillance and incident response protocols to swiftly address threats. +* **Developer Experience** + * SDK improvements: Expand SDK capabilities, add multi-language support, and simplify integration processes. + * Enhanced documentation: Develop interactive guides, detailed API references, and comprehensive troubleshooting tips. + * Additional examples and best practices: Provide real-world usage scenarios and community-contributed tutorials to ease onboarding. +* **Features** + * Redis storage integration: Leverage Redis for fast, scalable data storage across all system components. + * Enhanced relayer balance management: Implement real-time monitoring and alerts to maintain optimal balance status. + * Dynamic gas price updates: Regularly fetch and update gas prices from multiple reliable sources to ensure accurate fee estimations. +* **Scaling Improvements** + * Horizontal scaling capabilities: Design the system architecture to seamlessly distribute workloads across multiple instances. + +## Network-Specific Roadmap + +### EVM Networks (🏗️ In Progress) + +#### Current Status +* Basic Transaction Submission +* Fee Estimation +* Transaction Status Tracking +* Flexible Network Configuration System (any EVM-compatible network via JSON configuration) +* Hosted signers support (AWS KMS, GCP, Turnkey) +* Custom RPC Endpoints +* RPC Retries and Failover Mechanisms + +#### Upcoming Features +* L2 improvements +* SDK client improvements +* Full CRUD API support + +### Solana (🏗️ In Progress) + +#### Current Status +* Solana Paymaster Specification Support +* Fee estimation +* Gasless transactions +* Hosted Signer Integrations (Vault, GCP, Turnkey) +* Custom RPC Endpoints +* RPC Retries and Failover Mechanisms + +#### Upcoming Features +* Extended RPC Methods +* Improved Transaction Status Checks +* Full CRUD API support + +### Stellar (🏗️ In Progress) + +#### Current Status +* Supports payment and InvokeHostFunction operations, pre-built XDR transactions, and fee bump transactions, +* Advanced transaction status logic +* Stellar-specific endpoints +* Expanded signer support +* Transaction lifecycle management logic +* Custom RPC Endpoints +* RPC Retries and Failover Mechanisms + +#### Upcoming Features +* Relayer security policies: Transaction amount limits, destination whitelisting, time bound and limit operations +* Hosted signers +* Full CRUD API support + +## Community and Documentation + +### Continuous +* **Documentation** + * Comprehensive API reference + * Tutorials and guides + * Integration examples +* **Community Engagement** + * Contributing guidelines + * Support for community-driven improvements + +## Notes on Prioritization + + + + +Our development priorities are influenced by several factors: + +1. **Security**: Security enhancements always take precedence +2. **Stability**: Ensuring reliable operation across all supported networks +3. **Community Feedback**: Features requested by the community +4. **Ecosystem Developments**: Adapting to changes in blockchain protocols + + + +This roadmap is a living document and will be updated regularly to reflect changing priorities and completed milestones. We welcome community input on our direction and priorities. + +To contribute to discussions about the roadmap, please join our community channels or open an issue on our GitHub repository with your suggestions. diff --git a/content/relayer/1.5.x/solana.mdx b/content/relayer/1.5.x/solana.mdx new file mode 100644 index 00000000..e9f657cc --- /dev/null +++ b/content/relayer/1.5.x/solana.mdx @@ -0,0 +1,349 @@ +--- +title: Solana Integration +--- + +## Overview + +OpenZeppelin Relayer provides robust support for Solana networks, enabling secure transaction relaying, automated token swaps, gasless transactions, and advanced fee management. This page covers everything you need to get started and make the most of Solana-specific features. + +## Features + +* Automated token swaps via Jupiter DEX (mainnet-beta only) +* Gasless transactions (user or relayer pays fees) +* Secure transaction signing with multiple signer backends +* Transaction status monitoring and nonce management +* Custom RPC endpoints and network policies +* Metrics and observability + +## Supported Networks + +Solana networks are defined via JSON configuration files, providing flexibility to: + +* Configure standard Solana clusters: `mainnet-beta`, `devnet`, `testnet` +* Set up custom Solana-compatible networks with specific RPC endpoints +* Create network variants using inheritance from base configurations + +Example Solana network configurations: + +```json +{ + "networks": [ + { + "type": "solana", + "network": "solana-mainnet", + "rpc_urls": ["https://api.mainnet-beta.solana.com"], + "explorer_urls": ["https://explorer.solana.com"], + "is_testnet": false, + "tags": ["mainnet", "solana"] + }, + { + "type": "solana", + "network": "solana-devnet", + "rpc_urls": ["https://api.devnet.solana.com"], + "explorer_urls": ["https://explorer.solana.com?cluster=devnet"], + "is_testnet": true, + "tags": ["devnet", "solana"] + }, + { + "type": "solana", + "network": "solana-custom", + "rpc_urls": ["https://your-custom-solana-rpc.example.com"], + "tags": ["custom", "solana"] + } + ] +} +``` + +For detailed network configuration options, see the [Network Configuration](/relayer/network_configuration) guide. + +## Supported Signers + +* `vault_transit` (hosted) +* `turnkey` (hosted) +* `google_cloud_kms` (hosted) +* `local` (local) +* `vault` (local) +* `cdp` (hosted) + + + + +In production systems, hosted signers are recommended for the best security model. + + + +## Quickstart + +For a step-by-step setup, see [Quick Start Guide](/relayer/quickstart). +Key prerequisites: + +* Rust 2021, version `1.86` or later +* Redis +* Docker (optional) + +Example configuration for a Solana relayer: +```json +{ + "id": "solana-example", + "name": "Solana Example", + "network": "devnet", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "solana", + "custom_rpc_urls": [ + { "url": "https://primary-solana-rpc.example.com", "weight": 100 }, + { "url": "https://backup-solana-rpc.example.com", "weight": 100 } + ], + "policies": { + "fee_payment_strategy": "user", + "min_balance": 0, + "allowed_tokens": [ + { "mint": "So111...", "max_allowed_fee": 100000000 } + ], + "swap_config": { + "strategy": "jupiter-swap", + "cron_schedule": "0 0 * * * *", + "min_balance_threshold": 1000000, + "jupiter_swap_options": { + "dynamic_compute_unit_limit": true, + "priority_level": "high", + "priority_fee_max_lamports": 1000000000 + } + } + } +} +``` + +For more configuration examples, visit the [OpenZeppelin Relayer examples repository, window=_blank](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples). + +## Configuration + +### Relayer Policies + +In addition to standard relayer configuration and policies, Solana relayers support additional options: + +| Feature | User Pays (Default) | Relayer Pays | +|---------|---------------------|--------------| +| **Who pays fees** | Users pay in SPL tokens | Relayer pays in SOL | +| **Transaction format** | Pre-signed transactions only | Encoded transactions OR instruction arrays | +| **Best endpoint** | RPC methods (Paymaster spec) | REST API `POST /transactions` | +| **Use case** | Gasless UX, user-controlled signing | Simplified UX, backend automation | + + + +***Future Breaking Change:*** + +In future versions, `fee_payment_strategy` will be a **mandatory field** in the relayer configuration. This change is being made to prevent misconfigurations and misunderstandings. Please ensure your relayer configurations explicitly specify `fee_payment_strategy` as either `"user"` or `"relayer"` to avoid issues when upgrading. + + + +#### User Pays Fees (Default) + +**fee_payment_strategy**: `user` (default when not specified) + +In this mode: +* Users pay transaction fees in SPL tokens +* The relayer receives fee payment from the user as part of the transaction +* Users submit **fully-formed, pre-signed transactions** via the API +* The relayer validates and relays the transaction to the network + +#### Relayer Pays Fees + +**fee_payment_strategy**: `relayer` + +In this mode: +* ***The relayer pays all transaction fees in SOL*** +* Users can submit either: + * **Encoded transactions** (base64-encoded, pre-signed) + * **Array of instructions** (relayer builds and signs the full transaction) + +**Use Cases**: +* Simplified user experience (no fee token management) +* Backend-controlled transaction execution +* Automated workflows and scheduled operations +* Applications where the relayer subsidizes transaction costs + +### Additional Relayer Policies + +* `allowed_tokens`: List of SPL tokens supported for swaps and fee payments. Optional. + * ***When not set or empty, all tokens are allowed*** for transactions and fee payments + * When configured, only tokens in this list can be used for transfers and fee payments +* `allowed_programs`, `allowed_accounts`, `disallowed_accounts`: Restrict relayer operations to specific programs/accounts +* `swap_config`: Automated token swap settings (see below) + +You can check all options in [User Documentation - Relayers](/relayer#3_relayers). + +### Automated token swap configuration options: + +* `strategy`: The swap engine to use. Supported values: `"jupiter-swap"` (Jupiter Swap API), `"jupiter-ultra"` (Jupiter Ultra API). +* `cron_schedule`: Cron expression defining how often scheduled swaps should run (e.g., `"0 0 * * * *"` for every hour). +* `min_balance_threshold`: Minimum token balance (in lamports) that triggers a swap. If the relayer’s balance drops below this, a swap is attempted. +* `jupiter_swap_options`: Advanced options for Jupiter swaps, such as: + * `dynamic_compute_unit_limit`: If `true`, dynamically adjusts compute units for swap transactions. + * `priority_level`: Priority for the swap transaction. Supported values: `"medium"`, `"high"`, `"veryHigh"`. + * `priority_fee_max_lamports`: Maximum priority fee (in lamports) to pay for a swap transaction. +* Per-token swap limits: + * `min_amount`: Minimum amount of a token to swap in a single operation. + * `max_amount`: Maximum amount of a token to swap in a single operation. + * `retain_min_amount`: Minimum amount of a token to retain in the relayer account after a swap (prevents swapping the entire balance). + +## Automated Token Swaps + +The relayer can perform automated token swaps on Solana when user fee_payment_strategy is used for relayer using: + +* ***jupiter-swap*** – via the Jupiter Swap API +* ***jupiter-ultra*** – via the Jupiter Ultra API + +Swaps can be set to work as: + +* ***Scheduled Swaps***: Background jobs run swaps based on your cron schedule. +* ***On-Demand Swaps***: If a transaction fails due to insufficient funds, the relayer attempts a swap before returning an error. + +## API Reference + +The Solana relayer provides two API interfaces that support fee estimation, transaction preparation, signing, and sending: + +1. **RPC Endpoint** (JSON-RPC 2.0) - Conforms to the [Paymaster spec](https://docs.google.com/document/d/1lweO5WH12QJaSAu5RG_wUistyk_nFeT6gy1CdvyCEHg/edit?tab=t.0#heading=h.4yldgprkuvav) + * **Best for**: User fee payment mode + * **URL**: `POST /api/v1/relayers//rpc` + * **Works in**: Both fee payment modes + * **Supports**: `feeEstimate`, `prepareTransaction`, `signTransaction`, and `signAndSendTransaction` methods + +2. **REST Endpoints** - Direct transaction operations + * **Fee Estimation**: `POST /api/v1/relayers//transactions/sponsored/quote` (matches `feeEstimate` RPC method) + * **Transaction Preparation**: `POST /api/v1/relayers//transactions/sponsored/build` (matches `prepareTransaction` RPC method) + * **Sign Transaction**: `POST /api/v1/relayers//sign-transaction` + * **Send Transaction**: `POST /api/v1/relayers//transactions` + + + +**Base URL**: `POST /api/v1/relayers//rpc` + +This endpoint can be used in **both fee payment modes**, but provides the best experience for **user fee payment mode**. + + + +#### RPC Methods + +* `feeEstimate` - Estimate transaction fees +* `getSupportedTokens` - Get list of supported tokens +* `getSupportedFeatures` - Get list of available features +* `prepareTransaction` - Prepare transaction with fee payments +* `transferTransaction` - Execute token transfers with fee payments +* `signTransaction` - Sign user-provided transactions +* `signAndSendTransaction` - Sign and send transactions (combines signing and submission) + +For complete RPC examples, see the [SDK Solana examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/solana). + + + + +***Fee Token Parameter Behavior:*** + +When using `fee_payment_strategy: "relayer"`, the `fee_token` parameter in RPC methods becomes ***informational only***. The relayer pays all transaction fees in SOL regardless of the specified fee token. In this mode, you can use either `"So11111111111111111111111111111112"` (WSOL) or `"11111111111111111111111111111111"` (native SOL) as the fee_token value. + +When using `fee_payment_strategy: "user"`, the `fee_token` parameter determines which token the user will pay fees in, and must be a supported token from the `allowed_tokens` list (if configured). + + + +### REST Endpoints + +#### Fee Estimation (Quote) + +**Base URL**: `POST /api/v1/relayers//transactions/sponsored/quote` + +**Available in**: `user` payment mode. + +**Matches RPC method**: `feeEstimate` + +Estimates transaction fees for a given transaction. Returns the fee amount in both the native currency (SOL) and the specified fee token. This endpoint helps users understand the cost before building or submitting a transaction. + +#### Transaction Preparation (Build) + +**Base URL**: `POST /api/v1/relayers//transactions/sponsored/build` + +**Available in**: `user` payment mode. + +**Matches RPC method**: `prepareTransaction` + +Prepares a transaction with fee payments. This endpoint builds a transaction that includes the necessary fee payment instructions based on the fee payment strategy. Returns a prepared transaction ready for signing. + +#### Sign Transaction + +**Base URL**: `POST /api/v1/relayers//sign-transaction` + +**Available in**: Both fee payment modes + +**Matches RPC method**: `signTransaction` + +Signs a user-provided transaction without submitting it to the network. This is useful when you want to sign a transaction and handle submission separately. + +#### Send Transaction + +**Base URL**: `POST /api/v1/relayers//transactions` + +**Matches RPC method**: `signAndSendTransaction` + +This endpoint provides two ways to submit transactions: + +#### Option 1: Encoded Transaction (Pre-signed) + +Submit a base64-encoded, pre-signed transaction that the relayer will relay to the network. When in user payment mode, the relayer optionally validates that the transaction contains user payment to the relayer. + +#### Option 2: Array of Instructions (Relayer Builds Transaction) + +Submit an array of Solana instructions. The relayer will: +1. Build a complete transaction from the provided instructions +2. Add necessary compute budget and priority fee instructions +3. Optionally validate that the transaction contains user payment to the relayer when in user payment mode +4. Sign the transaction with the relayer's signer +5. Submit the transaction to the Solana network + +For complete REST API examples with both options, see the [SDK Solana examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/solana). + +### API Summary + +**For User Fee Payment Mode** (`fee_payment_strategy: "user"`): +* **RPC endpoint**: `POST /api/v1/relayers//rpc` + * Full Paymaster specification support + * Methods: `feeEstimate`, `prepareTransaction`, `signTransaction`, `signAndSendTransaction`, etc. +* **REST endpoints**: + * `POST /api/v1/relayers//transactions/sponsored/quote` - Estimate fees (matches `feeEstimate`) + * `POST /api/v1/relayers//transactions/sponsored/build` - Prepare transaction (matches `prepareTransaction`) + * `POST /api/v1/relayers//sign-transaction` - Sign transactions without submitting + * `POST /api/v1/relayers//transactions` - Send transactions (accepts encoded transactions or instruction arrays) + +**For Relayer Fee Payment Mode** (`fee_payment_strategy: "relayer"`): +* **REST endpoints**: + * `POST /api/v1/relayers//transactions` - Send transactions (accepts encoded transactions or instruction arrays) + * `POST /api/v1/relayers//sign-transaction` - Sign transactions without submitting +* **RPC endpoint**: `POST /api/v1/relayers//rpc` + * Alternative: RPC methods also work but REST is recommended for sending transactions + +**Additional Resources**: +* [API Reference Documentation](https://docs.openzeppelin.com/relayer/1.2.x/api) - Complete API specification +* [SDK Solana Examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/solana) - Working code examples for both RPC and REST endpoints + +## Security + +* Do not expose the relayer directly to the public internet. +* Deploy behind a secure backend (reverse proxy, firewall). +* Use hosted signers in production systems. + +## Troubleshooting + +* Check environment variables and configuration files for errors +* Review container logs for issues + +## Roadmap + +* See [Project Roadmap](/relayer/roadmap) for upcoming features + +## Support + +For help, join our [Telegram](https://t.me/openzeppelin_tg/2) or open an issue on GitHub. + +## License + +This project is licensed under the GNU Affero General Public License v3.0. diff --git a/content/relayer/1.5.x/stellar.mdx b/content/relayer/1.5.x/stellar.mdx new file mode 100644 index 00000000..10293d3d --- /dev/null +++ b/content/relayer/1.5.x/stellar.mdx @@ -0,0 +1,562 @@ +--- +title: Stellar Integration +--- + +## Overview + +OpenZeppelin Relayer provides comprehensive support for Stellar networks, enabling secure transaction relaying, Soroban smart contract operations, and advanced transaction management. This integration supports both standard Stellar operations and the latest Soroban smart contract functionality. + + +Stellar support is currently under active development. The API interactions and specifics described below may evolve. + + +## Features + +* Full Soroban smart contract support (invocation, deployment, WASM uploads) +* Standard Stellar payment operations +* Support for all Stellar operations via XDR transaction submission +* Fee bump transaction support +* Sponsored transactions - Users pay fees in tokens instead of XLM +* Secure transaction signing with multiple signer backends +* Transaction status monitoring and sequence number management +* Custom RPC endpoints and network policies +* Metrics and observability + +## Supported Networks + +Stellar networks are defined via JSON configuration files, providing flexibility to: + +* Configure standard Stellar clusters: `mainnet`, `testnet` +* Set up custom Stellar-compatible networks with specific RPC endpoints +* Define network passphrases for proper transaction signing + +Example Stellar network configurations: + +```json +{ + "networks": [ + { + "type": "stellar", + "network": "mainnet", + "rpc_urls": ["https://mainnet.sorobanrpc.com"], + "explorer_urls": ["https://stellar.expert/explorer/public"], + "average_blocktime_ms": 5000, + "is_testnet": false, + "passphrase": "Public Global Stellar Network ; September 2015" + }, + { + "type": "stellar", + "network": "testnet", + "rpc_urls": ["https://soroban-testnet.stellar.org"], + "explorer_urls": ["https://stellar.expert/explorer/testnet"], + "average_blocktime_ms": 5000, + "is_testnet": true, + "passphrase": "Test SDF Network ; September 2015" + } + ] +} +``` + +For detailed network configuration options, see the [Network Configuration](/relayer/network_configuration) guide. + +## Quickstart + +For a step-by-step setup, see [Quick Start Guide](/relayer/quickstart). +Key prerequisites: + +* Rust 2021, version `1.86` or later +* Redis +* Docker (optional) + +Example configuration for a Stellar relayer: +```json +{ + "id": "stellar-example", + "name": "Stellar Example", + "network": "testnet", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "stellar" +} +``` + +For more configuration examples, visit the [OpenZeppelin Relayer examples repository](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples). + +## Configuration + +### Relayer Policies + +Stellar relayers support standard relayer configuration options along with Stellar-specific policies: + +| Policy | Type | Default | Description | +| --- | --- | --- | --- | +| `min_balance` | integer | None | Minimum balance in stroops (1 XLM = 10,000,000 stroops) required for the relayer account | +| `max_fee` | integer | None | Maximum transaction fee in stroops the relayer is willing to pay | +| `timeout_seconds` | integer | None | Transaction timeout in seconds | +| `concurrent_transactions` | boolean | false | Enable concurrent transaction processing. When enabled, bypasses the lane gating mechanism that normally ensures sequential processing for each relayer. Only enable this when your relayer manages transactions from multiple accounts with independent sequence number pools. | +| `fee_payment_strategy` | string | None | Fee payment strategy: `user` enables sponsored transactions (users pay fees in tokens), `relayer` means relayer pays all fees in XLM | +| `allowed_tokens` | array | None | List of tokens allowed for fee payments in sponsored transactions. Each token includes `asset`, `max_allowed_fee` (optional), and `metadata` (optional) | +| `fee_margin_percentage` | float | None | Fee margin percentage applied when converting XLM fees to token amounts for sponsored transactions | +| `slippage_percentage` | float | None | Maximum slippage percentage allowed when swapping tokens via DEX for sponsored transactions | +| `swap_config` | object | None | DEX swap configuration for automated token swaps to keep relayer funded. See [Swap Configuration](#swap-configuration) below for details | + +Example configuration with policies: +```json +{ + "id": "stellar-example", + "name": "Stellar Example", + "network": "testnet", + "paused": false, + "network_type": "stellar", + "signer_id": "local-signer", + "policies": { + "fee_payment_strategy": "relayer", + "min_balance": 10000000, + "max_fee": 1000000, + "timeout_seconds": 30, + "concurrent_transactions": false + } +} +``` + +For general relayer configuration options, check [User Documentation - Relayers](/relayer#3_relayers). + +### Swap Configuration (Sponsored Transactions) + +The `swap_config` policy enables automated token swaps to keep the relayer funded with XLM. This is particularly useful for sponsored transactions where the relayer receives tokens but needs XLM to pay network fees. + +| Field | Type | Description | +| --- | --- | --- | +| `strategies` | array | DEX strategies to use for token swaps, in priority order. Supported values: `order-book` (Stellar Horizon order book API). Strategies are tried sequentially until one can handle the asset. | +| `cron_schedule` | string | Cron expression defining how often scheduled swaps should run (e.g., `"0 0 * * * *"` for every hour). Optional. | +| `min_balance_threshold` | integer | Minimum XLM balance (in stroops) that triggers a swap. If the relayer's balance drops below this, a swap is attempted. Optional. | + +Example swap configuration: + +```json +{ + "policies": { + "fee_payment_strategy": "user", + "swap_config": { + "strategies": ["order-book"], + "cron_schedule": "0 0 * * * *", + "min_balance_threshold": 10000000 + } + } +} +``` + +### Allowed Tokens Configuration + +When using sponsored transactions (`fee_payment_strategy: "user"`), you can configure which tokens users can pay fees with via the `allowed_tokens` array. Each token entry supports: + +| Field | Type | Description | +| --- | --- | --- | +| `asset` | string | **Required.** The asset identifier (e.g., `native` for XLM or `USDC:GBBD...` for USDC) | +| `max_allowed_fee` | integer | Maximum fee amount allowed for this token (in token's smallest unit). Optional. | +| `swap_config` | object | Per-token swap configuration. Optional. | + +Per-token swap configuration fields: +* `slippage_percentage`: Maximum slippage percentage allowed when swapping this token via DEX +* `min_amount`: Minimum amount of a token to swap in a single operation +* `max_amount`: Maximum amount of a token to swap in a single operation +* `retain_min_amount`: Minimum amount of a token to retain in the relayer account after a swap (prevents swapping the entire balance) + +Example allowed tokens configuration: + +```json +{ + "policies": { + "fee_payment_strategy": "user", + "allowed_tokens": [ + { + "asset": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5", + "max_allowed_fee": 1000000000, + "swap_config": { + "slippage_percentage": 0.5, + "min_amount": 10000000, + "max_amount": 1000000000, + "retain_min_amount": 10000000 + } + } + ] + } +} +``` + +## Sponsored Transactions + +Sponsored transactions allow users to pay transaction fees in tokens (e.g., USDC) instead of native XLM. This enables gasless user experiences where users don't need to hold XLM to interact with Stellar applications. + + + +**Asset Support**: Currently, only classic Stellar assets (credit_alphanum4 and credit_alphanum12) are supported for sponsored transactions. Soroban token support will be available in a future release. + + + +### Enabling Sponsored Transactions + +To enable sponsored transactions for a Stellar relayer, configure the following in your relayer's policies: + +1. **Set `fee_payment_strategy` to `user`**: This enables the sponsored transaction flow where users pay fees in tokens. + +2. **Configure `allowed_tokens`**: Specify which tokens users can pay fees with. Each token can have: + - `asset`: The asset identifier (e.g., `native` for XLM or `USDC:GBBD...` for USDC) + - `max_allowed_fee`: Maximum fee amount allowed for this token (optional) + - `swap_config`: DEX swap configuration for automated token swaps to keep relayer funded + +3. **Configure DEX service**: The relayer needs a DEX service configured to convert between XLM and fee tokens. This is typically configured at the service level. + +Example configuration for sponsored transactions: + +```json +{ + "id": "stellar-example", + "name": "Stellar Example", + "network": "testnet", + "paused": false, + "notification_id": "notification-example", + "signer_id": "local-signer", + "network_type": "stellar", + "policies": { + "fee_payment_strategy": "user", + "fee_margin_percentage": 5, + "swap_config": { + "strategies": ["order-book"] + }, + "allowed_tokens": [ + { + "asset": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5" + } + ] + } +} +``` + +### Sponsored Transaction Endpoints + +Once enabled, the relayer provides two endpoints for sponsored transactions: + +1. **Quote** (`POST /api/v1/relayers//transactions/sponsored/quote`): Estimate the fee in tokens for a transaction +2. **Build** (`POST /api/v1/relayers//transactions/sponsored/build`): Prepare a transaction with fee payment instructions + +Both endpoints accept either: +- `transaction_xdr`: A pre-built transaction XDR (base64 encoded) +- `operations`: An array of operations with `source_account` (required when using operations) + + +The build endpoint returns a prepared transaction that includes: +- The transaction XDR ready for signing +- Fee amount in both XLM (stroops) and the specified token +- Transaction validity timestamp + +After receiving the prepared transaction, users must sign it and submit it through the standard transaction submission endpoint. The relayer will wrap it in a fee-bump transaction where the relayer pays the XLM fees, and the user pays the token fees. + +For detailed examples and code samples, see the [SDK Stellar examples](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/stellar/src/sponsored). + +## API Reference + +### Transaction Operations + +The Stellar API supports a variety of transaction operations: + +| Method Name | Required Parameters | Description | +| --- | --- | --- | +| Send Transaction | `network`, `operations` (or `transaction_xdr`) | Submit a transaction to the Stellar network. Supports payment and Soroban operations directly, or any Stellar operation via pre-built XDR transactions. Also supports fee bump transactions for managing transaction fees. | +| Get Transaction Details | `transaction_id` | Retrieve a specific transaction by its ID. | +| List Transactions | (none) | List transactions for the relayer with pagination support. | +| Quote Sponsored Transaction | `transaction_xdr` (or `operations` with `source_account`), `fee_token` | Estimate the fee in tokens for a transaction. **Available in user fee payment mode only.** | +| Build Sponsored Transaction | `transaction_xdr` (or `operations` with `source_account`), `fee_token` | Prepare a transaction with fee payment instructions. **Available in user fee payment mode only.** | + +### Supported Operation Types + +| Operation Type | Description | +| --- | --- | +| `payment` | Transfer native XLM or other assets between accounts | +| `invoke_contract` | Call a deployed Soroban smart contract function | +| `create_contract` | Deploy a new Soroban smart contract from WASM hash | +| `upload_wasm` | Upload WASM contract code to the Stellar ledger | + +### Transaction Structure + +***Required fields:*** +- `network`: The Stellar network ("testnet", "mainnet", etc.) +- Either `operations` (array of operations) OR `transaction_xdr` (base64-encoded XDR) - but not both + +***Optional fields:*** +- `source_account`: The Stellar account that will be the source of the transaction (defaults to relayer’s address) +- `memo`: Transaction memo (see Memo Types below) +- `valid_until`: Transaction expiration time (ISO 8601 format) +- `transaction_xdr`: Pre-built transaction XDR (base64 encoded, signed or unsigned) - mutually exclusive with `operations` +- `fee_bump`: Boolean flag to request fee-bump wrapper (only valid with signed `transaction_xdr`) +- `max_fee`: Maximum fee for fee bump transactions in stroops (defaults to 1,000,000 = 0.1 XLM) + +### Transaction Input Methods + +The relayer supports three ways to submit transactions: + +1. ***Operations-based***: Build a transaction by specifying the `operations` array (recommended for most use cases) +2. ***Transaction XDR (unsigned)***: Submit a pre-built unsigned transaction using `transaction_xdr` field (advanced use case) +3. ***Transaction XDR (signed)***: Submit a signed transaction using `transaction_xdr` with `fee_bump: true` (required for signed XDR) to wrap it in a fee bump transaction + +#### Example 1: Operations-based Transaction + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "operations": [ + { + "type": "payment", + "destination": "GD77B6LYQ5XDCW6CND7CQMA23FSV7MZQGLBAU5OMEOXQM6XFTCMWQQCJ", + "asset": {"type": "native"}, + "amount": 1000000 + } + ], + "memo": {"type": "text", "value": "Payment for services"} +}' +``` + +#### Example 2: Unsigned Transaction XDR + +Submit a pre-built unsigned transaction. The relayer will sign it with its configured signer: + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "transaction_xdr": "AAAAAgAAAACige4lTdwSB/sto4SniEdJ2kOa2X65s5bqkd40J4DjSwAAAGQAAHAkAAAADgAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAKKB7iVN3BIH+y2jhKeIR0naQ5rZfrmzluqR3jQngONLAAAAAAAAAAAAD0JAAAAAAAAAAAA=" +}' +``` + +The `transaction_xdr` field should contain a base64-encoded unsigned transaction envelope. This is useful when: +- You need precise control over transaction structure +- You want to use advanced Stellar features not exposed via the operations API + +#### Example 3: Signed Transaction XDR + +Submit a pre-signed transaction with fee bump wrapper. ***Note: `fee_bump: true` is required when submitting signed XDR***: + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "transaction_xdr": "AAAAAgAAAABjc+mbXCnvmVk4lxqVl7s0LAz5slXqmkHBg8PpH7p3DgAAAGQABpK0AAAACQAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAGN0qQBW8x3mfbwGGYndt2uq4O4sZPUrDx5HlwuQke9zAAAAAAAAAAAAAA9CAAAAAQAAAAA=", + "fee_bump": true, + "max_fee": 10000000 +}' +``` + +The fee bump feature is useful when: +- You have a pre-signed transaction from another system or wallet +- You want the relayer to pay transaction fees on behalf of the original signer +- You need to increase the fee for a transaction to ensure timely execution + + + + +When using `transaction_xdr`: +- The XDR must be properly formatted and valid for the target network +- For unsigned XDR, the relayer will add its signature before submission +- ***For signed XDR, `fee_bump: true` is mandatory*** - the relayer requires this to wrap the signed transaction in a fee bump envelope +- The `max_fee` parameter (in stroops) controls the maximum fee for fee bump transactions (defaults to 1,000,000 = 0.1 XLM) + + + +See [API Reference](./api) for full details and examples. + +### Asset Types + +Assets in Stellar operations must be specified with a type field: + +***Native XLM:*** +```json +{"type": "native"} +``` + +***Credit Asset (4 characters or less):*** +```json +{ + "type": "credit_alphanum4", + "code": "USDC", + "issuer": "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" +} +``` + +***Credit Asset (5-12 characters):*** +```json +{ + "type": "credit_alphanum12", + "code": "LONGASSET", + "issuer": "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" +} +``` + +### Memo Types + +Transactions can include optional memos: + +* ***No Memo***: `"type": "none"` +* ***Text Memo***: `"type": "text", "value": "Payment for services"` (max 28 UTF-8 bytes) +* ***ID Memo***: `"type": "id", "value": "12345"` +* ***Hash Memo***: `"type": "hash", "value": "deadbeef..."` (32 bytes hex) +* ***Return Memo***: `"type": "return", "value": "deadbeef..."` (32 bytes hex) + + + + +Memos are not supported for Soroban contract operations (invoke_contract, create_contract, upload_wasm). Attempting to include a memo with these operations will result in an error. + + + +### Soroban Contract Operations + +#### Invoke Contract + +Call a deployed Soroban smart contract: + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "operations": [ + { + "type": "invoke_contract", + "contract_address": "CA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUWDA", + "function_name": "transfer", + "args": [ + {"address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY"}, + {"address": "GD77B6LYQ5XDCW6CND7CQMA23FSV7MZQGLBAU5OMEOXQM6XFTCMWQQCJ"}, + {"i128": {"hi": "0", "lo": "1000000"}} + ], + "auth": {"type": "source_account"} + } + ] +}' +``` + +#### Create Contract + +Deploy a new Soroban smart contract: + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "operations": [ + { + "type": "create_contract", + "source": { + "from": "address", + "address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY" + }, + "wasm_hash": "d3b2f6f8a1c5e9b4a7d8c2e1f5a9b3c6e8d4f7a2b5c8e1d4f7a0b3c6e9d2f5a8", + "salt": "0000000000000000000000000000000000000000000000000000000000000001" + } + ] +}' +``` + +#### Upload WASM + +Upload contract code to the Stellar ledger: + +```bash +curl --location --request POST 'http://localhost:8080/api/v1/relayers//transactions' \ +--header 'Authorization: Bearer ' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "network": "testnet", + "operations": [ + { + "type": "upload_wasm", + "wasm": { + "type": "base64", + "base64": "AGFzbQEAAAABBgFgAX8BfwMCAQAFAwEAAQcPAgVoZWxsbwAACG1lbW9yeTIDCgQAAAAL" + } + } + ] +}' +``` + +### ScVal Argument Format + +When invoking contract functions, arguments must be provided as ScVal values in JSON format: + +| Type | Format | Description | +| --- | --- | --- | +| U64 | `"u64": "1000000"` | Unsigned 64-bit integer | +| I64 | `"i64": "-500"` | Signed 64-bit integer | +| U32 | `"u32": 42` | Unsigned 32-bit integer | +| I32 | `"i32": -42` | Signed 32-bit integer | +| Boolean | `"bool": true` | Boolean value | +| String | `"string": "hello world"` | UTF-8 string | +| Symbol | `"symbol": "transfer"` | Symbol (used for function names) | +| Address | `"address": "GCRID3RFJXOBEB73FWRYJJ4II5E5UQ413F7LTM4W5KI54NBHQDRUXVLY"` | Stellar account or contract address | +| Bytes | `"bytes": "deadbeef"` | Hex-encoded byte array | +| Vector | `"vec": ["u32": 1, "u32": 2, "u32": 3]` | Array of ScVal values | +| Map | `"map": ["key": "symbol": "name", "val": "string": "MyToken"]` | Key-value pairs | + +Additional types like U128, I128, U256, and I256 are also supported using multi-part representations. + +### Authorization Modes + +Soroban operations support different authorization modes: + +| Type | Description | +| --- | --- | +| `none` | No authorization required | +| `source_account` | Use the transaction source account (default) | +| `addresses` | Use specific addresses (future feature) | +| `xdr` | Advanced: provide base64-encoded XDR entries. This allows you to provide pre-signed SorobanAuthorizationEntry objects for complex authorization scenarios. See the [official Stellar documentation on authorization](https://developers.stellar.org/docs/learn/smart-contract-internals/authorization) for detailed information about SorobanAuthorizationEntries. | + +## Signer Support + +Stellar networks support the following signer types: + +* ***Local Signer***: Uses encrypted keystore files (suitable for development) +* ***Google Cloud KMS***: Uses Google Cloud Key Management Service with ED25519 keys (recommended for production) +* ***Turnkey***: Uses Turnkey’s secure key management infrastructure with ED25519 keys (recommended for production) + +For detailed signer configuration, see the [Signers Configuration](/relayer/configuration/signers) guide. + +For complete examples: +- Google Cloud KMS: [stellar-gcp-kms-signer example](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/stellar-gcp-kms-signer) +- Turnkey: [stellar-turnkey-signer example](https://github.com/OpenZeppelin/openzeppelin-relayer/tree/main/examples/stellar-turnkey-signer) + +## Security + +* Do not expose the relayer directly to the public internet +* Deploy behind a secure backend (reverse proxy, firewall) +* Use hosted signers in production systems +* Ensure proper network passphrases are configured for transaction signing + +## Troubleshooting + +* Check environment variables and configuration files for errors +* Verify network passphrase matches the target network +* Review container logs for Stellar-specific errors +* Ensure Soroban RPC endpoints are properly configured for contract operations + +## Roadmap + +* See [Project Roadmap](/relayer/roadmap) for upcoming features + +## Support + +For help, join our [Telegram](https://t.me/openzeppelin_tg/2) or open an issue on GitHub. + +## License + +This project is licensed under the GNU Affero General Public License v3.0. diff --git a/content/relayer/1.5.x/structure.mdx b/content/relayer/1.5.x/structure.mdx new file mode 100644 index 00000000..d30beae4 --- /dev/null +++ b/content/relayer/1.5.x/structure.mdx @@ -0,0 +1,105 @@ +--- +title: Project Structure +--- + +This document provides detailed information about each directory in the OpenZeppelin Relayer project. + +## Source Code Organization + +### `src/` Directory +The main source code directory contains the core implementation files organized into several modules: + +* `api/`: Route and controllers logic + * Manages HTTP routing and delegates incoming requests to controllers +* `bootstrap/`: Service initialization + * Bootstraps and initializes application services +* `config/`: Configuration management + * Handles system configuration and environment settings +* `constants/`: Global constants + * Provides static values used across the application +* `domain/`: Business domain logic + * Encapsulates core business rules and domain-specific functionality +* `jobs/`: Asynchronous job processing + * Manages background task queueing and execution +* `logging/`: Logging and file rotation + * Implements logging functionalities and log file management +* `metrics/`: Metrics collection + * Collects and reports application performance and usage metrics +* `models/`: Core data models and types + * Defines data structures and type definitions for the system +* `repositories/`: Configuration storage + * Provides interfaces for storing and retrieving configuration data +* `services/`: Business service logic + * Implements core business functionalities and service operations +* `utils/`: Utility functions + * Offers helper functions and common utilities for the application + +## Documentation + +### `docs/` Directory +Project documentation: + +* User guides +* API documentation +* Configuration examples +* Architecture diagrams + +## Configuration + +### `config/` Directory + +Houses system configuration file and keys: + +* `config.json` configuration file +* keystore files referenced from config.json file + +## Tests + +### `test/` Directory + +Includes comprehensive testing suites to ensure system reliability: + +* End-to-end tests that simulate real-world user scenarios + +## Scripts + +### `scripts/` Directory + +Utility scripts. + +## Examples + +### `examples/` Directory + +Provides practical examples and sample configurations to help users get started: + +* Demonstrates typical service configurations for various environments +* Acts as a quick-start guide for customizing and deploying the relayer +* Serves as a reference for best practices in configuration and deployment + +## Development Tools + +### Pre-commit Hooks +Located in the project root: + +* Code formatting checks +* Linting rules +* Commit message validation + +### Build Configuration +Core build files: + +* `Cargo.toml`: Project dependencies and metadata +* `rustfmt.toml`: Code formatting rules +* `rust-toolchain.toml`: Rust version and components + +## Docker Support + +The project includes Docker configurations for different environments: + +* `Dockerfile.development`: Development container setup +* `Dockerfile.production`: Production-ready container + + + +For detailed information about running the relayers in containers, see the Docker deployment section in the main documentation. diff --git a/content/relayer/1.5.x/zama-fhevm.mdx b/content/relayer/1.5.x/zama-fhevm.mdx new file mode 100644 index 00000000..f68fbbbf --- /dev/null +++ b/content/relayer/1.5.x/zama-fhevm.mdx @@ -0,0 +1,155 @@ +--- +title: Zama FHEVM Integration +--- + +## Overview + +The OpenZeppelin Relayer supports interacting with [Zama FHEVM](https://docs.zama.org/protocol) contracts — EVM smart contracts that operate on Fully Homomorphic Encryption (FHE) ciphertexts. The OpenZeppelin Relayer provides two capabilities that FHEVM applications need from a backend: + +- **Transaction submission** for encrypted contract calls (e.g. submitting an `increment()` with an encrypted input). +- **EIP-712 typed-data signing** to authorize user decryption requests served by the Zama Relayer. + +Because FHEVM contracts live on standard EVM networks, your OpenZeppelin Relayer is configured exactly as a regular `evm` relayer — there is no FHEVM-specific relayer or network type in OpenZeppelin Relayer. All FHE-specific work (encryption, decryption, key handling) is done by the [Zama Relayer SDK](https://docs.zama.org/protocol/relayer-sdk-guides) running in your application, which in turn talks to the Zama Relayer. The OpenZeppelin Relayer only deals with on-chain transactions and EIP-712 typed-data signatures. + + + +**Terminology.** In this page: + +- **OpenZeppelin Relayer** (or "OZ Relayer") refers to this service. It holds an EVM signer, submits on-chain transactions, and signs EIP-712 payloads. +- **Zama Relayer** refers to the Zama-operated service that the [`@zama-fhe/relayer-sdk`](https://www.npmjs.com/package/@zama-fhe/relayer-sdk) talks to under the hood. It serves FHE public keys and routes decryption requests to the Zama KMS / coprocessor. Applications interact with it only indirectly through the Zama Relayer SDK. It holds no OpenZeppelin key material and does not sign EIP-712. + +The two are different systems and do different things. In this flow, only the OpenZeppelin Relayer holds any signer key material. + + + + +The FHE encryption/decryption primitives run in your application using the Zama Relayer SDK. The OpenZeppelin Relayer is not aware of FHE cleartexts and never handles the decryption keypair. + + +## Features + +- End-to-end encrypted contract calls via the standard EVM `sendTransaction` API +- EIP-712 signing via `signTypedData` for user decryption authorization +- Works on any FHEVM-enabled EVM network (Sepolia testnet, Ethereum mainnet) +- All existing EVM features: gas management, EIP-1559, transaction status tracking, signer backends, policies, and observability + +## Supported Networks + +Zama FHEVM is available on EVM networks where the FHE coprocessor is deployed. At the time of writing, this includes: + +- Ethereum Sepolia (testnet) +- Ethereum Mainnet (requires a Zama Relayer API key) + +Because the OpenZeppelin Relayer treats these as regular EVM networks, any network configuration that works for EVM will work here. See the [Network Configuration](/relayer/network_configuration) guide for the full list of options. + +## Supported Signers + +All EVM signers are supported by the OpenZeppelin Relayer: + +- `local` (local keystore files) +- `vault` (HashiCorp Vault secret storage) +- `vault_cloud` (hosted HashiCorp Vault) +- `turnkey` (hosted Turnkey signer) +- `google_cloud_kms` (Google Cloud KMS) +- `aws_kms` (Amazon AWS KMS) +- `cdp` (hosted Coinbase Developer Platform signer) + +For signer configuration details, see the [Signers](/relayer/configuration/signers) guide. + + +For production, prefer hosted signers (AWS KMS, Google Cloud KMS, Turnkey, CDP). The OpenZeppelin Relayer's signer is used both to sign the on-chain encrypted transactions and the EIP-712 payloads consumed by the Zama Relayer, so key availability and security apply to both flows. + + +## Quickstart + +Example OpenZeppelin Relayer configuration for a Zama FHEVM application running on Sepolia (note that it is just a standard `evm` relayer — nothing FHEVM-specific in the config): + +```json +{ + "id": "zama-sepolia", + "name": "Zama FHEVM Sepolia", + "network": "sepolia", + "paused": false, + "signer_id": "local-signer", + "network_type": "evm" +} +``` + +Once the OpenZeppelin Relayer is running, you will typically: + +1. Create a Zama FHE instance in your application using the Zama Relayer SDK. +2. Read encrypted state from your FHEVM contract via an RPC call. +3. Decrypt the state publicly, or fall back to user decryption authorized by an EIP-712 signature from the OpenZeppelin Relayer. +4. Encrypt any inputs locally with the Zama Relayer SDK. +5. Submit the encrypted transaction through the OpenZeppelin Relayer. + +For a full working walkthrough, see the [Zama FHEVM Counter Guide](/relayer/guides/zama-fhevm-counter-guide). + +## How The OpenZeppelin Relayer Fits Into An FHEVM Flow + +A typical FHEVM call has four moving parts: + +- **Your application** — orchestrates encryption/decryption and calls both the Zama Relayer (via SDK) and the OpenZeppelin Relayer. +- **Zama Relayer SDK (client)** + **Zama Relayer (service)** — the SDK encrypts inputs, generates keypairs for user decryption, and builds EIP-712 payloads; the Zama Relayer service serves FHE public keys and routes decryption requests. No OpenZeppelin key material is involved. +- **OpenZeppelin Relayer** — the only component in this diagram that holds an EVM signer. It signs and submits the encrypted transaction on-chain, and signs the EIP-712 user-decryption payload via `signTypedData`. +- **FHEVM contract** — stores encrypted state on the EVM network. + +The OpenZeppelin Relayer never encrypts or decrypts FHE data and never sees plaintext. It performs exactly two operations that use its signer: (a) signing and submitting the encrypted on-chain transaction, and (b) signing the EIP-712 user-decryption payload produced by the Zama Relayer SDK. The Zama Relayer is a separate system; it does not hold or use the OpenZeppelin Relayer's key material. + +## Decryption Model + +Zama FHEVM contracts support two decryption paths: + +- **Public decryption** — used when an encrypted handle is flagged as publicly decryptable. The Zama Relayer SDK can decrypt it directly via the Zama Relayer service; the OpenZeppelin Relayer is not involved. +- **User decryption** — used when decryption requires authorization. The Zama Relayer SDK builds an EIP-712 payload, and the **OpenZeppelin Relayer** signs it with `signTypedData`. The resulting signature is then passed to `userDecrypt` on the SDK, which is authorized by the Zama Relayer to return the cleartext. + +Applications typically try public decryption first and fall back to user decryption. + +## Mainnet Usage + +Running on Ethereum mainnet requires: + +- A Zama Relayer API key for mainnet (see the [Zama mainnet API key guide](https://docs.zama.org/protocol/relayer-sdk-guides/fhevm-relayer/mainnet-api-key)). +- The Zama Relayer SDK configured with `MainnetConfig` and the API key. +- The OpenZeppelin Relayer pointed at an Ethereum mainnet RPC. + +The FHEVM flow itself does not change between testnet and mainnet; only the Zama Relayer SDK configuration and network selection differ. + +## API Reference + +The OpenZeppelin Relayer endpoints most relevant to FHEVM flows are: + +| Method | Purpose | +| --- | --- | +| [Send Transaction](/relayer/api/sendTransaction) | Submit an encrypted FHEVM contract call on-chain | +| [Sign Typed Data](/relayer/api/signTypedData) | Sign the EIP-712 payload used for user decryption | +| [Get Relayer](/relayer/api/getRelayer) | Retrieve the OpenZeppelin Relayer's EVM address (needed by the Zama SDK for input proofs and decryption requests) | +| [Get Transaction by ID](/relayer/api/getTransactionById) | Poll for transaction status after submission | + +See the [API Reference](./api) for complete method documentation. + +## Example + +The OpenZeppelin Relayer SDK ships with a working Zama FHEVM example: + +- [examples/relayers/zama](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama) — end-to-end counter example using the Sepolia testnet. + +The example contract is deployed from [Zama's fhevm-hardhat-template](https://github.com/zama-ai/fhevm-hardhat-template). + +## Security + +- Do not expose the OpenZeppelin Relayer directly to the public internet. +- Deploy behind a secure backend (reverse proxy, firewall). +- Use hosted signers in production. The OpenZeppelin Relayer's signer is used both for on-chain submission and for EIP-712 signing consumed by the Zama Relayer, so key availability and audit trails matter for both. +- Never hand a Zama decryption keypair's private key to the OpenZeppelin Relayer. The decryption keypair is an application-side secret — it is used only by the Zama Relayer SDK. + +## Additional Resources + +- [Zama Relayer SDK Guides](https://docs.zama.org/protocol/relayer-sdk-guides) +- [Zama fhevm-hardhat-template](https://github.com/zama-ai/fhevm-hardhat-template) +- [Zama FHEVM Counter Guide](/relayer/guides/zama-fhevm-counter-guide) +- [OpenZeppelin Relayer SDK — Zama example](https://github.com/OpenZeppelin/openzeppelin-relayer-sdk/tree/main/examples/relayers/zama) + +## Support + +For help, join our [Telegram](https://t.me/openzeppelin_tg/2) or open an issue on GitHub. diff --git a/content/relayer/latest-versions.js b/content/relayer/latest-versions.js index 44099b5e..2b41b1a1 100644 --- a/content/relayer/latest-versions.js +++ b/content/relayer/latest-versions.js @@ -6,12 +6,13 @@ * @property {boolean} isStable - Whether this is a stable release */ -export const latestStable = "1.4.x"; +export const latestStable = "1.5.x"; /** @type {VersionConfig[]} */ export const allVersions = [ - { label: "v1.4.x (latest stable)", value: "1.4.x", path: "/relayer/1.4.x", isStable: true }, + { label: "v1.5.x (latest stable)", value: "1.5.x", path: "/relayer/1.5.x", isStable: true }, + { label: "v1.4.x", value: "1.4.x", path: "/relayer/1.4.x", isStable: true }, { label: "v1.3.x", value: "1.3.x", path: "/relayer/1.3.x", isStable: true }, { label: "v1.2.x", value: "1.2.x", path: "/relayer/1.2.x", isStable: true }, { label: "v1.1.x", value: "1.1.x", path: "/relayer/1.1.x", isStable: true }, diff --git a/netlify.toml b/netlify.toml index 6c6f4a5f..8bcda62b 100644 --- a/netlify.toml +++ b/netlify.toml @@ -201,6 +201,11 @@ from = "/monitor/0.1.0/*" to = "/monitor/:splat" status = 301 +[[redirects]] +from = "/relayer/1.5.x/*" +to = "/relayer/:splat" +status = 301 + [[redirects]] from = "/relayer/1.4.x/*" to = "/relayer/:splat" diff --git a/src/lib/openapi.ts b/src/lib/openapi.ts index d246509f..7c63a9ca 100644 --- a/src/lib/openapi.ts +++ b/src/lib/openapi.ts @@ -2,7 +2,7 @@ import { createOpenAPI } from "fumadocs-openapi/server"; export const openapi = createOpenAPI({ input: [ - "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-relayer/refs/heads/release-v1.4.0/openapi.json", + "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-relayer/refs/heads/release-v1.5.0/openapi.json", "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-relayer/refs/heads/main/openapi.json", ], }); diff --git a/src/navigation/arbitrum-stylus.json b/src/navigation/arbitrum-stylus.json index f82c1c52..e871308d 100644 --- a/src/navigation/arbitrum-stylus.json +++ b/src/navigation/arbitrum-stylus.json @@ -225,13 +225,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x" + "url": "/relayer/1.5.x" }, "children": [ { "type": "page", "name": "Quickstart", - "url": "/relayer/1.4.x/quickstart" + "url": "/relayer/1.5.x/quickstart" }, { "type": "folder", @@ -239,30 +239,30 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/configuration" + "url": "/relayer/1.5.x/configuration" }, "children": [ { "type": "page", "name": "Signers", - "url": "/relayer/1.4.x/configuration/signers" + "url": "/relayer/1.5.x/configuration/signers" }, { "type": "page", "name": "Network Configuration", - "url": "/relayer/1.4.x/configuration/network" + "url": "/relayer/1.5.x/configuration/network" }, { "type": "page", "name": "Storage Configuration", - "url": "/relayer/1.4.x/configuration/storage" + "url": "/relayer/1.5.x/configuration/storage" } ] }, { "type": "page", "name": "EVM Integration", - "url": "/relayer/1.4.x/evm" + "url": "/relayer/1.5.x/evm" }, { "type": "folder", @@ -270,7 +270,7 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/api" + "url": "/relayer/1.5.x/api" }, "children": [ { @@ -280,92 +280,92 @@ { "type": "page", "name": "List Relayers", - "url": "/relayer/1.4.x/api/listRelayers" + "url": "/relayer/1.5.x/api/listRelayers" }, { "type": "page", "name": "Create Relayer", - "url": "/relayer/1.4.x/api/createRelayer" + "url": "/relayer/1.5.x/api/createRelayer" }, { "type": "page", "name": "Get Relayer", - "url": "/relayer/1.4.x/api/getRelayer" + "url": "/relayer/1.5.x/api/getRelayer" }, { "type": "page", "name": "Delete Relayer", - "url": "/relayer/1.4.x/api/deleteRelayer" + "url": "/relayer/1.5.x/api/deleteRelayer" }, { "type": "page", "name": "Update Relayer", - "url": "/relayer/1.4.x/api/updateRelayer" + "url": "/relayer/1.5.x/api/updateRelayer" }, { "type": "page", "name": "Get Relayer Balance", - "url": "/relayer/1.4.x/api/getRelayerBalance" + "url": "/relayer/1.5.x/api/getRelayerBalance" }, { "type": "page", "name": "RPC", - "url": "/relayer/1.4.x/api/rpc" + "url": "/relayer/1.5.x/api/rpc" }, { "type": "page", "name": "Sign", - "url": "/relayer/1.4.x/api/sign" + "url": "/relayer/1.5.x/api/sign" }, { "type": "page", "name": "Sign Transaction", - "url": "/relayer/1.4.x/api/signTransaction" + "url": "/relayer/1.5.x/api/signTransaction" }, { "type": "page", "name": "Sign Typed Data", - "url": "/relayer/1.4.x/api/signTypedData" + "url": "/relayer/1.5.x/api/signTypedData" }, { "type": "page", "name": "Get Relayer Status", - "url": "/relayer/1.4.x/api/getRelayerStatus" + "url": "/relayer/1.5.x/api/getRelayerStatus" }, { "type": "page", "name": "Send Transaction", - "url": "/relayer/1.4.x/api/sendTransaction" + "url": "/relayer/1.5.x/api/sendTransaction" }, { "type": "page", "name": "List Transactions", - "url": "/relayer/1.4.x/api/listTransactions" + "url": "/relayer/1.5.x/api/listTransactions" }, { "type": "page", "name": "Get Transaction by Nonce", - "url": "/relayer/1.4.x/api/getTransactionByNonce" + "url": "/relayer/1.5.x/api/getTransactionByNonce" }, { "type": "page", "name": "Delete Pending Transactions", - "url": "/relayer/1.4.x/api/deletePendingTransactions" + "url": "/relayer/1.5.x/api/deletePendingTransactions" }, { "type": "page", "name": "Get Transaction by ID", - "url": "/relayer/1.4.x/api/getTransactionById" + "url": "/relayer/1.5.x/api/getTransactionById" }, { "type": "page", "name": "Replace Transaction", - "url": "/relayer/1.4.x/api/replaceTransaction" + "url": "/relayer/1.5.x/api/replaceTransaction" }, { "type": "page", "name": "Cancel Transaction", - "url": "/relayer/1.4.x/api/cancelTransaction" + "url": "/relayer/1.5.x/api/cancelTransaction" } ] }, @@ -376,27 +376,27 @@ { "type": "page", "name": "Call Plugin", - "url": "/relayer/1.4.x/api/callPlugin" + "url": "/relayer/1.5.x/api/callPlugin" }, { "type": "page", "name": "Call PluginGet", - "url": "/relayer/1.4.x/api/callPluginGet" + "url": "/relayer/1.5.x/api/callPluginGet" }, { "type": "page", "name": "Get Plugin", - "url": "/relayer/1.4.x/api/getPlugin" + "url": "/relayer/1.5.x/api/getPlugin" }, { "type": "page", "name": "UpdatePlugin", - "url": "/relayer/1.4.x/api/updatePlugin" + "url": "/relayer/1.5.x/api/updatePlugin" }, { "type": "page", "name": "ListPlugins", - "url": "/relayer/1.4.x/api/listPlugins" + "url": "/relayer/1.5.x/api/listPlugins" } ] }, @@ -407,27 +407,27 @@ { "type": "page", "name": "List Notifications", - "url": "/relayer/1.4.x/api/listNotifications" + "url": "/relayer/1.5.x/api/listNotifications" }, { "type": "page", "name": "Create Notification", - "url": "/relayer/1.4.x/api/createNotification" + "url": "/relayer/1.5.x/api/createNotification" }, { "type": "page", "name": "Get Notification", - "url": "/relayer/1.4.x/api/getNotification" + "url": "/relayer/1.5.x/api/getNotification" }, { "type": "page", "name": "Delete Notification", - "url": "/relayer/1.4.x/api/deleteNotification" + "url": "/relayer/1.5.x/api/deleteNotification" }, { "type": "page", "name": "Update Notification", - "url": "/relayer/1.4.x/api/updateNotification" + "url": "/relayer/1.5.x/api/updateNotification" } ] }, @@ -438,27 +438,27 @@ { "type": "page", "name": "List Signers", - "url": "/relayer/1.4.x/api/listSigners" + "url": "/relayer/1.5.x/api/listSigners" }, { "type": "page", "name": "Create Signer", - "url": "/relayer/1.4.x/api/createSigner" + "url": "/relayer/1.5.x/api/createSigner" }, { "type": "page", "name": "Get Signer", - "url": "/relayer/1.4.x/api/getSigner" + "url": "/relayer/1.5.x/api/getSigner" }, { "type": "page", "name": "Delete Signer", - "url": "/relayer/1.4.x/api/deleteSigner" + "url": "/relayer/1.5.x/api/deleteSigner" }, { "type": "page", "name": "Update Signer", - "url": "/relayer/1.4.x/api/updateSigner" + "url": "/relayer/1.5.x/api/updateSigner" } ] }, @@ -469,17 +469,17 @@ { "type": "page", "name": "Scrape Metrics", - "url": "/relayer/1.4.x/api/scrapeMetrics" + "url": "/relayer/1.5.x/api/scrape_metrics" }, { "type": "page", "name": "List Metrics", - "url": "/relayer/1.4.x/api/listMetrics" + "url": "/relayer/1.5.x/api/list_metrics" }, { "type": "page", "name": "Metric Detail", - "url": "/relayer/1.4.x/api/metricDetail" + "url": "/relayer/1.5.x/api/metric_detail" } ] }, @@ -490,12 +490,12 @@ { "type": "page", "name": "List Networks", - "url": "/relayer/1.4.x/api/listNetworks" + "url": "/relayer/1.5.x/api/listNetworks" }, { "type": "page", "name": "Update Network", - "url": "/relayer/1.4.x/api/updateNetwork" + "url": "/relayer/1.5.x/api/updateNetwork" } ] }, @@ -506,12 +506,12 @@ { "type": "page", "name": "Health", - "url": "/relayer/1.4.x/api/health" + "url": "/relayer/1.5.x/api/health" }, { "type": "page", "name": "Readiness", - "url": "/relayer/1.4.x/api/readiness" + "url": "/relayer/1.5.x/api/readiness" } ] } @@ -520,12 +520,12 @@ { "type": "page", "name": "Project Structure", - "url": "/relayer/1.4.x/structure" + "url": "/relayer/1.5.x/structure" }, { "type": "page", "name": "Project Roadmap", - "url": "/relayer/1.4.x/roadmap" + "url": "/relayer/1.5.x/roadmap" }, { "type": "folder", @@ -533,14 +533,14 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/plugins" + "url": "/relayer/1.5.x/plugins" }, "children": [] }, { "type": "page", "name": "Changelog", - "url": "/relayer/1.4.x/changelog" + "url": "/relayer/1.5.x/changelog" }, { "type": "page", diff --git a/src/navigation/ethereum-evm.json b/src/navigation/ethereum-evm.json index 76ab951d..2f6f8b43 100644 --- a/src/navigation/ethereum-evm.json +++ b/src/navigation/ethereum-evm.json @@ -819,13 +819,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x" + "url": "/relayer/1.5.x" }, "children": [ { "type": "page", "name": "Quickstart", - "url": "/relayer/1.4.x/quickstart" + "url": "/relayer/1.5.x/quickstart" }, { "type": "folder", @@ -833,35 +833,35 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/configuration" + "url": "/relayer/1.5.x/configuration" }, "children": [ { "type": "page", "name": "Signers", - "url": "/relayer/1.4.x/configuration/signers" + "url": "/relayer/1.5.x/configuration/signers" }, { "type": "page", "name": "Network Configuration", - "url": "/relayer/1.4.x/configuration/network" + "url": "/relayer/1.5.x/configuration/network" }, { "type": "page", "name": "Storage Configuration", - "url": "/relayer/1.4.x/configuration/storage" + "url": "/relayer/1.5.x/configuration/storage" } ] }, { "type": "page", "name": "EVM Integration", - "url": "/relayer/1.4.x/evm" + "url": "/relayer/1.5.x/evm" }, { "type": "page", "name": "Solana Integration", - "url": "/relayer/1.4.x/solana" + "url": "/relayer/1.5.x/solana" }, { "type": "folder", @@ -869,7 +869,7 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/api" + "url": "/relayer/1.5.x/api" }, "children": [ { @@ -879,92 +879,92 @@ { "type": "page", "name": "List Relayers", - "url": "/relayer/1.4.x/api/listRelayers" + "url": "/relayer/1.5.x/api/listRelayers" }, { "type": "page", "name": "Create Relayer", - "url": "/relayer/1.4.x/api/createRelayer" + "url": "/relayer/1.5.x/api/createRelayer" }, { "type": "page", "name": "Get Relayer", - "url": "/relayer/1.4.x/api/getRelayer" + "url": "/relayer/1.5.x/api/getRelayer" }, { "type": "page", "name": "Delete Relayer", - "url": "/relayer/1.4.x/api/deleteRelayer" + "url": "/relayer/1.5.x/api/deleteRelayer" }, { "type": "page", "name": "Update Relayer", - "url": "/relayer/1.4.x/api/updateRelayer" + "url": "/relayer/1.5.x/api/updateRelayer" }, { "type": "page", "name": "Get Relayer Balance", - "url": "/relayer/1.4.x/api/getRelayerBalance" + "url": "/relayer/1.5.x/api/getRelayerBalance" }, { "type": "page", "name": "RPC", - "url": "/relayer/1.4.x/api/rpc" + "url": "/relayer/1.5.x/api/rpc" }, { "type": "page", "name": "Sign", - "url": "/relayer/1.4.x/api/sign" + "url": "/relayer/1.5.x/api/sign" }, { "type": "page", "name": "Sign Transaction", - "url": "/relayer/1.4.x/api/signTransaction" + "url": "/relayer/1.5.x/api/signTransaction" }, { "type": "page", "name": "Sign Typed Data", - "url": "/relayer/1.4.x/api/signTypedData" + "url": "/relayer/1.5.x/api/signTypedData" }, { "type": "page", "name": "Get Relayer Status", - "url": "/relayer/1.4.x/api/getRelayerStatus" + "url": "/relayer/1.5.x/api/getRelayerStatus" }, { "type": "page", "name": "Send Transaction", - "url": "/relayer/1.4.x/api/sendTransaction" + "url": "/relayer/1.5.x/api/sendTransaction" }, { "type": "page", "name": "List Transactions", - "url": "/relayer/1.4.x/api/listTransactions" + "url": "/relayer/1.5.x/api/listTransactions" }, { "type": "page", "name": "Get Transaction by Nonce", - "url": "/relayer/1.4.x/api/getTransactionByNonce" + "url": "/relayer/1.5.x/api/getTransactionByNonce" }, { "type": "page", "name": "Delete Pending Transactions", - "url": "/relayer/1.4.x/api/deletePendingTransactions" + "url": "/relayer/1.5.x/api/deletePendingTransactions" }, { "type": "page", "name": "Get Transaction by ID", - "url": "/relayer/1.4.x/api/getTransactionById" + "url": "/relayer/1.5.x/api/getTransactionById" }, { "type": "page", "name": "Replace Transaction", - "url": "/relayer/1.4.x/api/replaceTransaction" + "url": "/relayer/1.5.x/api/replaceTransaction" }, { "type": "page", "name": "Cancel Transaction", - "url": "/relayer/1.4.x/api/cancelTransaction" + "url": "/relayer/1.5.x/api/cancelTransaction" } ] }, @@ -975,27 +975,27 @@ { "type": "page", "name": "Call Plugin", - "url": "/relayer/1.4.x/api/callPlugin" + "url": "/relayer/1.5.x/api/callPlugin" }, { "type": "page", "name": "Call PluginGet", - "url": "/relayer/1.4.x/api/callPluginGet" + "url": "/relayer/1.5.x/api/callPluginGet" }, { "type": "page", "name": "Get Plugin", - "url": "/relayer/1.4.x/api/getPlugin" + "url": "/relayer/1.5.x/api/getPlugin" }, { "type": "page", "name": "UpdatePlugin", - "url": "/relayer/1.4.x/api/updatePlugin" + "url": "/relayer/1.5.x/api/updatePlugin" }, { "type": "page", "name": "ListPlugins", - "url": "/relayer/1.4.x/api/listPlugins" + "url": "/relayer/1.5.x/api/listPlugins" } ] }, @@ -1006,27 +1006,27 @@ { "type": "page", "name": "List Notifications", - "url": "/relayer/1.4.x/api/listNotifications" + "url": "/relayer/1.5.x/api/listNotifications" }, { "type": "page", "name": "Create Notification", - "url": "/relayer/1.4.x/api/createNotification" + "url": "/relayer/1.5.x/api/createNotification" }, { "type": "page", "name": "Get Notification", - "url": "/relayer/1.4.x/api/getNotification" + "url": "/relayer/1.5.x/api/getNotification" }, { "type": "page", "name": "Delete Notification", - "url": "/relayer/1.4.x/api/deleteNotification" + "url": "/relayer/1.5.x/api/deleteNotification" }, { "type": "page", "name": "Update Notification", - "url": "/relayer/1.4.x/api/updateNotification" + "url": "/relayer/1.5.x/api/updateNotification" } ] }, @@ -1037,27 +1037,27 @@ { "type": "page", "name": "List Signers", - "url": "/relayer/1.4.x/api/listSigners" + "url": "/relayer/1.5.x/api/listSigners" }, { "type": "page", "name": "Create Signer", - "url": "/relayer/1.4.x/api/createSigner" + "url": "/relayer/1.5.x/api/createSigner" }, { "type": "page", "name": "Get Signer", - "url": "/relayer/1.4.x/api/getSigner" + "url": "/relayer/1.5.x/api/getSigner" }, { "type": "page", "name": "Delete Signer", - "url": "/relayer/1.4.x/api/deleteSigner" + "url": "/relayer/1.5.x/api/deleteSigner" }, { "type": "page", "name": "Update Signer", - "url": "/relayer/1.4.x/api/updateSigner" + "url": "/relayer/1.5.x/api/updateSigner" } ] }, @@ -1068,17 +1068,17 @@ { "type": "page", "name": "Scrape Metrics", - "url": "/relayer/1.4.x/api/scrapeMetrics" + "url": "/relayer/1.5.x/api/scrape_metrics" }, { "type": "page", "name": "List Metrics", - "url": "/relayer/1.4.x/api/listMetrics" + "url": "/relayer/1.5.x/api/list_metrics" }, { "type": "page", "name": "Metric Detail", - "url": "/relayer/1.4.x/api/metricDetail" + "url": "/relayer/1.5.x/api/metric_detail" } ] }, @@ -1089,12 +1089,12 @@ { "type": "page", "name": "List Networks", - "url": "/relayer/1.4.x/api/listNetworks" + "url": "/relayer/1.5.x/api/listNetworks" }, { "type": "page", "name": "Update Network", - "url": "/relayer/1.4.x/api/updateNetwork" + "url": "/relayer/1.5.x/api/updateNetwork" } ] }, @@ -1105,12 +1105,12 @@ { "type": "page", "name": "Health", - "url": "/relayer/1.4.x/api/health" + "url": "/relayer/1.5.x/api/health" }, { "type": "page", "name": "Readiness", - "url": "/relayer/1.4.x/api/readiness" + "url": "/relayer/1.5.x/api/readiness" } ] } @@ -1119,12 +1119,12 @@ { "type": "page", "name": "Project Structure", - "url": "/relayer/1.4.x/structure" + "url": "/relayer/1.5.x/structure" }, { "type": "page", "name": "Project Roadmap", - "url": "/relayer/1.4.x/roadmap" + "url": "/relayer/1.5.x/roadmap" }, { "type": "folder", @@ -1132,14 +1132,14 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/plugins" + "url": "/relayer/1.5.x/plugins" }, "children": [] }, { "type": "page", "name": "Changelog", - "url": "/relayer/1.4.x/changelog" + "url": "/relayer/1.5.x/changelog" }, { "type": "page", diff --git a/src/navigation/polkadot.json b/src/navigation/polkadot.json index 66c48e4c..25b8c874 100644 --- a/src/navigation/polkadot.json +++ b/src/navigation/polkadot.json @@ -364,13 +364,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x" + "url": "/relayer/1.5.x" }, "children": [ { "type": "page", "name": "Quickstart", - "url": "/relayer/1.4.x/quickstart" + "url": "/relayer/1.5.x/quickstart" }, { "type": "folder", @@ -378,23 +378,23 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/configuration" + "url": "/relayer/1.5.x/configuration" }, "children": [ { "type": "page", "name": "Signers", - "url": "/relayer/1.4.x/configuration/signers" + "url": "/relayer/1.5.x/configuration/signers" }, { "type": "page", "name": "Network Configuration", - "url": "/relayer/1.4.x/configuration/network" + "url": "/relayer/1.5.x/configuration/network" }, { "type": "page", "name": "Storage Configuration", - "url": "/relayer/1.4.x/configuration/storage" + "url": "/relayer/1.5.x/configuration/storage" } ] }, @@ -404,7 +404,7 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/api" + "url": "/relayer/1.5.x/api" }, "children": [ { @@ -414,92 +414,92 @@ { "type": "page", "name": "List Relayers", - "url": "/relayer/1.4.x/api/listRelayers" + "url": "/relayer/1.5.x/api/listRelayers" }, { "type": "page", "name": "Create Relayer", - "url": "/relayer/1.4.x/api/createRelayer" + "url": "/relayer/1.5.x/api/createRelayer" }, { "type": "page", "name": "Get Relayer", - "url": "/relayer/1.4.x/api/getRelayer" + "url": "/relayer/1.5.x/api/getRelayer" }, { "type": "page", "name": "Delete Relayer", - "url": "/relayer/1.4.x/api/deleteRelayer" + "url": "/relayer/1.5.x/api/deleteRelayer" }, { "type": "page", "name": "Update Relayer", - "url": "/relayer/1.4.x/api/updateRelayer" + "url": "/relayer/1.5.x/api/updateRelayer" }, { "type": "page", "name": "Get Relayer Balance", - "url": "/relayer/1.4.x/api/getRelayerBalance" + "url": "/relayer/1.5.x/api/getRelayerBalance" }, { "type": "page", "name": "RPC", - "url": "/relayer/1.4.x/api/rpc" + "url": "/relayer/1.5.x/api/rpc" }, { "type": "page", "name": "Sign", - "url": "/relayer/1.4.x/api/sign" + "url": "/relayer/1.5.x/api/sign" }, { "type": "page", "name": "Sign Transaction", - "url": "/relayer/1.4.x/api/signTransaction" + "url": "/relayer/1.5.x/api/signTransaction" }, { "type": "page", "name": "Sign Typed Data", - "url": "/relayer/1.4.x/api/signTypedData" + "url": "/relayer/1.5.x/api/signTypedData" }, { "type": "page", "name": "Get Relayer Status", - "url": "/relayer/1.4.x/api/getRelayerStatus" + "url": "/relayer/1.5.x/api/getRelayerStatus" }, { "type": "page", "name": "Send Transaction", - "url": "/relayer/1.4.x/api/sendTransaction" + "url": "/relayer/1.5.x/api/sendTransaction" }, { "type": "page", "name": "List Transactions", - "url": "/relayer/1.4.x/api/listTransactions" + "url": "/relayer/1.5.x/api/listTransactions" }, { "type": "page", "name": "Get Transaction by Nonce", - "url": "/relayer/1.4.x/api/getTransactionByNonce" + "url": "/relayer/1.5.x/api/getTransactionByNonce" }, { "type": "page", "name": "Delete Pending Transactions", - "url": "/relayer/1.4.x/api/deletePendingTransactions" + "url": "/relayer/1.5.x/api/deletePendingTransactions" }, { "type": "page", "name": "Get Transaction by ID", - "url": "/relayer/1.4.x/api/getTransactionById" + "url": "/relayer/1.5.x/api/getTransactionById" }, { "type": "page", "name": "Replace Transaction", - "url": "/relayer/1.4.x/api/replaceTransaction" + "url": "/relayer/1.5.x/api/replaceTransaction" }, { "type": "page", "name": "Cancel Transaction", - "url": "/relayer/1.4.x/api/cancelTransaction" + "url": "/relayer/1.5.x/api/cancelTransaction" } ] }, @@ -510,27 +510,27 @@ { "type": "page", "name": "Call Plugin", - "url": "/relayer/1.4.x/api/callPlugin" + "url": "/relayer/1.5.x/api/callPlugin" }, { "type": "page", "name": "Call PluginGet", - "url": "/relayer/1.4.x/api/callPluginGet" + "url": "/relayer/1.5.x/api/callPluginGet" }, { "type": "page", "name": "Get Plugin", - "url": "/relayer/1.4.x/api/getPlugin" + "url": "/relayer/1.5.x/api/getPlugin" }, { "type": "page", "name": "UpdatePlugin", - "url": "/relayer/1.4.x/api/updatePlugin" + "url": "/relayer/1.5.x/api/updatePlugin" }, { "type": "page", "name": "ListPlugins", - "url": "/relayer/1.4.x/api/listPlugins" + "url": "/relayer/1.5.x/api/listPlugins" } ] }, @@ -541,27 +541,27 @@ { "type": "page", "name": "List Notifications", - "url": "/relayer/1.4.x/api/listNotifications" + "url": "/relayer/1.5.x/api/listNotifications" }, { "type": "page", "name": "Create Notification", - "url": "/relayer/1.4.x/api/createNotification" + "url": "/relayer/1.5.x/api/createNotification" }, { "type": "page", "name": "Get Notification", - "url": "/relayer/1.4.x/api/getNotification" + "url": "/relayer/1.5.x/api/getNotification" }, { "type": "page", "name": "Delete Notification", - "url": "/relayer/1.4.x/api/deleteNotification" + "url": "/relayer/1.5.x/api/deleteNotification" }, { "type": "page", "name": "Update Notification", - "url": "/relayer/1.4.x/api/updateNotification" + "url": "/relayer/1.5.x/api/updateNotification" } ] }, @@ -572,27 +572,27 @@ { "type": "page", "name": "List Signers", - "url": "/relayer/1.4.x/api/listSigners" + "url": "/relayer/1.5.x/api/listSigners" }, { "type": "page", "name": "Create Signer", - "url": "/relayer/1.4.x/api/createSigner" + "url": "/relayer/1.5.x/api/createSigner" }, { "type": "page", "name": "Get Signer", - "url": "/relayer/1.4.x/api/getSigner" + "url": "/relayer/1.5.x/api/getSigner" }, { "type": "page", "name": "Delete Signer", - "url": "/relayer/1.4.x/api/deleteSigner" + "url": "/relayer/1.5.x/api/deleteSigner" }, { "type": "page", "name": "Update Signer", - "url": "/relayer/1.4.x/api/updateSigner" + "url": "/relayer/1.5.x/api/updateSigner" } ] }, @@ -603,17 +603,17 @@ { "type": "page", "name": "Scrape Metrics", - "url": "/relayer/1.4.x/api/scrapeMetrics" + "url": "/relayer/1.5.x/api/scrape_metrics" }, { "type": "page", "name": "List Metrics", - "url": "/relayer/1.4.x/api/listMetrics" + "url": "/relayer/1.5.x/api/list_metrics" }, { "type": "page", "name": "Metric Detail", - "url": "/relayer/1.4.x/api/metricDetail" + "url": "/relayer/1.5.x/api/metric_detail" } ] }, @@ -624,12 +624,12 @@ { "type": "page", "name": "List Networks", - "url": "/relayer/1.4.x/api/listNetworks" + "url": "/relayer/1.5.x/api/listNetworks" }, { "type": "page", "name": "Update Network", - "url": "/relayer/1.4.x/api/updateNetwork" + "url": "/relayer/1.5.x/api/updateNetwork" } ] }, @@ -640,12 +640,12 @@ { "type": "page", "name": "Health", - "url": "/relayer/1.4.x/api/health" + "url": "/relayer/1.5.x/api/health" }, { "type": "page", "name": "Readiness", - "url": "/relayer/1.4.x/api/readiness" + "url": "/relayer/1.5.x/api/readiness" } ] } @@ -654,12 +654,12 @@ { "type": "page", "name": "Project Structure", - "url": "/relayer/1.4.x/structure" + "url": "/relayer/1.5.x/structure" }, { "type": "page", "name": "Project Roadmap", - "url": "/relayer/1.4.x/roadmap" + "url": "/relayer/1.5.x/roadmap" }, { "type": "folder", @@ -667,14 +667,14 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/plugins" + "url": "/relayer/1.5.x/plugins" }, "children": [] }, { "type": "page", "name": "Changelog", - "url": "/relayer/1.4.x/changelog" + "url": "/relayer/1.5.x/changelog" }, { "type": "page", diff --git a/src/navigation/stellar.json b/src/navigation/stellar.json index be1994a8..c06e3b5d 100644 --- a/src/navigation/stellar.json +++ b/src/navigation/stellar.json @@ -165,13 +165,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x" + "url": "/relayer/1.5.x" }, "children": [ { "type": "page", "name": "Quickstart", - "url": "/relayer/1.4.x/quickstart" + "url": "/relayer/1.5.x/quickstart" }, { "type": "folder", @@ -179,30 +179,30 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/configuration" + "url": "/relayer/1.5.x/configuration" }, "children": [ { "type": "page", "name": "Signers", - "url": "/relayer/1.4.x/configuration/signers" + "url": "/relayer/1.5.x/configuration/signers" }, { "type": "page", "name": "Network Configuration", - "url": "/relayer/1.4.x/configuration/network" + "url": "/relayer/1.5.x/configuration/network" }, { "type": "page", "name": "Storage Configuration", - "url": "/relayer/1.4.x/configuration/storage" + "url": "/relayer/1.5.x/configuration/storage" } ] }, { "type": "page", "name": "Stellar Integration", - "url": "/relayer/1.4.x/stellar" + "url": "/relayer/1.5.x/stellar" }, { "type": "folder", @@ -210,7 +210,7 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/api" + "url": "/relayer/1.5.x/api" }, "children": [ { @@ -220,102 +220,102 @@ { "type": "page", "name": "List Relayers", - "url": "/relayer/1.4.x/api/listRelayers" + "url": "/relayer/1.5.x/api/listRelayers" }, { "type": "page", "name": "Create Relayer", - "url": "/relayer/1.4.x/api/createRelayer" + "url": "/relayer/1.5.x/api/createRelayer" }, { "type": "page", "name": "Get Relayer", - "url": "/relayer/1.4.x/api/getRelayer" + "url": "/relayer/1.5.x/api/getRelayer" }, { "type": "page", "name": "Delete Relayer", - "url": "/relayer/1.4.x/api/deleteRelayer" + "url": "/relayer/1.5.x/api/deleteRelayer" }, { "type": "page", "name": "Update Relayer", - "url": "/relayer/1.4.x/api/updateRelayer" + "url": "/relayer/1.5.x/api/updateRelayer" }, { "type": "page", "name": "Get Relayer Balance", - "url": "/relayer/1.4.x/api/getRelayerBalance" + "url": "/relayer/1.5.x/api/getRelayerBalance" }, { "type": "page", "name": "RPC", - "url": "/relayer/1.4.x/api/rpc" + "url": "/relayer/1.5.x/api/rpc" }, { "type": "page", "name": "Sign", - "url": "/relayer/1.4.x/api/sign" + "url": "/relayer/1.5.x/api/sign" }, { "type": "page", "name": "Sign Transaction", - "url": "/relayer/1.4.x/api/signTransaction" + "url": "/relayer/1.5.x/api/signTransaction" }, { "type": "page", "name": "Sign Typed Data", - "url": "/relayer/1.4.x/api/signTypedData" + "url": "/relayer/1.5.x/api/signTypedData" }, { "type": "page", "name": "Get Relayer Status", - "url": "/relayer/1.4.x/api/getRelayerStatus" + "url": "/relayer/1.5.x/api/getRelayerStatus" }, { "type": "page", "name": "Send Transaction", - "url": "/relayer/1.4.x/api/sendTransaction" + "url": "/relayer/1.5.x/api/sendTransaction" }, { "type": "page", "name": "List Transactions", - "url": "/relayer/1.4.x/api/listTransactions" + "url": "/relayer/1.5.x/api/listTransactions" }, { "type": "page", "name": "Get Transaction by Nonce", - "url": "/relayer/1.4.x/api/getTransactionByNonce" + "url": "/relayer/1.5.x/api/getTransactionByNonce" }, { "type": "page", "name": "Delete Pending Transactions", - "url": "/relayer/1.4.x/api/deletePendingTransactions" + "url": "/relayer/1.5.x/api/deletePendingTransactions" }, { "type": "page", "name": "Get Transaction by ID", - "url": "/relayer/1.4.x/api/getTransactionById" + "url": "/relayer/1.5.x/api/getTransactionById" }, { "type": "page", "name": "Replace Transaction", - "url": "/relayer/1.4.x/api/replaceTransaction" + "url": "/relayer/1.5.x/api/replaceTransaction" }, { "type": "page", "name": "Cancel Transaction", - "url": "/relayer/1.4.x/api/cancelTransaction" + "url": "/relayer/1.5.x/api/cancelTransaction" }, { "type": "page", "name": "Sponsored Transaction With Fee Payments", - "url": "/relayer/1.4.x/api/buildSponsoredTransaction" + "url": "/relayer/1.5.x/api/buildSponsoredTransaction" }, { "type": "page", "name": "Sponsored Transaction Fee Estimate", - "url": "/relayer/1.4.x/api/quoteSponsoredTransaction" + "url": "/relayer/1.5.x/api/quoteSponsoredTransaction" } ] }, @@ -326,27 +326,27 @@ { "type": "page", "name": "Call Plugin", - "url": "/relayer/1.4.x/api/callPlugin" + "url": "/relayer/1.5.x/api/callPlugin" }, { "type": "page", "name": "Call PluginGet", - "url": "/relayer/1.4.x/api/callPluginGet" + "url": "/relayer/1.5.x/api/callPluginGet" }, { "type": "page", "name": "Get Plugin", - "url": "/relayer/1.4.x/api/getPlugin" + "url": "/relayer/1.5.x/api/getPlugin" }, { "type": "page", "name": "UpdatePlugin", - "url": "/relayer/1.4.x/api/updatePlugin" + "url": "/relayer/1.5.x/api/updatePlugin" }, { "type": "page", "name": "ListPlugins", - "url": "/relayer/1.4.x/api/listPlugins" + "url": "/relayer/1.5.x/api/listPlugins" } ] }, @@ -357,27 +357,27 @@ { "type": "page", "name": "List Notifications", - "url": "/relayer/1.4.x/api/listNotifications" + "url": "/relayer/1.5.x/api/listNotifications" }, { "type": "page", "name": "Create Notification", - "url": "/relayer/1.4.x/api/createNotification" + "url": "/relayer/1.5.x/api/createNotification" }, { "type": "page", "name": "Get Notification", - "url": "/relayer/1.4.x/api/getNotification" + "url": "/relayer/1.5.x/api/getNotification" }, { "type": "page", "name": "Delete Notification", - "url": "/relayer/1.4.x/api/deleteNotification" + "url": "/relayer/1.5.x/api/deleteNotification" }, { "type": "page", "name": "Update Notification", - "url": "/relayer/1.4.x/api/updateNotification" + "url": "/relayer/1.5.x/api/updateNotification" } ] }, @@ -388,27 +388,27 @@ { "type": "page", "name": "List Signers", - "url": "/relayer/1.4.x/api/listSigners" + "url": "/relayer/1.5.x/api/listSigners" }, { "type": "page", "name": "Create Signer", - "url": "/relayer/1.4.x/api/createSigner" + "url": "/relayer/1.5.x/api/createSigner" }, { "type": "page", "name": "Get Signer", - "url": "/relayer/1.4.x/api/getSigner" + "url": "/relayer/1.5.x/api/getSigner" }, { "type": "page", "name": "Delete Signer", - "url": "/relayer/1.4.x/api/deleteSigner" + "url": "/relayer/1.5.x/api/deleteSigner" }, { "type": "page", "name": "Update Signer", - "url": "/relayer/1.4.x/api/updateSigner" + "url": "/relayer/1.5.x/api/updateSigner" } ] }, @@ -419,17 +419,17 @@ { "type": "page", "name": "Scrape Metrics", - "url": "/relayer/1.4.x/api/scrapeMetrics" + "url": "/relayer/1.5.x/api/scrape_metrics" }, { "type": "page", "name": "List Metrics", - "url": "/relayer/1.4.x/api/listMetrics" + "url": "/relayer/1.5.x/api/list_metrics" }, { "type": "page", "name": "Metric Detail", - "url": "/relayer/1.4.x/api/metricDetail" + "url": "/relayer/1.5.x/api/metric_detail" } ] }, @@ -440,12 +440,12 @@ { "type": "page", "name": "List Networks", - "url": "/relayer/1.4.x/api/listNetworks" + "url": "/relayer/1.5.x/api/listNetworks" }, { "type": "page", "name": "Update Network", - "url": "/relayer/1.4.x/api/updateNetwork" + "url": "/relayer/1.5.x/api/updateNetwork" } ] }, @@ -456,12 +456,12 @@ { "type": "page", "name": "Health", - "url": "/relayer/1.4.x/api/health" + "url": "/relayer/1.5.x/api/health" }, { "type": "page", "name": "Readiness", - "url": "/relayer/1.4.x/api/readiness" + "url": "/relayer/1.5.x/api/readiness" } ] } @@ -470,12 +470,12 @@ { "type": "page", "name": "Project Structure", - "url": "/relayer/1.4.x/structure" + "url": "/relayer/1.5.x/structure" }, { "type": "page", "name": "Project Roadmap", - "url": "/relayer/1.4.x/roadmap" + "url": "/relayer/1.5.x/roadmap" }, { "type": "folder", @@ -483,13 +483,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/plugins" + "url": "/relayer/1.5.x/plugins" }, "children": [ { "type": "page", "name": "Channels", - "url": "/relayer/1.4.x/plugins/channels" + "url": "/relayer/1.5.x/plugins/channels" } ] }, @@ -499,30 +499,30 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/guides" + "url": "/relayer/1.5.x/guides" }, "children": [ { "type": "page", "name": "Stellar Channels Guide", - "url": "/relayer/1.4.x/guides/stellar-channels-guide" + "url": "/relayer/1.5.x/guides/stellar-channels-guide" }, { "type": "page", "name": "Stellar Sponsored Transactions Guide", - "url": "/relayer/1.4.x/guides/stellar-sponsored-transactions-guide" + "url": "/relayer/1.5.x/guides/stellar-sponsored-transactions-guide" }, { "type": "page", "name": "Stellar X402 Facilitator Guide", - "url": "/relayer/1.4.x/guides/stellar-x402-facilitator-guide" + "url": "/relayer/1.5.x/guides/stellar-x402-facilitator-guide" } ] }, { "type": "page", "name": "Changelog", - "url": "/relayer/1.4.x/changelog" + "url": "/relayer/1.5.x/changelog" }, { "type": "page", diff --git a/src/navigation/zama.json b/src/navigation/zama.json index 66481160..fabbae25 100644 --- a/src/navigation/zama.json +++ b/src/navigation/zama.json @@ -64,13 +64,13 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x" + "url": "/relayer/1.5.x" }, "children": [ { "type": "page", "name": "Quickstart", - "url": "/relayer/1.4.x/quickstart" + "url": "/relayer/1.5.x/quickstart" }, { "type": "folder", @@ -78,30 +78,30 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/configuration" + "url": "/relayer/1.5.x/configuration" }, "children": [ { "type": "page", "name": "Signers", - "url": "/relayer/1.4.x/configuration/signers" + "url": "/relayer/1.5.x/configuration/signers" }, { "type": "page", "name": "Network Configuration", - "url": "/relayer/1.4.x/configuration/network" + "url": "/relayer/1.5.x/configuration/network" }, { "type": "page", "name": "Storage Configuration", - "url": "/relayer/1.4.x/configuration/storage" + "url": "/relayer/1.5.x/configuration/storage" } ] }, { "type": "page", "name": "Zama FHEVM Integration", - "url": "/relayer/1.4.x/zama-fhevm" + "url": "/relayer/1.5.x/zama-fhevm" }, { "type": "folder", @@ -109,7 +109,7 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/api" + "url": "/relayer/1.5.x/api" }, "children": [ { @@ -119,92 +119,92 @@ { "type": "page", "name": "List Relayers", - "url": "/relayer/1.4.x/api/listRelayers" + "url": "/relayer/1.5.x/api/listRelayers" }, { "type": "page", "name": "Create Relayer", - "url": "/relayer/1.4.x/api/createRelayer" + "url": "/relayer/1.5.x/api/createRelayer" }, { "type": "page", "name": "Get Relayer", - "url": "/relayer/1.4.x/api/getRelayer" + "url": "/relayer/1.5.x/api/getRelayer" }, { "type": "page", "name": "Delete Relayer", - "url": "/relayer/1.4.x/api/deleteRelayer" + "url": "/relayer/1.5.x/api/deleteRelayer" }, { "type": "page", "name": "Update Relayer", - "url": "/relayer/1.4.x/api/updateRelayer" + "url": "/relayer/1.5.x/api/updateRelayer" }, { "type": "page", "name": "Get Relayer Balance", - "url": "/relayer/1.4.x/api/getRelayerBalance" + "url": "/relayer/1.5.x/api/getRelayerBalance" }, { "type": "page", "name": "RPC", - "url": "/relayer/1.4.x/api/rpc" + "url": "/relayer/1.5.x/api/rpc" }, { "type": "page", "name": "Sign", - "url": "/relayer/1.4.x/api/sign" + "url": "/relayer/1.5.x/api/sign" }, { "type": "page", "name": "Sign Transaction", - "url": "/relayer/1.4.x/api/signTransaction" + "url": "/relayer/1.5.x/api/signTransaction" }, { "type": "page", "name": "Sign Typed Data", - "url": "/relayer/1.4.x/api/signTypedData" + "url": "/relayer/1.5.x/api/signTypedData" }, { "type": "page", "name": "Get Relayer Status", - "url": "/relayer/1.4.x/api/getRelayerStatus" + "url": "/relayer/1.5.x/api/getRelayerStatus" }, { "type": "page", "name": "Send Transaction", - "url": "/relayer/1.4.x/api/sendTransaction" + "url": "/relayer/1.5.x/api/sendTransaction" }, { "type": "page", "name": "List Transactions", - "url": "/relayer/1.4.x/api/listTransactions" + "url": "/relayer/1.5.x/api/listTransactions" }, { "type": "page", "name": "Get Transaction by Nonce", - "url": "/relayer/1.4.x/api/getTransactionByNonce" + "url": "/relayer/1.5.x/api/getTransactionByNonce" }, { "type": "page", "name": "Delete Pending Transactions", - "url": "/relayer/1.4.x/api/deletePendingTransactions" + "url": "/relayer/1.5.x/api/deletePendingTransactions" }, { "type": "page", "name": "Get Transaction by ID", - "url": "/relayer/1.4.x/api/getTransactionById" + "url": "/relayer/1.5.x/api/getTransactionById" }, { "type": "page", "name": "Replace Transaction", - "url": "/relayer/1.4.x/api/replaceTransaction" + "url": "/relayer/1.5.x/api/replaceTransaction" }, { "type": "page", "name": "Cancel Transaction", - "url": "/relayer/1.4.x/api/cancelTransaction" + "url": "/relayer/1.5.x/api/cancelTransaction" } ] }, @@ -215,27 +215,27 @@ { "type": "page", "name": "Call Plugin", - "url": "/relayer/1.4.x/api/callPlugin" + "url": "/relayer/1.5.x/api/callPlugin" }, { "type": "page", "name": "Call PluginGet", - "url": "/relayer/1.4.x/api/callPluginGet" + "url": "/relayer/1.5.x/api/callPluginGet" }, { "type": "page", "name": "Get Plugin", - "url": "/relayer/1.4.x/api/getPlugin" + "url": "/relayer/1.5.x/api/getPlugin" }, { "type": "page", "name": "UpdatePlugin", - "url": "/relayer/1.4.x/api/updatePlugin" + "url": "/relayer/1.5.x/api/updatePlugin" }, { "type": "page", "name": "ListPlugins", - "url": "/relayer/1.4.x/api/listPlugins" + "url": "/relayer/1.5.x/api/listPlugins" } ] }, @@ -246,27 +246,27 @@ { "type": "page", "name": "List Notifications", - "url": "/relayer/1.4.x/api/listNotifications" + "url": "/relayer/1.5.x/api/listNotifications" }, { "type": "page", "name": "Create Notification", - "url": "/relayer/1.4.x/api/createNotification" + "url": "/relayer/1.5.x/api/createNotification" }, { "type": "page", "name": "Get Notification", - "url": "/relayer/1.4.x/api/getNotification" + "url": "/relayer/1.5.x/api/getNotification" }, { "type": "page", "name": "Delete Notification", - "url": "/relayer/1.4.x/api/deleteNotification" + "url": "/relayer/1.5.x/api/deleteNotification" }, { "type": "page", "name": "Update Notification", - "url": "/relayer/1.4.x/api/updateNotification" + "url": "/relayer/1.5.x/api/updateNotification" } ] }, @@ -277,27 +277,27 @@ { "type": "page", "name": "List Signers", - "url": "/relayer/1.4.x/api/listSigners" + "url": "/relayer/1.5.x/api/listSigners" }, { "type": "page", "name": "Create Signer", - "url": "/relayer/1.4.x/api/createSigner" + "url": "/relayer/1.5.x/api/createSigner" }, { "type": "page", "name": "Get Signer", - "url": "/relayer/1.4.x/api/getSigner" + "url": "/relayer/1.5.x/api/getSigner" }, { "type": "page", "name": "Delete Signer", - "url": "/relayer/1.4.x/api/deleteSigner" + "url": "/relayer/1.5.x/api/deleteSigner" }, { "type": "page", "name": "Update Signer", - "url": "/relayer/1.4.x/api/updateSigner" + "url": "/relayer/1.5.x/api/updateSigner" } ] }, @@ -308,17 +308,17 @@ { "type": "page", "name": "Scrape Metrics", - "url": "/relayer/1.4.x/api/scrapeMetrics" + "url": "/relayer/1.5.x/api/scrape_metrics" }, { "type": "page", "name": "List Metrics", - "url": "/relayer/1.4.x/api/listMetrics" + "url": "/relayer/1.5.x/api/list_metrics" }, { "type": "page", "name": "Metric Detail", - "url": "/relayer/1.4.x/api/metricDetail" + "url": "/relayer/1.5.x/api/metric_detail" } ] }, @@ -329,12 +329,12 @@ { "type": "page", "name": "List Networks", - "url": "/relayer/1.4.x/api/listNetworks" + "url": "/relayer/1.5.x/api/listNetworks" }, { "type": "page", "name": "Update Network", - "url": "/relayer/1.4.x/api/updateNetwork" + "url": "/relayer/1.5.x/api/updateNetwork" } ] }, @@ -345,12 +345,12 @@ { "type": "page", "name": "Health", - "url": "/relayer/1.4.x/api/health" + "url": "/relayer/1.5.x/api/health" }, { "type": "page", "name": "Readiness", - "url": "/relayer/1.4.x/api/readiness" + "url": "/relayer/1.5.x/api/readiness" } ] } @@ -359,17 +359,17 @@ { "type": "page", "name": "Project Structure", - "url": "/relayer/1.4.x/structure" + "url": "/relayer/1.5.x/structure" }, { "type": "page", "name": "Project Roadmap", - "url": "/relayer/1.4.x/roadmap" + "url": "/relayer/1.5.x/roadmap" }, { "type": "page", "name": "Plugins", - "url": "/relayer/1.4.x/plugins" + "url": "/relayer/1.5.x/plugins" }, { "type": "folder", @@ -377,20 +377,20 @@ "index": { "type": "page", "name": "Overview", - "url": "/relayer/1.4.x/guides" + "url": "/relayer/1.5.x/guides" }, "children": [ { "type": "page", "name": "Zama FHEVM Counter Guide", - "url": "/relayer/1.4.x/guides/zama-fhevm-counter-guide" + "url": "/relayer/1.5.x/guides/zama-fhevm-counter-guide" } ] }, { "type": "page", "name": "Changelog", - "url": "/relayer/1.4.x/changelog" + "url": "/relayer/1.5.x/changelog" }, { "type": "page",