BitBadges
  • Overview
    • ๐Ÿ‘‹BitBadges Overview
    • ๐Ÿ‘จโ€๐Ÿ’ปLearn the Basics
      • BitBadges Claims
      • Multi-Chain Accounts
      • Sign In with BitBadges
      • Badges
      • Address Lists
      • Attestations
      • Applications (Points)
      • Additional Badge Concepts
        • Manager
        • Total Supplys
        • Time-Dependent Ownership
        • Transferability
        • Balances Types
      • Wallets and Sign Ins
        • Supported Wallets
        • Alternate Sign Ins / Mobile
        • Approved Transactors
    • ๐Ÿ”จGetting Started
    • ๐Ÿ’ปHow Do I Check...?
    • ๐Ÿ”How Do I Gate...?
    • ๐ŸŽจUse Cases
    • ๐Ÿ”—Official Links and Resources
    • โš–๏ธBitBadges L1 vs Others
    • ๐Ÿช™Launch Phases
    • ๐ŸŒดEcosystem
      • WordPress Plugin
      • MetaMask Snap
      • Browser Extensions
      • LinkedIn Certifications
      • Blockin
    • ๐ŸคBrand Guidelines
    • โ“FAQ
  • โŒจ๏ธFor Developers
    • ๐Ÿšดโ€โ™‚๏ธGetting Started
    • ๐Ÿ‘คHandling Addresses
    • ๐ŸงชTestnet Mode
    • ๐Ÿ“šBitBadges API
      • Getting Started
      • Full Reference
      • Typed SDK Types
      • Upgrading an API Key Tier
      • Concepts
        • Native Chain Algorithm
        • Refresh / Claim Completion Queue
        • Designing for Compatibility
        • Limits / Restrictions
        • Managing Views
        • Use via Pipedream
    • ๐Ÿ–ฑ๏ธSign In with BitBadges
      • Overview
      • Already Have Web3 Auth?
      • Alternative - P2P Verification
      • Templates and Frameworks
        • WordPress
        • Auth0
        • ExpressJS
        • Discourse
        • Supabase
        • Others
      • Setting Up an App
      • Connecting a Claim
      • Authorization URL
        • Configuration
        • Generating the URL
      • Approaches
        • QR Codes
        • Redirect Callback
      • Verification
        • Verification Flow
        • Access Tokens
        • Offline Verification
        • Security Considerations
      • Blockin Docs
    • ๐Ÿ—๏ธBitBadges Claims
      • Overview
      • Concepts
        • Standard vs On-Demand
        • Completion Methods
        • Gating Badge Distribution
        • Claim Numbers
        • Success Logic
        • Claim Links (URLs)
        • Signed In vs Select Address
        • Universal Approach - Claim Codes
        • Identify By Socials / Emails?
        • Payment Checking
        • Receiving Attestations
      • Checking Custom Criteria
      • Implementing Custom Utility
      • Leveraging AI
      • BitBadges API & Claims
        • Verifying Claim Attempts w/ the API
        • Fetching Claims
        • Auto-Complete Claims w/ BitBadges API
      • Dynamic Stores
        • Overview
        • Adding Data
      • Custom Plugins / Webhooks
        • Overview
        • Pre-Built Webhook Plugins
        • Creating a Custom Plugin
          • Implement Your Plugin
            • Getting Started
            • Hook Types and Simulations
            • Design Considerations
            • Parameters
            • Custom Inputs
            • API Handler
          • Managing Your Plugin
          • Testing Your Plugin
        • Configuration Tools
      • Integrate with Zapier
        • Overview
        • Dynamic Store Zaps
        • Automatic Claim Tutorial
        • Post-Success Zaps
        • Leveraging Zapier AI Actions / MCP
        • Automate Any Part of the Process
          • Google Forms
      • Integrate with Pipedream
        • Overview
        • Leveraging Pipedream MCP
        • Build Custom Plugins
        • Workflow Actions
          • Complete Claim
          • Get Claim Attempt Status
          • Get Claim Code by Idx
          • Add User to Dynamic Store
        • Workflow Triggers
          • Poll Claim Attempts
        • End to End Example
      • In-Site Plugins
        • Plugins Directory
        • Plugin Documentation
        • Ownership Requirements
      • Tutorials
        • In-Site Guides
        • Get Integration User IDs
          • Get Discord User ID
          • Get Discord Server ID
          • X / Twitch / GitHub IDs
        • Add Telegram Bot to Channel
    • โš’๏ธBitBadges JS / SDK
      • Overview
      • SDK Types
      • Common Snippets
        • Address Conversions
        • NumberType Conversions
        • Uint Ranges
        • Balances
        • Transfers
        • Address Lists
        • Badge Metadata
        • Approvals / Transferability
        • Off-Chain Balances
        • Timelines
    • ๐ŸŒŸBadges - Advanced
      • Overview
      • Balances / Transfers
        • ๐Ÿ“ŠBalances
        • โž•Valid Badge IDs
        • ๐Ÿช™Balance Types
        • ๐ŸคTransferability / Approvals
        • โœ…Approval Criteria
          • Overview
          • $BADGE Transfers
          • Override User Level Approvals
          • Approval Trackers
          • Tallied Approval Amounts
          • Max Number of Transfers
          • Predetermined Balances
          • Requires
          • Merkle Challenges
          • Extending the Approval (Advanced)
      • Self-Hosted Balances
        • Overview
        • Examples / Tutorials
          • Indexed
          • Non-Indexed
      • Permissions
        • Overview
        • Action Permission
        • Timed Update Permission
        • Timed Update With Badge Ids Permission
        • Badge IDs Action Permission
        • Update Approval Permission
      • Standards
      • Archived Collections
      • Metadata
      • Timelines
      • Different Time Fields
      • List IDs
      • Uint Ranges
    • โ›“๏ธBitBadges Blockchain
      • Overview
      • Chain Details
      • REST API Docs - Node
      • Staking / Validators
      • Run a Node
        • Overview
        • Run a Mainnet Node
        • Run a Local Dev Node
        • Cosmovisor
      • Create a Smart Contract
      • ๐Ÿ”ƒCreate, Generate, and Sign Txs
        • Transaction Context
        • Generate Msg Contents
        • Signing - Cosmos
        • Signing - Ethereum
        • Signing - Solana
        • Signing - Bitcoin
        • Broadcast to a Node
        • Sign + Broadcast - bitbadges.io
      • ๐Ÿ“ฉCosmos SDK Msgs
        • x/anchor
          • MsgAddCustomData
        • x/badges
          • MsgCreateCollection
          • MsgUpdateCollection
          • MsgDeleteCollection
          • MsgCreateAddressLists
          • MsgTransferBadges
          • MsgUpdateUserApprovals
          • MsgUniversalUpdateCollection
        • x/wasmx
          • MsgStoreCodeCompat
          • MsgInstantiateContractCompat
          • MsgExecuteContractCompat
        • x/maps
          • MsgCreateMap
          • MsgUpdateMap
          • MsgDeleteMap
          • MsgSetValue
        • MsgSend
        • Cosmos Native Msgs
    • ๐Ÿง Other Concepts
      • Uint Ranges
      • Accounts (Low-Level)
      • Address Lists
      • Maps / Protocols
      • Attestations - Advanced
        • Overview
        • Creating an Attestation
        • Custom Creation Links
        • Proofs vs Attestations
        • Deriving a Proof
        • Design Considerations
        • Verification / Presentations
        • Custom Schemes
          • WITNESS Proofs
Powered by GitBook
On this page
  • Balance Interface
  • Interpreting Balances
  • Balance Subtraction
  • Handling Duplicates
  • Best Practices
  1. For Developers
  2. Badges - Advanced
  3. Balances / Transfers

Balances

The Balance system in BitBadges is designed to represent ownership of badges across different IDs and time ranges. This document explains the Balance interface and how to interpret complex balance structures.

Ownership times are a new concept to BitBadges allowing you to set that someone owns a badge during a specific time but not other times.

Balance Interface

export interface Balance<T extends NumberType> {
  amount: T;
  badgeIds: UintRange<T>[];
  ownershipTimes: UintRange<T>[];
}
  • amount: The quantity of badges owned.

  • badgeIds: An array of ID ranges representing the badges owned.

  • ownershipTimes: An array of time ranges during which the badges are owned.

Interpreting Balances

When interpreting balances, it's crucial to understand that multiple ranges of badge IDs and ownership times within a single Balance structure represent all possible combinations.

Interpretation Algorithm

for (balance of balances) {
  for (badgeIdRange of balance.badgeIds) {
    for (ownershipTimeRange of balance.ownershipTimes) {
      // User owns x(balance.amount) of (badgeIdRange) for the times (ownershipTimeRange)
    }
  }
}

Example

Consider the following balance:

{
  "amount": 1,
  "badgeIds": [{ "start": 1, "end": 10 }, { "start": 20, "end": 30 }],
  "ownershipTimes": [{ "start": 20, "end": 50 }, { "start": 100, "end": 200 }]
}

This balance expands to:

  1. 1x of IDs 1-10 from times 20-50

  2. 1x of IDs 1-10 from times 100-200

  3. 1x of IDs 20-30 from times 20-50

  4. 1x of IDs 20-30 from times 100-200

Balance Subtraction

When subtracting balances, you may need to represent the result as multiple Balance objects. For example, if we subtract the first set of balances from the example above (1x of IDs 1-10 from times 20-50), the result would be:

[
  {
    "amount": 1,
    "badgeIds": [{ "start": 1, "end": 10 }, { "start": 20, "end": 30 }],
    "ownershipTimes": [{ "start": 100, "end": 200 }]
  },
  {
    "amount": 1,
    "badgeIds": [{ "start": 20, "end": 30 }],
    "ownershipTimes": [{ "start": 20, "end": 50 }]
  }
]

Handling Duplicates

When duplicate badge IDs are specified in balances, they are combined and their amounts are added. For example:

{
  "amount": 1,
  "badgeIds": [{ "start": 1, "end": 10 }, { "start": 1, "end": 10 }],
  "ownershipTimes": [{ "start": 100, "end": 200 }]
}

This is equivalent to and will be treated as:

{
  "amount": 2,
  "badgeIds": [{ "start": 1, "end": 10 }],
  "ownershipTimes": [{ "start": 100, "end": 200 }]
}

Best Practices

  1. Efficient Representation: Try to represent balances in the most compact form possible by combining overlapping ranges.

  2. Careful Subtraction: When subtracting balances, ensure that you correctly split the remaining balances to accurately represent the result.

  3. Avoid Duplicates: While the system handles duplicates by combining them, it's more efficient to represent balances without duplicates in the first place.

  4. Time-Aware Operations: Always consider the time dimension when performing operations on balances, as ownership can vary over time.

  5. Range Calculations: Familiarize yourself with range operations, as they are crucial for correctly manipulating and interpreting balances.

By understanding these concepts and following these practices, you can effectively work with the BitBadges balance system, enabling complex ownership structures and time-based badge management.

PreviousBalances / TransfersNextValid Badge IDs

Last updated 8 months ago

โŒจ๏ธ
๐ŸŒŸ
๐Ÿ“Š