Non-custodial, headless SDK to control a wallet vault: balances, fee-transparent quotes, swaps and on-chain withdrawals over a co-signed 2-of-2 vault.
Project description
paymos — Python SDK
Non-custodial, headless control of a wallet vault. Your process holds one half of the signing key; our server holds the other. Neither side alone can move funds — every swap and withdrawal is co-signed, and we never receive your half.
You talk to it in plain asset terms (USDC@base, ETH@arb); the SDK hides the routing and the
2-of-2 FROST signing. Amounts you pass are human decimal strings (e.g. "100", "0.5") —
never a float; the server scales them to raw, and amounts in responses/dataclasses come back as
raw integer strings. The native signing core ships inside the wheel as a compiled
extension, so an end user needs no Rust toolchain.
Install
Wheels are self-contained (the native paymos._core extension is bundled), one per platform,
tagged cp311-abi3 — a single wheel serves CPython 3.11 / 3.12 / 3.13+:
# Windows
pip install paymos-0.1.0-cp311-abi3-win_amd64.whl
# Linux (x86-64)
pip install paymos-0.1.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
…or, once it's published:
pip install paymos
Only dependency is httpx (pulled automatically). Requires Python ≥ 3.11.
Get a vault secret
The SDK is driven by one vs_live_… vault secret. You create it in the wallet Mini App →
Settings → Vault API:
- a read key — view balances and get quotes (no share; cannot sign), and
- a full key — everything a read key does, plus
swapandwithdraw(carries your co-signing share).
The secret bundles the API key and, for a full key, your FROST share. The share never leaves your process and never reaches our server. There is no CLI provisioner — the key is minted in the Mini App (the share is decrypted on your device).
Point the SDK at it with an environment variable:
$env:PAYMOS_VAULT_SECRET = "vs_live_…"
# optional — defaults to https://wallet.paymos.io
# $env:PAYMOS_BASE_URL = "https://wallet.paymos.io"
1-minute usage
import asyncio
from paymos import Wallet
async def main():
w = Wallet.from_env() # reads PAYMOS_VAULT_SECRET
# Balances — per-asset, raw amount strings + a nullable USD value.
for b in await w.balances():
print(b.asset, b.amount_raw, b.usd)
# Preview a withdraw: a dry, money-safe quote. The headline is the fee breakdown.
q = await w.quote_withdraw(asset="USDC@base", amount="25", to="0xRecipient…")
print(q.fees.platform, q.fees.network, q.fees.route, q.fees.total)
# Move money (full-scope secret only). Amounts are human decimal strings.
mv = await w.swap(send="USDC@base", receive="ETH@arb", amount="100")
print(await w.wait(mv.id)) # poll to a terminal status
await w.aclose()
asyncio.run(main())
Read-only building blocks: assets(), balances(), quote_swap(...), quote_withdraw(...),
movement(id), movements(...). Money moves (need a full key): swap(...), withdraw(...), and
wait(id) to poll a movement to completed | failed | refunded | expired | cancelled.
The fee breakdown
quote_swap / quote_withdraw always return a dry Quote (nothing is persisted) whose
.fees is the headline: a Fees with platform, network, total (raw integer strings),
route (a RouteFee with .amount + .estimate, or None when there's no route leg), and a
nullable usd dict. Preview it before you ever sign. swap / withdraw create the real movement
under a fresh idempotency key and drive the co-sign; swap also takes an optional min_receive
(human decimal) and raises SlippageExceeded — signing nothing — if the guaranteed receive is
below it.
Security
- A leaked API key alone cannot move funds — no share, no signature (and we can revoke the key).
- A leaked share alone cannot move funds — no server co-sign.
- Both are needed, on purpose. Treat a full secret like a private key; back up the share.
Examples
See examples/ for a clickable local web demo (FastAPI, prod-pointed) that loads
balances, shows the fee breakdown, and — behind a confirm box — does a real swap, plus a minimal
demo.py CLI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file paymos-0.1.1.tar.gz.
File metadata
- Download URL: paymos-0.1.1.tar.gz
- Upload date:
- Size: 34.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
274e0c9104b716e39751db7ca072588845e4b55e23b022e7d99470fc5ecd294e
|
|
| MD5 |
bef325b4c364a373c5bf718dc06bc71b
|
|
| BLAKE2b-256 |
b6cd46e0679c8f4cab21c0e8995b99305fc62e8127cbcf678fbce5d2502cbee1
|
Provenance
The following attestation bundles were made for paymos-0.1.1.tar.gz:
Publisher:
wheels.yml on shockk73/intents-vault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paymos-0.1.1.tar.gz -
Subject digest:
274e0c9104b716e39751db7ca072588845e4b55e23b022e7d99470fc5ecd294e - Sigstore transparency entry: 2098251815
- Sigstore integration time:
-
Permalink:
shockk73/intents-vault@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/shockk73
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Trigger Event:
push
-
Statement type:
File details
Details for the file paymos-0.1.1-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: paymos-0.1.1-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 359.3 kB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
484429ec02ee7b62cc2b9ef513fc75e6e6a3ae77c6e263e257d21d0008205c10
|
|
| MD5 |
19793c584a65ac038315a70deca1cb15
|
|
| BLAKE2b-256 |
65c961044b6c12b61379f4cebc65f832191a5f24b32efcb4424665f74ee635a0
|
Provenance
The following attestation bundles were made for paymos-0.1.1-cp311-abi3-win_amd64.whl:
Publisher:
wheels.yml on shockk73/intents-vault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paymos-0.1.1-cp311-abi3-win_amd64.whl -
Subject digest:
484429ec02ee7b62cc2b9ef513fc75e6e6a3ae77c6e263e257d21d0008205c10 - Sigstore transparency entry: 2098252096
- Sigstore integration time:
-
Permalink:
shockk73/intents-vault@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/shockk73
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Trigger Event:
push
-
Statement type:
File details
Details for the file paymos-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: paymos-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 510.7 kB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acca30ca30525ff98acf195b44e9957bb65edb13ebdba6c9b0a5fe9ec5f11dad
|
|
| MD5 |
25015a6511977f2078187d9f8adaa5ca
|
|
| BLAKE2b-256 |
2115e8e7c03e04c47ec720affdf98217f9fff853337fa8078441ea52cf03e571
|
Provenance
The following attestation bundles were made for paymos-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
wheels.yml on shockk73/intents-vault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paymos-0.1.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
acca30ca30525ff98acf195b44e9957bb65edb13ebdba6c9b0a5fe9ec5f11dad - Sigstore transparency entry: 2098252293
- Sigstore integration time:
-
Permalink:
shockk73/intents-vault@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/shockk73
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@b9f97d57c4b52ff2ab5ef1154a61a9a7f5f61020 -
Trigger Event:
push
-
Statement type: