Sol.College

Full lesson

Picassol-Hackathon

Picassol is a collaborative digital canvas on the Solana blockchain, currently in the building stage for the Solana Ecosystem, allowing global users to creatively interact through a 100x100 pixel canvas.

What it does

From the project README:

Welcome to Picassol, a groundbreaking project leveraging the Solana blockchain to create a collaborative digital canvas. This initiative enables participants from across the globe to add their touch to a 100x100 pixel canvas by executing transactions on the Solana network. Each pixel change represents an individual's contribution, piecing together a mosaic of community and innovation.
Original
guneysol/Picassol-Hackathon
SuperStack fork
Blockchains/Picassol-Hackathon @ 40b6e48
Stars
2
Last push (original)
2024-10-19
Languages
TypeScript, CSS, Rust, JavaScript
Detected stack
AnchorNext.jsweb3.js
Categories
Other
Licence
MIT
Homepage
https://www.picassol.art

Architecture

21 source files. By extension: .tsx ×10, .ts ×7, .js ×3, .rs ×1.

Top-level directorySource files
frontend17
Picassol3
utils-decode1

On-chain programs: Picassol/programs/picassol

❌ Does not build as-is, checked 2026-11-02 Tested on 2026-11-02: full log results.json

Build it yourself: step-by-step guide

Every command below was run on 2026-11-02 by tests/run_fork.py against the pinned commit, and the results come from that run. The full output is in the committed log.

1. Prerequisites (versions we tested with)

cargo install --git https://github.com/coral-xyz/anchor avm --locked
avm install 0.32.1 && avm use 0.32.1
sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"

2. Clone at the tested commit

git clone https://github.com/Blockchains/Picassol-Hackathon.git && cd Picassol-Hackathon
git checkout 40b6e480b3babeae8689452cfede52e946f6c617

3. Configure

No environment file is needed.

4. Install dependencies

DirectoryCommandResultTime
frontendnpm install --no-audit --no-fund --legacy-peer-deps✅ pass6s
utils-decodenpm install --no-audit --no-fund --legacy-peer-deps✅ pass0s
Picassolnpx -y yarn@1 install --ignore-engines --network-timeout 600000✅ pass3s
Picassolnpx -y yarn@1 install --ignore-engines --network-timeout 600000✅ pass1s

5. Build

DirectoryCommandResultTime
Picassolanchor@0.32.1 build❌ exit 167s
frontendnpm run build✅ pass14s
Output tail: anchor@0.32.1 build
   Compiling picassol v0.1.0 (/tmp/scbuild/picassol-hackathon/Picassol/programs/picassol)
    Finished release [optimized] target(s) in 1m 06s
Error: `idl-build` feature is missing. To solve, add
[features]
idl-build = ["anchor-lang/idl-build"]
in `"/tmp/scbuild/picassol-hackathon/Picassol/programs/picassol/Cargo.toml"`.

7. Deploy to a local validator

solana-test-validator --reset   # separate terminal
solana config set -ul && solana airdrop 100
anchor deploy --provider.cluster localnet

Deploy to devnet (free)

solana config set --url devnet
solana airdrop 2   # or https://faucet.solana.com
anchor deploy --provider.cluster devnet   # native: solana program deploy target/deploy/<name>.so
# point the frontend RPC env var at https://api.devnet.solana.com

Extend it

  1. Add an integration test that runs the main flow end to end and asserts every account state change.
  2. Add a negative test: call each instruction with the wrong signer or account and check that it fails.
  3. Make the frontend read the cluster from an env var, deploy it to GitHub Pages and point it at your devnet program.
  4. Wire the build into CI by copying this site's verify-forks workflow.

Key code, explained

Excerpts chosen automatically where the code uses the most Solana concepts, pinned to the fork's commit.

guneysol/Picassol-Hackathon · Picassol/programs/picassol/src/lib.rs L97–120 @ 40b6e48 · MIT · original
         Ok(())    }} #[derive(Accounts)]#[instruction(pos_x: u8, pos_y: u8)]pub struct CreatePixel<'info> {    #[account(        init,        payer = user,        space = Pixel::LEN,        seeds = [b"pixel".as_ref(), [pos_x, pos_y].as_ref()],        bump    )]    pub pixel: Account<'info, Pixel>,    #[account(mut)]    pub user: Signer<'info>,    pub system_program: Program<'info, System>,} #[derive(Accounts)]pub struct UpdatePixel<'info> {    #[account(
  1. Line 106 init,: Creates and pays for a new account. Space and payer must be specified.
  2. Line 109 seeds = [b"pixel".as_ref(), [pos_x, pos_y].as_ref()],: Declares the PDA seeds. Anchor re-derives the address and rejects the account if it doesn't match.
  3. Line 110 bump: Uses the bump seed, the extra byte that pushes the derived address off the ed25519 curve.
  4. Line 114 pub user: Signer<'info>,: Requires this account to have signed the transaction.

How to run, build and test

These commands come from the repo's own manifests (package.json scripts, Anchor.toml, Cargo, go.mod, Makefile). Check the README for prerequisites and environment variables.

DirectoryCommandRuns
Picassolnpm run lintprettier */*.js "*/**/*{.js,.ts}" --check
frontendnpm run devnext dev
frontendnpm run startnext start
frontendnpm run buildnext build
Picassolanchor buildcompile programs and generate IDLs
Picassolanchor testlocal validator + test suite
Picassolanchor run testyarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts

What you could build from it