diff --git a/Cargo.lock b/Cargo.lock index fd6d73642..8e0ca49a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -141,9 +141,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8aa973e647ec336810a9356af8aea787249c9d00b1525359f3db29a68d231b" +checksum = "5277af0cbcc483ee6ad2c1e818090b5928d27f04fd6580680f31c1cf8068bcc2" dependencies = [ "alloy-rlp", "bytes", @@ -294,9 +294,9 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dbd17d67f3e89478c8a634416358e539e577899666c927bc3d2b1328ee9b6ca" +checksum = "30708a79919b082f2692423c8cc72fc250477e4a2ecb0d4a7244cd3cdb299965" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", @@ -308,13 +308,13 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6da95adcf4760bb4b108fefa51d50096c5e5fdd29ee72fed3e86ee414f2e34" +checksum = "1c7a679ac01774ab7e00a567a918d4231ae692c5c8cedaf4e16956c3116d7896" dependencies = [ "alloy-sol-macro-input", "const-hex", - "heck 0.4.1", + "heck", "indexmap", "proc-macro-error", "proc-macro2", @@ -326,13 +326,13 @@ dependencies = [ [[package]] name = "alloy-sol-macro-input" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c8da04c1343871fb6ce5a489218f9c85323c8340a36e9106b5fc98d4dd59d5" +checksum = "356da0c2228aa6675a5faaa08a3e4061b967f924753983d72b9a18d9a3fad44e" dependencies = [ "const-hex", "dunce", - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.66", @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a64d2d2395c1ac636b62419a7b17ec39031d6b2367e66e9acbf566e6055e9c" +checksum = "6eb5e6234c0b62514992589fe1578f64d418dbc8ef5cd1ab2d7f2f568f599698" dependencies = [ "alloy-primitives", "alloy-sol-macro", @@ -428,9 +428,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -734,9 +734,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" dependencies = [ "cc", "glob", @@ -787,9 +787,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" [[package]] name = "cfg-if" @@ -799,9 +799,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.5.4" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" dependencies = [ "clap_builder", "clap_derive", @@ -809,9 +809,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" dependencies = [ "anstream", "anstyle", @@ -821,11 +821,11 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.66", @@ -833,9 +833,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" @@ -1332,12 +1332,6 @@ dependencies = [ "serde", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2228,9 +2222,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.84" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -2488,9 +2482,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.12.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f308135fef9fc398342da5472ce7c484529df23743fb7c734e0f3d472971e62" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -2512,9 +2506,9 @@ dependencies = [ [[package]] name = "ruint-macro" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" @@ -2907,9 +2901,9 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8db114c44cf843a8bacd37a146e37987a0b823a0e8bc4fdc610c9c72ab397a5" +checksum = "e6fe08d08d84f2c0a77f1e7c46518789d745c2e87a2721791ed7c3c9bc78df28" dependencies = [ "paste", "proc-macro2", @@ -3027,9 +3021,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -3046,9 +3040,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", diff --git a/crates/derive/Cargo.toml b/crates/derive/Cargo.toml index 3abe1afc5..f55724655 100644 --- a/crates/derive/Cargo.toml +++ b/crates/derive/Cargo.toml @@ -72,6 +72,8 @@ online = [ "dep:alloy-transport-http", "dep:reqwest", "alloy-provider/reqwest", + "alloy-rpc-client/reqwest", + "alloy-transport-http/reqwest", "alloy-consensus/serde", "c-kzg/serde", "revm-primitives/serde", diff --git a/crates/derive/src/online/alloy_providers.rs b/crates/derive/src/online/alloy_providers.rs index c4c7e1c83..12821efd2 100644 --- a/crates/derive/src/online/alloy_providers.rs +++ b/crates/derive/src/online/alloy_providers.rs @@ -11,14 +11,17 @@ use crate::{ use alloc::{boxed::Box, sync::Arc, vec::Vec}; use alloy_consensus::{Header, Receipt, ReceiptWithBloom, TxEnvelope, TxType}; use alloy_primitives::{Bytes, B256, U64}; -use alloy_provider::Provider; use alloy_rlp::{Buf, Decodable}; -use alloy_transport_http::Http; +use alloy_rpc_client::RpcClient; use anyhow::{anyhow, Result}; use async_trait::async_trait; use core::num::NonZeroUsize; use lru::LruCache; +// todo: once alloy revision is bumped, use defined ReqwestClient type. +/// A client using a [`reqwest`] HTTP transport. +pub type ReqwestClient = RpcClient>; + const CACHE_SIZE: usize = 16; /// The [AlloyChainProvider] is a concrete implementation of the [ChainProvider] trait, providing @@ -28,9 +31,9 @@ const CACHE_SIZE: usize = 16; /// This provider fetches data using the `debug_getRawHeader`, `debug_getRawReceipts`, and /// `debug_getRawBlock` methods. The RPC must support this namespace. #[derive(Debug, Clone)] -pub struct AlloyChainProvider>> { +pub struct AlloyChainProvider { /// The inner Ethereum JSON-RPC provider. - inner: T, + inner: ReqwestClient, /// `header_by_hash` LRU cache. header_by_hash_cache: LruCache, /// `block_info_by_number` LRU cache. @@ -41,9 +44,9 @@ pub struct AlloyChainProvider>> { block_info_and_transactions_by_hash_cache: LruCache)>, } -impl>> AlloyChainProvider { +impl AlloyChainProvider { /// Creates a new [AlloyChainProvider] with the given alloy provider. - pub fn new(inner: T) -> Self { + pub fn new(inner: ReqwestClient) -> Self { Self { inner, header_by_hash_cache: LruCache::new(NonZeroUsize::new(CACHE_SIZE).unwrap()), @@ -54,21 +57,23 @@ impl>> AlloyChainProvider { ), } } + + /// Creates a new [AlloyChainProvider] from the provided [reqwest::Url]. + pub fn new_http(url: reqwest::Url) -> Self { + let inner = ReqwestClient::new_http(url); + Self::new(inner) + } } #[async_trait] -impl>> ChainProvider for AlloyChainProvider { +impl ChainProvider for AlloyChainProvider { async fn header_by_hash(&mut self, hash: B256) -> Result
{ if let Some(header) = self.header_by_hash_cache.get(&hash) { return Ok(header.clone()); } - let raw_header: Bytes = self - .inner - .client() - .request("debug_getRawHeader", [hash]) - .await - .map_err(|e| anyhow!(e))?; + let raw_header: Bytes = + self.inner.request("debug_getRawHeader", [hash]).await.map_err(|e| anyhow!(e))?; Header::decode(&mut raw_header.as_ref()).map_err(|e| anyhow!(e)) } @@ -79,7 +84,6 @@ impl>> ChainProvider for AlloyChainProvider let raw_header: Bytes = self .inner - .client() .request("debug_getRawHeader", [U64::from(number)]) .await .map_err(|e| anyhow!(e))?; @@ -100,12 +104,8 @@ impl>> ChainProvider for AlloyChainProvider return Ok(receipts.clone()); } - let raw_receipts: Vec = self - .inner - .client() - .request("debug_getRawReceipts", [hash]) - .await - .map_err(|e| anyhow!(e))?; + let raw_receipts: Vec = + self.inner.request("debug_getRawReceipts", [hash]).await.map_err(|e| anyhow!(e))?; let receipts = raw_receipts .iter() @@ -133,12 +133,8 @@ impl>> ChainProvider for AlloyChainProvider return Ok(block_info_and_txs.clone()); } - let raw_block: Bytes = self - .inner - .client() - .request("debug_getRawBlock", [hash]) - .await - .map_err(|e| anyhow!(e))?; + let raw_block: Bytes = + self.inner.request("debug_getRawBlock", [hash]).await.map_err(|e| anyhow!(e))?; let block = Block::decode(&mut raw_block.as_ref()).map_err(|e| anyhow!(e))?; let block_info = BlockInfo { @@ -158,10 +154,10 @@ impl>> ChainProvider for AlloyChainProvider /// **Note**: /// This provider fetches data using the `debug_getRawBlock` method. The RPC must support this /// namespace. -#[derive(Debug)] -pub struct AlloyL2ChainProvider>> { +#[derive(Debug, Clone)] +pub struct AlloyL2ChainProvider { /// The inner Ethereum JSON-RPC provider. - inner: T, + inner: ReqwestClient, /// The rollup configuration. rollup_config: Arc, /// `payload_by_number` LRU cache. @@ -172,9 +168,9 @@ pub struct AlloyL2ChainProvider>> { system_config_by_number_cache: LruCache, } -impl>> AlloyL2ChainProvider { +impl AlloyL2ChainProvider { /// Creates a new [AlloyL2ChainProvider] with the given alloy provider and [RollupConfig]. - pub fn new(inner: T, rollup_config: Arc) -> Self { + pub fn new(inner: ReqwestClient, rollup_config: Arc) -> Self { Self { inner, rollup_config, @@ -183,10 +179,16 @@ impl>> AlloyL2ChainProvider { system_config_by_number_cache: LruCache::new(NonZeroUsize::new(CACHE_SIZE).unwrap()), } } + + /// Creates a new [AlloyL2ChainProvider] from the provided [reqwest::Url]. + pub fn new_http(url: reqwest::Url, rollup_config: Arc) -> Self { + let inner = ReqwestClient::new_http(url); + Self::new(inner, rollup_config) + } } #[async_trait] -impl>> L2ChainProvider for AlloyL2ChainProvider { +impl L2ChainProvider for AlloyL2ChainProvider { async fn l2_block_info_by_number(&mut self, number: u64) -> Result { if let Some(l2_block_info) = self.l2_block_info_by_number_cache.get(&number) { return Ok(*l2_block_info); @@ -205,7 +207,6 @@ impl>> L2ChainProvider for AlloyL2ChainProvide let raw_block: Bytes = self .inner - .client() .request("debug_getRawBlock", [U64::from(number)]) .await .map_err(|e| anyhow!(e))?; diff --git a/crates/derive/src/online/beacon_client.rs b/crates/derive/src/online/beacon_client.rs index b02002ce2..ac0a5e84a 100644 --- a/crates/derive/src/online/beacon_client.rs +++ b/crates/derive/src/online/beacon_client.rs @@ -1,13 +1,11 @@ //! Contains an online implementation of the [BeaconClient] trait. -use crate::types::{ - APIConfigResponse, APIGenesisResponse, APIGetBlobSidecarsResponse, IndexedBlobHash, +use crate::{ + online::ReqwestClient, + types::{APIConfigResponse, APIGenesisResponse, APIGetBlobSidecarsResponse, IndexedBlobHash}, }; use alloc::{boxed::Box, string::String}; -use alloy_provider::Provider; -use alloy_transport_http::Http; use async_trait::async_trait; -use reqwest::Client; /// The node version engine api method. pub(crate) const VERSION_METHOD: &str = "eth/v1/node/version"; @@ -46,30 +44,36 @@ pub trait BeaconClient { /// An online implementation of the [BeaconClient] trait. #[derive(Debug, Clone)] -pub struct OnlineBeaconClient>> { +pub struct OnlineBeaconClient { /// The inner Ethereum JSON-RPC provider. - inner: T, + inner: ReqwestClient, } -impl>> OnlineBeaconClient { +impl OnlineBeaconClient { /// Creates a new instance of the [OnlineBeaconClient]. - pub fn new(inner: T) -> Self { + pub fn new(inner: ReqwestClient) -> Self { Self { inner } } + + /// Creates a new [OnlineBeaconClient] from the provided [reqwest::Url]. + pub fn new_http(url: reqwest::Url) -> Self { + let inner = ReqwestClient::new_http(url); + Self::new(inner) + } } #[async_trait] -impl> + Send> BeaconClient for OnlineBeaconClient { +impl BeaconClient for OnlineBeaconClient { async fn node_version(&self) -> anyhow::Result { - self.inner.client().request(VERSION_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) + self.inner.request(VERSION_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) } async fn config_spec(&self) -> anyhow::Result { - self.inner.client().request(SPEC_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) + self.inner.request(SPEC_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) } async fn beacon_genesis(&self) -> anyhow::Result { - self.inner.client().request(GENESIS_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) + self.inner.request(GENESIS_METHOD, ()).await.map_err(|e| anyhow::anyhow!(e)) } async fn beacon_blob_side_cars( @@ -80,7 +84,6 @@ impl> + Send> BeaconClient for OnlineBeaconClient { ) -> anyhow::Result { let method = alloc::format!("{}{}", SIDECARS_METHOD_PREFIX, slot); self.inner - .client() .request(method, (fetch_all_sidecars, hashes)) .await .map_err(|e| anyhow::anyhow!(e)) diff --git a/crates/derive/src/online/mod.rs b/crates/derive/src/online/mod.rs index 90d9099f1..fdff54421 100644 --- a/crates/derive/src/online/mod.rs +++ b/crates/derive/src/online/mod.rs @@ -9,25 +9,18 @@ use crate::{ types::RollupConfig, }; use alloc::sync::Arc; -use alloy_provider::ReqwestProvider; use core::fmt::Debug; /// An `online` payload attributes builder for the `AttributesQueue` stage of the derivation /// pipeline. -pub type OnlineAttributesBuilder = StatefulAttributesBuilder< - AlloyChainProvider, - AlloyL2ChainProvider, ->; +pub type OnlineAttributesBuilder = + StatefulAttributesBuilder; /// An `online` attributes queue for the derivation pipeline. pub type OnlineAttributesQueue = AttributesQueue< BatchQueue< - ChannelReader< - ChannelBank< - FrameQueue>>>, - >, - >, - AlloyL2ChainProvider, + ChannelReader>>>>, + AlloyL2ChainProvider, >, OnlineAttributesBuilder, >; @@ -35,9 +28,9 @@ pub type OnlineAttributesQueue = AttributesQueue< /// Creates a new online stack. pub fn new_online_stack( rollup_config: Arc, - chain_provider: AlloyChainProvider, + chain_provider: AlloyChainProvider, dap_source: DAP, - fetcher: AlloyL2ChainProvider, + fetcher: AlloyL2ChainProvider, builder: OnlineAttributesBuilder, ) -> OnlineAttributesQueue where @@ -59,7 +52,7 @@ mod beacon_client; pub use beacon_client::{BeaconClient, OnlineBeaconClient}; mod alloy_providers; -pub use alloy_providers::{AlloyChainProvider, AlloyL2ChainProvider}; +pub use alloy_providers::{AlloyChainProvider, AlloyL2ChainProvider, ReqwestClient}; mod blob_provider; pub use blob_provider::{OnlineBlobProvider, SimpleSlotDerivation}; diff --git a/crates/derive/src/traits/mod.rs b/crates/derive/src/traits/mod.rs index 954d55b4f..0b2463ec1 100644 --- a/crates/derive/src/traits/mod.rs +++ b/crates/derive/src/traits/mod.rs @@ -11,7 +11,7 @@ mod data_sources; pub use data_sources::{AsyncIterator, BlobProvider, DataAvailabilityProvider}; mod reset; -pub use reset::{ResetProvider, TipState, WrappedTipState}; +pub use reset::ResetProvider; mod providers; pub use providers::{ChainProvider, L2ChainProvider}; diff --git a/crates/derive/src/traits/reset.rs b/crates/derive/src/traits/reset.rs index e80540fde..f86d7d4fe 100644 --- a/crates/derive/src/traits/reset.rs +++ b/crates/derive/src/traits/reset.rs @@ -1,9 +1,8 @@ //! Traits for resetting stages. -use alloc::{boxed::Box, sync::Arc}; +use alloc::boxed::Box; use async_trait::async_trait; use kona_primitives::{BlockInfo, SystemConfig}; -use spin::Mutex; /// Provides the [BlockInfo] and [SystemConfig] for the stack to reset the stages. #[async_trait] @@ -14,64 +13,3 @@ pub trait ResetProvider { /// Returns the current [SystemConfig] for the pipeline to reset. async fn system_config(&self) -> SystemConfig; } - -/// TipState stores the tip information for the derivation pipeline. -#[derive(Debug, Clone, PartialEq)] -pub struct TipState { - /// The origin [BlockInfo]. This is used by the [crate::stages::BatchQueue] - /// to reset it's origin and l1 block list. - origin: BlockInfo, - /// The [SystemConfig] is used in two places. - system_config: SystemConfig, -} - -impl TipState { - /// Creates a new [TipState]. - pub fn new(origin: BlockInfo, system_config: SystemConfig) -> Self { - Self { origin, system_config } - } - - /// Retrieves a copy of the [BlockInfo]. - pub fn origin(&self) -> BlockInfo { - self.origin - } - - /// Retrieves a copy of the [SystemConfig]. - pub fn system_config(&self) -> SystemConfig { - self.system_config - } - - /// Sets the block info. - pub fn set_origin(&mut self, new_bi: BlockInfo) { - self.origin = new_bi; - } - - /// Sets the system config. - pub fn set_system_config(&mut self, new_config: SystemConfig) { - self.system_config = new_config; - } -} - -/// Wraps the [TipState] to implement the [ResetProvider] trait. -#[derive(Debug, Clone)] -pub struct WrappedTipState(Arc>); - -impl WrappedTipState { - /// Creates a new [WrappedTipState]. - pub fn new(ts: Arc>) -> Self { - Self(ts) - } -} - -#[async_trait] -impl ResetProvider for WrappedTipState { - /// Returns the current [BlockInfo] for the pipeline to reset. - async fn block_info(&self) -> BlockInfo { - self.0.lock().origin() - } - - /// Returns the current [SystemConfig] for the pipeline to reset. - async fn system_config(&self) -> SystemConfig { - self.0.lock().system_config() - } -} diff --git a/justfile b/justfile index 3bf33533f..dc23105dc 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,6 @@ set positional-arguments alias t := tests +alias tn := test alias l := lint alias ln := lint-native alias fmt := fmt-native-fix