QuipNetwork/cpp-sdkPublic

AI summary: C++ SDK for interacting with Quip smart contracts, featuring post-quantum secure Winternitz signatures.

Stars
11.3K
+-2 today
Forks
44
Watchers
9
Open issues
0
Open PRs
0
Contributors
~1
Commits
8
Branches
1

C++AGPL-3.0Created Jun 20, 2025Last push 1y ago+-2 stars this week+-9 this month

Quick answers

What is cpp-sdk?
C++ SDK for interacting with Quip smart contracts, featuring post-quantum secure Winternitz signatures.
What does cpp-sdk do?
This SDK enables native C++ applications to securely interact directly with the Quip Network's smart contracts on Ethereum-compatible blockchains. It is explicitly designed for high-performance, embedded, or specialized environments where standard JavaScript/TypeScript SDKs are entirely unsuitable. Crucially, it includes robust, native support for Winternitz Signatures, providing the necessary cryptographic primitives to execute post-quantum secure transactions on the network. The SDK offers comprehensive tools for deploying QuipWallets, executing complex contract calls, and automating blockchain interactions via a built-in command-line interface.
Who is cpp-sdk for?
Systems engineers, embedded developers, and blockchain architects building high-performance or hardware-level applications that require direct, quantum-resistant interactions with EVM networks.
How do I get started with cpp-sdk?
git clone https://github.com/QuipNetwork/quip-cpp-sdk.git && cd quip-cpp-sdk && ./build.sh
How popular is cpp-sdk on GitHub?
QuipNetwork/cpp-sdk has 11,257 stars and 44 forks on GitHub, and gained -2 stars in the last 7 days.
What license does cpp-sdk use?
QuipNetwork/cpp-sdk is released under the AGPL-3.0 license.

Star history

since Jul 28, 2026
05K10KJul 2026Aug 2026Sep 2026Oct 2026
11.3K stars as of Oct 4, 2026. Measured daily since Jul 28, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks

Signals and awards

derived from tracked data
  • Widely adopted

    11,257 stars

What cpp-sdk does

This SDK enables native C++ applications to securely interact directly with the Quip Network's smart contracts on Ethereum-compatible blockchains. It is explicitly designed for high-performance, embedded, or specialized environments where standard JavaScript/TypeScript SDKs are entirely unsuitable. Crucially, it includes robust, native support for Winternitz Signatures, providing the necessary cryptographic primitives to execute post-quantum secure transactions on the network. The SDK offers comprehensive tools for deploying QuipWallets, executing complex contract calls, and automating blockchain interactions via a built-in command-line interface.

Systems engineers, embedded developers, and blockchain architects building high-performance or hardware-level applications that require direct, quantum-resistant interactions with EVM networks.

  • QuipFactory Integration: Programmatically deploys and manages new Quip wallets across multiple Ethereum networks natively.
  • Post-Quantum Security: Implements Winternitz signature support for executing mathematically secure, future-proof blockchain transactions.
  • Native C++ Performance: Built entirely in C++17 for deployment in resource-constrained, high-performance, or embedded systems.
  • Command-Line Interface: Includes a versatile CLI tool for testing workflows, automating operations, and querying wallet states.
  • Multi-Network Flexibility: Configurable to run against local Hardhat environments, testnets, or custom production RPC endpoints.
  • Smart Contract Execution: Facilitates raw token transfers, ownership changes, and arbitrary contract execution directly from the SDK.

Where teams use it

Embedded Hardware Wallets

Integrating post-quantum secure transaction capabilities directly into IoT devices or specialized hardware security modules.

High-Frequency Trading

Executing exceptionally fast, secure smart contract calls from native C++ trading algorithms without Node.js overhead.

Automated Network Testing

Using the compiled CLI tool in continuous integration pipelines to deploy and rigorously test Quip smart contracts.

Quantum-Resistant Infrastructure

Developing backend financial services that mandate post-quantum cryptographic security for all on-chain state changes.

Getting started: git clone https://github.com/QuipNetwork/quip-cpp-sdk.git && cd quip-cpp-sdk && ./build.sh

README

main branch

Quip C++ SDK

A C++ SDK for interacting with Quip smart contracts on Ethereum networks.

Features

  • QuipFactory Integration: Deploy and manage Quip wallets
  • QuipWallet Operations: Transfer funds, execute contracts, and manage ownership
  • Winternitz Signature Support: Post-quantum secure signatures
  • Multi-Network Support: Works with local Hardhat and custom networks
  • CLI Interface: Command-line tool for testing and automation

Building

  1. Clone the repository:
git clone https://github.com/QuipNetwork/quip-cpp-sdk.git
cd quip-cpp-sdk
  1. Run the build script:
./build.sh

This will build both the CLI tool and run the test suite.

Usage

CLI Tool

The CLI tool supports both local development and custom network configurations.

Getting Help
# Show comprehensive help and usage information
./build/quip-cli --help
Local Development (Default)

For local development with Hardhat:

./build.sh

Running the CLI

Basic usage:

./build/quip-cli <command> [args]

Commands:

  • deposit [entropy] - Deploy a new Quip wallet using Winternitz signatures
  • transfer <pq_pubkey> <pq_sig> <to_address> <amount> <private_key>
  • execute <pq_pubkey> <pq_sig> <target_address> <opdata> <private_key>
  • change-owner <pq_pubkey> <pq_sig> <private_key>
  • balance <address>
  • pq-owner <address>

To generate post-quantum keypairs and signatures, please use the hashsigs-cpp library.

End-to-End (E2E) Testing

To run E2E tests against a real blockchain (local devnet, testnet, or mainnet), follow these steps:

  1. Deploy Contracts on a Local Devnet or Testnet

    Use the existing ethereum-sdk project to deploy the QuipFactory and QuipWallet contracts on localhost or use a sepolia contract on eg mainnet or base. For example, from the ethereum-sdk directory:

    cd ../ethereum-sdk
    npx hardhat node & INITIAL_OWNER=$PUBLIC_ADDRESS_YOU_CONTROL npx hardhat run scripts/deploy.ts --network hardhat

    This will deploy the contracts and output their addresses, but your local addresses will not match the default addresses and the transaction will unwind.

    Get your local Deployer, WOTSPlus, and QuipFactory addresses and write the deployer address to your ethereum-sdk .env file, then write all three contract addresses to ethereum-sdk/src/addresses.json and run the command again.

    You can check that your contracts are deployed by running npx hardhat console and using the following command with "Deployer" | "WOTSPlus" | "QuipFactory" as the contractName and the associated contract address as contractAddress

    await ethers.getContractAt(`${contractName}`, `${contractAddress}`);
  2. Run the E2E Test Script

    Use the provided bash script to run the CLI against the deployed contracts:

# Show E2E test script help
./e2e_test.sh --help

# Run all tests against local Hardhat network
./e2e_test.sh

# Run specific CLI commands
./build/quip-cli --rpc-url "https://base-sepolia.g.alchemy.com/v2/your_api_key_here" --contract-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99" deposit <pubkey> <sig> <private_key>
Custom Networks

When using a custom RPC_URL or CHAIN_ID, you must provide a QuipFactory contract address:

# Test against Sepolia testnet
./e2e_test.sh \
  --rpc-url "https://eth-sepolia.g.alchemy.com/v2/your_api_key_here" \
  --chain-id 11155111 \
  --quip-factory-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99"

# Test against Base mainnet
./e2e_test.sh \
  --rpc-url "https://mainnet.base.org" \
  --chain-id 8453 \
  --quip-factory-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99"
CLI Commands
# Deploy a new Quip wallet
./build/quip-cli --rpc-url <url> --contract-address <factory_address> deposit <pubkey> <sig> <private_key>

# Transfer funds
./build/quip-cli --rpc-url <url> --contract-address <factory_address> transfer <pubkey> <sig> <to_address> <amount> <private_key>

# Execute contract call
./build/quip-cli --rpc-url <url> --contract-address <factory_address> execute <pubkey> <sig> <target_address> <opdata> <private_key>

# Change PQ owner
./build/quip-cli --rpc-url <url> --contract-address <factory_address> change-owner <pubkey> <sig> <private_key>

# Check wallet balance
./build/quip-cli --rpc-url <url> --contract-address <factory_address> balance <address>

# Check PQ owner
./build/quip-cli --rpc-url <url> --contract-address <factory_address> pq-owner <address>

Configuration

Environment Variables

Create a .env based on the .env.example file in the ethereum-sdk directory.

Contract Addresses

For local development, contract addresses are automatically loaded from ethereum-sdk/src/addresses.json.

For custom networks, you must provide the QuipFactory contract address using the --quip-factory-address parameter.

Testing

Unit Tests

cd build && ./quip-cli-tests

End-to-End Tests

# Show E2E test help
./e2e_test.sh --help

# Local development
./e2e_test.sh

# Custom network
./e2e_test.sh --rpc-url <url> --chain-id <id> --quip-factory-address <address>

Network Requirements

Local Development

  • RPC URL: http://localhost:8545 (default)
  • Chain ID: 31337 (default)
  • Contract Addresses: Automatically loaded from ethereum-sdk

Custom Networks

  • RPC URL: Any valid Ethereum RPC endpoint
  • Chain ID: Any valid chain ID
  • QuipFactory Address: Required - Must be a valid Ethereum address (0x followed by 40 hex characters)

Error Handling

The CLI validates:

  • QuipFactory address format (must be valid Ethereum address)
  • Required parameters for custom networks
  • Command syntax and argument counts
  • Network connectivity

Examples

Complete Workflow

# 1. Deploy a new wallet
./build/quip-cli --rpc-url "https://base-sepolia.g.alchemy.com/v2/your_api_key_here" --contract-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99" deposit <pubkey> <sig> <private_key>

# 2. Transfer funds
./build/quip-cli --rpc-url "https://base-sepolia.g.alchemy.com/v2/your_api_key_here" --contract-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99" transfer <pubkey> <sig> "0x1234..." "1000000000000000000" <private_key>

# 3. Execute contract call
./build/quip-cli --rpc-url "https://base-sepolia.g.alchemy.com/v2/your_api_key_here" --contract-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99" execute <pubkey> <sig> "0x5678..." "0x12345678" <private_key>

# 4. Change owner
./build/quip-cli --rpc-url "https://base-sepolia.g.alchemy.com/v2/your_api_key_here" --contract-address "0x4a5A444F3B12342Dc50E34f562DfFBf0152cBb99" change-owner <pubkey> <sig> <private_key>

Dependencies

  • CMake 3.10+
  • C++17 compiler
  • libcurl
  • nlohmann/json
  • Google Test (for testing)
  • OpenSSL 3.0+

License

AGPL-3.0, see COPYING

View on GitHub

Recent activity

commits and pull requests

Code frequency

additions and deletions

Commits per week

last 52 weeks

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 0 commitsSun 1:00 — 0 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 0 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 0 commitsSun 13:00 — 0 commitsSun 14:00 — 0 commitsSun 15:00 — 0 commitsSun 16:00 — 0 commitsSun 17:00 — 0 commitsSun 18:00 — 0 commitsSun 19:00 — 0 commitsSun 20:00 — 0 commitsSun 21:00 — 0 commitsSun 22:00 — 0 commitsSun 23:00 — 0 commitsMon 0:00 — 0 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 1 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 0 commitsMon 10:00 — 1 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 0 commitsMon 14:00 — 0 commitsMon 15:00 — 0 commitsMon 16:00 — 0 commitsMon 17:00 — 0 commitsMon 18:00 — 0 commitsMon 19:00 — 0 commitsMon 20:00 — 0 commitsMon 21:00 — 0 commitsMon 22:00 — 0 commitsMon 23:00 — 0 commitsTue 0:00 — 0 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 0 commitsTue 10:00 — 0 commitsTue 11:00 — 0 commitsTue 12:00 — 0 commitsTue 13:00 — 0 commitsTue 14:00 — 0 commitsTue 15:00 — 0 commitsTue 16:00 — 0 commitsTue 17:00 — 0 commitsTue 18:00 — 0 commitsTue 19:00 — 0 commitsTue 20:00 — 0 commitsTue 21:00 — 0 commitsTue 22:00 — 0 commitsTue 23:00 — 0 commitsWed 0:00 — 0 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 1 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 0 commitsWed 11:00 — 0 commitsWed 12:00 — 1 commitsWed 13:00 — 0 commitsWed 14:00 — 0 commitsWed 15:00 — 0 commitsWed 16:00 — 0 commitsWed 17:00 — 1 commitsWed 18:00 — 1 commitsWed 19:00 — 0 commitsWed 20:00 — 0 commitsWed 21:00 — 0 commitsWed 22:00 — 0 commitsWed 23:00 — 0 commitsThu 0:00 — 0 commitsThu 1:00 — 0 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 0 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 0 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 0 commitsThu 20:00 — 0 commitsThu 21:00 — 0 commitsThu 22:00 — 0 commitsThu 23:00 — 0 commitsFri 0:00 — 0 commitsFri 1:00 — 0 commitsFri 2:00 — 1 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 0 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 0 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 0 commitsFri 21:00 — 0 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 1 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 0 commitsSat 18:00 — 0 commitsSat 19:00 — 0 commitsSat 20:00 — 0 commitsSat 21:00 — 0 commitsSat 22:00 — 0 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Feb 12, 2026daily#20+158
Feb 11, 2026daily#13+262