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
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"]
13 changes: 2 additions & 11 deletions contract_samples/rust/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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"
Expand All @@ -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
Expand Down
31 changes: 16 additions & 15 deletions contract_samples/rust/build_and_validate.sh
Original file line number Diff line number Diff line change
@@ -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
32 changes: 10 additions & 22 deletions contract_samples/rust/examples/coin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<u8>) -> Vec<u8> {
b!("vault:", account_caller(), ":", symbol)
Expand All @@ -11,43 +11,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
}
22 changes: 10 additions & 12 deletions contract_samples/rust/examples/counter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,27 @@
#![no_main]
extern crate alloc;
use amadeus_sdk::*;
use alloc::{vec::Vec, string::String};

#[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])
}
46 changes: 16 additions & 30 deletions contract_samples/rust/examples/deposit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<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