Skip to content

Commit

Permalink
add tokens/transfer-tokens/steel (#182)
Browse files Browse the repository at this point in the history
  • Loading branch information
Perelyn-sama authored Jan 4, 2025
1 parent 24499bb commit 9776aa1
Show file tree
Hide file tree
Showing 22 changed files with 3,503 additions and 0 deletions.
2 changes: 2 additions & 0 deletions tokens/transfer-tokens/steel/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
target
test-ledger
26 changes: 26 additions & 0 deletions tokens/transfer-tokens/steel/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
[workspace]
resolver = "2"
members = ["api", "program"]

[workspace.package]
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
homepage = ""
documentation = ""
repository = ""
readme = "./README.md"
keywords = ["solana"]

[workspace.dependencies]
transfer-tokens-api = { path = "./api", version = "0.1.0" }
bytemuck = "1.14"
num_enum = "0.7"
solana-program = "1.18"
steel = { version = "2.0", features = ["spl"] }
thiserror = "1.0"
spl-token = "^4"
mpl-token-metadata = { version = "4.1.2" }
spl-associated-token-account = { version = "^2.3", features = [
"no-entrypoint",
] }
22 changes: 22 additions & 0 deletions tokens/transfer-tokens/steel/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Steel

**Steel** is a ...

## API
- [`Consts`](api/src/consts.rs) – Program constants.
- [`Error`](api/src/error.rs) – Custom program errors.
- [`Event`](api/src/event.rs) – Custom program events.
- [`Instruction`](api/src/instruction.rs) – Declared instructions.

## Instructions
- [`Hello`](program/src/hello.rs) – Hello ...

## State
- [`User`](api/src/state/user.rs) – User ...

## Tests

To run the test suit, use the Solana toolchain:
```
cargo test-sbf
```
14 changes: 14 additions & 0 deletions tokens/transfer-tokens/steel/api/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "transfer-tokens-api"
version = "0.1.0"
edition = "2021"

[dependencies]
bytemuck.workspace = true
num_enum.workspace = true
solana-program.workspace = true
steel.workspace = true
thiserror.workspace = true
spl-token.workspace = true
mpl-token-metadata.workspace = true
spl-associated-token-account.workspace = true
2 changes: 2 additions & 0 deletions tokens/transfer-tokens/steel/api/src/consts.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/// The seed of the metadata account PDA.
pub const METADATA: &[u8] = b"metadata";
35 changes: 35 additions & 0 deletions tokens/transfer-tokens/steel/api/src/instruction.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
use std::str;
use steel::*;

#[repr(u8)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, TryFromPrimitive)]
pub enum SteelInstruction {
Create = 0,
Mint = 1,
Transfer = 2,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct Create {
pub token_name: [u8; 32],
pub token_symbol: [u8; 8],
pub token_uri: [u8; 64],
pub token_decimals: u8,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct Mint {
pub quantity: [u8; 8],
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Pod, Zeroable)]
pub struct Transfer {
pub quantity: [u8; 8],
}

instruction!(SteelInstruction, Create);
instruction!(SteelInstruction, Mint);
instruction!(SteelInstruction, Transfer);
16 changes: 16 additions & 0 deletions tokens/transfer-tokens/steel/api/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pub mod consts;
pub mod instruction;
pub mod sdk;
pub mod utils;

pub mod prelude {
pub use crate::consts::*;
pub use crate::instruction::*;
pub use crate::sdk::*;
pub use crate::utils::*;
}

use steel::*;

// TODO Set program id
declare_id!("z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35");
89 changes: 89 additions & 0 deletions tokens/transfer-tokens/steel/api/src/sdk.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
use steel::*;

use crate::prelude::*;

pub fn create(
payer: Pubkey,
mint: Pubkey,
token_name: [u8; 32],
token_symbol: [u8; 8],
token_uri: [u8; 64],
token_decimals: u8,
) -> Instruction {
let metadata_pda = Pubkey::find_program_address(
&[METADATA, mpl_token_metadata::ID.as_ref(), mint.as_ref()],
&mpl_token_metadata::ID,
);

Instruction {
program_id: crate::ID,
accounts: vec![
AccountMeta::new(payer, true),
AccountMeta::new(mint, true),
AccountMeta::new(metadata_pda.0, false),
AccountMeta::new_readonly(system_program::ID, false),
AccountMeta::new_readonly(spl_token::ID, false),
AccountMeta::new_readonly(mpl_token_metadata::ID, false),
AccountMeta::new_readonly(sysvar::rent::ID, false),
],
data: Create {
token_name,
token_symbol,
token_uri,
token_decimals,
}
.to_bytes(),
}
}

pub fn mint(
mint_authority: Pubkey,
recipient: Pubkey,
mint: Pubkey,
associated_token_account: Pubkey,
quantity: u64,
) -> Instruction {
Instruction {
program_id: crate::ID,
accounts: vec![
AccountMeta::new(mint_authority, true),
AccountMeta::new(recipient, false),
AccountMeta::new(mint, false),
AccountMeta::new(associated_token_account, false),
AccountMeta::new_readonly(spl_token::ID, false),
AccountMeta::new_readonly(spl_associated_token_account::ID, false),
AccountMeta::new_readonly(system_program::ID, false),
],
data: Mint {
quantity: quantity.to_le_bytes(),
}
.to_bytes(),
}
}

pub fn transfer(
sender: Pubkey,
recipient: Pubkey,
mint: Pubkey,
sender_token_account: Pubkey,
recipient_token_account: Pubkey,
quantity: u64,
) -> Instruction {
Instruction {
program_id: crate::ID,
accounts: vec![
AccountMeta::new(sender, true),
AccountMeta::new(recipient, true),
AccountMeta::new(mint, false),
AccountMeta::new(sender_token_account, false),
AccountMeta::new(recipient_token_account, false),
AccountMeta::new_readonly(spl_token::ID, false),
AccountMeta::new_readonly(spl_associated_token_account::ID, false),
AccountMeta::new_readonly(system_program::ID, false),
],
data: Transfer {
quantity: quantity.to_le_bytes(),
}
.to_bytes(),
}
}
6 changes: 6 additions & 0 deletions tokens/transfer-tokens/steel/api/src/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pub fn str_to_bytes<const N: usize>(str: &str) -> [u8; N] {
let mut str_bytes = [0u8; N];
let copy_len = str.len().min(N);
str_bytes[..copy_len].copy_from_slice(&str.as_bytes()[..copy_len]);
str_bytes
}
8 changes: 8 additions & 0 deletions tokens/transfer-tokens/steel/cicd.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/bash

# This script is for quick building & deploying of the program.
# It also serves as a reference for the commands used for building & deploying Solana programs.
# Run this bad boy with "bash cicd.sh" or "./cicd.sh"

cargo build-sbf --manifest-path=./program/Cargo.toml
solana program deploy ./program/target/deploy/program.so
28 changes: 28 additions & 0 deletions tokens/transfer-tokens/steel/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"scripts": {
"test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/tests.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": "solana program deploy ./program/target/so/transfer_tokens_program.so",
"postinstall": "zx prepare.mjs"
},
"dependencies": {
"@metaplex-foundation/mpl-token-metadata": "^2.5.2",
"@solana/spl-token": "^0.3.7",
"@solana/web3.js": "^1.73.0",
"borsh": "^0.7.0",
"buffer": "^6.0.3",
"fs": "^0.0.1-security"
},
"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",
"ts-mocha": "^10.0.0",
"typescript": "^4.3.5",
"solana-bankrun": "^0.4.0",
"zx": "^8.1.4"
}
}
Loading

0 comments on commit 9776aa1

Please sign in to comment.