export type ShadowDriveUserStaking = { version: "2.0.0"; name: "shadow_drive_user_staking"; constants: [ { name: "INITIAL_STORAGE_COST"; type: "u64"; value: "1_073_741_824"; }, { name: "MAX_IDENTIFIER_SIZE"; type: { defined: "usize"; }; value: "64"; }, { name: "INITIAL_STORAGE_AVAILABLE"; type: "u128"; value: "109_951_162_777_600"; }, { name: "BYTES_PER_GIB"; type: "u32"; value: "1_073_741_824"; }, { name: "MAX_ACCOUNT_SIZE"; type: "u64"; value: "1_099_511_627_776"; }, { name: "MIN_ACCOUNT_SIZE"; type: "u64"; value: "1024"; }, { name: "MAX_FILENAME_SIZE"; type: { defined: "usize"; }; value: "32"; }, { name: "SHA256_HASH_SIZE"; type: { defined: "usize"; }; value: "256 / 8"; }, { name: "MAX_URL_SIZE"; type: { defined: "usize"; }; value: "256"; }, { name: "DELETION_GRACE_PERIOD"; type: "u8"; value: "1"; }, { name: "UNSTAKE_TIME_PERIOD"; type: "i64"; value: "0 * 24 * 60 * 60"; }, { name: "UNSTAKE_EPOCH_PERIOD"; type: "u64"; value: "1"; }, { name: "INITIAL_CRANK_FEE_BPS"; type: "u16"; value: "100"; } ]; instructions: [ { name: "initializeConfig"; docs: [ "Context: This is for admin use. This is to be called first, as this initializes Shadow Drive access on-chain!", "Function: The primary function of this is to initialize an account that stores the configuration/parameters of the storage program on-chain, e.g. admin pubkeys, storage cost." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds the SPL's staking and slashing policy.", "This is the account that signs transactions on behalf of the program to", "distribute staking rewards." ]; }, { name: "admin1"; isMut: true; isSigner: true; docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority" ]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent Program"]; } ]; args: [ { name: "uploader"; type: "publicKey"; }, { name: "admin2"; type: { option: "publicKey"; }; } ]; }, { name: "updateConfig"; docs: [ "Context: This is for admin use.", "Function: The primary function of this is update the storage_config account which stores Shadow Drive parameters on-chain, e.g. admin pubkeys, storage cost." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds storage config parameters and admin pubkeys." ]; }, { name: "admin"; isMut: true; isSigner: true; docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority" ]; } ]; args: [ { name: "newStorageCost"; type: { option: "u64"; }; }, { name: "newStorageAvailable"; type: { option: "u128"; }; }, { name: "newAdmin2"; type: { option: "publicKey"; }; }, { name: "newMaxAcctSize"; type: { option: "u64"; }; }, { name: "newMinAcctSize"; type: { option: "u64"; }; }, { name: "newShadesPerGbEpoch"; type: { option: "u64"; }; } ]; }, { name: "mutableFees"; docs: [ "Context: This is for admin use.", "Function: The primary function of this is to toggle fees for mutable account storage on and off." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds the SPL's staking and slashing policy.", "This is the account that signs transactions on behalf of the program to", "distribute staking rewards." ]; }, { name: "admin"; isMut: true; isSigner: true; docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority" ]; } ]; args: [ { name: "shadesPerGbPerEpoch"; type: { option: "u64"; }; }, { name: "crankBps"; type: { option: "u32"; }; } ]; }, { name: "initializeAccount"; docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to initialize a storage account with some specified number of bytes." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds the storage configuration, including current cost per byte," ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's `StorageAccount` information." ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["This is the token in question for staking."]; }, { name: "owner1"; isMut: true; isSigner: true; docs: [ "This is the user who is initializing the storage account", "and is automatically added as an admin" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: [ "Uploader needs to sign as this txn", "needs to be fulfilled on the middleman server", "to create the ceph bucket" ]; }, { name: "owner1TokenAccount"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent Program"]; } ]; args: [ { name: "identifier"; type: "string"; }, { name: "storage"; type: "u64"; }, { name: "owner2"; type: { option: "publicKey"; }; } ]; }, { name: "initializeAccount2"; docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to initialize a storage account with some specified number of bytes." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds the storage configuration, including current cost per byte," ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's storage account information.", "Upgraded to `StorageAccountV2`." ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["This is the token in question for staking."]; }, { name: "owner1"; isMut: true; isSigner: true; docs: [ "This is the user who is initializing the storage account", "and is automatically added as an admin" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: [ "Uploader needs to sign as this txn", "needs to be fulfilled on the middleman server", "to create the ceph bucket" ]; }, { name: "owner1TokenAccount"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent Program"]; } ]; args: [ { name: "identifier"; type: "string"; }, { name: "storage"; type: "u64"; } ]; }, { name: "updateAccount"; docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to change the amount of storage they have for this storage account." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: [ { name: "identifier"; type: { option: "string"; }; }, { name: "owner2"; type: { option: "publicKey"; }; } ]; }, { name: "updateAccount2"; docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to change the amount of storage they have for this storage account." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: [ { name: "identifier"; type: { option: "string"; }; } ]; }, { name: "requestDeleteAccount"; docs: [ "Context: This is user-facing. This is to be done after our upload server verifies all is well.", "Function: This stores the file metadata + location on-chain.", "Context: This is user-facing, but requires our uploader's signature. This is to be done after our upload server verifies all is well.", "Function: This updates the file metadata on-chain upon user edits.", "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if parent account is marked as immutable.", "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if account is marked as immutable." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: []; }, { name: "requestDeleteAccount2"; docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if account is marked as immutable." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: []; }, { name: "unmarkDeleteAccount"; docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if parent account is marked as immutable.", "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if account is marked as immutable." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: ["Stake account associated with storage account"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: []; }, { name: "unmarkDeleteAccount2"; docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if account is marked as immutable." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: ["Stake account associated with storage account"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; } ]; args: []; }, { name: "redeemRent"; docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `File` account and updates storage available in user's storage account.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period.", "Context: This is user-facing.", "Function: This deletes the corresponding `File` account, allowing user to redeem SOL rent in v1.5" ]; accounts: [ { name: "storageAccount"; isMut: false; isSigner: false; docs: ["Parent storage account."]; }, { name: "file"; isMut: true; isSigner: false; docs: ["File account to be closed"]; }, { name: "owner"; isMut: true; isSigner: true; docs: ["File owner, user"]; } ]; args: []; }, { name: "deleteAccount"; docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `StorageAccount` account and return's user funds.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "owner"; isMut: true; isSigner: false; docs: [ "File owner, user", "Also, our uploader keys are signing this transaction so presuamably we would only provide a good key.", "We also may not need this account at all." ]; }, { name: "shdwPayer"; isMut: true; isSigner: false; docs: [ "This is the user's token account, presumably with which they staked" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Admin/uploader"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "deleteAccount2"; docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `StorageAccount` account and return's user funds.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "owner"; isMut: true; isSigner: false; docs: [ "File owner, user", "Also, our uploader keys are signing this transaction so presuamably we would only provide a good key.", "We also may not need this account at all." ]; }, { name: "shdwPayer"; isMut: true; isSigner: false; docs: [ "This is the user's token account, presumably with which they staked" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Admin/uploader"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "makeAccountImmutable"; docs: [ "Context: This is user-facing.", "Function: This marks the corresponding `StorageAccount` account as immutable,", "and transfers all funds from `stake_account` to operator emissions wallet." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", "Requires mutability to update global storage counter." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: [ "Parent storage account.", "Requires mutability to update user storage account storage counter." ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token account is the SHDW operator emissions wallet"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on make immutable"]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: ["User's token account"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "associatedTokenProgram"; isMut: false; isSigner: false; docs: ["Associated Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "makeAccountImmutable2"; docs: [ "Context: This is user-facing.", "Function: This marks the corresponding `StorageAccount` account as immutable,", "and transfers all funds from `stake_account` to operator emissions wallet." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", "Requires mutability to update global storage counter." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: [ "Parent storage account.", "Requires mutability to update user storage account storage counter." ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token account is the SHDW operator emissions wallet"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: ["User's token account"]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on make immutable"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "associatedTokenProgram"; isMut: false; isSigner: false; docs: ["Associated Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "badCsam"; docs: [ "Context: This is for admin use.", "Function: Upon a bad csam scan, rugs user,", "deleting storage account and transferring funds to emissions wallet" ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "uploader"; isMut: true; isSigner: true; docs: ["Admin/uploader"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageAvailable"; type: "u64"; } ]; }, { name: "badCsam2"; docs: [ "Context: This is for admin use.", "Function: Upon a bad csam scan, rugs user,", "deleting storage account and transferring funds to emissions wallet" ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "userInfo"; isMut: true; isSigner: false; docs: [ "This account is a PDA that holds a user's info (not specific to one storage account)." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "uploader"; isMut: true; isSigner: true; docs: ["Admin/uploader"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageAvailable"; type: "u64"; } ]; }, { name: "increaseStorage"; docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on increase storage"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "additionalStorage"; type: "u64"; } ]; }, { name: "increaseStorage2"; docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on increase storage"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "additionalStorage"; type: "u64"; } ]; }, { name: "increaseImmutableStorage"; docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate, after having marked an account as immutable" ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["Wallet that receives storage fees"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on increase storage"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "additionalStorage"; type: "u64"; } ]; }, { name: "increaseImmutableStorage2"; docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate, after having marked an account as immutable" ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["Wallet that receives storage fees"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on increase storage"]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "additionalStorage"; type: "u64"; } ]; }, { name: "decreaseStorage"; docs: [ "Context: This is user facing.", "Function: allows user to reduce storage, up to current available storage,", "and begins an unstake ticket." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "unstakeInfo"; isMut: true; isSigner: false; docs: ["Account which stores time, epoch last unstaked"]; }, { name: "unstakeAccount"; isMut: true; isSigner: false; docs: ["Account which stores SHDW when unstaking"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: ["User's ATA"]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on decrease storage"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["Token account holding operator emission funds"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent Program"]; } ]; args: [ { name: "removeStorage"; type: "u64"; }, { name: "storageUsed"; type: "u64"; } ]; }, { name: "decreaseStorage2"; docs: [ "Context: This is user facing.", "Function: allows user to reduce storage, up to current available storage,", "and begins an unstake ticket." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "unstakeInfo"; isMut: true; isSigner: false; docs: ["Account which stores time, epoch last unstaked"]; }, { name: "unstakeAccount"; isMut: true; isSigner: false; docs: ["Account which stores SHDW when unstaking"]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: ["User's ATA"]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "uploader"; isMut: false; isSigner: true; docs: ["Uploader needs to sign off on decrease storage"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["Token account holding operator emission funds"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; }, { name: "rent"; isMut: false; isSigner: false; docs: ["Rent Program"]; } ]; args: [ { name: "removeStorage"; type: "u64"; }, { name: "storageUsed"; type: "u64"; } ]; }, { name: "claimStake"; docs: [ "Context: This is user facing.", "Function: allows user to claim stake from unstake ticket.", "Fails if user has not waited an appropriate amount of time." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account. Only used here for the key"]; }, { name: "unstakeInfo"; isMut: true; isSigner: false; docs: [ "Account which stores time, epoch last unstaked. Close upon successful unstake." ]; }, { name: "unstakeAccount"; isMut: true; isSigner: false; docs: [ "Account which stores SHDW when unstaking. Close upon successful unstake." ]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Programn"]; } ]; args: []; }, { name: "claimStake2"; docs: [ "Context: This is user facing.", "Function: allows user to claim stake from unstake ticket.", "Fails if user has not waited an appropriate amount of time." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account. Only used here for the key"]; }, { name: "unstakeInfo"; isMut: true; isSigner: false; docs: [ "Account which stores time, epoch last unstaked. Close upon successful unstake." ]; }, { name: "unstakeAccount"; isMut: true; isSigner: false; docs: [ "Account which stores SHDW when unstaking. Close upon successful unstake." ]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Programn"]; } ]; args: []; }, { name: "crank"; docs: [ "Context: This is a public function, callable by anyone.", "Function: collects fees from user stake account and", "sends it to the operator emissions wallet." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "cranker"; isMut: true; isSigner: true; docs: ["Cranker"]; }, { name: "crankerAta"; isMut: true; isSigner: false; docs: ["Cranker's ATA"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "crank2"; docs: [ "Context: This is a public function, callable by anyone.", "Function: collects fees from user stake account and", "sends it to the operator emissions wallet." ]; accounts: [ { name: "storageConfig"; isMut: true; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "cranker"; isMut: true; isSigner: true; docs: ["Cranker"]; }, { name: "crankerAta"; isMut: true; isSigner: false; docs: ["Cranker's ATA"]; }, { name: "emissionsWallet"; isMut: true; isSigner: false; docs: ["This token accountis the SHDW operator emissions wallet"]; }, { name: "tokenMint"; isMut: true; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: [ { name: "storageUsed"; type: "u64"; } ]; }, { name: "refreshStake"; docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: []; }, { name: "refreshStake2"; docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion." ]; accounts: [ { name: "storageConfig"; isMut: false; isSigner: false; docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys." ]; }, { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Parent storage account."]; }, { name: "owner"; isMut: true; isSigner: true; docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer." ]; }, { name: "ownerAta"; isMut: true; isSigner: false; docs: [ "This is the user's token account with which they are staking" ]; }, { name: "stakeAccount"; isMut: true; isSigner: false; docs: [ "This token account serves as the account which holds user's stake for file storage." ]; }, { name: "tokenMint"; isMut: false; isSigner: false; docs: ["Token mint account"]; }, { name: "systemProgram"; isMut: false; isSigner: false; docs: ["System Program"]; }, { name: "tokenProgram"; isMut: false; isSigner: false; docs: ["Token Program"]; } ]; args: []; }, { name: "migrateStep1"; docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion." ]; accounts: [ { name: "storageAccount"; isMut: true; isSigner: false; docs: ["Account to be migrated"]; }, { name: "migration"; isMut: true; isSigner: false; docs: ["Migration helper PDA"]; }, { name: "owner"; isMut: true; isSigner: true; docs: ["User that is migrating"]; }, { name: "systemProgram"; isMut: false; isSigner: false; } ]; args: []; }, { name: "migrateStep2"; docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion." ]; accounts: [ { name: "storageAccount"; isMut: true; isSigner: false; docs: ["New account"]; }, { name: "migration"; isMut: true; isSigner: false; docs: ["Migration helper PDA"]; }, { name: "owner"; isMut: true; isSigner: true; docs: ["User that is migrating"]; }, { name: "systemProgram"; isMut: false; isSigner: false; } ]; args: []; } ]; accounts: [ { name: "unstakeInfo"; type: { kind: "struct"; fields: [ { name: "timeLastUnstaked"; type: "i64"; }, { name: "epochLastUnstaked"; type: "u64"; }, { name: "unstaker"; type: "publicKey"; } ]; }; }, { name: "storageAccount"; type: { kind: "struct"; fields: [ { name: "isStatic"; docs: [ "Immutable boolean to track what kind of storage account this is.", "NOTE: Not used in current implementation w/ non-dynamic storage payments" ]; type: "bool"; }, { name: "initCounter"; docs: [ "Flag on whether storage account is public (usable by anyone)", "Counter tracking how many files have been initialized" ]; type: "u32"; }, { name: "delCounter"; docs: ["Counter tracking how many files have been deleted"]; type: "u32"; }, { name: "immutable"; docs: [ "Boolean to track whether storage account (and all child File accounts) are immutable" ]; type: "bool"; }, { name: "toBeDeleted"; docs: ["Delete flag"]; type: "bool"; }, { name: "deleteRequestEpoch"; docs: ["Delete request epoch"]; type: "u32"; }, { name: "storage"; docs: ["Number of bytes of storage associated with this account"]; type: "u64"; }, { name: "storageAvailable"; docs: ["Bytes available for use"]; type: "u64"; }, { name: "owner1"; docs: ["Primary owner of StorageAccount (immutable)"]; type: "publicKey"; }, { name: "owner2"; docs: ["Optional owner 2"]; type: "publicKey"; }, { name: "shdwPayer"; docs: ["Pubkey of the token account that staked SHDW"]; type: "publicKey"; }, { name: "accountCounterSeed"; docs: ["Counter at time of initialization"]; type: "u32"; }, { name: "totalCostOfCurrentStorage"; docs: ["Total shades paid for current box size"]; type: "u64"; }, { name: "totalFeesPaid"; type: "u64"; }, { name: "creationTime"; docs: ["Time of storage account creation"]; type: "u32"; }, { name: "creationEpoch"; docs: ["Time of storage account creation"]; type: "u32"; }, { name: "lastFeeEpoch"; docs: ["The last epoch through which the user paid"]; type: "u32"; }, { name: "identifier"; docs: [ "Some unique identifier that the user provides.", "Serves as a seed for storage account PDA." ]; type: "string"; } ]; }; }, { name: "storageAccountV2"; type: { kind: "struct"; fields: [ { name: "immutable"; docs: [ "Boolean to track whether storage account (and all child File accounts) are immutable" ]; type: "bool"; }, { name: "toBeDeleted"; docs: ["Delete flag"]; type: "bool"; }, { name: "deleteRequestEpoch"; docs: ["Delete request epoch"]; type: "u32"; }, { name: "storage"; docs: ["Number of bytes of storage associated with this account"]; type: "u64"; }, { name: "owner1"; docs: ["Primary owner of StorageAccount (immutable)"]; type: "publicKey"; }, { name: "accountCounterSeed"; docs: [ "Pubkey of the token account that staked SHDW", "Counter at time of initialization" ]; type: "u32"; }, { name: "creationTime"; docs: ["Time of storage account creation"]; type: "u32"; }, { name: "creationEpoch"; docs: ["Time of storage account creation"]; type: "u32"; }, { name: "lastFeeEpoch"; docs: ["The last epoch through which the user paid"]; type: "u32"; }, { name: "identifier"; docs: [ "Some unique identifier that the user provides.", "Serves as a seed for storage account PDA." ]; type: "string"; } ]; }; }, { name: "userInfo"; type: { kind: "struct"; fields: [ { name: "accountCounter"; docs: ["Total number of storage accounts the user has with us"]; type: "u32"; }, { name: "delCounter"; docs: ["Total number of storage accounts that have been deleted"]; type: "u32"; }, { name: "agreedToTos"; docs: ["Boolean denoting that the user agreed to terms of service"]; type: "bool"; }, { name: "lifetimeBadCsam"; docs: [ "Boolean denoting whether this pubkey has ever had a bad scam scan" ]; type: "bool"; } ]; }; }, { name: "storageConfig"; type: { kind: "struct"; fields: [ { name: "shadesPerGib"; docs: ["Storage costs in shades per GiB"]; type: "u64"; }, { name: "storageAvailable"; docs: ["Total storage available (or remaining)"]; type: "u128"; }, { name: "tokenAccount"; docs: [ "Pubkey of SHDW token account that holds storage fees/stake" ]; type: "publicKey"; }, { name: "admin2"; docs: ["Optional Admin 2"]; type: "publicKey"; }, { name: "uploader"; docs: [ "Uploader key, used to sign off on successful storage + CSAM scan" ]; type: "publicKey"; }, { name: "mutableFeeStartEpoch"; docs: ["Epoch at which mutable_account_fees turned on"]; type: { option: "u32"; }; }, { name: "shadesPerGibPerEpoch"; docs: ["Mutable fee rate"]; type: "u64"; }, { name: "crankBps"; docs: ["Basis points cranker gets from cranking"]; type: "u16"; }, { name: "maxAccountSize"; docs: ["Maximum size of a storage account"]; type: "u64"; }, { name: "minAccountSize"; docs: ["Minimum size of a storage account"]; type: "u64"; } ]; }; }, { name: "file"; type: { kind: "struct"; fields: [ { name: "immutable"; docs: ["Mutability"]; type: "bool"; }, { name: "toBeDeleted"; docs: ["Delete flag"]; type: "bool"; }, { name: "deleteRequestEpoch"; docs: ["Delete request epoch"]; type: "u32"; }, { name: "size"; docs: ["File size (bytes)"]; type: "u64"; }, { name: "sha256Hash"; docs: ["File hash (sha256)"]; type: { array: ["u8", 32]; }; }, { name: "initCounterSeed"; docs: ["File counter seed"]; type: "u32"; }, { name: "storageAccount"; docs: ["Storage accout"]; type: "publicKey"; }, { name: "name"; docs: ["File name"]; type: "string"; } ]; }; }, { name: "file"; type: { kind: "struct"; fields: [ { name: "immutable"; docs: ["Mutability"]; type: "bool"; }, { name: "toBeDeleted"; docs: ["Delete flag"]; type: "bool"; }, { name: "deleteRequestEpoch"; docs: ["Delete request epoch"]; type: "u32"; }, { name: "size"; docs: ["File size (bytes)"]; type: "u64"; }, { name: "sha256Hash"; docs: ["File hash (sha256)"]; type: { array: ["u8", 32]; }; }, { name: "initCounterSeed"; docs: ["File counter seed"]; type: "u32"; }, { name: "storageAccount"; docs: ["Storage accout"]; type: "publicKey"; }, { name: "name"; docs: ["File name"]; type: "string"; } ]; }; } ]; types: [ { name: "Mode"; type: { kind: "enum"; variants: [ { name: "Increment"; }, { name: "Decrement"; }, { name: "Initialize"; } ]; }; } ]; events: [ { name: "StakeRefreshed"; fields: [ { name: "refreshed"; type: "bool"; index: false; }, { name: "account"; type: "publicKey"; index: false; } ]; } ]; errors: [ { code: 6000; name: "NotEnoughStorage"; msg: "Not enough storage available on this Storage Account"; }, { code: 6001; name: "FileNameLengthExceedsLimit"; msg: "The length of the file name exceeds the limit of 32 bytes"; }, { code: 6002; name: "InvalidSha256Hash"; msg: "Invalid sha256 hash"; }, { code: 6003; name: "HasHadBadCsam"; msg: "User at some point had a bad csam scan"; }, { code: 6004; name: "StorageAccountMarkedImmutable"; msg: "Storage account is marked as immutable"; }, { code: 6005; name: "ClaimingStakeTooSoon"; msg: "User has not waited enough time to claim stake"; }, { code: 6006; name: "SolanaStorageAccountNotMutable"; msg: "The storage account needs to be marked as mutable to update last fee collection epoch"; }, { code: 6007; name: "RemovingTooMuchStorage"; msg: "Attempting to decrease storage by more than is available"; }, { code: 6008; name: "UnsignedIntegerCastFailed"; msg: "u128 -> u64 cast failed"; }, { code: 6009; name: "NonzeroRemainingFileAccounts"; msg: "This storage account still has some file accounts associated with it that have not been deleted"; }, { code: 6010; name: "AccountStillInGracePeriod"; msg: "This account is still within deletion grace period"; }, { code: 6011; name: "AccountNotMarkedToBeDeleted"; msg: "This account is not marked to be deleted"; }, { code: 6012; name: "FileStillInGracePeriod"; msg: "This file is still within deletion grace period"; }, { code: 6013; name: "FileNotMarkedToBeDeleted"; msg: "This file is not marked to be deleted"; }, { code: 6014; name: "FileMarkedImmutable"; msg: "File has been marked as immutable and cannot be edited"; }, { code: 6015; name: "NoStorageIncrease"; msg: "User requested an increase of zero bytes"; }, { code: 6016; name: "ExceededStorageLimit"; msg: "Requested a storage account with storage over the limit"; }, { code: 6017; name: "InsufficientFunds"; msg: "User does not have enough funds to store requested number of bytes."; }, { code: 6018; name: "NotEnoughStorageOnShadowDrive"; msg: "There is not available storage on Shadow Drive. Good job!"; }, { code: 6019; name: "AccountTooSmall"; msg: "Requested a storage account with storage under the limit"; }, { code: 6020; name: "DidNotAgreeToToS"; msg: "User did not agree to terms of service"; }, { code: 6021; name: "InvalidTokenTransferAmounts"; msg: "Invalid token transfers. Stake account nonempty."; }, { code: 6022; name: "FailedToCloseAccount"; msg: "Failed to close spl token account"; }, { code: 6023; name: "FailedToTransferToEmissionsWallet"; msg: "Failed to transfer to emissions wallet"; }, { code: 6024; name: "FailedToTransferToEmissionsWalletFromUser"; msg: "Failed to transfer to emissions wallet from user"; }, { code: 6025; name: "FailedToReturnUserFunds"; msg: "Failed to return user funds"; }, { code: 6026; name: "NeedSomeFees"; msg: "Turning on fees and passing in None for storage cost per epoch"; }, { code: 6027; name: "NeedSomeCrankBps"; msg: "Turning on fees and passing in None for crank bps"; }, { code: 6028; name: "AlreadyMarkedForDeletion"; msg: "This account is already marked to be deleted"; }, { code: 6029; name: "EmptyStakeAccount"; msg: "User has an empty stake account and must refresh stake account before unmarking account for deletion"; }, { code: 6030; name: "IdentifierExceededMaxLength"; msg: "New identifier exceeds maximum length of 64 bytes"; }, { code: 6031; name: "OnlyAdmin1CanChangeAdmins"; msg: "Only admin1 can change admins"; }, { code: 6032; name: "OnlyOneOwnerAllowedInV1_5"; msg: "(As part of on-chain storage optimizations, only one owner is allowed in Shadow Drive v1.5)"; } ]; }; export const IDL: ShadowDriveUserStaking = { version: "2.0.0", name: "shadow_drive_user_staking", constants: [ { name: "INITIAL_STORAGE_COST", type: "u64", value: "1_073_741_824", }, { name: "MAX_IDENTIFIER_SIZE", type: { defined: "usize", }, value: "64", }, { name: "INITIAL_STORAGE_AVAILABLE", type: "u128", value: "109_951_162_777_600", }, { name: "BYTES_PER_GIB", type: "u32", value: "1_073_741_824", }, { name: "MAX_ACCOUNT_SIZE", type: "u64", value: "1_099_511_627_776", }, { name: "MIN_ACCOUNT_SIZE", type: "u64", value: "1024", }, { name: "MAX_FILENAME_SIZE", type: { defined: "usize", }, value: "32", }, { name: "SHA256_HASH_SIZE", type: { defined: "usize", }, value: "256 / 8", }, { name: "MAX_URL_SIZE", type: { defined: "usize", }, value: "256", }, { name: "DELETION_GRACE_PERIOD", type: "u8", value: "1", }, { name: "UNSTAKE_TIME_PERIOD", type: "i64", value: "0 * 24 * 60 * 60", }, { name: "UNSTAKE_EPOCH_PERIOD", type: "u64", value: "1", }, { name: "INITIAL_CRANK_FEE_BPS", type: "u16", value: "100", }, ], instructions: [ { name: "initializeConfig", docs: [ "Context: This is for admin use. This is to be called first, as this initializes Shadow Drive access on-chain!", "Function: The primary function of this is to initialize an account that stores the configuration/parameters of the storage program on-chain, e.g. admin pubkeys, storage cost.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds the SPL's staking and slashing policy.", "This is the account that signs transactions on behalf of the program to", "distribute staking rewards.", ], }, { name: "admin1", isMut: true, isSigner: true, docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority", ], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent Program"], }, ], args: [ { name: "uploader", type: "publicKey", }, { name: "admin2", type: { option: "publicKey", }, }, ], }, { name: "updateConfig", docs: [ "Context: This is for admin use.", "Function: The primary function of this is update the storage_config account which stores Shadow Drive parameters on-chain, e.g. admin pubkeys, storage cost.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds storage config parameters and admin pubkeys.", ], }, { name: "admin", isMut: true, isSigner: true, docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority", ], }, ], args: [ { name: "newStorageCost", type: { option: "u64", }, }, { name: "newStorageAvailable", type: { option: "u128", }, }, { name: "newAdmin2", type: { option: "publicKey", }, }, { name: "newMaxAcctSize", type: { option: "u64", }, }, { name: "newMinAcctSize", type: { option: "u64", }, }, { name: "newShadesPerGbEpoch", type: { option: "u64", }, }, ], }, { name: "mutableFees", docs: [ "Context: This is for admin use.", "Function: The primary function of this is to toggle fees for mutable account storage on and off.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds the SPL's staking and slashing policy.", "This is the account that signs transactions on behalf of the program to", "distribute staking rewards.", ], }, { name: "admin", isMut: true, isSigner: true, docs: [ "This account is the SPL's staking policy admin.", "Must be either freeze or mint authority", ], }, ], args: [ { name: "shadesPerGbPerEpoch", type: { option: "u64", }, }, { name: "crankBps", type: { option: "u32", }, }, ], }, { name: "initializeAccount", docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to initialize a storage account with some specified number of bytes.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds the storage configuration, including current cost per byte,", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's `StorageAccount` information.", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["This is the token in question for staking."], }, { name: "owner1", isMut: true, isSigner: true, docs: [ "This is the user who is initializing the storage account", "and is automatically added as an admin", ], }, { name: "uploader", isMut: false, isSigner: true, docs: [ "Uploader needs to sign as this txn", "needs to be fulfilled on the middleman server", "to create the ceph bucket", ], }, { name: "owner1TokenAccount", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent Program"], }, ], args: [ { name: "identifier", type: "string", }, { name: "storage", type: "u64", }, { name: "owner2", type: { option: "publicKey", }, }, ], }, { name: "initializeAccount2", docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to initialize a storage account with some specified number of bytes.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds the storage configuration, including current cost per byte,", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's storage account information.", "Upgraded to `StorageAccountV2`.", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["This is the token in question for staking."], }, { name: "owner1", isMut: true, isSigner: true, docs: [ "This is the user who is initializing the storage account", "and is automatically added as an admin", ], }, { name: "uploader", isMut: false, isSigner: true, docs: [ "Uploader needs to sign as this txn", "needs to be fulfilled on the middleman server", "to create the ceph bucket", ], }, { name: "owner1TokenAccount", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent Program"], }, ], args: [ { name: "identifier", type: "string", }, { name: "storage", type: "u64", }, ], }, { name: "updateAccount", docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to change the amount of storage they have for this storage account.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [ { name: "identifier", type: { option: "string", }, }, { name: "owner2", type: { option: "publicKey", }, }, ], }, { name: "updateAccount2", docs: [ "Context: This is user-facing. This is to be done whenever the user decides.", "Function: This allows the user to change the amount of storage they have for this storage account.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [ { name: "identifier", type: { option: "string", }, }, ], }, { name: "requestDeleteAccount", docs: [ "Context: This is user-facing. This is to be done after our upload server verifies all is well.", "Function: This stores the file metadata + location on-chain.", "Context: This is user-facing, but requires our uploader's signature. This is to be done after our upload server verifies all is well.", "Function: This updates the file metadata on-chain upon user edits.", "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if parent account is marked as immutable.", "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if account is marked as immutable.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [], }, { name: "requestDeleteAccount2", docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and records the request time. Fails if account is marked as immutable.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [], }, { name: "unmarkDeleteAccount", docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if parent account is marked as immutable.", "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if account is marked as immutable.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: ["Stake account associated with storage account"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [], }, { name: "unmarkDeleteAccount2", docs: [ "Context: This is user-facing.", "Function: This updates a boolean flag and resets the request time. Fails if account is marked as immutable.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: ["Stake account associated with storage account"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, ], args: [], }, { name: "redeemRent", docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `File` account and updates storage available in user's storage account.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period.", "Context: This is user-facing.", "Function: This deletes the corresponding `File` account, allowing user to redeem SOL rent in v1.5", ], accounts: [ { name: "storageAccount", isMut: false, isSigner: false, docs: ["Parent storage account."], }, { name: "file", isMut: true, isSigner: false, docs: ["File account to be closed"], }, { name: "owner", isMut: true, isSigner: true, docs: ["File owner, user"], }, ], args: [], }, { name: "deleteAccount", docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `StorageAccount` account and return's user funds.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "owner", isMut: true, isSigner: false, docs: [ "File owner, user", "Also, our uploader keys are signing this transaction so presuamably we would only provide a good key.", "We also may not need this account at all.", ], }, { name: "shdwPayer", isMut: true, isSigner: false, docs: [ "This is the user's token account, presumably with which they staked", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Admin/uploader"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "deleteAccount2", docs: [ "Context: This is for admin use.", "Function: This deletes the corresponding `StorageAccount` account and return's user funds.", "Fails if file is marked as immutable, or if time elapsed since request is less than the grace period.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "owner", isMut: true, isSigner: false, docs: [ "File owner, user", "Also, our uploader keys are signing this transaction so presuamably we would only provide a good key.", "We also may not need this account at all.", ], }, { name: "shdwPayer", isMut: true, isSigner: false, docs: [ "This is the user's token account, presumably with which they staked", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Admin/uploader"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "makeAccountImmutable", docs: [ "Context: This is user-facing.", "Function: This marks the corresponding `StorageAccount` account as immutable,", "and transfers all funds from `stake_account` to operator emissions wallet.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", "Requires mutability to update global storage counter.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: [ "Parent storage account.", "Requires mutability to update user storage account storage counter.", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token account is the SHDW operator emissions wallet"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on make immutable"], }, { name: "ownerAta", isMut: true, isSigner: false, docs: ["User's token account"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "associatedTokenProgram", isMut: false, isSigner: false, docs: ["Associated Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "makeAccountImmutable2", docs: [ "Context: This is user-facing.", "Function: This marks the corresponding `StorageAccount` account as immutable,", "and transfers all funds from `stake_account` to operator emissions wallet.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", "Requires mutability to update global storage counter.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: [ "Parent storage account.", "Requires mutability to update user storage account storage counter.", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token account is the SHDW operator emissions wallet"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: ["User's token account"], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on make immutable"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "associatedTokenProgram", isMut: false, isSigner: false, docs: ["Associated Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "badCsam", docs: [ "Context: This is for admin use.", "Function: Upon a bad csam scan, rugs user,", "deleting storage account and transferring funds to emissions wallet", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "uploader", isMut: true, isSigner: true, docs: ["Admin/uploader"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageAvailable", type: "u64", }, ], }, { name: "badCsam2", docs: [ "Context: This is for admin use.", "Function: Upon a bad csam scan, rugs user,", "deleting storage account and transferring funds to emissions wallet", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "userInfo", isMut: true, isSigner: false, docs: [ "This account is a PDA that holds a user's info (not specific to one storage account).", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "uploader", isMut: true, isSigner: true, docs: ["Admin/uploader"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageAvailable", type: "u64", }, ], }, { name: "increaseStorage", docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on increase storage"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "additionalStorage", type: "u64", }, ], }, { name: "increaseStorage2", docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on increase storage"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "additionalStorage", type: "u64", }, ], }, { name: "increaseImmutableStorage", docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate, after having marked an account as immutable", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["Wallet that receives storage fees"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on increase storage"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "additionalStorage", type: "u64", }, ], }, { name: "increaseImmutableStorage2", docs: [ "Context: This is user facing.", "Function: allows user to pay for more storage at current rate, after having marked an account as immutable", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["Wallet that receives storage fees"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on increase storage"], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "additionalStorage", type: "u64", }, ], }, { name: "decreaseStorage", docs: [ "Context: This is user facing.", "Function: allows user to reduce storage, up to current available storage,", "and begins an unstake ticket.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "unstakeInfo", isMut: true, isSigner: false, docs: ["Account which stores time, epoch last unstaked"], }, { name: "unstakeAccount", isMut: true, isSigner: false, docs: ["Account which stores SHDW when unstaking"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: ["User's ATA"], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on decrease storage"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["Token account holding operator emission funds"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent Program"], }, ], args: [ { name: "removeStorage", type: "u64", }, { name: "storageUsed", type: "u64", }, ], }, { name: "decreaseStorage2", docs: [ "Context: This is user facing.", "Function: allows user to reduce storage, up to current available storage,", "and begins an unstake ticket.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "unstakeInfo", isMut: true, isSigner: false, docs: ["Account which stores time, epoch last unstaked"], }, { name: "unstakeAccount", isMut: true, isSigner: false, docs: ["Account which stores SHDW when unstaking"], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: ["User's ATA"], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "uploader", isMut: false, isSigner: true, docs: ["Uploader needs to sign off on decrease storage"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["Token account holding operator emission funds"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, { name: "rent", isMut: false, isSigner: false, docs: ["Rent Program"], }, ], args: [ { name: "removeStorage", type: "u64", }, { name: "storageUsed", type: "u64", }, ], }, { name: "claimStake", docs: [ "Context: This is user facing.", "Function: allows user to claim stake from unstake ticket.", "Fails if user has not waited an appropriate amount of time.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account. Only used here for the key"], }, { name: "unstakeInfo", isMut: true, isSigner: false, docs: [ "Account which stores time, epoch last unstaked. Close upon successful unstake.", ], }, { name: "unstakeAccount", isMut: true, isSigner: false, docs: [ "Account which stores SHDW when unstaking. Close upon successful unstake.", ], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Programn"], }, ], args: [], }, { name: "claimStake2", docs: [ "Context: This is user facing.", "Function: allows user to claim stake from unstake ticket.", "Fails if user has not waited an appropriate amount of time.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account. Only used here for the key"], }, { name: "unstakeInfo", isMut: true, isSigner: false, docs: [ "Account which stores time, epoch last unstaked. Close upon successful unstake.", ], }, { name: "unstakeAccount", isMut: true, isSigner: false, docs: [ "Account which stores SHDW when unstaking. Close upon successful unstake.", ], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Programn"], }, ], args: [], }, { name: "crank", docs: [ "Context: This is a public function, callable by anyone.", "Function: collects fees from user stake account and", "sends it to the operator emissions wallet.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "cranker", isMut: true, isSigner: true, docs: ["Cranker"], }, { name: "crankerAta", isMut: true, isSigner: false, docs: ["Cranker's ATA"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "crank2", docs: [ "Context: This is a public function, callable by anyone.", "Function: collects fees from user stake account and", "sends it to the operator emissions wallet.", ], accounts: [ { name: "storageConfig", isMut: true, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "cranker", isMut: true, isSigner: true, docs: ["Cranker"], }, { name: "crankerAta", isMut: true, isSigner: false, docs: ["Cranker's ATA"], }, { name: "emissionsWallet", isMut: true, isSigner: false, docs: ["This token accountis the SHDW operator emissions wallet"], }, { name: "tokenMint", isMut: true, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [ { name: "storageUsed", type: "u64", }, ], }, { name: "refreshStake", docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [], }, { name: "refreshStake2", docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion.", ], accounts: [ { name: "storageConfig", isMut: false, isSigner: false, docs: [ "This is the `StorageConfig` accounts that holds all of the admin, uploader keys.", ], }, { name: "storageAccount", isMut: true, isSigner: false, docs: ["Parent storage account."], }, { name: "owner", isMut: true, isSigner: true, docs: [ "File owner, user, fee-payer", "Requires mutability since owner/user is fee payer.", ], }, { name: "ownerAta", isMut: true, isSigner: false, docs: [ "This is the user's token account with which they are staking", ], }, { name: "stakeAccount", isMut: true, isSigner: false, docs: [ "This token account serves as the account which holds user's stake for file storage.", ], }, { name: "tokenMint", isMut: false, isSigner: false, docs: ["Token mint account"], }, { name: "systemProgram", isMut: false, isSigner: false, docs: ["System Program"], }, { name: "tokenProgram", isMut: false, isSigner: false, docs: ["Token Program"], }, ], args: [], }, { name: "migrateStep1", docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion.", ], accounts: [ { name: "storageAccount", isMut: true, isSigner: false, docs: ["Account to be migrated"], }, { name: "migration", isMut: true, isSigner: false, docs: ["Migration helper PDA"], }, { name: "owner", isMut: true, isSigner: true, docs: ["User that is migrating"], }, { name: "systemProgram", isMut: false, isSigner: false, }, ], args: [], }, { name: "migrateStep2", docs: [ "Context: This is user-facing.", "Function: allows user to top off stake account, and unmarks deletion.", ], accounts: [ { name: "storageAccount", isMut: true, isSigner: false, docs: ["New account"], }, { name: "migration", isMut: true, isSigner: false, docs: ["Migration helper PDA"], }, { name: "owner", isMut: true, isSigner: true, docs: ["User that is migrating"], }, { name: "systemProgram", isMut: false, isSigner: false, }, ], args: [], }, ], accounts: [ { name: "unstakeInfo", type: { kind: "struct", fields: [ { name: "timeLastUnstaked", type: "i64", }, { name: "epochLastUnstaked", type: "u64", }, { name: "unstaker", type: "publicKey", }, ], }, }, { name: "storageAccount", type: { kind: "struct", fields: [ { name: "isStatic", docs: [ "Immutable boolean to track what kind of storage account this is.", "NOTE: Not used in current implementation w/ non-dynamic storage payments", ], type: "bool", }, { name: "initCounter", docs: [ "Flag on whether storage account is public (usable by anyone)", "Counter tracking how many files have been initialized", ], type: "u32", }, { name: "delCounter", docs: ["Counter tracking how many files have been deleted"], type: "u32", }, { name: "immutable", docs: [ "Boolean to track whether storage account (and all child File accounts) are immutable", ], type: "bool", }, { name: "toBeDeleted", docs: ["Delete flag"], type: "bool", }, { name: "deleteRequestEpoch", docs: ["Delete request epoch"], type: "u32", }, { name: "storage", docs: ["Number of bytes of storage associated with this account"], type: "u64", }, { name: "storageAvailable", docs: ["Bytes available for use"], type: "u64", }, { name: "owner1", docs: ["Primary owner of StorageAccount (immutable)"], type: "publicKey", }, { name: "owner2", docs: ["Optional owner 2"], type: "publicKey", }, { name: "shdwPayer", docs: ["Pubkey of the token account that staked SHDW"], type: "publicKey", }, { name: "accountCounterSeed", docs: ["Counter at time of initialization"], type: "u32", }, { name: "totalCostOfCurrentStorage", docs: ["Total shades paid for current box size"], type: "u64", }, { name: "totalFeesPaid", type: "u64", }, { name: "creationTime", docs: ["Time of storage account creation"], type: "u32", }, { name: "creationEpoch", docs: ["Time of storage account creation"], type: "u32", }, { name: "lastFeeEpoch", docs: ["The last epoch through which the user paid"], type: "u32", }, { name: "identifier", docs: [ "Some unique identifier that the user provides.", "Serves as a seed for storage account PDA.", ], type: "string", }, ], }, }, { name: "storageAccountV2", type: { kind: "struct", fields: [ { name: "immutable", docs: [ "Boolean to track whether storage account (and all child File accounts) are immutable", ], type: "bool", }, { name: "toBeDeleted", docs: ["Delete flag"], type: "bool", }, { name: "deleteRequestEpoch", docs: ["Delete request epoch"], type: "u32", }, { name: "storage", docs: ["Number of bytes of storage associated with this account"], type: "u64", }, { name: "owner1", docs: ["Primary owner of StorageAccount (immutable)"], type: "publicKey", }, { name: "accountCounterSeed", docs: [ "Pubkey of the token account that staked SHDW", "Counter at time of initialization", ], type: "u32", }, { name: "creationTime", docs: ["Time of storage account creation"], type: "u32", }, { name: "creationEpoch", docs: ["Time of storage account creation"], type: "u32", }, { name: "lastFeeEpoch", docs: ["The last epoch through which the user paid"], type: "u32", }, { name: "identifier", docs: [ "Some unique identifier that the user provides.", "Serves as a seed for storage account PDA.", ], type: "string", }, ], }, }, { name: "userInfo", type: { kind: "struct", fields: [ { name: "accountCounter", docs: ["Total number of storage accounts the user has with us"], type: "u32", }, { name: "delCounter", docs: ["Total number of storage accounts that have been deleted"], type: "u32", }, { name: "agreedToTos", docs: ["Boolean denoting that the user agreed to terms of service"], type: "bool", }, { name: "lifetimeBadCsam", docs: [ "Boolean denoting whether this pubkey has ever had a bad scam scan", ], type: "bool", }, ], }, }, { name: "storageConfig", type: { kind: "struct", fields: [ { name: "shadesPerGib", docs: ["Storage costs in shades per GiB"], type: "u64", }, { name: "storageAvailable", docs: ["Total storage available (or remaining)"], type: "u128", }, { name: "tokenAccount", docs: [ "Pubkey of SHDW token account that holds storage fees/stake", ], type: "publicKey", }, { name: "admin2", docs: ["Optional Admin 2"], type: "publicKey", }, { name: "uploader", docs: [ "Uploader key, used to sign off on successful storage + CSAM scan", ], type: "publicKey", }, { name: "mutableFeeStartEpoch", docs: ["Epoch at which mutable_account_fees turned on"], type: { option: "u32", }, }, { name: "shadesPerGibPerEpoch", docs: ["Mutable fee rate"], type: "u64", }, { name: "crankBps", docs: ["Basis points cranker gets from cranking"], type: "u16", }, { name: "maxAccountSize", docs: ["Maximum size of a storage account"], type: "u64", }, { name: "minAccountSize", docs: ["Minimum size of a storage account"], type: "u64", }, ], }, }, { name: "file", type: { kind: "struct", fields: [ { name: "immutable", docs: ["Mutability"], type: "bool", }, { name: "toBeDeleted", docs: ["Delete flag"], type: "bool", }, { name: "deleteRequestEpoch", docs: ["Delete request epoch"], type: "u32", }, { name: "size", docs: ["File size (bytes)"], type: "u64", }, { name: "sha256Hash", docs: ["File hash (sha256)"], type: { array: ["u8", 32], }, }, { name: "initCounterSeed", docs: ["File counter seed"], type: "u32", }, { name: "storageAccount", docs: ["Storage accout"], type: "publicKey", }, { name: "name", docs: ["File name"], type: "string", }, ], }, }, { name: "file", type: { kind: "struct", fields: [ { name: "immutable", docs: ["Mutability"], type: "bool", }, { name: "toBeDeleted", docs: ["Delete flag"], type: "bool", }, { name: "deleteRequestEpoch", docs: ["Delete request epoch"], type: "u32", }, { name: "size", docs: ["File size (bytes)"], type: "u64", }, { name: "sha256Hash", docs: ["File hash (sha256)"], type: { array: ["u8", 32], }, }, { name: "initCounterSeed", docs: ["File counter seed"], type: "u32", }, { name: "storageAccount", docs: ["Storage accout"], type: "publicKey", }, { name: "name", docs: ["File name"], type: "string", }, ], }, }, ], types: [ { name: "Mode", type: { kind: "enum", variants: [ { name: "Increment", }, { name: "Decrement", }, { name: "Initialize", }, ], }, }, ], events: [ { name: "StakeRefreshed", fields: [ { name: "refreshed", type: "bool", index: false, }, { name: "account", type: "publicKey", index: false, }, ], }, ], errors: [ { code: 6000, name: "NotEnoughStorage", msg: "Not enough storage available on this Storage Account", }, { code: 6001, name: "FileNameLengthExceedsLimit", msg: "The length of the file name exceeds the limit of 32 bytes", }, { code: 6002, name: "InvalidSha256Hash", msg: "Invalid sha256 hash", }, { code: 6003, name: "HasHadBadCsam", msg: "User at some point had a bad csam scan", }, { code: 6004, name: "StorageAccountMarkedImmutable", msg: "Storage account is marked as immutable", }, { code: 6005, name: "ClaimingStakeTooSoon", msg: "User has not waited enough time to claim stake", }, { code: 6006, name: "SolanaStorageAccountNotMutable", msg: "The storage account needs to be marked as mutable to update last fee collection epoch", }, { code: 6007, name: "RemovingTooMuchStorage", msg: "Attempting to decrease storage by more than is available", }, { code: 6008, name: "UnsignedIntegerCastFailed", msg: "u128 -> u64 cast failed", }, { code: 6009, name: "NonzeroRemainingFileAccounts", msg: "This storage account still has some file accounts associated with it that have not been deleted", }, { code: 6010, name: "AccountStillInGracePeriod", msg: "This account is still within deletion grace period", }, { code: 6011, name: "AccountNotMarkedToBeDeleted", msg: "This account is not marked to be deleted", }, { code: 6012, name: "FileStillInGracePeriod", msg: "This file is still within deletion grace period", }, { code: 6013, name: "FileNotMarkedToBeDeleted", msg: "This file is not marked to be deleted", }, { code: 6014, name: "FileMarkedImmutable", msg: "File has been marked as immutable and cannot be edited", }, { code: 6015, name: "NoStorageIncrease", msg: "User requested an increase of zero bytes", }, { code: 6016, name: "ExceededStorageLimit", msg: "Requested a storage account with storage over the limit", }, { code: 6017, name: "InsufficientFunds", msg: "User does not have enough funds to store requested number of bytes.", }, { code: 6018, name: "NotEnoughStorageOnShadowDrive", msg: "There is not available storage on Shadow Drive. Good job!", }, { code: 6019, name: "AccountTooSmall", msg: "Requested a storage account with storage under the limit", }, { code: 6020, name: "DidNotAgreeToToS", msg: "User did not agree to terms of service", }, { code: 6021, name: "InvalidTokenTransferAmounts", msg: "Invalid token transfers. Stake account nonempty.", }, { code: 6022, name: "FailedToCloseAccount", msg: "Failed to close spl token account", }, { code: 6023, name: "FailedToTransferToEmissionsWallet", msg: "Failed to transfer to emissions wallet", }, { code: 6024, name: "FailedToTransferToEmissionsWalletFromUser", msg: "Failed to transfer to emissions wallet from user", }, { code: 6025, name: "FailedToReturnUserFunds", msg: "Failed to return user funds", }, { code: 6026, name: "NeedSomeFees", msg: "Turning on fees and passing in None for storage cost per epoch", }, { code: 6027, name: "NeedSomeCrankBps", msg: "Turning on fees and passing in None for crank bps", }, { code: 6028, name: "AlreadyMarkedForDeletion", msg: "This account is already marked to be deleted", }, { code: 6029, name: "EmptyStakeAccount", msg: "User has an empty stake account and must refresh stake account before unmarking account for deletion", }, { code: 6030, name: "IdentifierExceededMaxLength", msg: "New identifier exceeds maximum length of 64 bytes", }, { code: 6031, name: "OnlyAdmin1CanChangeAdmins", msg: "Only admin1 can change admins", }, { code: 6032, name: "OnlyOneOwnerAllowedInV1_5", msg: "(As part of on-chain storage optimizations, only one owner is allowed in Shadow Drive v1.5)", }, ], };