{"id":29089604,"url":"https://github.com/openzeppelin/openzeppelin-relayer","last_synced_at":"2025-06-28T04:04:13.403Z","repository":{"id":286656389,"uuid":"904431879","full_name":"OpenZeppelin/openzeppelin-relayer","owner":"OpenZeppelin","description":"OpenZeppelin Relayer","archived":false,"fork":false,"pushed_at":"2025-06-27T18:16:35.000Z","size":2330,"stargazers_count":62,"open_issues_count":13,"forks_count":16,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-06-27T18:23:55.363Z","etag":null,"topics":["blockchain","openzeppelin","relayer","rust","tools"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OpenZeppelin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-12-16T21:57:44.000Z","updated_at":"2025-06-27T15:49:59.000Z","dependencies_parsed_at":"2025-04-28T13:35:48.856Z","dependency_job_id":"e60504d4-6732-414b-bec1-baafb509a548","html_url":"https://github.com/OpenZeppelin/openzeppelin-relayer","commit_stats":null,"previous_names":["openzeppelin/openzeppelin-relayer"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/OpenZeppelin/openzeppelin-relayer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenZeppelin%2Fopenzeppelin-relayer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenZeppelin%2Fopenzeppelin-relayer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenZeppelin%2Fopenzeppelin-relayer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenZeppelin%2Fopenzeppelin-relayer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OpenZeppelin","download_url":"https://codeload.github.com/OpenZeppelin/openzeppelin-relayer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenZeppelin%2Fopenzeppelin-relayer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262371684,"owners_count":23300595,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","openzeppelin","relayer","rust","tools"],"created_at":"2025-06-28T04:04:12.100Z","updated_at":"2025-06-28T04:04:13.368Z","avatar_url":"https://github.com/OpenZeppelin.png","language":"Rust","readme":"# OpenZeppelin Relayer\n\n[![codecov](https://codecov.io/gh/OpenZeppelin/openzeppelin-relayer/graph/badge.svg?token=HKHIQNSJ6H)](https://codecov.io/gh/OpenZeppelin/openzeppelin-relayer)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/OpenZeppelin/openzeppelin-relayer/badge)](https://api.securityscorecards.dev/projects/github.com/OpenZeppelin/openzeppelin-relayer)\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)\n[![CLA Assistant](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/cla.yml/badge.svg)](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/cla.yml)\n[![CI](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/ci.yaml/badge.svg)](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/ci.yaml)\n[![Release Workflow](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/release-please.yml/badge.svg)](https://github.com/OpenZeppelin/openzeppelin-relayer/actions/workflows/release-please.yml)\n\n\n\u003e :warning: This software is in alpha. Use in production environments at your own risk.\n\nThis relayer service enables interaction with blockchain networks through transaction submissions. It offers multi-chain support and an extensible architecture for adding new chains.\n\n[User Docs](https://docs.openzeppelin.com/relayer/) | [Quickstart](https://docs.openzeppelin.com/relayer/quickstart)\n\n## Features\n\n- **Multi-Chain Support**: Interact with multiple blockchain networks, including Solana and EVM-based chains.\n- **Transaction Relaying**: Submit transactions to supported blockchain networks efficiently.\n- **Transaction Signing**: Securely sign transactions using configurable key management.\n- **Transaction Fee Estimation**: Estimate transaction fees for better cost management.\n- **Solana Gasless Transactions**: Support for gasless transactions on Solana, enabling users to interact without transaction fees.\n- **Transaction Nonce Management**: Handle nonce management to ensure transaction order.\n- **Transaction Status Monitoring**: Track the status of submitted transactions.\n- **SDK Integration**: Easily interact with the relayer through our companion JavaScript/TypeScript SDK.\n- **Extensible Architecture**: Easily add support for new blockchain networks.\n- **Configurable Network Policies**: Define and enforce network-specific policies for transaction processing.\n- **Metrics and Observability**: Monitor application performance using Prometheus and Grafana.\n- **Docker Support**: Deploy the relayer using Docker for both development and production environments.\n- **Relayer Plugins**: Extend the relayer functionality through TypeScript functions.\n\n## Supported networks\n\n- Solana\n- EVM (🚧 Partial support)\n- Stellar (🚧 Partial support)\n\n\u003e For details about current development status and upcoming features, check our [Project Roadmap](https://docs.openzeppelin.com/relayer/roadmap).\n\n## For users\n\n### Installation\n\nView the [Installation](https://docs.openzeppelin.com/relayer#getting_started) documentation for detailed information. For a quicker introduction, check out the [Quickstart](https://docs.openzeppelin.com/relayer/quickstart) guide.\n\n### Usage\n\nView the [Usage](https://docs.openzeppelin.com/relayer#running_the_relayer) documentation for more information.\n\n### Examples\n\nThe repository includes several ready-to-use examples to help you get started with different configurations:\n\n| Example                                                      | Description                               |\n| ------------------------------------------------------------ | ----------------------------------------- |\n| [`basic-example`](./examples/basic-example/)                 | Simple setup with Redis                   |\n| [`basic-example-logging`](./examples/basic-example-logging/) | Configuration with file-based logging     |\n| [`basic-example-metrics`](./examples/basic-example-metrics/) | Setup with Prometheus and Grafana metrics |\n| [`vault-secret-signer`](./examples/vault-secret-signer/) | Using HashiCorp Vault for key management |\n| [`vault-transit-signer`](./examples/vault-transit-signer/) | Using Vault Transit for secure signing |\n| [`evm-turnkey-signer`](./examples/evm-turnkey-signer/) | Using Turnkey Signer for EVM secure signing |\n| [`solana-turnkey-signer`](./examples/solana-turnkey-signer/) | Using Turnkey Signer for Solana secure signing |\n| [`solana-google-cloud-kms-signer`](./examples/solana-google-cloud-kms-signer/) | Using Google Cloud KMS Signer for Solana secure signing |\n\n\nEach example includes:\n\n- A README with step-by-step instructions\n- Docker Compose configuration\n- Required configuration files\n\n## For Developers\n\n### Technical Overview\n\nThe OpenZeppelin Relayer is built using Actix-web and provides HTTP endpoints for transaction submission, in-memory repository implementations, and configurable network policies.\n\nThe following diagram illustrates the architecture of the relayer service, highlighting key components and their interactions.\n\n```mermaid\n%%{init: {\n    'theme': 'base',\n    'themeVariables': {\n        'background': '#ffffff',\n        'mainBkg': '#ffffff',\n        'primaryBorderColor': '#cccccc'\n    }\n}}%%\nflowchart TB\n    subgraph \"Clients\"\n        client[API/SDK]\n    end\n\n    subgraph \"OpenZeppelin Relayer\"\n        subgraph \"API Layer\"\n            api[API Routes \u0026 Controllers]\n            middleware[Middleware]\n            plugins[Relayer Plugins]\n        end\n\n        subgraph \"Domain Layer\"\n            domain[Domain Logic]\n            relayer[Relayer Services]\n            policies[Policy Enforcement]\n        end\n\n        subgraph \"Infrastructure\"\n            repositories[Repositories]\n            jobs[Job Queue System]\n            signer[Signer Services]\n            provider[Network Providers]\n        end\n\n        subgraph \"Services Layer\"\n            transaction[Transaction Services]\n            vault[Vault Services]\n            webhook[Webhook Notifications]\n            monitoring[Monitoring \u0026 Metrics]\n        end\n\n        subgraph \"Configuration\"\n            config_files[Config Files]\n            env_vars[Environment Variables]\n        end\n    end\n\n    subgraph \"External Systems\"\n        blockchain[Blockchain Networks]\n        redis[Redis]\n        vault_ext[HashiCorp Vault]\n        metrics[Prometheus/Grafana]\n        notification[Notification Services]\n    end\n\n    %% Client connections\n    client -- \"HTTP Requests\" --\u003e api\n\n    %% API Layer connections\n    api -- \"Processes requests\" --\u003e middleware\n    middleware -- \"Validates \u0026 routes\" --\u003e domain\n    middleware -- \"Invokes\" --\u003e plugins\n\n    %% Domain Layer connections\n    domain -- \"Uses\" --\u003e relayer\n    domain -- \"Enforces\" --\u003e policies\n    relayer -- \"Processes\" --\u003e transaction\n    plugins -- \"Uses\" --\u003e relayer\n\n    %% Services Layer connections\n    transaction -- \"Signs with\" --\u003e signer\n    transaction -- \"Connects via\" --\u003e provider\n    transaction -- \"Queues jobs\" --\u003e jobs\n    webhook -- \"Notifies\" --\u003e notification\n    monitoring -- \"Collects\" --\u003e metrics\n    signer -- \"May use\" --\u003e vault\n\n    %% Infrastructure connections\n    repositories -- \"Stores data\" --\u003e redis\n    jobs -- \"Processes async\" --\u003e redis\n    vault -- \"Secrets management\" --\u003e vault_ext\n    provider -- \"Interacts with\" --\u003e blockchain\n\n    %% Configuration connections\n    config_files -- \"Configures\" --\u003e domain\n    env_vars -- \"Configures\" --\u003e domain\n\n    %% Styling\n    classDef apiClass fill:#f9f,stroke:#333,stroke-width:2px\n    classDef domainClass fill:#bbf,stroke:#333,stroke-width:2px\n    classDef infraClass fill:#bfb,stroke:#333,stroke-width:2px\n    classDef serviceClass fill:#fbf,stroke:#333,stroke-width:2px\n    classDef configClass fill:#fbb,stroke:#333,stroke-width:2px\n    classDef externalClass fill:#ddd,stroke:#333,stroke-width:1px\n\n    class api,middleware,plugins apiClass\n    class domain,relayer,policies domainClass\n    class repositories,jobs,signer,provider infraClass\n    class transaction,vault,webhook,monitoring serviceClass\n    class config_files,env_vars configClass\n    class blockchain,redis,vault_ext,metrics,notification externalClass\n```\n\n### Project Structure\n\nThe project follows a standard Rust project layout:\n\n```sh\nopenzeppelin-relayer/\n├── src/\n│   ├── api/              # Route and controllers logic\n│   ├── bootstrap/        # Service initialization logic\n│   ├── config/           # Configuration logic\n│   ├── constants/        # Constant values used in the system\n│   ├── domain/           # Domain logic\n│   ├── jobs/             # Asynchronous processing logic (queueing)\n│   ├── logging/          # Logs File rotation logic\n│   ├── metrics/          # Metrics logic\n│   ├── models/           # Data structures and types\n│   ├── repositories/     # Configuration storage\n│   ├── services/         # Services logic\n│   ├── plugins/          # Relayer plugins\n│   └── utils/            # Helper functions\n│\n├── config/               # Configuration files\n├── tests/                # Integration tests\n├── docs/                 # Documentation\n├── scripts/              # Utility scripts\n├── examples/             # Configuration examples\n├── helpers/              # Rust helper scripts\n└── ... other root files (Cargo.toml, README.md, etc.)\n```\n\n### Prerequisites\n\n- Docker\n- Rust\n- Redis\n- [Sodium](https://doc.libsodium.org/)\n- [Node.js + Typescript + ts-node](https://nodejs.org/) (v20+) for plugins.\n\n### Setup\n\nTo get started, clone the repository:\n\n```sh\ngit clone https://github.com/openzeppelin/openzeppelin-relayer\ncd openzeppelin-relayer\n```\n\nRun the following commands to install pre-commit hooks:\n\n- Install pre-commit hooks:\n\n  ```bash\n  pip install pre-commit\n  pre-commit install --install-hooks -t commit-msg -t pre-commit -t pre-push\n  ```\n\n  \u003e :warning: If you encounter issues with pip, consider using [pipx](https://pipx.pypa.io/stable/installation/) for a global installation.\n\n- Install the toolchain:\n\n  ```sh\n  rustup component add rustfmt\n  ```\n\n### Install Sodium\n\n- Install stable libsodium version from [here](https://download.libsodium.org/libsodium/releases/).\n- Follow steps to install libsodium from the [libsodium installation guide](https://doc.libsodium.org/installation).\n\n### Install Node.js\n\n- Install Node.js from [here](https://nodejs.org/).\n- Install Typescript and ts-node:\n\n  ```bash\n  npm install -g typescript ts-node\n  ```\n\n### Run Tests\n\nTo run tests, use the following commands:\n\n```bash\ncargo test\ncargo test properties\ncargo test integration\n```\n\n### Config files\n\nCreate `config/config.json` file. You can use `config/config.example.json` as a starting point:\n\n```sh\ncp config/config.example.json config/config.json\n```\n\nRefer to the [Configuration References](https://docs.openzeppelin.com/relayer#configuration_references) section for a complete list of configuration options.\n\nCreate `.env` with correct values according to your needs from `.env.example` file as a starting point:\n\n```sh\ncp .env.example .env\n```\n\n### Creating a Signer\n\nTo create a new signer keystore, use the provided key generation tool:\n\n```sh\ncargo run --example create_key -- \\\n    --password DEFINE_YOUR_PASSWORD \\\n    --output-dir config/keys \\\n    --filename local-signer.json\n```\n\nThen update the `KEYSTORE_PASSPHRASE` field in your `.env` file with the password you used in the key creation example.\n\nThe tool supports the following options:\n\n- `--password`: Required. Must contain at least:\n  - 12 characters\n  - One uppercase letter\n  - One lowercase letter\n  - One number\n  - One special character\n- `--output-dir`: Directory for the keystore file (creates if not exists)\n- `--filename`: Optional. Uses timestamp-based name if not provided\n- `--force`: Optional. Allows overwriting existing files\n\nExample with all options:\n\n```sh\ncargo run --example create_key -- \\\n    --password \"YourSecurePassword123!\" \\\n    --output-dir config/keys \\\n    --filename local-signer.json \\\n    --force\n```\n\n### Configure Webhook URL\n\n`/config/config.json` file is partially pre-configured. You need to specify the webhook URL that will receive updates from the relayer service.\n\nFor simplicity, visit [Webhook.site](https://webhook.site), copy your unique URL, and then update the notifications[0].url field in `config/config.json` with this value.\n\n### Configure Webhook Signing Key\n\nTo sign webhook notification payloads, populate the `WEBHOOK_SIGNING_KEY` entry in the `.env` file.\n\nFor development purposes, you can generate the signing key using:\n\n```bash\ncargo run --example generate_uuid\n```\n\n\u003e Note: Alternatively, you can use any online UUID generator.\n\nCopy the generated UUID and update the `WEBHOOK_SIGNING_KEY` entry in the `.env` file.\n\n### Configure API Key\n\nGenerate an API key signing key for development purposes using:\n\n```bash\ncargo run --example generate_uuid\n# or run this command to generate a UUID\n# uuidgen\n```\n\n\u003e Note: Alternatively, you can use any online UUID generator.\n\nCopy the generated UUID and update the `API_KEY` entry in the `.env` file.\n\n### Starting Redis manually (without docker compose)\n\nYou can start Redis in one of two ways:\n\nA. _Expose to Host Only_\n\nUse this if only your host machine needs direct access to Redis (e.g., for local testing with redis-cli).\n\n```bash\ndocker run -d \\\n  --name redis \\\n  -p 6379:6379 \\\n  redis:latest\n```\n\n`-p 6379:6379` binds the container port to your localhost on the same port.\n\nB. _Connect with Other Containers via Custom Network_\n\nUse this if relayer container need to talk to Redis.\n\n```sh\ndocker run -d \\\n  --name redis \\\n  --network relayer-net \\\n  redis:latest\n```\n\n`--network relayer-net` attaches Redis to the network you created in step 1.\n\n\u003e Note: Make sure to create a dedicated network for the relayer and Redis containers to communicate. You can create a network using the following command `docker network create relayer-net`.\n\n## Configure a plugin\n\nIn order to create and run plugins please follow the [Plugins README](./plugins/README.md) file instructions.\n\n## Running the relayer locally\n\nInstall dependencies:\n\n```sh\ncargo build\n```\n\nRun relayer:\n\n```sh\ncargo run\n```\n\n## Test the Relayer\n\nThe service is available at `http://localhost:8080/api/v1`\n\n```bash\ncurl -X GET http://localhost:8080/api/v1/relayers \\\n  -H \"Content-Type: application/json\" \\\n  -H \"AUTHORIZATION: Bearer YOUR_API_KEY\"\n```\n\n### Running services with docker compose\n\nIf you use `docker-compose` over `docker compose` please read [Compose V1 vs Compose V2](#compose-v1-vs-compose-v2) section.\n\nBased on your `.env` file, docker compose may or may not start the metrics server ( within relayer app container), prometheus and grafana.\n\n\u003e Note: If you want to start the metrics server, prometheus and grafana, make sure to set `METRICS_ENABLED=true` in your `.env` file.\n\nIf you want to start the services using [make](./Makefile.toml) target, you can use the following command to start the services:\n\n```sh\ncargo make docker-compose-up\n```\n\n\u003e Note: By default docker compose command uses Dockerfile.development to build the image. If you want to use Dockerfile.production, you can set: `DOCKERFILE=Dockerfile.production` before running `cargo make docker-compose-up`.\n\nWe have a [make](./Makefile.toml) target to start the services with docker compose with metrics profile based on your `.env` file. For metrics server you will need to make sure `METRICS_ENABLED=true` is set in your `.env` file. If you want to start the services directly using docker compose, you can use the following command:\n\n```sh\n# without metrics profile ( METRICS_ENABLED=false by default )\n# will only start the relayer app container and redis container\ndocker compose up -d\n# or with metrics profile ( METRICS_ENABLED=true in .env file )\n# docker compose --profile metrics up -d\n```\n\nMake sure the containers are running without any restarts/issues:\n\n```sh\ndocker ps -a\n```\n\nTo stop the services, run the following command:\n\n```sh\ncargo make docker-compose-down\n# or\n# using docker compose without make target\n# without metrics profile\n# docker compose down\n# or with metrics profile\n# docker compose --profile metrics down\n```\n\nTo check the logs of the services/containers, run the following command:\n\n```sh\ndocker compose logs -f\n```\n\n## Compose V1 vs Compose V2\n\n- If you use `docker-compose` command, it will use Compose V1 by default which is deprecated. We recommend using `docker compose` command.\n- You can read more about the differences between Compose V1 and Compose V2 [here](https://docs.docker.com/compose/intro/history/).\n- You can also check out the issue [here](https://github.com/OpenZeppelin/openzeppelin-relayer/issues/64).\n\n## Documentation\n\n- Pre-requisites:\n\n  - You need `antora` `site-generator` and `mermaid` extension to generate the documentation.\n\n  - You can directly install these dependencies by running `cd docs \u0026\u0026 npm i --include dev`. If you want to install them manually, you can follow the steps mentioned below.\n  - Install `antora` locally, you can follow the steps mentioned [here](https://docs.antora.org/antora/latest/install/install-antora/#install-dir), if you already have you can skip this step.\n    \u003e Note: If you want to install globally, you can run:\n    \u003e\n    \u003e `npm install -g @antora/cli@3.1 @antora/site-generator@3.1 @sntke/antora-mermaid-extension`\n  - Verify the installation by running `antora --version` or by running `npx antora --version` if you installed it locally.\n\n- To generate documentation locally, run the following command:\n\n  ```sh\n  cargo make rust-antora\n  ```\n\n- Site will be generated in `docs/build/site/openzeppelin_relayer/\u003cversion\u003e/` directory.\n\n- To view the documentation, open the `docs/build/site/openzeppelin_relayer/\u003cversion\u003e/index.html` in your browser.\n\n## Observability\n\n- Currently we support logs and metrics ( uses prometheus and grafana) for the relayer server.\n\n### Logs\n\n- For logs, our app defaults to writing logs to stdout/console. You can also configure it to write logs to a file path by setting `LOG_MODE` to `file`. See [docker compose file](./docker-compose.yaml) for more details.\n\n### Metrics\n\n- Metrics server is started on port `8081` by default, which collects the metrics from the relayer server.\n\n  - Exposes list of metrics on the `/metrics` endpoint.\n\n    \u003e Note: By default, we don't map this port to the host machine. If you want to access the metrics server from the host machine, you can update the `docker-compose.yaml` file.\n\n  - Exposes `/debug/metrics/scrape` endpoint for prometheus to scrape metrics.\n\n- To view prometheus metrics in a UI, you can use `http://localhost:9090` on your browser.\n\n- To view grafana dashboard, you can use `http://localhost:3000` on your browser.\n\n## Contributing\n\nWe welcome contributions from the community! Here's how you can get involved:\n\n1. Fork the repository\n2. Create your feature branch\n3. Commit your changes\n4. Push to the branch\n5. Create a Pull Request\n\nIf you are looking for a good place to start, find a good first issue [here](https://github.com/openzeppelin/openzeppelin-relayer/issues?q=is%3Aissue%20is%3Aopen%20label%3Agood-first-issue).\n\nYou can open an issue for a [bug report](https://github.com/openzeppelin/openzeppelin-relayer/issues/new?assignees=\u0026labels=T-bug%2CS-needs-triage\u0026projects=\u0026template=bug.yml), [feature request](https://github.com/openzeppelin/openzeppelin-relayer/issues/new?assignees=\u0026labels=T-feature%2CS-needs-triage\u0026projects=\u0026template=feature.yml), or [documentation request](https://github.com/openzeppelin/openzeppelin-relayer/issues/new?assignees=\u0026labels=T-documentation%2CS-needs-triage\u0026projects=\u0026template=docs.yml).\n\nYou can find more details in our [Contributing](CONTRIBUTING.md) guide.\n\nPlease read our [Code of Conduct](CODE_OF_CONDUCT.md) and check the [Security Policy](SECURITY.md) for reporting vulnerabilities.\n\n## License\n\nThis project is licensed under the GNU Affero General Public License v3.0 - see the [LICENSE](LICENSE) file for details.\n\n## Security\n\nFor security concerns, please refer to our [Security Policy](SECURITY.md).\n\n## Get Help\n\nIf you have any questions, first see if the answer to your question can be found in the [User Documentation](https://docs.openzeppelin.com/relayer/).\n\nIf the answer is not there:\n\n- Join the [Telegram](https://t.me/openzeppelin_tg/2) to get help, or\n- Open an issue with [the bug](https://github.com/openzeppelin/openzeppelin-relayer/issues/new?assignees=\u0026labels=T-bug%2CS-needs-triage\u0026projects=\u0026template=bug.yml)\n\nWe encourage you to reach out with any questions or feedback.\n\n## Maintainers\n\nSee [CODEOWNERS](CODEOWNERS) file for the list of project maintainers.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenzeppelin%2Fopenzeppelin-relayer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenzeppelin%2Fopenzeppelin-relayer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenzeppelin%2Fopenzeppelin-relayer/lists"}