Sell any API per call on Portaldot V3,
settled across both of its contract VMs.
portal-meter.swiftbotlab.workers.dev/demo · Swift Bot Labs
Every new storage slot locks a deposit. We measured our own first design, one payment per request, and it does not fit a call worth a fraction of a cent.
| Per-request escrow | Prepaid session | |
|---|---|---|
| Transactions per request | 2 | 0 |
| Locked for good per request | 7.53 tPOT | 0.076 tPOT |
| 100 requests | about 753 tPOT | 7.6 tPOT |
Measured on the PortaldotV3 testnet with our own keys: blocks 276657 to 276660 and 282559. Test tokens have no value; the ratio is the point. deployments/proof/
redeem in Solidity, record in ink!, all or nothing402 with a quote (price, token, endpoint, nonce)MeterSettlement.pay() on Portaldot's EVM; the request id is bound to the payer on-chainEvery pallet-assets token is reachable from Solidity at a precompile address. Endpoints are priced in a native asset; no wrapped token to deploy or trust.
Escrow in Solidity (pallet-revive), provider registry in ink! (pallet-contracts). Both sides key accounts by the same EVM address, using the runtime's own mapping rule.
An Ethereum transaction to the runtime pallets address carries utility.batchAll([revive.call(settle), contracts.call(record)]): settlement and anchor succeed or fail together. A single-VM chain cannot do this.
The registry recomputes the Solidity request id (keccak + ABI) from the caller's address, so only the real payer can rate a request, with no bridge or oracle.
| MeterSettlement (Solidity, EVM) | 0x9E7Ad2Aa75…ef97e5781e | deploy 0x1adf1c42…15731227 · block 276611 |
| MeterSession (Solidity, EVM) | 0xCc2aBc8AC1…A0b743B3d5 | deploy 0xfa1c962f…5cbb6d2d · block 282417 |
| MeterRegistry (ink!, WASM) | 5DHgN8JZRpyo…K1K2Vd8Ku4 | instantiate 0xef17ab33…97bd60e0 · block 276655 |
| 137 requests from 3 sessions settled: redeem + ink! anchor, one Ethereum tx | 0xe5038746f4…a1aded7f09 | block 282559 |
| Native asset #43907 tUSDm | 0x0000ab8300…0000010000 | ERC-20 precompile address |
| Served: settle + ink! anchor, one Ethereum tx | 0xf5264278d3…1e7e0bacb6 | block 276658 |
| Refunded: refund + ink! anchor, one Ethereum tx | 0x1a52029d1a…d68a36f314 | block 276660 |
| Buyer confirms in ink! from its Ethereum key | 0x91d0a18a7a…7970cd3297 | block 276665 |
All transactions with blocks: deployments/testnet.json · live page: portal-meter.swiftbotlab.workers.dev/demo · explorer https://scanner-testnet-v3.portaldot.dev
The provider's Ethereum key signs one transaction to the runtime pallets address. Here it was signed inside a Cloudflare Worker:
utility.batchAll([revive.call(redeem), contracts.call(record), ...])
assets.Transferred, revive.ContractEmitted)contracts.Called)utility.BatchCompleted
npm package and a provider CLI wizard · paid endpoints from other Portaldot builders · session keys with spending rules · mainnet migration review
provider bond held in the ink! registry · wallet and explorer support for quotes and receipts · a hosted seller for providers
open-source middleware every API builder can reuse · fee-paying transactions on both VMs · measured notes on deposits and cross-VM calls for other teams
Swift Bot Labs, a small studio building payment and API infrastructure. Builds on our MIT-licensed HSK Meter (Oct 2026); this repository was written for Portaldot during the Hacker House.