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" }
]
}