From cf613cb3f11ef89e036dd15a4f02588b92b28216 Mon Sep 17 00:00:00 2001 From: byteZorvin Date: Fri, 13 Sep 2024 19:32:47 +0530 Subject: [PATCH] span to byteArray deserialization --- .tool-versions | 2 +- Scarb.toml | 1 + src/bridge/tests/messaging_test.cairo | 34 +++++++++++++++---- src/bridge/token_bridge.cairo | 31 ++++++++++++++--- .../tests/withdrawal_limit_test.cairo | 2 +- tests/deposit_test.cairo | 31 ++++------------- tests/enroll_token_test.cairo | 20 +++-------- tests/token_bridge_test.cairo | 22 +++--------- tests/withdraw_test.cairo | 2 +- tests/withdrawal_limit_bridge_test.cairo | 22 ++---------- 10 files changed, 77 insertions(+), 90 deletions(-) diff --git a/.tool-versions b/.tool-versions index 4e4d000..fe7907c 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -scarb 2.8.0 +scarb 2.8.2 starknet-foundry 0.27.0 diff --git a/Scarb.toml b/Scarb.toml index 6991385..1c738c7 100644 --- a/Scarb.toml +++ b/Scarb.toml @@ -15,6 +15,7 @@ snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry", tag = "v [[target.starknet-contract]] casm = true +allowed-libfuncs-list.name = "experimental" [scripts] diff --git a/src/bridge/tests/messaging_test.cairo b/src/bridge/tests/messaging_test.cairo index 3f6d6fe..941c57d 100644 --- a/src/bridge/tests/messaging_test.cairo +++ b/src/bridge/tests/messaging_test.cairo @@ -10,7 +10,6 @@ use piltover::messaging::interface::IMessagingDispatcher; use starknet_bridge::bridge::{ tests::constants::{L3_BRIDGE_ADDRESS, OWNER, USDC_MOCK_ADDRESS, DELAY_TIME} }; - use piltover::messaging::types::MessageToAppchainStatus; use starknet_bridge::bridge::tests::utils::setup::{deploy_erc20, mock_state_testing}; use starknet_bridge::bridge::tests::utils::message_payloads; @@ -23,17 +22,38 @@ fn deploy_message_payload_ok() { let usdc_address = deploy_erc20("USDC", "USDC"); let calldata = TokenBridge::deployment_message_payload(usdc_address); + // With byteArray + // [ + // 1395567803262486866641834792347783460559299057717595230314827200011451862040, + // 0, + // 1431520323, + // 4, + // 0, + // 1431520323, + // 4, + // 18 + // ] + // + // With syscall direct serialisation + // [ + // 1395567803262486866641834792347783460559299057717595230314827200011451862040, + // 3, 0, 1431520323, 4, + // 3, 0, 1431520323, 4, + // 18 + // ] + let expected_calldata: Span = array![ - 327360033215303420453874031627788877836422131767619347074434581266068999983, // usdc_address + 1395567803262486866641834792347783460559299057717595230314827200011451862040, // usdc_address 0, - 1431520323, // -- USDC - 4, + 1431520323, + 4, // "USDC" 0, - 1431520323, // USDC - 4, - 18 // Decimals + 1431520323, + 4, // "USDC" + 18 ] .span(); + assert(calldata == expected_calldata, 'Incorrect serialisation'); } diff --git a/src/bridge/token_bridge.cairo b/src/bridge/token_bridge.cairo index fc50391..e1ead94 100644 --- a/src/bridge/token_bridge.cairo +++ b/src/bridge/token_bridge.cairo @@ -15,6 +15,7 @@ pub mod TokenBridge { IERC20MetadataDispatcherTrait }; use starknet::syscalls::call_contract_syscall; + use core::to_byte_array::FormatAsByteArray; use openzeppelin::access::ownable::OwnableComponent; use openzeppelin::upgrades::UpgradeableComponent; @@ -402,15 +403,35 @@ pub mod TokenBridge { let dispatcher = IERC20MetadataDispatcher { contract_address: token }; token.serialize(ref calldata); + // Openzeppelin erc20 used felt252 as return types for `name()` and `symbol()` while + // `ByteArray` + // is used currently. + // So we use underlying syscalls, to support both the interface. + // The returned span is deserialized into to a ByteArray in both cases to make it consistent + // In case of ByteArray the length of returned span will be at least 3, while exactly 1 for + // felt252 let name_selector = selector!("name"); - let name = call_contract_syscall(token, name_selector, array![].span()).unwrap_syscall(); - name.serialize(ref calldata); + let mut name = call_contract_syscall(token, name_selector, array![].span()) + .unwrap_syscall(); + if (name.len() == 1) { + let name_deserialised = name[0].format_as_byte_array(10); + name_deserialised.serialize(ref calldata); + } else { + let name_deserialised = Serde::::deserialize(ref name).unwrap(); + name_deserialised.serialize(ref calldata); + } - // dispatcher.name().serialize(ref calldata); let symbol_selector = selector!("symbol"); - let symbol = call_contract_syscall(token, symbol_selector, array![].span()) + let mut symbol = call_contract_syscall(token, symbol_selector, array![].span()) .unwrap_syscall(); - symbol.serialize(ref calldata); + + if (symbol.len() == 1) { + let symbol_deserialised = symbol[0].format_as_byte_array(10); + symbol_deserialised.serialize(ref calldata); + } else { + let symbol_deserialised = Serde::::deserialize(ref symbol).unwrap(); + symbol_deserialised.serialize(ref calldata); + } dispatcher.decimals().serialize(ref calldata); calldata.span() diff --git a/src/withdrawal_limit/tests/withdrawal_limit_test.cairo b/src/withdrawal_limit/tests/withdrawal_limit_test.cairo index 4c1b220..3b012a6 100644 --- a/src/withdrawal_limit/tests/withdrawal_limit_test.cairo +++ b/src/withdrawal_limit/tests/withdrawal_limit_test.cairo @@ -1,7 +1,7 @@ use core::num::traits::Bounded; use snforge_std as snf; use snforge_std::{ContractClassTrait, EventSpy, EventSpyAssertionsTrait}; -use starknet_bridge::bridge::tests::constants::{OWNER,}; +use starknet_bridge::bridge::tests::constants::{OWNER}; use starknet_bridge::mocks::withdrawal_limit_mock::{ IMockWithdrawalLimitDispatcher, IMockWithdrawalLimitDispatcherTrait }; diff --git a/tests/deposit_test.cairo b/tests/deposit_test.cairo index 5c720bb..b209d46 100644 --- a/tests/deposit_test.cairo +++ b/tests/deposit_test.cairo @@ -1,34 +1,17 @@ -use core::num::traits::zero::Zero; -use core::array::ArrayTrait; -use core::serde::Serde; -use core::result::ResultTrait; -use core::option::OptionTrait; -use core::traits::TryInto; use snforge_std as snf; -use snforge_std::{ - ContractClassTrait, EventSpy, EventSpyTrait, EventsFilterTrait, EventSpyAssertionsTrait -}; +use snforge_std::{EventSpy, EventSpyAssertionsTrait}; use starknet::ContractAddress; -use starknet_bridge::mocks::{ - messaging::{IMockMessagingDispatcherTrait, IMockMessagingDispatcher}, erc20::ERC20 -}; -use piltover::messaging::{IMessaging, IMessagingDispatcher, IMessagingDispatcherTrait}; +use starknet_bridge::mocks::messaging::IMockMessagingDispatcher; use starknet_bridge::bridge::{ - ITokenBridge, ITokenBridgeAdmin, ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, - ITokenBridgeAdminDispatcher, ITokenBridgeAdminDispatcherTrait, IWithdrawalLimitStatusDispatcher, - IWithdrawalLimitStatusDispatcherTrait, TokenBridge, TokenBridge::Event, - types::{TokenStatus, TokenSettings} -}; -use openzeppelin::access::ownable::{ - OwnableComponent, OwnableComponent::Event as OwnableEvent, - interface::{IOwnableTwoStepDispatcher, IOwnableTwoStepDispatcherTrait} + ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, ITokenBridgeAdminDispatcher, + ITokenBridgeAdminDispatcherTrait, TokenBridge, TokenBridge::Event, }; -use openzeppelin::token::erc20::interface::{IERC20, IERC20Dispatcher, IERC20DispatcherTrait}; +use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait}; use starknet::contract_address::{contract_address_const}; -use super::constants::{OWNER, L3_BRIDGE_ADDRESS, DELAY_TIME}; +use super::constants::{OWNER}; use starknet_bridge::bridge::tests::utils::setup::{ - deploy_erc20, deploy_token_bridge_with_messaging, deploy_token_bridge, enroll_token_and_settle + deploy_erc20, deploy_token_bridge_with_messaging, enroll_token_and_settle }; fn setup() -> (ITokenBridgeDispatcher, EventSpy, ContractAddress, IMockMessagingDispatcher) { diff --git a/tests/enroll_token_test.cairo b/tests/enroll_token_test.cairo index 9eae461..80654c8 100644 --- a/tests/enroll_token_test.cairo +++ b/tests/enroll_token_test.cairo @@ -1,21 +1,11 @@ use snforge_std as snf; -use snforge_std::{ContractClassTrait, EventSpy, EventSpyTrait, EventSpyAssertionsTrait}; -use starknet::ContractAddress; -use starknet_bridge::mocks::{ - messaging::{IMockMessagingDispatcherTrait, IMockMessagingDispatcher}, erc20::ERC20, hash -}; +use snforge_std::{ContractClassTrait, EventSpyAssertionsTrait}; +use starknet_bridge::mocks::{hash}; use starknet_bridge::bridge::{ - ITokenBridge, ITokenBridgeAdmin, ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, - ITokenBridgeAdminDispatcher, ITokenBridgeAdminDispatcherTrait, IWithdrawalLimitStatusDispatcher, - IWithdrawalLimitStatusDispatcherTrait, TokenBridge, TokenBridge::Event, - types::{TokenStatus, TokenSettings} -}; -use openzeppelin::access::ownable::{ - OwnableComponent, OwnableComponent::Event as OwnableEvent, - interface::{IOwnableTwoStepDispatcher, IOwnableTwoStepDispatcherTrait} + ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, TokenBridge, TokenBridge::Event, + types::TokenStatus }; -use starknet::contract_address::{contract_address_const}; -use super::constants::{OWNER, L3_BRIDGE_ADDRESS, USDC_MOCK_ADDRESS, DELAY_TIME}; +use super::constants::{OWNER, L3_BRIDGE_ADDRESS}; use starknet_bridge::bridge::tests::utils::setup::{deploy_erc20, deploy_token_bridge}; use starknet_bridge::bridge::tests::utils::message_payloads; use starknet_bridge::constants; diff --git a/tests/token_bridge_test.cairo b/tests/token_bridge_test.cairo index 4afdcab..80ae05a 100644 --- a/tests/token_bridge_test.cairo +++ b/tests/token_bridge_test.cairo @@ -1,27 +1,15 @@ -use core::array::ArrayTrait; -use core::serde::Serde; -use core::result::ResultTrait; -use core::option::OptionTrait; -use core::traits::TryInto; use snforge_std as snf; -use snforge_std::{ContractClassTrait, EventSpy, EventSpyTrait, EventSpyAssertionsTrait}; -use starknet::ContractAddress; -use starknet_bridge::mocks::{ - messaging::{IMockMessagingDispatcherTrait, IMockMessagingDispatcher}, erc20::ERC20 -}; +use snforge_std::EventSpyAssertionsTrait; use starknet_bridge::bridge::{ - ITokenBridge, ITokenBridgeAdmin, ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, - ITokenBridgeAdminDispatcher, ITokenBridgeAdminDispatcherTrait, IWithdrawalLimitStatusDispatcher, - IWithdrawalLimitStatusDispatcherTrait, TokenBridge, TokenBridge::Event, - types::{TokenStatus, TokenSettings} + ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, ITokenBridgeAdminDispatcher, + ITokenBridgeAdminDispatcherTrait, TokenBridge, TokenBridge::Event, }; use openzeppelin::access::ownable::{ - OwnableComponent, OwnableComponent::Event as OwnableEvent, interface::{IOwnableTwoStepDispatcher, IOwnableTwoStepDispatcherTrait} }; use starknet::contract_address::{contract_address_const}; -use starknet_bridge::bridge::tests::utils::setup::{deploy_erc20, deploy_token_bridge}; -use super::constants::{OWNER, L3_BRIDGE_ADDRESS, USDC_MOCK_ADDRESS, DELAY_TIME}; +use starknet_bridge::bridge::tests::utils::setup::{deploy_token_bridge}; +use super::constants::{OWNER, L3_BRIDGE_ADDRESS, USDC_MOCK_ADDRESS}; #[test] diff --git a/tests/withdraw_test.cairo b/tests/withdraw_test.cairo index fc9d2a7..3686cc3 100644 --- a/tests/withdraw_test.cairo +++ b/tests/withdraw_test.cairo @@ -3,7 +3,7 @@ use snforge_std::EventSpy; use starknet_bridge::mocks::{messaging::{IMockMessagingDispatcherTrait, IMockMessagingDispatcher},}; use starknet_bridge::bridge::{ ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, ITokenBridgeAdminDispatcher, - ITokenBridgeAdminDispatcherTrait, IWithdrawalLimitStatusDispatcher, + ITokenBridgeAdminDispatcherTrait, }; use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait}; diff --git a/tests/withdrawal_limit_bridge_test.cairo b/tests/withdrawal_limit_bridge_test.cairo index 9e9b144..e1181f2 100644 --- a/tests/withdrawal_limit_bridge_test.cairo +++ b/tests/withdrawal_limit_bridge_test.cairo @@ -1,27 +1,11 @@ -use core::array::ArrayTrait; -use core::serde::Serde; -use core::result::ResultTrait; -use core::option::OptionTrait; -use core::traits::TryInto; use snforge_std as snf; -use snforge_std::{ContractClassTrait, EventSpy, EventSpyTrait, EventSpyAssertionsTrait}; -use starknet::ContractAddress; -use starknet_bridge::mocks::{ - messaging::{IMockMessagingDispatcherTrait, IMockMessagingDispatcher}, erc20::ERC20 -}; +use snforge_std::EventSpyAssertionsTrait; use starknet_bridge::bridge::{ - ITokenBridge, ITokenBridgeAdmin, ITokenBridgeDispatcher, ITokenBridgeDispatcherTrait, ITokenBridgeAdminDispatcher, ITokenBridgeAdminDispatcherTrait, IWithdrawalLimitStatusDispatcher, IWithdrawalLimitStatusDispatcherTrait, TokenBridge, TokenBridge::Event, - types::{TokenStatus, TokenSettings} -}; -use openzeppelin::access::ownable::{ - OwnableComponent, OwnableComponent::Event as OwnableEvent, - interface::{IOwnableTwoStepDispatcher, IOwnableTwoStepDispatcherTrait} }; -use starknet::contract_address::{contract_address_const}; -use super::constants::{OWNER, L3_BRIDGE_ADDRESS, USDC_MOCK_ADDRESS, DELAY_TIME}; -use starknet_bridge::bridge::tests::utils::setup::{deploy_erc20, deploy_token_bridge}; +use super::constants::{OWNER, USDC_MOCK_ADDRESS}; +use starknet_bridge::bridge::tests::utils::setup::{deploy_token_bridge}; #[test]