Project Status: Inactive
This repository is no longer actively maintained and is being preserved for educational or historical reference.
A secure, decentralized Multi-Signature Wallet built on the Stacks blockchain using Clarity smart contracts and a Next.js frontend. This wallet requires multiple predefined signers to approve transactions before they are executed, ensuring greater security and trust for collaborative fund management.
This project implements a fully functional multi-signature wallet dApp, allowing multiple parties to propose, confirm, and execute transactions only when a minimum threshold of confirmations is reached. It is useful for DAOs, joint treasury management, and any shared fund system requiring trust minimization.
- π Stacks Blockchain
- π Clarity Smart Contracts
- βοΈ Next.js / React
- π¨ Tailwind CSS
- π Hiro Wallet integration
- π§ͺ Clarinet for contract testing
- βοΈ Stacks.js
- π Multi-sig Authorization β Transactions require approval from multiple owners.
- π§ Fixed Owner Set Initialization β A single-use
initializefunction defines all owners. (Critical!) - π€ Proposal Submission β Owners can propose transactions with recipient and amount.
- β Confirmations β Each owner can confirm the proposal.
- π Execute Transaction β Transactions execute after enough confirmations.
- β³ Proposal Expiry β Each proposal includes an expiration block height.
- π On-chain Records β All proposals, confirmations, and executions are stored on-chain.
- Node.js
>= 18 - Clarinet (
npm install -g @hirosystems/clarinet) - Hiro Wallet (browser extension)
git clone https://github.com/Metrohan/MultiSigWallet.git
cd MultiSigWallet
npm installStart frontend:
npm run devStart smart contract dev env:
clarinet console- Connect your wallet.
- Enter recipient and amount.
- Submit the proposal.
- Other owners can confirm via the UI.
- Once threshold is met, the proposal becomes executable.
| Function | Description |
|---|---|
propose-transaction |
Creates a new transaction proposal. |
confirm-transaction |
Allows a wallet owner to confirm an existing proposal. |
execute-transaction |
Executes the transaction if confirmation threshold is met. |
add-owner |
(Optional) Add a new wallet owner (if allowed). |
remove-owner |
(Optional) Remove an owner (if allowed). |
{
to: principal,
amount: uint,
confirmations: (list 10 principal),
confirmation-count: uint,
executed: bool,
expires-at: uint
}clarinet check
clarinet deployment apply --testnetFollow instructions to broadcast via Hiro Testnet Explorer.
Replace .toml config with mainnet keys and run:
clarinet deploy mainnetclarinet deployment apply --testnet- Write tests in
tests/directory using Clarinetβs test suite.
- initialize can only be called once. If your address is not one of the initial owners, you will not be able to interact with the wallet.
- There is no current add-owner or remove-owner functionality in this implementation.
- Implement optional add-owner / remove-owner logic (post-initialization governance).
- Show real-time proposal list via stacks.js on frontend.
- Add filtering (pending / executed / expired).
- Improve error handling in frontend UI.
- Add email/notification integration for confirmations.
- Finalize README with complete deployment instructions.
We welcome contributions!
- Fork the repo
- Create a branch (
git checkout -b feature/your-feature) - Commit changes (
git commit -am 'Add new feature') - Push and create a PR
This project is licensed under the MIT License.
For questions, open an issue or contact the maintainer at:
π§ metehangnn@outlook.com
π¦ @metehangnn
I was unable to complete my project due to limited internet access. I will add a ToDo list to the README to better explain my purpose.
π οΈ Built with β€οΈ on Stacks by [Metehan GΓΌnen]