984d5ad6cd3185d7dece11890b97487e7709d967 2026-11-07T18:21:50+05:30 Swiftbot Live page: post-freeze display fixes only, no functional change demo/style.css | 3 +++ 1 file changed, 3 insertions(+) 4b3277bbdde40c15970e6789e8aa6f976d4dbbb2 2026-11-07T18:11:01+05:30 Swiftbot Live page: post-freeze display fixes only, no functional change demo/app.js | 6 ++++-- demo/index.html | 9 ++++++--- demo/style.css | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) 7ca9adf23b9277ab1d095b3b46d5182a4c33ae8d 2026-11-06T01:50:17+05:30 Swiftbot Ship the Archivo and Martian Mono font licences (SIL OFL 1.1) with the fonts site/assets/fonts/LICENSE-Archivo.txt | 93 +++++++++++++++++++++++++++++++ site/assets/fonts/LICENSE-MartianMono.txt | 93 +++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) a98bb1901042425d2997b46664c79ec62f42164e 2026-11-06T00:09:57+05:30 Swiftbot Effect runtime: ship the taste-skill MIT licence with it README.md | 1 + site/assets/fx/LICENSE | 21 +++++++++++++++++++++ site/assets/fx/README.md | 6 +++--- site/assets/fx/fx.js | 1 + site/assets/fx/line-engraving/effect.js | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) 8d2023d225059cc1df0973be49f760bdf8bc24ec 2026-11-06T00:03:50+05:30 Swiftbot Site v2: lazy icons, full hashes wrap or keep their full text, checker fixes site/assets/landing.css | 11 ++++++++--- site/index.html | 24 ++++++++++++------------ 2 files changed, 20 insertions(+), 15 deletions(-) b1827c2c5fa1a1f9c71445553e1248892c045490 2026-11-05T23:41:57+05:30 Swiftbot Site v2: the postage-meter redesign, light and dark, and four live-page fixes demo/app.js | 18 +- demo/index.html | 28 +- demo/style.css | 51 ++ site/DESIGN.md | 44 ++ site/assets/fonts/README.md | 4 +- site/assets/fonts/archivo-latin.woff2 | Bin 0 -> 90104 bytes site/assets/fonts/inter-latin.woff2 | Bin 48256 -> 0 bytes site/assets/fonts/jbmono-latin.woff2 | Bin 31432 -> 0 bytes site/assets/fonts/martianmono-latin.woff2 | Bin 0 -> 38492 bytes site/assets/fx/README.md | 5 + site/assets/fx/fx.js | 955 ++++++++++++++++++++++++++++++ site/assets/fx/line-engraving/effect.js | 260 ++++++++ site/assets/fx/line-engraving/meta.json | 10 + site/assets/icons/bun.svg | 22 + site/assets/icons/cloudflare-workers.svg | 45 ++ site/assets/icons/deno.svg | 5 + site/assets/icons/ethereum.svg | 8 + site/assets/icons/express.svg | 3 + site/assets/icons/icons-credits.json | 86 +++ site/assets/icons/nodejs.svg | 3 + site/assets/icons/solidity.svg | 8 + site/assets/landing.css | 852 ++++++++++++++++---------- site/assets/site.css | 292 +++++---- site/assets/site.js | 223 ++++--- site/assets/theme.js | 26 + site/index.html | 570 ++++++++++-------- 26 files changed, 2734 insertions(+), 784 deletions(-) f74f6d3663f38c24c66bc448a28a3afd23c47d10 2026-11-05T20:00:32+05:30 Swiftbot Site redesign: a designed landing page and a restyled live page demo/index.html | 149 ++++++---- demo/style.css | 319 ++++++++++++++-------- scripts/build-site.mjs | 34 ++- site/assets/favicon.svg | 1 + site/assets/fonts/README.md | 8 + site/assets/fonts/inter-latin.woff2 | Bin 0 -> 48256 bytes site/assets/fonts/jbmono-latin.woff2 | Bin 0 -> 31432 bytes site/assets/landing.css | 341 +++++++++++++++++++++++ site/assets/site.css | 223 +++++++++++++++ site/assets/site.js | 193 +++++++++++++ site/index.html | 507 +++++++++++++++++++++++++++++++++++ 11 files changed, 1597 insertions(+), 178 deletions(-) 490db9352b18a3480247cbea04817d0ad8176dec 2026-11-05T18:23:05+05:30 Swiftbot Live page: the buy box is there from first paint, the purchase answers on the click, nothing moves demo/app.js | 11 +++++++++- demo/index.html | 7 ++++--- demo/style.css | 23 ++++++++++++++++++++- demo/try.js | 50 ++++++++++++++++++++++++++++++++++++++++------ scripts/build-site.mjs | 2 +- scripts/prerender-demo.mjs | 7 +++++++ 6 files changed, 88 insertions(+), 12 deletions(-) 11c6645ad15caca5e2ec635a6a376e878d91b3bf 2026-11-05T09:55:07+05:30 Swiftbot README: the quickstart output as printed, npm warnings included README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 61c472fedb691798391a309f5594c02a09f85361 2026-11-05T09:47:55+05:30 Swiftbot README: the cost chart first, five lines from a terminal with their real output, and the trust model README.md | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/session.mjs | 3 +- 2 files changed, 138 insertions(+), 6 deletions(-) c248246d73f2a21fd5a446569000012d405bb85d 2026-11-05T09:39:58+05:30 Swiftbot Cost chart, the package on the hosted site, deck at 73 Node tests docs/SESSIONS.md | 3 ++- pitch/cost-per-request.png | Bin 0 -> 195420 bytes pitch/cost-per-request.svg | 46 ++++++++++++++++++++++++++++++++++++++++++++ pitch/counts.json | 2 +- pitch/deck.html | 2 +- pitch/portal-meter-deck.pdf | Bin 372217 -> 372220 bytes scripts/build-site.mjs | 10 ++++++++-- src/session.mjs | 2 +- 8 files changed, 59 insertions(+), 6 deletions(-) 77ccbaf62fcccc7d2b5ec891d7f3cdcb7f9cec98 2026-11-05T09:33:39+05:30 Swiftbot CLI: session-verify checks a session against the chain; session-open records its block bin/portal-meter.mjs | 32 ++++++++++++++++++++--- src/session-verify.mjs | 27 ++++++++++++++++++- test/cli-session-verify.test.mjs | 56 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 4 deletions(-) 4e9ab7ded40ddedeae7485d3c644879299ab51ad 2026-11-05T05:43:54+05:30 Swiftbot Paid indexer: hosted on Cloudflare Workers as endpoint 4, verify.mjs, and the run that moved it README.md | 38 +++++-- examples/paid-indexer/README.md | 33 ++++-- examples/paid-indexer/RUN.md | 92 +++++++++++++++- examples/paid-indexer/test/app.test.mjs | 22 +++- examples/paid-indexer/upstream.mjs | 12 +- examples/paid-indexer/verify.mjs | 36 ++++++ examples/paid-indexer/worker/index.mjs | 171 +++++++++++++++++++++++++++++ examples/paid-indexer/worker/wrangler.toml | 23 ++++ pitch/counts.json | 2 +- pitch/deck.html | 2 +- pitch/portal-meter-deck.pdf | Bin 372221 -> 372217 bytes test/example.test.mjs | 6 +- 12 files changed, 406 insertions(+), 31 deletions(-) 520e2da145463551555c8f8d8e8f233cf4ed99fb 2026-11-05T05:31:56+05:30 Swiftbot Verifier as a library, stricter: anchors must match the money; set-url for providers that move .gitignore | 2 + bin/portal-meter.mjs | 28 +++++++--- demo/try.js | 17 +++--- package.json | 2 + src/runtime-calls.mjs | 11 ++++ src/session-verify.mjs | 112 ++++++++++++++++++++++++++++++++++++++ test/exports.test.mjs | 4 ++ test/runtime-calls.test.mjs | 22 +++++++- test/session-verify.test.mjs | 127 +++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 308 insertions(+), 17 deletions(-) 2553167ae004a11f543779ac1031f64159cd8e20 2026-11-04T23:14:15+05:30 Swiftbot Live page: with JavaScript on, the baked snapshot gives way to the live page demo/app.js | 1 + demo/try.js | 1 + 2 files changed, 2 insertions(+) 8b88508fb945123af2ede6658d748d30d8f4d76c 2026-11-04T23:09:23+05:30 Swiftbot Live page: a static first paint with a verified replay, baked before each deploy README.md | 5 +- demo/try.js | 6 +- scripts/prerender-demo.mjs | 150 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 3 deletions(-) 3cb1857ef6606810c19ce9242d387a5dc02ae4a5 2026-11-04T23:02:55+05:30 Swiftbot Hosted site: publish the deployment record, not local state scripts/build-site.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 64b30e680e3a9605e03b4c7b099819483eecc39c 2026-11-04T23:02:04+05:30 Swiftbot Hosted site: serve the reuse example and the settler as plain text scripts/build-site.mjs | 5 +++++ 1 file changed, 5 insertions(+) 0950e53676a33c79b5b958e6130b9e650b1db42c 2026-11-04T23:00:56+05:30 Swiftbot README and deck: the measured story first, the reuse example, what we don't claim README.md | 40 +++++++++++++++++++++++++++++----------- pitch/counts.json | 2 +- pitch/deck.html | 5 +++-- pitch/portal-meter-deck.pdf | Bin 371099 -> 372221 bytes scripts/build-deck.mjs | 3 ++- 5 files changed, 35 insertions(+), 15 deletions(-) acafebc4afd7eb473a2ba866e6ababef64065367 2026-11-04T22:59:35+05:30 Swiftbot Live page: no deployment claims in the static HTML demo/app.js | 7 +++++-- demo/index.html | 12 ++++-------- demo/try.js | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) 820abe21ce3e7dcbefeb16d70ff1e96c866e9889 2026-11-04T22:58:23+05:30 Swiftbot Example: a paid indexer that installs the package from a folder of its own examples/paid-indexer/README.md | 56 ++++++++++ examples/paid-indexer/RUN.md | 146 +++++++++++++++++++++++++ examples/paid-indexer/app.mjs | 72 +++++++++++++ examples/paid-indexer/buy.mjs | 51 +++++++++ examples/paid-indexer/file-ledger.mjs | 44 ++++++++ examples/paid-indexer/package.json | 19 ++++ examples/paid-indexer/server.mjs | 113 ++++++++++++++++++++ examples/paid-indexer/test/app.test.mjs | 184 ++++++++++++++++++++++++++++++++ examples/paid-indexer/upstream.mjs | 141 ++++++++++++++++++++++++ test/example.test.mjs | 39 +++++++ 10 files changed, 865 insertions(+) 2335d1e5c33bb43226d131e4efed4b7cfb4a9f46 2026-11-04T22:49:50+05:30 Swiftbot Package: ship the published deployment, never local state package.json | 5 ++++- test/exports.test.mjs | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) b583436c5986b90d40a55bd9f4f4e0eca7349b5b 2026-11-04T22:48:15+05:30 Swiftbot Seller kit: settle any ledger's sessions, and export what a seller needs package.json | 4 ++ src/address.mjs | 4 ++ src/settler.mjs | 131 ++++++++++++++++++++++++++++++++++++++++++++ test/exports.test.mjs | 43 +++++++++++++++ test/settler.test.mjs | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 330 insertions(+) 48205a4b5e8787ded27b0ab359c03390f17b5f7e 2026-11-04T11:53:29+05:30 Swiftbot README: all three deployed Solidity contracts match the source, independently checked README.md | 6 ++++++ 1 file changed, 6 insertions(+) d68d4e5c9529254cb146a1eb9bc8c887dcb77cc8 2026-11-04T11:52:20+05:30 Swiftbot Keep the source of the retired first MeterSession deployment contracts/evm-retired-v1/README.md | 23 +++ contracts/evm-retired-v1/foundry.toml | 15 ++ contracts/evm-retired-v1/src/MeterSession.sol | 220 ++++++++++++++++++++++++++ 3 files changed, 258 insertions(+) d9deda41795a498a2524a7f027c593ccd93d8d41 2026-11-03T20:43:04+05:30 Swiftbot Cut the demo video's closing card, which listed retired addresses README.md | 2 +- demo/portal-meter-demo.mp4 | Bin 14191526 -> 7156522 bytes scripts/build-site.mjs | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) 27f8f1f32d4023a26acc7aeb13bc844290f5cfc2 2026-11-03T07:16:33+05:30 Swiftbot Ship the CLI's helpers and deployment data in the package package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 921cd5d4bd421ffe30f42435df350b425145466f 2026-11-03T07:13:02+05:30 Swiftbot Make the meter installable from the repository README.md | 6 +++++- package.json | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 48548a4dfbcc3ff54f66c9c9b89dba3e629c07bd 2026-11-03T04:15:14+05:30 Swiftbot Record the payer closing both measured sessions deployments/proof/session-measure.json | 17 +++++++++++++++++ docs/SESSIONS.md | 2 ++ 2 files changed, 19 insertions(+) 7a6b18841dd9f974e57d0c37d5ab0600b822776e 2026-11-02T05:01:46+05:30 Swift Bot Labs docs: update links README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) aec51cb9e0efafeba5b487bd4e3c83bfab034371 2026-11-02T02:58:11+05:30 Swiftbot Negative checks re-run on the final deployment deployments/proof/session-negative-checks.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 66df2643571018a82036d80877e5b3152f23c637 2026-11-02T02:57:04+05:30 Swiftbot Deck: self-hosted links, cleaner page image pitch/deck.html | 4 ++-- pitch/demo-page.png | Bin 198074 -> 176577 bytes pitch/portal-meter-deck.pdf | Bin 392781 -> 371099 bytes scripts/build-deck.mjs | 4 ++-- 4 files changed, 4 insertions(+), 4 deletions(-) f1f0ce56fe35b55c2131204cc865bfdd394b5eb5 2026-11-02T02:54:34+05:30 Swiftbot Links point at the self-hosted site README.md | 8 ++++---- pitch/deck.html | 4 ++-- pitch/portal-meter-deck.pdf | Bin 392735 -> 392781 bytes scripts/build-deck.mjs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) 7c1fa8ccd4d7801f3b479104e7a0adcbf30b313d 2026-11-02T02:52:09+05:30 Swiftbot Self-hosted site: page, deck, docs, proofs and source archive from the Worker .gitignore | 1 + demo/index.html | 2 +- deployments/proof/session-negative-checks.json | 4 +- pitch/portal-meter-deck.pdf | Bin 370837 -> 392735 bytes scripts/build-site.mjs | 60 +++++++++++++++++++++++++ worker/wrangler.toml | 6 +++ 6 files changed, 70 insertions(+), 3 deletions(-) e87fdfbc587d767d46205075cc7029436a3614d4 2026-11-02T02:50:16+05:30 Swiftbot Demo video recut around sessions (2:30); deck images from the live batch README.md | 2 +- demo/portal-meter-demo.mp4 | Bin 17264873 -> 14191526 bytes demo/video-poster.jpg | Bin 80853 -> 119465 bytes pitch/block-events.png | Bin 89726 -> 71140 bytes pitch/demo-page.png | Bin 227736 -> 198074 bytes 5 files changed, 1 insertion(+), 1 deletion(-) 7ad88947ce07730c6ce542b0bb24de356267d85d 2026-11-02T02:41:45+05:30 Swiftbot Live page reads redemptions from the session's first block; CLI resumes one step ahead bin/portal-meter.mjs | 3 +++ demo/index.html | 3 ++- demo/try.js | 2 +- deployments/sessions.json | 3 ++- scripts/deploy-sessions.mjs | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) 051623fa08a36fe4380971dea04eed48674bbd39 2026-11-02T02:40:19+05:30 Swiftbot README, docs, deck and live page for sessions, with measured numbers README.md | 148 ++++++++++++++++++++----- SECURITY.md | 28 +++-- demo/index.html | 11 +- demo/style.css | 1 + demo/try.js | 5 +- deployments/proof/session-measure.json | 71 ++++++++++++ deployments/proof/session-negative-checks.json | 116 +++++++++++++++++++ deployments/sessions.json | 36 +++++- docs/SESSIONS.md | 74 +++++++++---- pitch/counts.json | 2 +- pitch/deck.html | 91 +++++++++------ scripts/build-deck.mjs | 77 +++++++++---- scripts/measure-session.mjs | 18 ++- scripts/negative-checks-sessions.mjs | 83 ++++++++++++++ src/session-client.mjs | 21 ++-- 15 files changed, 648 insertions(+), 134 deletions(-) 685610ad0fbfa0016fcfc851ab3fd6844d50ad7d 2026-11-02T02:26:28+05:30 Swiftbot MeterSession redeployed with the review fixes; hosted seller moved to it deployments/proof/session-measure-v1.json | 80 +++++++++++++++++++++++++++ deployments/proof/sessions-v1.json | 89 +++++++++++++++++++++++++++++++ deployments/sessions.json | 45 ++++++++++++---- scripts/measure-session.mjs | 36 +++++++++---- worker/wrangler.toml | 2 +- 5 files changed, 231 insertions(+), 21 deletions(-) 8baf8f0468424bde3ec9c19aa7a76ea68d21b68c 2026-11-02T02:24:33+05:30 Swiftbot Fixes from an independent security review SECURITY.md | 28 +++++++ contracts/evm/src/MeterSession.sol | 48 +++++++---- contracts/evm/test/MeterSession.t.sol | 30 +++++-- contracts/evm/test/Mocks.sol | 14 ++++ docs/ARCHITECTURE.md | 13 +++ src/meter.mjs | 132 +++++++++++++++++++++-------- src/rawtx.mjs | 24 ++++-- src/session-chain.mjs | 4 +- src/session-client.mjs | 27 +++++- src/session-settle.mjs | 19 +++-- src/session.mjs | 14 +++- test/runtime-calls.test.mjs | 5 +- test/session.test.mjs | 153 ++++++++++++++++++++++++++++++++-- worker/src/index.mjs | 125 ++++++++++++++++++++------- 14 files changed, 522 insertions(+), 114 deletions(-) ff32f91660263ed8559d07f248f08b49791a908c 2026-11-02T02:10:03+05:30 Swiftbot Hosted seller, live: paid Portaldot data API on Cloudflare Workers bin/portal-meter.mjs | 88 ++++++++++++++- demo/app.js | 18 +++- demo/index.html | 22 ++++ demo/style.css | 6 ++ demo/try.js | 137 ++++++++++++++++++++++++ deployments/sessions.json | 89 ++++++++++++++++ docs/SESSIONS.md | 65 ++++++++++++ examples/sell-an-api.mjs | 31 ++++++ scripts/deploy-sessions.mjs | 191 +++++++++++++++++++++++++++++++++ scripts/measure-session.mjs | 95 +++++++++++++++++ src/session-settle.mjs | 2 +- worker/src/index.mjs | 253 ++++++++++++++++++++++++++++++++++++++++++++ worker/wrangler.toml | 37 +++++++ 13 files changed, 1027 insertions(+), 7 deletions(-) 14992b6a4a8e3aae6c2754bc1ce0a886a5c5432f 2026-11-02T02:04:36+05:30 Swiftbot redeem is provider-only; settle before a session can expire; dependency-free data reads .gitignore | 1 + contracts/evm/src/MeterSession.sol | 9 +- contracts/evm/test/MeterSession.t.sol | 66 ++++++++----- package-lock.json | 4 + package.json | 1 + scripts/probe.mjs | 8 ++ src/lite-data.mjs | 169 ++++++++++++++++++++++++++++++++++ src/session-settle.mjs | 4 +- test/lite-data.test.mjs | 57 ++++++++++++ test/runtime-calls.test.mjs | 3 +- 10 files changed, 293 insertions(+), 29 deletions(-) e68a32e0e227cc9f414b39083dddbf0740d10fed 2026-11-02T01:58:22+05:30 Swiftbot Settle many sessions in one Ethereum transaction across both VMs src/rawtx.mjs | 42 +++++++++++++++++++++++++++++ src/runtime-calls.mjs | 65 +++++++++++++++++++++++++++++++++++++++++++++ src/session-settle.mjs | 64 ++++++++++++++++++++++++++++++++++++++++++++ test/runtime-calls.test.mjs | 57 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 228 insertions(+) a6f700162c1b491c143bda071738f348e78535f0 2026-11-02T01:54:53+05:30 Swiftbot Sessions off-chain: voucher protocol, framework-neutral meter, buyer client src/meter.mjs | 209 ++++++++++++++++++++++++++++++++++++++++ src/session-chain.mjs | 55 +++++++++++ src/session-client.mjs | 81 ++++++++++++++++ src/session.mjs | 151 +++++++++++++++++++++++++++++ test/session.test.mjs | 257 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 753 insertions(+) ad2bd4e374927f539c06585cbc7c2b2370b39f0e 2026-11-02T01:49:37+05:30 Swiftbot MeterSession: prepaid sessions with payer-signed, hash-chained vouchers contracts/evm/src/MeterSession.sol | 219 +++++++++++++++++++ contracts/evm/test/MeterSession.t.sol | 382 ++++++++++++++++++++++++++++++++++ contracts/evm/test/Mocks.sol | 23 ++ 3 files changed, 624 insertions(+) 3293864b90e7ce8366a7b55d67e6ea1e61613b65 2026-11-01T17:16:05+05:30 Swiftbot README: link the demo video on YouTube README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) dd2593160a142b0caf01ed49c2647212d4b832e5 2026-11-01T16:58:10+05:30 Swiftbot Demo video on the live page; CLI receipts from the testnet README.md | 5 +++- demo/index.html | 5 ++++ demo/portal-meter-demo.mp4 | Bin 0 -> 17264873 bytes demo/video-poster.jpg | Bin 0 -> 80853 bytes deployments/proof/events.json | 49 +++++++++++++++++++++++++++++++++ deployments/receipts/cli-refunded.json | 29 +++++++++++++++++++ deployments/receipts/cli-served.json | 28 +++++++++++++++++++ 7 files changed, 115 insertions(+), 1 deletion(-) 9c98447d3698eaa5a6059d3d2223be9165937fbc 2026-11-01T16:51:58+05:30 Swiftbot Pitch deck with the live deployment pitch/block-events.png | Bin 0 -> 89726 bytes pitch/deck.html | 36 +++++++++++++++++++++++++----------- pitch/demo-page.png | Bin 160207 -> 227736 bytes pitch/portal-meter-deck.pdf | Bin 260744 -> 370837 bytes scripts/build-deck.mjs | 22 ++++++++++++++++++++-- 5 files changed, 45 insertions(+), 13 deletions(-) c0c847e1dd9df77e83f9145f1a5f18a7f475834d 2026-11-01T16:51:06+05:30 Swiftbot Explorer deep links use its hash routes; show both VMs in one extrinsic README.md | 29 ++++++++++++++++------------- demo/app.js | 10 +++++----- docs/ARCHITECTURE.md | 11 +++++++---- docs/PORTALDOT_V3_NOTES.md | 2 +- 4 files changed, 29 insertions(+), 23 deletions(-) 2371879992bc843e09ad0605c9564cd9e089b1f5 2026-11-01T16:48:25+05:30 Swiftbot ink! registry live: settlement and anchor in one Ethereum transaction README.md | 60 ++++---- deployments/proof/events.json | 73 ++++++++++ deployments/proof/negative-checks.json | 89 ++++++++++++ deployments/proof/receipts.json | 241 +++++++++++++++++++++++++++++++++ deployments/receipts/evm-refunded.json | 119 ++++++++++++++++ deployments/receipts/evm-served.json | 118 ++++++++++++++++ deployments/receipts/refunded.json | 36 ++--- deployments/receipts/served.json | 42 +++--- deployments/receipts/xvm-served.json | 116 ++++++++++++++++ deployments/testnet.json | 87 +++++++++++- docs/ARCHITECTURE.md | 8 +- docs/PORTALDOT_V3_NOTES.md | 22 ++- scripts/build-deck.mjs | 15 +- scripts/deploy-testnet.mjs | 79 +++++++++-- scripts/negative-checks.mjs | 83 ++++++++++++ src/buyer.mjs | 4 +- src/settle.mjs | 11 +- src/xvm.mjs | 3 +- 18 files changed, 1110 insertions(+), 96 deletions(-) 4c32b0d468e5c07f13d14c96bd9270d6b89a19ed 2026-11-01T16:43:52+05:30 Swiftbot Live on the PortaldotV3 testnet: settlement, paid request, refund README.md | 37 ++++-- SECURITY.md | 7 +- bin/portal-meter.mjs | 22 ++-- demo/app.js | 25 +++- demo/index.html | 4 +- deployments/proof/events.json | 77 ++++++++++++ deployments/proof/receipts.json | 233 +++++++++++++++++++++++++++++++++++++ deployments/receipts/refunded.json | 119 +++++++++++++++++++ deployments/receipts/served.json | 118 +++++++++++++++++++ deployments/testnet.json | 117 +++++++++++++++++++ scripts/deploy-testnet.mjs | 71 +++++++---- scripts/record-proof.mjs | 42 +++++++ src/data.mjs | 2 +- 13 files changed, 826 insertions(+), 48 deletions(-) 9619d32cd49b83028cabd8d0b9268908c173a2c9 2026-11-01T16:38:08+05:30 Swiftbot CI: fix the ink! build step and a rare test hang; pitch deck .github/workflows/ci.yml | 2 +- demo/app.js | 3 ++- pitch/deck.html | 40 ++++++++++++++++++++++++++++++---------- pitch/demo-page.png | Bin 0 -> 160207 bytes pitch/portal-meter-deck.pdf | Bin 0 -> 260744 bytes scripts/build-deck.mjs | 39 ++++++++++++++++++++++++++++++--------- src/evm.mjs | 16 ++++++++++++++-- test/e2e.test.mjs | 12 +++++++----- test/helpers.mjs | 3 ++- 9 files changed, 86 insertions(+), 29 deletions(-) 4a846f8d044901f28dd0e12ea36232ca50f640a6 2026-11-01T13:11:33+05:30 Swiftbot xvm: read ReturnFlags.bits from the revive dry-run src/xvm.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 7edc31c782cfd4ab99533e80d440b332f450cb1a 2026-11-01T13:10:19+05:30 Swiftbot ink! registry build artifact and lockfile; deploy budget check contracts/ink/meter_registry/Cargo.lock | 1691 +++++++++++++++++ .../artifact/meter_registry.contract | 1 + .../meter_registry/artifact/meter_registry.json | 1925 ++++++++++++++++++++ .../meter_registry/artifact/meter_registry.wasm | Bin 0 -> 16090 bytes docs/PORTALDOT_V3_NOTES.md | 4 +- scripts/deploy-testnet.mjs | 19 +- 6 files changed, 3638 insertions(+), 2 deletions(-) abe09b8e3cfbf9482325e7d922b787a4a83a7a30 2026-11-01T13:08:20+05:30 Swiftbot README: how a request is paid, why Portaldot, run and deploy instructions README.md | 128 ++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 36 deletions(-) 59e408130fea59ba7fd48e5baf7e57b3560ed5d7 2026-11-01T13:07:35+05:30 Swiftbot Command line: status, verify, buy, serve bin/portal-meter.mjs | 140 +++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 10 +++- scripts/build-deck.mjs | 2 +- 3 files changed, 149 insertions(+), 3 deletions(-) a6f6e159e1dc344195bc896089dd93072063e53e 2026-11-01T13:06:07+05:30 Swiftbot ink! registry: satisfy cargo-contract arithmetic lint; pitch deck builder contracts/ink/meter_registry/lib.rs | 2 +- pitch/architecture.svg | 72 +++++++++++++++++++ pitch/counts.json | 1 + pitch/deck.html | 97 +++++++++++++++++++++++++ scripts/build-deck.mjs | 140 ++++++++++++++++++++++++++++++++++++ 5 files changed, 311 insertions(+), 1 deletion(-) 6a279e052dddda69f0e6ee7252a9fe1b8ace08d9 2026-11-01T13:02:21+05:30 Swiftbot Architecture, protocol and security docs SECURITY.md | 50 ++++++++++++++++++++++++ docs/ARCHITECTURE.md | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ docs/PROTOCOL.md | 98 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 254 insertions(+) a03e62192754d7e7d4987b3677930d9262dfc0d4 2026-11-01T13:00:38+05:30 Swiftbot Resumable testnet deploy and live demo script .gitignore | 2 + scripts/deploy-testnet.mjs | 311 +++++++++++++++++++++++++++++++++++++++++++++ scripts/lib/sub.mjs | 55 ++++++++ 3 files changed, 368 insertions(+) 014d26c4b42c0e17d774c02867e2f60f1bb988fa 2026-11-01T12:57:41+05:30 Swiftbot CI: never cancel a running build on main .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) e37fb9c3d0072a6f65d504f91a16dfaeeec53a37 2026-11-01T12:57:12+05:30 Swiftbot Live demo page and a dependency-free ink! read client README.md | 15 ++- demo/app.js | 232 +++++++++++++++++++++++++++++++++++++++ demo/index.html | 115 +++++++++++++++++++ demo/style.css | 98 +++++++++++++++++ demo/vendor/README.md | 7 ++ demo/vendor/ethers-6.16.0.min.js | 1 + demo/vendor/ethers-LICENSE.md | 21 ++++ src/inkraw.mjs | 180 ++++++++++++++++++++++++++++++ src/protocol.mjs | 17 ++- test/inkraw.test.mjs | 60 ++++++++++ 10 files changed, 740 insertions(+), 6 deletions(-) bf10c71dfdac38ac9c0697210666270e28f87758 2026-11-01T12:51:07+05:30 Swiftbot HTTP seller, buyer client and receipt verifier .github/workflows/ci.yml | 24 +++++ package.json | 2 +- src/buyer.mjs | 96 ++++++++++++++++++++ src/data.mjs | 131 +++++++++++++++++++++++++++ src/evm.mjs | 110 +++++++++++++++++++++++ src/routes.mjs | 36 ++++++++ src/seller.mjs | 230 +++++++++++++++++++++++++++++++++++++++++++++++ src/settle.mjs | 77 ++++++++++++++++ src/store.mjs | 72 +++++++++++++++ src/verify.mjs | 110 +++++++++++++++++++++++ src/xvm.mjs | 52 +++++++++++ test/e2e.test.mjs | 209 ++++++++++++++++++++++++++++++++++++++++++ test/helpers.mjs | 67 ++++++++++++++ 13 files changed, 1215 insertions(+), 1 deletion(-) d9c31f3efc0709dd01e4580736a4eb1a9e2a84a1 2026-11-01T12:43:10+05:30 Swiftbot Wire protocol and registry client, CI fixes .github/workflows/ci.yml | 14 ++- src/protocol.mjs | 203 ++++++++++++++++++++++++++++++++++++++++++++ src/registry.mjs | 217 +++++++++++++++++++++++++++++++++++++++++++++++ test/protocol.test.mjs | 94 ++++++++++++++++++++ test/registry.test.mjs | 55 ++++++++++++ 5 files changed, 580 insertions(+), 3 deletions(-) 011489580231ef791885207565ae6ffc31faa1c0 2026-11-01T08:01:13+05:30 Swiftbot ink! registry on pallet-contracts, CI for both VMs .github/workflows/ci.yml | 103 +++++++ .gitignore | 1 + contracts/evm/test/MeterSettlement.t.sol | 12 + contracts/ink/meter_registry/Cargo.toml | 20 ++ contracts/ink/meter_registry/lib.rs | 480 +++++++++++++++++++++++++++++++ 5 files changed, 616 insertions(+) 7d7e0b2f2cd5fc6e0a1f8cec83f7d8c82ead9248 2026-11-01T07:55:25+05:30 Swiftbot EVM settlement contract with tests, Portaldot V3 network notes .gitignore | 11 + LICENSE | 21 + README.md | 62 + contracts/evm/foundry.toml | 27 + contracts/evm/lib/forge-std/.gitattributes | 1 + contracts/evm/lib/forge-std/.github/CODEOWNERS | 1 + contracts/evm/lib/forge-std/.github/dependabot.yml | 15 + .../evm/lib/forge-std/.github/workflows/ci.yml | 163 + .../evm/lib/forge-std/.github/workflows/sync.yml | 36 + contracts/evm/lib/forge-std/.gitignore | 4 + contracts/evm/lib/forge-std/CONTRIBUTING.md | 193 + contracts/evm/lib/forge-std/LICENSE-APACHE | 203 + contracts/evm/lib/forge-std/LICENSE-MIT | 25 + contracts/evm/lib/forge-std/README.md | 314 + contracts/evm/lib/forge-std/RELEASE_CHECKLIST.md | 12 + contracts/evm/lib/forge-std/foundry.toml | 18 + contracts/evm/lib/forge-std/package.json | 16 + contracts/evm/lib/forge-std/scripts/vm.py | 636 + contracts/evm/lib/forge-std/src/Base.sol | 48 + contracts/evm/lib/forge-std/src/Config.sol | 60 + contracts/evm/lib/forge-std/src/LibVariable.sol | 477 + contracts/evm/lib/forge-std/src/Script.sol | 28 + contracts/evm/lib/forge-std/src/StdAssertions.sol | 1300 ++ contracts/evm/lib/forge-std/src/StdChains.sol | 316 + contracts/evm/lib/forge-std/src/StdCheats.sol | 922 ++ contracts/evm/lib/forge-std/src/StdConfig.sol | 632 + contracts/evm/lib/forge-std/src/StdConstants.sol | 30 + contracts/evm/lib/forge-std/src/StdError.sol | 33 + contracts/evm/lib/forge-std/src/StdInvariant.sol | 161 + contracts/evm/lib/forge-std/src/StdJson.sol | 327 + contracts/evm/lib/forge-std/src/StdMath.sol | 68 + contracts/evm/lib/forge-std/src/StdStorage.sol | 521 + contracts/evm/lib/forge-std/src/StdStyle.sol | 410 + contracts/evm/lib/forge-std/src/StdToml.sol | 323 + contracts/evm/lib/forge-std/src/StdUtils.sol | 247 + contracts/evm/lib/forge-std/src/Test.sol | 32 + contracts/evm/lib/forge-std/src/Vm.sol | 2637 ++++ contracts/evm/lib/forge-std/src/console.sol | 1599 +++ contracts/evm/lib/forge-std/src/console2.sol | 4 + .../evm/lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../evm/lib/forge-std/src/interfaces/IERC165.sol | 12 + .../evm/lib/forge-std/src/interfaces/IERC20.sol | 43 + .../evm/lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../evm/lib/forge-std/src/interfaces/IERC6909.sol | 72 + .../evm/lib/forge-std/src/interfaces/IERC721.sol | 164 + .../evm/lib/forge-std/src/interfaces/IERC7540.sol | 145 + .../evm/lib/forge-std/src/interfaces/IERC7575.sol | 241 + .../lib/forge-std/src/interfaces/IMulticall3.sol | 68 + contracts/evm/lib/forge-std/src/safeconsole.sol | 13248 +++++++++++++++++++ contracts/evm/lib/forge-std/test/CommonBase.t.sol | 44 + contracts/evm/lib/forge-std/test/Config.t.sol | 381 + contracts/evm/lib/forge-std/test/LibVariable.t.sol | 452 + .../evm/lib/forge-std/test/StdAssertions.t.sol | 141 + contracts/evm/lib/forge-std/test/StdChains.t.sol | 227 + contracts/evm/lib/forge-std/test/StdCheats.t.sol | 695 + .../evm/lib/forge-std/test/StdConstants.t.sol | 38 + contracts/evm/lib/forge-std/test/StdError.t.sol | 119 + contracts/evm/lib/forge-std/test/StdJson.t.sol | 49 + contracts/evm/lib/forge-std/test/StdMath.t.sol | 202 + contracts/evm/lib/forge-std/test/StdStorage.t.sol | 532 + contracts/evm/lib/forge-std/test/StdStyle.t.sol | 110 + contracts/evm/lib/forge-std/test/StdToml.t.sol | 49 + contracts/evm/lib/forge-std/test/StdUtils.t.sol | 342 + contracts/evm/lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 8 + .../test/compilation/CompilationScriptBase.sol | 8 + .../forge-std/test/compilation/CompilationTest.sol | 8 + .../test/compilation/CompilationTestBase.sol | 8 + .../lib/forge-std/test/fixtures/broadcast.log.json | 187 + .../evm/lib/forge-std/test/fixtures/config.toml | 81 + .../evm/lib/forge-std/test/fixtures/test.json | 8 + .../evm/lib/forge-std/test/fixtures/test.toml | 6 + contracts/evm/remappings.txt | 1 + contracts/evm/src/MeterSettlement.sol | 222 + contracts/evm/test/MeterSettlement.t.sol | 392 + contracts/evm/test/Mocks.sol | 123 + docs/PORTALDOT_V3_NOTES.md | 72 + package-lock.json | 993 ++ package.json | 17 + scripts/keygen.mjs | 38 + scripts/lib/addr.mjs | 23 + scripts/probe.mjs | 66 + src/config.mjs | 48 + 83 files changed, 31929 insertions(+)