diff --git a/Cargo.lock b/Cargo.lock index d190c404a..771642712 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -949,6 +949,17 @@ dependencies = [ "safemem", ] +[[package]] +name = "build-data" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac83c47416b2db78a5a8a45d7d229a730b62806fa41ac6b4dbde6d016798776" +dependencies = [ + "chrono", + "safe-lock", + "safe-regex", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -6060,6 +6071,59 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +[[package]] +name = "safe-lock" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "077d73db7973cccf63eb4aff1e5a34dc2459baa867512088269ea5f2f4253c90" + +[[package]] +name = "safe-proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "814c536dcd27acf03296c618dab7ad62d28e70abd7ba41d3f34a2ce707a2c666" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "safe-quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e530f7831f3feafcd5f1aae406ac205dd998436b4007c8e80f03eca78a88f7" +dependencies = [ + "safe-proc-macro2", +] + +[[package]] +name = "safe-regex" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15289bf322e0673d52756a18194167f2378ec1a15fe884af6e2d2cb934822b0" +dependencies = [ + "safe-regex-macro", +] + +[[package]] +name = "safe-regex-compiler" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba76fae590a2aa665279deb1f57b5098cbace01a0c5e60e262fcf55f7c51542" +dependencies = [ + "safe-proc-macro2", + "safe-quote", +] + +[[package]] +name = "safe-regex-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c2e96b5c03f158d1b16ba79af515137795f4ad4e8de3f790518aae91f1d127" +dependencies = [ + "safe-proc-macro2", + "safe-regex-compiler", +] + [[package]] name = "safe_arith" version = "0.1.0" @@ -8035,7 +8099,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "digest 0.10.6", "rand 0.8.5", "static_assertions", @@ -9155,10 +9219,11 @@ dependencies = [ [[package]] name = "webb-relayer" -version = "0.5.0" +version = "0.5.0-dev" dependencies = [ "anyhow", "axum", + "build-data", "config", "dotenv", "ethereum-types 0.14.1", diff --git a/README.md b/README.md index 560138c78..1ad1b8d9c 100644 --- a/README.md +++ b/README.md @@ -285,6 +285,16 @@ The relayer has 3 endpoints available to query from. They are outlined below for "experimental": { "smart-anchor-updates": false, "smart-anchor-updates-retries": 0 + }, + "features": { "dataQuery": true, "governanceRelay": true, "privateTxRelay": true }, + "assets": { + "TNT": { "price": 0.1, "name": "Tangle Network Token", "decimals": 18 }, + "tTNT": { "price": 0.1, "name": "Test Tangle Network Token", "decimals": 18 } + }, + "build" : { + "version": "0.5.0", + "commit": "c8875ba78298d34272e40c2e302fcfe33f191147", + "timestamp": "2023-05-19T15:57:40Z" } } ``` @@ -324,30 +334,16 @@ The relayer has 3 endpoints available to query from. They are outlined below for ```json { "leaves": [ - [ - 42, 255, 162, 80, 180, 134, 202, 153, - 49, 119, 64, 112, 255, 230, 46, 130, - 230, 68, 98, 78, 34, 206, 175, 181, - 18, 112, 14, 188, 166, 72, 115, 130 - ], - [ - 2, 103, 50, 103, 246, 93, 14, 110, - 51, 252, 154, 157, 102, 157, 16, 237, - 117, 55, 107, 175, 233, 112, 144, 18, - 178, 30, 175, 223, 81, 29, 227, 71 - ], - [ - 40, 30, 11, 223, 86, 95, 109, 18, - 31, 93, 224, 12, 208, 111, 222, 217, - 80, 195, 194, 100, 220, 183, 40, 142, - 232, 45, 32, 187, 98, 174, 142, 231 - ], - [ - 31, 141, 59, 100, 22, 69, 177, 39, - 226, 21, 59, 203, 47, 116, 66, 133, - 11, 254, 53, 179, 205, 251, 172, 32, - 8, 228, 96, 148, 230, 134, 80, 122 - ], + "0x015110a4b1a8bf29f7b6b2cb3fe5f52c2eeccd9ff7e8a0fb7d4ff2ae61516562", + "0x2fa56e6179d1bf0afc6f3ee2a52dc68cc2076d380a55165578c1c558e1f6f1dc", + "0x031317e0fe026ce99cf9b3cf8fefed7ddc21c5f4181e49fd6e8370aea5006da0", + "0x07507826af3c90c457222ad0305d90bf8bcfb1d343c2a9c17d280ff648b43582", + "0x0ff8f7f0fc798b9b34464ba51a10bdde16d17506f3251f9658335504f07c9c5f", + "0x0b92b3c5013eb2374527a167af6464f1ab8b11da1dd36e5a6a2cf76130fee9e3", + "0x2bccea444d1078a2b5778f3c8f28013219abfe5c236d1276b87276ec5eec4354", + "0x0be7c8578e746b1b7d913c79affb80c715b96a1304edb68d1d7e6dc33f30260f", + "0x117dae7ac7b62ed97525cc8541823c2caae25ffaf6168361ac19ca484851744f", + "0x0c187c0b413f2c2e8ebaeffbe9351fda6eb46dfa396b0c73298215950439fa75" ], "lastQueriedBlock": 37 } diff --git a/crates/relayer-handlers/src/lib.rs b/crates/relayer-handlers/src/lib.rs index abf7d549d..dd25029b0 100644 --- a/crates/relayer-handlers/src/lib.rs +++ b/crates/relayer-handlers/src/lib.rs @@ -207,9 +207,9 @@ pub async fn handle_cmd( /// gets parsed incorrectly. pub async fn handle_evm_fee_info( State(ctx): State>, - Path((chain_id, vanchor, gas_amount)): Path<(u64, Address, u64)>, + Path((chain_id, vanchor, gas_amount)): Path<(u32, Address, u64)>, ) -> Result, HandlerError> { - let chain_id = TypedChainId::from(chain_id); + let chain_id = TypedChainId::Evm(chain_id); let gas_amount = U256::from(gas_amount); Ok( get_evm_fee_info(chain_id, vanchor, gas_amount, ctx.as_ref()) diff --git a/crates/relayer-handlers/src/routes/info.rs b/crates/relayer-handlers/src/routes/info.rs index 8bf9651a0..35dcee6ee 100644 --- a/crates/relayer-handlers/src/routes/info.rs +++ b/crates/relayer-handlers/src/routes/info.rs @@ -10,12 +10,34 @@ use webb::evm::ethers::{ }; use webb_relayer_context::RelayerContext; +/// Build info data +#[derive(Debug, Serialize)] +pub struct BuildInfo { + /// Version of the relayer + pub version: String, + /// Commit hash of the relayer + pub commit: String, + /// Build time of the relayer + pub timestamp: String, +} + /// Relayer config data #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] +pub struct RelayerConfig { + /// Relayer chain config + #[serde(flatten)] + pub config: webb_relayer_config::WebbRelayerConfig, + /// Relayer build info + pub build: BuildInfo, +} + +/// Relayer configuration response +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] pub struct RelayerInformationResponse { #[serde(flatten)] - config: webb_relayer_config::WebbRelayerConfig, + relayer_config: RelayerConfig, } /// Handles relayer configuration requests @@ -53,5 +75,17 @@ pub async fn handle_relayer_info( v.beneficiary = Some(suri.public()); webb_relayer_utils::Result::Ok(()) }); - Json(RelayerInformationResponse { config }) + + // Build info + let build_info = BuildInfo { + version: std::env::var("CARGO_PKG_VERSION").unwrap_or_default(), + commit: std::env::var("GIT_COMMIT").unwrap_or_default(), + timestamp: std::env::var("SOURCE_TIMESTAMP").unwrap_or_default(), + }; + let relayer_config = RelayerConfig { + config, + build: build_info, + }; + + Json(RelayerInformationResponse { relayer_config }) } diff --git a/crates/relayer-handlers/src/routes/leaves.rs b/crates/relayer-handlers/src/routes/leaves.rs index 89cb5df76..ca4e25a71 100644 --- a/crates/relayer-handlers/src/routes/leaves.rs +++ b/crates/relayer-handlers/src/routes/leaves.rs @@ -16,6 +16,7 @@ use axum::extract::{Path, Query, State}; use axum::http::StatusCode; use axum::Json; use std::{collections::HashMap, sync::Arc}; +use webb::evm::ethers::types; use ethereum_types::Address; use serde::Serialize; @@ -32,7 +33,7 @@ use super::OptionalRangeQuery; #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct LeavesCacheResponse { - leaves: Vec>, + leaves: Vec, last_queried_block: u64, } @@ -117,11 +118,7 @@ pub async fn handle_leaves_cache_evm( let leaves = ctx .store() .get_leaves_with_range(history_store_key, query_range.into()) - .map(|tree| { - tree.into_values() - .map(|v| v.to_fixed_bytes().to_vec()) - .collect::>() - })?; + .map(|tree| tree.into_values().collect::>())?; let last_queried_block = ctx .store() .get_last_deposit_block_number(history_store_key)?; @@ -171,11 +168,8 @@ pub async fn handle_leaves_cache_substrate( let leaves = ctx .store() .get_leaves_with_range(history_store_key, query_range.into()) - .map(|tree| { - tree.into_values() - .map(|v| v.to_fixed_bytes().to_vec()) - .collect::>() - })?; + .map(|tree| tree.into_values().collect::>())?; + let last_queried_block = ctx .store() .get_last_deposit_block_number(history_store_key)?; diff --git a/crates/relayer-store/src/mem.rs b/crates/relayer-store/src/mem.rs index ffa3b1aa6..713aa848b 100644 --- a/crates/relayer-store/src/mem.rs +++ b/crates/relayer-store/src/mem.rs @@ -32,8 +32,8 @@ type MemStoreForMap = HashMap>; #[derive(Clone, Default)] pub struct InMemoryStore { _store: Arc>, - store_for_vec: Arc>, - store_for_map: Arc>, + leaf_store: Arc>, + encrypted_output_store: Arc>, last_block_numbers: Arc>>, target_block_numbers: Arc>>, last_deposit_block_numbers: Arc>>, @@ -119,7 +119,7 @@ impl LeafCacheStore for InMemoryStore { &self, key: K, ) -> crate::Result<()> { - let mut guard = self.store_for_map.write(); + let mut guard = self.leaf_store.write(); guard.clear(); Ok(()) } @@ -129,7 +129,7 @@ impl LeafCacheStore for InMemoryStore { &self, key: K, ) -> crate::Result { - let guard = self.store_for_map.read(); + let guard = self.leaf_store.read(); let val = guard.get(&key.into()).cloned().unwrap_or_default(); Ok(val) } @@ -139,7 +139,7 @@ impl LeafCacheStore for InMemoryStore { key: K, range: core::ops::Range, ) -> crate::Result { - let guard = self.store_for_map.read(); + let guard = self.leaf_store.read(); let val = guard.get(&key.into()).cloned().unwrap_or_default(); let iter = val .into_iter() @@ -171,7 +171,7 @@ impl LeafCacheStore for InMemoryStore { leaves: &[(u32, Vec)], block_number: u64, ) -> crate::Result<()> { - let mut guard1 = self.store_for_map.write(); + let mut guard1 = self.leaf_store.write(); let mut guard2 = self.last_deposit_block_numbers.write(); let mut guard3 = self.last_block_numbers.write(); { @@ -207,7 +207,7 @@ impl EncryptedOutputCacheStore for InMemoryStore { &self, key: K, ) -> crate::Result { - let guard = self.store_for_vec.read(); + let guard = self.encrypted_output_store.read(); let val = guard.get(&key.into()).cloned().unwrap_or_default(); Ok(val) } @@ -218,7 +218,7 @@ impl EncryptedOutputCacheStore for InMemoryStore { key: K, range: core::ops::Range, ) -> crate::Result { - let guard = self.store_for_vec.read(); + let guard = self.encrypted_output_store.read(); let val = guard.get(&key.into()).cloned().unwrap_or_default(); let iter = val .into_iter() @@ -252,7 +252,7 @@ impl EncryptedOutputCacheStore for InMemoryStore { encrypted_outputs: &[(u32, Vec)], block_number: u64, ) -> crate::Result<()> { - let mut guard1 = self.store_for_vec.write(); + let mut guard1 = self.encrypted_output_store.write(); let mut guard2 = self.last_deposit_block_numbers.write(); { guard1 diff --git a/services/webb-relayer/Cargo.toml b/services/webb-relayer/Cargo.toml index 168432a78..d67f33c90 100644 --- a/services/webb-relayer/Cargo.toml +++ b/services/webb-relayer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "webb-relayer" -version = "0.5.0" +version = "0.5.0-dev" description = "The Webb Relayer toolkit" exclude = ["tests", "config", ".github", "ci", "assets", "docker"] authors = { workspace = true } @@ -10,6 +10,9 @@ documentation = { workspace = true } homepage = { workspace = true } repository = { workspace = true } +[build-dependencies] +build-data = "0.1.4" + [lib] doctest = false diff --git a/services/webb-relayer/build.rs b/services/webb-relayer/build.rs new file mode 100644 index 000000000..684382f93 --- /dev/null +++ b/services/webb-relayer/build.rs @@ -0,0 +1,9 @@ +// build.rs + +fn main() { + build_data::set_GIT_BRANCH(); + build_data::set_GIT_COMMIT(); + build_data::set_GIT_DIRTY(); + build_data::set_SOURCE_TIMESTAMP(); + build_data::no_debug_rebuilds(); +} diff --git a/tests/lib/webbRelayer.ts b/tests/lib/webbRelayer.ts index 2bb9f9a53..529f8dd03 100644 --- a/tests/lib/webbRelayer.ts +++ b/tests/lib/webbRelayer.ts @@ -640,7 +640,7 @@ export interface WebbRelayerInfo { } export interface LeavesCacheResponse { - leaves: number[][]; + leaves: [`0x${string}`]; lastQueriedBlock: string; } diff --git a/tests/test/evm/RelayerTxTransfer.test.ts b/tests/test/evm/RelayerTxTransfer.test.ts index 27b329fa8..c86060882 100644 --- a/tests/test/evm/RelayerTxTransfer.test.ts +++ b/tests/test/evm/RelayerTxTransfer.test.ts @@ -299,7 +299,7 @@ describe('Relayer transfer assets', function () { ); const feeInfoResponse = await webbRelayer.getEvmFeeInfo( - localChain1.chainId, + localChain1.underlyingChainId, vanchor1.getAddress(), gas_amount ); diff --git a/tests/test/evm/proposals.test.ts b/tests/test/evm/proposals.test.ts index 622da623e..b7fc95676 100644 --- a/tests/test/evm/proposals.test.ts +++ b/tests/test/evm/proposals.test.ts @@ -352,8 +352,8 @@ describe('Proposals (DKG <=> Relayer <=> SigBridge)', function () { section: 'dkgProposalHandler', method: 'ProposalSigned', }); - - // now we wait for the proposal to be executed by the relayer then by the Signature Bridge. + + // now we wait for the proposal to be executed by the relayer then by the Signature Bridge. await webbRelayer.waitForEvent({ kind: 'signature_bridge', event: { @@ -392,7 +392,7 @@ describe('Proposals (DKG <=> Relayer <=> SigBridge)', function () { }); // now we wait for the tx queue on that chain to execute the transfer ownership transaction. - await webbRelayer.waitForEvent({ + await webbRelayer.waitForEvent({ kind: 'tx_queue', event: { ty: 'EVM', @@ -440,7 +440,7 @@ describe('Proposals (DKG <=> Relayer <=> SigBridge)', function () { data: u8aToHex(tokenRemoveProposal.toU8a()), }); console.log(' TokenRemove Proposal submitted'); - + // now we wait for the proposal to be signed. charlieNode.waitForEvent({ section: 'dkgProposalHandler', @@ -471,10 +471,10 @@ describe('Proposals (DKG <=> Relayer <=> SigBridge)', function () { }); it('should handle WrappingFeeUpdateProposal', async () => { - // we need to wait until the public key is changed. - await charlieNode.waitForEvent({ - section: 'dkg', - method: 'PublicKeySignatureChanged', + // we need to wait until the public key is changed. + await charlieNode.waitForEvent({ + section: 'dkg', + method: 'PublicKeySignatureChanged', }); // wait until the signature bridge receives the transfer ownership call. await webbRelayer.waitForEvent({ @@ -519,7 +519,7 @@ describe('Proposals (DKG <=> Relayer <=> SigBridge)', function () { functionSignature, nonce.add(1).toNumber() ); - + const newFee = ethers.utils.hexValue(50); const wrappingFeeProposalPayload = new WrappingFeeUpdateProposal( proposalHeader, diff --git a/tests/test/evm/signatureBridge.test.ts b/tests/test/evm/signatureBridge.test.ts index 7bda5e95e..9d7397054 100644 --- a/tests/test/evm/signatureBridge.test.ts +++ b/tests/test/evm/signatureBridge.test.ts @@ -324,7 +324,7 @@ describe('Signature Bridge <> DKG Proposal Signing Backend', function () { }); // now we wait for the tx queue on that chain to execute the transfer ownership transaction. - await webbRelayer.waitForEvent({ + await webbRelayer.waitForEvent({ kind: 'tx_queue', event: { ty: 'EVM', diff --git a/tests/test/evm/vanchorPrivateTransaction.test.ts b/tests/test/evm/vanchorPrivateTransaction.test.ts index 9a19b06c3..01b1b7d71 100644 --- a/tests/test/evm/vanchorPrivateTransaction.test.ts +++ b/tests/test/evm/vanchorPrivateTransaction.test.ts @@ -301,7 +301,7 @@ describe('Vanchor Private Tx relaying with mocked governor', function () { ); const feeInfoResponse = await webbRelayer.getEvmFeeInfo( - localChain2.chainId, + localChain2.underlyingChainId, vanchor2.getAddress(), gas_amount ); diff --git a/tests/test/evm/vanchorTransactionRelayer.test.ts b/tests/test/evm/vanchorTransactionRelayer.test.ts index f2967782c..153b73d8c 100644 --- a/tests/test/evm/vanchorTransactionRelayer.test.ts +++ b/tests/test/evm/vanchorTransactionRelayer.test.ts @@ -266,7 +266,7 @@ describe('Vanchor Transaction relayer', function () { expect(response.status).equal(200); const leavesStore = response.json() as Promise; await leavesStore.then((resp) => { - const leaves = resp.leaves.map((el) => u8aToHex(Uint8Array.from(el))); + const leaves = resp.leaves; expect(leaves.length).to.equal(expectedLeaves.length); expect(leaves).to.deep.equal(expectedLeaves); }); @@ -304,7 +304,7 @@ describe('Vanchor Transaction relayer', function () { expect(response2.status).equal(200); const leavesStore2 = response2.json() as Promise; await leavesStore2.then((resp) => { - const leaves = resp.leaves.map((el) => u8aToHex(Uint8Array.from(el))); + const leaves = resp.leaves; expect(leaves.length).to.equal(5 - 1); const expectedLeavesSlice = expectedLeaves.slice(1, 5); expect(leaves).to.deep.equal(expectedLeavesSlice); @@ -320,7 +320,7 @@ describe('Vanchor Transaction relayer', function () { expect(response21.status).equal(200); const leavesStore21 = response21.json() as Promise; await leavesStore21.then((resp) => { - const leaves = resp.leaves.map((el) => u8aToHex(Uint8Array.from(el))); + const leaves = resp.leaves; expect(leaves.length).to.equal(7 - 4); const expectedLeavesSlice = expectedLeaves.slice(4, 7); expect(leaves).to.deep.equal(expectedLeavesSlice); @@ -335,7 +335,7 @@ describe('Vanchor Transaction relayer', function () { expect(response3.status).equal(200); const leavesStore3 = response3.json() as Promise; await leavesStore3.then((resp) => { - const leaves = resp.leaves.map((el) => u8aToHex(Uint8Array.from(el))); + const leaves = resp.leaves; expect(leaves.length).to.equal(expectedLeavesCount - 1); const expectedLeavesSlice = expectedLeaves.slice( 1, @@ -358,7 +358,7 @@ describe('Vanchor Transaction relayer', function () { expect(response4.status).equal(200); const leavesStore4 = response4.json() as Promise; await leavesStore4.then((resp) => { - const leaves = resp.leaves.map((el) => u8aToHex(Uint8Array.from(el))); + const leaves = resp.leaves; expect(leaves.length).to.equal(1); const expectedLeavesSlice = expectedLeaves.slice(9); expect(leaves).to.deep.equal(expectedLeavesSlice);