Implementing Post-Conditions

Learn how to add post-conditions to protect your Stacks transactions.

Post-conditions are a powerful security feature in Stacks that protect users from unexpected transaction outcomes. This tutorial will walk you through implementing post-conditions in your applications to ensure transactions behave exactly as users expect.

What you'll learn

  • Construct post-conditions using the Pc helper API

  • Add post-conditions to different transaction types

  • Configure post-condition modes for transaction security

  • Implement post-conditions for STX, fungible tokens, and NFTs

  • Handle semi-fungible tokens (SFTs) with post-conditions

Prerequisites

  • Basic understanding of Stacks transactions

  • Stacks.js library installed (npm install @stacks/transactions)

  • A development environment set up for Stacks

Constructing post-conditions

The Pc helper in Stacks.js provides a fluent, BDD-inspired API for constructing post-conditions. Start with Pc.principal() to specify which address will be verified, then chain methods to define the condition.

import { Pc } from '@stacks/transactions';

// Basic structure of a post-condition
const postCondition = Pc
  .principal('STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6')
  .willSendEq(1000)
  .ustx();

The Pc helper uses method chaining for intuitive condition building. Your IDE will provide auto-completion for available methods at each step.

Available transfer methods

Post-conditions support different comparison operators and asset types. Choose the appropriate method based on your security requirements.

STX and fungible token methods

Comparison methods available:

  • .willSendEq(amount) - Exactly equal to amount

  • .willSendGte(amount) - Greater than or equal to amount

  • .willSendGt(amount) - Greater than amount

  • .willSendLte(amount) - Less than or equal to amount

  • .willSendLt(amount) - Less than amount

Asset type methods

NFT-specific methods

Setting the post-condition mode

The post-condition mode determines how the Stacks blockchain handles asset transfers not explicitly covered by your post-conditions. This is a critical security setting.

Mode options:

  • PostConditionMode.Deny (default): Transaction fails if any unspecified transfers occur

  • PostConditionMode.Allow: Transaction allows transfers beyond specified post-conditions

Common implementation patterns

STX transfer post-conditions

Protect STX transfers by specifying exact amounts or ranges.

Fungible token post-conditions

Ensure fungible tokens are transferred as expected in contract calls.

NFT transfer post-conditions

Control NFT ownership changes with specific post-conditions.

Use willNotSendAsset() to protect valuable NFTs from being transferred unexpectedly.

Semi-fungible token (SFT) post-conditions

SFTs require special handling as they have both fungible and non-fungible properties.

Multiple post-conditions

Complex transactions often require multiple post-conditions to fully protect all asset transfers.

Last updated

Was this helpful?