From 4e4ace6dc910625882fb19dad0ad8f12941fd0f9 Mon Sep 17 00:00:00 2001 From: mfbz Date: Wed, 21 May 2025 12:06:19 +0200 Subject: [PATCH 1/4] Refactored app-utils folder --- ...er-sig.test.js => verify-user-sig.test.ts} | 2 +- .../src/app-utils/{index.js => index.ts} | 2 +- ...ify-signatures.js => verify-signatures.ts} | 67 +++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) rename packages/fcl-core/src/app-utils/__tests__/{verify-user-sig.test.js => verify-user-sig.test.ts} (94%) rename packages/fcl-core/src/app-utils/{index.js => index.ts} (80%) rename packages/fcl-core/src/app-utils/{verify-signatures.js => verify-signatures.ts} (79%) diff --git a/packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.js b/packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.ts similarity index 94% rename from packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.js rename to packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.ts index d5a6376fa..855ef935b 100644 --- a/packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.js +++ b/packages/fcl-core/src/app-utils/__tests__/verify-user-sig.test.ts @@ -43,7 +43,7 @@ describe("verifyUserSignatures", () => { it("should reject if missing array of composite signatures", async () => { expect.assertions(1) - await expect(verifyUserSignatures(message, null)).rejects.toThrow(Error) + await expect(verifyUserSignatures(message, [])).rejects.toThrow(Error) }) it("should reject if compSigs are from different account addresses", async () => { diff --git a/packages/fcl-core/src/app-utils/index.js b/packages/fcl-core/src/app-utils/index.ts similarity index 80% rename from packages/fcl-core/src/app-utils/index.js rename to packages/fcl-core/src/app-utils/index.ts index ddd4f6784..c9991c130 100644 --- a/packages/fcl-core/src/app-utils/index.js +++ b/packages/fcl-core/src/app-utils/index.ts @@ -1 +1 @@ -export {verifyAccountProof, verifyUserSignatures} from "./verify-signatures.js" +export {verifyAccountProof, verifyUserSignatures} from "./verify-signatures" diff --git a/packages/fcl-core/src/app-utils/verify-signatures.js b/packages/fcl-core/src/app-utils/verify-signatures.ts similarity index 79% rename from packages/fcl-core/src/app-utils/verify-signatures.js rename to packages/fcl-core/src/app-utils/verify-signatures.ts index 68ec9f5af..a41d05c07 100644 --- a/packages/fcl-core/src/app-utils/verify-signatures.js +++ b/packages/fcl-core/src/app-utils/verify-signatures.ts @@ -4,11 +4,31 @@ import {query} from "../exec/query" import {encodeAccountProof} from "../wallet-utils" import {isString} from "../utils/is" import {getChainId} from "../utils" +import {CompositeSignature} from "@onflow/typedefs" + +export interface AccountProofData { + address: string + nonce: string + signatures: CompositeSignature[] +} + +export interface VerifySignaturesScriptOptions { + fclCryptoContract?: string +} + +export interface ValidateArgsInput { + appIdentifier?: string + address?: string + nonce?: string + signatures?: CompositeSignature[] + message?: string + compSigs?: CompositeSignature[] +} const ACCOUNT_PROOF = "ACCOUNT_PROOF" const USER_SIGNATURE = "USER_SIGNATURE" -export const validateArgs = args => { +export const validateArgs = (args: ValidateArgsInput): boolean => { if (args.appIdentifier) { const {appIdentifier, address, nonce, signatures} = args invariant( @@ -16,10 +36,10 @@ export const validateArgs = args => { "verifyAccountProof({ appIdentifier }) -- appIdentifier must be a string" ) invariant( - isString(address) && sansPrefix(address).length === 16, + isString(address) && sansPrefix(address!).length === 16, "verifyAccountProof({ address }) -- address must be a valid address" ) - invariant(/^[0-9a-f]+$/i.test(nonce), "nonce must be a hex string") + invariant(/^[0-9a-f]+$/i.test(nonce!), "nonce must be a hex string") invariant( Array.isArray(signatures) && signatures.every((sig, i, arr) => sig.f_type === "CompositeSignature"), @@ -33,11 +53,11 @@ export const validateArgs = args => { } else { const {message, address, compSigs} = args invariant( - /^[0-9a-f]+$/i.test(message), + /^[0-9a-f]+$/i.test(message!), "Signed message must be a hex string" ) invariant( - isString(address) && sansPrefix(address).length === 16, + isString(address) && sansPrefix(address!).length === 16, "verifyUserSignatures({ address }) -- address must be a valid address" ) invariant( @@ -55,15 +75,18 @@ export const validateArgs = args => { // TODO: pass in option for contract but we're connected to testnet // log address + network -> in sync? -const getVerifySignaturesScript = async (sig, opts) => { +const getVerifySignaturesScript = async ( + sig: string, + opts: VerifySignaturesScriptOptions +): Promise => { const verifyFunction = sig === "ACCOUNT_PROOF" ? "verifyAccountProofSignatures" : "verifyUserSignatures" - let network = await getChainId(opts) + const network = await getChainId(opts) - const contractAddresses = { + const contractAddresses: any = { testnet: "0x74daa6f9c7ef24b1", mainnet: "0xb4b82a1c9d21d284", previewnet: "0x40b5b8b2ce81ea4a", @@ -71,7 +94,7 @@ const getVerifySignaturesScript = async (sig, opts) => { const fclCryptoContract = opts.fclCryptoContract || contractAddresses[network] invariant( - fclCryptoContract, + fclCryptoContract as any, `${verifyFunction}({ fclCryptoContract }) -- FCLCrypto contract address is unknown for network: ${network}. Please manually specify the FCLCrypto contract address.` ) @@ -117,15 +140,15 @@ const getVerifySignaturesScript = async (sig, opts) => { * ) */ export async function verifyAccountProof( - appIdentifier, - {address, nonce, signatures}, - opts = {} -) { + appIdentifier: string, + {address, nonce, signatures}: AccountProofData, + opts: VerifySignaturesScriptOptions = {} +): Promise { validateArgs({appIdentifier, address, nonce, signatures}) const message = encodeAccountProof({address, nonce, appIdentifier}, false) - let signaturesArr = [] - let keyIndices = [] + const signaturesArr: string[] = [] + const keyIndices: string[] = [] for (const el of signatures) { signaturesArr.push(el.signature) @@ -134,7 +157,7 @@ export async function verifyAccountProof( return query({ cadence: await getVerifySignaturesScript(ACCOUNT_PROOF, opts), - args: (arg, t) => [ + args: (arg: any, t: any) => [ arg(withPrefix(address), t.Address), arg(message, t.String), arg(keyIndices, t.Array(t.Int)), @@ -164,12 +187,16 @@ export async function verifyAccountProof( * {fclCryptoContract} * ) */ -export async function verifyUserSignatures(message, compSigs, opts = {}) { +export async function verifyUserSignatures( + message: string, + compSigs: CompositeSignature[], + opts: VerifySignaturesScriptOptions = {} +): Promise { const address = withPrefix(compSigs[0].addr) validateArgs({message, address, compSigs}) - let signaturesArr = [] - let keyIndices = [] + const signaturesArr: string[] = [] + const keyIndices: string[] = [] for (const el of compSigs) { signaturesArr.push(el.signature) @@ -178,7 +205,7 @@ export async function verifyUserSignatures(message, compSigs, opts = {}) { return query({ cadence: await getVerifySignaturesScript(USER_SIGNATURE, opts), - args: (arg, t) => [ + args: (arg: any, t: any) => [ arg(address, t.Address), arg(message, t.String), arg(keyIndices, t.Array(t.Int)), From 23d2c158921c6b2f3759b788624491b86261e2a4 Mon Sep 17 00:00:00 2001 From: mfbz Date: Wed, 21 May 2025 12:10:56 +0200 Subject: [PATCH 2/4] Added new types export --- packages/fcl-core/src/fcl-core.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/fcl-core/src/fcl-core.ts b/packages/fcl-core/src/fcl-core.ts index 43bc94674..d44e5ba66 100644 --- a/packages/fcl-core/src/fcl-core.ts +++ b/packages/fcl-core/src/fcl-core.ts @@ -103,3 +103,9 @@ export { export {execStrategy} from "./current-user/exec-service" export type {StorageProvider} from "./utils/storage" + +export type { + AccountProofData, + ValidateArgsInput, + VerifySignaturesScriptOptions, +} from "./app-utils/verify-signatures" From d9fea2743d41f1769f6bc7b606cbf573fa6f41ad Mon Sep 17 00:00:00 2001 From: Michael Fabozzi <39808567+mfbz@users.noreply.github.com> Date: Fri, 23 May 2025 08:46:02 +0200 Subject: [PATCH 3/4] Update packages/fcl-core/src/fcl-core.ts Co-authored-by: Jordan Ribbink <17958158+jribbink@users.noreply.github.com> --- packages/fcl-core/src/fcl-core.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/fcl-core/src/fcl-core.ts b/packages/fcl-core/src/fcl-core.ts index d44e5ba66..10fa4f576 100644 --- a/packages/fcl-core/src/fcl-core.ts +++ b/packages/fcl-core/src/fcl-core.ts @@ -106,6 +106,5 @@ export type {StorageProvider} from "./utils/storage" export type { AccountProofData, - ValidateArgsInput, VerifySignaturesScriptOptions, } from "./app-utils/verify-signatures" From 9422143dbace501b682233f5b414156f3705b34f Mon Sep 17 00:00:00 2001 From: mfbz Date: Fri, 23 May 2025 09:04:51 +0200 Subject: [PATCH 4/4] Cleaned up any usage --- packages/fcl-core/src/app-utils/verify-signatures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fcl-core/src/app-utils/verify-signatures.ts b/packages/fcl-core/src/app-utils/verify-signatures.ts index a41d05c07..88637c07b 100644 --- a/packages/fcl-core/src/app-utils/verify-signatures.ts +++ b/packages/fcl-core/src/app-utils/verify-signatures.ts @@ -205,7 +205,7 @@ export async function verifyUserSignatures( return query({ cadence: await getVerifySignaturesScript(USER_SIGNATURE, opts), - args: (arg: any, t: any) => [ + args: (arg, t) => [ arg(address, t.Address), arg(message, t.String), arg(keyIndices, t.Array(t.Int)),