Skip to content
Tenzro
Documentation menu
Keys and identity

Smart-account policies

ERC-7579 validator modules on Tenzro accounts: passkey signers, session keys for agents, spending limits, hardware co-signers and guardian recovery.

Every Tenzro wallet is an ERC-4337 smart account with ERC-7579 validator modules. The modules are the policy: they decide, at signing time and on-chain, which signatures an operation needs and what it is allowed to do. Because the account address is the identity and the modules are the policy, you can add devices, grant agents limited power and recover from loss without the address ever changing.

Modules on every account

ModuleRole
WebAuthn validatorThe primary signer. Holds each enrolled device's P-256 passkey key and ML-DSA-65 key and requires a hybrid signature with user verification.
Session key validatorLets an agent or app sign within a narrow scope, for a limited time.
Spending limit validatorPer-transaction and daily ceilings on value.
Social recovery validatorGuardians, a threshold, and recovery with a timelock and veto.
Hardware signer validatorAn extra co-signer, such as a hardware wallet or FIDO2 security key, required always or above a value threshold.

Read the modules installed on an account, with their addresses and priorities:

bash
tenzro passkey get-smart-account --account-address 0xYourAccount

Modules combine with AND

Every installed module must approve a user operation for the EntryPoint to accept it. A session key that is inside its scope still fails if the spending limit would be exceeded; a passkey signature still fails if a required hardware co-signer has not signed. The operation's validity window is the tightest of the modules' windows: the latest valid_after and the earliest non-zero valid_until.

The on-chain modules are the control. Agent runtimes also check their spending policy before they build an operation, so an out-of-policy payment is refused early, but that check is a convenience and never the gate.

Session keys for agents

An agent never holds your passkey. You grant it a session key instead: a key held in the agent machine's own hardware (its TPM 2.0 or Secure Enclave), with a scope you set.

ScopeEffect
SelectorsOnly these contract functions can be called
TargetsOnly these contract addresses can be called
Per-call capMaximum value in one operation
Total capMaximum value over the key's lifetime
valid_after, valid_untilThe time window in which the key works
bash
tenzro passkey grant-session-key \
  --account-address 0xYourAccount \
  --session-pubkey-hex <agent-session-key> \
  --selectors a9059cbb \
  --targets 0xPaymentContract \
  --max-per-call 1000000000000000000 \
  --max-total 50000000000000000000 \
  --valid-until 1798761600 \
  --label "inference agent"

Granting a session key is a custody change, so your passkey approves it. Revoking is one call, and the agent loses signing power at once:

bash
tenzro passkey revoke-session-key --account-address 0xYourAccount

Session keys on the account sit alongside the agent's own identity. An agent also has a machine DID and a delegation scope that limits which operations, payment protocols and networks it may use. See Agents and Identity.

Spending limits

Set a per-transaction cap and a daily cap in wei. 0 means unlimited. The spending limit validator enforces both on every operation, whoever signs it.

Accounts whose only root is a synced passkey run with reduced limits until a device-bound passkey or guardians are added; see Console and passkey wallet.

Two devices and hardware co-signers

  • Two-device approval. Set the account's policy to two_credentials and every operation needs signatures from two distinct enrolled devices.
  • Hardware co-signer. Install a hardware signer that must sign every operation, or only operations above a value threshold:
bash
tenzro passkey add-hardware-signer \
  --account-address 0xYourAccount \
  --device-kind generic \
  --public-key-hex 0x... \
  --required-above-wei 10000000000000000000

Both compose with the other modules rather than replacing them.

Guardians and recovery

The social recovery validator holds the account's guardians and threshold. Recovery installs a new passkey only when the guardians reach their threshold and a timelock passes without a veto from any existing device. See Device linking and recovery.

After an account has been recovered, installing a new validator module needs a guardian quorum proof as well as the new passkey. Before any recovery, the account's own signer can install modules.

Standard ERC-7579 calls

The module-management selectors are the standard ERC-7579 ones, so calldata built by ERC-7579 tooling works unchanged:

installModule(uint256,address,bytes)      0x9517e29f
uninstallModule(uint256,address,bytes)    0xa71763a8
isModuleInstalled(uint256,address,bytes)  0x112d3a7d
validateUserOp(bytes,bytes32)             0xa97bfdd1

Passkey signatures are checked on-chain through the P-256 verification precompile at 0x100 (EIP-7951), and user operations follow ERC-4337 v0.8. An externally owned account can also point its code at a smart-account implementation with EIP-7702; see EVM.

Methods

MethodAccessPurpose
tenzro_getSmartAccountopenInstalled modules and deployment state
tenzro_listSmartAccountsopenAccounts known to the node
tenzro_createCustodyChallengeopenChallenge for any change below
tenzro_grantSessionKey, tenzro_revokeSessionKeyownerSession keys
tenzro_setSpendingLimitownerPer-transaction and daily caps
tenzro_setPasskeyPolicyownerOne-device or two-device approval
tenzro_addHardwareSignerownerHardware co-signer
tenzro_addGuardianownerGuardians and threshold

Owner methods need a hybrid passkey signature from a device already on the account, over a single-use challenge bound to the account, the operation and its target. The same calls are available in tenzro-sdk; see Hardware signer SDK.