From e94fb0479f3f1b21b9c33de0db9b20eee1dd8c74 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Sat, 2 Nov 2024 23:34:44 -0700 Subject: [PATCH 01/43] Adding Private Wallet Functionality with Working Example --- packages/payment-processor/package.json | 3 +- .../src/payment/erc20-fee-proxy.ts | 91 ++++++++++++++++++- .../src/payment/prepare-hinkal.ts | 21 +++++ .../src/payment/prepared-transaction.ts | 6 ++ packages/usage-examples/package.json | 6 +- .../src/hinkal/createRequestForHinkal.ts | 75 +++++++++++++++ .../testPayErc20FeeProxyRequestHinkal.ts | 25 +++++ 7 files changed, 221 insertions(+), 6 deletions(-) create mode 100644 packages/payment-processor/src/payment/prepare-hinkal.ts create mode 100644 packages/usage-examples/src/hinkal/createRequestForHinkal.ts create mode 100644 packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index b0795d298..61cf756b1 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -48,7 +48,8 @@ "@superfluid-finance/sdk-core": "0.5.0", "ethers": "5.5.1", "near-api-js": "4.0.2", - "tslib": "2.5.0" + "tslib": "2.5.0", + "@hinkal/common": "0.0.167" }, "devDependencies": { "@types/jest": "29.5.6", diff --git a/packages/payment-processor/src/payment/erc20-fee-proxy.ts b/packages/payment-processor/src/payment/erc20-fee-proxy.ts index 9d21d4b45..fd8d54049 100644 --- a/packages/payment-processor/src/payment/erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-fee-proxy.ts @@ -1,11 +1,21 @@ -import { constants, ContractTransaction, Signer, BigNumberish, providers, BigNumber } from 'ethers'; +import { + constants, + Contract, + ContractTransaction, + Signer, + BigNumberish, + providers, + BigNumber, +} from 'ethers'; import { erc20FeeProxyArtifact } from '@requestnetwork/smart-contracts'; -import { ERC20FeeProxy__factory } from '@requestnetwork/smart-contracts/types'; +import { ERC20FeeProxy__factory, ERC20__factory } from '@requestnetwork/smart-contracts/types'; import { ClientTypes, ExtensionTypes } from '@requestnetwork/types'; import { getPaymentNetworkExtension } from '@requestnetwork/payment-detection'; import { EvmChains } from '@requestnetwork/currency'; +import { emporiumOp, RelayerTransaction } from '@hinkal/common'; + import { ITransactionOverrides } from './transaction-overrides'; import { getAmountToPay, @@ -15,7 +25,8 @@ import { validateErc20FeeProxyRequest, validateRequest, } from './utils'; -import { IPreparedTransaction } from './prepared-transaction'; +import { IPreparedPrivateTransaction, IPreparedTransaction } from './prepared-transaction'; +import { prepareHinkal } from './prepare-hinkal'; /** * Processes a transaction to pay an ERC20 Request with fees. @@ -36,6 +47,35 @@ export async function payErc20FeeProxyRequest( return signer.sendTransaction({ data, to, value, ...overrides }); } +/** + * Processes a transaction to pay an ERC20 Request privately with fees. + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. + * @param overrides optionally, override default transaction values, like gas. + */ +export async function payPrivateErc20FeeProxyRequest( + request: ClientTypes.IRequestData, + signerOrProvider: providers.Provider | Signer = getProvider(), + amount?: BigNumberish, + feeAmount?: BigNumberish, +): Promise { + const hinkal = await prepareHinkal(getSigner(signerOrProvider)); + + const { amountToPay, tokenAddress, ops } = preparePrivateErc20FeeProxyPaymentTransaction( + request, + amount, + feeAmount, + ); + + return hinkal.actionPrivateWallet( + [tokenAddress], + [-amountToPay], + [false], + ops, + ) as Promise; +} + /** * Encodes the call to pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. * @param request request to pay @@ -116,3 +156,48 @@ export function prepareErc20FeeProxyPaymentTransaction( value: 0, }; } + +/** + * Prepare the transaction to privately pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. + * @param request request to pay + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. + */ +export function preparePrivateErc20FeeProxyPaymentTransaction( + request: ClientTypes.IRequestData, + amount?: BigNumberish, + feeAmountOverride?: BigNumberish, +): IPreparedPrivateTransaction { + validateErc20FeeProxyRequest(request, amount, feeAmountOverride); + + const { value: tokenAddress, network } = request.currencyInfo; + EvmChains.assertChainSupported(network!); + const pn = getPaymentNetworkExtension(request); + const proxyAddress = erc20FeeProxyArtifact.getAddress(network, pn?.version); + + const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); + const proxyContract = new Contract(proxyAddress, ERC20FeeProxy__factory.createInterface()); + + const { paymentReference, paymentAddress, feeAddress, feeAmount } = + getRequestPaymentValues(request); + const amountToPay = getAmountToPay(request, amount); + const feeToPay = String(feeAmountOverride || feeAmount || 0); + + const ops = [ + emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), + emporiumOp(proxyContract, 'transferFromWithReferenceAndFee', [ + tokenAddress, + paymentAddress, + amountToPay, + `0x${paymentReference}`, + feeToPay, + feeAddress, + ]), + ]; + + return { + amountToPay: amountToPay.toBigInt(), + tokenAddress, + ops, + }; +} diff --git a/packages/payment-processor/src/payment/prepare-hinkal.ts b/packages/payment-processor/src/payment/prepare-hinkal.ts new file mode 100644 index 000000000..41f374b85 --- /dev/null +++ b/packages/payment-processor/src/payment/prepare-hinkal.ts @@ -0,0 +1,21 @@ +import { Signer } from 'ethers'; + +import { Hinkal, exportEthersProvider, preProcessing } from '@hinkal/common'; + +/** + * prepares wrapper hinkal object for private transaction + * @param signer signer object to be passed + */ +export const prepareHinkal = async (signer: Signer): Promise> => { + await preProcessing(); + const hinkal = new Hinkal(); + + const ethersProvider = await exportEthersProvider(); + ethersProvider.initSigner?.(signer); // type discrepency comes from different version of ethers.js + await hinkal.initProviderAdapter(undefined, ethersProvider); + await hinkal.initUserKeys(); + + await hinkal.resetMerkle(); + + return hinkal; +}; diff --git a/packages/payment-processor/src/payment/prepared-transaction.ts b/packages/payment-processor/src/payment/prepared-transaction.ts index 2684fdeb5..38d84e9d9 100644 --- a/packages/payment-processor/src/payment/prepared-transaction.ts +++ b/packages/payment-processor/src/payment/prepared-transaction.ts @@ -5,3 +5,9 @@ export interface IPreparedTransaction { data: string; to: string; } + +export interface IPreparedPrivateTransaction { + amountToPay: bigint; + tokenAddress: string; + ops: string[]; +} diff --git a/packages/usage-examples/package.json b/packages/usage-examples/package.json index 43307d1cd..6b879b0e0 100644 --- a/packages/usage-examples/package.json +++ b/packages/usage-examples/package.json @@ -25,7 +25,8 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "start": "ts-node src/request-client-js-declarative-request.ts && ts-node src/request-client-js-erc20-request.ts && ts-node src/request-logic-clear-request.ts && ts-node src/request-logic-encrypted-request.ts && ts-node src/request-client-js-add-stakeholders.ts", - "prepare": "yarn run build" + "prepare": "yarn run build", + "start:hinkal": "ts-node src/hinkal/testPayErc20FeeProxyRequestHinkal.ts" }, "dependencies": { "@requestnetwork/data-access": "0.36.0", @@ -39,7 +40,8 @@ "@requestnetwork/types": "0.45.0", "@requestnetwork/utils": "0.45.0", "ethers": "5.5.1", - "tslib": "2.5.0" + "tslib": "2.5.0", + "dotenv": "10.0.0" }, "devDependencies": { "ts-node": "10.9.1", diff --git a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts new file mode 100644 index 000000000..7f0ec9875 --- /dev/null +++ b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts @@ -0,0 +1,75 @@ +import { ethers } from 'ethers'; +import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; +import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; +import { CurrencyTypes } from '@requestnetwork/types'; + +// Example Data: +const currencyAddress = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'; // USDC +const currencyAmount = ethers.utils.parseUnits('0.01', 6).toBigInt(); +const currentNetwork = 'sepolia' as CurrencyTypes.ChainName; +const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; +const currentGateway = 'https://sepolia.gateway.request.network'; +const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address +const fee = '0'; +const contentData = { + reason: 'Hinkal Test', + dueDate: '2025.06.16', +}; + +export const createRequestForHinkal = async ( + payerWallet: ethers.Wallet, + privateKey: string, +): Promise => { + // step 1: Create Signature Provider + const epkSignatureProvider = new EthereumPrivateKeySignatureProvider({ + method: Types.Signature.METHOD.ECDSA, + privateKey: privateKey, + }); + // step 2: create Request Network + const requestClient = new RequestNetwork({ + nodeConnectionConfig: { + baseURL: currentGateway, + }, + signatureProvider: epkSignatureProvider, + }); + + // step 3: Create Request Object + const requestCreateParameters: Types.ICreateRequestParameters = { + requestInfo: { + currency: { + type: currentCurrenyType, + value: currencyAddress, + network: currentNetwork, + }, + payee: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payee, + }, + payer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + expectedAmount: currencyAmount.toString(), + timestamp: Utils.getCurrentTimestampInSecond(), + }, + signer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + paymentNetwork: { + id: Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, + parameters: { + paymentNetworkName: currentNetwork, + paymentAddress: payee, + feeAddress: payee, + feeAmount: fee, + }, + }, + contentData, + }; + + // Step 4: create & send request + const request = await requestClient.createRequest(requestCreateParameters); + const requestData = await request.waitForConfirmation(); + return requestData; +}; diff --git a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts new file mode 100644 index 000000000..b0b30e664 --- /dev/null +++ b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts @@ -0,0 +1,25 @@ +import { ethers } from 'ethers'; +import { payPrivateErc20FeeProxyRequest } from '@requestnetwork/payment-processor'; +import { createRequestForHinkal } from './createRequestForHinkal'; +import { config } from 'dotenv'; +config(); + +// Usage Example of Private Transactions using Hinkal on Optimism +// You will need to pass PAYER_PRIVATE_KEY to .env file in usage_examples root (make sure dotenv is installed) +// run --> yarn start:hinkal + +void (async () => { + const RPC_URL = 'https://mainnet.optimism.io'; + const { PAYER_PRIVATE_KEY } = process.env; + if (!PAYER_PRIVATE_KEY) throw new Error('PRIVATE_KEY_MISSING'); + + // Create Provider and Signer + const provider = new ethers.providers.JsonRpcProvider(RPC_URL); + const payerWallet = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); + + // Create Request and submit private transfer + const requestData = await createRequestForHinkal(payerWallet, PAYER_PRIVATE_KEY); + const tx = await payPrivateErc20FeeProxyRequest(requestData, payerWallet); + console.log('finish', { tx }); + process.exit(0); +})(); From 3bf83a5fcdc7d9bb4b042476c5b0fbc161d7fc48 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Sun, 3 Nov 2024 00:03:56 -0700 Subject: [PATCH 02/43] Sorting Hinkal Dependencies --- packages/payment-processor/package.json | 4 ++-- packages/usage-examples/package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 61cf756b1..9729ca4d1 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,6 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { + "@hinkal/common": "0.0.167", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.18.0", "@requestnetwork/payment-detection": "0.45.0", @@ -48,8 +49,7 @@ "@superfluid-finance/sdk-core": "0.5.0", "ethers": "5.5.1", "near-api-js": "4.0.2", - "tslib": "2.5.0", - "@hinkal/common": "0.0.167" + "tslib": "2.5.0" }, "devDependencies": { "@types/jest": "29.5.6", diff --git a/packages/usage-examples/package.json b/packages/usage-examples/package.json index 6b879b0e0..4ea5e1fa8 100644 --- a/packages/usage-examples/package.json +++ b/packages/usage-examples/package.json @@ -39,9 +39,9 @@ "@requestnetwork/transaction-manager": "0.36.0", "@requestnetwork/types": "0.45.0", "@requestnetwork/utils": "0.45.0", + "dotenv": "10.0.0", "ethers": "5.5.1", - "tslib": "2.5.0", - "dotenv": "10.0.0" + "tslib": "2.5.0" }, "devDependencies": { "ts-node": "10.9.1", From 25e893aecb0c97d3692714363ab5a14635fd0930 Mon Sep 17 00:00:00 2001 From: giorgi-kiknavelidze <69247736+giorgi-kiknavelidze@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:01:55 +0400 Subject: [PATCH 03/43] refactor: address initial comments --- .../src/payment/erc20-fee-proxy.ts | 1 - .../src/payment/prepare-hinkal.ts | 10 ++++-- .../src/payment/prepared-transaction.ts | 4 +++ .../src/hinkal/createRequestForHinkal.ts | 31 ++++++++++--------- .../src/hinkal/hinkalRequestData.ts | 15 +++++++++ .../testPayErc20FeeProxyRequestHinkal.ts | 7 +++-- 6 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 packages/usage-examples/src/hinkal/hinkalRequestData.ts diff --git a/packages/payment-processor/src/payment/erc20-fee-proxy.ts b/packages/payment-processor/src/payment/erc20-fee-proxy.ts index fd8d54049..5f93d590e 100644 --- a/packages/payment-processor/src/payment/erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-fee-proxy.ts @@ -52,7 +52,6 @@ export async function payErc20FeeProxyRequest( * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. - * @param overrides optionally, override default transaction values, like gas. */ export async function payPrivateErc20FeeProxyRequest( request: ClientTypes.IRequestData, diff --git a/packages/payment-processor/src/payment/prepare-hinkal.ts b/packages/payment-processor/src/payment/prepare-hinkal.ts index 41f374b85..69d9b7d5f 100644 --- a/packages/payment-processor/src/payment/prepare-hinkal.ts +++ b/packages/payment-processor/src/payment/prepare-hinkal.ts @@ -3,8 +3,13 @@ import { Signer } from 'ethers'; import { Hinkal, exportEthersProvider, preProcessing } from '@hinkal/common'; /** - * prepares wrapper hinkal object for private transaction - * @param signer signer object to be passed + * Prepares a wrapper Hinkal object for private transactions. + * This function initializes the necessary components for private transaction processing + * including provider setup, user keys, and Merkle tree initialization. + * + * @param signer - The ethers.js Signer instance for transaction signing + * @returns Promise> - A configured Hinkal instance ready for private transactions + * @throw If initialization of provider, user keys, or Merkle tree fails */ export const prepareHinkal = async (signer: Signer): Promise> => { await preProcessing(); @@ -15,6 +20,7 @@ export const prepareHinkal = async (signer: Signer): Promise> => await hinkal.initProviderAdapter(undefined, ethersProvider); await hinkal.initUserKeys(); + // initialize merkle trees await hinkal.resetMerkle(); return hinkal; diff --git a/packages/payment-processor/src/payment/prepared-transaction.ts b/packages/payment-processor/src/payment/prepared-transaction.ts index 38d84e9d9..25b0a3a22 100644 --- a/packages/payment-processor/src/payment/prepared-transaction.ts +++ b/packages/payment-processor/src/payment/prepared-transaction.ts @@ -6,8 +6,12 @@ export interface IPreparedTransaction { to: string; } +/** Interface for preparing private transactions using Hinkal middleware */ export interface IPreparedPrivateTransaction { + /** Amount to pay in base units (wei or the smallest possible unit of ERC20 token) */ amountToPay: bigint; + /** ERC20 token contract address */ tokenAddress: string; + /** list of operations encoded as HexStrings */ ops: string[]; } diff --git a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts index 7f0ec9875..061e07390 100644 --- a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts +++ b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts @@ -1,21 +1,24 @@ import { ethers } from 'ethers'; import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; -import { CurrencyTypes } from '@requestnetwork/types'; - -// Example Data: -const currencyAddress = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'; // USDC -const currencyAmount = ethers.utils.parseUnits('0.01', 6).toBigInt(); -const currentNetwork = 'sepolia' as CurrencyTypes.ChainName; -const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; -const currentGateway = 'https://sepolia.gateway.request.network'; -const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address -const fee = '0'; -const contentData = { - reason: 'Hinkal Test', - dueDate: '2025.06.16', -}; +import { + contentData, + currencyAddress, + currencyAmount, + currentCurrenyType, + currentGateway, + currentNetwork, + fee, + payee, +} from './hinkalRequestData'; +/** + * Creates a payment request with the parameters specified in './hinkalRequestData.ts' + * used by testPayErc20FeeProxyRequestHinkal.ts + * @param payerWallet the wallet used by the payer + * @param privateKey the private of the user creating the request + * @returns Newly created request + */ export const createRequestForHinkal = async ( payerWallet: ethers.Wallet, privateKey: string, diff --git a/packages/usage-examples/src/hinkal/hinkalRequestData.ts b/packages/usage-examples/src/hinkal/hinkalRequestData.ts new file mode 100644 index 000000000..ed63dd914 --- /dev/null +++ b/packages/usage-examples/src/hinkal/hinkalRequestData.ts @@ -0,0 +1,15 @@ +import { ethers } from 'ethers'; +import { Types } from '@requestnetwork/request-client.js'; +import { CurrencyTypes } from '@requestnetwork/types'; + +export const currencyAddress = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'; // USDC +export const currencyAmount = ethers.utils.parseUnits('0.01', 6).toBigInt(); +export const currentNetwork: CurrencyTypes.ChainName = 'optimism'; +export const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; +export const currentGateway = 'https://sepolia.gateway.request.network'; +export const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address +export const fee = '0'; +export const contentData = { + reason: 'Hinkal Test', + dueDate: '2025.06.16', +}; diff --git a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts index b0b30e664..2615fcb82 100644 --- a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts +++ b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts @@ -7,11 +7,14 @@ config(); // Usage Example of Private Transactions using Hinkal on Optimism // You will need to pass PAYER_PRIVATE_KEY to .env file in usage_examples root (make sure dotenv is installed) // run --> yarn start:hinkal +// IMPORTANT: Ensure your account has sufficient USDC balance before running +// SECURITY: Handle private keys with extreme caution. Never commit .env file +// NOTE: Ensure sufficient ETH for gas fees on Optimism network yarn start:hinkal void (async () => { - const RPC_URL = 'https://mainnet.optimism.io'; - const { PAYER_PRIVATE_KEY } = process.env; + const { PAYER_PRIVATE_KEY, OPTIMISM_RPC_URL } = process.env; if (!PAYER_PRIVATE_KEY) throw new Error('PRIVATE_KEY_MISSING'); + const RPC_URL = OPTIMISM_RPC_URL || 'https://mainnet.optimism.io'; // Create Provider and Signer const provider = new ethers.providers.JsonRpcProvider(RPC_URL); From d162cad1bf16fdb6f279896b245694be0a110986 Mon Sep 17 00:00:00 2001 From: giorgi-kiknavelidze <69247736+giorgi-kiknavelidze@users.noreply.github.com> Date: Mon, 4 Nov 2024 22:45:24 +0400 Subject: [PATCH 04/43] refactor: address secondary comments --- packages/payment-processor/src/payment/prepare-hinkal.ts | 2 +- .../payment-processor/src/payment/prepared-transaction.ts | 2 +- .../src/hinkal/testPayErc20FeeProxyRequestHinkal.ts | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/payment-processor/src/payment/prepare-hinkal.ts b/packages/payment-processor/src/payment/prepare-hinkal.ts index 69d9b7d5f..c65462412 100644 --- a/packages/payment-processor/src/payment/prepare-hinkal.ts +++ b/packages/payment-processor/src/payment/prepare-hinkal.ts @@ -9,7 +9,7 @@ import { Hinkal, exportEthersProvider, preProcessing } from '@hinkal/common'; * * @param signer - The ethers.js Signer instance for transaction signing * @returns Promise> - A configured Hinkal instance ready for private transactions - * @throw If initialization of provider, user keys, or Merkle tree fails + * @throws If initialization of provider, user keys, or Merkle tree fails */ export const prepareHinkal = async (signer: Signer): Promise> => { await preProcessing(); diff --git a/packages/payment-processor/src/payment/prepared-transaction.ts b/packages/payment-processor/src/payment/prepared-transaction.ts index 25b0a3a22..a5acc0e34 100644 --- a/packages/payment-processor/src/payment/prepared-transaction.ts +++ b/packages/payment-processor/src/payment/prepared-transaction.ts @@ -8,7 +8,7 @@ export interface IPreparedTransaction { /** Interface for preparing private transactions using Hinkal middleware */ export interface IPreparedPrivateTransaction { - /** Amount to pay in base units (wei or the smallest possible unit of ERC20 token) */ + /** Amount to pay in base units (e.g., wei for ETH, smallest decimal unit for ERC20 tokens based on their decimals()) */ amountToPay: bigint; /** ERC20 token contract address */ tokenAddress: string; diff --git a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts index 2615fcb82..1daf68e74 100644 --- a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts +++ b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts @@ -22,7 +22,11 @@ void (async () => { // Create Request and submit private transfer const requestData = await createRequestForHinkal(payerWallet, PAYER_PRIVATE_KEY); + console.log('Request data created successfully'); const tx = await payPrivateErc20FeeProxyRequest(requestData, payerWallet); - console.log('finish', { tx }); + console.log('Private transaction submitted:', { + requestId: requestData.requestId, + relayerTx: tx, + }); process.exit(0); })(); From 8f26021b59d6a81922a5ea895a21bcc6c44166d1 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 18 Nov 2024 19:59:32 -0800 Subject: [PATCH 05/43] updated-hinkal-to-0.1.2 --- packages/payment-processor/package.json | 2 +- .../src/payment/erc20-fee-proxy.ts | 4 +-- .../src/payment/prepare-hinkal.ts | 27 ------------------- 3 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 packages/payment-processor/src/payment/prepare-hinkal.ts diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 9729ca4d1..d174f0411 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.0.167", + "@hinkal/common": "0.1.2", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.18.0", "@requestnetwork/payment-detection": "0.45.0", diff --git a/packages/payment-processor/src/payment/erc20-fee-proxy.ts b/packages/payment-processor/src/payment/erc20-fee-proxy.ts index 5f93d590e..0890b639a 100644 --- a/packages/payment-processor/src/payment/erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-fee-proxy.ts @@ -26,7 +26,7 @@ import { validateRequest, } from './utils'; import { IPreparedPrivateTransaction, IPreparedTransaction } from './prepared-transaction'; -import { prepareHinkal } from './prepare-hinkal'; +import { prepareEthersHinkal } from '@hinkal/common/providers/prepareEthersHinkal'; /** * Processes a transaction to pay an ERC20 Request with fees. @@ -59,7 +59,7 @@ export async function payPrivateErc20FeeProxyRequest( amount?: BigNumberish, feeAmount?: BigNumberish, ): Promise { - const hinkal = await prepareHinkal(getSigner(signerOrProvider)); + const hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); const { amountToPay, tokenAddress, ops } = preparePrivateErc20FeeProxyPaymentTransaction( request, diff --git a/packages/payment-processor/src/payment/prepare-hinkal.ts b/packages/payment-processor/src/payment/prepare-hinkal.ts deleted file mode 100644 index c65462412..000000000 --- a/packages/payment-processor/src/payment/prepare-hinkal.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Signer } from 'ethers'; - -import { Hinkal, exportEthersProvider, preProcessing } from '@hinkal/common'; - -/** - * Prepares a wrapper Hinkal object for private transactions. - * This function initializes the necessary components for private transaction processing - * including provider setup, user keys, and Merkle tree initialization. - * - * @param signer - The ethers.js Signer instance for transaction signing - * @returns Promise> - A configured Hinkal instance ready for private transactions - * @throws If initialization of provider, user keys, or Merkle tree fails - */ -export const prepareHinkal = async (signer: Signer): Promise> => { - await preProcessing(); - const hinkal = new Hinkal(); - - const ethersProvider = await exportEthersProvider(); - ethersProvider.initSigner?.(signer); // type discrepency comes from different version of ethers.js - await hinkal.initProviderAdapter(undefined, ethersProvider); - await hinkal.initUserKeys(); - - // initialize merkle trees - await hinkal.resetMerkle(); - - return hinkal; -}; From ceb3aa6c92adfaf5ebd644b1b2c21108f596894c Mon Sep 17 00:00:00 2001 From: nkoreli Date: Thu, 28 Nov 2024 18:37:55 -0800 Subject: [PATCH 06/43] adding-integration-tests --- packages/payment-processor/package.json | 2 +- packages/payment-processor/src/index.ts | 1 + .../payment/erc-20-private-payment-hinkal.ts | 165 ++++ .../src/payment/erc20-fee-proxy.ts | 90 +-- .../erc-20-private-payment-hinkal.test.ts | 149 ++++ packages/usage-examples/package.json | 1 - .../src/hinkal/createRequestForHinkal.ts | 2 +- .../src/hinkal/hinkalRequestData.ts | 6 +- .../testPayErc20FeeProxyRequestHinkal.ts | 13 +- yarn.lock | 714 +++++++++++++++++- 10 files changed, 1024 insertions(+), 119 deletions(-) create mode 100644 packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts create mode 100644 packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index c8ee794c8..2d81b1a50 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.1.2", + "@hinkal/common": "0.1.36", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.19.0", "@requestnetwork/payment-detection": "0.45.1", diff --git a/packages/payment-processor/src/index.ts b/packages/payment-processor/src/index.ts index c1ab446f7..f9aba001e 100644 --- a/packages/payment-processor/src/index.ts +++ b/packages/payment-processor/src/index.ts @@ -3,6 +3,7 @@ export * from './payment/btc-address-based'; export * from './payment/erc20'; export * from './payment/erc20-proxy'; export * from './payment/erc20-fee-proxy'; +export * from './payment/erc-20-private-payment-hinkal'; export * from './payment/erc777-stream'; export * from './payment/erc777-utils'; export * from './payment/eth-input-data'; diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts new file mode 100644 index 000000000..87ee23c6d --- /dev/null +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -0,0 +1,165 @@ +import { Contract, Signer, BigNumberish, providers } from 'ethers'; +import { erc20FeeProxyArtifact } from '@requestnetwork/smart-contracts'; +import { + ERC20FeeProxy__factory, + ERC20Proxy__factory, + ERC20__factory, +} from '@requestnetwork/smart-contracts/types'; +import { ClientTypes, ExtensionTypes } from '@requestnetwork/types'; +import { Erc20PaymentNetwork, getPaymentNetworkExtension } from '@requestnetwork/payment-detection'; +import { EvmChains } from '@requestnetwork/currency'; +import { + getAmountToPay, + getProvider, + getRequestPaymentValues, + getSigner, + validateRequest, + validateErc20FeeProxyRequest, + getProxyAddress, +} from './utils'; +import { IPreparedPrivateTransaction } from './prepared-transaction'; + +import { emporiumOp, IHinkal, RelayerTransaction } from '@hinkal/common'; +import { prepareEthersHinkal } from '@hinkal/common/providers/prepareEthersHinkal'; + +// exposing state variable to be accessed: for intergration tests +export let hinkal: IHinkal; + +/** + * Processes a transaction to pay an ERC20 Request privately with fees. + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. + */ +export async function payPrivateErc20ProxyRequestFromHinkal( + request: ClientTypes.IRequestData, + signerOrProvider: providers.Provider | Signer = getProvider(), + amount?: BigNumberish, +): Promise { + if (!hinkal) hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); + + const { amountToPay, tokenAddress, ops } = preparePrivateErc20ProxyPaymentTransactionFromHinkal( + request, + amount, + ); + + return hinkal.actionPrivateWallet( + [tokenAddress], + [-amountToPay], + [false], + ops, + undefined, + false, + ) as Promise; +} +/** + * Processes a transaction to pay an ERC20 Request privately with fees. + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. + */ +export async function payPrivateErc20FeeProxyRequestFromHinkal( + request: ClientTypes.IRequestData, + signerOrProvider: providers.Provider | Signer = getProvider(), + amount?: BigNumberish, + feeAmount?: BigNumberish, +): Promise { + if (!hinkal) hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); + + const { amountToPay, tokenAddress, ops } = + preparePrivateErc20FeeProxyPaymentTransactionFromHinkal(request, amount, feeAmount); + + return hinkal.actionPrivateWallet( + [tokenAddress], + [-amountToPay], + [false], + ops, + undefined, + false, + ) as Promise; +} + +/** + * Prepare the transaction to privately pay a request through the ERC20 proxy contract, can be used with a Multisig contract. + * @param request request to pay + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + */ +export function preparePrivateErc20ProxyPaymentTransactionFromHinkal( + request: ClientTypes.IRequestData, + amount?: BigNumberish, +): IPreparedPrivateTransaction { + validateRequest(request, ExtensionTypes.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT); + + const { value: tokenAddress } = request.currencyInfo; + const proxyAddress = getProxyAddress( + request, + Erc20PaymentNetwork.ERC20ProxyPaymentDetector.getDeploymentInformation, + ); + + const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); + const proxyContract = new Contract(proxyAddress, ERC20Proxy__factory.createInterface()); + + const { paymentReference, paymentAddress } = getRequestPaymentValues(request); + const amountToPay = getAmountToPay(request, amount); + + const ops = [ + emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), + emporiumOp(proxyContract, 'transferFromWithReference', [ + tokenAddress, + paymentAddress, + amountToPay, + `0x${paymentReference}`, + ]), + ]; + + return { + amountToPay: amountToPay.toBigInt(), + tokenAddress, + ops, + }; +} + +/** + * Prepare the transaction to privately pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. + * @param request request to pay + * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. + * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. + */ +export function preparePrivateErc20FeeProxyPaymentTransactionFromHinkal( + request: ClientTypes.IRequestData, + amount?: BigNumberish, + feeAmountOverride?: BigNumberish, +): IPreparedPrivateTransaction { + validateErc20FeeProxyRequest(request, amount, feeAmountOverride); + + const { value: tokenAddress, network } = request.currencyInfo; + EvmChains.assertChainSupported(network!); + const pn = getPaymentNetworkExtension(request); + const proxyAddress = erc20FeeProxyArtifact.getAddress(network, pn?.version); + + const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); + const proxyContract = new Contract(proxyAddress, ERC20FeeProxy__factory.createInterface()); + + const { paymentReference, paymentAddress, feeAddress, feeAmount } = + getRequestPaymentValues(request); + const amountToPay = getAmountToPay(request, amount); + const feeToPay = String(feeAmountOverride || feeAmount || 0); + + const ops = [ + emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), + emporiumOp(proxyContract, 'transferFromWithReferenceAndFee', [ + tokenAddress, + paymentAddress, + amountToPay, + `0x${paymentReference}`, + feeToPay, + feeAddress, + ]), + ]; + + return { + amountToPay: amountToPay.toBigInt(), + tokenAddress, + ops, + }; +} diff --git a/packages/payment-processor/src/payment/erc20-fee-proxy.ts b/packages/payment-processor/src/payment/erc20-fee-proxy.ts index 0890b639a..9d21d4b45 100644 --- a/packages/payment-processor/src/payment/erc20-fee-proxy.ts +++ b/packages/payment-processor/src/payment/erc20-fee-proxy.ts @@ -1,21 +1,11 @@ -import { - constants, - Contract, - ContractTransaction, - Signer, - BigNumberish, - providers, - BigNumber, -} from 'ethers'; +import { constants, ContractTransaction, Signer, BigNumberish, providers, BigNumber } from 'ethers'; import { erc20FeeProxyArtifact } from '@requestnetwork/smart-contracts'; -import { ERC20FeeProxy__factory, ERC20__factory } from '@requestnetwork/smart-contracts/types'; +import { ERC20FeeProxy__factory } from '@requestnetwork/smart-contracts/types'; import { ClientTypes, ExtensionTypes } from '@requestnetwork/types'; import { getPaymentNetworkExtension } from '@requestnetwork/payment-detection'; import { EvmChains } from '@requestnetwork/currency'; -import { emporiumOp, RelayerTransaction } from '@hinkal/common'; - import { ITransactionOverrides } from './transaction-overrides'; import { getAmountToPay, @@ -25,8 +15,7 @@ import { validateErc20FeeProxyRequest, validateRequest, } from './utils'; -import { IPreparedPrivateTransaction, IPreparedTransaction } from './prepared-transaction'; -import { prepareEthersHinkal } from '@hinkal/common/providers/prepareEthersHinkal'; +import { IPreparedTransaction } from './prepared-transaction'; /** * Processes a transaction to pay an ERC20 Request with fees. @@ -47,34 +36,6 @@ export async function payErc20FeeProxyRequest( return signer.sendTransaction({ data, to, value, ...overrides }); } -/** - * Processes a transaction to pay an ERC20 Request privately with fees. - * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. - * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. - * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. - */ -export async function payPrivateErc20FeeProxyRequest( - request: ClientTypes.IRequestData, - signerOrProvider: providers.Provider | Signer = getProvider(), - amount?: BigNumberish, - feeAmount?: BigNumberish, -): Promise { - const hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); - - const { amountToPay, tokenAddress, ops } = preparePrivateErc20FeeProxyPaymentTransaction( - request, - amount, - feeAmount, - ); - - return hinkal.actionPrivateWallet( - [tokenAddress], - [-amountToPay], - [false], - ops, - ) as Promise; -} - /** * Encodes the call to pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. * @param request request to pay @@ -155,48 +116,3 @@ export function prepareErc20FeeProxyPaymentTransaction( value: 0, }; } - -/** - * Prepare the transaction to privately pay a request through the ERC20 fee proxy contract, can be used with a Multisig contract. - * @param request request to pay - * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. - * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. - */ -export function preparePrivateErc20FeeProxyPaymentTransaction( - request: ClientTypes.IRequestData, - amount?: BigNumberish, - feeAmountOverride?: BigNumberish, -): IPreparedPrivateTransaction { - validateErc20FeeProxyRequest(request, amount, feeAmountOverride); - - const { value: tokenAddress, network } = request.currencyInfo; - EvmChains.assertChainSupported(network!); - const pn = getPaymentNetworkExtension(request); - const proxyAddress = erc20FeeProxyArtifact.getAddress(network, pn?.version); - - const tokenContract = new Contract(tokenAddress, ERC20__factory.createInterface()); - const proxyContract = new Contract(proxyAddress, ERC20FeeProxy__factory.createInterface()); - - const { paymentReference, paymentAddress, feeAddress, feeAmount } = - getRequestPaymentValues(request); - const amountToPay = getAmountToPay(request, amount); - const feeToPay = String(feeAmountOverride || feeAmount || 0); - - const ops = [ - emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), - emporiumOp(proxyContract, 'transferFromWithReferenceAndFee', [ - tokenAddress, - paymentAddress, - amountToPay, - `0x${paymentReference}`, - feeToPay, - feeAddress, - ]), - ]; - - return { - amountToPay: amountToPay.toBigInt(), - tokenAddress, - ops, - }; -} diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts new file mode 100644 index 000000000..40d78a41f --- /dev/null +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -0,0 +1,149 @@ +import { BigNumber, ethers, providers } from 'ethers'; +import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; +import { CurrencyTypes } from '@requestnetwork/types'; +import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; +import { + hinkal, + payPrivateErc20FeeProxyRequestFromHinkal, + payPrivateErc20ProxyRequestFromHinkal, +} from '../../src/payment/erc-20-private-payment-hinkal'; +import { getErc20Balance } from '../../src/payment/erc20'; + +// Constants to configure the tests +export const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC +export const currencyAmount = ethers.utils.parseUnits('0.00001', 6).toBigInt(); +export const currentNetwork: CurrencyTypes.ChainName = 'base'; +export const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; +export const currentGateway = 'https://sepolia.gateway.request.network'; +export const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address +export const fee = '0'; +// Payer's private key (for signing and sending transactions) +const PAYER_PUBLIC_KEY = '0x44DC1e666C1ca6717849efE19eAC72AD83cFf5d2'; +const PAYER_PRIVATE_KEY = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; +// Blockchain RPC endpoint for the Base network +const RPC_URL = 'https://mainnet.base.org'; +// Set Jest timeout for asynchronous operations (e.g., blockchain calls) +jest.setTimeout(1000000); + +/** + * Function to create a payment request for Hinkal. + * This sets up the Request Network with payer and payee information. + * @param payerWallet The wallet of the payer. + * @param privateKey The private key of the payer (for signing). + * @param type The payment network type (e.g., ERC20_PROXY_CONTRACT). + * @returns A Promise that resolves to the request data with events. + */ +export const createRequestForHinkal = async ( + payerWallet: ethers.Wallet, + privateKey: string, + type: Types.Extension.PAYMENT_NETWORK_ID, +): Promise => { + // step 1: Create Signature Provider + const epkSignatureProvider = new EthereumPrivateKeySignatureProvider({ + method: Types.Signature.METHOD.ECDSA, + privateKey: privateKey, + }); + // step 2: create Request Network + const requestClient = new RequestNetwork({ + nodeConnectionConfig: { + baseURL: currentGateway, + }, + signatureProvider: epkSignatureProvider, + }); + + let paymentNetwork; + + // Step 3: Define payment network configuration based on type + if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT) { + paymentNetwork = { + id: type, + parameters: { + paymentNetworkName: currentNetwork, + paymentAddress: payee, + }, + }; + } else if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT) { + paymentNetwork = { + id: type, + parameters: { + paymentNetworkName: currentNetwork, + paymentAddress: payee, + feeAddress: payee, + feeAmount: fee, + }, + }; + } + + // step 4: Create Request Object + const requestCreateParameters: Types.ICreateRequestParameters = { + requestInfo: { + currency: { + type: currentCurrenyType, + value: currencyAddress, + network: currentNetwork, + }, + payee: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payee, + }, + payer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + expectedAmount: currencyAmount.toString(), + timestamp: Utils.getCurrentTimestampInSecond(), + }, + signer: { + type: Types.Identity.TYPE.ETHEREUM_ADDRESS, + value: payerWallet.address, + }, + paymentNetwork, + }; + + // Step 5: create & send request + const request = await requestClient.createRequest(requestCreateParameters); + const requestData = await request.waitForConfirmation(); + return requestData; +}; + +describe('ERC-20 Private Payments With Hinkal', () => { + let provider: providers.Provider; + let payer: ethers.Wallet; + beforeAll(async () => { + provider = new ethers.providers.JsonRpcProvider(RPC_URL); + payer = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); + }); + afterAll(async () => { + hinkal.snapshotsClearInterval(); // Clear Hinkal's internal snapshots interval + jest.clearAllTimers(); // Clear any pending Jest timers + }); + it('ERC-20 Proxy: Privacy of a Sender - Payer is not equal to Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payer, + PAYER_PRIVATE_KEY, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, + ); + const balanceErc20Before = await getErc20Balance(requestData, payee, provider); + const tx = await payPrivateErc20ProxyRequestFromHinkal(requestData, payer); + const balanceErc20After = await getErc20Balance(requestData, payee, provider); + + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + }); + it('ERC-20 Fee Proxy: Privacy of a Sender - Payer is not equal to Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payer, + PAYER_PRIVATE_KEY, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, + ); + + const balanceErc20Before = await getErc20Balance(requestData, payee, provider); + const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payer); + const balanceErc20After = await getErc20Balance(requestData, payee, provider); + + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + }); +}); diff --git a/packages/usage-examples/package.json b/packages/usage-examples/package.json index fbb5c2678..fed9ee049 100644 --- a/packages/usage-examples/package.json +++ b/packages/usage-examples/package.json @@ -39,7 +39,6 @@ "@requestnetwork/transaction-manager": "0.36.1", "@requestnetwork/types": "0.45.1", "@requestnetwork/utils": "0.45.1", - "dotenv": "10.0.0", "ethers": "5.7.2", "tslib": "2.5.0" }, diff --git a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts index 061e07390..f7a8f9830 100644 --- a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts +++ b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts @@ -16,7 +16,7 @@ import { * Creates a payment request with the parameters specified in './hinkalRequestData.ts' * used by testPayErc20FeeProxyRequestHinkal.ts * @param payerWallet the wallet used by the payer - * @param privateKey the private of the user creating the request + * @param privateKey the private key of the user creating the request * @returns Newly created request */ export const createRequestForHinkal = async ( diff --git a/packages/usage-examples/src/hinkal/hinkalRequestData.ts b/packages/usage-examples/src/hinkal/hinkalRequestData.ts index ed63dd914..843e0e5b4 100644 --- a/packages/usage-examples/src/hinkal/hinkalRequestData.ts +++ b/packages/usage-examples/src/hinkal/hinkalRequestData.ts @@ -2,9 +2,9 @@ import { ethers } from 'ethers'; import { Types } from '@requestnetwork/request-client.js'; import { CurrencyTypes } from '@requestnetwork/types'; -export const currencyAddress = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'; // USDC -export const currencyAmount = ethers.utils.parseUnits('0.01', 6).toBigInt(); -export const currentNetwork: CurrencyTypes.ChainName = 'optimism'; +export const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC +export const currencyAmount = ethers.utils.parseUnits('0.0001', 6).toBigInt(); +export const currentNetwork: CurrencyTypes.ChainName = 'base'; export const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; export const currentGateway = 'https://sepolia.gateway.request.network'; export const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address diff --git a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts index 1daf68e74..20ff5f48c 100644 --- a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts +++ b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts @@ -1,20 +1,15 @@ import { ethers } from 'ethers'; -import { payPrivateErc20FeeProxyRequest } from '@requestnetwork/payment-processor'; +import { payPrivateErc20FeeProxyRequestFromHinkal } from '@requestnetwork/payment-processor'; import { createRequestForHinkal } from './createRequestForHinkal'; -import { config } from 'dotenv'; -config(); // Usage Example of Private Transactions using Hinkal on Optimism -// You will need to pass PAYER_PRIVATE_KEY to .env file in usage_examples root (make sure dotenv is installed) // run --> yarn start:hinkal // IMPORTANT: Ensure your account has sufficient USDC balance before running -// SECURITY: Handle private keys with extreme caution. Never commit .env file // NOTE: Ensure sufficient ETH for gas fees on Optimism network yarn start:hinkal void (async () => { - const { PAYER_PRIVATE_KEY, OPTIMISM_RPC_URL } = process.env; - if (!PAYER_PRIVATE_KEY) throw new Error('PRIVATE_KEY_MISSING'); - const RPC_URL = OPTIMISM_RPC_URL || 'https://mainnet.optimism.io'; + const PAYER_PRIVATE_KEY = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; + const RPC_URL = 'https://mainnet.base.org'; // Create Provider and Signer const provider = new ethers.providers.JsonRpcProvider(RPC_URL); @@ -23,7 +18,7 @@ void (async () => { // Create Request and submit private transfer const requestData = await createRequestForHinkal(payerWallet, PAYER_PRIVATE_KEY); console.log('Request data created successfully'); - const tx = await payPrivateErc20FeeProxyRequest(requestData, payerWallet); + const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payerWallet); console.log('Private transaction submitted:', { requestId: requestData.requestId, relayerTx: tx, diff --git a/yarn.lock b/yarn.lock index 3199c7507..6b0314d43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,6 +45,49 @@ dependencies: node-fetch "^2.6.1" +"@axelar-network/axelar-cgp-solidity@^6.3.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-6.4.0.tgz#75619d775a46f9dfae9fc90be78db1bd0ae77c46" + integrity sha512-Xnw5xi234B1cmTCzgudV8zq+DDjJ1d1U362CM0vKH1FWmZprKIdqgmOYkiRyu+QiVhnznKiBURiSEHVrNjtYpw== + dependencies: + "@axelar-network/axelar-gmp-sdk-solidity" "5.10.0" + +"@axelar-network/axelar-gmp-sdk-solidity@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.10.0.tgz#9679b0634e4db6eb345aac800df6dd3a38d2e242" + integrity sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw== + +"@axelar-network/axelarjs-sdk@0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-sdk/-/axelarjs-sdk-0.16.0.tgz#e076482c1b82f8f79dd8aaf5dd41c818aed26acb" + integrity sha512-CSj5JZKFLdHYIPziU3O7FVI9oDYhCwiF5ysMQ7B82gt+KW/Ex2NMPx4Do+eEJi6dvcsHkUnsZFyY+YRXpQJoBw== + dependencies: + "@axelar-network/axelar-cgp-solidity" "^6.3.0" + "@axelar-network/axelarjs-types" "^0.33.0" + "@cosmjs/json-rpc" "^0.30.1" + "@cosmjs/stargate" "0.31.0-alpha.1" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/networks" "^5.7.1" + "@ethersproject/providers" "^5.7.2" + "@types/uuid" "^8.3.1" + bech32 "^2.0.0" + clone-deep "^4.0.1" + cross-fetch "^3.1.5" + ethers "^5.7.2" + socket.io-client "^4.6.1" + standard-http-error "^2.0.1" + string-similarity-js "^2.1.4" + uuid "^8.3.2" + ws "^8.13.0" + +"@axelar-network/axelarjs-types@^0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-types/-/axelarjs-types-0.33.0.tgz#070ffbaec6be57259b64a41ee14f98804907732e" + integrity sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ== + dependencies: + long "^5.2.0" + protobufjs "^7.0.0" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" @@ -912,6 +955,14 @@ dot "^1.1.3" fs-extra "^9.0.1" +"@confio/ics23@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" + integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w== + dependencies: + "@noble/hashes" "^1.0.0" + protobufjs "^6.8.8" + "@cosmjs/amino@0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.30.1.tgz#7c18c14627361ba6c88e3495700ceea1f76baace" @@ -922,6 +973,16 @@ "@cosmjs/math" "^0.30.1" "@cosmjs/utils" "^0.30.1" +"@cosmjs/amino@^0.31.0-alpha.1", "@cosmjs/amino@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.3.tgz#0f4aa6bd68331c71bd51b187fa64f00eb075db0a" + integrity sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw== + dependencies: + "@cosmjs/crypto" "^0.31.3" + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + "@cosmjs/crypto@0.30.1", "@cosmjs/crypto@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" @@ -935,6 +996,19 @@ elliptic "^6.5.4" libsodium-wrappers "^0.7.6" +"@cosmjs/crypto@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.3.tgz#c752cb6d682fdc735dcb45a2519f89c56ba16c26" + integrity sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ== + dependencies: + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + "@cosmjs/encoding@0.30.1", "@cosmjs/encoding@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" @@ -944,6 +1018,31 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.31.0-alpha.1", "@cosmjs/encoding@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" + integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + +"@cosmjs/json-rpc@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" + integrity sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ== + dependencies: + "@cosmjs/stream" "^0.30.1" + xstream "^11.14.0" + +"@cosmjs/json-rpc@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.31.3.tgz#11e5cf0f6d9ab426dff470bb8d68d5d31cd6ab13" + integrity sha512-7LVYerXjnm69qqYR3uA6LGCrBW2EO5/F7lfJxAmY+iII2C7xO3a0vAjMSt5zBBh29PXrJVS6c2qRP22W1Le2Wg== + dependencies: + "@cosmjs/stream" "^0.31.3" + xstream "^11.14.0" + "@cosmjs/math@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" @@ -951,11 +1050,94 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.31.0-alpha.1", "@cosmjs/math@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.3.tgz#767f7263d12ba1b9ed2f01f68d857597839fd957" + integrity sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A== + dependencies: + bn.js "^5.2.0" + +"@cosmjs/proto-signing@^0.31.0-alpha.1": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz#20440b7b96fb2cd924256a10e656fd8d4481cdcd" + integrity sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA== + dependencies: + "@cosmjs/amino" "^0.31.3" + "@cosmjs/crypto" "^0.31.3" + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + cosmjs-types "^0.8.0" + long "^4.0.0" + +"@cosmjs/socket@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.31.3.tgz#52086380f4de2fc3514b90b0484b4b1c4c50e39e" + integrity sha512-aqrDGGi7os/hsz5p++avI4L0ZushJ+ItnzbqA7C6hamFSCJwgOkXaOUs+K9hXZdX4rhY7rXO4PH9IH8q09JkTw== + dependencies: + "@cosmjs/stream" "^0.31.3" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + +"@cosmjs/stargate@0.31.0-alpha.1": + version "0.31.0-alpha.1" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.0-alpha.1.tgz#85b9d41cd5e73c3b8db73115aa1c9cd6eb5914fd" + integrity sha512-kCTUT3niB2hvcHjhlxpM8cNw1KOVmgZROdJUQaO8Ts4j22OyRZRFdwRPrOIuAKpqhVW2I1vI2HQL9Bg7pk9Glw== + dependencies: + "@confio/ics23" "^0.6.8" + "@cosmjs/amino" "^0.31.0-alpha.1" + "@cosmjs/encoding" "^0.31.0-alpha.1" + "@cosmjs/math" "^0.31.0-alpha.1" + "@cosmjs/proto-signing" "^0.31.0-alpha.1" + "@cosmjs/stream" "^0.31.0-alpha.1" + "@cosmjs/tendermint-rpc" "^0.31.0-alpha.1" + "@cosmjs/utils" "^0.31.0-alpha.1" + cosmjs-types "^0.8.0" + long "^4.0.0" + protobufjs "~6.11.3" + xstream "^11.14.0" + +"@cosmjs/stream@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" + integrity sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ== + dependencies: + xstream "^11.14.0" + +"@cosmjs/stream@^0.31.0-alpha.1", "@cosmjs/stream@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.31.3.tgz#53428fd62487ec08fc3886a50a3feeb8b2af2e66" + integrity sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w== + dependencies: + xstream "^11.14.0" + +"@cosmjs/tendermint-rpc@^0.31.0-alpha.1": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz#d1a2bc5b3c98743631c9b55888589d352403c9b3" + integrity sha512-s3TiWkPCW4QceTQjpYqn4xttUJH36mTPqplMl+qyocdqk5+X5mergzExU/pHZRWQ4pbby8bnR7kMvG4OC1aZ8g== + dependencies: + "@cosmjs/crypto" "^0.31.3" + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/json-rpc" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/socket" "^0.31.3" + "@cosmjs/stream" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + "@cosmjs/utils@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== +"@cosmjs/utils@^0.31.0-alpha.1", "@cosmjs/utils@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" + integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -1863,7 +2045,7 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0", "@ethersproject/networks@^5.7.1": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== @@ -1993,7 +2175,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -2995,11 +3177,41 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@hinkal/common@0.1.36": + version "0.1.36" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.36.tgz#7f39e2d9ba37a5a65ec923f27ed2f6c936346dce" + integrity sha512-lUrnOHEOZ8lEKUGMuMJxEVT++3nct8RH85Zq1ft2Hzal4QItYV+3P0viPNe6WjBNRiJagxxGNsTCZnxpHVc+Nw== + dependencies: + "@axelar-network/axelarjs-sdk" "0.16.0" + async-mutex "^0.4.0" + axios "^1.6.8" + circomlibjs "^0.1.7" + dotenv "^16.4.5" + ethers "5.7.2" + idb-keyval "6.2.1" + libsodium-wrappers "^0.7.10" + snarkjs "0.7.5" + ua-parser-js "^1.0.37" + uuid "^9.0.1" + "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3" + integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.3.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -4619,6 +4831,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@^1.0.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" @@ -5479,6 +5696,59 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@rainbow-me/fee-suggestions@2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@rainbow-me/fee-suggestions/-/fee-suggestions-2.1.0.tgz" @@ -5739,6 +6009,11 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + "@solidity-parser/parser@^0.13.2": version "0.13.2" resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz" @@ -6366,6 +6641,11 @@ dependencies: "@types/node" "*" +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" @@ -6433,6 +6713,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/node@>=13.7.0": + version "22.10.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.0.tgz#89bfc9e82496b9c7edea3382583fa94f75896e81" + integrity sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA== + dependencies: + undici-types "~6.20.0" + "@types/node@^12.12.6": version "12.20.6" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.6.tgz" @@ -6551,6 +6838,11 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== +"@types/uuid@^8.3.1": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/ws@^8.0.0": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -7872,6 +8164,13 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + async@2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" @@ -7950,6 +8249,13 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.21.2: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + axios@^1.0.0, axios@^1.4.0: version "1.7.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" @@ -7959,6 +8265,20 @@ axios@^1.0.0, axios@^1.4.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e" + integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.0.1: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -8683,6 +9003,17 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + big-integer@1.6.36: version "1.6.36" resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz" @@ -8790,12 +9121,37 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blake-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + readable-stream "^3.6.0" + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + blakejs@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz" integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= -bluebird@^3.5.0, bluebird@^3.5.2: +bluebird@^3.5.0, bluebird@^3.5.2, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -9743,6 +10099,11 @@ check-error@^1.0.2: dependencies: get-func-name "^2.0.2" +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" @@ -9931,6 +10292,23 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circom_runtime@0.1.28: + version "0.1.28" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.28.tgz#4ea4606956eeac4499f71f65354f45b54faa93fe" + integrity sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ== + dependencies: + ffjavascript "0.3.1" + +circomlibjs@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== + dependencies: + blake-hash "^2.0.0" + blake2b "^2.1.3" + ethers "^5.5.1" + ffjavascript "^0.2.45" + citty@^0.1.5, citty@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4" @@ -10075,7 +10453,7 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-deep@4.0.1: +clone-deep@4.0.1, clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== @@ -10622,6 +11000,14 @@ cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: parse-json "^5.2.0" path-type "^4.0.0" +cosmjs-types@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.8.0.tgz#2ed78f3e990f770229726f95f3ef5bf9e2b6859b" + integrity sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + cpu-features@~0.0.8: version "0.0.9" resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.9.tgz#5226b92f0f1c63122b0a3eb84cb8335a4de499fc" @@ -10984,6 +11370,13 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@~4.3.1, debug@~4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decache@^4.5.1: version "4.6.0" resolved "https://registry.npmjs.org/decache/-/decache-4.6.0.tgz" @@ -11553,6 +11946,11 @@ dotenv@^16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotignore@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" @@ -11627,7 +12025,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.7: +ejs@^3.1.6, ejs@^3.1.7: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== @@ -11753,6 +12151,22 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +engine.io-client@~6.6.1: + version "6.6.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.2.tgz#e0a09e1c90effe5d6264da1c56d7281998f1e50b" + integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1: version "4.5.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" @@ -12106,7 +12520,7 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^1.11.1: +escodegen@^1.11.1, escodegen@^1.8.1: version "1.14.3" resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -12353,6 +12767,11 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -12846,7 +13265,7 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@5.7.2, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2, ethers@^5.7.0, ethers@^5.7.1: +ethers@5.7.2, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.1, ethers@^5.5.2, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -13423,6 +13842,11 @@ fast-url-parser@^1.1.3: dependencies: punycode "^1.3.2" +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + fastq@^1.6.0: version "1.11.0" resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz" @@ -13469,6 +13893,33 @@ fetch-ponyfill@^4.0.0: dependencies: node-fetch "~1.7.1" +ffjavascript@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a" + integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@0.3.1, ffjavascript@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.1.tgz#3761bbb3f4a67b58a94a463080272bf6b5877b03" + integrity sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@^0.2.45: + version "0.2.63" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + figures@3.2.0, figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -13722,6 +14173,11 @@ follow-redirects@^1.12.1, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +follow-redirects@^1.14.0: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + fontkit@^1.8.0: version "1.8.1" resolved "https://registry.npmjs.org/fontkit/-/fontkit-1.8.1.tgz" @@ -14506,6 +14962,14 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -15067,6 +15531,11 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -15336,7 +15805,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -idb-keyval@^6.2.1: +idb-keyval@6.2.1, idb-keyval@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== @@ -16390,6 +16859,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + isomorphic-ws@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -17128,6 +17602,15 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -17536,7 +18019,19 @@ libnpmpublish@7.1.4: sigstore "^1.4.0" ssri "^10.0.1" -libsodium-wrappers@^0.7.6: +libsodium-sumo@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz#91c1d863fe3fbce6d6b9db1aadaa622733a1d007" + integrity sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw== + +libsodium-wrappers-sumo@^0.7.11: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz#0ef2a99b4b17e8385aa7e6850593660dbaf5fb40" + integrity sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA== + dependencies: + libsodium-sumo "^0.7.15" + +libsodium-wrappers@^0.7.10, libsodium-wrappers@^0.7.6: version "0.7.15" resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz#53f13e483820272a3d55b23be2e34402ac988055" integrity sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ== @@ -17869,6 +18364,21 @@ loglevel@^1.6.4: resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +long@^5.0.0, long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -18853,7 +19363,7 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -19007,6 +19517,11 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + nanoid@3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" @@ -19109,7 +19624,7 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-addon-api@^3.2.1: +node-addon-api@^3.0.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -19171,6 +19686,11 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== +node-gyp-build@^4.2.2: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + node-gyp@^9.0.0: version "9.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" @@ -20865,6 +21385,43 @@ proto-list@~1.2.1: resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + +protobufjs@^7.0.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" @@ -21118,6 +21675,16 @@ quote-stream@^1.0.1: minimist "^1.1.3" through2 "^2.0.0" +r1csfile@0.0.48: + version "0.0.48" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a" + integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.12" + fastfile "0.0.20" + ffjavascript "0.3.0" + radix3@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/radix3/-/radix3-1.1.2.tgz#fd27d2af3896c6bf4bcdfab6427c69c2afc69ec0" @@ -22501,6 +23068,40 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +snarkjs@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.5.tgz#334d83b61468bdffbbf922b20734ca47be50b8ab" + integrity sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA== + dependencies: + "@iden3/binfileutils" "0.0.12" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.28" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.3.1" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.48" + +socket.io-client@^4.6.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.6.1" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -22869,6 +23470,25 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" +"standard-error@>= 1.1.0 < 2": + version "1.1.0" + resolved "https://registry.yarnpkg.com/standard-error/-/standard-error-1.1.0.tgz#23e5168fa1c0820189e5812701a79058510d0d34" + integrity sha512-4v7qzU7oLJfMI5EltUSHCaaOd65J6S4BqKRWgzMi4EYaE5fvNabPxmAPGdxpGXqrcWjhDGI/H09CIdEuUOUeXg== + +standard-http-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/standard-http-error/-/standard-http-error-2.0.1.tgz#f8ae9172e3cef9cb38d2e7084a1925f57a7c34bd" + integrity sha512-DX/xPIoyXQTuY6BMZK4Utyi4l3A4vFoafsfqrU6/dO4Oe/59c7PyqPd2IQj9m+ZieDg2K3RL9xOYJsabcD9IUA== + dependencies: + standard-error ">= 1.1.0 < 2" + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + static-eval@^2.0.5: version "2.1.0" resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz" @@ -23016,6 +23636,11 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-similarity-js@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/string-similarity-js/-/string-similarity-js-2.1.4.tgz#73716330691946f2ebc435859aba8327afd31307" + integrity sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA== + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -23419,6 +24044,11 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +symbol-observable@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" + integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz" @@ -23915,6 +24545,11 @@ try-to-catch@^3.0.0: resolved "https://registry.npmjs.org/try-to-catch/-/try-to-catch-3.0.0.tgz" integrity sha512-eIm6ZXwR35jVF8By/HdbbkcaCDTBI5PpCPkejRKrYp0jyf/DbCCcRhHD7/O9jtFI3ewsqo9WctFEiJTS6i+CQA== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -24490,6 +25125,11 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== +ua-parser-js@^1.0.37: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== + ufo@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" @@ -24563,6 +25203,11 @@ underscore@1.12.1, underscore@1.9.1, underscore@^1.12.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + undici@^5.14.0: version "5.28.4" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" @@ -24952,7 +25597,7 @@ uuid@^3.0.0, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^9.0.0: +uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -25066,6 +25711,18 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" @@ -25086,6 +25743,11 @@ web-streams-polyfill@^3.2.1: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== +web-worker@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + web3-bzz@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.3.tgz#13942b37757eb850f3500a8e08bf605448b67566" @@ -26511,6 +27173,11 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" +ws@^7, ws@^7.5.1: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^7.3.1: version "7.4.4" resolved "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz" @@ -26521,16 +27188,16 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== -ws@^7.5.1: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - ws@^8.12.0, ws@^8.13.0, ws@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.0.tgz#db080a279260c5f532fc668d461b8346efdfcf86" integrity sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw== +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" @@ -26580,11 +27247,24 @@ xmldoc@^1.1.2: dependencies: sax "^1.2.1" +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== + xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= +xstream@^11.14.0: + version "11.14.0" + resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" + integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== + dependencies: + globalthis "^1.0.1" + symbol-observable "^2.0.3" + xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" From 07121f28ae8f6c4fcc90b3c326a31486dc544245 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 2 Dec 2024 00:18:25 -0800 Subject: [PATCH 07/43] enriching-tests-in-pr --- packages/payment-processor/package.json | 2 +- .../payment/erc-20-private-payment-hinkal.ts | 67 +++++- .../erc-20-private-payment-hinkal.test.ts | 212 ++++++++++++++---- packages/usage-examples/package.json | 3 +- .../src/hinkal/createRequestForHinkal.ts | 78 ------- .../src/hinkal/hinkalRequestData.ts | 15 -- .../testPayErc20FeeProxyRequestHinkal.ts | 27 --- yarn.lock | 8 +- 8 files changed, 226 insertions(+), 186 deletions(-) delete mode 100644 packages/usage-examples/src/hinkal/createRequestForHinkal.ts delete mode 100644 packages/usage-examples/src/hinkal/hinkalRequestData.ts delete mode 100644 packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 2d81b1a50..7c14635ba 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.1.36", + "@hinkal/common": "0.1.51", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.19.0", "@requestnetwork/payment-detection": "0.45.1", diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts index 87ee23c6d..5185ed2c0 100644 --- a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -1,4 +1,4 @@ -import { Contract, Signer, BigNumberish, providers } from 'ethers'; +import { Contract, ContractTransaction, Signer, BigNumberish, providers, BigNumber } from 'ethers'; import { erc20FeeProxyArtifact } from '@requestnetwork/smart-contracts'; import { ERC20FeeProxy__factory, @@ -22,8 +22,54 @@ import { IPreparedPrivateTransaction } from './prepared-transaction'; import { emporiumOp, IHinkal, RelayerTransaction } from '@hinkal/common'; import { prepareEthersHinkal } from '@hinkal/common/providers/prepareEthersHinkal'; -// exposing state variable to be accessed: for intergration tests -export let hinkal: IHinkal; +/** + * This is a globally accessible state variable exported for use in other parts of the application or tests. + */ +export const hinkalStore: Record = {}; + +/** + * Adds an IHinkal instance to the Hinkal store for a given signer. + * + * This function checks if an IHinkal instance already exists for the provided signer’s address in the `hinkalStore`. + * If it does not exist, it initializes the instance using `prepareEthersHinkal` and stores it. The existing or newly + * created instance is then returned. + * + * @param signer - The signer for which the IHinkal instance should be added or retrieved. + */ +export async function addToHinkalStore(signer: Signer): Promise { + const address = await signer.getAddress(); + if (!hinkalStore[address]) { + hinkalStore[address] = await prepareEthersHinkal(signer); + } + return hinkalStore[address]; +} + +/** + * Deposits ERC20 tokens into a Hinkal shielded address. + * + * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param tokenAddress - The address of the ERC20 token being deposited. + * @param amount - The amount of tokens to deposit. + * @param recepientInfo - (Optional) The shielded address of the recipient. If provided, the tokens will be deposited into the recipient's shielded balance. If not provided, the deposit will increase the sender's shielded balance. + * + * @returns A promise that resolves to a `ContractTransaction` representing the deposit transaction. + */ +export async function sendToPrivateRecipientFromHinkal( + signerOrProvider: providers.Provider | Signer = getProvider(), + tokenAddress: string, + amount: BigNumberish, + recepientInfo?: string, +): Promise { + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); + + const amountToPay = BigNumber.from(amount).toBigInt(); + if (recepientInfo) { + return hinkalObject.depositForOther([tokenAddress], [amountToPay], recepientInfo); + } else { + return hinkalObject.deposit([tokenAddress], [amountToPay]); + } +} /** * Processes a transaction to pay an ERC20 Request privately with fees. @@ -36,22 +82,22 @@ export async function payPrivateErc20ProxyRequestFromHinkal( signerOrProvider: providers.Provider | Signer = getProvider(), amount?: BigNumberish, ): Promise { - if (!hinkal) hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); const { amountToPay, tokenAddress, ops } = preparePrivateErc20ProxyPaymentTransactionFromHinkal( request, amount, ); - return hinkal.actionPrivateWallet( + return hinkalObject.actionPrivateWallet( [tokenAddress], [-amountToPay], [false], ops, - undefined, - false, ) as Promise; } + /** * Processes a transaction to pay an ERC20 Request privately with fees. * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. @@ -64,18 +110,17 @@ export async function payPrivateErc20FeeProxyRequestFromHinkal( amount?: BigNumberish, feeAmount?: BigNumberish, ): Promise { - if (!hinkal) hinkal = await prepareEthersHinkal(getSigner(signerOrProvider)); + const signer = getSigner(signerOrProvider); + const hinkalObject = await addToHinkalStore(signer); const { amountToPay, tokenAddress, ops } = preparePrivateErc20FeeProxyPaymentTransactionFromHinkal(request, amount, feeAmount); - return hinkal.actionPrivateWallet( + return hinkalObject.actionPrivateWallet( [tokenAddress], [-amountToPay], [false], ops, - undefined, - false, ) as Promise; } diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 40d78a41f..3dd623b3c 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -1,29 +1,39 @@ -import { BigNumber, ethers, providers } from 'ethers'; +import { BigNumber, ethers, providers, Wallet } from 'ethers'; import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; import { CurrencyTypes } from '@requestnetwork/types'; import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; import { - hinkal, + addToHinkalStore, + hinkalStore, payPrivateErc20FeeProxyRequestFromHinkal, payPrivateErc20ProxyRequestFromHinkal, + sendToPrivateRecipientFromHinkal, } from '../../src/payment/erc-20-private-payment-hinkal'; import { getErc20Balance } from '../../src/payment/erc20'; // Constants to configure the tests -export const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC -export const currencyAmount = ethers.utils.parseUnits('0.00001', 6).toBigInt(); -export const currentNetwork: CurrencyTypes.ChainName = 'base'; -export const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; -export const currentGateway = 'https://sepolia.gateway.request.network'; -export const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address -export const fee = '0'; -// Payer's private key (for signing and sending transactions) +const currentNetwork: CurrencyTypes.ChainName = 'base'; +const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC +const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; +const currencyAmount = ethers.utils.parseUnits('0.00001', 6).toBigInt(); +const currentGateway = 'https://sepolia.gateway.request.network'; +const fee = '0'; + +// Payer's public/private EOA keys and shielded address +// The EOA address has a balance of 0, while the shielded address holds 1 USDC. const PAYER_PUBLIC_KEY = '0x44DC1e666C1ca6717849efE19eAC72AD83cFf5d2'; const PAYER_PRIVATE_KEY = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; -// Blockchain RPC endpoint for the Base network -const RPC_URL = 'https://mainnet.base.org'; -// Set Jest timeout for asynchronous operations (e.g., blockchain calls) -jest.setTimeout(1000000); +const PAYER_SHIELDED_ADDRESS = + '142590100039484718476239190022599206250779986428210948946438848754146776167,0x096d6d5d8b2292aa52e57123a58fc4d5f3d66171acd895f22ce1a5b16ac51b9e,0xc025ccc6ef46399da52763a866a3a10d2eade509af27eb8411c5d251eb8cd34d'; +// PAYEE - Public EOA - Recipient of the payment +const PAYEE = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address +// Sender (0x01aC930fAb20482E5b7eAbF892DF57141c29de5F) - Sends funds to a private address: you will need to top up sender +// Once the sender transfers funds to the recipient's private address, the recipient's shielded balance will be increased. +const senderMnemonic = 'sand win seed crucial film antique adapt start pupil gallery edge collect'; + +const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base networ + +jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) /** * Function to create a payment request for Hinkal. @@ -59,7 +69,7 @@ export const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: payee, + paymentAddress: PAYEE, }, }; } else if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT) { @@ -67,8 +77,8 @@ export const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: payee, - feeAddress: payee, + paymentAddress: PAYEE, + feeAddress: PAYEE, feeAmount: fee, }, }; @@ -84,7 +94,7 @@ export const createRequestForHinkal = async ( }, payee: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: payee, + value: PAYEE, }, payer: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, @@ -106,44 +116,150 @@ export const createRequestForHinkal = async ( return requestData; }; +// This function is required to wait for the indexing of shielded balance changes in Hinkal +const waitLittle = (time = 15): Promise => + new Promise((resolve) => { + setTimeout(() => { + resolve(1); + }, time * 1000); + }); + describe('ERC-20 Private Payments With Hinkal', () => { let provider: providers.Provider; - let payer: ethers.Wallet; + let payerWallet: ethers.Wallet; + let senderWallet: ethers.Wallet; + let senderAddress: string; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); - payer = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); + payerWallet = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); + senderWallet = Wallet.fromMnemonic(senderMnemonic).connect(provider); + senderAddress = await senderWallet.getAddress(); + await addToHinkalStore(payerWallet); }); afterAll(async () => { - hinkal.snapshotsClearInterval(); // Clear Hinkal's internal snapshots interval + // Clear Hinkal's snapshots interval: needed for jest to finish as a process + for (const key in hinkalStore) { + hinkalStore[key].snapshotsClearInterval(); + } jest.clearAllTimers(); // Clear any pending Jest timers }); - it('ERC-20 Proxy: Privacy of a Sender - Payer is not equal to Origin/Sender of Transaction', async () => { - const requestData = await createRequestForHinkal( - payer, - PAYER_PRIVATE_KEY, - Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, - ); - const balanceErc20Before = await getErc20Balance(requestData, payee, provider); - const tx = await payPrivateErc20ProxyRequestFromHinkal(requestData, payer); - const balanceErc20After = await getErc20Balance(requestData, payee, provider); - - expect(tx.status).toBe(1); - expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); - expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + + describe('Privacy of a Sender: From Private to Public Transactions', () => { + // Objectives of this test: + // 1. The sender's address should never appear on-chain. + // 2. The recipient should successfully receive the funds. + // 3. The transaction should complete successfully. + // Note: sender has $0 USDC on public EOA + + it('ERC-20 Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payerWallet, + PAYER_PRIVATE_KEY, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, + ); + const balanceErc20Before = await getErc20Balance(requestData, PAYEE, provider); + + const tx = await payPrivateErc20ProxyRequestFromHinkal(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, PAYEE, provider); + + await waitLittle(7); // wait before balance is increased + + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + + }); + it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + const requestData = await createRequestForHinkal( + payerWallet, + PAYER_PRIVATE_KEY, + Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, + ); + + const balanceErc20Before = await getErc20Balance(requestData, PAYEE, provider); + const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, PAYEE, provider); + + await waitLittle(7); // wait before balance is increased + expect(tx.status).toBe(1); + expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + }); }); - it('ERC-20 Fee Proxy: Privacy of a Sender - Payer is not equal to Origin/Sender of Transaction', async () => { - const requestData = await createRequestForHinkal( - payer, - PAYER_PRIVATE_KEY, - Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, - ); - - const balanceErc20Before = await getErc20Balance(requestData, payee, provider); - const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payer); - const balanceErc20After = await getErc20Balance(requestData, payee, provider); - - expect(tx.status).toBe(1); - expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); - expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); + describe('Privacy of a Recipient: From Public to Private Transactions', () => { + afterAll(async () => { + for (let key in hinkalStore) { + hinkalStore[key].snapshotsClearInterval(); + console.log('cleaning snapshot', { key }); + } + }); + + it('Sender sends from EOA to the shielded address of the recipient', async () => { + // Objectives of this test: + // 1. The recipient's address should never appear on-chain. + // 2. The recipient should successfully receive the funds. + // 3. The transaction should complete successfully. + const preBalances = await hinkalStore[PAYER_PUBLIC_KEY].getBalances(); + const preUsdcBalance = preBalances.find( + (balance) => balance.token.erc20TokenAddress === currencyAddress, + )?.balance; + const tx = await sendToPrivateRecipientFromHinkal( + senderWallet, + currencyAddress, + currencyAmount, + PAYER_SHIELDED_ADDRESS, + ); + + const waitedTx = await tx.wait(2); + await waitLittle(7); // wait before balance is increased + + const postBalances = await hinkalStore[PAYER_PUBLIC_KEY].getBalances(); + const postUsdcBalance = postBalances.find( + (balance) => balance.token.erc20TokenAddress === currencyAddress, + )?.balance; + + expect(waitedTx.status).toBe(1); + expect(PAYER_SHIELDED_ADDRESS).not.toBe(PAYER_PUBLIC_KEY); // trivial check (satisfies 2nd condition) + if (postUsdcBalance === undefined || preUsdcBalance === undefined) { + throw Error('no balance calculation'); + } + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The recipient received funds in their shielded account. + }); + }); + + describe('Shielding: Depositing funds from EOA to own shielded address', () => { + beforeAll(async () => { + await addToHinkalStore(senderWallet); + }); + it('Sender send from EOA to its own shielded address', async () => { + // For illustration, we show how a user can deposit to their own shielded address. + // The user needs to do this to be able to send funds from their shielded address. + + const preBalances = await hinkalStore[senderAddress].getBalances(); + const preUsdcBalance = preBalances.find( + (balance) => balance.token.erc20TokenAddress === currencyAddress, + )?.balance; + + const tx = await sendToPrivateRecipientFromHinkal( + senderWallet, + currencyAddress, + currencyAmount, + ); + const waitedTx = await tx.wait(2); + + await waitLittle(10); // wait before balance is increased + + + const postBalances = await hinkalStore[senderAddress].getBalances(); + const postUsdcBalance = postBalances.find( + (balance) => balance.token.erc20TokenAddress === currencyAddress, + )?.balance; + + expect(waitedTx.status).toBe(1); + if (postUsdcBalance === undefined || preUsdcBalance === undefined) { + throw Error('no balance calculation'); + } + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The recipient received funds in their shielded account. + }); }); }); diff --git a/packages/usage-examples/package.json b/packages/usage-examples/package.json index fed9ee049..78f53a04e 100644 --- a/packages/usage-examples/package.json +++ b/packages/usage-examples/package.json @@ -25,8 +25,7 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "start": "ts-node src/request-client-js-declarative-request.ts && ts-node src/request-client-js-erc20-request.ts && ts-node src/request-logic-clear-request.ts && ts-node src/request-logic-encrypted-request.ts && ts-node src/request-client-js-add-stakeholders.ts", - "prepare": "yarn run build", - "start:hinkal": "ts-node src/hinkal/testPayErc20FeeProxyRequestHinkal.ts" + "prepare": "yarn run build" }, "dependencies": { "@requestnetwork/data-access": "0.36.1", diff --git a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts b/packages/usage-examples/src/hinkal/createRequestForHinkal.ts deleted file mode 100644 index f7a8f9830..000000000 --- a/packages/usage-examples/src/hinkal/createRequestForHinkal.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ethers } from 'ethers'; -import { RequestNetwork, Types, Utils } from '@requestnetwork/request-client.js'; -import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signature'; -import { - contentData, - currencyAddress, - currencyAmount, - currentCurrenyType, - currentGateway, - currentNetwork, - fee, - payee, -} from './hinkalRequestData'; - -/** - * Creates a payment request with the parameters specified in './hinkalRequestData.ts' - * used by testPayErc20FeeProxyRequestHinkal.ts - * @param payerWallet the wallet used by the payer - * @param privateKey the private key of the user creating the request - * @returns Newly created request - */ -export const createRequestForHinkal = async ( - payerWallet: ethers.Wallet, - privateKey: string, -): Promise => { - // step 1: Create Signature Provider - const epkSignatureProvider = new EthereumPrivateKeySignatureProvider({ - method: Types.Signature.METHOD.ECDSA, - privateKey: privateKey, - }); - // step 2: create Request Network - const requestClient = new RequestNetwork({ - nodeConnectionConfig: { - baseURL: currentGateway, - }, - signatureProvider: epkSignatureProvider, - }); - - // step 3: Create Request Object - const requestCreateParameters: Types.ICreateRequestParameters = { - requestInfo: { - currency: { - type: currentCurrenyType, - value: currencyAddress, - network: currentNetwork, - }, - payee: { - type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: payee, - }, - payer: { - type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: payerWallet.address, - }, - expectedAmount: currencyAmount.toString(), - timestamp: Utils.getCurrentTimestampInSecond(), - }, - signer: { - type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: payerWallet.address, - }, - paymentNetwork: { - id: Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, - parameters: { - paymentNetworkName: currentNetwork, - paymentAddress: payee, - feeAddress: payee, - feeAmount: fee, - }, - }, - contentData, - }; - - // Step 4: create & send request - const request = await requestClient.createRequest(requestCreateParameters); - const requestData = await request.waitForConfirmation(); - return requestData; -}; diff --git a/packages/usage-examples/src/hinkal/hinkalRequestData.ts b/packages/usage-examples/src/hinkal/hinkalRequestData.ts deleted file mode 100644 index 843e0e5b4..000000000 --- a/packages/usage-examples/src/hinkal/hinkalRequestData.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ethers } from 'ethers'; -import { Types } from '@requestnetwork/request-client.js'; -import { CurrencyTypes } from '@requestnetwork/types'; - -export const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC -export const currencyAmount = ethers.utils.parseUnits('0.0001', 6).toBigInt(); -export const currentNetwork: CurrencyTypes.ChainName = 'base'; -export const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; -export const currentGateway = 'https://sepolia.gateway.request.network'; -export const payee = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address -export const fee = '0'; -export const contentData = { - reason: 'Hinkal Test', - dueDate: '2025.06.16', -}; diff --git a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts b/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts deleted file mode 100644 index 20ff5f48c..000000000 --- a/packages/usage-examples/src/hinkal/testPayErc20FeeProxyRequestHinkal.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ethers } from 'ethers'; -import { payPrivateErc20FeeProxyRequestFromHinkal } from '@requestnetwork/payment-processor'; -import { createRequestForHinkal } from './createRequestForHinkal'; - -// Usage Example of Private Transactions using Hinkal on Optimism -// run --> yarn start:hinkal -// IMPORTANT: Ensure your account has sufficient USDC balance before running -// NOTE: Ensure sufficient ETH for gas fees on Optimism network yarn start:hinkal - -void (async () => { - const PAYER_PRIVATE_KEY = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; - const RPC_URL = 'https://mainnet.base.org'; - - // Create Provider and Signer - const provider = new ethers.providers.JsonRpcProvider(RPC_URL); - const payerWallet = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); - - // Create Request and submit private transfer - const requestData = await createRequestForHinkal(payerWallet, PAYER_PRIVATE_KEY); - console.log('Request data created successfully'); - const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payerWallet); - console.log('Private transaction submitted:', { - requestId: requestData.requestId, - relayerTx: tx, - }); - process.exit(0); -})(); diff --git a/yarn.lock b/yarn.lock index 6b0314d43..2d4708f3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3177,10 +3177,10 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hinkal/common@0.1.36": - version "0.1.36" - resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.36.tgz#7f39e2d9ba37a5a65ec923f27ed2f6c936346dce" - integrity sha512-lUrnOHEOZ8lEKUGMuMJxEVT++3nct8RH85Zq1ft2Hzal4QItYV+3P0viPNe6WjBNRiJagxxGNsTCZnxpHVc+Nw== +"@hinkal/common@0.1.51": + version "0.1.51" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.51.tgz#d50f2f0261a8fc3b0b6d1b71703431ff1cb725f2" + integrity sha512-kyAJfy5Kaoy33ImtJWdNdLL56q+/TmlX5YpwoC96BcL9nDqdVBg8UxRWA2NKjfvvpVF2UvPC21t8BoC1DPbx+g== dependencies: "@axelar-network/axelarjs-sdk" "0.16.0" async-mutex "^0.4.0" From 0949cfde25289f9a48a24d52b7769b7e8c1209ea Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 2 Dec 2024 00:37:38 -0800 Subject: [PATCH 08/43] lint-error --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 3dd623b3c..f5066b0ee 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -167,7 +167,6 @@ describe('ERC-20 Private Payments With Hinkal', () => { expect(tx.status).toBe(1); expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); - }); it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( @@ -249,7 +248,6 @@ describe('ERC-20 Private Payments With Hinkal', () => { await waitLittle(10); // wait before balance is increased - const postBalances = await hinkalStore[senderAddress].getBalances(); const postUsdcBalance = postBalances.find( (balance) => balance.token.erc20TokenAddress === currencyAddress, From c4fa70f28ab57e85791d1b98cfda1e3ea35f186a Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 2 Dec 2024 11:10:34 -0800 Subject: [PATCH 09/43] yarn.lock-update-2 --- packages/payment-processor/package.json | 2 +- yarn.lock | 78 +++++-------------------- 2 files changed, 17 insertions(+), 63 deletions(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 7c14635ba..87ac79520 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.1.51", + "@hinkal/common": "0.1.52", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.19.0", "@requestnetwork/payment-detection": "0.45.1", diff --git a/yarn.lock b/yarn.lock index ae8958482..bdf7d8b88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -963,16 +963,6 @@ "@noble/hashes" "^1.0.0" protobufjs "^6.8.8" -"@cosmjs/amino@0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.30.1.tgz#7c18c14627361ba6c88e3495700ceea1f76baace" - integrity sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w== - dependencies: - "@cosmjs/crypto" "^0.30.1" - "@cosmjs/encoding" "^0.30.1" - "@cosmjs/math" "^0.30.1" - "@cosmjs/utils" "^0.30.1" - "@cosmjs/amino@^0.31.0-alpha.1", "@cosmjs/amino@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.3.tgz#0f4aa6bd68331c71bd51b187fa64f00eb075db0a" @@ -983,19 +973,6 @@ "@cosmjs/math" "^0.31.3" "@cosmjs/utils" "^0.31.3" -"@cosmjs/crypto@0.30.1", "@cosmjs/crypto@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" - integrity sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ== - dependencies: - "@cosmjs/encoding" "^0.30.1" - "@cosmjs/math" "^0.30.1" - "@cosmjs/utils" "^0.30.1" - "@noble/hashes" "^1" - bn.js "^5.2.0" - elliptic "^6.5.4" - libsodium-wrappers "^0.7.6" - "@cosmjs/crypto@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.3.tgz#c752cb6d682fdc735dcb45a2519f89c56ba16c26" @@ -1009,15 +986,6 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" -"@cosmjs/encoding@0.30.1", "@cosmjs/encoding@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" - integrity sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ== - dependencies: - base64-js "^1.3.0" - bech32 "^1.1.4" - readonly-date "^1.0.0" - "@cosmjs/encoding@^0.31.0-alpha.1", "@cosmjs/encoding@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" @@ -1043,13 +1011,6 @@ "@cosmjs/stream" "^0.31.3" xstream "^11.14.0" -"@cosmjs/math@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" - integrity sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q== - dependencies: - bn.js "^5.2.0" - "@cosmjs/math@^0.31.0-alpha.1", "@cosmjs/math@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.3.tgz#767f7263d12ba1b9ed2f01f68d857597839fd957" @@ -1128,11 +1089,6 @@ readonly-date "^1.0.0" xstream "^11.14.0" -"@cosmjs/utils@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" - integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== - "@cosmjs/utils@^0.31.0-alpha.1", "@cosmjs/utils@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" @@ -3177,10 +3133,10 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hinkal/common@0.1.51": - version "0.1.51" - resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.51.tgz#d50f2f0261a8fc3b0b6d1b71703431ff1cb725f2" - integrity sha512-kyAJfy5Kaoy33ImtJWdNdLL56q+/TmlX5YpwoC96BcL9nDqdVBg8UxRWA2NKjfvvpVF2UvPC21t8BoC1DPbx+g== +"@hinkal/common@0.1.52": + version "0.1.52" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.52.tgz#1035a43e91c48939c82666aa9083cd5940b1e546" + integrity sha512-0xIj3/ZcpVKwxM2XFrSxiWnBqaXogSDblYRzCh5ZAu+Q57HdgykcFF94LLDn3dnGuKVs4SCtGD6uNQdB1xTwKQ== dependencies: "@axelar-network/axelarjs-sdk" "0.16.0" async-mutex "^0.4.0" @@ -4358,16 +4314,16 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@^1", "@noble/hashes@^1.0.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@noble/hashes@^1.1.2": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== -"@noble/hashes@^1.0.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== - "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" @@ -8532,7 +8488,7 @@ bcryptjs@^2.3.0: resolved "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= -bech32@1.1.4, bech32@^1.1.3: +bech32@1.1.4, bech32@^1.1.3, bech32@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== @@ -17521,7 +17477,7 @@ libsodium-wrappers-sumo@^0.7.11: dependencies: libsodium-sumo "^0.7.15" -libsodium-wrappers@^0.7.10, libsodium-wrappers@^0.7.6: +libsodium-wrappers@^0.7.10: version "0.7.15" resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz#53f13e483820272a3d55b23be2e34402ac988055" integrity sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ== @@ -17533,13 +17489,6 @@ libsodium@^0.7.15: resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.15.tgz#ac284e3dcb1c29ae9526c5581cdada6a072f6d20" integrity sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw== -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - linebreak@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/linebreak/-/linebreak-1.0.2.tgz" @@ -21473,6 +21422,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readonly-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" + integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== + real-require@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" From 8e518731028f18b8aa30b0036173b2374b11e5c8 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 2 Dec 2024 11:42:28 -0800 Subject: [PATCH 10/43] skipping-tests-to-accelerate --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index f5066b0ee..14fe38875 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -162,13 +162,13 @@ describe('ERC-20 Private Payments With Hinkal', () => { const tx = await payPrivateErc20ProxyRequestFromHinkal(requestData, payerWallet); const balanceErc20After = await getErc20Balance(requestData, PAYEE, provider); - await waitLittle(7); // wait before balance is increased + await waitLittle(5); // wait before balance is increased expect(tx.status).toBe(1); expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); - it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + it.skip('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, PAYER_PRIVATE_KEY, @@ -185,7 +185,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); }); - describe('Privacy of a Recipient: From Public to Private Transactions', () => { + describe.skip('Privacy of a Recipient: From Public to Private Transactions', () => { afterAll(async () => { for (let key in hinkalStore) { hinkalStore[key].snapshotsClearInterval(); @@ -226,7 +226,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { }); }); - describe('Shielding: Depositing funds from EOA to own shielded address', () => { + describe.skip('Shielding: Depositing funds from EOA to own shielded address', () => { beforeAll(async () => { await addToHinkalStore(senderWallet); }); From b58ece8cd5a74ded67ffe8f02891fc27caffb7d1 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Thu, 5 Dec 2024 20:24:06 -0800 Subject: [PATCH 11/43] refactor-hinkal-tests-and-change-naming --- packages/payment-processor/package.json | 2 +- .../payment/erc-20-private-payment-hinkal.ts | 46 +- .../erc-20-private-payment-hinkal.test.ts | 180 +++--- yarn.lock | 527 +----------------- 4 files changed, 136 insertions(+), 619 deletions(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 87ac79520..70a11d5fb 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.1.52", + "@hinkal/common": "0.2.2", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.19.0", "@requestnetwork/payment-detection": "0.45.1", diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts index 5185ed2c0..4e84888ca 100644 --- a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -45,39 +45,39 @@ export async function addToHinkalStore(signer: Signer): Promise { } /** - * Deposits ERC20 tokens into a Hinkal shielded address. + * Sends ERC20 tokens into a Hinkal shielded address. * - * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. - * @param tokenAddress - The address of the ERC20 token being deposited. - * @param amount - The amount of tokens to deposit. - * @param recepientInfo - (Optional) The shielded address of the recipient. If provided, the tokens will be deposited into the recipient's shielded balance. If not provided, the deposit will increase the sender's shielded balance. + * @param signerOrProvider the Web3 provider, or signer. + * @param tokenAddress - The address of the ERC20 token being sent. + * @param amount - The amount of tokens to send. + * @param recipientInfo - (Optional) The shielded address of the recipient. If provided, the tokens will be deposited into the recipient's shielded balance. If not provided, the deposit will increase the sender's shielded balance. * - * @returns A promise that resolves to a `ContractTransaction` representing the deposit transaction. + * @returns A promise that resolves to a `ContractTransaction`. */ -export async function sendToPrivateRecipientFromHinkal( +export async function sendToHinkalShieldedAddressFromPublic( signerOrProvider: providers.Provider | Signer = getProvider(), tokenAddress: string, amount: BigNumberish, - recepientInfo?: string, + recipientInfo?: string, ): Promise { const signer = getSigner(signerOrProvider); const hinkalObject = await addToHinkalStore(signer); const amountToPay = BigNumber.from(amount).toBigInt(); - if (recepientInfo) { - return hinkalObject.depositForOther([tokenAddress], [amountToPay], recepientInfo); + if (recipientInfo) { + return hinkalObject.depositForOther([tokenAddress], [amountToPay], recipientInfo); } else { return hinkalObject.deposit([tokenAddress], [amountToPay]); } } /** - * Processes a transaction to pay an ERC20 Request privately with fees. + * Processes a transaction to pay privately a request through the ERC20 fee proxy contract. + * @param request request to pay. * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. - * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. */ -export async function payPrivateErc20ProxyRequestFromHinkal( +export async function payErc20ProxyRequestFromHinkalShieldedAddress( request: ClientTypes.IRequestData, signerOrProvider: providers.Provider | Signer = getProvider(), amount?: BigNumberish, @@ -85,7 +85,7 @@ export async function payPrivateErc20ProxyRequestFromHinkal( const signer = getSigner(signerOrProvider); const hinkalObject = await addToHinkalStore(signer); - const { amountToPay, tokenAddress, ops } = preparePrivateErc20ProxyPaymentTransactionFromHinkal( + const { amountToPay, tokenAddress, ops } = prepareErc20ProxyPaymentFromHinkalShieldedAddress( request, amount, ); @@ -99,12 +99,13 @@ export async function payPrivateErc20ProxyRequestFromHinkal( } /** - * Processes a transaction to pay an ERC20 Request privately with fees. + * Processes a transaction to pay privately a request through the ERC20 fee proxy. + * @param request request to pay. * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. - * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount. + * @param feeAmount optionally, the fee amount to pay. Defaults to the fee amount of the request. */ -export async function payPrivateErc20FeeProxyRequestFromHinkal( +export async function payErc20FeeProxyRequestFromHinkalShieldedAddress( request: ClientTypes.IRequestData, signerOrProvider: providers.Provider | Signer = getProvider(), amount?: BigNumberish, @@ -113,8 +114,11 @@ export async function payPrivateErc20FeeProxyRequestFromHinkal( const signer = getSigner(signerOrProvider); const hinkalObject = await addToHinkalStore(signer); - const { amountToPay, tokenAddress, ops } = - preparePrivateErc20FeeProxyPaymentTransactionFromHinkal(request, amount, feeAmount); + const { amountToPay, tokenAddress, ops } = prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( + request, + amount, + feeAmount, + ); return hinkalObject.actionPrivateWallet( [tokenAddress], @@ -129,7 +133,7 @@ export async function payPrivateErc20FeeProxyRequestFromHinkal( * @param request request to pay * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. */ -export function preparePrivateErc20ProxyPaymentTransactionFromHinkal( +export function prepareErc20ProxyPaymentFromHinkalShieldedAddress( request: ClientTypes.IRequestData, amount?: BigNumberish, ): IPreparedPrivateTransaction { @@ -170,7 +174,7 @@ export function preparePrivateErc20ProxyPaymentTransactionFromHinkal( * @param amount optionally, the amount to pay. Defaults to remaining amount of the request. * @param feeAmountOverride optionally, the fee amount to pay. Defaults to the fee amount of the request. */ -export function preparePrivateErc20FeeProxyPaymentTransactionFromHinkal( +export function prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( request: ClientTypes.IRequestData, amount?: BigNumberish, feeAmountOverride?: BigNumberish, diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 14fe38875..47a033f4d 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -5,9 +5,9 @@ import { EthereumPrivateKeySignatureProvider } from '@requestnetwork/epk-signatu import { addToHinkalStore, hinkalStore, - payPrivateErc20FeeProxyRequestFromHinkal, - payPrivateErc20ProxyRequestFromHinkal, - sendToPrivateRecipientFromHinkal, + payErc20FeeProxyRequestFromHinkalShieldedAddress, + payErc20ProxyRequestFromHinkalShieldedAddress, + sendToHinkalShieldedAddressFromPublic, } from '../../src/payment/erc-20-private-payment-hinkal'; import { getErc20Balance } from '../../src/payment/erc20'; @@ -15,23 +15,27 @@ import { getErc20Balance } from '../../src/payment/erc20'; const currentNetwork: CurrencyTypes.ChainName = 'base'; const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; -const currencyAmount = ethers.utils.parseUnits('0.00001', 6).toBigInt(); +const currencyAmount = ethers.utils.parseUnits('0.000001', 6).toBigInt(); const currentGateway = 'https://sepolia.gateway.request.network'; const fee = '0'; -// Payer's public/private EOA keys and shielded address -// The EOA address has a balance of 0, while the shielded address holds 1 USDC. -const PAYER_PUBLIC_KEY = '0x44DC1e666C1ca6717849efE19eAC72AD83cFf5d2'; -const PAYER_PRIVATE_KEY = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; -const PAYER_SHIELDED_ADDRESS = +// Payer: +// 1) sends funds from his shielded address to EOA of the payee +// 2) sends funds from his EOA to the shielded address of the payee +// 3) sends funds from hiw EOA to his own shielded address +// Note: to successfully run the tests, you will need to top up payer's EOA address with Eth on base +const payerMnemonic = 'sand win seed crucial film antique adapt start pupil gallery edge collect'; +const payerAddress = '0x01aC930fAb20482E5b7eAbF892DF57141c29de5F'; +// Payee: +// 1) receives funds on her public EOA address +// 2) receives funds on her shielded address +// The private key of a public address grant ownership of the corresponding shielded address. In @hinkal/common, a single public address can have only one shielded address. +const payeeAddress = '0x44DC1e666C1ca6717849efE19eAC72AD83cFf5d2'; +const payeePrivateKey = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; +const payeeShieldedAddress = '142590100039484718476239190022599206250779986428210948946438848754146776167,0x096d6d5d8b2292aa52e57123a58fc4d5f3d66171acd895f22ce1a5b16ac51b9e,0xc025ccc6ef46399da52763a866a3a10d2eade509af27eb8411c5d251eb8cd34d'; -// PAYEE - Public EOA - Recipient of the payment -const PAYEE = '0xA4faFa5523F63EE58aE7b56ad8EB5a344A19F266'; // some random address -// Sender (0x01aC930fAb20482E5b7eAbF892DF57141c29de5F) - Sends funds to a private address: you will need to top up sender -// Once the sender transfers funds to the recipient's private address, the recipient's shielded balance will be increased. -const senderMnemonic = 'sand win seed crucial film antique adapt start pupil gallery edge collect'; -const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base networ +const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) @@ -43,15 +47,14 @@ jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., * @param type The payment network type (e.g., ERC20_PROXY_CONTRACT). * @returns A Promise that resolves to the request data with events. */ -export const createRequestForHinkal = async ( +const createRequestForHinkal = async ( payerWallet: ethers.Wallet, - privateKey: string, type: Types.Extension.PAYMENT_NETWORK_ID, ): Promise => { // step 1: Create Signature Provider const epkSignatureProvider = new EthereumPrivateKeySignatureProvider({ method: Types.Signature.METHOD.ECDSA, - privateKey: privateKey, + privateKey: payerWallet.privateKey, }); // step 2: create Request Network const requestClient = new RequestNetwork({ @@ -69,7 +72,7 @@ export const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: PAYEE, + paymentAddress: payeeAddress, }, }; } else if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT) { @@ -77,8 +80,8 @@ export const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: PAYEE, - feeAddress: PAYEE, + paymentAddress: payeeAddress, + feeAddress: payeeAddress, feeAmount: fee, }, }; @@ -94,7 +97,7 @@ export const createRequestForHinkal = async ( }, payee: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: PAYEE, + value: payeeAddress, }, payer: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, @@ -124,140 +127,129 @@ const waitLittle = (time = 15): Promise => }, time * 1000); }); +// Helper function: allows to get a shielded balance of a specific token +const getTokenShieldedBalance = async ( + address: string, + tokenAddress = currencyAddress, +): Promise => { + const balances = await hinkalStore[address].getBalances(); + const tokenBalance = balances.find((balance) => balance.token.erc20TokenAddress === tokenAddress) + ?.balance; + + if (tokenBalance === undefined) { + throw Error('Shiedled Balance calculated incorrectly'); + } + return tokenBalance; +}; + describe('ERC-20 Private Payments With Hinkal', () => { let provider: providers.Provider; let payerWallet: ethers.Wallet; - let senderWallet: ethers.Wallet; - let senderAddress: string; + let payeeWallet: ethers.Wallet; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); - payerWallet = new ethers.Wallet(PAYER_PRIVATE_KEY, provider); - senderWallet = Wallet.fromMnemonic(senderMnemonic).connect(provider); - senderAddress = await senderWallet.getAddress(); + payerWallet = Wallet.fromMnemonic(payerMnemonic).connect(provider); + payeeWallet = new Wallet(payeePrivateKey, provider); await addToHinkalStore(payerWallet); }); afterAll(async () => { - // Clear Hinkal's snapshots interval: needed for jest to finish as a process for (const key in hinkalStore) { - hinkalStore[key].snapshotsClearInterval(); + hinkalStore[key].snapshotsClearInterval(); // Clear Hinkal's snapshots interval: needed for jest to finish as a process } jest.clearAllTimers(); // Clear any pending Jest timers }); describe('Privacy of a Sender: From Private to Public Transactions', () => { // Objectives of this test: - // 1. The sender's address should never appear on-chain. - // 2. The recipient should successfully receive the funds. + // 1. The payer's address should never appear on-chain. + // 2. The payee should successfully receive the funds. // 3. The transaction should complete successfully. - // Note: sender has $0 USDC on public EOA it('ERC-20 Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, - PAYER_PRIVATE_KEY, Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, ); - const balanceErc20Before = await getErc20Balance(requestData, PAYEE, provider); + const balanceErc20Before = await getErc20Balance(requestData, payeeAddress, provider); - const tx = await payPrivateErc20ProxyRequestFromHinkal(requestData, payerWallet); - const balanceErc20After = await getErc20Balance(requestData, PAYEE, provider); + const tx = await payErc20ProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); await waitLittle(5); // wait before balance is increased expect(tx.status).toBe(1); - expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); - it.skip('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { + it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, - PAYER_PRIVATE_KEY, Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, ); - const balanceErc20Before = await getErc20Balance(requestData, PAYEE, provider); - const tx = await payPrivateErc20FeeProxyRequestFromHinkal(requestData, payerWallet); - const balanceErc20After = await getErc20Balance(requestData, PAYEE, provider); + const balanceErc20Before = await getErc20Balance(requestData, payeeAddress, provider); + const tx = await payErc20FeeProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); + const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); + + await waitLittle(5); // wait before balance is increased - await waitLittle(7); // wait before balance is increased expect(tx.status).toBe(1); - expect(tx.from).not.toBe(PAYER_PUBLIC_KEY); + expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); }); - describe.skip('Privacy of a Recipient: From Public to Private Transactions', () => { - afterAll(async () => { - for (let key in hinkalStore) { - hinkalStore[key].snapshotsClearInterval(); - console.log('cleaning snapshot', { key }); - } - }); - it('Sender sends from EOA to the shielded address of the recipient', async () => { - // Objectives of this test: - // 1. The recipient's address should never appear on-chain. - // 2. The recipient should successfully receive the funds. - // 3. The transaction should complete successfully. - const preBalances = await hinkalStore[PAYER_PUBLIC_KEY].getBalances(); - const preUsdcBalance = preBalances.find( - (balance) => balance.token.erc20TokenAddress === currencyAddress, - )?.balance; - const tx = await sendToPrivateRecipientFromHinkal( - senderWallet, + describe('Shielding: Depositing funds from EOA to own shielded address', () => { + it('Payer sends from EOA to its own shielded address', async () => { + // For illustration: we show how payer can send funds to his own shielded address. + // The payer needs to do this to be able to send funds from his shielded address. + + const preUsdcBalance = await getTokenShieldedBalance(payerAddress); + + const tx = await sendToHinkalShieldedAddressFromPublic( + payerWallet, currencyAddress, currencyAmount, - PAYER_SHIELDED_ADDRESS, ); - const waitedTx = await tx.wait(2); + await waitLittle(7); // wait before balance is increased - const postBalances = await hinkalStore[PAYER_PUBLIC_KEY].getBalances(); - const postUsdcBalance = postBalances.find( - (balance) => balance.token.erc20TokenAddress === currencyAddress, - )?.balance; + const postUsdcBalance = await getTokenShieldedBalance(payerAddress); expect(waitedTx.status).toBe(1); - expect(PAYER_SHIELDED_ADDRESS).not.toBe(PAYER_PUBLIC_KEY); // trivial check (satisfies 2nd condition) - if (postUsdcBalance === undefined || preUsdcBalance === undefined) { - throw Error('no balance calculation'); - } - expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The recipient received funds in their shielded account. + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payer received funds in his shielded address. }); }); - describe.skip('Shielding: Depositing funds from EOA to own shielded address', () => { + describe('Privacy of a Recipient: From Public to Private Transactions', () => { beforeAll(async () => { - await addToHinkalStore(senderWallet); + await addToHinkalStore(payeeWallet); }); - it('Sender send from EOA to its own shielded address', async () => { - // For illustration, we show how a user can deposit to their own shielded address. - // The user needs to do this to be able to send funds from their shielded address. - const preBalances = await hinkalStore[senderAddress].getBalances(); - const preUsdcBalance = preBalances.find( - (balance) => balance.token.erc20TokenAddress === currencyAddress, - )?.balance; + it('Payer sends from EOA to the shielded address of the payee', async () => { + // Objectives of this test: + // 1. The payee's address should never appear on-chain. + // 2. The payee should successfully receive the funds. + // 3. The transaction should complete successfully. + + const preUsdcBalance = await getTokenShieldedBalance(payeeAddress); - const tx = await sendToPrivateRecipientFromHinkal( - senderWallet, + const tx = await sendToHinkalShieldedAddressFromPublic( + payerWallet, currencyAddress, currencyAmount, + payeeShieldedAddress, ); - const waitedTx = await tx.wait(2); - await waitLittle(10); // wait before balance is increased + const waitedTx = await tx.wait(2); + await waitLittle(1); // wait before balance is increased - const postBalances = await hinkalStore[senderAddress].getBalances(); - const postUsdcBalance = postBalances.find( - (balance) => balance.token.erc20TokenAddress === currencyAddress, - )?.balance; + const postUsdcBalance = await getTokenShieldedBalance(payeeAddress); expect(waitedTx.status).toBe(1); - if (postUsdcBalance === undefined || preUsdcBalance === undefined) { - throw Error('no balance calculation'); - } - expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The recipient received funds in their shielded account. + expect(payeeShieldedAddress).not.toBe(payeeAddress); // trivial check (satisfies 2nd condition) + expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payee received funds in their shielded account. }); }); }); diff --git a/yarn.lock b/yarn.lock index bdf7d8b88..e6f25b004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,49 +45,6 @@ dependencies: node-fetch "^2.6.1" -"@axelar-network/axelar-cgp-solidity@^6.3.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-cgp-solidity/-/axelar-cgp-solidity-6.4.0.tgz#75619d775a46f9dfae9fc90be78db1bd0ae77c46" - integrity sha512-Xnw5xi234B1cmTCzgudV8zq+DDjJ1d1U362CM0vKH1FWmZprKIdqgmOYkiRyu+QiVhnznKiBURiSEHVrNjtYpw== - dependencies: - "@axelar-network/axelar-gmp-sdk-solidity" "5.10.0" - -"@axelar-network/axelar-gmp-sdk-solidity@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelar-gmp-sdk-solidity/-/axelar-gmp-sdk-solidity-5.10.0.tgz#9679b0634e4db6eb345aac800df6dd3a38d2e242" - integrity sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw== - -"@axelar-network/axelarjs-sdk@0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-sdk/-/axelarjs-sdk-0.16.0.tgz#e076482c1b82f8f79dd8aaf5dd41c818aed26acb" - integrity sha512-CSj5JZKFLdHYIPziU3O7FVI9oDYhCwiF5ysMQ7B82gt+KW/Ex2NMPx4Do+eEJi6dvcsHkUnsZFyY+YRXpQJoBw== - dependencies: - "@axelar-network/axelar-cgp-solidity" "^6.3.0" - "@axelar-network/axelarjs-types" "^0.33.0" - "@cosmjs/json-rpc" "^0.30.1" - "@cosmjs/stargate" "0.31.0-alpha.1" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/networks" "^5.7.1" - "@ethersproject/providers" "^5.7.2" - "@types/uuid" "^8.3.1" - bech32 "^2.0.0" - clone-deep "^4.0.1" - cross-fetch "^3.1.5" - ethers "^5.7.2" - socket.io-client "^4.6.1" - standard-http-error "^2.0.1" - string-similarity-js "^2.1.4" - uuid "^8.3.2" - ws "^8.13.0" - -"@axelar-network/axelarjs-types@^0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@axelar-network/axelarjs-types/-/axelarjs-types-0.33.0.tgz#070ffbaec6be57259b64a41ee14f98804907732e" - integrity sha512-aCbX/5G+tgWPjr9tl3dQfJftWwRMkILz61ytach7dKqxtO9G9jlxpNvELJQ6gKVOodUtSY8qBCO/fWU19v4hdQ== - dependencies: - long "^5.2.0" - protobufjs "^7.0.0" - "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" @@ -955,145 +912,6 @@ dot "^1.1.3" fs-extra "^9.0.1" -"@confio/ics23@^0.6.8": - version "0.6.8" - resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" - integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w== - dependencies: - "@noble/hashes" "^1.0.0" - protobufjs "^6.8.8" - -"@cosmjs/amino@^0.31.0-alpha.1", "@cosmjs/amino@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.3.tgz#0f4aa6bd68331c71bd51b187fa64f00eb075db0a" - integrity sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw== - dependencies: - "@cosmjs/crypto" "^0.31.3" - "@cosmjs/encoding" "^0.31.3" - "@cosmjs/math" "^0.31.3" - "@cosmjs/utils" "^0.31.3" - -"@cosmjs/crypto@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.3.tgz#c752cb6d682fdc735dcb45a2519f89c56ba16c26" - integrity sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ== - dependencies: - "@cosmjs/encoding" "^0.31.3" - "@cosmjs/math" "^0.31.3" - "@cosmjs/utils" "^0.31.3" - "@noble/hashes" "^1" - bn.js "^5.2.0" - elliptic "^6.5.4" - libsodium-wrappers-sumo "^0.7.11" - -"@cosmjs/encoding@^0.31.0-alpha.1", "@cosmjs/encoding@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" - integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== - dependencies: - base64-js "^1.3.0" - bech32 "^1.1.4" - readonly-date "^1.0.0" - -"@cosmjs/json-rpc@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" - integrity sha512-pitfC/2YN9t+kXZCbNuyrZ6M8abnCC2n62m+JtU9vQUfaEtVsgy+1Fk4TRQ175+pIWSdBMFi2wT8FWVEE4RhxQ== - dependencies: - "@cosmjs/stream" "^0.30.1" - xstream "^11.14.0" - -"@cosmjs/json-rpc@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.31.3.tgz#11e5cf0f6d9ab426dff470bb8d68d5d31cd6ab13" - integrity sha512-7LVYerXjnm69qqYR3uA6LGCrBW2EO5/F7lfJxAmY+iII2C7xO3a0vAjMSt5zBBh29PXrJVS6c2qRP22W1Le2Wg== - dependencies: - "@cosmjs/stream" "^0.31.3" - xstream "^11.14.0" - -"@cosmjs/math@^0.31.0-alpha.1", "@cosmjs/math@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.3.tgz#767f7263d12ba1b9ed2f01f68d857597839fd957" - integrity sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A== - dependencies: - bn.js "^5.2.0" - -"@cosmjs/proto-signing@^0.31.0-alpha.1": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz#20440b7b96fb2cd924256a10e656fd8d4481cdcd" - integrity sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA== - dependencies: - "@cosmjs/amino" "^0.31.3" - "@cosmjs/crypto" "^0.31.3" - "@cosmjs/encoding" "^0.31.3" - "@cosmjs/math" "^0.31.3" - "@cosmjs/utils" "^0.31.3" - cosmjs-types "^0.8.0" - long "^4.0.0" - -"@cosmjs/socket@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.31.3.tgz#52086380f4de2fc3514b90b0484b4b1c4c50e39e" - integrity sha512-aqrDGGi7os/hsz5p++avI4L0ZushJ+ItnzbqA7C6hamFSCJwgOkXaOUs+K9hXZdX4rhY7rXO4PH9IH8q09JkTw== - dependencies: - "@cosmjs/stream" "^0.31.3" - isomorphic-ws "^4.0.1" - ws "^7" - xstream "^11.14.0" - -"@cosmjs/stargate@0.31.0-alpha.1": - version "0.31.0-alpha.1" - resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.0-alpha.1.tgz#85b9d41cd5e73c3b8db73115aa1c9cd6eb5914fd" - integrity sha512-kCTUT3niB2hvcHjhlxpM8cNw1KOVmgZROdJUQaO8Ts4j22OyRZRFdwRPrOIuAKpqhVW2I1vI2HQL9Bg7pk9Glw== - dependencies: - "@confio/ics23" "^0.6.8" - "@cosmjs/amino" "^0.31.0-alpha.1" - "@cosmjs/encoding" "^0.31.0-alpha.1" - "@cosmjs/math" "^0.31.0-alpha.1" - "@cosmjs/proto-signing" "^0.31.0-alpha.1" - "@cosmjs/stream" "^0.31.0-alpha.1" - "@cosmjs/tendermint-rpc" "^0.31.0-alpha.1" - "@cosmjs/utils" "^0.31.0-alpha.1" - cosmjs-types "^0.8.0" - long "^4.0.0" - protobufjs "~6.11.3" - xstream "^11.14.0" - -"@cosmjs/stream@^0.30.1": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.30.1.tgz#ba038a2aaf41343696b1e6e759d8e03a9516ec1a" - integrity sha512-Fg0pWz1zXQdoxQZpdHRMGvUH5RqS6tPv+j9Eh7Q953UjMlrwZVo0YFLC8OTf/HKVf10E4i0u6aM8D69Q6cNkgQ== - dependencies: - xstream "^11.14.0" - -"@cosmjs/stream@^0.31.0-alpha.1", "@cosmjs/stream@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.31.3.tgz#53428fd62487ec08fc3886a50a3feeb8b2af2e66" - integrity sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w== - dependencies: - xstream "^11.14.0" - -"@cosmjs/tendermint-rpc@^0.31.0-alpha.1": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz#d1a2bc5b3c98743631c9b55888589d352403c9b3" - integrity sha512-s3TiWkPCW4QceTQjpYqn4xttUJH36mTPqplMl+qyocdqk5+X5mergzExU/pHZRWQ4pbby8bnR7kMvG4OC1aZ8g== - dependencies: - "@cosmjs/crypto" "^0.31.3" - "@cosmjs/encoding" "^0.31.3" - "@cosmjs/json-rpc" "^0.31.3" - "@cosmjs/math" "^0.31.3" - "@cosmjs/socket" "^0.31.3" - "@cosmjs/stream" "^0.31.3" - "@cosmjs/utils" "^0.31.3" - axios "^0.21.2" - readonly-date "^1.0.0" - xstream "^11.14.0" - -"@cosmjs/utils@^0.31.0-alpha.1", "@cosmjs/utils@^0.31.3": - version "0.31.3" - resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" - integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -2001,7 +1819,7 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0", "@ethersproject/networks@^5.7.1": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== @@ -2131,7 +1949,7 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -3133,19 +2951,19 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hinkal/common@0.1.52": - version "0.1.52" - resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.1.52.tgz#1035a43e91c48939c82666aa9083cd5940b1e546" - integrity sha512-0xIj3/ZcpVKwxM2XFrSxiWnBqaXogSDblYRzCh5ZAu+Q57HdgykcFF94LLDn3dnGuKVs4SCtGD6uNQdB1xTwKQ== +"@hinkal/common@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.2.tgz#d10648ea620bade61c105389388eb6dddbd63c12" + integrity sha512-TBzg7SSOrege2JwxylGR3WDojWh2FhFXeTmq2yTywfwntPYCI3+fyy+pAU8GkTLMXD+YOwT4S+oCS5edYA5paQ== dependencies: - "@axelar-network/axelarjs-sdk" "0.16.0" async-mutex "^0.4.0" axios "^1.6.8" - circomlibjs "^0.1.7" + buffer "6.0.3" + circomlibjs-hinkal-fork "^0.0.3" dotenv "^16.4.5" - ethers "5.7.2" idb-keyval "6.2.1" libsodium-wrappers "^0.7.10" + process "0.11.10" snarkjs "0.7.5" ua-parser-js "^1.0.37" uuid "^9.0.1" @@ -4314,11 +4132,6 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== -"@noble/hashes@^1", "@noble/hashes@^1.0.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== - "@noble/hashes@^1.1.2": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" @@ -5194,59 +5007,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - "@rainbow-me/fee-suggestions@2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@rainbow-me/fee-suggestions/-/fee-suggestions-2.1.0.tgz" @@ -5507,11 +5267,6 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@socket.io/component-emitter@~3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" - integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== - "@solidity-parser/parser@^0.13.2": version "0.13.2" resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.13.2.tgz" @@ -6139,11 +5894,6 @@ dependencies: "@types/node" "*" -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" @@ -6218,13 +5968,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/node@>=13.7.0": - version "22.10.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.0.tgz#89bfc9e82496b9c7edea3382583fa94f75896e81" - integrity sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA== - dependencies: - undici-types "~6.20.0" - "@types/node@^12.12.6": version "12.20.6" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.6.tgz" @@ -6343,11 +6086,6 @@ resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== -"@types/uuid@^8.3.1": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/ws@^8.0.0": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -7754,13 +7492,6 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.2: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^1.0.0, axios@^1.4.0: version "1.7.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" @@ -8488,7 +8219,7 @@ bcryptjs@^2.3.0: resolved "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= -bech32@1.1.4, bech32@^1.1.3, bech32@^1.1.4: +bech32@1.1.4, bech32@^1.1.3: version "1.1.4" resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== @@ -8604,15 +8335,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blake-hash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" - integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== - dependencies: - node-addon-api "^3.0.0" - node-gyp-build "^4.2.2" - readable-stream "^3.6.0" - blake2b-wasm@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" @@ -8621,14 +8343,6 @@ blake2b-wasm@^2.4.0: b4a "^1.0.1" nanoassert "^2.0.0" -blake2b@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" - integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== - dependencies: - blake2b-wasm "^2.4.0" - nanoassert "^2.0.0" - blakejs@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz" @@ -9767,15 +9481,12 @@ circom_runtime@0.1.28: dependencies: ffjavascript "0.3.1" -circomlibjs@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" - integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== +circomlibjs-hinkal-fork@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/circomlibjs-hinkal-fork/-/circomlibjs-hinkal-fork-0.0.3.tgz#4315276dbcd79b8d720093a72a4028cbcc509077" + integrity sha512-yj8eVrWpbmAQLD+MLwHZ+rhLoSgGT5vhnV3j0Ih7+uclCp3kouXKj1H+/PwbWnIC/ykhTy53dLi0QoChsACXtA== dependencies: - blake-hash "^2.0.0" - blake2b "^2.1.3" - ethers "^5.5.1" - ffjavascript "^0.2.45" + ffjavascript "^0.3.0" citty@^0.1.5, citty@^0.1.6: version "0.1.6" @@ -9921,7 +9632,7 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-deep@4.0.1, clone-deep@^4.0.1: +clone-deep@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== @@ -10468,14 +10179,6 @@ cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: parse-json "^5.2.0" path-type "^4.0.0" -cosmjs-types@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.8.0.tgz#2ed78f3e990f770229726f95f3ef5bf9e2b6859b" - integrity sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg== - dependencies: - long "^4.0.0" - protobufjs "~6.11.2" - cpu-features@~0.0.8: version "0.0.9" resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.9.tgz#5226b92f0f1c63122b0a3eb84cb8335a4de499fc" @@ -10831,13 +10534,6 @@ debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: dependencies: ms "^2.1.1" -debug@~4.3.1, debug@~4.3.2: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decache@^4.5.1: version "4.6.0" resolved "https://registry.npmjs.org/decache/-/decache-4.6.0.tgz" @@ -11612,22 +11308,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~6.6.1: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.2.tgz#e0a09e1c90effe5d6264da1c56d7281998f1e50b" - integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.17.1" - xmlhttprequest-ssl "~2.1.1" - -engine.io-parser@~5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" - integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== - enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1: version "4.5.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" @@ -12726,7 +12406,7 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@5.7.2, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.1, ethers@^5.5.2, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: +ethers@5.7.2, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2, ethers@^5.7.0, ethers@^5.7.1: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -13372,15 +13052,6 @@ ffjavascript@0.3.1, ffjavascript@^0.3.0: wasmcurves "0.2.2" web-worker "1.2.0" -ffjavascript@^0.2.45: - version "0.2.63" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" - integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== - dependencies: - wasmbuilder "0.0.16" - wasmcurves "0.2.2" - web-worker "1.2.0" - figures@3.2.0, figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -13634,11 +13305,6 @@ follow-redirects@^1.12.1, follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -follow-redirects@^1.14.0: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - fontkit@^1.8.0: version "1.8.1" resolved "https://registry.npmjs.org/fontkit/-/fontkit-1.8.1.tgz" @@ -14423,14 +14089,6 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globalthis@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -16315,11 +15973,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - isomorphic-ws@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" @@ -17465,18 +17118,6 @@ libnpmpublish@7.1.4: sigstore "^1.4.0" ssri "^10.0.1" -libsodium-sumo@^0.7.15: - version "0.7.15" - resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz#91c1d863fe3fbce6d6b9db1aadaa622733a1d007" - integrity sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw== - -libsodium-wrappers-sumo@^0.7.11: - version "0.7.15" - resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz#0ef2a99b4b17e8385aa7e6850593660dbaf5fb40" - integrity sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA== - dependencies: - libsodium-sumo "^0.7.15" - libsodium-wrappers@^0.7.10: version "0.7.15" resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz#53f13e483820272a3d55b23be2e34402ac988055" @@ -17808,16 +17449,6 @@ logplease@^1.2.15: resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^5.0.0, long@^5.2.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - looper@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" @@ -18802,7 +18433,7 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -19063,7 +18694,7 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-addon-api@^3.0.0, node-addon-api@^3.2.1: +node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -19120,11 +18751,6 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-gyp-build@^4.2.2: - version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - node-gyp@^9.0.0: version "9.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" @@ -20831,43 +20457,6 @@ proto-list@~1.2.1: resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -protobufjs@^7.0.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" - integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" @@ -21422,11 +21011,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -readonly-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" - integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== - real-require@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.1.0.tgz#736ac214caa20632847b7ca8c1056a0767df9381" @@ -22530,24 +22114,6 @@ snarkjs@0.7.5: logplease "^1.2.15" r1csfile "0.0.48" -socket.io-client@^4.6.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" - integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.6.1" - socket.io-parser "~4.2.4" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - socks-proxy-agent@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" @@ -22921,18 +22487,6 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -"standard-error@>= 1.1.0 < 2": - version "1.1.0" - resolved "https://registry.yarnpkg.com/standard-error/-/standard-error-1.1.0.tgz#23e5168fa1c0820189e5812701a79058510d0d34" - integrity sha512-4v7qzU7oLJfMI5EltUSHCaaOd65J6S4BqKRWgzMi4EYaE5fvNabPxmAPGdxpGXqrcWjhDGI/H09CIdEuUOUeXg== - -standard-http-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/standard-http-error/-/standard-http-error-2.0.1.tgz#f8ae9172e3cef9cb38d2e7084a1925f57a7c34bd" - integrity sha512-DX/xPIoyXQTuY6BMZK4Utyi4l3A4vFoafsfqrU6/dO4Oe/59c7PyqPd2IQj9m+ZieDg2K3RL9xOYJsabcD9IUA== - dependencies: - standard-error ">= 1.1.0 < 2" - static-eval@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" @@ -23087,11 +22641,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-similarity-js@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/string-similarity-js/-/string-similarity-js-2.1.4.tgz#73716330691946f2ebc435859aba8327afd31307" - integrity sha512-uApODZNjCHGYROzDSAdCmAHf60L/pMDHnP/yk6TAbvGg7JSPZlSto/ceCI7hZEqzc53/juU2aOJFkM2yUVTMTA== - "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -23495,11 +23044,6 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" -symbol-observable@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" - integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== - syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz" @@ -24644,11 +24188,6 @@ underscore@1.12.1, underscore@1.9.1, underscore@^1.12.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - undici@^5.14.0: version "5.28.4" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" @@ -26607,11 +26146,6 @@ ws@^5.1.1: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - ws@^7.3.1: version "7.4.4" resolved "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz" @@ -26622,16 +26156,16 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== +ws@^7.5.1: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^8.12.0, ws@^8.13.0, ws@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.0.tgz#db080a279260c5f532fc668d461b8346efdfcf86" integrity sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw== -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz" @@ -26681,24 +26215,11 @@ xmldoc@^1.1.2: dependencies: sax "^1.2.1" -xmlhttprequest-ssl@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" - integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== - xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xstream@^11.14.0: - version "11.14.0" - resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" - integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== - dependencies: - globalthis "^1.0.1" - symbol-observable "^2.0.3" - xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" From ef769f095654af431ce81d618c0d54e90d5b9d56 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Thu, 5 Dec 2024 21:25:30 -0800 Subject: [PATCH 12/43] adding-right-approval-amount-to-erc20privateproxy --- .../src/payment/erc-20-private-payment-hinkal.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts index 4e84888ca..432c5e19a 100644 --- a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -193,9 +193,10 @@ export function prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( getRequestPaymentValues(request); const amountToPay = getAmountToPay(request, amount); const feeToPay = String(feeAmountOverride || feeAmount || 0); + const totalAmount = amountToPay.add(BigNumber.from(feeToPay)); const ops = [ - emporiumOp(tokenContract, 'approve', [proxyContract.address, amountToPay]), + emporiumOp(tokenContract, 'approve', [proxyContract.address, totalAmount]), emporiumOp(proxyContract, 'transferFromWithReferenceAndFee', [ tokenAddress, paymentAddress, From 3cd3f7dee4b7dc6a6d4f65364ca1e51f8cce0d92 Mon Sep 17 00:00:00 2001 From: giorgi-kiknavelidze <69247736+giorgi-kiknavelidze@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:42:26 +0400 Subject: [PATCH 13/43] format file with prettier --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 47a033f4d..e1a5a98f8 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -133,8 +133,9 @@ const getTokenShieldedBalance = async ( tokenAddress = currencyAddress, ): Promise => { const balances = await hinkalStore[address].getBalances(); - const tokenBalance = balances.find((balance) => balance.token.erc20TokenAddress === tokenAddress) - ?.balance; + const tokenBalance = balances.find( + (balance) => balance.token.erc20TokenAddress === tokenAddress, + )?.balance; if (tokenBalance === undefined) { throw Error('Shiedled Balance calculated incorrectly'); From 4f2ea883cde833ab632833e3cbb5ca8191b0fae7 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Fri, 6 Dec 2024 15:20:20 -0800 Subject: [PATCH 14/43] adding-fee-in-test-case --- .../src/payment/erc-20-private-payment-hinkal.ts | 2 +- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts index 432c5e19a..cf0ab0d71 100644 --- a/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts +++ b/packages/payment-processor/src/payment/erc-20-private-payment-hinkal.ts @@ -208,7 +208,7 @@ export function prepareErc20FeeProxyPaymentFromHinkalShieldedAddress( ]; return { - amountToPay: amountToPay.toBigInt(), + amountToPay: totalAmount.toBigInt(), tokenAddress, ops, }; diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index e1a5a98f8..a3a6d4962 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -17,7 +17,7 @@ const currencyAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC const currentCurrenyType = Types.RequestLogic.CURRENCY.ERC20; const currencyAmount = ethers.utils.parseUnits('0.000001', 6).toBigInt(); const currentGateway = 'https://sepolia.gateway.request.network'; -const fee = '0'; +const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // Payer: // 1) sends funds from his shielded address to EOA of the payee From aabc05042b2236e9c761f6c90bcc3471625a1471 Mon Sep 17 00:00:00 2001 From: nkoreli Date: Mon, 16 Dec 2024 12:45:06 -0800 Subject: [PATCH 15/43] update-hinkal-to-latest --- packages/payment-processor/package.json | 2 +- yarn.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 4701dbbd0..730e782bb 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -39,7 +39,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.2.2", + "@hinkal/common": "0.2.4", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.21.0", "@requestnetwork/payment-detection": "0.47.0", diff --git a/yarn.lock b/yarn.lock index 3e72ea46f..03f07957d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2951,10 +2951,10 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hinkal/common@0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.2.tgz#d10648ea620bade61c105389388eb6dddbd63c12" - integrity sha512-TBzg7SSOrege2JwxylGR3WDojWh2FhFXeTmq2yTywfwntPYCI3+fyy+pAU8GkTLMXD+YOwT4S+oCS5edYA5paQ== +"@hinkal/common@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.4.tgz#689588e362c85c34ece22cd2eb2fa1eccc4b0282" + integrity sha512-Y+yV/r/ZHNve/n1LFOIUFWZpNKmtADI18BoOLElflEUz4gjqz/4gMYjWOXGk3lOhNzfYIMQuTz1gwyTN/Uv7nA== dependencies: async-mutex "^0.4.0" axios "^1.6.8" @@ -2963,6 +2963,7 @@ dotenv "^16.4.5" idb-keyval "6.2.1" libsodium-wrappers "^0.7.10" + node-forge "^1.3.1" process "0.11.10" snarkjs "0.7.5" ua-parser-js "^1.0.37" From 40ed4855c28ace38e1f4fd16ca6f5c3ad73e31e0 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 22:22:29 -0500 Subject: [PATCH 16/43] refactor: reduce jest timeout to 30 seconds for hinkal tests --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index a3a6d4962..db076e01d 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -37,7 +37,7 @@ const payeeShieldedAddress = const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network -jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) +jest.setTimeout(30000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) /** * Function to create a payment request for Hinkal. From 6b2bd36f38e1856ab2faf26a1c175984057c750e Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 22:26:47 -0500 Subject: [PATCH 17/43] Remove waitLittle when transfering funds to public addresses --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index db076e01d..c5492d1cd 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -176,8 +176,6 @@ describe('ERC-20 Private Payments With Hinkal', () => { const tx = await payErc20ProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); - await waitLittle(5); // wait before balance is increased - expect(tx.status).toBe(1); expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); @@ -192,8 +190,6 @@ describe('ERC-20 Private Payments With Hinkal', () => { const tx = await payErc20FeeProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); - await waitLittle(5); // wait before balance is increased - expect(tx.status).toBe(1); expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); From 72ddf53ab22a27c189809c019a238a4236861741 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 22:28:15 -0500 Subject: [PATCH 18/43] fix: add space between tests --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index c5492d1cd..abf4157ea 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -180,6 +180,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); + it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, From a8e1f33714fa603485a92cf2ee46decf42571f4a Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 22:55:38 -0500 Subject: [PATCH 19/43] refactor: improve error message Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index abf4157ea..d1f7f9281 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -138,7 +138,7 @@ const getTokenShieldedBalance = async ( )?.balance; if (tokenBalance === undefined) { - throw Error('Shiedled Balance calculated incorrectly'); + throw new Error(`No balance found for token ${tokenAddress} at address ${address}`); } return tokenBalance; }; From ab2aad7b8892198ace5dd7db884b1ff8fdf61944 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 23:09:48 -0500 Subject: [PATCH 20/43] Revert "refactor: reduce jest timeout to 30 seconds for hinkal tests" This reverts commit 40ed4855c28ace38e1f4fd16ca6f5c3ad73e31e0. --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index d1f7f9281..df7c6cade 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -37,7 +37,7 @@ const payeeShieldedAddress = const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network -jest.setTimeout(30000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) +jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., blockchain calls) /** * Function to create a payment request for Hinkal. From a9bedda41355e2b0c2ed2c4dc103947b59f88e5b Mon Sep 17 00:00:00 2001 From: MantisClone Date: Tue, 17 Dec 2024 23:53:34 -0500 Subject: [PATCH 21/43] fix: Increase "no output" timeout to 30 mins from 10 mins * https://support.circleci.com/hc/en-us/articles/360045268074-Build-Fails-with-Too-long-with-no-output-exceeded-10m0s-context-deadline-exceeded --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 904b2ee00..53a50eb3c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -164,6 +164,7 @@ jobs: - run: *step_graph_deploy - run: name: 'Test request-client.js, smart-contracts, payment-detection and payment-processor' + no_output_timeout: 30m command: | yarn test \ --scope @requestnetwork/request-node \ From 8a0a684f6b15e9dbf7ce9a5ebf81b51c1f34ca8e Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:01:30 -0500 Subject: [PATCH 22/43] Update comment to show test needs both ETH and USDC --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index df7c6cade..babbb6c46 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -23,7 +23,7 @@ const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // 1) sends funds from his shielded address to EOA of the payee // 2) sends funds from his EOA to the shielded address of the payee // 3) sends funds from hiw EOA to his own shielded address -// Note: to successfully run the tests, you will need to top up payer's EOA address with Eth on base +// Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base const payerMnemonic = 'sand win seed crucial film antique adapt start pupil gallery edge collect'; const payerAddress = '0x01aC930fAb20482E5b7eAbF892DF57141c29de5F'; // Payee: From edde416f8d8dbb0c71050150e386407bbe207d7d Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:02:45 -0500 Subject: [PATCH 23/43] Separate hinkal tests from main test suite. Run them monthly. --- .circleci/config.yml | 31 ++++++++++++++++++++++++- packages/payment-processor/package.json | 3 ++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 53a50eb3c..cd7a88cbd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -164,7 +164,6 @@ jobs: - run: *step_graph_deploy - run: name: 'Test request-client.js, smart-contracts, payment-detection and payment-processor' - no_output_timeout: 30m command: | yarn test \ --scope @requestnetwork/request-node \ @@ -267,6 +266,20 @@ jobs: - store_test_results: path: packages/integration-test/reports/ + test-monthly: + docker: + - *node_image + working_directory: *working_directory + steps: + - attach_workspace: + at: *working_directory + - run: + name: 'Test payment-processor (hinkal)' + no_output_timeout: 20m + command: 'yarn workspace @requestnetwork/payment-processor run test:hinkal' + - store_test_results: + path: packages/payment-processor/reports/ + # Release a next version package everytime we merge to master next-release: docker: @@ -350,3 +363,19 @@ workflows: - test-nightly: requires: - build + + monthly: + triggers: + - schedule: + # This is a cron job for "every 1st day of the month at 22 hours" + cron: '0 22 1 * *' + filters: + branches: + only: + - master + + jobs: + - build + - test-monthly: + requires: + - build diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index cb0cd227d..b01eec4f8 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -35,7 +35,8 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "prepare": "yarn run build", - "test": "jest --runInBand", + "test": "jest --testPathIgnorePatterns test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", + "test:hinkal": "jest test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", "test:watch": "yarn test --watch" }, "dependencies": { From 5fee7049363e1766e1a87126f8e79e75c9feb891 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:05:30 -0500 Subject: [PATCH 24/43] [REVERT ME] run hinkal tests on every commit --- packages/payment-processor/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index b01eec4f8..e03c09ac9 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -35,7 +35,7 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "prepare": "yarn run build", - "test": "jest --testPathIgnorePatterns test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", + "test": "jest --runInBand", "test:hinkal": "jest test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", "test:watch": "yarn test --watch" }, From 4dbab72668bddb3ea1c7221e113c30fc9829a208 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:17:49 -0500 Subject: [PATCH 25/43] Define hinkal payee and payer as environment variables --- .circleci/config.yml | 6 ++++++ .../payment/erc-20-private-payment-hinkal.test.ts | 11 +++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cd7a88cbd..efd868cfc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -185,6 +185,12 @@ jobs: path: packages/payment-processor/reports/ - store_test_results: path: packages/ethereum-storage/reports/ + environment: + HINKAL_TEST_PAYER_MNEMONIC: $HINKAL_TEST_PAYER_MNEMONIC + HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS + HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY + HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: $HINKAL_TEST_PAYEE_SHIELDED_ADDRESS test-integration-with-request-node: docker: - *node_image diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index babbb6c46..f57535698 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -24,16 +24,15 @@ const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // 2) sends funds from his EOA to the shielded address of the payee // 3) sends funds from hiw EOA to his own shielded address // Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base -const payerMnemonic = 'sand win seed crucial film antique adapt start pupil gallery edge collect'; -const payerAddress = '0x01aC930fAb20482E5b7eAbF892DF57141c29de5F'; +const payerMnemonic = process.env.HINKAL_TEST_PAYER_MNEMONIC; +const payerAddress = process.env.HINKAL_TEST_PAYER_ADDRESS; // Payee: // 1) receives funds on her public EOA address // 2) receives funds on her shielded address // The private key of a public address grant ownership of the corresponding shielded address. In @hinkal/common, a single public address can have only one shielded address. -const payeeAddress = '0x44DC1e666C1ca6717849efE19eAC72AD83cFf5d2'; -const payeePrivateKey = '0x3abdcb3d6d6c302a7943715d0b975ae1377d7d1d188820f6cd57b6f13fb5b0e0'; -const payeeShieldedAddress = - '142590100039484718476239190022599206250779986428210948946438848754146776167,0x096d6d5d8b2292aa52e57123a58fc4d5f3d66171acd895f22ce1a5b16ac51b9e,0xc025ccc6ef46399da52763a866a3a10d2eade509af27eb8411c5d251eb8cd34d'; +const payeeAddress = process.env.HINKAL_TEST_PAYEE_ADDRESS; +const payeePrivateKey = process.env.HINKAL_TEST_PAYEE_PRIVATE_KEY; +const payeeShieldedAddress = process.env.HINKAL_TEST_PAYEE_SHIELDED_ADDRESS; const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network From 04bd424d4aa12403fa951a0af6614b62a298c868 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:41:18 -0500 Subject: [PATCH 26/43] Increase CircleCI no_output_timeout to 30m for test-monthly --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index efd868cfc..0494a7d24 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -281,7 +281,7 @@ jobs: at: *working_directory - run: name: 'Test payment-processor (hinkal)' - no_output_timeout: 20m + no_output_timeout: 30m command: 'yarn workspace @requestnetwork/payment-processor run test:hinkal' - store_test_results: path: packages/payment-processor/reports/ From eb3c48f8a155220a671c7ac8092da068826ca195 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:41:45 -0500 Subject: [PATCH 27/43] [REVERT ME] Set CircleCI no_output_timeout=30m for integration tests --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0494a7d24..486f33111 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -164,6 +164,7 @@ jobs: - run: *step_graph_deploy - run: name: 'Test request-client.js, smart-contracts, payment-detection and payment-processor' + no_output_timeout: 30m command: | yarn test \ --scope @requestnetwork/request-node \ From 048e5d585a7ac49e4e1b9f357942bbd8fd94d0c9 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 15:44:12 -0500 Subject: [PATCH 28/43] Revert "Remove waitLittle when transfering funds to public addresses" This reverts commit 6b2bd36f38e1856ab2faf26a1c175984057c750e. --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index f57535698..941ca3d78 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -175,6 +175,8 @@ describe('ERC-20 Private Payments With Hinkal', () => { const tx = await payErc20ProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); + await waitLittle(5); // wait before balance is increased + expect(tx.status).toBe(1); expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); @@ -190,6 +192,8 @@ describe('ERC-20 Private Payments With Hinkal', () => { const tx = await payErc20FeeProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); + await waitLittle(5); // wait before balance is increased + expect(tx.status).toBe(1); expect(tx.from).not.toBe(payerAddress); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); From 06e32574bf3ef7fba86c4602b4ef3aaa18b2663d Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 16:11:20 -0500 Subject: [PATCH 29/43] Add Hinkal env vars to test-monthly job --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 486f33111..f88c4ee90 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -286,6 +286,12 @@ jobs: command: 'yarn workspace @requestnetwork/payment-processor run test:hinkal' - store_test_results: path: packages/payment-processor/reports/ + environment: + HINKAL_TEST_PAYER_MNEMONIC: $HINKAL_TEST_PAYER_MNEMONIC + HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS + HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY + HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: $HINKAL_TEST_PAYEE_SHIELDED_ADDRESS # Release a next version package everytime we merge to master next-release: From c5a143414165122de2f5ab5eca60047997ba18a0 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 16:24:36 -0500 Subject: [PATCH 30/43] fix: build error due to type conflict (env var can be undefined) --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 941ca3d78..f9af57df7 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -24,15 +24,15 @@ const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // 2) sends funds from his EOA to the shielded address of the payee // 3) sends funds from hiw EOA to his own shielded address // Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base -const payerMnemonic = process.env.HINKAL_TEST_PAYER_MNEMONIC; -const payerAddress = process.env.HINKAL_TEST_PAYER_ADDRESS; +const payerMnemonic = process.env.HINKAL_TEST_PAYER_MNEMONIC as string; +const payerAddress = process.env.HINKAL_TEST_PAYER_ADDRESS as string; // Payee: // 1) receives funds on her public EOA address // 2) receives funds on her shielded address // The private key of a public address grant ownership of the corresponding shielded address. In @hinkal/common, a single public address can have only one shielded address. -const payeeAddress = process.env.HINKAL_TEST_PAYEE_ADDRESS; -const payeePrivateKey = process.env.HINKAL_TEST_PAYEE_PRIVATE_KEY; -const payeeShieldedAddress = process.env.HINKAL_TEST_PAYEE_SHIELDED_ADDRESS; +const payeeAddress = process.env.HINKAL_TEST_PAYEE_ADDRESS as string; +const payeePrivateKey = process.env.HINKAL_TEST_PAYEE_PRIVATE_KEY as string; +const payeeShieldedAddress = process.env.HINKAL_TEST_PAYEE_SHIELDED_ADDRESS as string; const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network From 84bbaba763002313bb9ee8bdcc8f540aea3170bf Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 17:24:16 -0500 Subject: [PATCH 31/43] Add quotes around CircleCI Environment Variable --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f88c4ee90..4a4e95ee0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -287,7 +287,7 @@ jobs: - store_test_results: path: packages/payment-processor/reports/ environment: - HINKAL_TEST_PAYER_MNEMONIC: $HINKAL_TEST_PAYER_MNEMONIC + HINKAL_TEST_PAYER_MNEMONIC: '$HINKAL_TEST_PAYER_MNEMONIC' HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS From 4ddad729f06ebd18de15e4569283743e607ff348 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 17:51:17 -0500 Subject: [PATCH 32/43] replace mnemonic with priv key. CircleCI chokes on env vars with spaces --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index f9af57df7..3b2ec4dd0 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -24,7 +24,7 @@ const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // 2) sends funds from his EOA to the shielded address of the payee // 3) sends funds from hiw EOA to his own shielded address // Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base -const payerMnemonic = process.env.HINKAL_TEST_PAYER_MNEMONIC as string; +const payerPrivateKey = process.env.HINKAL_TEST_PAYER_PRIVATE_KEY as string; const payerAddress = process.env.HINKAL_TEST_PAYER_ADDRESS as string; // Payee: // 1) receives funds on her public EOA address @@ -148,7 +148,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { let payeeWallet: ethers.Wallet; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); - payerWallet = Wallet.fromMnemonic(payerMnemonic).connect(provider); + payerWallet = new Wallet(payerPrivateKey, provider); payeeWallet = new Wallet(payeePrivateKey, provider); await addToHinkalStore(payerWallet); }); From 26b4ae1b607ac8e851437e5bdfb3657ce7e4c7cc Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 18:23:28 -0500 Subject: [PATCH 33/43] fix: config.yml to pass new PRIVATE_KEY env var --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a4e95ee0..4a03d32e7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,7 +187,7 @@ jobs: - store_test_results: path: packages/ethereum-storage/reports/ environment: - HINKAL_TEST_PAYER_MNEMONIC: $HINKAL_TEST_PAYER_MNEMONIC + HINKAL_TEST_PAYER_PRIVATE_KEY: $HINKAL_TEST_PAYER_PRIVATE_KEY HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS @@ -287,7 +287,7 @@ jobs: - store_test_results: path: packages/payment-processor/reports/ environment: - HINKAL_TEST_PAYER_MNEMONIC: '$HINKAL_TEST_PAYER_MNEMONIC' + HINKAL_TEST_PAYER_PRIVATE_KEY: $HINKAL_TEST_PAYER_PRIVATE_KEY HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS From 1cf6f4aeb7a5bf5115fb1c152730f25a3778f122 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Thu, 19 Dec 2024 23:49:07 -0500 Subject: [PATCH 34/43] Debug invalid hexlify error when creating wallet from private key --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 3b2ec4dd0..40d555891 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -148,6 +148,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { let payeeWallet: ethers.Wallet; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); + console.log('Payee Private Key:', payerPrivateKey); payerWallet = new Wallet(payerPrivateKey, provider); payeeWallet = new Wallet(payeePrivateKey, provider); await addToHinkalStore(payerWallet); From 8aa248ae6ec13f26a47a9bb53e63abb2eedd124c Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 00:35:27 -0500 Subject: [PATCH 35/43] Revert "Debug invalid hexlify error when creating wallet from private key" This reverts commit 1cf6f4aeb7a5bf5115fb1c152730f25a3778f122. --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 40d555891..3b2ec4dd0 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -148,7 +148,6 @@ describe('ERC-20 Private Payments With Hinkal', () => { let payeeWallet: ethers.Wallet; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); - console.log('Payee Private Key:', payerPrivateKey); payerWallet = new Wallet(payerPrivateKey, provider); payeeWallet = new Wallet(payeePrivateKey, provider); await addToHinkalStore(payerWallet); From f2a9a6d43482cde701191481c3a5e6ef09642156 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 00:35:42 -0500 Subject: [PATCH 36/43] fix: Using CircleCI env vars requires brackets like ${VAR} --- .circleci/config.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a03d32e7..594dbb4d5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,11 +187,11 @@ jobs: - store_test_results: path: packages/ethereum-storage/reports/ environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: $HINKAL_TEST_PAYER_PRIVATE_KEY - HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS - HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY - HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: $HINKAL_TEST_PAYEE_SHIELDED_ADDRESS + HINKAL_TEST_PAYER_PRIVATE_KEY: ${HINKAL_TEST_PAYER_PRIVATE_KEY} + HINKAL_TEST_PAYER_ADDRESS: ${HINKAL_TEST_PAYER_ADDRESS} + HINKAL_TEST_PAYEE_PRIVATE_KEY: ${HINKAL_TEST_PAYEE_PRIVATE_KEY} + HINKAL_TEST_PAYEE_ADDRESS: ${HINKAL_TEST_PAYEE_ADDRESS} + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: ${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS} test-integration-with-request-node: docker: - *node_image @@ -287,11 +287,11 @@ jobs: - store_test_results: path: packages/payment-processor/reports/ environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: $HINKAL_TEST_PAYER_PRIVATE_KEY - HINKAL_TEST_PAYER_ADDRESS: $HINKAL_TEST_PAYER_ADDRESS - HINKAL_TEST_PAYEE_PRIVATE_KEY: $HINKAL_TEST_PAYEE_PRIVATE_KEY - HINKAL_TEST_PAYEE_ADDRESS: $HINKAL_TEST_PAYEE_ADDRESS - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: $HINKAL_TEST_PAYEE_SHIELDED_ADDRESS + HINKAL_TEST_PAYER_PRIVATE_KEY: ${HINKAL_TEST_PAYER_PRIVATE_KEY} + HINKAL_TEST_PAYER_ADDRESS: ${HINKAL_TEST_PAYER_ADDRESS} + HINKAL_TEST_PAYEE_PRIVATE_KEY: ${HINKAL_TEST_PAYEE_PRIVATE_KEY} + HINKAL_TEST_PAYEE_ADDRESS: ${HINKAL_TEST_PAYEE_ADDRESS} + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: ${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS} # Release a next version package everytime we merge to master next-release: From 5a7ab2b081986453fff8b835e24fc670827f9994 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 01:23:39 -0500 Subject: [PATCH 37/43] fix: wrap env var usage in "" quotes --- .circleci/config.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 594dbb4d5..8b712954d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -187,11 +187,11 @@ jobs: - store_test_results: path: packages/ethereum-storage/reports/ environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: ${HINKAL_TEST_PAYER_PRIVATE_KEY} - HINKAL_TEST_PAYER_ADDRESS: ${HINKAL_TEST_PAYER_ADDRESS} - HINKAL_TEST_PAYEE_PRIVATE_KEY: ${HINKAL_TEST_PAYEE_PRIVATE_KEY} - HINKAL_TEST_PAYEE_ADDRESS: ${HINKAL_TEST_PAYEE_ADDRESS} - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: ${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS} + HINKAL_TEST_PAYER_PRIVATE_KEY: '${HINKAL_TEST_PAYER_PRIVATE_KEY}' + HINKAL_TEST_PAYER_ADDRESS: '${HINKAL_TEST_PAYER_ADDRESS}' + HINKAL_TEST_PAYEE_PRIVATE_KEY: '${HINKAL_TEST_PAYEE_PRIVATE_KEY}' + HINKAL_TEST_PAYEE_ADDRESS: '${HINKAL_TEST_PAYEE_ADDRESS}' + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: '${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS}' test-integration-with-request-node: docker: - *node_image @@ -287,11 +287,11 @@ jobs: - store_test_results: path: packages/payment-processor/reports/ environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: ${HINKAL_TEST_PAYER_PRIVATE_KEY} - HINKAL_TEST_PAYER_ADDRESS: ${HINKAL_TEST_PAYER_ADDRESS} - HINKAL_TEST_PAYEE_PRIVATE_KEY: ${HINKAL_TEST_PAYEE_PRIVATE_KEY} - HINKAL_TEST_PAYEE_ADDRESS: ${HINKAL_TEST_PAYEE_ADDRESS} - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: ${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS} + HINKAL_TEST_PAYER_PRIVATE_KEY: '${HINKAL_TEST_PAYER_PRIVATE_KEY}' + HINKAL_TEST_PAYER_ADDRESS: '${HINKAL_TEST_PAYER_ADDRESS}' + HINKAL_TEST_PAYEE_PRIVATE_KEY: '${HINKAL_TEST_PAYEE_PRIVATE_KEY}' + HINKAL_TEST_PAYEE_ADDRESS: '${HINKAL_TEST_PAYEE_ADDRESS}' + HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: '${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS}' # Release a next version package everytime we merge to master next-release: From e9ed39f8009d5d984e1ab9105ad53a35247a3bc6 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 10:10:46 -0500 Subject: [PATCH 38/43] try removing environment from config.yml entirely --- .circleci/config.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8b712954d..94ab5b241 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -186,12 +186,6 @@ jobs: path: packages/payment-processor/reports/ - store_test_results: path: packages/ethereum-storage/reports/ - environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: '${HINKAL_TEST_PAYER_PRIVATE_KEY}' - HINKAL_TEST_PAYER_ADDRESS: '${HINKAL_TEST_PAYER_ADDRESS}' - HINKAL_TEST_PAYEE_PRIVATE_KEY: '${HINKAL_TEST_PAYEE_PRIVATE_KEY}' - HINKAL_TEST_PAYEE_ADDRESS: '${HINKAL_TEST_PAYEE_ADDRESS}' - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: '${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS}' test-integration-with-request-node: docker: - *node_image @@ -286,12 +280,6 @@ jobs: command: 'yarn workspace @requestnetwork/payment-processor run test:hinkal' - store_test_results: path: packages/payment-processor/reports/ - environment: - HINKAL_TEST_PAYER_PRIVATE_KEY: '${HINKAL_TEST_PAYER_PRIVATE_KEY}' - HINKAL_TEST_PAYER_ADDRESS: '${HINKAL_TEST_PAYER_ADDRESS}' - HINKAL_TEST_PAYEE_PRIVATE_KEY: '${HINKAL_TEST_PAYEE_PRIVATE_KEY}' - HINKAL_TEST_PAYEE_ADDRESS: '${HINKAL_TEST_PAYEE_ADDRESS}' - HINKAL_TEST_PAYEE_SHIELDED_ADDRESS: '${HINKAL_TEST_PAYEE_SHIELDED_ADDRESS}' # Release a next version package everytime we merge to master next-release: From aef7cb00adac07baf1997b9a706ddb4c9eb913ee Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 17:48:56 -0500 Subject: [PATCH 39/43] refactor: eliminate ADDRESS env vars --- packages/payment-processor/package.json | 2 +- .../erc-20-private-payment-hinkal.test.ts | 38 ++++++++++--------- yarn.lock | 8 ++-- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index e03c09ac9..2855d8d6d 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -40,7 +40,7 @@ "test:watch": "yarn test --watch" }, "dependencies": { - "@hinkal/common": "0.2.4", + "@hinkal/common": "0.2.7", "@openzeppelin/contracts": "4.9.6", "@requestnetwork/currency": "0.23.0", "@requestnetwork/payment-detection": "0.49.0", diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 3b2ec4dd0..65fb53c0f 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -25,14 +25,11 @@ const fee = ethers.utils.parseUnits('0.000001', 6).toString(); // 3) sends funds from hiw EOA to his own shielded address // Note: to successfully run the tests, you will need to top up payer's EOA address with ETH and USDC on Base const payerPrivateKey = process.env.HINKAL_TEST_PAYER_PRIVATE_KEY as string; -const payerAddress = process.env.HINKAL_TEST_PAYER_ADDRESS as string; // Payee: // 1) receives funds on her public EOA address // 2) receives funds on her shielded address // The private key of a public address grant ownership of the corresponding shielded address. In @hinkal/common, a single public address can have only one shielded address. -const payeeAddress = process.env.HINKAL_TEST_PAYEE_ADDRESS as string; const payeePrivateKey = process.env.HINKAL_TEST_PAYEE_PRIVATE_KEY as string; -const payeeShieldedAddress = process.env.HINKAL_TEST_PAYEE_SHIELDED_ADDRESS as string; const RPC_URL = 'https://mainnet.base.org'; // Blockchain RPC endpoint for the Base network @@ -48,6 +45,7 @@ jest.setTimeout(1000000); // Set Jest timeout for asynchronous operations (e.g., */ const createRequestForHinkal = async ( payerWallet: ethers.Wallet, + payeeWallet: ethers.Wallet, type: Types.Extension.PAYMENT_NETWORK_ID, ): Promise => { // step 1: Create Signature Provider @@ -71,7 +69,7 @@ const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: payeeAddress, + paymentAddress: payeeWallet.address, }, }; } else if (type === Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT) { @@ -79,8 +77,8 @@ const createRequestForHinkal = async ( id: type, parameters: { paymentNetworkName: currentNetwork, - paymentAddress: payeeAddress, - feeAddress: payeeAddress, + paymentAddress: payeeWallet.address, + feeAddress: payeeWallet.address, feeAmount: fee, }, }; @@ -96,7 +94,7 @@ const createRequestForHinkal = async ( }, payee: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, - value: payeeAddress, + value: payeeWallet.address, }, payer: { type: Types.Identity.TYPE.ETHEREUM_ADDRESS, @@ -146,10 +144,12 @@ describe('ERC-20 Private Payments With Hinkal', () => { let provider: providers.Provider; let payerWallet: ethers.Wallet; let payeeWallet: ethers.Wallet; + let payeeShieldedAddress: string; beforeAll(async () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); payerWallet = new Wallet(payerPrivateKey, provider); payeeWallet = new Wallet(payeePrivateKey, provider); + payeeShieldedAddress = hinkalStore[payeeWallet.address].getRecipientInfo(); await addToHinkalStore(payerWallet); }); afterAll(async () => { @@ -168,34 +168,36 @@ describe('ERC-20 Private Payments With Hinkal', () => { it('ERC-20 Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, + payeeWallet, Types.Extension.PAYMENT_NETWORK_ID.ERC20_PROXY_CONTRACT, ); - const balanceErc20Before = await getErc20Balance(requestData, payeeAddress, provider); + const balanceErc20Before = await getErc20Balance(requestData, payeeWallet.address, provider); const tx = await payErc20ProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); - const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); + const balanceErc20After = await getErc20Balance(requestData, payeeWallet.address, provider); await waitLittle(5); // wait before balance is increased expect(tx.status).toBe(1); - expect(tx.from).not.toBe(payerAddress); + expect(tx.from).not.toBe(payerWallet.address); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); it('ERC-20 Fee Proxy: Payer is not the same as Origin/Sender of Transaction', async () => { const requestData = await createRequestForHinkal( payerWallet, + payeeWallet, Types.Extension.PAYMENT_NETWORK_ID.ERC20_FEE_PROXY_CONTRACT, ); - const balanceErc20Before = await getErc20Balance(requestData, payeeAddress, provider); + const balanceErc20Before = await getErc20Balance(requestData, payeeWallet.address, provider); const tx = await payErc20FeeProxyRequestFromHinkalShieldedAddress(requestData, payerWallet); - const balanceErc20After = await getErc20Balance(requestData, payeeAddress, provider); + const balanceErc20After = await getErc20Balance(requestData, payeeWallet.address, provider); await waitLittle(5); // wait before balance is increased expect(tx.status).toBe(1); - expect(tx.from).not.toBe(payerAddress); + expect(tx.from).not.toBe(payerWallet.address); expect(BigNumber.from(balanceErc20Before).lt(BigNumber.from(balanceErc20After))); }); }); @@ -205,7 +207,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { // For illustration: we show how payer can send funds to his own shielded address. // The payer needs to do this to be able to send funds from his shielded address. - const preUsdcBalance = await getTokenShieldedBalance(payerAddress); + const preUsdcBalance = await getTokenShieldedBalance(payerWallet.address); const tx = await sendToHinkalShieldedAddressFromPublic( payerWallet, @@ -216,7 +218,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { await waitLittle(7); // wait before balance is increased - const postUsdcBalance = await getTokenShieldedBalance(payerAddress); + const postUsdcBalance = await getTokenShieldedBalance(payerWallet.address); expect(waitedTx.status).toBe(1); expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payer received funds in his shielded address. @@ -234,7 +236,7 @@ describe('ERC-20 Private Payments With Hinkal', () => { // 2. The payee should successfully receive the funds. // 3. The transaction should complete successfully. - const preUsdcBalance = await getTokenShieldedBalance(payeeAddress); + const preUsdcBalance = await getTokenShieldedBalance(payeeWallet.address); const tx = await sendToHinkalShieldedAddressFromPublic( payerWallet, @@ -246,10 +248,10 @@ describe('ERC-20 Private Payments With Hinkal', () => { const waitedTx = await tx.wait(2); await waitLittle(1); // wait before balance is increased - const postUsdcBalance = await getTokenShieldedBalance(payeeAddress); + const postUsdcBalance = await getTokenShieldedBalance(payeeWallet.address); expect(waitedTx.status).toBe(1); - expect(payeeShieldedAddress).not.toBe(payeeAddress); // trivial check (satisfies 2nd condition) + expect(payeeShieldedAddress).not.toBe(payeeWallet.address); // trivial check (satisfies 2nd condition) expect(postUsdcBalance - preUsdcBalance).toBe(currencyAmount); // The payee received funds in their shielded account. }); }); diff --git a/yarn.lock b/yarn.lock index da927222d..e861f42b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2951,10 +2951,10 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@hinkal/common@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.4.tgz#689588e362c85c34ece22cd2eb2fa1eccc4b0282" - integrity sha512-Y+yV/r/ZHNve/n1LFOIUFWZpNKmtADI18BoOLElflEUz4gjqz/4gMYjWOXGk3lOhNzfYIMQuTz1gwyTN/Uv7nA== +"@hinkal/common@0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@hinkal/common/-/common-0.2.7.tgz#0128e0f2a175fb4c6d7ed006a0c886f942e3163d" + integrity sha512-Dqs/7J0/9bNT8j47LNtkEINOOdAz1AIbbMqklRX5ym7KL7wH5LXuP7S9CYX+mmHPTG3/3EVb39oZNDjaRX6m9Q== dependencies: async-mutex "^0.4.0" axios "^1.6.8" From 27e04e04a243991603c7acb54dd19ecfc4766ffb Mon Sep 17 00:00:00 2001 From: MantisClone Date: Fri, 20 Dec 2024 23:42:29 -0500 Subject: [PATCH 40/43] fix: addToHinkalStore before calling getRecipientInfo --- .../test/payment/erc-20-private-payment-hinkal.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts index 65fb53c0f..88ae0b6cc 100644 --- a/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts +++ b/packages/payment-processor/test/payment/erc-20-private-payment-hinkal.test.ts @@ -149,8 +149,9 @@ describe('ERC-20 Private Payments With Hinkal', () => { provider = new ethers.providers.JsonRpcProvider(RPC_URL); payerWallet = new Wallet(payerPrivateKey, provider); payeeWallet = new Wallet(payeePrivateKey, provider); - payeeShieldedAddress = hinkalStore[payeeWallet.address].getRecipientInfo(); await addToHinkalStore(payerWallet); + await addToHinkalStore(payeeWallet); + payeeShieldedAddress = hinkalStore[payeeWallet.address].getRecipientInfo(); }); afterAll(async () => { for (const key in hinkalStore) { From b31986d124d090af66f53af6d153dcff98483c5e Mon Sep 17 00:00:00 2001 From: MantisClone Date: Sat, 21 Dec 2024 00:42:54 -0500 Subject: [PATCH 41/43] Revert "[REVERT ME] Set CircleCI no_output_timeout=30m for integration tests" This reverts commit eb3c48f8a155220a671c7ac8092da068826ca195. --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 94ab5b241..ac2038270 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -164,7 +164,6 @@ jobs: - run: *step_graph_deploy - run: name: 'Test request-client.js, smart-contracts, payment-detection and payment-processor' - no_output_timeout: 30m command: | yarn test \ --scope @requestnetwork/request-node \ From 67f472fefbb0d23ee8ea7d2cf0cfa896fcf56777 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Sat, 21 Dec 2024 00:43:19 -0500 Subject: [PATCH 42/43] Revert "[REVERT ME] run hinkal tests on every commit" This reverts commit 5fee7049363e1766e1a87126f8e79e75c9feb891. --- packages/payment-processor/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-processor/package.json b/packages/payment-processor/package.json index 2855d8d6d..b9f562a5b 100644 --- a/packages/payment-processor/package.json +++ b/packages/payment-processor/package.json @@ -35,7 +35,7 @@ "lint": "eslint . --fix", "lint:check": "eslint .", "prepare": "yarn run build", - "test": "jest --runInBand", + "test": "jest --testPathIgnorePatterns test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", "test:hinkal": "jest test/payment/erc-20-private-payment-hinkal.test.ts --runInBand", "test:watch": "yarn test --watch" }, From bf6e6177d45fc6afe06641e55c5fe75c2bd16759 Mon Sep 17 00:00:00 2001 From: MantisClone Date: Sat, 21 Dec 2024 00:57:20 -0500 Subject: [PATCH 43/43] Increase monthly resource class to large --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index ac2038270..77d68a28b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -270,6 +270,7 @@ jobs: docker: - *node_image working_directory: *working_directory + resource_class: large steps: - attach_workspace: at: *working_directory