Every time I needed to add wallets to an app, the same nightmare started. Wire up RPC nodes. Pick a signing library. Figure out key storage. Handle different chains differently. Repeat for every project.
I got tired of it. So I built Signet — a single API that handles wallet creation, transaction signing, and intent-based operations (swap, stake, bridge) across 12+ chains. Keys are encrypted with AES-256-GCM and never leave the server unencrypted. The core is written in Rust.
Here's how fast you can go from zero to working wallets.
Install the SDK
Python:
pip install vylth-signet
TypeScript:
npm install @vylth/signet
Create a Wallet — 3 Lines
Grab your API key and secret from the Signet Console, then:
Python:
from signet import Client
client = Client(api_key="sk_live_...", secret="ss_live_...")
wallet = client.wallets.create(chain="ethereum", label="my-wallet")
print(wallet.address) # 0x1a2b3c...
TypeScript:
import { Signet } from '@vylth/signet';
const signet = new Signet({
apiKey: 'sk_live_...',
secret: 'ss_live_...',
});
const wallet = await signet.wallets.create({
chain: 'ethereum',
label: 'my-wallet',
});
console.log(wallet.address); // 0x1a2b3c...
That's it. One call. The wallet is created, the private key is encrypted and stored, and you get back the address. No RPC node setup, no key management code, no ethers.js boilerplate.
Sign a Transaction
result = client.wallets.sign(wallet.id, tx_data="0x...")
print(result.signature)
Or sign and broadcast in one call:
tx = client.wallets.send(wallet.id, tx_data="0x...")
print(tx.tx_hash) # Transaction hash on-chain
Intent Actions — Swap, Stake, Bridge
This is where it gets interesting. Instead of wiring up Uniswap routers or Lido contracts yourself, just tell Signet what you want to do:
Swap tokens:
tx = client.wallets.swap(
wallet.id,
from_token="ETH",
to_token="USDC",
amount="0.5",
slippage_bps=50,
)
print(tx.tx_hash)
Stake ETH:
tx = client.wallets.stake(wallet.id, protocol="lido", amount="1.0")
Bridge to another chain:
tx = client.wallets.bridge(
wallet.id,
to_chain="polygon",
token="USDC",
amount="100",
)
Transfer tokens:
tx = client.wallets.transfer(
wallet.id,
to="0xRecipientAddress...",
amount="0.1",
token="USDC",
)
All of these are single API calls. Signet handles the routing, gas estimation, and broadcasting.
Supported Chains
Signet supports EVM chains and Solana:
- Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, BSC
- Solana
- Tron, Fantom, Cronos, Gnosis
Same API, same SDK, regardless of the chain. Create an Ethereum wallet and a Solana wallet the same way — just change the chain parameter.
Check Your Balance
balance = client.wallets.balance(wallet.id)
print(f"{balance.balance} {balance.symbol}")
Audit Log
Every action is logged. Query it programmatically:
logs = client.audit(wallet_id=wallet.id, limit=10)
for entry in logs:
print(f"{entry.action} — {entry.created_at}")
How Keys Are Stored
- Every private key is encrypted with AES-256-GCM using a unique nonce
- Keys are decrypted only in memory at the moment of signing, then wiped using Rust's
zeroizecrate - Signet is non-custodial by design — you can export your keys at any time:
exported = client.wallets.export(wallet.id)
print(exported.private_key) # Your key, your control
Why I Built This
I was building apps that needed wallets — bots, payment flows, DeFi automation — and every time I had to:
- Spin up RPC endpoints
- Pick and configure a signing library
- Build key storage with encryption
- Handle gas estimation per chain
- Wire up protocol-specific contracts for swaps/stakes
It was the same 2-3 days of setup for every project. Signet collapses all of that into one API.
Get Started
- Console: signet.vylth.com
- Free tier: 1,000 requests/month, 5 wallets
- SDKs: Python, TypeScript, Go
-
Use code
LAUNCHfor 50% off your first month on any paid plan
If you're building anything that touches wallets — whether it's a trading bot, a payment system, or a full DeFi app — give it a try and let me know what you think.
Top comments (0)