Skip to content

Commit

Permalink
Avoid premature optimisation and just move make and take into their r…
Browse files Browse the repository at this point in the history
…espective tests
  • Loading branch information
mikemaccana committed Jul 30, 2024
1 parent 4bd12ba commit a268b39
Showing 1 changed file with 53 additions and 63 deletions.
116 changes: 53 additions & 63 deletions tokens/escrow/anchor/tests/escrow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,67 +45,6 @@ describe('escrow', async () => {
const tokenAOfferedAmount = new BN(1_000_000);
const tokenBWantedAmount = new BN(1_000_000);

// We'll call this function from multiple tests, so let's seperate it out
const make = async () => {
// Pick a random ID for the offer we'll make
const offerId = getRandomBigNumber();

// Then determine the account addresses we'll use for the offer and the vault
const offer = PublicKey.findProgramAddressSync(
[Buffer.from('offer'), accounts.maker.toBuffer(), offerId.toArrayLike(Buffer, 'le', 8)],
program.programId,
)[0];

const vault = getAssociatedTokenAddressSync(accounts.tokenMintA, offer, true, TOKEN_PROGRAM);

accounts.offer = offer;
accounts.vault = vault;

const transactionSignature = await program.methods
.makeOffer(offerId, tokenAOfferedAmount, tokenBWantedAmount)
.accounts({ ...accounts })
.signers([alice])
.rpc();

await confirmTransaction(connection, transactionSignature);

// Check our vault contains the tokens offered
const vaultBalanceResponse = await connection.getTokenAccountBalance(vault);
const vaultBalance = new BN(vaultBalanceResponse.value.amount);
assert(vaultBalance.eq(tokenAOfferedAmount));

// Check our Offer account contains the correct data
const offerAccount = await program.account.offer.fetch(offer);

assert(offerAccount.maker.equals(alice.publicKey));
assert(offerAccount.tokenMintA.equals(accounts.tokenMintA));
assert(offerAccount.tokenMintB.equals(accounts.tokenMintB));
assert(offerAccount.tokenBWantedAmount.eq(tokenBWantedAmount));
};

// We'll call this function from multiple tests, so let's seperate it out
const take = async () => {
const transactionSignature = await program.methods
.takeOffer()
.accounts({ ...accounts })
.signers([bob])
.rpc();

await confirmTransaction(connection, transactionSignature);

// Check the offered tokens are now in Bob's account
// (note: there is no before balance as Bob didn't have any offered tokens before the transaction)
const bobTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.takerTokenAccountA);
const bobTokenAccountBalanceAfter = new BN(bobTokenAccountBalanceAfterResponse.value.amount);
assert(bobTokenAccountBalanceAfter.eq(tokenAOfferedAmount));

// Check the wanted tokens are now in Alice's account
// (note: there is no before balance as Alice didn't have any wanted tokens before the transaction)
const aliceTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.makerTokenAccountB);
const aliceTokenAccountBalanceAfter = new BN(aliceTokenAccountBalanceAfterResponse.value.amount);
assert(aliceTokenAccountBalanceAfter.eq(tokenBWantedAmount));
};

before('Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users', async () => {
const usersMintsAndTokenAccounts = await createAccountsMintsAndTokenAccounts(
[
Expand Down Expand Up @@ -157,10 +96,61 @@ describe('escrow', async () => {
});

it('Puts the tokens Alice offers into the vault when Alice makes an offer', async () => {
await make();
// Pick a random ID for the offer we'll make
const offerId = getRandomBigNumber();

// Then determine the account addresses we'll use for the offer and the vault
const offer = PublicKey.findProgramAddressSync(
[Buffer.from('offer'), accounts.maker.toBuffer(), offerId.toArrayLike(Buffer, 'le', 8)],
program.programId,
)[0];

const vault = getAssociatedTokenAddressSync(accounts.tokenMintA, offer, true, TOKEN_PROGRAM);

accounts.offer = offer;
accounts.vault = vault;

const transactionSignature = await program.methods
.makeOffer(offerId, tokenAOfferedAmount, tokenBWantedAmount)
.accounts({ ...accounts })
.signers([alice])
.rpc();

await confirmTransaction(connection, transactionSignature);

// Check our vault contains the tokens offered
const vaultBalanceResponse = await connection.getTokenAccountBalance(vault);
const vaultBalance = new BN(vaultBalanceResponse.value.amount);
assert(vaultBalance.eq(tokenAOfferedAmount));

// Check our Offer account contains the correct data
const offerAccount = await program.account.offer.fetch(offer);

assert(offerAccount.maker.equals(alice.publicKey));
assert(offerAccount.tokenMintA.equals(accounts.tokenMintA));
assert(offerAccount.tokenMintB.equals(accounts.tokenMintB));
assert(offerAccount.tokenBWantedAmount.eq(tokenBWantedAmount));
}).slow(60 * SECONDS);

it("Puts the tokens from the vault into Bob's account, and gives Alice Bob's tokens, when Bob takes an offer", async () => {
await take();
const transactionSignature = await program.methods
.takeOffer()
.accounts({ ...accounts })
.signers([bob])
.rpc();

await confirmTransaction(connection, transactionSignature);

// Check the offered tokens are now in Bob's account
// (note: there is no before balance as Bob didn't have any offered tokens before the transaction)
const bobTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.takerTokenAccountA);
const bobTokenAccountBalanceAfter = new BN(bobTokenAccountBalanceAfterResponse.value.amount);
assert(bobTokenAccountBalanceAfter.eq(tokenAOfferedAmount));

// Check the wanted tokens are now in Alice's account
// (note: there is no before balance as Alice didn't have any wanted tokens before the transaction)
const aliceTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.makerTokenAccountB);
const aliceTokenAccountBalanceAfter = new BN(aliceTokenAccountBalanceAfterResponse.value.amount);
assert(aliceTokenAccountBalanceAfter.eq(tokenBWantedAmount));
}).slow(60 * SECONDS);
});

0 comments on commit a268b39

Please sign in to comment.