Skip to content

Coverage matrix

Every test-coverage requirement, mapped to the test that covers it. A requirement with no test is marked pending, not glossed over.

Verified 2026-08-18 against cargo test --workspace — 120 passing, 0 failing, across all seven production contracts.

Policy (sta-policy-engine, 12 tests)

RequirementTestState
Allowed payment acceptedvalidates_allowed_payment_policy
Operation not enabled, unknown asset, unknown recipient rejected in sequencefails_closed_for_unknown_operation_asset_or_recipient
Explicitly disabled asset rejectedvalidate_policy_rejects_explicitly_disabled_asset
Amount cap exceeded, stale version rejectedrejects_stale_policy_version_and_amount_above_limit
Non-positive amount rejectedvalidate_policy_rejects_non_positive_amount
Operation disabled after being enabled blocks further validationdisabling_operation_after_the_fact_blocks_further_validation
Non-monotonic version bump rejectedbump_version_rejects_non_increasing_version
Enabled rule with non-positive cap rejectedset_asset_rule_rejects_enabled_rule_with_non_positive_cap
Call before initialize rejectedcalling_before_initialize_rejects_not_initialized
Persistent entry TTL refreshed on write and readwrites_and_reads_extend_persistent_entry_ttl
Permissionless extend_ttl refreshes named entriespermissionless_extend_ttl_refreshes_named_entries
contract_name() reports the expected symbolcontract_name_reports_expected_symbol

SmartAccount (sta-smart-account, 37 tests)

Payment execution

RequirementTestState
End-to-end transfer through policy and adapterexecutes_transfer_payment_end_to_end_through_policy_and_adapter
Fails closed when the policy engine disallows the assetpayment_fails_closed_when_asset_not_allowed_by_policy_engine
Split fans out and policy-checks each recipient independentlysplit_payment_fans_out_and_policy_checks_each_recipient_independently
Split fails closed if any one recipient is disallowedsplit_payment_fails_closed_if_any_single_recipient_is_not_allowed
Split fails closed if any one recipient's amount exceeds the capsplit_payment_fails_closed_when_one_recipient_amount_exceeds_the_cap
Split rejects a duplicated recipient addresssplit_payment_rejects_duplicate_recipient
Execution without SmartAccount authorization failsexecute_transfer_payment_without_any_authorization_fails

Replay protection

RequirementTestState
Replayed nonce rejectedrejects_replayed_nonce
Nonce replay guard shared across transfer and split operationsnonce_replay_protection_is_shared_across_transfer_and_split_operations
Nonce entry's TTL refreshed on consumptionown_instance_and_nonce_ttl_is_extended_on_use

Pause, freeze, and guardian pull

RequirementTestState
Paused treasury rejects paymentpaused_treasury_rejects_payment
Frozen treasury rejects payment, no direct unfreeze()frozen_treasury_rejects_payment_and_has_no_direct_unfreeze
pause/unpause reject a caller that isn't the ownerpause_rejects_caller_that_does_not_match_owner, unpause_rejects_caller_that_does_not_match_owner
A guardian can independently freeze the treasuryguardian_can_independently_freeze_the_treasury
Guardian freeze applied with no request pending is rejectedapply_guardian_freeze_without_a_request_is_rejected
Freezing blocks scheduled execution toofrozen_treasury_blocks_scheduled_execution

Recovery

RequirementTestState
Recovery replaces owner and lifts freeze, exactly onceapply_recovery_replaces_owner_and_lifts_freeze_exactly_once
Recovery rejected before the request is finalizedapply_recovery_before_finalization_is_rejected

Scheduled payments

RequirementTestState
Creation, then relayer-triggered execution, end to endscheduled_payment_creation_and_relayer_triggered_execution
Execution uses only canonical intent data, never caller-supplied valuesexecute_scheduled_payment_only_ever_uses_the_canonical_intent_data
A policy-version bump between scheduling and execution blocks executionpolicy_version_bump_after_intent_creation_blocks_execution
A cancelled schedule cannot execute end to endcancelled_scheduled_payment_cannot_execute_end_to_end
The adapter pinned at approval survives a later reconfigurationscheduled_payment_uses_the_adapter_pinned_at_approval_not_a_later_reconfiguration
Creating a schedule before any adapter is configured fails fastcreating_a_scheduled_payment_before_an_adapter_is_configured_is_rejected

Adapter timelock

RequirementTestState
Cannot apply before the delay elapsesadapter_change_cannot_be_applied_before_the_delay_elapses
Can be cancelled before it takes effectadapter_change_can_be_cancelled_before_it_takes_effect
Cancelling with nothing pending is rejectedcancel_adapter_change_rejects_when_nothing_is_pending
Applying a change needs no authorization (permissionless by design)applying_an_adapter_change_needs_no_authorization
Propose/apply extend the instance TTLpropose_and_apply_adapter_change_extend_the_instance_ttl

Initialization, ownership, and OZ composition

RequirementTestState
Initializes and reports correct statusinitializes_and_reports_status
contract_name() reports the expected symbolcontract_name_reports_expected_symbol
extend_instance_ttl is permissionless and refreshes TTLextend_instance_ttl_is_permissionless_and_refreshes_ttl
get_owner reflects the configured ownerget_owner_reflects_the_configured_owner
Ownership transfers through the two-step flowownership_transfers_through_the_two_step_flow
A context rule and signer persist through the composed registryadd_context_rule_and_signer_persist_through_the_composed_registry
ExecutionEntryPoint::execute dispatches to a target contractexecution_entry_point_dispatches_to_a_target_contract

Signers and thresholds: what's intentionally not re-tested

The composed OZ stellar-accounts/stellar-access primitives — signer add/revoke/re-weight semantics, threshold-counting math, duplicate-approver handling — are not re-tested in this workspace. That's a deliberate choice, not a gap: those primitives are covered by OpenZeppelin's own upstream suite and audit, and duplicating them here would add maintenance cost while proving nothing new (see Security → "The two guarantees unique to STA"). What is tested is that STA wires those primitives up correctly — add_context_rule_and_signer_persist_through_the_composed_registry above — not that OZ's threshold math is itself correct.

One related, explicitly documented non-guarantee: a context rule's stored threshold is not automatically revalidated when its signer set changes. See SmartAccount and Security for the full detail — this is an operational risk to manage, not something a test could assert away.

IntentRegistry (sta-intent-registry, 14 tests), RecoveryManager (sta-recovery-manager, 35 tests), WebAuthnVerifier (sta-webauthn-verifier, 9 tests), TransferAdapter (sta-transfer-adapter, 5 tests), SplitAdapter (sta-split-adapter, 8 tests)

Covered by their own per-crate test suites — window/cancellation/cumulative- usage enforcement, guardian quorum and timelocks, real secp256r1/Ed25519 signature verification, and narrow preauthorized transfer execution respectively. Run cargo test -p <crate-name> for any of them individually; see Replay protection for the IntentRegistry tests specifically relevant to that guarantee.

Summary

AreaTests
Policy (sta-policy-engine)12
Payment execution (sta-smart-account)7
Replay protection (sta-smart-account)3
Pause, freeze, guardian pull (sta-smart-account)6 (7 test functions, one row covers two)
Recovery (sta-smart-account)2
Scheduled payments (sta-smart-account)6
Adapter timelock (sta-smart-account)5
Init/ownership/OZ composition (sta-smart-account)7
sta-intent-registry14
sta-recovery-manager35
sta-webauthn-verifier9
sta-transfer-adapter5
sta-split-adapter8
Total120

No pending rows remain against this list — everything above has a named, passing test. The scheduled-payment relayer itself (in the separate dApp repository, out of this site's scope) has its own test suite, including dedicated replay-protection tests for the executor — see that repository's REVIEW.md.

The Smart Treasury Account contracts have not been independently audited. OpenZeppelin's Stellar libraries, which they build on, have been.