diff --git a/a.sh b/a.sh new file mode 100755 index 000000000..5a4441e70 --- /dev/null +++ b/a.sh @@ -0,0 +1,70 @@ +#!/bin/bash -xe +build() { +declare -a ProjectDirs=( + "basics/account-data/native/program" + "basics/checking-accounts/native/program" + "basics/close-account/native/program" + "basics/counter/native/program" + "basics/create-account/native/program" + "basics/hello-solana/native/program" + "basics/pda-rent-payer/native/program" + "basics/processing-instructions/native/program" + "basics/program-derived-addresses/native/program" + "basics/realloc/native/program" + "basics/rent/native/program" + "basics/repository-layout/native/program" + "basics/transfer-sol/native/program" + ) + for projectDir in "${ProjectDirs[@]}"; do + echo " + ******** + Building $projectDir + ********" + cd $projectDir + if cargo-build-sbf --verbose; then + echo "Build succeeded for $projectDir." + else + failed=true + failed_builds+=($projectDir) + echo "Build failed for $projectDir. Continuing with the next program." + fi + cd - > /dev/null + done +} + +run() { + solana -V + rustc -V + declare -a ProjectDirs=( + #"basics/account-data/native/" + #"basics/checking-accounts/native/" + #"basics/close-account/native/" + #"basics/counter/native/" + #"basics/create-account/native/" + "basics/hello-solana/native/" + #"basics/pda-rent-payer/native/" + #"basics/processing-instructions/native/" + #"basics/program-derived-addresses/native/" + #"basics/rent/native/" + #"basics/repository-layout/native/" + #"basics/transfer-sol/native/" + ) + for projectDir in "${ProjectDirs[@]}"; do + echo " + ******** + Testing $projectDir + ********" + cd $projectDir + pnpm install --frozen-lockfile + if (cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test); then + echo "Tests succeeded for $projectDir." + else + failed=true + failed_tests+=($projectDir) + echo "Tests failed for $projectDir. Continuing with the next program." + fi + cd - > /dev/null + done +} + +run diff --git a/basics/hello-solana/move/Move.toml b/basics/hello-solana/move/Move.toml new file mode 100644 index 000000000..998b878e4 --- /dev/null +++ b/basics/hello-solana/move/Move.toml @@ -0,0 +1,7 @@ +[package] +name = "hello" +version = "1.0.0" + +[addresses] +hello = "0xba31" + diff --git a/basics/hello-solana/move/bin/hello_solana_move_program.so b/basics/hello-solana/move/bin/hello_solana_move_program.so new file mode 100755 index 000000000..5438605e6 Binary files /dev/null and b/basics/hello-solana/move/bin/hello_solana_move_program.so differ diff --git a/basics/hello-solana/move/bin/input.json b/basics/hello-solana/move/bin/input.json new file mode 100644 index 000000000..f1b9ef195 --- /dev/null +++ b/basics/hello-solana/move/bin/input.json @@ -0,0 +1,16 @@ +{ + "program_id": "DozgQiYtGbdyniV2T74xMdmjZJvYDzoRFFqw7UR5MwPK", + "accounts": [ + { + "key": "524HMdYYBy6TAn4dK5vCcjiTmT2sxV6Xoue5EXrz22Ca", + "owner": "BPFLoaderUpgradeab1e11111111111111111111111", + "is_signer": false, + "is_writable": true, + "lamports": 1000, + "data": [0, 0, 0, 3] + } + ], + "instruction_data": [ + 11, 0, 0, 0, 0, 0, 0, 0, + 104, 101, 108, 108, 111, 95, 95, 109, 97, 105, 110] +} diff --git a/basics/hello-solana/move/deploy.ts b/basics/hello-solana/move/deploy.ts new file mode 100644 index 000000000..d4be9976f --- /dev/null +++ b/basics/hello-solana/move/deploy.ts @@ -0,0 +1,84 @@ +/** WIP */ +import * as fs from 'fs'; +import * as solanaWeb3 from '@solana/web3.js'; + +async function startValidator() { + // TODO: Start a test-validator programmatically to have a self contained test. + // solana-test-validator -l test-ledger +} + +async function deployProgramShell(programPath: string) { + const util = require('util'); + const exec = util.promisify(require('child_process').exec); + try { + const { stdout, stderr } = await exec(`solana program deploy ${programPath}`); + console.log('stdout:', stdout); + console.log('stderr:', stderr); + return stdout; + } catch (e) { + console.error(e); // should contain code (exit code) and signal (that caused the termination). + return e; + } +} + +// WIP: Function to deploy a Solana program programmatically. +async function deployProgram( + connection: solanaWeb3.Connection, + payer: solanaWeb3.Keypair, + programKeypair: solanaWeb3.Keypair, + programPath: string +): Promise { + // solana program deploy programPath + // Load the program data + const programData = fs.readFileSync(programPath); + + // Allocate space for the program data + const transaction = new solanaWeb3.Transaction(); + const { feeCalculator } = await connection.getRecentBlockhash(); + const programSpace = solanaWeb3.BpfLoader.getMinimumBalanceForRentExemption( + programData.length, + feeCalculator + ); + + // Create the program account + transaction.add( + solanaWeb3.SystemProgram.createAccount({ + fromPubkey: payer.publicKey, + newAccountPubkey: programKeypair.publicKey, + lamports: programSpace, + space: programData.length, + programId: solanaWeb3.BpfLoader.programId, + }) + ); + + // Load the program + transaction.add( + solanaWeb3.BpfLoader.load( + connection, + payer, + programKeypair, + programData, + solanaWeb3.BpfLoader.programId + ) + ); + + // Send the transaction + await solanaWeb3.sendAndConfirmTransaction( + connection, + transaction, + [payer, programKeypair] + ); + + return programKeypair.publicKey; +} + +async function main() { + const connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'), 'confirmed'); + const payer = solanaWeb3.Keypair.generate(); + const programKeypair = solanaWeb3.Keypair.generate(); + const programPath = 'bin/hello_solana_move_program.so'; + const programId = await deployProgramShell(programPath); + console.log('Program deployed with', programId); +} + +main().catch(console.error); \ No newline at end of file diff --git a/basics/hello-solana/move/package.json b/basics/hello-solana/move/package.json new file mode 100644 index 000000000..aa6bd40fc --- /dev/null +++ b/basics/hello-solana/move/package.json @@ -0,0 +1,21 @@ +{ + "scripts": { + "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "deploy": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/deploy.ts" + }, + "dependencies": { + "@solana/web3.js": "^1.47.3" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.1.1", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5" + } +} diff --git a/basics/hello-solana/move/sources/lib.move b/basics/hello-solana/move/sources/lib.move new file mode 100644 index 000000000..1ed564770 --- /dev/null +++ b/basics/hello-solana/move/sources/lib.move @@ -0,0 +1,15 @@ +module 0x10::debug { + native public fun print(x: &T); +} + +module hello::hello { + use 0x10::debug; + use 0x1::string; + + public entry fun main() : u64 { + let rv = 0; + let s = string::utf8(b"Hello Solana"); + debug::print(&s); + rv + } +} diff --git a/basics/hello-solana/move/tests/deploy.ts b/basics/hello-solana/move/tests/deploy.ts new file mode 100644 index 000000000..5e803b43d --- /dev/null +++ b/basics/hello-solana/move/tests/deploy.ts @@ -0,0 +1,45 @@ +// Deploy a solana program by execing a shell. +// Returns stdout when the deploy was successful. +export async function deployProgramShell(programPath: string) { + const util = require('util'); + const exec = util.promisify(require('child_process').exec); + try { + const { stdout, stderr } = await exec(`solana program deploy ${programPath}`); + if (stderr) { + return stderr; + } + return stdout; + } catch (e) { + console.error(e); + return e; + } +} + +export function parseProgramID(programIdLog: string) : string { + // The string should of of the following form, else it is an error. + // Program Id: 5K4yQ8KW2CKsBVRUw2193GMnkKBKXDm6sdXnYY1cB4Hy + programIdLog = programIdLog.trim(); + let templateString : string = 'Program Id: 5K4yQ8KW2CKsBVRUw2193GMnkKBKXDm6sdXnYY1cB4Hy'; + let logLength = templateString.length; + if (programIdLog.length != logLength) { + console.log(`Different lenghts. Expected: ${logLength} vs. ${programIdLog.length}`); + return null; + } + if (!programIdLog.startsWith('Program Id:')){ + console.log('program does not starts with.'); + return null; + } + const programId = programIdLog.substring('Program Id: '.length); + return programId; +} + +async function main() { + const programPath = 'bin/hello_solana_move_program.so'; + const programIdLog = await deployProgramShell(programPath); + const programId = parseProgramID(programIdLog); + if (programId) { + console.log('Program deployed with', programId); + return 0; + } + return -1; +} diff --git a/basics/hello-solana/move/tests/test.ts b/basics/hello-solana/move/tests/test.ts new file mode 100644 index 000000000..47fea4efb --- /dev/null +++ b/basics/hello-solana/move/tests/test.ts @@ -0,0 +1,72 @@ +import { describe, test } from 'node:test'; +import { assert } from 'chai'; +import {deployProgramShell, parseProgramID} from './deploy'; + +import { + Connection, + Keypair, + PublicKey, + sendAndConfirmTransaction, + Transaction, + TransactionInstruction, +} from '@solana/web3.js'; + +function createKeypairFromFile(path: string): Keypair { + return Keypair.fromSecretKey( + Buffer.from(JSON.parse(require('fs').readFileSync(path, "utf-8"))) + ) +}; + +function getInstructionData(path: string): Buffer { + // instruction_data (See: sui/external-crates/move/solana/move-mv-llvm-compiler/docs/Entrypoint.md) + let j = JSON.parse(require('fs').readFileSync(path, "utf-8")); + return j['instruction_data']; +} + +async function deployProgram(programPath: string) : Promise { + const programIdLog = await deployProgramShell(programPath); + const programId = await parseProgramID(programIdLog); + if (programId) { + console.log('Program deployed with', programId); + return programId; + } + console.log('Program could not be deployed'); + return null; +} + +describe("hello-solana", async () => { + // Loading these from local files for development + const connection = new Connection(`http://localhost:8899`, 'confirmed'); + const payer = createKeypairFromFile(require('os').homedir() + '/.config/solana/id.json'); + // PublicKey of the deployed program. + const programPath = 'bin/hello_solana_move_program.so'; + const programIdStr = await deployProgram(programPath); + const programId = new PublicKey(programIdStr); + const instructionData = getInstructionData('bin/input.json'); + + it("Say hello!", async () => { + // Set up transaction instructions first. + let ix = new TransactionInstruction({ + keys: [ + {pubkey: payer.publicKey, isSigner: true, isWritable: true} + ], + programId, + data: instructionData, + }); + + // Send the transaction over RPC + let signature = await sendAndConfirmTransaction( + connection, + new Transaction().add(ix), // Add our instruction (you can add more than one) + [payer] + ); + + let transaction = await connection.getTransaction(signature, {commitment: "confirmed"}); + console.log(transaction); + assert(transaction?.meta?.logMessages[0].startsWith(`Program ${programId}`)); + // 'Hello Solana' as bytes + assert(transaction?.meta?.logMessages[1] === 'Program log: 0000000000000000000000000000000000000000000000000000000000000001::string::String { bytes: [72, 101, 108, 108, 111, 32, 83, 111, 108, 97, 110, 97], }'); + assert(transaction?.meta?.logMessages[2] === `Program ${programId} consumed 5331 of 200000 compute units`); + assert(transaction?.meta?.logMessages[3] === `Program ${programId} success`); + }); + }); \ No newline at end of file diff --git a/basics/hello-solana/move/tsconfig.json b/basics/hello-solana/move/tsconfig.json new file mode 100644 index 000000000..cd5d2e3d0 --- /dev/null +++ b/basics/hello-solana/move/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/basics/hello-solana/native/go.sh b/basics/hello-solana/native/go.sh new file mode 100644 index 000000000..e7d504a75 --- /dev/null +++ b/basics/hello-solana/native/go.sh @@ -0,0 +1,2 @@ +cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so +solana program deploy ./program/target/so/program.so diff --git a/basics/hello-solana/native/kp.py b/basics/hello-solana/native/kp.py new file mode 100644 index 000000000..c74292781 --- /dev/null +++ b/basics/hello-solana/native/kp.py @@ -0,0 +1,20 @@ +import base58 +import json +import sys + +#key_array = [4,182,130,247,119,117,227,207,112,73,170,126,222,197,244,99,215,107,255,202,33,43,36,17,104,111,157,246,196,192,174,95,240,23,238,206,118,215,154,238,229,96,11,37,156,123,51,223,5,231,17,117,86,136,103,14,75,95,175,132,148,54,1,46] + +def print_keys_from_file(f): + key_array = json.load(open(f, 'r')) + + secret_key = key_array[0:32] + public_key = key_array[32:64] + + sk = base58.b58encode(bytes(secret_key)) + pk = base58.b58encode(bytes(public_key)) + + print(pk) + print(sk) + +if __name__ == "__main__": + print_keys_from_file(sys.argv[1]) \ No newline at end of file diff --git a/solana-flags.json b/solana-flags.json new file mode 100644 index 000000000..a8cf77fc3 --- /dev/null +++ b/solana-flags.json @@ -0,0 +1,1304 @@ +{ + "features": [ + { + "id": "E3PHP7w8kB7np3CTQ1qQ2tW3KCtjRSXBQgW9vM2mWv2Y", + "description": "secp256k1 program", + "status": "active", + "sinceSlot": 41040000 + }, + { + "id": "E5JiFDQCwyC6QfT9REFyMpfK2mHcmv1GUDySU1Ue7TYv", + "description": "spl-token multisig fix", + "status": "active", + "sinceSlot": 41040000 + }, + { + "id": "4kpdyrcj5jS47CZb2oJGfVxjYbsMm2Kx97gFyZrxxwXz", + "description": "no overflow rent distribution", + "status": "active", + "sinceSlot": 51408000 + }, + { + "id": "GaBtBJvmS4Arjj5W1NmFcyvPjsHN38UGYDq2MDwbs9Qu", + "description": "deprecate unused rewards sysvar", + "status": "active", + "sinceSlot": 55728001 + }, + { + "id": "4RWNif6C2WCNiKVW7otP4G7dkmkHGyKQWRpuZ1pxKU5m", + "description": "pico inflation", + "status": "active", + "sinceSlot": 57456000 + }, + { + "id": "GE7fRxmW46K6EmCD9AMZSbnaJ2e3LfqCZzdHi9hmYAgi", + "description": "filter stake_delegation_accounts #14062", + "status": "active", + "sinceSlot": 57888004 + }, + { + "id": "7XRJcS5Ud5vxGB54JbK9N2vBZVwnwdBNeJW1ibRgD9gx", + "description": "full inflation enabled by Certus One", + "status": "active", + "sinceSlot": 64800004 + }, + { + "id": "BzBBveUDymEYoYzcMWNQCx3cd4jQs7puaVFHLtsbB6fm", + "description": "community vote allowing Certus One to enable full inflation", + "status": "active", + "sinceSlot": 64800004 + }, + { + "id": "BL99GYhdjjcv6ys22C9wPgn2aTVERDbPHHo4NbS3hgp7", + "description": "spl-token self-transfer fix", + "status": "active", + "sinceSlot": 66528004 + }, + { + "id": "GvDsGDkH5gyzwpDhxNixx8vtx1kwYHH13RiNAPw27zXb", + "description": "warp timestamp again, adjust bounding to 25% fast 80% slow #15204", + "status": "active", + "sinceSlot": 66528004 + }, + { + "id": "3ccR6QpxGYsAbWyfevEtBNGfWV4xBffxRj2tD6A9i39F", + "description": "check initialized Vote data", + "status": "active", + "sinceSlot": 68688000 + }, + { + "id": "D4jsDcXaqdW8tDAWn8H4R25Cdns2YwLneujSL1zvjW6R", + "description": "require custodian to authorize withdrawer change for locked stake", + "status": "active", + "sinceSlot": 71712000 + }, + { + "id": "BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X", + "description": "vote/state program checked instructions #18345", + "status": "active", + "sinceSlot": 92448000 + }, + { + "id": "BrTR9hzw4WBGFP65AJMbpAo64DcA3U6jdPSga9fMV5cS", + "description": "perform all checks for transfers of 0 lamports", + "status": "active", + "sinceSlot": 93312000 + }, + { + "id": "FToKNBYyiF4ky9s8WsmLBXHCht17Ek7RXaLZGHzzQhJ1", + "description": "spl-token set_authority fix", + "status": "active", + "sinceSlot": 93312000 + }, + { + "id": "3E3jV7v9VcdJL8iYZUMax9DiDno8j7EWUVbhm9RtShj2", + "description": "demote program write locks to readonly, except when upgradeable loader present #19593 #20265", + "status": "active", + "sinceSlot": 100656000 + }, + { + "id": "C5fh68nJ7uyKAuYZg2x9sEQ5YrVf3dkW6oojNBSc3Jvo", + "description": "send votes to the tpu vote port", + "status": "active", + "sinceSlot": 101088000 + }, + { + "id": "EBeznQDjcPG8491sFsKZYBi5S5jTVXMpAKNDJMQPS2kq", + "description": "reduce required payer balance for program deploys", + "status": "active", + "sinceSlot": 102816004 + }, + { + "id": "EVW9B5xD9FFK7vw1SBARwMA4s5eRo5eKJdKpsBikzKBz", + "description": "prohibit extra transaction signatures", + "status": "active", + "sinceSlot": 102816004 + }, + { + "id": "SAdVFw3RZvzbo6DvySbSdBnHN4gkzSTH9dSxesyKKPj", + "description": "Enable advancing credits observed for activation epoch #19309", + "status": "active", + "sinceSlot": 104112000 + }, + { + "id": "meRgp4ArRPhD3KtCY9c5yAf2med7mBLsjKTPeVUHqBL", + "description": "allow merging active stakes with unmatched credits_observed #18985", + "status": "active", + "sinceSlot": 104112000 + }, + { + "id": "6RvdSWHh8oh72Dp7wMTS2DBkf3fRPtChfNrAo3cZZoXJ", + "description": "secp256k1_recover syscall", + "status": "active", + "sinceSlot": 104976000 + }, + { + "id": "BKCPBQQBZqggVnFso5nQ8rQ4RwwogYwjuUt9biBjxwNF", + "description": "collect rent from accounts owned by sysvars", + "status": "active", + "sinceSlot": 104976000 + }, + { + "id": "265hPS8k8xJ37ot82KEgjRunsUp5w4n4Q4VwwiN9i9ps", + "description": "optimize epoch boundary updates", + "status": "active", + "sinceSlot": 109728000 + }, + { + "id": "8kEuAshXLsgkUEdcFVLqrjCGGHVWFW99ZZpxvAzzMtBp", + "description": "dedupe config program signers", + "status": "active", + "sinceSlot": 110592000 + }, + { + "id": "DhsYfRjxfnh2g7HKJYSzT79r74Afa1wbHkAgHndrA1oy", + "description": "upgrade libsecp256k1 to v0.5.0", + "status": "active", + "sinceSlot": 110592000 + }, + { + "id": "HFpdDDNQjvcXnXKec697HDDsyk6tFoWS2o8fkxuhQZpL", + "description": "remove delegations from stakes cache when inactive", + "status": "active", + "sinceSlot": 110592000 + }, + { + "id": "4d5AKtxoh93Dwm1vHXUU3iRATuMndx1c431KgT2td52r", + "description": "Add compute_budget_program", + "status": "active", + "sinceSlot": 117072004 + }, + { + "id": "7txXZZD6Um59YoLMF7XUNimbMjsqsWhc7g2EniiTrmp1", + "description": "fail vote withdraw instructions which leave the account non-rent-exempt", + "status": "active", + "sinceSlot": 117072004 + }, + { + "id": "EMX9Q7TVFAmQ9V1CggAkhMzhXSg8ECp7fHrWQX2G1chf", + "description": "evict invalid stakes cache entries on epoch boundaries", + "status": "active", + "sinceSlot": 117072004 + }, + { + "id": "Ftok2jhqAqxUWEiCVRrfRs9DPppWP8cgTB7NQNKL88mS", + "description": "spl-token v3.3.0 release", + "status": "active", + "sinceSlot": 117072004 + }, + { + "id": "HTTgmruMYRZEntyL3EdCDdnS6e4D5wRq1FA7kQsb66qq", + "description": "remove support for the native loader", + "status": "active", + "sinceSlot": 117072004 + }, + { + "id": "6ppMXNYLhVd7GcsZ5uV11wQEW7spppiMVfqQv5SXhDpX", + "description": "enable builtin ed25519 signature verify program", + "status": "active", + "sinceSlot": 117936008 + }, + { + "id": "6uaHcKPGUy4J7emLBgUTeufhJdiwhngW6a1R9B7c2ob9", + "description": "enable sol_log_data syscall", + "status": "active", + "sinceSlot": 117936008 + }, + { + "id": "DwScAzPUjuv65TMbDnFY7AgwmotzWy3xpEJMXM3hZFaB", + "description": "enable sol_{set,get}_return_data syscall", + "status": "active", + "sinceSlot": 117936008 + }, + { + "id": "FaTa4SpiaSNH44PGC4z8bnGVTkSRYaWvrBs3KTu8XQQq", + "description": "SPL Associated Token Account Program release version 1.0.4, tied to token 3.3.0 #22648", + "status": "active", + "sinceSlot": 130464000 + }, + { + "id": "E8MkiWZNNPGU6n55jkGzyj8ghUmjCHRmDFdYYFYHxWhQ", + "description": "leave nonce as is on success", + "status": "active", + "sinceSlot": 133056012 + }, + { + "id": "BkFDxiJQWZXGTZaJQxH7wVEHkAmwCgSEVkrvswFfRJPD", + "description": "require all new transaction accounts with data to be rent-exempt", + "status": "active", + "sinceSlot": 133488000 + }, + { + "id": "75m6ysz33AfLA5DDEzWM1obBrnPQRSsdVQ2nRmc8Vuu1", + "description": "support account data reallocation", + "status": "active", + "sinceSlot": 133920008 + }, + { + "id": "CFK1hRCNy8JJuAAY8Pb2GjLFNdCThS2qwZNe3izzBMgn", + "description": "add add_get_processed_sibling_instruction_syscall", + "status": "active", + "sinceSlot": 134352008 + }, + { + "id": "5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMNQQj7pHoLNZ9", + "description": "transaction wide compute cap", + "status": "active", + "sinceSlot": 135216004 + }, + { + "id": "CCu4boMmfLuqcmfTLPHQiUo22ZdUsXjgzPAURYaWt1Bw", + "description": "Requestable heap frame size", + "status": "active", + "sinceSlot": 135216004 + }, + { + "id": "3BX6SBeEBibHaVQXywdkcgyUk6evfYZkHdztXiDtEpFS", + "description": "warp timestamp again, adjust bounding to 150% slow #25666", + "status": "active", + "sinceSlot": 136512012 + }, + { + "id": "BiCU7M5w8ZCMykVSyhZ7Q3m2SWoR2qrEQ86ERcDX77ME", + "description": "nonce must be writable", + "status": "active", + "sinceSlot": 136944004 + }, + { + "id": "9kdtFSrXHQg3hKkbXkQ6trJ3Ja1xpJ22CTFSNAciEwmL", + "description": "fail instructions which have native_loader as program_id directly", + "status": "active", + "sinceSlot": 137376016 + }, + { + "id": "Ds87KVeqhbv7Jw8W6avsS1mqz3Mw5J3pRTpPoDQ2QdiJ", + "description": "add shred-type to shred seed #25556", + "status": "active", + "sinceSlot": 137376016 + }, + { + "id": "36PRUK2Dz6HWYdG9SpjeAsF5F3KxnFCakA2BZMbtMhSb", + "description": "use correct check for nonoverlapping regions in memcpy syscall", + "status": "active", + "sinceSlot": 137808012 + }, + { + "id": "3u3Er5Vc2jVcwz4xr2GJeSAXT3fAj6ADHZ4BJMZiScFd", + "description": "durable nonces must be advanceable", + "status": "active", + "sinceSlot": 138240000 + }, + { + "id": "4EJQtF2pkRyawwcTVfQutzq4Sa5hRhibF6QAK1QXhtEX", + "description": "enable durable nonce #25744", + "status": "active", + "sinceSlot": 138240000 + }, + { + "id": "Gea3ZkK2N4pHuVZVxWcnAtS6UEDdyumdYt4pFcKjA3ar", + "description": "separate durable nonce and blockhash domains #25744", + "status": "active", + "sinceSlot": 138240000 + }, + { + "id": "HxrEu1gXuH7iD3Puua1ohd5n4iUKJyFNtNxk9DVJkvgr", + "description": "nonce must be authorized", + "status": "active", + "sinceSlot": 138240000 + }, + { + "id": "2h63t332mGCCsWK2nqqqHhN4U9ayyqhLVFvczznHDoTZ", + "description": "update syscall base costs", + "status": "active", + "sinceSlot": 138672000 + }, + { + "id": "AVZS3ZsN4gi6Rkx2QUibYuSJG3S6QHib7xCYhG6vGJxU", + "description": "vote account withdraw authority may change the authorized voter #22521", + "status": "active", + "sinceSlot": 138672000 + }, + { + "id": "3XgNukcZWf9o3HdA3fpJbm94XFc4qpvTXc8h1wxYwiPi", + "description": "disable ldabs* and ldind* SBF instructions", + "status": "active", + "sinceSlot": 139104000 + }, + { + "id": "4yuaYAj2jGMGTh1sSmi4G2eFscsDq8qjugJXZoBN6YEa", + "description": "disable reporting of unresolved SBF symbols at runtime", + "status": "active", + "sinceSlot": 139104000 + }, + { + "id": "7GUcYgq4tVtaqNCKT3dho9r4665Qp5TxCZ27Qgjx3829", + "description": "Executables incur CPI data costs", + "status": "active", + "sinceSlot": 139536000 + }, + { + "id": "CBkDroRDqm8HwHe6ak9cguPjUomrASEkfmxEaZ5CNNxz", + "description": "enforce max number of locked accounts per transaction", + "status": "active", + "sinceSlot": 140400004 + }, + { + "id": "DpJREPyuMZ5nDfU6H3WTqSqUFSXAfw8u7xqmWtEwJDcP", + "description": "quick bail on panic", + "status": "active", + "sinceSlot": 140400004 + }, + { + "id": "J2QdYx8crLbTVK8nur1jeLsmc3krDbfjoxoea2V1Uy5Q", + "description": "Default max tx-wide compute units calculated per instruction", + "status": "active", + "sinceSlot": 141264004 + }, + { + "id": "3aJdcZqxoLpSBxgeYGjPwaYS1zzcByxUDqJkbzWAH1Zb", + "description": "move the CPI stack overflow check to the end of push", + "status": "active", + "sinceSlot": 141696000 + }, + { + "id": "98std1NSHqXi9WYvFShfVepRdCoq1qvsp8fsR2XZtG8g", + "description": "add compute budget ix for setting a compute unit price", + "status": "active", + "sinceSlot": 142128000 + }, + { + "id": "7g9EUwj4j7CS21Yx1wvgWLjSZeh5aPq8x9kpoPwXM8n8", + "description": "limit secp256k1 recovery id", + "status": "active", + "sinceSlot": 142560008 + }, + { + "id": "nWBqjr3gpETbiaVj3CBJ3HFC5TMdnJDGt21hnvSTvVZ", + "description": "check physical overlapping regions", + "status": "active", + "sinceSlot": 142560008 + }, + { + "id": "4ApgRX3ud6p7LNMJmsuaAcZY5HWctGPr5obAsjB3A54d", + "description": "prevent calling precompiles as programs", + "status": "active", + "sinceSlot": 143424004 + }, + { + "id": "FaTa17gVKoqbh38HcfiQonPsAaQViyDCCSg71AubYZw8", + "description": "SPL Associated Token Account Program version 1.1.0 release #24741", + "status": "active", + "sinceSlot": 144288004 + }, + { + "id": "Ftok4njE8b7tDffYkC5bAbCaQv5sL6jispYrprzatUwN", + "description": "SPL Token Program version 3.4.0 release #24740", + "status": "active", + "sinceSlot": 144288004 + }, + { + "id": "2jXx2yDmGysmBKfKYNgLj2DQyAQv6mMk2BPh4eSbyB4H", + "description": "deprecate fee calculator", + "status": "active", + "sinceSlot": 147744004 + }, + { + "id": "6tRxEYKuy2L5nnv5bgn7iT28MxUbYxp5h7F3Ncf1exrT", + "description": "An instruction you can use to change a vote accounts authority when the current authority is a derived key #25860", + "status": "active", + "sinceSlot": 148608004 + }, + { + "id": "HyrbKftCdJ5CrUfEti6x26Cj7rZLNe32weugk7tLcWb8", + "description": "syscalls use saturated math", + "status": "active", + "sinceSlot": 150768000 + }, + { + "id": "21AWDosvp3pBamFW91KB35pNoaoZVTM7ess8nr2nt53B", + "description": "merge NonceError into SystemError", + "status": "active", + "sinceSlot": 151632012 + }, + { + "id": "H3kBSaKdeiUsyHmeHqjJYNc27jesXZ6zWj3zWkowQbkV", + "description": "fix owner for instructions sysvar", + "status": "active", + "sinceSlot": 152496000 + }, + { + "id": "8FdwgyHFEjhAdjWfV2vfqk7wA1g9X3fQpKH7SBpEv3kC", + "description": "require static program ids in versioned transactions", + "status": "active", + "sinceSlot": 153360000 + }, + { + "id": "2R72wpcQ7qV7aTJWUumdn8u5wmmTyXbK7qzEy7YSAgyY", + "description": "include account index in rent tx error #25190", + "status": "active", + "sinceSlot": 154224000 + }, + { + "id": "3KZZ6Ks1885aGBQ45fwRcPXVBCtzUvxhUTkwKMR41Tca", + "description": "enable versioned transaction message processing", + "status": "active", + "sinceSlot": 154656004 + }, + { + "id": "HH3MUYReL2BvqqA3oEcAa7txju5GY6G4nxJ51zvsEjEZ", + "description": "preserve rent epoch for rent exempt accounts #26479", + "status": "active", + "sinceSlot": 156384000 + }, + { + "id": "3gtZPqvPpsbXZVCx6hceMfWxtsmrjMzmg8C7PLKSxS2d", + "description": "filter vote slots older than the slot hashes history", + "status": "active", + "sinceSlot": 157680012 + }, + { + "id": "812kqX67odAp5NFwM8D2N24cku7WTm9CHUTFUXaDkWPn", + "description": "prevent crediting rent paying accounts #26606", + "status": "active", + "sinceSlot": 161136000 + }, + { + "id": "GTUMCZ8LTNxVfxdrw7ZsDFTxXb7TutYkzJnFwinpE6dg", + "description": "disable the deprecated BPF loader", + "status": "active", + "sinceSlot": 167184008 + }, + { + "id": "ALBk3EWdeAg2WAGf6GPDUf1nynyNqCdEVmgouG7rpuCj", + "description": "fail vote account withdraw to 0 unless account earned 0 credits in last completed epoch", + "status": "active", + "sinceSlot": 170640000 + }, + { + "id": "Vo5siZ442SaZBKPXNocthiXysNviW4UYPwRFggmbgAp", + "description": "fixes Bank::transaction_count to include all committed transactions, not just successful ones", + "status": "active", + "sinceSlot": 171072012 + }, + { + "id": "3uRVPBpyEJRo1emLCrq38eLRFGcu6uKSpUXqGvU8T7SZ", + "description": "check syscall outputs do_not overlap #28600", + "status": "active", + "sinceSlot": 174096000 + }, + { + "id": "437r62HoAdUb63amq3D7ENnBLDhHT2xY8eFkLJYVKK4x", + "description": "enable the deactivate delinquent stake instruction #23932", + "status": "active", + "sinceSlot": 198720004 + }, + { + "id": "4Di3y24QFLt5QEUPZtbnjyfQKfm6ZMTfa6Dw1psfoMKU", + "description": "drop redundant turbine path", + "status": "active", + "sinceSlot": 199152000 + }, + { + "id": "St8k9dVXP97xT6faW24YmRSYConLbhsMJA4TJTBLmMT", + "description": "add GetMinimumDelegation instruction to stake program", + "status": "active", + "sinceSlot": 199584000 + }, + { + "id": "sTKz343FM8mqtyGvYWvbLpTThw3ixRM4Xk8QvZ985mw", + "description": "Allow zero-lamport undelegated amount for initialized stakes #24670", + "status": "active", + "sinceSlot": 200016004 + }, + { + "id": "BUS12ciZ5gCoFafUHWW8qaFMMtwFQGVxjsDheWLdqBE2", + "description": "Auto rewind stake's credits_observed if (accidental) vote recreation is detected #22546", + "status": "active", + "sinceSlot": 200448008 + }, + { + "id": "54KAoNiUERNoWWUhTWWwXgym94gzoXFVnHyQwPA18V9A", + "description": "fail libsecp256k1_verify if count appears wrong", + "status": "active", + "sinceSlot": 200880004 + }, + { + "id": "G74BkWBzmsByZ1kxHy44H3wjwp5hp7JbrGRuDpco22tY", + "description": "fix root in vote state updates #27361", + "status": "active", + "sinceSlot": 202176000 + }, + { + "id": "74CoWuBmt3rUVUrCb2JiSTvh6nXyBWUsK4SaMj3CtE3T", + "description": "cpi ignore serialized_len_ptr #29592", + "status": "active", + "sinceSlot": 202608000 + }, + { + "id": "FQnc7U4koHqWgRvFaBJjZnV8VPg6L6wWK33yJeDp4yvV", + "description": "stake split instruction uses rent sysvar", + "status": "active", + "sinceSlot": 203904008 + }, + { + "id": "CpkdQmspsaZZ8FVAouQTtTWZkc8eeQ7V3uj7dWz543rZ", + "description": "on bank load account, do not try to fix up rent_epoch #28541", + "status": "active", + "sinceSlot": 204336000 + }, + { + "id": "DTVTkmw3JSofd8CJVJte8PXEbxNQ2yZijvVr3pe2APPj", + "description": "on accounts hash calculation, do not try to rehash accounts #28934", + "status": "active", + "sinceSlot": 204336000 + }, + { + "id": "6iyggb5MTcsvdcugX7bEKbHV8c6jdLbpHwkncrgLMhfo", + "description": "stop adding hashes for skipped slots to recent blockhashes", + "status": "active", + "sinceSlot": 204768000 + }, + { + "id": "9k5ijzTbYPtjzu8wj2ErH9v45xecHzQ1x4PMYMMxFgdM", + "description": "enforce max number of accounts per bpf program instruction #26628", + "status": "active", + "sinceSlot": 205200004 + }, + { + "id": "28s7i3htzhahXQKqmS2ExzbEoUypg9krwvtK2M9UWXh9", + "description": "update rewards from cached accounts", + "status": "active", + "sinceSlot": 206064004 + }, + { + "id": "8sKQrMQoUHtQSUP83SPG4ta2JDjSAiWs7t5aJ9uEd6To", + "description": "use default units per instruction in fee calculation #26785", + "status": "active", + "sinceSlot": 206496008 + }, + { + "id": "4UDcAfQ6EcA6bdcadkeHpkarkhZGJ7Bpq7wTAiRMjkoi", + "description": "disable builtin loader ownership chains #29956", + "status": "active", + "sinceSlot": 207360004 + }, + { + "id": "GmC19j9qLn2RFk5NduX6QXaDhVpGncVVBzyM8e9WMz2F", + "description": "check size when translating slices", + "status": "active", + "sinceSlot": 207792008 + }, + { + "id": "JAN1trEUEtZjgXYzNBYHU9DYd7GnThhXfFP7SzPXkPsG", + "description": "disable fees sysvar", + "status": "active", + "sinceSlot": 208656004 + }, + { + "id": "79HWsX9rpnnJBPcdNURVqygpMAfxdrAirzAGAVmf92im", + "description": "disable new deployments of deprecated sol_alloc_free_ syscall", + "status": "active", + "sinceSlot": 209088008 + }, + { + "id": "noRuG2kzACwgaY7TVmLRnUNPLKNVQE1fb7X55YWBehp", + "description": "validator commission updates are only allowed in the first half of an epoch #29362", + "status": "active", + "sinceSlot": 210384016 + }, + { + "id": "Bj2jmUsM2iRhfdLLDSTkhM5UQRQvQHm57HSmPibPtEyu", + "description": "Return InsufficientDelegation instead of InsufficientFunds or InsufficientStake where applicable #31206", + "status": "active", + "sinceSlot": 211680000 + }, + { + "id": "86HpNqzutEZwLcPxS6EHDcMNYWk6ikhteg9un7Y2PBKE", + "description": "Compact vote state updates to lower block size", + "status": "active", + "sinceSlot": 212112000 + }, + { + "id": "CveezY6FDLVBToHDcvJRmtMouqzsmj4UXYh5ths5G5Uv", + "description": "Calculate vote credits for VoteStateUpdate per vote dequeue to match credit awards for Vote instruction", + "status": "active", + "sinceSlot": 212112000 + }, + { + "id": "Ff8b1fBeB86q8cjq47ZhsQLgv5EkHu3G1C99zjUfAzrq", + "description": "enable direct vote state update", + "status": "active", + "sinceSlot": 212112000 + }, + { + "id": "Hr1nUA9b7NJ6eChS26o7Vi8gYYDDwWD3YeBfzJkTbU86", + "description": "Enable transaction to request heap frame using compute budget instruction #30076", + "status": "active", + "sinceSlot": 217296000 + }, + { + "id": "7Vced912WrRnfjaiKRiNBcbuFw7RrnLv3E3z95Y4GTNc", + "description": "enable early verification of account modifications #25899", + "status": "active", + "sinceSlot": 222048008 + }, + { + "id": "Ffswd3egL3tccB6Rv3XY6oqfdzn913vUcjCSnpvCKpfx", + "description": "better error codes for tx lamport check #33353", + "status": "active", + "sinceSlot": 222480020 + }, + { + "id": "GQALDaC48fEhZGWRj9iL5Q889emJKcj3aCvHF7VCbbF4", + "description": "limit max instruction trace length #27939", + "status": "active", + "sinceSlot": 224208000 + }, + { + "id": "9gxu85LYRAcZL38We8MYJ4A9AwgBBPtVBAqebMcT1241", + "description": "cap accounts data allocations per transaction #27375", + "status": "active", + "sinceSlot": 224640020 + }, + { + "id": "SVn36yVApPLYsa8koK3qUcy14zXDnqkNYWyUh1f4oK1", + "description": "ignore slot when calculating an account hash #28420", + "status": "active", + "sinceSlot": 225504004 + }, + { + "id": "B9cdB55u4jQsDNsdTK525yE9dmSc5Ga7YBaBrDFvEhM9", + "description": "disable setting is_executable and_rent_epoch in CPI #26987", + "status": "active", + "sinceSlot": 225936004 + }, + { + "id": "5GpmAKxaGsWWbPp4bNXFLJxZVvG92ctxf7jQnzTQjF3n", + "description": "enable epoch accounts hash calculation #27539", + "status": "active", + "sinceSlot": 228528004 + }, + { + "id": "GmuBvtFb2aHfSfMXpuFeWZGHyDeCLPS79s48fmCWCfM5", + "description": "delay visibility of program upgrades #30085", + "status": "active", + "sinceSlot": 228960012 + }, + { + "id": "J4HFT8usBxpcF63y46t1upYobJgChmKyZPm5uTBRg25Z", + "description": "enable program redeployment cooldown #29135", + "status": "active", + "sinceSlot": 228960012 + }, + { + "id": "8Zs9W7D9MpSEtUWSQdGniZk2cNmV22y6FLJwCx53asme", + "description": "enable bpf upgradeable loader ExtendProgram instruction #25234", + "status": "active", + "sinceSlot": 229824000 + }, + { + "id": "DdLwVYuvDz26JohmgSbA7mjpJFgX5zP2dkp8qsF2C33V", + "description": "cap transaction accounts data size up to a limit #27839", + "status": "active", + "sinceSlot": 230256020 + }, + { + "id": "G6vbf1UBok8MWb8m25ex86aoQHeKTzDKzuZADHkShqm6", + "description": "add compute budget instruction for setting account data size per transaction #30366", + "status": "active", + "sinceSlot": 231984004 + }, + { + "id": "3uFHb9oKdGfgZGJK9EHaAXN4USvnQtAFC13Fh5gGFS5B", + "description": "Update desired hashes per tick on epoch boundary", + "status": "active", + "sinceSlot": 232848000 + }, + { + "id": "EfhYd3SafzGT472tYQDUc4dPd2xdEfKs5fwkowUgVt4W", + "description": "remove support for RequestUnitsDeprecated instruction #27500", + "status": "active", + "sinceSlot": 233280000 + }, + { + "id": "Fab5oP3DmsLYCiQZXdjyqT3ukFFPrsmqhXU4WU1AWVVF", + "description": "prevent recipients of rent rewards from ending in rent-paying state #30151", + "status": "active", + "sinceSlot": 234144000 + }, + { + "id": "5Pecy6ie6XGm22pc9d4P9W5c31BugcFBuy6hsP2zkETv", + "description": "checked arithmetic in fee validation #31273", + "status": "active", + "sinceSlot": 234576004 + }, + { + "id": "CE2et8pqgyQMP2mQRg3CgvX8nJBKUArMu3wfiQiQKY1y", + "description": "round up heap size when calculating heap cost #30679", + "status": "active", + "sinceSlot": 235440004 + }, + { + "id": "EYVpEP7uzH1CoXzbD6PubGhYmnxRXPeq3PPsm1ba3gpo", + "description": "stop the search in get_processed_sibling_instruction when the parent instruction is reached #27289", + "status": "active", + "sinceSlot": 236304016 + }, + { + "id": "A8xyMHZovGXFkorFqEmVH2PKGLiBip5JD7jt4zsUWo4H", + "description": "Remove congestion multiplier from transaction fee calculation #29881", + "status": "active", + "sinceSlot": 236736000 + }, + { + "id": "2HmTkCj9tXuPE4ueHzdD7jPeMf9JGCoZh5AsyoATiWEe", + "description": "stop incorrectly throwing IncorrectProgramId in bpf_loader #30747", + "status": "active", + "sinceSlot": 237168000 + }, + { + "id": "16FMCmgLzCNNz6eTwGanbyN2ZxvTBSLuQ6DZhgeMshg", + "description": "Stop truncating strings in syscalls #31029", + "status": "active", + "sinceSlot": 240192004 + }, + { + "id": "8pgXCMNXC8qyEFypuwpXyRxLXZdpM4Qo72gJ6k87A6wL", + "description": "Native program should consume compute units #30620", + "status": "active", + "sinceSlot": 240624008 + }, + { + "id": "5ZCcFAzJ1zsFKe1KSZa9K92jhx7gkcKj97ci2DBo1vwj", + "description": "Simplify checks performed for writable upgradeable program accounts #30559", + "status": "active", + "sinceSlot": 241056004 + }, + { + "id": "25vqsfjk7Nv1prsQJmA4Xu1bN61s8LXCBGUPp8Rfy1UF", + "description": "only hash accounts in incremental snapshot during incremental snapshot creation #26799", + "status": "active", + "sinceSlot": 243648004 + }, + { + "id": "GwtDQBghCTBgmX2cpEGNPxTEBUTQRaDMGTr5qychdGMj", + "description": "reduce stake warmup cooldown from 25% to 9%", + "status": "active", + "sinceSlot": 244080000 + }, + { + "id": "BTWmtJC8U5ZLMbBUUA1k6As62sYjPEjAiNAT55xYGdJU", + "description": "revise turbine epoch stakes", + "status": "active", + "sinceSlot": 244944000 + }, + { + "id": "5wAGiy15X1Jb2hkHnPDCM8oB9V42VNA9ftNVFK84dEgv", + "description": "set rent epoch to Epoch::MAX for rent-exempt accounts #28683", + "status": "active", + "sinceSlot": 246240000 + }, + { + "id": "D31EFnLgdiysi84Woo3of4JMu7VmasUS3Z7j9HYXCeLY", + "description": "enable turbine fanout experiments #29393", + "status": "active", + "sinceSlot": 247104008 + }, + { + "id": "FKAcEvNgSY79RpqsPNUV5gDyumopH4cEHqUxyfm8b8Ap", + "description": "relax authority signer check for lookup table creation #27205", + "status": "active", + "sinceSlot": 249264000 + }, + { + "id": "5x3825XS7M2A3Ekbn5VGGkvFoAg5qrRWkTrY4bARP1GL", + "description": "enable bpf upgradeable loader SetAuthorityChecked instruction #28424", + "status": "active", + "sinceSlot": 251424000 + }, + { + "id": "7axKe5BTYBDD87ftzWbk5DfzWMGyRvqmWTduuo22Yaqy", + "description": "replace Lockout with LandedVote (including vote latency) in vote state #31264", + "status": "active", + "sinceSlot": 252720000 + }, + { + "id": "EWme9uFqfy1ikK1jhJs8fM5hxWnK336QJpbscNtizkTU", + "description": "Update desired hashes per tick to 2.8M", + "status": "active", + "sinceSlot": 253584001 + }, + { + "id": "D2aip4BBr8NPWtU9vLrwrBvbuaQ8w1zV38zFLxx4pfBV", + "description": "Require stake split destination account to be rent exempt", + "status": "active", + "sinceSlot": 254016004 + }, + { + "id": "8C8MCtsab5SsfammbzvYz65HHauuUYdbY2DZ4sznH6h5", + "description": "Update desired hashes per tick to 4.4M", + "status": "active", + "sinceSlot": 255312004 + }, + { + "id": "8We4E7DPwF2WfAN8tRTtWQNhi98B99Qpuj7JoZ3Aikgg", + "description": "Update desired hashes per tick to 7.6M", + "status": "active", + "sinceSlot": 255744008 + }, + { + "id": "BsKLKAn1WM4HVhPRDsjosmqSg2J8Tq5xP2s2daDS6Ni4", + "description": "Update desired hashes per tick to 9.2M", + "status": "active", + "sinceSlot": 257040000 + }, + { + "id": "FKu1qYwLQSiehz644H6Si65U5ZQ2cp9GxsyFUfYcuADv", + "description": "Update desired hashes per tick to 10M", + "status": "active", + "sinceSlot": 257904000 + }, + { + "id": "prpFrMtgNmzaNzkPJg9o753fVvbHKqNrNTm76foJ2wm", + "description": "validate fee collector account #33888", + "status": "active", + "sinceSlot": 258336004 + }, + { + "id": "GV49KKQdBNaiv2pgqhS2Dy3GWYJGXMTVYbYkdk91orRy", + "description": "drops legacy shreds #34328", + "status": "active", + "sinceSlot": 259200004 + }, + { + "id": "7WeS1vfPRgeeoXArLh7879YcB9mgE9ktjPDtajXeWfXn", + "description": "disable bpf loader management instructions #34194", + "status": "active", + "sinceSlot": 259632004 + }, + { + "id": "6YsBCejwK96GZCkJ6mkZ4b68oP63z2PLoQmWjC7ggTqZ", + "description": "consume duplicate proofs from blockstore in consensus #34372", + "status": "active", + "sinceSlot": 260064000 + }, + { + "id": "dupPajaLy2SSn8ko42aZz4mHANDNrLe8Nw8VQgFecLa", + "description": "generate duplicate proofs for index and erasure conflicts #34360", + "status": "active", + "sinceSlot": 260496000 + }, + { + "id": "eca6zf6JJRjQsYYPkBHF3N32MTzur4n2WL4QiiacPCL", + "description": "restrict curve25519 multiscalar multiplication vector lengths #34763", + "status": "active", + "sinceSlot": 262224008 + }, + { + "id": "2KKG3C6RBnxQo9jVVrbzsoSh41TDXLK7gBc9gduyxSzW", + "description": "enable the redelegate stake instruction #26294", + "status": "inactive" + }, + { + "id": "2ry7ygxiYURULZCrypHhveanvP5tzZ4toRwVp89oCNSj", + "description": "apply cost tracker to blocks during replay #29595", + "status": "inactive" + }, + { + "id": "3NKRSwpySNwD3TvP5pHnRmkAQRsdkXWRr1WaQh8p4PWX", + "description": "Reject bpf callx r10 instructions", + "status": "inactive" + }, + { + "id": "41tVp5qR1XwWRt5WifvtSQyuxtqQWJgEK8w91AtBqSwP", + "description": "enable partitioned rewards at epoch boundary #32166", + "status": "inactive" + }, + { + "id": "5TuppMutoyzhUSfuYdhgzD47F92GL1g89KpCZQKqedxP", + "description": "enable the remaining_compute_units syscall", + "status": "inactive" + }, + { + "id": "6Uf8S75PVh91MYgPQSHnjRAPQq6an5BDv9vomrCwDqLe", + "description": "Deprecate unused legacy vote tx plumbing", + "status": "inactive" + }, + { + "id": "7rcw5UtqgDTBBv2EcynNfYckgdAaH1MAsCjKgXMkN7Ri", + "description": "enable curve25519 syscalls", + "status": "inactive" + }, + { + "id": "7uZBkJXJ1HkuP6R3MJfZs7mLwymBcDbKdqbF51ZWLier", + "description": "Enable chained Merkle shreds #34916", + "status": "inactive" + }, + { + "id": "8199Q2gMD2kwgfopK5qqVWuDbegLgpuFUFHCcUJQDN8b", + "description": "error on bpf function hash collisions", + "status": "inactive" + }, + { + "id": "8aXvSuopd1PUj7UhehfXJRg6619RHp8ZvwTyyJHdUYsj", + "description": "fail libsecp256k1_verify if count appears wrong", + "status": "inactive" + }, + { + "id": "8oBxsYqnCvUTGzgEpxPcnVf7MLbWWPYddE33PftFeBBd", + "description": "Enable Program-Runtime-v2 and Loader-v4 #33293", + "status": "inactive" + }, + { + "id": "9LZdXeKGeBV6hRLdxS1rHbHoEUsKqesCC2ZAPTPKJAbK", + "description": "increase tx account lock limit to 128 #27241", + "status": "inactive" + }, + { + "id": "9onWzzvCzNC2jfhxxeqRgs5q7nFAAKpCUvkj6T6GJK9i", + "description": "Raise minimum stake delegation to 1.0 SOL #24357", + "status": "inactive" + }, + { + "id": "A16q37opZdQMCbe5qJ6xpBB9usykfv8jZaMkxvZQi4GJ", + "description": "add alt_bn128 syscalls #27961", + "status": "inactive" + }, + { + "id": "CGB2jM8pwZkeeiXQ66kBMyBR6Np61mggL7XUsmLjVcrw", + "description": "skip rewriting rent exempt accounts during rent collection #26491", + "status": "inactive" + }, + { + "id": "CJzY83ggJHqPGDq8VisV3U91jDJLuEaALZooBrXtnnLU", + "description": "Disable rent fees collection #33945", + "status": "inactive" + }, + { + "id": "Cdkc8PPTeTNUPoZEfCY5AyetUrEdkZtNPMgz58nqyaHD", + "description": "switch to new ELF parser #30497", + "status": "inactive" + }, + { + "id": "DT4n6ABDqs6w4bnfwrXT9rsprcPf6cdDga1egctaPkLC", + "description": "full inflation on devnet and testnet", + "status": "inactive" + }, + { + "id": "EBq48m8irRKuE7ZnMTLvLg2UuGSqhe8s8oMqnmja1fJw", + "description": "add big_mod_exp syscall #28503", + "status": "inactive" + }, + { + "id": "EJJewYSddEEtSZHiqugnvhQHiWyZKjkFDQASd7oKSagn", + "description": "add alt_bn128 compression syscalls", + "status": "inactive" + }, + { + "id": "EaQpmC6GtRssaZ3PCUM5YksGqUdMLeZ46BQXYtHYakDS", + "description": "include transaction loaded accounts data size in base fee calculation #30657", + "status": "inactive" + }, + { + "id": "EenyoWx9UMXYKpR8mW5Jmfmy2fRjzUtM7NduYMY8bx33", + "description": "use memory regions to map account data into the rbpf vm instead of copying the data", + "status": "inactive" + }, + { + "id": "FL9RsQA6TVUoh5xJQ9d936RHSebA1NLQqe3Zv9sXZRpr", + "description": "Enable Poseidon syscall", + "status": "inactive" + }, + { + "id": "FNKCMBzYUdjhHyPdsKG2LSmdzH8TCHXn3ytj8RNBS4nG", + "description": "enable gossip duplicate proof ingestion #32963", + "status": "inactive" + }, + { + "id": "G6ANXD6ptCSyNd9znZm7j4dEczAJCfx7Cy43oBx3rKHJ", + "description": "stakes must be at least the minimum delegation to earn rewards", + "status": "inactive" + }, + { + "id": "GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm", + "description": "loosen cpi size restrictions #26641", + "status": "inactive" + }, + { + "id": "Gz1aLrbeQ4Q6PTSafCZcGWZXz91yVRi7ASFzFEr1U4sa", + "description": "disable turbine fanout experiments #29393", + "status": "inactive" + }, + { + "id": "HTW2pSyErTj4BV6KBM9NZ9VBUJVxt7sacNWcf76wtzb3", + "description": "blake3 syscall", + "status": "inactive" + }, + { + "id": "HooKD5NC9QNxk25QuzCssB8ecrEzGt6eXEPBUxWp1LaR", + "description": "enable new sysvar last_restart_slot", + "status": "inactive" + }, + { + "id": "capRxUrBjNkkCpjrJxPGfPaWijB7q3JoDfsWXAnt46r", + "description": "cap the accounts data len", + "status": "inactive" + }, + { + "id": "decoMktMcnmiq6t3u7g5BfgcQu91nKZr6RvMYf9z1Jb", + "description": "Allow commission decrease at any time in epoch #33843", + "status": "inactive" + }, + { + "id": "mrkPjRg79B2oK2ZLgd7S3AfEJaX9B6gAF3H9aEykRUS", + "description": "generate duplicate proofs for merkle root conflicts #34270", + "status": "inactive" + }, + { + "id": "qywiJyZmqTKspFg2LeuUHqcA5nNvBgobqb9UprywS9N", + "description": "cap the accounts data size per block #25517", + "status": "inactive" + }, + { + "id": "tvcF6b1TRz353zKuhBjinZkKzjmihXmBAHJdjNYw1sQ", + "description": "use timeliness of votes in determining credits to award", + "status": "inactive" + }, + { + "id": "wLckV1a64ngtcKPRGU4S4grVTestXjmNjxBjaKZrAcn", + "description": "cost model uses number of requested write locks #34819", + "status": "inactive" + }, + { + "id": "zk1snxsc6Fh3wsGNbbHAJNHiJoYgF29mMnTSusGx5EJ", + "description": "enable Zk Token proof program and syscalls", + "status": "inactive" + }, + { + "id": "zkNLP7EQALfC1TYeB3biDU7akDckj8iPkvh9y2Mt2K3", + "description": "enable Zk Token proof program transfer with fee", + "status": "inactive" + }, + { + "id": "zkiTNuzBKxrCLMKehzuQeKZyLtX2yvFcEKMML8nExU8", + "description": "Enable zk token proof program to read proof from accounts instead of instruction data #34750", + "status": "inactive" + } + ], + "featureActivationAllowed": false, + "clusterFeatureSets": { + "toolFeatureSet": 3469865029, + "featureSets": [ + { + "softwareVersions": [ + "2.0.0" + ], + "featureSet": 267531149, + "stakePercent": 0.027826782030053367, + "rpcPercent": 0.8403362 + }, + { + "softwareVersions": [ + "2.0.0" + ], + "featureSet": 981802724, + "stakePercent": 0.013908512226370611, + "rpcPercent": 3.6414568 + }, + { + "softwareVersions": [ + "2.0.0" + ], + "featureSet": 3151994298, + "stakePercent": 0.013668335905452075, + "rpcPercent": 0.28011206 + }, + { + "softwareVersions": [ + "1.19.0" + ], + "featureSet": 2170511977, + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersions": [ + "1.18.13", + "1.18.12" + ], + "featureSet": 4215500110, + "stakePercent": 0.032134488759664626, + "rpcPercent": 3.9215689 + }, + { + "softwareVersions": [ + "1.18.6", + "1.18.4" + ], + "featureSet": 3352961542, + "stakePercent": 0.0, + "rpcPercent": 0.8403362 + }, + { + "softwareVersions": [ + "1.17.34", + "1.17.33", + "1.17.32", + "1.17.31", + "1.17.30", + "1.17.29", + "1.17.28", + "1.17.27" + ], + "featureSet": 3746964731, + "stakePercent": 99.45933642584787, + "rpcPercent": 73.10926 + }, + { + "softwareVersions": [ + "1.17.26", + "1.17.25", + "1.17.22", + "1.17.20" + ], + "featureSet": 3580551090, + "stakePercent": 0.231958113204357, + "rpcPercent": 15.406163 + }, + { + "softwareVersions": [ + "1.17.17" + ], + "featureSet": 1337574167, + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersions": [ + "1.17.16" + ], + "featureSet": 1237720363, + "stakePercent": 0.0, + "rpcPercent": 0.5602241 + }, + { + "softwareVersions": [ + "unknown" + ], + "featureSet": 0, + "stakePercent": 0.0, + "rpcPercent": 0.8403362 + } + ] + }, + "clusterSoftwareVersions": { + "toolSoftwareVersion": "1.18.8", + "softwareVersions": [ + { + "softwareVersion": "2.0.0", + "stakePercent": 0.05540363016187605, + "rpcPercent": 4.761905 + }, + { + "softwareVersion": "1.19.0", + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.18.13", + "stakePercent": 0.02782334819985091, + "rpcPercent": 1.1204482 + }, + { + "softwareVersion": "1.18.12", + "stakePercent": 0.004311140559813716, + "rpcPercent": 2.8011205 + }, + { + "softwareVersion": "1.18.6", + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.18.4", + "stakePercent": 0.0, + "rpcPercent": 0.5602241 + }, + { + "softwareVersion": "1.17.34", + "stakePercent": 0.013931999792144996, + "rpcPercent": 0.8403362 + }, + { + "softwareVersion": "1.17.33", + "stakePercent": 64.71481110705389, + "rpcPercent": 47.61905 + }, + { + "softwareVersion": "1.17.32", + "stakePercent": 0.17171743211867097, + "rpcPercent": 0.8403362 + }, + { + "softwareVersion": "1.17.31", + "stakePercent": 34.21783635001347, + "rpcPercent": 17.086836 + }, + { + "softwareVersion": "1.17.30", + "stakePercent": 0.013665251569888332, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.17.29", + "stakePercent": 0.0, + "rpcPercent": 2.2408965 + }, + { + "softwareVersion": "1.17.28", + "stakePercent": 0.301028976828381, + "rpcPercent": 3.6414568 + }, + { + "softwareVersion": "1.17.27", + "stakePercent": 0.026345308471418777, + "rpcPercent": 0.5602241 + }, + { + "softwareVersion": "1.17.26", + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.17.25", + "stakePercent": 0.15379585484118757, + "rpcPercent": 1.1204482 + }, + { + "softwareVersion": "1.17.22", + "stakePercent": 0.0021511817060728363, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.17.20", + "stakePercent": 0.0760110766570966, + "rpcPercent": 13.725491 + }, + { + "softwareVersion": "1.17.17", + "stakePercent": 0.0, + "rpcPercent": 0.28011206 + }, + { + "softwareVersion": "1.17.16", + "stakePercent": 0.0, + "rpcPercent": 0.5602241 + }, + { + "softwareVersion": "unknown", + "stakePercent": 0.0, + "rpcPercent": 0.8403362 + } + ] + } +}