Mutation Testing: Missing Test Coverage (~184 genuine gaps from 225 mutations) #75

Open
opened 2026-04-06 10:02:20 +00:00 by Skipper · 0 comments
Owner

Mutation Testing: Missing Test Coverage

Ran cargo-mutants against the server workspace. 225 mutations were not caught by existing tests. After manual review, ~184 are genuine test gaps and ~41 are false positives (infrastructure/display code).


True Findings — sorted by priority

🔴 Critical

  • arbiter-server/src/evm/mod.rs:146 — replace Engine::vet_transaction with Ok(()) — Policy engine never invoked; all transactions pass regardless of policy
  • arbiter-server/src/evm/mod.rs:169 — delete ! in vet_transaction (is_empty check) — Inverts logic: compliant txs rejected, violating txs allowed
  • arbiter-server/src/evm/mod.rs:173 — replace == with != in RunKind check — Wrong grant set evaluated for each run kind
  • arbiter-server/src/evm/mod.rs:94 (×7 operator mutations) — </>/<= on valid_from; >/</>= on expires_at — Policy time window boundaries untested; transactions outside valid window could pass
  • arbiter-server/src/evm/mod.rs:94:51 — replace || with && in time window check — Both bounds must fail to reject; weakens time-window policy
  • arbiter-server/src/evm/mod.rs:101 (×3 operator mutations) — >/</>= on max_fee — Fee cap boundary untested; transactions exceeding the cap could pass
  • arbiter-server/src/evm/mod.rs:104 (×3 operator mutations) — >/</>= on max_priority_fee — Priority fee boundary untested
  • arbiter-server/src/evm/mod.rs:105 — replace || with && in fee violation check — Fee policy weakened; only trips when both fees exceeded instead of either
  • arbiter-server/src/evm/mod.rs:114 — replace - with + in rate-limit window calculation — Rate limit window starts in the future; rate limit bypassed
  • arbiter-server/src/evm/mod.rs:122 — replace >= with < in rate limit count check — Rate limit inverted; blocks compliant transactions, allows unlimited ones
  • arbiter-server/src/evm/policies.rs:168 — delete match arm (Some(count), Some(window_secs)) — Rate-limit settings silently ignored when both fields are present
  • arbiter-server/src/crypto/encryption/v1.rs:47 — replace generate_salt with Default::default() — All-zero salt; identical passwords produce identical keys
  • arbiter-server/src/crypto/integrity/v1.rs:72 — replace push_len_prefixed with () — Length prefix omitted from MAC input; authentication codes become collision-prone
  • arbiter-server/src/crypto/integrity/v1.rs:96 (×3) — replace into_id with vec![] / vec![0] / vec![1] — Wrong entity ID bytes in MAC input; all integrity checks fail or collide
  • arbiter-server/src/crypto/integrity/v1.rs:123 — delete match arm SendError::HandlerError — Keyholder signing errors masked; transaction failures silently swallowed
  • arbiter-server/src/evm/safe_signer.rs:46 (×2) — replace generate with trivial key bytes — Deterministic/trivial private key; all generated wallets share a known weak key
  • arbiter-server/src/evm/safe_signer.rs:95 — delete ! in sign_tx_inner — Chain ID mismatch no longer detected; cross-chain replay attacks possible
  • arbiter-server/src/evm/safe_signer.rs:139 (×2) — replace chain_id_sync with None / Some(Default) — Wrong chain ID returned; EIP-155 replay protection disabled or applied to wrong chain
  • arbiter-server/src/evm/safe_signer.rs:146 — replace TxSigner::address with Default::default() — Zero address returned; signer identity mismatch
  • arbiter-server/src/evm/safe_signer.rs:159 — replace TxSignerSync::address with Default::default() — Same as above, sync variant
  • arbiter-server/src/actors/bootstrap.rs:13 (×2) — replace generate_token with empty / hardcoded string — Predictable/empty bootstrap token; bootstrap authentication bypass
  • arbiter-proto/src/lib.rs:89 (×3) — replace format_challenge with wrong bytes — Wrong challenge bytes; signature verification accepts garbage auth responses
  • arbiter-server/src/actors/user_agent/auth/state.rs:51 — replace get_current_nonce_and_id with Ok((1, 1)) — Hardcoded nonce/ID instead of current DB value; replay attacks possible
  • arbiter-server/src/actors/user_agent/auth/state.rs:114 (×3) — replace create_nonce with constant — Constant nonce enables replay attacks
  • arbiter-server/src/actors/user_agent/auth/state.rs:124 (×2) — replace + with - / * in create_nonce — Nonce arithmetic broken; monotonicity destroyed
  • arbiter-server/src/actors/client/auth.rs:100 (×2) — replace + with - / * in nonce calculation — Client nonce counter broken; replay protection disabled
  • arbiter-server/src/actors/client/auth.rs:145 (×3) — replace insert_client with hardcoded ID — Client ID not from DB; collisions and wrong identity
  • arbiter-server/src/actors/client/auth.rs:213 — replace && with || in sync_client_metadata — Metadata update condition inverted
  • arbiter-server/src/actors/keyholder/mod.rs:324 — replace get_state with Default::default() — Always returns Unbootstrapped; all state-dependent authorization decisions are wrong
  • arbiter-server/src/actors/client/session.rs:33 — replace handle_query_vault_state with Ok(Default) — Wrong vault state returned to client
  • arbiter-server/src/actors/user_agent/auth.rs:92 — delete match arm Err(AuthError::GuardFailed) — Auth guard failures silenced; access control bypass
  • arbiter-server/src/actors/user_agent/auth.rs:96 — delete match arm Err(AuthError::InvalidEvent) — Invalid protocol events ignored; state machine corruption silent
  • arbiter-server/src/actors/user_agent/auth.rs:100 — delete match arm Err(AuthError::TransitionsFailed) — State transition failures ignored; auth state becomes inconsistent
  • arbiter-server/src/actors/flow_coordinator/mod.rs:78 — replace register_user_agent with () — User agent not stored; approval flow lookups fail
  • arbiter-server/src/actors/flow_coordinator/mod.rs:89 — replace register_client with () — Client not stored; connection cannot be resolved during approval
  • arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:31 — replace send_reply with () — Approval reply never sent; waiting client blocks indefinitely
  • arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:76 — replace == with != in on_link_died — Wrong approval cancelled on disconnect; legitimate clients rejected
  • arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:89 — delete ! in client_approval_answer — Denial treated as approval; unauthorized clients gain access
  • arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:96 (×2) — replace += with -= / *= — Approval counter corrupted; "all approved" threshold never reached
  • arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:99 — replace == with != in completion check — Completion condition inverted; approval flow never closes
  • arbiter-server/src/actors/user_agent/session.rs:106 — replace begin_new_client_approval with () — Approval flow never triggered; connected clients silently ignored
  • arbiter-server/src/actors/user_agent/session.rs:161 — replace == with != in on_link_died — Wrong pending approval cancelled on disconnect
  • arbiter-client/src/auth.rs:59 — replace send_auth_challenge_request with Ok(()) — Challenge never sent
  • arbiter-client/src/auth.rs:80 — replace receive_auth_challenge with Ok(Default) — Zero-value challenge returned; response signed over wrong data
  • arbiter-client/src/auth.rs:87 — delete match arm ClientResponsePayload::Auth in receive_auth_challenge — Challenge never unpacked
  • arbiter-client/src/auth.rs:101 — replace send_auth_challenge_solution with Ok(()) — Solution never transmitted
  • arbiter-client/src/auth.rs:120 — replace receive_auth_confirmation with Ok(()) — Confirmation never awaited; auth silently "succeeds"
  • arbiter-client/src/auth.rs:127 — delete match arm ClientResponsePayload::Auth in receive_auth_confirmation — Confirmation branch deleted
  • arbiter-client/src/auth.rs:129 (×3) — replace success guard with true / false / != — Auth failure silently treated as success; authentication bypass
  • arbiter-client/src/auth.rs:133 — delete match arm Some(AuthResponsePayload::Result(result)) — Auth failure silently ignored
  • arbiter-client/src/auth.rs:145 — replace authenticate with Ok(()) — Entire auth handshake skipped
  • arbiter-client/src/wallets/evm.rs:80 — replace validate_chain_id with Ok(()) — Chain ID validation skipped; transactions signed for wrong chain
  • arbiter-client/src/wallets/evm.rs:81 (×2) — replace && with || / delete ! in validate_chain_id — Mismatch accepted / match rejected
  • arbiter-client/src/wallets/evm.rs:96 — replace sign_hash with Ok(Default) — Default zero-signature returned
  • arbiter-client/src/wallets/evm.rs:124 — replace sign_transaction with Ok(Default) — Default zero-signature returned for full transaction signing
  • arbiter-client/src/wallets/evm.rs:150 — replace != with == in sign_transaction — Mismatched request/response IDs accepted
  • arbiter-server/src/actors/user_agent/session/connection.rs:283 — replace handle_query_vault_state with Ok(Default) — Always returns Unbootstrapped to user agent
  • arbiter-server/src/grpc/user_agent/vault.rs:85 — replace handle_unseal_start with Ok(None) — Server ephemeral key never sent; unseal handshake cannot proceed
  • arbiter-server/src/grpc/user_agent/vault.rs:108 — replace handle_unseal_encrypted_key with Ok(None) — Unseal result never communicated
  • arbiter-server/src/grpc/user_agent/vault.rs:142 — replace handle_bootstrap_encrypted_key with Ok(None) — Bootstrap result dropped; client never learns if bootstrap succeeded
  • arbiter-server/src/grpc/user_agent/vault.rs:168 — replace handle_query_vault_state with Ok(None) — Vault state response never returned to user agent

🟠 High

  • arbiter-server/src/grpc/request_tracker.rs:10 (×3) — replace request with Ok(0/1/-1) — Request ID tracking broken; all requests get same ID
  • arbiter-server/src/grpc/request_tracker.rs:10 (×3) — replace < with == / > / <= — Out-of-order and duplicate IDs not detected
  • arbiter-server/src/grpc/request_tracker.rs:24 (×3) — replace current_request_id with constant — Response ID offset broken; wrong responses matched
  • arbiter-server/src/grpc/request_tracker.rs:24 (×2) — replace - with + / / — Off-by-one in response ID
  • arbiter-server/src/actors/evm/mod.rs:91 (×3) — replace EvmActor::generate with hardcoded tuple — Wallet ID not from DB; causes collisions
  • arbiter-server/src/actors/evm/mod.rs:117 (×4) — replace EvmActor::list_wallets with empty/stub — Wallet listing bypassed
  • arbiter-server/src/actors/evm/mod.rs:139 (×3) — replace useragent_create_grant with hardcoded ID — Grant ID not from DB; all grants collide
  • arbiter-server/src/actors/evm/mod.rs:186 — replace useragent_list_grants with Ok(vec![]) — All active grants invisible
  • arbiter-server/src/evm/mod.rs:213 (×3) — replace Engine::create_grant with hardcoded ID — Grant ID not from DB
  • arbiter-server/src/evm/mod.rs:277 — replace Engine::list_one_kind with Ok(empty) — Grants not fetched; policy engine sees no grants
  • arbiter-server/src/evm/mod.rs:294 — replace Engine::list_all_grants with Ok(vec![]) — All grants hidden
  • arbiter-server/src/actors/user_agent/session/connection.rs:301 (×3) — replace handle_evm_wallet_create with hardcoded tuple — Wallet ID not from DB
  • arbiter-server/src/actors/user_agent/session/connection.rs:315 (×4) — replace handle_evm_wallet_list with stubs — Wallet list bypassed
  • arbiter-server/src/actors/user_agent/session/connection.rs:329 — replace handle_grant_list with Ok(vec![]) — Grant list bypassed
  • arbiter-server/src/actors/user_agent/session/connection.rs:344 (×3) — replace handle_grant_create with hardcoded ID — Grant ID not from DB
  • arbiter-server/src/actors/user_agent/session/connection.rs:364 — replace handle_grant_delete with Ok(()) — Grant never deleted; access remains active
  • arbiter-server/src/actors/user_agent/session/connection.rs:413 — replace handle_grant_evm_wallet_access with Ok(()) — Access grant DB insert skipped
  • arbiter-server/src/actors/user_agent/session/connection.rs:438 — replace handle_revoke_evm_wallet_access with Ok(()) — Access revocation DB delete skipped
  • arbiter-server/src/actors/user_agent/session/connection.rs:460 — replace handle_list_wallet_access with Ok(vec![]) — All access entries hidden
  • arbiter-server/src/actors/user_agent/session/connection.rs:479 — replace handle_new_client_approve with Ok(()) — Approval controller never notified
  • arbiter-server/src/actors/user_agent/session/connection.rs:508 — replace handle_sdk_client_list with Ok(vec![]) — All connected clients invisible
  • arbiter-server/src/grpc/user_agent/evm.rs:67 — replace handle_wallet_create with Ok(None) — Response never sent; client receives no wallet ID
  • arbiter-server/src/grpc/user_agent/evm.rs:87 — replace handle_wallet_list with Ok(None) — Wallet list response dropped
  • arbiter-server/src/grpc/user_agent/evm.rs:112 — replace handle_grant_list with Ok(None) — Grant list response dropped
  • arbiter-server/src/grpc/user_agent/evm.rs:140 — replace handle_grant_create with Ok(None) — Grant ID response dropped
  • arbiter-server/src/grpc/user_agent/evm.rs:170 — replace handle_grant_delete with Ok(None) — Delete result dropped
  • arbiter-server/src/grpc/user_agent/evm.rs:196 — replace handle_sign_transaction with Ok(None) — Signature bytes never returned to user agent
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:114 — replace handle_list with Ok(None) — Client list response dropped
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:183 — replace handle_list_wallet_access with Ok(None) — Access list response dropped
  • arbiter-server/src/grpc/user_agent/inbound.rs:26 — replace address_from_bytes with Ok(Default) — Wrong-length input accepted as zero address
  • arbiter-server/src/grpc/user_agent/inbound.rs:26 — replace != with == in length check — Length check inverted; valid addresses rejected, invalid accepted
  • arbiter-server/src/grpc/user_agent/inbound.rs:33 — replace u256_from_proto_bytes with Ok(Default) — All amounts silently zeroed
  • arbiter-server/src/grpc/user_agent/inbound.rs:33 (×3) — replace > with == / < / >= in length check — U256 byte-length boundary unchecked
  • arbiter-server/src/grpc/common/inbound.rs:12 — replace RawEvmAddress::try_convert with Ok(Default) — Malformed addresses accepted
  • arbiter-server/src/grpc/common/inbound.rs:31 — replace RawEvmTransaction::try_convert with Ok(Default) — Malformed transactions accepted; empty tx bypasses all field validation

🟡 Medium

  • arbiter-server/src/grpc/user_agent/outbound.rs:23 — replace DateTime::convert with Default — Timestamp serialization untested; zero epoch breaks time-based grant display
  • arbiter-server/src/grpc/user_agent/outbound.rs:34 — replace TransactionRateLimit::convert with Default — Rate limit silently zeroed in response
  • arbiter-server/src/grpc/user_agent/outbound.rs:45 — replace VolumeRateLimit::convert with Default — Volume limit zeroed in response
  • arbiter-server/src/grpc/user_agent/outbound.rs:56 — replace SharedGrantSettings::convert with Default — All grant settings lost in serialization
  • arbiter-server/src/grpc/user_agent/outbound.rs:76 — replace SpecificGrant::convert with Default — Grant type (ether vs token) lost
  • arbiter-server/src/grpc/user_agent/outbound.rs:103 — replace EvmWalletAccess::convert with Default — Wallet access data lost in serialization
  • arbiter-server/src/grpc/common/outbound.rs:26 (×3) — replace u256_to_proto_bytes with wrong bytes — U256 amounts lost in all proto responses
  • arbiter-server/src/grpc/common/outbound.rs:33 — replace SpecificMeaning::convert with Default — Transaction meaning (ether/token) lost
  • arbiter-server/src/grpc/common/outbound.rs:63 — replace EvalViolation::convert with Default — Policy violation details lost; client cannot show which constraint was violated
  • arbiter-client/src/wallets/evm.rs:45 — replace TryFrom<&Error> with Ok(Default) — Wrong error types accepted as ArbiterEvmSignTransactionError
  • arbiter-client/src/wallets/evm.rs:46 — replace && with || in error downcast — Both conditions needed; || accepts wrong types
  • arbiter-client/src/wallets/evm.rs:71 — replace address with Default::default() — Wallet returns zero address
  • arbiter-client/src/wallets/evm.rs:75 — replace with_chain_id with Default::default() — Chain ID assignment lost
  • arbiter-client/src/wallets/evm.rs:102 — replace Signer::address with Default — Signer trait impl returns zero address
  • arbiter-client/src/wallets/evm.rs:106 (×2) — replace chain_id with None / Some(Default) — Wrong chain ID from Signer trait
  • arbiter-client/src/wallets/evm.rs:110 — replace set_chain_id with () — Chain ID not stored; reads return stale value
  • arbiter-client/src/wallets/evm.rs:117 — replace TxSigner::address with Default — TxSigner trait impl returns zero address
  • arbiter-client/src/transport.rs:9 (×3) — replace next_request_id with constant — Request IDs not incremented; all requests collide
  • arbiter-client/src/transport.rs:31 — replace ClientTransport::send with Ok(()) — Messages silently dropped
  • arbiter-client/src/transport.rs:38 — replace ClientTransport::recv with Ok(Default) — Default response returned instead of real server data
  • arbiter-client/src/storage.rs:70 (×3) — replace AlreadyExists guard with true / false / != — Concurrent file-creation race not handled correctly
  • arbiter-server/src/db/models.rs:41 — replace SqliteTimestamp::from with Default — All timestamps become Unix epoch zero
  • arbiter-proto/src/transport/grpc.rs:18 — replace GrpcSender::send with Ok(()) — Send errors silenced; channel-closed failures hidden
  • arbiter-proto/src/transport/grpc.rs:34 — replace GrpcReceiver::recv with None — Stream immediately closed
  • arbiter-proto/src/transport/grpc.rs:66 — replace GrpcBi::send with Ok(()) — Same as GrpcSender
  • arbiter-proto/src/transport/grpc.rs:77 — replace GrpcBi::recv with None — Same as GrpcReceiver

🟢 Low

  • arbiter-server/src/utils.rs:7 — replace DeferClosure::drop with () — Deferred closure never runs; resource cleanup silently skipped

False Positives

These mutations were not caught by tests but represent no real test gap.

  • arbiter-client/src/bin/test_connect.rs:8 — replace main with () — Test binary entry point; infrastructure
  • arbiter-client/src/client.rs:92 (×2) — replace evm_wallets with stubs — Function body is todo!(); unimplemented feature stub
  • arbiter-proto/src/lib.rs:76 — replace home_path with Ok(Default) — Path construction; OS infrastructure, no business logic
  • arbiter-proto/src/transport.rs:151 — replace DummyTransport::recv with NoneDummyTransport is test infrastructure itself; documented no-op
  • arbiter-server/src/db/mod.rs:52 — replace database_path with Ok(Default) — OS path construction; infrastructure
  • arbiter-server/src/db/mod.rs:62 — replace db_config with Ok(()) — SQLite PRAGMA setup; configuration side-effect, no unit-testable logic
  • arbiter-server/src/safe_cell.rs:58 — replace MemSafeCell::fmt (Debug) with Ok(Default)Debug impl; display output only
  • arbiter-server/src/context/tls.rs:56 — replace encode_cert_to_pem with Default — Thin wrapper around pem library; no independent logic
  • arbiter-server/src/context/tls.rs:245 — replace TlsManager::cert_pem with Default — Simple getter; display/accessor
  • arbiter-server/src/context/tls.rs:248 (×2) — replace TlsManager::key_pem with "" / "xyzzy" — Simple getter; accessor/display
  • arbiter-server/src/actors/user_agent/mod.rs:25 — replace EcdsaVisitor::expecting with Ok(Default) — Serde expecting(); human-readable error hint only
  • arbiter-server/src/evm/safe_signer.rs:30 — replace SafeSigner::fmt (Debug) with Ok(Default)Debug impl; display only
  • arbiter-server/src/evm/policies/ether_transfer/mod.rs:45 — replace Display::fmt with Ok(Default)Display impl; output only
  • arbiter-server/src/evm/policies/token_transfers/mod.rs:53 — replace Display::fmt with Ok(Default)Display impl; output only
  • arbiter-server/src/actors/evm/mod.rs:181 — replace useragent_delete_grant with Ok(()) — Function body is todo!(); unimplemented
  • arbiter-server/src/actors/flow_coordinator/mod.rs:32 — replace FlowCoordinator::on_start with Ok(Default)Default (empty HashMaps) is the correct initial state
  • arbiter-server/src/actors/user_agent/session/connection.rs:222 — replace handle_bootstrap_encrypted_key with Ok(()) — Substantial handler but exercised through higher-level integration paths
  • arbiter-server/src/grpc/client.rs:28 — replace dispatch_loop with () — Long-running async stream loop; not unit-testable in isolation
  • arbiter-server/src/grpc/client.rs:94 — replace start with () — Orchestration entry point; tested via integration
  • arbiter-server/src/grpc/user_agent.rs:33 — replace OutOfBandAdapter::send with Ok(()) — Pure delegation to inner transport; no added logic
  • arbiter-server/src/grpc/user_agent.rs:46 — replace dispatch_loop with () — Long-running async loop
  • arbiter-server/src/grpc/user_agent.rs:110 — replace dispatch_inner with Ok(None) — Dispatcher delegates to sub-handlers tested independently
  • arbiter-server/src/grpc/user_agent.rs:125 — replace start with () — Orchestration entry point
  • arbiter-server/src/grpc/client/auth.rs:81 — replace send_client_response with Ok(()) — Delegation wrapper; no validation logic
  • arbiter-server/src/grpc/client/auth.rs:92 — replace send_auth_result with Ok(()) — Thin wrapper calling send_client_response
  • arbiter-server/src/grpc/client/auth.rs:103 — replace Sender::send with Ok(()) — Transport delegation
  • arbiter-server/src/grpc/client/auth.rs:115 — replace Receiver::recv with None — Transport delegation
  • arbiter-server/src/grpc/client/auth.rs:203 (×3) — replace start with Ok(0/1/-1) — Orchestration; protocol correctness tested at lower layer
  • arbiter-server/src/grpc/user_agent/auth.rs:46 — replace send_user_agent_response with Ok(()) — Delegation wrapper
  • arbiter-server/src/grpc/user_agent/auth.rs:63 — replace Sender::send with Ok(()) — Transport delegation
  • arbiter-server/src/grpc/user_agent/auth.rs:98 — replace Receiver::recv with None — Transport delegation
  • arbiter-server/src/grpc/user_agent/evm.rs:50 — replace dispatch with Ok(None) — Dispatcher; delegates to sub-handlers
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:64 — replace dispatch with Ok(None) — Dispatcher
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:92 — replace handle_connection_response with Ok(None)None is the correct return; no outbound response needed
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:146 — replace handle_grant_wallet_access with Ok(None)None is correct; no response needed
  • arbiter-server/src/grpc/user_agent/sdk_client.rs:163 — replace handle_revoke_wallet_access with Ok(None)None is correct; no response needed
  • arbiter-server/src/grpc/user_agent/vault.rs:56 — replace dispatch with Ok(None) — Dispatcher
  • arbiter-server/src/grpc/user_agent/vault.rs:71 — replace dispatch_unseal_request with Ok(None) — Dispatcher
  • arbiter-server/src/grpc/user_agent/vault.rs:132 — replace handle_bootstrap_request with Ok(None) — Thin wrapper delegating to handle_bootstrap_encrypted_key
## Mutation Testing: Missing Test Coverage Ran `cargo-mutants` against the server workspace. **225 mutations** were not caught by existing tests. After manual review, **~184 are genuine test gaps** and **~41 are false positives** (infrastructure/display code). --- ## True Findings — sorted by priority ### 🔴 Critical - [ ] `arbiter-server/src/evm/mod.rs:146` — replace `Engine::vet_transaction` with `Ok(())` — Policy engine never invoked; all transactions pass regardless of policy - [ ] `arbiter-server/src/evm/mod.rs:169` — delete `!` in `vet_transaction` (is_empty check) — Inverts logic: compliant txs rejected, violating txs allowed - [ ] `arbiter-server/src/evm/mod.rs:173` — replace `==` with `!=` in RunKind check — Wrong grant set evaluated for each run kind - [ ] `arbiter-server/src/evm/mod.rs:94` (×7 operator mutations) — `<`/`>`/`<=` on `valid_from`; `>`/`<`/`>=` on `expires_at` — Policy time window boundaries untested; transactions outside valid window could pass - [ ] `arbiter-server/src/evm/mod.rs:94:51` — replace `||` with `&&` in time window check — Both bounds must fail to reject; weakens time-window policy - [ ] `arbiter-server/src/evm/mod.rs:101` (×3 operator mutations) — `>`/`<`/`>=` on `max_fee` — Fee cap boundary untested; transactions exceeding the cap could pass - [ ] `arbiter-server/src/evm/mod.rs:104` (×3 operator mutations) — `>`/`<`/`>=` on `max_priority_fee` — Priority fee boundary untested - [ ] `arbiter-server/src/evm/mod.rs:105` — replace `||` with `&&` in fee violation check — Fee policy weakened; only trips when both fees exceeded instead of either - [ ] `arbiter-server/src/evm/mod.rs:114` — replace `-` with `+` in rate-limit window calculation — Rate limit window starts in the future; rate limit bypassed - [ ] `arbiter-server/src/evm/mod.rs:122` — replace `>=` with `<` in rate limit count check — Rate limit inverted; blocks compliant transactions, allows unlimited ones - [ ] `arbiter-server/src/evm/policies.rs:168` — delete match arm `(Some(count), Some(window_secs))` — Rate-limit settings silently ignored when both fields are present - [ ] `arbiter-server/src/crypto/encryption/v1.rs:47` — replace `generate_salt` with `Default::default()` — All-zero salt; identical passwords produce identical keys - [ ] `arbiter-server/src/crypto/integrity/v1.rs:72` — replace `push_len_prefixed` with `()` — Length prefix omitted from MAC input; authentication codes become collision-prone - [ ] `arbiter-server/src/crypto/integrity/v1.rs:96` (×3) — replace `into_id` with `vec![]` / `vec![0]` / `vec![1]` — Wrong entity ID bytes in MAC input; all integrity checks fail or collide - [ ] `arbiter-server/src/crypto/integrity/v1.rs:123` — delete match arm `SendError::HandlerError` — Keyholder signing errors masked; transaction failures silently swallowed - [ ] `arbiter-server/src/evm/safe_signer.rs:46` (×2) — replace `generate` with trivial key bytes — Deterministic/trivial private key; all generated wallets share a known weak key - [ ] `arbiter-server/src/evm/safe_signer.rs:95` — delete `!` in `sign_tx_inner` — Chain ID mismatch no longer detected; cross-chain replay attacks possible - [ ] `arbiter-server/src/evm/safe_signer.rs:139` (×2) — replace `chain_id_sync` with `None` / `Some(Default)` — Wrong chain ID returned; EIP-155 replay protection disabled or applied to wrong chain - [ ] `arbiter-server/src/evm/safe_signer.rs:146` — replace `TxSigner::address` with `Default::default()` — Zero address returned; signer identity mismatch - [ ] `arbiter-server/src/evm/safe_signer.rs:159` — replace `TxSignerSync::address` with `Default::default()` — Same as above, sync variant - [ ] `arbiter-server/src/actors/bootstrap.rs:13` (×2) — replace `generate_token` with empty / hardcoded string — Predictable/empty bootstrap token; bootstrap authentication bypass - [ ] `arbiter-proto/src/lib.rs:89` (×3) — replace `format_challenge` with wrong bytes — Wrong challenge bytes; signature verification accepts garbage auth responses - [ ] `arbiter-server/src/actors/user_agent/auth/state.rs:51` — replace `get_current_nonce_and_id` with `Ok((1, 1))` — Hardcoded nonce/ID instead of current DB value; replay attacks possible - [ ] `arbiter-server/src/actors/user_agent/auth/state.rs:114` (×3) — replace `create_nonce` with constant — Constant nonce enables replay attacks - [ ] `arbiter-server/src/actors/user_agent/auth/state.rs:124` (×2) — replace `+` with `-` / `*` in `create_nonce` — Nonce arithmetic broken; monotonicity destroyed - [ ] `arbiter-server/src/actors/client/auth.rs:100` (×2) — replace `+` with `-` / `*` in nonce calculation — Client nonce counter broken; replay protection disabled - [ ] `arbiter-server/src/actors/client/auth.rs:145` (×3) — replace `insert_client` with hardcoded ID — Client ID not from DB; collisions and wrong identity - [ ] `arbiter-server/src/actors/client/auth.rs:213` — replace `&&` with `||` in `sync_client_metadata` — Metadata update condition inverted - [ ] `arbiter-server/src/actors/keyholder/mod.rs:324` — replace `get_state` with `Default::default()` — Always returns `Unbootstrapped`; all state-dependent authorization decisions are wrong - [ ] `arbiter-server/src/actors/client/session.rs:33` — replace `handle_query_vault_state` with `Ok(Default)` — Wrong vault state returned to client - [ ] `arbiter-server/src/actors/user_agent/auth.rs:92` — delete match arm `Err(AuthError::GuardFailed)` — Auth guard failures silenced; access control bypass - [ ] `arbiter-server/src/actors/user_agent/auth.rs:96` — delete match arm `Err(AuthError::InvalidEvent)` — Invalid protocol events ignored; state machine corruption silent - [ ] `arbiter-server/src/actors/user_agent/auth.rs:100` — delete match arm `Err(AuthError::TransitionsFailed)` — State transition failures ignored; auth state becomes inconsistent - [ ] `arbiter-server/src/actors/flow_coordinator/mod.rs:78` — replace `register_user_agent` with `()` — User agent not stored; approval flow lookups fail - [ ] `arbiter-server/src/actors/flow_coordinator/mod.rs:89` — replace `register_client` with `()` — Client not stored; connection cannot be resolved during approval - [ ] `arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:31` — replace `send_reply` with `()` — Approval reply never sent; waiting client blocks indefinitely - [ ] `arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:76` — replace `==` with `!=` in `on_link_died` — Wrong approval cancelled on disconnect; legitimate clients rejected - [ ] `arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:89` — delete `!` in `client_approval_answer` — Denial treated as approval; unauthorized clients gain access - [ ] `arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:96` (×2) — replace `+=` with `-=` / `*=` — Approval counter corrupted; "all approved" threshold never reached - [ ] `arbiter-server/src/actors/flow_coordinator/client_connect_approval.rs:99` — replace `==` with `!=` in completion check — Completion condition inverted; approval flow never closes - [ ] `arbiter-server/src/actors/user_agent/session.rs:106` — replace `begin_new_client_approval` with `()` — Approval flow never triggered; connected clients silently ignored - [ ] `arbiter-server/src/actors/user_agent/session.rs:161` — replace `==` with `!=` in `on_link_died` — Wrong pending approval cancelled on disconnect - [ ] `arbiter-client/src/auth.rs:59` — replace `send_auth_challenge_request` with `Ok(())` — Challenge never sent - [ ] `arbiter-client/src/auth.rs:80` — replace `receive_auth_challenge` with `Ok(Default)` — Zero-value challenge returned; response signed over wrong data - [ ] `arbiter-client/src/auth.rs:87` — delete match arm `ClientResponsePayload::Auth` in `receive_auth_challenge` — Challenge never unpacked - [ ] `arbiter-client/src/auth.rs:101` — replace `send_auth_challenge_solution` with `Ok(())` — Solution never transmitted - [ ] `arbiter-client/src/auth.rs:120` — replace `receive_auth_confirmation` with `Ok(())` — Confirmation never awaited; auth silently "succeeds" - [ ] `arbiter-client/src/auth.rs:127` — delete match arm `ClientResponsePayload::Auth` in `receive_auth_confirmation` — Confirmation branch deleted - [ ] `arbiter-client/src/auth.rs:129` (×3) — replace success guard with `true` / `false` / `!=` — Auth failure silently treated as success; authentication bypass - [ ] `arbiter-client/src/auth.rs:133` — delete match arm `Some(AuthResponsePayload::Result(result))` — Auth failure silently ignored - [ ] `arbiter-client/src/auth.rs:145` — replace `authenticate` with `Ok(())` — Entire auth handshake skipped - [ ] `arbiter-client/src/wallets/evm.rs:80` — replace `validate_chain_id` with `Ok(())` — Chain ID validation skipped; transactions signed for wrong chain - [ ] `arbiter-client/src/wallets/evm.rs:81` (×2) — replace `&&` with `||` / delete `!` in `validate_chain_id` — Mismatch accepted / match rejected - [ ] `arbiter-client/src/wallets/evm.rs:96` — replace `sign_hash` with `Ok(Default)` — Default zero-signature returned - [ ] `arbiter-client/src/wallets/evm.rs:124` — replace `sign_transaction` with `Ok(Default)` — Default zero-signature returned for full transaction signing - [ ] `arbiter-client/src/wallets/evm.rs:150` — replace `!=` with `==` in `sign_transaction` — Mismatched request/response IDs accepted - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:283` — replace `handle_query_vault_state` with `Ok(Default)` — Always returns `Unbootstrapped` to user agent - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:85` — replace `handle_unseal_start` with `Ok(None)` — Server ephemeral key never sent; unseal handshake cannot proceed - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:108` — replace `handle_unseal_encrypted_key` with `Ok(None)` — Unseal result never communicated - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:142` — replace `handle_bootstrap_encrypted_key` with `Ok(None)` — Bootstrap result dropped; client never learns if bootstrap succeeded - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:168` — replace `handle_query_vault_state` with `Ok(None)` — Vault state response never returned to user agent ### 🟠 High - [ ] `arbiter-server/src/grpc/request_tracker.rs:10` (×3) — replace `request` with `Ok(0/1/-1)` — Request ID tracking broken; all requests get same ID - [ ] `arbiter-server/src/grpc/request_tracker.rs:10` (×3) — replace `<` with `==` / `>` / `<=` — Out-of-order and duplicate IDs not detected - [ ] `arbiter-server/src/grpc/request_tracker.rs:24` (×3) — replace `current_request_id` with constant — Response ID offset broken; wrong responses matched - [ ] `arbiter-server/src/grpc/request_tracker.rs:24` (×2) — replace `-` with `+` / `/` — Off-by-one in response ID - [ ] `arbiter-server/src/actors/evm/mod.rs:91` (×3) — replace `EvmActor::generate` with hardcoded tuple — Wallet ID not from DB; causes collisions - [ ] `arbiter-server/src/actors/evm/mod.rs:117` (×4) — replace `EvmActor::list_wallets` with empty/stub — Wallet listing bypassed - [ ] `arbiter-server/src/actors/evm/mod.rs:139` (×3) — replace `useragent_create_grant` with hardcoded ID — Grant ID not from DB; all grants collide - [ ] `arbiter-server/src/actors/evm/mod.rs:186` — replace `useragent_list_grants` with `Ok(vec![])` — All active grants invisible - [ ] `arbiter-server/src/evm/mod.rs:213` (×3) — replace `Engine::create_grant` with hardcoded ID — Grant ID not from DB - [ ] `arbiter-server/src/evm/mod.rs:277` — replace `Engine::list_one_kind` with `Ok(empty)` — Grants not fetched; policy engine sees no grants - [ ] `arbiter-server/src/evm/mod.rs:294` — replace `Engine::list_all_grants` with `Ok(vec![])` — All grants hidden - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:301` (×3) — replace `handle_evm_wallet_create` with hardcoded tuple — Wallet ID not from DB - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:315` (×4) — replace `handle_evm_wallet_list` with stubs — Wallet list bypassed - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:329` — replace `handle_grant_list` with `Ok(vec![])` — Grant list bypassed - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:344` (×3) — replace `handle_grant_create` with hardcoded ID — Grant ID not from DB - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:364` — replace `handle_grant_delete` with `Ok(())` — Grant never deleted; access remains active - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:413` — replace `handle_grant_evm_wallet_access` with `Ok(())` — Access grant DB insert skipped - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:438` — replace `handle_revoke_evm_wallet_access` with `Ok(())` — Access revocation DB delete skipped - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:460` — replace `handle_list_wallet_access` with `Ok(vec![])` — All access entries hidden - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:479` — replace `handle_new_client_approve` with `Ok(())` — Approval controller never notified - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:508` — replace `handle_sdk_client_list` with `Ok(vec![])` — All connected clients invisible - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:67` — replace `handle_wallet_create` with `Ok(None)` — Response never sent; client receives no wallet ID - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:87` — replace `handle_wallet_list` with `Ok(None)` — Wallet list response dropped - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:112` — replace `handle_grant_list` with `Ok(None)` — Grant list response dropped - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:140` — replace `handle_grant_create` with `Ok(None)` — Grant ID response dropped - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:170` — replace `handle_grant_delete` with `Ok(None)` — Delete result dropped - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:196` — replace `handle_sign_transaction` with `Ok(None)` — Signature bytes never returned to user agent - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:114` — replace `handle_list` with `Ok(None)` — Client list response dropped - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:183` — replace `handle_list_wallet_access` with `Ok(None)` — Access list response dropped - [ ] `arbiter-server/src/grpc/user_agent/inbound.rs:26` — replace `address_from_bytes` with `Ok(Default)` — Wrong-length input accepted as zero address - [ ] `arbiter-server/src/grpc/user_agent/inbound.rs:26` — replace `!=` with `==` in length check — Length check inverted; valid addresses rejected, invalid accepted - [ ] `arbiter-server/src/grpc/user_agent/inbound.rs:33` — replace `u256_from_proto_bytes` with `Ok(Default)` — All amounts silently zeroed - [ ] `arbiter-server/src/grpc/user_agent/inbound.rs:33` (×3) — replace `>` with `==` / `<` / `>=` in length check — U256 byte-length boundary unchecked - [ ] `arbiter-server/src/grpc/common/inbound.rs:12` — replace `RawEvmAddress::try_convert` with `Ok(Default)` — Malformed addresses accepted - [ ] `arbiter-server/src/grpc/common/inbound.rs:31` — replace `RawEvmTransaction::try_convert` with `Ok(Default)` — Malformed transactions accepted; empty tx bypasses all field validation ### 🟡 Medium - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:23` — replace `DateTime::convert` with `Default` — Timestamp serialization untested; zero epoch breaks time-based grant display - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:34` — replace `TransactionRateLimit::convert` with `Default` — Rate limit silently zeroed in response - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:45` — replace `VolumeRateLimit::convert` with `Default` — Volume limit zeroed in response - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:56` — replace `SharedGrantSettings::convert` with `Default` — All grant settings lost in serialization - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:76` — replace `SpecificGrant::convert` with `Default` — Grant type (ether vs token) lost - [ ] `arbiter-server/src/grpc/user_agent/outbound.rs:103` — replace `EvmWalletAccess::convert` with `Default` — Wallet access data lost in serialization - [ ] `arbiter-server/src/grpc/common/outbound.rs:26` (×3) — replace `u256_to_proto_bytes` with wrong bytes — U256 amounts lost in all proto responses - [ ] `arbiter-server/src/grpc/common/outbound.rs:33` — replace `SpecificMeaning::convert` with `Default` — Transaction meaning (ether/token) lost - [ ] `arbiter-server/src/grpc/common/outbound.rs:63` — replace `EvalViolation::convert` with `Default` — Policy violation details lost; client cannot show which constraint was violated - [ ] `arbiter-client/src/wallets/evm.rs:45` — replace `TryFrom<&Error>` with `Ok(Default)` — Wrong error types accepted as `ArbiterEvmSignTransactionError` - [ ] `arbiter-client/src/wallets/evm.rs:46` — replace `&&` with `||` in error downcast — Both conditions needed; `||` accepts wrong types - [ ] `arbiter-client/src/wallets/evm.rs:71` — replace `address` with `Default::default()` — Wallet returns zero address - [ ] `arbiter-client/src/wallets/evm.rs:75` — replace `with_chain_id` with `Default::default()` — Chain ID assignment lost - [ ] `arbiter-client/src/wallets/evm.rs:102` — replace `Signer::address` with `Default` — Signer trait impl returns zero address - [ ] `arbiter-client/src/wallets/evm.rs:106` (×2) — replace `chain_id` with `None` / `Some(Default)` — Wrong chain ID from Signer trait - [ ] `arbiter-client/src/wallets/evm.rs:110` — replace `set_chain_id` with `()` — Chain ID not stored; reads return stale value - [ ] `arbiter-client/src/wallets/evm.rs:117` — replace `TxSigner::address` with `Default` — TxSigner trait impl returns zero address - [ ] `arbiter-client/src/transport.rs:9` (×3) — replace `next_request_id` with constant — Request IDs not incremented; all requests collide - [ ] `arbiter-client/src/transport.rs:31` — replace `ClientTransport::send` with `Ok(())` — Messages silently dropped - [ ] `arbiter-client/src/transport.rs:38` — replace `ClientTransport::recv` with `Ok(Default)` — Default response returned instead of real server data - [ ] `arbiter-client/src/storage.rs:70` (×3) — replace `AlreadyExists` guard with `true` / `false` / `!=` — Concurrent file-creation race not handled correctly - [ ] `arbiter-server/src/db/models.rs:41` — replace `SqliteTimestamp::from` with `Default` — All timestamps become Unix epoch zero - [ ] `arbiter-proto/src/transport/grpc.rs:18` — replace `GrpcSender::send` with `Ok(())` — Send errors silenced; channel-closed failures hidden - [ ] `arbiter-proto/src/transport/grpc.rs:34` — replace `GrpcReceiver::recv` with `None` — Stream immediately closed - [ ] `arbiter-proto/src/transport/grpc.rs:66` — replace `GrpcBi::send` with `Ok(())` — Same as `GrpcSender` - [ ] `arbiter-proto/src/transport/grpc.rs:77` — replace `GrpcBi::recv` with `None` — Same as `GrpcReceiver` ### 🟢 Low - [ ] `arbiter-server/src/utils.rs:7` — replace `DeferClosure::drop` with `()` — Deferred closure never runs; resource cleanup silently skipped --- ## False Positives These mutations were not caught by tests but represent no real test gap. - [ ] `arbiter-client/src/bin/test_connect.rs:8` — replace `main` with `()` — Test binary entry point; infrastructure - [ ] `arbiter-client/src/client.rs:92` (×2) — replace `evm_wallets` with stubs — Function body is `todo!()`; unimplemented feature stub - [ ] `arbiter-proto/src/lib.rs:76` — replace `home_path` with `Ok(Default)` — Path construction; OS infrastructure, no business logic - [ ] `arbiter-proto/src/transport.rs:151` — replace `DummyTransport::recv` with `None` — `DummyTransport` is test infrastructure itself; documented no-op - [ ] `arbiter-server/src/db/mod.rs:52` — replace `database_path` with `Ok(Default)` — OS path construction; infrastructure - [ ] `arbiter-server/src/db/mod.rs:62` — replace `db_config` with `Ok(())` — SQLite PRAGMA setup; configuration side-effect, no unit-testable logic - [ ] `arbiter-server/src/safe_cell.rs:58` — replace `MemSafeCell::fmt` (Debug) with `Ok(Default)` — `Debug` impl; display output only - [ ] `arbiter-server/src/context/tls.rs:56` — replace `encode_cert_to_pem` with `Default` — Thin wrapper around `pem` library; no independent logic - [ ] `arbiter-server/src/context/tls.rs:245` — replace `TlsManager::cert_pem` with `Default` — Simple getter; display/accessor - [ ] `arbiter-server/src/context/tls.rs:248` (×2) — replace `TlsManager::key_pem` with `""` / `"xyzzy"` — Simple getter; accessor/display - [ ] `arbiter-server/src/actors/user_agent/mod.rs:25` — replace `EcdsaVisitor::expecting` with `Ok(Default)` — Serde `expecting()`; human-readable error hint only - [ ] `arbiter-server/src/evm/safe_signer.rs:30` — replace `SafeSigner::fmt` (Debug) with `Ok(Default)` — `Debug` impl; display only - [ ] `arbiter-server/src/evm/policies/ether_transfer/mod.rs:45` — replace `Display::fmt` with `Ok(Default)` — `Display` impl; output only - [ ] `arbiter-server/src/evm/policies/token_transfers/mod.rs:53` — replace `Display::fmt` with `Ok(Default)` — `Display` impl; output only - [ ] `arbiter-server/src/actors/evm/mod.rs:181` — replace `useragent_delete_grant` with `Ok(())` — Function body is `todo!()`; unimplemented - [ ] `arbiter-server/src/actors/flow_coordinator/mod.rs:32` — replace `FlowCoordinator::on_start` with `Ok(Default)` — `Default` (empty HashMaps) is the correct initial state - [ ] `arbiter-server/src/actors/user_agent/session/connection.rs:222` — replace `handle_bootstrap_encrypted_key` with `Ok(())` — Substantial handler but exercised through higher-level integration paths - [ ] `arbiter-server/src/grpc/client.rs:28` — replace `dispatch_loop` with `()` — Long-running async stream loop; not unit-testable in isolation - [ ] `arbiter-server/src/grpc/client.rs:94` — replace `start` with `()` — Orchestration entry point; tested via integration - [ ] `arbiter-server/src/grpc/user_agent.rs:33` — replace `OutOfBandAdapter::send` with `Ok(())` — Pure delegation to inner transport; no added logic - [ ] `arbiter-server/src/grpc/user_agent.rs:46` — replace `dispatch_loop` with `()` — Long-running async loop - [ ] `arbiter-server/src/grpc/user_agent.rs:110` — replace `dispatch_inner` with `Ok(None)` — Dispatcher delegates to sub-handlers tested independently - [ ] `arbiter-server/src/grpc/user_agent.rs:125` — replace `start` with `()` — Orchestration entry point - [ ] `arbiter-server/src/grpc/client/auth.rs:81` — replace `send_client_response` with `Ok(())` — Delegation wrapper; no validation logic - [ ] `arbiter-server/src/grpc/client/auth.rs:92` — replace `send_auth_result` with `Ok(())` — Thin wrapper calling `send_client_response` - [ ] `arbiter-server/src/grpc/client/auth.rs:103` — replace `Sender::send` with `Ok(())` — Transport delegation - [ ] `arbiter-server/src/grpc/client/auth.rs:115` — replace `Receiver::recv` with `None` — Transport delegation - [ ] `arbiter-server/src/grpc/client/auth.rs:203` (×3) — replace `start` with `Ok(0/1/-1)` — Orchestration; protocol correctness tested at lower layer - [ ] `arbiter-server/src/grpc/user_agent/auth.rs:46` — replace `send_user_agent_response` with `Ok(())` — Delegation wrapper - [ ] `arbiter-server/src/grpc/user_agent/auth.rs:63` — replace `Sender::send` with `Ok(())` — Transport delegation - [ ] `arbiter-server/src/grpc/user_agent/auth.rs:98` — replace `Receiver::recv` with `None` — Transport delegation - [ ] `arbiter-server/src/grpc/user_agent/evm.rs:50` — replace `dispatch` with `Ok(None)` — Dispatcher; delegates to sub-handlers - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:64` — replace `dispatch` with `Ok(None)` — Dispatcher - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:92` — replace `handle_connection_response` with `Ok(None)` — `None` is the correct return; no outbound response needed - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:146` — replace `handle_grant_wallet_access` with `Ok(None)` — `None` is correct; no response needed - [ ] `arbiter-server/src/grpc/user_agent/sdk_client.rs:163` — replace `handle_revoke_wallet_access` with `Ok(None)` — `None` is correct; no response needed - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:56` — replace `dispatch` with `Ok(None)` — Dispatcher - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:71` — replace `dispatch_unseal_request` with `Ok(None)` — Dispatcher - [ ] `arbiter-server/src/grpc/user_agent/vault.rs:132` — replace `handle_bootstrap_request` with `Ok(None)` — Thin wrapper delegating to `handle_bootstrap_encrypted_key`
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MarketTakers/arbiter#75