Skip to content

Commit

Permalink
Merge pull request #281 from ava-labs/dev
Browse files Browse the repository at this point in the history
Release v0.7.3-rc5
  • Loading branch information
becominginsane authored Oct 27, 2023
2 parents 3a04771 + 58a447d commit ea590d4
Show file tree
Hide file tree
Showing 311 changed files with 1,640 additions and 468 deletions.
5 changes: 4 additions & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,10 @@ jobs:
run: |
export PATH=~/.cargo/bin:$PATH
cd zemu
yarn jest ${{ matrix.test.file }} --maxConcurrency 2
yarn jest ${{ matrix.test.file }} --maxConcurrency 2 \
--reporters='@matteoh2o1999/github-actions-jest-reporter'
env:
FORCE_COLOR: 1

- name: Tar Zemu snapshots
if: always()
Expand Down
13 changes: 13 additions & 0 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,16 @@ ci:
cargo clippy --all-targets --features "full"
just make clean all
just _ztest-ci

app-sizes:
#!/bin/bash
folder="./build/output"

printf "%-20s %-10s\n" "File" "Size (bytes)"
echo "---------------------------------"

for file in "$folder"/*.elf; do
result=$(size -A -d "$file" | awk 'NR==3 {print $2}')

printf "%-20s %-10s\n" "$(basename $file)" "$result"
done
12 changes: 7 additions & 5 deletions app/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ $(error "$(error_message)")
endif

APP_LOAD_PARAMS = $(COMMON_LOAD_PARAMS) --curve secp256k1
ifneq ($(FEATURE_BTC), 1)
APP_LOAD_PARAMS += --path $(APPPATH)
endif

ARTIFACT_OUTPUT_PATH := $(CURDIR)/../build

Expand Down Expand Up @@ -104,7 +107,7 @@ RUST_TARGET:=thumbv6m-none-eabi
ifeq ($(FEATURE_BTC), 1))
APP_LOAD_PARAMS += --appFlags 0xa50
else
APP_LOAD_PARAMS += --appFlags 0x200
APP_LOAD_PARAMS += --appFlags 0x000
endif
APP_FULL:=1
endif
Expand Down Expand Up @@ -139,7 +142,9 @@ endif
############
# Platform

DEFINES += UNUSED\(x\)=\(void\)x
ifneq ($(TARGET_NAME),TARGET_NANOS)
DEFINES += UNUSED\(x\)=\(void\)x
endif
DEFINES += PRINTF\(...\)=

APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)
Expand Down Expand Up @@ -169,9 +174,6 @@ else ifeq ($(TARGET_NAME),TARGET_STAX)
DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300
DEFINES += HAVE_UX_FLOW
DEFINES += NBGL_QRCODE

# Required by SDK
DEFINES += UNUSED\(x\)=\(void\)x
else
# Nano X/S+
DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300
Expand Down
67 changes: 41 additions & 26 deletions app/src/parser/outputs/secp_output_owners.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
********************************************************************************/
use avalanche_app_derive::match_ranges;
use core::{mem::MaybeUninit, ptr::addr_of_mut};
use nom::{
bytes::complete::{tag, take},
Expand All @@ -24,7 +25,10 @@ use zemu_sys::ViewError;
use crate::{
checked_add,
handlers::handle_ui_message,
parser::{u64_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN},
parser::{
u64_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN,
MAX_ADDRESS_ENCODED_LEN,
},
};

#[derive(Clone, Copy, PartialEq, Eq)]
Expand All @@ -51,6 +55,26 @@ impl<'b> SECPOutputOwners<'b> {
pub fn num_addresses(&self) -> usize {
self.addresses.len()
}

pub fn render_address_with_hrp(
&self,
hrp: &str,
idx: usize,
message: &mut [u8],
page: u8,
) -> Result<u8, zemu_sys::ViewError> {
if let Some(address) = self.get_address_at(idx) {
let mut encoded = [0; MAX_ADDRESS_ENCODED_LEN];

let len = address
.encode_into(hrp, &mut encoded[..])
.map_err(|_| ViewError::Unknown)?;

handle_ui_message(&encoded[..len], message, page)
} else {
Err(ViewError::NoData)
}
}
}
impl<'b> FromBytes<'b> for SECPOutputOwners<'b> {
#[inline(never)]
Expand Down Expand Up @@ -106,37 +130,28 @@ impl<'a> DisplayableItem for SECPOutputOwners<'a> {
use lexical_core::Number;

let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2];
let addr_item_n = self.num_items()? - self.addresses.len() as u8;

match item_n {
0 if self.locktime > 0 => {
let title_content = pic_str!(b"Locktime");
title[..title_content.len()].copy_from_slice(title_content);
let buffer =
u64_to_str(self.locktime, &mut buffer).map_err(|_| ViewError::Unknown)?;
let addr_items = self.addresses.len() as u8;

handle_ui_message(buffer, message, page)
}
match_ranges! {
match item_n alias x {
0 if self.locktime > 0 => {
let title_content = pic_str!(b"Locktime");
title[..title_content.len()].copy_from_slice(title_content);

x @ 0.. if x >= addr_item_n => {
let idx = x - addr_item_n;
if let Some(data) = self.addresses.get(idx as usize) {
let mut addr = MaybeUninit::uninit();
Address::from_bytes_into(data, &mut addr).map_err(|_| ViewError::Unknown)?;
let addr = unsafe { addr.assume_init() };
let ret = addr.render_item(0, title, message, page);
// lets change the title to Owner address
// as it is more clear than just Address which is what
// the Address.render_item method does.
let buffer =
u64_to_str(self.locktime, &mut buffer).map_err(|_| ViewError::Unknown)?;

handle_ui_message(buffer, message, page)
},
until addr_items => {
let label = pic_str!(b"Owner address");
title.iter_mut().for_each(|v| *v = 0);
title[..label.len()].copy_from_slice(label);
ret
} else {
Err(ViewError::NoData)
}

self.render_address_with_hrp("", x as usize, message, page)
},
_ => Err(ViewError::NoData)
}
_ => Err(ViewError::NoData),
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ input_file: app/src/parser/testvectors/add_subnet_validator.json
"Validator": "NodeID-NFBbbJ4qCmNaCzeW7sxErhvWqvEQMnYcN",
"Start time": "2020-07-29 22:07:25 UTC",
"End time": "2020-08-28 21:57:26 UTC",
"Total stake(AVAX)": "0.000054321",
"Weight": "54321",
"SubnetID": "g4WNtLL98APX666NZGfjoDDsr6fsS27NsjhuCSTAeX5Dtx1Nb",
"Fee(AVAX)": "2000.001",
]
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ input_file: app/src/parser/testvectors/create_subnet.json
---
[
"CreateSubnet": "transaction",
"Owner address": "1mg47uqd7stkvqrp57ds7m28txra45u2un5p6pc",
"Owner address": "local1mg47uqd7stkvqrp57ds7m28txra45u2uzkta8n",
"Fee(AVAX)": "2000.001",
]
34 changes: 23 additions & 11 deletions app/src/parser/subnet_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use core::{mem::MaybeUninit, ptr::addr_of_mut};
use nom::bytes::complete::take;

use crate::parser::{cb58_output_len, DisplayableItem, FromBytes, ParserError, CB58_CHECKSUM_LEN};
use crate::utils::bs58_encode;
use crate::utils::{bs58_encode, ApduPanic};

pub const SUBNET_ID_LEN: usize = 32;

Expand All @@ -34,6 +34,11 @@ impl<'b> SubnetId<'b> {
pub fn new(id: &'b [u8; SUBNET_ID_LEN]) -> Self {
Self(id)
}

pub fn is_primary_network(&self) -> bool {
let primary_net = bolos::PIC::new(Self::PRIMARY_NETWORK.0).into_inner();
&self.0.get(..).apdu_unwrap() == &primary_net.get(..).apdu_unwrap()
}
}

impl<'b> FromBytes<'b> for SubnetId<'b> {
Expand Down Expand Up @@ -81,20 +86,27 @@ impl<'b> DisplayableItem for SubnetId<'b> {
let label = pic_str!(b"SubnetID");
title[..label.len()].copy_from_slice(label);

let mut data = [0; SUBNET_ID_LEN + CB58_CHECKSUM_LEN];
if self.is_primary_network() {
let primary_network = pic_str!(b"Primary Subnet");

data[..SUBNET_ID_LEN].copy_from_slice(&self.0[..]);
handle_ui_message(primary_network, message, page)
} else {
let mut data = [0; SUBNET_ID_LEN + CB58_CHECKSUM_LEN];

let checksum = Sha256::digest(&data[..SUBNET_ID_LEN]).map_err(|_| ViewError::Unknown)?;
data[..SUBNET_ID_LEN].copy_from_slice(&self.0[..]);

// prepare the data to be encoded by appending last 4-byte
data[SUBNET_ID_LEN..]
.copy_from_slice(&checksum[(Sha256::DIGEST_LEN - CB58_CHECKSUM_LEN)..]);
let checksum =
Sha256::digest(&data[..SUBNET_ID_LEN]).map_err(|_| ViewError::Unknown)?;

const MAX_SIZE: usize = cb58_output_len::<SUBNET_ID_LEN>();
let mut encoded = [0; MAX_SIZE];
// prepare the data to be encoded by appending last 4-byte
data[SUBNET_ID_LEN..]
.copy_from_slice(&checksum[(Sha256::DIGEST_LEN - CB58_CHECKSUM_LEN)..]);

let len = bs58_encode(data, &mut encoded[..]).map_err(|_| ViewError::Unknown)?;
handle_ui_message(&encoded[..len], message, page)
const MAX_SIZE: usize = cb58_output_len::<SUBNET_ID_LEN>();
let mut encoded = [0; MAX_SIZE];

let len = bs58_encode(data, &mut encoded[..]).map_err(|_| ViewError::Unknown)?;
handle_ui_message(&encoded[..len], message, page)
}
}
}
29 changes: 7 additions & 22 deletions app/src/parser/transactions/pvm/add_delegator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use crate::{
handlers::handle_ui_message,
parser::{
nano_avax_to_fp_str, Address, BaseTxFields, DisplayableItem, FromBytes, Header, ObjectList,
OutputIdx, ParserError, PvmOutput, SECPOutputOwners, TransferableOutput, Validator,
OutputIdx, ParserError, PvmOutput, SECPOutputOwners, Stake, TransferableOutput, Validator,
MAX_ADDRESS_ENCODED_LEN, PVM_ADD_DELEGATOR,
},
};
Expand Down Expand Up @@ -68,7 +68,7 @@ impl<'b> FromBytes<'b> for AddDelegatorTx<'b> {

// validator
let validator = unsafe { &mut *addr_of_mut!((*out).validator).cast() };
let rem = Validator::from_bytes_into(rem, validator)?;
let rem = Validator::<Stake>::from_bytes_into(rem, validator)?;

// stake
// check for the number of stake-outputs before parsing then as now
Expand All @@ -84,7 +84,7 @@ impl<'b> FromBytes<'b> for AddDelegatorTx<'b> {
// valid pointers read as memory was initialized
let staked_list = unsafe { &*stake.as_ptr() };

let validator_stake = unsafe { (*validator.as_ptr()).weight };
let validator_stake = unsafe { (*validator.as_ptr()).stake() };

// get locked outputs amount to check for invariant
let stake = Self::sum_stake_outputs_amount(staked_list)?;
Expand Down Expand Up @@ -354,24 +354,9 @@ impl<'b> AddDelegatorTx<'b> {
title[..label.len()].copy_from_slice(label);

// render owner addresses
if let Some(addr) = self.rewards_owner.addresses.get(addr_idx) {
let hrp = self.tx_header.hrp().map_err(|_| ViewError::Unknown)?;

let mut address = MaybeUninit::uninit();
Address::from_bytes_into(addr, &mut address).map_err(|_| ViewError::Unknown)?;

let mut encoded = [0; MAX_ADDRESS_ENCODED_LEN];
// valid read as memory was initialized
let address = unsafe { address.assume_init() };

let len = address
.encode_into(hrp, &mut encoded[..])
.map_err(|_| ViewError::Unknown)?;

return handle_ui_message(&encoded[..len], message, page);
}

Err(ViewError::NoData)
let hrp = self.tx_header.hrp().map_err(|_| ViewError::Unknown)?;
self.rewards_owner
.render_address_with_hrp(hrp, addr_idx, message, page)
}

fn render_last_items(
Expand Down Expand Up @@ -486,6 +471,6 @@ mod tests {
#[test]
fn parse_add_delegator() {
let (_, tx) = AddDelegatorTx::from_bytes(DATA).unwrap();
assert_eq!(tx.validator.weight, 2000000000000);
assert_eq!(tx.validator.stake(), 2000000000000);
}
}
6 changes: 3 additions & 3 deletions app/src/parser/transactions/pvm/add_subnet_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::{
handlers::handle_ui_message,
parser::{
nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError,
PvmOutput, SubnetAuth, SubnetId, Validator, PVM_ADD_SUBNET_VALIDATOR,
PvmOutput, SubnetAuth, SubnetId, Validator, Weight, PVM_ADD_SUBNET_VALIDATOR,
},
};

Expand All @@ -31,7 +31,7 @@ use crate::{
pub struct AddSubnetValidatorTx<'b> {
pub tx_header: Header<'b>,
pub base_tx: BaseTxFields<'b, PvmOutput<'b>>,
pub validator: Validator<'b>,
pub validator: Validator<'b, Weight>,
pub subnet_id: SubnetId<'b>,
pub subnet_auth: SubnetAuth<'b>,
}
Expand All @@ -58,7 +58,7 @@ impl<'b> FromBytes<'b> for AddSubnetValidatorTx<'b> {

// validator
let validator = unsafe { &mut *addr_of_mut!((*out).validator).cast() };
let rem = Validator::from_bytes_into(rem, validator)?;
let rem = Validator::<Weight>::from_bytes_into(rem, validator)?;

// SubnetId
let subnet_id = unsafe { &mut *addr_of_mut!((*out).subnet_id).cast() };
Expand Down
29 changes: 7 additions & 22 deletions app/src/parser/transactions/pvm/add_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use crate::{
parser::{
intstr_to_fpstr_inplace, nano_avax_to_fp_str, u64_to_str, Address, BaseTxFields,
DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, PvmOutput,
SECPOutputOwners, TransferableOutput, Validator, DELEGATION_FEE_DIGITS,
SECPOutputOwners, Stake, TransferableOutput, Validator, DELEGATION_FEE_DIGITS,
MAX_ADDRESS_ENCODED_LEN, PVM_ADD_VALIDATOR,
},
};
Expand Down Expand Up @@ -69,7 +69,7 @@ impl<'b> FromBytes<'b> for AddValidatorTx<'b> {

// validator
let validator = unsafe { &mut *addr_of_mut!((*out).validator).cast() };
let rem = Validator::from_bytes_into(rem, validator)?;
let rem = Validator::<Stake>::from_bytes_into(rem, validator)?;

// stake
// check for the number of stake-outputs before parsing then as now
Expand All @@ -86,7 +86,7 @@ impl<'b> FromBytes<'b> for AddValidatorTx<'b> {
// valid pointers read as memory was initialized
let staked_list = unsafe { &*stake.as_ptr() };

let validator_stake = unsafe { (*validator.as_ptr()).weight };
let validator_stake = unsafe { (*validator.as_ptr()).stake() };

// get locked outputs amount to check for invariant
let stake = Self::sum_stake_outputs_amount(staked_list)?;
Expand Down Expand Up @@ -353,24 +353,9 @@ impl<'b> AddValidatorTx<'b> {
title[..label.len()].copy_from_slice(label);

// render owner addresses
if let Some(addr) = self.rewards_owner.addresses.get(addr_idx) {
let hrp = self.tx_header.hrp().map_err(|_| ViewError::Unknown)?;

let mut address = MaybeUninit::uninit();
Address::from_bytes_into(addr, &mut address).map_err(|_| ViewError::Unknown)?;

let mut encoded = [0; MAX_ADDRESS_ENCODED_LEN];
// valid read as memory was initialized
let address = unsafe { address.assume_init() };

let len = address
.encode_into(hrp, &mut encoded[..])
.map_err(|_| ViewError::Unknown)?;

return handle_ui_message(&encoded[..len], message, page);
}

Err(ViewError::NoData)
let hrp = self.tx_header.hrp().map_err(|_| ViewError::Unknown)?;
self.rewards_owner
.render_address_with_hrp(hrp, addr_idx, message, page)
}

fn render_last_items(
Expand Down Expand Up @@ -504,7 +489,7 @@ mod tests {
fn parse_add_validator_tx() {
let (_, tx) = AddValidatorTx::from_bytes(DATA).unwrap();
assert_eq!(tx.shares, 20_000);
assert_eq!(tx.validator.weight, 1000000000);
assert_eq!(tx.validator.stake(), 1000000000);
}

#[test]
Expand Down
Loading

0 comments on commit ea590d4

Please sign in to comment.