I build infrastructure for the agent economy: how an AI agent pays, how it gets checked before anyone trusts it, and how it proves what it did. Each piece runs on the network that fits it.
| What it does for an agent | Product | Network | Status |
|---|---|---|---|
| Pays, gets paid, keeps proof | Nirium: x402 pay-gates for any API, an audit trail that pins a hash (and optionally who signed it) to IPFS, and a treasury agent that moves idle funds into tokenized CETES | Stellar | Partly on mainnet: x402 payments, the audit trail, and the treasury on a third-party DeFindex vault · Nirium's own vault contract stays on testnet until it has an external audit |
| Finds a paid service and settles it | Periplo: x402 facilitator with a Bazaar discovery catalog and an upto scheme on Soroban |
Stellar | Testnet, with an outside seller in the catalog |
| Checks who it's paying | Vouch402: pay-per-call risk data on any address, plus EAS attestations that a paid service was delivered | Base | Mainnet, full flow settled |
| Proves who's behind it | Kumply: KYC/KYB/KYA tiers as on-chain attestations, no personal data on-chain, and an L1 where validators must hold one | Avalanche | Fuji testnet (full) · mainnet read-only beta · L1 registered on Fuji, not active yet |
| Moves company money under signed terms | Contextio: treasury and payroll agent for LatAm companies, every action tied to a signed legal document (LCP) | Stellar | Testnet (full agent) · mainnet invite-only, read-only and self-custody, contracts pending audit |
| Proves what it did | Prova: one attest() call, one Ed25519-signed receipt on-chain through an Anchor program |
Solana | Devnet |
| Side build | Votalo: group voting with a passkey, no wallet; every vote is an EIP-712 signature | Monad | Testnet |
Built with my cofounder Monserrat Mendoza, Dev Lead. She has six merged PRs in Nirium and has shipped fixes in Kumply and Vouch402. More on her profile.
A product only moves to a new network when there's real demand for it. That's why Contextio's mainnet does less than its testnet, and Prova is still on devnet.
Every item links to something you can check. If it's still open or unmerged, I say so.
- Periplo: I found and fixed a crash in x402's official conformance suite. Merged upstream the same week: x402-foundation/x402#3228.
- Nirium: a shared facilitator was down on mainnet for 32 days. After the fix I checked it with a real $0.05 payment, not just a 200 response: OpenZeppelin/relayer-plugin-x402-facilitator#47.
- Nirium: Trustless Work, a team we had never worked with, merged 4 of our PRs in one sitting (three mine, one my cofounder's) as research for their agentic payments work: Trustless-Work/agentic-escrow-research#1-#4.
- Vouch402: I found a security bug in the library Vouch402 uses for every attestation. The maintainer fixed it: eas-sdk#132.
- Kumply: before turning on our Avalanche L1, I checked our validator manager against ava-labs' real source code and found a bug in our own code. A missing 4-byte length prefix meant the conversion ID would never match what the P-Chain signs. Our 27 tests missed it because the mock had the same mistake. Fixed and redeployed (writeup). The contracts run on C-Chain mainnet as a read-only beta, with verified source: AttestationStore.
- Prova: I removed a dependency problem from Anchor, the Solana framework Prova is built on. Merged by the maintainer: anchor#4960.
- Periplo: when I was wrong, I said so and closed my own issue. OpenZeppelin/stellar-contracts#839 was a bug in how I built the auth entries, not in the library.
- Nirium: two Stellar Community Fund Instawards, delivered against real milestones. You can only get one as an active Stellar Ambassador; that's the program's rule, not my claim.
- Every contract I ship is non-custodial: the user's own wallet signs, or a role that can't move funds by design. I never hold a key that can.
Full receipts: every PR, issue and bounty, by project
Most of my public work is one of two things: a protocol I maintain, or a bug I found in something I depend on, followed by a fix. When someone else wrote the fix, I name them. The report was mine, the patch wasn't.
Periplo, Nirium and Contextio share a lot of upstream code, sometimes the exact same bug. So each item is listed under the project it came from.
Checked against the GitHub API on 2026-10-11. The search links at the bottom are always more current.
Kumply (Avalanche): three bugs I reported in a community skills repo,
Ayomisco/avaxskills, found while
building on it:
#2 (a skill lists CLI
commands that don't exist in ava-labs/avalanche-cli),
#3 (wrong genesis key
name for TxAllowList) and
#4 (an outdated wagmi
version and a deprecated hook). All three are open, and so are my fixes:
#5,
#6,
#7.
I'm an official Team1 LatAm collaborator for the Avalanche ecosystem.
I also built
AgentHub Protocol
for Avalanche's Hack2Build: Payments x402 hackathon: x402 micropayments,
on-chain agent reputation, and integrations with Trader Joe, Benqi and
Aave V3. The SDK is on npm and the contracts are on Fuji. It hasn't been
touched since January 2026.
Vouch402 (Base): base/skills#152,
an open PR to list Vouch402 in Base's community skills catalog. While
checking the tools Vouch402 depends on, I also found
eas-sdk#132
(fixed) and
foundry-rs/foundry#16209
(cast wallet new <name> failed with a plain account name; fixed by
@riba2534 in #16219,
closed 2026-09-09). I'm a Based Developer Ambassador in Base's
Discord.
Prova (Solana): otter-sec/anchor#4960
bumps heck from 0.3 to 0.5, which removes an edition2024 dependency
that could break Anchor builds. Merged 2026-09-30 by @jamie-osec. He
merged three more of mine in October:
#5130 (NonZero*
integers in IDL generation, 2026-10-08),
#5131 (error on type
aliases with the same name but different definitions, 2026-10-07) and
#5132 (Space for
NonZero* integers, 2026-10-07).
The full story, with transaction hashes and steps to reproduce, is in Periplo's README.
Merged
| PR | Repo | Merged |
|---|---|---|
#3228: scope EVM/SVM client signer derivation to the selected --families, fixing a crash in the official e2e conformance suite |
x402-foundation/x402 |
2026-08-31. My PR, merged by @phdargen. Closes #3187, which I filed. My earlier attempt, #3219, was closed in favor of this one. |
#103: point ECOSYSTEM_CARDS copyValue at the raw file, not GitHub's HTML page |
stellar/stellar-dev-skill |
2026-08-28, by @kaankacar |
#3306: a dedicated extension_responses/extensionResponses field instead of leaking EXTENSION-RESPONSES data through extensions |
x402-foundation/x402 |
2026-08-31, by @phdargen. Closes #3270, which I filed. Not my code. |
#3336: include feeBumpSigner in the facilitator safety checks |
x402-foundation/x402 |
2026-09-03. My PR, merged by @phdargen. Closes #3332, which I filed. |
Open fix PRs
| PR | Repo | Fixes |
|---|---|---|
| #3215: one wildcard pattern per namespace, not one per registration | x402-foundation/x402 |
#3172 |
| #3138: use the raw resource URL for opaque-origin schemes | x402-foundation/x402 |
#3121 |
#3098: upto scheme spec for Stellar |
x402-foundation/x402 |
#3097 |
#3338: enforce the settlement override limit against PaymentRequirements.amount |
x402-foundation/x402 |
#3334 (closed by the maintainer 2026-09-08) |
#3339: document that areFeesSponsored: false isn't supported |
x402-foundation/x402 |
#3333 |
Tally#1: declare paymentFlows/defaultAssetTransferMethod in an upto server so it works with @x402/core |
Madhav-Gupta-28/Tally |
- |
Bugs I reported that got fixed
- x402#3169:
isValidRouteTemplatedecodedrouteTemplateonly once, so double percent-encoding got past its traversal and scheme-injection checks. Fixed by @ygd58 in #3213, merged 2026-09-09. - x402#3270:
HTTPFacilitatorClient.settle()/verify()decoded theEXTENSION-RESPONSESheader and threw it away. I worked around it in Periplo the same day. The real fix was the maintainer's #3306 (Python, @phdargen), which added a new field instead of reusingextensions, so my workaround's shape didn't make it in. My/settlestill uses the old shape until I move it to the new field, available since@x402/core2.28.0. - eas-sdk#132:
getUIDsFromAttestReceipttrusted the log'stopic0without checking who emitted it. Fixed in eas-sdk 2.10.0, closed 2026-08-27. - OpenZeppelin/stellar-contracts#839: hit
UnreachableCodeReachedcombiningSigner::Delegatedwith aCallContractrule. My mistake: I built the auth entries wrong. Closed 2026-09-02. - js-stellar-sdk#1655:
needsNonInvokerSigningBy()/signAuthEntries()only looked at the top level of a CAP-71 delegate credential. I sent a fix, #1672, which was closed in favor of the maintainer's #1747 (merged 2026-09-28). - OpenZeppelin/stellar-contracts#863: with
Signer::Delegated, simulation never showed that the delegate had to sign. Closed by @brozorec 2026-09-02.
Still open, waiting on the maintainers: x402-foundation/x402
#3121,
#3148,
#3333,
#3341.
In repos Nirium doesn't own
| Item | Repo | Status |
|---|---|---|
| #96: add Nirium to the community skills | stellar/stellar-dev-skill |
Merged 2026-08-15 |
| #97: production patterns for x402 + MPP | stellar/stellar-dev-skill |
Merged 2026-09-05 by @kaankacar, after ~16 review rounds |
| #47: the mainnet sponsor account went silent, then a stale RPC took it down | OpenZeppelin/relayer-plugin-x402-facilitator |
Fixed by OZ 2026-09-11; I confirmed it with a real mainnet payment |
| #58: accept an external SEP-43 signer instead of a raw secret key | stellar/stellar-mpp-sdk |
Open |
#30: Nirium x402 adapter demo (apps/nirium) |
pollar-xyz/pollar-apps |
Merged 2026-08-31 by @aleregex |
| #1-#4: milestone payouts with limited authority, treasury rebalancing, direct x402 payment, and tool-schema evidence for agents | Trustless-Work/agentic-escrow-research |
All four merged 2026-09-21 within 27 minutes. Three are mine, #3 is Monserrat's |
| #9: research note on fail-closed payment and delivery checks, with two real production bugs found and fixed | Trustless-Work/agentic-escrow-research |
Open since 2026-10-05 |
| #69: fix two mainnet SAC constants that weren't valid StrKeys | stellar/stellar-mpp-sdk |
Merged 2026-09-09 by @jeesunikim. Closes #68 |
x402#3171: paymentRequirementsMatchAccepted threw when payload.accepted was missing |
x402-foundation/x402 |
Fixed by @JasonColapietro in #3180, merged 2026-08-17 |
| #840: fee abstraction's Lazy-mode expiration check validated the wrong value | OpenZeppelin/stellar-contracts |
Closed 2026-09-07. My fix #844 wasn't merged; the docs follow-up #893 is open |
#6: Multi-Release trustline.address needs the classic issuer, not the SAC id |
Trustless-Work/trustlesswork-sdk-react |
Closed 2026-09-28 |
| #2: the Nirium x402 tab shows a classic Stellar payment labeled as x402 | pollar-xyz/demo |
Open |
#3692: @x402/stellar pulls in an axios version with 7 high advisories |
x402-foundation/x402 |
Open |
Not a bounty, a real collaboration: I opened
issue #96, and
@CodeDeityX designed and tested the fix
and built a public harness to reproduce it. It shipped as
#98: nirium@0.16.0
on npm has an optional policy hook on initX402().
GrantFox bounties (bounties Nirium posted in its own repo,
nirium-protocol/nirium). As of 2026-09-05: 44 issues across three
campaigns, 42 real asks. 20 delivered in nirium, 2 delivered in other
projects and waiting on their review, 4 closed and recreated, 16 closed
without delivery.
Bounty details: every delivery, who opened it, and the five from my cofounder
- 2 delivered in other projects: #75 → Fundable-Protocol/fundable-sdk#8 and #76 → wejoona/api#23, both by @Santia2004, not me.
- 4 recreated in a later campaign with the same ask: #29→#43, #30→#44, #31→#45, #32→#46.
Some of the best merged deliveries:
| Bounty issue | PR | Author |
|---|---|---|
| #39: harden the Python WebSocket signals client | #47, merged | @Simultech369 (external) |
| #51: GitHub Action to verify a Nirium audit CID in CI | #80, merged | @Simultech369 (external) |
| #65: forensic export bridge for the audit trail | #69, merged | @Santia2004 (external) |
Five more are my cofounder's first shipped code for Nirium, through the same GrantFox process: #50 via #58, #37 via #59, #45 via #61, #38 via #60 and #44 via #62, all by Monserrat Mendoza.
Not a bounty: #81
was a fail-open bug in the Next.js x402 example, reported by someone
outside the team and fixed in #84.
And nirium#108,
merged 2026-10-09, stops pay from taking a secret key as a CLI
argument, so it no longer ends up in shell history or the process list.
Contextio moved to its own org: Eras256/Contextio now redirects to
contextio/Contextio. It runs
its own bounties: five open issues, none delivered yet, two with outside
PRs waiting for review. Upstream, three merged PRs added and updated its
listing on stellar/stellar-dev-skill
(#98,
#101,
#102).
No other upstream work for Contextio yet.
Found while building the three Stellar products, not tied to one.
- js-stellar-sdk#1683:
authorizeEntry's bare-signature fallback ignoredforAddress. Closed by @Ryang-21 2026-09-24. - js-stellar-sdk#1681:
signAuthEntriescouldn't handle a non-master-key signer on a plain account. Fixed by @Ryang-21; I closed it 2026-09-26. - js-stellar-sdk#1700:
needsNonInvokerSigningBy()/signAuthEntries()missed custom accounts. Closed by @Ryang-21 2026-09-25. - py-stellar-base#1215: signing CAP-71 delegates one after another in
authorize_entry()silently broke an earlier signature. Closed by @overcat 2026-09-08. - OpenZeppelin/stellar-contracts#865: Protocol 28:
get_validated_context_by_idwon't compile on soroban-sdk 28.x. Closed 2026-09-26. - smart-account-kit#7: the
@stellar/stellar-sdkpeer range had no upper limit, so v17 could get installed and break it. Closed by @kalepail 2026-09-08. - js-stellar-sdk#1777: asked for an lts-16 patch with a fixed axios. Open.
- stellar-docs#2811: a page on autonomous agents under contract accounts. Open PR.
- Creit-Tech/Stellar-Wallets-Kit#105:
signMessage()'s docs say SEP-43 hex, but Freighter returns base64. Open. - wevm/viem#5082:
shouldRetrydidn't retry QuickNode's-32007rate-limit error. My fix #5083 was merged by @jxom 2026-09-16. - base/account-sdk#405:
getPaymentStatus()gets the receipt but never returnstransactionHash. My fix #406 is open.
Weekend builds, none with a public repo. Two wins were announced by the event itself. The third only has my own tweet, so take it as that.
- ActivaChain: won ETH Uruguay 2025, with Monserrat. Announced by the event.
- CreatorChain: 1st and 3rd place at ETH Mexico Monterrey 2025. Announced. Solo build.
- BioShield Insurance: won the FDA Track at DeSci Builders Hackathon 2025, with Monserrat. Deployed on Solana, Base and Optimism. Source: my own tweet.
EVM: Ethereum, Base, Avalanche, Monad
Protocols: x402, MPP, SEP-41/SAC, SEP-43, SEP-53, CAP-71 delegated auth, MCP, EAS, EIP-712, WebAuthn passkeys
All my PRs · all my issues · Nirium's bounty board · Contextio's open issues
Contact: open an issue on any repo above, or
nirium.xyz · periplo.xyz ·
vouch402.xyz · kumply.xyz ·
contextio.xyz · theprova.xyz ·
votalo.xyz · X:
@vaiossx · Discord: vaiossx



