Skip to content
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
15 changes: 11 additions & 4 deletions tests/govtool-frontend/playwright/lib/helpers/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { importWallet } from "@fixtures/importWallet";
import { valid as mockValid } from "@mock/index";
import LoginPage from "@pages/loginPage";
import ProposalDiscussionPage from "@pages/proposalDiscussionPage";
import { BrowserContext, Page } from "@playwright/test";
import { BrowserContext, expect, Page } from "@playwright/test";
import { ProposalType, StaticWallet } from "@types";
import { ShelleyWallet } from "./crypto";
import convertBufferToHex from "./convertBufferToHex";
Expand Down Expand Up @@ -57,9 +57,16 @@ export async function createAuthWithUserName({

const proposalDiscussionPage = new ProposalDiscussionPage(page);
await proposalDiscussionPage.goto();
await proposalDiscussionPage.verifyIdentityBtn.click({ timeout: 15_000 });

await proposalDiscussionPage.setUsername(mockValid.username());
await proposalDiscussionPage.verifyIdentityBtn.click({ timeout: 60_000 });
try {
await expect(page.getByTestId("username-input")).toBeVisible({
timeout: 10_000,
});
await proposalDiscussionPage.setUsername(mockValid.username());
} catch (error) {
// Ignore error if username is already set
console.log("Username is already set");
}

await context.storageState({ path: auth });
}
Expand Down
24 changes: 12 additions & 12 deletions tests/govtool-frontend/playwright/lib/helpers/crypto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@ import environments from "../constants/environments";
import { ed25519 as ed } from "@noble/curves/ed25519";
import { bech32 } from "bech32";
import * as blake from "blakejs";
import { rewardAddressBech32, rewardAddressRawBytes } from "./shellyWallet";
import {
addressBech32,
addressRawBytes,
rewardAddressBech32,
rewardAddressRawBytes,
} from "./shellyWallet";

const KEY_HASH_LENGTH = 28;
const ADDR_LENGTH = KEY_HASH_LENGTH * 2 + 1;
Expand Down Expand Up @@ -103,20 +108,15 @@ export class ShelleyWallet {
}

addressBech32(networkId: number): string {
const prefix = networkId == 0 ? "addr_test" : "addr";
return bech32.encode(
prefix,
bech32.toWords(Buffer.from(this.addressRawBytes(networkId))),
200
);
const stakePkh = Buffer.from(this.stakeKey.pkh).toString("hex");
const paymentPkh = Buffer.from(this.paymentKey.pkh).toString("hex");
return addressBech32(networkId, paymentPkh, stakePkh);
}

addressRawBytes(networkId) {
const concatenatedArray1 = new Uint8Array(ADDR_LENGTH);
concatenatedArray1[0] = networkId;
concatenatedArray1.set(this.paymentKey.pkh, 1);
concatenatedArray1.set(this.stakeKey.pkh, KEY_HASH_LENGTH + 1);
return concatenatedArray1;
const stakePkh = Buffer.from(this.stakeKey.pkh).toString("hex");
const paymentPkh = Buffer.from(this.paymentKey.pkh).toString("hex");
return addressRawBytes(networkId, paymentPkh, stakePkh);
}

rewardAddressRawBytes(network: number) {
Expand Down
32 changes: 32 additions & 0 deletions tests/govtool-frontend/playwright/lib/helpers/shellyWallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import { bech32 } from "bech32";
import { blake2bHex } from "blakejs";
import convertBufferToHex from "./convertBufferToHex";
import { ShelleyWallet } from "./crypto";

const KEY_HASH_LENGTH = 28;
const ADDR_LENGTH = KEY_HASH_LENGTH * 2 + 1;

export default function extractDRepFromWallet(wallet: ShelleyWallet) {
const dRepPubKey = convertBufferToHex(wallet.dRepKey.public);
Expand Down Expand Up @@ -36,6 +38,36 @@ export function rewardAddressBech32(
);
}

export function addressBech32(
networkId: number,
paymentPkh: string,
stakePkh: string
): string {
const prefix = networkId == 0 ? "addr_test" : "addr";
return bech32.encode(
prefix,
bech32.toWords(
Buffer.from(addressRawBytes(networkId, paymentPkh, stakePkh))
),
200
);
}

export function addressRawBytes(
networkId: number,
paymentPkh: string,
stakePkh: string
) {
const concatenatedArray1 = new Uint8Array(ADDR_LENGTH);
concatenatedArray1[0] = networkId;
concatenatedArray1.set(Uint8Array.from(Buffer.from(paymentPkh, "hex")), 1);
concatenatedArray1.set(
Uint8Array.from(Buffer.from(stakePkh, "hex")),
KEY_HASH_LENGTH + 1
);
return concatenatedArray1;
}

export async function generateWallets(num: number) {
return await Promise.all(
Array.from({ length: num }, () =>
Expand Down
8 changes: 4 additions & 4 deletions tests/govtool-frontend/playwright/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion tests/govtool-frontend/playwright/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"generate-faucet-wallet": "ts-node ./generate_faucet_wallet.ts"
},
"dependencies": {
"@cardanoapi/cardano-test-wallet": "^3.3.1",
"@cardanoapi/cardano-test-wallet": "^3.3.2",
"@faker-js/faker": "^8.4.1",
"@noble/curves": "^1.3.0",
"@noble/ed25519": "^2.0.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,6 @@ Object.values(ProposalType).forEach((proposalType, index) => {

const wallet = await walletManager.popWallet("proposalSubmission");

const stakeKeys = await createKeyFromPrivateKeyHex(
environments.faucet.stake.private || ""
);
const { pkh: stakePkh, public: stakePublic } = stakeKeys.json();
wallet.stake.pkh = stakePkh;
wallet.stake.private = getWalletConfigForFaucet().stake.private;
wallet.stake.public = stakePublic;

await logWalletDetails(wallet.address);

const tempUserAuth = await createTempUserAuth(page, wallet);
Expand Down Expand Up @@ -73,7 +65,10 @@ Object.values(ProposalType).forEach((proposalType, index) => {
await proposalSubmissionPage.proposalCreateBtn.click();
await proposalDiscussionPage.continueBtn.click();

const rewardAddress = rewardAddressBech32(environments.networkId, stakePkh);
const rewardAddress = rewardAddressBech32(
environments.networkId,
wallet.stake.pkh
);

await proposalSubmissionPage.createProposal(rewardAddress, proposalType);

Expand Down
39 changes: 29 additions & 10 deletions tests/govtool-frontend/playwright/tests/proposal.setup.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import environments from "@constants/environments";
import { setAllureEpic, setAllureStory } from "@helpers/allure";
import { skipIfBalanceIsInsufficient, skipIfMainnet } from "@helpers/cardano";
import { generateWallets } from "@helpers/shellyWallet";
import { addressBech32, generateWallets } from "@helpers/shellyWallet";
import { pollTransaction } from "@helpers/transaction";
import { test as setup } from "@fixtures/walletExtension";
import kuberService from "@services/kuberService";
import walletManager from "lib/walletManager";
import { functionWaitedAssert } from "@helpers/waitedLoop";
import { getWalletConfigForFaucet } from "@helpers/index";
import { createKeyFromPrivateKeyHex } from "@helpers/crypto";

const PROPOSAL_WALLETS_COUNT = environments.isScheduled ? 1 : 5;

Expand All @@ -33,20 +34,38 @@ setup.beforeEach(async () => {
});

setup("Setup temporary proposal wallets", async () => {
setup.setTimeout(2 * environments.txTimeOut);
setup.setTimeout(environments.txTimeOut);

const proposalWallets = await generateWallets(PROPOSAL_WALLETS_COUNT);

// initialize wallets
const initializeRes = await kuberService.initializeWallets(
[...proposalWallets],
getWalletConfigForFaucet().address,
getWalletConfigForFaucet().payment.private
const stakeKeys = await createKeyFromPrivateKeyHex(
environments.faucet.stake.private || ""
);
await pollTransaction(initializeRes.txId, initializeRes.lockInfo);
const { pkh: stakePkh, public: stakePublic } = stakeKeys.json();

const enrichedProposalWallets = proposalWallets.map((wallet) => {
const stake = {
pkh: stakePkh,
private: environments.faucet.stake.private,
public: stakePublic,
};

const walletAddress = addressBech32(
environments.networkId,
wallet.payment.pkh,
stakePkh
);

return {
...wallet,
address: walletAddress,
stake,
};
});

proposalWallets.splice(0, proposalWallets.length, ...enrichedProposalWallets);

const amountOutputs = proposalWallets.map((wallet) => {
return { address: wallet.address, value: govActionDeposit };
return { address: wallet.address, value: govActionDeposit + 22000000 };
});
const transferRes = await kuberService.multipleTransferADA(
amountOutputs,
Expand Down
Loading