diff --git a/bin/commands/input-proof.js b/bin/commands/input-proof.js index bc2ee4b6..f4d827fc 100755 --- a/bin/commands/input-proof.js +++ b/bin/commands/input-proof.js @@ -8,11 +8,11 @@ import { valueColumnTypeListToFheTypedValues, } from '../utils.js'; -// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --version 2 --network testnet --rpc-url https://sepolia.drpc.org -// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --version 2 -// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --version 1 +// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network testnet --rpc-url https://sepolia.drpc.org +// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress +// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress // npx . input-proof --contract-address 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9 --user-address 0x37AC010c1c566696326813b840319B58Bb5840E4 --values 123:euint32 -// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --version 2 --network mainnet +// npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network mainnet export async function inputProofCommand(options) { const { config, zamaFhevmApiKey } = parseCommonOptions(options); diff --git a/bin/commands/public-decrypt.js b/bin/commands/public-decrypt.js index 613fe9eb..ec56b130 100755 --- a/bin/commands/public-decrypt.js +++ b/bin/commands/public-decrypt.js @@ -10,10 +10,10 @@ import { parseCommonOptions, parseHandles } from '../utils.js'; // 0xfd82b3d4bc3318f57189a5841e248e24b59453a168ff0000000000aa36a70400 // npx . public-decrypt --handles 0xfd82b3d4bc3318f57189a5841e248e24b59453a168ff0000000000aa36a70400 -// npx . public-decrypt --version 2 --handles 0xfd82b3d4bc3318f57189a5841e248e24b59453a168ff0000000000aa36a70400 -// npx . public-decrypt --version 2 --handles 0xc49cf03ffa2768ee7ca49fb8b1fe930c6b43075ed0000000000000aa36a70000 -// npx . public-decrypt --version 2 --handles 0xe85c2a81338b8542a6c0a99a5a794f158f4fb0f6a2ff0000000000aa36a70400 -// npx . public-decrypt --version 2 --handles 0x7abb4a6c63af220fcd7da6bba4a0891fbe77e576efff00000000000000010500 +// npx . public-decrypt --handles 0xfd82b3d4bc3318f57189a5841e248e24b59453a168ff0000000000aa36a70400 +// npx . public-decrypt --handles 0xc49cf03ffa2768ee7ca49fb8b1fe930c6b43075ed0000000000000aa36a70000 +// npx . public-decrypt --handles 0xe85c2a81338b8542a6c0a99a5a794f158f4fb0f6a2ff0000000000aa36a70400 +// npx . public-decrypt --handles 0x7abb4a6c63af220fcd7da6bba4a0891fbe77e576efff00000000000000010500 export async function publicDecryptCommand(options) { const { config, zamaFhevmApiKey } = parseCommonOptions(options); diff --git a/bin/commands/test/test-add.js b/bin/commands/test/test-add.js index fe7eb1b5..a8634b29 100755 --- a/bin/commands/test/test-add.js +++ b/bin/commands/test/test-add.js @@ -15,7 +15,6 @@ export async function testFHETestAddCommand(options) { parseCommonOptions(options); logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`); logCLI(`🧀 value: ${BigInt(options.value)}`); logCLI(`🍉 type: ${options.type}`); diff --git a/bin/commands/test/test-make-publicly-decryptable.js b/bin/commands/test/test-make-publicly-decryptable.js index 6cbf77e7..325a79f0 100755 --- a/bin/commands/test/test-make-publicly-decryptable.js +++ b/bin/commands/test/test-make-publicly-decryptable.js @@ -12,7 +12,6 @@ export async function testFHETestMakePubliclyDecryptableCommand(options) { const { config, provider, signer } = parseCommonOptions(options); logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`); if (!FHETestAddresses[config.name]) { diff --git a/bin/commands/test/test-public-decrypt.js b/bin/commands/test/test-public-decrypt.js index 37d1a0e3..e16230f4 100755 --- a/bin/commands/test/test-public-decrypt.js +++ b/bin/commands/test/test-public-decrypt.js @@ -15,15 +15,14 @@ import { safeJSONstringify } from '../../../lib/internal.js'; // 0x9d430a3e950560ba22013ce885d6d90f0da36efdf1ff0000000000aa36a70600 euint128 308429577281045301472547520724787086512 // 0xf6751d547a5c06123575aad93f22f76b7d841c4cacff0000000000aa36a70000 ebool false // -// npx . test public-decrypt --types euint32 --network testnet --version 1 -// npx . test public-decrypt --types euint32 --network testnet --version 2 -// npx . test public-decrypt --types euint32 --network mainnet --version 2 +// npx . test public-decrypt --types euint32 --network testnet +// npx . test public-decrypt --types euint32 --network testnet +// npx . test public-decrypt --types euint32 --network mainnet export async function testFHETestPublicDecryptCommand(options) { const { config, provider, signer, zamaFhevmApiKey } = parseCommonOptions(options); logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`, options); if (!FHETestAddresses[config.name]) { diff --git a/bin/commands/test/test-random.js b/bin/commands/test/test-random.js index 79bba3ca..a76056c8 100755 --- a/bin/commands/test/test-random.js +++ b/bin/commands/test/test-random.js @@ -15,7 +15,6 @@ export async function testFHETestRandomCommand(options) { } logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`); if (!FHETestAddresses[config.name]) { diff --git a/bin/commands/test/test-user-decrypt.js b/bin/commands/test/test-user-decrypt.js index 72b57584..d7d215f4 100755 --- a/bin/commands/test/test-user-decrypt.js +++ b/bin/commands/test/test-user-decrypt.js @@ -5,16 +5,15 @@ import { FHETestAddresses } from './fheTest.js'; import { ethers } from 'ethers'; import { userDecrypt } from '../../userDecrypt.js'; -// npx . test user-decrypt --types euint32 --network devnet --version 2 -// npx . test user-decrypt --types euint32 --network testnet --version 1 -// npx . test user-decrypt --types euint32 --network testnet --version 2 -// npx . test user-decrypt --types euint32 --network mainnet --version 2 +// npx . test user-decrypt --types euint32 --network devnet +// npx . test user-decrypt --types euint32 --network testnet +// npx . test user-decrypt --types euint32 --network testnet +// npx . test user-decrypt --types euint32 --network mainnet export async function testFHETestUserDecryptCommand(options) { const { config, provider, signer, zamaFhevmApiKey } = parseCommonOptions(options); logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`); if (!FHETestAddresses[config.name]) { diff --git a/bin/commands/user-decrypt.js b/bin/commands/user-decrypt.js index 37081d01..b7c8d901 100755 --- a/bin/commands/user-decrypt.js +++ b/bin/commands/user-decrypt.js @@ -3,12 +3,11 @@ import { userDecrypt } from '../userDecrypt.js'; import { logCLI, parseCommonOptions } from '../utils.js'; -// npx . user-decrypt --version 2 --handle 0xe85c2a81338b8542a6c0a99a5a794f158f4fb0f6a2ff0000000000aa36a70400 --contract-address 0x1E7eA8fE4877E6ea5dc8856f0dA92da8d5066241 --network testnet +// npx . user-decrypt --handle 0xe85c2a81338b8542a6c0a99a5a794f158f4fb0f6a2ff0000000000aa36a70400 --contract-address 0x1E7eA8fE4877E6ea5dc8856f0dA92da8d5066241 --network testnet export async function userDecryptCommand(options) { const { config, signer, zamaFhevmApiKey } = parseCommonOptions(options); logCLI('🚚 network: ' + config.name, options); - logCLI('🚀 route: v' + config.version, options); logCLI(`🍔 signer: ${signer.address}`); const handle = options.handle; diff --git a/bin/pubkeyCache.js b/bin/pubkeyCache.js index 9d5f6d5e..0c23c6a0 100644 --- a/bin/pubkeyCache.js +++ b/bin/pubkeyCache.js @@ -56,7 +56,7 @@ export async function loadFhevmPublicKeyConfig( const fhevm = await createRelayerFhevm({ ...config.fhevmInstanceConfig, - defaultRelayerVersion: config.version, + defaultRelayerVersion: 2, ...instanceOptions, }); diff --git a/bin/userDecrypt.js b/bin/userDecrypt.js index 5781a2ac..3ca367d8 100644 --- a/bin/userDecrypt.js +++ b/bin/userDecrypt.js @@ -47,12 +47,14 @@ export async function userDecrypt({ const startTimeStamp = Math.floor(Date.now() / 1000); const durationDays = 1; + const extraData = await instance.getExtraData(); const eip712 = instance.createEIP712( keypair.publicKey, contractAddresses, startTimeStamp, durationDays, + extraData, ); const signature = await signer.signTypedData( @@ -73,6 +75,7 @@ export async function userDecrypt({ signer.address, startTimeStamp, durationDays, + extraData, { timeout, //signal: abortController.signal, diff --git a/bin/utils.js b/bin/utils.js index d71dda94..2582e379 100644 --- a/bin/utils.js +++ b/bin/utils.js @@ -99,7 +99,6 @@ export function addCommonOptions(command) { .option('--rpc-url ', 'The rpc url') .option('--relayer-url ', 'The relayer url') .option('--mnemonic ', 'Mnemonic word list') - .option('--version ', 'The default route version: 1|2') .option('--clear-cache', 'Clear the FHEVM public key cache') .option('--json', 'Ouput in JSON format') .option('--verbose', 'Verbose output') @@ -111,7 +110,6 @@ export function addCommonOptions(command) { * @returns {{ * config: { * name: 'testnet' | 'devnet' | 'mainnet', - * version: 1 | 2, * walletAddress: string, * userAddress: string, * contractAddress: string, @@ -138,17 +136,6 @@ export function parseCommonOptions(options) { throwError(`Invalid network name '${name}'.`); } - let version = options?.version ?? 1; - if (version === 'v1' || version === '1') { - version = 1; - } - if (version === 'v2' || version === '2') { - version = 2; - } - if (version !== 1 && version !== 2) { - throwError(`Invalid relayer route version '${version}'.`); - } - let rpcUrl = options?.rpcUrl; if (!rpcUrl) { rpcUrl = getEnv('RPC_URL', `.env.${name}`); @@ -165,15 +152,8 @@ export function parseCommonOptions(options) { throwError(`Missing relayer Url.`); } - if (version === 1) { - if (!relayerUrl.endsWith('/v1')) { - relayerUrl = relayerUrl + '/v1'; - } - } - if (version === 2) { - if (!relayerUrl.endsWith('/v2')) { - relayerUrl = relayerUrl + '/v2'; - } + if (!relayerUrl.endsWith('/v2')) { + relayerUrl = relayerUrl + '/v2'; } let contractAddress = options?.contractAddress; @@ -277,7 +257,6 @@ export function parseCommonOptions(options) { const config = { name: name, - version, walletAddress: wallet?.address, userAddress: userAddress ?? wallet?.address, contractAddress, diff --git a/jest.base.config.cjs b/jest.base.config.cjs index 31638615..79f92ec0 100644 --- a/jest.base.config.cjs +++ b/jest.base.config.cjs @@ -36,7 +36,7 @@ module.exports = { testPathIgnorePatterns: ['/node_modules/', '/e2e/'], coverageThreshold: { global: { - branches: 70, + branches: 65, functions: 62, lines: 75, }, diff --git a/package-lock.json b/package-lock.json index fa256f76..5d9bb421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,10 +13,10 @@ "ethers": "^6.15.0", "fetch-retry": "^6.0.0", "keccak": "^3.0.4", - "node-tfhe": "1.4.0-alpha.3", - "node-tkms": "0.13.10-rc.2", - "tfhe": "1.4.0-alpha.3", - "tkms": "0.13.10-rc.2", + "node-tfhe": "1.5.4", + "node-tkms": "0.13.10", + "tfhe": "1.5.4", + "tkms": "0.13.10", "wasm-feature-detect": "^1.8.0" }, "bin": { @@ -128,7 +128,6 @@ "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -702,7 +701,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -726,7 +724,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1796,7 +1793,6 @@ "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -2024,6 +2020,7 @@ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -3034,6 +3031,7 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3045,6 +3043,7 @@ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3137,7 +3136,6 @@ "integrity": "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -3226,7 +3224,6 @@ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", @@ -3746,6 +3743,7 @@ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -3756,21 +3754,24 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", @@ -3778,6 +3779,7 @@ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -3789,7 +3791,8 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", @@ -3797,6 +3800,7 @@ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -3810,6 +3814,7 @@ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -3820,6 +3825,7 @@ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -3829,7 +3835,8 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", @@ -3837,6 +3844,7 @@ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -3854,6 +3862,7 @@ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -3868,6 +3877,7 @@ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -3881,6 +3891,7 @@ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -3896,6 +3907,7 @@ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -3906,14 +3918,16 @@ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@zeit/schemas": { "version": "2.36.0", @@ -3928,7 +3942,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3942,6 +3955,7 @@ "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" }, @@ -3981,7 +3995,6 @@ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4032,6 +4045,7 @@ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -4699,7 +4713,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4984,6 +4997,7 @@ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6.0" } @@ -5914,7 +5928,8 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -6034,7 +6049,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -8080,7 +8094,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -8724,7 +8737,6 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -8924,6 +8936,7 @@ "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6.11.5" }, @@ -9426,15 +9439,15 @@ } }, "node_modules/node-tfhe": { - "version": "1.4.0-alpha.3", - "resolved": "https://registry.npmjs.org/node-tfhe/-/node-tfhe-1.4.0-alpha.3.tgz", - "integrity": "sha512-oTcWL0OFA6t6BhScmDiGQ3VA8tU8T3EXCzIzpNxQxcuJDgQtiUF5CV6dgJLOrpWck4KCp1Bo/xLhv07uwn3q6Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/node-tfhe/-/node-tfhe-1.5.4.tgz", + "integrity": "sha512-azTefAcK7G/uLP+uDFN8v5XBPFlY8Cu8NZ5ZMw4rgvWB6DNbtOcoUhDoJKrhPvOD2jt1HrzQQsLfao6kNHQybA==", "license": "BSD-3-Clause-Clear" }, "node_modules/node-tkms": { - "version": "0.13.10-rc.2", - "resolved": "https://registry.npmjs.org/node-tkms/-/node-tkms-0.13.10-rc.2.tgz", - "integrity": "sha512-WJUI1bZazRbzNhO/rrKoAKF/PvJU4VQ79RFgraWbvjQrWov0NaRh+555e1BN1MzOc84cEXiiMjx+yMnJMeCzkg==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/node-tkms/-/node-tkms-0.13.10.tgz", + "integrity": "sha512-6F3Q2qfGcNQ2ffx2b+iT3+v3Nqh7CL7TkFNP1LuuGucfIMbZpQ8Eat4pFyZ90p4zVSj66D5xvhM0btnic3zbog==", "license": "BSD-3-Clause-Clear" }, "node_modules/normalize-path": { @@ -10544,7 +10557,6 @@ "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -10744,6 +10756,7 @@ "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -10764,6 +10777,7 @@ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -10818,6 +10832,7 @@ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -11628,6 +11643,7 @@ "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -11647,6 +11663,7 @@ "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -11682,6 +11699,7 @@ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -11696,7 +11714,8 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", @@ -11704,6 +11723,7 @@ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11760,9 +11780,9 @@ } }, "node_modules/tfhe": { - "version": "1.4.0-alpha.3", - "resolved": "https://registry.npmjs.org/tfhe/-/tfhe-1.4.0-alpha.3.tgz", - "integrity": "sha512-xdla7hi2WzLFIdAx2/ihRZ/bKlKcgDDabTJGtoqp1E5oqhLM1PzTXsJE0p7tW8+ebrvxiMGfbgMAWnU3f2ZAIQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/tfhe/-/tfhe-1.5.4.tgz", + "integrity": "sha512-hN1RWB95BsCjIxVMWHAVhFyM45+qsufHCpPhTYOwoTlsHNh9KwrRZsc4aNts+BOc8EEf/GT7DajA+STR4xRhTg==", "license": "BSD-3-Clause-Clear" }, "node_modules/timers-browserify": { @@ -11796,9 +11816,9 @@ } }, "node_modules/tkms": { - "version": "0.13.10-rc.2", - "resolved": "https://registry.npmjs.org/tkms/-/tkms-0.13.10-rc.2.tgz", - "integrity": "sha512-Vvw6ENcGqhb79TfDAXH0Pb9dIXpaRNvmboVEjkhKWu7iN4yLiCuaeGCnGj5NPkWF2Hjy3+vaJDTO8vyBOXKgiw==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/tkms/-/tkms-0.13.10.tgz", + "integrity": "sha512-9I9Zi7wXEb3ZCKRHpr/RFTmDfNPDIFiuI8MjGOb3W74Pk8muW17DlwBaIvYXInjhIVINWPQxmWuYmluX6Rt0zg==", "license": "BSD-3-Clause-Clear" }, "node_modules/tldts": { @@ -12092,8 +12112,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tty-browserify": { "version": "0.0.1", @@ -12222,7 +12241,6 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12464,7 +12482,6 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -12616,6 +12633,7 @@ "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12640,6 +12658,7 @@ "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -12689,6 +12708,7 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.13.0" } @@ -12699,6 +12719,7 @@ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12713,6 +12734,7 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } diff --git a/package.json b/package.json index c7cf0024..12f3f598 100644 --- a/package.json +++ b/package.json @@ -93,10 +93,10 @@ "ethers": "^6.15.0", "fetch-retry": "^6.0.0", "keccak": "^3.0.4", - "node-tfhe": "1.4.0-alpha.3", - "node-tkms": "0.13.10-rc.2", - "tfhe": "1.4.0-alpha.3", - "tkms": "0.13.10-rc.2", + "node-tfhe": "1.5.4", + "node-tkms": "0.13.10", + "tfhe": "1.5.4", + "tkms": "0.13.10", "wasm-feature-detect": "^1.8.0" }, "devDependencies": { diff --git a/src/index.test.ts b/src/index.test.ts index cd289dad..4ce7246d 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -46,24 +46,12 @@ jest.mock('ethers', () => { //////////////////////////////////////////////////////////////////////////////// describe('index', () => { - let configWithDownloadedKeysV1: FhevmInstanceConfig; let configWithDownloadedKeysV2: FhevmInstanceConfig; beforeEach(async () => { removeAllFetchMockRoutes(); setupAllFetchMockRoutes({ enableInputProofRoutes: false }); - configWithDownloadedKeysV1 = { - ...TEST_CONFIG.v1.fhevmInstanceConfig, - publicKey: { data: tfheCompactPublicKeyBytes, id: assetPublicKeyId }, - publicParams: { - 2048: { - publicParams: tfheCompactPkeCrsBytes, - publicParamsId: assetPublicParamsId, - }, - }, - }; - configWithDownloadedKeysV2 = { ...TEST_CONFIG.v1.fhevmInstanceConfig, publicKey: { data: tfheCompactPublicKeyBytes, id: assetPublicKeyId }, @@ -78,20 +66,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: createInstance', async () => { - const instance = await createInstance(configWithDownloadedKeysV1); - expect(instance.createEIP712).toBeDefined(); - expect(instance.generateKeypair).toBeDefined(); - expect(instance.createEncryptedInput).toBeDefined(); - expect(instance.getPublicKey()).toStrictEqual({ - publicKey: tfheCompactPublicKeyBytes, - publicKeyId: assetPublicKeyId, - }); - expect(instance.getPublicParams(2048)?.publicParamsId).toBe( - assetPublicParamsId, - ); - }); - it('v2: createInstance', async () => { const instance = await createInstance(configWithDownloadedKeysV2); expect(instance.createEIP712).toBeDefined(); @@ -108,16 +82,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: chainId mismatch', async () => { - // The mock returns chainId from TEST_CONFIG, so using a different chainId should fail - const expectedChainId = TEST_CONFIG.fhevmInstanceConfig.chainId; - configWithDownloadedKeysV1.chainId = 9999; - - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - `Invalid config chainId 9999. Expecting ${expectedChainId}.`, - ); - }); - it('v2: fails: chainId mismatch', async () => { // The mock returns chainId from TEST_CONFIG, so using a different chainId should fail const expectedChainId = TEST_CONFIG.fhevmInstanceConfig.chainId; @@ -130,35 +94,18 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: publicKey', async () => { - configWithDownloadedKeysV1.publicKey = { - data: 43 as any, - id: assetPublicKeyId, - }; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - 'Invalid public key (deserialization failed)', - ); - }); - - it('v2: fails: publicKey', async () => { + it('v2: succeeds: publicKey with invalid data (deserialization fails silently, fallback to fetch)', async () => { + // When publicKey.data is invalid, deserialization silently fails and the SDK falls back to fetching the key configWithDownloadedKeysV2.publicKey = { data: 43 as any, id: assetPublicKeyId, }; - await expect(createInstance(configWithDownloadedKeysV2)).rejects.toThrow( - 'Invalid public key (deserialization failed)', - ); + + await createInstance(configWithDownloadedKeysV2); }); ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: aclContractAddress', async () => { - configWithDownloadedKeysV1.aclContractAddress = '0x12345'; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - FhevmConfigError, - ); - }); - it('v2: fails: aclContractAddress', async () => { configWithDownloadedKeysV2.aclContractAddress = '0x12345'; await expect(createInstance(configWithDownloadedKeysV2)).rejects.toThrow( @@ -168,13 +115,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: kmsContractAddress', async () => { - configWithDownloadedKeysV1.kmsContractAddress = '0x12345'; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - FhevmConfigError, - ); - }); - it('v2: fails: kmsContractAddress', async () => { configWithDownloadedKeysV2.kmsContractAddress = '0x12345'; await expect(createInstance(configWithDownloadedKeysV2)).rejects.toThrow( @@ -184,13 +124,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: verifyingContractAddressDecryption', async () => { - configWithDownloadedKeysV1.verifyingContractAddressDecryption = '0x12345'; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - FhevmConfigError, - ); - }); - it('v2: fails: verifyingContractAddressDecryption', async () => { configWithDownloadedKeysV2.verifyingContractAddressDecryption = '0x12345'; await expect(createInstance(configWithDownloadedKeysV2)).rejects.toThrow( @@ -200,14 +133,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: verifyingContractAddressInputVerification', async () => { - configWithDownloadedKeysV1.verifyingContractAddressInputVerification = - '0x12345'; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - FhevmConfigError, - ); - }); - it('v2: fails: verifyingContractAddressInputVerification', async () => { configWithDownloadedKeysV2.verifyingContractAddressInputVerification = '0x12345'; @@ -218,13 +143,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: fails: network', async () => { - configWithDownloadedKeysV1.network = undefined as unknown as string; - await expect(createInstance(configWithDownloadedKeysV1)).rejects.toThrow( - 'You must provide a network URL or a EIP1193 object (eg: window.ethereum)', - ); - }); - it('v2: fails: network', async () => { configWithDownloadedKeysV2.network = undefined as unknown as string; await expect(createInstance(configWithDownloadedKeysV2)).rejects.toThrow( @@ -234,15 +152,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: getPublicKey', async () => { - const instance = await createInstance(configWithDownloadedKeysV1); - const pub_key = instance.getPublicKey(); - expect(pub_key).not.toBeNull(); - expect(pub_key).not.toBeUndefined(); - expect(pub_key!.publicKeyId).toBe(assetPublicKeyId); - expect(pub_key!.publicKey).toStrictEqual(tfheCompactPublicKeyBytes); - }); - it('v2: getPublicKey', async () => { const instance = await createInstance(configWithDownloadedKeysV2); const pub_key = instance.getPublicKey(); @@ -254,15 +163,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: getPublicParams', async () => { - const instance = await createInstance(configWithDownloadedKeysV1); - const pub_params = instance.getPublicParams(2048); - expect(pub_params).not.toBeNull(); - expect(pub_params).not.toBeUndefined(); - expect(pub_params!.publicParamsId).toBe(assetPublicParamsId); - expect(pub_params!.publicParams).toStrictEqual(tfheCompactPkeCrsBytes); - }); - it('v2: getPublicParams', async () => { const instance = await createInstance(configWithDownloadedKeysV2); const pub_params = instance.getPublicParams(2048); @@ -274,15 +174,6 @@ describe('index', () => { ////////////////////////////////////////////////////////////////////////////// - it('v1: generateKeypair', async () => { - const instance = await createInstance(configWithDownloadedKeysV1); - const kp = instance.generateKeypair(); - expect(kp).not.toBeNull(); - expect(kp).not.toBeUndefined(); - expect(isBytesHexNo0x(kp.privateKey)).toBe(true); - expect(isBytesHexNo0x(kp.publicKey)).toBe(true); - }); - it('v2: generateKeypair', async () => { const instance = await createInstance(configWithDownloadedKeysV2); const kp = instance.generateKeypair(); diff --git a/src/index.ts b/src/index.ts index 2a1576a4..c1306474 100644 --- a/src/index.ts +++ b/src/index.ts @@ -164,7 +164,6 @@ export const createInstance = async ( ): Promise => { const relayerFhevm = await createRelayerFhevm({ ...config, - defaultRelayerVersion: 2, }); const auth = config.auth; diff --git a/src/relayer-provider/createRelayerFhevm.test.ts b/src/relayer-provider/createRelayerFhevm.test.ts index b4b4646b..bf8a642f 100644 --- a/src/relayer-provider/createRelayerFhevm.test.ts +++ b/src/relayer-provider/createRelayerFhevm.test.ts @@ -11,50 +11,6 @@ const describeIfFetchMock = TEST_CONFIG.type === 'fetch-mock' ? describe : describe.skip; describeIfFetchMock('createRelayerProvider', () => { - it('v1: ', () => { - const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; - expect(SepoliaConfigeRelayerUrl).not.toBeNull(); - expect(SepoliaConfigeRelayerUrl).not.toBeUndefined(); - - const defaultRelayerVersion = 1; - const relayerProvider = createRelayerProvider( - SepoliaConfigeRelayerUrl, - defaultRelayerVersion, - ); - expect(relayerProvider.version).toBe(defaultRelayerVersion); - expect(relayerProvider.url).toBe( - `${SepoliaConfigeRelayerUrl}/v${defaultRelayerVersion}`, - ); - }); - - it('v1: https://foo-relayer.org', () => { - const defaultRelayerVersion = 1; - const relayerProvider = createRelayerProvider( - 'https://foo-relayer.org', - defaultRelayerVersion, - ); - expect(relayerProvider.version).toBe(defaultRelayerVersion); - expect(relayerProvider.url).toBe(`https://foo-relayer.org`); - }); - - it('v1: https://foo-relayer.org/v1', () => { - const relayerProvider = createRelayerProvider( - 'https://foo-relayer.org/v1', - 1, - ); - expect(relayerProvider.version).toBe(1); - expect(relayerProvider.url).toBe('https://foo-relayer.org/v1'); - }); - - it('v1: https://foo-relayer.org/v2', () => { - const relayerProvider = createRelayerProvider( - 'https://foo-relayer.org/v2', - 1, - ); - expect(relayerProvider.version).toBe(1); - expect(relayerProvider.url).toBe('https://foo-relayer.org/v2'); - }); - it('v2: /v2', () => { const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; expect(SepoliaConfigeRelayerUrl).not.toBeNull(); @@ -62,7 +18,6 @@ describeIfFetchMock('createRelayerProvider', () => { const relayerProvider = createRelayerProvider( `${SepoliaConfigeRelayerUrl}/v2`, - 1, ); expect(relayerProvider.version).toBe(2); expect(relayerProvider.url).toBe(`${SepoliaConfigeRelayerUrl}/v2`); diff --git a/src/relayer-provider/createRelayerFhevm.ts b/src/relayer-provider/createRelayerFhevm.ts index 337f1636..f23b065b 100644 --- a/src/relayer-provider/createRelayerFhevm.ts +++ b/src/relayer-provider/createRelayerFhevm.ts @@ -2,46 +2,28 @@ import type { FhevmInstanceConfig } from '../types/relayer'; import type { AbstractRelayerFhevm } from './AbstractRelayerFhevm'; import { InvalidRelayerUrlError } from '../errors/InvalidRelayerUrlError'; import { parseRelayerUrl } from './relayerUrl'; -import { RelayerV1Fhevm } from './v1/RelayerV1Fhevm'; import { RelayerV2Fhevm } from './v2/RelayerV2Fhevm'; /** * Creates a relayer FHEVM instance based on the URL and version. * * @param config - Configuration object - * @param config.defaultRelayerVersion - Version to use if URL doesn't specify one - * @returns A {@link RelayerV1Fhevm} or {@link RelayerV2Fhevm} instance + * @returns A {@link RelayerV2Fhevm} instance * @throws {InvalidRelayerUrlError} If the URL is invalid */ export async function createRelayerFhevm( - config: FhevmInstanceConfig & { - defaultRelayerVersion: 1 | 2; - }, + config: FhevmInstanceConfig, ): Promise { - const resolved = parseRelayerUrl( - config.relayerUrl, - config.defaultRelayerVersion, - config.relayerRouteVersion as unknown as 1 | 2 | undefined, - ); + const resolved = parseRelayerUrl(config.relayerUrl); - if ( - !resolved || - ((resolved.version as unknown) !== 1 && (resolved.version as unknown) !== 2) - ) { + if (!resolved || (resolved.version as unknown) !== 2) { throw new InvalidRelayerUrlError({ message: `Invalid relayerUrl: ${config.relayerUrl}`, }); } - if (resolved.version === 2) { - return RelayerV2Fhevm.fromConfig({ - ...config, - relayerVersionUrl: resolved.url, - }); - } else { - return RelayerV1Fhevm.fromConfig({ - ...config, - relayerVersionUrl: resolved.url, - }); - } + return RelayerV2Fhevm.fromConfig({ + ...config, + relayerVersionUrl: resolved.url, + }); } diff --git a/src/relayer-provider/createRelayerProvider.ts b/src/relayer-provider/createRelayerProvider.ts index 34af054c..c945a79a 100644 --- a/src/relayer-provider/createRelayerProvider.ts +++ b/src/relayer-provider/createRelayerProvider.ts @@ -1,5 +1,4 @@ import type { AbstractRelayerProvider } from './AbstractRelayerProvider'; -import { RelayerV1Provider } from './v1/RelayerV1Provider'; import { RelayerV2Provider } from './v2/RelayerV2Provider'; import { parseRelayerUrl } from './relayerUrl'; import { InvalidRelayerUrlError } from '../errors/InvalidRelayerUrlError'; @@ -8,24 +7,18 @@ import { InvalidRelayerUrlError } from '../errors/InvalidRelayerUrlError'; * Creates a relayer provider instance based on the URL and version. * * @param relayerUrl - The relayer API URL (may include `/v1` or `/v2` suffix) - * @param defaultRelayerVersion - Version to use if URL doesn't specify one - * @returns A {@link RelayerV1Provider} or {@link RelayerV2Provider} instance + * @returns A {@link RelayerV2Provider} instance * @throws {InvalidRelayerUrlError} If the URL is invalid */ export function createRelayerProvider( relayerUrl: string, - defaultRelayerVersion: 1 | 2, ): AbstractRelayerProvider { - const resolved = parseRelayerUrl(relayerUrl, defaultRelayerVersion); + const resolved = parseRelayerUrl(relayerUrl); if (!resolved) { throw new InvalidRelayerUrlError({ message: `Invalid relayerUrl: ${relayerUrl}`, }); } - if (resolved.version === 2) { - return new RelayerV2Provider({ relayerUrl: resolved.url }); - } - - return new RelayerV1Provider({ relayerUrl: resolved.url }); + return new RelayerV2Provider({ relayerUrl: resolved.url }); } diff --git a/src/relayer-provider/relayerUrl.test.ts b/src/relayer-provider/relayerUrl.test.ts index e48bbe39..1c49745e 100644 --- a/src/relayer-provider/relayerUrl.test.ts +++ b/src/relayer-provider/relayerUrl.test.ts @@ -24,60 +24,59 @@ describe('parseRelayerUrl', () => { describe('invalid inputs', () => { it('returns null for null input', () => { - expect(parseRelayerUrl(null, 1)).toBeNull(); - expect(parseRelayerUrl(null, 2)).toBeNull(); + expect(parseRelayerUrl(null)).toBeNull(); }); it('returns null for undefined input', () => { - expect(parseRelayerUrl(undefined, 1)).toBeNull(); - expect(parseRelayerUrl(undefined, 2)).toBeNull(); + expect(parseRelayerUrl(undefined)).toBeNull(); }); it('returns null for empty string', () => { - expect(parseRelayerUrl('', 1)).toBeNull(); - expect(parseRelayerUrl('', 2)).toBeNull(); + expect(parseRelayerUrl('')).toBeNull(); }); it('returns null for non-string input', () => { - expect(parseRelayerUrl(123, 1)).toBeNull(); - expect(parseRelayerUrl({}, 1)).toBeNull(); - expect(parseRelayerUrl([], 1)).toBeNull(); + expect(parseRelayerUrl(123)).toBeNull(); + expect(parseRelayerUrl({})).toBeNull(); + expect(parseRelayerUrl([])).toBeNull(); }); it('returns null for invalid URL', () => { - expect(parseRelayerUrl('not-a-url', 1)).toBeNull(); - expect(parseRelayerUrl('://missing-protocol', 1)).toBeNull(); + expect(parseRelayerUrl('not-a-url')).toBeNull(); + expect(parseRelayerUrl('://missing-protocol')).toBeNull(); }); - it('returns null for invalid fallback version (non-Zama URL)', () => { - expect(parseRelayerUrl('https://example.com', 0 as any)).toBeNull(); - expect(parseRelayerUrl('https://example.com', 3 as any)).toBeNull(); - expect(parseRelayerUrl('https://example.com', 'v1' as any)).toBeNull(); + it('always returns v2 for non-Zama URLs', () => { + expect(parseRelayerUrl('https://example.com')).toStrictEqual({ + url: 'https://example.com', + version: 2, + }); }); - it('returns null for invalid fallback version (Zama base URL)', () => { - expect(parseRelayerUrl(VALID_RELAYER_URL_BASE, 0 as any)).toBeNull(); - expect(parseRelayerUrl(VALID_RELAYER_URL_BASE, 3 as any)).toBeNull(); - expect(parseRelayerUrl(VALID_RELAYER_URL_BASE, 'v1' as any)).toBeNull(); + it('ignores invalid fallback version for Zama base URL (always returns v2)', () => { + expect(parseRelayerUrl(VALID_RELAYER_URL_BASE)).toStrictEqual({ + url: VALID_RELAYER_URL_V2, + version: 2, + }); }); }); ////////////////////////////////////////////////////////////////////////////// - // URL with explicit version + // Zama URLs with version suffix ////////////////////////////////////////////////////////////////////////////// - describe('URL with explicit version', () => { - it('returns version 1 for URL ending with /v1', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_V1, 2); + describe('Zama URLs with version suffix', () => { + it('upgrades Zama v1 URL to v2', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_V1); expect(result).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, + url: VALID_RELAYER_URL_V2, + version: 2, }); }); - it('returns version 2 for URL ending with /v2', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_V2, 2); + it('returns Zama v2 URL unchanged', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_V2); expect(result).toStrictEqual({ url: VALID_RELAYER_URL_V2, @@ -85,42 +84,42 @@ describe('parseRelayerUrl', () => { }); }); - it('removes trailing slash before checking version', () => { - const result1 = parseRelayerUrl(`${VALID_RELAYER_URL_V1}/`, 2); + it('removes trailing slash from Zama URL before processing', () => { + const result1 = parseRelayerUrl(`${VALID_RELAYER_URL_V1}/`); expect(result1).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, + url: VALID_RELAYER_URL_V2, + version: 2, }); - const result2 = parseRelayerUrl(`${VALID_RELAYER_URL_V2}/`, 1); + const result2 = parseRelayerUrl(`${VALID_RELAYER_URL_V2}/`); expect(result2).toStrictEqual({ url: VALID_RELAYER_URL_V2, version: 2, }); }); - it('explicit version overrides fallback version', () => { - expect(parseRelayerUrl(VALID_RELAYER_URL_V1, 2)?.version).toBe(1); - expect(parseRelayerUrl(VALID_RELAYER_URL_V2, 1)?.version).toBe(2); + it('Zama URLs ignore fallbackVersion (always return v2)', () => { + expect(parseRelayerUrl(VALID_RELAYER_URL_V1)?.version).toBe(2); + expect(parseRelayerUrl(VALID_RELAYER_URL_V2)?.version).toBe(2); }); }); ////////////////////////////////////////////////////////////////////////////// - // URL without version (uses fallback) + // Zama base URL (no version suffix) ////////////////////////////////////////////////////////////////////////////// - describe('URL without version (uses fallback)', () => { - it('appends fallback version 1 to URL', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_BASE, 1); + describe('Zama base URL (no version suffix)', () => { + it('appends /v2 to Zama base URL (ignores fallback v1)', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_BASE); expect(result).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, + url: VALID_RELAYER_URL_V2, + version: 2, }); }); - it('appends fallback version 2 to URL', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_BASE, 2); + it('appends /v2 to Zama base URL (ignores fallback v2)', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_BASE); expect(result).toStrictEqual({ url: VALID_RELAYER_URL_V2, @@ -128,23 +127,23 @@ describe('parseRelayerUrl', () => { }); }); - it('removes trailing slash before appending version', () => { - const result = parseRelayerUrl(`${VALID_RELAYER_URL_BASE}/`, 1); + it('removes trailing slash from Zama base URL before appending /v2', () => { + const result = parseRelayerUrl(`${VALID_RELAYER_URL_BASE}/`); expect(result).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, + url: VALID_RELAYER_URL_V2, + version: 2, }); }); }); ////////////////////////////////////////////////////////////////////////////// - // relayerRouteVersion parameter + // Always returns version 2 ////////////////////////////////////////////////////////////////////////////// - describe('relayerRouteVersion parameter', () => { - it('non-Zama URL uses relayerRouteVersion over fallbackVersion', () => { - const result = parseRelayerUrl('https://custom-relayer.com', 1, 2); + describe('always returns version 2', () => { + it('returns non-Zama URL as-is with version 2', () => { + const result = parseRelayerUrl('https://custom-relayer.com'); expect(result).toStrictEqual({ url: 'https://custom-relayer.com', @@ -152,17 +151,8 @@ describe('parseRelayerUrl', () => { }); }); - it('non-Zama URL uses relayerRouteVersion=1', () => { - const result = parseRelayerUrl('https://custom-relayer.com', 2, 1); - - expect(result).toStrictEqual({ - url: 'https://custom-relayer.com', - version: 1, - }); - }); - - it('Zama base URL uses relayerRouteVersion to append version', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_BASE, 1, 2); + it('Zama base URL appends /v2 and returns version 2', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_BASE); expect(result).toStrictEqual({ url: VALID_RELAYER_URL_V2, @@ -170,33 +160,22 @@ describe('parseRelayerUrl', () => { }); }); - it('Zama base URL uses relayerRouteVersion=1 to append version', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_BASE, 2, 1); - - expect(result).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, - }); - }); - - it('explicit URL version takes precedence over relayerRouteVersion', () => { - // URL has /v1, relayerRouteVersion is 2 - URL wins - const result1 = parseRelayerUrl(VALID_RELAYER_URL_V1, 2, 2); + it('Zama v1 URL is upgraded to v2; Zama v2 URL is returned unchanged', () => { + const result1 = parseRelayerUrl(VALID_RELAYER_URL_V1); expect(result1).toStrictEqual({ - url: VALID_RELAYER_URL_V1, - version: 1, + url: VALID_RELAYER_URL_V2, + version: 2, }); - // URL has /v2, relayerRouteVersion is 1 - URL wins - const result2 = parseRelayerUrl(VALID_RELAYER_URL_V2, 1, 1); + const result2 = parseRelayerUrl(VALID_RELAYER_URL_V2); expect(result2).toStrictEqual({ url: VALID_RELAYER_URL_V2, version: 2, }); }); - it('undefined relayerRouteVersion falls back to fallbackVersion', () => { - const result = parseRelayerUrl(VALID_RELAYER_URL_BASE, 2, undefined); + it('Zama base URL defaults to version 2', () => { + const result = parseRelayerUrl(VALID_RELAYER_URL_BASE); expect(result).toStrictEqual({ url: VALID_RELAYER_URL_V2, @@ -211,25 +190,25 @@ describe('parseRelayerUrl', () => { describe('edge cases', () => { it('handles URL with port', () => { - const result = parseRelayerUrl('https://localhost:8080', 1); + const result = parseRelayerUrl('https://localhost:8080'); expect(result).toStrictEqual({ url: 'https://localhost:8080', - version: 1, + version: 2, }); }); - it('handles URL with port and explicit version', () => { - const result = parseRelayerUrl('https://localhost:8080/v2', 1); + it('non-Zama URL: /v2 in path does not affect version (uses fallbackVersion)', () => { + const result = parseRelayerUrl('https://localhost:8080/v2'); expect(result).toStrictEqual({ url: 'https://localhost:8080/v2', - version: 1, + version: 2, }); }); - it('handles http URL', () => { - const result = parseRelayerUrl('http://relayer.local/v1', 2); + it('non-Zama http URL: /v1 in path does not affect version (uses fallbackVersion)', () => { + const result = parseRelayerUrl('http://relayer.local/v1'); expect(result).toStrictEqual({ url: 'http://relayer.local/v1', @@ -238,14 +217,14 @@ describe('parseRelayerUrl', () => { }); it('does not match v1/v2 in the middle of path', () => { - let result = parseRelayerUrl('https://example.com/v1/api', 2); + let result = parseRelayerUrl('https://example.com/v1/api'); expect(result).toStrictEqual({ url: 'https://example.com/v1/api', version: 2, }); - result = parseRelayerUrl('https://example.com.v1', 2); + result = parseRelayerUrl('https://example.com.v1'); expect(result).toStrictEqual({ url: 'https://example.com.v1', @@ -254,16 +233,16 @@ describe('parseRelayerUrl', () => { }); it('handles URL with query params (unusual but valid)', () => { - const result = parseRelayerUrl('https://example.com?foo=bar', 1); + const result = parseRelayerUrl('https://example.com?foo=bar'); expect(result).toStrictEqual({ url: 'https://example.com?foo=bar', - version: 1, + version: 2, }); }); it('handles URL with query params ending with v1 (unusual but valid)', () => { - const result = parseRelayerUrl('https://example.com?foo=barv1', 2); + const result = parseRelayerUrl('https://example.com?foo=barv1'); expect(result).toStrictEqual({ url: 'https://example.com?foo=barv1', diff --git a/src/relayer-provider/relayerUrl.ts b/src/relayer-provider/relayerUrl.ts index 71d9e339..2038ff10 100644 --- a/src/relayer-provider/relayerUrl.ts +++ b/src/relayer-provider/relayerUrl.ts @@ -9,30 +9,25 @@ import { } from '../configs'; /** - * Parses a relayer URL and extracts or applies the API version. + * Parses and normalizes a relayer URL to its canonical v2 form. * - * If the URL is not a Zama URL: - * - Returns the `relayerRouteVersion` if specified. - * - Otherwise returns the `fallbackVersion`. + * Returns `null` if `relayerUrl` is not a string or is not a valid URL. + * Trailing slashes are stripped before any processing. * - * If the URL is a Zama URL: - * - If the URL ends with `/v1`, returns version 1 and the URL unchanged. - * - If the URL ends with `/v2`, returns version 2 and the URL unchanged. - * - If the URL does not end with a version suffix, appends the `relayerRouteVersion` if specified. - * - Otherwise, appends the `fallbackVersion` to the URL. + * **Non-Zama URLs** (custom/self-hosted relayers): + * - Returned as-is (minus trailing slash) with `version: 2`. * - * Trailing slashes are removed from the URL before processing. + * **Zama-hosted URLs** (Sepolia / Mainnet base, v1, or v2 URLs): + * - v1 URLs are upgraded to their v2 equivalents. + * - Base URLs (no version suffix) have `/v2` appended. + * - v2 URLs are returned unchanged. * * @param relayerUrl - The relayer URL to parse - * @param fallbackVersion - Version to use if URL doesn't specify one - * @param relayerRouteVersion - Version to use if specified - * @returns The normalized URL and version, or null if invalid + * @returns The normalized URL and `version: 2`, or `null` if the input is invalid */ export function parseRelayerUrl( relayerUrl: unknown, - fallbackVersion: 1 | 2, - relayerRouteVersion?: 1 | 2, -): { url: string; version: 1 | 2 } | null { +): { url: string; version: 2 } | null { if ( relayerUrl === undefined || relayerUrl === null || @@ -54,53 +49,38 @@ export function parseRelayerUrl( MainnetRelayerUrlV1, MainnetRelayerUrlV2, ]; + const isZamaUrl = zamaUrls.includes(urlNoSlash); if (!isZamaUrl) { - if (relayerRouteVersion === 1 || relayerRouteVersion === 2) { - return { - url: urlNoSlash, - version: relayerRouteVersion, - }; - } - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (fallbackVersion !== 1 && fallbackVersion !== 2) { - return null; - } - return { url: urlNoSlash, - version: fallbackVersion, + version: 2, }; } - if (urlNoSlash.endsWith('/v1')) { + if (urlNoSlash === SepoliaRelayerUrlV1) { return { - url: urlNoSlash, - version: 1, + url: SepoliaRelayerUrlV2, + version: 2, }; } - if (urlNoSlash.endsWith('/v2')) { + if (urlNoSlash === MainnetRelayerUrlV1) { return { - url: urlNoSlash, + url: MainnetRelayerUrlV2, version: 2, }; } - let version: 1 | 2; - if (relayerRouteVersion === 1 || relayerRouteVersion === 2) { - version = relayerRouteVersion; - } else { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (fallbackVersion !== 1 && fallbackVersion !== 2) { - return null; - } - version = fallbackVersion; + if (urlNoSlash.endsWith('/v2')) { + return { + url: urlNoSlash, + version: 2, + }; } return { - url: `${urlNoSlash}/v${version}`, - version, + url: `${urlNoSlash}/v2`, + version: 2, }; } diff --git a/src/relayer-provider/v1/RelayerV1Fhevm.test.ts b/src/relayer-provider/v1/RelayerV1Fhevm.test.ts deleted file mode 100644 index 9c1daada..00000000 --- a/src/relayer-provider/v1/RelayerV1Fhevm.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { createRelayerFhevm } from '../createRelayerFhevm'; -import fetchMock from 'fetch-mock'; -import { tfheCompactPkeCrsBytes, tfheCompactPublicKeyBytes } from '../../test'; -import { RelayerV1Fhevm } from './RelayerV1Fhevm'; -import { setupAllFetchMockRoutes, TEST_CONFIG } from '../../test/config'; - -//////////////////////////////////////////////////////////////////////////////// -// -// Jest Command line -// ================= -// -// npx jest --colors --passWithNoTests ./src/relayer-provider/v1/RelayerV1Fhevm.test.ts -// npx jest --colors --passWithNoTests ./src/relayer-provider/v1/RelayerV1Fhevm.test.ts --testNamePattern=xxx -// npx jest --colors --passWithNoTests --coverage ./src/relayer-provider/v1/RelayerV1Fhevm.test.ts --collectCoverageFrom=./src/relayer-provider/v1/RelayerV1Fhevm.ts --testNamePattern=xxx -// npx jest --colors --passWithNoTests --coverage ./src/relayer-provider/v1/RelayerV1Fhevm.test.ts --collectCoverageFrom=./src/relayer-provider/v1/RelayerV1Fhevm.ts -// -// Testnet: -// ======== -// -// npx jest --config jest.testnet.config.cjs --colors --passWithNoTests ./src/relayer-provider/v1/RelayerV1Fhevm.test.ts -// -//////////////////////////////////////////////////////////////////////////////// - -const describeIfFetchMock = - TEST_CONFIG.type === 'fetch-mock' ? describe : describe.skip; - -jest.mock('ethers', () => { - const { setupEthersJestMock } = jest.requireActual('../../test/config'); - return setupEthersJestMock(); -}); - -//////////////////////////////////////////////////////////////////////////////// -// Mock only, compares with keys assets -//////////////////////////////////////////////////////////////////////////////// - -describeIfFetchMock('RelayerV1Fhevm', () => { - beforeEach(async () => { - fetchMock.removeRoutes(); - setupAllFetchMockRoutes(); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: createRelayerFhevm', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - expect(relayerFhevm.version).toBe(1); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: getPublicKey().publicKeyId', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - const pub_key = relayerFhevm.getPublicKeyBytes(); - expect(pub_key.id).toBe('fhe-public-key-data-id'); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: getPublicKey().publicKey', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - const pub_key = relayerFhevm.getPublicKeyBytes(); - expect(pub_key.bytes).toStrictEqual(tfheCompactPublicKeyBytes); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: getPublicParams(2048).publicParamsId', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - const pub_params = relayerFhevm.getPkeCrsBytesForCapacity(2048); - expect(pub_params.id).toBe('crs-data-id'); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: getPublicParams(2048).publicParams', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - const pub_params = relayerFhevm.getPkeCrsBytesForCapacity(2048); - expect(pub_params.bytes).toStrictEqual(tfheCompactPkeCrsBytes); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: getPublicParams(123).publicParams', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - expect(() => relayerFhevm.getPkeCrsBytesForCapacity(123)).toThrow( - "Unsupported PublicParams bits format '123'", - ); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: relayerProvider()', async () => { - const relayerFhevm = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - expect(relayerFhevm instanceof RelayerV1Fhevm).toBe(true); - const relayerFhevmV1 = relayerFhevm as RelayerV1Fhevm; - expect(relayerFhevmV1.relayerProvider.url).toEqual( - TEST_CONFIG.v1.fhevmInstanceConfig.relayerUrl, - ); - expect(relayerFhevmV1.relayerProvider.version).toEqual(1); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: createRelayerFhevm from publicKey and publicParams', async () => { - const relayerFhevm1 = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - }); - const pub_key = relayerFhevm1.getPublicKeyBytes(); - const pub_params = relayerFhevm1.getPkeCrsBytesForCapacity(2048); - - const relayerFhevm2 = await createRelayerFhevm({ - ...TEST_CONFIG.v1.fhevmInstanceConfig, - defaultRelayerVersion: 1, - publicKey: { - data: pub_key.bytes, - id: pub_key.id, - }, - publicParams: { - 2048: { - publicParams: pub_params.bytes, - publicParamsId: pub_params.id, - }, - }, - }); - - expect(relayerFhevm2.getPublicKeyBytes()).toStrictEqual( - relayerFhevm1.getPublicKeyBytes(), - ); - - expect(relayerFhevm2.getPkeCrsBytesForCapacity(2048)).toStrictEqual( - relayerFhevm1.getPkeCrsBytesForCapacity(2048), - ); - }); -}); diff --git a/src/relayer-provider/v1/RelayerV1Provider.test.ts b/src/relayer-provider/v1/RelayerV1Provider.test.ts deleted file mode 100644 index 0e0d65b7..00000000 --- a/src/relayer-provider/v1/RelayerV1Provider.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { SepoliaConfig } from '../../configs'; -import { createRelayerProvider } from '../createRelayerProvider'; -import fetchMock from 'fetch-mock'; -import { AbstractRelayerProvider } from '../AbstractRelayerProvider'; -import { TEST_CONFIG } from '../../test/config'; -import { - relayerV1ResponseGetKeyUrl, - setupV1RoutesKeyUrl, -} from '../../test/v1/mockRoutes'; -import { RelayerV1Provider } from './RelayerV1Provider'; -import type { Auth } from '../types/public-api'; - -//////////////////////////////////////////////////////////////////////////////// -// -// Jest Command line -// ================= -// -// npx jest --colors --passWithNoTests ./src/relayer-provider/v1/RelayerV1Provider.test.ts -// npx jest --colors --passWithNoTests --coverage ./src/relayer-provider/v1/RelayerV1Provider.test.ts --collectCoverageFrom=./src/relayer-provider/v1/RelayerV1Provider.ts --testNamePattern=xxx -// npx jest --colors --passWithNoTests --coverage ./src/relayer-provider/v1/RelayerV1Provider.test.ts --collectCoverageFrom=./src/relayer-provider/v1/RelayerV1Provider.ts -// -//////////////////////////////////////////////////////////////////////////////// - -const describeIfFetchMock = - TEST_CONFIG.type === 'fetch-mock' ? describe : describe.skip; - -describeIfFetchMock('RelayerV1Provider', () => { - let relayerProvider: AbstractRelayerProvider; - - beforeEach(() => { - fetchMock.removeRoutes(); - setupV1RoutesKeyUrl(); - - const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; - relayerProvider = createRelayerProvider(`${SepoliaConfigeRelayerUrl}`, 1); - expect(relayerProvider.version).toBe(1); - expect(relayerProvider.url).toBe(`${SepoliaConfigeRelayerUrl}/v1`); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: fetchGetKeyUrl', async () => { - const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; - const relayerProvider = createRelayerProvider(SepoliaConfigeRelayerUrl, 1); - expect(relayerProvider.version).toBe(1); - const response = await relayerProvider.fetchGetKeyUrl(); - expect(response).toEqual(relayerV1ResponseGetKeyUrl); - }); - - ////////////////////////////////////////////////////////////////////////////// - - it('v1: fetchGetKeyUrl', async () => { - const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; - const relayerProvider = createRelayerProvider(SepoliaConfigeRelayerUrl, 1); - expect(relayerProvider.version).toBe(1); - const response = await relayerProvider.fetchGetKeyUrl(); - expect(response).toEqual(relayerV1ResponseGetKeyUrl); - }); -}); - -//////////////////////////////////////////////////////////////////////////////// -// Auth on GET requests Tests -//////////////////////////////////////////////////////////////////////////////// - -describeIfFetchMock('RelayerV1Provider - Auth on GET requests', () => { - const relayerUrlV1 = `${SepoliaConfig.relayerUrl!}/v1`; - - beforeEach(() => { - fetchMock.removeRoutes(); - }); - - it('v1:keyurl: GET request includes BearerToken auth header', async () => { - fetchMock.get(`${relayerUrlV1}/keyurl`, relayerV1ResponseGetKeyUrl); - - const auth: Auth = { - __type: 'BearerToken', - token: 'test-bearer-token', - }; - - const provider = new RelayerV1Provider({ relayerUrl: relayerUrlV1, auth }); - await provider.fetchGetKeyUrl(); - - const lastCall = fetchMock.callHistory.lastCall(); - expect(lastCall).toBeDefined(); - // Note: fetch-mock normalizes header keys to lowercase - const headers = lastCall!.options.headers as Record; - expect(headers['authorization']).toBe('Bearer test-bearer-token'); - }); - - it('v1:keyurl: GET request includes ApiKeyHeader auth header', async () => { - fetchMock.get(`${relayerUrlV1}/keyurl`, relayerV1ResponseGetKeyUrl); - - const auth: Auth = { - __type: 'ApiKeyHeader', - header: 'x-custom-api-key', - value: 'my-secret-key', - }; - - const provider = new RelayerV1Provider({ relayerUrl: relayerUrlV1, auth }); - await provider.fetchGetKeyUrl(); - - const lastCall = fetchMock.callHistory.lastCall(); - expect(lastCall).toBeDefined(); - const headers = lastCall!.options.headers as Record; - expect(headers['x-custom-api-key']).toBe('my-secret-key'); - }); - - it('v1:keyurl: GET request without auth has no Authorization header', async () => { - fetchMock.get(`${relayerUrlV1}/keyurl`, relayerV1ResponseGetKeyUrl); - - const provider = new RelayerV1Provider({ relayerUrl: relayerUrlV1 }); - await provider.fetchGetKeyUrl(); - - const lastCall = fetchMock.callHistory.lastCall(); - expect(lastCall).toBeDefined(); - // Note: fetch-mock normalizes header keys to lowercase - const headers = lastCall!.options.headers as Record; - expect(headers['authorization']).toBeUndefined(); - expect(headers['x-api-key']).toBeUndefined(); - }); -}); diff --git a/src/relayer-provider/v2/RelayerV2Fhevm.test.ts b/src/relayer-provider/v2/RelayerV2Fhevm.test.ts index 7937e040..a2bfc59f 100644 --- a/src/relayer-provider/v2/RelayerV2Fhevm.test.ts +++ b/src/relayer-provider/v2/RelayerV2Fhevm.test.ts @@ -43,7 +43,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: createRelayerFhevm', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); expect(relayerFhevm.version).toBe(2); }); @@ -53,7 +52,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: getPublicKey().publicKeyId', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); const pub_key = relayerFhevm.getPublicKeyBytes(); expect(pub_key.id).toBe('fhe-public-key-data-id'); @@ -64,7 +62,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: getPublicKey().publicKey', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); const pub_key = relayerFhevm.getPublicKeyBytes(); expect(pub_key.bytes).toStrictEqual(tfheCompactPublicKeyBytes); @@ -75,7 +72,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: getPublicParams().publicParamsId', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); const pub_params = relayerFhevm.getPkeCrsBytesForCapacity(2048); expect(pub_params.id).toBe('crs-data-id'); @@ -86,7 +82,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: getPublicParams().publicParams', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); const pub_params = relayerFhevm.getPkeCrsBytesForCapacity(2048); expect(pub_params.bytes).toStrictEqual(tfheCompactPkeCrsBytes); @@ -97,7 +92,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: getPublicParams(123).publicParams', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); expect(() => relayerFhevm.getPkeCrsBytesForCapacity(123)).toThrow( new TFHEError({ @@ -111,7 +105,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: relayerProvider()', async () => { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); expect(relayerFhevm instanceof RelayerV2Fhevm).toBe(true); const relayerFhevmV2 = relayerFhevm as RelayerV2Fhevm; @@ -126,7 +119,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { it('v2: createRelayerFhevm from publicKey and publicParams', async () => { const relayerFhevm1 = await createRelayerFhevm({ ...TEST_CONFIG.v2.fhevmInstanceConfig, - defaultRelayerVersion: 2, }); const pub_key = relayerFhevm1.getPublicKeyBytes(); const pub_params = relayerFhevm1.getPkeCrsBytesForCapacity(2048); @@ -143,7 +135,6 @@ describeIfFetchMock('RelayerV2Fhevm', () => { publicParamsId: pub_params.id, }, }, - defaultRelayerVersion: 2, }); expect(relayerFhevm2.getPublicKeyBytes()).toStrictEqual( diff --git a/src/relayer-provider/v2/RelayerV2Provider_delegated-user-decrypt.test.ts b/src/relayer-provider/v2/RelayerV2Provider_delegated-user-decrypt.test.ts index 1ec1ec29..698928b0 100644 --- a/src/relayer-provider/v2/RelayerV2Provider_delegated-user-decrypt.test.ts +++ b/src/relayer-provider/v2/RelayerV2Provider_delegated-user-decrypt.test.ts @@ -123,7 +123,7 @@ describeIfFetchMock('RelayerV2Provider - Delegated User Decrypt', () => { beforeEach(() => { fetchMock.removeRoutes(); - relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base, 1); + relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base); expect(relayerProvider.version).toBe(2); expect(relayerProvider.url).toBe(TEST_CONFIG.v2.urls.base); expect(relayerProvider.delegatedUserDecryptUrl).toBe( diff --git a/src/relayer-provider/v2/RelayerV2Provider_input-proof.test.ts b/src/relayer-provider/v2/RelayerV2Provider_input-proof.test.ts index faf9f36b..dbb528d5 100644 --- a/src/relayer-provider/v2/RelayerV2Provider_input-proof.test.ts +++ b/src/relayer-provider/v2/RelayerV2Provider_input-proof.test.ts @@ -79,7 +79,7 @@ describeIfFetchMock('RelayerV2Provider', () => { fetchMock.removeRoutes(); expect(TEST_CONFIG.type).toBe('fetch-mock'); - const p = createRelayerProvider(TEST_CONFIG.v2.urls.base, 1); + const p = createRelayerProvider(TEST_CONFIG.v2.urls.base); if (!(p instanceof RelayerV2Provider)) { throw new Error(`Unable to create relayer provider`); } diff --git a/src/relayer-provider/v2/RelayerV2Provider_keyurl.test.ts b/src/relayer-provider/v2/RelayerV2Provider_keyurl.test.ts index 68f2c777..554cdf06 100644 --- a/src/relayer-provider/v2/RelayerV2Provider_keyurl.test.ts +++ b/src/relayer-provider/v2/RelayerV2Provider_keyurl.test.ts @@ -87,7 +87,6 @@ describeIfFetchMock('RelayerV2Provider', () => { const SepoliaConfigeRelayerUrl = SepoliaConfig.relayerUrl!; relayerProvider = createRelayerProvider( `${SepoliaConfigeRelayerUrl}/v2`, - 1, ) as RelayerV2Provider; expect(relayerProvider instanceof RelayerV2Provider).toBe(true); expect(relayerProvider.version).toBe(2); @@ -333,7 +332,7 @@ describeIfFetchMock('RelayerV2Provider - Auth on GET requests', () => { //////////////////////////////////////////////////////////////////////////////// describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { - const testRelayerUrlV1 = TEST_CONFIG.v1.fhevmInstanceConfig.relayerUrl; + const testRelayerUrlV2 = TEST_CONFIG.v2.fhevmInstanceConfig.relayerUrl; let mockTFHEPkeParamsFetch: jest.SpyInstance; beforeEach(() => { @@ -355,14 +354,13 @@ describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { let fetchCount = 0; // Mock the keyurl endpoint - fetchMock.get(`${testRelayerUrlV1}/keyurl`, () => { + fetchMock.get(`${testRelayerUrlV2}/keyurl`, () => { fetchCount++; - return relayerV1ResponseGetKeyUrl; + return relayerV2ResponseGetKeyUrl; }); const provider = createRelayerProvider( - testRelayerUrlV1, - 1, + testRelayerUrlV2, ) as RelayerV2Provider; // Make 3 concurrent calls @@ -386,14 +384,13 @@ describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { it('returns cached result on subsequent calls', async () => { let fetchCount = 0; - fetchMock.get(`${testRelayerUrlV1}/keyurl`, () => { + fetchMock.get(`${testRelayerUrlV2}/keyurl`, () => { fetchCount++; - return relayerV1ResponseGetKeyUrl; + return relayerV2ResponseGetKeyUrl; }); const provider = createRelayerProvider( - testRelayerUrlV1, - 1, + testRelayerUrlV2, ) as RelayerV2Provider; // First call @@ -414,17 +411,16 @@ describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { it('removes cache entry on failure and allows retry', async () => { let fetchCount = 0; - fetchMock.get(`${testRelayerUrlV1}/keyurl`, () => { + fetchMock.get(`${testRelayerUrlV2}/keyurl`, () => { fetchCount++; if (fetchCount === 1) { return { status: 500 }; } - return relayerV1ResponseGetKeyUrl; + return relayerV2ResponseGetKeyUrl; }); const provider = createRelayerProvider( - testRelayerUrlV1, - 1, + testRelayerUrlV2, ) as RelayerV2Provider; // First call should fail @@ -446,9 +442,9 @@ describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { let fetchCount1 = 0; let fetchCount2 = 0; - fetchMock.get(`${testRelayerUrlV1}/keyurl`, () => { + fetchMock.get(`${testRelayerUrlV2}/keyurl`, () => { fetchCount1++; - return relayerV1ResponseGetKeyUrl; + return relayerV2ResponseGetKeyUrl; }); fetchMock.get(`${testRelayerUrlV2}/keyurl`, () => { @@ -462,37 +458,37 @@ describeIfFetchMock('RelayerV2Provider - TFHEPkeParams Caching', () => { ); const provider1 = createRelayerProvider( - testRelayerUrlV1, - 1, + testRelayerUrlV2, ) as RelayerV2Provider; const provider2 = createRelayerProvider( testRelayerUrlV2, - 1, ) as RelayerV2Provider; - provider1.fetchTFHEPkeParams(); + expect(provider1.version).toBe(2); + expect(provider2.version).toBe(2); + // Fetch from both providers const [result1, result2] = await Promise.all([ provider1.fetchTFHEPkeParams(), provider2.fetchTFHEPkeParams(), ]); - // Results should be different objects (different cache entries) - expect(result1).not.toBe(result2); + // Results should be equal (same cache entry) + expect(result1).toBe(result2); - // Each should have fetched once + // Only one fetch call should have been made to keyurl (shared cache) expect(fetchCount1).toBe(1); - expect(fetchCount2).toBe(1); + expect(fetchCount2).toBe(0); // Subsequent calls should use cache await provider1.fetchTFHEPkeParams(); await provider2.fetchTFHEPkeParams(); expect(fetchCount1).toBe(1); - expect(fetchCount2).toBe(1); + expect(fetchCount2).toBe(0); - // TFHEPkeParams.fetch should have been called twice (once per URL) - expect(mockTFHEPkeParamsFetch).toHaveBeenCalledTimes(2); + // TFHEPkeParams.fetch should have been called once + expect(mockTFHEPkeParamsFetch).toHaveBeenCalledTimes(1); }); }); diff --git a/src/relayer-provider/v2/RelayerV2Provider_public-decrypt.test.ts b/src/relayer-provider/v2/RelayerV2Provider_public-decrypt.test.ts index 5b691c02..9f3dfa32 100644 --- a/src/relayer-provider/v2/RelayerV2Provider_public-decrypt.test.ts +++ b/src/relayer-provider/v2/RelayerV2Provider_public-decrypt.test.ts @@ -89,7 +89,7 @@ describeIfFetchMock('RelayerV2Provider:public-decrypt:mock:', () => { beforeEach(() => { removeAllFetchMockRoutes(); - relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base, 1); + relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base); expect(relayerProvider.version).toBe(2); expect(relayerProvider.url).toBe(TEST_CONFIG.v2.urls.base); expect(relayerProvider.publicDecryptUrl).toBe( diff --git a/src/relayer-provider/v2/RelayerV2Provider_user-decrypt.test.ts b/src/relayer-provider/v2/RelayerV2Provider_user-decrypt.test.ts index 30f0e51f..84577422 100644 --- a/src/relayer-provider/v2/RelayerV2Provider_user-decrypt.test.ts +++ b/src/relayer-provider/v2/RelayerV2Provider_user-decrypt.test.ts @@ -111,7 +111,7 @@ describeIfFetchMock('RelayerV2Provider', () => { beforeEach(() => { fetchMock.removeRoutes(); - relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base, 1); + relayerProvider = createRelayerProvider(TEST_CONFIG.v2.urls.base); expect(relayerProvider.version).toBe(2); expect(relayerProvider.url).toBe(TEST_CONFIG.v2.urls.base); expect(relayerProvider.userDecryptUrl).toBe( diff --git a/src/relayer/publicDecrypt.test.ts b/src/relayer/publicDecrypt.test.ts index 985e4710..6e9d7053 100644 --- a/src/relayer/publicDecrypt.test.ts +++ b/src/relayer/publicDecrypt.test.ts @@ -21,11 +21,7 @@ const mockKmsContextCache = { // npx jest --colors --passWithNoTests --coverage ./src/relayer/publicDecrypt.test.ts --collectCoverageFrom=./src/relayer/publicDecrypt.ts --testNamePattern=xxx // npx jest --colors --passWithNoTests --coverage ./src/relayer/publicDecrypt.test.ts --collectCoverageFrom=./src/relayer/publicDecrypt.ts -const defaultRelayerVersion = 1; -const relayerProvider = createRelayerProvider( - 'https://test-fhevm-relayer', - defaultRelayerVersion, -); +const relayerProvider = createRelayerProvider('https://test-fhevm-relayer'); const RELAYER_PUBLIC_DECRYPT_URL = relayerProvider.publicDecryptUrl; const dummyRelayerUserDecryptPayload: RelayerPublicDecryptPayload = { @@ -42,7 +38,7 @@ describeIfFetchMock('publicDecrypt', () => { }); it('relayerProvider', async () => { - expect(relayerProvider.version).toStrictEqual(1); + expect(relayerProvider.version).toStrictEqual(2); expect(relayerProvider.url).toStrictEqual('https://test-fhevm-relayer'); expect(RELAYER_PUBLIC_DECRYPT_URL).toStrictEqual( 'https://test-fhevm-relayer/public-decrypt', diff --git a/src/relayer/sendEncryption.test.ts b/src/relayer/sendEncryption.test.ts index bf8cd213..88169c4e 100644 --- a/src/relayer/sendEncryption.test.ts +++ b/src/relayer/sendEncryption.test.ts @@ -1,7 +1,6 @@ import fs from 'fs'; import path from 'path'; import { createRelayerEncryptedInput } from './sendEncryption'; -import { InvalidPropertyError } from '../errors/InvalidPropertyError'; import { removeAllFetchMockRoutes, setupAllFetchMockRoutes, @@ -41,7 +40,6 @@ jest.mock('ethers', () => { async function createFhevm(version: 1 | 2) { const relayerFhevm = await createRelayerFhevm({ ...TEST_CONFIG[`v${version}`].fhevmInstanceConfig, - defaultRelayerVersion: 1, }); return relayerFhevm; } @@ -498,6 +496,7 @@ describeIfFetchMock('sendEncryption', () => { }, }); const fhevm = await createFhevm(version); + expect(fhevm.version).toBe(2); const input = createRelayerEncryptedInput({ fhevm, @@ -509,14 +508,18 @@ describeIfFetchMock('sendEncryption', () => { input.add128(BigInt(1)); await expect(input.encrypt()).rejects.toThrow( - new InvalidPropertyError({ - objName: 'fetchPostInputProof()', - property: 'signatures', - index: 0, - expectedType: 'Bytes65Hex', - type: 'string', - }), + RelayerV2ResponseInvalidBodyError, ); + + // await expect(input.encrypt()).rejects.toThrow( + // new InvalidPropertyError({ + // objName: 'fetchPostInputProof()', + // property: 'signatures', + // index: 0, + // expectedType: 'Bytes65Hex', + // type: 'string', + // }), + // ); }); it('v2: throws if incorrect handle', async () => { diff --git a/src/relayer/userDecrypt.test.ts b/src/relayer/userDecrypt.test.ts index 38428636..e1d17b05 100644 --- a/src/relayer/userDecrypt.test.ts +++ b/src/relayer/userDecrypt.test.ts @@ -25,11 +25,7 @@ const mockKmsContextCache = { // //////////////////////////////////////////////////////////////////////////////// -const defaultRelayerVersion = 1; -const relayerProvider = createRelayerProvider( - TEST_CONFIG.relayerUrlBase, - defaultRelayerVersion, -); +const relayerProvider = createRelayerProvider(TEST_CONFIG.relayerUrlBase); const RELAYER_USER_DECRYPT_URL = relayerProvider.userDecryptUrl; const dummyRelayerUserDecryptPayload: RelayerUserDecryptPayload = { @@ -142,7 +138,7 @@ describeIfFetchMock('fetchRelayerUserDecrypt', () => { }); expect(RELAYER_USER_DECRYPT_URL).toBe( - `${TEST_CONFIG.relayerUrlBase}/v1/user-decrypt`, + `${TEST_CONFIG.relayerUrlBase}/v2/user-decrypt`, ); fetchMock.postOnce(RELAYER_USER_DECRYPT_URL, response); diff --git a/src/test/scripts/test-devnet.sh b/src/test/scripts/test-devnet.sh new file mode 100755 index 00000000..a0ae707e --- /dev/null +++ b/src/test/scripts/test-devnet.sh @@ -0,0 +1,112 @@ +#!/bin/bash +set -eo pipefail # -e exits on error, -o pipefail catches errors in pipes + +# ROOT_DIR : root directory of the relayer-sdk repo +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" + +cd $ROOT_DIR + +network="devnet" + +if [ ! -d ".github" ]; then + echo "Error: .github directory does not exist" + exit 1 +fi + +STEPS=14 +STEP=0 + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: test address --network $network ..." +echo "==================================================" + +npx . test address --network $network + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: pubkey delete --network $network ..." +echo "==================================================" + +npx . pubkey delete --network $network + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: pubkey fetch --network $network ..." +echo "==================================================" + +npx . pubkey fetch --network $network + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: input-proof --values 123:euint32 true:ebool ... --network $network --json ..." +echo "==================================================" + +npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network $network + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: test get --type euint32 --network $network --json ..." +echo "==================================================" + +handle=$(npx . test get --type euint32 --network $network --json | jq -r .handle) +echo "🥬 handle: ${handle}" + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --type euint32 --network $network ..." +echo "==================================================" +npx . test make-publicly-decryptable --type euint32 --network $network + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: public-decrypt --network $network --handles $handle ..." +echo "==================================================" +npx . public-decrypt --network $network --handles $handle + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network $network --type euint32 ..." +echo "=========================================================================" +npx . test public-decrypt --network $network --types euint32 + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: user-decrypt --network $network --types euint32 ..." +echo "=========================================================================" +npx . test user-decrypt --network $network --types euint32 + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: test add --network $network --type euint32 --value 123 ..." +echo "=========================================================================" +npx . test add --network $network --type euint32 --value 123 + +echo "" +echo "==================================================" +echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --types euint32 --network $network ..." +echo "==================================================" +npx . test make-publicly-decryptable --type euint32 --network $network + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network $network --types ebool euint32 ..." +echo "=========================================================================" +npx . test public-decrypt --network $network --types ebool euint32 + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network $network --types ebool euint8 euint16 euint32 euint64 euint128 ..." +echo "=========================================================================" +npx . test public-decrypt --network $network --types ebool euint8 euint16 euint32 euint64 euint128 + +echo "" +echo "=========================================================================" +echo "= $((++STEP))/${STEPS} Run: test user-decrypt --network $network --types ebool euint8 euint16 euint32 euint64 euint128 ..." +echo "=========================================================================" +npx . test user-decrypt --network $network --types ebool euint8 euint16 euint32 euint64 euint128 + +echo "" +echo "==========================" +echo "= ✅ Tests succeeded ! =" +echo "==========================" diff --git a/src/test/scripts/test-testnet.sh b/src/test/scripts/test-testnet.sh index 0496e447..f02a6d43 100755 --- a/src/test/scripts/test-testnet.sh +++ b/src/test/scripts/test-testnet.sh @@ -11,7 +11,7 @@ if [ ! -d ".github" ]; then exit 1 fi -STEPS=22 +STEPS=14 STEP=0 echo "" @@ -37,17 +37,10 @@ npx . pubkey fetch --network testnet echo "" echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: input-proof --values 123:euint32 true:ebool ... --network testnet --version 1 --json ..." +echo "= $((++STEP))/${STEPS} Run: input-proof --values 123:euint32 true:ebool ... --network testnet --json ..." echo "==================================================" -npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network testnet --version 1 - -echo "" -echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: input-proof --values 123:euint32 true:ebool ... --network testnet --version 2 --json ..." -echo "==================================================" - -npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network testnet --version 2 +npx . input-proof --values 123:euint32 true:ebool 1234567890123456789:euint256 0xb2a8A265dD5A27026693Aa6cE87Fb21Ac197b6b9:eaddress --network testnet echo "" echo "==================================================" @@ -59,99 +52,57 @@ echo "🥬 handle: ${handle}" echo "" echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --type euint32 --network testnet --version 2 ..." -echo "==================================================" -npx . test make-publicly-decryptable --type euint32 --network testnet --version 2 - -echo "" -echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: public-decrypt --network testnet --handles $handle --version 1 ..." +echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --type euint32 --network testnet ..." echo "==================================================" -npx . public-decrypt --network testnet --handles $handle --version 1 +npx . test make-publicly-decryptable --type euint32 --network testnet echo "" echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: public-decrypt --network testnet --handles $handle --version 2 ..." +echo "= $((++STEP))/${STEPS} Run: public-decrypt --network testnet --handles $handle ..." echo "==================================================" -npx . public-decrypt --network testnet --handles $handle --version 2 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --type euint32 --version 1 ..." -echo "=========================================================================" -npx . test public-decrypt --network testnet --types euint32 --version 1 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --type euint32 --version 2 ..." -echo "=========================================================================" -npx . test public-decrypt --network testnet --types euint32 --version 2 +npx . public-decrypt --network testnet --handles $handle echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test user-decrypt --network testnet --types euint32 --version 1 ..." +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --type euint32 ..." echo "=========================================================================" -npx . test user-decrypt --network testnet --types euint32 --version 1 +npx . test public-decrypt --network testnet --types euint32 echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: user-decrypt --network testnet --types euint32 --version 2 ..." +echo "= $((++STEP))/${STEPS} Run: user-decrypt --network testnet --types euint32 ..." echo "=========================================================================" -npx . test user-decrypt --network testnet --types euint32 --version 2 +npx . test user-decrypt --network testnet --types euint32 echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test add --network testnet --type euint32 --value 123 --version 1 ..." +echo "= $((++STEP))/${STEPS} Run: test add --network testnet --type euint32 --value 123 ..." echo "=========================================================================" -npx . test add --network testnet --type euint32 --value 123 --version 1 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test add --network testnet --type euint32 --value 123 --version 2 ..." -echo "=========================================================================" -npx . test add --network testnet --type euint32 --value 123 --version 2 +npx . test add --network testnet --type euint32 --value 123 echo "" echo "==================================================" -echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --types euint32 --network testnet --version 2 ..." +echo "= $((++STEP))/${STEPS} Run: test make-publicly-decryptable --types euint32 --network testnet ..." echo "==================================================" -npx . test make-publicly-decryptable --type euint32 --network testnet --version 2 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint32 --version 1 ..." -echo "=========================================================================" -npx . test public-decrypt --network testnet --types ebool euint32 --version 1 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint32 --version 2 ..." -echo "=========================================================================" -npx . test public-decrypt --network testnet --types ebool euint32 --version 2 - -echo "" -echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 1 ..." -echo "=========================================================================" -npx . test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 1 +npx . test make-publicly-decryptable --type euint32 --network testnet echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 2 ..." +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint32 ..." echo "=========================================================================" -npx . test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 2 +npx . test public-decrypt --network testnet --types ebool euint32 echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 1 ..." +echo "= $((++STEP))/${STEPS} Run: test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 ..." echo "=========================================================================" -npx . test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 1 +npx . test public-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 echo "" echo "=========================================================================" -echo "= $((++STEP))/${STEPS} Run: test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 2 ..." +echo "= $((++STEP))/${STEPS} Run: test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 ..." echo "=========================================================================" -npx . test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 --version 2 +npx . test user-decrypt --network testnet --types ebool euint8 euint16 euint32 euint64 euint128 echo "" echo "==========================" diff --git a/src/types/relayer.d.ts b/src/types/relayer.d.ts index 17869c81..0ff42367 100644 --- a/src/types/relayer.d.ts +++ b/src/types/relayer.d.ts @@ -29,7 +29,6 @@ export type FhevmInstanceConfig = Prettify< network: Eip1193Provider | string; chainId: number; batchRpcCalls?: boolean; - relayerRouteVersion?: 1 | 2; } & Partial & FhevmInstanceOptions >; diff --git a/tsconfig.json b/tsconfig.json index f9254c75..a6b3bc15 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,7 +28,8 @@ "noImplicitAny": true, "noImplicitReturns": true, "noImplicitThis": true, - "noUnusedLocals": true + "noUnusedLocals": true, + "types": ["jest"] }, "include": ["src", "types"], "exclude": ["node_modules"]