{"id":22072534,"url":"https://github.com/broxus/octusbridge-relay","last_synced_at":"2025-07-24T11:30:39.173Z","repository":{"id":42014773,"uuid":"327648186","full_name":"broxus/octusbridge-relay","owner":"broxus","description":"Octus Bridge relay node that validates transfers across multiple blockchains. Supports all EVM based networks.","archived":false,"fork":false,"pushed_at":"2024-11-30T12:00:59.000Z","size":3273,"stargazers_count":22,"open_issues_count":0,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-11-30T12:26:00.736Z","etag":null,"topics":["bnb","bridge","defi","eth","everscale","fantom-opera","octusbridge","polygon"],"latest_commit_sha":null,"homepage":"https://octusbridge.io","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/broxus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-07T15:16:52.000Z","updated_at":"2024-11-04T17:29:34.000Z","dependencies_parsed_at":"2024-01-09T20:43:46.642Z","dependency_job_id":"6193108c-488f-443f-8e22-65a763c811ae","html_url":"https://github.com/broxus/octusbridge-relay","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broxus%2Foctusbridge-relay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broxus%2Foctusbridge-relay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broxus%2Foctusbridge-relay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/broxus%2Foctusbridge-relay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/broxus","download_url":"https://codeload.github.com/broxus/octusbridge-relay/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227432007,"owners_count":17775893,"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":["bnb","bridge","defi","eth","everscale","fantom-opera","octusbridge","polygon"],"created_at":"2024-11-30T21:13:34.533Z","updated_at":"2024-11-30T21:13:35.128Z","avatar_url":"https://github.com/broxus.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ch3 align=\"center\"\u003eOctus Bridge relay\u003c/h3\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ca href=\"/LICENSE\"\u003e\n            \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/broxus/octusbridge-relay\" /\u003e\n        \u003c/a\u003e\n    \u003c/p\u003e\n\u003c/p\u003e\n\n### Runtime requirements\n\n- CPU: 8 cores, 2 GHz\n- RAM: 16 GB\n- Storage: 200 GB fast SSD\n- Network: 100 MBit/s\n\n### How to run\n\nTo simplify the build and create some semblance of standardization in this repository\nthere is a set of scripts for configuring the relay.\n\nNOTE: scripts are prepared and tested on **Ubuntu 20.04**. You may need to modify them a little for other distros.\n\n1. ##### Setup relay service\n\n   - Native version (a little more complex way, but gives some performance gain and reduces the load):\n     ```bash\n     ./scripts/setup.sh -t native\n     ```\n   - **OR** docker version (the simplest way, but adds some overhead):\n     ```bash\n     ./scripts/setup.sh -t docker\n     ```\n     Not recommended for machines with lower specs than required\n\n   \u003e At this stage, a systemd service `relay` is created. Configs and keys will be in `/etc/relay` and\n   \u003e Everscale node DB will be in `/var/db/relay`.\n\n   **Do not start this service yet!**\n\n2. ##### Prepare config\n\n   Either add the environment variables to the `[Service]` section of unit file.\n   It is located at `/etc/systemd/system/relay.service`.\n\n   \u003e This method is recommended because you can just make a backup of `/etc/relay` and\n   \u003e not be afraid for it's safety, all keys in it are encrypted\n\n   ```unit file (systemd)\n   [Service]\n   ...\n   Environment=RELAY_MASTER_KEY=stub-master-key\n   Environment=RELAY_STAKER_ADDRESS=your-staker-address\n   Environment=ETH_MAINNET_URL=eth-http-rpc-endpoint\n   Environment=POLYGON_URL=polygon-http-rpc-endpoint\n   ...\n   ```\n\n   Or simply replace the `${..}` parameters in the config. It is located at `/etc/relay/config.yaml`.\n\n3. ##### Generate keys\n\n   ```bash\n     ./scripts/generate.sh -t docker # or `native`, depends on your installation type\n   ```\n\n   \u003e if you already have seed phrases that you want to import, then add the `-i` flag\n\n   This script will print unencrypted data. **Be sure to write it down somewhere! And also make a backup of the `/etc/relay` folder!**\n\n4. ##### Link relay keys\n\n   Use ETH address and Everscale public key from the previous step to link this relay setup\n   with your staker address at https://octusbridge.io/relayers/create. When you start the linking process go to step 5 and start the relay. It will begin to confirm the public key and address on the air.\n   It may take some time to sync at first (~40 minutes).\n\n   \u003e During linking you will need to send at least **0.05 ETH** to your relay ETH address so that the relay can confirm his ownership.\n   \u003e\n   \u003e If you think that this is a lot or if the gas price is more than 300 GWEI now,\n   \u003e then you can change the values in the config.\n\n5. ##### Enable and start relay service\n\n   ```bash\n   systemctl enable relay\n   systemctl start relay\n\n   # Optionally check if it is running normally. It will take some time to start.\n   # Relay is fully operational when it prints `Initialized relay`\n   journalctl -fu relay\n   ```\n\n   Relay will be running on UDP port `30000` by default, so make sure that this port is not blocked by firewall.\n\n   NOTE: docker installation uses port 30000 in unit file, so you may need to update the service if you decide to change it.\n   All environment variables must also be passed to container (e.g. `-e RELAY_MASTER_KEY`).\n\n   \u003e Relay has a built-in Prometheus metrics exporter which is configured in the `metrics_settings` section of the config.\n   \u003e By default, metrics are available at `http://127.0.0.1:10000/`\n   \u003e\n   \u003e \u003cdetails\u003e\u003csummary\u003e\u003cb\u003eResponse example:\u003c/b\u003e\u003c/summary\u003e\n   \u003e \u003cp\u003e\n   \u003e\n   \u003e ```\n   \u003e eth_subscriber_last_processed_block{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"56\"} 13790361\n   \u003e eth_subscriber_pending_confirmation_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"56\"} 0\n   \u003e eth_subscriber_last_processed_block{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"137\"} 22954791\n   \u003e eth_subscriber_pending_confirmation_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"137\"} 0\n   \u003e eth_subscriber_last_processed_block{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"250\"} 26020394\n   \u003e eth_subscriber_pending_confirmation_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"250\"} 0\n   \u003e eth_subscriber_last_processed_block{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"1\"} 13875962\n   \u003e eth_subscriber_pending_confirmation_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",chain_id=\"1\"} 0\n   \u003e sol_subscriber_unrecognized_proposals_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e ton_subscriber_ready{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 1\n   \u003e ton_subscriber_current_utime{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 1640456699\n   \u003e ton_subscriber_time_diff{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 3\n   \u003e ton_subscriber_shard_client_time_diff{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 7\n   \u003e ton_subscriber_mc_block_seqno{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 13426600\n   \u003e ton_subscriber_shard_client_mc_block_seqno{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 13426600\n   \u003e ton_subscriber_pending_message_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e bridge_pending_eth_ton_event_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e bridge_pending_ton_eth_event_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e bridge_pending_sol_ton_event_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e bridge_pending_ton_sol_event_count{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 0\n   \u003e bridge_total_active_eth_ton_event_configurations{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 86\n   \u003e bridge_total_active_ton_eth_event_configurations{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 11\n   \u003e bridge_total_active_sol_ton_event_configurations{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 1\n   \u003e bridge_total_active_ton_sol_event_configurations{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 1\n   \u003e staking_user_data_tokens_balance{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 100000000000000\n   \u003e staking_current_relay_round{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\"} 13\n   \u003e staking_elections_start_time{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 1640380268\n   \u003e staking_elections_end_time{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 1640553068\n   \u003e staking_elections_status{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 1\n   \u003e staking_ignore_elections{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 0\n   \u003e staking_participates_in_round{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 1\n   \u003e staking_elected{staker=\"0:7a9701bede7f86bf039aba200c1bb421a388bbb4b0580bfaeafa66f908d2b246\",round_num=\"13\"} 1\n   \u003e ```\n   \u003e\n   \u003e \u003c/p\u003e\n   \u003e \u003c/details\u003e\n\n### Example config\n\n\u003e NOTE: The syntax `${VAR}` can also be used everywhere in config. It will be\n\u003e replaced by the value of the environment variable `VAR`.\n\n```yaml\n---\n# Keystore password\nmaster_password: \"${RELAY_MASTER_KEY}\"\n# Your address from which you specified keys\nstaker_address: \"${RELAY_STAKER_ADDRESS}\"\nbridge_settings:\n  # Keystore data path\n  keys_path: \"/etc/relay/keys.json\"\n  # Bridge contract address\n  bridge_address: \"0:1d51fb47566d0d283ebbf83c641c01ebebaad6c3cec55895b0074b802036094e\"\n  # If set, relay will not participate in elections. Default: false\n  ignore_elections: false\n  # Shard split depth\n  shard_split_depth: 10\n  # Ton token metadata endpoint base url\n  token_meta_base_url: \"https://ton-tokens-api.meta\"\n  # Solana network config\n  sol_network:\n    # Public endpoint\n    endpoints: [\"https://api.mainnet-beta.solana.com\"]\n    # Events polling interval\n    poll_interval_sec: 30\n  # EVM network configs\n  evm_networks:\n    # Ethereum\n    - chain_id: 1\n      # RPC node HTTP endpoint\n      endpoint: \"${ETH_MAINNET_URL}\"\n      # Timeout, used for simple getter requests. Default: 10\n      get_timeout_sec: 10\n      # Timeout, used for processing eth_getLogs response. Default: 120\n      blocks_processing_timeout_sec: 120\n      # Max simultaneous connection count. Default: 10\n      pool_size: 10\n      # Idle polling interval. Default: 60\n      poll_interval_sec: 60\n      # Maximum blocks range for getLogs request\n      max_block_range: 1000\n    # Smart Chain\n    - chain_id: 56\n      # Public endpoint (see https://docs.bscscan.com/misc-tools-and-utilities/public-rpc-nodes)\n      endpoint: https://bsc-dataseed1.binance.org\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      max_block_range: 1000\n    # Fantom Opera\n    - chain_id: 250\n      # Public endpoint\n      endpoint: https://rpc.ftm.tools\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      max_block_range: 1000\n    # Polygon\n    - chain_id: 137\n      endpoint: \"${POLYGON_URL}\"\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      max_block_range: 1000\n    # Milkomeda\n    - chain_id: 2001\n      endpoint: https://rpc-mainnet-cardano-evm.c1.milkomeda.com\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      maximum_failed_responses_time_sec: 604800\n      max_block_range: 1000\n    # Avalanche Network\n    - chain_id: 43114\n      endpoint: https://api.avax.network/ext/bc/C/rpc\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      maximum_failed_responses_time_sec: 604800\n      max_block_range: 1000\n    # BlockPI\n    - chain_id: 8217\n      endpoint: https://klaytn.blockpi.network/v1/rpc/public\n      get_timeout_sec: 10\n      pool_size: 10\n      poll_interval_sec: 60\n      maximum_failed_responses_time_sec: 604800\n      max_block_range: 5000\nnode_settings:\n  # Root directory for relay DB. Default: \"./db\"\n  db_path: \"/var/db/relay\"\n  # UDP port, used for ADNL node. Default: 30303\n  adnl_port: 30000\n  # Path to temporary ADNL keys.\n  # NOTE: Will be generated if it was not there.\n  # Default: \"./adnl-keys.json\"\n  temp_keys_path: \"/etc/relay/adnl-keys.json\"\n  db_options:\n    rocksdb_lru_capacity: \"2 GB\"\n    cells_cache_size: \"4 GB\"\n  adnl_options:\n    force_use_priority_channels: false\nstorage:\n  persistent_db_path: \"/var/db/relay-events\"\nmetrics_settings:\n  # Listen address of metrics. Used by the client to gather prometheus metrics.\n  # Default: \"127.0.0.1:10000\"\n  listen_address: \"127.0.0.1:10000\"\n  # URL path to the metrics. Default: \"/\"\n  # Example: `curl http://127.0.0.1:10000/`\n  metrics_path: \"/metrics\"\n  # Metrics update interval in seconds. Default: 10\n  collection_interval_sec: 10\n```\n\n### Architecture overview\n\nThe relay is simultaneously the Everscale node and can communicate with all EVM networks specified in the config.\nIts purpose is to check and sign transaction events.\n\nAt startup, it synchronizes the Everscale node and downloads blockchain state. It searches Bridge contract state in it,\nall connectors, active configurations and pending events. Then it subscribes to the Bridge contract in Everscale and\nlistens for connector deployment events. Each new connector can produce activation event which signals that relay\nshould subscribe to the event configuration contract. Each configuration contract produces event deployment\nevents, relay sees and checks them.\n\n- For Everscale-to-EVM events, only the correctness of data packing is checked (all other stuff is verified on the contracts\n  side). You can enforce token metadata check though (currently for TON only, use flag `0x01` on contract level to enable). If the event is correct, the relay converts this data into ETH ABI encoded bytes and signs it with its\n  ETH key. This signature is sent along with a confirmation message. If the data in the event was invalid then the\n  relay sends a rejection message.\n\n  ##### Everscale-to-EVM ABI mapping rules:\n\n  ```\n  bytes =\u003e same\n  string =\u003e same\n  uintX =\u003e same\n  intX =\u003e same\n  bool =\u003e same\n  fixedbytes =\u003e same\n  fixedarray =\u003e same but mapped\n  array =\u003e same but mapped\n  tuple =\u003e same but mapped\n  _ =\u003e unsupported\n  ```\n\n- For EVM-to-Everscale events, all event parameters are checked on the relay side. It waits for or looking for a transaction\n  on the specified EVM network, converts event data to the TVM cell and sends a confirmation message if everything was\n  correct. Otherwise, it sends a rejection message.\n\n  ##### ETH-to-Everscale ABI mapping rules:\n\n  \u003e You can use https://github.com/broxus/eth-ton-abi-converter to convert data from web page\n\n  ```\n  address =\u003e bytes (of length 20)\n  bytes =\u003e bytes or cell (*)\n  string =\u003e same\n  intX =\u003e same\n  uintX =\u003e same\n  bool =\u003e same\n  array =\u003e same but mapped\n  fixedbytes1 =\u003e depends on context (**)\n  fixedbytesX =\u003e same\n  fixedarray =\u003e same but mapped\n  tuple =\u003e same but mapped or cell (***)\n  _ =\u003e unsupported\n  ```\n\n  \u003e When converting ABI from EVM format to Everscale, there is a mechanism for controlling this process.\n  \u003e You can add a `bytes1` _(\\*\\*)_ element which sets context flags to its value.\n  \u003e\n  \u003e Currently, there are only four flags:\n  \u003e\n  \u003e - `0x01` - place tuples to new cell (\\*\\*\\*)\n  \u003e - `0x02` - interpret `bytes` as encoded TVM cell (\\*)\n  \u003e - `0x04` - insert default cell in case of error with flag `0x02` (\\*)\n  \u003e - `0x08` - check token root for token wallet\n  \u003e\n  \u003e NOTE: Flags can't be changed inside an array element! This would lead to inconsistent array items ABI.\n\nThe decision to make the relay an Everscale node was not made by chance. In the first version, several relays were connected\nto the one \"light\" node which was constantly restarted or to the graphql which also was quite unreliable.\nAs a result, relays instantly see all events and vote for them almost simultaneously in one block. The implementation is\nmore optimized than C++ node, so they don't harm the network.\n\n### Changelog\n\n### 2.3.2 (2024-03-07)\n\nFeatures:\n\n- Close expired Solana events\n- Improve Solana metrics\n\nBugfixes:\n\n- Fixed clearing Solana events from pending buffer\n\n### 2.3.1 (2024-02-08)\n\nFeatures:\n\n- Improved shard states GC\n\nBugfixes:\n\n- Fixed Solana events parsing\n\n### 2.3.0 (2024-01-08)\n\nFeatures:\n\n- Fully reworked bridge with Solana\n\n### 2.2.0 (2023-04-04)\n\nBugfixes:\n\n- Stability fixes\n\n### 2.1.2 (2022-12-23)\n\nFeatures:\n\n- Improved logger\n- Added support for configuration feature flags\n- Extend rejection info\n\nBugfixes:\n\n- Fixed transport issues\n\n### 2.1.1 (2022-10-14)\n\nBugfixes:\n\n- Fixed errors with SOL events during scanning all events\n- Increased default polling interval\n\n### 2.1.0 (2022-09-06)\n\nFeatures:\n\n- Add Solana\n\nBugfixes:\n\n- Fixed outgoing RLDP transfers\n\n### 2.0.13 (2022-07-22)\n\nFeatures:\n\n- Replace `tiny-adnl` with `everscale-network`\n- Optimize DB layout\n\n### 2.0.12 (2022-06-03)\n\nFeatures:\n\n- Backport transport fixes\n\n### 2.0.11 (2022-04-13)\n\nFeatures:\n\n- Added archives assembly\n- Added new account model support\n\nBugfixes\n\n- Fixed ADNL channels\n\n### 2.0.10 (2022-04-03)\n\nBugfixes\n\n- Fixed memory leaks. (New peers queue was read at a fixed rate).\n\n### 2.0.9 (2022-03-26)\n\nFeatures\n\n- Added packets compression support (enabled by default).\n- Various optimizations.\n\n### 2.0.8 (2022-02-12)\n\nFeatures\n\n- Updated ABI version to 2.2\n- Fixed memory leaks. (Shard states were slowly filling with loaded storage cells).\n\n### 2.0.7 (2022-02-02)\n\nFeatures\n\n- ADNL security improvements\n\n### 2.0.6 (2021-12-31)\n\nFeatures\n\n- Optimized DB structure\n\n### 2.0.5 (2021-11-27)\n\nFeatures\n\n- Improved ETH events verification\n- Updated events ABI\n- Added `ton_subscriber_shard_client_time_diff`, `ton_subscriber_mc_block_seqno` and `ton_subscriber_shard_client_mc_block_seqno`\n  values into metrics\n\n### 2.0.4 (2021-11-11)\n\nFeatures\n\n- Use jemalloc by default\n\nBugfixes\n\n- Fixed blocks GC memory issues\n\n### 2.0.3 (2021-11-09)\n\nFeatures\n\n- Hot reload for metrics exporter and logger settings (SIGHUP signal)\n- Blocks and states garbage collection\n- Additional EVM RPC timing controls\n- Improved database layout and increased data locality\n\nBugfixes\n\n- Fixed exported metrics format\n- Fixed event confirmation counters\n- Fixed time diff metrics\n- Reduced blocks range for `eth_getLogs`\n- Ignore descending blocks for ETH rpc\n\n### 2.0.2\n\nFeatures\n\n- Added setup scripts for fast deployment\n\nBugfixes\n\n- Fixed bridge contracts interaction logic according to new changes\n\n### 2.0.1\n\nInitial release\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbroxus%2Foctusbridge-relay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbroxus%2Foctusbridge-relay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbroxus%2Foctusbridge-relay/lists"}