-
Notifications
You must be signed in to change notification settings - Fork 301
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: flaky e2e sample dapp and quick start (#8768)
This fixes the flakiness of `up_quick_start` and `sample_dapp`. It also updates the test using the cli to the correct version. One notable source of flakiness that I chased down was a weird`Assertion failed: membership check failed`. This was showing up pretty reliably in `sample_dapp`. I solved this by separating the tests, and confirmed by running it in band (thanks @Thunkar) because it seems like crosstalk between both tests hitting the same pxe is a trigger of this. I explored but did not find the actual cause on why the crosstalk would induce this error, as I had spent already too much time but I have made an issue and have linked it in the code.
- Loading branch information
Showing
10 changed files
with
99 additions
and
112 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,60 @@ | ||
#!/bin/bash | ||
# Run locally from end-to-end folder while running anvil and sandbox with: | ||
# PATH=$PATH:../node_modules/.bin ./src/guides/up_quick_start.sh | ||
|
||
set -eux | ||
|
||
LOCATION=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) | ||
export WALLET_DATA_DIRECTORY="${LOCATION}/up_quick_start" | ||
|
||
aztec-wallet() { | ||
node --no-warnings ../cli-wallet/dest/bin/index.js "$@" | ||
} | ||
|
||
# docs:start:declare-accounts | ||
ACCOUNTS=$(aztec-cli get-accounts --json | jq -r '.[].address') | ||
ALICE=$(echo "$ACCOUNTS" | sed -n 1p) | ||
BOB=$(echo "$ACCOUNTS" | sed -n 2p) | ||
ALICE_PRIVATE_KEY="0x2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281" | ||
aztec-wallet create-account -a alice | ||
aztec-wallet create-account -a bob | ||
# docs:end:declare-accounts | ||
|
||
# docs:start:deploy | ||
CONTRACT=$(aztec-cli deploy TokenContractArtifact --private-key $ALICE_PRIVATE_KEY --salt 0 --args $ALICE "TokenName" "TKN" 18 --json | jq -r '.address') | ||
echo "Deployed contract at $CONTRACT" | ||
aztec-cli check-deploy --contract-address $CONTRACT | ||
DEPLOY_OUTPUT=$(aztec-wallet deploy ../noir-contracts.js/artifacts/token_contract-Token.json --args accounts:alice Test TST 18 -f alice) | ||
TOKEN_ADDRESS=$(echo "$DEPLOY_OUTPUT" | grep -oE 'Contract deployed at 0x[0-9a-fA-F]+' | cut -d ' ' -f4) | ||
echo "Deployed contract at $TOKEN_ADDRESS" | ||
# docs:end:deploy | ||
|
||
# docs:start:mint-private | ||
SECRET="0x29bf6afaf29f61cbcf2a4fa7da97be481fb418dc08bdab5338839974beb7b49f" | ||
SECRET_HASH="0x0921759afa747c9073f75df9688a17d271cef0d6ec51eacf70e112402c4db6cd" | ||
MINT_AMOUNT=69 | ||
aztec-wallet create-secret -a shield | ||
|
||
MINT_PRIVATE_OUTPUT=$(aztec-cli send mint_private \ | ||
--args 1000 $SECRET_HASH \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT \ | ||
--private-key $ALICE_PRIVATE_KEY) | ||
aztec-wallet send mint_private -ca last --args $MINT_AMOUNT secrets:shield:hash -f alice | ||
|
||
MINT_PRIVATE_TX_HASH=$(echo "$MINT_PRIVATE_OUTPUT" | grep "Transaction hash:" | awk '{print $NF}') | ||
aztec-wallet add-note TransparentNote pending_shields -ca last -t last -a alice -b $MINT_AMOUNT secrets:shield:hash | ||
|
||
aztec-cli add-note \ | ||
$ALICE $CONTRACT 5 84114971101151129711410111011678111116101 $MINT_PRIVATE_TX_HASH \ | ||
--note 1000 $SECRET_HASH | ||
|
||
aztec-cli send redeem_shield \ | ||
--args $ALICE 1000 $SECRET \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT \ | ||
--private-key $ALICE_PRIVATE_KEY | ||
aztec-wallet send redeem_shield -ca last --args accounts:alice $MINT_AMOUNT secrets:shield -f alice | ||
# docs:end:mint-private | ||
|
||
# docs:start:get-balance | ||
aztec-cli call balance_of_private \ | ||
--args $ALICE \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT | ||
ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice) | ||
if ! echo $ALICE_BALANCE | grep -q $MINT_AMOUNT; then | ||
echo "Incorrect Alice balance after transaction (expected $MINT_AMOUNT but got $ALICE_BALANCE)" | ||
exit 1 | ||
fi | ||
# docs:end:get-balance | ||
|
||
# docs:start:transfer | ||
aztec-cli send transfer \ | ||
--args $ALICE $BOB 500 0 \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT \ | ||
--private-key $ALICE_PRIVATE_KEY | ||
TRANSFER_AMOUNT=42 | ||
|
||
aztec-cli call balance_of_private \ | ||
--args $ALICE \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT | ||
|
||
aztec-cli call balance_of_private \ | ||
--args $BOB \ | ||
--contract-artifact TokenContractArtifact \ | ||
--contract-address $CONTRACT | ||
aztec-wallet send transfer -ca last --args accounts:bob $TRANSFER_AMOUNT -f alice | ||
# docs:end:transfer | ||
|
||
aztec-cli get-logs | ||
|
||
# Test end result | ||
BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-artifact TokenContractArtifact --contract-address $CONTRACT) | ||
if ! echo $BOB_BALANCE | grep -q 500; then | ||
echo "Incorrect Bob balance after transaction (expected 500 but got $BOB_BALANCE)" | ||
ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice) | ||
if ! echo $ALICE_BALANCE | grep -q "$(($MINT_AMOUNT - $TRANSFER_AMOUNT))"; then | ||
echo "Incorrect Alice balance after transaction (expected 27 but got $ALICE_BALANCE)" | ||
exit 1 | ||
fi | ||
|
||
BOB_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:bob -f bob) | ||
if ! echo $BOB_BALANCE | grep -q $TRANSFER_AMOUNT; then | ||
echo "Incorrect Bob balance after transaction (expected $TRANSFER_AMOUNT but got $BOB_BALANCE)" | ||
exit 1 | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,11 @@ | ||
import { AztecAddress, Contract, loadContractArtifact } from '@aztec/aztec.js'; | ||
import TokenContractJson from '@aztec/noir-contracts.js/artifacts/token_contract-Token' assert { type: 'json' }; | ||
import { AztecAddress } from '@aztec/aztec.js'; | ||
import { TokenContract } from '@aztec/noir-contracts.js/Token'; | ||
|
||
import { readFileSync } from 'fs'; | ||
|
||
// docs:start:get-tokens | ||
export async function getToken(client) { | ||
const addresses = JSON.parse(readFileSync('addresses.json')); | ||
return Contract.at(AztecAddress.fromString(addresses.token), loadContractArtifact(TokenContractJson), client); | ||
return TokenContract.at(AztecAddress.fromString(addresses.token), client); | ||
} | ||
// docs:end:get-tokens |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,49 +1,48 @@ | ||
import { createAccount } from '@aztec/accounts/testing'; | ||
import { Contract, ExtendedNote, Fr, Note, computeSecretHash, createPXEClient, waitForPXE } from '@aztec/aztec.js'; | ||
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; | ||
import { TokenContract, TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; | ||
|
||
const { PXE_URL = 'http://localhost:8080', ETHEREUM_HOST = 'http://localhost:8545' } = process.env; | ||
|
||
describe('token', () => { | ||
// docs:start:setup | ||
let owner, recipient, token; | ||
|
||
beforeAll(async () => { | ||
const pxe = createPXEClient(PXE_URL); | ||
await waitForPXE(pxe); | ||
owner = await createAccount(pxe); | ||
recipient = await createAccount(pxe); | ||
|
||
token = await Contract.deploy(owner, TokenContractArtifact, [owner.getCompleteAddress(), 'TokenName', 'TKN', 18]) | ||
.send() | ||
.deployed(); | ||
token = await TokenContract.deploy(owner, owner.getAddress(), 'TokenName', 'TKN', 18).send().deployed(); | ||
|
||
const initialBalance = 20n; | ||
const initialBalance = 69; | ||
const secret = Fr.random(); | ||
const secretHash = await computeSecretHash(secret); | ||
const receipt = await token.methods.mint_private(initialBalance, secretHash).send().wait(); | ||
|
||
const storageSlot = token.artifact.storageLayout['pending_shields'].slot; | ||
const noteTypeId = token.artifact.notes['TransparentNote'].id; | ||
const note = new Note([new Fr(initialBalance), secretHash]); | ||
const extendedNote = new ExtendedNote( | ||
note, | ||
owner.getAddress(), | ||
token.address, | ||
storageSlot, | ||
noteTypeId, | ||
TokenContract.storage.pending_shields.slot, | ||
TokenContract.notes.TransparentNote.id, | ||
receipt.txHash, | ||
); | ||
await pxe.addNote(extendedNote); | ||
await pxe.addNote(extendedNote, owner.getAddress()); | ||
|
||
await token.methods.redeem_shield({ address: owner.getAddress() }, initialBalance, secret).send().wait(); | ||
await token.methods.redeem_shield(owner.getAddress(), initialBalance, secret).send().wait(); | ||
}, 120_000); | ||
// docs:end:setup | ||
|
||
// docs:start:test | ||
it('increases recipient funds on transfer', async () => { | ||
expect(await token.methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(0n); | ||
await token.methods.transfer(owner.getAddress(), recipient.getAddress(), 20n, 0).send().wait(); | ||
expect(await token.methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(20n); | ||
expect(await token.withWallet(recipient).methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(0n); | ||
await token.methods.transfer(recipient.getAddress(), 20).send().wait(); | ||
expect(await token.withWallet(recipient).methods.balance_of_private(recipient.getAddress()).simulate()).toEqual( | ||
20n, | ||
); | ||
}, 30_000); | ||
// docs:end:test | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters