Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
9c8de01
Reorganize crates based on program
mvines Aug 8, 2020
400c2a2
Move program READMEs back
mvines Aug 8, 2020
f15afe9
Bump solana-sdk from 1.3.2 to 1.3.4
dependabot[bot] Aug 21, 2020
bccbb23
Update to Solana 1.3.6
mvines Aug 29, 2020
068efa3
Bump solana crates to 1.3.8
t-nelson Sep 4, 2020
ddbbfa0
Bump dependencies from 1.3.8 to 1.3.9 (#415)
jstarry Sep 10, 2020
a8df77c
Bump solana-sdk from 1.3.9 to 1.3.11 (#454)
dependabot[bot] Sep 16, 2020
7dc81e9
Bump solana-sdk to v1.3.12 (#484)
jackcmay Sep 21, 2020
c343528
token-swap: Assess swap fee on input token (#562)
joncinque Oct 2, 2020
0e4ed41
solana sdk does not need skip-no-mangle
jackcmay Oct 6, 2020
0cf64b5
Remove skip-no-mangle entirely
jackcmay Oct 6, 2020
2f3cfa1
Bump memo and token versions (#627)
CriesofCarrots Oct 15, 2020
6f494e9
Port SPL to solana-program and `cargo build-bpf`
mvines Oct 23, 2020
4f0bd30
Groom Cargo.tomls
mvines Oct 25, 2020
0b43fee
Update to solana v1.4.4
mvines Nov 1, 2020
72b8212
Drop lifetimes
mvines Nov 1, 2020
3eabeec
Back to no-entrypoint feature name
mvines Nov 3, 2020
d769834
Bump spl-memo to v2.0.0
mvines Nov 4, 2020
613dc56
Limit docs.rs builds
mvines Nov 4, 2020
248043e
Bump solana version to v1.4.5
mvines Nov 6, 2020
1ab05d2
Bump solana-program from 1.4.5 to 1.4.6 (#826)
dependabot[bot] Nov 11, 2020
266dd1f
Upgrade to Solana 1.4.7
mvines Nov 12, 2020
5866808
Update to Solana 1.4.8
mvines Nov 14, 2020
9400b47
Bump solana version to v1.4.9
mvines Nov 18, 2020
ff19a3d
Bump solana-program from 1.4.9 to 1.4.13 (#916)
dependabot[bot] Dec 2, 2020
e81beb5
Upgrade to Solana v1.4.14
mvines Dec 3, 2020
7bbd81b
Bump {ata,memo,token-{program,cli}} to solana v1.4.17
t-nelson Dec 16, 2020
c21c50c
Bump memo to v2.0.1
t-nelson Dec 16, 2020
1d15c6a
Update to Solana 1.5.0
mvines Dec 18, 2020
9cba96c
build(deps): bump solana-program from 1.5.0 to 1.5.1 (#1025)
dependabot[bot] Jan 4, 2021
4996126
Add initial signed-memo program (#1135)
CriesofCarrots Jan 28, 2021
ca25f31
chore: bump solana crates to 1.5.6
t-nelson Feb 11, 2021
503dbc0
build(deps): bump solana-program from 1.5.6 to 1.5.8 (#1261)
dependabot[bot] Feb 17, 2021
ba39f95
Update solana-program to 1.5.11 (#1362)
joncinque Mar 2, 2021
e812b06
memo: Expand error type to make test less flaky (#1380)
joncinque Mar 4, 2021
e9692f2
Remove tokio dev-dependency
mvines Mar 16, 2021
66dabbd
Bump Solana version to 1.5.15
mvines Mar 16, 2021
50ebce7
Adjust test_memo_compute_limits to account for toolchain differences
mvines Mar 17, 2021
df93fe3
Bump Solana version to 1.6.1
mvines Mar 18, 2021
5a393c9
Update to Solana 1.6.2
mvines Mar 30, 2021
76aeead
spl-memo: Add back v1 program ID as `spl_memo::v1::id()`
t-nelson Apr 1, 2021
5b61638
Ignore compute-budget test to unblock bpf-tools v1.5 (#1569)
CriesofCarrots Apr 3, 2021
85916d3
Bump memo to v3.0.1 (#1574)
CriesofCarrots Apr 5, 2021
b2a680a
Update SPL to Solana v1.6.6
mvines Apr 23, 2021
d76caea
Bump solana crates to v1.6.7
t-nelson May 5, 2021
b376545
Bump solana version
Jun 14, 2021
1384e4b
Update all solana dependencies to 1.7.3, fix issues (#1958)
joncinque Jun 24, 2021
5389abe
Bump solana and borsh crates (#2015)
CriesofCarrots Jul 2, 2021
291a189
Bump solana crates (#2139)
CriesofCarrots Jul 23, 2021
f4ae2b7
Upgrade to Solana 1.7.11
mvines Aug 30, 2021
3be1b15
Upgrade to Solana 1.8.0
mvines Oct 12, 2021
0772327
Upgrade to Solana v1.8.1
mvines Oct 21, 2021
a0ee46e
Update SDK to 1.9.2, fix warnings (#2674)
joncinque Dec 29, 2021
ebdcedd
add test for memo (#2678)
eventhorizonpl Dec 29, 2021
797eba6
Bump solana crates to v1.9.5 (#2780)
CriesofCarrots Jan 22, 2022
f772193
Bump solana to v1.9.9 (#2902)
Feb 23, 2022
36231d9
Upgrade crates to 1.10.8 (#3076)
joncinque Apr 11, 2022
a3d374c
Bump token-2022 (#3113)
Apr 26, 2022
cdf8d55
Bump solana to v1.10.15 (#3176)
dmakarov May 17, 2022
313f7e2
Update Solana crates to 1.10.29 (#3303)
joncinque Jul 1, 2022
5fb7cad
Bump solana crates to v1.10.33 (#3385)
Jul 27, 2022
eb4b8af
Bump solana to v1.10.35 (#3485)
Aug 16, 2022
7c47740
Update rust to 1.60, solana to 1.11.6 (#3492)
2501babe Aug 18, 2022
8302525
update solana to 1.14.4
2501babe Oct 11, 2022
07610db
upgrade solana-program to 1.14.6 (#3765)
samkim-crypto Oct 26, 2022
c5d527d
update solana to 1.14.10 (#3872)
samkim-crypto Dec 6, 2022
8b9d5b5
Update repo to `edition = "2021"` (#3900)
joncinque Dec 13, 2022
b1e1d31
ci: Update repo to Solana 1.14.12 (#3989)
joncinque Jan 19, 2023
c9e8503
chore: update maintainer references (#4008)
softalchemy Jan 31, 2023
e7f9a88
Update Solana to 1.16.1 and Rust to 1.69 (#4592)
joncinque Jun 26, 2023
128d25d
bump/memo (#4635)
Jun 27, 2023
8881543
Upgrade to solana 1.16.3 (#4679)
samkim-crypto Jul 13, 2023
669f111
Bump repo to 1.16.13 (#5324)
joncinque Sep 21, 2023
ed03d65
chore: Bump Solana crates to 1.16.16 (#5494)
joncinque Oct 11, 2023
75a1b69
ci: Bump repo to Solana 1.17 (#5575)
joncinque Oct 19, 2023
c5ab89e
rustfmt: use entrypoint full path
Nov 8, 2023
d01e570
rustfmt: format imports
Nov 8, 2023
4a111bc
rustfmt: format comments
Nov 8, 2023
75b07bd
repo: Update to 1.17.6 (#5863)
joncinque Nov 29, 2023
c719911
token 2022: upgrade sdk to 1.17.13 (#6147)
0x0ece Jan 18, 2024
9381c0c
Update solana dependency version to allow 2.0.0 (#6182)
willhickey Jan 26, 2024
6f7fc29
Upgrade to solana 1.17.17 (#6189)
samkim-crypto Feb 1, 2024
d916d1a
Bump SPL crate versions (#6221)
willhickey Feb 5, 2024
22dc1a7
Upgrade to Solana 1.18.2 (#6278)
samkim-crypto Feb 29, 2024
7579770
Bump solana version to 1.18.11 (#6624)
samkim-crypto Apr 24, 2024
f316da3
deps: Upgrade to Solana v2 (#6908)
joncinque Jun 25, 2024
3576a28
memo: Bump to 5.0.0 for Solana v2 support (#6913)
joncinque Jun 25, 2024
b9a0d2b
ci: Bump crates to Solana 2.0.3 (#7047)
joncinque Jul 25, 2024
9b23d9a
CI: Update to Solana v2.1 crates (#7416)
joncinque Oct 31, 2024
fa02e7d
remove solana-program from spl-memo (#7429)
kevinheavey Oct 31, 2024
2c2bf79
Publish spl-memo v6.0.0
github-actions[bot] Nov 1, 2024
e66d064
Oops, move Cargo.toml from program/src/ to program/
joncinque Nov 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions program/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
[package]
name = "spl-memo"
version = "6.0.0"
description = "Solana Program Library Memo"
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-account-info = "2.1.0"
solana-instruction = "2.1.0"
solana-msg = "2.1.0"
solana-program-entrypoint = "2.1.0"
solana-program-error = "2.1.0"
solana-pubkey = "2.1.0"

[dev-dependencies]
solana-program-test = "2.1.0"
solana-sdk = "2.1.0"

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

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
17 changes: 17 additions & 0 deletions program/src/entrypoint.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//! Program entrypoint

#![cfg(not(feature = "no-entrypoint"))]

use {
solana_account_info::AccountInfo, solana_program_entrypoint::ProgramResult,
solana_pubkey::Pubkey,
};

solana_program_entrypoint::entrypoint!(process_instruction);
fn process_instruction(
program_id: &Pubkey,
accounts: &[AccountInfo],
instruction_data: &[u8],
) -> ProgramResult {
crate::processor::process_instruction(program_id, accounts, instruction_data)
}
58 changes: 58 additions & 0 deletions program/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#![deny(missing_docs)]

//! A program that accepts a string of encoded characters and verifies that it
//! parses, while verifying and logging signers. Currently handles UTF-8
//! characters.

mod entrypoint;
pub mod processor;

// Export current sdk types for downstream users building with a different sdk
// version
pub use {
solana_account_info, solana_instruction, solana_msg, solana_program_entrypoint,
solana_program_error, solana_pubkey,
};
use {
solana_instruction::{AccountMeta, Instruction},
solana_pubkey::Pubkey,
};

/// Legacy symbols from Memo v1
pub mod v1 {
solana_pubkey::declare_id!("Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo");
}

solana_pubkey::declare_id!("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr");

/// Build a memo instruction, possibly signed
///
/// Accounts expected by this instruction:
///
/// 0. ..0+N. `[signer]` Expected signers; if zero provided, instruction will
/// be processed as a normal, unsigned spl-memo
pub fn build_memo(memo: &[u8], signer_pubkeys: &[&Pubkey]) -> Instruction {
Instruction {
program_id: id(),
accounts: signer_pubkeys
.iter()
.map(|&pubkey| AccountMeta::new_readonly(*pubkey, true))
.collect(),
data: memo.to_vec(),
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_build_memo() {
let signer_pubkey = Pubkey::new_unique();
let memo = "🐆".as_bytes();
let instruction = build_memo(memo, &[&signer_pubkey]);
assert_eq!(memo, instruction.data);
assert_eq!(instruction.accounts.len(), 1);
assert_eq!(instruction.accounts[0].pubkey, signer_pubkey);
}
}
107 changes: 107 additions & 0 deletions program/src/processor.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
//! Program state processor

use {
solana_account_info::AccountInfo, solana_msg::msg, solana_program_entrypoint::ProgramResult,
solana_program_error::ProgramError, solana_pubkey::Pubkey, std::str::from_utf8,
};

/// Instruction processor
pub fn process_instruction(
_program_id: &Pubkey,
accounts: &[AccountInfo],
input: &[u8],
) -> ProgramResult {
let account_info_iter = &mut accounts.iter();
let mut missing_required_signature = false;
for account_info in account_info_iter {
if let Some(address) = account_info.signer_key() {
msg!("Signed by {:?}", address);
} else {
missing_required_signature = true;
}
}
if missing_required_signature {
return Err(ProgramError::MissingRequiredSignature);
}

let memo = from_utf8(input).map_err(|err| {
msg!("Invalid UTF-8, from byte {}", err.valid_up_to());
ProgramError::InvalidInstructionData
})?;
msg!("Memo (len {}): {:?}", memo.len(), memo);

Ok(())
}

#[cfg(test)]
mod tests {
use {
super::*, solana_account_info::IntoAccountInfo, solana_program_error::ProgramError,
solana_pubkey::Pubkey, solana_sdk::account::Account,
};

#[test]
fn test_utf8_memo() {
let program_id = Pubkey::new_from_array([0; 32]);

let string = b"letters and such";
assert_eq!(Ok(()), process_instruction(&program_id, &[], string));

let emoji = "🐆".as_bytes();
let bytes = [0xF0, 0x9F, 0x90, 0x86];
assert_eq!(emoji, bytes);
assert_eq!(Ok(()), process_instruction(&program_id, &[], emoji));

let mut bad_utf8 = bytes;
bad_utf8[3] = 0xFF; // Invalid UTF-8 byte
assert_eq!(
Err(ProgramError::InvalidInstructionData),
process_instruction(&program_id, &[], &bad_utf8)
);
}

#[test]
fn test_signers() {
let program_id = Pubkey::new_from_array([0; 32]);
let memo = "🐆".as_bytes();

let pubkey0 = Pubkey::new_unique();
let pubkey1 = Pubkey::new_unique();
let pubkey2 = Pubkey::new_unique();
let mut account0 = Account::default();
let mut account1 = Account::default();
let mut account2 = Account::default();

let signed_account_infos = vec![
(&pubkey0, true, &mut account0).into_account_info(),
(&pubkey1, true, &mut account1).into_account_info(),
(&pubkey2, true, &mut account2).into_account_info(),
];
assert_eq!(
Ok(()),
process_instruction(&program_id, &signed_account_infos, memo)
);

assert_eq!(Ok(()), process_instruction(&program_id, &[], memo));

let unsigned_account_infos = vec![
(&pubkey0, false, &mut account0).into_account_info(),
(&pubkey1, false, &mut account1).into_account_info(),
(&pubkey2, false, &mut account2).into_account_info(),
];
assert_eq!(
Err(ProgramError::MissingRequiredSignature),
process_instruction(&program_id, &unsigned_account_infos, memo)
);

let partially_signed_account_infos = vec![
(&pubkey0, true, &mut account0).into_account_info(),
(&pubkey1, false, &mut account1).into_account_info(),
(&pubkey2, true, &mut account2).into_account_info(),
];
assert_eq!(
Err(ProgramError::MissingRequiredSignature),
process_instruction(&program_id, &partially_signed_account_infos, memo)
);
}
}
Loading