Skip to content

Commit

Permalink
token collections: create spec program
Browse files Browse the repository at this point in the history
  • Loading branch information
buffalojoec committed Oct 24, 2023
1 parent 367dff4 commit 6f7fef4
Show file tree
Hide file tree
Showing 10 changed files with 892 additions and 0 deletions.
66 changes: 66 additions & 0 deletions .github/workflows/pull-request-token-collection.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Token Collection Pull Request

on:
pull_request:
paths:
- 'token-collection/**'
- 'token/**'
- 'token-group/**'
- 'token-metadata/**'
- 'ci/*-version.sh'
- '.github/workflows/pull-request-token-collection.yml'
push:
branches: [master]
paths:
- 'token-collection/**'
- 'token/**'
- 'token-group/**'
- 'token-metadata/**'
- 'ci/*-version.sh'
- '.github/workflows/pull-request-token-collection.yml'

jobs:
cargo-test-sbf:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: Set env vars
run: |
source ci/rust-version.sh
echo "RUST_STABLE=$rust_stable" >> $GITHUB_ENV
source ci/solana-version.sh
echo "SOLANA_VERSION=$solana_version" >> $GITHUB_ENV
- uses: actions-rs/toolchain@v1
with:
toolchain: ${{ env.RUST_STABLE }}
override: true
profile: minimal

- uses: actions/cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
key: cargo-build-${{ hashFiles('**/Cargo.lock') }}-${{ env.RUST_STABLE}}

- uses: actions/cache@v2
with:
path: |
~/.cargo/bin/rustfilt
key: cargo-sbf-bins-${{ runner.os }}

- uses: actions/cache@v2
with:
path: ~/.cache/solana
key: solana-${{ env.SOLANA_VERSION }}

- name: Install dependencies
run: |
./ci/install-build-deps.sh
./ci/install-program-deps.sh
echo "$HOME/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH
- name: Build and test
run: ./ci/cargo-test-sbf.sh token-collection
17 changes: 17 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ members = [
"stake-pool/cli",
"stake-pool/program",
"stateless-asks/program",
"token-collection/program",
"token-group/example",
"token-group/interface",
"token-lending/cli",
Expand Down
24 changes: 24 additions & 0 deletions token-collection/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# SPL Token Collection

This program serves as a reference implementation for using the SPL Token Group
interface to create an on-chain program for managing token collections - such
as NFT Collections.

This program bears a lot of similarity to the example program found at
`token-group/example`, but with some additional implementations centered around
specifically token collections.

## How Collections Work in this Program

Strictly for demonstration purposes, this program is going to require the
following:

- Group tokens must be NFTs (0 decimals, 1 supply)
- Group tokens must have metadata
- Member tokens can be any SPL token, but must have metadata
- Member tokens can be part of multiple collections

## Demonstration

For a particularly fleshed-out example of this program in action, check out the
`token-collections.rs` test under `tests`!
33 changes: 33 additions & 0 deletions token-collection/program/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[package]
name = "spl-token-collection"
version = "0.1.0"
description = "Solana Program Library Token Collection"
authors = ["Solana Labs Maintainers <[email protected]>"]
repository = "https://github.com/solana-labs/solana-program-library"
license = "Apache-2.0"
edition = "2021"

[features]
no-entrypoint = []
test-sbf = []

[dependencies]
solana-program = "1.17.2"
spl-pod = { version = "0.1.0", path = "../../libraries/pod" }
spl-program-error = { version = "0.3.0" , path = "../../libraries/program-error" }
spl-token-2022 = { version = "0.9.0", path = "../../token/program-2022", features = ["no-entrypoint"] }
spl-token-group-interface = { version = "0.1.0", path = "../../token-group/interface" }
spl-token-metadata-interface = { version = "0.2", path = "../../token-metadata/interface" }
spl-type-length-value = { version = "0.3.0", path = "../../libraries/type-length-value" }

[dev-dependencies]
solana-program-test = "1.17.2"
solana-sdk = "1.17.2"
spl-discriminator = { version = "0.1.0", path = "../../libraries/discriminator" }
spl-token-client = { version = "0.7", path = "../../token/client" }

[lib]
crate-type = ["cdylib", "lib"]

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
23 changes: 23 additions & 0 deletions token-collection/program/src/entrypoint.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//! Program entrypoint
use {
crate::processor,
solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult,
program_error::PrintProgramError, pubkey::Pubkey,
},
spl_token_group_interface::error::TokenGroupError,
};

entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
if let Err(error) = processor::process(program_id, accounts, instruction_data) {
error.print::<TokenGroupError>();
return Err(error);
}
Ok(())
}
10 changes: 10 additions & 0 deletions token-collection/program/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//! Crate defining the Token Collection program implementing the
//! SPL Token Group interface.
#![deny(missing_docs)]
#![forbid(unsafe_code)]

pub mod processor;

#[cfg(not(feature = "no-entrypoint"))]
mod entrypoint;
Loading

0 comments on commit 6f7fef4

Please sign in to comment.