silas
silas
mass
unit price
hull
state
odometer

interface

download
{
  "version": "0.1.0",
  "name": "silas",
  "metadata": {
    "address": "",
    "name": "silas",
    "spec": "0.1.0",
    "description": "a six legged rack body driven by a token extensions transfer hook. every transfer is an input. there is no clock.",
    "deploy_notes": [
      "anchor build",
      "anchor deploy --provider.cluster mainnet",
      "anchor idl init --filepath target/idl/silas.json <program_id>",
      "write program metadata name silas with the program metadata program so explorers render the name",
      "verify with anchor verify <program_id> so the source hash is public",
      "run initialize_extra_account_meta_list once",
      "run initialize_body once with the mint"
    ]
  },
  "instructions": [
    {
      "name": "initializeBody",
      "docs": ["creates body, six legs, pip, fee reserve, power cell. writes the seed genome. sets state idle."],
      "accounts": [
        { "name": "deployer", "isMut": true, "isSigner": true },
        { "name": "mint", "isMut": false, "isSigner": false },
        { "name": "body", "isMut": true, "isSigner": false, "pda": { "seeds": [ { "kind": "const", "value": "silas" }, { "kind": "account", "path": "mint" } ] } },
        { "name": "leg0", "isMut": true, "isSigner": false },
        { "name": "leg1", "isMut": true, "isSigner": false },
        { "name": "leg2", "isMut": true, "isSigner": false },
        { "name": "leg3", "isMut": true, "isSigner": false },
        { "name": "leg4", "isMut": true, "isSigner": false },
        { "name": "leg5", "isMut": true, "isSigner": false },
        { "name": "pip", "isMut": true, "isSigner": false, "pda": { "seeds": [ { "kind": "const", "value": "pip" }, { "kind": "account", "path": "mint" } ] } },
        { "name": "feeReserve", "isMut": true, "isSigner": false },
        { "name": "powerCell", "isMut": true, "isSigner": false },
        { "name": "tokenProgram", "isMut": false, "isSigner": false },
        { "name": "systemProgram", "isMut": false, "isSigner": false },
        { "name": "rent", "isMut": false, "isSigner": false }
      ],
      "args": [
        { "name": "seedGenome", "type": { "array": ["u8", 256] } },
        { "name": "hullMaximum", "type": "u64" }
      ]
    },
    {
      "name": "initializeExtraAccountMetaList",
      "docs": ["registers the accounts the transfer hook needs."],
      "accounts": [
        { "name": "deployer", "isMut": true, "isSigner": true },
        { "name": "mint", "isMut": false, "isSigner": false },
        { "name": "extraAccountMetaList", "isMut": true, "isSigner": false },
        { "name": "body", "isMut": false, "isSigner": false },
        { "name": "pip", "isMut": false, "isSigner": false },
        { "name": "feeReserve", "isMut": false, "isSigner": false },
        { "name": "powerCell", "isMut": false, "isSigner": false },
        { "name": "systemProgram", "isMut": false, "isSigner": false }
      ],
      "args": []
    },
    {
      "name": "transferHook",
      "docs": [
        "called by the token program on every transfer.",
        "order of operations: classify, bands, step or shuffle, power, antennae, hull, heat, genome, face, map, then rules in this order: stall, vent, lock or fault, stride, scrap."
      ],
      "accounts": [
        { "name": "sourceToken", "isMut": false, "isSigner": false },
        { "name": "mint", "isMut": false, "isSigner": false },
        { "name": "destinationToken", "isMut": false, "isSigner": false },
        { "name": "owner", "isMut": false, "isSigner": false },
        { "name": "extraAccountMetaList", "isMut": false, "isSigner": false },
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "sourceLeg", "isMut": true, "isSigner": false },
        { "name": "destinationLeg", "isMut": true, "isSigner": false },
        { "name": "pip", "isMut": true, "isSigner": false },
        { "name": "feeReserve", "isMut": true, "isSigner": false },
        { "name": "powerCell", "isMut": true, "isSigner": false },
        { "name": "pool", "isMut": false, "isSigner": false },
        { "name": "instructionsSysvar", "isMut": false, "isSigner": false }
      ],
      "args": [
        { "name": "amount", "type": "u64" }
      ]
    },
    {
      "name": "sealPlatter",
      "docs": ["internal. writes one platter for one leg at a stride."],
      "accounts": [
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "leg", "isMut": true, "isSigner": false },
        { "name": "platter", "isMut": true, "isSigner": false },
        { "name": "systemProgram", "isMut": false, "isSigner": false }
      ],
      "args": [
        { "name": "legIndex", "type": "u8" },
        { "name": "stride", "type": "u32" },
        { "name": "scrapped", "type": "bool" }
      ]
    },
    {
      "name": "unloadCrate",
      "docs": ["internal. distributes the oldest crate to the holders of the lightest leg, pro rata."],
      "accounts": [
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "crate", "isMut": true, "isSigner": false },
        { "name": "crateVault", "isMut": true, "isSigner": false },
        { "name": "destinedLeg", "isMut": false, "isSigner": false },
        { "name": "tokenProgram", "isMut": false, "isSigner": false }
      ],
      "args": [
        { "name": "stride", "type": "u32" }
      ]
    },
    {
      "name": "vent",
      "docs": ["internal. burns heat from the fee reserve and resets heat."],
      "accounts": [
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "mint", "isMut": true, "isSigner": false },
        { "name": "feeReserve", "isMut": true, "isSigner": false },
        { "name": "tokenProgram", "isMut": false, "isSigner": false }
      ],
      "args": []
    },
    {
      "name": "lockBuyback",
      "docs": ["internal. buys from the pool with the fee reserve and burns the result. size is the smaller antenna gain capped at the reserve balance."],
      "accounts": [
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "mint", "isMut": true, "isSigner": false },
        { "name": "feeReserve", "isMut": true, "isSigner": false },
        { "name": "pool", "isMut": true, "isSigner": false },
        { "name": "poolTokenVault", "isMut": true, "isSigner": false },
        { "name": "poolQuoteVault", "isMut": true, "isSigner": false },
        { "name": "poolProgram", "isMut": false, "isSigner": false },
        { "name": "tokenProgram", "isMut": false, "isSigner": false }
      ],
      "args": [
        { "name": "size", "type": "u64" }
      ]
    },
    {
      "name": "scrap",
      "docs": ["internal. the skull plate rule. burns reserve and cell, seals final platters, copies state to pip, sets state scrapped."],
      "accounts": [
        { "name": "body", "isMut": true, "isSigner": false },
        { "name": "mint", "isMut": true, "isSigner": false },
        { "name": "pip", "isMut": true, "isSigner": false },
        { "name": "feeReserve", "isMut": true, "isSigner": false },
        { "name": "powerCell", "isMut": true, "isSigner": false },
        { "name": "leg0", "isMut": true, "isSigner": false },
        { "name": "leg1", "isMut": true, "isSigner": false },
        { "name": "leg2", "isMut": true, "isSigner": false },
        { "name": "leg3", "isMut": true, "isSigner": false },
        { "name": "leg4", "isMut": true, "isSigner": false },
        { "name": "leg5", "isMut": true, "isSigner": false },
        { "name": "tokenProgram", "isMut": false, "isSigner": false }
      ],
      "args": []
    },
    {
      "name": "initializeSuccessor",
      "docs": ["creates a new body for a new mint from pip's stored genome."],
      "accounts": [
        { "name": "deployer", "isMut": true, "isSigner": true },
        { "name": "oldPip", "isMut": true, "isSigner": false },
        { "name": "newMint", "isMut": false, "isSigner": false },
        { "name": "newBody", "isMut": true, "isSigner": false },
        { "name": "newPip", "isMut": true, "isSigner": false },
        { "name": "systemProgram", "isMut": false, "isSigner": false }
      ],
      "args": []
    }
  ],
  "accounts": [
    {
      "name": "Body",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "mint", "type": "publicKey" },
          { "name": "state", "type": { "defined": "BodyState" } },
          { "name": "hull", "type": "u64" },
          { "name": "hullMaximum", "type": "u64" },
          { "name": "power", "type": "u64" },
          { "name": "heat", "type": "u64" },
          { "name": "odometer", "type": "u64" },
          { "name": "shuffles", "type": "u64" },
          { "name": "groundedTripod", "type": "u8" },
          { "name": "x", "type": "i32" },
          { "name": "y", "type": "i32" },
          { "name": "heading", "type": "u8" },
          { "name": "cellsVisited", "type": "u32" },
          { "name": "antennaA", "type": "i128" },
          { "name": "antennaB", "type": "i128" },
          { "name": "faceBits", "type": "u32" },
          { "name": "genome", "type": { "array": ["u8", 256] } },
          { "name": "strides", "type": "u32" },
          { "name": "vents", "type": "u32" },
          { "name": "locks", "type": "u32" },
          { "name": "faults", "type": "u32" },
          { "name": "stalls", "type": "u32" },
          { "name": "cratesOnBack", "type": "u32" },
          { "name": "cratesUnloaded", "type": "u32" },
          { "name": "burnedByVenting", "type": "u64" },
          { "name": "burnedByLock", "type": "u64" },
          { "name": "queuedCrossings", "type": "u64" },
          { "name": "feeReserve", "type": "publicKey" },
          { "name": "netVolumeSinceStep", "type": "i128" },
          { "name": "damageEvents", "type": "u32" },
          { "name": "repairEvents", "type": "u32" },
          { "name": "lastStallLength", "type": "u32" },
          { "name": "successor", "type": { "option": "publicKey" } }
        ]
      }
    },
    {
      "name": "Leg",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "mint", "type": "publicKey" },
          { "name": "index", "type": "u8" },
          { "name": "load", "type": "u64" },
          { "name": "bearing", "type": "u32" },
          { "name": "floor", "type": "u32" },
          { "name": "faulted", "type": "bool" },
          { "name": "platterCount", "type": "u32" }
        ]
      }
    },
    {
      "name": "Platter",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "legIndex", "type": "u8" },
          { "name": "stride", "type": "u32" },
          { "name": "load", "type": "u64" },
          { "name": "bearing", "type": "u32" },
          { "name": "odometer", "type": "u64" },
          { "name": "scrapped", "type": "bool" }
        ]
      }
    },
    {
      "name": "Pip",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "mint", "type": "publicKey" },
          { "name": "survivalCount", "type": "u32" },
          { "name": "genomeCopy", "type": { "array": ["u8", 256] } },
          { "name": "x", "type": "i32" },
          { "name": "y", "type": "i32" },
          { "name": "heading", "type": "u8" },
          { "name": "odometer", "type": "u64" },
          { "name": "faceRing", "type": { "array": ["u32", 64] } },
          { "name": "faceRingHead", "type": "u8" },
          { "name": "log", "type": { "array": [ { "defined": "LogEntry" }, 256 ] } },
          { "name": "logHead", "type": "u8" },
          { "name": "logCount", "type": "u32" }
        ]
      }
    },
    {
      "name": "Crate",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "mint", "type": "publicKey" },
          { "name": "stride", "type": "u32" },
          { "name": "amount", "type": "u64" },
          { "name": "destinedLeg", "type": "u8" },
          { "name": "unloaded", "type": "bool" }
        ]
      }
    }
  ],
  "types": [
    {
      "name": "BodyState",
      "type": {
        "kind": "enum",
        "variants": [
          { "name": "Idle" },
          { "name": "Saturated" },
          { "name": "Starved" },
          { "name": "Overdriven" },
          { "name": "Faulted" },
          { "name": "Locked" },
          { "name": "Scrapped" }
        ]
      }
    },
    {
      "name": "LogKind",
      "type": {
        "kind": "enum",
        "variants": [
          { "name": "Fault" },
          { "name": "Lock" },
          { "name": "Vent" },
          { "name": "StallBegin" },
          { "name": "StallEnd" },
          { "name": "HeadingChange" },
          { "name": "Stride" },
          { "name": "LegFault" },
          { "name": "LegRecover" },
          { "name": "CrateLoad" },
          { "name": "CrateUnload" },
          { "name": "Scrap" }
        ]
      }
    },
    {
      "name": "LogEntry",
      "type": {
        "kind": "struct",
        "fields": [
          { "name": "kind", "type": { "defined": "LogKind" } },
          { "name": "odometer", "type": "u64" },
          { "name": "value", "type": "u64" },
          { "name": "aux", "type": "u8" }
        ]
      }
    },
    {
      "name": "Genome",
      "docs": [
        "the 256 byte genome is read as parameters at these byte offsets.",
        "band edges: bytes 0 to 11, six u16 values, each mapped to edge = previous edge + 1 + value * supply / 65536 / 8.",
        "bearing floors: bytes 12 to 17, six u8 values, each mapped to floor = 2 + value / 4.",
        "antenna a decay: bytes 18 and 19, u16 mapped to 0.80 + value / 65536 * 0.19.",
        "antenna b decay: bytes 20 and 21, u16 mapped the same way.",
        "antenna a threshold: bytes 22 to 25, u32 mapped to supply / 4096 + value modulo (supply / 256).",
        "antenna b threshold: bytes 26 and 27, u16 mapped to 4 + value / 512.",
        "damage fraction: byte 28, mapped to 1/64 + value / 255 * 7/64.",
        "repair per stride: byte 29, mapped to hull maximum * (1 + value / 32) / 100.",
        "fault damage: byte 30, mapped to hull maximum * (2 + value / 16) / 100.",
        "power cost per step: bytes 31 and 32, u16 mapped to supply / 2097152 + value.",
        "power share of fee: byte 33, mapped to 10 + value / 4 percent.",
        "vent threshold: bytes 34 to 37, u32 mapped to supply / 2048 + value modulo (supply / 512).",
        "cargo split: bytes 38, 39, 40, three u8 normalized to sum to one, as buyback, burn, cargo.",
        "bytes 41 to 255 are reserved and still mutate; they are displayed but not read as parameters in this version."
      ],
      "type": { "kind": "struct", "fields": [ { "name": "raw", "type": { "array": ["u8", 256] } } ] }
    }
  ],
  "events": [
    { "name": "Step", "fields": [ { "name": "odometer", "type": "u64", "index": false }, { "name": "fromLeg", "type": "u8", "index": false }, { "name": "toLeg", "type": "u8", "index": false }, { "name": "x", "type": "i32", "index": false }, { "name": "y", "type": "i32", "index": false }, { "name": "heading", "type": "u8", "index": false } ] },
    { "name": "Stride", "fields": [ { "name": "stride", "type": "u32", "index": false }, { "name": "odometer", "type": "u64", "index": false } ] },
    { "name": "Vented", "fields": [ { "name": "amount", "type": "u64", "index": false }, { "name": "odometer", "type": "u64", "index": false } ] },
    { "name": "Locked", "fields": [ { "name": "size", "type": "u64", "index": false }, { "name": "odometer", "type": "u64", "index": false } ] },
    { "name": "Faulted", "fields": [ { "name": "damage", "type": "u64", "index": false }, { "name": "odometer", "type": "u64", "index": false } ] },
    { "name": "Stalled", "fields": [ { "name": "queued", "type": "u64", "index": false }, { "name": "odometer", "type": "u64", "index": false } ] },
    { "name": "CrateLoaded", "fields": [ { "name": "stride", "type": "u32", "index": false }, { "name": "amount", "type": "u64", "index": false } ] },
    { "name": "CrateUnloaded", "fields": [ { "name": "stride", "type": "u32", "index": false }, { "name": "leg", "type": "u8", "index": false }, { "name": "amount", "type": "u64", "index": false } ] },
    { "name": "Scrapped", "fields": [ { "name": "odometer", "type": "u64", "index": false }, { "name": "survivalCount", "type": "u32", "index": false } ] }
  ],
  "errors": [
    { "code": 6000, "name": "NotPool", "msg": "the pool account does not match the configured pool" },
    { "code": 6001, "name": "BodyScrapped", "msg": "the body is scrapped and no longer records" },
    { "code": 6002, "name": "LegMismatch", "msg": "leg account does not match the computed band" },
    { "code": 6003, "name": "PlatterExists", "msg": "a platter for this leg and stride already exists" },
    { "code": 6004, "name": "CrateAlreadyUnloaded", "msg": "this crate was already unloaded" },
    { "code": 6005, "name": "NoCrate", "msg": "there is no crate to unload" },
    { "code": 6006, "name": "ReserveEmpty", "msg": "the fee reserve is empty" },
    { "code": 6007, "name": "NotInternal", "msg": "this instruction may only be invoked by the hook path" },
    { "code": 6008, "name": "GenomeRange", "msg": "a genome parameter mapped outside its safe range, which should be impossible" },
    { "code": 6009, "name": "WrongMint", "msg": "account belongs to a different mint" }
  ]
}