# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.bitbadges.io/token-standard/learn/approval-criteria.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
