ShainShain/docs
Shain/Docs/Instructions
Engine

Instructions

Every on-chain call Shain exposes. Each section is complete: signature, accounts, errors, compute units.

initialize

One-time bootstrap. The authority signs, the program creates the config PDA and the treasury ATA, and future sessions derive from this config.

signaturerust
pub fn initialize(
    ctx: Context<Initialize>,
    params: InitializeParams,
) -> Result<()>;

pub struct InitializeParams {
    pub session_duration: Option<i64>,  // default 86_400
    pub session_fee: Option<u64>,        // default 1_000_000
    pub min_holding: Option<u64>,        // default 10_000_000
}
AccountSignerWritableNotes
authorityPays for init
shain_mintThe $SHAIN SPL mint
shain_configPDA, created here
treasury_authorityPDA, owns the ATA
treasury_ataATA, created here
system_programFor account creation
token_programSPL Token classic
associated_token_programFor ATA create
rentSysvar

CU cost: ~4,128 · IX size: 137 B · Errors: InvalidSessionDuration if duration is outside [60, 2_592_000] seconds.

start_session

The holder opens a 24-hour window. Verifies balance, charges the session fee, writes the session PDA.

signaturerust
pub fn start_session(ctx: Context<StartSession>) -> Result<()>;
AccountSignerWritableNotes
userThe holder
shain_configlifetime counters
shain_minthas_one check
user_token_accountholder's SHAIN ATA
treasury_atafee destination
shain_sessioninit_if_needed
token_programfor fee CPI
system_programfor PDA init

CU cost: ~3,812 · IX size: 88 B · Errors: TokenAccountOwnerMismatch, TokenAccountMintMismatch, InsufficientHolding, SessionStillActive, Overflow.

gated_action

The integration hook. Downstream dapps CPI here to prove the caller has a live session before performing their private action.

signaturerust
pub fn gated_action(ctx: Context<GatedAction>, tag: u64) -> Result<()>;
AccountSignerWritableNotes
usersession owner
shain_sessioncounter++

CU cost: ~1,914 · IX size: 22 B · Errors: Unauthorized (constraint), SessionNotFound, SessionExpired, Overflow.

close_session

After expiry, any signer may close. Rent is refunded to the session's original owner regardless of who initiates.

signaturerust
pub fn close_session(ctx: Context<CloseSession>) -> Result<()>;
AccountSignerWritableNotes
userclose = user rent refund
shain_sessionclosed

CU cost: ~2,206 · IX size: 16 B · Errors: Unauthorized, SessionStillActive.