Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions contract_samples/rust/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/target/
*.wasm
*.sk
45 changes: 45 additions & 0 deletions contract_samples/rust/Cargo.lock

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

41 changes: 3 additions & 38 deletions contract_samples/rust/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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"]
27 changes: 18 additions & 9 deletions contract_samples/rust/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,15 @@ 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.

## Unit Testing

```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
cargo +nightly test --example showcase --features testing --no-default-features -- --nocapture --test-threads=1
cargo expand -p amadeus-sdk --example showcase --target wasm32-unknown-unknown
```

### Testing
### Testnet Deployment

Make sure you have `amadeus-cli` installed.
Follow the code snippet below to run each example on the testnet.
Expand All @@ -49,8 +48,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"
Expand All @@ -66,7 +64,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
Expand All @@ -81,4 +79,15 @@ ama tx --sk wallet.sk $NFT_PK init '[]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $NFT_PK claim '[]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $NFT_PK view_nft '["AGENTIC", "1"]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $NFT_PK claim '[]' --url https://testnet-rpc.ama.one

ama gen-sk showcase.sk
export SHOWCASE_PK=$(ama get-pk --sk showcase.sk)
ama tx --sk wallet.sk Coin transfer '[{"b58": "'$SHOWCASE_PK'"}, "2000000000", "AMA"]' --url https://testnet-rpc.ama.one
ama deploy-tx --sk showcase.sk showcase.wasm --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK increment_total_matches '[]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK set_tournament_info '["World Cup", "1000000"]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK record_win '["alice"]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK record_win '["alice"]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK get_player_wins '["alice"]' --url https://testnet-rpc.ama.one
ama tx --sk wallet.sk $SHOWCASE_PK get_tournament_name '[]' --url https://testnet-rpc.ama.one
```
34 changes: 19 additions & 15 deletions contract_samples/rust/build_and_validate.sh
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
#!/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
cargo build -p amadeus-sdk --example showcase --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
wasm-opt -Oz --enable-bulk-memory target/wasm32-unknown-unknown/release/examples/showcase.wasm -o showcase.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
curl -X POST -H "Content-Type: application/octet-stream" --data-binary @showcase.wasm https://mainnet-rpc.ama.one/api/contract/validate
34 changes: 12 additions & 22 deletions contract_samples/rust/examples/coin.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#![no_std]
#![no_main]

extern crate alloc;
use alloc::vec::Vec;
use alloc::string::String;
use amadeus_sdk::*;
use alloc::{vec::Vec};

fn vault_key(symbol: &Vec<u8>) -> Vec<u8> {
b!("vault:", account_caller(), ":", symbol)
Expand All @@ -11,43 +13,31 @@ fn vault_key(symbol: &Vec<u8>) -> Vec<u8> {
#[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<u8>, amount: Vec<u8>) -> 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
}
25 changes: 12 additions & 13 deletions contract_samples/rust/examples/counter.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
#![no_std]
#![no_main]

extern crate alloc;
use alloc::vec::Vec;
use alloc::string::String;
use amadeus_sdk::*;

#[no_mangle]
pub extern "C" fn init() {
log("Init called during deployment of contract");
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<u8>) -> 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<u8>) -> Vec<u8> {
let incr_by = 3i64;
log("increment_another_counter");
ret(call!(contract.as_slice(), "increment", [incr_by]));
call!(contract.as_slice(), "increment", [incr_by])
}
48 changes: 18 additions & 30 deletions contract_samples/rust/examples/deposit.rs
Original file line number Diff line number Diff line change
@@ -1,57 +1,45 @@
#![no_std]
#![no_main]

extern crate alloc;
use alloc::vec::Vec;
use alloc::string::String;
use amadeus_sdk::*;
use alloc::{vec::Vec};

fn vault_key(symbol: &Vec<u8>) -> Vec<u8> {
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<u8>) -> 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<u8>, amount: Vec<u8>) -> 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<u8>) -> Vec<u8> {
log("burn");
ret(call!("Coin", "transfer", [BURN_ADDRESS, amount, symbol]));
call!("Coin", "transfer", [BURN_ADDRESS, amount, symbol])
}
Loading