is-standard
Checking if a value is a standard principal in Clarity smart contracts.
Function Signature
(is-standard value)
- Input: principal
- Output: bool
Why it matters
The is-standard function is crucial for:
- 1Determining if a principal is a standard principal (i.e., a user address).
- 2Implementing conditional logic based on the type of principal.
- 3Ensuring that certain operations are only performed by standard principals.
- 4Simplifying checks for principal types in smart contract code.
When to use it
Use is-standard when you need to:
- Check if a principal is a standard user address.
- Implement logic that depends on the type of principal.
- Validate the type of principal before performing certain operations.
- Handle cases where only standard principals are allowed.
Best Practices
- Use is-standardin combination withiformatchfor comprehensive principal type handling.
- Ensure that the value being checked is of the correct principal type.
- Use meaningful variable names for better readability.
- Note that you can pass in a valid contract principal as well, not just a standard principal (e.g., 'SP12or'SP12.contract).
Practical Example: Restricting Access to Standard Principals
Let's implement a function that restricts access to standard principals:
(define-map UserBalances { userId: principal } { balance: uint })(define-public (transfer-tokens (amount uint) (recipient principal))(if (is-standard tx-sender)(let((senderBalance (default-to u0 (map-get? UserBalances { userId: tx-sender })))(recipientBalance (default-to u0 (map-get? UserBalances { userId: recipient }))))(if (>= senderBalance amount)(begin(map-set UserBalances { userId: tx-sender } { balance: (- senderBalance amount) })(map-set UserBalances { userId: recipient } { balance: (+ recipientBalance amount) })(ok true))(err u1)))(err u2)));; Usage(map-set UserBalances { userId: tx-sender } { balance: u100 })(transfer-tokens u50 'SPAXYA5XS51713FDTQ8H94EJ4V579CXMTRNBZKSF) ;; Returns (ok true) if tx-sender is a standard principal
This example demonstrates:
- 1Using is-standardto check if the transaction sender is a standard principal.
- 2Implementing conditional logic based on the type of principal.
- 3Handling both the case where the principal is standard and where it is not.
Common Pitfalls
- 1Assuming the principal will always be standard, leading to unhandled cases.
- 2Using is-standardon non-principal types, causing type errors.
- 3Not handling all possible conditions, resulting in incomplete principal type checks.
- 4Overlooking the need for comprehensive validation and error checking.
Related Functions
- tx-sender: Returns the principal that initiated the transaction.
- contract-caller: Returns the caller of the current contract context.
Conclusion
The is-standard function is a fundamental tool for checking principal types in Clarity smart contracts. It allows developers to determine if a principal is a standard user address, enabling robust and comprehensive principal type handling and validation logic. When used effectively, is-standard enhances the reliability and maintainability of your smart contract code by ensuring that operations are performed by the correct type of principal.