Skip to content
Merged
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
7 changes: 6 additions & 1 deletion cmd/crates/soroban-spec-tools/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,12 @@ impl Spec {
let spec = self
.spec
.iter()
.map(|e| Ok(format!("\"{}\"", e.to_xdr_base64(Limits::none())?)))
.map(|e| {
Ok(format!(
"\"{}\"",
e.to_xdr_base64(Limits::depth(SPEC_XDR_DEPTH_LIMIT))?
))
})
.collect::<Result<Vec<_>, Error>>()?
.join(",\n");
Ok(format!("[{spec}]"))
Expand Down
12 changes: 11 additions & 1 deletion cmd/crates/soroban-spec-typescript/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ use types::{Entry, ErrorEnumCase};

use soroban_spec::read::{from_wasm, FromWasmError};

/// Depth limit when encoding and decoding XDR.
///
/// 500 matches `soroban-env-host`'s `DEFAULT_XDR_RW_LIMITS`.
const XDR_DEPTH_LIMIT: u32 = 500;

pub mod boilerplate;
mod types;

Expand Down Expand Up @@ -86,7 +91,12 @@ fn generate_class(
.join(",\n ");
let spec = spec
.iter()
.map(|s| format!("\"{}\"", s.to_xdr_base64(Limits::none()).unwrap()))
.map(|s| {
format!(
"\"{}\"",
s.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT)).unwrap()
)
Comment thread
mootz12 marked this conversation as resolved.
})
.join(",\n ");
format!(
r#"export interface Client {{{method_types}
Expand Down
8 changes: 7 additions & 1 deletion cmd/crates/stellar-ledger/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ mod signer;

pub mod emulator_test_support;

/// Depth limit when encoding and decoding XDR.
///
/// 500 matches `soroban-env-host`'s `DEFAULT_XDR_RW_LIMITS`.
const XDR_DEPTH_LIMIT: u32 = 500;

// this is from https://github.com/LedgerHQ/ledger-live/blob/36cfbf3fa3300fd99bcee2ab72e1fd8f280e6280/libs/ledgerjs/packages/hw-app-str/src/Str.ts#L181
const APDU_MAX_SIZE: u8 = 150;
const HD_PATH_ELEMENTS_COUNT: u8 = 3;
Expand Down Expand Up @@ -161,7 +166,8 @@ where
network_id,
tagged_transaction,
};
let mut signature_payload_as_bytes = signature_payload.to_xdr(Limits::none())?;
let mut signature_payload_as_bytes =
signature_payload.to_xdr(Limits::depth(XDR_DEPTH_LIMIT))?;

let mut hd_path_to_bytes = hd_path.into().to_vec()?;

Expand Down
33 changes: 25 additions & 8 deletions cmd/soroban-cli/src/assembled.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ use soroban_rpc::{
AuthMode, Error, LogEvents, LogResources, ResourceConfig, SimulateTransactionResponse,
};

use crate::utils::XDR_DEPTH_LIMIT;

pub async fn simulate_and_assemble_transaction(
client: &soroban_rpc::Client,
tx: &Transaction,
Expand All @@ -24,7 +26,7 @@ pub async fn simulate_and_assemble_transaction(

tracing::trace!(
"Simulation transaction envelope: {}",
envelope.to_xdr_base64(Limits::none())?
envelope.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?
);

// Whether an explicit record mode was requested. In record mode the RPC re-records auth
Expand Down Expand Up @@ -94,7 +96,7 @@ impl Assembled {
network_id: Hash(Sha256::digest(network_passphrase).into()),
tagged_transaction: TransactionSignaturePayloadTaggedTransaction::Tx(self.txn.clone()),
};
Ok(Sha256::digest(signature_payload.to_xdr(Limits::none())?).into())
Ok(Sha256::digest(signature_payload.to_xdr(Limits::depth(XDR_DEPTH_LIMIT))?).into())
}

/// Returns a reference to the original transaction.
Expand Down Expand Up @@ -263,7 +265,12 @@ fn assemble(
VecM::try_from(
r.auth
.iter()
.map(|v| SorobanAuthorizationEntry::from_xdr_base64(v, Limits::none()))
.map(|v| {
SorobanAuthorizationEntry::from_xdr_base64(
v,
Limits::depth(XDR_DEPTH_LIMIT),
)
})
.collect::<Result<Vec<_>, _>>()?,
)
})
Expand Down Expand Up @@ -372,10 +379,16 @@ mod tests {
min_resource_fee: 115,
latest_ledger: 3,
results: vec![SimulateHostFunctionResultRaw {
auth: vec![fn_auth.to_xdr_base64(Limits::none()).unwrap()],
xdr: ScVal::U32(0).to_xdr_base64(Limits::none()).unwrap(),
auth: vec![fn_auth
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))
.unwrap()],
xdr: ScVal::U32(0)
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))
.unwrap(),
}],
transaction_data: transaction_data().to_xdr_base64(Limits::none()).unwrap(),
transaction_data: transaction_data()
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))
.unwrap(),
..Default::default()
}
}
Expand Down Expand Up @@ -534,7 +547,9 @@ mod tests {
&txn,
SimulateTransactionResponse {
min_resource_fee: 115,
transaction_data: transaction_data().to_xdr_base64(Limits::none()).unwrap(),
transaction_data: transaction_data()
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))
.unwrap(),
latest_ledger: 3,
..Default::default()
},
Expand All @@ -556,7 +571,9 @@ mod tests {
&txn,
SimulateTransactionResponse {
min_resource_fee: 115,
transaction_data: transaction_data().to_xdr_base64(Limits::none()).unwrap(),
transaction_data: transaction_data()
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))
.unwrap(),
latest_ledger: 3,
..Default::default()
},
Expand Down
10 changes: 7 additions & 3 deletions cmd/soroban-cli/src/commands/contract/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use stellar_xdr::{Limited, Limits, ScMetaEntry, ScMetaV0, StringM, WriteXdr};

#[cfg(feature = "additional-libs")]
use crate::commands::contract::optimize;
use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
commands::{global, version},
print::Print,
Expand Down Expand Up @@ -511,7 +512,7 @@ impl Cmd {
}

let mut buffer = Vec::new();
let mut writer = Limited::new(Cursor::new(&mut buffer), Limits::none());
let mut writer = Limited::new(Cursor::new(&mut buffer), Limits::depth(XDR_DEPTH_LIMIT));
for entry in new_meta {
entry.write_xdr(&mut writer)?;
}
Expand Down Expand Up @@ -823,9 +824,12 @@ pub fn filter_and_dedup_spec(
) -> Result<Vec<u8>, Error> {
let mut seen = HashSet::new();
let mut filtered_xdr = Vec::new();
let mut writer = Limited::new(Cursor::new(&mut filtered_xdr), Limits::none());
let mut writer = Limited::new(
Cursor::new(&mut filtered_xdr),
Limits::depth(XDR_DEPTH_LIMIT),
);
for entry in soroban_spec::shaking::filter(entries, markers) {
let entry_xdr = entry.to_xdr(Limits::none())?;
let entry_xdr = entry.to_xdr(Limits::depth(XDR_DEPTH_LIMIT))?;
if seen.insert(entry_xdr) {
entry.write_xdr(&mut writer)?;
}
Expand Down
5 changes: 4 additions & 1 deletion cmd/soroban-cli/src/commands/contract/deploy/asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ use crate::{
};

use crate::config::address::AliasName;
use crate::utils::XDR_DEPTH_LIMIT;

#[derive(thiserror::Error, Debug)]
pub enum Error {
Expand Down Expand Up @@ -108,7 +109,9 @@ impl Cmd {
.await?
.to_envelope();
match res {
TxnEnvelopeResult::TxnEnvelope(tx) => println!("{}", tx.to_xdr_base64(Limits::none())?),
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
}
TxnEnvelopeResult::Res(contract) => {
let network = self.config.get_network()?;

Expand Down
3 changes: 2 additions & 1 deletion cmd/soroban-cli/src/commands/contract/deploy/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::xdr::{
};

use crate::commands::tx::fetch;
use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
commands::{
contract::{self, arg_parsing, build, id::wasm::get_contract_id, upload},
Expand Down Expand Up @@ -256,7 +257,7 @@ impl Cmd {

match res {
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::none())?);
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
}
TxnEnvelopeResult::Res(contract) => {
let network = cmd.config.get_network()?;
Expand Down
5 changes: 4 additions & 1 deletion cmd/soroban-cli/src/commands/contract/extend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use crate::{
use clap::Parser;

use crate::commands::tx::fetch;
use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
commands::{
global,
Expand Down Expand Up @@ -135,7 +136,9 @@ impl Cmd {
.await?
.to_envelope();
match res {
TxnEnvelopeResult::TxnEnvelope(tx) => println!("{}", tx.to_xdr_base64(Limits::none())?),
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
}
TxnEnvelopeResult::Res(ttl_ledger) => {
if self.ttl_ledger_only {
println!("{ttl_ledger}");
Expand Down
3 changes: 2 additions & 1 deletion cmd/soroban-cli/src/commands/contract/id/wasm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use clap::Parser;
use sha2::{Digest, Sha256};

use crate::config;
use crate::utils::XDR_DEPTH_LIMIT;

#[derive(Parser, Debug, Clone)]
#[group(skip)]
Expand Down Expand Up @@ -68,7 +69,7 @@ pub fn get_contract_id(
network_id,
contract_id_preimage,
});
let preimage_xdr = preimage.to_xdr(Limits::none())?;
let preimage_xdr = preimage.to_xdr(Limits::depth(XDR_DEPTH_LIMIT))?;
Ok(stellar_strkey::Contract(
Sha256::digest(preimage_xdr).into(),
))
Expand Down
5 changes: 4 additions & 1 deletion cmd/soroban-cli/src/commands/contract/invoke.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use crate::log::extract_events;
use crate::print::Print;
use crate::tx::sim_sign_and_send_tx;
use crate::utils::deprecate_message;
use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
assembled::simulate_and_assemble_transaction,
commands::{
Expand Down Expand Up @@ -187,7 +188,9 @@ impl Cmd {
}

match res {
TxnEnvelopeResult::TxnEnvelope(tx) => println!("{}", tx.to_xdr_base64(Limits::none())?),
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
}
TxnEnvelopeResult::Res(output) => {
println!("{output}");
}
Expand Down
9 changes: 5 additions & 4 deletions cmd/soroban-cli/src/commands/contract/read.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::xdr::{
};
use clap::{Parser, ValueEnum};

use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
config::{self, locator},
key,
Expand Down Expand Up @@ -167,12 +168,12 @@ impl Cmd {
})?,
],
Output::Xdr => [
key.to_xdr_base64(Limits::none())?,
val.to_xdr_base64(Limits::none())?,
last_modified_ledger.to_xdr_base64(Limits::none())?,
key.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?,
val.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?,
last_modified_ledger.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?,
live_until_ledger_seq
.unwrap_or_default()
.to_xdr_base64(Limits::none())?,
.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?,
],
};
out.write_record(output)
Expand Down
3 changes: 2 additions & 1 deletion cmd/soroban-cli/src/commands/contract/restore.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use clap::Parser;
use stellar_strkey::DecodeError;

use crate::commands::tx::fetch;
use crate::utils::XDR_DEPTH_LIMIT;
use crate::{
commands::{
contract::extend,
Expand Down Expand Up @@ -132,7 +133,7 @@ impl Cmd {
.to_envelope();
let expiration_ledger_seq = match res {
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::none())?);
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
return Ok(());
}
TxnEnvelopeResult::Res(res) => res,
Expand Down
11 changes: 7 additions & 4 deletions cmd/soroban-cli/src/commands/contract/upload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ use crate::{
builder::{self, TxExt},
sim_sign_and_send_tx,
},
utils, wasm,
utils::{self, XDR_DEPTH_LIMIT},
wasm,
};

const CONTRACT_META_SDK_KEY: &str = "rssdkver";
Expand Down Expand Up @@ -159,7 +160,7 @@ impl Cmd {

match res {
TxnEnvelopeResult::TxnEnvelope(tx) => {
println!("{}", tx.to_xdr_base64(Limits::none())?);
println!("{}", tx.to_xdr_base64(Limits::depth(XDR_DEPTH_LIMIT))?);
}
TxnEnvelopeResult::Res(hash) => println!("{}", hex::encode(hash)),
}
Expand Down Expand Up @@ -279,8 +280,10 @@ impl Cmd {
// go ahead if the contract has a V0 extension.
if let Some(entries) = contract_data.entries {
if let Some(entry_result) = entries.first() {
let entry: LedgerEntryData =
LedgerEntryData::from_xdr_base64(&entry_result.xdr, Limits::none())?;
let entry: LedgerEntryData = LedgerEntryData::from_xdr_base64(
&entry_result.xdr,
Limits::depth(XDR_DEPTH_LIMIT),
)?;

match &entry {
LedgerEntryData::ContractCode(code) => {
Expand Down
7 changes: 4 additions & 3 deletions cmd/soroban-cli/src/commands/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::{
config::{self, locator, network},
get_spec::get_remote_contract_spec,
rpc,
utils::XDR_DEPTH_LIMIT,
};

#[derive(Parser, Debug, Clone)]
Expand Down Expand Up @@ -331,15 +332,15 @@ impl Cmd {
let topics: Vec<ScVal> = event
.topic
.iter()
.filter_map(|t| ScVal::from_xdr_base64(t, Limits::none()).ok())
.filter_map(|t| ScVal::from_xdr_base64(t, Limits::depth(XDR_DEPTH_LIMIT)).ok())
.collect();

if topics.len() != event.topic.len() {
return None; // Failed to decode some topics
}

// Decode value from base64 XDR
let data = ScVal::from_xdr_base64(&event.value, Limits::none()).ok()?;
let data = ScVal::from_xdr_base64(&event.value, Limits::depth(XDR_DEPTH_LIMIT)).ok()?;

spec.decode_event(&event.contract_id, &topics, &data)
.inspect_err(|e| tracing::debug!("Failed to decode event {}: {e}", event.id))
Expand Down Expand Up @@ -488,7 +489,7 @@ impl Cmd {
if segment == "*" || segment == "**" {
topic_filter.push(segment.to_owned());
} else {
match xdr::ScVal::from_xdr_base64(segment, Limits::none()) {
match xdr::ScVal::from_xdr_base64(segment, Limits::depth(XDR_DEPTH_LIMIT)) {
Ok(_s) => {
topic_filter.push(segment.to_owned());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use super::args::Args;
use crate::{
commands::contract::Durability,
config::{self, locator},
utils::XDR_DEPTH_LIMIT,
xdr::{
self, ContractDataDurability, ContractId, Hash, LedgerKey, LedgerKeyContractData, Limits,
ReadXdr, ScAddress, ScVal,
Expand Down Expand Up @@ -90,7 +91,7 @@ impl Cmd {
for key in keys {
let key = LedgerKey::ContractData(LedgerKeyContractData {
contract: contract_address_arg.clone(),
key: ScVal::from_xdr_base64(key, Limits::none())?,
key: ScVal::from_xdr_base64(key, Limits::depth(XDR_DEPTH_LIMIT))?,
durability: ContractDataDurability::Persistent,
});

Expand Down
Loading
Loading