Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix anchor action #104

Merged
merged 4 commits into from
Jul 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/anchor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:

- name: Setup Anchor
if: steps.changes.outputs.anchor == 'true' || steps.changes.outputs.anchor_action == 'true' || github.event_name == 'schedule' || github.event_name == 'push'
uses: heyAyushh/setup-anchor@v3.12
uses: heyAyushh/setup-anchor@v4.0
with:
anchor-version: ${{ matrix.anchor-version }}
solana-cli-version: ${{ matrix.solana-version }}
Expand Down Expand Up @@ -154,13 +154,13 @@ jobs:
# Skip Installing and Displaying versions if theres no change in anchor programs or anchor action workflow file or isn't a schedule event
- name: Setup Anchor
if: steps.changes.outputs.anchor == 'true' || steps.changes.outputs.anchor_action == 'true' || github.event_name == 'schedule' || github.event_name == 'push'
uses: heyAyushh/setup-anchor@v3.12
uses: heyAyushh/setup-anchor@v4.0
with:
anchor-version: ${{ matrix.anchor-version }}
solana-cli-version: ${{ matrix.solana-version }}
node-version: ${{ matrix.node-version }}
- name: Display versions and Install pnpm
if: steps.changes.outputs.anchor == 'true' || steps.changes.outputs.anchor_action == 'true' || github.event_name == 'schedule'
if: steps.changes.outputs.anchor == 'true' || steps.changes.outputs.anchor_action == 'true' || github.event_name == 'schedule' || github.event_name == 'push'
run: |
solana -V
solana-keygen new --no-bip39-passphrase
Expand Down Expand Up @@ -201,7 +201,7 @@ jobs:
shell: bash
# Skip Testing all Programs if it's a CRON job or a change in the workflow file
- name: Test All Anchor Programs
if: github.event_name == 'schedule' || steps.changes.outputs.anchor_action == 'true'
if: github.event_name == 'schedule' || github.event_name == 'push' || steps.changes.outputs.anchor_action == 'true'
run: |
declare -a ProjectDirs=($(find . -type d -name "anchor"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
echo "Projects to Test:"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/solana-native.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
check-latest: true
- uses: heyAyushh/setup-solana@v5.2
- uses: heyAyushh/setup-solana@v5.4
with:
solana-cli-version: ${{ matrix.solana-version }}
- run: solana block
Expand Down Expand Up @@ -75,7 +75,7 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
check-latest: true
- uses: heyAyushh/setup-solana@v5.2
- uses: heyAyushh/setup-solana@v5.4
with:
solana-cli-version: ${{ matrix.solana-version }}
- run: solana block
Expand Down
224 changes: 78 additions & 146 deletions tokens/escrow/anchor/tests/escrow.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { randomBytes } from "node:crypto";
import * as anchor from "@coral-xyz/anchor";
import { BN, type Program } from "@coral-xyz/anchor";
import { randomBytes } from 'node:crypto';
import * as anchor from '@coral-xyz/anchor';
import { BN, type Program } from '@coral-xyz/anchor';
import {
MINT_SIZE,
TOKEN_2022_PROGRAM_ID,
Expand All @@ -10,27 +10,20 @@ import {
createMintToInstruction,
getAssociatedTokenAddressSync,
getMinimumBalanceForRentExemptMint,
} from "@solana/spl-token";
import {
LAMPORTS_PER_SOL,
PublicKey,
SystemProgram,
Transaction,
type TransactionInstruction,
} from "@solana/web3.js";
import { assert } from "chai";
import type { Escrow } from "../target/types/escrow";
} from '@solana/spl-token';
import { LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, type TransactionInstruction } from '@solana/web3.js';
import { assert } from 'chai';
import type { Escrow } from '../target/types/escrow';

import { confirmTransaction, makeKeypairs } from "@solana-developers/helpers";
import { confirmTransaction, makeKeypairs } from '@solana-developers/helpers';

const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID =
TOKEN_2022_PROGRAM_ID;
const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID = TOKEN_2022_PROGRAM_ID;

const getRandomBigNumber = (size = 8) => {
return new BN(randomBytes(size));
};

describe("escrow", async () => {
describe('escrow', async () => {
anchor.setProvider(anchor.AnchorProvider.env());

const provider = anchor.getProvider();
Expand All @@ -46,112 +39,66 @@ describe("escrow", async () => {

const [alice, bob, tokenMintA, tokenMintB] = makeKeypairs(4);

before(
"Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users",
async () => {
const [
aliceTokenAccountA,
aliceTokenAccountB,
bobTokenAccountA,
bobTokenAccountB,
] = [alice, bob].flatMap((keypair) =>
[tokenMintA, tokenMintB].map((mint) =>
getAssociatedTokenAddressSync(
mint.publicKey,
keypair.publicKey,
false,
TOKEN_PROGRAM
)
)
);

// Airdrops to users, and creates two tokens mints 'A' and 'B'"
const minimumLamports = await getMinimumBalanceForRentExemptMint(
connection
);

const sendSolInstructions: Array<TransactionInstruction> = [
alice,
bob,
].map((account) =>
SystemProgram.transfer({
fromPubkey: provider.publicKey,
toPubkey: account.publicKey,
lamports: 10 * LAMPORTS_PER_SOL,
})
);

const createMintInstructions: Array<TransactionInstruction> = [
tokenMintA,
tokenMintB,
].map((mint) =>
SystemProgram.createAccount({
fromPubkey: provider.publicKey,
newAccountPubkey: mint.publicKey,
lamports: minimumLamports,
space: MINT_SIZE,
programId: TOKEN_PROGRAM,
})
);

// Make tokenA and tokenB mints, mint tokens and create ATAs
const mintTokensInstructions: Array<TransactionInstruction> = [
{
mint: tokenMintA.publicKey,
authority: alice.publicKey,
ata: aliceTokenAccountA,
},
{
mint: tokenMintB.publicKey,
authority: bob.publicKey,
ata: bobTokenAccountB,
},
].flatMap((mintDetails) => [
createInitializeMint2Instruction(
mintDetails.mint,
6,
mintDetails.authority,
null,
TOKEN_PROGRAM
),
createAssociatedTokenAccountIdempotentInstruction(
provider.publicKey,
mintDetails.ata,
mintDetails.authority,
mintDetails.mint,
TOKEN_PROGRAM
),
createMintToInstruction(
mintDetails.mint,
mintDetails.ata,
mintDetails.authority,
1_000_000_000,
[],
TOKEN_PROGRAM
),
]);

// Add all these instructions to our transaction
const tx = new Transaction();
tx.instructions = [
...sendSolInstructions,
...createMintInstructions,
...mintTokensInstructions,
];

await provider.sendAndConfirm(tx, [tokenMintA, tokenMintB, alice, bob]);

// Save the accounts for later use
accounts.maker = alice.publicKey;
accounts.taker = bob.publicKey;
accounts.tokenMintA = tokenMintA.publicKey;
accounts.makerTokenAccountA = aliceTokenAccountA;
accounts.takerTokenAccountA = bobTokenAccountA;
accounts.tokenMintB = tokenMintB.publicKey;
accounts.makerTokenAccountB = aliceTokenAccountB;
accounts.takerTokenAccountB = bobTokenAccountB;
}
);
before('Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users', async () => {
const [aliceTokenAccountA, aliceTokenAccountB, bobTokenAccountA, bobTokenAccountB] = [alice, bob].flatMap((keypair) =>
[tokenMintA, tokenMintB].map((mint) => getAssociatedTokenAddressSync(mint.publicKey, keypair.publicKey, false, TOKEN_PROGRAM)),
);

// Airdrops to users, and creates two tokens mints 'A' and 'B'"
const minimumLamports = await getMinimumBalanceForRentExemptMint(connection);

const sendSolInstructions: Array<TransactionInstruction> = [alice, bob].map((account) =>
SystemProgram.transfer({
fromPubkey: provider.publicKey,
toPubkey: account.publicKey,
lamports: 10 * LAMPORTS_PER_SOL,
}),
);

const createMintInstructions: Array<TransactionInstruction> = [tokenMintA, tokenMintB].map((mint) =>
SystemProgram.createAccount({
fromPubkey: provider.publicKey,
newAccountPubkey: mint.publicKey,
lamports: minimumLamports,
space: MINT_SIZE,
programId: TOKEN_PROGRAM,
}),
);

// Make tokenA and tokenB mints, mint tokens and create ATAs
const mintTokensInstructions: Array<TransactionInstruction> = [
{
mint: tokenMintA.publicKey,
authority: alice.publicKey,
ata: aliceTokenAccountA,
},
{
mint: tokenMintB.publicKey,
authority: bob.publicKey,
ata: bobTokenAccountB,
},
].flatMap((mintDetails) => [
createInitializeMint2Instruction(mintDetails.mint, 6, mintDetails.authority, null, TOKEN_PROGRAM),
createAssociatedTokenAccountIdempotentInstruction(provider.publicKey, mintDetails.ata, mintDetails.authority, mintDetails.mint, TOKEN_PROGRAM),
createMintToInstruction(mintDetails.mint, mintDetails.ata, mintDetails.authority, 1_000_000_000, [], TOKEN_PROGRAM),
]);

// Add all these instructions to our transaction
const tx = new Transaction();
tx.instructions = [...sendSolInstructions, ...createMintInstructions, ...mintTokensInstructions];

await provider.sendAndConfirm(tx, [tokenMintA, tokenMintB, alice, bob]);

// Save the accounts for later use
accounts.maker = alice.publicKey;
accounts.taker = bob.publicKey;
accounts.tokenMintA = tokenMintA.publicKey;
accounts.makerTokenAccountA = aliceTokenAccountA;
accounts.takerTokenAccountA = bobTokenAccountA;
accounts.tokenMintB = tokenMintB.publicKey;
accounts.makerTokenAccountB = aliceTokenAccountB;
accounts.takerTokenAccountB = bobTokenAccountB;
});

const tokenAOfferedAmount = new BN(1_000_000);
const tokenBWantedAmount = new BN(1_000_000);
Expand All @@ -163,20 +110,11 @@ describe("escrow", async () => {

// 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
[Buffer.from('offer'), accounts.maker.toBuffer(), offerId.toArrayLike(Buffer, 'le', 8)],
program.programId,
)[0];

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

accounts.offer = offer;
accounts.vault = vault;
Expand Down Expand Up @@ -215,24 +153,18 @@ describe("escrow", async () => {

// 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
);
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
);
const aliceTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.makerTokenAccountB);
const aliceTokenAccountBalanceAfter = new BN(aliceTokenAccountBalanceAfterResponse.value.amount);
assert(aliceTokenAccountBalanceAfter.eq(tokenBWantedAmount));
};

it("Puts the tokens Alice offers into the vault when Alice makes an offer", async () => {
it('Puts the tokens Alice offers into the vault when Alice makes an offer', async () => {
await make();
});

Expand Down