Skip to content

Commit

Permalink
Generate contract deployer code (#264)
Browse files Browse the repository at this point in the history
* add deployer abstractions
* contract/host ref refactor
* add attr/expr/ident/member utils
* remove handwritten deployer from ecr20 example
* update counter pack example
  • Loading branch information
kpob authored Nov 23, 2023
1 parent b6abae1 commit d7fb65b
Show file tree
Hide file tree
Showing 19 changed files with 775 additions and 318 deletions.
99 changes: 11 additions & 88 deletions examples2/src/counter_pack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub struct CounterPack {
counters_map: Mapping<u8, Counter>
}

#[odra_macros::module]
impl CounterPack {
pub fn get_count(&self, index_a: u8, index_b: u8) -> u32 {
match index_a {
Expand Down Expand Up @@ -104,16 +105,16 @@ mod odra_core_module {
#[cfg(target_arch = "wasm32")]
mod __counter_pack_wasm_parts {
use odra::casper_event_standard::Schemas;
use odra::odra_casper_backend2;
use odra::odra_casper_backend2::casper_contract::unwrap_or_revert::UnwrapOrRevert;
use odra::odra_casper_backend2::WasmContractEnv;
use odra::odra_casper_wasm_env;
use odra::odra_casper_wasm_env::casper_contract::contract_api::runtime;
use odra::odra_casper_wasm_env::casper_contract::unwrap_or_revert::UnwrapOrRevert;
use odra::odra_casper_wasm_env::WasmContractEnv;
use odra::types::casper_types::{
CLType, CLTyped, CLValue, EntryPoint, EntryPointAccess, EntryPointType, EntryPoints, Group,
Parameter, RuntimeArgs
};
use odra::types::{runtime_args, Address, U256};
use odra::{prelude::*, ContractEnv};
use odra_casper_backend2::casper_contract::contract_api::runtime;

use super::CounterPack;

Expand Down Expand Up @@ -145,7 +146,11 @@ mod __counter_pack_wasm_parts {
}

pub fn execute_call() {
odra_casper_backend2::wasm_host::install_contract(entry_points(), Schemas::new(), None);
odra::odra_casper_wasm_env::host_functions::install_contract(
entry_points(),
Schemas::new(),
None
);
}

pub fn execute_get_count() {
Expand Down Expand Up @@ -181,96 +186,14 @@ mod __counter_pack_wasm_parts {
}
}

#[cfg(not(target_arch = "wasm32"))]
mod __counter_pack_test_parts {
use odra::types::{runtime_args, Bytes, RuntimeArgs, ToBytes, U256, U512};
use odra::{prelude::*, EntryPointsCaller};
use odra::{types::Address, CallDef, HostEnv};

use crate::counter_pack::CounterPack;

pub struct CounterPackHostRef {
address: Address,
env: HostEnv
}

impl CounterPackHostRef {
pub fn get_count(&self, index_a: u8, index_b: u8) -> u32 {
self.env
.call_contract(
self.address,
CallDef::new(
String::from("get_count"),
runtime_args! {
"index_a" => index_a,
"index_b" => index_b
}
)
)
.unwrap()
}

pub fn increment(&self, index_a: u8, index_b: u8) {
self.env
.call_contract(
self.address,
CallDef::new(
String::from("increment"),
runtime_args! {
"index_a" => index_a,
"index_b" => index_b
}
)
)
.unwrap()
}
}

pub struct CounterPackDeployer;

impl CounterPackDeployer {
pub fn init(env: &HostEnv) -> CounterPackHostRef {
let epc = EntryPointsCaller::new(env.clone(), |contract_env, call_def| {
use odra::types::ToBytes;
let mut counter_pack = CounterPack::new(Rc::new(contract_env));
match call_def.method() {
"get_count" => {
let index_a: u8 = call_def.get("index_a").unwrap();
let index_b: u8 = call_def.get("index_b").unwrap();
let result = counter_pack.get_count(index_a, index_b);
Bytes::from(result.to_bytes().unwrap())
}
"increment" => {
let index_a: u8 = call_def.get("index_a").unwrap();
let index_b: u8 = call_def.get("index_b").unwrap();
counter_pack.increment(index_a, index_b);
Bytes::from(vec![])
}
_ => panic!("Unknown method")
}
});

let address = env.new_contract("counter_pack", None, Some(epc));

CounterPackHostRef {
address,
env: env.clone()
}
}
}
}

#[cfg(not(target_arch = "wasm32"))]
pub use __counter_pack_test_parts::*;

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

#[test]
fn counter_pack_works() {
let env = odra::test_env();
let counter_pack = CounterPackDeployer::init(&env);
let mut counter_pack = CounterPackDeployer::init(&env);

let n: u8 = 3;
let m: u8 = 3;
Expand Down
88 changes: 0 additions & 88 deletions examples2/src/erc20.rs
Original file line number Diff line number Diff line change
Expand Up @@ -425,94 +425,6 @@ mod __erc20_wasm_parts {
}
}

#[cfg(not(target_arch = "wasm32"))]
mod __erc20_test_parts2 {
use super::*;

pub struct Erc20Deployer;

impl Erc20Deployer {
pub fn init(env: &odra::HostEnv, total_supply: Option<U256>) -> Erc20HostRef {
let epc = odra::EntryPointsCaller::new(env.clone(), |contract_env, call_def| {
use odra::types::ToBytes;
let mut erc20 = Erc20::new(Rc::new(contract_env));
match call_def.method() {
"init" => {
let total_supply: Option<U256> = call_def.get("total_supply").unwrap();
erc20.init(total_supply);
odra::types::Bytes::from(vec![])
}
"total_supply" => {
let result = erc20.total_supply();
odra::types::Bytes::from(result.to_bytes().unwrap())
}
"balance_of" => {
let owner: Address = call_def.get("owner").unwrap();
let result = erc20.balance_of(owner);
odra::types::Bytes::from(result.to_bytes().unwrap())
}
"transfer" => {
let to: Address = call_def.get("to").unwrap();
let value: U256 = call_def.get("value").unwrap();
erc20.transfer(to, value);
odra::types::Bytes::from(vec![])
}
"cross_total" => {
let other: Address = call_def.get("other").unwrap();
let result = erc20.cross_total(other);
odra::types::Bytes::from(result.to_bytes().unwrap())
}
"pay_to_mint" => {
erc20.pay_to_mint();
odra::types::Bytes::from(vec![])
}
"get_current_block_time" => {
let result = erc20.get_current_block_time();
odra::types::Bytes::from(result.to_bytes().unwrap())
}
"burn_and_get_paid" => {
let amount: U256 = call_def.get("amount").unwrap();
erc20.burn_and_get_paid(amount);
odra::types::Bytes::from(vec![])
}
"approve" => {
let to: Address = call_def.get("to").unwrap();
let amount: U256 = call_def.get("amount").unwrap();
erc20.approve(to, amount);
odra::types::Bytes::from(vec![])
}
"cross_transfer" => {
let other: Address = call_def.get("other").unwrap();
let to: Address = call_def.get("to").unwrap();
let value: U256 = call_def.get("value").unwrap();
erc20.cross_transfer(other, to, value);
odra::types::Bytes::from(vec![])
}
_ => panic!("Unknown method")
}
});

let address = env.new_contract(
"erc20",
Some(runtime_args! {
"total_supply" => total_supply
}),
Some(epc)
);

Erc20HostRef {
address,
env: env.clone(),
attached_value: U512::zero()
}
}
}
}

#[cfg(not(target_arch = "wasm32"))]
pub use __erc20_test_parts::*;
#[cfg(not(target_arch = "wasm32"))]
pub use __erc20_test_parts2::*;
use odra::types::{runtime_args, ExecutionError, OdraError, RuntimeArgs};

#[cfg(not(target_arch = "wasm32"))]
Expand Down
10 changes: 5 additions & 5 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -77,19 +77,19 @@ build-erc20:
wasm-strip examples2/target/wasm32-unknown-unknown/release/contract.wasm
rm -rf examples2/wasm/erc20.wasm
mkdir -p examples2/wasm
mv examples2/target/wasm32-unknown-unknown/release/contract.wasm examples2/wasm/erc20.wasm
mv examples2/target/wasm32-unknown-unknown/release/contract.wasm examples2/wasm/Erc20.wasm

test-erc20: build-erc20
cd examples2 && cargo test --lib erc20 -- --nocapture
cd examples2 && ODRA_BACKEND=casper cargo test --lib erc20 -- --nocapture

build-counter-pack:
cd examples2 && ODRA_MODULE=CounterPack cargo build --release --target wasm32-unknown-unknown --bin counter_pack
wasm-strip examples2/target/wasm32-unknown-unknown/release/counter_pack.wasm
cp examples2/target/wasm32-unknown-unknown/release/counter_pack.wasm examples2/wasm/counter_pack.wasm
cd examples2 && ODRA_MODULE=CounterPack cargo build --release --target wasm32-unknown-unknown --bin contract
wasm-strip examples2/target/wasm32-unknown-unknown/release/contract.wasm
cp examples2/target/wasm32-unknown-unknown/release/contract.wasm examples2/wasm/CounterPack.wasm

test-counter-pack: build-counter-pack
cd examples2 && ODRA_BACKEND=casper cargo test --lib counter_pack_works -- --nocapture
cd examples2 && ODRA_BACKEND=casper cargo test --lib counter_pack -- --nocapture

build-erc20-schema:
cd examples2 && ODRA_MODULE=Erc20 cargo run --bin build_schema
Loading

0 comments on commit d7fb65b

Please sign in to comment.