//! The wire of the phase-1 root chain โ€” specs/chain-wire.md.
//!
//! - [`codec`] โ€” header/tx codecs and hashes the wire needs (vectors of chain-conformance.md)
//! - [`frames`] โ€” the tade dialect `urn:cyberia:chain:1`
//! - [`chain_view`] โ€” the operations the wire asks of the consensus kernel
//! - [`kernel`] โ€” that port implemented over the kernel's `ChainApi`
//! - [`mempool`] โ€” admission, nonce order, eviction (ยง4)
//! - [`peers`] โ€” limits, scoring, eclipse basics (ยง5)
//! - [`transport`] โ€” radio endpoint, bounded frame IO (ยง1)
//! - [`serve`] โ€” answering request streams (ยง3)
//! - [`gossip`] โ€” the three topics (ยง2)
//! - [`sync`] โ€” header-first sync and IBD (ยง3.1โ€“3.2)
//! - [`discovery`] โ€” bootstrap file, anchors, the graph as address book (ยง6)
//!
//! [`Net`] starts them all on one endpoint.

pub mod chain_view;
pub mod codec;
pub mod discovery;
pub mod frames;
pub mod gossip;
pub mod kernel;
pub mod mempool;
pub mod peers;
pub mod serve;
pub mod sync;
pub mod transport;

use std::collections::HashMap;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use std::time::Instant;

use iroh_gossip::api::GossipSender;
use iroh_gossip::net::{Gossip, GOSSIP_ALPN};
use iroh_gossip::proto::TopicId;
use radio::endpoint::Connection;
use radio::protocol::Router;
use radio::{Endpoint, EndpointAddr, EndpointId, TransportAddr};
use tokio::sync::mpsc;

use chain_view::ChainView;
use codec::{hex, Header, Id};
use frames::{Checkpoint, Frame, MAX_GOSSIP_BYTES};
use mempool::Mempool;
use peers::{Direction, Peer, PeerTable};

/// A bootstrap entry (peers.toml v1 or the compiled set).
#[derive(Clone, Debug)]
pub struct Bootstrap {
    pub name: String,
    pub id: EndpointId,
    pub addrs: Vec<SocketAddr>,
}

impl Bootstrap {
    pub fn addr(&self) -> EndpointAddr {
        EndpointAddr::from_parts(self.id, self.addrs.iter().map(|a| TransportAddr::Ip(*a)))
    }
}

#[derive(Clone, Debug)]
pub struct Config {
    /// `$home/<chain>`: radio.key, anchors.
    pub chain_dir: PathBuf,
    pub radio_bind: Option<SocketAddr>,
    pub relay: bool,
    pub bootstrap: Vec<Bootstrap>,
    /// This node's neuron (for `follow`-preferred dialing).
    pub neuron: Id,
}

/// What `/peers` shows.
#[derive(Clone, Debug)]
pub struct PeerView {
    pub id: EndpointId,
    pub direction: Direction,
    pub best_height: u64,
    pub best_tip: Id,
    pub score: u32,
    pub addrs: Vec<SocketAddr>,
}

pub(crate) struct Inner {
    pub endpoint: Endpoint,
    pub chain: Arc<dyn ChainView>,
    pub mempool: Arc<Mutex<Mempool>>,
    pub peers: Mutex<PeerTable>,
    pub conns: Mutex<HashMap<EndpointId, Connection>>,
    pub headers_tx: GossipSender,
    pub txs_tx: GossipSender,
    pub checkpoints_tx: GossipSender,
    pub sync_hint: mpsc::Sender<sync::Hint>,
    pub isolated: AtomicBool,
    pub catching_up: AtomicBool,
    pub bootstrap: Vec<Bootstrap>,
    pub checkpoints: Mutex<Vec<Checkpoint>>,
    pub book: Mutex<discovery::AddressBook>,
    pub dialing: Mutex<std::collections::HashSet<EndpointId>>,
    /// Headers and txs we relayed recently: their echoes are not duplicates to charge.
    pub recent: Mutex<HashMap<Id, Instant>>,
    pub chain_dir: PathBuf,
    pub neuron: Id,
    pub log: AtomicBool,
}

impl Inner {
    pub fn charge(&self, id: &EndpointId, points: u32, why: &str) {
        if points == 0 {
            return;
        }
        let verdict = self.peers.lock().expect("peers").charge(id, points);
        self.say(&format!("peer {} +{points} ({why}) โ†’ {verdict:?}", short(id)));
        if verdict == peers::Charge::Banned {
            self.disconnect(id, "banned");
        }
    }

    pub fn disconnect(&self, id: &EndpointId, why: &str) {
        if let Some(conn) = self.conns.lock().expect("conns").remove(id) {
            conn.close(1u32.into(), why.as_bytes());
        }
        self.peers.lock().expect("peers").remove(id);
    }

    pub fn conn(&self, id: &EndpointId) -> Option<Connection> {
        self.conns.lock().expect("conns").get(id).cloned()
    }

    pub fn say(&self, line: &str) {
        if self.log.load(Ordering::Relaxed) {
            eprintln!("  net ยท {line}");
        }
    }

    /// Mark a header/tx as just relayed, so its echo is not a scored duplicate.
    pub fn note_relayed(&self, id: Id) {
        let mut recent = self.recent.lock().expect("recent");
        let now = Instant::now();
        if recent.len() > 4096 {
            recent.retain(|_, t| now.duration_since(*t).as_secs() < 120);
        }
        recent.insert(id, now);
    }

    pub fn recently_relayed(&self, id: &Id) -> bool {
        self.recent.lock().expect("recent").get(id).is_some_and(|t| t.elapsed().as_secs() < 120)
    }

    /// Register a connection as a peer; `Err` means the connection must close.
    pub fn register(&self, conn: &Connection, direction: Direction, addrs: Vec<SocketAddr>, bootstrap: bool) -> Result<(), &'static str> {
        let id = conn.remote_id();
        if id == self.endpoint.id() {
            return Err("self");
        }
        if self.isolated.load(Ordering::Relaxed) {
            return Err("isolated");
        }
        let mut peers = self.peers.lock().expect("peers");
        let mut conns = self.conns.lock().expect("conns");
        if conns.contains_key(&id) {
            return Err("already connected");
        }
        // a gossip-only entry (scored, never dialed) is replaced; its score carries over
        let carried = peers.remove(&id).map(|p| p.score_now()).unwrap_or(0);
        let mut peer = Peer::new(id, direction, addrs, bootstrap);
        peer.score = carried;
        peers.admit(peer)?;
        conns.insert(id, conn.clone());
        Ok(())
    }

    pub async fn join_gossip(&self, id: EndpointId) {
        for sender in [&self.headers_tx, &self.txs_tx, &self.checkpoints_tx] {
            let _ = sender.join_peers(vec![id]).await;
        }
    }

    pub fn status_frame(&self) -> Frame {
        let tip = self.chain.tip();
        Frame::Status(frames::Status {
            chain: self.chain.chain_id(), rule_set: self.chain.rule_set(), height: tip.height, tip: tip.id,
            chainwork: tip.chainwork.to_le_bytes(), genesis: self.chain.genesis_id(),
        })
    }
}

pub fn short(id: &EndpointId) -> String {
    hex(&id.as_bytes()[..4])
}

pub fn now_unix() -> u64 {
    std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).map(|d| d.as_secs()).unwrap_or(0)
}

/// The running wire of one chain node.
pub struct Net {
    inner: Arc<Inner>,
    router: Router,
}

impl Net {
    pub async fn start(cfg: Config, chain: Arc<dyn ChainView>, mempool: Arc<Mutex<Mempool>>, log: bool) -> Result<Net, String> {
        let key = transport::load_or_create_key(&cfg.chain_dir.join("radio.key")).map_err(|e| e.to_string())?;
        let endpoint = transport::bind(key, cfg.radio_bind, cfg.relay, vec![transport::ALPN.to_vec(), GOSSIP_ALPN.to_vec()]).await?;
        let gossip = Gossip::builder().max_message_size(MAX_GOSSIP_BYTES).spawn(endpoint.clone());
        let chain_id = chain.chain_id();
        let mut topics = Vec::new();
        for name in ["headers", "txs", "checkpoints"] {
            let topic = gossip.subscribe(TopicId::from_bytes(codec::topic_id(&chain_id, name)), vec![]).await.map_err(|e| e.to_string())?;
            topics.push(topic.split());
        }
        let mut topics = topics.into_iter();
        let (headers_tx, headers_rx) = topics.next().expect("headers");
        let (txs_tx, txs_rx) = topics.next().expect("txs");
        let (checkpoints_tx, checkpoints_rx) = topics.next().expect("checkpoints");
        let (sync_hint, sync_rx) = mpsc::channel(256);
        let inner = Arc::new(Inner {
            endpoint: endpoint.clone(), chain, mempool, peers: Mutex::new(PeerTable::new()), conns: Mutex::new(HashMap::new()),
            headers_tx, txs_tx, checkpoints_tx, sync_hint, isolated: AtomicBool::new(false), catching_up: AtomicBool::new(false),
            bootstrap: cfg.bootstrap.clone(), checkpoints: Mutex::new(Vec::new()), book: Mutex::new(discovery::AddressBook::default()),
            dialing: Mutex::new(Default::default()), recent: Mutex::new(HashMap::new()), chain_dir: cfg.chain_dir.clone(), neuron: cfg.neuron,
            log: AtomicBool::new(log),
        });
        inner.peers.lock().expect("peers").anchors = discovery::load_anchors(&cfg.chain_dir);
        let router = Router::builder(endpoint).accept(transport::ALPN, serve::ChainProto(inner.clone())).accept(GOSSIP_ALPN, gossip.clone()).spawn();
        tokio::spawn(gossip::run_headers(inner.clone(), headers_rx));
        tokio::spawn(gossip::run_txs(inner.clone(), txs_rx));
        tokio::spawn(gossip::run_checkpoints(inner.clone(), checkpoints_rx));
        tokio::spawn(sync::run(inner.clone(), sync_rx));
        tokio::spawn(discovery::run(inner.clone()));
        tokio::spawn(events(inner.clone()));
        Ok(Net { inner, router })
    }

    pub fn id(&self) -> EndpointId {
        self.inner.endpoint.id()
    }

    pub fn bound(&self) -> Vec<SocketAddr> {
        self.inner.endpoint.bound_sockets()
    }

    /// Announce a block mined here: broadcast its header to the neighbors.
    pub async fn publish_header(&self, header: &Header) {
        self.inner.note_relayed(header.id());
        let _ = self.inner.headers_tx.broadcast_neighbors(bytes::Bytes::from(Frame::HeaderGossip(*header).encode())).await;
    }

    /// Hold a signed checkpoint and announce it on the `checkpoints` topic
    /// (chain.md ยง5.3: the signer publishes one per `CHECKPOINT_INTERVAL`).
    /// `false` when it is not new or its signature does not verify.
    pub async fn publish_checkpoint(&self, cp: Checkpoint) -> bool {
        let own = self.inner.endpoint.id();
        if !gossip::hold_checkpoint(&self.inner, &own, &cp) {
            return false;
        }
        let _ = self.inner.checkpoints_tx.broadcast_neighbors(bytes::Bytes::from(Frame::Checkpoint(cp).encode())).await;
        true
    }

    /// Announce a transaction admitted here.
    pub async fn publish_tx(&self, bytes: &[u8]) {
        self.inner.note_relayed(codec::txid(&self.inner.chain.chain_id(), bytes));
        let _ = self.inner.txs_tx.broadcast_neighbors(bytes::Bytes::from(Frame::Tx(bytes.to_vec()).encode())).await;
    }

    pub fn peers(&self) -> Vec<PeerView> {
        self.inner.peers.lock().expect("peers").iter()
            .map(|p| PeerView { id: p.id, direction: p.direction, best_height: p.best_height, best_tip: p.best_tip, score: p.score_now(), addrs: p.addrs.clone() })
            .collect()
    }

    pub fn outbound(&self) -> usize {
        self.inner.peers.lock().expect("peers").outbound()
    }

    pub fn catching_up(&self) -> bool {
        self.inner.catching_up.load(Ordering::Relaxed)
    }

    /// parano1d's sync-quorum gate: an outbound peer whose tip is within 2 blocks of ours.
    pub fn sync_quorum(&self, height: u64) -> bool {
        self.inner.peers.lock().expect("peers").synced_outbound(height, 2) >= 1
    }

    pub fn checkpoints(&self) -> Vec<Checkpoint> {
        self.inner.checkpoints.lock().expect("checkpoints").clone()
    }

    pub fn book_len(&self) -> usize {
        self.inner.book.lock().expect("book").len()
    }

    /// Dev switch: drop every peer and stop dialing (the fork rehearsal).
    pub fn set_isolated(&self, on: bool) {
        self.inner.isolated.store(on, Ordering::Relaxed);
        if on {
            let ids: Vec<EndpointId> = self.inner.conns.lock().expect("conns").keys().copied().collect();
            for id in ids {
                self.inner.disconnect(&id, "isolated");
            }
        }
    }

    pub fn is_isolated(&self) -> bool {
        self.inner.isolated.load(Ordering::Relaxed)
    }

    pub async fn dial(&self, addr: EndpointAddr) -> Result<(), String> {
        discovery::dial(self.inner.clone(), addr, false).await
    }

    pub async fn shutdown(&self) {
        let _ = self.router.shutdown().await;
    }
}

/// Keep the mempool in step with the tip and index the graph's address records.
async fn events(inner: Arc<Inner>) {
    let mut rx = inner.chain.events();
    loop {
        match rx.recv().await {
            Ok(chain_view::ChainEvent::NewTip { height, id, reorged_out }) => {
                if let Some((_, body)) = inner.chain.block(&id) {
                    let mut pool = inner.mempool.lock().expect("mempool");
                    pool.remove_mined(inner.chain.as_ref(), &body);
                    pool.revalidate(inner.chain.as_ref(), &reorged_out, now_unix());
                    inner.book.lock().expect("book").index_body(&body);
                }
                let best = inner.chain.best_header();
                inner.catching_up.store(best.height > height + 2, Ordering::Relaxed);
            }
            Err(tokio::sync::broadcast::error::RecvError::Lagged(_)) => continue,
            Err(_) => return,
        }
    }
}

Homonyms

warriors/trisha/rs/recursive/mod.rs
neural/trident/tests/support/mod.rs
soft3/crate/src/genesis/mod.rs
neural/trident/src/ir/mod.rs
neural/trident/src/cost/mod.rs
soft3/mir/src/frame/mod.rs
cyb/optica/src/output/mod.rs
neural/trident/src/syntax/mod.rs
neural/trident/src/package/mod.rs
cyb/shell/src/worlds/mod.rs
soft3/glia/run/backend/mod.rs
soft3/nox/rs/patterns/mod.rs
soft3/nox/rs/jets/mod.rs
cyb/optica/src/graph/mod.rs
warriors/trisha/rs/lower/mod.rs
soft3/crate/src/wallet/mod.rs
neural/trident/src/deploy/mod.rs
neural/trident/src/neural/mod.rs
cyb/optica/src/parser/mod.rs
cyb/prysm/system/rs/mod.rs
soft3/glia/run/tokenizer/mod.rs
cyb/optica/src/render/mod.rs
soft3/tru/rs/pass/mod.rs
cyb/optica/src/query/mod.rs
warriors/trisha/rs/cost/mod.rs
soft3/cybergraph/tests/common/mod.rs
neural/trident/src/config/mod.rs
neural/trident/src/ast/mod.rs
neural/trident/src/field/mod.rs
neural/trident/src/import/mod.rs
soft3/tru/rs/model/mod.rs
soft3/mudra/src/proof/mod.rs
cyb/optica/src/scanner/mod.rs
soft3/tru/rs/graph/mod.rs
soft3/glia/run/bench/mod.rs
cyb/prysm/atoms/rs/mod.rs
neural/trident/src/lsp/mod.rs
neural/trident/src/typecheck/mod.rs
soft3/glia/run/core/mod.rs
neural/trident/src/verify/mod.rs
warriors/trisha/rs/neural/mod.rs
soft3/glia/import/loader/mod.rs
cyb/shell/src/shell/mod.rs
soft3/tru/rs/focusing/mod.rs
neural/trident/src/runtime/mod.rs
neural/trident/src/api/mod.rs
cyb/optica/src/server/mod.rs
soft3/mir/src/graph/mod.rs
neural/trident/src/diagnostic/mod.rs
neural/trident/src/cli/mod.rs
soft3/glia/run/arch/mod.rs
cyb/prysm/molecules/rs/mod.rs
soft3/nox/rs/data/mod.rs
soft3/mir/src/bevy/mod.rs
cyb/shell/src/agent/mod.rs
soft3/mir/src/epoch/mod.rs
soft3/glia/run/ir/mod.rs
soft3/crate/src/chain/mod.rs
neural/rs/macros/src/module/mod.rs
cyb/honeycrisp/unimem/tests/image_support/mod.rs
neural/trident/src/ir/tir/mod.rs
neural/trident/src/verify/report/mod.rs
cyb/honeycrisp/acpu/src/vector/mod.rs
warriors/trisha/rs/neural/data/mod.rs
neural/trident/src/package/registry/mod.rs
soft3/glia/run/backend/wgpu/mod.rs
neural/trident/src/neural/training/mod.rs
soft3/zheng/rs/src/sumcheck/mod.rs
neural/trident/src/verify/synthesize/mod.rs
cyb/shell/src/worlds/vault/mod.rs
neural/rs/macros/src/registers/mod.rs
neural/trident/src/neural/model/mod.rs
neural/trident/src/config/resolve/mod.rs
cyb/honeycrisp/acpu/src/sparse/mod.rs
soft3/bbg/rs/src/transition/mod.rs
soft3/radio/iroh-blobs/examples/common/mod.rs
soft3/crate/src/chain/pool/mod.rs
cyb/wysm/crates/wasi/tests/mod.rs
neural/rs/darwin-sys/src/ffi/mod.rs
cyb/honeycrisp/rane/src/mil/mod.rs
neural/trident/src/verify/smt/mod.rs
soft3/glia/run/backend/honeycrisp/mod.rs
soft3/glia/run/arch/decoder/mod.rs
neural/trident/src/verify/solve/mod.rs
cyb/honeycrisp/acpu/src/pulse/mod.rs
soft3/zheng/rs/src/folding/mod.rs
soft3/glia/run/cli/cmd/mod.rs
neural/trident/src/syntax/format/mod.rs
warriors/trisha/rs/neural/inference/mod.rs
cyb/shell/src/worlds/models/mod.rs
neural/trident/src/package/store/mod.rs
cyb/honeycrisp/acpu/src/sync/mod.rs
neural/trident/src/syntax/parser/mod.rs
neural/rs/core/src/fixed_point/mod.rs
warriors/trisha/rs/neural/training/mod.rs
cyb/honeycrisp/aruminium/src/ffi/mod.rs
cyb/shell/src/worlds/sigma/mod.rs
neural/trident/src/verify/sym/mod.rs
soft3/strata/nebu/rs/extension/mod.rs
neural/rs/macros/src/addressed/mod.rs
neural/trident/src/package/hash/mod.rs
soft3/radio/cyber-bao/src/io/mod.rs
neural/trident/src/neural/data/mod.rs
soft3/glia/run/backend/cpu/mod.rs
soft3/radio/iroh-blobs/src/store/mod.rs
soft3/nox/rs/jets/backends/mod.rs
neural/trident/src/syntax/lexer/mod.rs
neural/rs/core/src/bounded/mod.rs
cyb/honeycrisp/aruminium/src/render/mod.rs
neural/trident/src/lsp/semantic/mod.rs
soft3/conformance/rs/src/surfaces/mod.rs
neural/trident/src/neural/inference/mod.rs
neural/eidos/rs/src/tactic_ext/mod.rs
soft3/crate/src/chain/economy/mod.rs
neural/eidos/rs/src/surface/mod.rs
soft3/zheng/rs/src/ccs/mod.rs
neural/trident/src/lsp/util/mod.rs
cyb/wysm/crates/wast/tests/mod.rs
soft3/zheng/rs/src/phi/mod.rs
warriors/trisha/rs/neural/model/mod.rs
neural/trident/src/config/scaffold/mod.rs
neural/trident/src/typecheck/tests/mod.rs
neural/trident/src/ir/tree/mod.rs
soft3/zheng/rs/src/spartan/mod.rs
neural/eidos/rs/src/stdlib/mod.rs
neural/trident/src/api/tests/mod.rs
warriors/trisha/rs/cost/model/mod.rs
cyb/shell/src/worlds/com/mod.rs
cyb/honeycrisp/acpu/src/gemm/mod.rs
cyb/shell/src/worlds/memory/mod.rs
neural/trident/src/verify/equiv/mod.rs
neural/eidos/rs/src/elab/mod.rs
cyb/honeycrisp/acpu/src/numeric/mod.rs
cyb/honeycrisp/acpu/src/probe/mod.rs
soft3/tru/rs/focusing/epoch/mod.rs
cyb/wysm/crates/wasmi/tests/mod.rs
cyb/shell/src/worlds/oracle/mod.rs
neural/rs/rsc/src/lints/mod.rs
cyb/shell/src/worlds/robot/mod.rs
soft3/neuron/node/tests/support/mod.rs
cyb/honeycrisp/acpu/src/matrix/mod.rs
neural/trident/src/syntax/grammar/mod.rs
warriors/trisha/rs/cost/stack_verifier/mod.rs
cyb/honeycrisp/acpu/src/field/mod.rs
soft3/crate/src/chain/mine/mod.rs
cyb/shell/src/worlds/body/mod.rs
neural/trident/src/package/manifest/mod.rs
soft3/bbg/rs/src/storage/mod.rs
cyb/honeycrisp/acpu/src/crypto/mod.rs
soft3/crate/src/chain/tests/mod.rs
cyb/evy/forks/bevy_anti_alias/src/contrast_adaptive_sharpening/mod.rs
warriors/trisha/rs/neural/data/tir_graph/mod.rs
cyb/evy/forks/bevy_anti_alias/src/smaa/mod.rs
cyb/wysm/crates/wasmi/src/memory/mod.rs
soft3/strata/jali/wgsl/src/shaders/mod.rs
cyb/wysm/crates/wasmi/src/table/mod.rs
cyb/evy/forks/bevy_pbr/src/decal/mod.rs
cyb/evy/forks/bevy_pbr/src/ssao/mod.rs
cyb/evy/forks/bevy_ecs/src/system/mod.rs
cyb/evy/forks/bevy_render/src/experimental/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/tonemapping/mod.rs
cyb/evy/forks/bevy_ecs/src/entity/mod.rs
cyb/evy/forks/bevy_pbr/src/light_probe/mod.rs
cyb/evy/forks/bevy_post_process/src/motion_blur/mod.rs
cyb/wysm/crates/wasmi/src/engine/mod.rs
cyb/evy/forks/bevy_ecs/src/bundle/mod.rs
cyb/evy/forks/bevy_post_process/src/bloom/mod.rs
cyb/wysm/crates/wasmi/benches/bench/mod.rs
cyb/evy/forks/bevy_pbr/src/ssr/mod.rs
soft3/radio/quinn/quinn/src/runtime/mod.rs
cyb/evy/forks/bevy_ecs/src/error/mod.rs
cyb/evy/forks/bevy_anti_alias/src/dlss/mod.rs
cyb/evy/forks/bevy_render/src/renderer/mod.rs
cyb/wysm/crates/wasmi/src/module/mod.rs
cyb/evy/forks/bevy_sprite_render/src/render/mod.rs
cyb/evy/forks/bevy_ecs/src/reflect/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mod.rs
soft3/bbg/rs/src/storage/database/mod.rs
soft3/strata/trop/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_render/src/texture/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/fullscreen_vertex_shader/mod.rs
cyb/evy/forks/naga/src/common/mod.rs
cyb/evy/forks/bevy_render/src/batching/mod.rs
cyb/wysm/crates/cli/src/commands/mod.rs
cyb/evy/forks/bevy_anti_alias/src/fxaa/mod.rs
cyb/evy/forks/naga/src/compact/mod.rs
warriors/erga/rs/mine-bench/tests/support/mod.rs
soft3/radio/quinn/quinn-udp/src/cmsg/mod.rs
soft3/glia/run/backend/cpu/quant/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/skybox/mod.rs
cyb/evy/forks/bevy_pbr/src/render/mod.rs
cyb/evy/forks/naga/src/proc/mod.rs
cyb/evy/forks/bevy_sprite_render/src/texture_slice/mod.rs
cyb/evy/crates/evy_prysm_core/src/layout/mod.rs
cyb/evy/forks/bevy_pbr/src/prepass/mod.rs
cyb/evy/forks/bevy_pbr/src/meshlet/mod.rs
cyb/evy/forks/naga/src/back/mod.rs
soft3/glia/run/arch/decoder/families/mod.rs
cyb/evy/forks/bevy_render/src/render_resource/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/deferred/mod.rs
cyb/evy/forks/bevy_render/src/diagnostic/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/upscaling/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_2d/mod.rs
soft3/radio/quinn/quinn-proto/src/connection/mod.rs
soft3/radio/quinn/quinn/examples/common/mod.rs
soft3/strata/kuro/wgsl/src/shaders/mod.rs
soft3/glia/run/backend/honeycrisp/kernels/mod.rs
cyb/evy/forks/bevy_post_process/src/effect_stack/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/mod.rs
cyb/evy/forks/bevy_ecs/src/component/mod.rs
neural/trident/src/ir/tree/lower/mod.rs
cyb/evy/forks/bevy_transform/src/components/mod.rs
cyb/evy/forks/bevy_ecs/src/change_detection/mod.rs
cyb/wysm/crates/wasmi/src/instance/mod.rs
cyb/wysm/crates/wasmi/tests/integration/mod.rs
cyb/wysm/crates/collections/src/arena/mod.rs
cyb/evy/forks/bevy_pbr/src/deferred/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/mod.rs
soft3/radio/quinn/quinn-proto/src/config/mod.rs
cyb/wysm/crates/core/src/memory/mod.rs
cyb/evy/forks/bevy_sprite_render/src/tilemap_chunk/mod.rs
cyb/wysm/crates/wasi/src/sync/mod.rs
soft3/strata/genies/wgsl/src/shaders/mod.rs
cyb/evy/forks/bevy_ecs/src/query/mod.rs
cyb/evy/forks/naga/src/front/mod.rs
cyb/evy/forks/bevy_ecs/src/world/mod.rs
cyb/wysm/crates/ir/src/decode/mod.rs
cyb/evy/forks/bevy_anti_alias/src/taa/mod.rs
neural/trident/src/ir/tir/builder/mod.rs
cyb/evy/forks/bevy_sprite_render/src/text2d/mod.rs
cyb/wysm/crates/wasmi/src/store/mod.rs
cyb/evy/forks/naga/src/keywords/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/prepass/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/mod.rs
cyb/evy/forks/bevy_tasks/src/iter/mod.rs
soft3/glia/run/backend/wgpu/kernels/mod.rs
cyb/wysm/crates/core/src/table/mod.rs
cyb/evy/forks/bevy_render/src/view/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/mod.rs
cyb/evy/forks/bevy_ecs/src/relationship/mod.rs
soft3/radio/quinn/quinn-proto/src/range_set/mod.rs
cyb/evy/forks/bevy_render/src/render_graph/mod.rs
cyb/evy/forks/bevy_ecs/src/event/mod.rs
cyb/wysm/crates/c_api/src/types/mod.rs
cyb/evy/forks/naga/src/arena/mod.rs
soft3/radio/quinn/quinn-proto/src/tests/mod.rs
cyb/evy/forks/naga/src/valid/mod.rs
cyb/evy/forks/bevy_post_process/src/dof/mod.rs
cyb/wysm/crates/fuzz/src/oracle/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/blit/mod.rs
neural/trident/src/neural/data/tir_graph/mod.rs
cyb/evy/forks/bevy_sprite_render/src/mesh2d/mod.rs
cyb/wysm/crates/wasmi/src/func/mod.rs
cyb/evy/forks/bevy_pbr/src/volumetric_fog/mod.rs
cyb/evy/forks/bevy_post_process/src/auto_exposure/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/core_3d/mod.rs
neural/trident/src/ir/tir/optimize/mod.rs
cyb/evy/forks/bevy_ecs/src/message/mod.rs
cyb/evy/forks/bevy_render/src/render_phase/mod.rs
cyb/evy/forks/bevy_ecs/src/observer/mod.rs
cyb/evy/forks/bevy_sprite/src/texture_slice/mod.rs
cyb/evy/forks/bevy_gizmos/src/primitives/mod.rs
cyb/evy/forks/bevy_pbr/src/lightmap/mod.rs
cyb/evy/forks/bevy_pbr/src/atmosphere/mod.rs
cyb/evy/forks/bevy_render/src/mesh/mod.rs
neural/trident/src/ir/tir/stack/mod.rs
neural/trident/src/syntax/parser/tests/mod.rs
cyb/evy/forks/naga/src/back/glsl/mod.rs
cyb/evy/forks/bevy_ecs/src/world/entity_access/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/oit/resolve/mod.rs
cyb/evy/forks/naga/src/front/spv/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/graph/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/mod.rs
cyb/evy/forks/naga/src/back/msl/mod.rs
cyb/wysm/crates/wasmi/src/module/instantiate/mod.rs
cyb/evy/forks/bevy_render/src/experimental/occlusion_culling/mod.rs
cyb/evy/forks/bevy_render/src/view/visibility/mod.rs
cyb/evy/forks/bevy_ecs/src/storage/table/mod.rs
cyb/evy/forks/naga/src/front/wgsl/mod.rs
soft3/radio/quinn/quinn-proto/src/connection/streams/mod.rs
cyb/evy/forks/naga/src/back/wgsl/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/mod.rs
cyb/evy/forks/naga/src/front/glsl/mod.rs
soft3/radio/quinn/quinn-proto/src/congestion/bbr/mod.rs
cyb/evy/forks/bevy_ecs/src/schedule/executor/mod.rs
cyb/wysm/crates/wasmi/src/engine/limits/mod.rs
cyb/wysm/crates/wasmi/src/module/parser/mod.rs
cyb/evy/forks/naga/src/back/spv/mod.rs
cyb/evy/forks/bevy_mesh/src/primitives/dim3/mod.rs
cyb/evy/forks/naga/src/back/dot/mod.rs
cyb/wysm/crates/wasi/src/sync/snapshots/mod.rs
cyb/evy/forks/bevy_core_pipeline/src/experimental/mip_generation/mod.rs
cyb/evy/forks/naga/src/back/hlsl/mod.rs
struct Baz { m: mat3x2, } struct Baz { float2 m_0; float2 m_1; float2 m_2; }; float3x2 GetMatmOnBaz(Baz obj) { return float3x2(obj.m_0, obj.m_1, obj.m_2); }
cyb/evy/forks/bevy_ecs/src/system/commands/mod.rs
cyb/evy/forks/bevy_render/src/view/window/mod.rs
cyb/evy/forks/naga/src/front/wgsl/lower/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/handler/mod.rs
cyb/evy/forks/naga/src/front/wgsl/parse/mod.rs
cyb/evy/forks/naga/src/back/wgsl/polyfill/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/mod.rs
cyb/wysm/crates/wasmi/src/engine/executor/handler/dispatch/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/stack/mod.rs
cyb/wysm/crates/wasmi/src/engine/translator/func/simd/mod.rs

Graph