diff --git a/noir-projects/noir-contracts/Nargo.toml b/noir-projects/noir-contracts/Nargo.toml index e27753c3f88e..b3d1c57c7526 100644 --- a/noir-projects/noir-contracts/Nargo.toml +++ b/noir-projects/noir-contracts/Nargo.toml @@ -40,5 +40,6 @@ members = [ "contracts/token_blacklist_contract", "contracts/token_bridge_contract", "contracts/uniswap_contract", + "contracts/reader_contract", "contracts/multi_call_entrypoint_contract", ] diff --git a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr index 98b92a0065e4..7eb12dd0e7c8 100644 --- a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr @@ -41,6 +41,18 @@ contract AvmTest { /************************************************************************ * Storage ************************************************************************/ + unconstrained fn view_storage_single() -> pub Field { + storage.single.read() + } + + unconstrained fn view_storage_list() -> pub [Field; 2] { + storage.list.read().serialize() + } + + unconstrained fn view_storage_map(address: AztecAddress) -> pub u32 { + storage.map.at(address).read() + } + #[aztec(public-vm)] fn set_storage_single(a: Field) { storage.single.write(a); diff --git a/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr index e1b8c0fd39d5..ec1adf321160 100644 --- a/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr @@ -55,8 +55,8 @@ contract GasToken { rebate.to_field() } - #[aztec(public)] - fn balance_of_public(owner: AztecAddress) -> pub Field { + // utility function for testing + unconstrained fn balance_of_public(owner: AztecAddress) -> pub Field { storage.balances.at(owner).read().to_field() } } diff --git a/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr index 3e53fbb28e19..7415ec54d92c 100644 --- a/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr +++ b/noir-projects/noir-contracts/contracts/lending_contract/src/asset.nr @@ -13,16 +13,14 @@ struct Asset { oracle: AztecAddress, } -global SERIALIZED_LEN: Field = 6; +global SERIALIZED_LEN: Field = 4; impl Serialize for Asset { fn serialize(Asset: Asset) -> [Field; SERIALIZED_LEN] { [ - Asset.interest_accumulator.lo as Field, - Asset.interest_accumulator.hi as Field, + Asset.interest_accumulator.to_integer(), Asset.last_updated_ts as Field, - Asset.loan_to_value.lo as Field, - Asset.loan_to_value.hi as Field, + Asset.loan_to_value.to_integer(), Asset.oracle.to_field() ] } @@ -32,10 +30,10 @@ impl Deserialize for Asset { // Right now we are wasting so many writes. If changing last_updated_ts // we will end up rewriting all of them, wasting writes. fn deserialize(fields: [Field; SERIALIZED_LEN]) -> Asset { - let interest_accumulator = U128 {lo: fields[0], hi: fields[1]}; - let last_updated_ts = fields[2] as u64; - let loan_to_value = U128 {lo: fields[3], hi: fields[4]}; - let oracle = AztecAddress::from_field(fields[5]); + let interest_accumulator = U128::from_integer(fields[0]); + let last_updated_ts = fields[1] as u64; + let loan_to_value = U128::from_integer(fields[2]); + let oracle = AztecAddress::from_field(fields[3]); Asset { interest_accumulator, diff --git a/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr index 328ec71ce97e..c2c05f58a093 100644 --- a/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr @@ -1,5 +1,4 @@ mod asset; -mod position; mod interest_math; mod helpers; @@ -15,7 +14,6 @@ contract Lending { use dep::aztec::context::{PublicContext, Context, gas::GasOpts}; use crate::asset::Asset; - use crate::position::Position; use crate::interest_math::compute_multiplier; use crate::helpers::{covered_by_collateral, DebtReturn, debt_updates, debt_value, compute_identifier}; use dep::token::Token; @@ -31,6 +29,12 @@ contract Lending { static_debt: Map>, // abusing keys very heavily } + struct Position { + collateral: Field, + static_debt: Field, + debt: Field, + } + // Constructs the contract. #[aztec(private)] #[aztec(initializer)] @@ -261,13 +265,11 @@ contract Lending { storage.static_debt.at(owner).write(debt_returns.static_debt.to_integer()); } - #[aztec(public)] - fn get_asset(asset_id: Field) -> pub Asset { + unconstrained fn get_asset(asset_id: Field) -> pub Asset { storage.assets.at(asset_id).read() } - #[aztec(public)] - fn get_position(owner: AztecAddress) -> pub Position { + unconstrained fn get_position(owner: AztecAddress) -> pub Position { let collateral = storage.collateral.at(owner).read(); let static_debt = storage.static_debt.at(owner).read(); let asset: Asset = storage.assets.at(0).read(); @@ -278,8 +280,7 @@ contract Lending { Position { collateral, static_debt, debt } } - #[aztec(public)] - fn get_assets() -> pub [AztecAddress; 2] { + unconstrained fn get_assets() -> pub [AztecAddress; 2] { [storage.collateral_asset.read(), storage.stable_coin.read()] } } diff --git a/noir-projects/noir-contracts/contracts/lending_contract/src/position.nr b/noir-projects/noir-contracts/contracts/lending_contract/src/position.nr deleted file mode 100644 index 080f977e9c03..000000000000 --- a/noir-projects/noir-contracts/contracts/lending_contract/src/position.nr +++ /dev/null @@ -1,30 +0,0 @@ -use dep::aztec::prelude::AztecAddress; -use dep::aztec::protocol_types::traits::{Deserialize, Serialize}; - -struct Position { - collateral: Field, - static_debt: Field, - debt: Field, -} - -global POSITION_SERIALIZED_LEN: Field = 3; - -impl Serialize for Position { - fn serialize(position: Position) -> [Field; POSITION_SERIALIZED_LEN] { - [ - position.collateral.to_field(), - position.static_debt.to_field(), - position.debt.to_field(), - ] - } -} - -impl Deserialize for Position { - fn deserialize(fields: [Field; POSITION_SERIALIZED_LEN]) -> Position { - Position { - collateral: fields[0], - static_debt: fields[1], - debt: fields[2], - } - } -} diff --git a/noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr b/noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr index 3e148e12aa36..0f34a0429b1e 100644 --- a/noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr +++ b/noir-projects/noir-contracts/contracts/price_feed_contract/src/asset.nr @@ -8,7 +8,7 @@ global ASSET_SERIALIZED_LEN: Field = 1; impl Serialize for Asset { fn serialize(asset: Asset) -> [Field; ASSET_SERIALIZED_LEN] { - [asset.price.to_field()] + [asset.price.to_integer()] } } diff --git a/noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr b/noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr index c563792bf0cd..c4afaacf7538 100644 --- a/noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/price_feed_contract/src/main.nr @@ -21,4 +21,8 @@ contract PriceFeed { fn get_price(asset_id: Field) -> Asset { storage.assets.at(asset_id).read() } + + unconstrained fn fetch_price(asset_id: Field) -> pub Asset { + storage.assets.at(asset_id).read() + } } diff --git a/noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml b/noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml new file mode 100644 index 000000000000..8ae3ed014002 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/reader_contract/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "reader_contract" +authors = [""] +compiler_version = ">=0.25.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../aztec-nr/aztec" } +compressed_string = { path = "../../../aztec-nr/compressed-string" } diff --git a/noir-projects/noir-contracts/contracts/reader_contract/src/main.nr b/noir-projects/noir-contracts/contracts/reader_contract/src/main.nr new file mode 100644 index 000000000000..0cfbb45b5966 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/reader_contract/src/main.nr @@ -0,0 +1,69 @@ +contract Reader { + use dep::aztec::prelude::{AztecAddress, FunctionSelector, Deserialize}; + + use dep::compressed_string::FieldCompressedString; + + #[aztec(private)] + fn constructor() {} + + #[aztec(public)] + fn check_name_public(who: AztecAddress, what: str<31>) { + let selector = FunctionSelector::from_signature("public_get_name()"); + let name: FieldCompressedString = context.call_public_function_no_args(who, selector).deserialize_into(); + let _what = FieldCompressedString::from_string(what); + assert(name.is_eq(_what)); + } + + #[aztec(private)] + fn check_name_private(who: AztecAddress, what: str<31>) { + let selector = FunctionSelector::from_signature("private_get_name()"); + let name: FieldCompressedString = context.call_private_function_no_args(who, selector).unpack_into(); + let _what = FieldCompressedString::from_string(what); + assert(name.is_eq(_what)); + } + + unconstrained fn get_name(who: AztecAddress) -> pub str<6> { + // We cannot yet call an unconstrained function from another + "Reader" + } + + #[aztec(public)] + fn check_symbol_public(who: AztecAddress, what: str<31>) { + let selector = FunctionSelector::from_signature("public_get_symbol()"); + let symbol: FieldCompressedString = context.call_public_function_no_args(who, selector).deserialize_into(); + let _what = FieldCompressedString::from_string(what); + assert(symbol.is_eq(_what)); + } + + #[aztec(private)] + fn check_symbol_private(who: AztecAddress, what: str<31>) { + let selector = FunctionSelector::from_signature("private_get_symbol()"); + let symbol: FieldCompressedString = context.call_private_function_no_args(who, selector).unpack_into(); + let _what = FieldCompressedString::from_string(what); + assert(symbol.is_eq(_what)); + } + + unconstrained fn get_symbol(who: AztecAddress) -> pub str<3> { + // We cannot yet call an unconstrained function from another + "RDR" + } + + #[aztec(public)] + fn check_decimals_public(who: AztecAddress, what: u8) { + let selector = FunctionSelector::from_signature("public_get_decimals()"); + let ret: u8 = context.call_public_function_no_args(who, selector).deserialize_into(); + assert(ret == what); + } + + #[aztec(private)] + fn check_decimals_private(who: AztecAddress, what: u8) { + let selector = FunctionSelector::from_signature("private_get_decimals()"); + let result: u8 = context.call_private_function_no_args(who, selector).unpack_into(); + assert(result == what); + } + + unconstrained fn get_decimals(who: AztecAddress) -> pub u8 { + // We cannot yet call an unconstrained function from another + 18 + } +} diff --git a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr index a96fbfca3a10..db8efde4a25a 100644 --- a/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/stateful_test_contract/src/main.nr @@ -94,8 +94,7 @@ contract StatefulTest { balance_utils::get_balance(owner_balance) } - #[aztec(public)] - fn get_public_value(owner: AztecAddress) -> pub Field { + unconstrained fn get_public_value(owner: AztecAddress) -> pub Field { storage.public_values.at(owner).read() } } diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr index 21f62b8853f5..ddb115c721ef 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr @@ -38,16 +38,6 @@ contract TokenBlacklist { slow_update: SharedImmutable, } - #[aztec(public)] - fn total_supply() -> pub Field { - storage.total_supply.read().to_field() - } - - #[aztec(public)] - fn balance_of_public(owner: AztecAddress) -> pub Field { - storage.public_balances.at(owner).read().to_field() - } - // docs:start:constructor #[aztec(public)] #[aztec(initializer)] @@ -237,7 +227,8 @@ contract TokenBlacklist { storage.balances.sub(from, U128::from_integer(amount)); - TokenBlacklist::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context); + let selector = FunctionSelector::from_signature("_increase_public_balance((Field),Field)"); + context.call_public_function(context.this_address(), selector, [to.to_field(), amount]); } // docs:start:transfer_private @@ -275,7 +266,8 @@ contract TokenBlacklist { storage.balances.sub(from, U128::from_integer(amount)); - TokenBlacklist::at(context.this_address())._reduce_total_supply(amount).enqueue(&mut context); + let selector = FunctionSelector::from_signature("_reduce_total_supply(Field)"); + context.call_public_function(context.this_address(), selector, [amount]); } /// Internal /// @@ -297,7 +289,15 @@ contract TokenBlacklist { /// Unconstrained /// + unconstrained fn total_supply() -> pub Field { + storage.total_supply.read().to_field() + } + unconstrained fn balance_of_private(owner: AztecAddress) -> pub Field { storage.balances.balance_of(owner).to_field() } + + unconstrained fn balance_of_public(owner: AztecAddress) -> pub Field { + storage.public_balances.at(owner).read().to_field() + } } diff --git a/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr index b32d8c41d78e..28226b5b10b1 100644 --- a/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_bridge_contract/src/main.nr @@ -26,7 +26,8 @@ contract TokenBridge { #[aztec(private)] #[aztec(initializer)] fn constructor(token: AztecAddress) { - TokenBridge::at(context.this_address())._initialize(token).enqueue(&mut context); + let selector = FunctionSelector::from_signature("_initialize((Field))"); + context.call_public_function(context.this_address(), selector, [token.to_field()]); } // docs:end:token_bridge_storage_and_constructor @@ -98,7 +99,11 @@ contract TokenBridge { // `mint_private` on token is public. So we call an internal public function // which then calls the public method on the token contract. // Since the secret_hash is passed, no secret is leaked. - TokenBridge::at(context.this_address())._call_mint_on_token(amount, secret_hash_for_redeeming_minted_notes).enqueue(&mut context); + context.call_public_function( + context.this_address(), + FunctionSelector::from_signature("_call_mint_on_token(Field,Field)"), + [amount, secret_hash_for_redeeming_minted_notes] + ); } // docs:end:claim_private @@ -119,7 +124,11 @@ contract TokenBridge { // docs:start:call_assert_token_is_same // Assert that user provided token address is same as seen in storage. - TokenBridge::at(context.this_address())._assert_token_is_same(token).enqueue(&mut context); + context.call_public_function( + context.this_address(), + FunctionSelector::from_signature("_assert_token_is_same((Field))"), + [token.to_field()] + ); // docs:end:call_assert_token_is_same // Burn tokens @@ -127,11 +136,19 @@ contract TokenBridge { } /// docs:end:exit_to_l1_private - // docs:start:read_token + // View function that is callable by other contracts. + // Unconstrained can't be called by others since it isn't safe. #[aztec(public)] fn get_token() -> AztecAddress { storage.token.read() } + + // /// Unconstrained /// + + // docs:start:read_token + unconstrained fn token() -> pub AztecAddress { + storage.token.read() + } // docs:end:read_token #[aztec(public)] diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index a8a5cb8edbd4..cc892421ece9 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -84,6 +84,10 @@ contract Token { storage.name.read_private() } + unconstrained fn un_get_name() -> pub [u8; 31] { + storage.name.read_public().to_bytes() + } + #[aztec(public)] fn public_get_symbol() -> pub FieldCompressedString { storage.symbol.read_public() @@ -94,6 +98,10 @@ contract Token { storage.symbol.read_private() } + unconstrained fn un_get_symbol() -> pub [u8; 31] { + storage.symbol.read_public().to_bytes() + } + #[aztec(public)] fn public_get_decimals() -> pub u8 { // docs:start:read_decimals_public @@ -108,33 +116,9 @@ contract Token { // docs:end:read_decimals_private } - // docs:start:admin - #[aztec(public)] - fn admin() -> pub Field { - storage.admin.read().to_field() - } - // docs:end:admin - - // docs:start:is_minter - #[aztec(public)] - fn is_minter(minter: AztecAddress) -> pub bool { - storage.minters.at(minter).read() - } - // docs:end:is_minter - - // docs:start:total_supply - #[aztec(public)] - fn total_supply() -> pub Field { - storage.total_supply.read().to_field() - } - // docs:end:total_supply - - // docs:start:balance_of_public - #[aztec(public)] - fn balance_of_public(owner: AztecAddress) -> pub Field { - storage.public_balances.at(owner).read().to_field() + unconstrained fn un_get_decimals() -> pub u8 { + storage.decimals.read_public() } - // docs:end:balance_of_public // docs:start:set_minter #[aztec(public)] @@ -206,7 +190,7 @@ contract Token { let from_balance = storage.public_balances.at(from).read().sub(amount); let pending_shields = storage.pending_shields; - let mut note = TransparentNote::new(amount.to_field(), secret_hash); + let mut note = TransparentNote::new(amount.to_integer(), secret_hash); storage.public_balances.at(from).write(from_balance); pending_shields.insert_from_public(&mut note); @@ -346,10 +330,34 @@ contract Token { /// Unconstrained /// + // docs:start:admin + unconstrained fn admin() -> pub Field { + storage.admin.read().to_field() + } + // docs:end:admin + + // docs:start:is_minter + unconstrained fn is_minter(minter: AztecAddress) -> pub bool { + storage.minters.at(minter).read() + } + // docs:end:is_minter + + // docs:start:total_supply + unconstrained fn total_supply() -> pub Field { + storage.total_supply.read().to_integer() + } + // docs:end:total_supply + // docs:start:balance_of_private unconstrained fn balance_of_private(owner: AztecAddress) -> pub Field { - storage.balances.balance_of(owner).to_field() + storage.balances.balance_of(owner).to_integer() } // docs:end:balance_of_private + + // docs:start:balance_of_public + unconstrained fn balance_of_public(owner: AztecAddress) -> pub Field { + storage.public_balances.at(owner).read().to_integer() + } + // docs:end:balance_of_public } // docs:end:token_all diff --git a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts index c94e1ca00ffa..ac36f13ceaf8 100644 --- a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts +++ b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts @@ -35,14 +35,14 @@ describe('e2e_avm_simulator', () => { describe('Storage', () => { it('Modifies storage (Field)', async () => { await avmContract.methods.set_storage_single(20n).send().wait(); - expect(await avmContract.methods.read_storage_single().simulate()).toEqual(20n); + expect(await avmContract.methods.view_storage_single().simulate()).toEqual(20n); }); it('Modifies storage (Map)', async () => { const address = AztecAddress.fromBigInt(9090n); await avmContract.methods.set_storage_map(address, 100).send().wait(); await avmContract.methods.add_storage_map(address, 100).send().wait(); - expect(await avmContract.methods.read_storage_map(address).simulate()).toEqual(200n); + expect(await avmContract.methods.view_storage_map(address).simulate()).toEqual(200n); }); }); diff --git a/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts b/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts index 1500098a5bc2..592240844530 100644 --- a/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_blacklist_token_contract.test.ts @@ -994,6 +994,7 @@ describe('e2e_blacklist_token_contract', () => { .methods.unshield(wallets[0].getAddress(), wallets[1].getAddress(), amount, nonce) .send(); await expect(txReplay.wait()).rejects.toThrow('Transaction '); + // @todo @LHerskind This error is weird? }); describe('failure cases', () => { diff --git a/yarn-project/end-to-end/src/e2e_token_contract/reading_constants.test.ts b/yarn-project/end-to-end/src/e2e_token_contract/reading_constants.test.ts index af856853415d..b7a5089217f6 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract/reading_constants.test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract/reading_constants.test.ts @@ -1,14 +1,12 @@ -import { Fr } from '@aztec/circuits.js'; +import { ReaderContract } from '@aztec/noir-contracts.js'; import { TokenContractTest } from './token_contract_test.js'; -const toString = ({ value }: { value: bigint }) => { - const vals: number[] = Array.from(new Fr(value).toBuffer()); - +const toString = (val: bigint[]) => { let str = ''; - for (let i = 0; i < vals.length; i++) { - if (vals[i] != 0) { - str += String.fromCharCode(Number(vals[i])); + for (let i = 0; i < val.length; i++) { + if (val[i] != 0n) { + str += String.fromCharCode(Number(val[i])); } } return str; @@ -18,9 +16,26 @@ describe('e2e_token_contract reading constants', () => { const t = new TokenContractTest('reading_constants'); const { TOKEN_DECIMALS, TOKEN_NAME, TOKEN_SYMBOL } = TokenContractTest; // Do not destructure anything mutable. + const { logger } = t; + let reader: ReaderContract; beforeAll(async () => { await t.applyBaseSnapshots(); + + await t.snapshot( + 'reading_constants', + async () => { + logger.verbose('Deploying ReaderContract...'); + const reader = await ReaderContract.deploy(t.wallets[0]).send().deployed(); + logger.verbose(`Deployed ReaderContract to ${reader.address}.`); + return { readerAddress: reader.address }; + }, + async ({ readerAddress }) => { + reader = await ReaderContract.at(readerAddress, t.wallets[0]); + logger.verbose(`Reader contract restored to ${readerAddress}.`); + }, + ); + await t.setup(); }); @@ -35,32 +50,66 @@ describe('e2e_token_contract reading constants', () => { }); it('check name private', async () => { - const name = toString(await t.asset.methods.private_get_name().simulate()); + const name = toString(await t.asset.methods.un_get_name().simulate()); expect(name).toBe(TOKEN_NAME); + + await reader.methods.check_name_private(t.asset.address, TOKEN_NAME).send().wait(); + await expect(reader.methods.check_name_private(t.asset.address, 'WRONG_NAME').simulate()).rejects.toThrow( + 'name.is_eq(_what)', + ); }); it('check name public', async () => { - const name = toString(await t.asset.methods.public_get_name().simulate()); + const name = toString(await t.asset.methods.un_get_name().simulate()); expect(name).toBe(TOKEN_NAME); + + await reader.methods.check_name_public(t.asset.address, TOKEN_NAME).send().wait(); + await expect(reader.methods.check_name_public(t.asset.address, 'WRONG_NAME').simulate()).rejects.toThrow( + 'name.is_eq(_what)', + ); }); it('check symbol private', async () => { - const sym = toString(await t.asset.methods.private_get_symbol().simulate()); + const sym = toString(await t.asset.methods.un_get_symbol().simulate()); expect(sym).toBe(TOKEN_SYMBOL); + + await reader.methods.check_symbol_private(t.asset.address, TOKEN_SYMBOL).send().wait(); + + await expect(reader.methods.check_symbol_private(t.asset.address, 'WRONG_SYMBOL').simulate()).rejects.toThrow( + "Cannot satisfy constraint 'symbol.is_eq(_what)'", + ); }); it('check symbol public', async () => { - const sym = toString(await t.asset.methods.public_get_symbol().simulate()); + const sym = toString(await t.asset.methods.un_get_symbol().simulate()); expect(sym).toBe(TOKEN_SYMBOL); + + await reader.methods.check_symbol_public(t.asset.address, TOKEN_SYMBOL).send().wait(); + + await expect(reader.methods.check_symbol_public(t.asset.address, 'WRONG_SYMBOL').simulate()).rejects.toThrow( + "Failed to solve brillig function 'symbol.is_eq(_what)'", + ); }); it('check decimals private', async () => { - const dec = await t.asset.methods.private_get_decimals().simulate(); + const dec = await t.asset.methods.un_get_decimals().simulate(); expect(dec).toBe(TOKEN_DECIMALS); + + await reader.methods.check_decimals_private(t.asset.address, TOKEN_DECIMALS).send().wait(); + + await expect(reader.methods.check_decimals_private(t.asset.address, 99).simulate()).rejects.toThrow( + "Cannot satisfy constraint 'result == what'", + ); }); it('check decimals public', async () => { - const dec = await t.asset.methods.public_get_decimals().simulate(); + const dec = await t.asset.methods.un_get_decimals().simulate(); expect(dec).toBe(TOKEN_DECIMALS); + + await reader.methods.check_decimals_public(t.asset.address, TOKEN_DECIMALS).send().wait(); + + await expect(reader.methods.check_decimals_public(t.asset.address, 99).simulate()).rejects.toThrow( + "Failed to solve brillig function 'ret == what'", + ); }); }); diff --git a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts index ef1d31bd8d3b..63975935c910 100644 --- a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts @@ -109,7 +109,7 @@ export async function deployAndInitializeTokenAndBridgeContracts( throw new Error(`Token admin is not ${owner}`); } - if (!(await bridge.methods.get_token().simulate()).equals(token.address)) { + if (!(await bridge.methods.token().simulate()).equals(token.address)) { throw new Error(`Bridge token is not ${token.address}`); }