The previous commit broke CI on main here, and the mechanism is worth recording.
Measured, by asking each cache for the path that failed in keystore-module
(the same class of path fails in every Rust-building repo):
logos-co.cachix.org 200 <- present
cache.nix.logos.co/public 404
cache.nix.logos.co/ci 404
cache.nixos.org 404
The failing path is a fixed-output fetch of a crates.io tarball
(crate-alloy-eip7928-0.3.4.tar.gz). With Cachix in the substituters CI never
performed that fetch -- it downloaded the finished path. Dropping Cachix
therefore did not merely cost cache hits: it made CI attempt the fetch for the
first time, and it fails there in ~7 minutes, taking cargo-vendor-dir and the
whole module with it.
The crate itself is healthy: that URL returns 20373 bytes hashing to
407510740da5..., exactly the expected outputHash. So this is not a yanked crate
or a stale hash -- it is an untested assumption ("CI can fetch from crates.io")
that Cachix had been hiding.
Cachix therefore stays as a READ-ONLY substituter until Attic has the paths. It
is credential-free (the cache is public) and nothing publishes to it any more:
pushes go to Attic, public on main and ci elsewhere. Drop these two lines once
Attic is seeded -- and expect that first uncached build to exercise the fetch
path for real.
The Attic side is confirmed working in the failing runs themselves: they
substituted python3-env and doctest from cache.nix.logos.co/public, and the push
step correctly skipped, since these repos have no public-cache environment yet.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
logos-evm-wallet-backend-module
The coordinator for the Logos multi-chain EVM wallet (Rust, rust-first
cdylib). It depends on
eth_rpc_module,
keystore_module, and
token_list_module,
and it also folds in the tx-builder (offline alloy ABI/tx construction).
It owns the central proxy + chain config (and pushes each chain's {endpoint, proxy, proxyRequired} down into eth_rpc), fetches multi-chain balances with
Multicall3 (one eth_call per chain, falling back to per-call), orchestrates
sends (build → sign → broadcast → record), and stores this wallet's own
transaction history (the only history available without a proprietary indexer).
Contract (WalletBackendModule)
Config: set_proxy_config/get_proxy_config, set_chains/get_chains,
test_endpoint. Accounts: create_account, import_mnemonic, list_accounts,
unlock/lock. Watched tokens: set_watched_tokens/get_watched_tokens.
Tokens: get_tokens, add_custom_token. Balances: refresh_balances,
get_balances. Send: estimate_fee, send_native, send_erc20. History:
get_history, refresh_tx_status. Events: balances_updated,
tx_status_changed, proxy_error.
Build & test
cd rust-lib && cargo test --no-default-features # tx-builder (incl. Multicall3), config, history
nix build .#install # -> result/modules/wallet_backend_module/
Building the full module pulls the three dependency modules' published .lidl
contracts to generate the typed modules().<dep> clients. In the Logos workspace
they resolve via flake follows/--override-input to local checkouts.