Override User Level Approvals
Collection-level approvals can override user-level approvals to force transfers.
Interface
interface ApprovalCriteria<T extends NumberType> {
overridesFromOutgoingApprovals?: boolean;
overridesToIncomingApprovals?: boolean;
}How It Works
overridesFromOutgoingApprovals: true: Skip sender's outgoing approvalsoverridesToIncomingApprovals: true: Skip recipient's incoming approvals
This enables forced transfers without user consent.
Use Cases
Force Revoke: Remove tokens from users
Freeze Tokens: Prevent transfers regardless of user settings
Emergency Actions: Administrative control over transfers
Mint Address Requirement
CRITICAL: Mint address approvals must always override outgoing approvals:
{
"fromListId": "Mint",
"approvalCriteria": {
"overridesFromOutgoingApprovals": true
}
}The Mint address has no user-level approvals, so overrides are required for functionality.
Dangerous Configuration Warning
⚠️ Dangerous Configuration Detected
When an approval enables forceful transfers without a non-Mint address sender consent (via overridesFromOutgoingApprovals: true), this can cause dangerous side effects if not handled properly.
Risks
Forceful transfers can break protocols that rely on escrow or alternate state. Ensure you understand all side effects of every initiated transfer before proceeding.
Example: Revoking from liquidity pools without handling pool shares can desync balances and enable exploits like infinite glitches (e.g. repeated revoke → rejoin pool → infinite liquidity).
Recommendations
Educate All Potential Initiators
Ensure all approved initiators understand the risks and will handle transfers responsibly.
Use Multi-Sig
Use multi-sig or governance addresses to prevent single points of failure and unauthorized use.
Consider Alternatives
Do you really need revocation capabilities? If not, consider using safer approaches like whitelists, ownership checks, or other freezing methods instead of revoking to avoid these risks entirely.
Reserved Addresses Protection
BitBadges reserves certain addresses that cannot be forcefully overridden as a sanity check. This protection is not a replacement for due diligence but serves as an additional safety measure to prevent accidental or malicious transfers from critical protocol addresses.
When designing your collection, treat these as external contracts. You can control the flow to / from, but if stuff is already escrowed, you cannot forcefully revoke it. Consider using athe approval criteria address checks for WASM contracts and / or liquidity pool addresses to prevent this.
Protected Address Types
The following addresses are protected from forceful overrides:
Liquidity Pool Addresses
Every liquidity pool address is protected to prevent desyncing balances and enabling exploits
Cosmos Coin Wrapper Path Addresses
Every cosmos coin wrapper path address is protected to maintain wrapper functionality integrity
Governance-Configured Addresses
Any addresses explicitly set by governance as protected addresses
Important Notes
This protection is a sanity check, not a comprehensive security measure
You should still perform thorough due diligence when designing approvals and initializing forceful transfers
The protection applies to forceful transfers (when
overridesFromOutgoingApprovals: trueis used)This does not apply to transfers to / from these addresses that actually check their user-level approvals.
We bypass these protections if the initiatedBy === from address (the initiator is the protected address)
Normal transfers (with user consent) are not affected by this protection
Last updated