Skip to content

Contract map ​

This is the inventory of Armada's on-chain contracts — what each one does, which chain it lives on, who controls it, and whether it can be upgraded. Deep mechanics live in the linked sections; concrete addresses for any deployment are in the deployments registry.

Shielded pool ​

ContractChainRoleControlled byUpgradeable
PrivacyPoolHubThe shielded pool router — holds all shielded state, dispatches to the modulesGovernance (timelock)No — immutable core
ShieldModuleHubDeposit logic (local + incoming cross-chain shields)— (immutable, set once)No
TransactModuleHubTransfer and unshield logic— (immutable, set once)No
MerkleModuleHubThe commitment tree— (immutable, set once)No
VerifierModuleHubHolds proof verification keysKeys settable by governanceNo (contract); keys rotatable
PrivacyPoolClientSpokeThin bridge — sends USDC to the hub, delivers unshielded USDC; no shielded stateOwner (hub pointer, hook router, finality)No
CCTPHookRouterHub + SpokeReceives CCTP messages, mints USDC and calls the destination contract atomicallyRelayer-gated relay entrypointNo
GaslessShieldWrapperHubOptional gasless-shield entrypoint — the user signs a USDC permit and a shield intent; any relayer submits and is paid with a shielded fee note— (immutable, permissionless)No
GaslessShieldWrapperClientSpokeThe same, for cross-chain shields — the relayer's fee note is created on the hub once the deposit arrives— (immutable, permissionless)No

See The PrivacyPool and Cross-chain flow.

Yield ​

ContractChainRoleControlled byUpgradeable
ArmadaYieldVaultHubVault that issues yield-bearing shares (ayUSDC) over an external yield sourceGovernanceNo
ArmadaYieldAdapterHubTrustless bridge: unshield → deposit/redeem → shield, in one proven transactionAuthorized via the adapter registryNo

The vault's underlying yield source is external (Aave on mainnet; a mock stands in on testnet). See Shielded yield.

Fees ​

ContractChainRoleControlled byUpgradeable
ArmadaFeeModuleHubComputes shield and yield fees — rates, volume tiers, integrator termsGovernanceYes (UUPS, via timelock)

The fee module computes fees; the fee itself is paid to the treasury (protocol take) and to the integrator (their share). See Fees.

Governance ​

ContractChainRoleControlled byUpgradeable
ArmadaToken (ARM)HubThe protocol token — ownership stake, voting weight— (immutable)No
ArmadaGovernorHubThe governor — proposals, voting, classificationGovernanceYes (UUPS, via timelock)
TimelockControllerHubExecutes passed proposals after their delay; owns the governed contractsGovernorNo
ArmadaTreasuryGovHubThe treasury — holds protocol assets, enforces outflow limitsTimelockNo
TreasuryStewardHubElected role for routine, pass-by-default treasury spendingGovernanceNo
AdapterRegistryHubThe list of adapters authorized to touch the shielded-yield surfaceTimelockNo
ShieldPauseControllerHubSwitches the shielded pool to withdraw-only when wind-down triggersWind-down contract (one-way)No
RevenueCounterHubThe canonical cumulative-revenue figure the unlock schedule readsGovernanceYes (UUPS, via timelock)
RevenueLockHubHolds early-network ARM, releases it as revenue milestones are met— (immutable)No
RevenueReserveDistributorHubHolds the contributor reserve as one revenue-lock beneficiary; pays out irrevocable grants as the reserve unlocksAllocator multisig (add-only grants)No
ArmadaWindDownHubTriggers the terminal wind-down and its sweeps— (immutable trigger logic)No
ArmadaRedemptionHubPost-wind-down pro-rata redemption of treasury assets for ARM— (immutable, permissionless)No
RedemptionRouterHubOptional post-wind-down wrapper that redeems every swept asset in one call; deployed only after wind-down— (immutable, permissionless)No

See Governance, Revenue-based unlock, and Wind-down.

A note on upgradeability ​

Most of Armada is not upgradeable, by design. The shielded pool's core, the ARM token, and the revenue-lock / wind-down / redemption contracts are immutable — participants must be able to trust that their rules cannot change. Only a small set of contracts is upgradeable, each behind a UUPS proxy whose upgrade authority is the governance timelock: the governor, the fee module, and the revenue counter. Those are the places the protocol is expected to evolve (new proposal types, new fee types, new revenue sources), and every upgrade to them runs through the full governance process. The full upgrade scope and its rules are detailed in Governance.

The treasury is deliberately not among them: it is a plain, non-proxied contract, so its logic is fixed for the life of the deployment. Changing treasury logic would mean deploying a new treasury and migrating funds, roles, and references to it — a heavy, governance-coordinated operation (several contracts hold the treasury address as immutable), not an in-place upgrade.