From 3211b7524b1095a33e3613f27fe0eae773edbb80 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 26 Sep 2025 16:54:59 -0500 Subject: [PATCH 1/2] change script to test plasma --- gasless-v2-headless-example/bun.lockb | Bin 13622 -> 14866 bytes gasless-v2-headless-example/index.ts | 68 ++++++++++------------- gasless-v2-headless-example/package.json | 2 +- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/gasless-v2-headless-example/bun.lockb b/gasless-v2-headless-example/bun.lockb index b66aae2d99c3fcca81724ebec370526c38cdf247..df24e447c5ae45ed1ded32b6fa3a6bfd85e3a5f5 100755 GIT binary patch delta 4619 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 diff --git a/gasless-v2-headless-example/index.ts b/gasless-v2-headless-example/index.ts index 6acadb14..5e15855a 100644 --- a/gasless-v2-headless-example/index.ts +++ b/gasless-v2-headless-example/index.ts @@ -10,7 +10,7 @@ import { Hex, } from "viem"; import { privateKeyToAccount } from "viem/accounts"; -import { base } from "viem/chains"; +import { plasma } from "viem/chains"; import { wethAbi } from "./abi/weth-abi"; import { SignatureType, splitSignature } from "./utils/signature"; @@ -37,38 +37,37 @@ const headers = new Headers({ // setup wallet client const client = createWalletClient({ account: privateKeyToAccount(("0x" + PRIVATE_KEY) as `0x${string}`), - chain: base, + chain: plasma, transport: http(ALCHEMY_HTTP_TRANSPORT_URL), }).extend(publicActions); // extend wallet client with publicActions for public client // set up contracts -const usdc = getContract({ - address: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", +const usdt = getContract({ + address: "0xb8ce59fc3717ada4c02eadf9682a9e934f625ebb", abi: erc20Abi, client, }); -const weth = getContract({ - address: "0x4200000000000000000000000000000000000006", +const wxpl = getContract({ + address: "0x6100E367285b01F48D07953803A2d8dCA5D19873", abi: wethAbi, client, }); const main = async () => { // specify sell amount - // USDC supports gasless approvals because it is an ERC-20 that supports the Permit function - const sellAmount = parseUnits("0.1", await usdc.read.decimals()); + const sellAmount = 1_000_000_000_000_000_000; // 1. fetch price const priceParams = new URLSearchParams({ chainId: client.chain.id.toString(), - sellToken: usdc.address, - buyToken: weth.address, + sellToken: wxpl.address, + buyToken: usdt.address, sellAmount: sellAmount.toString(), }); const priceResponse = await fetch( - "http://api.0x.org/gasless/price?" + priceParams.toString(), + "http://staging.api.0x.org/gasless/price?" + priceParams.toString(), { headers, } @@ -77,7 +76,9 @@ const main = async () => { const price = await priceResponse.json(); console.log("Fetching price to swap 0.1 USDC for WETH with Gasless API"); console.log(); - console.log(`http://api.0x.org/gasless/price?${priceParams.toString()}`); + console.log( + `http://staging.api.0x.org/gasless/price?${priceParams.toString()}` + ); console.log(); console.log("🏷 priceResponse: ", price); console.log(); @@ -90,14 +91,14 @@ const main = async () => { quoteParams.append(key, value); const quoteResponse = await fetch( - "http://api.0x.org/gasless/quote?" + quoteParams.toString(), + "http://staging.api.0x.org/gasless/quote?" + quoteParams.toString(), { headers, } ); const quote = await quoteResponse.json(); - console.log("Fetching quote to swap 0.1 USDC for WETH with Gasless API"); + console.log("Fetching quote to swap 0.1 USDT for WXPL with Gasless API"); console.log(); console.log("💸 quoteResponse: ", quote); console.log(); @@ -176,23 +177,9 @@ const main = async () => { async function standardApproval(): Promise { if (quote.issues.allowance !== null) { - try { - const { request } = await usdc.simulate.approve([ - quote.issues.allowance.spender, - maxUint256, - ]); - console.log("Approving Permit2 to spend USDC...", request); - // set approval - const hash = await usdc.write.approve(request.args); - console.log( - "Approved Permit2 to spend USDC.", - await client.waitForTransactionReceipt({ hash }) - ); - } catch (error) { - console.log("Error approving Permit2:", error); - } + console.log("WXPL needs to be approved for Permit2"); } else { - console.log("USDC already approved for Permit2"); + console.log("WXPL already approved for Permit2"); } } @@ -239,14 +226,17 @@ const main = async () => { if (approvalDataToSubmit) { requestBody.approval = approvalDataToSubmit; } - const response = await fetch("https://api.0x.org/gasless/submit", { - method: "POST", - headers: { - "0x-api-key": process.env.ZERO_EX_API_KEY as string, - "Content-Type": "application/json", - }, - body: JSON.stringify(requestBody), - }); + const response = await fetch( + "https://staging.api.0x.org/gasless/submit", + { + method: "POST", + headers: { + "0x-api-key": process.env.ZERO_EX_API_KEY as string, + "Content-Type": "application/json", + }, + body: JSON.stringify(requestBody), + } + ); const data = await response.json(); successfulTradeHash = data.tradeHash; console.log("#️⃣ tradeHash: ", successfulTradeHash); @@ -259,7 +249,7 @@ const main = async () => { // 5. Check trade status async function fetchStatus(tradeHash: string) { const response = await fetch( - "http://api.0x.org/gasless/status/" + + "http://staging.api.0x.org/gasless/status/" + tradeHash + "?" + "chainId=" + diff --git a/gasless-v2-headless-example/package.json b/gasless-v2-headless-example/package.json index b673888e..ea633f30 100644 --- a/gasless-v2-headless-example/package.json +++ b/gasless-v2-headless-example/package.json @@ -12,6 +12,6 @@ "dependencies": { "dotenv": "^16.4.5", "qs": "^6.12.1", - "viem": "^2.16.2" + "viem": "^2.37.6" } } \ No newline at end of file From f94e7e5d3b343458c803147255a265bc6e6a3e84 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 30 Sep 2025 13:07:47 -0400 Subject: [PATCH 2/2] fix comment --- gasless-v2-headless-example/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gasless-v2-headless-example/index.ts b/gasless-v2-headless-example/index.ts index 5e15855a..595f4c25 100644 --- a/gasless-v2-headless-example/index.ts +++ b/gasless-v2-headless-example/index.ts @@ -74,7 +74,7 @@ const main = async () => { ); const price = await priceResponse.json(); - console.log("Fetching price to swap 0.1 USDC for WETH with Gasless API"); + console.log("Fetching price to swap 1 WXPL for USDT with Gasless API"); console.log(); console.log( `http://staging.api.0x.org/gasless/price?${priceParams.toString()}` @@ -98,7 +98,7 @@ const main = async () => { ); const quote = await quoteResponse.json(); - console.log("Fetching quote to swap 0.1 USDT for WXPL with Gasless API"); + console.log("Fetching quote to swap 1 WXPL for USDT with Gasless API"); console.log(); console.log("💸 quoteResponse: ", quote); console.log(); @@ -226,6 +226,7 @@ const main = async () => { if (approvalDataToSubmit) { requestBody.approval = approvalDataToSubmit; } + console.log(requestBody); const response = await fetch( "https://staging.api.0x.org/gasless/submit", { @@ -237,6 +238,7 @@ const main = async () => { body: JSON.stringify(requestBody), } ); + console.log(response); const data = await response.json(); successfulTradeHash = data.tradeHash; console.log("#️⃣ tradeHash: ", successfulTradeHash);