Skip to content

Commit

Permalink
Merge pull request #1489 from multiversx/proxy-paths
Browse files Browse the repository at this point in the history
New config in `sc-config.toml`: `proxy-paths`
  • Loading branch information
andrei-marinica authored Mar 20, 2024
2 parents 6921cc5 + 2d720bf commit 2fbe38d
Show file tree
Hide file tree
Showing 18 changed files with 90 additions and 61 deletions.
8 changes: 4 additions & 4 deletions contracts/examples/adder/interact/src/basic_interact.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ mod basic_interact_cli;
mod basic_interact_config;
mod basic_interact_state;

use adder::{temp_proxy, ProxyTrait};
use adder::{adder_proxy, ProxyTrait};
use basic_interact_config::Config;
use basic_interact_state::State;
use clap::Parser;
Expand Down Expand Up @@ -102,7 +102,7 @@ impl AdderInteract {
.interactor
.tx()
.from(&self.wallet_address)
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.init(0u32)
.code(&self.adder_code)
.with_result(WithRawTxResponse(|response| {
Expand Down Expand Up @@ -181,7 +181,7 @@ impl AdderInteract {
.tx()
.from(&self.wallet_address)
.to(self.state.adder().to_address())
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.add(value)
.prepare_async()
.run()
Expand All @@ -195,7 +195,7 @@ impl AdderInteract {
.interactor
.query()
.to(self.state.adder().to_address())
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.sum()
.returns(ReturnsSimilar::<BigUint>::new())
.prepare_async()
Expand Down
1 change: 1 addition & 0 deletions contracts/examples/adder/mxsc-template.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ files_include = [
"tests",
"Cargo.toml",
"README.md",
"sc-config.toml",
"multiversx.json",
"interact/Cargo.toml",
"interact/config.toml",
Expand Down
2 changes: 2 additions & 0 deletions contracts/examples/adder/sc-config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[settings]
proxy-paths = ["src/adder_proxy.rs"]
2 changes: 1 addition & 1 deletion contracts/examples/adder/src/adder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

use multiversx_sc::imports::*;

pub mod temp_proxy;
pub mod adder_proxy;

/// One of the simplest smart contracts possible,
/// it holds a single variable in storage, which anyone can increment.
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions contracts/examples/adder/tests/adder_blackbox_chained_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ fn adder_blackbox_chained() {
)
.chain_deploy(|tx| {
tx.from(AddressExpr("owner"))
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.init(5u32)
.code(MxscExpr("output/adder.mxsc.json"))
.with_result(WithResultNewAddress::new(|new_address| {
Expand All @@ -36,7 +36,7 @@ fn adder_blackbox_chained() {
})
.chain_query(|tx| {
tx.to(ScExpr("adder"))
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.sum()
.with_result(WithResultSimilar::new(|value: BigUint| {
assert_eq!(value, BigUint::from(5u32));
Expand All @@ -45,7 +45,7 @@ fn adder_blackbox_chained() {
.chain_call(|tx| {
tx.from(AddressExpr("owner"))
.to(ScExpr("adder"))
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.add(3u32)
.with_result(WithRawTxResponse(|response| {
assert!(response.tx_error.is_success());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fn adder_blackbox_legacy_proxy() {
world
.tx()
.from(OWNER)
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.init(5u32)
.code(CODE_EXPR)
.with_result(WithResultNewAddress::new(|new_address| {
Expand Down
6 changes: 3 additions & 3 deletions contracts/examples/adder/tests/adder_blackbox_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ fn adder_blackbox() {
world
.tx()
.from(OWNER)
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.init(5u32)
.code(CODE_EXPR)
.with_result(WithResultNewAddress::new(|new_address| {
Expand All @@ -44,7 +44,7 @@ fn adder_blackbox() {
let value = world
.query()
.to(SC_ADDER)
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.sum()
.returns(ReturnsSimilar::<BigUint>::new())
.run();
Expand All @@ -54,7 +54,7 @@ fn adder_blackbox() {
.tx()
.from(OWNER)
.to(SC_ADDER)
.typed(temp_proxy::AdderProxy)
.typed(adder_proxy::AdderProxy)
.add(1u32)
.with_result(WithRawTxResponse(|response| {
assert!(response.tx_error.is_success());
Expand Down
1 change: 0 additions & 1 deletion framework/base/src/abi/type_abi_impl_basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,6 @@ impl<T: TypeAbi> TypeAbi for Option<T> {
format!("Option<{}>", T::type_name())
}


fn type_name_rust() -> TypeName {
format!("Option<{}>", T::type_name_rust())
}
Expand Down
21 changes: 2 additions & 19 deletions framework/meta/src/cli_args/cli_args_contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ pub enum ContractCliAction {
name = "proxy",
about = "Generates a proxy, based on the contract ABI."
)]
GenerateProxies(GenerateProxyArgs),
GenerateProxies,
}

impl CliArgsToRaw for ContractCliAction {
Expand Down Expand Up @@ -103,9 +103,8 @@ impl CliArgsToRaw for ContractCliAction {
raw.push("snippets".to_string());
raw.append(&mut args.to_raw());
},
ContractCliAction::GenerateProxies(args) => {
ContractCliAction::GenerateProxies => {
raw.push("proxy".to_string());
raw.append(&mut args.to_raw());
},
}
raw
Expand All @@ -128,19 +127,3 @@ impl CliArgsToRaw for GenerateSnippetsArgs {
raw
}
}
#[derive(Default, Clone, PartialEq, Eq, Debug, Args)]
pub struct GenerateProxyArgs {
/// Override TxProxy project if it already exists.
#[arg(long, verbatim_doc_comment)]
pub overwrite: bool,
}

impl CliArgsToRaw for GenerateProxyArgs {
fn to_raw(&self) -> Vec<String> {
let mut raw = Vec::new();
if self.overwrite {
raw.push("--overwrite".to_string());
}
raw
}
}
4 changes: 1 addition & 3 deletions framework/meta/src/cmd/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ pub fn cli_main<AbiObj: ContractAbiProvider>() {
ContractCliAction::GenerateSnippets(gs_arg) => {
meta_config_opt.generate_rust_snippets(&gs_arg)
},
ContractCliAction::GenerateProxies(arg) => {
meta_config_opt.generate_rust_proxies_struct(&arg)
},
ContractCliAction::GenerateProxies => meta_config_opt.generate_proxy(),
}
}

Expand Down
13 changes: 3 additions & 10 deletions framework/meta/src/cmd/contract/generate_proxy/proxy_crate_gen.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
use std::fs::File;

#[must_use]
pub(crate) fn create_file(proxies_file_name: &str, overwrite: bool) -> File {
let file = format!("../{proxies_file_name}");
pub(crate) fn create_file(proxy_file_name: &str) -> File {
let file = format!("../{proxy_file_name}");

if overwrite {
File::create(&file).expect("could not write proxy file")
} else {
match File::options().create_new(true).write(true).open(&file) {
Ok(f) => f,
Err(_) => panic!("{file} file already exists, --overwrite option was not provided"),
}
}
File::create(file).expect("could not write proxy file")
}
21 changes: 13 additions & 8 deletions framework/meta/src/cmd/contract/generate_proxy/proxy_gen_main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ use std::fs::File;

use multiversx_sc::abi::ContractAbi;

use crate::cli_args::GenerateProxyArgs;

use super::{
super::meta_config::MetaConfig,
proxy_crate_gen::create_file,
Expand All @@ -13,19 +11,26 @@ use super::{
},
};

const PROXIES_SOURCE_FILE_NAME: &str = "/output/proxy.rs";
const OUTPUT_PROXY_PATH: &str = "/output/proxy.rs";

impl MetaConfig {
pub fn generate_rust_proxies_struct(&self, args: &GenerateProxyArgs) {
let file = create_file(PROXIES_SOURCE_FILE_NAME, args.overwrite);
write_proxies_to_file(file, self.original_contract_abi.clone());
pub fn generate_proxy(&self) {
write_proxy_with_explicit_path(OUTPUT_PROXY_PATH, &self.original_contract_abi);
for path in &self.sc_config.proxy_paths {
write_proxy_with_explicit_path(path, &self.original_contract_abi);
}
}
}

fn write_proxies_to_file(mut file: File, abi: ContractAbi) {
fn write_proxy_with_explicit_path(path: &str, abi: &ContractAbi) {
let file = create_file(path);
write_proxy_to_file(file, abi);
}

fn write_proxy_to_file(mut file: File, abi: &ContractAbi) {
write_header(&mut file);
write_struct_template(&mut file, &abi.name);
write_impl_for_tx_proxy(&mut file, &abi.name);
write_struct_tx_proxy_methods(&mut file, &abi.name);
write_content(&mut file, abi);
write_content(&mut file, abi.clone());
}
15 changes: 14 additions & 1 deletion framework/meta/src/cmd/contract/sc_config/contract_variant.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::path::PathBuf;

use super::ContractVariantSettings;
use super::{contract_variant_builder::default_wasm_crate_name, ContractVariantSettings};
use crate::cli_args::BuildArgs;
use multiversx_sc::abi::ContractAbi;

Expand Down Expand Up @@ -35,6 +35,19 @@ pub struct ContractVariant {
}

impl ContractVariant {
pub fn default_from_abi(abi: &ContractAbi) -> Self {
let default_contract_config_name = abi.build_info.contract_crate.name.to_string();
let wasm_crate_name = default_wasm_crate_name(&default_contract_config_name);
ContractVariant {
main: true,
settings: ContractVariantSettings::default(),
contract_id: default_contract_config_name.clone(),
contract_name: default_contract_config_name,
wasm_crate_name,
abi: abi.clone(),
}
}

pub fn public_name_snake_case(&self) -> String {
self.contract_name.replace('-', "_")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ fn build_contract_abi(builder: ContractVariantBuilder, original_abi: &ContractAb
}
}

fn default_wasm_crate_name(contract_name: &str) -> String {
pub(crate) fn default_wasm_crate_name(contract_name: &str) -> String {
format!("{contract_name}-wasm")
}

Expand Down Expand Up @@ -236,7 +236,7 @@ fn set_main_contract_flag(
)
} else {
let first_contract = contracts.get_mut(0).unwrap_or_else(|| {
panic!("Cannot set default contract because no optput contract was specified.")
panic!("Cannot set default contract because no output contract was specified.")
});
first_contract.main = true;
}
Expand All @@ -263,22 +263,42 @@ impl ScConfig {
.iter()
.map(ContractVariantBuilder::map_from_config)
.collect();
collect_unlabelled_endpoints(&mut contract_builders, original_abi);
collect_labelled_endpoints(&mut contract_builders, original_abi);
collect_add_endpoints(&mut contract_builders, original_abi);
process_labels_for_contracts(&mut contract_builders, &config.labels_for_contracts);
collect_and_process_endpoints(
&mut contract_builders,
original_abi,
&config.labels_for_contracts,
);

let mut contracts: Vec<ContractVariant> = contract_builders
.into_values()
.map(|builder| build_contract(builder, original_abi))
.collect();
if contracts.is_empty() {
contracts.push(ContractVariant::default_from_abi(original_abi));
}
set_main_contract_flag(&mut contracts, &config.settings.main);
validate_contract_variants(&contracts);
let default_contract_config_name = config.settings.main.clone().unwrap_or_default();
ScConfig {
default_contract_config_name: config.settings.main.clone().unwrap_or_default(),
default_contract_config_name,
contracts,
proxy_paths: config.settings.proxy_paths.clone(),
}
}
}

fn collect_and_process_endpoints(
contract_builders: &mut HashMap<String, ContractVariantBuilder>,
original_abi: &ContractAbi,
labels_for_contracts: &HashMap<String, Vec<String>>,
) {
collect_unlabelled_endpoints(contract_builders, original_abi);
collect_labelled_endpoints(contract_builders, original_abi);
collect_add_endpoints(contract_builders, original_abi);
process_labels_for_contracts(contract_builders, labels_for_contracts);
}

impl ScConfig {
/// Provides the config for the cases where no `multicontract.toml` file is available.
///
/// The default configuration contains a single main contract, with all endpoints.
Expand All @@ -295,6 +315,7 @@ impl ScConfig {
wasm_crate_name,
abi: original_abi.clone(),
}],
proxy_paths: Vec::new(),
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pub const SC_CONFIG_FILE_NAMES: &[&str] = &["sc-config.toml", "multicontract.tom
pub struct ScConfig {
pub default_contract_config_name: String,
pub contracts: Vec<ContractVariant>,
pub proxy_paths: Vec<String>,
}

impl ScConfig {
Expand Down
4 changes: 4 additions & 0 deletions framework/meta/src/cmd/contract/sc_config/sc_config_serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ pub struct ContractVariantSerde {
#[serde(deny_unknown_fields)]
pub struct MultiContractGeneralSettingsSerde {
pub main: Option<String>,

#[serde(default)]
#[serde(rename = "proxy-paths")]
pub proxy_paths: Vec<String>,
}

#[derive(Deserialize, Default, Debug, Clone, PartialEq, Eq)]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,24 @@ impl TemplateAdjuster {
let old_name = self.metadata.name.to_case(Case::Snake);
let new_package = format!("{new_name}::");
let old_package = format!("{old_name}::");
let new_proxy_mod = format!("{new_name}_proxy");
let old_proxy_mod = format!("{old_name}_proxy");

replace_in_files(
&self.target.contract_dir(),
"*rs",
&[
Query::substring(old_trait, &new_trait),
Query::substring(&old_package, &new_package),
Query::substring(&old_proxy_mod, &new_proxy_mod),
][..],
);

replace_in_files(
&self.target.contract_dir(),
"*sc-config.toml",
&[Query::substring(&old_proxy_mod, &new_proxy_mod)][..],
);
}

fn rename_in_cargo_toml_root(&self) {
Expand Down

0 comments on commit 2fbe38d

Please sign in to comment.