{
  "address": "SRSLYxcFnjd5jG2DpJw4as6UEyjwJQK1U4J1TD1hvZH",
  "metadata": {
    "name": "srsly",
    "version": "0.7.1",
    "spec": "0.1.0",
    "description": "Space Rental from SLY",
    "repository": "https://github.com/wuwei-labs/srsly"
  },
  "instructions": [
    {
      "name": "accept_rental",
      "docs": [
        "Accept a rental contract by providing payment and specifying duration.",
        "Used when no active rental exists. For queued rentals, use reserve_rental.",
        "Optionally verifies an ed25519 discount signature via slyvault CPI."
      ],
      "discriminator": [
        192,
        221,
        241,
        212,
        141,
        161,
        36,
        146
      ],
      "accounts": [
        {
          "name": "borrower",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "borrower_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "borrower"
              }
            ]
          }
        },
        {
          "name": "borrower_token_account",
          "writable": true
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet validated by contract"
          ],
          "writable": true
        },
        {
          "name": "expired_borrower_state",
          "docs": [
            "BorrowerState for the expired rental's borrower (required when inline replacement fires)"
          ],
          "writable": true,
          "optional": true
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "active_rental",
          "docs": [
            "Active rental slot"
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "queued_rental",
          "docs": [
            "Queued rental slot"
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "contract_token_account",
          "writable": true
        },
        {
          "name": "vault",
          "writable": true
        },
        {
          "name": "vault_token_account",
          "writable": true
        },
        {
          "name": "referrer",
          "writable": true,
          "optional": true
        },
        {
          "name": "expired_referrer",
          "writable": true,
          "optional": true
        },
        {
          "name": "expired_borrower_token_account",
          "writable": true,
          "optional": true
        },
        {
          "name": "queued_borrower_profile",
          "optional": true
        },
        {
          "name": "queued_borrower_profile_faction",
          "optional": true
        },
        {
          "name": "contract_thread",
          "writable": true,
          "optional": true
        },
        {
          "name": "close_rental_fiber",
          "writable": true,
          "optional": true
        },
        {
          "name": "sage_program"
        },
        {
          "name": "slyvault_program",
          "address": "VLTukwau1TDGhQUgBJfSSojSMv3BfnMHKrewnGN98M3"
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "duration",
          "type": "i64"
        },
        {
          "name": "discount_signature",
          "type": {
            "option": {
              "array": [
                "u8",
                64
              ]
            }
          }
        },
        {
          "name": "discount_member_nonce",
          "type": {
            "option": "u32"
          }
        },
        {
          "name": "discount_bps",
          "type": {
            "option": "u16"
          }
        },
        {
          "name": "discount_expires_at",
          "type": {
            "option": "i64"
          }
        }
      ]
    },
    {
      "name": "cancel_rental",
      "docs": [
        "Cancel an active rental with flexible timing.",
        "- cancel_delay = 0: Instant cancellation (fleet returned immediately)",
        "- cancel_delay > 0: Deferred cancellation (fleet stays with borrower until delay expires)"
      ],
      "discriminator": [
        97,
        204,
        63,
        8,
        84,
        34,
        28,
        43
      ],
      "accounts": [
        {
          "name": "borrower",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "borrower_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "borrower"
              }
            ]
          }
        },
        {
          "name": "borrower_token_account",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "borrower"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "rental_state",
          "writable": true
        },
        {
          "name": "contract_token_account",
          "writable": true
        },
        {
          "name": "fleet"
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "contract_thread",
          "writable": true,
          "optional": true
        },
        {
          "name": "antegen_program",
          "docs": [
            "Thread Program for trigger update"
          ],
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "cancel_delay",
          "type": "i64"
        }
      ]
    },
    {
      "name": "claim_borrower",
      "docs": [
        "Borrower claims accumulated ATLAS from their managed token account.",
        "Callable by borrower or admin (config.admin) as escape hatch."
      ],
      "discriminator": [
        110,
        181,
        137,
        36,
        71,
        243,
        38,
        219
      ],
      "accounts": [
        {
          "name": "payer",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "borrower",
          "writable": true
        },
        {
          "name": "borrower_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "borrower"
              }
            ]
          }
        },
        {
          "name": "borrower_managed_token_account",
          "docs": [
            "Managed token account (ATA with borrower_state as authority)."
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "borrower_state"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "destination_token_account",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "borrower"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "claim_contract",
      "docs": [
        "Claim accumulated ATLAS from a specific contract's token account.",
        "Transfers owner_claimable amount from contract_token_account to owner's wallet."
      ],
      "discriminator": [
        159,
        37,
        59,
        144,
        75,
        50,
        2,
        170
      ],
      "accounts": [
        {
          "name": "payer",
          "writable": true,
          "signer": true
        },
        {
          "name": "owner"
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "contract_token_account",
          "writable": true
        },
        {
          "name": "destination_token_account",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "owner"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "close_borrower",
      "docs": [
        "Close a borrower's managed token account and BorrowerState.",
        "Requires no active rentals and zero managed ATA balance (claim first)."
      ],
      "discriminator": [
        136,
        79,
        95,
        44,
        18,
        151,
        73,
        199
      ],
      "accounts": [
        {
          "name": "borrower",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "borrower_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "borrower"
              }
            ]
          }
        },
        {
          "name": "borrower_managed_token_account",
          "docs": [
            "Managed token account (ATA with borrower_state as authority).",
            "Must have zero balance (claim first)."
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "borrower_state"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "close_contract",
      "docs": [
        "Closes a rental contract. Contract must have no active rentals.",
        "Owner closes contract and claims all remaining payments",
        "Requires no active rental, reclaims all rent"
      ],
      "discriminator": [
        37,
        244,
        34,
        168,
        92,
        202,
        80,
        106
      ],
      "accounts": [
        {
          "name": "owner",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "fleet"
              }
            ]
          }
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet to close rental contract for"
          ],
          "writable": true
        },
        {
          "name": "active_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "queued_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "contract_token_account",
          "writable": true
        },
        {
          "name": "owner_destination",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "owner"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "queued_borrower_state",
          "docs": [
            "Queued borrower's state PDA for removing active rental tracking.",
            "Required when queued rental exists (not Available)."
          ],
          "writable": true,
          "optional": true
        },
        {
          "name": "queued_borrower_token_account",
          "docs": [
            "Queued borrower's token account for refunding escrow + deferred fee.",
            "Required when queued rental exists (not Available)."
          ],
          "writable": true,
          "optional": true
        },
        {
          "name": "contract_thread",
          "docs": [
            "gone when `contract.thread` still names it — `delete_contract_thread`",
            "tears a thread down without clearing the pointer, which would",
            "otherwise leave the contract permanently unclosable. Only the address",
            "is trusted; it must equal `contract.thread` and hold no data."
          ],
          "optional": true
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "close_contract_thread",
      "docs": [
        "Close a contract's automation thread independently.",
        "Closes thread + fibers, returns SOL to owner. Contract continues in manual mode."
      ],
      "discriminator": [
        213,
        35,
        77,
        150,
        62,
        109,
        103,
        248
      ],
      "accounts": [
        {
          "name": "owner",
          "writable": true,
          "signer": true
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "thread",
          "docs": [
            "Validated by antegen's close_thread CPI (seeds check)."
          ],
          "writable": true
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "close_rental",
      "docs": [
        "Close a completed or expired rental, optionally activating a queued rental inline.",
        "Serves both fiber 1 (automated) and manual fallback.",
        "Returns Signal for fiber dispatch (manual callers ignore return_data)."
      ],
      "discriminator": [
        179,
        188,
        113,
        211,
        41,
        232,
        51,
        51
      ],
      "accounts": [
        {
          "name": "payer",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "rental_state",
          "docs": [
            "Seeds, not `address = contract.active_rental`: `address` is checked",
            "before the handler runs, so a close arriving after the slot was cleared",
            "aborted the whole transaction with 2012 rather than no-opping. The",
            "pointer only ever holds this PDA or the system program, so the seeds",
            "prove the same ownership without that failure. Paths C and D already",
            "handle an empty slot."
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "borrower_state",
          "docs": [
            "Bound to the rental being closed, but only while there is one. `reset()`",
            "clears `borrower_state` along with the rest of the slot, so an `address`",
            "constraint here would reject the empty case the same way the pointer on",
            "`rental_state` did. Only `process_rental_close` reads this account, and",
            "that runs solely when the slot is occupied."
          ],
          "writable": true
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet validated by contract"
          ],
          "writable": true
        },
        {
          "name": "game_id"
        },
        {
          "name": "starbase"
        },
        {
          "name": "starbase_player",
          "writable": true
        },
        {
          "name": "contract_token_account",
          "docs": [
            "Contract's escrow token account (source for fee flush)"
          ],
          "writable": true
        },
        {
          "name": "vault",
          "writable": true
        },
        {
          "name": "vault_token_account",
          "writable": true
        },
        {
          "name": "referrer",
          "writable": true,
          "optional": true
        },
        {
          "name": "borrower_token_account",
          "writable": true,
          "optional": true
        },
        {
          "name": "queued_rental",
          "writable": true,
          "optional": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "queued_borrower_profile",
          "optional": true
        },
        {
          "name": "queued_borrower_profile_faction",
          "optional": true
        },
        {
          "name": "contract_thread",
          "writable": true,
          "optional": true
        },
        {
          "name": "close_rental_fiber",
          "writable": true,
          "optional": true
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "slyvault_program",
          "address": "VLTukwau1TDGhQUgBJfSSojSMv3BfnMHKrewnGN98M3"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [],
      "returns": {
        "defined": {
          "name": "Signal"
        }
      }
    },
    {
      "name": "contract_doctor_fiber",
      "docs": [
        "Rewrite one of a contract thread's fibers, for when `fiber_ids` and the",
        "accounts it names have diverged and the thread can no longer build.",
        "Callable by the contract's owner or by admin; `payer` funds the rent and",
        "`rental_authority` signs the CPI."
      ],
      "discriminator": [
        129,
        173,
        84,
        247,
        167,
        228,
        206,
        192
      ],
      "accounts": [
        {
          "name": "payer",
          "docs": [
            "Signs, and pays rent for the rewritten fiber. The contract's owner or",
            "`config.admin`. It is *not* the thread's authority — that is",
            "`rental_authority`, and only this program can sign for it."
          ],
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "Bypassed when payer is AUTHORIZED_INITIALIZER (break-glass)."
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "docs": [
            "binds the write: it authorizes the payer, pins `contract_thread` to",
            "`contract.thread`, and scopes the payload. Owners must supply it.",
            "Optional so admins retain a break-glass path for a contract that is",
            "mid-migration or undeserializable."
          ],
          "optional": true
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "contract_thread",
          "docs": [
            "`contract` is supplied. Left unchecked in the struct so the break-glass",
            "path still works: antegen's `update_fiber` rejects any thread whose",
            "authority is not `rental_authority`, which confines this to SRSLY",
            "threads on its own."
          ],
          "writable": true
        },
        {
          "name": "fiber",
          "docs": [
            "against the thread via seeds."
          ],
          "writable": true
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "fiber_index",
          "type": "u8"
        },
        {
          "name": "instruction",
          "type": {
            "defined": {
              "name": "SerializableInstruction"
            }
          }
        },
        {
          "name": "priority_fee",
          "type": {
            "option": "u64"
          }
        }
      ]
    },
    {
      "name": "create_borrower",
      "docs": [
        "Create a new BorrowerState account.",
        "Must be called before any rental operations (rental_accept, rental_reserve)."
      ],
      "discriminator": [
        203,
        62,
        59,
        250,
        206,
        172,
        88,
        214
      ],
      "accounts": [
        {
          "name": "borrower",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "borrower_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "borrower"
              }
            ]
          }
        },
        {
          "name": "managed_token_account",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "borrower_state"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "create_config",
      "docs": [
        "Create global program configuration. Called once during deployment.",
        "Note: Vault members must be added separately via slyvault member_init + member_add",
        "",
        "# Arguments",
        "- `recent_slot`: The slot used to derive the lookup table address"
      ],
      "discriminator": [
        201,
        207,
        243,
        114,
        75,
        111,
        47,
        189
      ],
      "accounts": [
        {
          "name": "authority",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "vault",
          "writable": true
        },
        {
          "name": "vault_token_account",
          "writable": true
        },
        {
          "name": "lookup_table",
          "writable": true
        },
        {
          "name": "sage_program"
        },
        {
          "name": "antegen_program"
        },
        {
          "name": "alt_program",
          "address": "AddressLookupTab1e1111111111111111111111111"
        },
        {
          "name": "srsly_program",
          "address": "SRSLYxcFnjd5jG2DpJw4as6UEyjwJQK1U4J1TD1hvZH"
        },
        {
          "name": "slyvault_program",
          "address": "VLTukwau1TDGhQUgBJfSSojSMv3BfnMHKrewnGN98M3"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "recent_slot",
          "type": "u64"
        }
      ]
    },
    {
      "name": "create_contract",
      "docs": [
        "Create a new rental contract for a fleet with specified terms."
      ],
      "discriminator": [
        244,
        48,
        244,
        178,
        216,
        88,
        122,
        52
      ],
      "accounts": [
        {
          "name": "owner",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet to create rental contract for"
          ],
          "writable": true
        },
        {
          "name": "owner_profile"
        },
        {
          "name": "game_id"
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "fleet"
              }
            ]
          }
        },
        {
          "name": "active_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "queued_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "contract_token_account",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "rate",
          "type": "u64"
        },
        {
          "name": "duration_min",
          "type": "i64"
        },
        {
          "name": "duration_max",
          "type": "i64"
        },
        {
          "name": "owner_key_index",
          "type": "u16"
        },
        {
          "name": "cancel_delay_min",
          "type": "i64"
        },
        {
          "name": "reservations_disabled",
          "type": "bool"
        },
        {
          "name": "contested_threshold",
          "type": "u8"
        },
        {
          "name": "stale_discount_max_bps",
          "type": "u16"
        }
      ]
    },
    {
      "name": "create_contract_thread",
      "docs": [
        "Create per-contract automation thread with fiber-based dispatch.",
        "Creates thread (fiber 0: controller) + fiber 1 (rental_close).",
        "Activation is handled inline by rental_close. Owner-managed."
      ],
      "discriminator": [
        233,
        57,
        214,
        37,
        246,
        233,
        143,
        139
      ],
      "accounts": [
        {
          "name": "payer",
          "docs": [
            "Payer must be contract owner"
          ],
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "contract_thread",
          "writable": true
        },
        {
          "name": "fiber_0",
          "writable": true
        },
        {
          "name": "close_rental_fiber",
          "writable": true
        },
        {
          "name": "owner"
        },
        {
          "name": "contract_token_account",
          "docs": [
            "Contract's escrow token account (validated here, passed to contract_process)"
          ],
          "writable": true
        },
        {
          "name": "owner_token_account",
          "docs": [
            "Owner's ATLAS destination (created here, used by contract_process for auto-transfer)"
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "owner"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "mint"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "active_rental",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "queued_rental",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "lamports",
          "type": "u64"
        },
        {
          "name": "payments_freq",
          "type": "string"
        }
      ]
    },
    {
      "name": "delete_borrower",
      "docs": [
        "Delete borrower state (admin-only for schema migrations).",
        "Uses UncheckedAccount to bypass deserialization for old-format accounts."
      ],
      "discriminator": [
        89,
        147,
        185,
        127,
        231,
        56,
        190,
        45
      ],
      "accounts": [
        {
          "name": "admin",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "Bypassed when admin is AUTHORIZED_INITIALIZER (break-glass)."
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "borrower",
          "writable": true
        },
        {
          "name": "borrower_state",
          "writable": true
        }
      ],
      "args": []
    },
    {
      "name": "delete_config",
      "docs": [
        "Delete global program configuration. Only callable by AUTHORIZED_INITIALIZER.",
        "WARNING: Destructive operation - prevents all program operations until re-initialized.",
        "Use for devnet/testnet when ConfigState schema changes."
      ],
      "discriminator": [
        219,
        237,
        110,
        222,
        219,
        239,
        70,
        237
      ],
      "accounts": [
        {
          "name": "authority",
          "writable": true,
          "signer": true,
          "address": "5xoQptcACAAAwPunPAgNgoGfEqywR5VyZdUdzGpaTp2z"
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "mint"
        },
        {
          "name": "vault",
          "writable": true
        },
        {
          "name": "vault_token_account",
          "writable": true
        },
        {
          "name": "srsly_program",
          "address": "SRSLYxcFnjd5jG2DpJw4as6UEyjwJQK1U4J1TD1hvZH"
        },
        {
          "name": "slyvault_program",
          "address": "VLTukwau1TDGhQUgBJfSSojSMv3BfnMHKrewnGN98M3"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "delete_contract",
      "docs": [
        "Delete contract state (dev-only for schema migrations)"
      ],
      "discriminator": [
        189,
        115,
        12,
        22,
        241,
        49,
        35,
        6
      ],
      "accounts": [
        {
          "name": "admin",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "Bypassed when admin is AUTHORIZED_INITIALIZER (break-glass)."
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "owner",
          "writable": true
        },
        {
          "name": "contract",
          "writable": true
        }
      ],
      "args": []
    },
    {
      "name": "delete_contract_thread",
      "docs": [
        "Admin-only thread deletion for schema migrations / redeployments.",
        "Like close_contract_thread but uses admin auth and skips contract deserialization."
      ],
      "discriminator": [
        113,
        179,
        247,
        242,
        60,
        125,
        240,
        68
      ],
      "accounts": [
        {
          "name": "admin",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "Bypassed when admin is AUTHORIZED_INITIALIZER (break-glass)."
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "thread",
          "writable": true
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "delete_rental",
      "docs": [
        "Delete rental state (admin-only for schema migrations).",
        "After deletion, use release_rental to clean up thread + SAGE fleet."
      ],
      "discriminator": [
        252,
        24,
        115,
        220,
        135,
        174,
        69,
        172
      ],
      "accounts": [
        {
          "name": "admin",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "Bypassed when admin is AUTHORIZED_INITIALIZER (break-glass)."
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "borrower",
          "docs": [
            "If borrower is system_program::ID (empty slot), lamports go to admin instead."
          ],
          "writable": true
        },
        {
          "name": "rental_state",
          "writable": true
        }
      ],
      "args": []
    },
    {
      "name": "invalidate_rental",
      "docs": [
        "Invalidate a fleet's rental status in SAGE when contract doesn't exist.",
        "Use when fleet is stuck but borrower is unknown and contract was never created."
      ],
      "discriminator": [
        180,
        183,
        106,
        153,
        255,
        8,
        232,
        178
      ],
      "accounts": [
        {
          "name": "signer",
          "writable": true,
          "signer": true
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet to release from rental control",
            "- Must be in rental mode (sub_profile != default)",
            "- SRSLY must be the invalidator"
          ],
          "writable": true
        },
        {
          "name": "game_id"
        },
        {
          "name": "starbase"
        },
        {
          "name": "starbase_player",
          "writable": true
        },
        {
          "name": "contract",
          "docs": [
            "If contract exists, use rental_release instead"
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "fleet"
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        }
      ],
      "args": []
    },
    {
      "name": "migrate_config",
      "docs": [
        "Migrate the singleton v1 `ConfigState` PDA to the v2 byte layout",
        "in-place. Permissionless. Idempotent. Defaults the new",
        "protocol-wide decay knob to `0` (off)."
      ],
      "discriminator": [
        92,
        131,
        58,
        105,
        210,
        154,
        224,
        193
      ],
      "accounts": [
        {
          "name": "payer",
          "docs": [
            "Anyone can pay the realloc rent — the cost is tiny (≤ 4 bytes of",
            "rent ≈ 28_000 lamports)."
          ],
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "docs": [
            "seeds are enforced by `seeds`/`bump`."
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "migrate_contract",
      "docs": [
        "Migrate a v1 `ContractState` PDA to the v2 byte layout in-place.",
        "",
        "Required for every contract created before the stale-discount",
        "fields shipped. Permissionless — any signer can call this on any",
        "contract PDA, idempotent if already v2. Defaults the new fields",
        "to a \"decay disabled\" configuration so behavior is unchanged",
        "until the owner explicitly opts in via `update_contract`."
      ],
      "discriminator": [
        130,
        38,
        227,
        224,
        91,
        79,
        163,
        127
      ],
      "accounts": [
        {
          "name": "payer",
          "docs": [
            "Anyone can pay the realloc rent — migration is permissionless so",
            "a crank can sweep every known PDA without per-owner coordination."
          ],
          "writable": true,
          "signer": true
        },
        {
          "name": "contract",
          "docs": [
            "We use `UncheckedAccount` because v1 bytes don't deserialize",
            "against the v2 struct."
          ],
          "writable": true
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": []
    },
    {
      "name": "process_contract",
      "docs": [
        "Controller fiber (fiber 0) — checks state, settles escrow, dispatches.",
        "Called by antegen thread executor automatically."
      ],
      "discriminator": [
        203,
        109,
        39,
        44,
        150,
        50,
        210,
        78
      ],
      "accounts": [
        {
          "name": "contract_thread",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "active_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "queued_rental",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "owner",
          "writable": true
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet for SAGE invalidation on close"
          ],
          "writable": true
        },
        {
          "name": "contract_token_account",
          "docs": [
            "Contract's escrow token account (source of tokens)"
          ],
          "writable": true
        },
        {
          "name": "owner_token_account",
          "docs": [
            "Owner's destination token account (created by contract_thread). The",
            "owner may close it, in which case payouts are deferred rather than",
            "failing the tick."
          ],
          "writable": true
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [],
      "returns": {
        "defined": {
          "name": "Signal"
        }
      }
    },
    {
      "name": "release_rental",
      "docs": [
        "Release a fleet from rental control regardless of state.",
        "Emergency function to free stuck fleets by invalidating rental in SAGE."
      ],
      "discriminator": [
        99,
        35,
        221,
        147,
        185,
        205,
        23,
        12
      ],
      "accounts": [
        {
          "name": "signer",
          "writable": true,
          "signer": true
        },
        {
          "name": "fleet",
          "docs": [
            "Fleet to release from rental control",
            "- Must be in rental mode (sub_profile != default)",
            "- SRSLY must be the invalidator"
          ],
          "writable": true
        },
        {
          "name": "game_id"
        },
        {
          "name": "starbase"
        },
        {
          "name": "starbase_player",
          "writable": true
        },
        {
          "name": "contract",
          "docs": [
            "Contract must exist - if contract doesn't exist, use rental_invalidate instead",
            "Constraint ensures no active rental (both slots empty)"
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "fleet"
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        }
      ],
      "args": []
    },
    {
      "name": "reserve_rental",
      "docs": [
        "Reserve a rental and queue it for activation when the current rental ends.",
        "",
        "Combines the old reserve + claim flow: the reservation IS the queued rental.",
        "Escrow is transferred immediately and the rental is queued for activation.",
        "",
        "# Arguments",
        "* `bid_points` - Points to bid (burned; 0 if ATLAS bid)",
        "* `bid_atlas` - ATLAS premium to bid (0 if points bid)",
        "* `duration` - Rental duration in seconds",
        "* `discount_signature` / `discount_member_nonce` / `discount_bps` /",
        "`discount_expires_at` - Optional affiliate discount auth (mirrors",
        "`accept_rental`). Verified and locked at reserve, settled at close."
      ],
      "discriminator": [
        5,
        180,
        4,
        150,
        64,
        120,
        189,
        128
      ],
      "accounts": [
        {
          "name": "challenger",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "contract_thread",
          "writable": true
        },
        {
          "name": "close_rental_fiber",
          "writable": true
        },
        {
          "name": "contract_token_account",
          "docs": [
            "Contract's token account for ATLAS escrow"
          ],
          "writable": true
        },
        {
          "name": "defender_state",
          "docs": [
            "Defender's borrower state (required when knocking off a defender)"
          ],
          "writable": true,
          "optional": true
        },
        {
          "name": "defender_managed_token_account",
          "docs": [
            "Defender's managed token account (ATA of defender's BorrowerState PDA)",
            "Used to refund ATLAS when knocking off defender"
          ],
          "writable": true,
          "optional": true
        },
        {
          "name": "challenger_state",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  98,
                  111,
                  114,
                  114,
                  111,
                  119,
                  101,
                  114,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "challenger"
              }
            ]
          }
        },
        {
          "name": "challenger_token_account",
          "docs": [
            "Challenger's ATLAS token account (funding source -- required for escrow transfer)"
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "account",
                "path": "challenger"
              },
              {
                "kind": "const",
                "value": [
                  6,
                  221,
                  246,
                  225,
                  215,
                  101,
                  161,
                  147,
                  217,
                  203,
                  225,
                  70,
                  206,
                  235,
                  121,
                  172,
                  28,
                  180,
                  133,
                  237,
                  95,
                  91,
                  55,
                  145,
                  58,
                  140,
                  245,
                  133,
                  126,
                  255,
                  0,
                  169
                ]
              },
              {
                "kind": "account",
                "path": "config.atlas_mint",
                "account": "ConfigState"
              }
            ],
            "program": {
              "kind": "const",
              "value": [
                140,
                151,
                37,
                143,
                78,
                36,
                137,
                241,
                187,
                61,
                16,
                41,
                20,
                142,
                13,
                131,
                11,
                90,
                19,
                153,
                218,
                255,
                16,
                132,
                4,
                142,
                123,
                216,
                219,
                233,
                248,
                89
              ]
            }
          }
        },
        {
          "name": "active_rental",
          "docs": [
            "Active rental slot (read-only, needed for fiber rebuild)"
          ],
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  97,
                  99,
                  116,
                  105,
                  118,
                  101
                ]
              }
            ]
          }
        },
        {
          "name": "rental_state",
          "docs": [
            "Queued rental state PDA — must be Available OR occupied by defender being knocked off"
          ],
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  115,
                  116,
                  97,
                  116,
                  101
                ]
              },
              {
                "kind": "account",
                "path": "contract"
              },
              {
                "kind": "const",
                "value": [
                  113,
                  117,
                  101,
                  117,
                  101,
                  100
                ]
              }
            ]
          }
        },
        {
          "name": "referrer",
          "writable": true,
          "optional": true
        },
        {
          "name": "rental_authority",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "sage_program"
        },
        {
          "name": "slyvault_program",
          "address": "VLTukwau1TDGhQUgBJfSSojSMv3BfnMHKrewnGN98M3"
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "fiber_program",
          "address": "AgFv5afjW9DmSPkiEvJ1er5bAAmRUqaBeTB6Cr8e1hKx"
        },
        {
          "name": "token_program",
          "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
        },
        {
          "name": "associated_token_program",
          "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "bid_points",
          "type": "u64"
        },
        {
          "name": "bid_atlas",
          "type": "u64"
        },
        {
          "name": "duration",
          "type": "i64"
        },
        {
          "name": "discount_signature",
          "type": {
            "option": {
              "array": [
                "u8",
                64
              ]
            }
          }
        },
        {
          "name": "discount_member_nonce",
          "type": {
            "option": "u32"
          }
        },
        {
          "name": "discount_bps",
          "type": {
            "option": "u16"
          }
        },
        {
          "name": "discount_expires_at",
          "type": {
            "option": "i64"
          }
        }
      ]
    },
    {
      "name": "set_delegate",
      "docs": [
        "Set or remove a delegate address that can update the contract rate.",
        "Only the owner can set/remove delegates."
      ],
      "discriminator": [
        242,
        30,
        46,
        76,
        108,
        235,
        128,
        181
      ],
      "accounts": [
        {
          "name": "owner",
          "writable": true,
          "signer": true,
          "relations": [
            "contract"
          ]
        },
        {
          "name": "contract",
          "writable": true
        }
      ],
      "args": [
        {
          "name": "delegate",
          "type": {
            "option": "pubkey"
          }
        }
      ]
    },
    {
      "name": "update_config",
      "docs": [
        "Update program configuration. Only callable by config authority."
      ],
      "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": "ConfigUpdateParams"
            }
          }
        }
      ]
    },
    {
      "name": "update_contract",
      "docs": [
        "Update rental contract settings.",
        "Owner can update all settings, delegate can only update rate."
      ],
      "discriminator": [
        78,
        184,
        162,
        174,
        233,
        5,
        40,
        82
      ],
      "accounts": [
        {
          "name": "authority",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "writable": true
        }
      ],
      "args": [
        {
          "name": "params",
          "type": {
            "defined": {
              "name": "ContractUpdateParams"
            }
          }
        }
      ]
    },
    {
      "name": "update_contract_thread",
      "docs": [
        "Fund a contract thread with SOL and/or update settlement frequency."
      ],
      "discriminator": [
        183,
        75,
        119,
        98,
        134,
        24,
        187,
        91
      ],
      "accounts": [
        {
          "name": "payer",
          "writable": true,
          "signer": true
        },
        {
          "name": "config",
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  99,
                  111,
                  110,
                  102,
                  105,
                  103
                ]
              }
            ]
          }
        },
        {
          "name": "contract",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  99,
                  111,
                  110,
                  116,
                  114,
                  97,
                  99,
                  116
                ]
              },
              {
                "kind": "account",
                "path": "contract.fleet",
                "account": "ContractState"
              }
            ]
          }
        },
        {
          "name": "rental_authority",
          "writable": true,
          "pda": {
            "seeds": [
              {
                "kind": "const",
                "value": [
                  114,
                  101,
                  110,
                  116,
                  97,
                  108,
                  95,
                  97,
                  117,
                  116,
                  104,
                  111,
                  114,
                  105,
                  116,
                  121
                ]
              }
            ]
          }
        },
        {
          "name": "contract_thread",
          "writable": true
        },
        {
          "name": "antegen_program",
          "address": "AgTv5w1UvUb6zeqkThwMrztGu9hpepBu8YLghuR4dpSx"
        },
        {
          "name": "system_program",
          "address": "11111111111111111111111111111111"
        }
      ],
      "args": [
        {
          "name": "lamports",
          "type": "u64"
        },
        {
          "name": "payments_freq",
          "type": {
            "option": "string"
          }
        }
      ]
    }
  ],
  "accounts": [
    {
      "name": "BorrowerState",
      "discriminator": [
        160,
        47,
        174,
        209,
        255,
        213,
        193,
        235
      ]
    },
    {
      "name": "ConfigState",
      "discriminator": [
        193,
        77,
        160,
        128,
        208,
        254,
        180,
        135
      ]
    },
    {
      "name": "ContractState",
      "discriminator": [
        190,
        138,
        10,
        223,
        189,
        116,
        222,
        115
      ]
    },
    {
      "name": "RentalState",
      "discriminator": [
        97,
        162,
        29,
        222,
        251,
        251,
        180,
        244
      ]
    }
  ],
  "events": [
    {
      "name": "BorrowerClaimed",
      "discriminator": [
        240,
        67,
        112,
        148,
        236,
        136,
        146,
        45
      ]
    },
    {
      "name": "BorrowerClosed",
      "discriminator": [
        198,
        199,
        176,
        231,
        158,
        63,
        92,
        33
      ]
    },
    {
      "name": "BorrowerCreated",
      "discriminator": [
        61,
        5,
        12,
        203,
        102,
        248,
        190,
        84
      ]
    },
    {
      "name": "ContractCloseQueued",
      "discriminator": [
        101,
        206,
        75,
        70,
        153,
        228,
        174,
        31
      ]
    },
    {
      "name": "ContractClosed",
      "discriminator": [
        124,
        19,
        15,
        132,
        135,
        33,
        12,
        210
      ]
    },
    {
      "name": "ContractCreated",
      "discriminator": [
        80,
        69,
        164,
        109,
        77,
        15,
        47,
        164
      ]
    },
    {
      "name": "ContractFiberDoctored",
      "discriminator": [
        14,
        49,
        216,
        13,
        84,
        33,
        142,
        31
      ]
    },
    {
      "name": "ContractUpdated",
      "discriminator": [
        22,
        231,
        130,
        67,
        128,
        56,
        87,
        115
      ]
    },
    {
      "name": "DelegateSet",
      "discriminator": [
        103,
        126,
        239,
        131,
        201,
        31,
        212,
        253
      ]
    },
    {
      "name": "FeesPaid",
      "discriminator": [
        71,
        98,
        195,
        210,
        40,
        81,
        73,
        159
      ]
    },
    {
      "name": "OwnerPaid",
      "discriminator": [
        135,
        160,
        107,
        250,
        183,
        233,
        175,
        124
      ]
    },
    {
      "name": "RentalAccepted",
      "discriminator": [
        72,
        237,
        15,
        82,
        177,
        184,
        244,
        201
      ]
    },
    {
      "name": "RentalCancelled",
      "discriminator": [
        7,
        110,
        25,
        158,
        197,
        48,
        12,
        238
      ]
    },
    {
      "name": "RentalClosed",
      "discriminator": [
        77,
        252,
        165,
        5,
        168,
        29,
        237,
        40
      ]
    },
    {
      "name": "RentalSettled",
      "discriminator": [
        170,
        51,
        180,
        247,
        186,
        122,
        168,
        59
      ]
    },
    {
      "name": "ReservationForceClosed",
      "discriminator": [
        242,
        40,
        22,
        31,
        119,
        14,
        46,
        11
      ]
    },
    {
      "name": "ReservationKnockedOff",
      "discriminator": [
        96,
        186,
        255,
        134,
        182,
        43,
        15,
        28
      ]
    },
    {
      "name": "ReservationPlaced",
      "discriminator": [
        30,
        57,
        155,
        213,
        222,
        81,
        150,
        139
      ]
    },
    {
      "name": "StaleDecayApplied",
      "discriminator": [
        255,
        50,
        132,
        24,
        156,
        127,
        209,
        96
      ]
    },
    {
      "name": "ThreadClosed",
      "discriminator": [
        111,
        69,
        136,
        64,
        218,
        251,
        17,
        28
      ]
    },
    {
      "name": "ThreadCreated",
      "discriminator": [
        59,
        69,
        189,
        201,
        230,
        112,
        52,
        77
      ]
    },
    {
      "name": "ThreadFunded",
      "discriminator": [
        15,
        19,
        180,
        244,
        124,
        29,
        213,
        42
      ]
    }
  ],
  "errors": [
    {
      "code": 6000,
      "name": "Unauthorized",
      "msg": "Unauthorized to use this instruction. Check that you have the correct authority."
    },
    {
      "code": 6001,
      "name": "InvalidDurationMinimum",
      "msg": "Invalid duration minimum. Must be between configured minimum and the contract's duration maximum."
    },
    {
      "code": 6002,
      "name": "InvalidDurationMaximum",
      "msg": "Invalid duration maximum. Must be greater than or equal to duration minimum and less than config maximum."
    },
    {
      "code": 6003,
      "name": "InvalidRateCalculation",
      "msg": "Invalid payment amount (rate * payment periods). Check your calculation."
    },
    {
      "code": 6004,
      "name": "FleetAlreadyRented",
      "msg": "Fleet is already rented. Wait for current rental to end or be cancelled."
    },
    {
      "code": 6005,
      "name": "InvalidRate",
      "msg": "Invalid rental rate. Rate must be greater than or equal to 0 ATLAS."
    },
    {
      "code": 6006,
      "name": "InvalidPaymentFrequency",
      "msg": "Invalid payment frequency. Must be one of the allowed frequencies configured in the program."
    },
    {
      "code": 6007,
      "name": "InsufficientCancellationNotice",
      "msg": "Insufficient cancellation notice. Must cancel at least one payment period before rental ends."
    },
    {
      "code": 6008,
      "name": "DelayExceedsTimeRemaining",
      "msg": "Cancellation delay exceeds time remaining. cancel_delay must be <= time remaining until rental ends."
    },
    {
      "code": 6009,
      "name": "ContractClosed",
      "msg": "Contract is closed and no longer accepts rentals. Find another available fleet."
    },
    {
      "code": 6010,
      "name": "InvalidThreadContext",
      "msg": "Thread has invalid execution context. Thread may have been corrupted or incorrectly initialized."
    },
    {
      "code": 6011,
      "name": "RentalIsActive",
      "msg": "Rental is still active. Wait for it to expire or use rental_cancel to end early."
    },
    {
      "code": 6012,
      "name": "RentalStateExists",
      "msg": "Rental state still exists. Cannot reset fleet until rental state is properly closed."
    },
    {
      "code": 6013,
      "name": "InvalidFeeRate",
      "msg": "Invalid fee rate. Service fee must be <= 10% (1000 bps), base_bps must be > 0."
    },
    {
      "code": 6014,
      "name": "InvalidRentalDuration",
      "msg": "Invalid rental duration. Min >= 1 hour, max >= min, max <= 3 months."
    },
    {
      "code": 6015,
      "name": "UnauthorizedConfigUpdate",
      "msg": "Only the config authority can update settings. Check the authority address."
    },
    {
      "code": 6016,
      "name": "InvalidAtlasConversionRate",
      "msg": "Invalid ATLAS conversion rate. Must be greater than 0 (typically 100,000,000 for 1 ATLAS)."
    },
    {
      "code": 6017,
      "name": "AccountOwnedByWrongProgram",
      "msg": "Account is owned by a different program than expected. Check account initialization."
    },
    {
      "code": 6018,
      "name": "InvalidDurationMinimumAlignment",
      "msg": "Duration minimum must be a multiple of the payment frequency (e.g., daily = 86400 seconds)."
    },
    {
      "code": 6019,
      "name": "InvalidDurationMaximumAlignment",
      "msg": "Duration maximum must be a multiple of the payment frequency (e.g., daily = 86400 seconds)."
    },
    {
      "code": 6020,
      "name": "RentalExpired",
      "msg": "Rental has expired. Use rental_close instruction to process final payment and clean up."
    },
    {
      "code": 6021,
      "name": "InvalidThread",
      "msg": "Thread account does not match the rental state's thread reference. Use the correct thread."
    },
    {
      "code": 6022,
      "name": "RentalAlreadyCancelled",
      "msg": "Rental has already been cancelled. No further action needed."
    },
    {
      "code": 6023,
      "name": "InvalidStarbase",
      "msg": "Invalid starbase - doesn't match stored value in rental state."
    },
    {
      "code": 6024,
      "name": "InvalidStarbasePlayer",
      "msg": "Invalid starbase player - doesn't match stored value in rental state."
    },
    {
      "code": 6025,
      "name": "InactiveReferrer",
      "msg": "Referral is not active"
    },
    {
      "code": 6026,
      "name": "InvalidAuthority",
      "msg": "Invalid authority for this operation"
    },
    {
      "code": 6027,
      "name": "InvalidSplitPercentages",
      "msg": "Payment split percentages must sum to 100%"
    },
    {
      "code": 6028,
      "name": "InvalidSplitConfig",
      "msg": "Invalid payment split configuration"
    },
    {
      "code": 6029,
      "name": "ReferrerAlreadySet",
      "msg": "Referrer has already been set and cannot be changed"
    },
    {
      "code": 6030,
      "name": "ExpiredBorrowerStateRequired",
      "msg": "Please provide the expired borrower's state"
    },
    {
      "code": 6031,
      "name": "NoReferrerSet",
      "msg": "Borrower has not set a referrer"
    },
    {
      "code": 6032,
      "name": "ReferrerMismatch",
      "msg": "Referrer does not match borrower's chosen referrer"
    },
    {
      "code": 6033,
      "name": "InvalidRecipient",
      "msg": "Invalid recipient for claim"
    },
    {
      "code": 6034,
      "name": "NoClaimableBalance",
      "msg": "No claimable balance available"
    },
    {
      "code": 6035,
      "name": "InvalidTokenAccount",
      "msg": "Invalid token account - same as current"
    },
    {
      "code": 6036,
      "name": "InvalidOwnerTokenAccount",
      "msg": "Owner token account address does not match the address stored in rental state"
    },
    {
      "code": 6037,
      "name": "MissingThreadAccounts",
      "msg": "Missing required accounts for thread creation"
    },
    {
      "code": 6038,
      "name": "InvalidClaimSchedule",
      "msg": "Invalid claim schedule. Must be @daily, @weekly, or @monthly"
    },
    {
      "code": 6039,
      "name": "InvalidPercentage",
      "msg": "Invalid percentage value. Must be <= 10000 basis points (100%)"
    },
    {
      "code": 6040,
      "name": "FleetHasActiveReservation",
      "msg": "Fleet has an active reservation. Must wait for exclusive window to expire or be the reservation holder."
    },
    {
      "code": 6041,
      "name": "InvalidReservationHolder",
      "msg": "Invalid reservation holder specified"
    },
    {
      "code": 6042,
      "name": "ContractNotRented",
      "msg": "Contract is not currently rented. Only active rentals can be reserved."
    },
    {
      "code": 6043,
      "name": "NotReservationHolder",
      "msg": "Not the current reservation holder"
    },
    {
      "code": 6044,
      "name": "ExclusiveWindowActive",
      "msg": "Exclusive reservation window is active. Cannot process new reservation."
    },
    {
      "code": 6045,
      "name": "InsufficientPointsForClaim",
      "msg": "Insufficient points to claim the reservation"
    },
    {
      "code": 6046,
      "name": "InvalidNonce",
      "msg": "Invalid nonce for reservation PDA"
    },
    {
      "code": 6047,
      "name": "InvalidCloseTarget",
      "msg": "Invalid close target for reservation account"
    },
    {
      "code": 6048,
      "name": "ReservationStillActive",
      "msg": "Reservation is still active. Must wait for expiry."
    },
    {
      "code": 6049,
      "name": "InsufficientPointsToReserve",
      "msg": "Insufficient points to take over the reservation"
    },
    {
      "code": 6050,
      "name": "InvalidReservationRateMultiplier",
      "msg": "Invalid reservation rate multiplier. Must be at least 10000 basis points (100%)."
    },
    {
      "code": 6051,
      "name": "ExcessiveReservationRateMultiplier",
      "msg": "Excessive reservation rate multiplier. Cannot exceed 20000 basis points (200%)."
    },
    {
      "code": 6052,
      "name": "ReservationsDisabled",
      "msg": "Reservation system is disabled"
    },
    {
      "code": 6053,
      "name": "MissingRequiredAccount",
      "msg": "Missing required account for operation"
    },
    {
      "code": 6054,
      "name": "InvalidConfig",
      "msg": "Invalid configuration parameter"
    },
    {
      "code": 6055,
      "name": "InvalidDefender",
      "msg": "Invalid defender - does not match current reservation holder"
    },
    {
      "code": 6056,
      "name": "InvalidSplit",
      "msg": "Invalid split - split authority not found in payment splits"
    },
    {
      "code": 6057,
      "name": "InvalidReferralRate",
      "msg": "Invalid referral rate configuration"
    },
    {
      "code": 6058,
      "name": "ReferralNotEnabled",
      "msg": "Referrals are not enabled for this split"
    },
    {
      "code": 6059,
      "name": "NoFeesToClaim",
      "msg": "No fees available to claim"
    },
    {
      "code": 6060,
      "name": "ActiveRentalExist",
      "msg": "Cannot close account while active rental(s) exist"
    },
    {
      "code": 6061,
      "name": "CannotReleaseActiveRental",
      "msg": "Cannot release an active rental. Either rental state must be closed or contract must show no active rental."
    },
    {
      "code": 6062,
      "name": "CloseRentalBeforeContract",
      "msg": "Cannot close contract while rental is active. Close the rental first using rental_close."
    },
    {
      "code": 6063,
      "name": "InstantCancelNotAllowed",
      "msg": "Instant cancellation not allowed for this contract. Owner must enable allow_instant_cancel."
    },
    {
      "code": 6064,
      "name": "CancelNotAllowed",
      "msg": "Cancel delay equals time remaining — cancellation would have no effect."
    },
    {
      "code": 6065,
      "name": "ContractReservationsDisabled",
      "msg": "Reservations disabled for this contract. Owner has opted out of reservation system."
    },
    {
      "code": 6066,
      "name": "AtlasReservationRequiresTokenAccounts",
      "msg": "ATLAS reservation requires token accounts"
    },
    {
      "code": 6067,
      "name": "InvalidAtlasAmount",
      "msg": "Invalid ATLAS amount for reservation (must be > 0)"
    },
    {
      "code": 6068,
      "name": "ContractExists",
      "msg": "Contract exists for this fleet. Use rental_release instead of rental_invalidate."
    },
    {
      "code": 6069,
      "name": "FleetNotRented",
      "msg": "Fleet is not currently rented (sub_profile is empty)."
    },
    {
      "code": 6070,
      "name": "NotCrownedWinner",
      "msg": "Not the crowned winner. Only the winner from reservation can claim during the claim window."
    },
    {
      "code": 6071,
      "name": "ClaimWindowExpired",
      "msg": "Claim window has expired. Fleet is now available for anyone via rental_accept."
    },
    {
      "code": 6072,
      "name": "QueueFull",
      "msg": "Queue is full. Both rental slots are occupied. Wait for current rental to close."
    },
    {
      "code": 6073,
      "name": "AlreadyScheduled",
      "msg": "Thread already scheduled for this rental. Cannot schedule again."
    },
    {
      "code": 6074,
      "name": "NoActiveRental",
      "msg": "No active rental exists. Use rental_accept instead of rental_claim."
    },
    {
      "code": 6075,
      "name": "ThreadNotScheduled",
      "msg": "Thread not scheduled. Call rental_schedule first or use manual payment mode."
    },
    {
      "code": 6076,
      "name": "InvalidRentalState",
      "msg": "Invalid rental state. The provided rental is not tracked by this contract."
    },
    {
      "code": 6077,
      "name": "InvalidRentalSlot",
      "msg": "Invalid rental slot. Passed slot does not match expected free slot."
    },
    {
      "code": 6078,
      "name": "RentalNotQueued",
      "msg": "Rental is not in Queued status. Only Queued rentals can be activated."
    },
    {
      "code": 6079,
      "name": "PreviousRentalActive",
      "msg": "Previous rental slot is still active. Wait for it to be closed first."
    },
    {
      "code": 6080,
      "name": "InvalidVault",
      "msg": "Invalid vault address. Does not match config.slyvault."
    },
    {
      "code": 6081,
      "name": "InsufficientAtlasForRefund",
      "msg": "Insufficient ATLAS in contract to refund reservation. Owner must fund contract first."
    },
    {
      "code": 6082,
      "name": "ContractPendingClose",
      "msg": "Contract is pending close. No new rentals or reservations allowed."
    },
    {
      "code": 6083,
      "name": "InvalidReferrer",
      "msg": "Referrer account does not match stored referrer on rental state."
    },
    {
      "code": 6084,
      "name": "ThreadStillExists",
      "msg": "Thread still exists. Close thread first using close_contract_thread."
    },
    {
      "code": 6085,
      "name": "InvalidDiscountContext",
      "msg": "Discount authorization context does not match contract"
    },
    {
      "code": 6086,
      "name": "AtlasBidRequired",
      "msg": "ATLAS bid required to knock off an ATLAS reservation"
    },
    {
      "code": 6087,
      "name": "InsufficientBid",
      "msg": "Bid is insufficient to knock off the current reservation"
    },
    {
      "code": 6088,
      "name": "BidRequired",
      "msg": "A non-zero bid is required to knock off an existing reservation"
    },
    {
      "code": 6089,
      "name": "PointsOrAtlasBidOnly",
      "msg": "Bid must be either points or ATLAS, not both"
    },
    {
      "code": 6090,
      "name": "DiscountNotLocked",
      "msg": "Discount must be locked before it can be used in activation"
    },
    {
      "code": 6091,
      "name": "MissingReferrer",
      "msg": "Referrer account required when discount params are provided"
    },
    {
      "code": 6092,
      "name": "OwnerCannotRent",
      "msg": "Owner cannot rent their own fleet"
    },
    {
      "code": 6093,
      "name": "InsufficientFundsToCloseQueuedReservation",
      "msg": "Owner has insufficient ATLAS to refund the queued challenger's full bid. \\\n           Deposit more ATLAS into your token account and retry. The exact \\\n           shortfall amount is emitted in the program log."
    },
    {
      "code": 6094,
      "name": "InvalidInstructionData",
      "msg": "Fiber payload rejected. Index 0 must carry ProcessContract and index 1 \\\n           must carry CloseRental, both targeting this program; and when the \\\n           caller is the contract owner rather than admin, the payload must \\\n           name that same contract, and that same thread."
    }
  ],
  "types": [
    {
      "name": "BorrowerClaimed",
      "docs": [
        "Emitted when the borrower's managed token account drains to their wallet."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "borrower_state",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "BorrowerClosed",
      "docs": [
        "Emitted when a borrower closes their state PDA + managed token account."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "borrower_state",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "BorrowerCreated",
      "docs": [
        "Emitted when a borrower opens their state PDA + managed token account."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "borrower_state",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "BorrowerState",
      "docs": [
        "Borrower state for storing preferences",
        "PDA: [BORROWER_STATE_SEED, authority.key()]"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "docs": [
              "Account version for future migrations"
            ],
            "type": "u32"
          },
          {
            "name": "bump",
            "docs": [
              "PDA bump seed"
            ],
            "type": "u8"
          },
          {
            "name": "authority",
            "docs": [
              "Authority's wallet address (the borrower)"
            ],
            "type": "pubkey"
          },
          {
            "name": "active_rentals",
            "docs": [
              "Currently tracked fleet rentals for point accumulation (max 10)",
              "NOTE: This is a limited tracker - see active_rental_count for true total"
            ],
            "type": {
              "vec": "pubkey"
            }
          },
          {
            "name": "active_rental_count",
            "docs": [
              "Total count of active rentals (true accounting, not limited by vec capacity)",
              "This ensures we track the real number even if active_rentals vec is full"
            ],
            "type": "u16"
          },
          {
            "name": "capture_points",
            "docs": [
              "Current capture points accumulated"
            ],
            "type": "u64"
          },
          {
            "name": "managed_token_account",
            "docs": [
              "Managed token account for receiving ATLAS refunds from reservations",
              "Created via init_if_needed in rental_reserve"
            ],
            "type": "pubkey"
          },
          {
            "name": "created_at",
            "docs": [
              "Timestamp when borrower state was created"
            ],
            "type": "i64"
          },
          {
            "name": "updated_at",
            "docs": [
              "Timestamp when borrower state was last updated"
            ],
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "CargoStats",
      "docs": [
        "A ship's cargo stats"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "cargo_capacity",
            "type": "u32"
          },
          {
            "name": "fuel_capacity",
            "type": "u32"
          },
          {
            "name": "ammo_capacity",
            "type": "u32"
          },
          {
            "name": "ammo_consumption_rate",
            "type": "u32"
          },
          {
            "name": "food_consumption_rate",
            "type": "u32"
          },
          {
            "name": "mining_rate",
            "type": "u32"
          },
          {
            "name": "upgrade_rate",
            "type": "u32"
          },
          {
            "name": "cargo_transfer_rate",
            "type": "u32"
          },
          {
            "name": "tractor_beam_gather_rate",
            "type": "u32"
          }
        ]
      }
    },
    {
      "name": "ConfigState",
      "docs": [
        "Global configuration for the SRSLY rental program.",
        "",
        "PDA derived from `CONFIG_SEED`. Contains system-wide settings including fees,",
        "duration limits, and payment frequencies. Only config admin can update."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "docs": [
              "Account version for future migrations"
            ],
            "type": "u32"
          },
          {
            "name": "bump",
            "docs": [
              "PDA bump seed"
            ],
            "type": "u8"
          },
          {
            "name": "admin",
            "docs": [
              "Authority that can update configuration (admin)"
            ],
            "type": "pubkey"
          },
          {
            "name": "stardust_to_atlas",
            "docs": [
              "Stardust to ATLAS conversion rate (default: 100M = 1 ATLAS)"
            ],
            "type": "u64"
          },
          {
            "name": "service_fee_bps",
            "docs": [
              "Service fee in basis points (default: 1000 = 10%, max: 10%)"
            ],
            "type": "u64"
          },
          {
            "name": "base_bps",
            "docs": [
              "Basis points denominator (default: 10,000)"
            ],
            "type": "u16"
          },
          {
            "name": "rental_duration_min_seconds",
            "docs": [
              "Minimum rental duration (default: 3600s = 1 hour)"
            ],
            "type": "i64"
          },
          {
            "name": "rental_duration_max_seconds",
            "docs": [
              "Maximum rental duration (default: 8,035,200s ≈ 3 months)"
            ],
            "type": "i64"
          },
          {
            "name": "atlas_mint",
            "docs": [
              "ATLAS token mint for payments"
            ],
            "type": "pubkey"
          },
          {
            "name": "slyvault",
            "docs": [
              "slyvault vault pubkey for fee distribution"
            ],
            "type": "pubkey"
          },
          {
            "name": "reservations_enabled",
            "docs": [
              "Whether reservation system is enabled"
            ],
            "type": "bool"
          },
          {
            "name": "points_per_day",
            "docs": [
              "Points awarded per day of rental"
            ],
            "type": "u64"
          },
          {
            "name": "cancellation_penalty",
            "docs": [
              "Points lost on cancellation"
            ],
            "type": "u64"
          },
          {
            "name": "min_capture_threshold",
            "docs": [
              "Minimum points to capture any flag"
            ],
            "type": "u64"
          },
          {
            "name": "weight_base",
            "docs": [
              "Base for logarithm calculation (default: 10)"
            ],
            "type": "u32"
          },
          {
            "name": "weight_multiplier",
            "docs": [
              "Multiplier for log result (default: 1.5)"
            ],
            "type": "f32"
          },
          {
            "name": "max_weight",
            "docs": [
              "Maximum weight cap (default: 5)"
            ],
            "type": "u8"
          },
          {
            "name": "capture_rate_bps",
            "docs": [
              "Rate increase in basis points (min 10000 = 100%, default: 10500 = 105%)"
            ],
            "type": "u64"
          },
          {
            "name": "atlas_per_point",
            "docs": [
              "Stardust-of-ATLAS per stardust-of-points. With both in 8-decimal",
              "precision (1 ATLAS = 100M stardust, 1 point = 100M dust), this acts",
              "as the \"ATLAS per point\" ratio in human terms. Default 100 = 100",
              "ATLAS per point."
            ],
            "type": "u64"
          },
          {
            "name": "contested_multiplier_max_bps",
            "docs": [
              "Maximum floor multiplier in basis points (100 = 1×, 465 = 4.65×).",
              "Linear ramp from 1× (defender just reserved) to this value (snipe",
              "at activation). 100 disables the ramp. Default 465. Range 100..=10000."
            ],
            "type": "u16"
          },
          {
            "name": "rentals_completed",
            "docs": [
              "Lifetime count of rentals that ran their full term and closed",
              "normally via `process_rental_close`. Does NOT include cancellations",
              "(those keep status = Cancelled on the rental account). Monotonic.",
              "Not exposed in ConfigUpdateParams — admin can't tamper."
            ],
            "type": "u64"
          },
          {
            "name": "lookup_table",
            "docs": [
              "Address Lookup Table for transaction size optimization",
              "Contains static addresses used across all rental operations"
            ],
            "type": "pubkey"
          },
          {
            "name": "created_at",
            "docs": [
              "Timestamp when config was created"
            ],
            "type": "i64"
          },
          {
            "name": "updated_at",
            "docs": [
              "Timestamp when config was last updated"
            ],
            "type": "i64"
          },
          {
            "name": "stale_discount_per_day_bps",
            "docs": [
              "Daily stale-discount in bps (e.g. 200 = 2%/day off the stored rate",
              "per stale day). 0 disables the mechanic protocol-wide. The per-second",
              "rate is derived inline at `rental_accept` writeback time via",
              "`× stale_seconds / 86_400` so the discount tracks stale time at the",
              "same resolution the rest of the program prorates rentals (seconds)."
            ],
            "type": "u16"
          },
          {
            "name": "bonus_multiplier_bps",
            "docs": [
              "Multiplier applied to the same-currency knockoff bonus in",
              "`rental_reserve`. Custom scale: 100 = 1× (the pre-v3 formula, a",
              "no-op), 10_000 = 100×. The bonus is still clamped to the bid diff",
              "(`basis`) after scaling, so the contract stays solvent for any value;",
              "the dial only controls how quickly closeness × multiplier saturates",
              "that cap. Default 100. Range 100..=10_000. Migrated configs that",
              "predate this field MUST be written to 100 (not the realloc-zero 0,",
              "which would mean 0× = bonuses disabled)."
            ],
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "ConfigUpdateParams",
      "docs": [
        "Parameters for updating global configuration. All fields are optional",
        "for partial updates."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "admin",
            "docs": [
              "New admin address (admin)"
            ],
            "type": {
              "option": "pubkey"
            }
          },
          {
            "name": "stardust_to_atlas",
            "docs": [
              "Stardust to ATLAS conversion rate"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "service_fee_bps",
            "docs": [
              "Service fee in basis points (1000 = 10%)"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "base_bps",
            "docs": [
              "Basis points denominator"
            ],
            "type": {
              "option": "u16"
            }
          },
          {
            "name": "rental_duration_min_seconds",
            "docs": [
              "Minimum rental duration in seconds"
            ],
            "type": {
              "option": "i64"
            }
          },
          {
            "name": "rental_duration_max_seconds",
            "docs": [
              "Maximum rental duration in seconds"
            ],
            "type": {
              "option": "i64"
            }
          },
          {
            "name": "atlas_mint",
            "docs": [
              "ATLAS token mint address"
            ],
            "type": {
              "option": "pubkey"
            }
          },
          {
            "name": "reservations_enabled",
            "docs": [
              "Whether reservation system is enabled"
            ],
            "type": {
              "option": "bool"
            }
          },
          {
            "name": "points_per_day",
            "docs": [
              "Capture points awarded per day of rental"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "cancellation_penalty",
            "docs": [
              "Points penalty for cancelling a rental"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "min_capture_threshold",
            "docs": [
              "Minimum points needed to capture a flag"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "weight_base",
            "docs": [
              "Base for logarithmic weight calculation"
            ],
            "type": {
              "option": "u32"
            }
          },
          {
            "name": "weight_multiplier",
            "docs": [
              "Multiplier for weight calculation"
            ],
            "type": {
              "option": "f32"
            }
          },
          {
            "name": "max_weight",
            "docs": [
              "Maximum weight value"
            ],
            "type": {
              "option": "u8"
            }
          },
          {
            "name": "capture_rate_bps",
            "docs": [
              "Rate increase in basis points after capture (10000 = 100%, 11000 = 110%)"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "atlas_per_point",
            "docs": [
              "ATLAS lamports per point equivalent for reservation bidding"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "contested_multiplier_max_bps",
            "docs": [
              "Maximum multiplier on the contest minimum-bid floor as the queued",
              "reservation approaches `active_rental.end_time`. Custom scale where",
              "100 = 1× (disables ramp) and 10_000 = 100×. Range 100..=10_000."
            ],
            "type": {
              "option": "u16"
            }
          },
          {
            "name": "stale_discount_per_day_bps",
            "docs": [
              "Daily stale-discount in bps (e.g. 200 = 2%/day off the stored rate",
              "per idle day). 0 disables the mechanic protocol-wide. Combines with",
              "each contract's `stale_discount_max_bps` to cap the total decay.",
              "Range 0..=10_000."
            ],
            "type": {
              "option": "u16"
            }
          },
          {
            "name": "bonus_multiplier_bps",
            "docs": [
              "Multiplier applied to the same-currency knockoff bonus. Custom scale",
              "where 100 = 1× (no-op, matches the pre-v3 formula) and 10_000 = 100×.",
              "The bonus stays hard-capped at the challenger/defender bid diff",
              "(`basis`), so larger values just reach that cap sooner. Range",
              "100..=10_000."
            ],
            "type": {
              "option": "u16"
            }
          }
        ]
      }
    },
    {
      "name": "ContractCloseQueued",
      "docs": [
        "Emitted when `contract_close` sets `to_close = true` because a live",
        "active rental is blocking immediate closure. The contract will close",
        "automatically when that rental ends."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "ContractClosed",
      "docs": [
        "Emitted when `contract_close` actually closes the contract account."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "ContractCreated",
      "docs": [
        "Emitted when a contract is created (fleet listed for rental)."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          },
          {
            "name": "fleet",
            "type": "pubkey"
          },
          {
            "name": "game_id",
            "type": "pubkey"
          },
          {
            "name": "rate",
            "type": "u64"
          },
          {
            "name": "duration_min_seconds",
            "type": "i64"
          },
          {
            "name": "duration_max_seconds",
            "type": "i64"
          },
          {
            "name": "cancel_delay_min",
            "type": "i64"
          },
          {
            "name": "reservations_disabled",
            "type": "bool"
          },
          {
            "name": "contested_threshold",
            "type": "u8"
          },
          {
            "name": "stale_discount_max_bps",
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "ContractFiberDoctored",
      "docs": [
        "Emitted on `contract_doctor_fiber` — one per fiber rewritten to bring a",
        "thread's `fiber_ids` back into agreement with the accounts they name."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "thread",
            "type": "pubkey"
          },
          {
            "name": "fiber",
            "type": "pubkey"
          },
          {
            "name": "fiber_index",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "ContractState",
      "docs": [
        "Rental contract defining terms for a specific fleet.",
        "",
        "PDA derived from `RENTAL_CONTRACT_SEED` and fleet public key. Integrates with SAGE",
        "for fleet ownership and rental permissions."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "docs": [
              "Account version for future migrations"
            ],
            "type": "u32"
          },
          {
            "name": "bump",
            "docs": [
              "PDA bump seed"
            ],
            "type": "u8"
          },
          {
            "name": "to_close",
            "docs": [
              "Whether contract is flagged for closure (owner wants to close but rental active)"
            ],
            "type": "bool"
          },
          {
            "name": "rate",
            "docs": [
              "Rental rate per day in Stardust (100M Stardust = 1 ATLAS)"
            ],
            "type": "u64"
          },
          {
            "name": "duration_min_seconds",
            "docs": [
              "Minimum rental duration in seconds"
            ],
            "type": "i64"
          },
          {
            "name": "duration_max_seconds",
            "docs": [
              "Maximum rental duration in seconds"
            ],
            "type": "i64"
          },
          {
            "name": "cancel_delay_min",
            "docs": [
              "Minimum cancellation delay in seconds (0 = instant cancel allowed)",
              "Default: 0 (instant cancels allowed by default)"
            ],
            "type": "i64"
          },
          {
            "name": "weight",
            "docs": [
              "Fleet demand weight (1-5, based on reservation activity)"
            ],
            "type": "u8"
          },
          {
            "name": "reservations_disabled",
            "docs": [
              "Whether reservations are disabled for this contract (owner opt-out)",
              "Default: false (reservations allowed)"
            ],
            "type": "bool"
          },
          {
            "name": "owner",
            "docs": [
              "Fleet owner who receives payments"
            ],
            "type": "pubkey"
          },
          {
            "name": "fleet",
            "docs": [
              "Fleet associated with this contract"
            ],
            "type": "pubkey"
          },
          {
            "name": "game_id",
            "docs": [
              "Game ID for SAGE integration"
            ],
            "type": "pubkey"
          },
          {
            "name": "owner_profile",
            "docs": [
              "Owner's Star Atlas game profile"
            ],
            "type": "pubkey"
          },
          {
            "name": "active_rental",
            "docs": [
              "Active rental PDA address (system_program::ID = empty)"
            ],
            "type": "pubkey"
          },
          {
            "name": "queued_rental",
            "docs": [
              "Queued rental PDA address (system_program::ID = empty)"
            ],
            "type": "pubkey"
          },
          {
            "name": "delegate",
            "docs": [
              "Delegated address that can update rate on behalf of owner",
              "Default: None (only owner can update rate)"
            ],
            "type": {
              "option": "pubkey"
            }
          },
          {
            "name": "thread",
            "docs": [
              "Per-contract automation thread (system_program::ID = no thread)"
            ],
            "type": "pubkey"
          },
          {
            "name": "trigger",
            "docs": [
              "Default trigger for thread settlement"
            ],
            "type": {
              "defined": {
                "name": "Trigger"
              }
            }
          },
          {
            "name": "managed_token_account",
            "docs": [
              "Contract's managed token account (ATA of contract PDA)"
            ],
            "type": "pubkey"
          },
          {
            "name": "total_earned",
            "docs": [
              "Per-contract ATLAS earned (lifetime total)"
            ],
            "type": "u64"
          },
          {
            "name": "owner_claimable",
            "docs": [
              "Accumulated ATLAS earned by owner, not yet claimed"
            ],
            "type": "u64"
          },
          {
            "name": "fee_claimable",
            "docs": [
              "Accumulated service fees, not yet paid to slyvault (flushed at rental_close)"
            ],
            "type": "u64"
          },
          {
            "name": "contested_threshold",
            "docs": [
              "Owner-configured number of contests required before the next",
              "activation increases `rate` by `capture_rate_bps`. 0 disables capture-rate",
              "entirely (rate never auto-increments). 1..=10 enables it. Default 1."
            ],
            "type": "u8"
          },
          {
            "name": "contested_count",
            "docs": [
              "Contests accumulated since the last rate increase. Resets on increase and",
              "when a rental cycle completes without an activation."
            ],
            "type": "u8"
          },
          {
            "name": "created_at",
            "docs": [
              "Timestamp when contract was created"
            ],
            "type": "i64"
          },
          {
            "name": "updated_at",
            "docs": [
              "Timestamp when contract was last updated"
            ],
            "type": "i64"
          },
          {
            "name": "stale_discount_max_bps",
            "docs": [
              "Per-contract cap on the stale-discount writeback (bps).",
              "0      → mechanic disabled for this contract (rate never decays).",
              "5_000  → up to 50% discount; rate floored at 50% of its stored value.",
              "10_000 → no per-contract cap; the writeback still clamps at the",
              "program-wide minimum rate (`config.stardust_to_atlas`).",
              "Owner-settable at `contract_create` + `contract_update`. Default",
              "0 — opt-in only."
            ],
            "type": "u16"
          },
          {
            "name": "stale_since",
            "docs": [
              "Unix-seconds anchor for the stale-discount decay. Stamped at",
              "`contract_create` (init time) and re-stamped inside",
              "`process_rental_close` whenever `active_rental` clears to",
              "`system_program::ID`. Cleared to 0 inside `rental_accept` once the",
              "decay branch fires (sentinel: \"rate already decayed for this stale",
              "window, don't re-decay\"). When 0, no decay applies regardless of",
              "elapsed time."
            ],
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "ContractUpdateParams",
      "docs": [
        "Parameters for updating contract settings. All fields are optional."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rate",
            "docs": [
              "Rental rate per day in Stardust"
            ],
            "type": {
              "option": "u64"
            }
          },
          {
            "name": "duration_min_seconds",
            "docs": [
              "Minimum rental duration in seconds"
            ],
            "type": {
              "option": "i64"
            }
          },
          {
            "name": "duration_max_seconds",
            "docs": [
              "Maximum rental duration in seconds"
            ],
            "type": {
              "option": "i64"
            }
          },
          {
            "name": "cancel_delay_min",
            "docs": [
              "Minimum cancellation delay in seconds (0 = instant cancel allowed)"
            ],
            "type": {
              "option": "i64"
            }
          },
          {
            "name": "reservations_disabled",
            "docs": [
              "Whether reservations are disabled for this contract"
            ],
            "type": {
              "option": "bool"
            }
          },
          {
            "name": "to_close",
            "docs": [
              "Whether the contract is flagged for deferred closure"
            ],
            "type": {
              "option": "bool"
            }
          },
          {
            "name": "contested_threshold",
            "docs": [
              "Number of contests that must accumulate before the next activation",
              "applies `capture_rate_bps`. 0 disables capture-rate entirely;",
              "1..=10 enables it with the chosen sensitivity. Default 1."
            ],
            "type": {
              "option": "u8"
            }
          },
          {
            "name": "stale_discount_max_bps",
            "docs": [
              "Per-contract cap on the stale-discount writeback (bps).",
              "0      → mechanic disabled for this contract (rate never decays).",
              "5_000  → up to 50% discount; rate floored at 50% of its stored value.",
              "10_000 → no per-contract cap; the writeback still clamps at the",
              "program-wide minimum rate (`config.stardust_to_atlas`).",
              "Range 0..=10_000. Owner can update at any time; the new cap",
              "applies on the next `rental_accept` writeback."
            ],
            "type": {
              "option": "u16"
            }
          }
        ]
      }
    },
    {
      "name": "ContractUpdated",
      "docs": [
        "Emitted after `contract_update` applies term changes.",
        "Carries the post-update values so indexers don't need to diff state."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          },
          {
            "name": "rate",
            "type": "u64"
          },
          {
            "name": "duration_min_seconds",
            "type": "i64"
          },
          {
            "name": "duration_max_seconds",
            "type": "i64"
          },
          {
            "name": "cancel_delay_min",
            "type": "i64"
          },
          {
            "name": "reservations_disabled",
            "type": "bool"
          }
        ]
      }
    },
    {
      "name": "DelegateSet",
      "docs": [
        "Emitted when the contract owner sets or clears the delegate."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          },
          {
            "name": "delegate",
            "type": {
              "option": "pubkey"
            }
          }
        ]
      }
    },
    {
      "name": "FeesPaid",
      "docs": [
        "Emitted when accumulated fees are flushed to slyvault.",
        "Captures fee/discount split."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "fee_collected",
            "type": "u64"
          },
          {
            "name": "discount",
            "type": "u64"
          },
          {
            "name": "discount_bps",
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "Fleet",
      "docs": [
        "A SAGE fleet."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "game_id",
            "type": "pubkey"
          },
          {
            "name": "owner_profile",
            "type": "pubkey"
          },
          {
            "name": "fleet_ships",
            "type": "pubkey"
          },
          {
            "name": "sub_profile",
            "type": {
              "defined": {
                "name": "OptionalNonSystemPubkey"
              }
            }
          },
          {
            "name": "sub_profile_invalidator",
            "type": "pubkey"
          },
          {
            "name": "faction",
            "type": "u8"
          },
          {
            "name": "fleet_label",
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          },
          {
            "name": "ship_counts",
            "type": {
              "defined": {
                "name": "ShipCounts"
              }
            }
          },
          {
            "name": "warp_cooldown_expires_at",
            "type": "i64"
          },
          {
            "name": "scan_cooldown_expires_at",
            "type": "i64"
          },
          {
            "name": "stats",
            "type": {
              "defined": {
                "name": "ShipStats"
              }
            }
          },
          {
            "name": "cargo_hold",
            "type": "pubkey"
          },
          {
            "name": "fuel_tank",
            "type": "pubkey"
          },
          {
            "name": "ammo_bank",
            "type": "pubkey"
          },
          {
            "name": "update_id",
            "type": "u64"
          },
          {
            "name": "bump",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "MiscStats",
      "docs": [
        "A ship's miscellaneous stats"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "required_crew",
            "type": "u16"
          },
          {
            "name": "passenger_capacity",
            "type": "u16"
          },
          {
            "name": "crew_count",
            "type": "u16"
          },
          {
            "name": "rented_crew",
            "type": "u16"
          },
          {
            "name": "respawn_time",
            "type": "u16"
          },
          {
            "name": "scan_cool_down",
            "type": "u16"
          },
          {
            "name": "sdu_per_scan",
            "type": "u32"
          },
          {
            "name": "scan_cost",
            "type": "u32"
          },
          {
            "name": "placeholder",
            "type": "u32"
          },
          {
            "name": "placeholder2",
            "type": "u32"
          },
          {
            "name": "placeholder3",
            "type": "u32"
          }
        ]
      }
    },
    {
      "name": "MovementStats",
      "docs": [
        "A ship's movement stats"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "subwarp_speed",
            "type": "u32"
          },
          {
            "name": "warp_speed",
            "type": "u32"
          },
          {
            "name": "max_warp_distance",
            "type": "u16"
          },
          {
            "name": "warp_cool_down",
            "type": "u16"
          },
          {
            "name": "subwarp_fuel_consumption_rate",
            "type": "u32"
          },
          {
            "name": "warp_fuel_consumption_rate",
            "type": "u32"
          },
          {
            "name": "planet_exit_fuel_amount",
            "type": "u32"
          }
        ]
      }
    },
    {
      "name": "OptionalNonSystemPubkey",
      "docs": [
        "A pubkey sized option that is none if set to the system program."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "key",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "OwnerPaid",
      "docs": [
        "Emitted when owner_claimable is transferred to owner's ATA.",
        "Covers both auto-transfer (contract_process) and manual claim (contract_claim)."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner",
            "type": "pubkey"
          },
          {
            "name": "amount",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "RentalAccepted",
      "docs": [
        "Emitted when a rental is accepted (direct or from reservation).",
        "Captures all inputs needed to verify settlement math."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "escrow",
            "type": "u64"
          },
          {
            "name": "rate",
            "type": "u64"
          },
          {
            "name": "service_fee",
            "type": "u64"
          },
          {
            "name": "fee_bps",
            "type": "u16"
          },
          {
            "name": "start_time",
            "type": "i64"
          },
          {
            "name": "end_time",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "RentalCancelled",
      "docs": [
        "Emitted when borrower cancels early.",
        "Captures the three-way split: owner / fee / refund."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "owner_earned",
            "type": "u64"
          },
          {
            "name": "fee_collected",
            "type": "u64"
          },
          {
            "name": "refund",
            "type": "u64"
          },
          {
            "name": "new_end_time",
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "RentalClosed",
      "docs": [
        "Emitted when rental_close finalizes (after expiry or cancel).",
        "Captures final escrow reconciliation + CTF points."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "owner_earned",
            "type": "u64"
          },
          {
            "name": "fee_collected",
            "type": "u64"
          },
          {
            "name": "points_awarded",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "RentalSettled",
      "docs": [
        "Emitted on each settlement tick (mid-period and final).",
        "Tracks incremental owner earnings and escrow drawdown."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "owner_earned",
            "type": "u64"
          },
          {
            "name": "escrow_remaining",
            "type": "u64"
          },
          {
            "name": "is_final",
            "type": "bool"
          }
        ]
      }
    },
    {
      "name": "RentalState",
      "docs": [
        "Active rental session between a fleet owner and borrower.",
        "",
        "Handles automated payments via Clockwork threads and tracks rental lifecycle.",
        "PDA derived from contract address and role seed (active or queued)."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "docs": [
              "Account version for future migrations"
            ],
            "type": "u32"
          },
          {
            "name": "bump",
            "docs": [
              "PDA bump seed"
            ],
            "type": "u8"
          },
          {
            "name": "borrower",
            "docs": [
              "Borrower public key (receives refunds if cancelled)"
            ],
            "type": "pubkey"
          },
          {
            "name": "borrower_state",
            "docs": [
              "BorrowerState PDA for this rental (single source of borrower info)"
            ],
            "type": "pubkey"
          },
          {
            "name": "borrower_profile",
            "docs": [
              "Borrower's SAGE profile (stored for frontend convenience)"
            ],
            "type": "pubkey"
          },
          {
            "name": "contract",
            "docs": [
              "Reference to the rental contract"
            ],
            "type": "pubkey"
          },
          {
            "name": "rate",
            "docs": [
              "Gross rate per day in Stardust (= contract.rate at accept/reserve time)"
            ],
            "type": "u64"
          },
          {
            "name": "last_payment",
            "docs": [
              "Timestamp of last pro-rata payment settlement (base for next calculation)"
            ],
            "type": "i64"
          },
          {
            "name": "escrow",
            "docs": [
              "ATLAS deposited as escrow for this rental (in stardust)"
            ],
            "type": "u64"
          },
          {
            "name": "start_time",
            "docs": [
              "Rental start timestamp"
            ],
            "type": "i64"
          },
          {
            "name": "end_time",
            "docs": [
              "Rental end timestamp"
            ],
            "type": "i64"
          },
          {
            "name": "service_fee",
            "docs": [
              "Total fee target for post-rental collection (total * fee_bps / base_bps)"
            ],
            "type": "u64"
          },
          {
            "name": "fee_bps",
            "docs": [
              "Fee basis points snapshotted from config (for cancel proration)"
            ],
            "type": "u16"
          },
          {
            "name": "referrer",
            "docs": [
              "Referrer affiliate member for deferred fee tracking"
            ],
            "type": {
              "option": "pubkey"
            }
          },
          {
            "name": "discount_bps",
            "docs": [
              "Discount basis points verified at accept time (0 = no discount)"
            ],
            "type": "u16"
          },
          {
            "name": "bid_points",
            "docs": [
              "Points bid for reservation contest comparison (0 if ATLAS bid)"
            ],
            "type": "u64"
          },
          {
            "name": "bid_atlas",
            "docs": [
              "ATLAS premium bid for reservation contest (0 if points bid)"
            ],
            "type": "u64"
          },
          {
            "name": "cancel_delay_min",
            "docs": [
              "Minimum cancellation delay in seconds, snapshotted from",
              "`contract.cancel_delay_min` at accept/reserve time. Locks the",
              "borrower's worst-case notice period — owner raising the contract",
              "value mid-rental cannot tighten this. Owner lowering the contract",
              "value flows through (cancel uses the lesser of the two)."
            ],
            "type": "i64"
          },
          {
            "name": "status",
            "docs": [
              "Rental lifecycle status (Available, Queued, Active)"
            ],
            "type": {
              "defined": {
                "name": "RentalStatus"
              }
            }
          },
          {
            "name": "updated_at",
            "docs": [
              "Timestamp when rental was last updated (used as base for next pro-rata payment)"
            ],
            "type": "i64"
          },
          {
            "name": "created_at",
            "docs": [
              "Timestamp when rental was created"
            ],
            "type": "i64"
          }
        ]
      }
    },
    {
      "name": "RentalStatus",
      "docs": [
        "Rental lifecycle status"
      ],
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "Available"
          },
          {
            "name": "Queued"
          },
          {
            "name": "Active"
          },
          {
            "name": "Cancelled"
          }
        ]
      }
    },
    {
      "name": "ReservationForceClosed",
      "docs": [
        "Emitted when the owner closes a contract out from under a queued",
        "reservation. The challenger is made whole on their gross stake —",
        "`refund` = `from_contract` + `from_owner`, where `from_owner` is the",
        "shortfall the owner tops up (the bonus already paid out during the",
        "contract's auction history). No CTF points are awarded: the rental",
        "never happened."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "refund",
            "type": "u64"
          },
          {
            "name": "from_contract",
            "type": "u64"
          },
          {
            "name": "from_owner",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "ReservationKnockedOff",
      "docs": [
        "Emitted when a challenger displaces an existing queued reservation."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "displaced_borrower",
            "type": "pubkey"
          },
          {
            "name": "refund",
            "type": "u64"
          },
          {
            "name": "bonus",
            "type": "u64"
          },
          {
            "name": "new_borrower",
            "type": "pubkey"
          },
          {
            "name": "new_bid_atlas",
            "type": "u64"
          },
          {
            "name": "new_bid_points",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "ReservationPlaced",
      "docs": [
        "Emitted on first-time reservation (queue was Available).",
        "The promotion to active rental is signaled by `RentalAccepted`."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "rental_state",
            "type": "pubkey"
          },
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "borrower",
            "type": "pubkey"
          },
          {
            "name": "bid_atlas",
            "type": "u64"
          },
          {
            "name": "bid_points",
            "type": "u64"
          },
          {
            "name": "escrow",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "Schedule",
      "docs": [
        "Tracks the execution schedule - when the thread last ran and when it should run next",
        "(was: TriggerContext)"
      ],
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "OnChange",
            "fields": [
              {
                "name": "prev",
                "type": "u64"
              }
            ]
          },
          {
            "name": "Timed",
            "fields": [
              {
                "name": "prev",
                "type": "i64"
              },
              {
                "name": "next",
                "type": "i64"
              }
            ]
          },
          {
            "name": "Block",
            "fields": [
              {
                "name": "prev",
                "type": "u64"
              },
              {
                "name": "next",
                "type": "u64"
              }
            ]
          }
        ]
      }
    },
    {
      "name": "SerializableAccountMeta",
      "docs": [
        "Serializable version of AccountMeta"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "pubkey",
            "type": "pubkey"
          },
          {
            "name": "is_signer",
            "type": "bool"
          },
          {
            "name": "is_writable",
            "type": "bool"
          }
        ]
      }
    },
    {
      "name": "SerializableInstruction",
      "docs": [
        "Serializable version of Solana's Instruction for easier handling"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "program_id",
            "type": "pubkey"
          },
          {
            "name": "accounts",
            "type": {
              "vec": {
                "defined": {
                  "name": "SerializableAccountMeta"
                }
              }
            }
          },
          {
            "name": "data",
            "type": "bytes"
          }
        ]
      }
    },
    {
      "name": "ShipCounts",
      "docs": [
        "Ship counts for a fleet."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "total",
            "type": "u32"
          },
          {
            "name": "updated",
            "type": "u32"
          },
          {
            "name": "xx_small",
            "type": "u16"
          },
          {
            "name": "x_small",
            "type": "u16"
          },
          {
            "name": "small",
            "type": "u16"
          },
          {
            "name": "medium",
            "type": "u16"
          },
          {
            "name": "large",
            "type": "u16"
          },
          {
            "name": "capital",
            "type": "u16"
          },
          {
            "name": "commander",
            "type": "u16"
          },
          {
            "name": "titan",
            "type": "u16"
          }
        ]
      }
    },
    {
      "name": "ShipStats",
      "docs": [
        "A ship's stats"
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "movement_stats",
            "type": {
              "defined": {
                "name": "MovementStats"
              }
            }
          },
          {
            "name": "cargo_stats",
            "type": {
              "defined": {
                "name": "CargoStats"
              }
            }
          },
          {
            "name": "misc_stats",
            "type": {
              "defined": {
                "name": "MiscStats"
              }
            }
          }
        ]
      }
    },
    {
      "name": "Signal",
      "docs": [
        "Signal from a fiber about what should happen after execution.",
        "Emitted via set_return_data(), received by thread program via get_return_data()."
      ],
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "None"
          },
          {
            "name": "Chain"
          },
          {
            "name": "Close"
          },
          {
            "name": "Repeat"
          },
          {
            "name": "Next",
            "fields": [
              {
                "name": "index",
                "type": "u8"
              }
            ]
          },
          {
            "name": "Update",
            "fields": [
              {
                "name": "paused",
                "type": {
                  "option": "bool"
                }
              },
              {
                "name": "trigger",
                "type": {
                  "option": {
                    "defined": {
                      "name": "Trigger"
                    }
                  }
                }
              },
              {
                "name": "index",
                "type": {
                  "option": "u8"
                }
              }
            ]
          }
        ]
      }
    },
    {
      "name": "StaleDecayApplied",
      "docs": [
        "Emitted on the stale branch of `rental_accept` when the stale-discount",
        "writeback actually moves the stored `rate`. Mutually exclusive with",
        "the contested bump (the demand branch). `stale_seconds` is the gap",
        "between the previous close and this accept — what the borrower's",
        "discount is computed against."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "old_rate",
            "type": "u64"
          },
          {
            "name": "new_rate",
            "type": "u64"
          },
          {
            "name": "stale_seconds",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "Thread",
      "docs": [
        "Tracks the current state of a transaction thread on Solana."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "bump",
            "type": "u8"
          },
          {
            "name": "authority",
            "type": "pubkey"
          },
          {
            "name": "id",
            "type": "bytes"
          },
          {
            "name": "name",
            "type": "string"
          },
          {
            "name": "created_at",
            "type": "i64"
          },
          {
            "name": "trigger",
            "type": {
              "defined": {
                "name": "Trigger"
              }
            }
          },
          {
            "name": "schedule",
            "type": {
              "defined": {
                "name": "Schedule"
              }
            }
          },
          {
            "name": "fiber_ids",
            "type": "bytes"
          },
          {
            "name": "fiber_cursor",
            "type": "u8"
          },
          {
            "name": "fiber_next_id",
            "type": "u8"
          },
          {
            "name": "fiber_signal",
            "type": {
              "defined": {
                "name": "Signal"
              }
            }
          },
          {
            "name": "paused",
            "type": "bool"
          },
          {
            "name": "exec_count",
            "type": "u64"
          },
          {
            "name": "last_executor",
            "type": "pubkey"
          },
          {
            "name": "nonce_account",
            "type": "pubkey"
          },
          {
            "name": "last_nonce",
            "type": "string"
          },
          {
            "name": "close_fiber",
            "type": "bytes"
          }
        ]
      }
    },
    {
      "name": "ThreadClosed",
      "docs": [
        "Emitted when an automation thread is closed."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "thread",
            "type": "pubkey"
          }
        ]
      }
    },
    {
      "name": "ThreadCreated",
      "docs": [
        "Emitted when a per-contract automation thread is created."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "thread",
            "type": "pubkey"
          },
          {
            "name": "payments_freq",
            "type": "string"
          },
          {
            "name": "funding",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "ThreadFunded",
      "docs": [
        "Emitted on `contract_thread_update` — captures both funding deltas and",
        "optional schedule changes."
      ],
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "contract",
            "type": "pubkey"
          },
          {
            "name": "thread",
            "type": "pubkey"
          },
          {
            "name": "added",
            "type": "u64"
          },
          {
            "name": "new_payments_freq",
            "type": {
              "option": "string"
            }
          }
        ]
      }
    },
    {
      "name": "Trigger",
      "docs": [
        "The triggering conditions of a thread."
      ],
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "Account",
            "fields": [
              {
                "name": "address",
                "docs": [
                  "The address of the account to monitor."
                ],
                "type": "pubkey"
              },
              {
                "name": "offset",
                "docs": [
                  "The byte offset of the account data to monitor."
                ],
                "type": "u64"
              },
              {
                "name": "size",
                "docs": [
                  "The size of the byte slice to monitor (must be less than 1kb)"
                ],
                "type": "u64"
              }
            ]
          },
          {
            "name": "Immediate",
            "fields": [
              {
                "name": "jitter",
                "docs": [
                  "Optional jitter in seconds to prevent thundering herd (0 = no jitter)"
                ],
                "type": "u64"
              }
            ]
          },
          {
            "name": "Timestamp",
            "fields": [
              {
                "name": "unix_ts",
                "type": "i64"
              },
              {
                "name": "jitter",
                "docs": [
                  "Optional jitter in seconds to spread execution across a window (0 = no jitter)"
                ],
                "type": "u64"
              }
            ]
          },
          {
            "name": "Interval",
            "fields": [
              {
                "name": "seconds",
                "docs": [
                  "Interval in seconds between executions"
                ],
                "type": "i64"
              },
              {
                "name": "skippable",
                "docs": [
                  "Boolean value indicating whether triggering moments may be skipped"
                ],
                "type": "bool"
              },
              {
                "name": "jitter",
                "docs": [
                  "Optional jitter in seconds to prevent thundering herd (0 = no jitter)"
                ],
                "type": "u64"
              }
            ]
          },
          {
            "name": "Cron",
            "fields": [
              {
                "name": "schedule",
                "docs": [
                  "The schedule in cron syntax. Value must be parsable by the `antegen_cron` package."
                ],
                "type": "string"
              },
              {
                "name": "skippable",
                "docs": [
                  "Boolean value indicating whether triggering moments may be skipped if they are missed (e.g. due to network downtime).",
                  "If false, any \"missed\" triggering moments will simply be executed as soon as the network comes back online."
                ],
                "type": "bool"
              },
              {
                "name": "jitter",
                "docs": [
                  "Optional jitter in seconds to spread execution across a window (0 = no jitter)"
                ],
                "type": "u64"
              }
            ]
          },
          {
            "name": "Slot",
            "fields": [
              {
                "name": "slot",
                "type": "u64"
              }
            ]
          },
          {
            "name": "Epoch",
            "fields": [
              {
                "name": "epoch",
                "type": "u64"
              }
            ]
          }
        ]
      }
    }
  ],
  "constants": [
    {
      "name": "THREAD_SEED",
      "docs": [
        "Seed for payment thread PDAs (Antegen/Clockwork)"
      ],
      "type": "bytes",
      "value": "[116, 104, 114, 101, 97, 100]"
    }
  ]
}