From e773aec726ff3c01fb198300b60695b20a9a9f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Fri, 26 Apr 2024 16:52:30 +0000 Subject: [PATCH 1/4] Use static call when applicable --- .../contracts/docs_example_contract/src/main.nr | 4 ++-- .../contracts/lending_contract/src/main.nr | 4 ++-- .../contracts/uniswap_contract/src/main.nr | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr index 4c4eb170e98b..574371da488f 100644 --- a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr @@ -115,7 +115,7 @@ contract DocsExample { // and returns the response. // Used to test that we can retrieve values through calls and // correctly return them in the simulation - let mut leader = DocsExample::at(context.this_address()).get_shared_immutable_constrained_private().call(&mut context); + let mut leader = DocsExample::at(context.this_address()).get_shared_immutable_constrained_private().static_call(&mut context); leader.points += 1; leader } @@ -126,7 +126,7 @@ contract DocsExample { // and returns the response. // Used to test that we can retrieve values through calls and // correctly return them in the simulation - let mut leader = DocsExample::at(context.this_address()).get_shared_immutable_constrained_public().call(&mut context); + let mut leader = DocsExample::at(context.this_address()).get_shared_immutable_constrained_public().static_call(&mut context); leader.points += 1; leader } 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 c2c05f58a093..80d693340c6c 100644 --- a/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/lending_contract/src/main.nr @@ -149,7 +149,7 @@ contract Lending { #[aztec(internal)] fn _withdraw(owner: AztecAddress, recipient: AztecAddress, amount: Field) { let asset = Lending::at(context.this_address()).update_accumulator().call(&mut context); - let price = PriceFeed::at(asset.oracle).get_price(0).call(&mut context).price; + let price = PriceFeed::at(asset.oracle).get_price(0).static_call(&mut context).price; let coll_loc = storage.collateral.at(owner); let collateral: Field = coll_loc.read(); @@ -197,7 +197,7 @@ contract Lending { #[aztec(internal)] fn _borrow(owner: AztecAddress, to: AztecAddress, amount: Field) { let asset = Lending::at(context.this_address()).update_accumulator().call(&mut context); - let price = PriceFeed::at(asset.oracle).get_price(0).call(&mut context).price; + let price = PriceFeed::at(asset.oracle).get_price(0).static_call(&mut context).price; // Fetch collateral and static_debt, compute health of current position let collateral = U128::from_integer(storage.collateral.at(owner).read()); diff --git a/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr b/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr index f8227136c67c..db96bff24d0e 100644 --- a/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr @@ -57,7 +57,7 @@ contract Uniswap { assert_current_call_valid_authwit_public(&mut context, sender); } - let input_asset = TokenBridge::at(input_asset_bridge).get_token().call(&mut context); + let input_asset = TokenBridge::at(input_asset_bridge).get_token().static_call(&mut context); // Transfer funds to this contract Token::at(input_asset).transfer_public( @@ -71,8 +71,8 @@ contract Uniswap { Uniswap::at(context.this_address())._approve_bridge_and_exit_input_asset_to_L1(input_asset, input_asset_bridge, input_amount).call(&mut context); // Create swap message and send to Outbox for Uniswap Portal // this ensures the integrity of what the user originally intends to do on L1. - let input_asset_bridge_portal_address = TokenBridge::at(input_asset_bridge).get_portal_address_public().call(&mut context); - let output_asset_bridge_portal_address = TokenBridge::at(output_asset_bridge).get_portal_address_public().call(&mut context); + let input_asset_bridge_portal_address = TokenBridge::at(input_asset_bridge).get_portal_address_public().static_call(&mut context); + let output_asset_bridge_portal_address = TokenBridge::at(output_asset_bridge).get_portal_address_public().static_call(&mut context); // ensure portal exists - else funds might be lost assert( !input_asset_bridge_portal_address.is_zero(), "L1 portal address of input_asset's bridge is 0" @@ -129,8 +129,8 @@ contract Uniswap { // Create swap message and send to Outbox for Uniswap Portal // this ensures the integrity of what the user originally intends to do on L1. - let input_asset_bridge_portal_address = TokenBridge::at(input_asset_bridge).get_portal_address().call(&mut context); - let output_asset_bridge_portal_address = TokenBridge::at(output_asset_bridge).get_portal_address().call(&mut context); + let input_asset_bridge_portal_address = TokenBridge::at(input_asset_bridge).get_portal_address().static_call(&mut context); + let output_asset_bridge_portal_address = TokenBridge::at(output_asset_bridge).get_portal_address().static_call(&mut context); // ensure portal exists - else funds might be lost assert( !input_asset_bridge_portal_address.is_zero(), "L1 portal address of input_asset's bridge is 0" @@ -220,7 +220,7 @@ contract Uniswap { #[aztec(internal)] fn _assert_token_is_same(token: AztecAddress, token_bridge: AztecAddress) { assert( - token.eq(TokenBridge::at(token_bridge).get_token().call(&mut context)), "input_asset address is not the same as seen in the bridge contract" + token.eq(TokenBridge::at(token_bridge).get_token().static_call(&mut context)), "input_asset address is not the same as seen in the bridge contract" ); } // docs:end:assert_token_is_same From 0bc94179406f0676de6d9dea42569eb0e59d0ee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Fri, 26 Apr 2024 16:55:07 +0000 Subject: [PATCH 2/4] Enqueue static where applicable --- .../contracts/app_subscription_contract/src/main.nr | 4 ++-- .../contracts/crowdfunding_contract/src/main.nr | 2 +- .../noir-contracts/contracts/uniswap_contract/src/main.nr | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr index bab4f24cb511..c3233b2d55de 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr @@ -51,7 +51,7 @@ contract AppSubscription { context.end_setup(); - AppSubscription::at(context.this_address()).assert_not_expired(note.expiry_block_number).enqueue(&mut context); + AppSubscription::at(context.this_address()).assert_not_expired(note.expiry_block_number).static_enqueue(&mut context); payload.execute_calls(&mut context, storage.target_address.read_private()); } @@ -105,7 +105,7 @@ contract AppSubscription { ).call(&mut context); // Assert that the given expiry_block_number < current_block_number + SUBSCRIPTION_DURATION_IN_BLOCKS. - AppSubscription::at(context.this_address()).assert_block_number(expiry_block_number).enqueue(&mut context); + AppSubscription::at(context.this_address()).assert_block_number(expiry_block_number).static_enqueue(&mut context); let mut subscription_note = SubscriptionNote::new(subscriber_address, expiry_block_number, tx_count); if (!is_initialized(subscriber_address)) { diff --git a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr index 3b1f71147721..38fb7984a384 100644 --- a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr @@ -68,7 +68,7 @@ contract Crowdfunding { #[aztec(private)] fn donate(amount: u64) { // 1) Check that the deadline has not passed - Crowdfunding::at(context.this_address())._check_deadline().enqueue(&mut context); + Crowdfunding::at(context.this_address())._check_deadline().static_enqueue(&mut context); // docs:end:call-check-deadline // docs:start:do-transfer diff --git a/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr b/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr index db96bff24d0e..bcd20e0403cd 100644 --- a/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/uniswap_contract/src/main.nr @@ -114,7 +114,7 @@ contract Uniswap { ) { // Assert that user provided token address is same as expected by token bridge. // we can't directly use `input_asset_bridge.token` because that is a public method and public can't return data to private - Uniswap::at(context.this_address())._assert_token_is_same(input_asset, input_asset_bridge).enqueue(&mut context); + Uniswap::at(context.this_address())._assert_token_is_same(input_asset, input_asset_bridge).static_enqueue(&mut context); // Transfer funds to this contract Token::at(input_asset).unshield( From 6c31c5307f02d218601edbe3e7147a4bf3f33b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Fri, 26 Apr 2024 16:57:23 +0000 Subject: [PATCH 3/4] Use prove where appropriate --- yarn-project/end-to-end/src/e2e_auth_contract.test.ts | 10 +++++----- yarn-project/end-to-end/src/e2e_note_getter.test.ts | 2 +- .../src/e2e_pending_note_hashes_contract.test.ts | 4 ++-- yarn-project/end-to-end/src/e2e_state_vars.test.ts | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/yarn-project/end-to-end/src/e2e_auth_contract.test.ts b/yarn-project/end-to-end/src/e2e_auth_contract.test.ts index 099885c1c9a7..423e3e63c974 100644 --- a/yarn-project/end-to-end/src/e2e_auth_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_auth_contract.test.ts @@ -60,7 +60,7 @@ describe('e2e_auth_contract', () => { it('authorized is not yet set, cannot use permission', async () => { expect(await contract.methods.get_authorized().simulate()).toEqual(AztecAddress.ZERO); - await expect(contract.withWallet(authorized).methods.do_private_authorized_thing().send().wait()).rejects.toThrow( + await expect(contract.withWallet(authorized).methods.do_private_authorized_thing().prove()).rejects.toThrow( 'caller is not authorized', ); }); @@ -93,11 +93,11 @@ describe('e2e_auth_contract', () => { expect(await contract.methods.get_scheduled_authorized().simulate()).toEqual(other.getAddress()); - await expect(contract.withWallet(other).methods.do_private_authorized_thing().send().wait()).rejects.toThrow( + await expect(contract.withWallet(other).methods.do_private_authorized_thing().prove()).rejects.toThrow( 'caller is not authorized', ); - expect((await contract.withWallet(authorized).methods.do_private_authorized_thing().send().wait()).status).toEqual( + expect((await contract.withWallet(authorized).methods.do_private_authorized_thing().prove()).status).toEqual( 'mined', ); }); @@ -107,11 +107,11 @@ describe('e2e_auth_contract', () => { expect(await contract.methods.get_authorized().simulate()).toEqual(other.getAddress()); - await expect(contract.withWallet(authorized).methods.do_private_authorized_thing().send().wait()).rejects.toThrow( + await expect(contract.withWallet(authorized).methods.do_private_authorized_thing().prove()).rejects.toThrow( 'caller is not authorized', ); - expect((await contract.withWallet(other).methods.do_private_authorized_thing().send().wait()).status).toEqual( + expect((await contract.withWallet(other).methods.do_private_authorized_thing().prove()).status).toEqual( 'mined', ); }); diff --git a/yarn-project/end-to-end/src/e2e_note_getter.test.ts b/yarn-project/end-to-end/src/e2e_note_getter.test.ts index c7deb286a920..902e1756c359 100644 --- a/yarn-project/end-to-end/src/e2e_note_getter.test.ts +++ b/yarn-project/end-to-end/src/e2e_note_getter.test.ts @@ -178,7 +178,7 @@ describe('e2e_note_getter', () => { await expect(contract.methods.call_view_notes(storageSlot, activeOrNullified).simulate()).rejects.toThrow( 'is_some', ); - await expect(contract.methods.call_get_notes(storageSlot, activeOrNullified).send().wait()).rejects.toThrow( + await expect(contract.methods.call_get_notes(storageSlot, activeOrNullified).prove()).rejects.toThrow( `Assertion failed: Cannot return zero notes`, ); } diff --git a/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts b/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts index 47cbd7202ed7..0edba22bb869 100644 --- a/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_pending_note_hashes_contract.test.ts @@ -81,7 +81,7 @@ describe('e2e_pending_note_hashes_contract', () => { ) .send() .wait(); - await expect(deployedContract.methods.get_note_zero_balance(owner).send().wait()).rejects.toThrow( + await expect(deployedContract.methods.get_note_zero_balance(owner).prove()).rejects.toThrow( `Assertion failed: Cannot return zero notes`, ); @@ -158,7 +158,7 @@ describe('e2e_pending_note_hashes_contract', () => { ) .send() .wait(); - await expect(deployedContract.methods.get_note_zero_balance(owner).send().wait()).rejects.toThrow( + await expect(deployedContract.methods.get_note_zero_balance(owner).prove()).rejects.toThrow( `Assertion failed: Cannot return zero notes`, ); diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index 8a6ed6dc23ea..fc7c8eca207b 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -81,7 +81,7 @@ describe('e2e_state_vars', () => { it('initializing SharedImmutable the second time should fail', async () => { // Jest executes the tests sequentially and the first call to initialize_shared_immutable was executed // in the previous test, so the call bellow should fail. - await expect(contract.methods.initialize_shared_immutable(1).send().wait()).rejects.toThrow( + await expect(contract.methods.initialize_shared_immutable(1).prove()).rejects.toThrow( "Assertion failed: SharedImmutable already initialized 'fields_read[0] == 0'", ); }, 100_000); @@ -101,7 +101,7 @@ describe('e2e_state_vars', () => { it('initializing PublicImmutable the second time should fail', async () => { // Jest executes the tests sequentially and the first call to initialize_public_immutable was executed // in the previous test, so the call bellow should fail. - await expect(contract.methods.initialize_public_immutable(1).send().wait()).rejects.toThrow( + await expect(contract.methods.initialize_public_immutable(1).provet()).rejects.toThrow( "Assertion failed: PublicImmutable already initialized 'fields_read[0] == 0'", ); }, 100_000); From 7e22ce80fe688fc723eba71691f95e0fc7559bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Venturo?= Date: Fri, 26 Apr 2024 17:24:50 +0000 Subject: [PATCH 4/4] Fix typos --- yarn-project/end-to-end/src/e2e_auth_contract.test.ts | 4 ++-- yarn-project/end-to-end/src/e2e_state_vars.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn-project/end-to-end/src/e2e_auth_contract.test.ts b/yarn-project/end-to-end/src/e2e_auth_contract.test.ts index 423e3e63c974..2ccf9ff3493d 100644 --- a/yarn-project/end-to-end/src/e2e_auth_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_auth_contract.test.ts @@ -97,7 +97,7 @@ describe('e2e_auth_contract', () => { 'caller is not authorized', ); - expect((await contract.withWallet(authorized).methods.do_private_authorized_thing().prove()).status).toEqual( + expect((await contract.withWallet(authorized).methods.do_private_authorized_thing().send().wait()).status).toEqual( 'mined', ); }); @@ -111,7 +111,7 @@ describe('e2e_auth_contract', () => { 'caller is not authorized', ); - expect((await contract.withWallet(other).methods.do_private_authorized_thing().prove()).status).toEqual( + expect((await contract.withWallet(other).methods.do_private_authorized_thing().send().wait()).status).toEqual( 'mined', ); }); diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index fc7c8eca207b..7fea645801d7 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -101,7 +101,7 @@ describe('e2e_state_vars', () => { it('initializing PublicImmutable the second time should fail', async () => { // Jest executes the tests sequentially and the first call to initialize_public_immutable was executed // in the previous test, so the call bellow should fail. - await expect(contract.methods.initialize_public_immutable(1).provet()).rejects.toThrow( + await expect(contract.methods.initialize_public_immutable(1).prove()).rejects.toThrow( "Assertion failed: PublicImmutable already initialized 'fields_read[0] == 0'", ); }, 100_000);