Skip to content

Commit

Permalink
forwarder whitebox migration
Browse files Browse the repository at this point in the history
  • Loading branch information
andrei-marinica committed Aug 24, 2024
1 parent e9397b0 commit c841e2a
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 154 deletions.
Original file line number Diff line number Diff line change
@@ -1,117 +1,79 @@
use forwarder_legacy::fwd_nft_legacy::{Color, ForwarderNftModule};
use multiversx_sc::{contract_base::ContractBase, types::Address};
use multiversx_sc_scenario::{
managed_address, managed_biguint, managed_token_id,
scenario_model::{
Account, AddressValue, CheckAccount, CheckStateStep, ScCallStep, SetStateStep,
},
ScenarioWorld, WhiteboxContract,
};

const USER_ADDRESS_EXPR: &str = "address:user";
const FORWARDER_ADDRESS_EXPR: &str = "sc:forwarder_legacy";
const FORWARDER_PATH_EXPR: &str = "mxsc:output/forwarder_legacy.mxsc.json";
use multiversx_sc_scenario::imports::*;

const NFT_TOKEN_ID_EXPR: &str = "str:COOL-123456";
const NFT_TOKEN_ID: &[u8] = b"COOL-123456";
const USER_ADDRESS: TestAddress = TestAddress::new("user");
const FORWARDER_ADDRESS: TestSCAddress = TestSCAddress::new("forwarder_legacy");
const FORWARDER_PATH: MxscPath = MxscPath::new("output/forwarder_legacy.mxsc.json");
const NFT_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("COOL-123456");

fn world() -> ScenarioWorld {
let mut blockchain = ScenarioWorld::new();

blockchain.register_contract(FORWARDER_PATH_EXPR, forwarder_legacy::ContractBuilder);
blockchain.register_contract(FORWARDER_PATH, forwarder_legacy::ContractBuilder);
blockchain
}

#[test]
fn test_nft_update_attributes_and_send() {
let mut world = world();

let forwarder_legacy_code = world.code_expression(FORWARDER_PATH_EXPR);
let roles = vec![
"ESDTRoleNFTCreate".to_string(),
"ESDTRoleNFTUpdateAttributes".to_string(),
];

world.set_state_step(
SetStateStep::new()
.put_account(USER_ADDRESS_EXPR, Account::new().nonce(1))
.put_account(
FORWARDER_ADDRESS_EXPR,
Account::new()
.nonce(1)
.code(forwarder_legacy_code)
.esdt_roles(NFT_TOKEN_ID_EXPR, roles),
),
);

let forwarder_legacy_whitebox =
WhiteboxContract::new(FORWARDER_ADDRESS_EXPR, forwarder_legacy::contract_obj);
world.account(USER_ADDRESS).nonce(1);
world
.account(FORWARDER_ADDRESS)
.nonce(1)
.code(FORWARDER_PATH)
.esdt_roles(NFT_TOKEN_ID, roles);

let original_attributes = Color { r: 0, g: 0, b: 0 };

world.whitebox_call(
&forwarder_legacy_whitebox,
ScCallStep::new().from(USER_ADDRESS_EXPR),
|sc| {
world
.tx()
.from(USER_ADDRESS)
.to(FORWARDER_ADDRESS)
.whitebox(forwarder_legacy::contract_obj, |sc| {
sc.nft_create_compact(
managed_token_id!(NFT_TOKEN_ID),
NFT_TOKEN_ID.to_token_identifier(),
managed_biguint!(1),
original_attributes,
);

sc.send().direct_esdt(
&managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)),
&managed_token_id!(NFT_TOKEN_ID),
1,
&managed_biguint!(1),
);
},
);
sc.tx()
.to(USER_ADDRESS)
.esdt((NFT_TOKEN_ID.to_token_identifier(), 1, 1u32.into()))
.transfer();
});

world.check_state_step(CheckStateStep::new().put_account(
USER_ADDRESS_EXPR,
CheckAccount::new().esdt_nft_balance_and_attributes(
NFT_TOKEN_ID_EXPR,
1,
"1",
Some(original_attributes),
),
));
world
.check_account(USER_ADDRESS)
.esdt_nft_balance_and_attributes(NFT_TOKEN_ID, 1, 1, original_attributes);

let new_attributes = Color {
r: 255,
g: 255,
b: 255,
};

world.whitebox_call(
&forwarder_legacy_whitebox,
ScCallStep::new()
.from(USER_ADDRESS_EXPR)
.esdt_transfer(NFT_TOKEN_ID, 1, "1"),
|sc| {
sc.nft_update_attributes(managed_token_id!(NFT_TOKEN_ID), 1, new_attributes);

sc.send().direct_esdt(
&managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)),
&managed_token_id!(NFT_TOKEN_ID),
1,
&managed_biguint!(1),
);
},
);

world.check_state_step(CheckStateStep::new().put_account(
USER_ADDRESS_EXPR,
CheckAccount::new().esdt_nft_balance_and_attributes(
NFT_TOKEN_ID_EXPR,
1,
"1",
Some(new_attributes),
),
));
}

fn address_expr_to_address(address_expr: &str) -> Address {
AddressValue::from(address_expr).to_address()
world
.tx()
.from(USER_ADDRESS)
.to(FORWARDER_ADDRESS)
.single_esdt(&TokenIdentifier::from(NFT_TOKEN_ID), 1, &1u32.into())
.whitebox(forwarder_legacy::contract_obj, |sc| {
sc.nft_update_attributes(NFT_TOKEN_ID.to_token_identifier(), 1, new_attributes);

sc.tx()
.to(USER_ADDRESS)
.esdt((NFT_TOKEN_ID.to_token_identifier(), 1, 1u32.into()))
.transfer();
});

world
.check_account(USER_ADDRESS)
.esdt_nft_balance_and_attributes(NFT_TOKEN_ID, 1, 1, new_attributes);
}
115 changes: 42 additions & 73 deletions contracts/feature-tests/composability/tests/forwarder_whitebox_test.rs
Original file line number Diff line number Diff line change
@@ -1,109 +1,78 @@
use forwarder::fwd_nft::{Color, ForwarderNftModule};
use multiversx_sc_scenario::imports::*;

const USER_ADDRESS_EXPR: &str = "address:user";
const FORWARDER_ADDRESS_EXPR: &str = "sc:forwarder";
const FORWARDER_PATH_EXPR: &str = "mxsc:output/forwarder.mxsc.json";

const NFT_TOKEN_ID_EXPR: &str = "str:COOL-123456";
const NFT_TOKEN_ID: &[u8] = b"COOL-123456";
const USER_ADDRESS: TestAddress = TestAddress::new("user");
const FORWARDER_ADDRESS: TestSCAddress = TestSCAddress::new("forwarder");
const FORWARDER_PATH: MxscPath = MxscPath::new("output/forwarder.mxsc.json");
const NFT_TOKEN_ID: TestTokenIdentifier = TestTokenIdentifier::new("COOL-123456");

fn world() -> ScenarioWorld {
let mut blockchain = ScenarioWorld::new();

blockchain.register_contract(FORWARDER_PATH_EXPR, forwarder::ContractBuilder);
blockchain.register_contract(FORWARDER_PATH, forwarder::ContractBuilder);
blockchain
}

#[test]
fn test_nft_update_attributes_and_send() {
let mut world = world();

let forwarder_code = world.code_expression(FORWARDER_PATH_EXPR);
let roles = vec![
"ESDTRoleNFTCreate".to_string(),
"ESDTRoleNFTUpdateAttributes".to_string(),
];

world.set_state_step(
SetStateStep::new()
.put_account(USER_ADDRESS_EXPR, Account::new().nonce(1))
.put_account(
FORWARDER_ADDRESS_EXPR,
Account::new()
.nonce(1)
.code(forwarder_code)
.esdt_roles(NFT_TOKEN_ID_EXPR, roles),
),
);

let forwarder_whitebox = WhiteboxContract::new(FORWARDER_ADDRESS_EXPR, forwarder::contract_obj);
world.account(USER_ADDRESS).nonce(1);
world
.account(FORWARDER_ADDRESS)
.nonce(1)
.code(FORWARDER_PATH)
.esdt_roles(NFT_TOKEN_ID, roles);

let original_attributes = Color { r: 0, g: 0, b: 0 };

world.whitebox_call(
&forwarder_whitebox,
ScCallStep::new().from(USER_ADDRESS_EXPR),
|sc| {
world
.tx()
.from(USER_ADDRESS)
.to(FORWARDER_ADDRESS)
.whitebox(forwarder::contract_obj, |sc| {
sc.nft_create_compact(
managed_token_id!(NFT_TOKEN_ID),
NFT_TOKEN_ID.to_token_identifier(),
managed_biguint!(1),
original_attributes,
);

sc.send().direct_esdt(
&managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)),
&managed_token_id!(NFT_TOKEN_ID),
1,
&managed_biguint!(1),
);
},
);
sc.tx()
.to(USER_ADDRESS)
.esdt((NFT_TOKEN_ID.to_token_identifier(), 1, 1u32.into()))
.transfer();
});

world.check_state_step(CheckStateStep::new().put_account(
USER_ADDRESS_EXPR,
CheckAccount::new().esdt_nft_balance_and_attributes(
NFT_TOKEN_ID_EXPR,
1,
"1",
Some(original_attributes),
),
));
world
.check_account(USER_ADDRESS)
.esdt_nft_balance_and_attributes(NFT_TOKEN_ID, 1, 1, original_attributes);

let new_attributes = Color {
r: 255,
g: 255,
b: 255,
};

world.whitebox_call(
&forwarder_whitebox,
ScCallStep::new()
.from(USER_ADDRESS_EXPR)
.esdt_transfer(NFT_TOKEN_ID, 1, "1"),
|sc| {
sc.nft_update_attributes(managed_token_id!(NFT_TOKEN_ID), 1, new_attributes);

sc.send().direct_esdt(
&managed_address!(&address_expr_to_address(USER_ADDRESS_EXPR)),
&managed_token_id!(NFT_TOKEN_ID),
1,
&managed_biguint!(1),
);
},
);

world.check_state_step(CheckStateStep::new().put_account(
USER_ADDRESS_EXPR,
CheckAccount::new().esdt_nft_balance_and_attributes(
NFT_TOKEN_ID_EXPR,
1,
"1",
Some(new_attributes),
),
));
}

fn address_expr_to_address(address_expr: &str) -> Address {
AddressValue::from(address_expr).to_address()
world
.tx()
.from(USER_ADDRESS)
.to(FORWARDER_ADDRESS)
.single_esdt(&TokenIdentifier::from(NFT_TOKEN_ID), 1, &1u32.into())
.whitebox(forwarder::contract_obj, |sc| {
sc.nft_update_attributes(NFT_TOKEN_ID.to_token_identifier(), 1, new_attributes);

sc.tx()
.to(USER_ADDRESS)
.esdt((NFT_TOKEN_ID.to_token_identifier(), 1, 1u32.into()))
.transfer();
});

world
.check_account(USER_ADDRESS)
.esdt_nft_balance_and_attributes(NFT_TOKEN_ID, 1, 1, new_attributes);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ impl<'a> TestTokenIdentifier<'a> {
pub fn eval_to_expr(&self) -> alloc::string::String {
alloc::format!("{STR_PREFIX}{}", self.name)
}

pub fn to_token_identifier<Api: ManagedTypeApi>(&self) -> TokenIdentifier<Api> {
self.name.into()
}
}

impl<'a, Env> AnnotatedValue<Env, TokenIdentifier<Env::Api>> for TestTokenIdentifier<'a>
Expand Down

0 comments on commit c841e2a

Please sign in to comment.