|
1 | | -# Feature Gate |
| 1 | +# Solana Feature Gate Program |
2 | 2 |
|
3 | 3 | <a href="https://github.com/solana-program/feature-gate/actions/workflows/main.yml"><img src="https://img.shields.io/github/actions/workflow/status/solana-program/feature-gate/main.yml?logo=GitHub" /></a> |
4 | 4 | <a href="https://explorer.solana.com/address/Feature111111111111111111111111111111111111"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolana-program%2Ffeature-gate%2Fmain%2Fprogram%2Fidl.json&query=%24.version&label=program&logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iMzEzIiBoZWlnaHQ9IjI4MSIgdmlld0JveD0iMCAwIDMxMyAyODEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NzZfMjQzMCkiPgo8cGF0aCBkPSJNMzExLjMxOCAyMjEuMDU3TDI1OS42NiAyNzYuNTU4QzI1OC41MzcgMjc3Ljc2NCAyNTcuMTc4IDI3OC43MjUgMjU1LjY2OSAyNzkuMzgyQzI1NC4xNTkgMjgwLjAzOSAyNTIuNTMgMjgwLjM3OCAyNTAuODg0IDI4MC4zNzdINS45OTcxOUM0LjgyODcgMjgwLjM3NyAzLjY4NTY4IDI4MC4wMzUgMi43MDg1NSAyNzkuMzkzQzEuNzMxNDMgMjc4Ljc1MSAwLjk2Mjc3MSAyNzcuODM3IDAuNDk3MDIgMjc2Ljc2NEMwLjAzMTI2OTEgMjc1LjY5IC0wLjExMTI4NiAyNzQuNTA0IDAuMDg2ODcxMiAyNzMuMzVDMC4yODUwMjggMjcyLjE5NiAwLjgxNTI2NSAyNzEuMTI2IDEuNjEyNDMgMjcwLjI3TDUzLjMwOTkgMjE0Ljc2OUM1NC40Mjk5IDIxMy41NjYgNTUuNzg0MyAyMTIuNjA3IDU3LjI4OTMgMjExLjk1QzU4Ljc5NDMgMjExLjI5MyA2MC40MTc4IDIxMC45NTMgNjIuMDU5NSAyMTAuOTVIMzA2LjkzM0MzMDguMTAxIDIxMC45NSAzMDkuMjQ0IDIxMS4yOTIgMzEwLjIyMSAyMTEuOTM0QzMxMS4xOTkgMjEyLjU3NiAzMTEuOTY3IDIxMy40OSAzMTIuNDMzIDIxNC41NjRDMzEyLjg5OSAyMTUuNjM3IDMxMy4wNDEgMjE2LjgyNCAzMTIuODQzIDIxNy45NzdDMzEyLjY0NSAyMTkuMTMxIDMxMi4xMTUgMjIwLjIwMSAzMTEuMzE4IDIyMS4wNTdaTTI1OS42NiAxMDkuMjk0QzI1OC41MzcgMTA4LjA4OCAyNTcuMTc4IDEwNy4xMjcgMjU1LjY2OSAxMDYuNDdDMjU0LjE1OSAxMDUuODEzIDI1Mi41MyAxMDUuNDc0IDI1MC44ODQgMTA1LjQ3NUg1Ljk5NzE5QzQuODI4NyAxMDUuNDc1IDMuNjg1NjggMTA1LjgxNyAyLjcwODU1IDEwNi40NTlDMS43MzE0MyAxMDcuMTAxIDAuOTYyNzcxIDEwOC4wMTUgMC40OTcwMiAxMDkuMDg4QzAuMDMxMjY5MSAxMTAuMTYyIC0wLjExMTI4NiAxMTEuMzQ4IDAuMDg2ODcxMiAxMTIuNTAyQzAuMjg1MDI4IDExMy42NTYgMC44MTUyNjUgMTE0LjcyNiAxLjYxMjQzIDExNS41ODJMNTMuMzA5OSAxNzEuMDgzQzU0LjQyOTkgMTcyLjI4NiA1NS43ODQzIDE3My4yNDUgNTcuMjg5MyAxNzMuOTAyQzU4Ljc5NDMgMTc0LjU1OSA2MC40MTc4IDE3NC44OTkgNjIuMDU5NSAxNzQuOTAySDMwNi45MzNDMzA4LjEwMSAxNzQuOTAyIDMwOS4yNDQgMTc0LjU2IDMxMC4yMjEgMTczLjkxOEMzMTEuMTk5IDE3My4yNzYgMzExLjk2NyAxNzIuMzYyIDMxMi40MzMgMTcxLjI4OEMzMTIuODk5IDE3MC4yMTUgMzEzLjA0MSAxNjkuMDI4IDMxMi44NDMgMTY3Ljg3NUMzMTIuNjQ1IDE2Ni43MjEgMzEyLjExNSAxNjUuNjUxIDMxMS4zMTggMTY0Ljc5NUwyNTkuNjYgMTA5LjI5NFpNNS45OTcxOSA2OS40MjY3SDI1MC44ODRDMjUyLjUzIDY5LjQyNzUgMjU0LjE1OSA2OS4wODkgMjU1LjY2OSA2OC40MzJDMjU3LjE3OCA2Ny43NzUxIDI1OC41MzcgNjYuODEzOSAyNTkuNjYgNjUuNjA4MkwzMTEuMzE4IDEwLjEwNjlDMzEyLjExNSA5LjI1MTA3IDMxMi42NDUgOC4xODA1NiAzMTIuODQzIDcuMDI2OTVDMzEzLjA0MSA1Ljg3MzM0IDMxMi44OTkgNC42ODY4NiAzMTIuNDMzIDMuNjEzM0MzMTEuOTY3IDIuNTM5NzQgMzExLjE5OSAxLjYyNTg2IDMxMC4yMjEgMC45ODM5NDFDMzA5LjI0NCAwLjM0MjAyNiAzMDguMTAxIDMuOTUzMTRlLTA1IDMwNi45MzMgMEw2Mi4wNTk1IDBDNjAuNDE3OCAwLjAwMjc5ODY2IDU4Ljc5NDMgMC4zNDMxNCA1Ny4yODkzIDAuOTk5OTUzQzU1Ljc4NDMgMS42NTY3NyA1NC40Mjk5IDIuNjE2MDcgNTMuMzA5OSAzLjgxODQ3TDEuNjI1NzYgNTkuMzE5N0MwLjgyOTM2MSA2MC4xNzQ4IDAuMjk5MzU5IDYxLjI0NCAwLjEwMDc1MiA2Mi4zOTY0Qy0wLjA5Nzg1MzkgNjMuNTQ4OCAwLjA0MzU2OTggNjQuNzM0MiAwLjUwNzY3OSA2NS44MDczQzAuOTcxNzg5IDY2Ljg4MDMgMS43Mzg0MSA2Ny43OTQzIDIuNzEzNTIgNjguNDM3MkMzLjY4ODYzIDY5LjA4MDIgNC44Mjk4NCA2OS40MjQgNS45OTcxOSA2OS40MjY3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzQ3Nl8yNDMwKSIvPgo8L2c+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfNDc2XzI0MzAiIHgxPSIyNi40MTUiIHkxPSIyODcuMDU5IiB4Mj0iMjgzLjczNSIgeTI9Ii0yLjQ5NTc0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIG9mZnNldD0iMC4wOCIgc3RvcC1jb2xvcj0iIzk5NDVGRiIvPgo8c3RvcCBvZmZzZXQ9IjAuMyIgc3RvcC1jb2xvcj0iIzg3NTJGMyIvPgo8c3RvcCBvZmZzZXQ9IjAuNSIgc3RvcC1jb2xvcj0iIzU0OTdENSIvPgo8c3RvcCBvZmZzZXQ9IjAuNiIgc3RvcC1jb2xvcj0iIzQzQjRDQSIvPgo8c3RvcCBvZmZzZXQ9IjAuNzIiIHN0b3AtY29sb3I9IiMyOEUwQjkiLz4KPHN0b3Agb2Zmc2V0PSIwLjk3IiBzdG9wLWNvbG9yPSIjMTlGQjlCIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfNDc2XzI0MzAiPgo8cmVjdCB3aWR0aD0iMzEyLjkzIiBoZWlnaHQ9IjI4MC4zNzciIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==&color=9945FF" /></a> |
5 | 5 | <a href="https://www.npmjs.com/package/@solana-program/feature-gate"><img src="https://img.shields.io/npm/v/%40solana-program%2Ffeature-gate?logo=npm&color=377CC0" /></a> |
6 | 6 | <a href="https://crates.io/crates/solana-feature-gate-client"><img src="https://img.shields.io/crates/v/solana-feature-gate-client?logo=rust" /></a> |
7 | 7 |
|
8 | | -This template should help get you started developing Solana programs. Let's walk through this generated program repository and see what's included. |
| 8 | +The Solana Feature Gate program is a new Core BPF program introduced in |
| 9 | +[SIMD 0089](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0089-programify-feature-gate-program.md). |
9 | 10 |
|
10 | | -## Project setup |
| 11 | +Currently, it's sole responsibility is to enable core contributors to revoke |
| 12 | +pending feature activations. With all feature accounts owned by |
| 13 | +`Feature111111111111111111111111111111111111` (this program's ID), that means |
| 14 | +this program can manipulate feature accounts. |
11 | 15 |
|
12 | | -The first thing you'll want to do is install NPM dependencies which will allow you to access all the scripts and tools provided by this template. |
| 16 | +As per SIMD 0089, the single instruction `RevokePendingActivation` can - |
| 17 | +provided a signature from the feature keypair - revoke a feature activation that |
| 18 | +has been recently queued for activation, but not yet activated. |
13 | 19 |
|
14 | | -```sh |
15 | | -pnpm install |
| 20 | +```rust |
| 21 | +enum FeatureGateInstruction { |
| 22 | + /// Revoke a pending feature activation. |
| 23 | + /// |
| 24 | + /// This instruction will burn any lamports in the feature account. |
| 25 | + /// |
| 26 | + /// A "pending" feature activation is a feature account that has been |
| 27 | + /// allocated and assigned, but hasn't yet been updated by the runtime |
| 28 | + /// with an `activation_slot`. |
| 29 | + /// |
| 30 | + /// Features that _have_ been activated by the runtime cannot be revoked. |
| 31 | + /// |
| 32 | + /// Accounts expected by this instruction: |
| 33 | + /// |
| 34 | + /// 0. `[w+s]` Feature account |
| 35 | + /// 1. `[w]` Incinerator |
| 36 | + /// 2. `[ ]` System program |
| 37 | + RevokePendingActivation, |
| 38 | +} |
16 | 39 | ``` |
17 | 40 |
|
18 | | -## Managing programs |
| 41 | +Support for this revoke instruction has been added to the Solana CLI. |
19 | 42 |
|
20 | | -You'll notice a `program` folder in the root of this repository. This is where your generated Solana program is located. |
| 43 | +## Build & Test |
21 | 44 |
|
22 | | -Whilst only one program gets generated, note that you can have as many programs as you like in this repository. |
23 | | -Whenever you add a new program folder to this repository, remember to add it to the `members` array of your root `Cargo.toml` file. |
24 | | -That way, your programs will be recognized by the following scripts that allow you to build, test, format and lint your programs respectively. |
| 45 | +This repository is managed with [`pnpm`](https://pnpm.io/). |
25 | 46 |
|
26 | | -```sh |
27 | | -pnpm programs:build |
28 | | -pnpm programs:test |
29 | | -pnpm programs:format |
30 | | -pnpm programs:lint |
31 | | -``` |
32 | | - |
33 | | -## Generating IDLs |
34 | | - |
35 | | -You may use the following command to generate the IDLs for your programs. |
36 | | - |
37 | | -```sh |
38 | | -pnpm generate:idls |
39 | | -``` |
40 | | - |
41 | | -Depending on your program's framework, this will either use Shank or Anchor to generate the IDLs. |
42 | | -Note that, to ensure IDLs are generated using the correct framework version, the specific version used by the program will be downloaded and used locally. |
| 47 | +All scripts can be found in `package.json` and under the `scripts` folder. |
43 | 48 |
|
44 | | -## Generating clients |
| 49 | +Build & test the program: |
45 | 50 |
|
46 | | -Once your programs' IDLs have been generated, you can generate clients for them using the following command. |
47 | | - |
48 | | -```sh |
49 | | -pnpm generate:clients |
50 | 51 | ``` |
51 | | - |
52 | | -Alternatively, you can use the `generate` script to generate both the IDLs and the clients at once. |
53 | | - |
54 | | -```sh |
55 | | -pnpm generate |
| 52 | +pnpm programs:build |
| 53 | +pnpm programs:test |
56 | 54 | ``` |
57 | 55 |
|
58 | | -## Managing clients |
| 56 | +## Clients |
59 | 57 |
|
60 | | -The following clients are available for your programs. You may use the following links to learn more about each client. |
| 58 | +The following clients are available for the Feature Gate program. |
61 | 59 |
|
62 | 60 | - [JS client](./clients/js) |
63 | 61 | - [Rust client](./clients/rust) |
64 | 62 |
|
65 | | -## Starting and stopping the local validator |
66 | | - |
67 | | -The following script is available to start your local validator. |
68 | | - |
69 | | -```sh |
70 | | -pnpm validator:start |
71 | | -``` |
72 | | - |
73 | | -By default, if a local validator is already running, the script will be skipped. You may use the `validator:restart` script instead to force the validator to restart. |
74 | | - |
75 | | -```sh |
76 | | -pnpm validator:restart |
77 | | -``` |
78 | | - |
79 | | -Finally, you may stop the local validator using the following command. |
80 | | - |
81 | | -```sh |
82 | | -pnpm validator:stop |
83 | | -``` |
84 | | - |
85 | | -## Using external programs in your validator |
86 | | - |
87 | | -If your program requires any external programs to be running, you'll want to in your local validator. |
88 | | - |
89 | | -You can do this by adding their program addresses to the `program-dependencies` array in the `Cargo.toml` of your program. |
90 | | - |
91 | | -```toml |
92 | | -program-dependencies = [ |
93 | | - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", |
94 | | - "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV", |
95 | | -] |
96 | | -``` |
97 | | - |
98 | | -Next time you build your program and run your validator, these external programs will automatically be fetched from mainnet and used in your local validator. |
99 | | - |
100 | | -```sh |
101 | | -pnpm programs:build |
102 | | -pnpm validator:restart |
103 | | -``` |
0 commit comments