{
  "address": "qU9gAP1w199UASE2D5NZ9ciFk7y4iybAecbNHQDcNVS",
  "metadata": {
    "name": "canvas",
    "version": "0.1.0",
    "spec": "0.1.0",
    "description": "Canvas Pad: a pre-launch pool paints a 64x64 canvas; at the close it is frozen, hashed and becomes the coin's picture (pump.fun create_v2 + one buy of the whole pool)"
  },
  "instructions": [
    {
      "name": "claim_fees",
      "docs": [
        "Pays a painter its share of the creator fees so far: survivors[idx] * acc / ACC - fee_debt",
        "(survivors are final since the freeze). A share below the rent floor of an empty wallet fails",
        "with BelowRentFloor and stays accrued (L-4)."
      ],
      "discriminator": [
        82,
        251,
        233,
        156,
        12,
        52,
        184,
        202
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          },
          "relations": [
            "painter"
          ]
        },
        {
          "name": "painter",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  112,
                  97,
                  105,
                  110,
                  116,
                  101,
                  114
                ]
              },
              {
                "kind": "account",
                "path": "round"
              },
              {
                "kind": "account",
                "path": "wallet"
              }
            ]
          }
        },
        {
          "name": "wallet",
          "writable": true,
          "relations": [
            "painter"
          ]
        },
        {
          "name": "canvas"
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "claim_opener_fees",
      "docs": [
        "Pays the opener's booked share (anyone can push it; below the rent floor of an empty wallet it",
        "stays pending, L-4)."
      ],
      "discriminator": [
        199,
        118,
        239,
        64,
        130,
        162,
        180,
        238
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "opener",
          "writable": true
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "claim_tokens",
      "docs": [
        "Sends a painter its tokens, tokens_bought * committed / total (one price for every wallet), and",
        "its share of the SOL the curve could not take, sol_back * committed / total (H-2). Anyone can",
        "send it (the payer funds the wallet's token account). A SOL share below the rent floor of an",
        "empty wallet is deferred (L-4). Invariant: sol_back_paid <= sol_back."
      ],
      "discriminator": [
        108,
        216,
        210,
        231,
        0,
        212,
        42,
        64
      ],
      "accounts": [
        {
          "name": "payer",
          "writable": true,
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          },
          "relations": [
            "painter"
          ]
        },
        {
          "name": "painter",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  112,
                  97,
                  105,
                  110,
                  116,
                  101,
                  114
                ]
              },
              {
                "kind": "account",
                "path": "round"
              },
              {
                "kind": "account",
                "path": "wallet"
              }
            ]
          }
        },
        {
          "name": "wallet",
          "writable": true,
          "relations": [
            "painter"
          ]
        },
        {
          "name": "vault",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  118,
                  97,
                  117,
                  108,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "vault_ata",
          "writable": true
        },
        {
          "name": "wallet_ata",
          "writable": true
        },
        {
          "name": "token_program"
        },
        {
          "name": "ata_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "collect_fees",
      "docs": [
        "pump.fun collect_creator_fee into the round's fee PDA. remaining = [fees, creator_vault, system, event_authority, pump]."
      ],
      "discriminator": [
        164,
        152,
        207,
        99,
        30,
        186,
        19,
        182
      ],
      "accounts": [
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        }
      ],
      "args": []
    },
    {
      "name": "collect_treasury",
      "docs": [
        "Pays the treasury's booked share to config.treasury (anyone can push it; L-4 as above)."
      ],
      "discriminator": [
        48,
        255,
        226,
        214,
        221,
        81,
        222,
        65
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "treasury",
          "writable": true
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "commit",
      "docs": [
        "Commits SOL to an open round and buys paint: credits = floor(committed / pixel_price) (on the",
        "wallet's cumulative commit; the remainder lamports are in the pool and give tokens). The commit",
        "that crosses the target is clamped to exactly the target (the rest never leaves the wallet): the",
        "round is Full, painting continues until the end. The first commit of a wallet assigns its",
        "painter index (1..=1000, CanvasCrowded after that). Soft close: a commit in the last",
        "overtime_secs moves ends_at to min(now + overtime_secs, hard_end). Not blocked by pause."
      ],
      "discriminator": [
        223,
        140,
        142,
        165,
        229,
        208,
        156,
        74
      ],
      "accounts": [
        {
          "name": "wallet",
          "writable": true,
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "painter",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  112,
                  97,
                  105,
                  110,
                  116,
                  101,
                  114
                ]
              },
              {
                "kind": "account",
                "path": "round"
              },
              {
                "kind": "account",
                "path": "wallet"
              }
            ]
          }
        },
        {
          "name": "vault",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  118,
                  97,
                  117,
                  108,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "freeze",
      "docs": [
        "Anyone, once the round ended: total >= min_total -> Frozen, canvas_hash =",
        "sha256(\"canvas:v1\" || palette || colors) (blank pixels have colour 0 = palette[0]); else Failed",
        "and every commit refunds in full. Survivor counts are final from here (nothing can paint)."
      ],
      "discriminator": [
        255,
        91,
        207,
        84,
        251,
        194,
        254,
        63
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "canvas"
        }
      ],
      "args": []
    },
    {
      "name": "init_config",
      "discriminator": [
        23,
        235,
        115,
        232,
        168,
        96,
        1,
        231
      ],
      "accounts": [
        {
          "name": "admin",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "treasury",
          "type": "pubkey"
        },
        {
          "name": "keeper",
          "type": "pubkey"
        },
        {
          "name": "params",
          "type": {
            "defined": {
              "name": "Params"
            }
          }
        }
      ]
    },
    {
      "name": "launch",
      "docs": [
        "Keeper only (it rendered the frozen canvas and uploaded the picture + metadata with",
        "`canvas_hash`), while Frozen and before ends_at + launch_window. In one instruction: platform",
        "fee -> treasury, fee PDA floor, pump.fun `create_v2` (name / symbol from the round, creator =",
        "fee PDA, payer = vault, mint = keeper-supplied keypair), the vault's token account and ONE",
        "`buy_exact_sol_in(total - fee - rent_reserve)`, capped at the fresh curve (H-2).",
        "remaining_accounts = pump create_v2 accounts (16) + pump buy accounts (>= 16), user = vault."
      ],
      "discriminator": [
        153,
        241,
        93,
        225,
        22,
        69,
        74,
        61
      ],
      "accounts": [
        {
          "name": "caller",
          "docs": [
            "config.keeper (checked in the handler)."
          ],
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "vault",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  118,
                  97,
                  117,
                  108,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "treasury",
          "writable": true
        },
        {
          "name": "vault_ata",
          "writable": true
        },
        {
          "name": "token_program"
        },
        {
          "name": "ata_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "uri",
          "type": "string"
        }
      ]
    },
    {
      "name": "open_round",
      "docs": [
        "Opens round #next_id. The opener pays the round rent, the vault rent floor and (in the same",
        "transaction, `SystemProgram.createAccount` with owner = this program) the rent of the blank",
        "zero-copy Canvas account, which this instruction binds to the round. Nothing else.",
        "name 1-32 printable ASCII (no edge spaces), symbol 1-10 of A-Z 0-9, palette 16 x RGB,",
        "target 1..60 SOL, duration within the config bounds, min_bps 3000..10000."
      ],
      "discriminator": [
        66,
        235,
        123,
        240,
        8,
        35,
        185,
        159
      ],
      "accounts": [
        {
          "name": "opener",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "config.next_id",
                "account": "Config"
              }
            ]
          }
        },
        {
          "name": "canvas",
          "docs": [
            "Fresh account created in the same transaction (owner = this program, zeroed, rent exempt)."
          ],
          "writable": true
        },
        {
          "name": "vault",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  118,
                  97,
                  117,
                  108,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "fees",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "name",
          "type": "string"
        },
        {
          "name": "symbol",
          "type": "string"
        },
        {
          "name": "palette",
          "type": {
            "array": [
              "u8",
              48
            ]
          }
        },
        {
          "name": "target",
          "type": "u64"
        },
        {
          "name": "duration",
          "type": "i64"
        },
        {
          "name": "min_bps",
          "type": "u16"
        }
      ]
    },
    {
      "name": "paint",
      "docs": [
        "Paints the canvas. Ops run in order: `Rect{x, y, w, h, color}` fills, `Blit{x, y, w, h, data}`",
        "copies w*h nibbles (row-major, pixel 2k in the high nibble of data[k], pixel 2k+1 in the low",
        "one; an odd count leaves a zero low nibble). Bounds: w, h >= 1, x + w <= 64, y + h <= 64,",
        "w * h <= 1024, color < 16, at most 4096 pixels per instruction. Cost per pixel: 0 if it already",
        "has this painter and this colour, 1 if it is blank or the painter's own, overpaint_mult if it",
        "is someone else's. All or nothing: NotEnoughPaint if credits - spent < cost. Only a paint that",
        "cost something extends the round (soft close, as in commit)."
      ],
      "discriminator": [
        43,
        67,
        254,
        42,
        131,
        222,
        81,
        241
      ],
      "accounts": [
        {
          "name": "wallet",
          "signer": true,
          "relations": [
            "painter"
          ]
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          },
          "relations": [
            "painter"
          ]
        },
        {
          "name": "painter",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  112,
                  97,
                  105,
                  110,
                  116,
                  101,
                  114
                ]
              },
              {
                "kind": "account",
                "path": "round"
              },
              {
                "kind": "account",
                "path": "wallet"
              }
            ]
          }
        },
        {
          "name": "canvas",
          "writable": true
        }
      ],
      "args": [
        {
          "name": "ops",
          "type": {
            "vec": {
              "defined": {
                "name": "Op"
              }
            }
          }
        }
      ]
    },
    {
      "name": "refund",
      "docs": [
        "Returns a painter's whole commit to its wallet (Failed or Void). Anyone can send it.",
        "Invariant: vault == floor + refundable (+ donations) until the last refund, then == floor."
      ],
      "discriminator": [
        2,
        96,
        183,
        251,
        63,
        208,
        46,
        46
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          },
          "relations": [
            "painter"
          ]
        },
        {
          "name": "painter",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  112,
                  97,
                  105,
                  110,
                  116,
                  101,
                  114
                ]
              },
              {
                "kind": "account",
                "path": "round"
              },
              {
                "kind": "account",
                "path": "wallet"
              }
            ]
          }
        },
        {
          "name": "wallet",
          "writable": true,
          "relations": [
            "painter"
          ]
        },
        {
          "name": "vault",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  118,
                  97,
                  117,
                  108,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "set_admin",
      "discriminator": [
        251,
        163,
        0,
        52,
        91,
        194,
        187,
        92
      ],
      "accounts": [
        {
          "name": "admin",
          "signer": true,
          "relations": [
            "config"
          ]
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        }
      ],
      "args": [
        {
          "name": "admin",
          "type": "pubkey"
        }
      ]
    },
    {
      "name": "set_keeper",
      "docs": [
        "The keeper is the only key that may `launch` (it renders the frozen canvas and uploads it)."
      ],
      "discriminator": [
        102,
        94,
        23,
        78,
        157,
        222,
        243,
        214
      ],
      "accounts": [
        {
          "name": "admin",
          "signer": true,
          "relations": [
            "config"
          ]
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        }
      ],
      "args": [
        {
          "name": "keeper",
          "type": "pubkey"
        }
      ]
    },
    {
      "name": "set_paused",
      "docs": [
        "Pause blocks new rounds only: commits, paint, freeze, launch, void, refunds and claims keep working."
      ],
      "discriminator": [
        91,
        60,
        125,
        192,
        176,
        225,
        166,
        218
      ],
      "accounts": [
        {
          "name": "admin",
          "signer": true,
          "relations": [
            "config"
          ]
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        }
      ],
      "args": [
        {
          "name": "paused",
          "type": "bool"
        }
      ]
    },
    {
      "name": "set_treasury",
      "discriminator": [
        57,
        97,
        196,
        95,
        195,
        206,
        106,
        136
      ],
      "accounts": [
        {
          "name": "admin",
          "signer": true,
          "relations": [
            "config"
          ]
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        }
      ],
      "args": [
        {
          "name": "treasury",
          "type": "pubkey"
        }
      ]
    },
    {
      "name": "sync_fees",
      "docs": [
        "Books every new lamport on the fee PDA: painters_bps / opener_bps / treasury_bps.",
        "H-1: the painters' share is booked by the cumulative formula painters_booked =",
        "floor(W * acc / ACC) with W = painted (sum of survivors), while each painter accrues",
        "floor(survivors[idx] * acc / ACC); so painters_paid can never exceed painters_booked and the",
        "floor dust goes to the treasury. A blank canvas (painted == 0) books the painters' share to the",
        "opener. Invariant: fees == floor + (painters_booked - painters_paid) + opener_pending +",
        "treasury_pending + unsynced."
      ],
      "discriminator": [
        183,
        105,
        177,
        124,
        93,
        59,
        163,
        216
      ],
      "accounts": [
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        }
      ],
      "args": []
    },
    {
      "name": "unwrap_fees",
      "docs": [
        "Turns PumpSwap's wrapped SOL creator fees (on the fee PDA's WSOL account) back into SOL."
      ],
      "discriminator": [
        202,
        112,
        56,
        154,
        193,
        85,
        127,
        150
      ],
      "accounts": [
        {
          "name": "round",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        },
        {
          "name": "fees",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  102,
                  101,
                  101,
                  115
                ]
              },
              {
                "kind": "account",
                "path": "round"
              }
            ]
          }
        },
        {
          "name": "wsol_ata",
          "writable": true
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        }
      ],
      "args": []
    },
    {
      "name": "update_config",
      "docs": [
        "New params apply to rounds opened from now on; every round keeps the copy it was opened with."
      ],
      "discriminator": [
        29,
        158,
        252,
        191,
        10,
        83,
        219,
        99
      ],
      "accounts": [
        {
          "name": "admin",
          "signer": true,
          "relations": [
            "config"
          ]
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        }
      ],
      "args": [
        {
          "name": "params",
          "type": {
            "defined": {
              "name": "Params"
            }
          }
        }
      ]
    },
    {
      "name": "void",
      "docs": [
        "Frozen but not launched by ends_at + launch_window: anyone voids it and every commit refunds in",
        "full. The opener gets nothing (it only paid rent)."
      ],
      "discriminator": [
        55,
        130,
        74,
        24,
        235,
        14,
        16,
        3
      ],
      "accounts": [
        {
          "name": "caller",
          "signer": true
        },
        {
          "name": "round",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  111,
                  117,
                  110,
                  100
                ]
              },
              {
                "kind": "account",
                "path": "round.id",
                "account": "Round"
              }
            ]
          }
        }
      ],
      "args": []
    }
  ],
  "accounts": [
    {
      "name": "Canvas",
      "discriminator": [
        239,
        248,
        162,
        140,
        114,
        179,
        55,
        66
      ]
    },
    {
      "name": "Config",
      "discriminator": [
        155,
        12,
        170,
        224,
        30,
        250,
        204,
        130
      ]
    },
    {
      "name": "Painter",
      "discriminator": [
        240,
        93,
        88,
        207,
        248,
        165,
        39,
        184
      ]
    },
    {
      "name": "Round",
      "discriminator": [
        87,
        127,
        165,
        51,
        73,
        78,
        116,
        174
      ]
    }
  ],
  "events": [
    {
      "name": "AdminSet",
      "discriminator": [
        157,
        245,
        205,
        226,
        118,
        125,
        183,
        97
      ]
    },
    {
      "name": "Committed",
      "discriminator": [
        70,
        158,
        162,
        86,
        29,
        111,
        143,
        226
      ]
    },
    {
      "name": "ConfigInitialized",
      "discriminator": [
        181,
        49,
        200,
        156,
        19,
        167,
        178,
        91
      ]
    },
    {
      "name": "ConfigUpdated",
      "discriminator": [
        40,
        241,
        230,
        122,
        11,
        19,
        198,
        194
      ]
    },
    {
      "name": "FeesClaimed",
      "discriminator": [
        22,
        104,
        110,
        222,
        38,
        157,
        14,
        62
      ]
    },
    {
      "name": "FeesCollected",
      "discriminator": [
        233,
        23,
        117,
        225,
        107,
        178,
        254,
        8
      ]
    },
    {
      "name": "FeesSynced",
      "discriminator": [
        41,
        98,
        204,
        192,
        243,
        3,
        53,
        218
      ]
    },
    {
      "name": "FeesUnwrapped",
      "discriminator": [
        146,
        111,
        114,
        101,
        19,
        203,
        134,
        142
      ]
    },
    {
      "name": "Filled",
      "discriminator": [
        134,
        4,
        17,
        63,
        221,
        45,
        177,
        173
      ]
    },
    {
      "name": "Frozen",
      "discriminator": [
        115,
        77,
        189,
        83,
        81,
        71,
        245,
        232
      ]
    },
    {
      "name": "KeeperSet",
      "discriminator": [
        116,
        85,
        200,
        22,
        76,
        163,
        56,
        243
      ]
    },
    {
      "name": "Launched",
      "discriminator": [
        209,
        127,
        29,
        152,
        129,
        212,
        189,
        183
      ]
    },
    {
      "name": "OpenerPaid",
      "discriminator": [
        62,
        197,
        199,
        183,
        250,
        124,
        144,
        134
      ]
    },
    {
      "name": "Overtime",
      "discriminator": [
        24,
        179,
        156,
        148,
        154,
        219,
        228,
        228
      ]
    },
    {
      "name": "Painted",
      "discriminator": [
        122,
        87,
        190,
        84,
        224,
        53,
        34,
        178
      ]
    },
    {
      "name": "PausedSet",
      "discriminator": [
        171,
        125,
        127,
        156,
        233,
        81,
        68,
        66
      ]
    },
    {
      "name": "Refunded",
      "discriminator": [
        35,
        103,
        149,
        246,
        196,
        123,
        221,
        99
      ]
    },
    {
      "name": "RoundFailed",
      "discriminator": [
        162,
        209,
        228,
        133,
        70,
        176,
        236,
        52
      ]
    },
    {
      "name": "RoundOpened",
      "discriminator": [
        99,
        173,
        228,
        72,
        142,
        57,
        109,
        178
      ]
    },
    {
      "name": "TokensClaimed",
      "discriminator": [
        25,
        128,
        244,
        55,
        241,
        136,
        200,
        91
      ]
    },
    {
      "name": "TreasuryPaid",
      "discriminator": [
        203,
        141,
        198,
        183,
        132,
        74,
        239,
        248
      ]
    },
    {
      "name": "TreasurySet",
      "discriminator": [
        69,
        231,
        163,
        135,
        254,
        194,
        109,
        166
      ]
    },
    {
      "name": "Voided",
      "discriminator": [
        32,
        48,
        163,
        95,
        71,
        91,
        86,
        179
      ]
    }
  ],
  "errors": [
    {
      "code": 6000,
      "name": "Paused",
      "msg": "new rounds are paused"
    },
    {
      "code": 6001,
      "name": "Unauthorized",
      "msg": "only the admin can do this"
    },
    {
      "code": 6002,
      "name": "BadConfig",
      "msg": "bad config"
    },
    {
      "code": 6003,
      "name": "BadName",
      "msg": "name must be 1-32 printable ASCII characters, no leading or trailing space"
    },
    {
      "code": 6004,
      "name": "BadSymbol",
      "msg": "ticker must be 1-10 characters A-Z 0-9"
    },
    {
      "code": 6005,
      "name": "BadTarget",
      "msg": "target must be 1-60 SOL"
    },
    {
      "code": 6006,
      "name": "BadDuration",
      "msg": "duration outside the configured bounds"
    },
    {
      "code": 6007,
      "name": "BadMinBps",
      "msg": "minimum fill must be 3000-10000 bps of the target"
    },
    {
      "code": 6008,
      "name": "BadCanvas",
      "msg": "wrong canvas account"
    },
    {
      "code": 6009,
      "name": "RoundClosed",
      "msg": "this round is not taking commits or paint"
    },
    {
      "code": 6010,
      "name": "RoundFull",
      "msg": "the round is full: no more SOL, painting continues"
    },
    {
      "code": 6011,
      "name": "CommitSize",
      "msg": "commit outside the allowed size"
    },
    {
      "code": 6012,
      "name": "CanvasCrowded",
      "msg": "the canvas already has 1000 painters"
    },
    {
      "code": 6013,
      "name": "NoPaint",
      "msg": "nothing to paint"
    },
    {
      "code": 6014,
      "name": "OutOfBounds",
      "msg": "op outside the 64x64 canvas"
    },
    {
      "code": 6015,
      "name": "OpTooBig",
      "msg": "one op covers at most 1024 pixels"
    },
    {
      "code": 6016,
      "name": "BadColor",
      "msg": "colour must be 0-15"
    },
    {
      "code": 6017,
      "name": "BadBlit",
      "msg": "blit data must be w*h nibbles, a spare nibble zero"
    },
    {
      "code": 6018,
      "name": "PaintTooBig",
      "msg": "one paint covers at most 4096 pixels"
    },
    {
      "code": 6019,
      "name": "NotEnoughPaint",
      "msg": "not enough paint credits"
    },
    {
      "code": 6020,
      "name": "NotOpen",
      "msg": "the round is not open"
    },
    {
      "code": 6021,
      "name": "NotEnded",
      "msg": "the round has not ended yet"
    },
    {
      "code": 6022,
      "name": "NotLauncher",
      "msg": "only the keeper can launch"
    },
    {
      "code": 6023,
      "name": "NotFrozen",
      "msg": "the round is not frozen"
    },
    {
      "code": 6024,
      "name": "LaunchWindowOver",
      "msg": "the launch window is over: void the round"
    },
    {
      "code": 6025,
      "name": "BadUri",
      "msg": "metadata uri must be https://ipfs.io/ipfs/<cid>"
    },
    {
      "code": 6026,
      "name": "PoolTooSmall",
      "msg": "the pool is too small to launch"
    },
    {
      "code": 6027,
      "name": "NothingBought",
      "msg": "the buy returned no tokens"
    },
    {
      "code": 6028,
      "name": "RentTooHigh",
      "msg": "launch rents exceeded the rent reserve"
    },
    {
      "code": 6029,
      "name": "NotVoidable",
      "msg": "the round cannot be voided yet"
    },
    {
      "code": 6030,
      "name": "NotRefundable",
      "msg": "this commit is not refundable"
    },
    {
      "code": 6031,
      "name": "NothingToRefund",
      "msg": "nothing to refund"
    },
    {
      "code": 6032,
      "name": "AlreadyClaimed",
      "msg": "already claimed"
    },
    {
      "code": 6033,
      "name": "NotLaunched",
      "msg": "the round has not launched"
    },
    {
      "code": 6034,
      "name": "NothingToClaim",
      "msg": "nothing to claim"
    },
    {
      "code": 6035,
      "name": "BadAccounts",
      "msg": "wrong accounts"
    },
    {
      "code": 6036,
      "name": "Math",
      "msg": "math overflow"
    },
    {
      "code": 6037,
      "name": "BelowRentFloor",
      "msg": "payout is below the rent floor of an empty wallet: it stays claimable, fund the wallet or wait"
    }
  ],
  "types": [
    {
      "name": "AdminSet",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "admin",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "Canvas",
      "docs": [
        "The 64x64 canvas: 14,324 bytes + 8 discriminator. Created by the opener's client with",
        "SystemProgram.createAccount (owner = this program) in the open_round transaction."
      ],
      "serialization": "bytemuck",
      "repr": {
        "kind": "c"
      },
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "colors",
            "docs": [
              "Palette index 0..15 per pixel, row-major (y * 64 + x)."
            ],
            "type": {
              "array": [
                "u8",
                4096
              ]
            }
          },
          {
            "name": "owners",
            "docs": [
              "Painter index per pixel, 0 = blank."
            ],
            "type": {
              "array": [
                "u16",
                4096
              ]
            }
          },
          {
            "name": "survivors",
            "docs": [
              "Pixels currently owned by each painter index; survivors[0] is unused (always 0)."
            ],
            "type": {
              "array": [
                "u16",
                1001
              ]
            }
          },
          {
            "name": "painted",
            "docs": [
              "Non-blank pixels."
            ],
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "Committed",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "painter_idx",
            "type": "u16"
          },
          {
            "name": "requested",
            "type": "u64"
          },
          {
            "name": "amount",
            "type": "u64"
          },
          {
            "name": "committed",
            "type": "u64"
          },
          {
            "name": "credits",
            "type": "u64"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "painters",
            "type": "u16"
          },
          {
            "name": "ts",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "Config",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "admin",
            "type": "pubkey"
          },
          {
            "name": "treasury",
            "type": "pubkey"
          },
          {
            "name": "keeper",
            "docs": [
              "The only key that may send `launch`."
            ],
            "type": "pubkey"
          },
          {
            "name": "paused",
            "type": "bool"
          },
          {
            "name": "params",
            "type": {
              "defined": {
                "name": "Params"
              }
            }
          },
          {
            "name": "next_id",
            "docs": [
              "Id of the next round (rounds are numbered from 1; next_id - 1 rounds exist)."
            ],
            "type": "u64"
          },
          {
            "name": "bump",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "ConfigInitialized",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "admin",
            "type": "pubkey"
          },
          {
            "name": "treasury",
            "type": "pubkey"
          },
          {
            "name": "keeper",
            "type": "pubkey"
          },
          {
            "name": "params",
            "type": {
              "defined": {
                "name": "Params"
              }
            }
          }
        ]
      }
    },
    {
      "name": "ConfigUpdated",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "params",
            "type": {
              "defined": {
                "name": "Params"
              }
            }
          }
        ]
      }
    },
    {
      "name": "FeesClaimed",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "pixels",
            "type": "u16"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "FeesCollected",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "FeesSynced",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "incoming",
            "type": "u64"
          },
          {
            "name": "painters",
            "type": "u64"
          },
          {
            "name": "opener",
            "type": "u64"
          },
          {
            "name": "treasury",
            "type": "u64"
          },
          {
            "name": "total",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "FeesUnwrapped",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "Filled",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "painters",
            "type": "u16"
          },
          {
            "name": "full_at",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "Frozen",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "canvas_hash",
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          },
          {
            "name": "painted",
            "type": "u16"
          },
          {
            "name": "painters",
            "type": "u16"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "ends_at",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "KeeperSet",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "keeper",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "Launched",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "mint",
            "type": "pubkey"
          },
          {
            "name": "uri",
            "type": "string"
          },
          {
            "name": "canvas_hash",
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          },
          {
            "name": "tokens",
            "type": "u64"
          },
          {
            "name": "pool",
            "type": "u64"
          },
          {
            "name": "fee",
            "type": "u64"
          },
          {
            "name": "spent",
            "type": "u64"
          },
          {
            "name": "sol_back",
            "type": "u64"
          },
          {
            "name": "painted",
            "type": "u16"
          },
          {
            "name": "painters",
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "Op",
      "docs": [
        "One paint operation."
      ],
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "Rect",
            "fields": [
              {
                "name": "x",
                "type": "u8"
              },
              {
                "name": "y",
                "type": "u8"
              },
              {
                "name": "w",
                "type": "u8"
              },
              {
                "name": "h",
                "type": "u8"
              },
              {
                "name": "color",
                "type": "u8"
              }
            ]
          },
          {
            "name": "Blit",
            "fields": [
              {
                "name": "x",
                "type": "u8"
              },
              {
                "name": "y",
                "type": "u8"
              },
              {
                "name": "w",
                "type": "u8"
              },
              {
                "name": "h",
                "type": "u8"
              },
              {
                "name": "data",
                "type": "bytes"
              }
            ]
          }
        ]
      }
    },
    {
      "name": "OpenerPaid",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "opener",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "Overtime",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "ends_at",
            "type": "i64"
          },
          {
            "name": "hard_end",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "Painted",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "painter_idx",
            "type": "u16"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "pixels",
            "type": "u32"
          },
          {
            "name": "cost",
            "type": "u64"
          },
          {
            "name": "spent",
            "type": "u64"
          },
          {
            "name": "credits",
            "type": "u64"
          },
          {
            "name": "ends_at",
            "type": "i64"
          },
          {
            "name": "ts",
            "type": "i64"
          },
          {
            "name": "ops",
            "type": {
              "vec": {
                "defined": {
                  "name": "Op"
                }
              }
            }
          }
        ]
      }
    },
    {
      "name": "Painter",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "idx",
            "docs": [
              "1..=1000, the owner id this painter writes into the canvas."
            ],
            "type": "u16"
          },
          {
            "name": "committed",
            "type": "u64"
          },
          {
            "name": "credits",
            "docs": [
              "floor(committed / pixel_price)"
            ],
            "type": "u64"
          },
          {
            "name": "spent",
            "type": "u64"
          },
          {
            "name": "refunded",
            "type": "bool"
          },
          {
            "name": "tokens_claimed",
            "type": "bool"
          },
          {
            "name": "sol_back_claimed",
            "docs": [
              "The sol_back share was paid (or was zero)."
            ],
            "type": "bool"
          },
          {
            "name": "fee_debt",
            "docs": [
              "Creator fees already paid, in lamports (pending = survivors * acc / ACC - fee_debt)."
            ],
            "type": "u64"
          },
          {
            "name": "bump",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "Params",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "pixel_price",
            "docs": [
              "Lamports per paint credit (1 credit = 1 blank or own pixel). Default 0.002 SOL, 0.0001..0.05."
            ],
            "type": "u64"
          },
          {
            "name": "overpaint_mult",
            "docs": [
              "Credits per pixel when painting over someone else's pixel. Default 2, 1..4."
            ],
            "type": "u8"
          },
          {
            "name": "min_duration",
            "docs": [
              "Bounds of the round duration the opener picks (defaults 900 s .. 172800 s)."
            ],
            "type": "i64"
          },
          {
            "name": "max_duration",
            "type": "i64"
          },
          {
            "name": "min_commit",
            "docs": [
              "Smallest commit a wallet can request (0.01..1 SOL, >= pixel_price; default 0.01)."
            ],
            "type": "u64"
          },
          {
            "name": "max_commit",
            "docs": [
              "Most SOL one wallet can commit to one round (default 10 SOL; per round min(this, target))."
            ],
            "type": "u64"
          },
          {
            "name": "overtime_secs",
            "docs": [
              "Soft close: a commit / paint within this many seconds of the end pushes it to now + this",
              "(default 120, 0..600; 0 = no soft close)."
            ],
            "type": "i64"
          },
          {
            "name": "max_overtime_secs",
            "docs": [
              "Total overtime a round can get: hard_end = first ends_at + this (default 1800, 0..1800)."
            ],
            "type": "i64"
          },
          {
            "name": "fee_bps",
            "docs": [
              "Platform fee on the pool at launch (default 100, cap 300)."
            ],
            "type": "u16"
          },
          {
            "name": "rent_reserve",
            "docs": [
              "Launch rent budget (default 0.03 SOL, cap 0.05 SOL)."
            ],
            "type": "u64"
          },
          {
            "name": "launch_window",
            "docs": [
              "Seconds after the end a frozen round may wait for its launch before anyone can void it (default 7200)."
            ],
            "type": "i64"
          },
          {
            "name": "painters_bps",
            "docs": [
              "Creator fee split (default 6000 / 2500 / 1500, treasury cap 3000)."
            ],
            "type": "u16"
          },
          {
            "name": "opener_bps",
            "type": "u16"
          },
          {
            "name": "treasury_bps",
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "PausedSet",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "paused",
            "type": "bool"
          }
        ]
      }
    },
    {
      "name": "Refunded",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "Round",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "opener",
            "docs": [
              "The human who opened it (paid the rents; receives the opener share of pump.fun creator fees)."
            ],
            "type": "pubkey"
          },
          {
            "name": "name",
            "type": "string"
          },
          {
            "name": "symbol",
            "type": "string"
          },
          {
            "name": "palette",
            "docs": [
              "16 x RGB; palette[0] is also the colour of blank pixels."
            ],
            "type": {
              "array": [
                "u8",
                48
              ]
            }
          },
          {
            "name": "canvas",
            "docs": [
              "The zero-copy Canvas account bound at open_round."
            ],
            "type": "pubkey"
          },
          {
            "name": "params",
            "docs": [
              "Copy of the config params at open time."
            ],
            "type": {
              "defined": {
                "name": "Params"
              }
            }
          },
          {
            "name": "target",
            "type": "u64"
          },
          {
            "name": "min_bps",
            "type": "u16"
          },
          {
            "name": "min_total",
            "docs": [
              "ceil(target * min_bps / 10000): the fill needed at the end."
            ],
            "type": "u64"
          },
          {
            "name": "max_commit",
            "docs": [
              "min(params.max_commit, target): per-wallet cap."
            ],
            "type": "u64"
          },
          {
            "name": "starts_at",
            "type": "i64"
          },
          {
            "name": "ends_at",
            "docs": [
              "Current end (moves with the soft close, never past hard_end)."
            ],
            "type": "i64"
          },
          {
            "name": "hard_end",
            "docs": [
              "First ends_at + max_overtime_secs."
            ],
            "type": "i64"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "painters",
            "docs": [
              "Number of wallets that committed (= painter indexes handed out, <= 1000)."
            ],
            "type": "u16"
          },
          {
            "name": "full_at",
            "docs": [
              "When the commit that filled the target landed (0 = not full)."
            ],
            "type": "i64"
          },
          {
            "name": "paint_spent",
            "docs": [
              "Sum of paint credits spent by every painter."
            ],
            "type": "u64"
          },
          {
            "name": "state",
            "type": "u8"
          },
          {
            "name": "frozen_at",
            "type": "i64"
          },
          {
            "name": "canvas_hash",
            "docs": [
              "sha256(\"canvas:v1\" || palette || colors)"
            ],
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          },
          {
            "name": "painted",
            "docs": [
              "Non-blank pixels at the freeze (= sum of survivors)."
            ],
            "type": "u16"
          },
          {
            "name": "refundable",
            "docs": [
              "Failed / Void: commits not refunded yet."
            ],
            "type": "u64"
          },
          {
            "name": "mint",
            "type": "pubkey"
          },
          {
            "name": "uri",
            "type": "string"
          },
          {
            "name": "launched_at",
            "type": "i64"
          },
          {
            "name": "fee",
            "type": "u64"
          },
          {
            "name": "spent",
            "docs": [
              "Lamports offered to pump for the buy (pump's fees included)."
            ],
            "type": "u64"
          },
          {
            "name": "tokens_bought",
            "type": "u64"
          },
          {
            "name": "sol_back",
            "docs": [
              "Buy SOL the curve could not take (H-2): owed to the committers pro rata."
            ],
            "type": "u64"
          },
          {
            "name": "sol_back_paid",
            "type": "u64"
          },
          {
            "name": "acc_fee_per_pixel",
            "type": "u128"
          },
          {
            "name": "painters_booked",
            "type": "u64"
          },
          {
            "name": "painters_paid",
            "type": "u64"
          },
          {
            "name": "opener_pending",
            "type": "u64"
          },
          {
            "name": "treasury_pending",
            "type": "u64"
          },
          {
            "name": "fees_seen",
            "type": "u64"
          },
          {
            "name": "bump",
            "type": "u8"
          },
          {
            "name": "vault_bump",
            "type": "u8"
          },
          {
            "name": "fees_bump",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "RoundFailed",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "min_total",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "RoundOpened",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "opener",
            "type": "pubkey"
          },
          {
            "name": "canvas",
            "type": "pubkey"
          },
          {
            "name": "name",
            "type": "string"
          },
          {
            "name": "symbol",
            "type": "string"
          },
          {
            "name": "palette",
            "type": {
              "array": [
                "u8",
                48
              ]
            }
          },
          {
            "name": "target",
            "type": "u64"
          },
          {
            "name": "min_total",
            "type": "u64"
          },
          {
            "name": "max_commit",
            "type": "u64"
          },
          {
            "name": "starts_at",
            "type": "i64"
          },
          {
            "name": "ends_at",
            "type": "i64"
          },
          {
            "name": "hard_end",
            "type": "i64"
          },
          {
            "name": "pixel_price",
            "type": "u64"
          },
          {
            "name": "overpaint_mult",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "TokensClaimed",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "wallet",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          },
          {
            "name": "sol_back",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "TreasuryPaid",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "treasury",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "TreasurySet",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "treasury",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "Voided",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "id",
            "type": "u64"
          },
          {
            "name": "round",
            "type": "pubkey"
          },
          {
            "name": "total",
            "type": "u64"
          },
          {
            "name": "ends_at",
            "type": "i64"
          }
        ]
      }
    }
  ]
}