Post a bounty

Hunting and submission rules

Submitting

A submission is a Rust crate (zip or tar.gz, at most 5 MB) and a payout wallet. You sign a message with that wallet to prove you control it; the wallet opens only on your click. Hunters confirm the source is their own work.

Before you submit, run the public verifier locally against the bounty's corpus: if it does not pass on your machine, it will not pass on the judge. See Verifying a verdict.

Encryption in the browser

The archive never leaves your browser in clear. The page draws a random 256-bit key K, encrypts the archive with AES-256-GCM, and seals K to the judge's X25519 public key with a NaCl box from a fresh ephemeral key. The ciphertext is uploaded in chunks; the sealed key, the nonce, the IV and the ephemeral public key travel with it. Only the judge machine holds the X25519 secret.

The sha256 of the plaintext archive is the public source commitment. The judge recomputes it after decryption and refuses the job if it differs. It is printed on the verdict and in the Memo record.

Rules checked before building

  • Rust only: no C, C++, assembly, LLVM IR or bitcode files; no .so, .o, .a, .rlib or other binaries in the archive.
  • No asm! and no global_asm!.
  • No include_bytes! or include_str! of anything over 4 KB, and no computed include paths (concat!, env!).
  • No build.rs and no build = key in any manifest.
  • No proc-macro crate inside the submission. Proc-macro dependencies only from the allow-list below.
  • Cargo.lock present at the crate root; the build runs with --locked.
  • crates.io only: no git dependencies, no alternate registry, every lock entry from the crates.io index.
  • No .cargo/ config and no rust-toolchain file: the judge pins the toolchain.
  • No symbolic or hard links, no absolute paths and no .. in the archive. A single top-level folder is taken as the crate.
Proc-macro allow-list
Solanasolana-*, spl-*, pinocchio*, five8*, const-crypto
Anchoranchor-lang, anchor-attribute-*, anchor-derive-*
Serializationborsh, borsh-derive, bytemuck, bytemuck_derive, serde_derive, zerocopy-derive
Errors and enumsthiserror, thiserror-impl, num-derive
Macro plumbingproc-macro2, quote, syn, unicode-ident, proc-macro-crate, toml*

The build

The judge compiles your crate itself. A submitted binary is never trusted: a hunter could otherwise resubmit the original .so.

Commandcargo build-sbf -- --locked
ToolchainAgave cargo build-sbf 3.1.10, platform tools v1.52 (Rust 1.89 host toolchain)
Time cap10 minutes
EnvironmentCleared: only PATH, HOME, CARGO_HOME, RUSTUP_HOME, LANG and TERM. No secret reaches the build.
MachineAn ephemeral machine started for the job and stopped after it
OutputExactly one .so in target/deploy
Reproduce the build locally
SITE=https://www.decompilebounty.com
# build exactly as the judge does
cargo build-sbf --tools-version v1.52 -- --locked
ls target/deploy/*.so

The bond

Each submission will post a bond of 5,000 $DECOMP, returned on PASS and burned on FAIL. The bond turns on with $DECOMP: until then submissions are free.

First PASS wins. A later submission that also passes gets a "matched after the winner" badge and its bond back.