Skip to content

[Advanced] External integration: independent audit-trail anchor for Fundable payouts (real PR to fundable-protocol) #75

Closed

Description

@Eras256

Difficulty: Advanced (senior · 7/10). ~14–20h. TypeScript, reading a real Soroban/Stellar-native codebase.

Context

Fundable (GitHub org: fundable-protocol) is a real, Stellar-native onchain financial operations platform for global teams — automated payouts, payment streaming, crypto-to-fiat offramping — SCF-funded, with real Soroban contracts (Fundable-Soroban-Contracts, Rust) and an active TypeScript SDK (fundable-sdk). Like most disbursement platforms, their payouts aren't independently anchored outside their own system.

This issue is an external contribution to Fundable's own repos, not another example in this repo — it only counts if a real PR lands against fundable-protocol.

Goal

Independently anchor a hash-only summary of a completed Fundable payout or stream settlement via Nirium's Audit Trail node, and open a real PR against the relevant fundable-protocol repository.

Scope / Deliverables

  1. Read fundable-sdk and Fundable-Soroban-Contracts to find where a payout or stream settlement actually completes and what data is available (amount, recipient, asset, tx hash).
  2. Build an adapter that, on settlement, builds an aggregate record and calls Nirium's anchorAuditRecord().
  3. Open a real PR against the actual fundable-protocol repo, following their conventions.
  4. A verification script that independently re-derives the hash from the anchored document — never trust an embedded claim.
  5. README/PR section explaining the value: an independently-verifiable payout receipt a payer's own finance team or an external auditor can check without trusting Fundable's dashboard.

Acceptance criteria

  • A real PR opened against a fundable-protocol GitHub repository — link it here. Merge isn't required, but the PR must target a real, correctly identified integration point.
  • End-to-end demo on testnet: a real or realistically-simulated settlement anchored, CID + passing independent verification included.
  • Never touches Fundable's own contracts' custody or settlement logic — anchor-only, after the fact.

Pointers

Out of scope

  • Changing Fundable's Soroban contracts or payment/streaming logic.
  • Mainnet.
  • Contributing to Nirium's own repo instead of Fundable's.

References

Reward

Eligibility is subject to GrantFox review under this campaign. Rewards are decided by GrantFox based on quality and available budget and are not guaranteed.

Activity

  1. Santia2004 commented on Aug 26, 2026

    @Santia2004
    Contributor

    Hi @Eras256, I would like to take on this issue. Here is my implementation plan for the external Fundable integration:

    Implementation Plan

    1. Codebase Exploration & Hook Point Identification (fundable-protocol):

      • Trace payout and payment stream completion flows across Fundable-Soroban-Contracts events and the fundable-sdk execution handlers.
      • Extract the authoritative settlement metadata schema (amount, recipient, asset, tx_hash, contract_id, timestamp).
    2. Audit Adapter & Anchoring via Nirium SDK:

      • Build a lightweight adapter that intercepts completed payouts / stream settlements.
      • Construct the un-reordered raw JSON payout receipt payload.
      • Compute sha256(JSON.stringify(record)) and create a domain-separated attestation signature (nirium-audit-v1:<sha256>) using the payer/agent Stellar ed25519 key.
      • Anchor the record to IPFS via Nirium's Agent.anchorAuditRecord() on the Nirium node.
    3. Standalone Verifier Script:

      • Implement an independent auditor verification CLI / script that fetches the raw anchored receipt from IPFS via CID, locally recomputes the SHA-256 hash, and verifies the agent signature without relying on Fundable's dashboard or third-party claims.
    4. Upstream PR & Documentation:

      • Submit the PR directly to the relevant fundable-protocol repository adhering to their styling, commit standards, and tests.
      • Add documentation explaining how finance teams and external auditors can verify disbursement receipts independently.

    Please assign this issue to me so I can get started. Thanks!

  2. DonCervantes commented on Aug 27, 2026

    @DonCervantes

    Hi, I can help you. I have three years of experience in full-stack AI engineering and have worked on multiple projects on the Stellar network.

  3. Eras256 commented on Aug 27, 2026

    @Eras256
    CollaboratorAuthor

    @Santia2004 assigned — solid plan, correctly grounded in the real Fundable protocol structure and Nirium's actual attestation scheme. Go ahead.

  4. Santia2004 commented on Aug 27, 2026

    @Santia2004
    Contributor

    Opened upstream PR to Fundable SDK: Fundable-Protocol/fundable-sdk#8

    Implementation summary:

    • Defined authoritative settlement schema FundablePayoutAuditRecord.
    • Implemented canonical deterministic hashing via computeCanonicalAuditHash().
    • Implemented domain-separated attestation signer with nirium-audit-v1:<sha256> using Stellar Ed25519 keypairs.
    • Built external anchoring function anchorFundablePayout() (IPFS CID generation without modifying core Soroban contracts or custody logic).
    • Added standalone verifier verifyAnchoredPayoutReceipt() and runnable example script (examples/verify-anchored-payout.ts) for independent validation by finance teams/external auditors.
    • All unit tests passing in Vitest (pnpm test) and full pipeline verified with pnpm verify.
  5. Eras256 commented on Aug 30, 2026

    @Eras256
    CollaboratorAuthor

    Closing as delivered. @Santia2004 opened a real PR against Fundable-Protocol/fundable-sdk#8: a proper settlement schema, deterministic canonical hashing, the correct nirium-audit-v1: domain-separated signing scheme (matches ours exactly, not guessed), unit tests, and a standalone verification example. Merge on their side isn't required by this issue's own criteria, and this is a real, correctly-targeted integration, not a stub. Nice work. Closing now that the campaign has ended, but this one counts as done.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions