From 04ec933fd8c28139c77e0ca6a584afd0628d6d08 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 14 Jun 2021 14:16:53 +0300 Subject: [PATCH 01/26] Use addresses of tokens in coingecko api --- core/bin/zksync_api/src/fee_ticker/tests.rs | 11 +++++--- .../src/fee_ticker/ticker_api/coingecko.rs | 27 +++++++++++++------ .../fee_ticker/ticker_api/coinmarkercap.rs | 9 ++++--- .../src/fee_ticker/ticker_api/mod.rs | 4 +-- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/core/bin/zksync_api/src/fee_ticker/tests.rs b/core/bin/zksync_api/src/fee_ticker/tests.rs index a296964a41..93adb5349d 100644 --- a/core/bin/zksync_api/src/fee_ticker/tests.rs +++ b/core/bin/zksync_api/src/fee_ticker/tests.rs @@ -191,7 +191,7 @@ struct ErrorTickerApi; #[async_trait::async_trait] impl TokenPriceAPI for ErrorTickerApi { - async fn get_price(&self, _token_symbol: &str) -> Result { + async fn get_price(&self, _token: &Token) -> Result { Err(PriceError::token_not_found("Wrong token")) } } @@ -211,9 +211,14 @@ fn run_server() -> (String, AbortHandle) { })), ) .service(web::resource("/api/v3/coins/list").to(|| { + let mut platforms = HashMap::new(); + platforms.insert( + String::from("ethereum"), + String::from("0x6b175474e89094c44da98b954eedeac495271d0f"), + ); HttpResponse::Ok().json(CoinGeckoTokenList(vec![CoinGeckoTokenInfo { - id: "DAI".to_string(), - symbol: "DAI".to_string(), + id: "dai".to_string(), + platforms, }])) })) }) diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index e6b625daab..c19f2cd496 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -8,7 +8,7 @@ use reqwest::Url; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::time::Instant; -use zksync_types::TokenPrice; +use zksync_types::{Address, Token, TokenPrice}; use zksync_utils::UnsignedRatioSerializeAsDecimal; #[derive(Debug, Clone)] @@ -21,7 +21,7 @@ pub struct CoinGeckoAPI { impl CoinGeckoAPI { pub fn new(client: reqwest::Client, base_url: Url) -> anyhow::Result { let token_list_url = base_url - .join("api/v3/coins/list") + .join("api/v3/coins/list?include_platform=true") .expect("failed to join URL path"); let token_list = reqwest::blocking::get(token_list_url) @@ -30,8 +30,17 @@ impl CoinGeckoAPI { let mut token_ids = HashMap::new(); for token in token_list.0 { - token_ids.insert(token.symbol, token.id); + if let Some(address) = token.platforms.get("ethereum") { + token_ids.insert(address.clone(), token.id); + } } + + // Add ETH manually because coingecko API doesn't return address for it. + token_ids.insert( + format!("{:?}", Address::default()), + String::from("ethereum"), + ); + Ok(Self { base_url, client, @@ -42,13 +51,13 @@ impl CoinGeckoAPI { #[async_trait] impl TokenPriceAPI for CoinGeckoAPI { - async fn get_price(&self, token_symbol: &str) -> Result { + async fn get_price(&self, token: &Token) -> Result { let start = Instant::now(); + let token_symbol = token.symbol.as_str(); let token_lowercase_symbol = token_symbol.to_lowercase(); let token_id = self .token_ids - .get(&token_lowercase_symbol) - .or_else(|| self.token_ids.get(token_symbol)) + .get(&format!("{:?}", token.address)) .unwrap_or(&token_lowercase_symbol); // TODO ZKS-595. Uncomment this code // .ok_or_else(|| { @@ -117,7 +126,7 @@ impl TokenPriceAPI for CoinGeckoAPI { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CoinGeckoTokenInfo { pub(crate) id: String, - pub(crate) symbol: String, + pub(crate) platforms: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -137,6 +146,7 @@ pub struct CoinGeckoMarketChart { #[cfg(test)] mod tests { use super::*; + use zksync_types::TokenId; use zksync_utils::parse_env; #[tokio::test] @@ -144,7 +154,8 @@ mod tests { let ticker_url = parse_env("FEE_TICKER_COINGECKO_BASE_URL"); let client = reqwest::Client::new(); let api = CoinGeckoAPI::new(client, ticker_url).unwrap(); - api.get_price("ETH") + let token = Token::new(TokenId(0), Default::default(), "ETH", 18); + api.get_price(&token) .await .expect("Failed to get data from ticker"); } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs index a263a8bbbe..2eede509ef 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coinmarkercap.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; // Workspace deps use super::{TokenPriceAPI, REQUEST_TIMEOUT}; use crate::fee_ticker::PriceError; -use zksync_types::{TokenLike, TokenPrice}; +use zksync_types::{Token, TokenLike, TokenPrice}; use zksync_utils::UnsignedRatioSerializeAsDecimal; #[derive(Debug)] @@ -26,7 +26,8 @@ impl CoinMarketCapAPI { #[async_trait] impl TokenPriceAPI for CoinMarketCapAPI { - async fn get_price(&self, token_symbol: &str) -> Result { + async fn get_price(&self, token: &Token) -> Result { + let token_symbol = token.symbol.as_str(); let request_url = self .base_url .join(&format!( @@ -84,6 +85,7 @@ pub(super) struct CoinmarketCapResponse { mod test { use super::*; use std::str::FromStr; + use zksync_types::TokenId; use zksync_utils::parse_env; #[test] @@ -97,8 +99,9 @@ mod test { let ticker_url = parse_env("FEE_TICKER_COINMARKETCAP_BASE_URL"); let client = reqwest::Client::new(); let api = CoinMarketCapAPI::new(client, ticker_url); + let token = Token::new(TokenId(0), Default::default(), "ETH", 18); runtime - .block_on(api.get_price("ETH")) + .block_on(api.get_price(&token)) .expect("Failed to get data from ticker"); } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs index 97666c71b5..be6a0d3104 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/mod.rs @@ -25,7 +25,7 @@ pub const CONNECTION_TIMEOUT: Duration = Duration::from_millis(700); #[async_trait] pub trait TokenPriceAPI { - async fn get_price(&self, token_symbol: &str) -> Result; + async fn get_price(&self, token: &Token) -> Result; } /// Api responsible for querying for TokenPrices @@ -232,7 +232,7 @@ impl FeeTickerAPI for TickerApi { return Ok(cached_value); } - let api_price = self.token_price_api.get_price(&token.symbol).await; + let api_price = self.token_price_api.get_price(&token).await; match api_price { Ok(api_price) => { From 9945ed1a62ee297bfb65f16bed1051a43c8f8e51 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Mon, 14 Jun 2021 17:31:47 +0300 Subject: [PATCH 02/26] Add addresses to dev-ticker --- .../zksync_api/src/bin/dev-ticker-server.rs | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 7cef170ef8..67c1476013 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -83,29 +83,33 @@ async fn handle_coinmarketcap_token_price_query( } async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { + // Some tokens may appear more than one time because they have different addresses on testnets. let resp = json!([ - {"id": "ethereum", "symbol": "eth", "name": "Ethereum"}, - {"id": "dai", "symbol":"dai", "name": "Dai"}, - {"id": "glm", "symbol":"glm", "name": "Golem"}, - {"id": "tglm", "symbol":"tglm", "name": "Golem"}, - {"id": "usdc", "symbol":"usdc", "name": "usdc"}, - {"id": "usdt", "symbol":"usdt", "name": "usdt"}, - {"id": "tusd", "symbol":"tusd", "name": "tusd"}, - {"id": "link", "symbol":"link", "name": "link"}, - {"id": "ht", "symbol":"ht", "name": "ht"}, - {"id": "omg", "symbol":"omg", "name": "omg"}, - {"id": "trb", "symbol":"trb", "name": "trb"}, - {"id": "zrx", "symbol":"zrx", "name": "zrx"}, - {"id": "rep", "symbol":"rep", "name": "rep"}, - {"id": "storj", "symbol":"storj", "name": "storj"}, - {"id": "nexo", "symbol":"nexo", "name": "nexo"}, - {"id": "mco", "symbol":"mco", "name": "mco"}, - {"id": "knc", "symbol":"knc", "name": "knc"}, - {"id": "lamb", "symbol":"lamb", "name": "lamb"}, - {"id": "xem", "symbol":"xem", "name": "xem"}, - {"id": "phnx", "symbol":"phnx", "name": "Golem"}, - {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token"}, - {"id": "wrapped-bitcoin", "symbol": "wbtc", "name": "Wrapped Bitcoin"}, + {"id": "ethereum", "symbol": "eth", "name": "Ethereum", "platforms": {}}, + {"id": "dai", "symbol": "dai", "name": "Dai", "platforms": {"ethereum": "0x7eBAb6CBe1AAfc22c1877FEaa1D552b80CA91A09"}}, + {"id": "dai", "symbol": "dai", "name": "Dai", "platforms": {"ethereum": "0x351714Df444b8213f2C46aaA28829Fc5a8921304"}}, + {"id": "tglm", "symbol": "tglm", "name": "Golem", "platforms": {"ethereum": "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE"}}, + {"id": "usdc", "symbol": "usdc", "name": "usdc", "platforms": {"ethereum": "0xeb8f08a975Ab53E34D8a0330E0D34de942C95926"}}, + {"id": "usdt", "symbol": "usdt", "name": "usdt", "platforms": {"ethereum": "0x3B00Ef435fA4FcFF5C209a37d1f3dcff37c705aD"}}, + {"id": "tusd", "symbol": "tusd", "name": "tusd", "platforms": {"ethereum": "0x6856eC11F56267e3326f536D0e9F36eC7f7D1498"}}, + {"id": "tusd", "symbol": "tusd", "name": "tusd", "platforms": {"ethereum": "0xd2255612F9b045e9c81244bB874aBb413Ca139a3"}}, + {"id": "link", "symbol": "link", "name": "link", "platforms": {"ethereum": "0x4da8d0795830f75BE471F072a034d42c369B5d0A"}}, + {"id": "link", "symbol": "link", "name": "link", "platforms": {"ethereum": "0x793f38AE147852C37071684CdffC1FF7c87f7d07"}}, + {"id": "ht", "symbol": "ht", "name": "ht", "platforms": {"ethereum": "0x14700Cae8B2943bad34C70bB76AE27ECF5bC5013"}}, + {"id": "omg", "symbol": "omg", "name": "omg", "platforms": {"ethereum": "0x2B203de02AD6109521e09985b3aF9B8c62541Cd6"}}, + {"id": "trb", "symbol": "trb", "name": "trb", "platforms": {"ethereum": "0x2655F3a9eEB7F960be83098457144813ffaD07a4"}}, + {"id": "zrx", "symbol": "zrx", "name": "zrx", "platforms": {"ethereum": "0xC865bCBe4b6eF4B58a790052f2B51B4f06f586aC"}}, + {"id": "zrx", "symbol": "zrx", "name": "zrx", "platforms": {"ethereum": "0xDB7F2B9f6a0cB35FE5D236e5ed871D3aD4184290"}}, + {"id": "rep", "symbol": "rep", "name": "rep", "platforms": {"ethereum": "0x9Cac8508b9ff26501439590a24893D80e7E84D21"}}, + {"id": "storj", "symbol": "storj", "name": "storj", "platforms": {"ethereum": "0x8098165d982765097E4aa17138816e5b95f9fDb5"}}, + {"id": "nexo", "symbol": "nexo", "name": "nexo", "platforms": {"ethereum": "0x02d01f0835B7FDfa5d801A8f5f74c37F2BB1aE6a"}}, + {"id": "mco", "symbol": "mco", "name": "mco", "platforms": {"ethereum": "0xd93adDB2921b8061B697C2Ab055979BbEFE2B7AC"}}, + {"id": "knc", "symbol": "knc", "name": "knc", "platforms": {"ethereum": "0x290EBa6EC56EcC9fF81C72E8eccc77D2c2BF63eB"}}, + {"id": "lamb", "symbol": "lamb", "name": "lamb", "platforms": {"ethereum": "0x9ecec4d48Efdd96aE377aF3AB868f99De865CfF8"}}, + {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0xD2084eA2AE4bBE1424E4fe3CDE25B713632fb988"}}, + {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0x657aE665459c37483221C6a0c145a2DC197bD210"}}, + {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0x1B46bd2FC40030B6959A2d407f7D16f66aFaDD52"}}, + {"id": "wrapped-bitcoin", "symbol": "wbtc", "name": "Wrapped Bitcoin", "platforms": {"ethereum": "0x3bdFbbFDCF051C6EC5a741CC0fDe89e30Ff2F824"}}, ]); Ok(HttpResponse::Ok().json(resp)) From b67dd1c8b4219664e654c60c78fc8affb1b867e2 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 15 Jun 2021 15:47:12 +0300 Subject: [PATCH 03/26] Use local dev-ticker --- .github/workflows/ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dcf8d95dfa..97d0899336 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,6 +71,11 @@ jobs: - name: liquidity-token run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: change dev-ticker + run: | + docker-compose -f docker-compose-runner.yml down dev-liquidity-token-watcher + zk f cargo run --bin dev-ticker-server + - name: contracts-unit-tests run: ci_run zk test contracts @@ -98,6 +103,11 @@ jobs: docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk ci_run sccache --start-server + - name: change dev-ticker + run: | + docker-compose -f docker-compose-runner.yml down dev-liquidity-token-watcher + zk f cargo run --bin dev-ticker-server + - name: init run: | ci_run ln -s /usr/src/keys/setup keys/setup From d8b47e108d480d3d4004d6eee7f02288852d70f0 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 15 Jun 2021 15:54:47 +0300 Subject: [PATCH 04/26] Fix --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97d0899336..1c43b147e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,7 +73,7 @@ jobs: - name: change dev-ticker run: | - docker-compose -f docker-compose-runner.yml down dev-liquidity-token-watcher + docker-compose -f docker-compose-runner.yml stop dev-ticker zk f cargo run --bin dev-ticker-server - name: contracts-unit-tests @@ -103,11 +103,6 @@ jobs: docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk ci_run sccache --start-server - - name: change dev-ticker - run: | - docker-compose -f docker-compose-runner.yml down dev-liquidity-token-watcher - zk f cargo run --bin dev-ticker-server - - name: init run: | ci_run ln -s /usr/src/keys/setup keys/setup @@ -118,6 +113,11 @@ jobs: - name: liquidity-token run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: change dev-ticker + run: | + docker-compose -f docker-compose-runner.yml stop dev-ticker + zk f cargo run --bin dev-ticker-server + - name: run-services run: | ci_run zk server &>server.log & From 9b6c7abdbd9b25853886a7750670cc6e10b4956e Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 15 Jun 2021 15:59:30 +0300 Subject: [PATCH 05/26] Add ci_run --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c43b147e2..1636706233 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,7 +74,7 @@ jobs: - name: change dev-ticker run: | docker-compose -f docker-compose-runner.yml stop dev-ticker - zk f cargo run --bin dev-ticker-server + ci_run zk f cargo run --bin dev-ticker-server - name: contracts-unit-tests run: ci_run zk test contracts @@ -116,7 +116,7 @@ jobs: - name: change dev-ticker run: | docker-compose -f docker-compose-runner.yml stop dev-ticker - zk f cargo run --bin dev-ticker-server + ci_run zk f cargo run --bin dev-ticker-server - name: run-services run: | From 97c96f8b70695ad6f9e5599cd4c49153765b0942 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Tue, 15 Jun 2021 16:16:21 +0300 Subject: [PATCH 06/26] Add & --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1636706233..0d35fdb88a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,7 +74,7 @@ jobs: - name: change dev-ticker run: | docker-compose -f docker-compose-runner.yml stop dev-ticker - ci_run zk f cargo run --bin dev-ticker-server + ci_run zk f cargo run --bin dev-ticker-server & - name: contracts-unit-tests run: ci_run zk test contracts @@ -116,7 +116,7 @@ jobs: - name: change dev-ticker run: | docker-compose -f docker-compose-runner.yml stop dev-ticker - ci_run zk f cargo run --bin dev-ticker-server + ci_run zk f cargo run --bin dev-ticker-server & - name: run-services run: | From 62a3955287ccccc43b9e7574f3c67514e16eb071 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 12:34:13 +0300 Subject: [PATCH 07/26] Revert changes --- .github/workflows/ci.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d35fdb88a..dcf8d95dfa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -71,11 +71,6 @@ jobs: - name: liquidity-token run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher - - name: change dev-ticker - run: | - docker-compose -f docker-compose-runner.yml stop dev-ticker - ci_run zk f cargo run --bin dev-ticker-server & - - name: contracts-unit-tests run: ci_run zk test contracts @@ -113,11 +108,6 @@ jobs: - name: liquidity-token run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher - - name: change dev-ticker - run: | - docker-compose -f docker-compose-runner.yml stop dev-ticker - ci_run zk f cargo run --bin dev-ticker-server & - - name: run-services run: | ci_run zk server &>server.log & From dfb85a0186e7cb183488f6a48d5eb6be513ae80b Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 12:56:28 +0300 Subject: [PATCH 08/26] Use local dev-ticker --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 96b2a4662a..3199129c3d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: - ./etc/tokens/:/etc/tokens dev-ticker: - image: "matterlabs/dev-ticker:latest" + build: ./docker/dev-ticker ports: - "9876:9876" tesseracts: From 64a2e67b3a7ce20f4872d5f7376cdab617569f4a Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 12:59:55 +0300 Subject: [PATCH 09/26] Change dev-ticker in docker-compose-runner.yml --- docker-compose-runner.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index 513cbf65f6..1c8ac683d3 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -11,7 +11,7 @@ services: - PLUGIN_CONFIG dev-ticker: - image: "matterlabs/dev-ticker:latest" + build: ./docker/dev-ticker dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" From 1ce31650dfafcd8382078e6e4e972f9422882fb7 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 13:08:12 +0300 Subject: [PATCH 10/26] Move dockerfile to root --- Dockerfile | 18 ++++++++++++++++++ docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..da146d226a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +# syntax=docker/dockerfile:experimental +FROM rust:1.48 as builder +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + cargo install sccache +WORKDIR /usr/src/zksync +COPY . . +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/root/.cache/sccache \ + RUSTC_WRAPPER=/usr/local/cargo/bin/sccache \ + cargo build --release + +FROM debian:buster-slim +RUN apt update +RUN apt install openssl -y +EXPOSE 9876 +ENV RUST_LOG info +COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ +ENTRYPOINT ["dev-ticker-server"] diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index 1c8ac683d3..061e88a81e 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -11,7 +11,7 @@ services: - PLUGIN_CONFIG dev-ticker: - build: ./docker/dev-ticker + build: . dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" diff --git a/docker-compose.yml b/docker-compose.yml index 3199129c3d..ae999f92b0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: - ./etc/tokens/:/etc/tokens dev-ticker: - build: ./docker/dev-ticker + build: . ports: - "9876:9876" tesseracts: From ae59130f746962923630416fdd0391603942b080 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 15:10:03 +0300 Subject: [PATCH 11/26] Read tokens in dev-ticker-server from etc/tokens --- .../zksync_api/src/bin/dev-ticker-server.rs | 69 +++++++++++-------- .../src/fee_ticker/ticker_api/coingecko.rs | 4 +- docker-compose-runner.yml | 2 + docker-compose.yml | 2 + 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 67c1476013..bcbfc52b94 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -9,6 +9,7 @@ use bigdecimal::BigDecimal; use chrono::{SecondsFormat, Utc}; use serde::{Deserialize, Serialize}; use serde_json::json; +use std::{collections::HashMap, fs::File, io::BufReader, path::Path}; use std::{convert::TryFrom, time::Duration}; use structopt::StructOpt; use zksync_crypto::rand::{thread_rng, Rng}; @@ -82,36 +83,46 @@ async fn handle_coinmarketcap_token_price_query( Ok(HttpResponse::Ok().json(resp)) } -async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { - // Some tokens may appear more than one time because they have different addresses on testnets. - let resp = json!([ - {"id": "ethereum", "symbol": "eth", "name": "Ethereum", "platforms": {}}, - {"id": "dai", "symbol": "dai", "name": "Dai", "platforms": {"ethereum": "0x7eBAb6CBe1AAfc22c1877FEaa1D552b80CA91A09"}}, - {"id": "dai", "symbol": "dai", "name": "Dai", "platforms": {"ethereum": "0x351714Df444b8213f2C46aaA28829Fc5a8921304"}}, - {"id": "tglm", "symbol": "tglm", "name": "Golem", "platforms": {"ethereum": "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE"}}, - {"id": "usdc", "symbol": "usdc", "name": "usdc", "platforms": {"ethereum": "0xeb8f08a975Ab53E34D8a0330E0D34de942C95926"}}, - {"id": "usdt", "symbol": "usdt", "name": "usdt", "platforms": {"ethereum": "0x3B00Ef435fA4FcFF5C209a37d1f3dcff37c705aD"}}, - {"id": "tusd", "symbol": "tusd", "name": "tusd", "platforms": {"ethereum": "0x6856eC11F56267e3326f536D0e9F36eC7f7D1498"}}, - {"id": "tusd", "symbol": "tusd", "name": "tusd", "platforms": {"ethereum": "0xd2255612F9b045e9c81244bB874aBb413Ca139a3"}}, - {"id": "link", "symbol": "link", "name": "link", "platforms": {"ethereum": "0x4da8d0795830f75BE471F072a034d42c369B5d0A"}}, - {"id": "link", "symbol": "link", "name": "link", "platforms": {"ethereum": "0x793f38AE147852C37071684CdffC1FF7c87f7d07"}}, - {"id": "ht", "symbol": "ht", "name": "ht", "platforms": {"ethereum": "0x14700Cae8B2943bad34C70bB76AE27ECF5bC5013"}}, - {"id": "omg", "symbol": "omg", "name": "omg", "platforms": {"ethereum": "0x2B203de02AD6109521e09985b3aF9B8c62541Cd6"}}, - {"id": "trb", "symbol": "trb", "name": "trb", "platforms": {"ethereum": "0x2655F3a9eEB7F960be83098457144813ffaD07a4"}}, - {"id": "zrx", "symbol": "zrx", "name": "zrx", "platforms": {"ethereum": "0xC865bCBe4b6eF4B58a790052f2B51B4f06f586aC"}}, - {"id": "zrx", "symbol": "zrx", "name": "zrx", "platforms": {"ethereum": "0xDB7F2B9f6a0cB35FE5D236e5ed871D3aD4184290"}}, - {"id": "rep", "symbol": "rep", "name": "rep", "platforms": {"ethereum": "0x9Cac8508b9ff26501439590a24893D80e7E84D21"}}, - {"id": "storj", "symbol": "storj", "name": "storj", "platforms": {"ethereum": "0x8098165d982765097E4aa17138816e5b95f9fDb5"}}, - {"id": "nexo", "symbol": "nexo", "name": "nexo", "platforms": {"ethereum": "0x02d01f0835B7FDfa5d801A8f5f74c37F2BB1aE6a"}}, - {"id": "mco", "symbol": "mco", "name": "mco", "platforms": {"ethereum": "0xd93adDB2921b8061B697C2Ab055979BbEFE2B7AC"}}, - {"id": "knc", "symbol": "knc", "name": "knc", "platforms": {"ethereum": "0x290EBa6EC56EcC9fF81C72E8eccc77D2c2BF63eB"}}, - {"id": "lamb", "symbol": "lamb", "name": "lamb", "platforms": {"ethereum": "0x9ecec4d48Efdd96aE377aF3AB868f99De865CfF8"}}, - {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0xD2084eA2AE4bBE1424E4fe3CDE25B713632fb988"}}, - {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0x657aE665459c37483221C6a0c145a2DC197bD210"}}, - {"id": "basic-attention-token", "symbol": "bat", "name": "Basic Attention Token", "platforms": {"ethereum": "0x1B46bd2FC40030B6959A2d407f7D16f66aFaDD52"}}, - {"id": "wrapped-bitcoin", "symbol": "wbtc", "name": "Wrapped Bitcoin", "platforms": {"ethereum": "0x3bdFbbFDCF051C6EC5a741CC0fDe89e30Ff2F824"}}, - ]); +#[derive(Serialize, Deserialize, Clone, Debug)] +struct TokenData { + id: String, + symbol: String, + name: String, + platforms: HashMap, +} + +fn load_tokens(path: impl AsRef) -> Vec { + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + + let values: Vec> = serde_json::from_reader(reader).unwrap(); + let tokens: Vec = values + .into_iter() + .map(|value| { + let symbol = value["symbol"].as_str().unwrap().to_ascii_lowercase(); + let address = value["address"].as_str().unwrap().to_ascii_lowercase(); + let mut platforms = HashMap::new(); + platforms.insert(String::from("ethereum"), address); + let id = match symbol.as_str() { + "eth" => String::from("ethereum"), + "wbtc" => String::from("wrapped-bitcoin"), + "bat" => String::from("basic-attention-token"), + _ => symbol.clone(), + }; + TokenData { + id, + symbol: symbol.clone(), + name: symbol, + platforms, + } + }) + .collect(); + tokens +} + +async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { + let data = load_tokens(&"etc/tokens/localhost.json"); Ok(HttpResponse::Ok().json(resp)) } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index c19f2cd496..bea1b52860 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -31,7 +31,7 @@ impl CoinGeckoAPI { let mut token_ids = HashMap::new(); for token in token_list.0 { if let Some(address) = token.platforms.get("ethereum") { - token_ids.insert(address.clone(), token.id); + token_ids.insert(address.to_lowercase(), token.id); } } @@ -57,7 +57,7 @@ impl TokenPriceAPI for CoinGeckoAPI { let token_lowercase_symbol = token_symbol.to_lowercase(); let token_id = self .token_ids - .get(&format!("{:?}", token.address)) + .get(&format!("{:?}", token.address.to_lowercase())) .unwrap_or(&token_lowercase_symbol); // TODO ZKS-595. Uncomment this code // .ok_or_else(|| { diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index 061e88a81e..c001b46540 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -12,6 +12,8 @@ services: dev-ticker: build: . + volumes: + - ./etc/tokens/:/etc/tokens dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" diff --git a/docker-compose.yml b/docker-compose.yml index ae999f92b0..5e41c068a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,8 @@ services: build: . ports: - "9876:9876" + volumes: + - ./etc/tokens/:/etc/tokens tesseracts: image: "adria0/tesseracts" command: --cfg /tesseracts.toml -vvv From 769cfc61587fc71520a93db1af5c0d9b1f8eb376 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 15:21:09 +0300 Subject: [PATCH 12/26] Remove extra to_lowercase --- core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index bea1b52860..5dbcbd03c4 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -57,7 +57,7 @@ impl TokenPriceAPI for CoinGeckoAPI { let token_lowercase_symbol = token_symbol.to_lowercase(); let token_id = self .token_ids - .get(&format!("{:?}", token.address.to_lowercase())) + .get(&format!("{:?}", token.address)) .unwrap_or(&token_lowercase_symbol); // TODO ZKS-595. Uncomment this code // .ok_or_else(|| { From 851c1d6242dd34338c7f849744296a81f8cdda52 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 15:27:08 +0300 Subject: [PATCH 13/26] Fix --- core/bin/zksync_api/src/bin/dev-ticker-server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index bcbfc52b94..33b6a5f680 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -95,7 +95,7 @@ fn load_tokens(path: impl AsRef) -> Vec { let file = File::open(path).unwrap(); let reader = BufReader::new(file); - let values: Vec> = serde_json::from_reader(reader).unwrap(); + let values: Vec> = serde_json::from_reader(reader).unwrap(); let tokens: Vec = values .into_iter() .map(|value| { @@ -123,7 +123,7 @@ fn load_tokens(path: impl AsRef) -> Vec { async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { let data = load_tokens(&"etc/tokens/localhost.json"); - Ok(HttpResponse::Ok().json(resp)) + Ok(HttpResponse::Ok().json(data)) } async fn handle_coingecko_token_price_query(req: HttpRequest) -> Result { From aea33dd99cdab49db42955c1bf39c1878cfb3cd1 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 15:52:18 +0300 Subject: [PATCH 14/26] With old dev-ticker --- Dockerfile | 18 ------------------ docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index da146d226a..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# syntax=docker/dockerfile:experimental -FROM rust:1.48 as builder -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - cargo install sccache -WORKDIR /usr/src/zksync -COPY . . -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/root/.cache/sccache \ - RUSTC_WRAPPER=/usr/local/cargo/bin/sccache \ - cargo build --release - -FROM debian:buster-slim -RUN apt update -RUN apt install openssl -y -EXPOSE 9876 -ENV RUST_LOG info -COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ -ENTRYPOINT ["dev-ticker-server"] diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index c001b46540..eb7c0513ff 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -11,7 +11,7 @@ services: - PLUGIN_CONFIG dev-ticker: - build: . + image: "matterlabs/dev-ticker:latest" volumes: - ./etc/tokens/:/etc/tokens diff --git a/docker-compose.yml b/docker-compose.yml index 5e41c068a0..e560a21a04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: - ./etc/tokens/:/etc/tokens dev-ticker: - build: . + image: "matterlabs/dev-ticker:latest" ports: - "9876:9876" volumes: From 7f27647cd74cc9e5b9f2f03d683279c62d542d4d Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 16 Jun 2021 15:53:31 +0300 Subject: [PATCH 15/26] With new dev-ticker --- Dockerfile | 18 ++++++++++++++++++ docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..da146d226a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +# syntax=docker/dockerfile:experimental +FROM rust:1.48 as builder +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + cargo install sccache +WORKDIR /usr/src/zksync +COPY . . +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/root/.cache/sccache \ + RUSTC_WRAPPER=/usr/local/cargo/bin/sccache \ + cargo build --release + +FROM debian:buster-slim +RUN apt update +RUN apt install openssl -y +EXPOSE 9876 +ENV RUST_LOG info +COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ +ENTRYPOINT ["dev-ticker-server"] diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index eb7c0513ff..c001b46540 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -11,7 +11,7 @@ services: - PLUGIN_CONFIG dev-ticker: - image: "matterlabs/dev-ticker:latest" + build: . volumes: - ./etc/tokens/:/etc/tokens diff --git a/docker-compose.yml b/docker-compose.yml index e560a21a04..5e41c068a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: - ./etc/tokens/:/etc/tokens dev-ticker: - image: "matterlabs/dev-ticker:latest" + build: . ports: - "9876:9876" volumes: From 59bd5d35140f497bdcf98533ce4534f418574d4e Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Thu, 17 Jun 2021 13:05:33 +0300 Subject: [PATCH 16/26] Use Address where possible --- .github/workflows/ci.yml | 12 +++-- .../zksync_api/src/bin/dev-ticker-server.rs | 49 ++++++++++------- core/bin/zksync_api/src/fee_ticker/tests.rs | 54 +++++++++++-------- .../src/fee_ticker/ticker_api/coingecko.rs | 13 ++--- infrastructure/zk/src/init.ts | 1 + 5 files changed, 76 insertions(+), 53 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dcf8d95dfa..5d679fb226 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,8 +68,10 @@ jobs: ci_run zk db basic-setup ci_run zk run yarn - - name: liquidity-token - run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: restart dev-liquidity-token-watcher and dev-ticker + run: | + docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + docker-compose -f docker-compose-runner.yml restart dev-ticker - name: contracts-unit-tests run: ci_run zk test contracts @@ -105,8 +107,10 @@ jobs: ci_run zk dummy-prover enable --no-redeploy ci_run zk init - - name: liquidity-token - run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + - name: restart dev-liquidity-token-watcher and dev-ticker + run: | + docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher + docker-compose -f docker-compose-runner.yml restart dev-ticker - name: run-services run: | diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 33b6a5f680..319787b832 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -9,10 +9,11 @@ use bigdecimal::BigDecimal; use chrono::{SecondsFormat, Utc}; use serde::{Deserialize, Serialize}; use serde_json::json; -use std::{collections::HashMap, fs::File, io::BufReader, path::Path}; +use std::{collections::HashMap, fs::read_to_string, path::Path}; use std::{convert::TryFrom, time::Duration}; use structopt::StructOpt; use zksync_crypto::rand::{thread_rng, Rng}; +use zksync_types::Address; #[derive(Debug, Serialize, Deserialize)] struct CoinMarketCapTokenQuery { @@ -21,7 +22,7 @@ struct CoinMarketCapTokenQuery { macro_rules! make_sloppy { ($f: ident) => {{ - |query| async { + |query, data| async { if thread_rng().gen_range(0, 100) < 5 { vlog::debug!("`{}` has been errored", stringify!($f)); return Ok(HttpResponse::InternalServerError().finish()); @@ -43,7 +44,7 @@ macro_rules! make_sloppy { ); tokio::time::delay_for(duration).await; - let resp = $f(query).await; + let resp = $f(query, data).await; resp } }}; @@ -51,6 +52,7 @@ macro_rules! make_sloppy { async fn handle_coinmarketcap_token_price_query( query: web::Query, + _data: web::Data>, ) -> Result { let symbol = query.symbol.clone(); let base_price = match symbol.as_str() { @@ -83,26 +85,29 @@ async fn handle_coinmarketcap_token_price_query( Ok(HttpResponse::Ok().json(resp)) } +#[derive(Debug, Deserialize)] +struct Token { + pub address: Address, + pub decimals: u8, + pub symbol: String, +} + #[derive(Serialize, Deserialize, Clone, Debug)] struct TokenData { id: String, symbol: String, name: String, - platforms: HashMap, + platforms: HashMap, } fn load_tokens(path: impl AsRef) -> Vec { - let file = File::open(path).unwrap(); - let reader = BufReader::new(file); - - let values: Vec> = serde_json::from_reader(reader).unwrap(); - let tokens: Vec = values + let tokens: Vec = serde_json::from_str(&read_to_string(path).unwrap()).unwrap(); + let tokens_data: Vec = tokens .into_iter() - .map(|value| { - let symbol = value["symbol"].as_str().unwrap().to_ascii_lowercase(); - let address = value["address"].as_str().unwrap().to_ascii_lowercase(); + .map(|token| { + let symbol = token.symbol.to_lowercase(); let mut platforms = HashMap::new(); - platforms.insert(String::from("ethereum"), address); + platforms.insert(String::from("ethereum"), token.address); let id = match symbol.as_str() { "eth" => String::from("ethereum"), "wbtc" => String::from("wrapped-bitcoin"), @@ -118,15 +123,20 @@ fn load_tokens(path: impl AsRef) -> Vec { } }) .collect(); - tokens + tokens_data } -async fn handle_coingecko_token_list(_req: HttpRequest) -> Result { - let data = load_tokens(&"etc/tokens/localhost.json"); - Ok(HttpResponse::Ok().json(data)) +async fn handle_coingecko_token_list( + _req: HttpRequest, + data: web::Data>, +) -> Result { + Ok(HttpResponse::Ok().json((*data.into_inner()).clone())) } -async fn handle_coingecko_token_price_query(req: HttpRequest) -> Result { +async fn handle_coingecko_token_price_query( + req: HttpRequest, + _data: web::Data>, +) -> Result { let coin_id = req.match_info().get("coin_id"); let base_price = match coin_id { Some("ethereum") => BigDecimal::from(200), @@ -148,8 +158,10 @@ async fn handle_coingecko_token_price_query(req: HttpRequest) -> Result actix_web::Scope { + let data = load_tokens(&"etc/tokens/localhost.json"); if sloppy_mode { web::scope("/") + .data(data) .route( "/cryptocurrency/quotes/latest", web::get().to(make_sloppy!(handle_coinmarketcap_token_price_query)), @@ -164,6 +176,7 @@ fn main_scope(sloppy_mode: bool) -> actix_web::Scope { ) } else { web::scope("/") + .data(data) .route( "/cryptocurrency/quotes/latest", web::get().to(handle_coinmarketcap_token_price_query), diff --git a/core/bin/zksync_api/src/fee_ticker/tests.rs b/core/bin/zksync_api/src/fee_ticker/tests.rs index 93adb5349d..5225d7905b 100644 --- a/core/bin/zksync_api/src/fee_ticker/tests.rs +++ b/core/bin/zksync_api/src/fee_ticker/tests.rs @@ -196,7 +196,7 @@ impl TokenPriceAPI for ErrorTickerApi { } } -fn run_server() -> (String, AbortHandle) { +fn run_server(token_address: Address) -> (String, AbortHandle) { let mut url = None; let mut server = None; for i in 9000..9999 { @@ -210,12 +210,9 @@ fn run_server() -> (String, AbortHandle) { HttpResponse::MethodNotAllowed() })), ) - .service(web::resource("/api/v3/coins/list").to(|| { + .service(web::resource("/api/v3/coins/list").to(move || { let mut platforms = HashMap::new(); - platforms.insert( - String::from("ethereum"), - String::from("0x6b175474e89094c44da98b954eedeac495271d0f"), - ); + platforms.insert(String::from("ethereum"), token_address); HttpResponse::Ok().json(CoinGeckoTokenList(vec![CoinGeckoTokenInfo { id: "dai".to_string(), platforms, @@ -392,7 +389,13 @@ fn test_zero_price_token_fee() { #[ignore] // It's ignore because we can't initialize coingecko in current way with block async fn test_error_coingecko_api() { - let (address, handler) = run_server(); + let token = Token { + id: TokenId(1), + address: Address::random(), + symbol: String::from("DAI"), + decimals: 18, + }; + let (address, handler) = run_server(token.address); let client = reqwest::ClientBuilder::new() .timeout(CONNECTION_TIMEOUT) .connect_timeout(CONNECTION_TIMEOUT) @@ -407,20 +410,25 @@ async fn test_error_coingecko_api() { FakeTokenWatcher, ); let connection_pool = ConnectionPool::new(Some(1)); - connection_pool - .access_storage() - .await - .unwrap() - .tokens_schema() - .update_historical_ticker_price( - TokenId(1), - TokenPrice { - usd_price: big_decimal_to_ratio(&BigDecimal::from(10)).unwrap(), - last_updated: chrono::offset::Utc::now(), - }, - ) - .await - .unwrap(); + { + let mut storage = connection_pool.access_storage().await.unwrap(); + storage + .tokens_schema() + .store_token(token.clone()) + .await + .unwrap(); + storage + .tokens_schema() + .update_historical_ticker_price( + token.id, + TokenPrice { + usd_price: big_decimal_to_ratio(&BigDecimal::from(10)).unwrap(), + last_updated: chrono::offset::Utc::now(), + }, + ) + .await + .unwrap(); + } let ticker_api = TickerApi::new(connection_pool, coingecko); let config = get_test_ticker_config(); @@ -435,13 +443,13 @@ async fn test_error_coingecko_api() { ticker .get_fee_from_ticker_in_wei( TxFeeTypes::FastWithdraw, - TokenId(1).into(), + token.id.into(), Address::default(), ) .await .unwrap(); ticker - .get_token_price(TokenId(1).into(), TokenPriceRequestType::USDForOneWei) + .get_token_price(token.id.into(), TokenPriceRequestType::USDForOneWei) .await .unwrap(); } diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index 5dbcbd03c4..fdd4f564a2 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -15,7 +15,7 @@ use zksync_utils::UnsignedRatioSerializeAsDecimal; pub struct CoinGeckoAPI { base_url: Url, client: reqwest::Client, - token_ids: HashMap, + token_ids: HashMap, } impl CoinGeckoAPI { @@ -31,15 +31,12 @@ impl CoinGeckoAPI { let mut token_ids = HashMap::new(); for token in token_list.0 { if let Some(address) = token.platforms.get("ethereum") { - token_ids.insert(address.to_lowercase(), token.id); + token_ids.insert(*address, token.id); } } // Add ETH manually because coingecko API doesn't return address for it. - token_ids.insert( - format!("{:?}", Address::default()), - String::from("ethereum"), - ); + token_ids.insert(Address::default(), String::from("ethereum")); Ok(Self { base_url, @@ -57,7 +54,7 @@ impl TokenPriceAPI for CoinGeckoAPI { let token_lowercase_symbol = token_symbol.to_lowercase(); let token_id = self .token_ids - .get(&format!("{:?}", token.address)) + .get(&token.address) .unwrap_or(&token_lowercase_symbol); // TODO ZKS-595. Uncomment this code // .ok_or_else(|| { @@ -126,7 +123,7 @@ impl TokenPriceAPI for CoinGeckoAPI { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CoinGeckoTokenInfo { pub(crate) id: String, - pub(crate) platforms: HashMap, + pub(crate) platforms: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/infrastructure/zk/src/init.ts b/infrastructure/zk/src/init.ts index 7034d529fe..b90c228e36 100644 --- a/infrastructure/zk/src/init.ts +++ b/infrastructure/zk/src/init.ts @@ -29,6 +29,7 @@ export async function init() { await contract.redeploy(); if (!process.env.CI) { await docker.restart('dev-liquidity-token-watcher'); + await docker.restart('dev-ticker'); } } From ea55c49a7dc13b549c508991a5ac12e0d092d25c Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Thu, 17 Jun 2021 13:57:54 +0300 Subject: [PATCH 17/26] Fix after testing with actual API --- core/bin/zksync_api/src/fee_ticker/tests.rs | 5 ++++- .../src/fee_ticker/ticker_api/coingecko.rs | 14 ++++++++++---- infrastructure/zk/src/run/run.ts | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/core/bin/zksync_api/src/fee_ticker/tests.rs b/core/bin/zksync_api/src/fee_ticker/tests.rs index 5225d7905b..e9be550d79 100644 --- a/core/bin/zksync_api/src/fee_ticker/tests.rs +++ b/core/bin/zksync_api/src/fee_ticker/tests.rs @@ -212,7 +212,10 @@ fn run_server(token_address: Address) -> (String, AbortHandle) { ) .service(web::resource("/api/v3/coins/list").to(move || { let mut platforms = HashMap::new(); - platforms.insert(String::from("ethereum"), token_address); + platforms.insert( + String::from("ethereum"), + serde_json::Value::String(serde_json::to_string(&token_address).unwrap()), + ); HttpResponse::Ok().json(CoinGeckoTokenList(vec![CoinGeckoTokenInfo { id: "dai".to_string(), platforms, diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index fdd4f564a2..8c14eb58d8 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -7,9 +7,10 @@ use num::BigUint; use reqwest::Url; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::str::FromStr; use std::time::Instant; use zksync_types::{Address, Token, TokenPrice}; -use zksync_utils::UnsignedRatioSerializeAsDecimal; +use zksync_utils::{remove_prefix, UnsignedRatioSerializeAsDecimal}; #[derive(Debug, Clone)] pub struct CoinGeckoAPI { @@ -30,8 +31,13 @@ impl CoinGeckoAPI { let mut token_ids = HashMap::new(); for token in token_list.0 { - if let Some(address) = token.platforms.get("ethereum") { - token_ids.insert(*address, token.id); + if let Some(address_value) = token.platforms.get("ethereum") { + if let Some(address_str) = address_value.as_str() { + let address_str = remove_prefix(address_str); + if let Ok(address) = Address::from_str(address_str) { + token_ids.insert(address, token.id); + } + } } } @@ -123,7 +129,7 @@ impl TokenPriceAPI for CoinGeckoAPI { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CoinGeckoTokenInfo { pub(crate) id: String, - pub(crate) platforms: HashMap, + pub(crate) platforms: HashMap, } #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/infrastructure/zk/src/run/run.ts b/infrastructure/zk/src/run/run.ts index 18bbd670d5..93452a11b5 100644 --- a/infrastructure/zk/src/run/run.ts +++ b/infrastructure/zk/src/run/run.ts @@ -22,6 +22,7 @@ export async function deployERC20(command: 'dev' | 'new', name?: string, symbol? ]' > ./etc/tokens/localhost.json`); if (!process.env.CI) { await docker.restart('dev-liquidity-token-watcher'); + await docker.restart('dev-ticker'); } } else if (command == 'new') { await utils.spawn( From a993847ad21cc7f1715255f77b1a1191d490edd1 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Thu, 17 Jun 2021 14:30:10 +0300 Subject: [PATCH 18/26] Remove extra dev-ticker restart --- infrastructure/zk/src/init.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/infrastructure/zk/src/init.ts b/infrastructure/zk/src/init.ts index b90c228e36..7034d529fe 100644 --- a/infrastructure/zk/src/init.ts +++ b/infrastructure/zk/src/init.ts @@ -29,7 +29,6 @@ export async function init() { await contract.redeploy(); if (!process.env.CI) { await docker.restart('dev-liquidity-token-watcher'); - await docker.restart('dev-ticker'); } } From d0d3ae620e55c2dde391bdd91c67040d53d2deb6 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Fri, 18 Jun 2021 11:29:06 +0300 Subject: [PATCH 19/26] Union two lines --- .github/workflows/ci.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d679fb226..1692330022 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,9 +69,7 @@ jobs: ci_run zk run yarn - name: restart dev-liquidity-token-watcher and dev-ticker - run: | - docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher - docker-compose -f docker-compose-runner.yml restart dev-ticker + run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher dev-ticker - name: contracts-unit-tests run: ci_run zk test contracts @@ -108,9 +106,7 @@ jobs: ci_run zk init - name: restart dev-liquidity-token-watcher and dev-ticker - run: | - docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher - docker-compose -f docker-compose-runner.yml restart dev-ticker + run: docker-compose -f docker-compose-runner.yml restart dev-liquidity-token-watcher dev-ticker - name: run-services run: | From 1c786eed095e289981c52594319a0f17724e1f2c Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Fri, 18 Jun 2021 11:55:59 +0300 Subject: [PATCH 20/26] Do not search by symbol if token is not found by address --- .../src/fee_ticker/ticker_api/coingecko.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs index 8c14eb58d8..f6a0627c79 100644 --- a/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs +++ b/core/bin/zksync_api/src/fee_ticker/ticker_api/coingecko.rs @@ -57,18 +57,12 @@ impl TokenPriceAPI for CoinGeckoAPI { async fn get_price(&self, token: &Token) -> Result { let start = Instant::now(); let token_symbol = token.symbol.as_str(); - let token_lowercase_symbol = token_symbol.to_lowercase(); - let token_id = self - .token_ids - .get(&token.address) - .unwrap_or(&token_lowercase_symbol); - // TODO ZKS-595. Uncomment this code - // .ok_or_else(|| { - // PriceError::token_not_found(format!( - // "Token '{}' is not listed on CoinGecko", - // token_symbol - // )) - // })?; + let token_id = self.token_ids.get(&token.address).ok_or_else(|| { + PriceError::token_not_found(format!( + "Token '{}, {:?}' is not listed on CoinGecko", + token.symbol, token.address + )) + })?; let market_chart_url = self .base_url From e30f44e00e62ca8ac087f7a91e0a28696e85c588 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Fri, 18 Jun 2021 11:56:30 +0300 Subject: [PATCH 21/26] Add tokens from rinkeby and ropsten to dev-ticker --- core/bin/zksync_api/src/bin/dev-ticker-server.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 319787b832..1517b4dca0 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -158,7 +158,14 @@ async fn handle_coingecko_token_price_query( } fn main_scope(sloppy_mode: bool) -> actix_web::Scope { - let data = load_tokens(&"etc/tokens/localhost.json"); + let localhost_tokens = load_tokens(&"etc/tokens/localhost.json"); + let rinkeby_tokens = load_tokens(&"etc/tokens/rinkeby.json"); + let ropsten_tokens = load_tokens(&"etc/tokens/ropsten.json"); + let data: Vec = localhost_tokens + .into_iter() + .chain(rinkeby_tokens.into_iter()) + .chain(ropsten_tokens.into_iter()) + .collect(); if sloppy_mode { web::scope("/") .data(data) From 90e974f4fb805628866e5db44c6cb5548360fd5a Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 23 Jun 2021 15:18:52 +0300 Subject: [PATCH 22/26] Pull dev-ticker --- Dockerfile | 18 ------------------ docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index da146d226a..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# syntax=docker/dockerfile:experimental -FROM rust:1.48 as builder -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - cargo install sccache -WORKDIR /usr/src/zksync -COPY . . -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/root/.cache/sccache \ - RUSTC_WRAPPER=/usr/local/cargo/bin/sccache \ - cargo build --release - -FROM debian:buster-slim -RUN apt update -RUN apt install openssl -y -EXPOSE 9876 -ENV RUST_LOG info -COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ -ENTRYPOINT ["dev-ticker-server"] diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index c001b46540..eb7c0513ff 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -11,7 +11,7 @@ services: - PLUGIN_CONFIG dev-ticker: - build: . + image: "matterlabs/dev-ticker:latest" volumes: - ./etc/tokens/:/etc/tokens diff --git a/docker-compose.yml b/docker-compose.yml index 5e41c068a0..e560a21a04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,7 +29,7 @@ services: - ./etc/tokens/:/etc/tokens dev-ticker: - build: . + image: "matterlabs/dev-ticker:latest" ports: - "9876:9876" volumes: From a791b405e0c3838c4ff139197aa770d4939ac718 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 23 Jun 2021 16:31:24 +0300 Subject: [PATCH 23/26] Copy testnet tokens into docker image --- .../zksync_api/src/bin/dev-ticker-server.rs | 50 ++++++++++--------- docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/core/bin/zksync_api/src/bin/dev-ticker-server.rs b/core/bin/zksync_api/src/bin/dev-ticker-server.rs index 1517b4dca0..5b22496fb7 100644 --- a/core/bin/zksync_api/src/bin/dev-ticker-server.rs +++ b/core/bin/zksync_api/src/bin/dev-ticker-server.rs @@ -101,29 +101,33 @@ struct TokenData { } fn load_tokens(path: impl AsRef) -> Vec { - let tokens: Vec = serde_json::from_str(&read_to_string(path).unwrap()).unwrap(); - let tokens_data: Vec = tokens - .into_iter() - .map(|token| { - let symbol = token.symbol.to_lowercase(); - let mut platforms = HashMap::new(); - platforms.insert(String::from("ethereum"), token.address); - let id = match symbol.as_str() { - "eth" => String::from("ethereum"), - "wbtc" => String::from("wrapped-bitcoin"), - "bat" => String::from("basic-attention-token"), - _ => symbol.clone(), - }; - - TokenData { - id, - symbol: symbol.clone(), - name: symbol, - platforms, - } - }) - .collect(); - tokens_data + if let Ok(text) = read_to_string(path) { + let tokens: Vec = serde_json::from_str(&text).unwrap(); + let tokens_data: Vec = tokens + .into_iter() + .map(|token| { + let symbol = token.symbol.to_lowercase(); + let mut platforms = HashMap::new(); + platforms.insert(String::from("ethereum"), token.address); + let id = match symbol.as_str() { + "eth" => String::from("ethereum"), + "wbtc" => String::from("wrapped-bitcoin"), + "bat" => String::from("basic-attention-token"), + _ => symbol.clone(), + }; + + TokenData { + id, + symbol: symbol.clone(), + name: symbol, + platforms, + } + }) + .collect(); + tokens_data + } else { + Vec::new() + } } async fn handle_coingecko_token_list( diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index eb7c0513ff..b426b89c05 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -13,7 +13,7 @@ services: dev-ticker: image: "matterlabs/dev-ticker:latest" volumes: - - ./etc/tokens/:/etc/tokens + - ./etc/tokens/localhost.json:/etc/tokens/localhost.json dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" diff --git a/docker-compose.yml b/docker-compose.yml index e560a21a04..6fcfe5f7c9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: ports: - "9876:9876" volumes: - - ./etc/tokens/:/etc/tokens + - ./etc/tokens/localhost.json:/etc/tokens/localhost.json tesseracts: image: "adria0/tesseracts" command: --cfg /tesseracts.toml -vvv From 45450da3a2c8c6f5b84cee655b0f2ed75b5ee551 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 23 Jun 2021 16:41:01 +0300 Subject: [PATCH 24/26] Copy tokens folder in dockerfile --- docker/dev-ticker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/dev-ticker/Dockerfile b/docker/dev-ticker/Dockerfile index da146d226a..d1bb4dcda5 100644 --- a/docker/dev-ticker/Dockerfile +++ b/docker/dev-ticker/Dockerfile @@ -15,4 +15,5 @@ RUN apt install openssl -y EXPOSE 9876 ENV RUST_LOG info COPY --from=builder /usr/src/zksync/target/release/dev-ticker-server /bin/ +COPY --from=builder /usr/src/zksync/etc/tokens /etc/tokens ENTRYPOINT ["dev-ticker-server"] From c6f2a9b4cea24659195489cc4766f4afb9db6744 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 23 Jun 2021 17:10:08 +0300 Subject: [PATCH 25/26] Create localhost.json before running dev-ticker --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1692330022..5c86fcd199 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,7 @@ jobs: - name: start-services run: | + touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml up --build -d zk ci_run sccache --start-server @@ -52,6 +53,7 @@ jobs: - name: start-services run: | + touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk @@ -93,6 +95,7 @@ jobs: - name: start-services run: | + touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk @@ -151,6 +154,7 @@ jobs: - name: start-services run: | + touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d zk From 3b1b36beb57853d53cf3e5ba3d9bda984399ac05 Mon Sep 17 00:00:00 2001 From: perekopskiy Date: Wed, 23 Jun 2021 18:02:15 +0300 Subject: [PATCH 26/26] Mount tokens/ folder --- .github/workflows/ci.yml | 4 ---- docker-compose-runner.yml | 2 +- docker-compose.yml | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c86fcd199..1692330022 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,6 @@ jobs: - name: start-services run: | - touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml up --build -d zk ci_run sccache --start-server @@ -53,7 +52,6 @@ jobs: - name: start-services run: | - touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk @@ -95,7 +93,6 @@ jobs: - name: start-services run: | - touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d geth postgres zk @@ -154,7 +151,6 @@ jobs: - name: start-services run: | - touch ./etc/tokens/localhost.json docker-compose -f docker-compose-runner.yml down docker-compose -f docker-compose-runner.yml pull docker-compose -f docker-compose-runner.yml up --build -d zk diff --git a/docker-compose-runner.yml b/docker-compose-runner.yml index b426b89c05..eb7c0513ff 100644 --- a/docker-compose-runner.yml +++ b/docker-compose-runner.yml @@ -13,7 +13,7 @@ services: dev-ticker: image: "matterlabs/dev-ticker:latest" volumes: - - ./etc/tokens/localhost.json:/etc/tokens/localhost.json + - ./etc/tokens/:/etc/tokens dev-liquidity-token-watcher: image: "matterlabs/dev-liquidity-token-watcher:latest" diff --git a/docker-compose.yml b/docker-compose.yml index 6fcfe5f7c9..e560a21a04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: ports: - "9876:9876" volumes: - - ./etc/tokens/localhost.json:/etc/tokens/localhost.json + - ./etc/tokens/:/etc/tokens tesseracts: image: "adria0/tesseracts" command: --cfg /tesseracts.toml -vvv