diff --git a/contract_samples/rust/Cargo.lock b/contract_samples/rust/Cargo.lock index 44631dd..1aad6c8 100644 --- a/contract_samples/rust/Cargo.lock +++ b/contract_samples/rust/Cargo.lock @@ -6,9 +6,19 @@ version = 4 name = "amadeus-sdk" version = "0.1.0" dependencies = [ + "amadeus-sdk-macros", "dlmalloc", ] +[[package]] +name = "amadeus-sdk-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -32,6 +42,41 @@ version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +[[package]] +name = "proc-macro2" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9695f8df41bb4f3d222c95a67532365f569318332d03d5f3f67f37b20e6ebdf0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + [[package]] name = "windows-link" version = "0.2.1" diff --git a/contract_samples/rust/Cargo.toml b/contract_samples/rust/Cargo.toml index 87e94fe..351d8ca 100644 --- a/contract_samples/rust/Cargo.toml +++ b/contract_samples/rust/Cargo.toml @@ -1,17 +1,6 @@ -[package] -name = "amadeus-sdk" -version = "0.1.0" -edition = "2021" -authors = ["Amadeus Team"] -description = "Rust SDK for writing Amadeus smart contracts" -license = "MIT" -repository = "https://github.com/amadeusprotocol/node" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -dlmalloc = { version = "0.2", features = ["global"] } +[workspace] +resolver = "3" +members = ["sdk", "sdk-macros"] [profile.release] opt-level = "z" @@ -25,27 +14,3 @@ opt-level = "z" [profile.dev] panic = "abort" - -# WASM-specific build config -[package.metadata.wasm-pack.profile.release] -wasm-opt = false - -[[example]] -name = "counter" -path = "examples/counter.rs" -crate-type = ["cdylib"] - -[[example]] -name = "deposit" -path = "examples/deposit.rs" -crate-type = ["cdylib"] - -[[example]] -name = "coin" -path = "examples/coin.rs" -crate-type = ["cdylib"] - -[[example]] -name = "nft" -path = "examples/nft.rs" -crate-type = ["cdylib"] diff --git a/contract_samples/rust/README.md b/contract_samples/rust/README.md index 5030eb6..4fef5bb 100644 --- a/contract_samples/rust/README.md +++ b/contract_samples/rust/README.md @@ -26,14 +26,6 @@ cargo install amadeus-cli To build the wasm smart contracts, simply run the `./build_and_validate.sh`. The artifacts will be placed in `target/wasm32-unknown-unknown/release/examples`. -Optionally you can optimize the resulting wasm contracts. - -```bash -wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/counter.wasm -o counter.wasm -wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/deposit.wasm -o deposit.wasm -wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/coin.wasm -o coin.wasm -wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/nft.wasm -o nft.wasm -``` ### Testing @@ -49,8 +41,7 @@ ama get-pk --sk wallet.sk ama gen-sk counter.sk export COUNTER_PK=$(ama get-pk --sk counter.sk) ama tx --sk wallet.sk --url https://testnet-rpc.ama.one Coin transfer '[{"b58": "'$COUNTER_PK'"}, "2000000000", "AMA"]' -ama deploy-tx --sk counter.sk counter.wasm --url https://testnet-rpc.ama.one -ama tx --sk counter.sk --url https://testnet-rpc.ama.one $COUNTER_PK init '[]' +ama deploy-tx --sk counter.sk counter.wasm init '[]' --url https://testnet-rpc.ama.one curl "https://testnet-rpc.ama.one/api/contract/view/$COUNTER_PK/get" ama tx --sk wallet.sk --url https://testnet-rpc.ama.one $COUNTER_PK increment '["5"]' curl "https://testnet-rpc.ama.one/api/contract/view/$COUNTER_PK/get" @@ -66,7 +57,7 @@ ama tx --sk wallet.sk $DEPOSIT_PK balance '["AMA"]' --url https://testnet-rpc.am ama gen-sk coin.sk export COIN_PK=$(ama get-pk --sk coin.sk) ama tx --sk wallet.sk Coin transfer '[{"b58": "'$COIN_PK'"}, "2000000000", "AMA"]' --url https://testnet-rpc.ama.one -ama deploy-tx --sk coin.sk coin.wasm --url https://testnet-rpc.ama.one +ama deploy-tx --sk coin.sk coin.wasm init --url https://testnet-rpc.ama.one ama tx --sk wallet.sk $COIN_PK deposit '[]' AMA 1500000000 --url https://testnet-rpc.ama.one ama tx --sk wallet.sk $COIN_PK withdraw '["AMA", "500000000"]' --url https://testnet-rpc.ama.one ama tx --sk wallet.sk $COIN_PK withdraw '["AMA", "1000000000"]' --url https://testnet-rpc.ama.one diff --git a/contract_samples/rust/build_and_validate.sh b/contract_samples/rust/build_and_validate.sh index 0654bc1..efa51fe 100755 --- a/contract_samples/rust/build_and_validate.sh +++ b/contract_samples/rust/build_and_validate.sh @@ -1,19 +1,20 @@ #!/bin/bash - set -e -# Build each example -cargo build --example counter --target wasm32-unknown-unknown --release -cargo build --example deposit --target wasm32-unknown-unknown --release -cargo build --example coin --target wasm32-unknown-unknown --release -cargo build --example nft --target wasm32-unknown-unknown --release +script_dir=$(dirname "$0") +cd "$script_dir" + +cargo build -p amadeus-sdk --example counter --target wasm32-unknown-unknown --release +cargo build -p amadeus-sdk --example deposit --target wasm32-unknown-unknown --release +cargo build -p amadeus-sdk --example coin --target wasm32-unknown-unknown --release +cargo build -p amadeus-sdk --example nft --target wasm32-unknown-unknown --release + +wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/counter.wasm -o counter.wasm +wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/deposit.wasm -o deposit.wasm +wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/coin.wasm -o coin.wasm +wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/nft.wasm -o nft.wasm -# Validate each contract -curl -X POST -H "Content-Type: application/octet-stream" --data-binary @target/wasm32-unknown-unknown/release/examples/counter.wasm https://mainnet-rpc.ama.one/api/contract/validate -echo "" -curl -X POST -H "Content-Type: application/octet-stream" --data-binary @target/wasm32-unknown-unknown/release/examples/deposit.wasm https://mainnet-rpc.ama.one/api/contract/validate -echo "" -curl -X POST -H "Content-Type: application/octet-stream" --data-binary @target/wasm32-unknown-unknown/release/examples/coin.wasm https://mainnet-rpc.ama.one/api/contract/validate -echo "" -curl -X POST -H "Content-Type: application/octet-stream" --data-binary @target/wasm32-unknown-unknown/release/examples/nft.wasm https://mainnet-rpc.ama.one/api/contract/validate -echo "" +curl -X POST -H "Content-Type: application/octet-stream" --data-binary @counter.wasm https://mainnet-rpc.ama.one/api/contract/validate +curl -X POST -H "Content-Type: application/octet-stream" --data-binary @deposit.wasm https://mainnet-rpc.ama.one/api/contract/validate +curl -X POST -H "Content-Type: application/octet-stream" --data-binary @coin.wasm https://mainnet-rpc.ama.one/api/contract/validate +curl -X POST -H "Content-Type: application/octet-stream" --data-binary @nft.wasm https://mainnet-rpc.ama.one/api/contract/validate diff --git a/contract_samples/rust/examples/coin.rs b/contract_samples/rust/examples/coin.rs index 3926b94..730862b 100644 --- a/contract_samples/rust/examples/coin.rs +++ b/contract_samples/rust/examples/coin.rs @@ -2,7 +2,7 @@ #![no_main] extern crate alloc; use amadeus_sdk::*; -use alloc::{vec::Vec}; +use alloc::{vec::Vec, string::String}; fn vault_key(symbol: &Vec) -> Vec { b!("vault:", account_caller(), ":", symbol) @@ -11,43 +11,31 @@ fn vault_key(symbol: &Vec) -> Vec { #[no_mangle] pub extern "C" fn init() { log("init called"); - let mint_a_billion = encoding::coin_raw(1_000_000_000, 9); call!("Coin", "create_and_mint", [ "USDFAKE", mint_a_billion, 9, "false", "false", "false" ]); } -#[no_mangle] -pub extern "C" fn deposit() { +#[contract] +fn deposit() -> String { log("deposit called"); - let (has_attachment, (symbol, amount)) = get_attachment(); amadeus_sdk::assert!(has_attachment, "deposit has no attachment"); - let amount_i128 = i128::from_bytes(amount); amadeus_sdk::assert!(amount_i128 > 100, "deposit amount less than 100"); - - let total_vault_deposited = kv_increment(vault_key(&symbol), amount_i128); - ret(total_vault_deposited); + kv_increment(vault_key(&symbol), amount_i128) } -#[no_mangle] -pub extern "C" fn withdraw(symbol_ptr: i32, amount_ptr: i32) { +#[contract] +fn withdraw(symbol: Vec, amount: Vec) -> i128 { log("withdraw called"); - - let withdraw_symbol = read_bytes(symbol_ptr); - let withdraw_amount = read_bytes(amount_ptr); - let withdraw_amount_int = encoding::bytes_to_i128(&withdraw_amount); + let withdraw_amount_int = encoding::bytes_to_i128(&amount); amadeus_sdk::assert!(withdraw_amount_int > 0, "amount lte 0"); - - let key = vault_key(&withdraw_symbol); + let key = vault_key(&symbol); let vault_balance: i128 = kv_get(&key).unwrap_or(0); amadeus_sdk::assert!(vault_balance >= withdraw_amount_int, "insufficient funds"); - kv_increment(key, -withdraw_amount_int); - - call!("Coin", "transfer", [account_caller(), withdraw_amount, withdraw_symbol]); - - ret(vault_balance - withdraw_amount_int); + call!("Coin", "transfer", [account_caller(), amount, symbol]); + vault_balance - withdraw_amount_int } diff --git a/contract_samples/rust/examples/counter.rs b/contract_samples/rust/examples/counter.rs index 27e6a84..0eadea1 100644 --- a/contract_samples/rust/examples/counter.rs +++ b/contract_samples/rust/examples/counter.rs @@ -2,6 +2,7 @@ #![no_main] extern crate alloc; use amadeus_sdk::*; +use alloc::{vec::Vec, string::String}; #[no_mangle] pub extern "C" fn init() { @@ -9,22 +10,19 @@ pub extern "C" fn init() { kv_put("inited", "true"); } -#[no_mangle] -pub extern "C" fn get() { - ret(kv_get("the_counter").unwrap_or(0)); +#[contract] +fn get() -> i128 { + kv_get("the_counter").unwrap_or(0) } -#[no_mangle] -pub extern "C" fn increment(amount_ptr: i32) { - let amount = read_bytes(amount_ptr); - let new_counter = kv_increment("the_counter", amount); - ret(new_counter); +#[contract] +fn increment(amount: Vec) -> String { + kv_increment("the_counter", amount) } -#[no_mangle] -pub extern "C" fn increment_another_counter(contract_ptr: i32) { - let contract = read_bytes(contract_ptr); +#[contract] +fn increment_another_counter(contract: Vec) -> Vec { let incr_by = 3i64; log("increment_another_counter"); - ret(call!(contract.as_slice(), "increment", [incr_by])); + call!(contract.as_slice(), "increment", [incr_by]) } diff --git a/contract_samples/rust/examples/deposit.rs b/contract_samples/rust/examples/deposit.rs index ac4dde1..35876be 100644 --- a/contract_samples/rust/examples/deposit.rs +++ b/contract_samples/rust/examples/deposit.rs @@ -2,56 +2,42 @@ #![no_main] extern crate alloc; use amadeus_sdk::*; -use alloc::{vec::Vec}; +use alloc::{vec::Vec, string::String}; fn vault_key(symbol: &Vec) -> Vec { b!("vault:", account_caller(), ":", symbol) } -#[no_mangle] -pub extern "C" fn balance(symbol_ptr: i32) { - let key = vault_key(&read_bytes(symbol_ptr)); - ret(kv_get(key).unwrap_or(0)); +#[contract] +fn balance(symbol: Vec) -> i128 { + kv_get(vault_key(&symbol)).unwrap_or(0) } -#[no_mangle] -pub extern "C" fn deposit() { +#[contract] +fn deposit() -> String { log("deposit called"); - let (has_attachment, (symbol, amount)) = get_attachment(); amadeus_sdk::assert!(has_attachment, "deposit has no attachment"); - let amount_i128 = i128::from_bytes(amount); amadeus_sdk::assert!(amount_i128 > 100, "deposit amount less than 100"); - - let total_vault_deposited = kv_increment(vault_key(&symbol), amount_i128); - ret(total_vault_deposited); + kv_increment(vault_key(&symbol), amount_i128) } -#[no_mangle] -pub extern "C" fn withdraw(symbol_ptr: i32, amount_ptr: i32) { +#[contract] +fn withdraw(symbol: Vec, amount: Vec) -> i128 { log("withdraw called"); - - let withdraw_symbol = read_bytes(symbol_ptr); - let withdraw_amount = read_bytes(amount_ptr); - let withdraw_amount_int = encoding::bytes_to_i128(&withdraw_amount); + let withdraw_amount_int = encoding::bytes_to_i128(&amount); amadeus_sdk::assert!(withdraw_amount_int > 0, "amount lte 0"); - - let key = vault_key(&withdraw_symbol); + let key = vault_key(&symbol); let vault_balance: i128 = kv_get(&key).unwrap_or(0); amadeus_sdk::assert!(vault_balance >= withdraw_amount_int, "insufficient funds"); - kv_increment(key, -withdraw_amount_int); - - call!("Coin", "transfer", [account_caller(), withdraw_amount, withdraw_symbol]); - - ret(vault_balance - withdraw_amount_int); + call!("Coin", "transfer", [account_caller(), amount, symbol]); + vault_balance - withdraw_amount_int } -#[no_mangle] -pub extern "C" fn burn(symbol_ptr: i32, amount_ptr: i32) { - let symbol = read_string(symbol_ptr); - let amount = read_bytes(amount_ptr); +#[contract] +fn burn(symbol: String, amount: Vec) -> Vec { log("burn"); - ret(call!("Coin", "transfer", [BURN_ADDRESS, amount, symbol])); + call!("Coin", "transfer", [BURN_ADDRESS, amount, symbol]) } diff --git a/contract_samples/rust/examples/nft.rs b/contract_samples/rust/examples/nft.rs index ae35a85..7fd2cb9 100644 --- a/contract_samples/rust/examples/nft.rs +++ b/contract_samples/rust/examples/nft.rs @@ -2,17 +2,16 @@ #![no_main] extern crate alloc; use amadeus_sdk::*; +use alloc::{vec::Vec, string::String}; #[no_mangle] pub extern "C" fn init() { call!("Nft", "create_collection", ["AGENTIC", "false"]); } -#[no_mangle] -pub extern "C" fn view_nft(collection_ptr: i32, token_ptr: i32) { - let collection = read_string(collection_ptr); - let token = read_bytes(token_ptr); - let url = match (collection.as_str(), token.as_slice()) { +#[contract] +fn view_nft(collection: String, token: Vec) -> &'static str { + match (collection.as_str(), token.as_slice()) { ("AGENTIC", b"1") => "https://ipfs.io/ipfs/bafybeicn7i3soqdgr7dwnrwytgq4zxy7a5jpkizrvhm5mv6bgjd32wm3q4/welcome-to-IPFS.jpg", ("AGENTIC", b"2") => "https://ipfs.io/ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme", ("AGENTIC", b"3") => "https://ipfs.io/ipfs/QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB", @@ -20,18 +19,17 @@ pub extern "C" fn view_nft(collection_ptr: i32, token_ptr: i32) { ("AGENTIC", b"5") => "https://ipfs.io/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN", ("AGENTIC", b"6") => "https://ipfs.io/ipfs/QmTn4KLRkKPDkB3KpJWGXZHPPh5dFnKqNcPjX4ZcbPvKwv", _ => "https://ipfs.io/ipfs/bafybeicn7i3soqdgr7dwnrwytgq4zxy7a5jpkizrvhm5mv6bgjd32wm3q4/welcome-to-IPFS.jpg", - }; - ret(url); + } } -#[no_mangle] -pub extern "C" fn claim() { +#[contract] +fn claim() -> i64 { log("claiming"); call!("Nft", "mint", [account_caller(), 1, "AGENTIC", "2"]); call!("Nft", "mint", [account_caller(), 1, "AGENTIC", "2"]); let random_token = roll_dice(); call!("Nft", "mint", [account_caller(), 1, "AGENTIC", random_token]); - ret(random_token); + random_token } static mut PRNG_STATE: u64 = 0; @@ -41,25 +39,17 @@ fn roll_dice() -> i64 { unsafe { if !PRNG_INIT { let s = seed(); - - // (Using FNV-1a hash algorithm for decent distribution) let mut h: u64 = 0xcbf29ce484222325; for &byte in s.iter() { h = h ^ (byte as u64); h = h.wrapping_mul(0x100000001b3); } - PRNG_STATE = h; PRNG_INIT = true; } - - // 2. "Increment" the seed (Step the LCG) - // Constants from Musl Libc / Knuth - // state = state * 6364136223846793005 + 1442695040888963407 PRNG_STATE = PRNG_STATE .wrapping_mul(6364136223846793005) .wrapping_add(1442695040888963407); - let result = (PRNG_STATE >> 32) as i64; (result.abs() % 6) + 1 } diff --git a/contract_samples/rust/sdk-macros/Cargo.toml b/contract_samples/rust/sdk-macros/Cargo.toml new file mode 100644 index 0000000..3de694e --- /dev/null +++ b/contract_samples/rust/sdk-macros/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "amadeus-sdk-macros" +version = "0.1.0" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2.0", features = ["full"] } +quote = "1.0" +proc-macro2 = "1.0" diff --git a/contract_samples/rust/sdk-macros/src/lib.rs b/contract_samples/rust/sdk-macros/src/lib.rs new file mode 100644 index 0000000..0fdb661 --- /dev/null +++ b/contract_samples/rust/sdk-macros/src/lib.rs @@ -0,0 +1,61 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, FnArg, ItemFn, ReturnType, Type}; + +#[proc_macro_attribute] +pub fn contract(_attr: TokenStream, item: TokenStream) -> TokenStream { + let input = parse_macro_input!(item as ItemFn); + let vis = &input.vis; + let fn_name = &input.sig.ident; + let impl_fn_name = syn::Ident::new(&format!("{}_impl", fn_name), fn_name.span()); + let inputs = &input.sig.inputs; + let output = &input.sig.output; + let block = &input.block; + let attrs = &input.attrs; + let has_return = !matches!(output, ReturnType::Default); + + let mut param_count = 0; + let mut wrapper_params = quote!{}; + let mut deserializations = quote!{}; + let mut call_args = quote!{}; + + for arg in inputs.iter() { + if let FnArg::Typed(pat_type) = arg { + let param_name = &pat_type.pat; + let ptr_name = syn::Ident::new(&format!("arg{}_ptr", param_count), fn_name.span()); + + let deserialize_fn = match &*pat_type.ty { + Type::Path(tp) if quote!(#tp).to_string().contains("String") => quote!(read_string), + _ => quote!(read_bytes), + }; + + if param_count > 0 { + wrapper_params.extend(quote!(, #ptr_name: i32)); + call_args.extend(quote!(, #param_name)); + } else { + wrapper_params.extend(quote!(#ptr_name: i32)); + call_args.extend(quote!(#param_name)); + } + + deserializations.extend(quote! { let #param_name = #deserialize_fn(#ptr_name); }); + param_count += 1; + } + } + + let wrapper_sig = if param_count == 0 { + quote!(#[no_mangle] pub extern "C" fn #fn_name()) + } else { + quote!(#[no_mangle] pub extern "C" fn #fn_name(#wrapper_params)) + }; + + let wrapper_call = if has_return { + quote!(ret(#impl_fn_name(#call_args));) + } else { + quote!(#impl_fn_name(#call_args);) + }; + + TokenStream::from(quote! { + #wrapper_sig { #deserializations #wrapper_call } + #(#attrs)* #vis fn #impl_fn_name(#inputs) #output #block + }) +} diff --git a/contract_samples/rust/sdk/Cargo.toml b/contract_samples/rust/sdk/Cargo.toml new file mode 100644 index 0000000..3e547f8 --- /dev/null +++ b/contract_samples/rust/sdk/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "amadeus-sdk" +version = "0.1.0" +edition = "2021" +authors = ["Amadeus Team"] +description = "Rust SDK for writing Amadeus smart contracts" +license = "MIT" +repository = "https://github.com/amadeusprotocol/node" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +dlmalloc = { version = "0.2", features = ["global"] } +amadeus-sdk-macros = { path = "../sdk-macros" } + +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[[example]] +name = "counter" +path = "../examples/counter.rs" + +[[example]] +name = "deposit" +path = "../examples/deposit.rs" + +[[example]] +name = "coin" +path = "../examples/coin.rs" + +[[example]] +name = "nft" +path = "../examples/nft.rs" diff --git a/contract_samples/rust/src/context.rs b/contract_samples/rust/sdk/src/context.rs similarity index 100% rename from contract_samples/rust/src/context.rs rename to contract_samples/rust/sdk/src/context.rs diff --git a/contract_samples/rust/src/encoding.rs b/contract_samples/rust/sdk/src/encoding.rs similarity index 100% rename from contract_samples/rust/src/encoding.rs rename to contract_samples/rust/sdk/src/encoding.rs diff --git a/contract_samples/rust/src/lib.rs b/contract_samples/rust/sdk/src/lib.rs similarity index 98% rename from contract_samples/rust/src/lib.rs rename to contract_samples/rust/sdk/src/lib.rs index c6b6f69..16af869 100644 --- a/contract_samples/rust/src/lib.rs +++ b/contract_samples/rust/sdk/src/lib.rs @@ -8,6 +8,7 @@ pub mod encoding; pub use context::*; pub use storage::*; pub use encoding::*; +pub use amadeus_sdk_macros::contract; use core::panic::PanicInfo; diff --git a/contract_samples/rust/src/storage.rs b/contract_samples/rust/sdk/src/storage.rs similarity index 100% rename from contract_samples/rust/src/storage.rs rename to contract_samples/rust/sdk/src/storage.rs diff --git a/ex/lib/api/api_tx.ex b/ex/lib/api/api_tx.ex index f659c89..5d2c459 100644 --- a/ex/lib/api/api_tx.ex +++ b/ex/lib/api/api_tx.ex @@ -173,8 +173,10 @@ defmodule API.TX do tx = put_in(tx, [:tx, :signer], Base58.encode(tx.tx.signer)) action = TX.action(tx) - action = if !BlsEx.validate_public_key(action.contract) do action else + action = if is_binary(action.contract) and byte_size(action.contract) == 48 do Map.put(action, :contract, Base58.encode(action.contract)) + else + action end args = Enum.map(action.args, fn(arg)-> cond do @@ -195,8 +197,6 @@ defmodule API.TX do logs = Enum.map(logs, fn(line)-> RocksDB.ascii_dump(line) end) receipt = %{success: success, result: result, logs: logs, exec_used: exec_used} - #TODO: remove result later - tx = Map.put(tx, :result, %{error: result}) tx = Map.put(tx, :receipt, receipt) if !Map.has_key?(tx, :metadata) do tx else