From 0b3a90a67fb517911244efb7167f3845c239e7b5 Mon Sep 17 00:00:00 2001 From: mfbz Date: Tue, 27 May 2025 18:28:06 +0200 Subject: [PATCH 1/3] Completed refactoring of interaction-template-utils folder --- .../src/exec/utils/prep-template-opts.js | 2 +- .../derive-cadence-by-network-1.0.0.js | 49 ------ .../derive-cadence-by-network-1.0.0.ts | 61 ++++++++ ....js => derive-cadence-by-network-1.1.0.ts} | 28 ++-- ...t.js => derive-cadence-by-network.test.ts} | 8 +- ...etwork.js => derive-cadence-by-network.ts} | 23 ++- ....0.js => generate-dependency-pin-1.0.0.ts} | 31 ++-- ....0.js => generate-dependency-pin-1.1.0.ts} | 33 ++-- ...est.js => generate-dependency-pin.test.ts} | 7 +- ...ency-pin.js => generate-dependency-pin.ts} | 47 +++--- ...1.0.0.js => generate-template-id-1.0.0.ts} | 19 ++- ....js => generate-template-id-1.1.0.test.ts} | 8 +- ...1.1.0.js => generate-template-id-1.1.0.ts} | 90 +++++++---- ...template-id.js => generate-template-id.ts} | 28 ++-- ....js => get-interaction-template-audits.ts} | 33 ++-- ... => get-template-argument-message.test.ts} | 12 +- ...ge.js => get-template-argument-message.ts} | 32 ++-- ...e.test.js => get-template-message.test.ts} | 6 +- ...ate-message.js => get-template-message.ts} | 33 ++-- .../{index.js => index.ts} | 14 +- .../interaction-template.ts | 147 ++++++++++++++++++ ...d-imports.test.js => find-imports.test.ts} | 4 +- .../{find-imports.js => find-imports.ts} | 11 +- .../utils/generate-import.js | 3 - .../utils/generate-import.ts | 13 ++ .../utils/{hash.js => hash.ts} | 2 +- .../utils/replace-string-imports.js | 15 -- ...test.js => replace-string-imports.test.ts} | 0 .../utils/replace-string-imports.ts | 23 +++ ...rify-dependency-pin-same-at-block.test.ts} | 6 +- ...=> verify-dependency-pin-same-at-block.ts} | 56 ++++--- 31 files changed, 571 insertions(+), 273 deletions(-) delete mode 100644 packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.js create mode 100644 packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.ts rename packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/{derive-cadence-by-network-1.1.0.js => derive-cadence-by-network-1.1.0.ts} (68%) rename packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/{derive-cadence-by-network.test.js => derive-cadence-by-network.test.ts} (99%) rename packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/{derive-cadence-by-network.js => derive-cadence-by-network.ts} (66%) rename packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/{generate-dependency-pin-1.0.0.js => generate-dependency-pin-1.0.0.ts} (63%) rename packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/{generate-dependency-pin-1.1.0.js => generate-dependency-pin-1.1.0.ts} (64%) rename packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/{generate-dependency-pin.test.js => generate-dependency-pin.test.ts} (98%) rename packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/{generate-dependency-pin.js => generate-dependency-pin.ts} (57%) rename packages/fcl-core/src/interaction-template-utils/generate-template-id/{generate-template-id-1.0.0.js => generate-template-id-1.0.0.ts} (90%) rename packages/fcl-core/src/interaction-template-utils/generate-template-id/{generate-template-id-1.1.0.test.js => generate-template-id-1.1.0.test.ts} (99%) rename packages/fcl-core/src/interaction-template-utils/generate-template-id/{generate-template-id-1.1.0.js => generate-template-id-1.1.0.ts} (55%) rename packages/fcl-core/src/interaction-template-utils/generate-template-id/{generate-template-id.js => generate-template-id.ts} (64%) rename packages/fcl-core/src/interaction-template-utils/{get-interaction-template-audits.js => get-interaction-template-audits.ts} (76%) rename packages/fcl-core/src/interaction-template-utils/{get-template-argument-message.test.js => get-template-argument-message.test.ts} (97%) rename packages/fcl-core/src/interaction-template-utils/{get-template-argument-message.js => get-template-argument-message.ts} (65%) rename packages/fcl-core/src/interaction-template-utils/{get-template-message.test.js => get-template-message.test.ts} (98%) rename packages/fcl-core/src/interaction-template-utils/{get-template-message.js => get-template-message.ts} (61%) rename packages/fcl-core/src/interaction-template-utils/{index.js => index.ts} (58%) create mode 100644 packages/fcl-core/src/interaction-template-utils/interaction-template.ts rename packages/fcl-core/src/interaction-template-utils/utils/{find-imports.test.js => find-imports.test.ts} (95%) rename packages/fcl-core/src/interaction-template-utils/utils/{find-imports.js => find-imports.ts} (62%) delete mode 100644 packages/fcl-core/src/interaction-template-utils/utils/generate-import.js create mode 100644 packages/fcl-core/src/interaction-template-utils/utils/generate-import.ts rename packages/fcl-core/src/interaction-template-utils/utils/{hash.js => hash.ts} (75%) delete mode 100644 packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.js rename packages/fcl-core/src/interaction-template-utils/utils/{replace-string-imports.test.js => replace-string-imports.test.ts} (100%) create mode 100644 packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.ts rename packages/fcl-core/src/interaction-template-utils/{verify-dependency-pin-same-at-block.test.js => verify-dependency-pin-same-at-block.test.ts} (99%) rename packages/fcl-core/src/interaction-template-utils/{verify-dependency-pin-same-at-block.js => verify-dependency-pin-same-at-block.ts} (76%) diff --git a/packages/fcl-core/src/exec/utils/prep-template-opts.js b/packages/fcl-core/src/exec/utils/prep-template-opts.js index 2a8f30f84..947b4fddf 100644 --- a/packages/fcl-core/src/exec/utils/prep-template-opts.js +++ b/packages/fcl-core/src/exec/utils/prep-template-opts.js @@ -1,5 +1,5 @@ import {retrieve} from "../../document/document.js" -import {deriveCadenceByNetwork} from "../../interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.js" +import {deriveCadenceByNetwork} from "../../interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network" import {isString} from "../../utils/is" import {getChainId} from "../../utils" diff --git a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.js b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.js deleted file mode 100644 index bfa2814d7..000000000 --- a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.js +++ /dev/null @@ -1,49 +0,0 @@ -import {invariant} from "@onflow/util-invariant" - -/** - * @description Fills import addresses in Cadence for network - * - * @param {object} params - * @param {string} params.network - Network to derive Cadence for - * @param {object} params.template - Interaction Template to derive Cadence from - * @returns {Promise} - Promise that resolves with the derived Cadence code - */ -export async function deriveCadenceByNetwork100({network, template}) { - invariant( - template.f_version === "1.0.0", - "deriveCadenceByNetwork100({ template }) -- template must be version 1.0.0" - ) - - const networkDependencies = Object.keys(template?.data?.dependencies).map( - dependencyPlaceholder => { - const dependencyNetworkContracts = Object.values( - template?.data?.dependencies?.[dependencyPlaceholder] - ) - - invariant( - dependencyNetworkContracts !== undefined, - `deriveCadenceByNetwork100 -- Could not find contracts for dependency placeholder: ${dependencyPlaceholder}` - ) - - invariant( - dependencyNetworkContracts.length > 0, - `deriveCadenceByNetwork100 -- Could not find contracts for dependency placeholder: ${dependencyPlaceholder}` - ) - - const dependencyContract = dependencyNetworkContracts[0] - const dependencyContractForNetwork = dependencyContract?.[network] - - invariant( - dependencyContractForNetwork, - `deriveCadenceByNetwork100 -- Could not find ${network} network information for dependency: ${dependencyPlaceholder}` - ) - - return [dependencyPlaceholder, dependencyContractForNetwork?.address] - } - ) - - return networkDependencies.reduce((cadence, [placeholder, address]) => { - const regex = new RegExp("(\\b" + placeholder + "\\b)", "g") - return cadence.replace(regex, address) - }, template.data.cadence) -} diff --git a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.ts b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.ts new file mode 100644 index 000000000..4293cf0fa --- /dev/null +++ b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.0.0.ts @@ -0,0 +1,61 @@ +import {invariant} from "@onflow/util-invariant" +import type {InteractionTemplate100} from "../interaction-template" + +export interface DeriveCadenceByNetwork100Params { + network: string + template: InteractionTemplate100 +} + +/** + * @description Fills import addresses in Cadence for network + * + * @param {DeriveCadenceByNetwork100Params} params + * @param {string} params.network Network to derive Cadence for + * @param {InteractionTemplate100} params.template Interaction Template to derive Cadence from + * @returns {Promise} Promise that resolves with the derived Cadence code + */ +export async function deriveCadenceByNetwork100({ + network, + template, +}: DeriveCadenceByNetwork100Params): Promise { + invariant( + template.f_version === "1.0.0", + "deriveCadenceByNetwork100({ template }) -- template must be version 1.0.0" + ) + + const networkDependencies: [string, string][] = Object.keys( + template?.data?.dependencies + ).map((dependencyPlaceholder: string): [string, string] => { + const dependencyNetworkContracts = Object.values( + template?.data?.dependencies?.[dependencyPlaceholder] + ) + + invariant( + dependencyNetworkContracts !== undefined, + `deriveCadenceByNetwork100 -- Could not find contracts for dependency placeholder: ${dependencyPlaceholder}` + ) + + invariant( + dependencyNetworkContracts.length > 0, + `deriveCadenceByNetwork100 -- Could not find contracts for dependency placeholder: ${dependencyPlaceholder}` + ) + + const dependencyContract = dependencyNetworkContracts[0] + const dependencyContractForNetwork = dependencyContract?.[network] + + invariant( + dependencyContractForNetwork as any, + `deriveCadenceByNetwork100 -- Could not find ${network} network information for dependency: ${dependencyPlaceholder}` + ) + + return [dependencyPlaceholder, dependencyContractForNetwork?.address] + }) + + return networkDependencies.reduce( + (cadence: string, [placeholder, address]: [string, string]) => { + const regex = new RegExp("(\\b" + placeholder + "\\b)", "g") + return cadence.replace(regex, address) + }, + template.data.cadence + ) +} diff --git a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.js b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.ts similarity index 68% rename from packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.js rename to packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.ts index e2aa725be..f1346424b 100644 --- a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.js +++ b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network-1.1.0.ts @@ -1,21 +1,31 @@ import {invariant} from "@onflow/util-invariant" -import {replaceStringImports} from "../utils/replace-string-imports.js" +import {replaceStringImports} from "../utils/replace-string-imports" +import type {InteractionTemplate110} from "../interaction-template" + +export interface DeriveCadenceByNetwork110Params { + network: string + template: InteractionTemplate110 +} + /** * @description Fills import addresses in Cadence for network * - * @param {object} params - * @param {string} params.network - Network to derive Cadence for - * @param {object} params.template - Interaction Template to derive Cadence from - * @returns {Promise} - Promise that resolves with the derived Cadence code + * @param {DeriveCadenceByNetwork110Params} params + * @param {string} params.network Network to derive Cadence for + * @param {InteractionTemplate110} params.template Interaction Template to derive Cadence from + * @returns {Promise} Promise that resolves with the derived Cadence code */ -export async function deriveCadenceByNetwork110({network, template}) { +export async function deriveCadenceByNetwork110({ + network, + template, +}: DeriveCadenceByNetwork110Params): Promise { invariant( template.f_version === "1.1.0", - "deriveCadenceByNetwork110({ template }) -- template must be version 1.0.0" + "deriveCadenceByNetwork110({ template }) -- template must be version 1.1.0" ) // get network dependencies from template dependencies, use new string import format - const networkDependencies = {} + const networkDependencies: Record = {} template?.data?.dependencies.forEach(dependency => { dependency.contracts.forEach(contract => { @@ -46,7 +56,7 @@ export async function deriveCadenceByNetwork110({network, template}) { ) invariant( - template?.data?.cadence?.body, + template?.data?.cadence?.body as any, `no cadence found -- Could not replace import dependencies: ${networkDependencies}` ) diff --git a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.js b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.ts similarity index 99% rename from packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.js rename to packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.ts index 4124bce4b..152669c35 100644 --- a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.js +++ b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.test.ts @@ -1,7 +1,7 @@ -import {deriveCadenceByNetwork} from "./derive-cadence-by-network.js" +import {deriveCadenceByNetwork} from "./derive-cadence-by-network" describe("Derive cadence by network 1.0.0", () => { - const template = { + const template: any = { f_type: "InteractionTemplate", f_version: "1.0.0", id: "abc123", @@ -54,7 +54,7 @@ describe("Derive cadence by network 1.0.0", () => { }) describe("Derive cadence by network 1.1.0", () => { - const template11 = { + const template11: any = { f_type: "InteractionTemplate", f_version: "1.1.0", id: "3a99af243b85f3f6af28304af2ed53a37fb913782b3efc483e6f0162a47720a0", @@ -207,7 +207,7 @@ describe("Derive cadence by network 1.1.0", () => { await expect(() => deriveCadenceByNetwork({ network: "mainnet", - template: {f_type: "InteractionTemplate", f_version: "0.0.0"}, + template: {f_type: "InteractionTemplate", f_version: "0.0.0"} as any, }) ).rejects.toThrow(Error) }) diff --git a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.js b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.ts similarity index 66% rename from packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.js rename to packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.ts index 0e565437f..b34cf9a00 100644 --- a/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.js +++ b/packages/fcl-core/src/interaction-template-utils/derive-cadence-by-network/derive-cadence-by-network.ts @@ -1,16 +1,25 @@ import {invariant} from "@onflow/util-invariant" -import {deriveCadenceByNetwork100} from "./derive-cadence-by-network-1.0.0.js" -import {deriveCadenceByNetwork110} from "./derive-cadence-by-network-1.1.0.js" +import {deriveCadenceByNetwork100} from "./derive-cadence-by-network-1.0.0" +import {deriveCadenceByNetwork110} from "./derive-cadence-by-network-1.1.0" +import type {InteractionTemplate} from "../interaction-template" + +export interface DeriveCadenceByNetworkParams { + network: string + template: InteractionTemplate +} /** * @description Fills import addresses in Cadence for network * - * @param {object} params - * @param {string} params.network - Network to derive Cadence for - * @param {object} params.template - Interaction Template to derive Cadence from - * @returns {Promise} - Promise that resolves with the derived Cadence code + * @param {DeriveCadenceByNetworkParams} params + * @param {string} params.network Network to derive Cadence for + * @param {InteractionTemplate} params.template Interaction Template to derive Cadence from + * @returns {Promise} Promise that resolves with the derived Cadence code */ -export async function deriveCadenceByNetwork({network, template}) { +export async function deriveCadenceByNetwork({ + network, + template, +}: DeriveCadenceByNetworkParams): Promise { invariant( network != undefined, "deriveCadenceByNetwork({ network }) -- network must be defined" diff --git a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.js b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.ts similarity index 63% rename from packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.js rename to packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.ts index 28958346e..8910f1ad9 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.0.0.ts @@ -1,20 +1,25 @@ import {invariant, send, getAccount, config, decode} from "@onflow/sdk" -import {genHash} from "../utils/hash.js" -import {findImports} from "../utils/find-imports.js" -import {generateImport} from "../utils/generate-import.js" +import {genHash} from "../utils/hash" +import {findImports} from "../utils/find-imports" +import {generateImport} from "../utils/generate-import" + +export interface GenerateDependencyPin100Params { + address: string + contractName: string +} /** * @description Produces a dependency pin for a contract at current state of chain - * @param {object} params - * @param {string} params.address - The address of the account containing the contract - * @param {string} params.contractName - The name of the contract - * @param {object} opts - Options to pass to the interaction - * @returns {Promise} - The dependency pin + * @param {GenerateDependencyPin100Params} params + * @param {string} params.address The address of the account containing the contract + * @param {string} params.contractName The name of the contract + * @param {object} opts Options to pass to the interaction + * @returns {Promise} The dependency pin */ export async function generateDependencyPin100( - {address, contractName}, - opts = {} -) { + {address, contractName}: GenerateDependencyPin100Params, + opts: any = {} +): Promise { invariant( address != undefined, "generateDependencyPin({ address }) -- address must be defined" @@ -32,7 +37,7 @@ export async function generateDependencyPin100( "generateDependencyPin({ contractName }) -- contractName must be a string" ) - const horizon = [generateImport({contractName, address})] + const horizon: any = [generateImport({contractName, address})] for (const horizonImport of horizon) { const account = await send( @@ -56,7 +61,7 @@ export async function generateDependencyPin100( horizon.push(...contractImports) } - const contractHashes = horizon.map(iport => genHash(iport.contract)) + const contractHashes = horizon.map((iport: any) => genHash(iport.contract)) const contractHashesJoined = contractHashes.join("") diff --git a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.js b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.ts similarity index 64% rename from packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.js rename to packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.ts index df7fd154b..de967fdaa 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin-1.1.0.ts @@ -1,20 +1,27 @@ import {invariant, send, getAccount, config, decode} from "@onflow/sdk" -import {genHash} from "../utils/hash.js" -import {findImports} from "../utils/find-imports.js" -import {generateImport} from "../utils/generate-import.js" +import {genHash} from "../utils/hash" +import {findImports} from "../utils/find-imports" +import {generateImport} from "../utils/generate-import" + +export interface GenerateDependencyPin110Params { + address: string + contractName: string + blockHeight?: number +} /** * @description Produces a dependency pin for a contract at current state of chain - * @param {object} params - * @param {string} params.address - The address of the account containing the contract - * @param {string} params.contractName - The name of the contract - * @param {object} opts - Options to pass to the interaction - * @returns {Promise} - The dependency pin + * @param {GenerateDependencyPin110Params} params + * @param {string} params.address The address of the account containing the contract + * @param {string} params.contractName The name of the contract + * @param {number} params.blockHeight The block height to generate the dependency pin at + * @param {object} opts Options to pass to the interaction + * @returns {Promise} The dependency pin */ export async function generateDependencyPin110( - {address, contractName}, - opts = {} -) { + {address, contractName}: GenerateDependencyPin110Params, + opts: any = {} +): Promise { invariant( address != undefined, "generateDependencyPin({ address }) -- address must be defined" @@ -32,7 +39,7 @@ export async function generateDependencyPin110( "generateDependencyPin({ contractName }) -- contractName must be a string" ) - const horizon = [generateImport({contractName, address})] + const horizon: any = [generateImport({contractName, address})] for (const horizonImport of horizon) { const account = await send( @@ -56,7 +63,7 @@ export async function generateDependencyPin110( horizon.push(...contractImports) } - const contractPinSelfHashesPromises = horizon.map(iport => + const contractPinSelfHashesPromises = horizon.map((iport: any) => genHash(iport.contract) ) // genHash returns a promise, so we need to await the results of all the promises diff --git a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.js b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts similarity index 98% rename from packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.js rename to packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts index f7c2c2999..61fd1bb48 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts @@ -1,8 +1,5 @@ -import { - generateDependencyPin110, - generateDependencySelfPin, -} from "./generate-dependency-pin-1.1.0.js" import {config} from "@onflow/config" +import {generateDependencyPin110} from "./generate-dependency-pin-1.1.0" const returnedAccount = { address: "0xf233dcee88fe0abe", @@ -283,7 +280,7 @@ describe("1.1.0, generate dependency pin", () => { }) afterAll(() => { - console.warn.mockRestore() + //console.warn.mockRestore() }) test("v1.1.0, get dependency pin", async () => { diff --git a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.js b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.ts similarity index 57% rename from packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.js rename to packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.ts index c18f95567..63fb0b2d0 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.ts @@ -1,20 +1,27 @@ import {block, invariant} from "@onflow/sdk" -import {generateDependencyPin110} from "./generate-dependency-pin-1.1.0.js" -import {generateDependencyPin100} from "./generate-dependency-pin-1.0.0.js" +import {generateDependencyPin110} from "./generate-dependency-pin-1.1.0" +import {generateDependencyPin100} from "./generate-dependency-pin-1.0.0" + +export interface GenerateDependencyPinParams { + version?: string + address: string + contractName: string + blockHeight?: number +} /** * @description Produces a dependency pin for a contract at current state of chain - * @param {object} params - * @param {string} params.version - The version of the interaction template - * @param {string} params.address - The address of the account containing the contract - * @param {string} params.contractName - The name of the contract - * @param {object} opts - Options to pass to the interaction - * @returns {Promise} - The dependency pin + * @param {GenerateDependencyPinParams} params + * @param {string} params.version The version of the interaction template + * @param {string} params.address The address of the account containing the contract + * @param {string} params.contractName The name of the contract + * @param {object} opts Options to pass to the interaction + * @returns {Promise} The dependency pin */ export async function generateDependencyPin( - {version, address, contractName}, - opts = {} -) { + {version, address, contractName}: GenerateDependencyPinParams, + opts: any = {} +): Promise { invariant( address != undefined, "generateDependencyPin({ address }) -- address must be defined" @@ -46,17 +53,17 @@ export async function generateDependencyPin( /** * @description Produces a dependency pin for a contract at latest sealed block - * @param {object} params - * @param {string} params.version - The version of the interaction template - * @param {string} params.address - The address of the account containing the contract - * @param {string} params.contractName - The name of the contract - * @param {object} opts - Options to pass to the interaction - * @returns {Promise} - The dependency pin + * @param {GenerateDependencyPinParams} params + * @param {string} params.version The version of the interaction template + * @param {string} params.address The address of the account containing the contract + * @param {string} params.contractName The name of the contract + * @param {object} opts Options to pass to the interaction + * @returns {Promise} The dependency pin */ export async function generateDependencyPinAtLatestSealedBlock( - {version, address, contractName}, - opts = {} -) { + {version, address, contractName}: GenerateDependencyPinParams, + opts: any = {} +): Promise { const latestSealedBlock = await block({sealed: true}, opts) const latestSealedBlockHeight = latestSealedBlock?.height diff --git a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.js b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.ts similarity index 90% rename from packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.js rename to packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.ts index 1361c8bad..9d0dcd684 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.0.0.ts @@ -1,17 +1,24 @@ -import {invariant} from "@onflow/sdk" +import {invariant} from "@onflow/util-invariant" import {encode as rlpEncode} from "@onflow/rlp" -import {genHash} from "../utils/hash.js" +import {genHash} from "../utils/hash" +import type {InteractionTemplate100} from "../interaction-template" + +export interface GenerateTemplateId100Params { + template: InteractionTemplate100 +} /** * @description Generates Interaction Template ID for a given Interaction Template * * @param {object} params - * @param {object} params.template - Interaction Template - * @returns {Promise} - Interaction Template ID + * @param {InteractionTemplate100} params.template Interaction Template + * @returns {Promise} Interaction Template ID */ -export async function generateTemplateId({template}) { +export async function generateTemplateId({ + template, +}: GenerateTemplateId100Params): Promise { invariant( - template != undefined, + template as any, "generateTemplateId({ template }) -- template must be defined" ) invariant( diff --git a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.js b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.ts similarity index 99% rename from packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.js rename to packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.ts index 073c99579..d5d87f118 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.test.ts @@ -1,6 +1,6 @@ -import {generateTemplateId} from "./generate-template-id.js" -import {replaceStringImports} from "../utils/replace-string-imports.js" -import {genHash} from "../utils/hash.js" +import {generateTemplateId} from "./generate-template-id" +import {replaceStringImports} from "../utils/replace-string-imports" +import {genHash} from "../utils/hash" const returnedAccount = { address: "0xf233dcee88fe0abe", @@ -435,7 +435,7 @@ describe("Gen template id interaction template messages 1.1.0", () => { test("Test id generation and compare", async () => { const testId = template.id const id = await generateTemplateId({ - template, + template: template as any, }) expect(id).toEqual(testId) diff --git a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.js b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts similarity index 55% rename from packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.js rename to packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts index be8704e00..a979f8f77 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts @@ -1,10 +1,21 @@ -import {invariant} from "@onflow/util-invariant" import {encode as rlpEncode} from "@onflow/rlp" -import {genHash} from "../utils/hash.js" -import {generateDependencyPin110} from "../generate-dependency-pin/generate-dependency-pin-1.1.0.js" +import {invariant} from "@onflow/util-invariant" +import type { + InteractionTemplate110, + InteractionTemplateDependency, + InteractionTemplateI18n, + InteractionTemplateMessage, + InteractionTemplateNetwork, + InteractionTemplateParameter, +} from "../interaction-template" +import {generateDependencyPin110} from "../generate-dependency-pin/generate-dependency-pin-1.1.0" +import {genHash} from "../utils/hash" -async function generateContractNetworks(contractName, networks) { - const values = [] +async function generateContractNetworks( + contractName: string, + networks: InteractionTemplateNetwork[] +): Promise { + const values: string[][] = [] for (const net of networks) { const networkHashes = [genHash(net.network)] const {address, dependency_pin_block_height} = net @@ -21,8 +32,10 @@ async function generateContractNetworks(contractName, networks) { return values } -async function generateContractDependencies(dependencies) { - const values = [] +async function generateContractDependencies( + dependencies: InteractionTemplateDependency[] +): Promise { + const values: any[] = [] for (let i = 0; i < dependencies.length; i++) { const dependency = dependencies[i] const contracts = [] @@ -45,12 +58,16 @@ async function generateContractDependencies(dependencies) { * @description Generates Interaction Template ID for a given Interaction Template * * @param {object} params - * @param {object} params.template - Interaction Template - * @returns {Promise} - Interaction Template ID + * @param {InteractionTemplate110} params.template Interaction Template + * @returns {Promise} Interaction Template ID */ -export async function generateTemplateId({template}) { +export async function generateTemplateId({ + template, +}: { + template: InteractionTemplate110 +}): Promise { invariant( - template, + template as any, "generateTemplateId({ template }) -- template must be defined" ) invariant( @@ -69,35 +86,46 @@ export async function generateTemplateId({template}) { const templateData = template.data const messages = await Promise.all( - templateData.messages.map(async templateMessage => [ - genHash(templateMessage.key), - await Promise.all( - templateMessage.i18n.map(async templateMessagei18n => [ - genHash(templateMessagei18n.tag), - genHash(templateMessagei18n.translation), - ]) - ), - ]) + templateData.messages.map( + async (templateMessage: InteractionTemplateMessage) => [ + genHash(templateMessage.key), + await Promise.all( + templateMessage.i18n.map( + async (templateMessagei18n: InteractionTemplateI18n) => [ + genHash(templateMessagei18n.tag), + genHash(templateMessagei18n.translation), + ] + ) + ), + ] + ) ) const params = await Promise.all( templateData?.["parameters"] - .sort((a, b) => a.index - b.index) - .map(async arg => [ + .sort( + (a: InteractionTemplateParameter, b: InteractionTemplateParameter) => + a.index - b.index + ) + .map(async (arg: InteractionTemplateParameter) => [ genHash(arg.label), [ genHash(String(arg.index)), genHash(arg.type), await Promise.all( - arg.messages.map(async argumentMessage => [ - genHash(argumentMessage.key), - await Promise.all( - argumentMessage.i18n.map(async argumentMessagei18n => [ - genHash(argumentMessagei18n.tag), - genHash(argumentMessagei18n.translation), - ]) - ), - ]) + arg.messages.map( + async (argumentMessage: InteractionTemplateMessage) => [ + genHash(argumentMessage.key), + await Promise.all( + argumentMessage.i18n.map( + async (argumentMessagei18n: InteractionTemplateI18n) => [ + genHash(argumentMessagei18n.tag), + genHash(argumentMessagei18n.translation), + ] + ) + ), + ] + ) ), ], ]) diff --git a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.js b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.ts similarity index 64% rename from packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.js rename to packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.ts index dbba8af2c..797c76296 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.js +++ b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id.ts @@ -1,17 +1,22 @@ import {invariant} from "@onflow/util-invariant" -import {generateTemplateId as generateTemplateId100} from "./generate-template-id-1.0.0.js" -import {generateTemplateId as generateTemplateId110} from "./generate-template-id-1.1.0.js" +import {generateTemplateId as generateTemplateId100} from "./generate-template-id-1.0.0" +import {generateTemplateId as generateTemplateId110} from "./generate-template-id-1.1.0" +import type {InteractionTemplate} from "../interaction-template" /** * @description Generates Interaction Template ID for a given Interaction Template * * @param {object} params - * @param {object} params.template - Interaction Template - * @returns {Promise} - Interaction Template ID + * @param {object} params.template Interaction Template + * @returns {Promise} Interaction Template ID */ -export async function generateTemplateId({template}) { +export async function generateTemplateId({ + template, +}: { + template: InteractionTemplate +}): Promise { invariant( - template, + template as any, "generateTemplateId({ template }) -- template must be defined" ) invariant( @@ -37,10 +42,13 @@ export async function generateTemplateId({template}) { * @description Verifies the given Interaction Template Id has been correctly generated * * @param {object} params - * @param {object} params.template - Interaction Template - * @returns {Promise} - true or false, Interaction Template ID + * @param {object} params.template Interaction Template + * @returns {Promise} true or false, Interaction Template ID */ - -export async function verifyGeneratedTemplateId({template}) { +export async function verifyGeneratedTemplateId({ + template, +}: { + template: InteractionTemplate +}): Promise { return template.id === (await generateTemplateId({template})) } diff --git a/packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.js b/packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.ts similarity index 76% rename from packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.js rename to packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.ts index 8c59d595a..b284ea48d 100644 --- a/packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.js +++ b/packages/fcl-core/src/interaction-template-utils/get-interaction-template-audits.ts @@ -1,23 +1,32 @@ import {config, invariant} from "@onflow/sdk" import {log, LEVELS} from "@onflow/util-logger" -import {query} from "../exec/query.js" -import {generateTemplateId} from "./generate-template-id/generate-template-id.js" +import {query} from "../exec/query" +import {generateTemplateId} from "./generate-template-id/generate-template-id" import {getChainId} from "../utils" +import type {InteractionTemplate} from "./interaction-template" + +export interface GetInteractionTemplateAuditsParams { + template: InteractionTemplate + auditors?: string[] +} + +export interface GetInteractionTemplateAuditsOpts { + flowInteractionAuditContract?: string +} /** * @description Returns whether a set of auditors have audited a given Interaction Template * - * @param {object} params - * @param {object} params.template - Interaction Template - * @param {Array} params.auditors - Array of auditors - * @param {object} opts - * @param {string} opts.flowInteractionAuditContract - Flow Interaction Template Audit contract address - * @returns {Promise} - Object of auditor addresses and audit status + * @param {GetInteractionTemplateAuditsParams} opts + * @param {InteractionTemplate} opts.template Interaction Template to check audits for + * @param {string[]} opts.auditors [auditors=undefined] Auditors to check + * @param {GetInteractionTemplateAuditsOpts} opts + * @returns {Promise>} Whether the template has been audited by the auditors */ export async function getInteractionTemplateAudits( - {template, auditors}, - opts = {} -) { + {template, auditors}: GetInteractionTemplateAuditsParams, + opts: GetInteractionTemplateAuditsOpts = {} +): Promise> { invariant( template != undefined, "getInteractionTemplateAudits({ template }) -- template must be defined" @@ -79,7 +88,7 @@ export async function getInteractionTemplateAudits( return FlowInteractionTemplateAudit.getHasTemplateBeenAuditedByAuditors(templateId: templateId, auditors: auditors) } `, - args: (arg, t) => [ + args: (arg: any, t: any) => [ arg(recomputedTemplateID, t.String), arg(_auditors, t.Array(t.Address)), ], diff --git a/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.js b/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.ts similarity index 97% rename from packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.js rename to packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.ts index 9073c0780..8d1c5971a 100644 --- a/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.js +++ b/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.test.ts @@ -1,7 +1,7 @@ -import {getTemplateArgumentMessage} from "./get-template-argument-message.js" +import {getTemplateArgumentMessage} from "./get-template-argument-message" describe("Get interaction template argument messages", () => { - const templatev1 = { + const templatev1: any = { f_type: "InteractionTemplate", f_version: "1.0.0", id: "abc123", @@ -73,7 +73,7 @@ describe("Get interaction template argument messages", () => { localization: "en-US", argumentLabel: "amount", messageKey: "title", - template: templatev1, + template: templatev1 as any, }) expect(message).toEqual("The amount of FLOW tokens to send") @@ -84,7 +84,7 @@ describe("Get interaction template argument messages", () => { localization: "en-US", argumentLabel: "foo", messageKey: "title", - template: templatev1, + template: templatev1 as any, }) expect(message).toEqual(undefined) @@ -95,7 +95,7 @@ describe("Get interaction template argument messages", () => { localization: "en-US", argumentLabel: "amount", messageKey: "baz", - template: templatev1, + template: templatev1 as any, }) expect(message).toEqual(undefined) @@ -103,7 +103,7 @@ describe("Get interaction template argument messages", () => { }) describe("Get interaction template v1.1.0 parameters messages", () => { - const templatev11 = { + const templatev11: any = { f_type: "InteractionTemplate", f_version: "1.1.0", id: "3a99af243b85f3f6af28304af2ed53a37fb913782b3efc483e6f0162a47720a0", diff --git a/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.js b/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.ts similarity index 65% rename from packages/fcl-core/src/interaction-template-utils/get-template-argument-message.js rename to packages/fcl-core/src/interaction-template-utils/get-template-argument-message.ts index 9112ae7f1..4468e91a6 100644 --- a/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.js +++ b/packages/fcl-core/src/interaction-template-utils/get-template-argument-message.ts @@ -1,21 +1,29 @@ import {invariant} from "@onflow/sdk" +import type {InteractionTemplate} from "./interaction-template" + +export interface GetTemplateArgumentMessageParams { + localization?: string + argumentLabel: string + messageKey: string + template: InteractionTemplate +} /** * @description Gets Interaction Template argument message by message key, argument label, and localization * - * @param {object} opts - * @param {string} opts.localization [localization="en-US"] - Localization to get message for - * @param {string} opts.argumentLabel - Argument label to get message for - * @param {string} opts.messageKey - Message key to get message for - * @param {object} opts.template - Interaction Template to get message from - * @returns {string} - Message + * @param {GetTemplateArgumentMessageParams} opts + * @param {string} opts.localization [localization="en-US"] Localization to get message for + * @param {string} opts.argumentLabel Argument label to get message for + * @param {string} opts.messageKey Message key to get message for + * @param {InteractionTemplate} opts.template Interaction Template to get message from + * @returns {string} Message */ export function getTemplateArgumentMessage({ localization = "en-US", argumentLabel, messageKey, template, -}) { +}: GetTemplateArgumentMessageParams): string | undefined { invariant( messageKey, "getTemplateArgumentMessage({ messageKey }) -- messageKey must be defined" @@ -30,7 +38,7 @@ export function getTemplateArgumentMessage({ "getTemplateArgumentMessage({ argumentLabel }) -- argumentLabel must be defined" ) invariant( - typeof messageKey === "string", + typeof argumentLabel === "string", "getTemplateArgumentMessage({ argumentLabel }) -- argumentLabel must be a string" ) @@ -52,19 +60,19 @@ export function getTemplateArgumentMessage({ "getTemplateArgumentMessage({ template }) -- template must be an object" ) invariant( - typeof template.f_type === "InteractionTemplate", + template.f_type === "InteractionTemplate", "getTemplateArgumentMessage({ template }) -- template object must be an InteractionTemplate" ) switch (template.f_version) { case "1.1.0": const param = template?.data?.parameters?.find( - a => a.label === argumentLabel + (a: any) => a.label === argumentLabel ) if (!param) return undefined - const message = param?.messages?.find(a => a.key === messageKey) + const message = param?.messages?.find((a: any) => a.key === messageKey) if (!message) return undefined - const lzn = message?.i18n?.find(a => a.tag === localization) + const lzn = message?.i18n?.find((a: any) => a.tag === localization) if (!lzn) return undefined return lzn.translation case "1.0.0": diff --git a/packages/fcl-core/src/interaction-template-utils/get-template-message.test.js b/packages/fcl-core/src/interaction-template-utils/get-template-message.test.ts similarity index 98% rename from packages/fcl-core/src/interaction-template-utils/get-template-message.test.js rename to packages/fcl-core/src/interaction-template-utils/get-template-message.test.ts index 678c1b512..f7dced3d9 100644 --- a/packages/fcl-core/src/interaction-template-utils/get-template-message.test.js +++ b/packages/fcl-core/src/interaction-template-utils/get-template-message.test.ts @@ -1,7 +1,7 @@ -import {getTemplateMessage} from "./get-template-message.js" +import {getTemplateMessage} from "./get-template-message" describe("Get interaction template messages 1.0.0", () => { - const template = { + const template: any = { f_type: "InteractionTemplate", f_version: "1.0.0", id: "abc123", @@ -98,7 +98,7 @@ describe("Get interaction template messages 1.0.0", () => { }) describe("Get interaction template messages 1.1.0", () => { - const template = { + const template: any = { f_type: "InteractionTemplate", f_version: "1.1.0", id: "3a99af243b85f3f6af28304af2ed53a37fb913782b3efc483e6f0162a47720a0", diff --git a/packages/fcl-core/src/interaction-template-utils/get-template-message.js b/packages/fcl-core/src/interaction-template-utils/get-template-message.ts similarity index 61% rename from packages/fcl-core/src/interaction-template-utils/get-template-message.js rename to packages/fcl-core/src/interaction-template-utils/get-template-message.ts index a88cb5de3..88c383df9 100644 --- a/packages/fcl-core/src/interaction-template-utils/get-template-message.js +++ b/packages/fcl-core/src/interaction-template-utils/get-template-message.ts @@ -1,21 +1,28 @@ -import {invariant} from "@onflow/sdk" +import {invariant} from "@onflow/util-invariant" +import type {InteractionTemplate} from "./interaction-template" + +export interface GetTemplateMessageParams { + localization?: string + messageKey: string + template: InteractionTemplate +} /** * @description Get Interaction Template argument message * - * @param {object} params - * @param {string} params.localization [localization="en-US"] - Localization code - * @param {string} params.messageKey - Message key - * @param {object} params.template - Interaction Template - * @returns {string} - Message + * @param {GetTemplateMessageParams} params + * @param {string} params.localization [localization="en-US"] Localization code + * @param {string} params.messageKey Message key + * @param {InteractionTemplate} params.template Interaction Template + * @returns {string} Message */ export function getTemplateMessage({ localization = "en-US", messageKey, template, -}) { +}: GetTemplateMessageParams): string | undefined { invariant( - messageKey, + messageKey as any, "getTemplateMessage({ messageKey }) -- messageKey must be defined" ) invariant( @@ -24,7 +31,7 @@ export function getTemplateMessage({ ) invariant( - localization, + localization as any, "getTemplateMessage({ localization }) -- localization must be defined" ) invariant( @@ -41,15 +48,17 @@ export function getTemplateMessage({ "getTemplateMessage({ template }) -- template must be an object" ) invariant( - typeof template.f_type === "InteractionTemplate", + template.f_type === "InteractionTemplate", "getTemplateMessage({ template }) -- template object must be an InteractionTemplate" ) switch (template.f_version) { case "1.1.0": - const msg = template?.data?.messages?.find(a => a.key === messageKey) + const msg = template?.data?.messages?.find( + (a: any) => a.key === messageKey + ) if (!msg) return undefined - const lzn = msg?.i18n?.find(a => a.tag === localization) + const lzn = msg?.i18n?.find((a: any) => a.tag === localization) if (!lzn) return undefined return lzn.translation case "1.0.0": diff --git a/packages/fcl-core/src/interaction-template-utils/index.js b/packages/fcl-core/src/interaction-template-utils/index.ts similarity index 58% rename from packages/fcl-core/src/interaction-template-utils/index.js rename to packages/fcl-core/src/interaction-template-utils/index.ts index 5187a1265..2174369b9 100644 --- a/packages/fcl-core/src/interaction-template-utils/index.js +++ b/packages/fcl-core/src/interaction-template-utils/index.ts @@ -1,16 +1,16 @@ -export {getInteractionTemplateAudits} from "./get-interaction-template-audits.js" +export {getInteractionTemplateAudits} from "./get-interaction-template-audits" export { generateDependencyPin, generateDependencyPinAtLatestSealedBlock, -} from "./generate-dependency-pin/generate-dependency-pin.js" +} from "./generate-dependency-pin/generate-dependency-pin" export { generateTemplateId, verifyGeneratedTemplateId, -} from "./generate-template-id/generate-template-id.js" +} from "./generate-template-id/generate-template-id" export { verifyDependencyPinsSame, verifyDependencyPinsSameAtLatestSealedBlock, -} from "./verify-dependency-pin-same-at-block.js" -export {deriveCadenceByNetwork} from "./derive-cadence-by-network/derive-cadence-by-network.js" -export {getTemplateMessage} from "./get-template-message.js" -export {getTemplateArgumentMessage} from "./get-template-argument-message.js" +} from "./verify-dependency-pin-same-at-block" +export {deriveCadenceByNetwork} from "./derive-cadence-by-network/derive-cadence-by-network" +export {getTemplateMessage} from "./get-template-message" +export {getTemplateArgumentMessage} from "./get-template-argument-message" diff --git a/packages/fcl-core/src/interaction-template-utils/interaction-template.ts b/packages/fcl-core/src/interaction-template-utils/interaction-template.ts new file mode 100644 index 000000000..018b12113 --- /dev/null +++ b/packages/fcl-core/src/interaction-template-utils/interaction-template.ts @@ -0,0 +1,147 @@ +export interface ImportItem { + contractName: string + address: string + contract: string +} + +export interface InteractionTemplateI18n { + tag: string + translation: string +} + +export interface InteractionTemplateMessage { + key: string + i18n: InteractionTemplateI18n[] +} + +export interface InteractionTemplateParameter { + label: string + index: number + type: string + balance?: string + messages: InteractionTemplateMessage[] +} + +export interface InteractionTemplateNetwork { + network: string + address: string + dependency_pin?: string + dependency_pin_block_height?: number +} + +export interface InteractionTemplateContract { + contract: string + networks: InteractionTemplateNetwork[] +} + +export interface InteractionTemplateDependency { + contracts: InteractionTemplateContract[] +} + +export interface InteractionTemplateCadence { + body: string +} + +// Version 1.0.0 specific types +export interface InteractionTemplateData100 { + type: string + interface: string + messages: Record}> + cadence: string + dependencies: Record< + string, + Record< + string, + Record< + string, + { + address: string + contract: string + fq_address: string + pin: string + pin_block_height: number + } + > + > + > + arguments: Record< + string, + { + index: number + type: string + balance?: string + messages: Record}> + } + > +} + +// Version 1.1.0 specific types +export interface InteractionTemplateData110 { + type: string + interface: string + messages: InteractionTemplateMessage[] + cadence: InteractionTemplateCadence + dependencies: InteractionTemplateDependency[] + parameters: InteractionTemplateParameter[] +} + +export interface InteractionTemplate100 { + f_type: "InteractionTemplate" + f_version: "1.0.0" + id: string + data: InteractionTemplateData100 +} + +export interface InteractionTemplate110 { + f_type: "InteractionTemplate" + f_version: "1.1.0" + id: string + data: InteractionTemplateData110 +} + +export type InteractionTemplate = + | InteractionTemplate100 + | InteractionTemplate110 + +// Utility types for function parameters +export interface GenerateTemplateIdParams { + template: InteractionTemplate +} + +export interface GetInteractionTemplateAuditsParams { + template: InteractionTemplate + auditors?: string[] +} + +export interface GetInteractionTemplateAuditsOpts { + flowInteractionAuditContract?: string +} + +export interface DeriveCadenceByNetworkParams { + network: string + template: InteractionTemplate +} + +export interface GetTemplateMessageParams { + localization?: string + messageKey: string + template: InteractionTemplate +} + +export interface GetTemplateArgumentMessageParams { + localization?: string + argumentLabel: string + messageKey: string + template: InteractionTemplate +} + +export interface GenerateDependencyPinParams { + address: string + contractName: string + blockHeight: number +} + +export interface VerifyDependencyPinsSameParams { + template: InteractionTemplate + blockHeight?: number +} diff --git a/packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.js b/packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.ts similarity index 95% rename from packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.js rename to packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.ts index af68a88d0..2fbbc7f89 100644 --- a/packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.js +++ b/packages/fcl-core/src/interaction-template-utils/utils/find-imports.test.ts @@ -1,5 +1,5 @@ -import {findImports} from "./find-imports.js" -import {generateImport} from "./generate-import.js" +import {findImports} from "./find-imports" +import {generateImport} from "./generate-import" describe("Find imports", () => { const cadenceA = ` diff --git a/packages/fcl-core/src/interaction-template-utils/utils/find-imports.js b/packages/fcl-core/src/interaction-template-utils/utils/find-imports.ts similarity index 62% rename from packages/fcl-core/src/interaction-template-utils/utils/find-imports.js rename to packages/fcl-core/src/interaction-template-utils/utils/find-imports.ts index 87d55a764..f903dd4d3 100644 --- a/packages/fcl-core/src/interaction-template-utils/utils/find-imports.js +++ b/packages/fcl-core/src/interaction-template-utils/utils/find-imports.ts @@ -1,7 +1,8 @@ -import {generateImport} from "./generate-import.js" +import {generateImport} from "./generate-import" +import {ImportItem} from "../interaction-template" -export function findImports(cadence) { - const imports = [] +export function findImports(cadence: string): ImportItem[] { + const imports: ImportItem[] = [] const importsReg = /import ((\w|,| )+)* from 0x\w+/g const fileImports = cadence.match(importsReg) || [] @@ -11,12 +12,12 @@ export function findImports(cadence) { const importLine = importLineReg.exec(fileImport) const contractsReg = /((?:\w+)+),?/g - const contracts = importLine[1].match(contractsReg) || [] + const contracts = importLine?.[1].match(contractsReg) || [] for (const contract of contracts) { imports.push( generateImport({ - address: importLine[3], + address: importLine?.[3]!, contractName: contract.replace(/,/g, ""), }) ) diff --git a/packages/fcl-core/src/interaction-template-utils/utils/generate-import.js b/packages/fcl-core/src/interaction-template-utils/utils/generate-import.js deleted file mode 100644 index de0227dee..000000000 --- a/packages/fcl-core/src/interaction-template-utils/utils/generate-import.js +++ /dev/null @@ -1,3 +0,0 @@ -export function generateImport({contractName, address}) { - return {contractName, address, contract: ""} -} diff --git a/packages/fcl-core/src/interaction-template-utils/utils/generate-import.ts b/packages/fcl-core/src/interaction-template-utils/utils/generate-import.ts new file mode 100644 index 000000000..7e652f141 --- /dev/null +++ b/packages/fcl-core/src/interaction-template-utils/utils/generate-import.ts @@ -0,0 +1,13 @@ +import {ImportItem} from "../interaction-template" + +export interface GenerateImportParams { + contractName: string + address: string +} + +export function generateImport({ + contractName, + address, +}: GenerateImportParams): ImportItem { + return {contractName, address, contract: ""} +} diff --git a/packages/fcl-core/src/interaction-template-utils/utils/hash.js b/packages/fcl-core/src/interaction-template-utils/utils/hash.ts similarity index 75% rename from packages/fcl-core/src/interaction-template-utils/utils/hash.js rename to packages/fcl-core/src/interaction-template-utils/utils/hash.ts index 14917c2b4..a221db79b 100644 --- a/packages/fcl-core/src/interaction-template-utils/utils/hash.js +++ b/packages/fcl-core/src/interaction-template-utils/utils/hash.ts @@ -1,7 +1,7 @@ import {SHA3} from "sha3" import {Buffer} from "@onflow/rlp" -export function genHash(utf8String) { +export function genHash(utf8String: string): string { const sha = new SHA3(256) sha.update(Buffer.from(utf8String, "utf8")) return sha.digest("hex") diff --git a/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.js b/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.js deleted file mode 100644 index cb347ade8..000000000 --- a/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @description - Replaces string imports with the actual contract address - * - * @param {object} param - * @param {string} param.cadence - * @param {object} param.networkDependencies - * @returns {string} - Cadence - */ -export function replaceStringImports({cadence, networkDependencies}) { - return Object.keys(networkDependencies).reduce((c, contractName) => { - const address = networkDependencies[contractName] - const regex = new RegExp(`import "\\b${contractName}\\b"`, "g") - return c.replace(regex, `import ${contractName} from ${address}`) - }, cadence) -} diff --git a/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.test.js b/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.test.ts similarity index 100% rename from packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.test.js rename to packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.test.ts diff --git a/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.ts b/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.ts new file mode 100644 index 000000000..7b1e8a2ec --- /dev/null +++ b/packages/fcl-core/src/interaction-template-utils/utils/replace-string-imports.ts @@ -0,0 +1,23 @@ +export interface ReplaceStringImportsParams { + cadence: string + networkDependencies: Record +} + +/** + * @description Replaces string imports with the actual contract address + * + * @param {ReplaceStringImportsParams} param + * @param {string} param.cadence The Cadence code + * @param {object} param.networkDependencies Network dependencies mapping + * @returns {string} Cadence code with replaced imports + */ +export function replaceStringImports({ + cadence, + networkDependencies, +}: ReplaceStringImportsParams): string { + return Object.keys(networkDependencies).reduce((c, contractName) => { + const address = networkDependencies[contractName] + const regex = new RegExp(`import "\\b${contractName}\\b"`, "g") + return c.replace(regex, `import ${contractName} from ${address}`) + }, cadence) +} diff --git a/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.js b/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.ts similarity index 99% rename from packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.js rename to packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.ts index 945d3fbac..0dfd8c679 100644 --- a/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.js +++ b/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.test.ts @@ -1,4 +1,4 @@ -import {verifyDependencyPinsSame} from "./verify-dependency-pin-same-at-block.js" +import {verifyDependencyPinsSame} from "./verify-dependency-pin-same-at-block" import {config} from "@onflow/config" const returnedAccount = { @@ -423,7 +423,7 @@ describe("1.1.0, verify dependency pin same", () => { }) afterAll(() => { - console.warn.mockRestore() + //console.warn.mockRestore() }) test("v1.1.0, get dependency pin", async () => { @@ -431,7 +431,7 @@ describe("1.1.0, verify dependency pin same", () => { config.put("accessNode.api", "https://rest-mainnet.onflow.org") const isVerified = await verifyDependencyPinsSame({ - template: template, + template: template as any, blockHeight: 70493190, network: "mainnet", }) diff --git a/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.js b/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.ts similarity index 76% rename from packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.js rename to packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.ts index 2863988e1..973500342 100644 --- a/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.js +++ b/packages/fcl-core/src/interaction-template-utils/verify-dependency-pin-same-at-block.ts @@ -1,21 +1,37 @@ -import {generateDependencyPin} from "./generate-dependency-pin/generate-dependency-pin.js" +import {generateDependencyPin} from "./generate-dependency-pin/generate-dependency-pin" import {invariant, block} from "@onflow/sdk" import {log, LEVELS} from "@onflow/util-logger" +import {InteractionTemplate} from "./interaction-template" + +export interface VerifyDependencyPinsSameParams { + template: InteractionTemplate + blockHeight?: number + network: string +} + +export interface VerifyDependencyPinsSameOpts { + [key: string]: any +} + +export interface VerifyDependencyPinsSameAtLatestSealedBlockParams { + template: InteractionTemplate + network: string +} /** * @description Checks if an Interaction Template's pins match those generated at a block height * - * @param {object} params - * @param {object} params.template - Interaction Template to check pins for - * @param {number} params.blockHeight - Block height to check pins at - * @param {string} params.network - Network to check pins on - * @param {object} opts - * @returns {Promise} - Whether or not the pins match + * @param {VerifyDependencyPinsSameParams} params + * @param {InteractionTemplate} params.template Interaction Template to check pins for + * @param {number} params.blockHeight Block height to check pins at + * @param {string} params.network Network to check pins on + * @param {VerifyDependencyPinsSameOpts} opts + * @returns {Promise} Whether or not the pins match */ export async function verifyDependencyPinsSame( - {template, blockHeight, network}, - opts = {} -) { + {template, blockHeight, network}: VerifyDependencyPinsSameParams, + opts: VerifyDependencyPinsSameOpts = {} +): Promise { invariant( template != undefined, "generateDependencyPin({ template }) -- template must be defined" @@ -115,13 +131,13 @@ export async function verifyDependencyPinsSame( opts ) - if (pin !== net.dependency_pin.pin) { + if (pin !== (net as any).dependency_pin.pin) { log({ title: "verifyDependencyPinsSame Debug Error", message: `Could not recompute and match dependency pin. address: ${net.address} | contract: ${contract.contract} computed: ${pin} - template: ${net.pin} + template: ${(net as any).pin} `, level: LEVELS.debug, }) @@ -145,16 +161,16 @@ export async function verifyDependencyPinsSame( /** * @description Checks if an Interaction Template's pins match those generated at the latest block height * - * @param {object} params - * @param {object} params.template - Interaction Template to check pins for - * @param {string} params.network - Network to check pins on - * @param {object} opts - * @returns {Promise} - Whether or not the pins match + * @param {VerifyDependencyPinsSameAtLatestSealedBlockParams} params + * @param {InteractionTemplate} params.template Interaction Template to check pins for + * @param {string} params.network Network to check pins on + * @param {VerifyDependencyPinsSameOpts} opts + * @returns {Promise} Whether or not the pins match */ export async function verifyDependencyPinsSameAtLatestSealedBlock( - {template, network}, - opts = {} -) { + {template, network}: VerifyDependencyPinsSameAtLatestSealedBlockParams, + opts: VerifyDependencyPinsSameOpts = {} +): Promise { const latestSealedBlock = await block({sealed: true}) const latestSealedBlockHeight = latestSealedBlock?.height From 9731c62e78a3744e0a80b48533983eda1d7c9e89 Mon Sep 17 00:00:00 2001 From: Michael Fabozzi <39808567+mfbz@users.noreply.github.com> Date: Fri, 13 Jun 2025 15:42:26 +0200 Subject: [PATCH 2/3] Update packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts Co-authored-by: Jordan Ribbink <17958158+jribbink@users.noreply.github.com> --- .../generate-template-id/generate-template-id-1.1.0.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts index a979f8f77..88a36cfb9 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts +++ b/packages/fcl-core/src/interaction-template-utils/generate-template-id/generate-template-id-1.1.0.ts @@ -67,7 +67,7 @@ export async function generateTemplateId({ template: InteractionTemplate110 }): Promise { invariant( - template as any, + !!template, "generateTemplateId({ template }) -- template must be defined" ) invariant( From bc4c854eda76984cd3425aa8f36edffa11e6e4c7 Mon Sep 17 00:00:00 2001 From: mfbz Date: Fri, 13 Jun 2025 15:59:35 +0200 Subject: [PATCH 3/3] Improved dependency pin test --- .../generate-dependency-pin/generate-dependency-pin.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts index 61fd1bb48..ada4fc5d3 100644 --- a/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts +++ b/packages/fcl-core/src/interaction-template-utils/generate-dependency-pin/generate-dependency-pin.test.ts @@ -275,12 +275,14 @@ jest.mock("@onflow/sdk", () => ({ })) describe("1.1.0, generate dependency pin", () => { + let warnSpy: jest.SpyInstance + beforeAll(() => { - jest.spyOn(console, "warn").mockImplementation(() => {}) + warnSpy = jest.spyOn(console, "warn").mockImplementation(() => {}) }) afterAll(() => { - //console.warn.mockRestore() + warnSpy.mockRestore() }) test("v1.1.0, get dependency pin", async () => {