Skip to main content
This guide walks you through the core workflows of NullGraph: submitting a Null Knowledge Asset (NKA) and creating a bounty.

Prerequisites

Before starting, ensure you have:
  • Completed the Setup guide
  • Connected Phantom wallet set to Devnet
  • NullGraph frontend running at http://localhost:5173
  • Some devnet SOL in your wallet for transaction fees
You can get devnet SOL from the Solana Faucet or by running:
solana airdrop 1 --url devnet

Submit Your First NKA

Null Knowledge Assets (NKAs) are on-chain records of negative scientific results. Each NKA is stored as a permanent PDA on Solana.
2
Click “Submit NKA” in the navigation bar or visit /submit.
3
Step 1: Hypothesis
4
Enter your research hypothesis (max 128 characters):
5
Increasing temperature to 42°C will enhance bacterial growth rate by 20%
6
Click Next.
7
Step 2: Methodology
8
Describe your methodology (max 128 characters):
9
Incubated E. coli cultures at 42°C for 24h, measured OD600 every 2h
10
Enter expected outcome:
11
OD600 > 1.2 at 24h timepoint
12
Enter actual outcome:
13
OD600 = 0.3 at 24h, culture showed minimal growth
14
Click Next.
15
Step 3: Data
16
Enter statistical metadata:
17
  • P-value: 0.8700 (enter as decimal, stored as fixed-point)
  • Sample size: 50
  • 18
    Optional: Upload a data file. The frontend will compute a SHA-256 hash and store it on-chain as a tamper-proof fingerprint. The file itself remains off-chain.
    19
    Click Next.
    20
    Step 4: Review and Submit
    21
    Review all fields:
    22
    Hypothesis: Increasing temperature to 42°C will enhance bacterial growth...
    Methodology: Incubated E. coli cultures at 42°C for 24h...
    Expected Outcome: OD600 > 1.2 at 24h timepoint
    Actual Outcome: OD600 = 0.3 at 24h, culture showed minimal growth
    P-value: 0.8700
    Sample Size: 50
    Data Hash: 5a7d...3f2e (if file uploaded)
    
    23
    Click Submit to Chain.
    24
    Approve Transaction
    25
    Phantom will prompt you to approve the transaction:
    26
  • Network fee: ~0.001 SOL
  • Account rent: ~0.002 SOL (refundable if account is closed)
  • 27
    Click Approve in Phantom.
    28
    Confirmation
    29
    Upon success, you’ll see a toast notification:
    30
    NKA-0001 submitted!
    
    31
    Your NKA is now permanent and browsable on the Dashboard.

    How It Works

    When you submit an NKA, the frontend:
    1. Fetches the current nka_counter from ProtocolState
    2. Derives the NullResult PDA using seeds: ["null_result", researcher_pubkey, specimen_number]
    3. Calls submit_null_result instruction with all metadata
    4. Increments the global counter
    5. Emits NullResultSubmitted event
    const [protocolStatePDA] = findProtocolStatePDA();
    const state = await program.account.protocolState.fetch(protocolStatePDA);
    const nextSpecimen = state.nkaCounter.toNumber() + 1;
    const [nullResultPDA] = findNullResultPDA(publicKey, nextSpecimen);
    
    const tx = await program.methods
      .submitNullResult(
        hypothesis,
        methodology,
        expectedOutcome,
        actualOutcome,
        pValue,
        sampleSize,
        dataHash
      )
      .accountsPartial({
        researcher: publicKey,
        protocolState: protocolStatePDA,
        nullResult: nullResultPDA,
        systemProgram: SystemProgram.programId,
      })
      .rpc();
    

    Create a Bounty

    Bounties allow researchers and BioDAOs to pay for specific null results. When you create a bounty, BIO tokens are escrowed into a vault PDA until the bounty is fulfilled or closed.
    1
    Get BIO Tokens
    2
    Bounties are denominated in BIO tokens. The BIO mint address on devnet is:
    3
    GkjGV1ZF5BsMs6oAvk8jZiuXM8KwuygFCHLBpqR5Q14j
    
    4
    For testing on devnet, you’ll need to mint test BIO tokens to your wallet. Contact the protocol administrator or use a test token faucet.
    6
    Click “Market” in the navigation bar or visit /market.
    7
    Open Create Bounty Modal
    8
    Click “Create Bounty” button.
    9
    Fill Bounty Details
    10
    Enter bounty information:
    11
    Description (max 256 characters):
    12
    Seeking null results on the effect of caffeine on C. elegans lifespan. Need p-value > 0.6, sample size > 100.
    
    13
    Reward Amount (in BIO tokens):
    14
    500
    
    15
    This will escrow 500 BIO tokens (500,000,000 base units with 6 decimals).
    16
    Deadline (Unix timestamp or date picker):
    17
    Select a date 30 days from now
    
    18
    Click Create Bounty.
    19
    Approve Transaction
    20
    Phantom will prompt you to approve the transaction. This transaction:
    21
  • Creates the NullBounty PDA
  • Creates the vault token account PDA
  • Transfers 500 BIO from your ATA to the vault
  • Increments the bounty_counter
  • 22
    Accounts involved:
    23
  • Creator: Your wallet (signer)
  • Bounty PDA: Derived from ["null_bounty", creator_pubkey, bounty_number]
  • Vault PDA: Derived from ["bounty_vault", bounty_pda]
  • Creator BIO ATA: Your associated token account for BIO
  • BIO Mint: GkjGV1ZF5BsMs6oAvk8jZiuXM8KwuygFCHLBpqR5Q14j
  • 24
    Click Approve in Phantom.
    25
    Confirmation
    26
    You’ll see a toast notification:
    27
    Bounty NB-0001 created!
    
    28
    Your bounty is now live and visible on the Market page with status Open.

    How It Works

    const [protocolStatePDA] = findProtocolStatePDA();
    const state = await program.account.protocolState.fetch(protocolStatePDA);
    const nextBounty = state.bountyCounter.toNumber() + 1;
    const [bountyPDA] = findBountyPDA(publicKey, nextBounty);
    const [vaultPDA] = findVaultPDA(bountyPDA);
    const creatorBioAta = await getAssociatedTokenAddress(BIO_MINT, publicKey);
    
    const tx = await program.methods
      .createBounty(
        description,
        new BN(rewardAmount),
        new BN(deadline)
      )
      .accountsPartial({
        creator: publicKey,
        protocolState: protocolStatePDA,
        bounty: bountyPDA,
        vault: vaultPDA,
        creatorUsdcAta: creatorBioAta,
        usdcMint: BIO_MINT,
        tokenProgram: TOKEN_PROGRAM_ID,
        associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,
        systemProgram: SystemProgram.programId,
      })
      .rpc();
    

    Submit to a Bounty

    If you have an NKA that matches a bounty’s requirements, you can submit it for review.
    1
    Find a Matching Bounty
    2
    Browse the Market page for open bounties. Click a bounty card to view details.
    3
    Submit Your NKA
    4
    On the bounty detail page (/market/:bountyId), click “Submit NKA”.
    5
    Select your NKA from the modal (only NKAs you own are shown).
    6
    Click Submit.
    7
    Approval
    8
    Phantom prompts for approval. This creates a BountySubmission PDA linking your NKA to the bounty and transitions the bounty status to Matched.
    9
    Await Review
    10
    The bounty creator will review your submission and either:
    11
  • Approve: You receive reward_amount * 0.975 BIO (2.5% protocol fee)
  • Close: Creator closes the bounty and reclaims escrowed BIO
  • View Your NKAs

    All submitted NKAs are browsable on the Dashboard. Click an NKA card to view full details including:
    • Specimen number (e.g., NKA-0042)
    • Researcher public key
    • Full hypothesis, methodology, outcomes
    • P-value and sample size
    • Data hash (if provided)
    • Timestamp and status
    • Solana Explorer link

    Protocol Fee Structure

    When a bounty is fulfilled:
    • Researcher payout: 97.5% of reward amount
    • Protocol fee: 2.5% (250 basis points)
    • Fee recipient: Treasury wallet (set during protocol initialization)
    Example for 500 BIO bounty:
    • Researcher receives: 487.5 BIO
    • Treasury receives: 12.5 BIO

    Account Structure

    NullGraph uses four main account types, all stored as PDAs:
    AccountSeedsDescription
    ProtocolState["protocol_state"]Singleton with counters, fee rate, treasury
    NullResult["null_result", researcher, specimen_number]One per NKA
    NullBounty["null_bounty", creator, bounty_number]One per bounty
    BountySubmission["bounty_submission", bounty, null_result]Links NKA to bounty
    Vault["bounty_vault", bounty_pda]Token account holding escrowed BIO

    Common Workflows

    Researcher Journey

    1. Connect wallet (devnet)
    2. Submit NKA with negative result data
    3. Browse Market for matching bounties
    4. Submit NKA to bounty
    5. Receive BIO payout upon approval

    BioDAO Journey

    1. Connect wallet (devnet)
    2. Acquire BIO tokens
    3. Create bounty describing needed null result
    4. BIO tokens escrowed to vault
    5. Review submissions from researchers
    6. Approve matching submission (triggers payout)
    7. Or close bounty (reclaim escrowed BIO)

    Next Steps

    NullGraph is currently deployed to Solana Devnet. All transactions use test tokens and devnet SOL. No real value is at risk.

    Build docs developers (and LLMs) love