diff --git a/.github/workflows/linter-testing-lib.yaml b/.github/workflows/linter-testing-lib.yaml index e21c53a55..e6b4c9dba 100644 --- a/.github/workflows/linter-testing-lib.yaml +++ b/.github/workflows/linter-testing-lib.yaml @@ -23,6 +23,7 @@ on: - 'contract-testing/**/*.toml' - 'rustfmt.toml' - 'concordium-rust-sdk' + - 'concordium-std-derive' workflow_dispatch: # allows manual trigger diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 21498ab85..7f55fc9da 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -23,6 +23,7 @@ jobs: strategy: matrix: crates: + - concordium-std-derive/Cargo.toml - concordium-std/Cargo.toml - concordium-cis2/Cargo.toml - examples/voting/Cargo.toml @@ -377,6 +378,7 @@ jobs: sed -i "s/{version = \"10.0\", default-features = false}/{path = \"..\/..\/concordium-std\", default-features = false}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml sed -i "s/{version = \"6.1\", default-features = false}/{path = \"..\/..\/concordium-cis2\", default-features = false}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml sed -i "s/concordium-smart-contract-testing = \"4.2\"/concordium-smart-contract-testing = {path = \"..\/..\/contract-testing\"}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml + sed -i "s/concordium-std-derive = \"6.0\"/concordium-std-derive = {path = \"..\/..\/concordium-std-derive\"}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml diff ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml examples/cis2-nft/Cargo.toml diff ${{ runner.temp }}/$PROJECT_NAME/src/lib.rs examples/cis2-nft/src/lib.rs diff ${{ runner.temp }}/$PROJECT_NAME/tests/tests.rs examples/cis2-nft/tests/tests.rs @@ -425,6 +427,7 @@ jobs: sed -i "s/version = \"10.0\", default-features = false/path = \"..\/..\/concordium-std\", version = \"10.0\", default-features = false/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml sed -i "s/version = \"6.1\", default-features = false/path = \"..\/..\/concordium-cis2\", version = \"6.1\", default-features = false/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml sed -i "s/concordium-smart-contract-testing = \"4.2\"/concordium-smart-contract-testing = {path = \"..\/..\/contract-testing\"}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml + sed -i "s/concordium-std-derive = \"6.0\"/concordium-std-derive = {path = \"..\/..\/concordium-std-derive\"}/g" ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml diff ${{ runner.temp }}/$PROJECT_NAME/Cargo.toml examples/credential-registry/Cargo.toml diff ${{ runner.temp }}/$PROJECT_NAME/src/lib.rs examples/credential-registry/src/lib.rs diff ${{ runner.temp }}/$PROJECT_NAME/tests/tests.rs examples/credential-registry/tests/tests.rs diff --git a/concordium-cis2/CHANGELOG.md b/concordium-cis2/CHANGELOG.md index 8db183863..8701d2862 100644 --- a/concordium-cis2/CHANGELOG.md +++ b/concordium-cis2/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased changes +- Bump MSRV to 1.72 + ## concordium-cis2 6.1.0 (2024-02-22) - Support version 10 of concordium-std. diff --git a/concordium-cis2/Cargo.toml b/concordium-cis2/Cargo.toml index 4edad881d..340883e0f 100644 --- a/concordium-cis2/Cargo.toml +++ b/concordium-cis2/Cargo.toml @@ -2,6 +2,7 @@ name = "concordium-cis2" version = "6.1.0" authors = ["Concordium "] +rust-version = "1.73" edition = "2021" license = "MPL-2.0" description = "A collection of types for implementing CIS-2 Concordium Token Standard." diff --git a/concordium-std-derive/CHANGELOG.md b/concordium-std-derive/CHANGELOG.md new file mode 100644 index 000000000..0d2bb75c1 --- /dev/null +++ b/concordium-std-derive/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +## Unreleased changes + +## concordium-std-derive 6.0.0 (2024-04-04) + +- Macros for creating constant values from strings for the following types: + - `AccountAddress` + - `ContractAddress` + - `ModuleReference` + - `PublicKeyEcdsaSecp256k1` + - `PublicKeyEd25519` + - `SignatureEcdsaSecp256k1` + - `SignatureEd25519` diff --git a/concordium-std-derive/Cargo.toml b/concordium-std-derive/Cargo.toml new file mode 100644 index 000000000..5f9836ef3 --- /dev/null +++ b/concordium-std-derive/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "concordium-std-derive" +authors = ["Concordium "] +version = "6.0.0" +edition = "2021" +rust-version = "1.73" +license = "MPL-2.0" +description = "Procedural macros to generate concordium type constants from strings, that makes writing smart contracts on the Concordium blockchain easier." +homepage = "https://github.com/Concordium/concordium-rust-smart-contracts/" +repository = "https://github.com/Concordium/concordium-rust-smart-contracts/" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +proc-macro = true + +[dependencies] +concordium-contracts-common = { path = "../concordium-rust-sdk/concordium-base/smart-contracts/contracts-common/concordium-contracts-common", features = [ "derive-serde" ], version = "9" } +syn = "2.0" +proc-macro2 = "1.0" +quote = "1.0" + +[dev-dependencies] +trybuild = "1.0" + diff --git a/concordium-std-derive/src/lib.rs b/concordium-std-derive/src/lib.rs new file mode 100644 index 000000000..0fa0fa8cc --- /dev/null +++ b/concordium-std-derive/src/lib.rs @@ -0,0 +1,264 @@ +extern crate proc_macro; + +use concordium_contracts_common::{ + AccountAddress, ContractAddress, ModuleReference, PublicKeyEcdsaSecp256k1, PublicKeyEd25519, + SignatureEcdsaSecp256k1, SignatureEd25519, +}; +use proc_macro::TokenStream; +use proc_macro2::{Group, Punct, Spacing, Span}; +use quote::{quote, ToTokens}; +use std::str::FromStr; +use syn::LitStr; + +// Helper functions: + +// Tokenizes a slice of bytes. +fn tokenize_slice(slice: &[u8]) -> proc_macro2::TokenStream { + let mut t = proc_macro2::TokenStream::new(); + for byte in slice { + byte.to_tokens(&mut t); + Punct::new(',', Spacing::Alone).to_tokens(&mut t); + } + Group::new(proc_macro2::Delimiter::Bracket, t).to_token_stream() +} + +// Parses the input tokens of a proc macro and returns the given error +// message on parse error. +fn parse_input(item: TokenStream, msg: &str) -> syn::Result { + match syn::parse::(item) { + Ok(string_literal) => Ok(string_literal), + Err(_) => Err(syn::Error::new(Span::call_site(), msg)), + } +} + +// Parses the given tokens and transforms them using the provided worker +// function. If parsing fails, then an error with the given message is produced. +fn get_token_res( + item: TokenStream, + msg: &str, + worker_fun: impl FnOnce(String, Span) -> syn::Result, +) -> syn::Result { + let input = parse_input(item, msg)?; + worker_fun(input.value(), input.span()) +} + +// Parses the given tokens, looks up an environment variable with the parsed +// input as key and transforms the corresponding value using the provided worker +// function. If parsing fails, then an error with the given message is produced. +fn get_token_res_env( + item: TokenStream, + msg: &str, + worker_fun: impl FnOnce(String, Span) -> syn::Result, +) -> syn::Result { + let input = parse_input(item, msg)?; + let environment_var_value = match std::env::var(input.value()) { + Ok(value) => value, + Err(e) => { + return Err(syn::Error::new( + input.span(), + format!("Environment variable error: {:?}", e), + )) + } + }; + worker_fun(environment_var_value, input.span()) +} + +fn unwrap_or_report(res: syn::Result) -> TokenStream { + res.unwrap_or_else(|e| e.into_compile_error().into()) +} + +// Worker functions + +fn acc_address_worker(str: String, span: Span) -> syn::Result { + let address = match AccountAddress::from_str(&str) { + Ok(addr) => tokenize_slice(&addr.0), + Err(e) => return Err(syn::Error::new(span, format!("Invalid account address: {}", e))), + }; + + Ok(quote!(concordium_std::AccountAddress(#address)).into()) +} + +fn pubkey_ed25519_worker(str: String, span: Span) -> syn::Result { + let public_key = match PublicKeyEd25519::from_str(&str) { + Ok(pk) => tokenize_slice(&pk.0), + Err(e) => return Err(syn::Error::new(span, format!("Invalid Ed25519 public key: {}", e))), + }; + + Ok(quote!(concordium_std::PublicKeyEd25519(#public_key)).into()) +} + +fn pubkey_ecdsa_worker(str: String, span: Span) -> syn::Result { + let public_key = match PublicKeyEcdsaSecp256k1::from_str(&str) { + Ok(pk) => tokenize_slice(&pk.0), + Err(e) => return Err(syn::Error::new(span, format!("Invalid ECDSA public key: {}", e))), + }; + + Ok(quote!(concordium_std::PublicKeyEcdsaSecp256k1(#public_key)).into()) +} + +fn signature_ed25519_worker(str: String, span: Span) -> syn::Result { + let signature = match SignatureEd25519::from_str(&str) { + Ok(sig) => tokenize_slice(&sig.0), + Err(e) => return Err(syn::Error::new(span, format!("Invalid Ed25519 signature: {}", e))), + }; + + Ok(quote!(concordium_std::SignatureEd25519(#signature)).into()) +} + +fn signature_ecdsa_worker(str: String, span: Span) -> syn::Result { + let signature = match SignatureEcdsaSecp256k1::from_str(&str) { + Ok(sig) => tokenize_slice(&sig.0), + Err(e) => return Err(syn::Error::new(span, format!("Invalid ECDSA signature: {}", e))), + }; + + Ok(quote!(concordium_std::SignatureEcdsaSecp256k1(#signature)).into()) +} + +fn contract_address_worker(str: String, span: Span) -> syn::Result { + let (index, subindex) = match ContractAddress::from_str(&str) { + Ok(con) => (con.index, con.subindex), + Err(e) => return Err(syn::Error::new(span, format!("Invalid contract address: {}", e))), + }; + + Ok(quote!(concordium_std::ContractAddress::new(#index, #subindex)).into()) +} + +fn module_ref_worker(str: String, span: Span) -> syn::Result { + let module_ref = match ModuleReference::from_str(&str) { + Ok(mod_ref) => tokenize_slice(&mod_ref.bytes), + Err(e) => return Err(syn::Error::new(span, format!("Invalid module reference: {}", e))), + }; + + Ok(quote!(concordium_std::ModuleReference::new(#module_ref)).into()) +} + +/// Procedural macro for instantiating account addresses. +/// Input must be a valid base58-encoding. +#[proc_macro] +pub fn account_address(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded account address"; + unwrap_or_report(get_token_res(item, msg, acc_address_worker)) +} + +/// Procedural macro for instantiating account addresses from an environment +/// variable. Input must be the key of an environment variable whose value is +/// set to a valid base58-encoding of an account address. +#[proc_macro] +pub fn account_address_env(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded account address"; + unwrap_or_report(get_token_res_env(item, msg, acc_address_worker)) +} + +/// Procedural macro for instantiating `PublicKeyEd25519` public keys. +/// Input must be a (case-insensitive) hex-encoding and have a length of 64 +/// characters representing 32 bytes. +#[proc_macro] +pub fn public_key_ed25519(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ED25519 public key"; + unwrap_or_report(get_token_res(item, msg, pubkey_ed25519_worker)) +} + +/// Procedural macro for instantiating `PublicKeyEd25519` public keys from +/// an environment variable. Input must be the key of an environment variable +/// whose value is set to a hex-encoded public key which must have a length of +/// 64 characters representing 32 bytes. +#[proc_macro] +pub fn public_key_ed25519_env(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ED25519 public key"; + unwrap_or_report(get_token_res_env(item, msg, pubkey_ed25519_worker)) +} + +/// Procedural macro for instantiating `PublicKeyEcdsaSecp256k1` public keys. +/// Input must be a (case-insensitive) hex-encoding and have a length of 66 +/// characters representing 33 bytes. +#[proc_macro] +pub fn public_key_ecdsa(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ECDSA public key"; + unwrap_or_report(get_token_res(item, msg, pubkey_ecdsa_worker)) +} + +/// Procedural macro for instantiating `PublicKeyEcdsaSecp256k1` public keys +/// from an environment variable. Input must be the key of an environment +/// variable whose value is set to a hex-encoded public key which must have a +/// length of 66 characters representing 33 bytes. +#[proc_macro] +pub fn public_key_ecdsa_env(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ECDSA public key"; + unwrap_or_report(get_token_res_env(item, msg, pubkey_ecdsa_worker)) +} + +/// Procedural macro for instantiating `SignatureEd25519` signatures. +/// Input must be a (case-insensitive) hex-encoding and have a length of 128 +/// characters representing 64 bytes. +#[proc_macro] +pub fn signature_ed25519(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ED25519 signature"; + unwrap_or_report(get_token_res(item, msg, signature_ed25519_worker)) +} + +/// Procedural macro for instantiating `SignatureEd25519` signatures from +/// an environment variable. Input must be the key of an environment variable +/// whose value is set to a hex-encoded signature which must have a length of +/// 128 characters representing 64 bytes. +#[proc_macro] +pub fn signature_ed25519_env(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ED25519 signature"; + unwrap_or_report(get_token_res_env(item, msg, signature_ed25519_worker)) +} + +/// Procedural macro for instantiating `SignatureEcdsaSecp256k1` signatures. +/// Input must be a (case-insensitive) hex-encoding and have a length of 128 +/// characters representing 64 bytes. +#[proc_macro] +pub fn signature_ecdsa(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal of a hex-encoded ECDSA signature"; + unwrap_or_report(get_token_res(item, msg, signature_ecdsa_worker)) +} + +/// Procedural macro for instantiating `SignatureEcdsaSecp256k1` signatures from +/// an environment variable. Input must be the key of an environment variable +/// whose value is set to a hex-encoded signature which must have a length of +/// 128 characters representing 64 bytes. +#[proc_macro] +pub fn signature_ecdsa_env(item: TokenStream) -> TokenStream { + let msg = "Expected a string literal a hex-encoded ECDSA signature"; + unwrap_or_report(get_token_res_env(item, msg, signature_ecdsa_worker)) +} + +/// Procedural macro for instantiating contract addresses. +/// Input must be of the form "", where index and subindex +/// are integers. +#[proc_macro] +pub fn contract_address(item: TokenStream) -> TokenStream { + let msg = "Expected string literal of a contract address in the form of \"\""; + unwrap_or_report(get_token_res(item, msg, contract_address_worker)) +} + +/// Procedural macro for instantiating contract addresses from an environment +/// variable. Input must be the key of an environment variable whose value is +/// set to a contract address of the form "", where index and +/// subindex are integers +#[proc_macro] +pub fn contract_address_env(item: TokenStream) -> TokenStream { + let msg = "Expected string literal of a contract address in the form of \"\""; + unwrap_or_report(get_token_res_env(item, msg, contract_address_worker)) +} + +/// Procedural macro for instantiating module references. +/// Input must be a (case-insensitive) hex-encoding and have a length of 64 +/// characters representing 32 bytes. +#[proc_macro] +pub fn module_reference(item: TokenStream) -> TokenStream { + let msg = "Expected string literal of a hex-encoded module reference"; + unwrap_or_report(get_token_res(item, msg, module_ref_worker)) +} + +/// Procedural macro for instantiating module references from an environment +/// variable. Input must be the key of an environment variable whose value is +/// set to a hex-encoded module reference which must have a length of 64 +/// characters representing 32 bytes. +#[proc_macro] +pub fn module_reference_env(item: TokenStream) -> TokenStream { + let msg = "Expected string literal of a hex-encoded module reference"; + unwrap_or_report(get_token_res_env(item, msg, module_ref_worker)) +} diff --git a/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.rs b/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.rs new file mode 100644 index 000000000..22e81392f --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const ACC: AccountAddress = account_address!("30Bx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); + +fn f() { + println!("{:?}", ACC.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.stderr b/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.stderr new file mode 100644 index 000000000..cd9e7cba2 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-invalid-base58.stderr @@ -0,0 +1,5 @@ +error: Invalid account address: Invalid Base58Check encoding. + --> tests/test-programs/fail-acc-invalid-base58.rs:6:46 + | +6 | const ACC: AccountAddress = account_address!("30Bx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.rs b/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.rs new file mode 100644 index 000000000..8d6e0af2f --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.rs @@ -0,0 +1,12 @@ + //! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const ACC: AccountAddress = account_address!("3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G", "3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); + +fn f() { + println!("{:?}", ACC.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.stderr b/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.stderr new file mode 100644 index 000000000..c265b9b85 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-multiple-arguments.stderr @@ -0,0 +1,7 @@ +error: Expected a string literal of a hex-encoded account address + --> tests/test-programs/fail-acc-multiple-arguments.rs:6:29 + | +6 | ...ss = account_address!("3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G", "3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `account_address` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.rs b/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.rs new file mode 100644 index 000000000..256cf9c99 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const ACC: AccountAddress = account_address!(0); + +fn f() { + println!("{:?}", ACC.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.stderr b/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.stderr new file mode 100644 index 000000000..684aa438b --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-acc-not-a-string.stderr @@ -0,0 +1,7 @@ +error: Expected a string literal of a hex-encoded account address + --> tests/test-programs/fail-acc-not-a-string.rs:6:29 + | +6 | const ACC: AccountAddress = account_address!(0); + | ^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in the macro `account_address` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/concordium-std-derive/tests/test-programs/fail-contract-invalid.rs b/concordium-std-derive/tests/test-programs/fail-contract-invalid.rs new file mode 100644 index 000000000..83e57a1c7 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-contract-invalid.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const CONTRACT: ContractAddress = contract_address!("<0, 0>"); + +fn f() { + println!("{:?}", CONTRACT.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-contract-invalid.stderr b/concordium-std-derive/tests/test-programs/fail-contract-invalid.stderr new file mode 100644 index 000000000..b4872820d --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-contract-invalid.stderr @@ -0,0 +1,5 @@ +error: Invalid contract address: Failed to parse the subindex integer: invalid digit found in string + --> tests/test-programs/fail-contract-invalid.rs:6:53 + | +6 | const CONTRACT: ContractAddress = contract_address!("<0, 0>"); + | ^^^^^^^^ diff --git a/concordium-std-derive/tests/test-programs/fail-missing-env.rs b/concordium-std-derive/tests/test-programs/fail-missing-env.rs new file mode 100644 index 000000000..4003c6586 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-missing-env.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const ACC: AccountAddress = account_address_env!("TEST"); + +fn f() { + println!("{:?}", ACC.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-missing-env.stderr b/concordium-std-derive/tests/test-programs/fail-missing-env.stderr new file mode 100644 index 000000000..2ca05af03 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-missing-env.stderr @@ -0,0 +1,5 @@ +error: Environment variable error: NotPresent + --> tests/test-programs/fail-missing-env.rs:6:50 + | +6 | const ACC: AccountAddress = account_address_env!("TEST"); + | ^^^^^^ diff --git a/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.rs b/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.rs new file mode 100644 index 000000000..a078be04d --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const PK_25519: PublicKeyEd25519 = public_key_ed25519!("0l2a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d61412"); + +fn f() { + println!("{:?}", PK_25519.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.stderr b/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.stderr new file mode 100644 index 000000000..768214f84 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-pk25519-invalid-hex.stderr @@ -0,0 +1,5 @@ +error: Invalid Ed25519 public key: Parsing failed + --> tests/test-programs/fail-pk25519-invalid-hex.rs:6:56 + | +6 | const PK_25519: PublicKeyEd25519 = public_key_ed25519!("0l2a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d61412"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/concordium-std-derive/tests/test-programs/fail-pk25519-length.rs b/concordium-std-derive/tests/test-programs/fail-pk25519-length.rs new file mode 100644 index 000000000..0f052b19a --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-pk25519-length.rs @@ -0,0 +1,12 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const PK_25519: PublicKeyEd25519 = public_key_ed25519!("012a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d6141201"); + +fn f() { + println!("{:?}", PK_25519.to_string()); +} + +fn main() {} diff --git a/concordium-std-derive/tests/test-programs/fail-pk25519-length.stderr b/concordium-std-derive/tests/test-programs/fail-pk25519-length.stderr new file mode 100644 index 000000000..908657864 --- /dev/null +++ b/concordium-std-derive/tests/test-programs/fail-pk25519-length.stderr @@ -0,0 +1,5 @@ +error: Invalid Ed25519 public key: Parsing failed + --> tests/test-programs/fail-pk25519-length.rs:6:56 + | +6 | const PK_25519: PublicKeyEd25519 = public_key_ed25519!("012a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d6141201"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/concordium-std-derive/tests/test-programs/success.rs b/concordium-std-derive/tests/test-programs/success.rs new file mode 100644 index 000000000..64c70524a --- /dev/null +++ b/concordium-std-derive/tests/test-programs/success.rs @@ -0,0 +1,34 @@ +//! Ensure that the macros generate compilable code. + +use concordium_contracts_common as concordium_std; +use concordium_contracts_common::*; +use concordium_std_derive::*; + +const ACC: AccountAddress = account_address!("3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); +const REF: ModuleReference = + module_reference!("0000000000000000000000000000000000000000000000000000000000000000"); +const CONTRACT: ContractAddress = contract_address!("<1234,0>"); +const PK_25519: PublicKeyEd25519 = + public_key_ed25519!("012a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d61412"); +const PK_ECDSA: PublicKeyEcdsaSecp256k1 = + public_key_ecdsa!("0214e6a60b8fc58ea707d8ee8fa6ca7b28626d4f6f80b170982644c95d12111853"); +const SG_25519: SignatureEd25519 = signature_ed25519!("ec076ae7adaf0a8b921cf2bad86a1a5b5346226618637aa0d6b30f9616f108f9f482640a4ceb14235569cd3af05fac00be2c82dc81c6f6b4a6ba4ea7c3b51a0b"); +const SG_ECDSA: SignatureEcdsaSecp256k1 = signature_ecdsa!("EC076AE7ADAF0A8B921CF2BAD86A1A5B5346226618637AA0D6B30F9616F108F9F482640A4CEB14235569CD3AF05FAC00BE2C82DC81C6F6B4A6BA4EA7C3B51A0B"); + +const ACC_ENV: AccountAddress = account_address_env!("ACC"); +const REF_ENV: ModuleReference = module_reference_env!("REF"); +const CONTRACT_ENV: ContractAddress = contract_address_env!("CONTRACT"); +const PK_25519_ENV: PublicKeyEd25519 = public_key_ed25519_env!("PK_25519"); +const PK_ECDSA_ENV: PublicKeyEcdsaSecp256k1 = public_key_ecdsa_env!("PK_ECDSA"); +const SG_25519_ENV: SignatureEd25519 = signature_ed25519_env!("SG_25519"); +const SG_ECDSA_ENV: SignatureEcdsaSecp256k1 = signature_ecdsa_env!("SG_ECDSA"); + +fn main() { + assert_eq!(ACC, ACC_ENV); + assert_eq!(REF, REF_ENV); + assert_eq!(CONTRACT, CONTRACT_ENV); + assert_eq!(PK_25519, PK_25519_ENV); + assert_eq!(PK_ECDSA, PK_ECDSA_ENV); + assert_eq!(SG_25519, SG_25519_ENV); + assert_eq!(SG_ECDSA, SG_ECDSA_ENV); +} diff --git a/concordium-std-derive/tests/test.rs b/concordium-std-derive/tests/test.rs new file mode 100644 index 000000000..e9ea7ac84 --- /dev/null +++ b/concordium-std-derive/tests/test.rs @@ -0,0 +1,22 @@ +//! Test that the macros generates compilable code. +#[test] +fn tests() { + std::env::set_var("MY_CUSTOM_FEATURE", "true"); + std::env::set_var("ACC", "3kBx2h5Y2veb4hZgAJWPrr8RyQESKm5TjzF3ti1QQ4VSYLwK1G"); + std::env::set_var("REF", "0000000000000000000000000000000000000000000000000000000000000000"); + std::env::set_var("CONTRACT", "<1234,0>"); + std::env::set_var( + "PK_25519", + "012a7e286063ae5dfcebce40636c0546d367d8c65cd4cb69aae1af77a4d61412", + ); + std::env::set_var( + "PK_ECDSA", + "0214e6a60b8fc58ea707d8ee8fa6ca7b28626d4f6f80b170982644c95d12111853", + ); + std::env::set_var("SG_25519", "ec076ae7adaf0a8b921cf2bad86a1a5b5346226618637aa0d6b30f9616f108f9f482640a4ceb14235569cd3af05fac00be2c82dc81c6f6b4a6ba4ea7c3b51a0b"); + std::env::set_var("SG_ECDSA", "EC076AE7ADAF0A8B921CF2BAD86A1A5B5346226618637AA0D6B30F9616F108F9F482640A4CEB14235569CD3AF05FAC00BE2C82DC81C6F6B4A6BA4EA7C3B51A0B"); + + let t = trybuild::TestCases::new(); + t.pass("tests/test-programs/success.rs"); + t.compile_fail("tests/test-programs/fail-*.rs"); +} diff --git a/concordium-std/CHANGELOG.md b/concordium-std/CHANGELOG.md index fd456cf86..638c4918e 100644 --- a/concordium-std/CHANGELOG.md +++ b/concordium-std/CHANGELOG.md @@ -7,6 +7,8 @@ These are only available from protocol version 7, and as such are guarded by the `p7` feature flag. - Add two ordered collections: `StateBTreeMap` and `StateBTreeSet`. These are based on [B-Tree](https://en.wikipedia.org/wiki/B-tree), but where each node is stored in the low-level smart contract key-value store. Use one of these when needing operations related to the ordering of the keys, such as `higher(k)` providing the smallest key in collection which is stricly greater than `k`. +- Bump MSRV to 1.73 + ## concordium-std 10.0.0 (2024-02-22) diff --git a/examples/auction/Cargo.toml b/examples/auction/Cargo.toml index 15c6d44ba..463cc3332 100644 --- a/examples/auction/Cargo.toml +++ b/examples/auction/Cargo.toml @@ -16,6 +16,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/auction/tests/tests.rs b/examples/auction/tests/tests.rs index fb4d3dfab..dca2162d5 100644 --- a/examples/auction/tests/tests.rs +++ b/examples/auction/tests/tests.rs @@ -1,12 +1,15 @@ //! Tests for the auction smart contract. use auction_smart_contract::*; use concordium_smart_contract_testing::*; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); -const BOB: AccountAddress = AccountAddress([1; 32]); -const CAROL: AccountAddress = AccountAddress([2; 32]); -const DAVE: AccountAddress = AccountAddress([3; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const CAROL: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); +const DAVE: AccountAddress = account_address!("2y57FyMyqAfY7X1SuSWJ5VMt1Z3ZgxbKt9w5mGoTwqA7YcpbXr"); const SIGNER: Signer = Signer::with_one_key(); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(10000); diff --git a/examples/cis2-dynamic-nft/Cargo.toml b/examples/cis2-dynamic-nft/Cargo.toml index 8117494ae..7fad4712d 100644 --- a/examples/cis2-dynamic-nft/Cargo.toml +++ b/examples/cis2-dynamic-nft/Cargo.toml @@ -17,6 +17,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/cis2-dynamic-nft/tests/tests.rs b/examples/cis2-dynamic-nft/tests/tests.rs index 88a65f9a2..e568e4208 100644 --- a/examples/cis2-dynamic-nft/tests/tests.rs +++ b/examples/cis2-dynamic-nft/tests/tests.rs @@ -5,10 +5,13 @@ use cis2_dynamic_nft::{ use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::*; +use concordium_std_derive::*; + /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); /// Token IDs. diff --git a/examples/cis2-multi-royalties/Cargo.toml b/examples/cis2-multi-royalties/Cargo.toml index e0ecbb8f8..16247d62f 100644 --- a/examples/cis2-multi-royalties/Cargo.toml +++ b/examples/cis2-multi-royalties/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/cis2-multi-royalties/tests/tests.rs b/examples/cis2-multi-royalties/tests/tests.rs index ddcea4040..1fc6bb729 100644 --- a/examples/cis2-multi-royalties/tests/tests.rs +++ b/examples/cis2-multi-royalties/tests/tests.rs @@ -3,13 +3,16 @@ use cis2_multi_royalties::*; use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::collections::BTreeMap; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); -const CHARLIE: AccountAddress = AccountAddress([2; 32]); +const CHARLIE: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const CHARLIE_ADDR: Address = Address::Account(CHARLIE); /// Token IDs. diff --git a/examples/cis2-multi/Cargo.toml b/examples/cis2-multi/Cargo.toml index 8fa2ab90f..c4fd16aa0 100644 --- a/examples/cis2-multi/Cargo.toml +++ b/examples/cis2-multi/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = {path = "../../contract-testing"} +concordium-std-derive = { path = "../../concordium-std-derive" } rand = "0.8" [lib] diff --git a/examples/cis2-multi/tests/tests.rs b/examples/cis2-multi/tests/tests.rs index eb54eb31e..626c10f34 100644 --- a/examples/cis2-multi/tests/tests.rs +++ b/examples/cis2-multi/tests/tests.rs @@ -6,23 +6,27 @@ use concordium_std::{ collections::BTreeMap, AccountPublicKeys, AccountSignatures, CredentialSignatures, HashSha2256, SignatureEd25519, Timestamp, }; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); -const BOB_CANONICAL: AccountAddress = AccountAddress([ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, -]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const BOB_CANONICAL: AccountAddress = BOB.get_alias_unchecked(0); const BOB_CANONICAL_ADDR: Address = Address::Account(BOB_CANONICAL); const BOB_ADDR: Address = Address::Account(BOB); -const UPGRADER: AccountAddress = AccountAddress([2; 32]); +const UPGRADER: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const UPGRADER_ADDR: Address = Address::Account(UPGRADER); -const BLACKLISTER: AccountAddress = AccountAddress([3; 32]); +const BLACKLISTER: AccountAddress = + account_address!("2y57FyMyqAfY7X1SuSWJ5VMt1Z3ZgxbKt9w5mGoTwqA7YcpbXr"); const BLACKLISTER_ADDR: Address = Address::Account(BLACKLISTER); -const PAUSER: AccountAddress = AccountAddress([4; 32]); +const PAUSER: AccountAddress = + account_address!("2yWkbp92JL9LYVmxgP1QfTDsJs9sMLAWJBYMy8md3SQz5ErzEd"); const PAUSER_ADDR: Address = Address::Account(PAUSER); -const NON_EXISTING_ACCOUNT: AccountAddress = AccountAddress([99u8; 32]); +const NON_EXISTING_ACCOUNT: AccountAddress = + account_address!("3hWv6hv4nrgPTUgjHehCHx6ifXUoCfWZepKuPykXEBmsgjzni4"); /// Token IDs. const TOKEN_0: ContractTokenId = TokenIdU8(2); @@ -35,10 +39,7 @@ const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(10000); const SIGNER: Signer = Signer::with_one_key(); /// Dummy signature used as placeholder. -const DUMMY_SIGNATURE: SignatureEd25519 = SignatureEd25519([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -]); +const DUMMY_SIGNATURE: SignatureEd25519 = signature_ed25519!("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); /// Test minting succeeds and the tokens are owned by the given address and /// the appropriate events are logged. diff --git a/examples/cis2-nft/Cargo.toml b/examples/cis2-nft/Cargo.toml index 6a9e32a4f..2c2d6053f 100644 --- a/examples/cis2-nft/Cargo.toml +++ b/examples/cis2-nft/Cargo.toml @@ -17,6 +17,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = {path = "../../contract-testing"} +concordium-std-derive = {path = "../../concordium-std-derive"} [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/cis2-nft/tests/tests.rs b/examples/cis2-nft/tests/tests.rs index 258e75dc1..dcf2de376 100644 --- a/examples/cis2-nft/tests/tests.rs +++ b/examples/cis2-nft/tests/tests.rs @@ -3,11 +3,13 @@ use cis2_nft::*; use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::collections::BTreeSet; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); /// Token IDs. diff --git a/examples/cis2-wccd/Cargo.toml b/examples/cis2-wccd/Cargo.toml index afc7fd2e5..5168ad89c 100644 --- a/examples/cis2-wccd/Cargo.toml +++ b/examples/cis2-wccd/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/cis2-wccd/tests/tests.rs b/examples/cis2-wccd/tests/tests.rs index 8bccf31d3..8fddd1b52 100644 --- a/examples/cis2-wccd/tests/tests.rs +++ b/examples/cis2-wccd/tests/tests.rs @@ -2,13 +2,16 @@ use cis2_wccd::*; use concordium_cis2::*; use concordium_smart_contract_testing::*; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); -const CHARLIE: AccountAddress = AccountAddress([2; 32]); +const CHARLIE: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); /// Initial balance of the accounts. const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(10000); diff --git a/examples/cis3-nft-sponsored-txs/Cargo.toml b/examples/cis3-nft-sponsored-txs/Cargo.toml index a22bad237..9cd3f3688 100644 --- a/examples/cis3-nft-sponsored-txs/Cargo.toml +++ b/examples/cis3-nft-sponsored-txs/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } rand = "0.8" [lib] diff --git a/examples/cis3-nft-sponsored-txs/tests/tests.rs b/examples/cis3-nft-sponsored-txs/tests/tests.rs index a79ac660d..27d0428ff 100644 --- a/examples/cis3-nft-sponsored-txs/tests/tests.rs +++ b/examples/cis3-nft-sponsored-txs/tests/tests.rs @@ -8,15 +8,19 @@ use concordium_std::{ AccountPublicKeys, AccountSignatures, CredentialSignatures, HashSha2256, SignatureEd25519, Timestamp, }; +use concordium_std_derive::{account_address, signature_ed25519}; use std::collections::BTreeMap; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); -const CHARLIE: AccountAddress = AccountAddress([2u8; 32]); -const NON_EXISTING_ACCOUNT: AccountAddress = AccountAddress([3u8; 32]); +const CHARLIE: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); +const NON_EXISTING_ACCOUNT: AccountAddress = + account_address!("2y57FyMyqAfY7X1SuSWJ5VMt1Z3ZgxbKt9w5mGoTwqA7YcpbXr"); /// Token IDs. const TOKEN_0: ContractTokenId = TokenIdU32(1); @@ -34,23 +38,11 @@ const PUBLIC_KEY: [u8; 32] = [ 253, 29, 192, 126, 199, 208, 39, 69, 4, 246, 32, ]; -const SIGNATURE_TRANSFER: SignatureEd25519 = SignatureEd25519([ - 68, 134, 96, 171, 184, 199, 1, 93, 76, 87, 144, 68, 55, 180, 93, 56, 107, 95, 127, 112, 24, 55, - 162, 131, 165, 91, 133, 104, 2, 5, 78, 224, 214, 21, 66, 0, 44, 108, 52, 4, 108, 10, 123, 75, - 21, 68, 42, 79, 106, 106, 87, 125, 122, 77, 154, 114, 208, 145, 171, 47, 108, 96, 221, 13, -]); - -const SIGNATURE_UPDATE_OPERATOR: SignatureEd25519 = SignatureEd25519([ - 199, 250, 51, 48, 15, 210, 20, 180, 70, 191, 98, 217, 109, 67, 115, 94, 195, 81, 16, 157, 59, - 26, 36, 147, 91, 196, 254, 133, 149, 27, 148, 124, 130, 206, 68, 195, 139, 189, 244, 43, 253, - 12, 58, 17, 102, 63, 203, 35, 159, 54, 94, 59, 12, 193, 48, 78, 144, 112, 245, 149, 12, 181, - 74, 10, -]); - -const DUMMY_SIGNATURE: SignatureEd25519 = SignatureEd25519([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -]); +const SIGNATURE_TRANSFER: SignatureEd25519 = signature_ed25519!("448660ABB8C7015D4C57904437B45D386B5F7F701837A283A55B856802054EE0D61542002C6C34046C0A7B4B15442A4F6A6A577D7A4D9A72D091AB2F6C60DD0D"); + +const SIGNATURE_UPDATE_OPERATOR: SignatureEd25519 = signature_ed25519!("C7FA33300FD214B446BF62D96D43735EC351109D3B1A24935BC4FE85951B947C82CE44C38BBDF42BFD0C3A11663FCB239F365E3B0CC1304E9070F5950CB54A0A"); + +const DUMMY_SIGNATURE: SignatureEd25519 = signature_ed25519!("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); /// Test permit update operator function. The signature is generated in the test /// case. ALICE adds BOB as an operator. diff --git a/examples/counter-notify/Cargo.toml b/examples/counter-notify/Cargo.toml index 041bb9bb5..4a513d82d 100644 --- a/examples/counter-notify/Cargo.toml +++ b/examples/counter-notify/Cargo.toml @@ -17,6 +17,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/counter-notify/tests/tests.rs b/examples/counter-notify/tests/tests.rs index d100b87a4..2604bd581 100644 --- a/examples/counter-notify/tests/tests.rs +++ b/examples/counter-notify/tests/tests.rs @@ -1,6 +1,8 @@ use concordium_smart_contract_testing::*; +use concordium_std_derive::account_address; -const ACC_0: AccountAddress = AccountAddress([0u8; 32]); +const ACC_0: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(1000); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/credential-registry/Cargo.toml b/examples/credential-registry/Cargo.toml index 0113088eb..a37c68728 100644 --- a/examples/credential-registry/Cargo.toml +++ b/examples/credential-registry/Cargo.toml @@ -21,6 +21,7 @@ quickcheck = {version = "1"} [dev-dependencies] concordium-smart-contract-testing = {path = "../../contract-testing"} +concordium-std-derive = {path = "../../concordium-std-derive"} [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/credential-registry/tests/tests.rs b/examples/credential-registry/tests/tests.rs index 12b0ab983..2fe65dec8 100644 --- a/examples/credential-registry/tests/tests.rs +++ b/examples/credential-registry/tests/tests.rs @@ -2,11 +2,13 @@ use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::{PublicKeyEd25519, SignatureEd25519, Timestamp}; +use concordium_std_derive::*; use credential_registry::*; /// Constants for tests const SIGNER: Signer = Signer::with_one_key(); -pub const ISSUER_ACCOUNT: AccountAddress = AccountAddress([0u8; 32]); +pub const ISSUER_ACCOUNT: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); pub const ISSUER_ADDRESS: Address = Address::Account(ISSUER_ACCOUNT); pub const ISSUER_METADATA_URL: &str = "https://example-university.com/university.json"; pub const CREDENTIAL_METADATA_URL: &str = @@ -15,16 +17,9 @@ pub const CREDENTIAL_TYPE: &str = "UniversityDegreeCredential"; pub const CREDENTIAL_SCHEMA_URL: &str = "https://credentials-schemas.com/JsonSchema2023-education-certificate.json"; // Seed: 2FEE333FAD122A45AAB7BEB3228FA7858C48B551EA8EBC49D2D56E2BA22049FF -pub const PUBLIC_KEY: PublicKeyEd25519 = PublicKeyEd25519([ - 172, 5, 96, 236, 139, 208, 146, 88, 124, 42, 62, 124, 86, 108, 35, 242, 32, 11, 7, 48, 193, 61, - 177, 220, 104, 169, 145, 4, 8, 1, 236, 112, -]); -pub const SIGNATURE: SignatureEd25519 = SignatureEd25519([ - 254, 138, 58, 131, 209, 45, 191, 52, 98, 228, 26, 234, 155, 245, 244, 226, 0, 153, 104, 111, - 201, 136, 243, 167, 251, 116, 110, 206, 172, 223, 41, 180, 90, 22, 63, 43, 157, 129, 226, 75, - 49, 33, 155, 76, 160, 133, 127, 146, 150, 80, 199, 201, 80, 98, 179, 43, 46, 46, 211, 222, 185, - 216, 12, 4, -]); +pub const PUBLIC_KEY: PublicKeyEd25519 = + public_key_ed25519!("AC0560EC8BD092587C2A3E7C566C23F2200B0730C13DB1DC68A991040801EC70"); +pub const SIGNATURE: SignatureEd25519 = signature_ed25519!("FE8A3A83D12DBF3462E41AEA9BF5F4E20099686FC988F3A7FB746ECEACDF29B45A163F2B9D81E24B31219B4CA0857F929650C7C95062B32B2E2ED3DEB9D80C04"); /// Test initialization of the contract. #[test] diff --git a/examples/eSealing/Cargo.toml b/examples/eSealing/Cargo.toml index 7e5d1d71d..f357baae2 100644 --- a/examples/eSealing/Cargo.toml +++ b/examples/eSealing/Cargo.toml @@ -15,6 +15,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/eSealing/tests/tests.rs b/examples/eSealing/tests/tests.rs index 5c18ede85..dfef04cb9 100644 --- a/examples/eSealing/tests/tests.rs +++ b/examples/eSealing/tests/tests.rs @@ -1,10 +1,12 @@ //! Tests for the eSealing contract. use concordium_smart_contract_testing::*; use concordium_std::HashSha2256; +use concordium_std_derive::*; use e_sealing::*; /// Constants: -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/fib/Cargo.toml b/examples/fib/Cargo.toml index 6e86338f2..655cbce79 100644 --- a/examples/fib/Cargo.toml +++ b/examples/fib/Cargo.toml @@ -17,6 +17,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing"} +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/fib/tests/tests.rs b/examples/fib/tests/tests.rs index 26fac90f9..50137be2f 100644 --- a/examples/fib/tests/tests.rs +++ b/examples/fib/tests/tests.rs @@ -1,6 +1,8 @@ use concordium_smart_contract_testing::*; +use concordium_std_derive::*; -const ACC_0: AccountAddress = AccountAddress([0; 32]); +const ACC_0: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const SIGNER: Signer = Signer::with_one_key(); /// Compute the n-th fibonacci number. diff --git a/examples/icecream/Cargo.toml b/examples/icecream/Cargo.toml index dc9b68ba3..4ca122ace 100644 --- a/examples/icecream/Cargo.toml +++ b/examples/icecream/Cargo.toml @@ -12,6 +12,7 @@ concordium-std = {path = "../../concordium-std"} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [features] default = ["std", "bump_alloc"] diff --git a/examples/icecream/tests/tests.rs b/examples/icecream/tests/tests.rs index f2f40a87f..ffa631c76 100644 --- a/examples/icecream/tests/tests.rs +++ b/examples/icecream/tests/tests.rs @@ -1,11 +1,14 @@ //! This file contains the tests for the icecream contract. use concordium_smart_contract_testing::*; +use concordium_std_derive::*; use icecream::*; /// The icecream buyer. -const ACC_0: AccountAddress = AccountAddress([0; 32]); +const ACC_0: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); /// The icecream vendor. -const ACC_1: AccountAddress = AccountAddress([1; 32]); +const ACC_1: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const SIGNER: Signer = Signer::with_one_key(); const ICECREAM_PRICE: Amount = Amount::from_ccd(1000); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(10000); diff --git a/examples/nametoken/Cargo.toml b/examples/nametoken/Cargo.toml index 4bc017773..ffa656240 100644 --- a/examples/nametoken/Cargo.toml +++ b/examples/nametoken/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/nametoken/tests/tests.rs b/examples/nametoken/tests/tests.rs index 655366326..8aff1aa28 100644 --- a/examples/nametoken/tests/tests.rs +++ b/examples/nametoken/tests/tests.rs @@ -1,14 +1,17 @@ //! Tests for the `nametoken` contract. use concordium_cis2::*; use concordium_smart_contract_testing::*; +use concordium_std_derive::*; use nametoken::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); -const CHARLIE: AccountAddress = AccountAddress([2; 32]); +const CHARLIE: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); /// Token IDs. const NAME_0: &str = "MyEvenCoolerName"; diff --git a/examples/piggy-bank/part2/Cargo.toml b/examples/piggy-bank/part2/Cargo.toml index 683dc7ed3..20ba58fcb 100644 --- a/examples/piggy-bank/part2/Cargo.toml +++ b/examples/piggy-bank/part2/Cargo.toml @@ -24,6 +24,7 @@ default-features = false [dev-dependencies] concordium-smart-contract-testing = { path = "../../../contract-testing" } +concordium-std-derive = { path = "../../../concordium-std-derive" } [profile.release] opt-level = 3 diff --git a/examples/piggy-bank/part2/tests/tests.rs b/examples/piggy-bank/part2/tests/tests.rs index fc7b9ebfb..081bf9a06 100644 --- a/examples/piggy-bank/part2/tests/tests.rs +++ b/examples/piggy-bank/part2/tests/tests.rs @@ -1,10 +1,13 @@ //! This module contains integration tests for the piggy bank. //! To run them, use `cargo test`. use concordium_smart_contract_testing::*; +use concordium_std_derive::*; use piggy_bank_part2::*; -const ACC_ADDR_OWNER: AccountAddress = AccountAddress([0u8; 32]); -const ACC_ADDR_OTHER: AccountAddress = AccountAddress([1u8; 32]); +const ACC_ADDR_OWNER: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const ACC_ADDR_OTHER: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(1000); /// A helper method for setting up: diff --git a/examples/proxy/Cargo.toml b/examples/proxy/Cargo.toml index 9fa7f74a2..d8b696188 100644 --- a/examples/proxy/Cargo.toml +++ b/examples/proxy/Cargo.toml @@ -15,6 +15,7 @@ bump_alloc = ["concordium-std/bump_alloc"] [dependencies] concordium-std = {path = "../../concordium-std"} +concordium-std-derive = { path = "../../concordium-std-derive" } [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } diff --git a/examples/proxy/tests/tests.rs b/examples/proxy/tests/tests.rs index 6a29e46b0..07e02f4e1 100644 --- a/examples/proxy/tests/tests.rs +++ b/examples/proxy/tests/tests.rs @@ -1,7 +1,9 @@ //! Tests for the proxy example. use concordium_smart_contract_testing::*; +use concordium_std_derive::*; -const ALICE: AccountAddress = AccountAddress([0u8; 32]); +const ALICE: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const ALICE_ADDR: Address = Address::Account(ALICE); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/recorder/Cargo.toml b/examples/recorder/Cargo.toml index fc812dd45..2e1af3ff2 100644 --- a/examples/recorder/Cargo.toml +++ b/examples/recorder/Cargo.toml @@ -14,6 +14,7 @@ bump_alloc = ["concordium-std/bump_alloc"] [dependencies] concordium-std = {path = "../../concordium-std", default-features = false} +concordium-std-derive = { path = "../../concordium-std-derive" } [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } diff --git a/examples/recorder/tests/tests.rs b/examples/recorder/tests/tests.rs index 67767a8a9..f45bb2d9e 100644 --- a/examples/recorder/tests/tests.rs +++ b/examples/recorder/tests/tests.rs @@ -1,8 +1,11 @@ //! Tests for the recorder example contract. use concordium_smart_contract_testing::*; +use concordium_std_derive::*; -const ACC_0: AccountAddress = AccountAddress([0u8; 32]); -const ACC_1: AccountAddress = AccountAddress([1u8; 32]); +const ACC_0: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const ACC_1: AccountAddress = + account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(1000); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/signature-verifier/Cargo.toml b/examples/signature-verifier/Cargo.toml index 493200483..8779c6f65 100644 --- a/examples/signature-verifier/Cargo.toml +++ b/examples/signature-verifier/Cargo.toml @@ -12,6 +12,7 @@ concordium-std = {path = "../../concordium-std"} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } ed25519-dalek = { version = "2.0", features = ["rand_core"] } rand = "0.8.5" diff --git a/examples/signature-verifier/tests/tests.rs b/examples/signature-verifier/tests/tests.rs index 851b281d0..8ce245e3f 100644 --- a/examples/signature-verifier/tests/tests.rs +++ b/examples/signature-verifier/tests/tests.rs @@ -1,10 +1,12 @@ //! Tests for the signature-verifier contract. use concordium_smart_contract_testing::*; use concordium_std::{PublicKeyEd25519, SignatureEd25519}; +use concordium_std_derive::*; use signature_verifier::*; use std::str::FromStr; -const ALICE: AccountAddress = AccountAddress([0u8; 32]); +const ALICE: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const ALICE_ADDR: Address = Address::Account(ALICE); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/smart-contract-upgrade/contract-version1/Cargo.toml b/examples/smart-contract-upgrade/contract-version1/Cargo.toml index d597cd590..df8b78c2f 100644 --- a/examples/smart-contract-upgrade/contract-version1/Cargo.toml +++ b/examples/smart-contract-upgrade/contract-version1/Cargo.toml @@ -18,6 +18,7 @@ concordium-std = {path = "../../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../../contract-testing" } +concordium-std-derive = { path = "../../../concordium-std-derive" } [lib] crate-type=["cdylib", "rlib"] diff --git a/examples/smart-contract-upgrade/contract-version1/tests/tests.rs b/examples/smart-contract-upgrade/contract-version1/tests/tests.rs index a1916633a..ae7cb224f 100644 --- a/examples/smart-contract-upgrade/contract-version1/tests/tests.rs +++ b/examples/smart-contract-upgrade/contract-version1/tests/tests.rs @@ -16,9 +16,11 @@ //! contract-version1/Cargo.toml use concordium_smart_contract_testing::*; use concordium_std::Deserial; +use concordium_std_derive::*; use smart_contract_upgrade::UpgradeParams; -const ACC_ADDR_OWNER: AccountAddress = AccountAddress([0u8; 32]); +const ACC_ADDR_OWNER: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(1000); #[derive(Deserial, Debug, PartialEq, Eq)] diff --git a/examples/sponsored-tx-enabled-auction/Cargo.toml b/examples/sponsored-tx-enabled-auction/Cargo.toml index 5dd4bd486..b56a5c6db 100644 --- a/examples/sponsored-tx-enabled-auction/Cargo.toml +++ b/examples/sponsored-tx-enabled-auction/Cargo.toml @@ -16,6 +16,7 @@ concordium-cis2 = {path = "../../concordium-cis2", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } cis2-multi = { path = "../cis2-multi/" } rand = "0.8" diff --git a/examples/sponsored-tx-enabled-auction/tests/tests.rs b/examples/sponsored-tx-enabled-auction/tests/tests.rs index 6df037a8a..5bbc7494b 100644 --- a/examples/sponsored-tx-enabled-auction/tests/tests.rs +++ b/examples/sponsored-tx-enabled-auction/tests/tests.rs @@ -10,23 +10,23 @@ use concordium_smart_contract_testing::*; use concordium_std::{ AccountSignatures, CredentialSignatures, HashSha2256, MetadataUrl, SignatureEd25519, }; +use concordium_std_derive::*; use sponsored_tx_enabled_auction::*; use std::collections::BTreeMap; /// The test accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); -const ALICE_ADDR: Address = Address::Account(AccountAddress([0; 32])); -const BOB: AccountAddress = AccountAddress([1; 32]); -const BOB_ADDR: Address = Address::Account(AccountAddress([1; 32])); -const CAROL: AccountAddress = AccountAddress([2; 32]); +const ALICE: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const ALICE_ADDR: Address = Address::Account(ALICE); +const BOB: AccountAddress = account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); +const BOB_ADDR: Address = Address::Account(BOB); +const CAROL: AccountAddress = + account_address!("2y57FyMyqAfY7X1SuSWJ5VMt1Z3ZgxbKt9w5mGoTwqA7YcpbXr"); const SIGNER: Signer = Signer::with_one_key(); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(10000); -const DUMMY_SIGNATURE: SignatureEd25519 = SignatureEd25519([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -]); +const DUMMY_SIGNATURE: SignatureEd25519 = signature_ed25519!("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); #[test] fn test_add_item() { diff --git a/examples/transfer-policy-check/Cargo.toml b/examples/transfer-policy-check/Cargo.toml index cc0e9a6d0..009420a0c 100644 --- a/examples/transfer-policy-check/Cargo.toml +++ b/examples/transfer-policy-check/Cargo.toml @@ -12,6 +12,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [features] default = ["std", "bump_alloc"] diff --git a/examples/transfer-policy-check/tests/tests.rs b/examples/transfer-policy-check/tests/tests.rs index f98c40144..60301577b 100644 --- a/examples/transfer-policy-check/tests/tests.rs +++ b/examples/transfer-policy-check/tests/tests.rs @@ -1,11 +1,13 @@ //! Tests for the transfer-policy-check contract. use concordium_smart_contract_testing::*; use concordium_std::{attributes, OwnedPolicy}; +use concordium_std_derive::*; use transfer_policy_check::*; /// Constants. -const ALICE: AccountAddress = AccountAddress([0u8; 32]); -const BOB: AccountAddress = AccountAddress([1u8; 32]); +const ALICE: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); +const BOB: AccountAddress = account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const BOB_ADDR: Address = Address::Account(BOB); const SIGNER: Signer = Signer::with_one_key(); diff --git a/examples/two-step-transfer/Cargo.toml b/examples/two-step-transfer/Cargo.toml index 97fc60f99..ffbab0f88 100644 --- a/examples/two-step-transfer/Cargo.toml +++ b/examples/two-step-transfer/Cargo.toml @@ -21,9 +21,9 @@ path = "../../concordium-std" default-features = false features = ["concordium-quickcheck"] -[dev-dependencies.concordium-std] -version = "*" -path = "../../concordium-std" +[dev-dependencies] +concordium-std = { version = "*", path = "../../concordium-std" } +concordium-std-derive = { path = "../../concordium-std-derive" } [lib] crate-type = ["cdylib", "rlib"] diff --git a/examples/voting/Cargo.toml b/examples/voting/Cargo.toml index f8fe8f3a3..d95ed77a6 100644 --- a/examples/voting/Cargo.toml +++ b/examples/voting/Cargo.toml @@ -12,6 +12,7 @@ concordium-std = {path = "../../concordium-std", default-features = false} [dev-dependencies] concordium-smart-contract-testing = { path = "../../contract-testing" } +concordium-std-derive = { path = "../../concordium-std-derive" } [features] default = ["std", "bump_alloc"] diff --git a/examples/voting/tests/tests.rs b/examples/voting/tests/tests.rs index 016ea9b1f..9dae3cda1 100644 --- a/examples/voting/tests/tests.rs +++ b/examples/voting/tests/tests.rs @@ -1,11 +1,13 @@ use concordium_smart_contract_testing::*; +use concordium_std_derive::*; use voting_contract::*; // Constants. const SIGNER: Signer = Signer::with_one_key(); -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xdTv8awN1BjgYEw8W1BVXVtiEwG2b29U8KoZQqJrDuEqddseE"); const BOB_ADDR: Address = Address::Account(BOB); const ACC_INITIAL_BALANCE: Amount = Amount::from_ccd(1000); diff --git a/templates/cis2-nft/Cargo.toml b/templates/cis2-nft/Cargo.toml index 38ea10d33..7697e7a4b 100644 --- a/templates/cis2-nft/Cargo.toml +++ b/templates/cis2-nft/Cargo.toml @@ -17,6 +17,7 @@ concordium-cis2 = {version = "6.1", default-features = false} [dev-dependencies] concordium-smart-contract-testing = "4.2" +concordium-std-derive = "6.0" [lib] crate-type=["cdylib", "rlib"] diff --git a/templates/cis2-nft/tests/tests.rs b/templates/cis2-nft/tests/tests.rs index 634d96424..6321647aa 100644 --- a/templates/cis2-nft/tests/tests.rs +++ b/templates/cis2-nft/tests/tests.rs @@ -3,11 +3,13 @@ use {{crate_name}}::*; use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::collections::BTreeSet; +use concordium_std_derive::*; /// The tests accounts. -const ALICE: AccountAddress = AccountAddress([0; 32]); +const ALICE: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); const ALICE_ADDR: Address = Address::Account(ALICE); -const BOB: AccountAddress = AccountAddress([1; 32]); +const BOB: AccountAddress = account_address!("2xBpaHottqhwFZURMZW4uZduQvpxNDSy46iXMYs9kceNGaPpZX"); const BOB_ADDR: Address = Address::Account(BOB); /// Token IDs. diff --git a/templates/credential-registry/Cargo.toml b/templates/credential-registry/Cargo.toml index 2e40491da..5d5522a12 100644 --- a/templates/credential-registry/Cargo.toml +++ b/templates/credential-registry/Cargo.toml @@ -21,6 +21,7 @@ quickcheck = {version = "1"} [dev-dependencies] concordium-smart-contract-testing = "4.2" +concordium-std-derive = "6.0" [lib] crate-type=["cdylib", "rlib"] diff --git a/templates/credential-registry/tests/tests.rs b/templates/credential-registry/tests/tests.rs index 46cdd4718..ef16d3e1f 100644 --- a/templates/credential-registry/tests/tests.rs +++ b/templates/credential-registry/tests/tests.rs @@ -2,11 +2,13 @@ use concordium_cis2::*; use concordium_smart_contract_testing::*; use concordium_std::{PublicKeyEd25519, SignatureEd25519, Timestamp}; +use concordium_std_derive::*; use {{crate_name}}::*; /// Constants for tests const SIGNER: Signer = Signer::with_one_key(); -pub const ISSUER_ACCOUNT: AccountAddress = AccountAddress([0u8; 32]); +pub const ISSUER_ACCOUNT: AccountAddress = + account_address!("2wkBET2rRgE8pahuaczxKbmv7ciehqsne57F9gtzf1PVdr2VP3"); pub const ISSUER_ADDRESS: Address = Address::Account(ISSUER_ACCOUNT); pub const ISSUER_METADATA_URL: &str = "https://example-university.com/university.json"; pub const CREDENTIAL_METADATA_URL: &str = @@ -15,16 +17,9 @@ pub const CREDENTIAL_TYPE: &str = "UniversityDegreeCredential"; pub const CREDENTIAL_SCHEMA_URL: &str = "https://credentials-schemas.com/JsonSchema2023-education-certificate.json"; // Seed: 2FEE333FAD122A45AAB7BEB3228FA7858C48B551EA8EBC49D2D56E2BA22049FF -pub const PUBLIC_KEY: PublicKeyEd25519 = PublicKeyEd25519([ - 172, 5, 96, 236, 139, 208, 146, 88, 124, 42, 62, 124, 86, 108, 35, 242, 32, 11, 7, 48, 193, 61, - 177, 220, 104, 169, 145, 4, 8, 1, 236, 112, -]); -pub const SIGNATURE: SignatureEd25519 = SignatureEd25519([ - 254, 138, 58, 131, 209, 45, 191, 52, 98, 228, 26, 234, 155, 245, 244, 226, 0, 153, 104, 111, - 201, 136, 243, 167, 251, 116, 110, 206, 172, 223, 41, 180, 90, 22, 63, 43, 157, 129, 226, 75, - 49, 33, 155, 76, 160, 133, 127, 146, 150, 80, 199, 201, 80, 98, 179, 43, 46, 46, 211, 222, 185, - 216, 12, 4, -]); +pub const PUBLIC_KEY: PublicKeyEd25519 = + public_key_ed25519!("AC0560EC8BD092587C2A3E7C566C23F2200B0730C13DB1DC68A991040801EC70"); +pub const SIGNATURE: SignatureEd25519 = signature_ed25519!("FE8A3A83D12DBF3462E41AEA9BF5F4E20099686FC988F3A7FB746ECEACDF29B45A163F2B9D81E24B31219B4CA0857F929650C7C95062B32B2E2ED3DEB9D80C04"); /// Test initialization of the contract. #[test]