Skip to content

Commit

Permalink
add interact with contract flow
Browse files Browse the repository at this point in the history
  • Loading branch information
iossocket committed Feb 19, 2025
1 parent b29ea26 commit 94d87bf
Show file tree
Hide file tree
Showing 8 changed files with 349 additions and 8 deletions.
261 changes: 260 additions & 1 deletion packages/nextjs/contracts/deployedContracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,265 @@
* You should not edit it manually or your changes might be overwritten.
*/

const deployedContracts = {} as const;
const deployedContracts = {
devnet: {
YourContract: {
address:
"0x6d94fef7ab42b1acb2683cdddbfc3fd17953d2d5d48576296c66dbe012d80c9",
abi: [
{
type: "impl",
name: "YourContractImpl",
interface_name: "contracts::YourContract::IYourContract",
},
{
type: "struct",
name: "core::byte_array::ByteArray",
members: [
{
name: "data",
type: "core::array::Array::<core::bytes_31::bytes31>",
},
{
name: "pending_word",
type: "core::felt252",
},
{
name: "pending_word_len",
type: "core::integer::u32",
},
],
},
{
type: "struct",
name: "core::integer::u256",
members: [
{
name: "low",
type: "core::integer::u128",
},
{
name: "high",
type: "core::integer::u128",
},
],
},
{
type: "enum",
name: "core::bool",
variants: [
{
name: "False",
type: "()",
},
{
name: "True",
type: "()",
},
],
},
{
type: "interface",
name: "contracts::YourContract::IYourContract",
items: [
{
type: "function",
name: "greeting",
inputs: [],
outputs: [
{
type: "core::byte_array::ByteArray",
},
],
state_mutability: "view",
},
{
type: "function",
name: "set_greeting",
inputs: [
{
name: "new_greeting",
type: "core::byte_array::ByteArray",
},
{
name: "amount_eth",
type: "core::integer::u256",
},
],
outputs: [],
state_mutability: "external",
},
{
type: "function",
name: "withdraw",
inputs: [],
outputs: [],
state_mutability: "external",
},
{
type: "function",
name: "premium",
inputs: [],
outputs: [
{
type: "core::bool",
},
],
state_mutability: "view",
},
],
},
{
type: "impl",
name: "OwnableImpl",
interface_name: "openzeppelin_access::ownable::interface::IOwnable",
},
{
type: "interface",
name: "openzeppelin_access::ownable::interface::IOwnable",
items: [
{
type: "function",
name: "owner",
inputs: [],
outputs: [
{
type: "core::starknet::contract_address::ContractAddress",
},
],
state_mutability: "view",
},
{
type: "function",
name: "transfer_ownership",
inputs: [
{
name: "new_owner",
type: "core::starknet::contract_address::ContractAddress",
},
],
outputs: [],
state_mutability: "external",
},
{
type: "function",
name: "renounce_ownership",
inputs: [],
outputs: [],
state_mutability: "external",
},
],
},
{
type: "constructor",
name: "constructor",
inputs: [
{
name: "owner",
type: "core::starknet::contract_address::ContractAddress",
},
],
},
{
type: "event",
name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred",
kind: "struct",
members: [
{
name: "previous_owner",
type: "core::starknet::contract_address::ContractAddress",
kind: "key",
},
{
name: "new_owner",
type: "core::starknet::contract_address::ContractAddress",
kind: "key",
},
],
},
{
type: "event",
name: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted",
kind: "struct",
members: [
{
name: "previous_owner",
type: "core::starknet::contract_address::ContractAddress",
kind: "key",
},
{
name: "new_owner",
type: "core::starknet::contract_address::ContractAddress",
kind: "key",
},
],
},
{
type: "event",
name: "openzeppelin_access::ownable::ownable::OwnableComponent::Event",
kind: "enum",
variants: [
{
name: "OwnershipTransferred",
type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferred",
kind: "nested",
},
{
name: "OwnershipTransferStarted",
type: "openzeppelin_access::ownable::ownable::OwnableComponent::OwnershipTransferStarted",
kind: "nested",
},
],
},
{
type: "event",
name: "contracts::YourContract::YourContract::GreetingChanged",
kind: "struct",
members: [
{
name: "greeting_setter",
type: "core::starknet::contract_address::ContractAddress",
kind: "key",
},
{
name: "new_greeting",
type: "core::byte_array::ByteArray",
kind: "key",
},
{
name: "premium",
type: "core::bool",
kind: "data",
},
{
name: "value",
type: "core::integer::u256",
kind: "data",
},
],
},
{
type: "event",
name: "contracts::YourContract::YourContract::Event",
kind: "enum",
variants: [
{
name: "OwnableEvent",
type: "openzeppelin_access::ownable::ownable::OwnableComponent::Event",
kind: "flat",
},
{
name: "GreetingChanged",
type: "contracts::YourContract::YourContract::GreetingChanged",
kind: "nested",
},
],
},
],
classHash:
"0x4e881db1286914119f2c900d19ab8fea1811614fdfa86d5f7539f7bc1c83e9c",
},
},
} as const;

export default deployedContracts;
8 changes: 4 additions & 4 deletions packages/snfoundry/contracts/Scarb.lock
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@ checksum = "sha256:44f32d242af1e43982decc49c563e613a9b67ade552f5c3d5cde504e92f74

[[package]]
name = "snforge_scarb_plugin"
version = "0.34.0"
version = "0.35.1"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:56f2b06ff2f0d8bbdfb7fb6c211fba7e4da6e5334ea70ba849af329a739faf11"
checksum = "sha256:1b6d50abc7f306a06abf90649bcd60a3bc1cdf6d0dc21a9725c71b014a334bab"

[[package]]
name = "snforge_std"
version = "0.34.0"
version = "0.35.1"
source = "registry+https://scarbs.xyz/"
checksum = "sha256:bd20964bde07e6fd0f7adb50d41216f05d66abd422ed82241030369333385876"
checksum = "sha256:e25cbeb9cbed6da8e14ab19ad0e7c1d888055dfee62978a845ce669cfaba5d93"
dependencies = [
"snforge_scarb_plugin",
]
30 changes: 30 additions & 0 deletions ui-automation/tests/debug.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import endpoint from "./configTypes";
import { test, expect } from "@playwright/test";
import { navigateAndWait } from "./utils/navigate";
import { HomePage } from "./pages/HomePage";
import { DebugPage } from "./pages/DebugPage";

test("interact with contract", async ({ page }) => {
await navigateAndWait(page, endpoint.BASE_URL);
const homePage = new HomePage(page);
await homePage.getDebugPageLinkButton().click();

await expect(page.getByText("YourContract")).toBeVisible();

const debugPage = new DebugPage(page);
await debugPage.connectWallet("0x64b4...5691");

const writeTab = await debugPage.getWriteTab();
await writeTab.click();

const withdrawSection = page.locator("div.py-5", {
has: page.locator("p.text-function", { hasText: "withdraw" }),
});
const sendButton = withdrawSection.locator("button", { hasText: "Send 💸" });
await sendButton.click();

const transactionReceipt = withdrawSection.locator("strong", {
hasText: "Transaction Receipt",
});
await expect(transactionReceipt).toBeVisible();
});
2 changes: 1 addition & 1 deletion ui-automation/tests/home.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import endpoint from "./configTypes";
import { test, expect } from "@playwright/test";
import { HomePage } from "./HomePage";
import { HomePage } from "./pages/HomePage";

test("Expect to connect to devnet with Burner Wallet", async ({ page }) => {
// Go to the Droplets product page of DigitalOcean web page
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Page } from "playwright";

export class HomePage {
private page: Page;
export class BasePage {
protected page: Page;
constructor(page: Page) {
this.page = page;
}
Expand All @@ -19,4 +19,16 @@ export class HomePage {
getAccountButton(account: string) {
return this.page.locator(`button:has-text("${account}")`);
}

async connectWallet(account: string) {
const connectButton = await this.getConnectButton();
await connectButton.click();

await this.getConnecterButton("Burner Wallet").click();

const button = this.getAccountButton(account);
await button.scrollIntoViewIfNeeded();
await this.page.waitForTimeout(500);
await button.click({ force: true, timeout: 5000 });
}
}
16 changes: 16 additions & 0 deletions ui-automation/tests/pages/DebugPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Page } from "playwright";
import { BasePage } from "./BasePage";

export class DebugPage extends BasePage {
constructor(page: Page) {
super(page);
}

getWriteTab() {
return this.page
.locator('div:not([class*="hidden"]) .tabs a.tab', {
hasText: "Write",
})
.first();
}
}
15 changes: 15 additions & 0 deletions ui-automation/tests/pages/HomePage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Page } from "playwright";
import { BasePage } from "./BasePage";

export class HomePage extends BasePage {
constructor(page: Page) {
super(page);
}

getDebugPageLinkButton() {
return this.page.locator("a", {
hasText: "Debug Contracts",
has: this.page.locator("svg"),
});
}
}
9 changes: 9 additions & 0 deletions ui-automation/tests/utils/navigate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Page } from "@playwright/test";

export async function navigateAndWait(page: Page, url: string) {
await page.goto(url);
await Promise.all([
page.waitForLoadState("domcontentloaded"),
page.waitForLoadState("networkidle"),
]);
}

0 comments on commit 94d87bf

Please sign in to comment.