> For the complete documentation index, see [llms.txt](https://docs.bitbadges.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bitbadges.io/token-standard/learn/approval-criteria.md).

# Approval Criteria

Additional restrictions and conditions that determine whether a transfer is approved beyond the basic approval matching.

## Interface

```typescript
export interface iApprovalCriteria<T extends NumberType> {
    /** The BADGE or other sdk.Coin transfers to be executed upon every approval. */
    coinTransfers?: iCoinTransfer<T>[];
    /** The list of merkle challenges that need valid proofs to be approved. */
    merkleChallenges?: iMerkleChallenge<T>[];
    /** The list of must own tokens that need valid proofs to be approved. */
    mustOwnTokens?: iMustOwnToken<T>[];
    /** The predetermined balances for each transfer. These allow approvals to use predetermined balance amounts rather than an incrementing tally system. */
    predeterminedBalances?: iPredeterminedBalances<T>;
    /** The maximum approved amounts for this approval. */
    approvalAmounts?: iApprovalAmounts<T>;
    /** The max num transfers for this approval. */
    maxNumTransfers?: iMaxNumTransfers<T>;
    /** Whether the approval should be deleted after one use. */
    autoDeletionOptions?: iAutoDeletionOptions;
    /** Whether the to address must equal the initiatedBy address. */
    requireToEqualsInitiatedBy?: boolean;
    /** Whether the from address must equal the initiatedBy address. */
    requireFromEqualsInitiatedBy?: boolean;
    /** Whether the to address must not equal the initiatedBy address. */
    requireToDoesNotEqualInitiatedBy?: boolean;
    /** Whether the from address must not equal the initiatedBy address. */
    requireFromDoesNotEqualInitiatedBy?: boolean;
    /** Whether this approval overrides the from address's approved outgoing transfers. */
    overridesFromOutgoingApprovals?: boolean;
    /** Whether this approval overrides the to address's approved incoming transfers. */
    overridesToIncomingApprovals?: boolean;
    /** The royalties to apply to the transfer. */
    userRoyalties?: iUserRoyalties<T>;
    /** The list of dynamic store challenges that must pass for approval. Can check initiator, sender, recipient, or a hardcoded address. */
    dynamicStoreChallenges?: iDynamicStoreChallenge<T>[];
    /** The list of ETH signature challenges that require valid Ethereum signatures for approval. */
    ethSignatureChallenges?: iETHSignatureChallenge<T>[];
    /** The list of voting challenges that require weighted quorum thresholds to be met. */
    votingChallenges?: iVotingChallenge<T>[];
    /** Address checks for sender */
    senderChecks?: iAddressChecks;
    /** Address checks for recipient */
    recipientChecks?: iAddressChecks;
    /** Address checks for initiator */
    initiatorChecks?: iAddressChecks;
    /** Alternative time-based checks for approval denial (offline hours/days). */
    altTimeChecks?: iAltTimeChecks;
    /** Whether this approval must be prioritized during evaluation. */
    mustPrioritize?: boolean;
    /** Whether this approval can be used for IBC backed path operations (collection-level only). */
    allowBackedMinting?: boolean;
    /** Whether this approval can be used for cosmos coin wrapper path operations (collection-level only). */
    allowSpecialWrapping?: boolean;
    /** The list of EVM query challenges that must pass for approval. Executes read-only calls to EVM contracts. */
    evmQueryChallenges?: iEVMQueryChallenge[];
    /** User-level approval settings propagated during transfer matching (collection-level only). */
    userApprovalSettings?: iUserApprovalSettings<T>;
}
```

## Core Components

* [**Approval Trackers**](/token-standard/learn/approval-criteria/approval-trackers.md) - Tracking transfer amounts and counts
* [**Tallied Approval Amounts**](/token-standard/learn/approval-criteria/tallied-approval-amounts.md) - Amount limits and thresholds
* [**Max Number of Transfers**](/token-standard/learn/approval-criteria/max-number-of-transfers.md) - Transfer count limits
* [**Predetermined Balances**](/token-standard/learn/approval-criteria/predetermined-balances.md) - Exact balance requirements
* [**Merkle Challenges**](/token-standard/learn/approval-criteria/merkle-challenges.md) - Cryptographic proof requirements
* [**Dynamic Store Challenges**](/token-standard/learn/approval-criteria/dynamic-store-challenges.md) - On-chain numeric checks
* [**ETH Signature Challenges**](/token-standard/learn/approval-criteria/eth-signature-challenges.md) - Ethereum signature requirements
* [**Voting Challenges**](/token-standard/learn/approval-criteria/voting-challenges.md) - Weighted quorum threshold requirements
* [**Token Ownership**](/token-standard/learn/approval-criteria/badge-ownership.md) - Required token holdings
* [**Cosmos Coin Transfers**](/token-standard/learn/approval-criteria/usdbadge-transfers.md) - Payments per approval (BADGE or other sdk.Coin)
* [**Overrides**](/token-standard/learn/approval-criteria/overrides.md) - Bypassing user-level approvals
* [**Requires**](/token-standard/learn/approval-criteria/requires.md) - Address relationship restrictions
* [**Address Checks**](/token-standard/learn/approval-criteria/address-checks.md) - Address type restrictions (EVM contracts, liquidity pools)
* [**Auto-Deletion Options**](/token-standard/learn/approval-criteria/auto-deletion-options.md) - Automatic approval cleanup
* [**User Royalties**](/token-standard/learn/approval-criteria/user-royalties.md) - Percentage-based transfer fees
* [**Alt Time Checks**](https://github.com/trevormil/bitbadges-docs/blob/master/x-tokenization/concepts/approval-criteria/alt-time-checks.md) - Time-based restrictions (offline hours/days)
* [**Must Prioritize**](https://github.com/trevormil/bitbadges-docs/blob/master/x-tokenization/concepts/approval-criteria/must-prioritize.md) - Requiring explicit approval prioritization
* [**Special Address Flags**](https://github.com/trevormil/bitbadges-docs/blob/master/token-standard/learn/approval-criteria/special-address-flags.md) - Control approval eligibility for backed minting and special wrapping (collection-level only)
* [**EVM Query Challenges**](/token-standard/learn/approval-criteria/evm-query-challenges.md) - Read-only EVM contract queries as approval conditions
* [**User Approval Settings**](https://github.com/trevormil/bitbadges-docs/blob/master/token-standard/learn/approval-criteria/user-approval-settings.md) - Denom restrictions, coin transfer controls, and royalties (collection-level only)

## Key Concepts

### Tracker IDs

Trackers use IDs with format: `approvalId-trackerId` plus identifying details. All trackers are scoped to a specific `approvalId`.

**Important**: Trackers are increment-only and immutable. Never reuse tracker IDs with prior history.

### Best Practices - Creating / Updating / Deleting

Trackers are increment-only and immutable. Never reuse tracker IDs with prior history when creating approvals that should start from scratch.
