A multisend DApp for the Stacks blockchain
Send STX and SIP-010 tokens to multiple recipients in a single transaction.
StackSend is a decentralized application built on the Stacks blockchain that allows users to send STX or SIP-010 fungible tokens to multiple recipients in a single transaction. This saves time and reduces transaction fees compared to sending individual transfers.
| Feature | Description |
|---|---|
| Multisend STX | Send STX to up to 50 recipients at once |
| Multisend FT | Send any SIP-010 fungible token to multiple addresses |
| Plan Tiers | Starter (5), Pro (10), Max (20), Ultra (50) recipients per transaction |
| Network Toggle | Seamlessly switch between Mainnet and Testnet |
| Auto Network Detection | Automatically detects network from connected wallet |
| Bulk Paste | Quickly paste multiple addresses from a spreadsheet or list |
| Dark/Light Mode | Full theme support with system preference detection |
| STX Input | Enter amounts in STX (automatically converts to microSTX) |
| Clarity 4 | Built with latest Stacks features for enhanced security |
View Screenshots
Professional landing page with wallet connection and feature highlights.
Clean interface for managing recipients and sending transactions.
Full dark theme support for comfortable viewing.
| Category | Technology |
|---|---|
| Framework | React 19 + TypeScript |
| Build Tool | Vite 7 |
| Styling | Tailwind CSS 4 |
| Wallet | @stacks/connect v8 + Reown AppKit |
| Transactions | @stacks/transactions v7 |
| Smart Contract | Clarity 4 |
| Icons | react-icons + Lucide React |
| Forms | React Hook Form + Zod |
| Deployment | Vercel |
This repository also publishes @winsznx/stacks-utils, a small validation and formatting package for Stacks principals and transfer amounts.
npm install @winsznx/stacks-utils zodnpm install @winsznx/stacks-utils zod --registry https://npm.pkg.github.com --@winsznx:registry=https://npm.pkg.github.comzod is required because @winsznx/stacks-utils declares it as a peer dependency.
- Node.js 18 or higher
- npm
- Clarinet v2+ (Installation Guide)
- Stacks Wallet (Leather or Xverse)
# Clone the repository
git clone https://github.com/winsznx/stacksend.git
cd stacksend
# Install dependencies
npm install
# Copy environment file
cp .env.example .env
# Start development server
npm run devThe app will be available at http://localhost:5173
Telegram linking and transfer activity also require the backend service described in backend/README.md.
Create a .env file in the root directory:
# Mainnet contract address
VITE_CONTRACT_ADDRESS_MAINNET=SP31DP8F8CF2GXSZBHHHK5J6Y061744E1TNFGYWYV.multisend
# Testnet contract address
VITE_CONTRACT_ADDRESS_TESTNET=ST31DP8F8CF2GXSZBHHHK5J6Y061744E1TP7FRGHT.multisendThe Clarity smart contract powers all multisend operations securely on-chain.
| Network | Contract Address |
|---|---|
| Mainnet | SP31DP8F8CF2GXSZBHHHK5J6Y061744E1TNFGYWYV.multisend |
| Testnet | ST31DP8F8CF2GXSZBHHHK5J6Y061744E1TP7FRGHT.multisend |
| Function | Description | Max Recipients |
|---|---|---|
send-many-stx |
Batch STX transfers | 50 |
send-many-ft |
Batch FT transfers | 10 per call |
get-max-recipients |
Returns max allowed (50) | N/A |
This contract utilizes Clarity 4's newest security features:
restrict-assets?- Explicitly limits asset outflows for enhanced securitycontract-hash?- Verifies FT contracts exist before transferswith-stx- Declares maximum STX transfer limits
# Validate contract syntax
clarinet check
# Deploy to Testnet
clarinet deployments generate --testnet --low-cost
clarinet deployments apply --testnet
# Deploy to Mainnet
clarinet deployments generate --mainnet --low-cost
clarinet deployments apply --mainnetAfter deployment, update the contract addresses in your .env file.
stacksend/
├── contracts/ # Clarity smart contracts
│ ├── multisend.clar # Main multisend contract
│ └── traits/
│ └── sip-010-trait-ft-standard.clar
├── src/
│ ├── components/ # React components
│ │ ├── WalletConnect.tsx # Landing page & wallet connection
│ │ ├── RecipientTable.tsx # Main form for recipients
│ │ ├── NetworkToggle.tsx # Network switcher
│ │ ├── PlanSelector.tsx # Plan tier selector
│ │ ├── PasteModal.tsx # Bulk address paste modal
│ │ ├── BulkAmountModal.tsx # Bulk amount assignment dialog
│ │ ├── TelegramLinkWidget.tsx # Telegram notification linking status
│ │ └── ActivityFeed.tsx # Recent transfer activity
│ ├── hooks/
│ │ └── useAuth.ts # Wallet authentication hook
│ ├── utils/
│ │ ├── constants.ts # App configuration & contracts
│ │ └── validation.ts # Address & amount validation
│ ├── App.tsx # Main app component
│ ├── index.css # Global styles & themes
│ └── main.tsx # React entry point
├── public/
│ ├── favicon.svg # App favicon
│ └── logo.png # App logo
├── settings/
│ ├── Devnet.toml # Clarinet devnet config
│ ├── Testnet.toml # Clarinet testnet config
│ └── Mainnet.toml # Clarinet mainnet config
├── deployments/ # Generated deployment plans
├── backend/ # Chainhooks + Telegram notification service
├── packages/
│ └── stacks-utils/ # Published Stacks validation utilities package
├── Clarinet.toml # Clarinet project config
├── vercel.json # Vercel deployment config
├── package.json
└── README.md
- Choose Stacks Wallet or Bitcoin Wallet on the landing page
- Click the connect button for the wallet type you selected
- Approve the connection request in Leather, Xverse, or another compatible wallet
- The app automatically detects your network (Mainnet/Testnet)
- Make sure STX tab is selected
- Click "Add Recipient" or use "Paste Addresses" for bulk entry
- Enter recipient addresses and amounts in STX (e.g.,
0.001) - Review the total amount
- Click "Send Transaction"
- Approve the transaction in your wallet
- Select the "Fungible Token" tab
- Enter the token contract address (e.g.,
SP...token-name) - Set token decimals to match the asset you are sending
- Add recipients and amounts
- Send and approve the transaction
| Network | Address Prefix | Example |
|---|---|---|
| Mainnet | SP |
SP2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC |
| Testnet | ST |
ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC |
Important: Use addresses matching your selected network to avoid errors.
# Start development server with hot reload
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview
# Run ESLint
npm run lint
# Validate smart contract
clarinet check
# Run contract tests
clarinet testPushes and pull requests run GitHub Actions builds for the root web app, backend, and packages/stacks-utils.
npm run buildThe production build will be in the dist/ folder.
- Push your code to GitHub
- Connect your repository to Vercel
- Add environment variables in Vercel dashboard:
VITE_CONTRACT_ADDRESS_MAINNETVITE_CONTRACT_ADDRESS_TESTNET
- Deploy!
npm run build
# Upload contents of dist/ to your hosting provider- All transactions are signed client-side by your wallet
- Post-conditions prevent unexpected token transfers
- Contract uses Clarity 4's
restrict-assets?for explicit security - No private keys are ever stored or transmitted
This means you're using addresses from the wrong network:
- Testnet requires addresses starting with
ST - Mainnet requires addresses starting with
SP
- Check you have enough STX for the transaction + gas fees
- Verify recipient addresses are valid
- Ensure your wallet is on the correct network
- Make sure you have Leather or Xverse installed
- Try refreshing the page
- Check if your wallet is unlocked
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Stacks Foundation for the blockchain infrastructure
- Hiro for developer tools (Clarinet, Stacks.js)
- Leather Wallet & Xverse for wallet integration
Built with ❤️ on Stacks