Skip to main content

Python SDK for MoltsPay - Agent-to-Agent Payments. LangChain compatible.

Project description

MoltsPay Python SDK

PyPI version Python versions License: MIT

Python SDK for MoltsPay - Agent-to-Agent Payments.

MoltsPay enables AI agents to pay each other for services using the x402 protocol - HTTP-native payments with USDC stablecoins. No gas fees for clients, no complex wallet management.

What is MoltsPay?

MoltsPay is blockchain payment infrastructure designed for AI agents. It solves a fundamental problem: how do autonomous AI agents pay for services?

  • ๐Ÿค– Agent-to-Agent Commerce - AI agents can autonomously discover, pay for, and use services
  • ๐Ÿ’จ Gasless Payments - Clients never pay gas on any chain
  • ๐Ÿ”— x402 Protocol - HTTP 402 Payment Required - payments as native HTTP flow
  • ๐Ÿ”’ Spending Limits - Set per-transaction and daily limits for safety
  • โ›“๏ธ Multi-Chain - Base, Polygon, Solana, BNB, Tempo (mainnet & testnet)
  • ๐ŸŒ Multi-VM - EVM chains + Solana (SVM) with unified API
  • ๐Ÿฆœ LangChain Ready - Drop-in tools for LangChain agents

Installation

pip install moltspay

For Solana support:

pip install moltspay[solana]

For LangChain integration:

pip install moltspay[langchain]

For everything:

pip install moltspay[all]

Quick Start

from moltspay import MoltsPay

# Initialize (auto-creates wallet if not exists)
client = MoltsPay()
print(f"Wallet address: {client.address}")

# Discover services from a provider
services = client.discover("https://juai8.com/zen7")
for svc in services:
    print(f"{svc.id}: {svc.price} {svc.currency}")

# Pay for a service
result = client.pay(
    "https://juai8.com/zen7",
    "text-to-video",
    prompt="a cat dancing on the beach"
)
print(result.result)

Supported Chains

MoltsPay supports 8 chains across EVM and Solana (SVM):

Chain Network ID Type Protocol Gas Model
Base eip155:8453 Mainnet x402 + CDP Gasless (CDP pays)
Polygon eip155:137 Mainnet x402 + CDP Gasless (CDP pays)
Solana solana:mainnet Mainnet x402 + SOL Facilitator Gasless (server pays)
BNB eip155:56 Mainnet x402 + BNB Facilitator Gasless (server pays)
Base Sepolia eip155:84532 Testnet x402 + CDP Gasless (CDP pays)
Solana Devnet solana:devnet Testnet x402 + SOL Facilitator Gasless (server pays)
BNB Testnet eip155:97 Testnet x402 + BNB Facilitator Gasless (server pays)
Tempo Moderato eip155:42431 Testnet MPP Gas-free native

Key: Clients never pay gas on any chain. Different facilitators handle settlement.

Payment Protocols

MoltsPay uses different protocols optimized for each chain:

x402 + CDP (Base, Polygon)

Standard x402 flow with Coinbase Developer Platform as facilitator:

Client                         Server                      CDP Facilitator
  โ”‚ POST /execute                โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚                              โ”‚
  โ”‚ 402 + payment requirements   โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚
  โ”‚ [Sign EIP-3009 - NO GAS]     โ”‚                              โ”‚
  โ”‚ POST + X-Payment header      โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚ Verify & settle              โ”‚
  โ”‚                              โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚
  โ”‚ 200 OK + result              โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚

x402 + SOL Facilitator (Solana)

Solana uses SPL token transfers with server as fee payer:

Client                         Server (Fee Payer)          Solana Network
  โ”‚ POST /execute                โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚                              โ”‚
  โ”‚ 402 + solanaFeePayer         โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚
  โ”‚ [Sign SPL Transfer - NO GAS] โ”‚                              โ”‚
  โ”‚ POST + X-Payment header      โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚ Execute + pay ~$0.001 SOL    โ”‚
  โ”‚                              โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚
  โ”‚ 200 OK + result              โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚

Key: Client only signs. Server acts as fee payer and executes transaction.

x402 + BNB Facilitator (BNB Chain)

BNB uses EIP-712 intent signing with server-sponsored gas:

Client                         Server                      BNB Network
  โ”‚ POST /execute                โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚                              โ”‚
  โ”‚ 402 + bnbSpender             โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚
  โ”‚ [Sign EIP-712 Intent-NO GAS] โ”‚                              โ”‚
  โ”‚ POST + X-Payment header      โ”‚                              โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚ Execute + pay ~$0.0001 gas   โ”‚
  โ”‚                              โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚
  โ”‚ 200 OK + result              โ”‚                              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚                              โ”‚

Key: Client only signs intent. Server executes transferFrom and pays gas.

MPP (Tempo Moderato)

Machine Payments Protocol - client executes directly (gas-free on Tempo):

Client                         Server
  โ”‚ POST /execute                โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚
  โ”‚ 402 + WWW-Authenticate       โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚
  โ”‚ [Execute TIP-20 - NO GAS]    โ”‚
  โ”‚ POST + Authorization header  โ”‚
  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€>   โ”‚
  โ”‚ 200 OK + result              โ”‚
  โ”‚ <โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€   โ”‚

Key: Tempo is natively gas-free. Client executes transfer directly.

Testnet Quick Start

Test without real money using our faucets:

from moltspay import MoltsPay

# === Base Sepolia (x402 + CDP) ===
client = MoltsPay(chain="base_sepolia")
result = client.faucet()  # 1 USDC, once per 24h
print(f"Got {result.amount} USDC!")

# === Solana Devnet (x402 + SOL) ===
client = MoltsPay(chain="solana_devnet")
result = client.faucet()  # 1 USDC
print(f"Got {result.amount} USDC!")

# === BNB Testnet (x402 + BNB) ===
client = MoltsPay(chain="bnb_testnet")
result = client.faucet()  # 1 USDC + 0.001 tBNB for gas
print(f"Got {result.amount} USDC!")

# === Tempo Moderato (MPP) ===
client = MoltsPay(chain="tempo_moderato")
result = client.faucet()  # 1 pathUSD
print(f"Got {result.amount} pathUSD!")

Make test payments:

# Base Sepolia
result = MoltsPay(chain="base_sepolia").pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="a robot dancing"
)

# Solana Devnet
result = MoltsPay(chain="solana_devnet").pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="a cat playing piano"
)

# BNB Testnet
result = MoltsPay(chain="bnb_testnet").pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="a sunset timelapse"
)

# Tempo Moderato
result = MoltsPay(chain="tempo_moderato").pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="an ocean wave"
)

Features

Auto Wallet Management

Wallets are automatically created on first run:

  • EVM wallet: ~/.moltspay/wallet.json (Base, Polygon, BNB, Tempo)
  • Solana wallet: ~/.moltspay/wallet-solana.json
from moltspay import MoltsPay

client = MoltsPay()
print(f"EVM Address: {client.address}")

# Solana address (if initialized)
client_sol = MoltsPay(chain="solana")
print(f"Solana Address: {client_sol.address}")

Funding Your Wallet

Before making payments, you need USDC in your wallet.

Option 1: Testnet Faucets (Free)

from moltspay import MoltsPay

# Base Sepolia - 1 USDC (once per 24h)
client = MoltsPay(chain="base_sepolia")
result = client.faucet()

# Solana Devnet - 1 USDC
client = MoltsPay(chain="solana_devnet")
result = client.faucet()

# BNB Testnet - 1 USDC + 0.001 tBNB for gas
client = MoltsPay(chain="bnb_testnet")
result = client.faucet()

# Tempo Moderato - 1 pathUSD
client = MoltsPay(chain="tempo_moderato")
result = client.faucet()

Option 2: Coinbase Onramp (Mainnet)

Buy USDC with debit card or Apple Pay:

from moltspay import MoltsPay

client = MoltsPay()  # Default: Base mainnet

# Generate funding link
result = client.fund(10)  # $10 minimum
print(f"Open this URL to pay: {result.url}")

# Or print QR code to terminal
client.fund_qr(10)

Option 3: Direct Transfer (Mainnet)

Send USDC from any wallet:

from moltspay import MoltsPay

client = MoltsPay()
print(f"Send USDC to: {client.address}")
print(f"Chain: Base (chainId: 8453)")

โš ๏ธ Important: Send USDC on the correct chain!

Multi-Chain Payments

from moltspay import MoltsPay

# Pay on different chains
result = MoltsPay(chain="base").pay(...)           # Base mainnet
result = MoltsPay(chain="polygon").pay(...)        # Polygon mainnet
result = MoltsPay(chain="solana").pay(...)         # Solana mainnet
result = MoltsPay(chain="bnb").pay(...)            # BNB mainnet
result = MoltsPay(chain="base_sepolia").pay(...)   # Base testnet
result = MoltsPay(chain="solana_devnet").pay(...)  # Solana testnet
result = MoltsPay(chain="bnb_testnet").pay(...)    # BNB testnet
result = MoltsPay(chain="tempo_moderato").pay(...) # Tempo testnet

Spending Limits

Control your agent's spending:

from moltspay import MoltsPay

client = MoltsPay()

# Check current limits
limits = client.limits()
print(f"Max per tx: {limits.max_per_tx}")
print(f"Max per day: {limits.max_per_day}")
print(f"Spent today: {limits.spent_today}")

# Update limits
client.set_limits(max_per_tx=20, max_per_day=200)

Check Balances

from moltspay import MoltsPay

client = MoltsPay()

# Single chain balance
balance = client.balance()
print(f"USDC: {balance.usdc}")
print(f"Chain: {balance.chain}")

# All chain balances
balances = client.all_balances()
for chain, bal in balances.items():
    print(f"{chain}: {bal.get('usdc', 0)} USDC")

BNB Approval Check

BNB requires a one-time approval before first payment:

from moltspay import MoltsPay

client = MoltsPay(chain="bnb")

# Check approval status
approvals = client.check_bnb_approvals()
print(f"USDC approved: {approvals['usdc_approved']}")
print(f"Allowance: {approvals['usdc_allowance']}")

Note: First BNB payment auto-approves. Approval costs ~$0.0001 in BNB gas (paid by client once).

Async Support

import asyncio
from moltspay import AsyncMoltsPay

async def main():
    async with AsyncMoltsPay() as client:
        result = await client.pay(
            "https://juai8.com/zen7",
            "text-to-video",
            prompt="a cat dancing"
        )
        print(result.result)

asyncio.run(main())

Error Handling

from moltspay import MoltsPay, InsufficientFunds, LimitExceeded, PaymentError

client = MoltsPay()

try:
    result = client.pay(...)
except InsufficientFunds as e:
    print(f"Need {e.required} USDC, have {e.balance}")
except LimitExceeded as e:
    print(f"Exceeds {e.limit_type} limit: {e.amount} > {e.limit}")
except PaymentError as e:
    print(f"Payment failed: {e}")

API Reference

Methods

Method Description Returns
pay(url, service_id, **params) Pay for and execute a service PaymentResult
discover(url) List services from a provider List[Service]
balance(chain=None) Get wallet balance Balance
all_balances() Get balances on all chains Dict[str, Dict]
limits() Get current spending limits Limits
set_limits(max_per_tx, max_per_day) Set spending limits None
faucet() Get free testnet tokens FaucetResult
fund(amount) Open Coinbase funding page FundingResult
fund_qr(amount) Print funding QR code FundingResult
check_bnb_approvals(chain="bnb") Check BNB approval status Dict

Properties

Property Description Type
address Wallet address (EVM or Solana) str

The .pay() Method

result = client.pay(
    provider_url: str,         # e.g., "https://juai8.com/zen7"
    service_id: str,           # e.g., "text-to-video"  
    token: str = "USDC",       # "USDC" or "USDT"
    **params                   # Service-specific parameters
)

PaymentResult Object

result.success      # bool - True if payment succeeded
result.amount       # float - Amount paid
result.token        # str - "USDC" or "USDT"
result.tx_hash      # str - Blockchain transaction hash
result.result       # Any - Service result (e.g., video URL)
result.error        # str | None - Error message if failed
result.explorer_url # str | None - Block explorer link

FaucetResult Object

result.success      # bool - True if faucet succeeded
result.amount       # float - Amount received
result.tx_hash      # str - Transaction hash
result.error        # str | None - Error message if failed

LangChain Integration

from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from moltspay.integrations.langchain import MoltsPayTool

llm = ChatOpenAI(model="gpt-4")
tools = [MoltsPayTool()]

agent = initialize_agent(
    tools, 
    llm, 
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)

# Agent can now pay for AI services!
result = agent.run("Generate a video of a cat dancing on the beach")

Available Tools

from moltspay.integrations.langchain import get_moltspay_tools

tools = get_moltspay_tools()  # Returns both tools
Tool Description
MoltsPayTool Pay for and execute services
MoltsPayDiscoverTool Discover available services and prices

Chain-Specific Notes

Solana

  • Wallet: Separate ed25519 keypair at ~/.moltspay/wallet-solana.json
  • Gas: Server pays (~$0.001 SOL per tx)
  • Token: Circle USDC SPL token

USDC Mint Addresses:

Network Address
Mainnet EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Devnet 4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU

BNB Chain

  • Decimals: 18 (not 6 like Base/Polygon)
  • Gas: Server pays (~$0.0001 per tx)
  • Approval: First payment requires one-time approval (client pays ~$0.0001)

Token Addresses:

Token Address
USDC 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d
USDT 0x55d398326f99059fF775485246999027B3197955

Tempo Moderato

Stablecoins:

Token Address
pathUSD (USDC) 0x20c0000000000000000000000000000000000000
alphaUSD (USDT) 0x20c0000000000000000000000000000000000001

Live Example: Zen7 Video Generation

Live service at https://juai8.com/zen7

Services:

  • text-to-video - $0.01 USDC
  • image-to-video - $0.01 USDC

Supported Chains: Base, Polygon, Solana, BNB, Tempo (mainnet & testnet)

from moltspay import MoltsPay

# Pay on Base (default)
result = MoltsPay().pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="a happy cat"
)

# Pay on Solana
result = MoltsPay(chain="solana_devnet").pay(
    "https://juai8.com/zen7", "text-to-video",
    prompt="a happy cat"
)

print(result.result)  # {"video_url": "https://..."}

CLI Compatibility

Wallet format is fully compatible with the Node.js CLI:

# Create wallet with Node CLI
npx moltspay init

# Use same wallet in Python
python -c "from moltspay import MoltsPay; print(MoltsPay().address)"

Related Projects

Community & Support

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

moltspay-0.7.0.tar.gz (81.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

moltspay-0.7.0-py3-none-any.whl (69.0 kB view details)

Uploaded Python 3

File details

Details for the file moltspay-0.7.0.tar.gz.

File metadata

  • Download URL: moltspay-0.7.0.tar.gz
  • Upload date:
  • Size: 81.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for moltspay-0.7.0.tar.gz
Algorithm Hash digest
SHA256 049e04473a7d68d49297a9000c646e25ac570c2b24fcd7882dc28e41933953c3
MD5 de6edebf731a1fc6320baafb920ef02b
BLAKE2b-256 54fb226d31a449a35e8c849be7ff049abcf31144bd7be8aab8d5f25195b76322

See more details on using hashes here.

File details

Details for the file moltspay-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: moltspay-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 69.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.2

File hashes

Hashes for moltspay-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 23455419b0c80ea43caa0073afc7cfe51b14b4a1d403fbba2963b32a39b66a19
MD5 10972dc6ff2801383776133ac5732a49
BLAKE2b-256 45ce37665bc5213f8b9439f11e7041baa5505431d9be44c00ae50b6226751559

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page