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,.rlibor other binaries in the archive. - No
asm!and noglobal_asm!. - No
include_bytes!orinclude_str!of anything over 4 KB, and no computed include paths (concat!,env!). - No
build.rsand nobuild =key in any manifest. - No proc-macro crate inside the submission. Proc-macro dependencies only from the allow-list below.
Cargo.lockpresent 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 norust-toolchainfile: 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 | |
|---|---|
| Solana | solana-*, spl-*, pinocchio*, five8*, const-crypto |
| Anchor | anchor-lang, anchor-attribute-*, anchor-derive-* |
| Serialization | borsh, borsh-derive, bytemuck, bytemuck_derive, serde_derive, zerocopy-derive |
| Errors and enums | thiserror, thiserror-impl, num-derive |
| Macro plumbing | proc-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.
| Command | cargo build-sbf -- --locked |
| Toolchain | Agave cargo build-sbf 3.1.10, platform tools v1.52 (Rust 1.89 host toolchain) |
| Time cap | 10 minutes |
| Environment | Cleared: only PATH, HOME, CARGO_HOME, RUSTUP_HOME, LANG and TERM. No secret reaches the build. |
| Machine | An ephemeral machine started for the job and stopped after it |
| Output | Exactly one .so in target/deploy |
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.