From 438acd5e299c4fca5474e9860f422bdefb7398ce Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Mon, 28 Jul 2025 17:55:48 +0530 Subject: [PATCH 1/5] Optimize getting parsed tx from tx hash --- .env.example | 5 +++-- src/app/api/registry/route.ts | 13 ++++++++++--- src/components/WalletProviders.tsx | 5 ++++- src/utils/solana-verify.ts | 25 +++++++++++-------------- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/.env.example b/.env.example index 5218f16..6fb7422 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,9 @@ # Client-side environment variables must be prefixed with NEXT_PUBLIC_ # Solana Payment Configuration -# TODO: Use different RPC URL -NEXT_PUBLIC_SOLANA_RPC_URL=https://skilled-prettiest-seed.solana-mainnet.quiknode.pro/eeecfebd04e345f69f1900cc3483cbbfea02a158 +# Run the solana proxy to setup RPC and WS URLs: https://git.vdb.to/LaconicNetwork/solana-proxy +NEXT_PUBLIC_SOLANA_RPC_URL= +NEXT_PUBLIC_SOLANA_WS_URL= NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS=71Jvq4Epe2FCJ7JFSF7jLXdNk1Wy4Bhqd9iL6bEFELvg NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL=GOR diff --git a/src/app/api/registry/route.ts b/src/app/api/registry/route.ts index 4d0c429..fe3abe7 100644 --- a/src/app/api/registry/route.ts +++ b/src/app/api/registry/route.ts @@ -3,7 +3,7 @@ import { NextRequest, NextResponse } from 'next/server'; import axios from 'axios'; import assert from 'assert'; -import { Connection } from '@solana/web3.js'; +import { Connection, ParsedTransactionWithMeta } from '@solana/web3.js'; import { verifyUnusedSolanaPayment } from '@/utils/solana-verify'; import { transferLNTTokens } from '@/services/laconic-transfer'; @@ -167,6 +167,7 @@ export async function POST(request: NextRequest) { // First check if the request body is valid JSON let url, txHash, senderPublicKey, paymentMethod; let connection: Connection; + let parsedTx: ParsedTransactionWithMeta | null; try { const body = await request.json(); @@ -186,6 +187,8 @@ export async function POST(request: NextRequest) { }, { status: 400 }); } + parsedTx = tx; + const signerKeys = tx.transaction.message.accountKeys .filter(k => k.signer) .map(k => k.pubkey.toBase58()); @@ -243,9 +246,13 @@ export async function POST(request: NextRequest) { const requiredAmountInBaseUnits = requiredTokenInfo.requiredAmountInBaseUnits; const expectedTokenAmount = Math.round(requiredAmountInBaseUnits - ALLOWED_SLIPPAGE_FACTOR * requiredAmountInBaseUnits); + if (!parsedTx) { + throw new Error(`Unable to find the tx with hash: ${txHash}`) + } + const solanaPaymentResult = await verifyUnusedSolanaPayment( connection, - txHash, + parsedTx, new BN(expectedTokenAmount), paymentMethod, ); @@ -516,4 +523,4 @@ export async function POST(request: NextRequest) { message: error instanceof Error ? error.message : 'Unknown error', }, { status: 500 }); } -} \ No newline at end of file +} diff --git a/src/components/WalletProviders.tsx b/src/components/WalletProviders.tsx index 11788eb..69b79d0 100644 --- a/src/components/WalletProviders.tsx +++ b/src/components/WalletProviders.tsx @@ -16,7 +16,10 @@ import { PaymentMethod } from '@/types'; import '@solana/wallet-adapter-react-ui/styles.css'; assert(process.env.NEXT_PUBLIC_SOLANA_RPC_URL, 'SOLANA_RPC_URL is required'); +assert(process.env.NEXT_PUBLIC_SOLANA_WS_URL, 'SOLANA_WS_URL is required'); + const SOLANA_RPC_URL = process.env.NEXT_PUBLIC_SOLANA_RPC_URL; +const SOLANA_WS_URL = process.env.NEXT_PUBLIC_SOLANA_WS_URL; interface WalletProvidersProps { children: React.ReactNode; @@ -59,7 +62,7 @@ export default function WalletProviders({ children }: WalletProvidersProps) { }, [allWallets, selectedPaymentMethod]); return ( - + {children} diff --git a/src/utils/solana-verify.ts b/src/utils/solana-verify.ts index 0e627dd..898960c 100644 --- a/src/utils/solana-verify.ts +++ b/src/utils/solana-verify.ts @@ -1,6 +1,6 @@ import BN from 'bn.js'; -import { Connection, ParsedInstruction, PartiallyDecodedInstruction } from '@solana/web3.js'; +import { Connection, ParsedInstruction, ParsedTransactionWithMeta, PartiallyDecodedInstruction } from '@solana/web3.js'; import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; import { getRecipientAddress } from '@/services/solana'; @@ -9,12 +9,11 @@ import { PaymentMethod } from '../types'; // Extract transaction info for native GOR transfers const extractTxInfo = async ( connection: Connection, - transactionSignature: string, + parsedTx: ParsedTransactionWithMeta, paymentMethod: PaymentMethod ): Promise<{ authority: string; amount: string; destination: string }> => { - const result = await connection.getParsedTransaction(transactionSignature, 'confirmed'); - if (!result) { + if (!parsedTx) { throw new Error('Transaction not found'); } @@ -23,7 +22,7 @@ const extractTxInfo = async ( switch (paymentMethod) { case PaymentMethod.NAT_GOR: // Look for system program transfer instruction - transferInstruction = result.transaction.message.instructions.find( + transferInstruction = parsedTx.transaction.message.instructions.find( (instr) => 'parsed' in instr && instr.parsed.type === 'transfer' ); @@ -36,7 +35,7 @@ const extractTxInfo = async ( case PaymentMethod.SPL_TOKEN: // Look for token transfer instruction using TOKEN_PROGRAM_ID - transferInstruction = result.transaction.message.instructions.find( + transferInstruction = parsedTx.transaction.message.instructions.find( (instr) => 'parsed' in instr && instr.programId.equals(TOKEN_PROGRAM_ID) ); @@ -68,7 +67,7 @@ const extractTxInfo = async ( export const verifyUnusedSolanaPayment = async ( connection: Connection, - transactionSignature: string, + parsedTx: ParsedTransactionWithMeta, expectedAmount: BN, paymentMethod: PaymentMethod, ): Promise<{ @@ -81,9 +80,7 @@ export const verifyUnusedSolanaPayment = async ( // TODO: Check if provided signature is already used // Fetch transaction details - const transactionResult = await connection.getParsedTransaction(transactionSignature, 'confirmed'); - - if (!transactionResult) { + if (!parsedTx) { return { valid: false, reason: 'Transaction not found on Solana blockchain' @@ -91,15 +88,15 @@ export const verifyUnusedSolanaPayment = async ( } // Check if transaction was successful - if (transactionResult.meta?.err) { + if (parsedTx.meta?.err) { return { valid: false, - reason: `Transaction failed: ${JSON.stringify(transactionResult.meta.err)}` + reason: `Transaction failed: ${JSON.stringify(parsedTx.meta.err)}` }; } // Check transaction timestamp (5-minute window) - const txTimestamp = transactionResult.blockTime ? new Date(transactionResult.blockTime * 1000) : null; + const txTimestamp = parsedTx.blockTime ? new Date(parsedTx.blockTime * 1000) : null; if (!txTimestamp) { return { valid: false, @@ -119,7 +116,7 @@ export const verifyUnusedSolanaPayment = async ( } // Extract transaction info based on payment method - const transferInfo = await extractTxInfo(connection, transactionSignature, paymentMethod); + const transferInfo = await extractTxInfo(connection, parsedTx, paymentMethod); const amount = transferInfo.amount; const authority = transferInfo.authority; const destination = transferInfo.destination; -- 2.45.2 From b9f009072eec9b39f823c65cb4d59a4ced2316ed Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Tue, 29 Jul 2025 11:28:15 +0530 Subject: [PATCH 2/5] Reset state variables on switching wallets --- src/app/page.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 046f55b..f5af397 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -71,15 +71,15 @@ export default function Home() { try { // @ts-expect-error: backpack exists on window object const genesisHash = await window.backpack.solana.connection.getGenesisHash(); - + const expectedGenesisHash = selectedPaymentMethod === PaymentMethod.NAT_GOR ? GORBAGANA_GENESIS_HASH : SOLANA_GENESIS_HASH; - + const expectedChainName = selectedPaymentMethod === PaymentMethod.NAT_GOR ? "Gorbagana" : "Solana"; - + if (genesisHash !== expectedGenesisHash) { setIncorrectChainWarning( `Unsupported network selected in wallet. Please switch to network for ${expectedChainName} chain and reconnect the wallet.` -- 2.45.2 From 1f90dea1f895daa527df9208fcc1b3bc08858ec3 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Wed, 30 Jul 2025 11:36:43 +0530 Subject: [PATCH 3/5] Update package lock file --- package-lock.json | 251 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 243 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe3efda..47b7288 100644 --- a/package-lock.json +++ b/package-lock.json @@ -516,6 +516,74 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@cerc-io/laconic-registry-cli": { "version": "0.2.10", "resolved": "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Flaconic-registry-cli/-/0.2.10/laconic-registry-cli-0.2.10.tgz", @@ -5152,11 +5220,17 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "license": "MIT", + "peer": true + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6768,12 +6842,18 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT", + "peer": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -7605,6 +7685,16 @@ "node": ">= 6" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -7677,11 +7767,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -8343,7 +8442,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10794,6 +10892,124 @@ "node": ">=10.13.0" } }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -11111,12 +11327,17 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -11922,7 +12143,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -11937,7 +12157,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/string.prototype.includes": { @@ -12051,7 +12270,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -12513,6 +12731,16 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unrs-resolver": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", @@ -12860,6 +13088,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC", + "peer": true + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", -- 2.45.2 From c104bed90c665a3d5db7612b274b04b7afe96dc6 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Fri, 1 Aug 2025 10:12:52 +0530 Subject: [PATCH 4/5] Add Gorbagana chain ID to application deployment request record --- src/app/api/registry/route.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/api/registry/route.ts b/src/app/api/registry/route.ts index fe3abe7..174992a 100644 --- a/src/app/api/registry/route.ts +++ b/src/app/api/registry/route.ts @@ -25,6 +25,7 @@ const ALLOWED_SLIPPAGE_FACTOR = 0.2 // Use CAIP convention for chain ID: namespace + reference const SOLANA_CHAIN_ID = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'; // Solana mainnet +const GORBAGANA_CHAIN_ID = 'gorbagana:533uBE9RRquhTBqEX58oV52FdTTsReMd' // Gorbagana chain (first 32 characters of gorbagana genesis hash. Following solana CAIP chain ID pattern) // Sleep helper function const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); @@ -464,7 +465,7 @@ export async function POST(request: NextRequest) { repository_ref: fullHash, }, external_payment: { - chain_id: SOLANA_CHAIN_ID, + chain_id: paymentMethod === PaymentMethod.SPL_TOKEN ? SOLANA_CHAIN_ID : GORBAGANA_CHAIN_ID, tx_hash: txHash, pubkey: senderPublicKey }, -- 2.45.2 From a13b9d8c2ca6c7d735a426b22b36ade8be8e5847 Mon Sep 17 00:00:00 2001 From: Shreerang Kale Date: Fri, 1 Aug 2025 14:29:24 +0530 Subject: [PATCH 5/5] Add WS endpoint detail to deploy readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 135e5b8..8cea6c8 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Required environment variables: Client-side (must be prefixed with NEXT_PUBLIC_): - `NEXT_PUBLIC_SOLANA_RPC_URL` - The RPC URL for the Solana blockchain (SPL token transactions) +- `NEXT_PUBLIC_SOLANA_WS_URL` - The WS URL for the Solana blockchain (SPL token transactions) - `NEXT_PUBLIC_SOLANA_TOKEN_MINT_ADDRESS` - The mint address of the SPL token to accept - `NEXT_PUBLIC_SOLANA_TOKEN_SYMBOL` - The token symbol to display (e.g., "GOR") - `NEXT_PUBLIC_GORBAGANA_RPC_URL` - The RPC URL for the Gorbagana blockchain (native GOR transactions) -- 2.45.2